52 lines
3.0 KiB
JavaScript
52 lines
3.0 KiB
JavaScript
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 });
|
|
}
|
|
});
|