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(); } });