- 节点循环:配方开局直坐 DAG 第一步;验收后先问下一步意向,再确认开干并可钉编排参数;「按意见修改」只重跑当前节点。 - 询问分流:能力 opening 走说话面引导,可跳过追问按题干去重;追问与产物同轮挂载,避免拆成两段历史。 - 运行时:补强 revision 重跑、创作流程合并/进度指针、工具循环与 worker 执行;新增运行日志与 web:watch。 - 前端:统一等待态文案与底栏主按钮,完善询问卡/产物验收/呈现壳样式与交互。 - 同步世界模拟器模块提示、编排文档与相关测试。 Co-authored-by: Cursor <cursoragent@cursor.com>
157 lines
4.7 KiB
JavaScript
157 lines
4.7 KiB
JavaScript
/**
|
||
* 与 docs/ui-glossary.md、src/server/display-labels.ts 保持同步。
|
||
* 用户侧口径:配方 / 编排器 / 技能 / 工作流计划 / 运行规格 / 执行单元。
|
||
*/
|
||
|
||
const STAGE_LABELS = {
|
||
design: "创作",
|
||
play: "游玩",
|
||
done: "已完成",
|
||
idle: "待命",
|
||
running: "执行中",
|
||
waiting_user: "等待你",
|
||
error: "出错",
|
||
};
|
||
|
||
const WORKER_LABELS = {
|
||
"design-core": "创作 · 核心",
|
||
"design-worker": "创作 · 执行单元规格",
|
||
"design-fixed": "创作 · 固定上下文",
|
||
"design-refine": "创作 · 细化与终稿",
|
||
"design-intake": "创作 · 综合收口",
|
||
"design-flow": "创作 · 流程编排",
|
||
"design-step": "创作 · 执行步骤",
|
||
"opening-generator": "开局 · 开场白",
|
||
orchestrator: "编排器",
|
||
"agent-burst": "编排器调度",
|
||
narrator: "叙事转述",
|
||
"role-decide": "角色决策",
|
||
"world-simulator": "主世界层",
|
||
chance: "机遇裁定",
|
||
"round-present": "回合呈现",
|
||
outline: "大纲 / 细纲",
|
||
"chapter-writer": "章节正文",
|
||
};
|
||
|
||
const FIXED_TOPIC_LABELS = {
|
||
"aesthetics-interaction": "美学纲领与交互范式",
|
||
interaction: "交互范式",
|
||
narrative_guide: "叙事指南与故事推进",
|
||
input_protocol: "输入协议",
|
||
core_premise: "核心前提",
|
||
aesthetics: "美学纲领",
|
||
};
|
||
|
||
const PHASE_UNIT_LABELS = {
|
||
core: "核心",
|
||
refine: "细化",
|
||
};
|
||
|
||
export function displayStageLabel(id) {
|
||
if (!id) return "";
|
||
return STAGE_LABELS[id] ?? id;
|
||
}
|
||
|
||
export function displaySkillPackLabel(id) {
|
||
if (!id) return "";
|
||
const map = {
|
||
"world-simulator": "世界模拟器",
|
||
"expand-assistant": "扩写助手",
|
||
};
|
||
return map[id] ?? id;
|
||
}
|
||
|
||
export function displayWorkerLabel(id) {
|
||
if (!id) return "";
|
||
const trimmed = String(id).trim();
|
||
if (!trimmed) return "";
|
||
if (WORKER_LABELS[trimmed]) return WORKER_LABELS[trimmed];
|
||
|
||
if (trimmed.startsWith("phase:")) {
|
||
const key = trimmed.slice("phase:".length);
|
||
return `单位 · ${PHASE_UNIT_LABELS[key] ?? key}`;
|
||
}
|
||
if (trimmed.startsWith("worker:")) {
|
||
const ref = trimmed.slice("worker:".length);
|
||
return `执行单元 · ${displayWorkerLabel(ref)}`;
|
||
}
|
||
if (trimmed.startsWith("fixed:")) {
|
||
const topic = trimmed.slice("fixed:".length);
|
||
return `技能 · ${FIXED_TOPIC_LABELS[topic] ?? topic}`;
|
||
}
|
||
if (trimmed.startsWith("resident:")) {
|
||
return `常驻 · ${trimmed.slice("resident:".length)}`;
|
||
}
|
||
return trimmed;
|
||
}
|
||
|
||
export function formatWorkerDisplayTitle(workerId, action = null) {
|
||
const base = displayWorkerLabel(workerId) || "执行单元";
|
||
if (action === "output") return `${base} · 产出`;
|
||
if (action === "questions") return `${base} · 提问`;
|
||
if (action === "stub") return `${base} · 占位`;
|
||
if (action === "running") return `${base} · 执行中`;
|
||
return base;
|
||
}
|
||
|
||
/**
|
||
* `review_artifact` 底栏 / 工作面文案。流程编排核对工作流计划,不是「验收通过」。
|
||
* 须与 src/server/display-labels.ts `reviewComposerCopy` 保持一致。
|
||
*/
|
||
export function reviewComposerCopy(workerId, opts = {}) {
|
||
const hasQuestions = Boolean(opts.hasQuestions);
|
||
const id = String(workerId ?? "").trim();
|
||
|
||
if (id === "design-flow") {
|
||
return {
|
||
chip: "编排",
|
||
kicker: "核对编排",
|
||
taskLabel: "编排",
|
||
taskTitle: "核对工作流计划",
|
||
hint: hasQuestions
|
||
? "同意就按这个排;要改就写意见,在现有计划上改。下方追问可选答。"
|
||
: "同意就按这个排;要改就写意见,在现有计划上改。",
|
||
submitLabel: "按意见改编排",
|
||
acceptLabel: "确认编排",
|
||
placeholder: "改编排意见…",
|
||
emptyEnterHint: "空 Enter=确认编排",
|
||
tone: "plan",
|
||
kind: "flow",
|
||
};
|
||
}
|
||
|
||
if (id === "opening-generator") {
|
||
return {
|
||
chip: "开场",
|
||
kicker: "待选定",
|
||
taskLabel: "开场",
|
||
taskTitle: "选定开场白",
|
||
hint: hasQuestions
|
||
? "同意就选定此开场;要改就写意见。下方追问可选答。"
|
||
: "同意就选定此开场;要改就写意见。",
|
||
submitLabel: "按意见修改",
|
||
acceptLabel: "选定此开场",
|
||
placeholder: "修改意见…",
|
||
emptyEnterHint: "空 Enter=选定此开场",
|
||
tone: "plan",
|
||
kind: "opening",
|
||
};
|
||
}
|
||
|
||
return {
|
||
chip: "验收",
|
||
kicker: "待验收",
|
||
taskLabel: "验收",
|
||
taskTitle: "验收产物",
|
||
hint: hasQuestions
|
||
? "同意就接受;要改就写意见,在现有产物上改。下方追问可选答。"
|
||
: "同意就接受;要改就写意见,在现有产物上改。",
|
||
submitLabel: "按意见修改",
|
||
acceptLabel: "接受",
|
||
placeholder: "修改意见…",
|
||
emptyEnterHint: "空 Enter=接受",
|
||
tone: "accept",
|
||
kind: "accept",
|
||
};
|
||
}
|