import assert from "node:assert/strict"; import { mkdtempSync, readFileSync, rmSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; import test from "node:test"; import { MemoryStore } from "../src/store.js"; test("task transition recommends consolidation for an unrelated completed task", () => { const directory = mkdtempSync(join(tmpdir(), "deskpaw-memory-")); const store = new MemoryStore(join(directory, "memory.sqlite"), join(directory, "bundles")); try { store.completeTask({ task_id: "one", objective: "打开微信并发送日报", status: "completed", result: "已发送", context_epoch: "e1" }); const related = store.assessTransition({ objective: "继续发送刚才的日报" }); const unrelated = store.assessTransition({ objective: "分析项目中的 TypeScript 架构" }); assert.notEqual(related.relationship, "new"); assert.equal(unrelated.relationship, "new"); assert.equal(unrelated.recommended_action, "consolidate"); } finally { store.close(); rmSync(directory, { recursive: true, force: true }); } }); test("schedule context creates and projects a stable bundle", () => { const directory = mkdtempSync(join(tmpdir(), "deskpaw-memory-")); const store = new MemoryStore(join(directory, "memory.sqlite"), join(directory, "bundles")); try { const context = store.prepareContext({ task_id: "run-1", objective: "每天发送 AI 简报", schedule_id: "daily-ai", schedule_name: "AI 简报" }); assert.equal(context.schedule_bundle.documents.some((document) => document.name === "requirements.md"), true); store.completeTask({ task_id: "run-1", objective: "每天发送 AI 简报", status: "completed", result: "今日已发送 5 条", schedule_id: "daily-ai", schedule_name: "AI 简报", context_epoch: context.context_epoch }); assert.match(readFileSync(join(directory, "bundles", "schedule", "daily-ai", "runs", "run-1", "summary.md"), "utf8"), /今日已发送/); } finally { store.close(); rmSync(directory, { recursive: true, force: true }); } }); test("bundle document updates use optimistic revisions", () => { const directory = mkdtempSync(join(tmpdir(), "deskpaw-memory-")); const store = new MemoryStore(join(directory, "memory.sqlite"), join(directory, "bundles")); try { store.prepareContext({ task_id: "run-1", objective: "每天发送 AI 简报", schedule_id: "daily-ai", schedule_name: "AI 简报" }); const bundle = store.bundle("schedule", "daily-ai"); const updated = store.updateBundleDocument({ scope: "schedule", object_id: "daily-ai", name: "preferences.md", body: "多放开源项目。", expected_revision: bundle.revision }); assert.equal(updated.revision, bundle.revision + 1); assert.throws(() => store.updateBundleDocument({ scope: "schedule", object_id: "daily-ai", name: "preferences.md", body: "旧版本覆盖", expected_revision: bundle.revision }), /revision conflict/); } finally { store.close(); rmSync(directory, { recursive: true, force: true }); } });