import test from "node:test"; import assert from "node:assert/strict"; import os from "node:os"; import path from "node:path"; import { mkdtemp, rm } from "node:fs/promises"; let runtimeRoot = ""; let readState: (typeof import("../src/lib/boss-data"))["readState"]; let getMasterAgentPromptPolicy: (typeof import("../src/lib/boss-data"))["getMasterAgentPromptPolicy"]; let updateMasterAgentPromptPolicy: (typeof import("../src/lib/boss-data"))["updateMasterAgentPromptPolicy"]; let getUserMasterPrompt: (typeof import("../src/lib/boss-data"))["getUserMasterPrompt"]; let updateUserMasterPrompt: (typeof import("../src/lib/boss-data"))["updateUserMasterPrompt"]; let listUserMasterMemories: (typeof import("../src/lib/boss-data"))["listUserMasterMemories"]; let createUserMasterMemory: (typeof import("../src/lib/boss-data"))["createUserMasterMemory"]; let updateUserMasterMemory: (typeof import("../src/lib/boss-data"))["updateUserMasterMemory"]; let archiveUserMasterMemory: (typeof import("../src/lib/boss-data"))["archiveUserMasterMemory"]; let stateFile = ""; let stateBackupFile = ""; async function setup() { if (runtimeRoot) return; runtimeRoot = await mkdtemp(path.join(os.tmpdir(), "boss-master-agent-prompts-memory-")); process.env.BOSS_RUNTIME_ROOT = runtimeRoot; process.env.BOSS_STATE_FILE = path.join(runtimeRoot, "boss-state.json"); stateFile = process.env.BOSS_STATE_FILE; stateBackupFile = `${stateFile}.bak`; const data = await import("../src/lib/boss-data.ts"); readState = data.readState; getMasterAgentPromptPolicy = data.getMasterAgentPromptPolicy; updateMasterAgentPromptPolicy = data.updateMasterAgentPromptPolicy; getUserMasterPrompt = data.getUserMasterPrompt; updateUserMasterPrompt = data.updateUserMasterPrompt; listUserMasterMemories = data.listUserMasterMemories; createUserMasterMemory = data.createUserMasterMemory; updateUserMasterMemory = data.updateUserMasterMemory; archiveUserMasterMemory = data.archiveUserMasterMemory; } async function resetState() { if (!stateFile) { return; } await Promise.all([ rm(stateFile, { force: true }), rm(stateBackupFile, { force: true }), ]); } test.beforeEach(async () => { await setup(); await resetState(); }); test.after(async () => { if (runtimeRoot) { await rm(runtimeRoot, { recursive: true, force: true }); } }); test("主 Agent 提示词与用户记忆可读写", async () => { await setup(); await updateMasterAgentPromptPolicy({ globalPrompt: "全局主提示词", updatedBy: "17600003315", }); await updateUserMasterPrompt("17600003315", "用户私有主提示词"); const created = await createUserMasterMemory({ account: "17600003315", scope: "project", projectId: "master-agent", title: "项目进度", content: "当前主链优先打通聊天闭环。", memoryType: "project_progress", tags: ["聊天", "主链"], }); await updateUserMasterMemory(created.memoryId, "17600003315", { content: "当前主链优先打通主 Agent 聊天闭环。", tags: ["聊天", "主Agent"], }); const policy = await getMasterAgentPromptPolicy(); const userPrompt = await getUserMasterPrompt("17600003315"); const memories = await listUserMasterMemories("17600003315", { includeArchived: false, }); assert.equal(policy?.globalPrompt, "全局主提示词"); assert.equal(userPrompt?.content, "用户私有主提示词"); assert.equal(memories.length, 1); assert.equal(memories[0]?.content, "当前主链优先打通主 Agent 聊天闭环。"); assert.deepEqual(memories[0]?.tags, ["聊天", "主Agent"]); await archiveUserMasterMemory(created.memoryId, "17600003315"); const visible = await listUserMasterMemories("17600003315", { includeArchived: false }); const all = await listUserMasterMemories("17600003315", { includeArchived: true }); const archived = all.find((item) => item.memoryId === created.memoryId); assert.equal(visible.length, 0); assert.equal(archived?.archived, true); assert.equal((await readState()).masterAgentMemories.length, 1); }); test("主 Agent 项目记忆不会在状态归一化时误删 boss-console 作用域", async () => { await setup(); const created = await createUserMasterMemory({ account: "17600003315", scope: "project", projectId: "boss-console", title: "boss 项目进度", content: "boss 项目当前按项目聚合加线程下钻展示。", memoryType: "project_progress", tags: ["boss", "会话"], }); assert.equal(created.projectId, "boss-console"); const all = await listUserMasterMemories("17600003315", { includeArchived: true }); assert.equal(all.length, 1); assert.equal(all[0]?.projectId, "boss-console"); const state = await readState(); assert.equal(state.masterAgentMemories.length, 1); assert.equal(state.masterAgentMemories[0]?.projectId, "boss-console"); });