Files
writing-agent/tests/worker-set-sanitize.test.ts

89 lines
3.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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();
});
});