chore: complete @yume → @infiplot rename (post-PR#9)

PR #9 已完成首页和 layout 的视觉品牌迁移,此 commit 补齐剩余的
技术性改名 —— workspace 包名、source import、localStorage 键、
CSS keyframe、内部 header logo、.env.example、README。

- @yume/* → @infiplot/* (6 package.json + 17 imports + lockfile)
- localStorage/sessionStorage: yume:* → infiplot:*
  (含 PR #9 新增的 yume:hintClosed)
- CSS keyframe yume-ripple → infiplot-ripple
- new/play 页面 header logo "云梦" → "InfiPlot"
- 代码注释中的「云梦」style 形容词删除(layout.tsx, page.tsx)
- 根 package.json name + description(描述跟齐 staging
  "AI 实时交互剧情游戏")
- README: tagline / Vercel deploy URL / 目录树 / engine 描述

保留:prompts.ts 的 LLM 体裁术语「视觉小说/galgame」、CustomForm
placeholder 的「视觉小说画风」(图像模型识别的风格名词)。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
yuanzonghao
2026-06-02 09:27:00 +08:00
parent 5d0a5bb756
commit 8eda27f241
37 changed files with 103 additions and 103 deletions
+5 -5
View File
@@ -1,6 +1,6 @@
# 云梦 # InfiPlot
> An AI-driven visual novel painted by an AI, one scene at a time. You talk and explore within a scene; when the story turns a corner, it paints the next. You click. It paints. The story unfolds. > A real-time AI-generated interactive story game — painted scene by scene. You talk and explore within a scene; when the story turns a corner, it paints the next. You click. It paints. The story unfolds.
--- ---
@@ -37,7 +37,7 @@ There is no traditional game UI baked into the art. The AI paints the world in w
## One-click deploy ## One-click deploy
[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/zonghaoyuan/yume&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%2Ftts.&envLink=https://github.com/zonghaoyuan/yume%23environment-variables) [![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%2Ftts.&envLink=https://github.com/zonghaoyuan/infiplot%23environment-variables)
After deploy, set the environment variables (see below) in your Vercel project. Nine are required; TTS is optional (leave blank to run silently); `MOCK_IMAGE=true` skips image generation for cheap TTS-only testing. The Vercel project's **Root Directory** must be set to `apps/web` (the deploy button passes this; if you configure manually, set it in Project Settings). After deploy, set the environment variables (see below) in your Vercel project. Nine are required; TTS is optional (leave blank to run silently); `MOCK_IMAGE=true` skips image generation for cheap TTS-only testing. The Vercel project's **Root Directory** must be set to `apps/web` (the deploy button passes this; if you configure manually, set it in Project Settings).
@@ -81,7 +81,7 @@ pnpm dev
## Project layout ## Project layout
``` ```
yume/ infiplot/
├── apps/web/ Next.js 16 app — pages + API routes (Vercel root) ├── apps/web/ Next.js 16 app — pages + API routes (Vercel root)
└── packages/ └── packages/
├── types/ shared TypeScript types ├── types/ shared TypeScript types
@@ -90,7 +90,7 @@ yume/
└── engine/ multi-agent AI orchestration (open core) └── engine/ multi-agent AI orchestration (open core)
``` ```
`packages/engine` is the open core — pure TS, no Next.js or browser dependency. Import it directly to build your own visual-novel front-end (Tauri, Electron, CLI, anywhere). `packages/engine` is the open core — pure TS, no Next.js or browser dependency. Import it directly to build your own interactive-narrative front-end (Tauri, Electron, CLI, anywhere).
--- ---
+1 -1
View File
@@ -1,5 +1,5 @@
# ============================================================= # =============================================================
# 云梦 — AI 视觉小说 # InfiPlot — AI 实时交互剧情游戏
# Recommended setup: Xiaomi MiMo Token Plan for TEXT / VISION / TTS # Recommended setup: Xiaomi MiMo Token Plan for TEXT / VISION / TTS
# (one API key covers all three) + Runware for IMAGE (FLUX.2 [klein]). # (one API key covers all three) + Runware for IMAGE (FLUX.2 [klein]).
# #
+2 -2
View File
@@ -1,5 +1,5 @@
import { requestBeatAudio } from "@yume/engine"; import { requestBeatAudio } from "@infiplot/engine";
import type { BeatAudioRequest } from "@yume/types"; import type { BeatAudioRequest } from "@infiplot/types";
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
import { loadEngineConfig } from "@/lib/config"; import { loadEngineConfig } from "@/lib/config";
+2 -2
View File
@@ -1,5 +1,5 @@
import { requestInsertBeat } from "@yume/engine"; import { requestInsertBeat } from "@infiplot/engine";
import type { InsertBeatRequest } from "@yume/types"; import type { InsertBeatRequest } from "@infiplot/types";
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
import { loadEngineConfig } from "@/lib/config"; import { loadEngineConfig } from "@/lib/config";
+2 -2
View File
@@ -1,5 +1,5 @@
import { requestScene } from "@yume/engine"; import { requestScene } from "@infiplot/engine";
import type { SceneRequest } from "@yume/types"; import type { SceneRequest } from "@infiplot/types";
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
import { loadEngineConfig } from "@/lib/config"; import { loadEngineConfig } from "@/lib/config";
+2 -2
View File
@@ -1,5 +1,5 @@
import { startSession } from "@yume/engine"; import { startSession } from "@infiplot/engine";
import type { StartRequest } from "@yume/types"; import type { StartRequest } from "@infiplot/types";
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
import { loadEngineConfig } from "@/lib/config"; import { loadEngineConfig } from "@/lib/config";
+2 -2
View File
@@ -1,5 +1,5 @@
import { visionDecide } from "@yume/engine"; import { visionDecide } from "@infiplot/engine";
import type { VisionRequest } from "@yume/types"; import type { VisionRequest } from "@infiplot/types";
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
import { loadEngineConfig } from "@/lib/config"; import { loadEngineConfig } from "@/lib/config";
+1 -1
View File
@@ -54,7 +54,7 @@
} }
} }
@keyframes yume-ripple { @keyframes infiplot-ripple {
0% { 0% {
width: 14px; width: 14px;
height: 14px; height: 14px;
+1 -1
View File
@@ -2,7 +2,7 @@ import type { Metadata } from "next";
import { Cormorant_Garamond, Inter } from "next/font/google"; import { Cormorant_Garamond, Inter } from "next/font/google";
import "./globals.css"; import "./globals.css";
// Editorial 云梦 fonts: drive tailwind `font-serif`/`font-sans` via // Editorial fonts: drive tailwind `font-serif`/`font-sans` via
// --font-serif / --font-sans across every page (home, /play, /new, CustomForm). // --font-serif / --font-sans across every page (home, /play, /new, CustomForm).
const cormorant = Cormorant_Garamond({ const cormorant = Cormorant_Garamond({
subsets: ["latin"], subsets: ["latin"],
+1 -1
View File
@@ -10,7 +10,7 @@ export default function NewPage() {
className="text-[10px] smallcaps text-clay-700 hover:text-clay-900 transition-colors flex items-center gap-2" className="text-[10px] smallcaps text-clay-700 hover:text-clay-900 transition-colors flex items-center gap-2"
> >
<i className="fa-solid fa-arrow-left text-[9px]" /> <i className="fa-solid fa-arrow-left text-[9px]" />
InfiPlot
</Link> </Link>
<span className="text-[10px] smallcaps text-clay-500"> <span className="text-[10px] smallcaps text-clay-500">
+6 -6
View File
@@ -4,7 +4,7 @@ import { useRouter } from "next/navigation";
import { useEffect, useRef, useState } from "react"; import { useEffect, useRef, useState } from "react";
/* ============================================================================ /* ============================================================================
InfiPlot · 首页(云梦编辑式视觉风格 · 居中构图,呼应低保真原型) InfiPlot · 首页(编辑式视觉风格 · 居中构图,呼应低保真原型)
- 顶部 Header:左上角衬线 wordmark logo - 顶部 Header:左上角衬线 wordmark logo
- Hero 控制区(居中):标题 / prompt 输入框 + 开始 / 5 个类别选择器 - Hero 控制区(居中):标题 / prompt 输入框 + 开始 / 5 个类别选择器
- 统一瀑布流(居中定宽):7 张主推 + 16 张画廊,按性向整体 crossfade 切换 - 统一瀑布流(居中定宽):7 张主推 + 16 张画廊,按性向整体 crossfade 切换
@@ -399,7 +399,7 @@ export default function HomePage() {
const [prompt, setPrompt] = useState(""); const [prompt, setPrompt] = useState("");
const inputRef = useRef<HTMLTextAreaElement>(null); const inputRef = useRef<HTMLTextAreaElement>(null);
// 顶部使用提示:默认展示,用户可点 × 永久关闭(localStorage:yume:hintClosed)。 // 顶部使用提示:默认展示,用户可点 × 永久关闭(localStorage:infiplot:hintClosed)。
const [hintClosed, setHintClosed] = useState(false); const [hintClosed, setHintClosed] = useState(false);
const styleRow = OPTS.findIndex((o) => o.modal); const styleRow = OPTS.findIndex((o) => o.modal);
@@ -432,7 +432,7 @@ export default function HomePage() {
useEffect(() => { useEffect(() => {
try { try {
if (localStorage.getItem("yume:hintClosed") === "1") setHintClosed(true); if (localStorage.getItem("infiplot:hintClosed") === "1") setHintClosed(true);
} catch { } catch {
/* ignore */ /* ignore */
} }
@@ -449,7 +449,7 @@ export default function HomePage() {
const closeHint = () => { const closeHint = () => {
setHintClosed(true); setHintClosed(true);
try { try {
localStorage.setItem("yume:hintClosed", "1"); localStorage.setItem("infiplot:hintClosed", "1");
} catch { } catch {
/* ignore */ /* ignore */
} }
@@ -496,7 +496,7 @@ export default function HomePage() {
const audioEnabled = voice === "开启"; const audioEnabled = voice === "开启";
sessionStorage.setItem( sessionStorage.setItem(
"yume:custom", "infiplot:custom",
JSON.stringify({ worldSetting, styleGuide, audioEnabled }), JSON.stringify({ worldSetting, styleGuide, audioEnabled }),
); );
router.push("/play?custom=1"); router.push("/play?custom=1");
@@ -610,7 +610,7 @@ export default function HomePage() {
))} ))}
</div> </div>
{/* 使用提示:可被用户永久关闭(localStorage:yume:hintClosed */} {/* 使用提示:可被用户永久关闭(localStorage:infiplot:hintClosed */}
{!hintClosed && ( {!hintClosed && (
<div className="relative mx-auto mt-10 md:mt-12 max-w-[640px] rounded-sm border border-clay-900/10 bg-cream-100/50 px-8 py-3.5"> <div className="relative mx-auto mt-10 md:mt-12 max-w-[640px] rounded-sm border border-clay-900/10 bg-cream-100/50 px-8 py-3.5">
<p className="font-serif text-[13px] md:text-sm leading-relaxed text-clay-500"> <p className="font-serif text-[13px] md:text-sm leading-relaxed text-clay-500">
+4 -4
View File
@@ -24,9 +24,9 @@ import type {
Session, Session,
StartResponse, StartResponse,
VisionResponse, VisionResponse,
} from "@yume/types"; } from "@infiplot/types";
const MUTED_STORAGE_KEY = "yume:muted"; const MUTED_STORAGE_KEY = "infiplot:muted";
// Cap how long we wait for the browser to download + decode a scene image // Cap how long we wait for the browser to download + decode a scene image
// before giving up and rendering anyway. Runware's CDN is normally <2s for a // before giving up and rendering anyway. Runware's CDN is normally <2s for a
@@ -485,7 +485,7 @@ function PlayInner() {
const p = PRESETS.find((x) => x.id === presetId); const p = PRESETS.find((x) => x.id === presetId);
if (p) payload = { worldSetting: p.worldSetting, styleGuide: p.styleGuide }; if (p) payload = { worldSetting: p.worldSetting, styleGuide: p.styleGuide };
} else if (params.get("custom") === "1") { } else if (params.get("custom") === "1") {
const stored = sessionStorage.getItem("yume:custom"); const stored = sessionStorage.getItem("infiplot:custom");
if (stored) { if (stored) {
try { try {
const parsed = JSON.parse(stored) as { const parsed = JSON.parse(stored) as {
@@ -890,7 +890,7 @@ function PlayInner() {
className="text-[10px] smallcaps text-clay-600 hover:text-clay-900 transition-colors flex items-center gap-2" className="text-[10px] smallcaps text-clay-600 hover:text-clay-900 transition-colors flex items-center gap-2"
> >
<i className="fa-solid fa-arrow-left text-[9px]" /> <i className="fa-solid fa-arrow-left text-[9px]" />
InfiPlot
</Link> </Link>
<div className="flex items-center gap-3 text-[10px] smallcaps text-clay-500 num"> <div className="flex items-center gap-3 text-[10px] smallcaps text-clay-500 num">
<span> · {String(sceneCount).padStart(3, "0")} · </span> <span> · {String(sceneCount).padStart(3, "0")} · </span>
+1 -1
View File
@@ -19,7 +19,7 @@ export function CustomForm() {
if (!canSubmit) return; if (!canSubmit) return;
setSubmitting(true); setSubmitting(true);
sessionStorage.setItem( sessionStorage.setItem(
"yume:custom", "infiplot:custom",
JSON.stringify({ worldSetting, styleGuide }), JSON.stringify({ worldSetting, styleGuide }),
); );
router.push("/play?custom=1"); router.push("/play?custom=1");
+2 -2
View File
@@ -1,7 +1,7 @@
"use client"; "use client";
import { useCallback, useEffect, useRef, useState } from "react"; import { useCallback, useEffect, useRef, useState } from "react";
import type { Beat, BeatChoice } from "@yume/types"; import type { Beat, BeatChoice } from "@infiplot/types";
export type Phase = export type Phase =
| "loading-first" // first scene not yet rendered | "loading-first" // first scene not yet rendered
@@ -439,7 +439,7 @@ export function PlayCanvas({
width: 30, width: 30,
height: 30, height: 30,
animation: animation:
"yume-ripple 1.6s cubic-bezier(0.16,1,0.3,1) infinite", "infiplot-ripple 1.6s cubic-bezier(0.16,1,0.3,1) infinite",
}} }}
/> />
<div <div
+1 -1
View File
@@ -1,4 +1,4 @@
import type { EngineConfig, TtsConfig } from "@yume/types"; import type { EngineConfig, TtsConfig } from "@infiplot/types";
function readVar(name: string): string { function readVar(name: string): string {
const v = process.env[name]; const v = process.env[name];
+4 -4
View File
@@ -5,10 +5,10 @@ const config: NextConfig = {
reactStrictMode: true, reactStrictMode: true,
typedRoutes: false, typedRoutes: false,
transpilePackages: [ transpilePackages: [
"@yume/engine", "@infiplot/engine",
"@yume/ai-client", "@infiplot/ai-client",
"@yume/types", "@infiplot/types",
"@yume/tts-client", "@infiplot/tts-client",
], ],
serverExternalPackages: ["sharp"], serverExternalPackages: ["sharp"],
turbopack: { turbopack: {
+4 -4
View File
@@ -1,5 +1,5 @@
{ {
"name": "@yume/web", "name": "@infiplot/web",
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"type": "module", "type": "module",
@@ -11,9 +11,9 @@
"typecheck": "tsc --noEmit" "typecheck": "tsc --noEmit"
}, },
"dependencies": { "dependencies": {
"@yume/ai-client": "workspace:*", "@infiplot/ai-client": "workspace:*",
"@yume/engine": "workspace:*", "@infiplot/engine": "workspace:*",
"@yume/types": "workspace:*", "@infiplot/types": "workspace:*",
"next": "^16.0.0", "next": "^16.0.0",
"react": "^19.0.0", "react": "^19.0.0",
"react-dom": "^19.0.0", "react-dom": "^19.0.0",
+5 -5
View File
@@ -1,17 +1,17 @@
{ {
"name": "yume", "name": "infiplot",
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"description": "AI 驱动的视觉小说(云梦)", "description": "AI 实时交互剧情游戏",
"license": "UNLICENSED", "license": "UNLICENSED",
"packageManager": "pnpm@9.12.0", "packageManager": "pnpm@9.12.0",
"engines": { "engines": {
"node": ">=20" "node": ">=20"
}, },
"scripts": { "scripts": {
"dev": "pnpm --filter @yume/web dev", "dev": "pnpm --filter @infiplot/web dev",
"build": "pnpm --filter @yume/web build", "build": "pnpm --filter @infiplot/web build",
"start": "pnpm --filter @yume/web start", "start": "pnpm --filter @infiplot/web start",
"lint": "pnpm -r lint", "lint": "pnpm -r lint",
"typecheck": "pnpm -r typecheck" "typecheck": "pnpm -r typecheck"
}, },
+2 -2
View File
@@ -1,5 +1,5 @@
{ {
"name": "@yume/ai-client", "name": "@infiplot/ai-client",
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"type": "module", "type": "module",
@@ -12,6 +12,6 @@
"typecheck": "tsc --noEmit" "typecheck": "tsc --noEmit"
}, },
"dependencies": { "dependencies": {
"@yume/types": "workspace:*" "@infiplot/types": "workspace:*"
} }
} }
+1 -1
View File
@@ -1,4 +1,4 @@
import type { ProviderConfig } from "@yume/types"; import type { ProviderConfig } from "@infiplot/types";
import { fetchWithRetry } from "./fetchWithRetry"; import { fetchWithRetry } from "./fetchWithRetry";
export type ChatMessage = { export type ChatMessage = {
+1 -1
View File
@@ -1,4 +1,4 @@
import type { ProviderConfig } from "@yume/types"; import type { ProviderConfig } from "@infiplot/types";
import { fetchWithRetry } from "./fetchWithRetry"; import { fetchWithRetry } from "./fetchWithRetry";
// Runware uses its own task-array protocol (not OpenAI-compatible). // Runware uses its own task-array protocol (not OpenAI-compatible).
+1 -1
View File
@@ -1,4 +1,4 @@
import type { ProviderConfig } from "@yume/types"; import type { ProviderConfig } from "@infiplot/types";
import { fetchWithRetry } from "./fetchWithRetry"; import { fetchWithRetry } from "./fetchWithRetry";
export async function interpretClick( export async function interpretClick(
+4 -4
View File
@@ -1,5 +1,5 @@
{ {
"name": "@yume/engine", "name": "@infiplot/engine",
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"type": "module", "type": "module",
@@ -12,9 +12,9 @@
"typecheck": "tsc --noEmit" "typecheck": "tsc --noEmit"
}, },
"dependencies": { "dependencies": {
"@yume/ai-client": "workspace:*", "@infiplot/ai-client": "workspace:*",
"@yume/tts-client": "workspace:*", "@infiplot/tts-client": "workspace:*",
"@yume/types": "workspace:*", "@infiplot/types": "workspace:*",
"jsonrepair": "^3.14.0", "jsonrepair": "^3.14.0",
"sharp": "^0.33.5" "sharp": "^0.33.5"
} }
@@ -1,11 +1,11 @@
import { chat, generateImage } from "@yume/ai-client"; import { chat, generateImage } from "@infiplot/ai-client";
import { provisionVoice } from "@yume/tts-client"; import { provisionVoice } from "@infiplot/tts-client";
import type { import type {
Character, Character,
CharacterVoice, CharacterVoice,
EngineConfig, EngineConfig,
Session, Session,
} from "@yume/types"; } from "@infiplot/types";
import { parseJsonLoose } from "../jsonParser"; import { parseJsonLoose } from "../jsonParser";
import { mockImageDataUri } from "../mockImage"; import { mockImageDataUri } from "../mockImage";
import { import {
@@ -1,5 +1,5 @@
import { chat } from "@yume/ai-client"; import { chat } from "@infiplot/ai-client";
import type { BeatActiveCharacter, ProviderConfig } from "@yume/types"; import type { BeatActiveCharacter, ProviderConfig } from "@infiplot/types";
import { parseJsonLoose } from "../jsonParser"; import { parseJsonLoose } from "../jsonParser";
import { import {
CINEMATOGRAPHER_SYSTEM, CINEMATOGRAPHER_SYSTEM,
+3 -3
View File
@@ -1,11 +1,11 @@
import { generateImage } from "@yume/ai-client"; import { generateImage } from "@infiplot/ai-client";
import type { GenerateImageOptions, GenerateImageResult } from "@yume/ai-client"; import type { GenerateImageOptions, GenerateImageResult } from "@infiplot/ai-client";
import type { import type {
Beat, Beat,
Character, Character,
EngineConfig, EngineConfig,
ProviderConfig, ProviderConfig,
} from "@yume/types"; } from "@infiplot/types";
import { mockImageDataUri } from "../mockImage"; import { mockImageDataUri } from "../mockImage";
import { buildPainterPrompt } from "../prompts"; import { buildPainterPrompt } from "../prompts";
+2 -2
View File
@@ -1,4 +1,4 @@
import { chat } from "@yume/ai-client"; import { chat } from "@infiplot/ai-client";
import type { import type {
Beat, Beat,
BeatActiveCharacter, BeatActiveCharacter,
@@ -7,7 +7,7 @@ import type {
BeatNext, BeatNext,
ProviderConfig, ProviderConfig,
Session, Session,
} from "@yume/types"; } from "@infiplot/types";
import { parseJsonLoose } from "../jsonParser"; import { parseJsonLoose } from "../jsonParser";
import { WRITER_SYSTEM, buildWriterUserMessage } from "../prompts"; import { WRITER_SYSTEM, buildWriterUserMessage } from "../prompts";
+2 -2
View File
@@ -1,4 +1,4 @@
import { chat } from "@yume/ai-client"; import { chat } from "@infiplot/ai-client";
import type { import type {
Character, Character,
EngineConfig, EngineConfig,
@@ -6,7 +6,7 @@ import type {
ProviderConfig, ProviderConfig,
Scene, Scene,
Session, Session,
} from "@yume/types"; } from "@infiplot/types";
import { designCharacter, provisionVoiceForName } from "./agents/characterDesigner"; import { designCharacter, provisionVoiceForName } from "./agents/characterDesigner";
import { runCinematographer } from "./agents/cinematographer"; import { runCinematographer } from "./agents/cinematographer";
import { runPainter } from "./agents/painter"; import { runPainter } from "./agents/painter";
+1 -1
View File
@@ -11,5 +11,5 @@ export { mergeCharacters } from "./director";
export type { SceneResult } from "./director"; export type { SceneResult } from "./director";
export type { WriterOutput } from "./agents/writer"; export type { WriterOutput } from "./agents/writer";
export type { CinematographerOutput } from "./agents/cinematographer"; export type { CinematographerOutput } from "./agents/cinematographer";
export type { InsertBeatPartial } from "@yume/types"; export type { InsertBeatPartial } from "@infiplot/types";
export * from "./prompts"; export * from "./prompts";
+1 -1
View File
@@ -11,7 +11,7 @@ import type {
StartResponse, StartResponse,
VisionRequest, VisionRequest,
VisionResponse, VisionResponse,
} from "@yume/types"; } from "@infiplot/types";
import { annotateClick } from "./annotate"; import { annotateClick } from "./annotate";
import { directInsertBeat, directScene } from "./director"; import { directInsertBeat, directScene } from "./director";
import { synthesizeBeat } from "./voice"; import { synthesizeBeat } from "./voice";
+1 -1
View File
@@ -3,7 +3,7 @@ import type {
Character, Character,
Scene, Scene,
Session, Session,
} from "@yume/types"; } from "@infiplot/types";
// ══════════════════════════════════════════════════════════════════════ // ══════════════════════════════════════════════════════════════════════
// Multi-agent scene generation pipeline: // Multi-agent scene generation pipeline:
+2 -2
View File
@@ -1,10 +1,10 @@
import { interpretClick } from "@yume/ai-client"; import { interpretClick } from "@infiplot/ai-client";
import type { import type {
ClickIntent, ClickIntent,
ProviderConfig, ProviderConfig,
Scene, Scene,
VisionClassify, VisionClassify,
} from "@yume/types"; } from "@infiplot/types";
import { parseJsonLoose } from "./jsonParser"; import { parseJsonLoose } from "./jsonParser";
import { VISION_SYSTEM_PROMPT, buildVisionUserPrompt } from "./prompts"; import { VISION_SYSTEM_PROMPT, buildVisionUserPrompt } from "./prompts";
+2 -2
View File
@@ -1,5 +1,5 @@
import { synthesize } from "@yume/tts-client"; import { synthesize } from "@infiplot/tts-client";
import type { BeatAudio, CharacterVoice, TtsConfig } from "@yume/types"; import type { BeatAudio, CharacterVoice, TtsConfig } from "@infiplot/types";
// Per-beat synth budget. MiMo's median synth is 37s; the tail can spike // Per-beat synth budget. MiMo's median synth is 37s; the tail can spike
// to 3070s under concurrent load. Capping here means a single bad beat // to 3070s under concurrent load. Capping here means a single bad beat
+2 -2
View File
@@ -1,5 +1,5 @@
{ {
"name": "@yume/tts-client", "name": "@infiplot/tts-client",
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"type": "module", "type": "module",
@@ -12,6 +12,6 @@
"typecheck": "tsc --noEmit" "typecheck": "tsc --noEmit"
}, },
"dependencies": { "dependencies": {
"@yume/types": "workspace:*" "@infiplot/types": "workspace:*"
} }
} }
+1 -1
View File
@@ -1,4 +1,4 @@
import type { CharacterVoice, TtsConfig } from "@yume/types"; import type { CharacterVoice, TtsConfig } from "@infiplot/types";
// Xiaomi MiMo currently outputs wav / pcm16 only (mp3 not supported for output). // Xiaomi MiMo currently outputs wav / pcm16 only (mp3 not supported for output).
// The reference clip we persist is therefore wav. Kept as a single switch so we // The reference clip we persist is therefore wav. Kept as a single switch so we
+1 -1
View File
@@ -1,5 +1,5 @@
{ {
"name": "@yume/types", "name": "@infiplot/types",
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"type": "module", "type": "module",
+25 -25
View File
@@ -14,13 +14,13 @@ importers:
apps/web: apps/web:
dependencies: dependencies:
'@yume/ai-client': '@infiplot/ai-client':
specifier: workspace:* specifier: workspace:*
version: link:../../packages/ai-client version: link:../../packages/ai-client
'@yume/engine': '@infiplot/engine':
specifier: workspace:* specifier: workspace:*
version: link:../../packages/engine version: link:../../packages/engine
'@yume/types': '@infiplot/types':
specifier: workspace:* specifier: workspace:*
version: link:../../packages/types version: link:../../packages/types
next: next:
@@ -60,19 +60,19 @@ importers:
packages/ai-client: packages/ai-client:
dependencies: dependencies:
'@yume/types': '@infiplot/types':
specifier: workspace:* specifier: workspace:*
version: link:../types version: link:../types
packages/engine: packages/engine:
dependencies: dependencies:
'@yume/ai-client': '@infiplot/ai-client':
specifier: workspace:* specifier: workspace:*
version: link:../ai-client version: link:../ai-client
'@yume/tts-client': '@infiplot/tts-client':
specifier: workspace:* specifier: workspace:*
version: link:../tts-client version: link:../tts-client
'@yume/types': '@infiplot/types':
specifier: workspace:* specifier: workspace:*
version: link:../types version: link:../types
jsonrepair: jsonrepair:
@@ -84,7 +84,7 @@ importers:
packages/tts-client: packages/tts-client:
dependencies: dependencies:
'@yume/types': '@infiplot/types':
specifier: workspace:* specifier: workspace:*
version: link:../types version: link:../types
@@ -448,8 +448,8 @@ packages:
peerDependencies: peerDependencies:
postcss: ^8.1.0 postcss: ^8.1.0
baseline-browser-mapping@2.10.32: baseline-browser-mapping@2.10.33:
resolution: {integrity: sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg==} resolution: {integrity: sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw==}
engines: {node: '>=6.0.0'} engines: {node: '>=6.0.0'}
hasBin: true hasBin: true
@@ -516,8 +516,8 @@ packages:
dlv@1.1.3: dlv@1.1.3:
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
electron-to-chromium@1.5.361: electron-to-chromium@1.5.364:
resolution: {integrity: sha512-Q6Hts7N9FnJc5LeGRINFvLhCI9xZmNtTDe5ZbcVezQz7cU4a8Aua3GH1b8J2XY8Al9PF+OCwYqhgsOOheMdvkA==} resolution: {integrity: sha512-G/dYE3+AYhyHwzTwg8UbnXf7zqMERYh7l2jJ3QujhFsH8agSYwtnGAR2aZ7f0AakIKJXd5En/Hre4igIUrdlYw==}
es-errors@1.3.0: es-errors@1.3.0:
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
@@ -566,8 +566,8 @@ packages:
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
engines: {node: '>=10.13.0'} engines: {node: '>=10.13.0'}
hasown@2.0.3: hasown@2.0.4:
resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
is-arrayish@0.3.4: is-arrayish@0.3.4:
@@ -822,8 +822,8 @@ packages:
thenify@3.3.1: thenify@3.3.1:
resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
tinyglobby@0.2.16: tinyglobby@0.2.17:
resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==}
engines: {node: '>=12.0.0'} engines: {node: '>=12.0.0'}
to-regex-range@5.0.1: to-regex-range@5.0.1:
@@ -1120,7 +1120,7 @@ snapshots:
postcss: 8.5.15 postcss: 8.5.15
postcss-value-parser: 4.2.0 postcss-value-parser: 4.2.0
baseline-browser-mapping@2.10.32: {} baseline-browser-mapping@2.10.33: {}
binary-extensions@2.3.0: {} binary-extensions@2.3.0: {}
@@ -1130,9 +1130,9 @@ snapshots:
browserslist@4.28.2: browserslist@4.28.2:
dependencies: dependencies:
baseline-browser-mapping: 2.10.32 baseline-browser-mapping: 2.10.33
caniuse-lite: 1.0.30001793 caniuse-lite: 1.0.30001793
electron-to-chromium: 1.5.361 electron-to-chromium: 1.5.364
node-releases: 2.0.46 node-releases: 2.0.46
update-browserslist-db: 1.2.3(browserslist@4.28.2) update-browserslist-db: 1.2.3(browserslist@4.28.2)
@@ -1182,7 +1182,7 @@ snapshots:
dlv@1.1.3: {} dlv@1.1.3: {}
electron-to-chromium@1.5.361: {} electron-to-chromium@1.5.364: {}
es-errors@1.3.0: {} es-errors@1.3.0: {}
@@ -1223,7 +1223,7 @@ snapshots:
dependencies: dependencies:
is-glob: 4.0.3 is-glob: 4.0.3
hasown@2.0.3: hasown@2.0.4:
dependencies: dependencies:
function-bind: 1.1.2 function-bind: 1.1.2
@@ -1235,7 +1235,7 @@ snapshots:
is-core-module@2.16.2: is-core-module@2.16.2:
dependencies: dependencies:
hasown: 2.0.3 hasown: 2.0.4
is-extglob@2.1.1: {} is-extglob@2.1.1: {}
@@ -1272,7 +1272,7 @@ snapshots:
dependencies: dependencies:
'@next/env': 16.2.6 '@next/env': 16.2.6
'@swc/helpers': 0.5.15 '@swc/helpers': 0.5.15
baseline-browser-mapping: 2.10.32 baseline-browser-mapping: 2.10.33
caniuse-lite: 1.0.30001793 caniuse-lite: 1.0.30001793
postcss: 8.4.31 postcss: 8.4.31
react: 19.2.6 react: 19.2.6
@@ -1465,7 +1465,7 @@ snapshots:
lines-and-columns: 1.2.4 lines-and-columns: 1.2.4
mz: 2.7.0 mz: 2.7.0
pirates: 4.0.7 pirates: 4.0.7
tinyglobby: 0.2.16 tinyglobby: 0.2.17
ts-interface-checker: 0.1.13 ts-interface-checker: 0.1.13
supports-preserve-symlinks-flag@1.0.0: {} supports-preserve-symlinks-flag@1.0.0: {}
@@ -1506,7 +1506,7 @@ snapshots:
dependencies: dependencies:
any-promise: 1.3.0 any-promise: 1.3.0
tinyglobby@0.2.16: tinyglobby@0.2.17:
dependencies: dependencies:
fdir: 6.5.0(picomatch@4.0.4) fdir: 6.5.0(picomatch@4.0.4)
picomatch: 4.0.4 picomatch: 4.0.4