UNPKG

@sema-agent/core

Version:

Stateless, task-oriented AI agent core

86 lines (85 loc) • 5.85 kB
import { strict as assert } from "node:assert"; import { JOURNAL_OVERSIZE_ERROR_CODE, MAX_JOURNAL_RESULT_BYTES, } from "../workflow-journal-store.js"; import { beginContract } from "./contract-harness.js"; const key = (ordinal) => `${ordinal}:h`; const completed = (ordinal, over = {}) => ({ taskId: `t-${ordinal}`, sessionId: `s-${ordinal}`, terminal: { kind: "completed" }, result: `r${ordinal}`, structuredOutput: { ordinal, nested: { ok: true } }, stats: { turns: 1, tokens: 1, costMicroUsd: 0, nested: { tokens: 0, turns: 0, tasks: 0, costMicroUsd: 0 } }, ...over, }); const parked = (ordinal, over = {}) => ({ taskId: `t-${ordinal}`, sessionId: `s-${ordinal}`, terminal: { kind: "paused", token: `tok-${ordinal}`, checkpointId: `cp-${ordinal}`, gate: { kind: "human", reason: "approve", toolName: "Write" } }, result: "", structuredOutput: { partial: ordinal }, stats: { turns: 1, tokens: 1, costMicroUsd: 0, nested: { tokens: 3, turns: 2, tasks: 1, costMicroUsd: 1 } }, ...over, }); const OVER_CAP = "x".repeat(MAX_JOURNAL_RESULT_BYTES + 1024); const isOversizeRefusal = (e) => e instanceof Error && e.code === JOURNAL_OVERSIZE_ERROR_CODE; export async function workflowJournalStoreContract(make, runAssertion) { const { run, settle } = beginContract(runAssertion); run("append → load returns entries ASCENDING by ordinal, both arms verbatim; a re-append per ordinal OVERWRITES", async () => { const store = make(); await store.append("run-1", "tenant-a", { callKey: key(10), result: completed(10) }); await store.append("run-1", "tenant-a", { callKey: key(1), parked: parked(1) }); await store.append("run-1", "tenant-a", { callKey: key(0), result: completed(0) }); await store.append("run-1", "tenant-a", { callKey: key(2), result: completed(2) }); await store.append("run-1", "tenant-a", { callKey: key(0), result: completed(0, { result: "overwritten" }) }); const entries = await store.load("run-1", "tenant-a"); assert.deepEqual(entries.map((e) => e.callKey), [key(0), key(1), key(2), key(10)]); assert.deepEqual(entries[0], { callKey: key(0), result: completed(0, { result: "overwritten" }) }); assert.deepEqual(entries[1], { callKey: key(1), parked: parked(1) }); }); run("scope wall: a cross-scope load is EMPTY — before and after the owner's own load, and after a refused cross-scope append — on both arms", async () => { const store = make(); await store.append("run-1", "alice", { callKey: key(0), result: completed(0) }); await store.append("run-1", "alice", { callKey: key(1), parked: parked(1) }); assert.deepEqual(await store.load("run-1", "mallory"), []); assert.equal((await store.load("run-1", "alice")).length, 2); assert.deepEqual(await store.load("run-1", "mallory"), []); await assert.rejects(store.append("run-1", "mallory", { callKey: key(2), result: completed(2) })); await assert.rejects(store.append("run-1", "mallory", { callKey: key(3), parked: parked(3) })); assert.deepEqual(await store.load("run-1", "mallory"), []); assert.deepEqual((await store.load("run-1", "alice")).map((e) => e.callKey), [key(0), key(1)]); }); run(`oversize RESULT arm ⇒ append rejects with code "${JOURNAL_OVERSIZE_ERROR_CODE}"; nothing journaled; the store stays usable`, async () => { const store = make(); await store.append("run-1", "tenant-a", { callKey: key(0), result: completed(0) }); await assert.rejects(store.append("run-1", "tenant-a", { callKey: key(1), result: completed(1, { result: OVER_CAP }) }), isOversizeRefusal); assert.deepEqual((await store.load("run-1", "tenant-a")).map((e) => e.callKey), [key(0)]); await store.append("run-1", "tenant-a", { callKey: key(2), result: completed(2) }); assert.deepEqual((await store.load("run-1", "tenant-a")).map((e) => e.callKey), [key(0), key(2)]); }); run(`oversize PARKED arm ⇒ append rejects with code "${JOURNAL_OVERSIZE_ERROR_CODE}"; nothing journaled (never a silent skip — a lost park is a resume running the ordinal live)`, async () => { const store = make(); await store.append("run-1", "tenant-a", { callKey: key(0), result: completed(0) }); await assert.rejects(store.append("run-1", "tenant-a", { callKey: key(1), parked: parked(1, { result: OVER_CAP }) }), isOversizeRefusal); assert.deepEqual((await store.load("run-1", "tenant-a")).map((e) => e.callKey), [key(0)]); await store.append("run-1", "tenant-a", { callKey: key(1), parked: parked(1) }); assert.equal((await store.load("run-1", "tenant-a"))[1].parked?.terminal.kind, "paused"); }); run("the cap is inclusive: a payload of EXACTLY the cap's byte count is accepted on both arms", async () => { const store = make(); const fit = (payload) => { const base = Buffer.byteLength(JSON.stringify({ ...payload, result: "" }), "utf8"); return { ...payload, result: "y".repeat(MAX_JOURNAL_RESULT_BYTES - base) }; }; const r = fit(completed(0)); const p = fit(parked(1)); assert.equal(Buffer.byteLength(JSON.stringify(r), "utf8"), MAX_JOURNAL_RESULT_BYTES); assert.equal(Buffer.byteLength(JSON.stringify(p), "utf8"), MAX_JOURNAL_RESULT_BYTES); await store.append("run-1", "tenant-a", { callKey: key(0), result: r }); await store.append("run-1", "tenant-a", { callKey: key(1), parked: p }); const entries = await store.load("run-1", "tenant-a"); assert.deepEqual(entries.map((e) => e.callKey), [key(0), key(1)]); assert.deepEqual(entries[0].result, r); assert.deepEqual(entries[1].parked, p); }); await settle(); }