clanka 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/dist/Acp.d.ts.map +1 -1
  2. package/dist/Acp.js +3 -0
  3. package/dist/Acp.js.map +1 -1
  4. package/dist/Acp.test.js +58 -0
  5. package/dist/Acp.test.js.map +1 -1
  6. package/dist/Agent.d.ts.map +1 -1
  7. package/dist/Agent.js +86 -8
  8. package/dist/Agent.js.map +1 -1
  9. package/dist/Agent.test.js +671 -0
  10. package/dist/Agent.test.js.map +1 -1
  11. package/dist/AgentExecutor.d.ts +5 -0
  12. package/dist/AgentExecutor.d.ts.map +1 -1
  13. package/dist/AgentExecutor.js +22 -0
  14. package/dist/AgentExecutor.js.map +1 -1
  15. package/dist/AgentOutput.d.ts +49 -4
  16. package/dist/AgentOutput.d.ts.map +1 -1
  17. package/dist/AgentOutput.js +45 -0
  18. package/dist/AgentOutput.js.map +1 -1
  19. package/dist/AgentSkills.d.ts +56 -0
  20. package/dist/AgentSkills.d.ts.map +1 -0
  21. package/dist/AgentSkills.js +126 -0
  22. package/dist/AgentSkills.js.map +1 -0
  23. package/dist/AgentSkills.test.d.ts +2 -0
  24. package/dist/AgentSkills.test.d.ts.map +1 -0
  25. package/dist/AgentSkills.test.js +356 -0
  26. package/dist/AgentSkills.test.js.map +1 -0
  27. package/dist/Codex.js +1 -1
  28. package/dist/Codex.js.map +1 -1
  29. package/dist/Compaction.d.ts +342 -0
  30. package/dist/Compaction.d.ts.map +1 -0
  31. package/dist/Compaction.js +566 -0
  32. package/dist/Compaction.js.map +1 -0
  33. package/dist/Compaction.test.d.ts +2 -0
  34. package/dist/Compaction.test.d.ts.map +1 -0
  35. package/dist/Compaction.test.js +576 -0
  36. package/dist/Compaction.test.js.map +1 -0
  37. package/dist/CompactionTransport.test.d.ts +2 -0
  38. package/dist/CompactionTransport.test.d.ts.map +1 -0
  39. package/dist/CompactionTransport.test.js +123 -0
  40. package/dist/CompactionTransport.test.js.map +1 -0
  41. package/dist/Copilot.d.ts.map +1 -1
  42. package/dist/Copilot.js +7 -2
  43. package/dist/Copilot.js.map +1 -1
  44. package/dist/OutputFormatter.d.ts.map +1 -1
  45. package/dist/OutputFormatter.js +9 -0
  46. package/dist/OutputFormatter.js.map +1 -1
  47. package/dist/cli.js +14 -5
  48. package/dist/cli.js.map +1 -1
  49. package/dist/index.d.ts +5 -0
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +5 -0
  52. package/dist/index.js.map +1 -1
  53. package/package.json +1 -1
  54. package/src/Acp.test.ts +85 -0
  55. package/src/Acp.ts +2 -0
  56. package/src/Agent.test.ts +994 -0
  57. package/src/Agent.ts +127 -6
  58. package/src/AgentExecutor.ts +27 -0
  59. package/src/AgentOutput.ts +58 -0
  60. package/src/AgentSkills.test.ts +652 -0
  61. package/src/AgentSkills.ts +155 -0
  62. package/src/Codex.ts +3 -1
  63. package/src/Compaction.test.ts +824 -0
  64. package/src/Compaction.ts +788 -0
  65. package/src/CompactionTransport.test.ts +228 -0
  66. package/src/Copilot.ts +8 -1
  67. package/src/OutputFormatter.ts +9 -0
  68. package/src/cli.ts +27 -6
  69. package/src/index.ts +6 -0
