deskpaw-memory/test/computer-events.test.js

31 lines
2.1 KiB
JavaScript

import { DatabaseSync } from "node:sqlite";
import assert from "node:assert/strict";
import { test } from "node:test";
import { Timeline } from "../src/timeline.js";
import { ChainStore } from "../src/chain-store.js";
test("incremental Computer events interleave with user dialogue, remain task-addressable and reach Memory", () => {
const db = new DatabaseSync(":memory:"), timeline = new Timeline(db), chain = new ChainStore(db, timeline);
try {
const event = { id: "computer:task:1", kind: "work_record", at: 10, text: "阅读文章第一屏,作者提出以下方法。".repeat(100), source: { actor: "computer", task_id: "task", message_id: "observation-1" } };
timeline.append(event);
timeline.append({ id: "user:1", kind: "user", at: 11, text: "先别发布,继续阅读", source: { actor: "owner" } });
timeline.append({ ...event, id: "computer:task:2", at: 12, text: "阅读文章第二屏" });
timeline.append({ ...event, id: "other-task", at: 13, source: { task_id: "other" } });
timeline.append(event);
assert.equal(timeline.query({ task_id: "task" }).entries.length, 2);
assert.equal(timeline.query({ task_id: "task", query: "阅读文章" }).entries.length, 2);
const page = timeline.query({ task_id: "task", limit: 1 });
assert.equal(timeline.query({ task_id: "task", after: page.cursor }).entries[0].id, "computer:task:2");
assert.equal(chain.context().nodes.find(node => node.event_id === event.id).source.actor, "computer");
assert.ok(chain.context().nodes.some(node => node.event_id === "user:1"));
assert.equal(chain.status().jobs.length, 0);
chain.request({ request_id: "organize", mode: "deep" }, 20);
const job = chain.claim({}, 30).job;
assert.ok(job.evidence.some(item => item.source.task_id === "task"));
chain.commit({ job_id: job.id, token: job.token, covered_node_ids: job.nodes.map(node => node.id), summary: "阅读文章,用户要求暂不发布。正文仍可展开。", objects: [] }, 40);
assert.equal(timeline.read({ id: event.id }).text, event.text);
assert.throws(() => timeline.query({ task_id: 123 }), /task_id/);
} finally { db.close(); }
});