103 lines
3.4 KiB
TypeScript
103 lines
3.4 KiB
TypeScript
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");
|
|
});
|
|
});
|