@@ -0,0 +1,576 @@
1
+ import { assert, describe, it } from "@effect/vitest";
2
+ import * as Effect from "effect/Effect";
3
+ import * as Option from "effect/Option";
4
+ import * as AiError from "effect/unstable/ai/AiError";
5
+ import * as Prompt from "effect/unstable/ai/Prompt";
6
+ import * as ResponseIdTracker from "effect/unstable/ai/ResponseIdTracker";
7
+ import * as Compaction from "./Compaction.js";
8
+ // -----------------------------------------------------------------------------
9
+ // Fixtures
10
+ // -----------------------------------------------------------------------------
11
+ const user = (text) => Prompt.makeMessage("user", {
12
+ content: [Prompt.makePart("text", { text })],
13
+ });
14
+ const assistantText = (text) => Prompt.makeMessage("assistant", {
15
+ content: [Prompt.makePart("text", { text })],
16
+ });
17
+ const assistantCall = (id, script, reasoning) => Prompt.makeMessage("assistant", {
18
+ content: [
19
+ ...(reasoning === undefined
20
+ ? []
21
+ : [Prompt.makePart("reasoning", { text: reasoning })]),
22
+ Prompt.makePart("tool-call", {
23
+ id,
24
+ name: "execute",
25
+ params: { script },
26
+ providerExecuted: false,
27
+ }),
28
+ ],
29
+ });
30
+ const toolResult = (id, result) => Prompt.makeMessage("tool", {
31
+ content: [
32
+ Prompt.makePart("tool-result", {
33
+ id,
34
+ name: "execute",
35
+ isFailure: false,
36
+ result,
37
+ providerExecuted: false,
38
+ }),
39
+ ],
40
+ });
41
+ const system = Prompt.makeMessage("system", { content: "You are a test." });
42
+ /** A string of `n` characters built from a recognisable repeating word. */
43
+ const filler = (word, n) => (word + " ").repeat(Math.ceil(n / (word.length + 1))).slice(0, n);
44
+ const openAiError = (reason, method = "streamText") => AiError.make({ module: "OpenAiLanguageModel", method, reason });
45
+ const request = {
46
+ method: "POST",
47
+ url: "https://example.test/v1/responses",
48
+ urlParams: [],
49
+ headers: {},
50
+ };
51
+ const httpContext = (status, body) => ({
52
+ request,
53
+ response: { status, headers: {} },
54
+ body,
55
+ });
56
+ /** Mirrors `buildErrorDescription` in `@effect/ai-openai` for a 400. */
57
+ const contextDescription = (message, code) => `${message} (POST https://example.test/v1/responses)${code ? ` [code: ${code}]` : ""}`;
58
+ /** Content parts of a message; system messages have none. */
59
+ const parts = (message) => typeof message.content === "string" ? [] : message.content;
60
+ const toolResultText = (message) => {
61
+ const part = parts(message)[0];
62
+ if (message.role !== "tool" || part?.type !== "tool-result") {
63
+ throw new Error(`expected a tool result message, got ${message.role}`);
64
+ }
65
+ return part.result;
66
+ };
67
+ const promptText = (prompt) => JSON.stringify(prompt.content);
68
+ // -----------------------------------------------------------------------------
69
+ // capOutput
70
+ // -----------------------------------------------------------------------------
71
+ describe("Compaction.capOutput", () => {
72
+ it("returns short output unchanged", () => {
73
+ const result = Compaction.capOutput("hello world");
74
+ assert.strictEqual(result.output, "hello world");
75
+ assert.isFalse(result.capped);
76
+ assert.strictEqual(result.charsBefore, 11);
77
+ assert.strictEqual(result.charsAfter, 11);
78
+ });
79
+ it("returns output exactly at the cap unchanged", () => {
80
+ const input = "x".repeat(Compaction.executeOutputCapChars);
81
+ const result = Compaction.capOutput(input);
82
+ assert.strictEqual(result.output, input);
83
+ assert.isFalse(result.capped);
84
+ });
85
+ it("caps output over the limit keeping head and tail with a marker", () => {
86
+ const head = "HEAD-" + filler("alpha", 30_000);
87
+ const tail = filler("omega", 30_000) + "-TAIL";
88
+ const input = head + tail;
89
+ const result = Compaction.capOutput(input);
90
+ assert.isTrue(result.capped);
91
+ assert.strictEqual(result.charsBefore, input.length);
92
+ assert.strictEqual(result.charsAfter, result.output.length);
93
+ // Marker overhead stays small: well under one extra kilobyte.
94
+ assert.isAtMost(result.output.length, Compaction.executeOutputCapChars + 1_000);
95
+ assert.isAtLeast(result.output.length, Compaction.executeOutputCapChars - 1_000);
96
+ assert.isTrue(result.output.startsWith("HEAD-"));
97
+ assert.isTrue(result.output.endsWith("-TAIL"));
98
+ });
99
+ it("marker tells the model how much was dropped and how to narrow the read", () => {
100
+ const input = filler("line", 40_000);
101
+ const result = Compaction.capOutput(input);
102
+ assert.include(result.output, "startLine");
103
+ assert.include(result.output, "endLine");
104
+ assert.include(result.output, String(input.length));
105
+ });
106
+ it("respects a custom cap", () => {
107
+ const input = filler("word", 5_000);
108
+ const result = Compaction.capOutput(input, 1_000);
109
+ assert.isTrue(result.capped);
110
+ assert.isAtMost(result.output.length, 1_000 + 1_000);
111
+ assert.isBelow(result.output.length, input.length);
112
+ });
113
+ });
114
+ // -----------------------------------------------------------------------------
115
+ // Token estimates and threshold
116
+ // -----------------------------------------------------------------------------
117
+ describe("Compaction.estimateTokens", () => {
118
+ it("estimates roughly a quarter of the encoded JSON length", () => {
119
+ const prompt = Prompt.fromMessages([
120
+ user("hi"),
121
+ assistantCall("c1", "ls()"),
122
+ toolResult("c1", filler("file", 40_000)),
123
+ ]);
124
+ const jsonLength = promptText(prompt).length;
125
+ const estimate = Compaction.estimateTokens(prompt);
126
+ assert.isAtLeast(estimate, Math.floor(jsonLength / 4) - 1);
127
+ assert.isAtMost(estimate, Math.ceil(jsonLength / 4) + 1);
128
+ });
129
+ it("message estimates add up to about the prompt estimate", () => {
130
+ const messages = [
131
+ user("hi"),
132
+ assistantCall("c1", "ls()"),
133
+ toolResult("c1", filler("f", 2_000)),
134
+ ];
135
+ const sum = messages.reduce((n, m) => n + Compaction.estimateMessageTokens(m), 0);
136
+ const total = Compaction.estimateTokens(Prompt.fromMessages(messages));
137
+ assert.isAtMost(Math.abs(sum - total), 8);
138
+ });
139
+ });
140
+ describe("Compaction.CompactionConfig", () => {
141
+ it.effect("defaults to a 236k window with a 16k reserve", () => Effect.gen(function* () {
142
+ const config = yield* Compaction.CompactionConfig;
143
+ assert.deepStrictEqual(Compaction.defaultConfig, {
144
+ enabled: true,
145
+ contextWindow: 236_000,
146
+ reserveTokens: 16_000,
147
+ keepRecentTokens: 20_000,
148
+ });
149
+ assert.deepStrictEqual(config, Compaction.defaultConfig);
150
+ }));
151
+ });
152
+ describe("Compaction.shouldCompact", () => {
153
+ const config = {
154
+ ...Compaction.defaultConfig,
155
+ contextWindow: 1_000,
156
+ reserveTokens: 100,
157
+ };
158
+ const small = Prompt.fromMessages([user("hi")]);
159
+ for (const [tokens, expected] of [
160
+ [219_999, false],
161
+ [220_000, false],
162
+ [220_001, true],
163
+ ]) {
164
+ it(`returns ${expected} with default config and ${tokens} reported tokens`, () => {
165
+ assert.strictEqual(Compaction.shouldCompact({
166
+ prompt: small,
167
+ contextTokens: tokens,
168
+ config: Compaction.defaultConfig,
169
+ }), expected);
170
+ });
171
+ it(`returns ${expected} with default config and ${tokens} estimated tokens`, () => {
172
+ const empty = Prompt.fromMessages([user("")]);
173
+ const prompt = Prompt.fromMessages([
174
+ user("x".repeat(tokens * 4 - promptText(empty).length)),
175
+ ]);
176
+ assert.strictEqual(Compaction.estimateTokens(prompt), tokens);
177
+ assert.strictEqual(Compaction.shouldCompact({
178
+ prompt,
179
+ contextTokens: undefined,
180
+ config: Compaction.defaultConfig,
181
+ }), expected);
182
+ });
183
+ }
184
+ it("fires when the last contextTokens exceeds contextWindow - reserveTokens", () => {
185
+ assert.isTrue(Compaction.shouldCompact({ prompt: small, contextTokens: 901, config }));
186
+ });
187
+ it("does not fire at or below the threshold", () => {
188
+ assert.isFalse(Compaction.shouldCompact({ prompt: small, contextTokens: 900, config }));
189
+ assert.isFalse(Compaction.shouldCompact({ prompt: small, contextTokens: 10, config }));
190
+ });
191
+ it("uses the prompt estimate when there is no usage yet", () => {
192
+ const fat = Prompt.fromMessages([user(filler("word", 10_000))]);
193
+ assert.isTrue(Compaction.shouldCompact({
194
+ prompt: fat,
195
+ contextTokens: undefined,
196
+ config,
197
+ }));
198
+ assert.isFalse(Compaction.shouldCompact({
199
+ prompt: small,
200
+ contextTokens: undefined,
201
+ config,
202
+ }));
203
+ });
204
+ it("never fires when disabled", () => {
205
+ assert.isFalse(Compaction.shouldCompact({
206
+ prompt: small,
207
+ contextTokens: 100_000,
208
+ config: { ...config, enabled: false },
209
+ }));
210
+ });
211
+ });
212
+ // -----------------------------------------------------------------------------
213
+ // Overflow detection
214
+ // -----------------------------------------------------------------------------
215
+ describe("Compaction.isContextLengthError", () => {
216
+ it("matches the Codex context window error", () => {
217
+ const error = openAiError(new AiError.InvalidRequestError({
218
+ description: contextDescription("Your input exceeds the context window of this model. Please adjust your input and try again.", "context_length_exceeded"),
219
+ http: httpContext(400, ""),
220
+ }));
221
+ assert.isTrue(Compaction.isContextLengthError(error));
222
+ });
223
+ it("matches the Copilot / OpenAI-compatible maximum context length error", () => {
224
+ const error = openAiError(new AiError.InvalidRequestError({
225
+ description: contextDescription("This model's maximum context length is 128000 tokens. However, your messages resulted in 131072 tokens.", "context_length_exceeded"),
226
+ }));
227
+ assert.isTrue(Compaction.isContextLengthError(error));
228
+ });
229
+ it("matches the context_length_exceeded code even with an unfamiliar message", () => {
230
+ const error = openAiError(new AiError.InvalidRequestError({
231
+ description: contextDescription("Bad request", "context_length_exceeded"),
232
+ metadata: { openai: { errorCode: "context_length_exceeded" } },
233
+ }));
234
+ assert.isTrue(Compaction.isContextLengthError(error));
235
+ });
236
+ it("matches a 413 prompt-too-large error mapped to UnknownError", () => {
237
+ const error = openAiError(new AiError.UnknownError({
238
+ description: "prompt token count of 200000 exceeds the limit of 128000",
239
+ http: httpContext(413, ""),
240
+ }));
241
+ assert.isTrue(Compaction.isContextLengthError(error));
242
+ });
243
+ for (const body of [
244
+ "",
245
+ "<html><body>Request Entity Too Large</body></html>",
246
+ ]) {
247
+ it(`matches a proxy 413 without a parsed description (${body === "" ? "empty" : "HTML"} body)`, () => {
248
+ assert.isTrue(Compaction.isContextLengthError(openAiError(new AiError.UnknownError({ http: httpContext(413, body) }))));
249
+ });
250
+ }
251
+ it("matches flat provider error-code metadata without a context-length description", () => {
252
+ assert.isTrue(Compaction.isContextLengthError(openAiError(new AiError.UnknownError({
253
+ description: "Request rejected",
254
+ http: httpContext(422, ""),
255
+ metadata: { errorCode: "context_length_exceeded" },
256
+ }))));
257
+ });
258
+ it("matches an explicit flat context-length code on an internal provider error", () => {
259
+ assert.isTrue(Compaction.isContextLengthError(openAiError(new AiError.InternalProviderError({
260
+ description: "Request rejected",
261
+ http: httpContext(500, ""),
262
+ metadata: { errorCode: "context_length_exceeded" },
263
+ }))));
264
+ });
265
+ it("matches nested provider metadata without relying on the description", () => {
266
+ assert.isTrue(Compaction.isContextLengthError(openAiError(new AiError.InvalidRequestError({
267
+ metadata: {
268
+ openai: { errorCode: "context_length_exceeded" },
269
+ },
270
+ }))));
271
+ });
272
+ it("does not treat unrelated unknown HTTP errors or error codes as overflow", () => {
273
+ for (const status of [400, 404, 422, 502]) {
274
+ assert.isFalse(Compaction.isContextLengthError(openAiError(new AiError.UnknownError({
275
+ http: httpContext(status, "<html>Request failed</html>"),
276
+ metadata: { errorCode: "invalid_value" },
277
+ }))));
278
+ }
279
+ });
280
+ it("does not match other invalid requests", () => {
281
+ const error = openAiError(new AiError.InvalidRequestError({
282
+ parameter: "temperature",
283
+ description: contextDescription("Invalid value for temperature", "invalid_value"),
284
+ }));
285
+ assert.isFalse(Compaction.isContextLengthError(error));
286
+ });
287
+ it("does not match retryable transport or provider errors", () => {
288
+ assert.isFalse(Compaction.isContextLengthError(openAiError(new AiError.InternalProviderError({ description: "Server error" }))));
289
+ assert.isFalse(Compaction.isContextLengthError(openAiError(new AiError.RateLimitError({}))));
290
+ assert.isFalse(Compaction.isContextLengthError(openAiError(new AiError.NetworkError({
291
+ reason: "TransportError",
292
+ request,
293
+ description: "socket timeout",
294
+ }))));
295
+ });
296
+ });
297
+ // -----------------------------------------------------------------------------
298
+ // Cut points
299
+ // -----------------------------------------------------------------------------
300
+ describe("Compaction.split", () => {
301
+ // Each execute result is ~8k chars => ~2k tokens per tool message.
302
+ const dump = (i) => filler(`dump${i}`, 8_000);
303
+ const conversation = [
304
+ user("first request"),
305
+ assistantCall("c1", "readFile(1)"),
306
+ toolResult("c1", dump(1)),
307
+ assistantCall("c2", "readFile(2)"),
308
+ toolResult("c2", dump(2)),
309
+ assistantCall("c3", "readFile(3)"),
310
+ toolResult("c3", dump(3)),
311
+ ];
312
+ it("returns None when the keep tail is the whole prompt", () => {
313
+ const prompt = Prompt.fromMessages([system, ...conversation]);
314
+ assert.isTrue(Option.isNone(Compaction.split(prompt, 1_000_000)));
315
+ });
316
+ it("returns None for an empty or system-only prompt", () => {
317
+ assert.isTrue(Option.isNone(Compaction.split(Prompt.empty, 10)));
318
+ assert.isTrue(Option.isNone(Compaction.split(Prompt.fromMessages([system]), 10)));
319
+ });
320
+ it("keeps the most recent messages that fit and summarizes the rest", () => {
321
+ const prompt = Prompt.fromMessages([system, ...conversation]);
322
+ // Each pair is ~2.1k tokens: 5k fits the last two pairs but not three.
323
+ const result = Option.getOrThrow(Compaction.split(prompt, 5_000));
324
+ assert.isTrue(Option.isSome(result.system));
325
+ assert.strictEqual(Option.getOrThrow(result.system).role, "system");
326
+ assert.isTrue(Option.isNone(result.previousSummary));
327
+ assert.deepStrictEqual(result.kept.map((m) => m.role), ["assistant", "tool", "assistant", "tool"]);
328
+ assert.deepStrictEqual(result.toSummarize, conversation.slice(0, 3));
329
+ assert.deepStrictEqual(result.kept, conversation.slice(3));
330
+ });
331
+ it("never splits an execute call from its result", () => {
332
+ const prompt = Prompt.fromMessages([system, ...conversation]);
333
+ // Budget fits the last tool result but not its assistant call: the call
334
+ // must be pulled into the kept tail rather than the result orphaned.
335
+ const lastResultTokens = Compaction.estimateMessageTokens(conversation[6]);
336
+ const result = Option.getOrThrow(Compaction.split(prompt, lastResultTokens + 5));
337
+ assert.strictEqual(result.kept[0].role, "assistant");
338
+ const call = parts(result.kept[0]).find((p) => p.type === "tool-call");
339
+ assert.isDefined(call);
340
+ assert.strictEqual(call.id, "c3");
341
+ assert.strictEqual(result.kept.length, 2);
342
+ assert.strictEqual(result.toSummarize.length, 5);
343
+ });
344
+ it("always keeps at least the newest complete unit", () => {
345
+ const prompt = Prompt.fromMessages([system, ...conversation]);
346
+ const result = Option.getOrThrow(Compaction.split(prompt, 1));
347
+ assert.deepStrictEqual(result.kept, conversation.slice(5));
348
+ assert.deepStrictEqual(result.toSummarize, conversation.slice(0, 5));
349
+ });
350
+ it("does not leave a tool message at the head of the kept tail", () => {
351
+ for (const budget of [1, 500, 2_000, 3_000, 5_000, 9_000, 20_000]) {
352
+ const prompt = Prompt.fromMessages([system, ...conversation]);
353
+ const result = Compaction.split(prompt, budget);
354
+ if (Option.isNone(result))
355
+ continue;
356
+ assert.notStrictEqual(result.value.kept[0].role, "tool", `budget ${budget}`);
357
+ assert.strictEqual(result.value.toSummarize.length + result.value.kept.length, conversation.length);
358
+ }
359
+ });
360
+ it("excludes a previous summary message and exposes its text", () => {
361
+ const previous = "Earlier we investigated the build.";
362
+ const prompt = Prompt.fromMessages([
363
+ system,
364
+ user(Compaction.wrapSummary(previous)),
365
+ ...conversation,
366
+ ]);
367
+ const result = Option.getOrThrow(Compaction.split(prompt, 5_000));
368
+ assert.deepStrictEqual(result.previousSummary, Option.some(previous));
369
+ assert.deepStrictEqual(result.toSummarize, conversation.slice(0, 3));
370
+ assert.isFalse(result.toSummarize.some((m) => promptText(Prompt.fromMessages([m])).includes(previous)));
371
+ });
372
+ it("returns None when only the previous summary would be summarized", () => {
373
+ const prompt = Prompt.fromMessages([
374
+ system,
375
+ user(Compaction.wrapSummary("old summary")),
376
+ ...conversation.slice(5),
377
+ ]);
378
+ assert.isTrue(Option.isNone(Compaction.split(prompt, 1_000_000)));
379
+ });
380
+ });
381
+ describe("Compaction.findPreviousSummary", () => {
382
+ it("finds the wrapped summary user message", () => {
383
+ const prompt = Prompt.fromMessages([
384
+ system,
385
+ user(Compaction.wrapSummary("the summary")),
386
+ user("next"),
387
+ ]);
388
+ assert.deepStrictEqual(Compaction.findPreviousSummary(prompt), Option.some("the summary"));
389
+ });
390
+ it("returns None when there is no summary", () => {
391
+ const prompt = Prompt.fromMessages([system, user("plain")]);
392
+ assert.isTrue(Option.isNone(Compaction.findPreviousSummary(prompt)));
393
+ });
394
+ });
395
+ describe("Compaction.trimKept", () => {
396
+ it("returns the tail unchanged when it fits", () => {
397
+ const kept = [
398
+ assistantCall("c1", "ls()", "thinking"),
399
+ toolResult("c1", "ok"),
400
+ ];
401
+ assert.deepStrictEqual(Compaction.trimKept(kept, 10_000), kept);
402
+ });
403
+ it("drops reasoning from the oldest assistant messages first", () => {
404
+ const kept = [
405
+ assistantCall("c1", "ls()", filler("think", 4_000)),
406
+ toolResult("c1", "ok"),
407
+ assistantCall("c2", "ls()", filler("think", 4_000)),
408
+ toolResult("c2", "ok"),
409
+ ];
410
+ // Budget: everything fits once the oldest reasoning block is gone, so
411
+ // exactly one reasoning block must be dropped.
412
+ const budget = Compaction.estimateMessageTokens(assistantCall("c1", "ls()")) +
413
+ Compaction.estimateMessageTokens(kept[1]) +
414
+ Compaction.estimateMessageTokens(kept[2]) +
415
+ Compaction.estimateMessageTokens(kept[3]);
416
+ const trimmed = Compaction.trimKept(kept, budget);
417
+ assert.strictEqual(trimmed.length, 4);
418
+ assert.isFalse(parts(trimmed[0]).some((p) => p.type === "reasoning"), "oldest reasoning dropped");
419
+ assert.isTrue(parts(trimmed[2]).some((p) => p.type === "reasoning"), "newest reasoning kept");
420
+ assert.isTrue(parts(trimmed[0]).some((p) => p.type === "tool-call" && p.id === "c1"));
421
+ assert.isTrue(parts(trimmed[2]).some((p) => p.type === "tool-call" && p.id === "c2"));
422
+ });
423
+ it("stubs oversized execute results in place after reasoning is gone", () => {
424
+ const big = "START-" + filler("result", 60_000) + "-END";
425
+ const kept = [
426
+ assistantCall("c1", "readFile()", filler("think", 2_000)),
427
+ toolResult("c1", big),
428
+ assistantCall("c2", "ls()"),
429
+ toolResult("c2", "small"),
430
+ ];
431
+ const trimmed = Compaction.trimKept(kept, 1_000);
432
+ assert.strictEqual(trimmed.length, 4);
433
+ assert.deepStrictEqual(trimmed.map((m) => m.role), ["assistant", "tool", "assistant", "tool"]);
434
+ assert.isFalse(parts(trimmed[0]).some((p) => p.type === "reasoning"));
435
+ const stubbed = toolResultText(trimmed[1]);
436
+ assert.isBelow(stubbed.length, big.length);
437
+ assert.isAtMost(stubbed.length, Compaction.keptToolResultStubChars + 1_000);
438
+ assert.include(stubbed, "startLine");
439
+ assert.strictEqual(toolResultText(trimmed[3]), "small");
440
+ // Pairing preserved: ids unchanged and in order.
441
+ const ids = trimmed.flatMap((m) => parts(m).flatMap((p) => p.type === "tool-call" || p.type === "tool-result" ? [p.id] : []));
442
+ assert.deepStrictEqual(ids, ["c1", "c1", "c2", "c2"]);
443
+ });
444
+ it("never removes or reorders messages", () => {
445
+ const kept = [
446
+ user("u"),
447
+ assistantCall("c1", "a()", filler("r", 10_000)),
448
+ toolResult("c1", filler("x", 50_000)),
449
+ assistantText("done"),
450
+ ];
451
+ const trimmed = Compaction.trimKept(kept, 10);
452
+ assert.deepStrictEqual(trimmed.map((m) => m.role), ["user", "assistant", "tool", "assistant"]);
453
+ });
454
+ });
455
+ // -----------------------------------------------------------------------------
456
+ // Prompt rewrite
457
+ // -----------------------------------------------------------------------------
458
+ describe("Compaction.summarizerPrompt", () => {
459
+ const messages = [
460
+ user("Please fix the failing build"),
461
+ assistantCall("c1", "await bash('pnpm test')", "SECRET-REASONING-TEXT"),
462
+ toolResult("c1", "LOG-START " + filler("verbose", 10_000) + " LOG-END"),
463
+ assistantText("The tests fail because of a missing import."),
464
+ ];
465
+ it("renders the conversation for the summarizer without reasoning", () => {
466
+ const prompt = Compaction.summarizerPrompt({
467
+ previousSummary: Option.none(),
468
+ messages,
469
+ });
470
+ const text = promptText(prompt);
471
+ assert.include(text, "Please fix the failing build");
472
+ assert.include(text, "missing import");
473
+ assert.notInclude(text, "SECRET-REASONING-TEXT");
474
+ assert.isFalse(prompt.content.some((m) => parts(m).some((p) => p.type === "reasoning")));
475
+ });
476
+ it("caps execute results to the summarizer limit", () => {
477
+ const prompt = Compaction.summarizerPrompt({
478
+ previousSummary: Option.none(),
479
+ messages,
480
+ });
481
+ const text = promptText(prompt);
482
+ assert.include(text, "LOG-START");
483
+ assert.isBelow(text.length, 10_000);
484
+ assert.include(text, "startLine");
485
+ });
486
+ it("folds in the previous summary", () => {
487
+ const prompt = Compaction.summarizerPrompt({
488
+ previousSummary: Option.some("PREVIOUS-SUMMARY-BODY"),
489
+ messages,
490
+ });
491
+ assert.include(promptText(prompt), "PREVIOUS-SUMMARY-BODY");
492
+ });
493
+ it("does not carry the agent tools or system prompt", () => {
494
+ const prompt = Compaction.summarizerPrompt({
495
+ previousSummary: Option.none(),
496
+ messages,
497
+ });
498
+ assert.isFalse(prompt.content.some((m) => m.role === "tool"));
499
+ assert.isTrue(prompt.content.some((m) => m.role === "user"));
500
+ });
501
+ });
502
+ describe("Compaction.wrapSummary", () => {
503
+ it("wraps in the compaction-summary tags", () => {
504
+ const wrapped = Compaction.wrapSummary("body");
505
+ assert.isTrue(wrapped.startsWith(Compaction.summaryOpenTag));
506
+ assert.isTrue(wrapped.endsWith(Compaction.summaryCloseTag));
507
+ assert.include(wrapped, "body");
508
+ });
509
+ });
510
+ describe("Compaction.rewrite", () => {
511
+ const kept = [
512
+ assistantCall("c9", "ls()"),
513
+ toolResult("c9", "files"),
514
+ user("what next?"),
515
+ ];
516
+ it("produces system + summary user message + kept tail", () => {
517
+ const prompt = Compaction.rewrite({
518
+ system: Option.some(system),
519
+ summary: "We did things.",
520
+ kept,
521
+ });
522
+ assert.strictEqual(prompt.content.length, 2 + kept.length);
523
+ assert.strictEqual(prompt.content[0], system);
524
+ const summary = prompt.content[1];
525
+ assert.strictEqual(summary.role, "user");
526
+ assert.strictEqual(parts(summary).length, 1);
527
+ const part = parts(summary)[0];
528
+ assert.strictEqual(part.type, "text");
529
+ assert.strictEqual(part.text, Compaction.wrapSummary("We did things."));
530
+ assert.deepStrictEqual(prompt.content.slice(2), kept);
531
+ });
532
+ it("omits the system message when there is none", () => {
533
+ const prompt = Compaction.rewrite({
534
+ system: Option.none(),
535
+ summary: "s",
536
+ kept,
537
+ });
538
+ assert.strictEqual(prompt.content[0].role, "user");
539
+ assert.strictEqual(prompt.content.length, 1 + kept.length);
540
+ });
541
+ it("is discoverable by the next compaction", () => {
542
+ const prompt = Compaction.rewrite({
543
+ system: Option.some(system),
544
+ summary: "again",
545
+ kept,
546
+ });
547
+ assert.deepStrictEqual(Compaction.findPreviousSummary(prompt), Option.some("again"));
548
+ const next = Option.getOrThrow(Compaction.split(prompt, 1));
549
+ assert.deepStrictEqual(next.previousSummary, Option.some("again"));
550
+ assert.isFalse(next.toSummarize.some((m) => promptText(Prompt.fromMessages([m])).includes("again")));
551
+ });
552
+ it.effect("forces a full prompt on Codex websocket sessions", () => Effect.gen(function* () {
553
+ // Simulate an incremental session: every message so far was sent and
554
+ // tracked against a previous response id.
555
+ const tracker = yield* ResponseIdTracker.make;
556
+ const history = [
557
+ system,
558
+ user("hi"),
559
+ assistantCall("c1", "ls()"),
560
+ toolResult("c1", "ok"),
561
+ assistantText("done"),
562
+ ];
563
+ tracker.markParts(history, "resp_1");
564
+ const nextUser = user("continue");
565
+ const incremental = tracker.prepareUnsafe(Prompt.fromMessages([...history, nextUser]));
566
+ assert.isTrue(Option.isSome(incremental), "sanity: incremental send works before compaction");
567
+ const compacted = Compaction.rewrite({
568
+ system: Option.some(system),
569
+ summary: "we listed files",
570
+ kept: [...history.slice(2), nextUser],
571
+ });
572
+ const prepared = tracker.prepareUnsafe(compacted);
573
+ assert.isTrue(Option.isNone(prepared), "compacted prompt must be sent in full");
574
+ }));
575
+ });
576
+ //# sourceMappingURL=Compaction.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Compaction.test.js","sourceRoot":"","sources":["../src/Compaction.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=CompactionTransport.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompactionTransport.test.d.ts","sourceRoot":"","sources":["../src/CompactionTransport.test.ts"],"names":[],"mappings":""}