From 9543c3dba1d0d8c3e6ddab6ff14e7577c053399a Mon Sep 17 00:00:00 2001 From: yuanzonghao Date: Wed, 3 Jun 2026 00:37:58 +0800 Subject: [PATCH 1/4] docs: note Cloudflare deploy needs Workers Paid Plan The scene pipeline needs more CPU time than the Workers Free 10ms cap allows, so Cloudflare deploys require Workers Paid. The old "pick whichever you prefer" implied false cost parity with Vercel (free Hobby works), so recommend the one-click Vercel deploy for personal use. Applied to all three READMEs (zh/en/ja). Co-Authored-By: Claude Opus 4.7 --- README.en.md | 2 +- README.ja.md | 2 +- README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.en.md b/README.en.md index 50ae951..8629313 100644 --- a/README.en.md +++ b/README.en.md @@ -39,7 +39,7 @@ Free to play, no setup required: [infiplot.com](https://infiplot.com) ## One-click deploy -InfiPlot deploys to both Vercel and Cloudflare Workers — pick whichever you prefer. +InfiPlot deploys to both Vercel and Cloudflare Workers. Cloudflare deployment requires the Workers Paid Plan because the scene pipeline needs longer CPU time; for personal use, the one-click Vercel deploy is recommended. [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/zonghaoyuan/infiplot&root-directory=apps/web&env=TEXT_BASE_URL,TEXT_API_KEY,TEXT_MODEL,IMAGE_BASE_URL,IMAGE_API_KEY,IMAGE_MODEL,VISION_BASE_URL,VISION_API_KEY,VISION_MODEL,TTS_BASE_URL,TTS_API_KEY,TTS_SPEECH_MODEL,MOCK_IMAGE&envDescription=Three%20required%20providers%20%2B%20optional%20TTS.%20Any%20OpenAI-compatible%20endpoint%20works%20for%20text%2Fvision.%20TTS%20uses%20MiMo%27s%20own%20protocol.&envLink=https://github.com/zonghaoyuan/infiplot/blob/main/README.en.md%23configuration-guide)   [![Deploy to Cloudflare](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/zonghaoyuan/infiplot/tree/main/apps/web) diff --git a/README.ja.md b/README.ja.md index 1885c20..aac8098 100644 --- a/README.ja.md +++ b/README.ja.md @@ -39,7 +39,7 @@ InfiPlot は、AI がコンテンツをリアルタイムに生成するイン ## ワンクリックデプロイ -InfiPlot は Vercel と Cloudflare Workers の両方にそのままデプロイできます —— お好みの方をお選びください。 +InfiPlot は Vercel と Cloudflare Workers の両方にデプロイできます。Cloudflare へのデプロイはシーンパイプラインがより長い CPU 時間を必要とするため、Workers Paid Plan が必要です。個人利用には Vercel のワンクリックデプロイをおすすめします。 [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/zonghaoyuan/infiplot&root-directory=apps/web&env=TEXT_BASE_URL,TEXT_API_KEY,TEXT_MODEL,IMAGE_BASE_URL,IMAGE_API_KEY,IMAGE_MODEL,VISION_BASE_URL,VISION_API_KEY,VISION_MODEL,TTS_BASE_URL,TTS_API_KEY,TTS_SPEECH_MODEL,MOCK_IMAGE&envDescription=Three%20required%20providers%20%2B%20optional%20TTS.%20Any%20OpenAI-compatible%20endpoint%20works%20for%20text%2Fvision.%20TTS%20uses%20MiMo%27s%20own%20protocol.&envLink=https://github.com/zonghaoyuan/infiplot/blob/main/README.ja.md%23%E8%A8%AD%E5%AE%9A%E3%82%AC%E3%82%A4%E3%83%89)   [![Deploy to Cloudflare](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/zonghaoyuan/infiplot/tree/main/apps/web) diff --git a/README.md b/README.md index 8926544..62e2092 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ InfiPlot是一款AI实时生成内容的互动剧情游戏,这里没有预设 ## 一键部署 -InfiPlot 同时支持部署到 Vercel 与 Cloudflare Workers —— 任选其一即可。 +InfiPlot 同时支持部署到 Vercel 与 Cloudflare Workers。Cloudflare 部署因场景流水线需要更长 CPU 时间,需要 Workers Paid Plan;个人使用推荐用 Vercel 一键部署。 [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/zonghaoyuan/infiplot&root-directory=apps/web&env=TEXT_BASE_URL,TEXT_API_KEY,TEXT_MODEL,IMAGE_BASE_URL,IMAGE_API_KEY,IMAGE_MODEL,VISION_BASE_URL,VISION_API_KEY,VISION_MODEL,TTS_BASE_URL,TTS_API_KEY,TTS_SPEECH_MODEL,MOCK_IMAGE&envDescription=Three%20required%20providers%20%2B%20optional%20TTS.%20Any%20OpenAI-compatible%20endpoint%20works%20for%20text%2Fvision.%20TTS%20uses%20MiMo%27s%20own%20protocol.&envLink=https://github.com/zonghaoyuan/infiplot%23%E9%85%8D%E7%BD%AE%E6%95%99%E7%A8%8B)   [![Deploy to Cloudflare](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/zonghaoyuan/infiplot/tree/main/apps/web) From dc5ecd60f6db1d260655a4aebb0e4c239bdb3f45 Mon Sep 17 00:00:00 2001 From: Zonghao Yuan <64521992+zonghaoyuan@users.noreply.github.com> Date: Wed, 3 Jun 2026 00:55:45 +0800 Subject: [PATCH 2/4] refactor: flatten monorepo to single web package (#12) Flatten the pnpm monorepo (apps/web + packages/*) into a single web package at the repo root. - Move app/lib/components/scripts/public to root; drop apps/web and packages/* wrappers - Rewrite tsconfig paths (@infiplot/*) to ./lib/*; turbopack.root = __dirname - Update Vercel (no root-directory) and Cloudflare (pnpm build:cf at root) deploy paths - Regenerate pnpm-lock.yaml to drop stale workspace importers - Bump engines.node to >=22 to match wrangler Co-Authored-By: Claude Opus 4.7 --- apps/web/.env.example => .env.example | 0 README.en.md | 12 +- README.ja.md | 12 +- README.md | 12 +- {apps/web/app => app}/api/beat-audio/route.ts | 0 .../web/app => app}/api/insert-beat/route.ts | 0 {apps/web/app => app}/api/scene/route.ts | 0 {apps/web/app => app}/api/start/route.ts | 0 {apps/web/app => app}/api/vision/route.ts | 0 {apps/web/app => app}/globals.css | 0 {apps/web/app => app}/layout.tsx | 0 {apps/web/app => app}/new/page.tsx | 0 {apps/web/app => app}/page.tsx | 0 {apps/web/app => app}/play/page.tsx | 0 apps/web/next.config.ts | 18 -- apps/web/package.json | 36 --- apps/web/tsconfig.json | 13 - .../components => components}/CustomForm.tsx | 0 .../components => components}/PlayCanvas.tsx | 0 .../components => components}/PresetCard.tsx | 0 .../ai-client/src => lib/ai-client}/chat.ts | 0 .../src => lib/ai-client}/fetchWithRetry.ts | 0 .../ai-client/src => lib/ai-client}/image.ts | 0 .../ai-client/src => lib/ai-client}/index.ts | 0 .../ai-client/src => lib/ai-client}/vision.ts | 0 {apps/web/lib => lib}/annotateClient.ts | 0 {apps/web/lib => lib}/config.ts | 0 .../src => lib/engine}/agents/architect.ts | 0 .../engine}/agents/characterDesigner.ts | 0 .../engine}/agents/cinematographer.ts | 0 .../src => lib/engine}/agents/painter.ts | 0 .../src => lib/engine}/agents/writer.ts | 0 .../engine/src => lib/engine}/director.ts | 0 {packages/engine/src => lib/engine}/index.ts | 0 .../engine/src => lib/engine}/jsonParser.ts | 0 .../engine/src => lib/engine}/mockImage.ts | 0 .../engine/src => lib/engine}/orchestrator.ts | 0 .../engine/src => lib/engine}/prompts.ts | 0 {packages/engine/src => lib/engine}/vision.ts | 0 {packages/engine/src => lib/engine}/voice.ts | 0 {apps/web/lib => lib}/presets.ts | 0 .../src => lib/tts-client}/index.ts | 0 .../src => lib/tts-client}/xiaomi.ts | 0 {packages/types/src => lib/types}/index.ts | 0 apps/web/next-env.d.ts => next-env.d.ts | 2 +- next.config.ts | 11 + ...open-next.config.ts => open-next.config.ts | 0 package.json | 33 ++- packages/ai-client/package.json | 17 -- packages/ai-client/tsconfig.json | 7 - packages/engine/package.json | 20 -- packages/engine/tsconfig.json | 7 - packages/tts-client/package.json | 17 -- packages/tts-client/tsconfig.json | 7 - packages/types/package.json | 14 - packages/types/tsconfig.json | 7 - pnpm-lock.yaml | 275 ++++++++---------- pnpm-workspace.yaml | 3 - .../postcss.config.mjs => postcss.config.mjs | 0 {apps/web/public => public}/home/f0.webp | Bin {apps/web/public => public}/home/f1.webp | Bin {apps/web/public => public}/home/f10.webp | Bin {apps/web/public => public}/home/f11.webp | Bin {apps/web/public => public}/home/f12.webp | Bin {apps/web/public => public}/home/f13.webp | Bin {apps/web/public => public}/home/f14.webp | Bin {apps/web/public => public}/home/f15.webp | Bin {apps/web/public => public}/home/f16.webp | Bin {apps/web/public => public}/home/f17.webp | Bin {apps/web/public => public}/home/f18.webp | Bin {apps/web/public => public}/home/f19.webp | Bin {apps/web/public => public}/home/f2.webp | Bin {apps/web/public => public}/home/f20.webp | Bin {apps/web/public => public}/home/f21.webp | Bin {apps/web/public => public}/home/f22.webp | Bin {apps/web/public => public}/home/f23.webp | Bin {apps/web/public => public}/home/f24.webp | Bin {apps/web/public => public}/home/f25.webp | Bin {apps/web/public => public}/home/f26.webp | Bin {apps/web/public => public}/home/f27.webp | Bin {apps/web/public => public}/home/f28.webp | Bin {apps/web/public => public}/home/f29.webp | Bin {apps/web/public => public}/home/f3.webp | Bin {apps/web/public => public}/home/f30.webp | Bin {apps/web/public => public}/home/f31.webp | Bin {apps/web/public => public}/home/f4.webp | Bin {apps/web/public => public}/home/f5.webp | Bin {apps/web/public => public}/home/f6.webp | Bin {apps/web/public => public}/home/f7.webp | Bin {apps/web/public => public}/home/f8.webp | Bin {apps/web/public => public}/home/f9.webp | Bin .../public => public}/home/firstact/f0.json | 0 .../public => public}/home/firstact/f1.json | 0 .../public => public}/home/firstact/f10.json | 0 .../public => public}/home/firstact/f11.json | 0 .../public => public}/home/firstact/f12.json | 0 .../public => public}/home/firstact/f13.json | 0 .../public => public}/home/firstact/f2.json | 0 .../public => public}/home/firstact/f3.json | 0 .../public => public}/home/firstact/f4.json | 0 .../public => public}/home/firstact/f5.json | 0 .../public => public}/home/firstact/f6.json | 0 .../public => public}/home/firstact/f7.json | 0 .../public => public}/home/firstact/f8.json | 0 .../public => public}/home/firstact/f9.json | 0 .../public => public}/home/firstact/m0.json | 0 .../public => public}/home/firstact/m1.json | 0 .../public => public}/home/firstact/m10.json | 0 .../public => public}/home/firstact/m11.json | 0 .../public => public}/home/firstact/m12.json | 0 .../public => public}/home/firstact/m13.json | 0 .../public => public}/home/firstact/m15.json | 0 .../public => public}/home/firstact/m16.json | 0 .../public => public}/home/firstact/m17.json | 0 .../public => public}/home/firstact/m18.json | 0 .../public => public}/home/firstact/m19.json | 0 .../public => public}/home/firstact/m2.json | 0 .../public => public}/home/firstact/m20.json | 0 .../public => public}/home/firstact/m21.json | 0 .../public => public}/home/firstact/m22.json | 0 .../public => public}/home/firstact/m23.json | 0 .../public => public}/home/firstact/m24.json | 0 .../public => public}/home/firstact/m25.json | 0 .../public => public}/home/firstact/m26.json | 0 .../public => public}/home/firstact/m27.json | 0 .../public => public}/home/firstact/m28.json | 0 .../public => public}/home/firstact/m3.json | 0 .../public => public}/home/firstact/m30.json | 0 .../public => public}/home/firstact/m31.json | 0 .../public => public}/home/firstact/m4.json | 0 .../public => public}/home/firstact/m5.json | 0 .../public => public}/home/firstact/m6.json | 0 .../public => public}/home/firstact/m7.json | 0 .../public => public}/home/firstact/m8.json | 0 .../public => public}/home/firstact/m9.json | 0 .../public => public}/home/firstscene/f0.webp | Bin .../public => public}/home/firstscene/f1.webp | Bin .../home/firstscene/f10.webp | Bin .../home/firstscene/f11.webp | Bin .../home/firstscene/f12.webp | Bin .../home/firstscene/f13.webp | Bin .../public => public}/home/firstscene/f2.webp | Bin .../public => public}/home/firstscene/f3.webp | Bin .../public => public}/home/firstscene/f4.webp | Bin .../public => public}/home/firstscene/f5.webp | Bin .../public => public}/home/firstscene/f6.webp | Bin .../public => public}/home/firstscene/f7.webp | Bin .../public => public}/home/firstscene/f8.webp | Bin .../public => public}/home/firstscene/f9.webp | Bin .../public => public}/home/firstscene/m0.webp | Bin .../public => public}/home/firstscene/m1.webp | Bin .../home/firstscene/m10.webp | Bin .../home/firstscene/m11.webp | Bin .../home/firstscene/m12.webp | Bin .../home/firstscene/m13.webp | Bin .../home/firstscene/m15.webp | Bin .../home/firstscene/m16.webp | Bin .../home/firstscene/m17.webp | Bin .../home/firstscene/m18.webp | Bin .../home/firstscene/m19.webp | Bin .../public => public}/home/firstscene/m2.webp | Bin .../home/firstscene/m20.webp | Bin .../home/firstscene/m21.webp | Bin .../home/firstscene/m22.webp | Bin .../home/firstscene/m23.webp | Bin .../home/firstscene/m24.webp | Bin .../home/firstscene/m25.webp | Bin .../home/firstscene/m26.webp | Bin .../home/firstscene/m27.webp | Bin .../home/firstscene/m28.webp | Bin .../public => public}/home/firstscene/m3.webp | Bin .../home/firstscene/m30.webp | Bin .../home/firstscene/m31.webp | Bin .../public => public}/home/firstscene/m4.webp | Bin .../public => public}/home/firstscene/m5.webp | Bin .../public => public}/home/firstscene/m6.webp | Bin .../public => public}/home/firstscene/m7.webp | Bin .../public => public}/home/firstscene/m8.webp | Bin .../public => public}/home/firstscene/m9.webp | Bin {apps/web/public => public}/home/m0.webp | Bin {apps/web/public => public}/home/m1.webp | Bin {apps/web/public => public}/home/m10.webp | Bin {apps/web/public => public}/home/m11.webp | Bin {apps/web/public => public}/home/m12.webp | Bin {apps/web/public => public}/home/m13.webp | Bin {apps/web/public => public}/home/m14.webp | Bin {apps/web/public => public}/home/m15.webp | Bin {apps/web/public => public}/home/m16.webp | Bin {apps/web/public => public}/home/m17.webp | Bin {apps/web/public => public}/home/m18.webp | Bin {apps/web/public => public}/home/m19.webp | Bin {apps/web/public => public}/home/m2.webp | Bin {apps/web/public => public}/home/m20.webp | Bin {apps/web/public => public}/home/m21.webp | Bin {apps/web/public => public}/home/m22.webp | Bin {apps/web/public => public}/home/m23.webp | Bin {apps/web/public => public}/home/m24.webp | Bin {apps/web/public => public}/home/m25.webp | Bin {apps/web/public => public}/home/m26.webp | Bin {apps/web/public => public}/home/m27.webp | Bin {apps/web/public => public}/home/m28.webp | Bin {apps/web/public => public}/home/m29.webp | Bin {apps/web/public => public}/home/m3.webp | Bin {apps/web/public => public}/home/m30.webp | Bin {apps/web/public => public}/home/m31.webp | Bin {apps/web/public => public}/home/m4.webp | Bin {apps/web/public => public}/home/m5.webp | Bin {apps/web/public => public}/home/m6.webp | Bin {apps/web/public => public}/home/m7.webp | Bin {apps/web/public => public}/home/m8.webp | Bin {apps/web/public => public}/home/m9.webp | Bin {apps/web/public => public}/qq-group.webp | Bin .../generate-home-images.mjs | 8 +- .../localize-firstact-images.mjs | 4 +- .../optimize-home-images.mjs | 2 +- .../scripts => scripts}/prebake-firstacts.mjs | 8 +- .../tailwind.config.ts => tailwind.config.ts | 0 tsconfig.base.json | 17 -- tsconfig.json | 56 ++++ apps/web/vercel.json => vercel.json | 0 apps/web/wrangler.jsonc => wrangler.jsonc | 2 +- 221 files changed, 241 insertions(+), 379 deletions(-) rename apps/web/.env.example => .env.example (100%) rename {apps/web/app => app}/api/beat-audio/route.ts (100%) rename {apps/web/app => app}/api/insert-beat/route.ts (100%) rename {apps/web/app => app}/api/scene/route.ts (100%) rename {apps/web/app => app}/api/start/route.ts (100%) rename {apps/web/app => app}/api/vision/route.ts (100%) rename {apps/web/app => app}/globals.css (100%) rename {apps/web/app => app}/layout.tsx (100%) rename {apps/web/app => app}/new/page.tsx (100%) rename {apps/web/app => app}/page.tsx (100%) rename {apps/web/app => app}/play/page.tsx (100%) delete mode 100644 apps/web/next.config.ts delete mode 100644 apps/web/package.json delete mode 100644 apps/web/tsconfig.json rename {apps/web/components => components}/CustomForm.tsx (100%) rename {apps/web/components => components}/PlayCanvas.tsx (100%) rename {apps/web/components => components}/PresetCard.tsx (100%) rename {packages/ai-client/src => lib/ai-client}/chat.ts (100%) rename {packages/ai-client/src => lib/ai-client}/fetchWithRetry.ts (100%) rename {packages/ai-client/src => lib/ai-client}/image.ts (100%) rename {packages/ai-client/src => lib/ai-client}/index.ts (100%) rename {packages/ai-client/src => lib/ai-client}/vision.ts (100%) rename {apps/web/lib => lib}/annotateClient.ts (100%) rename {apps/web/lib => lib}/config.ts (100%) rename {packages/engine/src => lib/engine}/agents/architect.ts (100%) rename {packages/engine/src => lib/engine}/agents/characterDesigner.ts (100%) rename {packages/engine/src => lib/engine}/agents/cinematographer.ts (100%) rename {packages/engine/src => lib/engine}/agents/painter.ts (100%) rename {packages/engine/src => lib/engine}/agents/writer.ts (100%) rename {packages/engine/src => lib/engine}/director.ts (100%) rename {packages/engine/src => lib/engine}/index.ts (100%) rename {packages/engine/src => lib/engine}/jsonParser.ts (100%) rename {packages/engine/src => lib/engine}/mockImage.ts (100%) rename {packages/engine/src => lib/engine}/orchestrator.ts (100%) rename {packages/engine/src => lib/engine}/prompts.ts (100%) rename {packages/engine/src => lib/engine}/vision.ts (100%) rename {packages/engine/src => lib/engine}/voice.ts (100%) rename {apps/web/lib => lib}/presets.ts (100%) rename {packages/tts-client/src => lib/tts-client}/index.ts (100%) rename {packages/tts-client/src => lib/tts-client}/xiaomi.ts (100%) rename {packages/types/src => lib/types}/index.ts (100%) rename apps/web/next-env.d.ts => next-env.d.ts (84%) create mode 100644 next.config.ts rename apps/web/open-next.config.ts => open-next.config.ts (100%) delete mode 100644 packages/ai-client/package.json delete mode 100644 packages/ai-client/tsconfig.json delete mode 100644 packages/engine/package.json delete mode 100644 packages/engine/tsconfig.json delete mode 100644 packages/tts-client/package.json delete mode 100644 packages/tts-client/tsconfig.json delete mode 100644 packages/types/package.json delete mode 100644 packages/types/tsconfig.json delete mode 100644 pnpm-workspace.yaml rename apps/web/postcss.config.mjs => postcss.config.mjs (100%) rename {apps/web/public => public}/home/f0.webp (100%) rename {apps/web/public => public}/home/f1.webp (100%) rename {apps/web/public => public}/home/f10.webp (100%) rename {apps/web/public => public}/home/f11.webp (100%) rename {apps/web/public => public}/home/f12.webp (100%) rename {apps/web/public => public}/home/f13.webp (100%) rename {apps/web/public => public}/home/f14.webp (100%) rename {apps/web/public => public}/home/f15.webp (100%) rename {apps/web/public => public}/home/f16.webp (100%) rename {apps/web/public => public}/home/f17.webp (100%) rename {apps/web/public => public}/home/f18.webp (100%) rename {apps/web/public => public}/home/f19.webp (100%) rename {apps/web/public => public}/home/f2.webp (100%) rename {apps/web/public => public}/home/f20.webp (100%) rename {apps/web/public => public}/home/f21.webp (100%) rename {apps/web/public => public}/home/f22.webp (100%) rename {apps/web/public => public}/home/f23.webp (100%) rename {apps/web/public => public}/home/f24.webp (100%) rename {apps/web/public => public}/home/f25.webp (100%) rename {apps/web/public => public}/home/f26.webp (100%) rename {apps/web/public => public}/home/f27.webp (100%) rename {apps/web/public => public}/home/f28.webp (100%) rename {apps/web/public => public}/home/f29.webp (100%) rename {apps/web/public => public}/home/f3.webp (100%) rename {apps/web/public => public}/home/f30.webp (100%) rename {apps/web/public => public}/home/f31.webp (100%) rename {apps/web/public => public}/home/f4.webp (100%) rename {apps/web/public => public}/home/f5.webp (100%) rename {apps/web/public => public}/home/f6.webp (100%) rename {apps/web/public => public}/home/f7.webp (100%) rename {apps/web/public => public}/home/f8.webp (100%) rename {apps/web/public => public}/home/f9.webp (100%) rename {apps/web/public => public}/home/firstact/f0.json (100%) rename {apps/web/public => public}/home/firstact/f1.json (100%) rename {apps/web/public => public}/home/firstact/f10.json (100%) rename {apps/web/public => public}/home/firstact/f11.json (100%) rename {apps/web/public => public}/home/firstact/f12.json (100%) rename {apps/web/public => public}/home/firstact/f13.json (100%) rename {apps/web/public => public}/home/firstact/f2.json (100%) rename {apps/web/public => public}/home/firstact/f3.json (100%) rename {apps/web/public => public}/home/firstact/f4.json (100%) rename {apps/web/public => public}/home/firstact/f5.json (100%) rename {apps/web/public => public}/home/firstact/f6.json (100%) rename {apps/web/public => public}/home/firstact/f7.json (100%) rename {apps/web/public => public}/home/firstact/f8.json (100%) rename {apps/web/public => public}/home/firstact/f9.json (100%) rename {apps/web/public => public}/home/firstact/m0.json (100%) rename {apps/web/public => public}/home/firstact/m1.json (100%) rename {apps/web/public => public}/home/firstact/m10.json (100%) rename {apps/web/public => public}/home/firstact/m11.json (100%) rename {apps/web/public => public}/home/firstact/m12.json (100%) rename {apps/web/public => public}/home/firstact/m13.json (100%) rename {apps/web/public => public}/home/firstact/m15.json (100%) rename {apps/web/public => public}/home/firstact/m16.json (100%) rename {apps/web/public => public}/home/firstact/m17.json (100%) rename {apps/web/public => public}/home/firstact/m18.json (100%) rename {apps/web/public => public}/home/firstact/m19.json (100%) rename {apps/web/public => public}/home/firstact/m2.json (100%) rename {apps/web/public => public}/home/firstact/m20.json (100%) rename {apps/web/public => public}/home/firstact/m21.json (100%) rename {apps/web/public => public}/home/firstact/m22.json (100%) rename {apps/web/public => public}/home/firstact/m23.json (100%) rename {apps/web/public => public}/home/firstact/m24.json (100%) rename {apps/web/public => public}/home/firstact/m25.json (100%) rename {apps/web/public => public}/home/firstact/m26.json (100%) rename {apps/web/public => public}/home/firstact/m27.json (100%) rename {apps/web/public => public}/home/firstact/m28.json (100%) rename {apps/web/public => public}/home/firstact/m3.json (100%) rename {apps/web/public => public}/home/firstact/m30.json (100%) rename {apps/web/public => public}/home/firstact/m31.json (100%) rename {apps/web/public => public}/home/firstact/m4.json (100%) rename {apps/web/public => public}/home/firstact/m5.json (100%) rename {apps/web/public => public}/home/firstact/m6.json (100%) rename {apps/web/public => public}/home/firstact/m7.json (100%) rename {apps/web/public => public}/home/firstact/m8.json (100%) rename {apps/web/public => public}/home/firstact/m9.json (100%) rename {apps/web/public => public}/home/firstscene/f0.webp (100%) rename {apps/web/public => public}/home/firstscene/f1.webp (100%) rename {apps/web/public => public}/home/firstscene/f10.webp (100%) rename {apps/web/public => public}/home/firstscene/f11.webp (100%) rename {apps/web/public => public}/home/firstscene/f12.webp (100%) rename {apps/web/public => public}/home/firstscene/f13.webp (100%) rename {apps/web/public => public}/home/firstscene/f2.webp (100%) rename {apps/web/public => public}/home/firstscene/f3.webp (100%) rename {apps/web/public => public}/home/firstscene/f4.webp (100%) rename {apps/web/public => public}/home/firstscene/f5.webp (100%) rename {apps/web/public => public}/home/firstscene/f6.webp (100%) rename {apps/web/public => public}/home/firstscene/f7.webp (100%) rename {apps/web/public => public}/home/firstscene/f8.webp (100%) rename {apps/web/public => public}/home/firstscene/f9.webp (100%) rename {apps/web/public => public}/home/firstscene/m0.webp (100%) rename {apps/web/public => public}/home/firstscene/m1.webp (100%) rename {apps/web/public => public}/home/firstscene/m10.webp (100%) rename {apps/web/public => public}/home/firstscene/m11.webp (100%) rename {apps/web/public => public}/home/firstscene/m12.webp (100%) rename {apps/web/public => public}/home/firstscene/m13.webp (100%) rename {apps/web/public => public}/home/firstscene/m15.webp (100%) rename {apps/web/public => public}/home/firstscene/m16.webp (100%) rename {apps/web/public => public}/home/firstscene/m17.webp (100%) rename {apps/web/public => public}/home/firstscene/m18.webp (100%) rename {apps/web/public => public}/home/firstscene/m19.webp (100%) rename {apps/web/public => public}/home/firstscene/m2.webp (100%) rename {apps/web/public => public}/home/firstscene/m20.webp (100%) rename {apps/web/public => public}/home/firstscene/m21.webp (100%) rename {apps/web/public => public}/home/firstscene/m22.webp (100%) rename {apps/web/public => public}/home/firstscene/m23.webp (100%) rename {apps/web/public => public}/home/firstscene/m24.webp (100%) rename {apps/web/public => public}/home/firstscene/m25.webp (100%) rename {apps/web/public => public}/home/firstscene/m26.webp (100%) rename {apps/web/public => public}/home/firstscene/m27.webp (100%) rename {apps/web/public => public}/home/firstscene/m28.webp (100%) rename {apps/web/public => public}/home/firstscene/m3.webp (100%) rename {apps/web/public => public}/home/firstscene/m30.webp (100%) rename {apps/web/public => public}/home/firstscene/m31.webp (100%) rename {apps/web/public => public}/home/firstscene/m4.webp (100%) rename {apps/web/public => public}/home/firstscene/m5.webp (100%) rename {apps/web/public => public}/home/firstscene/m6.webp (100%) rename {apps/web/public => public}/home/firstscene/m7.webp (100%) rename {apps/web/public => public}/home/firstscene/m8.webp (100%) rename {apps/web/public => public}/home/firstscene/m9.webp (100%) rename {apps/web/public => public}/home/m0.webp (100%) rename {apps/web/public => public}/home/m1.webp (100%) rename {apps/web/public => public}/home/m10.webp (100%) rename {apps/web/public => public}/home/m11.webp (100%) rename {apps/web/public => public}/home/m12.webp (100%) rename {apps/web/public => public}/home/m13.webp (100%) rename {apps/web/public => public}/home/m14.webp (100%) rename {apps/web/public => public}/home/m15.webp (100%) rename {apps/web/public => public}/home/m16.webp (100%) rename {apps/web/public => public}/home/m17.webp (100%) rename {apps/web/public => public}/home/m18.webp (100%) rename {apps/web/public => public}/home/m19.webp (100%) rename {apps/web/public => public}/home/m2.webp (100%) rename {apps/web/public => public}/home/m20.webp (100%) rename {apps/web/public => public}/home/m21.webp (100%) rename {apps/web/public => public}/home/m22.webp (100%) rename {apps/web/public => public}/home/m23.webp (100%) rename {apps/web/public => public}/home/m24.webp (100%) rename {apps/web/public => public}/home/m25.webp (100%) rename {apps/web/public => public}/home/m26.webp (100%) rename {apps/web/public => public}/home/m27.webp (100%) rename {apps/web/public => public}/home/m28.webp (100%) rename {apps/web/public => public}/home/m29.webp (100%) rename {apps/web/public => public}/home/m3.webp (100%) rename {apps/web/public => public}/home/m30.webp (100%) rename {apps/web/public => public}/home/m31.webp (100%) rename {apps/web/public => public}/home/m4.webp (100%) rename {apps/web/public => public}/home/m5.webp (100%) rename {apps/web/public => public}/home/m6.webp (100%) rename {apps/web/public => public}/home/m7.webp (100%) rename {apps/web/public => public}/home/m8.webp (100%) rename {apps/web/public => public}/home/m9.webp (100%) rename {apps/web/public => public}/qq-group.webp (100%) rename {apps/web/scripts => scripts}/generate-home-images.mjs (98%) rename {apps/web/scripts => scripts}/localize-firstact-images.mjs (96%) rename {apps/web/scripts => scripts}/optimize-home-images.mjs (95%) rename {apps/web/scripts => scripts}/prebake-firstacts.mjs (98%) rename apps/web/tailwind.config.ts => tailwind.config.ts (100%) delete mode 100644 tsconfig.base.json create mode 100644 tsconfig.json rename apps/web/vercel.json => vercel.json (100%) rename apps/web/wrangler.jsonc => wrangler.jsonc (86%) diff --git a/apps/web/.env.example b/.env.example similarity index 100% rename from apps/web/.env.example rename to .env.example diff --git a/README.en.md b/README.en.md index 8629313..9f0d091 100644 --- a/README.en.md +++ b/README.en.md @@ -41,9 +41,9 @@ Free to play, no setup required: [infiplot.com](https://infiplot.com) InfiPlot deploys to both Vercel and Cloudflare Workers. Cloudflare deployment requires the Workers Paid Plan because the scene pipeline needs longer CPU time; for personal use, the one-click Vercel deploy is recommended. -[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/zonghaoyuan/infiplot&root-directory=apps/web&env=TEXT_BASE_URL,TEXT_API_KEY,TEXT_MODEL,IMAGE_BASE_URL,IMAGE_API_KEY,IMAGE_MODEL,VISION_BASE_URL,VISION_API_KEY,VISION_MODEL,TTS_BASE_URL,TTS_API_KEY,TTS_SPEECH_MODEL,MOCK_IMAGE&envDescription=Three%20required%20providers%20%2B%20optional%20TTS.%20Any%20OpenAI-compatible%20endpoint%20works%20for%20text%2Fvision.%20TTS%20uses%20MiMo%27s%20own%20protocol.&envLink=https://github.com/zonghaoyuan/infiplot/blob/main/README.en.md%23configuration-guide)   [![Deploy to Cloudflare](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/zonghaoyuan/infiplot/tree/main/apps/web) +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/zonghaoyuan/infiplot&env=TEXT_BASE_URL,TEXT_API_KEY,TEXT_MODEL,IMAGE_BASE_URL,IMAGE_API_KEY,IMAGE_MODEL,VISION_BASE_URL,VISION_API_KEY,VISION_MODEL,TTS_BASE_URL,TTS_API_KEY,TTS_SPEECH_MODEL,MOCK_IMAGE&envDescription=Three%20required%20providers%20%2B%20optional%20TTS.%20Any%20OpenAI-compatible%20endpoint%20works%20for%20text%2Fvision.%20TTS%20uses%20MiMo%27s%20own%20protocol.&envLink=https://github.com/zonghaoyuan/infiplot/blob/main/README.en.md%23configuration-guide)   [![Deploy to Cloudflare](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/zonghaoyuan/infiplot) -After deploy, fill in the environment variables — see the [Configuration guide](#configuration-guide) below. Both platforms need `apps/web` as the project root (Vercel's button passes this automatically; on Cloudflare, set the build root to `apps/web` and the build command to `pnpm --filter @infiplot/web build:cf`). +After deploy, fill in the environment variables — see the [Configuration guide](#configuration-guide) below. The repo root is the app itself: Vercel needs no special root directory; on Cloudflare, just set the build command to `pnpm build:cf`. --- @@ -118,7 +118,7 @@ Get in touch: hi@infiplot.com Scan to join our **beta community on QQ** (group ID `575404333`) to share feedback and help shape the project: -InfiPlot beta community QQ group QR code +InfiPlot beta community QQ group QR code --- @@ -143,11 +143,11 @@ Nine variables are required; TTS is optional (leave blank to run silently). Ther |---|---| | `MOCK_IMAGE=true` | Skip image generation; the renderer returns a static placeholder. Story, voice, and choices still run normally. Great for iterating on TTS without burning Runware credits. | -Where to set them (see `apps/web/.env.example` for the exact shape): +Where to set them (see `.env.example` for the exact shape): -- **Local dev** — `apps/web/.env.local` +- **Local dev** — `.env.local` - **Vercel** — Project Settings → Environment Variables -- **Cloudflare Workers** — from `apps/web/`, run `wrangler secret put ` for each variable, or set them in the dashboard (Workers → infiplot → Settings → Variables and Secrets). For a private staging instance, gate the Worker behind [Cloudflare Access](https://developers.cloudflare.com/cloudflare-one/applications/) — zero-code email-whitelist auth in front of the Worker. +- **Cloudflare Workers** — from the repo root, run `wrangler secret put ` for each variable, or set them in the dashboard (Workers → infiplot → Settings → Variables and Secrets). For a private staging instance, gate the Worker behind [Cloudflare Access](https://developers.cloudflare.com/cloudflare-one/applications/) — zero-code email-whitelist auth in front of the Worker. **3. Mind the cost** diff --git a/README.ja.md b/README.ja.md index aac8098..fdc7a31 100644 --- a/README.ja.md +++ b/README.ja.md @@ -41,9 +41,9 @@ InfiPlot は、AI がコンテンツをリアルタイムに生成するイン InfiPlot は Vercel と Cloudflare Workers の両方にデプロイできます。Cloudflare へのデプロイはシーンパイプラインがより長い CPU 時間を必要とするため、Workers Paid Plan が必要です。個人利用には Vercel のワンクリックデプロイをおすすめします。 -[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/zonghaoyuan/infiplot&root-directory=apps/web&env=TEXT_BASE_URL,TEXT_API_KEY,TEXT_MODEL,IMAGE_BASE_URL,IMAGE_API_KEY,IMAGE_MODEL,VISION_BASE_URL,VISION_API_KEY,VISION_MODEL,TTS_BASE_URL,TTS_API_KEY,TTS_SPEECH_MODEL,MOCK_IMAGE&envDescription=Three%20required%20providers%20%2B%20optional%20TTS.%20Any%20OpenAI-compatible%20endpoint%20works%20for%20text%2Fvision.%20TTS%20uses%20MiMo%27s%20own%20protocol.&envLink=https://github.com/zonghaoyuan/infiplot/blob/main/README.ja.md%23%E8%A8%AD%E5%AE%9A%E3%82%AC%E3%82%A4%E3%83%89)   [![Deploy to Cloudflare](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/zonghaoyuan/infiplot/tree/main/apps/web) +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/zonghaoyuan/infiplot&env=TEXT_BASE_URL,TEXT_API_KEY,TEXT_MODEL,IMAGE_BASE_URL,IMAGE_API_KEY,IMAGE_MODEL,VISION_BASE_URL,VISION_API_KEY,VISION_MODEL,TTS_BASE_URL,TTS_API_KEY,TTS_SPEECH_MODEL,MOCK_IMAGE&envDescription=Three%20required%20providers%20%2B%20optional%20TTS.%20Any%20OpenAI-compatible%20endpoint%20works%20for%20text%2Fvision.%20TTS%20uses%20MiMo%27s%20own%20protocol.&envLink=https://github.com/zonghaoyuan/infiplot/blob/main/README.ja.md%23%E8%A8%AD%E5%AE%9A%E3%82%AC%E3%82%A4%E3%83%89)   [![Deploy to Cloudflare](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/zonghaoyuan/infiplot) -デプロイ後、環境変数を設定してください —— 下記の[設定ガイド](#設定ガイド)を参照。両方のプラットフォームで、プロジェクトのルートを `apps/web` に設定する必要があります(Vercel のデプロイボタンが自動で渡します。Cloudflare では build root を `apps/web`、ビルドコマンドを `pnpm --filter @infiplot/web build:cf` に設定してください)。 +デプロイ後、環境変数を設定してください —— 下記の[設定ガイド](#設定ガイド)を参照。リポジトリのルートがアプリ本体です:Vercel では特別なルート設定は不要です。Cloudflare ではビルドコマンドを `pnpm build:cf` に設定するだけで済みます。 --- @@ -117,7 +117,7 @@ flowchart TD **InfiPlot ベータ交流グループ**(QQ グループ番号 `575404333`)—— QR コードを読み取って参加し、フィードバックや共同開発にご参加ください: -InfiPlot ベータ交流グループ QQ QRコード +InfiPlot ベータ交流グループ QQ QRコード --- @@ -142,11 +142,11 @@ InfiPlot は 4 種類のモデルプロバイダと通信します。**テキス |---|---| | `MOCK_IMAGE=true` | 画像生成をスキップし、レンダラが静的なプレースホルダを返します。ストーリー・音声・選択肢は通常どおり動作します。Runware のクレジットを消費せずに TTS を調整するのに最適です。 | -設定場所(正確なフォーマットは `apps/web/.env.example` を参照): +設定場所(正確なフォーマットは `.env.example` を参照): -- **ローカル開発** —— `apps/web/.env.local` +- **ローカル開発** —— `.env.local` - **Vercel** —— Project Settings → Environment Variables -- **Cloudflare Workers** —— `apps/web/` から各変数について `wrangler secret put ` を実行するか、ダッシュボード(Workers → infiplot → Settings → Variables and Secrets)で設定します。ステージング環境にアクセス制限を掛けたい場合は、Worker の前に [Cloudflare Access](https://developers.cloudflare.com/cloudflare-one/applications/) を挟むと、ゼロコードでメール許可リスト方式の認証が利用できます。 +- **Cloudflare Workers** —— リポジトリのルートから各変数について `wrangler secret put ` を実行するか、ダッシュボード(Workers → infiplot → Settings → Variables and Secrets)で設定します。ステージング環境にアクセス制限を掛けたい場合は、Worker の前に [Cloudflare Access](https://developers.cloudflare.com/cloudflare-one/applications/) を挟むと、ゼロコードでメール許可リスト方式の認証が利用できます。 **3. コストに注意** diff --git a/README.md b/README.md index 62e2092..bb8abec 100644 --- a/README.md +++ b/README.md @@ -41,9 +41,9 @@ InfiPlot是一款AI实时生成内容的互动剧情游戏,这里没有预设 InfiPlot 同时支持部署到 Vercel 与 Cloudflare Workers。Cloudflare 部署因场景流水线需要更长 CPU 时间,需要 Workers Paid Plan;个人使用推荐用 Vercel 一键部署。 -[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/zonghaoyuan/infiplot&root-directory=apps/web&env=TEXT_BASE_URL,TEXT_API_KEY,TEXT_MODEL,IMAGE_BASE_URL,IMAGE_API_KEY,IMAGE_MODEL,VISION_BASE_URL,VISION_API_KEY,VISION_MODEL,TTS_BASE_URL,TTS_API_KEY,TTS_SPEECH_MODEL,MOCK_IMAGE&envDescription=Three%20required%20providers%20%2B%20optional%20TTS.%20Any%20OpenAI-compatible%20endpoint%20works%20for%20text%2Fvision.%20TTS%20uses%20MiMo%27s%20own%20protocol.&envLink=https://github.com/zonghaoyuan/infiplot%23%E9%85%8D%E7%BD%AE%E6%95%99%E7%A8%8B)   [![Deploy to Cloudflare](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/zonghaoyuan/infiplot/tree/main/apps/web) +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/zonghaoyuan/infiplot&env=TEXT_BASE_URL,TEXT_API_KEY,TEXT_MODEL,IMAGE_BASE_URL,IMAGE_API_KEY,IMAGE_MODEL,VISION_BASE_URL,VISION_API_KEY,VISION_MODEL,TTS_BASE_URL,TTS_API_KEY,TTS_SPEECH_MODEL,MOCK_IMAGE&envDescription=Three%20required%20providers%20%2B%20optional%20TTS.%20Any%20OpenAI-compatible%20endpoint%20works%20for%20text%2Fvision.%20TTS%20uses%20MiMo%27s%20own%20protocol.&envLink=https://github.com/zonghaoyuan/infiplot%23%E9%85%8D%E7%BD%AE%E6%95%99%E7%A8%8B)   [![Deploy to Cloudflare](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/zonghaoyuan/infiplot) -部署完成后,填好环境变量 —— 详见下方的[配置教程](#配置教程)。两个平台都需要把项目根目录设为 `apps/web`(Vercel 一键部署按钮会自动带上;在 Cloudflare 上请把 build root 设为 `apps/web`,构建命令设为 `pnpm --filter @infiplot/web build:cf`)。 +部署完成后,填好环境变量 —— 详见下方的[配置教程](#配置教程)。仓库根目录就是应用本身:Vercel 无需额外设置 root directory;在 Cloudflare 上把构建命令设为 `pnpm build:cf` 即可。 --- @@ -117,7 +117,7 @@ flowchart TD 欢迎扫码加入 **InfiPlot 内测交流群**(QQ 群号 `575404333`),一起反馈体验、参与共建: -InfiPlot 内测交流群 QQ 二维码 +InfiPlot 内测交流群 QQ 二维码 --- @@ -142,11 +142,11 @@ InfiPlot 会与四类模型供应商通信。**文本(Text)和视觉(Visio |---|---| | `MOCK_IMAGE=true` | 跳过图像生成,渲染器返回一张静态占位图。剧情、语音、选项照常运行。非常适合在不消耗 Runware 额度的情况下调试 TTS。 | -在哪里设置(确切字段见 `apps/web/.env.example`): +在哪里设置(确切字段见 `.env.example`): -- **本地开发** —— `apps/web/.env.local` +- **本地开发** —— `.env.local` - **Vercel** —— Project Settings → Environment Variables -- **Cloudflare Workers** —— 在 `apps/web/` 目录下逐个执行 `wrangler secret put `,或在 dashboard 里设置(Workers → infiplot → Settings → Variables and Secrets)。如果要给 staging 加访问限制,可以在 Worker 前面挂一个 [Cloudflare Access](https://developers.cloudflare.com/cloudflare-one/applications/)(零代码,邮箱白名单)。 +- **Cloudflare Workers** —— 在仓库根目录下逐个执行 `wrangler secret put `,或在 dashboard 里设置(Workers → infiplot → Settings → Variables and Secrets)。如果要给 staging 加访问限制,可以在 Worker 前面挂一个 [Cloudflare Access](https://developers.cloudflare.com/cloudflare-one/applications/)(零代码,邮箱白名单)。 **3. 注意成本** diff --git a/apps/web/app/api/beat-audio/route.ts b/app/api/beat-audio/route.ts similarity index 100% rename from apps/web/app/api/beat-audio/route.ts rename to app/api/beat-audio/route.ts diff --git a/apps/web/app/api/insert-beat/route.ts b/app/api/insert-beat/route.ts similarity index 100% rename from apps/web/app/api/insert-beat/route.ts rename to app/api/insert-beat/route.ts diff --git a/apps/web/app/api/scene/route.ts b/app/api/scene/route.ts similarity index 100% rename from apps/web/app/api/scene/route.ts rename to app/api/scene/route.ts diff --git a/apps/web/app/api/start/route.ts b/app/api/start/route.ts similarity index 100% rename from apps/web/app/api/start/route.ts rename to app/api/start/route.ts diff --git a/apps/web/app/api/vision/route.ts b/app/api/vision/route.ts similarity index 100% rename from apps/web/app/api/vision/route.ts rename to app/api/vision/route.ts diff --git a/apps/web/app/globals.css b/app/globals.css similarity index 100% rename from apps/web/app/globals.css rename to app/globals.css diff --git a/apps/web/app/layout.tsx b/app/layout.tsx similarity index 100% rename from apps/web/app/layout.tsx rename to app/layout.tsx diff --git a/apps/web/app/new/page.tsx b/app/new/page.tsx similarity index 100% rename from apps/web/app/new/page.tsx rename to app/new/page.tsx diff --git a/apps/web/app/page.tsx b/app/page.tsx similarity index 100% rename from apps/web/app/page.tsx rename to app/page.tsx diff --git a/apps/web/app/play/page.tsx b/app/play/page.tsx similarity index 100% rename from apps/web/app/play/page.tsx rename to app/play/page.tsx diff --git a/apps/web/next.config.ts b/apps/web/next.config.ts deleted file mode 100644 index 29b64b4..0000000 --- a/apps/web/next.config.ts +++ /dev/null @@ -1,18 +0,0 @@ -import path from "node:path"; -import type { NextConfig } from "next"; - -const config: NextConfig = { - reactStrictMode: true, - typedRoutes: false, - transpilePackages: [ - "@infiplot/engine", - "@infiplot/ai-client", - "@infiplot/types", - "@infiplot/tts-client", - ], - turbopack: { - root: path.join(__dirname, "..", ".."), - }, -}; - -export default config; diff --git a/apps/web/package.json b/apps/web/package.json deleted file mode 100644 index 571477f..0000000 --- a/apps/web/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "@infiplot/web", - "version": "0.1.0", - "private": true, - "type": "module", - "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start", - "lint": "next lint", - "typecheck": "tsc --noEmit", - "build:cf": "opennextjs-cloudflare build", - "preview:cf": "opennextjs-cloudflare preview", - "deploy:cf": "opennextjs-cloudflare deploy" - }, - "dependencies": { - "@infiplot/ai-client": "workspace:*", - "@infiplot/engine": "workspace:*", - "@infiplot/types": "workspace:*", - "next": "^16.0.0", - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@opennextjs/cloudflare": "^1.19.11", - "sharp": "^0.33.5", - "@types/node": "^22.9.0", - "@types/react": "^19.0.0", - "@types/react-dom": "^19.0.0", - "autoprefixer": "^10.4.20", - "postcss": "^8.4.49", - "tailwindcss": "^3.4.15", - "typescript": "^5.6.3", - "wrangler": "^4.96.0" - } -} diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json deleted file mode 100644 index 203069b..0000000 --- a/apps/web/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "noEmit": true, - "incremental": true, - "plugins": [{ "name": "next" }], - "paths": { - "@/*": ["./*"] - } - }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] -} diff --git a/apps/web/components/CustomForm.tsx b/components/CustomForm.tsx similarity index 100% rename from apps/web/components/CustomForm.tsx rename to components/CustomForm.tsx diff --git a/apps/web/components/PlayCanvas.tsx b/components/PlayCanvas.tsx similarity index 100% rename from apps/web/components/PlayCanvas.tsx rename to components/PlayCanvas.tsx diff --git a/apps/web/components/PresetCard.tsx b/components/PresetCard.tsx similarity index 100% rename from apps/web/components/PresetCard.tsx rename to components/PresetCard.tsx diff --git a/packages/ai-client/src/chat.ts b/lib/ai-client/chat.ts similarity index 100% rename from packages/ai-client/src/chat.ts rename to lib/ai-client/chat.ts diff --git a/packages/ai-client/src/fetchWithRetry.ts b/lib/ai-client/fetchWithRetry.ts similarity index 100% rename from packages/ai-client/src/fetchWithRetry.ts rename to lib/ai-client/fetchWithRetry.ts diff --git a/packages/ai-client/src/image.ts b/lib/ai-client/image.ts similarity index 100% rename from packages/ai-client/src/image.ts rename to lib/ai-client/image.ts diff --git a/packages/ai-client/src/index.ts b/lib/ai-client/index.ts similarity index 100% rename from packages/ai-client/src/index.ts rename to lib/ai-client/index.ts diff --git a/packages/ai-client/src/vision.ts b/lib/ai-client/vision.ts similarity index 100% rename from packages/ai-client/src/vision.ts rename to lib/ai-client/vision.ts diff --git a/apps/web/lib/annotateClient.ts b/lib/annotateClient.ts similarity index 100% rename from apps/web/lib/annotateClient.ts rename to lib/annotateClient.ts diff --git a/apps/web/lib/config.ts b/lib/config.ts similarity index 100% rename from apps/web/lib/config.ts rename to lib/config.ts diff --git a/packages/engine/src/agents/architect.ts b/lib/engine/agents/architect.ts similarity index 100% rename from packages/engine/src/agents/architect.ts rename to lib/engine/agents/architect.ts diff --git a/packages/engine/src/agents/characterDesigner.ts b/lib/engine/agents/characterDesigner.ts similarity index 100% rename from packages/engine/src/agents/characterDesigner.ts rename to lib/engine/agents/characterDesigner.ts diff --git a/packages/engine/src/agents/cinematographer.ts b/lib/engine/agents/cinematographer.ts similarity index 100% rename from packages/engine/src/agents/cinematographer.ts rename to lib/engine/agents/cinematographer.ts diff --git a/packages/engine/src/agents/painter.ts b/lib/engine/agents/painter.ts similarity index 100% rename from packages/engine/src/agents/painter.ts rename to lib/engine/agents/painter.ts diff --git a/packages/engine/src/agents/writer.ts b/lib/engine/agents/writer.ts similarity index 100% rename from packages/engine/src/agents/writer.ts rename to lib/engine/agents/writer.ts diff --git a/packages/engine/src/director.ts b/lib/engine/director.ts similarity index 100% rename from packages/engine/src/director.ts rename to lib/engine/director.ts diff --git a/packages/engine/src/index.ts b/lib/engine/index.ts similarity index 100% rename from packages/engine/src/index.ts rename to lib/engine/index.ts diff --git a/packages/engine/src/jsonParser.ts b/lib/engine/jsonParser.ts similarity index 100% rename from packages/engine/src/jsonParser.ts rename to lib/engine/jsonParser.ts diff --git a/packages/engine/src/mockImage.ts b/lib/engine/mockImage.ts similarity index 100% rename from packages/engine/src/mockImage.ts rename to lib/engine/mockImage.ts diff --git a/packages/engine/src/orchestrator.ts b/lib/engine/orchestrator.ts similarity index 100% rename from packages/engine/src/orchestrator.ts rename to lib/engine/orchestrator.ts diff --git a/packages/engine/src/prompts.ts b/lib/engine/prompts.ts similarity index 100% rename from packages/engine/src/prompts.ts rename to lib/engine/prompts.ts diff --git a/packages/engine/src/vision.ts b/lib/engine/vision.ts similarity index 100% rename from packages/engine/src/vision.ts rename to lib/engine/vision.ts diff --git a/packages/engine/src/voice.ts b/lib/engine/voice.ts similarity index 100% rename from packages/engine/src/voice.ts rename to lib/engine/voice.ts diff --git a/apps/web/lib/presets.ts b/lib/presets.ts similarity index 100% rename from apps/web/lib/presets.ts rename to lib/presets.ts diff --git a/packages/tts-client/src/index.ts b/lib/tts-client/index.ts similarity index 100% rename from packages/tts-client/src/index.ts rename to lib/tts-client/index.ts diff --git a/packages/tts-client/src/xiaomi.ts b/lib/tts-client/xiaomi.ts similarity index 100% rename from packages/tts-client/src/xiaomi.ts rename to lib/tts-client/xiaomi.ts diff --git a/packages/types/src/index.ts b/lib/types/index.ts similarity index 100% rename from packages/types/src/index.ts rename to lib/types/index.ts diff --git a/apps/web/next-env.d.ts b/next-env.d.ts similarity index 84% rename from apps/web/next-env.d.ts rename to next-env.d.ts index c4b7818..9edff1c 100644 --- a/apps/web/next-env.d.ts +++ b/next-env.d.ts @@ -1,6 +1,6 @@ /// /// -import "./.next/dev/types/routes.d.ts"; +import "./.next/types/routes.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/next.config.ts b/next.config.ts new file mode 100644 index 0000000..1150341 --- /dev/null +++ b/next.config.ts @@ -0,0 +1,11 @@ +import type { NextConfig } from "next"; + +const config: NextConfig = { + reactStrictMode: true, + typedRoutes: false, + turbopack: { + root: __dirname, + }, +}; + +export default config; diff --git a/apps/web/open-next.config.ts b/open-next.config.ts similarity index 100% rename from apps/web/open-next.config.ts rename to open-next.config.ts diff --git a/package.json b/package.json index f853b72..c5d3a40 100644 --- a/package.json +++ b/package.json @@ -2,20 +2,39 @@ "name": "infiplot", "version": "0.1.0", "private": true, + "type": "module", "description": "AI 实时交互剧情游戏", "license": "AGPL-3.0-only", "packageManager": "pnpm@9.12.0", "engines": { - "node": ">=20" + "node": ">=22" }, "scripts": { - "dev": "pnpm --filter @infiplot/web dev", - "build": "pnpm --filter @infiplot/web build", - "start": "pnpm --filter @infiplot/web start", - "lint": "pnpm -r lint", - "typecheck": "pnpm -r typecheck" + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint", + "typecheck": "tsc --noEmit", + "build:cf": "opennextjs-cloudflare build", + "preview:cf": "opennextjs-cloudflare preview", + "deploy:cf": "opennextjs-cloudflare deploy" + }, + "dependencies": { + "jsonrepair": "^3.14.0", + "next": "^16.0.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" }, "devDependencies": { - "typescript": "^5.6.3" + "@opennextjs/cloudflare": "^1.19.11", + "@types/node": "^22.9.0", + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.49", + "sharp": "^0.33.5", + "tailwindcss": "^3.4.15", + "typescript": "^5.6.3", + "wrangler": "^4.96.0" } } diff --git a/packages/ai-client/package.json b/packages/ai-client/package.json deleted file mode 100644 index 07d6e01..0000000 --- a/packages/ai-client/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "@infiplot/ai-client", - "version": "0.1.0", - "private": true, - "type": "module", - "main": "./src/index.ts", - "types": "./src/index.ts", - "exports": { - ".": "./src/index.ts" - }, - "scripts": { - "typecheck": "tsc --noEmit" - }, - "dependencies": { - "@infiplot/types": "workspace:*" - } -} diff --git a/packages/ai-client/tsconfig.json b/packages/ai-client/tsconfig.json deleted file mode 100644 index 25e8cea..0000000 --- a/packages/ai-client/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "noEmit": true - }, - "include": ["src/**/*"] -} diff --git a/packages/engine/package.json b/packages/engine/package.json deleted file mode 100644 index 5dfb5f3..0000000 --- a/packages/engine/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "@infiplot/engine", - "version": "0.1.0", - "private": true, - "type": "module", - "main": "./src/index.ts", - "types": "./src/index.ts", - "exports": { - ".": "./src/index.ts" - }, - "scripts": { - "typecheck": "tsc --noEmit" - }, - "dependencies": { - "@infiplot/ai-client": "workspace:*", - "@infiplot/tts-client": "workspace:*", - "@infiplot/types": "workspace:*", - "jsonrepair": "^3.14.0" - } -} diff --git a/packages/engine/tsconfig.json b/packages/engine/tsconfig.json deleted file mode 100644 index 25e8cea..0000000 --- a/packages/engine/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "noEmit": true - }, - "include": ["src/**/*"] -} diff --git a/packages/tts-client/package.json b/packages/tts-client/package.json deleted file mode 100644 index 170aa3b..0000000 --- a/packages/tts-client/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "@infiplot/tts-client", - "version": "0.1.0", - "private": true, - "type": "module", - "main": "./src/index.ts", - "types": "./src/index.ts", - "exports": { - ".": "./src/index.ts" - }, - "scripts": { - "typecheck": "tsc --noEmit" - }, - "dependencies": { - "@infiplot/types": "workspace:*" - } -} diff --git a/packages/tts-client/tsconfig.json b/packages/tts-client/tsconfig.json deleted file mode 100644 index 25e8cea..0000000 --- a/packages/tts-client/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "noEmit": true - }, - "include": ["src/**/*"] -} diff --git a/packages/types/package.json b/packages/types/package.json deleted file mode 100644 index 235f087..0000000 --- a/packages/types/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "@infiplot/types", - "version": "0.1.0", - "private": true, - "type": "module", - "main": "./src/index.ts", - "types": "./src/index.ts", - "exports": { - ".": "./src/index.ts" - }, - "scripts": { - "typecheck": "tsc --noEmit" - } -} diff --git a/packages/types/tsconfig.json b/packages/types/tsconfig.json deleted file mode 100644 index 25e8cea..0000000 --- a/packages/types/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "noEmit": true - }, - "include": ["src/**/*"] -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d926c0b..ce3df06 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,44 +7,32 @@ settings: importers: .: - devDependencies: - typescript: - specifier: ^5.6.3 - version: 5.9.3 - - apps/web: dependencies: - '@infiplot/ai-client': - specifier: workspace:* - version: link:../../packages/ai-client - '@infiplot/engine': - specifier: workspace:* - version: link:../../packages/engine - '@infiplot/types': - specifier: workspace:* - version: link:../../packages/types + jsonrepair: + specifier: ^3.14.0 + version: 3.14.0 next: specifier: ^16.0.0 - version: 16.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + version: 16.2.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7) react: specifier: ^19.0.0 - version: 19.2.6 + version: 19.2.7 react-dom: specifier: ^19.0.0 - version: 19.2.6(react@19.2.6) + version: 19.2.7(react@19.2.7) devDependencies: '@opennextjs/cloudflare': specifier: ^1.19.11 - version: 1.19.11(next@16.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(wrangler@4.96.0) + version: 1.19.11(next@16.2.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(wrangler@4.97.0) '@types/node': specifier: ^22.9.0 version: 22.19.19 '@types/react': specifier: ^19.0.0 - version: 19.2.15 + version: 19.2.16 '@types/react-dom': specifier: ^19.0.0 - version: 19.2.3(@types/react@19.2.15) + version: 19.2.3(@types/react@19.2.16) autoprefixer: specifier: ^10.4.20 version: 10.5.0(postcss@8.5.15) @@ -62,36 +50,7 @@ importers: version: 5.9.3 wrangler: specifier: ^4.96.0 - version: 4.96.0 - - packages/ai-client: - dependencies: - '@infiplot/types': - specifier: workspace:* - version: link:../types - - packages/engine: - dependencies: - '@infiplot/ai-client': - specifier: workspace:* - version: link:../ai-client - '@infiplot/tts-client': - specifier: workspace:* - version: link:../tts-client - '@infiplot/types': - specifier: workspace:* - version: link:../types - jsonrepair: - specifier: ^3.14.0 - version: 3.14.0 - - packages/tts-client: - dependencies: - '@infiplot/types': - specifier: workspace:* - version: link:../types - - packages/types: {} + version: 4.97.0 packages: @@ -356,32 +315,32 @@ packages: workerd: optional: true - '@cloudflare/workerd-darwin-64@1.20260529.1': - resolution: {integrity: sha512-gxh5sXw0CsBxNCNj8uJnrAxqFM7+R8SZI9WIqYMKz6uaPxgg+eTcBDTxjKczMs6bS21FkTEF6ohIzB5+UvxwKw==} + '@cloudflare/workerd-darwin-64@1.20260601.1': + resolution: {integrity: sha512-iXZBVuRbvuVqQ/63wul01hHCv/3R8G5S8zbkjfoHvyPZFynmlKTV59Hk+H8whyGwFAZuB71UJGLr+G5mJKfjWA==} engines: {node: '>=16'} cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20260529.1': - resolution: {integrity: sha512-B8xOwqd8ok8oaWBPhrpmNVSYou6AejFrYf3VzsJF6pg6TEA2tYbdThAGXgtLPQ8d1RD7GXYjVth2dSMg9napDA==} + '@cloudflare/workerd-darwin-arm64@1.20260601.1': + resolution: {integrity: sha512-veGpZQGBw07Twt+Y4z3oyo+/obKHt0iWUwvDV5GOiDAYjC/zW+YGstgVzg4SHq+k1sLH3ElqL2TXx20I5WBv3Q==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] - '@cloudflare/workerd-linux-64@1.20260529.1': - resolution: {integrity: sha512-M1EKzsfoKmmno7MNPkuIc8iOdHLhFnE7ltEYaGGEoOj1MTJfMBK/JkIrhdkzc/06wpyPZPiBfBBmUppbeaMqUg==} + '@cloudflare/workerd-linux-64@1.20260601.1': + resolution: {integrity: sha512-n/9hDz7fPGpYF0J684+Xr5zgjcS2jdmY2Of5m6e+eQ/M9+RfR+UaU8Ee/tkA1dDC0LYQB13hfPafZG66Ff1CsA==} engines: {node: '>=16'} cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20260529.1': - resolution: {integrity: sha512-Mn/Qpl1FAHDLtPthw6ti5gsHRj582jJdtK4OMUlW1CN0v+pmmxaav3KSqq7CS6a+5W0o2e8o9fKnjVilBxVVmQ==} + '@cloudflare/workerd-linux-arm64@1.20260601.1': + resolution: {integrity: sha512-VHRZZbexATS+n+1j3x/CZaYbIJEye0J3iIHgG0Wp+l+NrZCKQ8qi8Lq1uTV0dLJQ67FuZtJtWdQ95mm9F7Fc+A==} engines: {node: '>=16'} cpu: [arm64] os: [linux] - '@cloudflare/workerd-windows-64@1.20260529.1': - resolution: {integrity: sha512-78xgJJeXxkKYumWdKGH1pybUsEjTreSvbJqirW9cth7ZGonqdv5pzAVt+WWcbu0OFcSHrtQFX6zWioPNFp0/xQ==} + '@cloudflare/workerd-windows-64@1.20260601.1': + resolution: {integrity: sha512-ye0C7MFLkeH16iTo8Tcjv2KiFmp23+sZGvUzSQa4xhP0QMe6EoJ+H/4SqqvnZ5nfN54slqKvx2VnXceENWe2CQ==} engines: {node: '>=16'} cpu: [x64] os: [win32] @@ -974,53 +933,53 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@next/env@16.2.6': - resolution: {integrity: sha512-gd8HoHN4ufj73WmR3JmVolrpJR47ILK6LouP5xElPglaVxir6e1a7VzvTvDWkOoPXT9rkkTzyCxBu4yeZfZwcw==} + '@next/env@16.2.7': + resolution: {integrity: sha512-tMJizPlj6ZYpBMMdK8S0LJufrP4QTdR6pcv9KQ/bVETPAmg0j1mlHE9G2c38UyGHxoBapgwuj7XjbGJ2RcDFOg==} - '@next/swc-darwin-arm64@16.2.6': - resolution: {integrity: sha512-ZJGkkcNfYgrrMkqOdZ7zoLa1TOy0qpcMfk/z4Mh/FKUz40gVO+HNQWqmLxf67Z5WB64DRp0dhEbyHfel+6sJUg==} + '@next/swc-darwin-arm64@16.2.7': + resolution: {integrity: sha512-vm1EDI/pVaBNNiychmxk3fft+OhQPVD9cIM/tReLZIQ3TfQ4kqI9DwKk00dzuS1ulC7icbrzCFrmRRlk9PfNdw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@16.2.6': - resolution: {integrity: sha512-v/YLBHIY132Ced3puBJ7YJKw1lqsCrgcNo2aRJlCEyQrrCeRJlvGlnmxhPxNQI3KE3N1DN5r9TPNPvka3nq5RQ==} + '@next/swc-darwin-x64@16.2.7': + resolution: {integrity: sha512-O3IRSv1ZBL1zs0WrIgefTEcTKFVn+ryxBNe54erJ6KsD+2f/Mmt7g2jOYh8PSBdUwPtKQJuCsTMlZ7tIu2AcsQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@16.2.6': - resolution: {integrity: sha512-RPOvqlYBbcQjkz9VQQDZ2T2bARIjXZV1KFlt+V2Mr6SW/e4I9fcKsaA0hdyf2FHoTlsV2xnBd5Y912rP/1Ce6w==} + '@next/swc-linux-arm64-gnu@16.2.7': + resolution: {integrity: sha512-Re6PZtjBDd0aMU+VcZcC/PrIvj4WhrjDYtMhhCVQamWN4L90EVP0pcEOBQD25prSlw7OzNw5QpHLWMilRLsRNw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@16.2.6': - resolution: {integrity: sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==} + '@next/swc-linux-arm64-musl@16.2.7': + resolution: {integrity: sha512-qyogG9QtBzWxgJfeGBvOEHI3851gTfCF3wLZ5RDLTBJGAmE9p1qDwKCOdrBrvBzRvYDT+gUDp72pzlSEfAXgNA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@16.2.6': - resolution: {integrity: sha512-DOj182mPV8G3UkrayLoREM5YEYI+Dk5wv7Ox9xl1fFibAELEsFD0lDPfHIeILlutMMfdyhlzYPELG3peuKaurw==} + '@next/swc-linux-x64-gnu@16.2.7': + resolution: {integrity: sha512-Vhe4ZDuBpmMogrGi5D4R2Kq4JAQlj6+wvgaFYy31zfES0zPmt6TLA+cuYpM/OLrPZjo2MYQTHVqNUSCR6+fDZQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@16.2.6': - resolution: {integrity: sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g==} + '@next/swc-linux-x64-musl@16.2.7': + resolution: {integrity: sha512-srvian89JahFLw1YLBEuhvPJ0DO5lpUeJQMXy4xYo7g628ZlNgXdNkqoxSAv9OYrBfByh6vxISMwW/mRbzCY+g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@16.2.6': - resolution: {integrity: sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==} + '@next/swc-win32-arm64-msvc@16.2.7': + resolution: {integrity: sha512-GX3wvLpULFuRFJzwHaKfm7QZJ18F4ZSuxlPJ96BoBglCzBmdSjyeBKF+ZhWhvL/ckxNfLnNa7bsObO2ipYpszw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@16.2.6': - resolution: {integrity: sha512-F0+4i0h9J6C4eE3EAPWsoCk7UW/dbzOjyzxY0qnDUOYFu6FFmdZ6l97/XdV3/Nz3VYyO7UWjyEJUXkGqcoXfMA==} + '@next/swc-win32-x64-msvc@16.2.7': + resolution: {integrity: sha512-J4WlM72NMk076Qsg0jTdK3SNXatlSdnjW7L7oNGLst1tAGjHrJh/FYi+pw9wyIjEtGRKDNzD0zuiY16oWYWVaw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1265,8 +1224,8 @@ packages: peerDependencies: '@types/react': ^19.2.0 - '@types/react@19.2.15': - resolution: {integrity: sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q==} + '@types/react@19.2.16': + resolution: {integrity: sha512-esJiCAnl0kfpNdE69f3So4WJUXy95dLZydX0KwK46riIHDzHM7O9Vtf9xCHW0PXIqvgqNrswl522kA/5yx+F4w==} abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} @@ -1527,8 +1486,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.364: - resolution: {integrity: sha512-G/dYE3+AYhyHwzTwg8UbnXf7zqMERYh7l2jJ3QujhFsH8agSYwtnGAR2aZ7f0AakIKJXd5En/Hre4igIUrdlYw==} + electron-to-chromium@1.5.365: + resolution: {integrity: sha512-xfip4u1QF1s+URFqpA6N+OeFpDGpN7VJz1f3MO3bVL0QYBjpGiZ5/Of7kugvM+o8TTqmanUlviHN3c8M9vYWCw==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -1860,8 +1819,8 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - miniflare@4.20260529.0: - resolution: {integrity: sha512-4pj7WZQR/uYqVMa0cpAmmPBKEb0JegSocuystaXCubY455iqWdPUqgVD9R6N28oneWyPiUyAu5N8QpLbK+MU/Q==} + miniflare@4.20260601.0: + resolution: {integrity: sha512-56TFiulSEQu43cYxdXgCiA3U3i+Ls0NoXwJXd6DmpNsx8yl/1Il2T3DQ4CMXjR6yfE7CSvC5MuXaqcSAMREjgw==} engines: {node: '>=22.0.0'} hasBin: true @@ -1904,8 +1863,8 @@ packages: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} - next@16.2.6: - resolution: {integrity: sha512-qOVgKJg1+At15NpeUP+eJgCHvTCgXsogweq87Ri/Ix7PkqQHg4sdaXmSFqKlgaIXE4kW0g25LE68W87UANlHtw==} + next@16.2.7: + resolution: {integrity: sha512-eMJxgjRzBaj3olkP4cBamHDXL79A8FC6u1GcsO1D1Tsx8bw/LLXUJCaoajVxtnhD3A1IJqIT8IcRJjgBIPJq4w==} engines: {node: '>=20.9.0'} hasBin: true peerDependencies: @@ -1939,8 +1898,8 @@ packages: encoding: optional: true - node-releases@2.0.46: - resolution: {integrity: sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ==} + node-releases@2.0.47: + resolution: {integrity: sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==} engines: {node: '>=18'} normalize-path@3.0.0: @@ -2105,13 +2064,13 @@ packages: resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} engines: {node: '>= 0.10'} - react-dom@19.2.6: - resolution: {integrity: sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==} + react-dom@19.2.7: + resolution: {integrity: sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==} peerDependencies: - react: ^19.2.6 + react: ^19.2.7 - react@19.2.6: - resolution: {integrity: sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==} + react@19.2.7: + resolution: {integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==} engines: {node: '>=0.10.0'} read-cache@1.0.0: @@ -2364,17 +2323,17 @@ packages: engines: {node: ^16.13.0 || >=18.0.0} hasBin: true - workerd@1.20260529.1: - resolution: {integrity: sha512-G1rurOKEdzCtFE0yUPR9J9mUnPzMU8NdsD7NKM1/oMyCr1j3VEtWJzc5VbhgFQHNBVWrHzCL0JgVPuBirRW31g==} + workerd@1.20260601.1: + resolution: {integrity: sha512-Bg4+HF3B8TW0urAv8chiz25HSQ/aJxMBjgheUzu/nB1NQa+CaKGrUPv+Z3bf0np/WxLHYW1kcseVEtzZVPbX4g==} engines: {node: '>=16'} hasBin: true - wrangler@4.96.0: - resolution: {integrity: sha512-8WuiMutalyfBB74wwRyy4VKKJEHjQuEnwcvdUav1M5AfQ8VaTYY5ZQnzvVZPOVXap40k5Mntz1LY3SPWpPukTg==} + wrangler@4.97.0: + resolution: {integrity: sha512-jzW/aNvjerV+4TmwbvwGY6lpcuBk7EFUTonMDNfci45wSmMTj2/OJN+83cc/CeepKdb+6ZjGJw9NRjmcQoxqRg==} engines: {node: '>=22.0.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20260529.1 + '@cloudflare/workers-types': ^4.20260601.1 peerDependenciesMeta: '@cloudflare/workers-types': optional: true @@ -3028,25 +2987,25 @@ snapshots: '@cloudflare/kv-asset-handler@0.5.0': {} - '@cloudflare/unenv-preset@2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260529.1)': + '@cloudflare/unenv-preset@2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260601.1)': dependencies: unenv: 2.0.0-rc.24 optionalDependencies: - workerd: 1.20260529.1 + workerd: 1.20260601.1 - '@cloudflare/workerd-darwin-64@1.20260529.1': + '@cloudflare/workerd-darwin-64@1.20260601.1': optional: true - '@cloudflare/workerd-darwin-arm64@1.20260529.1': + '@cloudflare/workerd-darwin-arm64@1.20260601.1': optional: true - '@cloudflare/workerd-linux-64@1.20260529.1': + '@cloudflare/workerd-linux-64@1.20260601.1': optional: true - '@cloudflare/workerd-linux-arm64@1.20260529.1': + '@cloudflare/workerd-linux-arm64@1.20260601.1': optional: true - '@cloudflare/workerd-windows-64@1.20260529.1': + '@cloudflare/workerd-windows-64@1.20260601.1': optional: true '@cspotcode/source-map-support@0.8.1': @@ -3424,30 +3383,30 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@next/env@16.2.6': {} + '@next/env@16.2.7': {} - '@next/swc-darwin-arm64@16.2.6': + '@next/swc-darwin-arm64@16.2.7': optional: true - '@next/swc-darwin-x64@16.2.6': + '@next/swc-darwin-x64@16.2.7': optional: true - '@next/swc-linux-arm64-gnu@16.2.6': + '@next/swc-linux-arm64-gnu@16.2.7': optional: true - '@next/swc-linux-arm64-musl@16.2.6': + '@next/swc-linux-arm64-musl@16.2.7': optional: true - '@next/swc-linux-x64-gnu@16.2.6': + '@next/swc-linux-x64-gnu@16.2.7': optional: true - '@next/swc-linux-x64-musl@16.2.6': + '@next/swc-linux-x64-musl@16.2.7': optional: true - '@next/swc-win32-arm64-msvc@16.2.6': + '@next/swc-win32-arm64-msvc@16.2.7': optional: true - '@next/swc-win32-x64-msvc@16.2.6': + '@next/swc-win32-x64-msvc@16.2.7': optional: true '@noble/ciphers@1.3.0': {} @@ -3487,7 +3446,7 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@opennextjs/aws@4.0.2(next@16.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6))': + '@opennextjs/aws@4.0.2(next@16.2.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7))': dependencies: '@ast-grep/napi': 0.40.5 '@aws-sdk/client-cloudfront': 3.984.0 @@ -3503,26 +3462,26 @@ snapshots: cookie: 1.1.1 esbuild: 0.25.4 express: 5.2.1 - next: 16.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + next: 16.2.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7) path-to-regexp: 6.3.0 urlpattern-polyfill: 10.1.0 yaml: 2.9.0 transitivePeerDependencies: - supports-color - '@opennextjs/cloudflare@1.19.11(next@16.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(wrangler@4.96.0)': + '@opennextjs/cloudflare@1.19.11(next@16.2.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(wrangler@4.97.0)': dependencies: '@ast-grep/napi': 0.40.5 '@dotenvx/dotenvx': 1.31.0 - '@opennextjs/aws': 4.0.2(next@16.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)) + '@opennextjs/aws': 4.0.2(next@16.2.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) ci-info: 4.4.0 cloudflare: 4.5.0 comment-json: 4.6.2 enquirer: 2.4.1 glob: 12.0.0 - next: 16.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + next: 16.2.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7) ts-tqdm: 0.8.6 - wrangler: 4.96.0 + wrangler: 4.97.0 yargs: 18.0.0 transitivePeerDependencies: - encoding @@ -3757,11 +3716,11 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/react-dom@19.2.3(@types/react@19.2.15)': + '@types/react-dom@19.2.3(@types/react@19.2.16)': dependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.16 - '@types/react@19.2.15': + '@types/react@19.2.16': dependencies: csstype: 3.2.3 @@ -3854,8 +3813,8 @@ snapshots: dependencies: baseline-browser-mapping: 2.10.33 caniuse-lite: 1.0.30001793 - electron-to-chromium: 1.5.364 - node-releases: 2.0.46 + electron-to-chromium: 1.5.365 + node-releases: 2.0.47 update-browserslist-db: 1.2.3(browserslist@4.28.2) buffer-from@1.1.2: {} @@ -3998,7 +3957,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.364: {} + electron-to-chromium@1.5.365: {} emoji-regex@10.6.0: {} @@ -4375,12 +4334,12 @@ snapshots: mimic-fn@2.1.0: {} - miniflare@4.20260529.0: + miniflare@4.20260601.0: dependencies: '@cspotcode/source-map-support': 0.8.1 sharp: 0.34.5 undici: 7.24.8 - workerd: 1.20260529.1 + workerd: 1.20260601.1 ws: 8.20.1 youch: 4.1.0-beta.10 transitivePeerDependencies: @@ -4417,25 +4376,25 @@ snapshots: negotiator@1.0.0: {} - next@16.2.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6): + next@16.2.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: - '@next/env': 16.2.6 + '@next/env': 16.2.7 '@swc/helpers': 0.5.15 baseline-browser-mapping: 2.10.33 caniuse-lite: 1.0.30001793 postcss: 8.4.31 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) - styled-jsx: 5.1.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + styled-jsx: 5.1.6(react@19.2.7) optionalDependencies: - '@next/swc-darwin-arm64': 16.2.6 - '@next/swc-darwin-x64': 16.2.6 - '@next/swc-linux-arm64-gnu': 16.2.6 - '@next/swc-linux-arm64-musl': 16.2.6 - '@next/swc-linux-x64-gnu': 16.2.6 - '@next/swc-linux-x64-musl': 16.2.6 - '@next/swc-win32-arm64-msvc': 16.2.6 - '@next/swc-win32-x64-msvc': 16.2.6 + '@next/swc-darwin-arm64': 16.2.7 + '@next/swc-darwin-x64': 16.2.7 + '@next/swc-linux-arm64-gnu': 16.2.7 + '@next/swc-linux-arm64-musl': 16.2.7 + '@next/swc-linux-x64-gnu': 16.2.7 + '@next/swc-linux-x64-musl': 16.2.7 + '@next/swc-win32-arm64-msvc': 16.2.7 + '@next/swc-win32-x64-msvc': 16.2.7 sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' @@ -4447,7 +4406,7 @@ snapshots: dependencies: whatwg-url: 5.0.0 - node-releases@2.0.46: {} + node-releases@2.0.47: {} normalize-path@3.0.0: {} @@ -4577,12 +4536,12 @@ snapshots: iconv-lite: 0.7.2 unpipe: 1.0.0 - react-dom@19.2.6(react@19.2.6): + react-dom@19.2.7(react@19.2.7): dependencies: - react: 19.2.6 + react: 19.2.7 scheduler: 0.27.0 - react@19.2.6: {} + react@19.2.7: {} read-cache@1.0.0: dependencies: @@ -4776,10 +4735,10 @@ snapshots: strnum@2.3.0: {} - styled-jsx@5.1.6(react@19.2.6): + styled-jsx@5.1.6(react@19.2.7): dependencies: client-only: 0.0.1 - react: 19.2.6 + react: 19.2.7 sucrase@3.35.1: dependencies: @@ -4906,24 +4865,24 @@ snapshots: dependencies: isexe: 3.1.5 - workerd@1.20260529.1: + workerd@1.20260601.1: optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20260529.1 - '@cloudflare/workerd-darwin-arm64': 1.20260529.1 - '@cloudflare/workerd-linux-64': 1.20260529.1 - '@cloudflare/workerd-linux-arm64': 1.20260529.1 - '@cloudflare/workerd-windows-64': 1.20260529.1 + '@cloudflare/workerd-darwin-64': 1.20260601.1 + '@cloudflare/workerd-darwin-arm64': 1.20260601.1 + '@cloudflare/workerd-linux-64': 1.20260601.1 + '@cloudflare/workerd-linux-arm64': 1.20260601.1 + '@cloudflare/workerd-windows-64': 1.20260601.1 - wrangler@4.96.0: + wrangler@4.97.0: dependencies: '@cloudflare/kv-asset-handler': 0.5.0 - '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260529.1) + '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260601.1) blake3-wasm: 2.1.5 esbuild: 0.27.3 - miniflare: 4.20260529.0 + miniflare: 4.20260601.0 path-to-regexp: 6.3.0 unenv: 2.0.0-rc.24 - workerd: 1.20260529.1 + workerd: 1.20260601.1 optionalDependencies: fsevents: 2.3.3 transitivePeerDependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml deleted file mode 100644 index 3ff5faa..0000000 --- a/pnpm-workspace.yaml +++ /dev/null @@ -1,3 +0,0 @@ -packages: - - "apps/*" - - "packages/*" diff --git a/apps/web/postcss.config.mjs b/postcss.config.mjs similarity index 100% rename from apps/web/postcss.config.mjs rename to postcss.config.mjs diff --git a/apps/web/public/home/f0.webp b/public/home/f0.webp similarity index 100% rename from apps/web/public/home/f0.webp rename to public/home/f0.webp diff --git a/apps/web/public/home/f1.webp b/public/home/f1.webp similarity index 100% rename from apps/web/public/home/f1.webp rename to public/home/f1.webp diff --git a/apps/web/public/home/f10.webp b/public/home/f10.webp similarity index 100% rename from apps/web/public/home/f10.webp rename to public/home/f10.webp diff --git a/apps/web/public/home/f11.webp b/public/home/f11.webp similarity index 100% rename from apps/web/public/home/f11.webp rename to public/home/f11.webp diff --git a/apps/web/public/home/f12.webp b/public/home/f12.webp similarity index 100% rename from apps/web/public/home/f12.webp rename to public/home/f12.webp diff --git a/apps/web/public/home/f13.webp b/public/home/f13.webp similarity index 100% rename from apps/web/public/home/f13.webp rename to public/home/f13.webp diff --git a/apps/web/public/home/f14.webp b/public/home/f14.webp similarity index 100% rename from apps/web/public/home/f14.webp rename to public/home/f14.webp diff --git a/apps/web/public/home/f15.webp b/public/home/f15.webp similarity index 100% rename from apps/web/public/home/f15.webp rename to public/home/f15.webp diff --git a/apps/web/public/home/f16.webp b/public/home/f16.webp similarity index 100% rename from apps/web/public/home/f16.webp rename to public/home/f16.webp diff --git a/apps/web/public/home/f17.webp b/public/home/f17.webp similarity index 100% rename from apps/web/public/home/f17.webp rename to public/home/f17.webp diff --git a/apps/web/public/home/f18.webp b/public/home/f18.webp similarity index 100% rename from apps/web/public/home/f18.webp rename to public/home/f18.webp diff --git a/apps/web/public/home/f19.webp b/public/home/f19.webp similarity index 100% rename from apps/web/public/home/f19.webp rename to public/home/f19.webp diff --git a/apps/web/public/home/f2.webp b/public/home/f2.webp similarity index 100% rename from apps/web/public/home/f2.webp rename to public/home/f2.webp diff --git a/apps/web/public/home/f20.webp b/public/home/f20.webp similarity index 100% rename from apps/web/public/home/f20.webp rename to public/home/f20.webp diff --git a/apps/web/public/home/f21.webp b/public/home/f21.webp similarity index 100% rename from apps/web/public/home/f21.webp rename to public/home/f21.webp diff --git a/apps/web/public/home/f22.webp b/public/home/f22.webp similarity index 100% rename from apps/web/public/home/f22.webp rename to public/home/f22.webp diff --git a/apps/web/public/home/f23.webp b/public/home/f23.webp similarity index 100% rename from apps/web/public/home/f23.webp rename to public/home/f23.webp diff --git a/apps/web/public/home/f24.webp b/public/home/f24.webp similarity index 100% rename from apps/web/public/home/f24.webp rename to public/home/f24.webp diff --git a/apps/web/public/home/f25.webp b/public/home/f25.webp similarity index 100% rename from apps/web/public/home/f25.webp rename to public/home/f25.webp diff --git a/apps/web/public/home/f26.webp b/public/home/f26.webp similarity index 100% rename from apps/web/public/home/f26.webp rename to public/home/f26.webp diff --git a/apps/web/public/home/f27.webp b/public/home/f27.webp similarity index 100% rename from apps/web/public/home/f27.webp rename to public/home/f27.webp diff --git a/apps/web/public/home/f28.webp b/public/home/f28.webp similarity index 100% rename from apps/web/public/home/f28.webp rename to public/home/f28.webp diff --git a/apps/web/public/home/f29.webp b/public/home/f29.webp similarity index 100% rename from apps/web/public/home/f29.webp rename to public/home/f29.webp diff --git a/apps/web/public/home/f3.webp b/public/home/f3.webp similarity index 100% rename from apps/web/public/home/f3.webp rename to public/home/f3.webp diff --git a/apps/web/public/home/f30.webp b/public/home/f30.webp similarity index 100% rename from apps/web/public/home/f30.webp rename to public/home/f30.webp diff --git a/apps/web/public/home/f31.webp b/public/home/f31.webp similarity index 100% rename from apps/web/public/home/f31.webp rename to public/home/f31.webp diff --git a/apps/web/public/home/f4.webp b/public/home/f4.webp similarity index 100% rename from apps/web/public/home/f4.webp rename to public/home/f4.webp diff --git a/apps/web/public/home/f5.webp b/public/home/f5.webp similarity index 100% rename from apps/web/public/home/f5.webp rename to public/home/f5.webp diff --git a/apps/web/public/home/f6.webp b/public/home/f6.webp similarity index 100% rename from apps/web/public/home/f6.webp rename to public/home/f6.webp diff --git a/apps/web/public/home/f7.webp b/public/home/f7.webp similarity index 100% rename from apps/web/public/home/f7.webp rename to public/home/f7.webp diff --git a/apps/web/public/home/f8.webp b/public/home/f8.webp similarity index 100% rename from apps/web/public/home/f8.webp rename to public/home/f8.webp diff --git a/apps/web/public/home/f9.webp b/public/home/f9.webp similarity index 100% rename from apps/web/public/home/f9.webp rename to public/home/f9.webp diff --git a/apps/web/public/home/firstact/f0.json b/public/home/firstact/f0.json similarity index 100% rename from apps/web/public/home/firstact/f0.json rename to public/home/firstact/f0.json diff --git a/apps/web/public/home/firstact/f1.json b/public/home/firstact/f1.json similarity index 100% rename from apps/web/public/home/firstact/f1.json rename to public/home/firstact/f1.json diff --git a/apps/web/public/home/firstact/f10.json b/public/home/firstact/f10.json similarity index 100% rename from apps/web/public/home/firstact/f10.json rename to public/home/firstact/f10.json diff --git a/apps/web/public/home/firstact/f11.json b/public/home/firstact/f11.json similarity index 100% rename from apps/web/public/home/firstact/f11.json rename to public/home/firstact/f11.json diff --git a/apps/web/public/home/firstact/f12.json b/public/home/firstact/f12.json similarity index 100% rename from apps/web/public/home/firstact/f12.json rename to public/home/firstact/f12.json diff --git a/apps/web/public/home/firstact/f13.json b/public/home/firstact/f13.json similarity index 100% rename from apps/web/public/home/firstact/f13.json rename to public/home/firstact/f13.json diff --git a/apps/web/public/home/firstact/f2.json b/public/home/firstact/f2.json similarity index 100% rename from apps/web/public/home/firstact/f2.json rename to public/home/firstact/f2.json diff --git a/apps/web/public/home/firstact/f3.json b/public/home/firstact/f3.json similarity index 100% rename from apps/web/public/home/firstact/f3.json rename to public/home/firstact/f3.json diff --git a/apps/web/public/home/firstact/f4.json b/public/home/firstact/f4.json similarity index 100% rename from apps/web/public/home/firstact/f4.json rename to public/home/firstact/f4.json diff --git a/apps/web/public/home/firstact/f5.json b/public/home/firstact/f5.json similarity index 100% rename from apps/web/public/home/firstact/f5.json rename to public/home/firstact/f5.json diff --git a/apps/web/public/home/firstact/f6.json b/public/home/firstact/f6.json similarity index 100% rename from apps/web/public/home/firstact/f6.json rename to public/home/firstact/f6.json diff --git a/apps/web/public/home/firstact/f7.json b/public/home/firstact/f7.json similarity index 100% rename from apps/web/public/home/firstact/f7.json rename to public/home/firstact/f7.json diff --git a/apps/web/public/home/firstact/f8.json b/public/home/firstact/f8.json similarity index 100% rename from apps/web/public/home/firstact/f8.json rename to public/home/firstact/f8.json diff --git a/apps/web/public/home/firstact/f9.json b/public/home/firstact/f9.json similarity index 100% rename from apps/web/public/home/firstact/f9.json rename to public/home/firstact/f9.json diff --git a/apps/web/public/home/firstact/m0.json b/public/home/firstact/m0.json similarity index 100% rename from apps/web/public/home/firstact/m0.json rename to public/home/firstact/m0.json diff --git a/apps/web/public/home/firstact/m1.json b/public/home/firstact/m1.json similarity index 100% rename from apps/web/public/home/firstact/m1.json rename to public/home/firstact/m1.json diff --git a/apps/web/public/home/firstact/m10.json b/public/home/firstact/m10.json similarity index 100% rename from apps/web/public/home/firstact/m10.json rename to public/home/firstact/m10.json diff --git a/apps/web/public/home/firstact/m11.json b/public/home/firstact/m11.json similarity index 100% rename from apps/web/public/home/firstact/m11.json rename to public/home/firstact/m11.json diff --git a/apps/web/public/home/firstact/m12.json b/public/home/firstact/m12.json similarity index 100% rename from apps/web/public/home/firstact/m12.json rename to public/home/firstact/m12.json diff --git a/apps/web/public/home/firstact/m13.json b/public/home/firstact/m13.json similarity index 100% rename from apps/web/public/home/firstact/m13.json rename to public/home/firstact/m13.json diff --git a/apps/web/public/home/firstact/m15.json b/public/home/firstact/m15.json similarity index 100% rename from apps/web/public/home/firstact/m15.json rename to public/home/firstact/m15.json diff --git a/apps/web/public/home/firstact/m16.json b/public/home/firstact/m16.json similarity index 100% rename from apps/web/public/home/firstact/m16.json rename to public/home/firstact/m16.json diff --git a/apps/web/public/home/firstact/m17.json b/public/home/firstact/m17.json similarity index 100% rename from apps/web/public/home/firstact/m17.json rename to public/home/firstact/m17.json diff --git a/apps/web/public/home/firstact/m18.json b/public/home/firstact/m18.json similarity index 100% rename from apps/web/public/home/firstact/m18.json rename to public/home/firstact/m18.json diff --git a/apps/web/public/home/firstact/m19.json b/public/home/firstact/m19.json similarity index 100% rename from apps/web/public/home/firstact/m19.json rename to public/home/firstact/m19.json diff --git a/apps/web/public/home/firstact/m2.json b/public/home/firstact/m2.json similarity index 100% rename from apps/web/public/home/firstact/m2.json rename to public/home/firstact/m2.json diff --git a/apps/web/public/home/firstact/m20.json b/public/home/firstact/m20.json similarity index 100% rename from apps/web/public/home/firstact/m20.json rename to public/home/firstact/m20.json diff --git a/apps/web/public/home/firstact/m21.json b/public/home/firstact/m21.json similarity index 100% rename from apps/web/public/home/firstact/m21.json rename to public/home/firstact/m21.json diff --git a/apps/web/public/home/firstact/m22.json b/public/home/firstact/m22.json similarity index 100% rename from apps/web/public/home/firstact/m22.json rename to public/home/firstact/m22.json diff --git a/apps/web/public/home/firstact/m23.json b/public/home/firstact/m23.json similarity index 100% rename from apps/web/public/home/firstact/m23.json rename to public/home/firstact/m23.json diff --git a/apps/web/public/home/firstact/m24.json b/public/home/firstact/m24.json similarity index 100% rename from apps/web/public/home/firstact/m24.json rename to public/home/firstact/m24.json diff --git a/apps/web/public/home/firstact/m25.json b/public/home/firstact/m25.json similarity index 100% rename from apps/web/public/home/firstact/m25.json rename to public/home/firstact/m25.json diff --git a/apps/web/public/home/firstact/m26.json b/public/home/firstact/m26.json similarity index 100% rename from apps/web/public/home/firstact/m26.json rename to public/home/firstact/m26.json diff --git a/apps/web/public/home/firstact/m27.json b/public/home/firstact/m27.json similarity index 100% rename from apps/web/public/home/firstact/m27.json rename to public/home/firstact/m27.json diff --git a/apps/web/public/home/firstact/m28.json b/public/home/firstact/m28.json similarity index 100% rename from apps/web/public/home/firstact/m28.json rename to public/home/firstact/m28.json diff --git a/apps/web/public/home/firstact/m3.json b/public/home/firstact/m3.json similarity index 100% rename from apps/web/public/home/firstact/m3.json rename to public/home/firstact/m3.json diff --git a/apps/web/public/home/firstact/m30.json b/public/home/firstact/m30.json similarity index 100% rename from apps/web/public/home/firstact/m30.json rename to public/home/firstact/m30.json diff --git a/apps/web/public/home/firstact/m31.json b/public/home/firstact/m31.json similarity index 100% rename from apps/web/public/home/firstact/m31.json rename to public/home/firstact/m31.json diff --git a/apps/web/public/home/firstact/m4.json b/public/home/firstact/m4.json similarity index 100% rename from apps/web/public/home/firstact/m4.json rename to public/home/firstact/m4.json diff --git a/apps/web/public/home/firstact/m5.json b/public/home/firstact/m5.json similarity index 100% rename from apps/web/public/home/firstact/m5.json rename to public/home/firstact/m5.json diff --git a/apps/web/public/home/firstact/m6.json b/public/home/firstact/m6.json similarity index 100% rename from apps/web/public/home/firstact/m6.json rename to public/home/firstact/m6.json diff --git a/apps/web/public/home/firstact/m7.json b/public/home/firstact/m7.json similarity index 100% rename from apps/web/public/home/firstact/m7.json rename to public/home/firstact/m7.json diff --git a/apps/web/public/home/firstact/m8.json b/public/home/firstact/m8.json similarity index 100% rename from apps/web/public/home/firstact/m8.json rename to public/home/firstact/m8.json diff --git a/apps/web/public/home/firstact/m9.json b/public/home/firstact/m9.json similarity index 100% rename from apps/web/public/home/firstact/m9.json rename to public/home/firstact/m9.json diff --git a/apps/web/public/home/firstscene/f0.webp b/public/home/firstscene/f0.webp similarity index 100% rename from apps/web/public/home/firstscene/f0.webp rename to public/home/firstscene/f0.webp diff --git a/apps/web/public/home/firstscene/f1.webp b/public/home/firstscene/f1.webp similarity index 100% rename from apps/web/public/home/firstscene/f1.webp rename to public/home/firstscene/f1.webp diff --git a/apps/web/public/home/firstscene/f10.webp b/public/home/firstscene/f10.webp similarity index 100% rename from apps/web/public/home/firstscene/f10.webp rename to public/home/firstscene/f10.webp diff --git a/apps/web/public/home/firstscene/f11.webp b/public/home/firstscene/f11.webp similarity index 100% rename from apps/web/public/home/firstscene/f11.webp rename to public/home/firstscene/f11.webp diff --git a/apps/web/public/home/firstscene/f12.webp b/public/home/firstscene/f12.webp similarity index 100% rename from apps/web/public/home/firstscene/f12.webp rename to public/home/firstscene/f12.webp diff --git a/apps/web/public/home/firstscene/f13.webp b/public/home/firstscene/f13.webp similarity index 100% rename from apps/web/public/home/firstscene/f13.webp rename to public/home/firstscene/f13.webp diff --git a/apps/web/public/home/firstscene/f2.webp b/public/home/firstscene/f2.webp similarity index 100% rename from apps/web/public/home/firstscene/f2.webp rename to public/home/firstscene/f2.webp diff --git a/apps/web/public/home/firstscene/f3.webp b/public/home/firstscene/f3.webp similarity index 100% rename from apps/web/public/home/firstscene/f3.webp rename to public/home/firstscene/f3.webp diff --git a/apps/web/public/home/firstscene/f4.webp b/public/home/firstscene/f4.webp similarity index 100% rename from apps/web/public/home/firstscene/f4.webp rename to public/home/firstscene/f4.webp diff --git a/apps/web/public/home/firstscene/f5.webp b/public/home/firstscene/f5.webp similarity index 100% rename from apps/web/public/home/firstscene/f5.webp rename to public/home/firstscene/f5.webp diff --git a/apps/web/public/home/firstscene/f6.webp b/public/home/firstscene/f6.webp similarity index 100% rename from apps/web/public/home/firstscene/f6.webp rename to public/home/firstscene/f6.webp diff --git a/apps/web/public/home/firstscene/f7.webp b/public/home/firstscene/f7.webp similarity index 100% rename from apps/web/public/home/firstscene/f7.webp rename to public/home/firstscene/f7.webp diff --git a/apps/web/public/home/firstscene/f8.webp b/public/home/firstscene/f8.webp similarity index 100% rename from apps/web/public/home/firstscene/f8.webp rename to public/home/firstscene/f8.webp diff --git a/apps/web/public/home/firstscene/f9.webp b/public/home/firstscene/f9.webp similarity index 100% rename from apps/web/public/home/firstscene/f9.webp rename to public/home/firstscene/f9.webp diff --git a/apps/web/public/home/firstscene/m0.webp b/public/home/firstscene/m0.webp similarity index 100% rename from apps/web/public/home/firstscene/m0.webp rename to public/home/firstscene/m0.webp diff --git a/apps/web/public/home/firstscene/m1.webp b/public/home/firstscene/m1.webp similarity index 100% rename from apps/web/public/home/firstscene/m1.webp rename to public/home/firstscene/m1.webp diff --git a/apps/web/public/home/firstscene/m10.webp b/public/home/firstscene/m10.webp similarity index 100% rename from apps/web/public/home/firstscene/m10.webp rename to public/home/firstscene/m10.webp diff --git a/apps/web/public/home/firstscene/m11.webp b/public/home/firstscene/m11.webp similarity index 100% rename from apps/web/public/home/firstscene/m11.webp rename to public/home/firstscene/m11.webp diff --git a/apps/web/public/home/firstscene/m12.webp b/public/home/firstscene/m12.webp similarity index 100% rename from apps/web/public/home/firstscene/m12.webp rename to public/home/firstscene/m12.webp diff --git a/apps/web/public/home/firstscene/m13.webp b/public/home/firstscene/m13.webp similarity index 100% rename from apps/web/public/home/firstscene/m13.webp rename to public/home/firstscene/m13.webp diff --git a/apps/web/public/home/firstscene/m15.webp b/public/home/firstscene/m15.webp similarity index 100% rename from apps/web/public/home/firstscene/m15.webp rename to public/home/firstscene/m15.webp diff --git a/apps/web/public/home/firstscene/m16.webp b/public/home/firstscene/m16.webp similarity index 100% rename from apps/web/public/home/firstscene/m16.webp rename to public/home/firstscene/m16.webp diff --git a/apps/web/public/home/firstscene/m17.webp b/public/home/firstscene/m17.webp similarity index 100% rename from apps/web/public/home/firstscene/m17.webp rename to public/home/firstscene/m17.webp diff --git a/apps/web/public/home/firstscene/m18.webp b/public/home/firstscene/m18.webp similarity index 100% rename from apps/web/public/home/firstscene/m18.webp rename to public/home/firstscene/m18.webp diff --git a/apps/web/public/home/firstscene/m19.webp b/public/home/firstscene/m19.webp similarity index 100% rename from apps/web/public/home/firstscene/m19.webp rename to public/home/firstscene/m19.webp diff --git a/apps/web/public/home/firstscene/m2.webp b/public/home/firstscene/m2.webp similarity index 100% rename from apps/web/public/home/firstscene/m2.webp rename to public/home/firstscene/m2.webp diff --git a/apps/web/public/home/firstscene/m20.webp b/public/home/firstscene/m20.webp similarity index 100% rename from apps/web/public/home/firstscene/m20.webp rename to public/home/firstscene/m20.webp diff --git a/apps/web/public/home/firstscene/m21.webp b/public/home/firstscene/m21.webp similarity index 100% rename from apps/web/public/home/firstscene/m21.webp rename to public/home/firstscene/m21.webp diff --git a/apps/web/public/home/firstscene/m22.webp b/public/home/firstscene/m22.webp similarity index 100% rename from apps/web/public/home/firstscene/m22.webp rename to public/home/firstscene/m22.webp diff --git a/apps/web/public/home/firstscene/m23.webp b/public/home/firstscene/m23.webp similarity index 100% rename from apps/web/public/home/firstscene/m23.webp rename to public/home/firstscene/m23.webp diff --git a/apps/web/public/home/firstscene/m24.webp b/public/home/firstscene/m24.webp similarity index 100% rename from apps/web/public/home/firstscene/m24.webp rename to public/home/firstscene/m24.webp diff --git a/apps/web/public/home/firstscene/m25.webp b/public/home/firstscene/m25.webp similarity index 100% rename from apps/web/public/home/firstscene/m25.webp rename to public/home/firstscene/m25.webp diff --git a/apps/web/public/home/firstscene/m26.webp b/public/home/firstscene/m26.webp similarity index 100% rename from apps/web/public/home/firstscene/m26.webp rename to public/home/firstscene/m26.webp diff --git a/apps/web/public/home/firstscene/m27.webp b/public/home/firstscene/m27.webp similarity index 100% rename from apps/web/public/home/firstscene/m27.webp rename to public/home/firstscene/m27.webp diff --git a/apps/web/public/home/firstscene/m28.webp b/public/home/firstscene/m28.webp similarity index 100% rename from apps/web/public/home/firstscene/m28.webp rename to public/home/firstscene/m28.webp diff --git a/apps/web/public/home/firstscene/m3.webp b/public/home/firstscene/m3.webp similarity index 100% rename from apps/web/public/home/firstscene/m3.webp rename to public/home/firstscene/m3.webp diff --git a/apps/web/public/home/firstscene/m30.webp b/public/home/firstscene/m30.webp similarity index 100% rename from apps/web/public/home/firstscene/m30.webp rename to public/home/firstscene/m30.webp diff --git a/apps/web/public/home/firstscene/m31.webp b/public/home/firstscene/m31.webp similarity index 100% rename from apps/web/public/home/firstscene/m31.webp rename to public/home/firstscene/m31.webp diff --git a/apps/web/public/home/firstscene/m4.webp b/public/home/firstscene/m4.webp similarity index 100% rename from apps/web/public/home/firstscene/m4.webp rename to public/home/firstscene/m4.webp diff --git a/apps/web/public/home/firstscene/m5.webp b/public/home/firstscene/m5.webp similarity index 100% rename from apps/web/public/home/firstscene/m5.webp rename to public/home/firstscene/m5.webp diff --git a/apps/web/public/home/firstscene/m6.webp b/public/home/firstscene/m6.webp similarity index 100% rename from apps/web/public/home/firstscene/m6.webp rename to public/home/firstscene/m6.webp diff --git a/apps/web/public/home/firstscene/m7.webp b/public/home/firstscene/m7.webp similarity index 100% rename from apps/web/public/home/firstscene/m7.webp rename to public/home/firstscene/m7.webp diff --git a/apps/web/public/home/firstscene/m8.webp b/public/home/firstscene/m8.webp similarity index 100% rename from apps/web/public/home/firstscene/m8.webp rename to public/home/firstscene/m8.webp diff --git a/apps/web/public/home/firstscene/m9.webp b/public/home/firstscene/m9.webp similarity index 100% rename from apps/web/public/home/firstscene/m9.webp rename to public/home/firstscene/m9.webp diff --git a/apps/web/public/home/m0.webp b/public/home/m0.webp similarity index 100% rename from apps/web/public/home/m0.webp rename to public/home/m0.webp diff --git a/apps/web/public/home/m1.webp b/public/home/m1.webp similarity index 100% rename from apps/web/public/home/m1.webp rename to public/home/m1.webp diff --git a/apps/web/public/home/m10.webp b/public/home/m10.webp similarity index 100% rename from apps/web/public/home/m10.webp rename to public/home/m10.webp diff --git a/apps/web/public/home/m11.webp b/public/home/m11.webp similarity index 100% rename from apps/web/public/home/m11.webp rename to public/home/m11.webp diff --git a/apps/web/public/home/m12.webp b/public/home/m12.webp similarity index 100% rename from apps/web/public/home/m12.webp rename to public/home/m12.webp diff --git a/apps/web/public/home/m13.webp b/public/home/m13.webp similarity index 100% rename from apps/web/public/home/m13.webp rename to public/home/m13.webp diff --git a/apps/web/public/home/m14.webp b/public/home/m14.webp similarity index 100% rename from apps/web/public/home/m14.webp rename to public/home/m14.webp diff --git a/apps/web/public/home/m15.webp b/public/home/m15.webp similarity index 100% rename from apps/web/public/home/m15.webp rename to public/home/m15.webp diff --git a/apps/web/public/home/m16.webp b/public/home/m16.webp similarity index 100% rename from apps/web/public/home/m16.webp rename to public/home/m16.webp diff --git a/apps/web/public/home/m17.webp b/public/home/m17.webp similarity index 100% rename from apps/web/public/home/m17.webp rename to public/home/m17.webp diff --git a/apps/web/public/home/m18.webp b/public/home/m18.webp similarity index 100% rename from apps/web/public/home/m18.webp rename to public/home/m18.webp diff --git a/apps/web/public/home/m19.webp b/public/home/m19.webp similarity index 100% rename from apps/web/public/home/m19.webp rename to public/home/m19.webp diff --git a/apps/web/public/home/m2.webp b/public/home/m2.webp similarity index 100% rename from apps/web/public/home/m2.webp rename to public/home/m2.webp diff --git a/apps/web/public/home/m20.webp b/public/home/m20.webp similarity index 100% rename from apps/web/public/home/m20.webp rename to public/home/m20.webp diff --git a/apps/web/public/home/m21.webp b/public/home/m21.webp similarity index 100% rename from apps/web/public/home/m21.webp rename to public/home/m21.webp diff --git a/apps/web/public/home/m22.webp b/public/home/m22.webp similarity index 100% rename from apps/web/public/home/m22.webp rename to public/home/m22.webp diff --git a/apps/web/public/home/m23.webp b/public/home/m23.webp similarity index 100% rename from apps/web/public/home/m23.webp rename to public/home/m23.webp diff --git a/apps/web/public/home/m24.webp b/public/home/m24.webp similarity index 100% rename from apps/web/public/home/m24.webp rename to public/home/m24.webp diff --git a/apps/web/public/home/m25.webp b/public/home/m25.webp similarity index 100% rename from apps/web/public/home/m25.webp rename to public/home/m25.webp diff --git a/apps/web/public/home/m26.webp b/public/home/m26.webp similarity index 100% rename from apps/web/public/home/m26.webp rename to public/home/m26.webp diff --git a/apps/web/public/home/m27.webp b/public/home/m27.webp similarity index 100% rename from apps/web/public/home/m27.webp rename to public/home/m27.webp diff --git a/apps/web/public/home/m28.webp b/public/home/m28.webp similarity index 100% rename from apps/web/public/home/m28.webp rename to public/home/m28.webp diff --git a/apps/web/public/home/m29.webp b/public/home/m29.webp similarity index 100% rename from apps/web/public/home/m29.webp rename to public/home/m29.webp diff --git a/apps/web/public/home/m3.webp b/public/home/m3.webp similarity index 100% rename from apps/web/public/home/m3.webp rename to public/home/m3.webp diff --git a/apps/web/public/home/m30.webp b/public/home/m30.webp similarity index 100% rename from apps/web/public/home/m30.webp rename to public/home/m30.webp diff --git a/apps/web/public/home/m31.webp b/public/home/m31.webp similarity index 100% rename from apps/web/public/home/m31.webp rename to public/home/m31.webp diff --git a/apps/web/public/home/m4.webp b/public/home/m4.webp similarity index 100% rename from apps/web/public/home/m4.webp rename to public/home/m4.webp diff --git a/apps/web/public/home/m5.webp b/public/home/m5.webp similarity index 100% rename from apps/web/public/home/m5.webp rename to public/home/m5.webp diff --git a/apps/web/public/home/m6.webp b/public/home/m6.webp similarity index 100% rename from apps/web/public/home/m6.webp rename to public/home/m6.webp diff --git a/apps/web/public/home/m7.webp b/public/home/m7.webp similarity index 100% rename from apps/web/public/home/m7.webp rename to public/home/m7.webp diff --git a/apps/web/public/home/m8.webp b/public/home/m8.webp similarity index 100% rename from apps/web/public/home/m8.webp rename to public/home/m8.webp diff --git a/apps/web/public/home/m9.webp b/public/home/m9.webp similarity index 100% rename from apps/web/public/home/m9.webp rename to public/home/m9.webp diff --git a/apps/web/public/qq-group.webp b/public/qq-group.webp similarity index 100% rename from apps/web/public/qq-group.webp rename to public/qq-group.webp diff --git a/apps/web/scripts/generate-home-images.mjs b/scripts/generate-home-images.mjs similarity index 98% rename from apps/web/scripts/generate-home-images.mjs rename to scripts/generate-home-images.mjs index 64d5ad9..d4a638e 100644 --- a/apps/web/scripts/generate-home-images.mjs +++ b/scripts/generate-home-images.mjs @@ -1,7 +1,7 @@ #!/usr/bin/env node /** * One-off generator: produces the InfiPlot homepage story cards via Runware - * FLUX.2 and writes them as PNGs under apps/web/public/home/. + * FLUX.2 and writes them as PNGs under public/home/. * * Flat per-gender layout: 32 male-oriented (m0..m31) + 32 female-oriented * (f0..f31). All cards are 832x1024 (≈4:5) to match the homepage StoryCard @@ -11,10 +11,10 @@ * ink / cyberpunk / steampunk / pixel / etc.) so the homepage feels visually * varied rather than uniformly anime. Stories are 红果-short-drama framed. * - * Reads IMAGE_BASE_URL / IMAGE_API_KEY / IMAGE_MODEL from apps/web/.env.local. + * Reads IMAGE_BASE_URL / IMAGE_API_KEY / IMAGE_MODEL from .env.local. * * Run once: - * node apps/web/scripts/generate-home-images.mjs + * node scripts/generate-home-images.mjs * * Idempotent: skips any card whose .png or .webp already exists. Pass --force * to regenerate everything. @@ -71,7 +71,7 @@ const BASE_QUALITY = const W = 832; const H = 1024; -// Style suffixes — kept in sync with apps/web/app/page.tsx STYLE_MAP so the +// Style suffixes — kept in sync with app/page.tsx STYLE_MAP so the // homepage cover and the in-game styleGuide land on the same aesthetic. const S = { 二次元: "anime visual novel illustration, japanese galgame aesthetic, soft warm natural light", diff --git a/apps/web/scripts/localize-firstact-images.mjs b/scripts/localize-firstact-images.mjs similarity index 96% rename from apps/web/scripts/localize-firstact-images.mjs rename to scripts/localize-firstact-images.mjs index 55f8a74..f365139 100644 --- a/apps/web/scripts/localize-firstact-images.mjs +++ b/scripts/localize-firstact-images.mjs @@ -2,7 +2,7 @@ /** * Post-process for prebake-firstacts: each first-act JSON has imageUrl pointing * at https://im.runware.ai/... which adds ~1-2s of remote-CDN download on first - * click. This script downloads every imageUrl to apps/web/public/home/firstscene/ + * click. This script downloads every imageUrl to public/home/firstscene/ * (webp, compressed) and rewrites the JSON's imageUrl to the local /home/... * path, so click-to-play is bottlenecked only by JSON parse + local image * decode (sub-100ms). @@ -11,7 +11,7 @@ * skipped. Pass --force to re-download everything. * * Run once after prebake-firstacts.mjs completes: - * node apps/web/scripts/localize-firstact-images.mjs + * node scripts/localize-firstact-images.mjs */ import { fileURLToPath } from "node:url"; diff --git a/apps/web/scripts/optimize-home-images.mjs b/scripts/optimize-home-images.mjs similarity index 95% rename from apps/web/scripts/optimize-home-images.mjs rename to scripts/optimize-home-images.mjs index 9b76d1e..fd97b42 100644 --- a/apps/web/scripts/optimize-home-images.mjs +++ b/scripts/optimize-home-images.mjs @@ -1,6 +1,6 @@ #!/usr/bin/env node /** - * Compresses the freshly generated apps/web/public/home/*.png into much + * Compresses the freshly generated public/home/*.png into much * smaller .webp files alongside them, then deletes the originals. * Output webps target ~1200px on the long edge and quality 78. */ diff --git a/apps/web/scripts/prebake-firstacts.mjs b/scripts/prebake-firstacts.mjs similarity index 98% rename from apps/web/scripts/prebake-firstacts.mjs rename to scripts/prebake-firstacts.mjs index 5c07ace..b66d194 100644 --- a/apps/web/scripts/prebake-firstacts.mjs +++ b/scripts/prebake-firstacts.mjs @@ -2,7 +2,7 @@ /** * One-off generator: produces the InfiPlot homepage "instant-play" first-act * JSONs by driving each curated card through the live engine (POST /api/start) - * and saving the full StartResponse under apps/web/public/home/firstact/. + * and saving the full StartResponse under public/home/firstact/. * * The /play page detects ?card= and hydrates Session from the JSON * instead of calling /api/start, so click-to-play feels instant — only the @@ -13,7 +13,7 @@ * Pass --force to regenerate all 64. * * Run once: - * node apps/web/scripts/prebake-firstacts.mjs + * node scripts/prebake-firstacts.mjs * * Concurrency 4 to avoid LLM/Runware/MiMo provider rate limits. */ @@ -30,7 +30,7 @@ const FORCE = process.argv.includes("--force"); const BASE_URL = process.env.BASE_URL ?? "http://localhost:3000"; const CONCURRENCY = 4; -// Mirror of apps/web/app/page.tsx STYLE_MAP — keep these in sync. The engine +// Mirror of app/page.tsx STYLE_MAP — keep these in sync. The engine // only needs the prose styleGuide string; this script maps card.style → that. const STYLE_MAP = { 二次元: "唯美二次元动漫插画,日系 galgame 精致质感,柔和温暖的自然光照。", @@ -47,7 +47,7 @@ const STYLE_MAP = { 赛博朋克: "赛博朋克都市,霓虹反射湿润街道,电子义体高光。", }; -// Mirror of apps/web/app/page.tsx STORIES, flat with name + gender. Indexes +// Mirror of app/page.tsx STORIES, flat with name + gender. Indexes // match the m0..m31 / f0..f31 cover filenames. const CARDS = [ // 男性向 m0..m31 diff --git a/apps/web/tailwind.config.ts b/tailwind.config.ts similarity index 100% rename from apps/web/tailwind.config.ts rename to tailwind.config.ts diff --git a/tsconfig.base.json b/tsconfig.base.json deleted file mode 100644 index d195d30..0000000 --- a/tsconfig.base.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "lib": ["ES2022", "DOM", "DOM.Iterable"], - "module": "ESNext", - "moduleResolution": "Bundler", - "esModuleInterop": true, - "strict": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noUncheckedIndexedAccess": true, - "verbatimModuleSyntax": false, - "jsx": "preserve" - } -} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..bdcf76f --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,56 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": [ + "ES2022", + "DOM", + "DOM.Iterable" + ], + "module": "ESNext", + "moduleResolution": "Bundler", + "esModuleInterop": true, + "strict": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noUncheckedIndexedAccess": true, + "verbatimModuleSyntax": false, + "jsx": "react-jsx", + "noEmit": true, + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": [ + "./*" + ], + "@infiplot/engine": [ + "./lib/engine/index.ts" + ], + "@infiplot/ai-client": [ + "./lib/ai-client/index.ts" + ], + "@infiplot/tts-client": [ + "./lib/tts-client/index.ts" + ], + "@infiplot/types": [ + "./lib/types/index.ts" + ] + }, + "allowJs": true + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] +} diff --git a/apps/web/vercel.json b/vercel.json similarity index 100% rename from apps/web/vercel.json rename to vercel.json diff --git a/apps/web/wrangler.jsonc b/wrangler.jsonc similarity index 86% rename from apps/web/wrangler.jsonc rename to wrangler.jsonc index 37cfd8e..570be18 100644 --- a/apps/web/wrangler.jsonc +++ b/wrangler.jsonc @@ -11,7 +11,7 @@ "observability": { "enabled": true }, - // 60s mirrors apps/web/vercel.json maxDuration for the scene pipeline tail + // 60s mirrors vercel.json maxDuration for the scene pipeline tail // (multi-agent LLM, ~30-45s p95). Requires Workers Paid — Free is capped // at 10ms CPU. I/O wait does not count against this budget. "limits": { From 639201cd3841811891899b2f15416ca5af1d7c5a Mon Sep 17 00:00:00 2001 From: Zonghao Yuan <64521992+zonghaoyuan@users.noreply.github.com> Date: Wed, 3 Jun 2026 01:08:08 +0800 Subject: [PATCH 3/4] docs: replace How it works mermaid with localized SVG diagrams (#14) The auto-laid-out Mermaid flowchart looked rough. Replace it with a hand-built Anthropic-style diagram: color-coded role cards, a dashed scene-generation group, and the speculative pre-generation loop. Each SVG bakes in a dark background so it renders consistently whether the viewer's GitHub theme is light or dark (theme is per-viewer, not per-repo). Ship one localized SVG per README (zh/en/ja) to preserve the existing per-language diagrams, and strip claude.ai artifact residue (onclick / var() / context-stroke). Co-authored-by: Claude Opus 4.7 --- README.en.md | 17 ++------- README.ja.md | 17 ++------- README.md | 17 ++------- docs/pipeline.en.svg | 82 ++++++++++++++++++++++++++++++++++++++++ docs/pipeline.ja.svg | 89 ++++++++++++++++++++++++++++++++++++++++++++ docs/pipeline.zh.svg | 89 ++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 269 insertions(+), 42 deletions(-) create mode 100644 docs/pipeline.en.svg create mode 100644 docs/pipeline.ja.svg create mode 100644 docs/pipeline.zh.svg diff --git a/README.en.md b/README.en.md index 9f0d091..519065a 100644 --- a/README.en.md +++ b/README.en.md @@ -77,20 +77,9 @@ We call each complete playthrough a **story**. A story unfolds as a sequence of scenes. Each scene is one AI-painted background plus a short tree of beats — moments of narration, dialogue, and the occasional choice. You tap through a scene's beats and the image stays put; only when a choice leads somewhere genuinely new — another place, a new point of view, a jump in time — does the AI paint the next scene. -```mermaid -flowchart TD - U["Your input: world setting + art style"] --> A["Architect
parses input → full story structure (first step)"] - A --> W["Writer
directs this scene's beats: narration · dialogue · choices"] - subgraph SCENE["Generating one scene"] - direction TB - W --> C["Character Designer
portrait + voice (parallel, per new character)"] - W --> S["Cinematographer
shot composition + background prompt"] - C --> P["Painter
renders the 16:9 background using portraits as reference"] - S --> P - end - P --> SC["One scene: background image + beat tree"] - SC -. speculatively pre-generate the next scene .-> W -``` +
+ InfiPlot story generation pipeline +
While you're reading one scene, the engine speculatively generates the scenes your choices could lead to — and, for unavoidable next steps, the scene after that. By the time you pick a direction, its image is usually already painted, so the cut feels instant. If you still notice some lag today, don't worry — we're working hard to bring it down. diff --git a/README.ja.md b/README.ja.md index fdc7a31..c20ce2e 100644 --- a/README.ja.md +++ b/README.ja.md @@ -77,20 +77,9 @@ InfiPlot は Vercel と Cloudflare Workers の両方にデプロイできます 物語は一連のシーン(scene)として展開します。各シーンは、AI が描いた 1 枚の背景画と、短いビート(beat)のツリー —— ナレーション、セリフ、ときおりの選択肢 —— で構成されます。シーン内のビートをタップしていく間、画像はそのまま動きません。選択肢が本当に新しい場所 —— 別の空間、新しい視点、時間の跳躍 —— へ導いたときだけ、AI は次のシーンを描きます。 -```mermaid -flowchart TD - U["あなたの入力:世界設定 + 画風"] --> A["アーキテクト / Architect
入力を解析 → 物語の全体構造(第一歩)"] - A --> W["脚本家 / Writer
このシーンのビートを生成:ナレーション · セリフ · 選択肢"] - subgraph SCENE["1 シーンの生成"] - direction TB - W --> C["キャラクターデザイナー / Character Designer
立ち絵 + 声(新キャラごとに並行)"] - W --> S["撮影監督 / Cinematographer
カメラ構成 + 背景プロンプト"] - C --> P["絵師 / Painter
立ち絵を参照に 16:9 背景を描画"] - S --> P - end - P --> SC["1 シーン:背景画 + ビートツリー"] - SC -. 次のシーンを先回り生成 .-> W -``` +
+ InfiPlot 物語生成パイプライン +
あなたがひとつのシーンを読んでいる間に、エンジンは選択肢が導きうるシーンを先回りして生成します —— 避けられない次の一歩については、そのさらに先のシーンまで。あなたが方向を選ぶ頃には、その画像はたいてい描き上がっているので、切り替えは一瞬に感じられます。いまはまだ多少の遅延を感じるかもしれませんが、ご安心ください —— 私たちは鋭意改善に取り組んでいます。 diff --git a/README.md b/README.md index bb8abec..989fe9d 100644 --- a/README.md +++ b/README.md @@ -77,20 +77,9 @@ InfiPlot 同时支持部署到 Vercel 与 Cloudflare Workers。Cloudflare 部署 故事以一连串场景(scene)的形式展开。每个场景由一张 AI 绘制的背景图,加上一棵简短的节拍(beat)树组成 —— 也就是旁白、对话和偶尔出现的选项。你逐拍点过一个场景时,画面始终不变;只有当某个选项把你带到真正全新的地方 —— 换了空间、换了视角、跳跃了时间 —— AI 才会绘制下一幕场景。 -```mermaid -flowchart TD - U["你的输入:世界设定 + 画风"] --> A["架构师 / Architect
解析输入 → 完整剧情结构(第一步)"] - A --> W["编剧 / Writer
生成本幕节拍:旁白 · 对话 · 选项"] - subgraph SCENE["每一幕场景的生成"] - direction TB - W --> C["角色设计师 / Character Designer
立绘 + 音色(每个新角色并行)"] - W --> S["场景布置师 / Cinematographer
镜头编排 + 背景提示词"] - C --> P["画家 / Painter
以立绘为参考渲染 16:9 背景"] - S --> P - end - P --> SC["一幕场景:背景图 + 节拍树"] - SC -. 预测式预生成下一幕 .-> W -``` +
+ InfiPlot 生成流水线流程图 +
当你正在阅读一幕场景时,引擎会预测式地生成你的选项可能通向的那些场景 —— 对于无法回避的下一步,还会再往前生成一幕。等你真正选定方向时,那一幕的图通常已经画好了,于是切换瞬间完成、毫无停顿。如果你现在仍然感到有些延迟,别担心,我们正在努力优化它。 diff --git a/docs/pipeline.en.svg b/docs/pipeline.en.svg new file mode 100644 index 0000000..05baa10 --- /dev/null +++ b/docs/pipeline.en.svg @@ -0,0 +1,82 @@ + +AI interactive story generation pipeline +From your input to the Architect and Writer, then per-scene parallel Character Designer and Cinematographer feeding the Painter, producing one scene and speculatively pre-generating back to the Writer. + + + + + + + + + + + + + + + Your input + world setting + art style + + + + + + + Architect + parses input → full story structure + + + + + + + Writer + narration · dialogue · choices + + + + +Generating one scene + + + + + + + + Character Designer + portrait + voice (parallel) + + + + + + Cinematographer + shot composition + background prompt + + + + + + + + + Painter + renders 16:9 background from portraits + + + + + + + One scene + background image + beat tree + + + +pre-generate next scene + + diff --git a/docs/pipeline.ja.svg b/docs/pipeline.ja.svg new file mode 100644 index 0000000..c17c9fb --- /dev/null +++ b/docs/pipeline.ja.svg @@ -0,0 +1,89 @@ + +AI インタラクティブ物語生成パイプライン +あなたの入力からアーキテクト・脚本家へ、各シーンで並行するキャラクターデザイナーと撮影監督が絵師に渡り、1 シーンを生成し、脚本家へ先回り生成で戻ります。 + + + + + + + + + + + + + + + あなたの入力 + Your input + 世界設定 + 画風 + + + + + + + アーキテクト + Architect + 入力を解析 → 物語の全体構造 + + + + + + + 脚本家 + Writer + ナレーション · セリフ · 選択肢 + + + + +1 シーンの生成 + + + + + + + + キャラクターデザイナー + Character Designer + 立ち絵 + 声 · 並行 + + + + + + 撮影監督 + Cinematographer + カメラ構成 + 背景プロンプト + + + + + + + + + 絵師 + Painter + 立ち絵を参照に 16:9 背景 + + + + + + + 1 シーン + Scene output + 背景画 + ビートツリー + + + +次のシーンを先回り生成 + + diff --git a/docs/pipeline.zh.svg b/docs/pipeline.zh.svg new file mode 100644 index 0000000..1a2f4e7 --- /dev/null +++ b/docs/pipeline.zh.svg @@ -0,0 +1,89 @@ + +AI 互动剧情生成流水线流程图 +从用户输入到架构师、编剧,再到每一幕场景内并行的角色设计师与场景布置师,汇入画家渲染,产出一幕场景,并预测式预生成回到编剧。 + + + + + + + + + + + + + + + 你的输入 + Your input + 世界设定 + 画风 + + + + + + + 架构师 + Architect + 解析输入 → 完整剧情结构 + + + + + + + 编剧 + Writer + 节拍:旁白 · 对话 · 选项 + + + + +每一幕场景的生成 + + + + + + + + 角色设计师 + Character Designer + 立绘 + 音色 · 并行 + + + + + + 场景布置师 + Cinematographer + 镜头编排 + 背景提示词 + + + + + + + + + 画家 + Painter + 以立绘为参考渲染 16:9 背景 + + + + + + + 一幕场景 + Scene output + 背景图 + 节拍树 + + + +预测式预生成下一幕 + + From 6ddbe7d377a2f64b97edacfa71f1020b871850d7 Mon Sep 17 00:00:00 2001 From: Zonghao Yuan <64521992+zonghaoyuan@users.noreply.github.com> Date: Wed, 3 Jun 2026 01:14:55 +0800 Subject: [PATCH 4/4] feat: add privacy-friendly Umami page-view analytics (#15) Cookieless, env-gated page-view tracking via Umami. The component injects the script only when NEXT_PUBLIC_UMAMI_SRC and NEXT_PUBLIC_UMAMI_WEBSITE_ID are both set, so local dev and forks send nothing to our instance. Adds .env.example docs (section 6) and a homepage footer privacy disclosure. No Cookie consent banner needed. --- .env.example | 12 ++++++++++++ app/layout.tsx | 2 ++ app/page.tsx | 2 ++ components/Analytics.tsx | 18 ++++++++++++++++++ 4 files changed, 34 insertions(+) create mode 100644 components/Analytics.tsx diff --git a/.env.example b/.env.example index 5aca3df..aac003d 100644 --- a/.env.example +++ b/.env.example @@ -55,3 +55,15 @@ TTS_SPEECH_MODEL=mimo-v2.5-tts # true → return a placeholder image instead of calling the image model. # Text/story/voice still run normally. Great for iterating on TTS. MOCK_IMAGE=false + +# ---- 6. Analytics · Umami (optional — leave blank to disable) ------ +# Privacy-friendly, cookieless page-view stats — no Cookie consent banner. +# Cloud: sign up at https://cloud.umami.is, add your site, copy its ID into +# NEXT_PUBLIC_UMAMI_WEBSITE_ID and use the cloud script URL: +# NEXT_PUBLIC_UMAMI_SRC=https://cloud.umami.is/script.js +# Self-host later: point SRC at your own instance — the integration is identical +# (no code change), e.g. NEXT_PUBLIC_UMAMI_SRC=https://stats.example.com/script.js +# Both blank → no script is injected (zero tracking). NEXT_PUBLIC_ vars are +# inlined at BUILD time, so set them in the build env (Vercel project settings). +NEXT_PUBLIC_UMAMI_SRC= +NEXT_PUBLIC_UMAMI_WEBSITE_ID= diff --git a/app/layout.tsx b/app/layout.tsx index bf87079..ec8a719 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,5 +1,6 @@ import type { Metadata } from "next"; import { Cormorant_Garamond, Inter } from "next/font/google"; +import { Analytics } from "@/components/Analytics"; import "./globals.css"; // Editorial fonts: drive tailwind `font-serif`/`font-sans` via @@ -44,6 +45,7 @@ export default function RootLayout({ {children} + ); diff --git a/app/page.tsx b/app/page.tsx index 2b2a59d..d859020 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -744,6 +744,8 @@ export default function HomePage() { 目前,内测期间生成的内容不会被保存,如有需要,请通过录屏或截图等方式保存游玩体验,并记录下生成故事时的提示词与风格选项等。
AI 生成的内容不代表本团队立场。 +
+ 本站使用开源的 Umami 进行隐私友好的匿名访问统计:不使用 Cookie、不收集个人信息、不做跨站追踪。

diff --git a/components/Analytics.tsx b/components/Analytics.tsx new file mode 100644 index 0000000..375e3cc --- /dev/null +++ b/components/Analytics.tsx @@ -0,0 +1,18 @@ +import Script from "next/script"; + +// Privacy-friendly, cookieless page-view analytics (Umami). Both env vars +// unset → render nothing, so local dev and forks never report to our instance. +export function Analytics() { + const src = process.env.NEXT_PUBLIC_UMAMI_SRC; + const websiteId = process.env.NEXT_PUBLIC_UMAMI_WEBSITE_ID; + if (!src || !websiteId) return null; + + return ( +