import assert from "node:assert/strict";
import test from "node:test";
import {
buildContextBlock,
CLEARED_CONTEXT,
nextContextRevision,
REFRESHING_CONTEXT,
} from "../src/inject.ts";
import { replay } from "../src/state.ts";
const open = replay([
{
kind: "observation",
reconciled: [],
output: { existing: [], additions: [{ canonicalRequest: "finish the report", status: "active" }] },
at: 1,
},
]);
const done = replay([
{
kind: "observation",
reconciled: [],
output: { existing: [], additions: [{ canonicalRequest: "finish the report", status: "active" }] },
at: 1,
},
{ kind: "user_action", threadId: "t1", action: "accept", at: 2 },
]);
test("internal wakes never inject pending-request context", () => {
assert.equal(nextContextRevision("internal", open, undefined), undefined);
});
test("user turns inject only changed pending-request state", () => {
const first = nextContextRevision("interactive", open, undefined)!;
assert.match(first, /finish the report/);
assert.equal(first, buildContextBlock(open));
assert.equal(nextContextRevision("rpc", open, first), undefined);
});
test("a pending reconciliation invalidates stale context without blocking", () => {
const previous = buildContextBlock(open)!;
assert.equal(nextContextRevision("interactive", open, previous, true), REFRESHING_CONTEXT);
assert.equal(nextContextRevision("interactive", open, REFRESHING_CONTEXT, true), undefined);
});
test("closing the final request emits one clear revision", () => {
const previous = buildContextBlock(open)!;
assert.equal(nextContextRevision("interactive", done, previous), CLEARED_CONTEXT);
assert.equal(nextContextRevision("interactive", done, CLEARED_CONTEXT), undefined);
});