31 lines
2.1 KiB
JavaScript
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: "compact" }, 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(); }
|
|
});
|