重构世界模拟器为模块化配方架构,完善创作编排、会话运行时与 Web UI,并清理过时技能。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-30 00:39:32 +08:00
parent 2b74c30d36
commit e670a5129c
167 changed files with 22955 additions and 5659 deletions

View File

@@ -0,0 +1,88 @@
import { describe, expect, it } from "vitest";
import {
extractJsonObjectText,
isUsableWorkerSet,
looksLikeProseNotSpec,
parseWorkerSetYaml,
} from "../src/skills/worker-set-parse.js";
import {
parseWorkerResponseForTest,
sanitizeWorkerSetOutputs,
} from "../src/worker/executor.js";
describe("worker-set prose rejection", () => {
it("does not YAML-crash on Chinese prose; returns clear parseError", () => {
const prose =
"我们被要求输出 JSON。首先根据用户输入和 SKILL进行实例设计。用户需求是扮演一个坠机的幸存者…";
expect(looksLikeProseNotSpec(prose)).toBe(true);
const parsed = parseWorkerSetYaml(prose);
expect(parsed?.parseError).toMatch(/不是 JSON 规格|askUser/);
expect(parsed?.parseError).not.toMatch(/Implicit keys/);
});
it("extracts JSON object from surrounding prose", () => {
const raw = `说明如下:\n\`\`\`json\n{"version":1,"workers":[{"ref":"narrator","duty":"转述","acceptance":"review"}]}\n\`\`\``;
const extracted = extractJsonObjectText(raw);
expect(extracted?.startsWith("{")).toBe(true);
expect(isUsableWorkerSet(parseWorkerSetYaml(extracted!))).toBe(true);
});
});
describe("sanitizeWorkerSetOutputs", () => {
it("converts prose-in-draft to askUser and clears bad tag", () => {
const result = sanitizeWorkerSetOutputs({
outputs: {
"设计.worker集.草稿":
"坠机后伤势如何?\n请描述你的初始状态轻伤还是重伤\n也可以让我随机生成。",
},
summary: "提问",
preview: "…",
});
expect(result.outputs["设计.worker集.草稿"]).toBeUndefined();
expect(result.askUser?.length).toBeGreaterThan(0);
});
it("keeps valid JSON draft", () => {
const json = JSON.stringify({
version: 1,
workers: [{ ref: "world-simulator", duty: "世界", acceptance: "continue" }],
});
const result = sanitizeWorkerSetOutputs({
outputs: { "设计.worker集.草稿": json },
summary: "草案",
preview: json,
});
expect(result.outputs["设计.worker集.草稿"]).toContain("world-simulator");
expect(result.askUser).toBeUndefined();
});
it("parseWorkerResponse does not dump raw prose into worker-set tags", () => {
const raw =
"我们被要求输出 JSON。请描述你的初始状态伤势如何";
const result = parseWorkerResponseForTest(raw, [
"设计.worker集.草稿",
"设计.worker集",
"用户.需求",
]);
expect(result.outputs["设计.worker集.草稿"]).toBeUndefined();
expect(result.askUser?.length).toBeGreaterThan(0);
});
it("accepts nested object outputs for worker set", () => {
const result = parseWorkerResponseForTest(
JSON.stringify({
outputs: {
"设计.worker集.草稿": {
version: 1,
workers: [{ ref: "narrator", duty: "转述", acceptance: "review" }],
},
},
summary: "ok",
askUser: null,
}),
["设计.worker集.草稿"],
);
expect(result.outputs["设计.worker集.草稿"]).toContain("narrator");
expect(result.askUser).toBeUndefined();
});
});