{"version":3,"file":"compaction-checkpoint.test.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/compaction-checkpoint.test.ts"],"names":[],"mappings":"","sourcesContent":["import type { AssistantMessage, ToolResultMessage } from \"@apholdings/jensen-ai\";\nimport { describe, expect, it } from \"vitest\";\nimport { SessionManager } from \"../session-manager.js\";\nimport { createDeterministicCompactionDetails, prepareCompaction } from \"./compaction.js\";\n\ndescribe(\"deterministic compaction checkpoints\", () => {\n\tit(\"keeps hashed tool evidence addressable in the durable session log\", () => {\n\t\tconst session = SessionManager.inMemory(\"/tmp/cache-stable-compaction\");\n\t\tsession.appendMessage({ role: \"user\", content: \"inspect\", timestamp: 1 });\n\t\tsession.appendMessage({\n\t\t\trole: \"assistant\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"test\",\n\t\t\tmodel: \"test\",\n\t\t\tcontent: [{ type: \"toolCall\", id: \"call-1\", name: \"read\", arguments: { path: \"large.txt\" } }],\n\t\t\tusage: {\n\t\t\t\tinput: 10,\n\t\t\t\toutput: 2,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t\ttotalTokens: 12,\n\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t},\n\t\t\tstopReason: \"toolUse\",\n\t\t\ttimestamp: 2,\n\t\t} satisfies AssistantMessage);\n\t\tconst evidenceMessage = {\n\t\t\trole: \"toolResult\",\n\t\t\ttoolCallId: \"call-1\",\n\t\t\ttoolName: \"read\",\n\t\t\tcontent: [{ type: \"text\", text: \"complete durable evidence\" }],\n\t\t\tisError: false,\n\t\t\ttimestamp: 3,\n\t\t} satisfies ToolResultMessage;\n\t\tsession.appendMessage(evidenceMessage);\n\t\tsession.appendMessage({ role: \"user\", content: \"keep this recent turn\", timestamp: 4 });\n\n\t\tconst preparation = prepareCompaction(session.getBranch(), {\n\t\t\tenabled: true,\n\t\t\treserveTokens: 100,\n\t\t\tkeepRecentTokens: 1,\n\t\t});\n\t\texpect(preparation).toBeDefined();\n\t\tif (!preparation) return;\n\n\t\tconst first = createDeterministicCompactionDetails(preparation, {\n\t\t\treadFiles: [\"z.txt\", \"a.txt\", \"z.txt\"],\n\t\t\tmodifiedFiles: [],\n\t\t});\n\t\tconst second = createDeterministicCompactionDetails(preparation, {\n\t\t\tmodifiedFiles: [],\n\t\t\treadFiles: [\"a.txt\", \"z.txt\"],\n\t\t});\n\t\texpect(first).toEqual(second);\n\t\texpect(first.readFiles).toEqual([\"a.txt\", \"z.txt\"]);\n\t\texpect(first.checkpoint.toolEvidence).toHaveLength(1);\n\t\texpect(first.checkpoint.toolEvidence[0]).toMatchObject({\n\t\t\ttoolCallId: \"call-1\",\n\t\t\ttoolName: \"read\",\n\t\t\tcontentBytes: expect.any(Number),\n\t\t\tcontentHash: expect.stringMatching(/^[a-f0-9]{64}$/),\n\t\t\texcerpt: \"complete durable evidence\",\n\t\t});\n\n\t\tconst durableEvidence = session\n\t\t\t.getEntries()\n\t\t\t.find(\n\t\t\t\t(entry) =>\n\t\t\t\t\tentry.type === \"message\" &&\n\t\t\t\t\tentry.message.role === \"toolResult\" &&\n\t\t\t\t\tentry.message.toolCallId === first.checkpoint.toolEvidence[0]?.toolCallId,\n\t\t\t);\n\t\texpect(durableEvidence?.type === \"message\" ? durableEvidence.message : undefined).toEqual(evidenceMessage);\n\t});\n\n\tit(\"retains complete web evidence in durable details while compacting only a bounded reference\", () => {\n\t\tconst session = SessionManager.inMemory(\"/tmp/web-evidence-compaction\");\n\t\tsession.appendMessage({ role: \"user\", content: \"research\", timestamp: 1 });\n\t\tsession.appendMessage({\n\t\t\trole: \"assistant\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tprovider: \"test\",\n\t\t\tmodel: \"test\",\n\t\t\tcontent: [{ type: \"toolCall\", id: \"web-call\", name: \"web_fetch\", arguments: { url: \"https://example.com\" } }],\n\t\t\tusage: {\n\t\t\t\tinput: 10,\n\t\t\t\toutput: 2,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t\ttotalTokens: 12,\n\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t},\n\t\t\tstopReason: \"toolUse\",\n\t\t\ttimestamp: 2,\n\t\t} satisfies AssistantMessage);\n\t\tconst completeContent = \"complete page evidence \".repeat(1000);\n\t\tconst webResult = {\n\t\t\trole: \"toolResult\",\n\t\t\ttoolCallId: \"web-call\",\n\t\t\ttoolName: \"web_fetch\",\n\t\t\tcontent: [{ type: \"text\", text: \"evidence web-123 sha256:abc passage-1-4\" }],\n\t\t\tdetails: {\n\t\t\t\tevidence: {\n\t\t\t\t\tevidenceId: \"web-123\",\n\t\t\t\t\tcompleteContent,\n\t\t\t\t\tcompleteContentLocation: \"session:tool-result:web-123\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tisError: false,\n\t\t\ttimestamp: 3,\n\t\t} satisfies ToolResultMessage;\n\t\tsession.appendMessage(webResult);\n\t\tsession.appendMessage({ role: \"user\", content: \"continue\", timestamp: 4 });\n\t\tconst preparation = prepareCompaction(session.getBranch(), {\n\t\t\tenabled: true,\n\t\t\treserveTokens: 100,\n\t\t\tkeepRecentTokens: 1,\n\t\t});\n\t\texpect(preparation).toBeDefined();\n\t\tif (!preparation) return;\n\t\tconst details = createDeterministicCompactionDetails(preparation, { readFiles: [], modifiedFiles: [] });\n\t\tconst compactedEvidence = details.checkpoint.toolEvidence[0];\n\t\texpect(compactedEvidence).toMatchObject({ toolCallId: \"web-call\", toolName: \"web_fetch\" });\n\t\texpect(compactedEvidence?.excerpt).toBeDefined();\n\t\tconst compactedExcerpt = compactedEvidence?.excerpt;\n\t\tif (!compactedExcerpt) return;\n\t\texpect(compactedExcerpt.length).toBeLessThan(completeContent.length);\n\t\tconst durable = session\n\t\t\t.getEntries()\n\t\t\t.find((entry) => entry.type === \"message\" && entry.message.role === \"toolResult\");\n\t\texpect(\n\t\t\tdurable?.type === \"message\" && durable.message.role === \"toolResult\" ? durable.message.details : undefined,\n\t\t).toEqual(webResult.details);\n\t});\n});\n"]}