重构世界模拟器为模块化配方架构,完善创作编排、会话运行时与 Web UI,并清理过时技能。
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
102
tests/worker-declaration.test.ts
Normal file
102
tests/worker-declaration.test.ts
Normal file
@@ -0,0 +1,102 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { Blackboard } from "../src/blackboard/blackboard.js";
|
||||
import { createSession } from "../src/runtime/phase-machine.js";
|
||||
import {
|
||||
buildInstanceWorkerDeclaration,
|
||||
inferLifecycleStage,
|
||||
isWorkerDeclared,
|
||||
readWorkerSetYamlForDeclaration,
|
||||
} from "../src/skills/worker-declaration.js";
|
||||
|
||||
const WORKER_SET = `
|
||||
version: 1
|
||||
workers:
|
||||
- ref: world-simulator
|
||||
duty: 世界推进
|
||||
- ref: narrator
|
||||
duty: 转述
|
||||
- ref: opening-generator
|
||||
duty: 开局
|
||||
instantiate_hints:
|
||||
invoke: [opening-generator]
|
||||
`;
|
||||
|
||||
function sessionWithAcceptedWorkerSet() {
|
||||
return {
|
||||
...createSession(),
|
||||
slots: {
|
||||
...createSession().slots,
|
||||
designInstanceReady: true,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
describe("worker-declaration", () => {
|
||||
it("design before accept: design step skills", () => {
|
||||
const bb = new Blackboard();
|
||||
const decl = buildInstanceWorkerDeclaration(createSession(), bb, "design");
|
||||
expect(decl.activeWorkerIds).toEqual(["design-flow", "design-step"]);
|
||||
expect(decl.accepted).toBe(false);
|
||||
});
|
||||
|
||||
it("play after accept: only run workers from worker set", () => {
|
||||
const bb = new Blackboard();
|
||||
bb.write({ tag: "设计.worker集", content: WORKER_SET, source: "test" });
|
||||
const session = {
|
||||
...sessionWithAcceptedWorkerSet(),
|
||||
slots: {
|
||||
...sessionWithAcceptedWorkerSet().slots,
|
||||
uiLifecycleStage: "play",
|
||||
},
|
||||
};
|
||||
const decl = buildInstanceWorkerDeclaration(session, bb, "play");
|
||||
expect(decl.playWorkerIds).toEqual(["world-simulator", "narrator"]);
|
||||
expect(decl.activeWorkerIds).toEqual(["world-simulator", "narrator"]);
|
||||
expect(decl.designEndWorkerIds).toEqual(["opening-generator"]);
|
||||
expect(isWorkerDeclared(decl, "narrator")).toBe(true);
|
||||
expect(isWorkerDeclared(decl, "design-flow")).toBe(false);
|
||||
expect(isWorkerDeclared(decl, "opening-generator")).toBe(false);
|
||||
});
|
||||
|
||||
it("design after accept: design steps + design-end workers", () => {
|
||||
const bb = new Blackboard();
|
||||
bb.write({ tag: "设计.worker集", content: WORKER_SET, source: "test" });
|
||||
const decl = buildInstanceWorkerDeclaration(
|
||||
sessionWithAcceptedWorkerSet(),
|
||||
bb,
|
||||
"design",
|
||||
);
|
||||
expect(decl.activeWorkerIds).toContain("design-flow");
|
||||
expect(decl.activeWorkerIds).toContain("design-step");
|
||||
expect(decl.activeWorkerIds).toContain("opening-generator");
|
||||
expect(decl.activeWorkerIds).not.toContain("world-simulator");
|
||||
});
|
||||
|
||||
it("prefers accepted tag over draft when worker set accepted", () => {
|
||||
const bb = new Blackboard();
|
||||
bb.write({ tag: "设计.worker集", content: WORKER_SET, source: "test" });
|
||||
bb.write({ tag: "设计.worker集.草稿", content: "workers: []", source: "test" });
|
||||
const raw = readWorkerSetYamlForDeclaration(bb, sessionWithAcceptedWorkerSet());
|
||||
expect(raw?.sourceTag).toBe("设计.worker集");
|
||||
expect(raw?.yaml).toContain("world-simulator");
|
||||
});
|
||||
|
||||
it("inferLifecycleStage respects play tab and acceptance", () => {
|
||||
const bb = new Blackboard();
|
||||
const s1 = {
|
||||
...createSession(),
|
||||
slots: { ...createSession().slots, uiLifecycleStage: "play" },
|
||||
};
|
||||
expect(inferLifecycleStage(s1)).toBe("design");
|
||||
|
||||
bb.write({ tag: "设计.worker集", content: WORKER_SET, source: "test" });
|
||||
const s2 = {
|
||||
...sessionWithAcceptedWorkerSet(),
|
||||
slots: {
|
||||
...sessionWithAcceptedWorkerSet().slots,
|
||||
uiLifecycleStage: "play",
|
||||
},
|
||||
};
|
||||
expect(inferLifecycleStage(s2)).toBe("play");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user