97 lines
2.9 KiB
TypeScript
97 lines
2.9 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { Blackboard } from "../src/blackboard/blackboard.js";
|
|
import { createSession } from "../src/runtime/phase-machine.js";
|
|
import {
|
|
buildDeclaredWorkerSkill,
|
|
resolveAcceptanceModeForWorker,
|
|
} from "../src/skills/declared-worker.js";
|
|
import { parseWorkerSetYaml } from "../src/skills/worker-set-parse.js";
|
|
|
|
describe("resolveAcceptanceModeForWorker", () => {
|
|
it("always confirms design-flow", () => {
|
|
const mode = resolveAcceptanceModeForWorker({
|
|
session: createSession(),
|
|
blackboard: new Blackboard(),
|
|
workerId: "design-flow",
|
|
});
|
|
expect(mode).toBe("user_confirmed");
|
|
});
|
|
|
|
it("maps review → user_confirmed and continue → no_confirmation", () => {
|
|
const bb = new Blackboard();
|
|
const yaml = JSON.stringify({
|
|
version: 1,
|
|
workers: [
|
|
{ ref: "world-simulator", acceptance: "continue" },
|
|
{ ref: "narrator", acceptance: "review" },
|
|
],
|
|
});
|
|
bb.write({ tag: "设计.worker集", content: yaml, source: "test" });
|
|
const session = {
|
|
...createSession(),
|
|
slots: {
|
|
...createSession().slots,
|
|
designInstanceReady: true,
|
|
uiLifecycleStage: "play",
|
|
},
|
|
};
|
|
|
|
expect(
|
|
resolveAcceptanceModeForWorker({
|
|
session,
|
|
blackboard: bb,
|
|
workerId: "world-simulator",
|
|
}),
|
|
).toBe("no_confirmation");
|
|
expect(
|
|
resolveAcceptanceModeForWorker({
|
|
session,
|
|
blackboard: bb,
|
|
workerId: "narrator",
|
|
}),
|
|
).toBe("user_confirmed");
|
|
});
|
|
});
|
|
|
|
describe("buildDeclaredWorkerSkill", () => {
|
|
it("builds runnable contract from entry + template", () => {
|
|
const parsed = parseWorkerSetYaml(
|
|
JSON.stringify({
|
|
version: 1,
|
|
narrative_guide: "残酷但不虐主",
|
|
core_premises: ["主角免疫"],
|
|
workers: [
|
|
{
|
|
ref: "narrator",
|
|
duty: "组装用户可见回复",
|
|
rationale: "需要可读终稿",
|
|
acceptance: "review",
|
|
outputs: ["输出.用户展示"],
|
|
context: {
|
|
static: ["设计.worker集"],
|
|
dynamic: ["运行.本轮.裁决"],
|
|
},
|
|
},
|
|
],
|
|
}),
|
|
);
|
|
const entry = parsed!.workers[0];
|
|
const { worker, promptBody } = buildDeclaredWorkerSkill({
|
|
skillPackName: "world-simulator",
|
|
entry,
|
|
template: {
|
|
label: "转述",
|
|
prompt_excerpt: "只改表达不改事实",
|
|
suggested_outputs: ["输出.用户展示"],
|
|
},
|
|
workerSet: parsed,
|
|
});
|
|
expect(worker.id).toBe("narrator");
|
|
expect(worker.outputTags).toContain("输出.用户展示");
|
|
expect(worker.inputTags).toContain("设计.worker集");
|
|
expect(promptBody).toContain("残酷但不虐主");
|
|
expect(promptBody).toContain("主角免疫");
|
|
expect(promptBody).toContain("声明驱动");
|
|
});
|
|
});
|