@agimon-ai/doompi-autocompact 0.0.1-alpha.79 → 0.0.1-alpha.80
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.
- package/dist/{src/schemas/apiContracts.cjs → apiContracts.cjs} +5 -1
- package/dist/apiContracts.cjs.map +1 -0
- package/dist/{src/schemas/apiContracts.d.mts.map → apiContracts.d.mts.map} +1 -1
- package/dist/{src/schemas/apiContracts.mjs → apiContracts.mjs} +1 -1
- package/dist/apiContracts.mjs.map +1 -0
- package/dist/{src/services/compactionPolicy/index.cjs → compactionPolicy-Cs-Av0Wu.cjs} +168 -24
- package/dist/compactionPolicy-Cs-Av0Wu.cjs.map +1 -0
- package/dist/{src/services/compactionPolicy/index.mjs → compactionPolicy-DA7s42KV.mjs} +34 -3
- package/dist/compactionPolicy-DA7s42KV.mjs.map +1 -0
- package/dist/extensions/pi.cjs +856 -20
- package/dist/extensions/pi.cjs.map +1 -1
- package/dist/extensions/pi.d.mts +1 -1
- package/dist/extensions/pi.d.mts.map +1 -1
- package/dist/extensions/pi.mjs +846 -10
- package/dist/extensions/pi.mjs.map +1 -1
- package/dist/extensions/server.cjs +19 -5
- package/dist/extensions/server.cjs.map +1 -1
- package/dist/extensions/server.d.mts +1 -1
- package/dist/extensions/server.d.mts.map +1 -1
- package/dist/extensions/server.mjs +16 -3
- package/dist/extensions/server.mjs.map +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.d.mts +11 -3
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +1 -1
- package/package.json +13 -13
- package/dist/api-contracts.cjs +0 -7
- package/dist/api-contracts.d.cts +0 -2
- package/dist/api-contracts.d.mts +0 -2
- package/dist/api-contracts.mjs +0 -2
- package/dist/extensions/pi.d.cts +0 -5
- package/dist/extensions/pi.d.cts.map +0 -1
- package/dist/extensions/server.d.cts +0 -5
- package/dist/extensions/server.d.cts.map +0 -1
- package/dist/index.d.cts +0 -3
- package/dist/src/constants/autocompact.cjs +0 -41
- package/dist/src/constants/autocompact.cjs.map +0 -1
- package/dist/src/constants/autocompact.mjs +0 -35
- package/dist/src/constants/autocompact.mjs.map +0 -1
- package/dist/src/constants/runtime.cjs +0 -19
- package/dist/src/constants/runtime.cjs.map +0 -1
- package/dist/src/constants/runtime.mjs +0 -15
- package/dist/src/constants/runtime.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/piRoot.cjs +0 -14
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/piRoot.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/piRoot.mjs +0 -14
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/piRoot.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.cjs +0 -6
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.mjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/context.cli.cjs +0 -6
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/context.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/context.cli.mjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/context.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-before-compact.cli.cjs +0 -6
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-before-compact.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-before-compact.cli.mjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-before-compact.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-compact.cli.cjs +0 -6
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-compact.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-compact.cli.mjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-compact.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.cjs +0 -6
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.mjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-tree.cli.cjs +0 -6
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-tree.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-tree.cli.mjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-tree.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/turn-end.cli.cjs +0 -6
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/turn-end.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/turn-end.cli.mjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/turn-end.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs +0 -7
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs +0 -8
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs +0 -18
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs.map +0 -1
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs +0 -18
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs.map +0 -1
- package/dist/src/schemas/apiContracts.cjs.map +0 -1
- package/dist/src/schemas/apiContracts.d.cts +0 -53
- package/dist/src/schemas/apiContracts.d.cts.map +0 -1
- package/dist/src/schemas/apiContracts.mjs.map +0 -1
- package/dist/src/services/autocompactRuntime/index.cjs +0 -732
- package/dist/src/services/autocompactRuntime/index.cjs.map +0 -1
- package/dist/src/services/autocompactRuntime/index.mjs +0 -729
- package/dist/src/services/autocompactRuntime/index.mjs.map +0 -1
- package/dist/src/services/autocompactTelemetry/index.cjs +0 -43
- package/dist/src/services/autocompactTelemetry/index.cjs.map +0 -1
- package/dist/src/services/autocompactTelemetry/index.mjs +0 -42
- package/dist/src/services/autocompactTelemetry/index.mjs.map +0 -1
- package/dist/src/services/compactionPolicy/index.cjs.map +0 -1
- package/dist/src/services/compactionPolicy/index.d.cts +0 -6
- package/dist/src/services/compactionPolicy/index.d.cts.map +0 -1
- package/dist/src/services/compactionPolicy/index.d.mts +0 -6
- package/dist/src/services/compactionPolicy/index.d.mts.map +0 -1
- package/dist/src/services/compactionPolicy/index.mjs.map +0 -1
- package/dist/src/services/modelOverrides/index.cjs +0 -26
- package/dist/src/services/modelOverrides/index.cjs.map +0 -1
- package/dist/src/services/modelOverrides/index.mjs +0 -26
- package/dist/src/services/modelOverrides/index.mjs.map +0 -1
- package/dist/src/services/summarizationModel/index.cjs +0 -19
- package/dist/src/services/summarizationModel/index.cjs.map +0 -1
- package/dist/src/services/summarizationModel/index.mjs +0 -19
- package/dist/src/services/summarizationModel/index.mjs.map +0 -1
- package/dist/src/types/autocompact.d.cts +0 -7
- package/dist/src/types/autocompact.d.cts.map +0 -1
- package/dist/src/types/autocompact.d.mts +0 -7
- package/dist/src/types/autocompact.d.mts.map +0 -1
- /package/dist/{src/schemas/apiContracts.d.mts → apiContracts.d.mts} +0 -0
|
@@ -1,6 +1,10 @@
|
|
|
1
|
+
Object.defineProperties(exports, {
|
|
2
|
+
__esModule: { value: true },
|
|
3
|
+
[Symbol.toStringTag]: { value: "Module" }
|
|
4
|
+
});
|
|
1
5
|
//#region src/schemas/apiContracts.ts
|
|
2
6
|
/** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */
|
|
3
|
-
const apiContracts = (0, require("@agimon-ai/doompi-core/
|
|
7
|
+
const apiContracts = (0, require("@agimon-ai/doompi-core/apiContracts").defineApiContract)({
|
|
4
8
|
version: 1,
|
|
5
9
|
http: [],
|
|
6
10
|
sockets: [],
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiContracts.cjs","names":["defineApiContract"],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract } from '@agimon-ai/doompi-core/apiContracts';\n\n/** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */\nexport const apiContracts = defineApiContract({ version: 1, http: [], sockets: [], dynamic: [] });\nexport default apiContracts;\n"],"mappings":";;;;;;AAGA,MAAa,gBAAA,gDAAeA,CAAAA,CAAAA,kBAAAA,CAAkB;CAAE,SAAS;CAAG,MAAM,CAAC;CAAG,SAAS,CAAC;CAAG,SAAS,CAAC;AAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiContracts.d.mts","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"apiContracts.d.mts","names":[],"sources":["../src/schemas/apiContracts.ts"],"mappings":";;qBAGa"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defineApiContract } from "@agimon-ai/doompi-core/
|
|
1
|
+
import { defineApiContract } from "@agimon-ai/doompi-core/apiContracts";
|
|
2
2
|
//#region src/schemas/apiContracts.ts
|
|
3
3
|
/** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */
|
|
4
4
|
const apiContracts = defineApiContract({
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiContracts.mjs","names":[],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract } from '@agimon-ai/doompi-core/apiContracts';\n\n/** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */\nexport const apiContracts = defineApiContract({ version: 1, http: [], sockets: [], dynamic: [] });\nexport default apiContracts;\n"],"mappings":";;;AAGA,MAAa,eAAe,kBAAkB;CAAE,SAAS;CAAG,MAAM,CAAC;CAAG,SAAS,CAAC;CAAG,SAAS,CAAC;AAAE,CAAC"}
|
|
@@ -1,5 +1,36 @@
|
|
|
1
|
-
const require_autocompact = require("../../constants/autocompact.cjs");
|
|
2
1
|
let _earendil_works_pi_coding_agent = require("@earendil-works/pi-coding-agent");
|
|
2
|
+
//#region src/constants/autocompact.ts
|
|
3
|
+
const STATE_CUSTOM_TYPE = "doom-autocompact-state";
|
|
4
|
+
const CHECKPOINT_MESSAGE_TYPE = "doom-autocompact-checkpoint";
|
|
5
|
+
const CONTEXT_MESSAGE_TYPE = "doom-autocompact-context";
|
|
6
|
+
const RESUME_MESSAGE_TYPE = "doom-autocompact-resume";
|
|
7
|
+
const RUNTIME_STATE_MESSAGE_TYPE = "doom-autocompact-runtime-state";
|
|
8
|
+
const COMPACTION_THRESHOLDS = {
|
|
9
|
+
1: {
|
|
10
|
+
ratio: .5,
|
|
11
|
+
capTokens: 2e5
|
|
12
|
+
},
|
|
13
|
+
2: {
|
|
14
|
+
ratio: .75,
|
|
15
|
+
capTokens: 5e5
|
|
16
|
+
},
|
|
17
|
+
3: {
|
|
18
|
+
ratio: .95,
|
|
19
|
+
capTokens: 8e5
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
const CHECKPOINT_HEADINGS = [
|
|
23
|
+
"## Goal",
|
|
24
|
+
"## Constraints & Preferences",
|
|
25
|
+
"## Progress",
|
|
26
|
+
"### Done",
|
|
27
|
+
"### In Progress",
|
|
28
|
+
"### Blocked",
|
|
29
|
+
"## Key Decisions",
|
|
30
|
+
"## Next Steps",
|
|
31
|
+
"## Critical Context"
|
|
32
|
+
];
|
|
33
|
+
//#endregion
|
|
3
34
|
//#region src/services/compactionPolicy/index.ts
|
|
4
35
|
const SHOULD_COMPACT_PATTERN = /<shouldCompact>\s*(true|false)\s*<\/shouldCompact>/i;
|
|
5
36
|
const FILE_SECTION_PATTERN = /\n*<(?:read-files|modified-files)>[\s\S]*?<\/(?:read-files|modified-files)>/g;
|
|
@@ -69,14 +100,14 @@ function compactionRatios(configured = {}) {
|
|
|
69
100
|
2,
|
|
70
101
|
3
|
|
71
102
|
]) {
|
|
72
|
-
const ratio = Math.max(configured[pass] ??
|
|
103
|
+
const ratio = Math.max(configured[pass] ?? COMPACTION_THRESHOLDS[pass].ratio, previous);
|
|
73
104
|
ratios[pass] = ratio;
|
|
74
105
|
previous = ratio;
|
|
75
106
|
}
|
|
76
107
|
return ratios;
|
|
77
108
|
}
|
|
78
109
|
function thresholdTokens(pass, contextWindow, baselineTokens = 0, configured = {}) {
|
|
79
|
-
const threshold =
|
|
110
|
+
const threshold = COMPACTION_THRESHOLDS[pass];
|
|
80
111
|
const ratio = compactionRatios(configured)[pass];
|
|
81
112
|
const baseline = Math.max(0, Math.min(baselineTokens, contextWindow));
|
|
82
113
|
const remaining = contextWindow - baseline;
|
|
@@ -246,7 +277,7 @@ function parseCheckpointDecision(response) {
|
|
|
246
277
|
};
|
|
247
278
|
}
|
|
248
279
|
function isStructuredCheckpoint(summary) {
|
|
249
|
-
return
|
|
280
|
+
return CHECKPOINT_HEADINGS.every((heading) => summary.includes(heading));
|
|
250
281
|
}
|
|
251
282
|
function createRequestId(sessionId, cycle, pass, leafId) {
|
|
252
283
|
return `${sessionId}:${cycle}:${pass}:${leafId ?? "root"}`;
|
|
@@ -291,24 +322,137 @@ function withCanonicalFileSections(summary, details) {
|
|
|
291
322
|
return sections.length > 0 ? `${normalized}\n\n${sections.join("\n\n")}` : normalized;
|
|
292
323
|
}
|
|
293
324
|
//#endregion
|
|
294
|
-
exports
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
exports
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
exports
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
exports
|
|
325
|
+
Object.defineProperty(exports, "CHECKPOINT_MESSAGE_TYPE", {
|
|
326
|
+
enumerable: true,
|
|
327
|
+
get: function() {
|
|
328
|
+
return CHECKPOINT_MESSAGE_TYPE;
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
Object.defineProperty(exports, "CONTEXT_MESSAGE_TYPE", {
|
|
332
|
+
enumerable: true,
|
|
333
|
+
get: function() {
|
|
334
|
+
return CONTEXT_MESSAGE_TYPE;
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
Object.defineProperty(exports, "RESUME_MESSAGE_TYPE", {
|
|
338
|
+
enumerable: true,
|
|
339
|
+
get: function() {
|
|
340
|
+
return RESUME_MESSAGE_TYPE;
|
|
341
|
+
}
|
|
342
|
+
});
|
|
343
|
+
Object.defineProperty(exports, "RUNTIME_STATE_MESSAGE_TYPE", {
|
|
344
|
+
enumerable: true,
|
|
345
|
+
get: function() {
|
|
346
|
+
return RUNTIME_STATE_MESSAGE_TYPE;
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
Object.defineProperty(exports, "STATE_CUSTOM_TYPE", {
|
|
350
|
+
enumerable: true,
|
|
351
|
+
get: function() {
|
|
352
|
+
return STATE_CUSTOM_TYPE;
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
Object.defineProperty(exports, "baselineUsageIsSettled", {
|
|
356
|
+
enumerable: true,
|
|
357
|
+
get: function() {
|
|
358
|
+
return baselineUsageIsSettled;
|
|
359
|
+
}
|
|
360
|
+
});
|
|
361
|
+
Object.defineProperty(exports, "checkpointRequestDetails", {
|
|
362
|
+
enumerable: true,
|
|
363
|
+
get: function() {
|
|
364
|
+
return checkpointRequestDetails;
|
|
365
|
+
}
|
|
366
|
+
});
|
|
367
|
+
Object.defineProperty(exports, "checkpointSummaryFromEntry", {
|
|
368
|
+
enumerable: true,
|
|
369
|
+
get: function() {
|
|
370
|
+
return checkpointSummaryFromEntry;
|
|
371
|
+
}
|
|
372
|
+
});
|
|
373
|
+
Object.defineProperty(exports, "createInitialState", {
|
|
374
|
+
enumerable: true,
|
|
375
|
+
get: function() {
|
|
376
|
+
return createInitialState;
|
|
377
|
+
}
|
|
378
|
+
});
|
|
379
|
+
Object.defineProperty(exports, "createRequestId", {
|
|
380
|
+
enumerable: true,
|
|
381
|
+
get: function() {
|
|
382
|
+
return createRequestId;
|
|
383
|
+
}
|
|
384
|
+
});
|
|
385
|
+
Object.defineProperty(exports, "effectiveThresholds", {
|
|
386
|
+
enumerable: true,
|
|
387
|
+
get: function() {
|
|
388
|
+
return effectiveThresholds;
|
|
389
|
+
}
|
|
390
|
+
});
|
|
391
|
+
Object.defineProperty(exports, "fileDetailsFromUnknown", {
|
|
392
|
+
enumerable: true,
|
|
393
|
+
get: function() {
|
|
394
|
+
return fileDetailsFromUnknown;
|
|
395
|
+
}
|
|
396
|
+
});
|
|
397
|
+
Object.defineProperty(exports, "fileOperationsFromMessages", {
|
|
398
|
+
enumerable: true,
|
|
399
|
+
get: function() {
|
|
400
|
+
return fileOperationsFromMessages;
|
|
401
|
+
}
|
|
402
|
+
});
|
|
403
|
+
Object.defineProperty(exports, "isStructuredCheckpoint", {
|
|
404
|
+
enumerable: true,
|
|
405
|
+
get: function() {
|
|
406
|
+
return isStructuredCheckpoint;
|
|
407
|
+
}
|
|
408
|
+
});
|
|
409
|
+
Object.defineProperty(exports, "latestCheckpointArtifactEntry", {
|
|
410
|
+
enumerable: true,
|
|
411
|
+
get: function() {
|
|
412
|
+
return latestCheckpointArtifactEntry;
|
|
413
|
+
}
|
|
414
|
+
});
|
|
415
|
+
Object.defineProperty(exports, "mergeFileDetails", {
|
|
416
|
+
enumerable: true,
|
|
417
|
+
get: function() {
|
|
418
|
+
return mergeFileDetails;
|
|
419
|
+
}
|
|
420
|
+
});
|
|
421
|
+
Object.defineProperty(exports, "parseCheckpointDecision", {
|
|
422
|
+
enumerable: true,
|
|
423
|
+
get: function() {
|
|
424
|
+
return parseCheckpointDecision;
|
|
425
|
+
}
|
|
426
|
+
});
|
|
427
|
+
Object.defineProperty(exports, "parseState", {
|
|
428
|
+
enumerable: true,
|
|
429
|
+
get: function() {
|
|
430
|
+
return parseState;
|
|
431
|
+
}
|
|
432
|
+
});
|
|
433
|
+
Object.defineProperty(exports, "projectContextMessages", {
|
|
434
|
+
enumerable: true,
|
|
435
|
+
get: function() {
|
|
436
|
+
return projectContextMessages;
|
|
437
|
+
}
|
|
438
|
+
});
|
|
439
|
+
Object.defineProperty(exports, "retainedMessagesAfterSnapshot", {
|
|
440
|
+
enumerable: true,
|
|
441
|
+
get: function() {
|
|
442
|
+
return retainedMessagesAfterSnapshot;
|
|
443
|
+
}
|
|
444
|
+
});
|
|
445
|
+
Object.defineProperty(exports, "thresholdTokens", {
|
|
446
|
+
enumerable: true,
|
|
447
|
+
get: function() {
|
|
448
|
+
return thresholdTokens;
|
|
449
|
+
}
|
|
450
|
+
});
|
|
451
|
+
Object.defineProperty(exports, "withCanonicalFileSections", {
|
|
452
|
+
enumerable: true,
|
|
453
|
+
get: function() {
|
|
454
|
+
return withCanonicalFileSections;
|
|
455
|
+
}
|
|
456
|
+
});
|
|
313
457
|
|
|
314
|
-
//# sourceMappingURL=
|
|
458
|
+
//# sourceMappingURL=compactionPolicy-Cs-Av0Wu.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compactionPolicy-Cs-Av0Wu.cjs","names":["DEFAULT_COMPACTION_SETTINGS","sessionEntryToContextMessages"],"sources":["../src/constants/autocompact.ts","../src/services/compactionPolicy/index.ts"],"sourcesContent":["export const STATE_CUSTOM_TYPE = 'doom-autocompact-state';\nexport const CHECKPOINT_MESSAGE_TYPE = 'doom-autocompact-checkpoint';\nexport const CONTEXT_MESSAGE_TYPE = 'doom-autocompact-context';\nexport const RESUME_MESSAGE_TYPE = 'doom-autocompact-resume';\nexport const RUNTIME_STATE_MESSAGE_TYPE = 'doom-autocompact-runtime-state';\nexport const STATE_VERSION = 2;\n/** Retrying a malformed checkpoint costs a full summarization call per turn, so a pass that\n * keeps failing is abandoned instead of retried for the rest of the session. */\nexport const MAX_INVALID_CHECKPOINT_ATTEMPTS = 3;\n\nexport const COMPACTION_THRESHOLDS = {\n 1: { ratio: 0.5, capTokens: 200_000 },\n 2: { ratio: 0.75, capTokens: 500_000 },\n 3: { ratio: 0.95, capTokens: 800_000 },\n} as const;\n\nexport const CHECKPOINT_HEADINGS = [\n '## Goal',\n '## Constraints & Preferences',\n '## Progress',\n '### Done',\n '### In Progress',\n '### Blocked',\n '## Key Decisions',\n '## Next Steps',\n '## Critical Context',\n] as const;\n","import {\n DEFAULT_COMPACTION_SETTINGS,\n type FileOperations,\n type SessionEntry,\n sessionEntryToContextMessages,\n} from '@earendil-works/pi-coding-agent';\n\nimport {\n CHECKPOINT_HEADINGS,\n CHECKPOINT_MESSAGE_TYPE,\n COMPACTION_THRESHOLDS,\n CONTEXT_MESSAGE_TYPE,\n STATE_VERSION,\n} from '../../constants/autocompact';\nimport type {\n AutocompactContextDetails,\n AutocompactFileDetails,\n AutocompactRatioOverrides,\n AutocompactTokenOverrides,\n AutocompactMessage,\n AutocompactPass,\n AutocompactState,\n CheckpointDecision,\n CheckpointRequestDetails,\n ContextProjection,\n} from '../../types/autocompact';\n\nconst SHOULD_COMPACT_PATTERN = /<shouldCompact>\\s*(true|false)\\s*<\\/shouldCompact>/i;\nconst FILE_SECTION_PATTERN = /\\n*<(?:read-files|modified-files)>[\\s\\S]*?<\\/(?:read-files|modified-files)>/g;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === 'string');\n}\n\nfunction isPass(value: unknown): value is AutocompactPass {\n return value === 1 || value === 2 || value === 3;\n}\n\nfunction assistantText(entry: SessionEntry): string | undefined {\n if (entry.type !== 'message' || entry.message.role !== 'assistant') return undefined;\n const text = entry.message.content\n .filter((block) => block.type === 'text')\n .map((block) => block.text)\n .join('\\n')\n .trim();\n return text || undefined;\n}\n\nfunction isAutocompactMessage(value: unknown): value is AutocompactMessage {\n return isRecord(value) && typeof value.role === 'string';\n}\n\nexport function contextDetailsFromUnknown(value: unknown): AutocompactContextDetails | undefined {\n if (!isRecord(value) || !isStringArray(value.readFiles) || !isStringArray(value.modifiedFiles)) return undefined;\n if (!Array.isArray(value.retainedMessages) || !value.retainedMessages.every(isAutocompactMessage)) return undefined;\n if (!isRecord(value.doomAutocompact)) return undefined;\n const marker = value.doomAutocompact;\n if (\n marker.version !== STATE_VERSION ||\n (marker.pass !== 2 && marker.pass !== 3) ||\n typeof marker.cycle !== 'number' ||\n typeof marker.requestId !== 'string' ||\n typeof marker.snapshotLeafId !== 'string' ||\n typeof marker.tokensBefore !== 'number'\n )\n return undefined;\n return {\n readFiles: [...value.readFiles],\n modifiedFiles: [...value.modifiedFiles],\n retainedMessages: [...value.retainedMessages],\n doomAutocompact: {\n version: STATE_VERSION,\n cycle: marker.cycle,\n pass: marker.pass,\n requestId: marker.requestId,\n snapshotLeafId: marker.snapshotLeafId,\n tokensBefore: marker.tokensBefore,\n },\n };\n}\n\nexport function createInitialState(): AutocompactState {\n return {\n version: STATE_VERSION,\n cycle: 1,\n pass: 1,\n phase: 'waiting',\n checkpointQueue: [],\n exhaustedPasses: [],\n invalidAttempts: 0,\n baselineTokens: 0,\n baselinePending: false,\n readFiles: [],\n modifiedFiles: [],\n };\n}\n\n/**\n * The ratios each pass fires at, with configured values folded in.\n *\n * The ladder only works if it climbs, so a configured pass never sits below the\n * one before it: a file that says pass 2 fires earlier than pass 1 gets pass 1's\n * ratio for pass 2 rather than a pass that can never contribute.\n */\nexport function compactionRatios(configured: AutocompactRatioOverrides = {}): Record<AutocompactPass, number> {\n let previous = 0;\n const ratios = {} as Record<AutocompactPass, number>;\n for (const pass of [1, 2, 3] as const) {\n const ratio = Math.max(configured[pass] ?? COMPACTION_THRESHOLDS[pass].ratio, previous);\n ratios[pass] = ratio;\n previous = ratio;\n }\n return ratios;\n}\n\nexport function thresholdTokens(\n pass: AutocompactPass,\n contextWindow: number,\n baselineTokens = 0,\n configured: AutocompactRatioOverrides = {},\n): number {\n const threshold = COMPACTION_THRESHOLDS[pass];\n const ratio = compactionRatios(configured)[pass];\n const baseline = Math.max(0, Math.min(baselineTokens, contextWindow));\n const remaining = contextWindow - baseline;\n const staged = baseline + Math.min(Math.floor(remaining * ratio), threshold.capTokens);\n // Pi compacts natively above `contextWindow - reserveTokens`. A staged threshold above that\n // point can never fire, so the ladder would silently degrade into native compaction: on a\n // 200k window the raw pass 3 ratio lands at 190_000, while Pi already compacted at 183_616.\n const nativeTrigger = contextWindow - DEFAULT_COMPACTION_SETTINGS.reserveTokens;\n return nativeTrigger > baseline ? Math.min(staged, nativeTrigger) : staged;\n}\n\n/**\n * Where every pass fires, with a matching model's absolute token checkpoints folded in.\n *\n * A configured token count replaces the ratio only when it fires earlier, so an\n * override can bring a checkpoint forward on a very large window without ever\n * pushing one past the point Pi compacts natively.\n *\n * Two rules keep the ladder usable. A token count at or below the baseline is\n * ignored, because a compaction that lands above it would otherwise satisfy that\n * pass the moment the next cycle opens and re-fire it every turn. And a pass never\n * sits below the one before it, for the same reason {@link compactionRatios}\n * climbs: `evaluateUsage` skips any pass below the one already reached, so a later\n * pass that fires first does not merely reorder the ladder, it locks the earlier\n * passes out of the cycle and forces compaction with no summary ever written.\n */\nexport function effectiveThresholds(\n contextWindow: number,\n baselineTokens = 0,\n configured: AutocompactRatioOverrides = {},\n tokenOverrides: AutocompactTokenOverrides = {},\n): Record<AutocompactPass, number> {\n let previous = 0;\n const thresholds = {} as Record<AutocompactPass, number>;\n for (const pass of [1, 2, 3] as const) {\n const ratioTokens = thresholdTokens(pass, contextWindow, baselineTokens, configured);\n const absolute = tokenOverrides[pass];\n const staged = absolute !== undefined && absolute > baselineTokens ? Math.min(ratioTokens, absolute) : ratioTokens;\n thresholds[pass] = Math.max(staged, previous);\n previous = thresholds[pass];\n }\n return thresholds;\n}\nexport function latestCheckpointArtifactEntry(branchEntries: SessionEntry[]): SessionEntry | undefined {\n return branchEntries.findLast(\n (entry) =>\n entry.type === 'compaction' ||\n // Staged checkpoints are plain entries so they stay out of the agent's LLM context.\n (entry.type === 'custom' && entry.customType === CHECKPOINT_MESSAGE_TYPE) ||\n // Legacy sessions staged checkpoints as custom messages; committed markers still are.\n (entry.type === 'custom_message' &&\n (entry.customType === CHECKPOINT_MESSAGE_TYPE || entry.customType === CONTEXT_MESSAGE_TYPE)),\n );\n}\n\nexport function baselineUsageIsSettled(branchEntries: SessionEntry[]): boolean {\n const boundaryIndex = branchEntries.findLastIndex(\n (entry) =>\n entry.type === 'compaction' || (entry.type === 'custom_message' && entry.customType === CONTEXT_MESSAGE_TYPE),\n );\n return branchEntries.slice(boundaryIndex + 1).some((entry) => {\n if (entry.type !== 'message' || entry.message.role !== 'assistant') return false;\n const { stopReason, usage } = entry.message;\n if (stopReason === 'aborted' || stopReason === 'error' || !usage) return false;\n return (usage.totalTokens || usage.input + usage.output + usage.cacheRead + usage.cacheWrite) > 0;\n });\n}\n\nexport function retainedMessagesAfterSnapshot(\n branchEntries: SessionEntry[],\n snapshotLeafId: string,\n): AutocompactMessage[] {\n const snapshotIndex = branchEntries.findIndex((entry) => entry.id === snapshotLeafId);\n if (snapshotIndex === -1) return [];\n return branchEntries\n .slice(snapshotIndex + 1)\n .filter((entry) => entry.type !== 'custom_message' || entry.customType !== CHECKPOINT_MESSAGE_TYPE)\n .flatMap((entry) => sessionEntryToContextMessages(entry));\n}\n\nexport function projectContextMessages(\n messages: AutocompactMessage[],\n branchEntries: SessionEntry[],\n): ContextProjection {\n const nativeCompactionIndex = branchEntries.findLastIndex((entry) => entry.type === 'compaction');\n const markerEntry = branchEntries\n .slice(nativeCompactionIndex + 1)\n .findLast((entry) => entry.type === 'custom_message' && entry.customType === CONTEXT_MESSAGE_TYPE);\n if (!markerEntry || markerEntry.type !== 'custom_message') {\n return { messages, retainedMessageCount: 0 };\n }\n\n const details = contextDetailsFromUnknown(markerEntry.details);\n const summary = checkpointSummaryFromEntry(markerEntry);\n if (!details || !summary) return { messages, invalidMarker: true, retainedMessageCount: 0 };\n\n const markerMessageIndex = messages.findLastIndex(\n (message) =>\n message.role === 'custom' &&\n message.customType === CONTEXT_MESSAGE_TYPE &&\n contextDetailsFromUnknown(message.details)?.doomAutocompact.requestId === details.doomAutocompact.requestId,\n );\n if (markerMessageIndex === -1) return { messages, invalidMarker: true, retainedMessageCount: 0 };\n\n const summaryMessage: AutocompactMessage = {\n role: 'compactionSummary',\n summary,\n tokensBefore: details.doomAutocompact.tokensBefore,\n timestamp: messages[markerMessageIndex]?.timestamp ?? Date.now(),\n };\n return {\n messages: [summaryMessage, ...details.retainedMessages, ...messages.slice(markerMessageIndex + 1)],\n marker: details.doomAutocompact,\n retainedMessageCount: details.retainedMessages.length,\n };\n}\n\nexport function fileOperationsFromMessages(messages: AutocompactMessage[]): FileOperations {\n const fileOps: FileOperations = { read: new Set(), written: new Set(), edited: new Set() };\n for (const message of messages) {\n if (message.role !== 'assistant') continue;\n for (const block of message.content) {\n if (block.type !== 'toolCall') continue;\n const path = typeof block.arguments.path === 'string' ? block.arguments.path : undefined;\n if (!path) continue;\n if (block.name === 'read') fileOps.read.add(path);\n else if (block.name === 'write') fileOps.written.add(path);\n else if (block.name === 'edit') fileOps.edited.add(path);\n }\n }\n return fileOps;\n}\n\nexport function parseState(value: unknown): AutocompactState | undefined {\n if (!isRecord(value)) return undefined;\n if (value.version !== STATE_VERSION || typeof value.cycle !== 'number' || !isPass(value.pass)) return undefined;\n if (\n value.phase !== 'waiting' &&\n value.phase !== 'checkpoint_pending' &&\n value.phase !== 'checkpoint_ready' &&\n value.phase !== 'compacting'\n )\n return undefined;\n const baselineTokens = value.baselineTokens ?? 0;\n if (typeof baselineTokens !== 'number' || baselineTokens < 0) return undefined;\n const baselinePending = value.baselinePending ?? false;\n if (typeof baselinePending !== 'boolean') return undefined;\n const checkpointQueue = value.checkpointQueue ?? [];\n if (\n !Array.isArray(checkpointQueue) ||\n !checkpointQueue.every(isPass) ||\n checkpointQueue.some((pass, index) => index > 0 && pass <= checkpointQueue[index - 1]!)\n )\n return undefined;\n // Sessions persisted before bounded retry landed simply have no attempt history to restore.\n const exhaustedPasses = value.exhaustedPasses ?? [];\n if (!Array.isArray(exhaustedPasses) || !exhaustedPasses.every(isPass)) return undefined;\n const invalidAttempts = value.invalidAttempts ?? 0;\n if (typeof invalidAttempts !== 'number' || invalidAttempts < 0) return undefined;\n if (!isStringArray(value.readFiles) || !isStringArray(value.modifiedFiles)) return undefined;\n if (value.requestId !== undefined && typeof value.requestId !== 'string') return undefined;\n if (value.compactionPass !== undefined && value.compactionPass !== 2 && value.compactionPass !== 3) return undefined;\n if ('latestCheckpointEntryId' in value) return undefined;\n if (value.latestCheckpointSnapshotLeafId !== undefined && typeof value.latestCheckpointSnapshotLeafId !== 'string')\n return undefined;\n if (value.lastAttemptLeafId !== undefined && typeof value.lastAttemptLeafId !== 'string') return undefined;\n if (value.snapshotLeafId !== undefined && typeof value.snapshotLeafId !== 'string') return undefined;\n if (value.snapshotTokens !== undefined && (typeof value.snapshotTokens !== 'number' || value.snapshotTokens < 0))\n return undefined;\n if (value.pendingCheckpoint !== undefined && typeof value.pendingCheckpoint !== 'string') return undefined;\n\n return {\n version: STATE_VERSION,\n cycle: value.cycle,\n pass: value.pass,\n phase: value.phase,\n checkpointQueue: [...checkpointQueue],\n exhaustedPasses: [...exhaustedPasses],\n invalidAttempts,\n baselineTokens,\n baselinePending,\n readFiles: [...value.readFiles],\n modifiedFiles: [...value.modifiedFiles],\n ...(value.requestId ? { requestId: value.requestId } : {}),\n ...(value.compactionPass ? { compactionPass: value.compactionPass } : {}),\n ...(value.latestCheckpointSnapshotLeafId\n ? { latestCheckpointSnapshotLeafId: value.latestCheckpointSnapshotLeafId }\n : {}),\n ...(value.lastAttemptLeafId ? { lastAttemptLeafId: value.lastAttemptLeafId } : {}),\n ...(value.snapshotLeafId ? { snapshotLeafId: value.snapshotLeafId } : {}),\n ...(value.snapshotTokens !== undefined ? { snapshotTokens: value.snapshotTokens } : {}),\n ...(value.pendingCheckpoint ? { pendingCheckpoint: value.pendingCheckpoint } : {}),\n };\n}\n\nexport function checkpointSummaryFromEntry(entry: SessionEntry | undefined): string | undefined {\n if (!entry) return undefined;\n if (entry.type === 'compaction') return entry.summary.trim() || undefined;\n if (entry.type === 'custom') {\n return isRecord(entry.data) && typeof entry.data.summary === 'string'\n ? entry.data.summary.trim() || undefined\n : undefined;\n }\n if (entry.type === 'custom_message') {\n const content =\n typeof entry.content === 'string'\n ? entry.content\n : entry.content\n .filter((block) => block.type === 'text')\n .map((block) => block.text)\n .join('\\n');\n return content.trim() || undefined;\n }\n return assistantText(entry);\n}\n\nexport function parseCheckpointDecision(response: string): CheckpointDecision {\n const match = response.match(SHOULD_COMPACT_PATTERN);\n const summary = response.replace(SHOULD_COMPACT_PATTERN, '').trim();\n if (!match) return { summary };\n return { summary, shouldCompact: match[1]?.toLowerCase() === 'true' };\n}\n\nexport function isStructuredCheckpoint(summary: string): boolean {\n return CHECKPOINT_HEADINGS.every((heading) => summary.includes(heading));\n}\n\nexport function createRequestId(\n sessionId: string,\n cycle: number,\n pass: AutocompactPass,\n leafId: string | null,\n): string {\n return `${sessionId}:${cycle}:${pass}:${leafId ?? 'root'}`;\n}\n\nexport function checkpointRequestDetails(\n cycle: number,\n pass: AutocompactPass,\n requestId: string,\n): CheckpointRequestDetails {\n return { version: STATE_VERSION, cycle, pass, requestId };\n}\n\nexport function mergeFileDetails(\n current: AutocompactFileDetails,\n fileOps?: FileOperations,\n additional?: AutocompactFileDetails,\n): AutocompactFileDetails {\n const modified = new Set([\n ...current.modifiedFiles,\n ...(additional?.modifiedFiles ?? []),\n ...(fileOps ? [...fileOps.edited, ...fileOps.written] : []),\n ]);\n const read = new Set([...current.readFiles, ...(additional?.readFiles ?? []), ...(fileOps ? [...fileOps.read] : [])]);\n for (const path of modified) read.delete(path);\n return { readFiles: [...read].sort(), modifiedFiles: [...modified].sort() };\n}\n\nexport function fileDetailsFromUnknown(value: unknown): AutocompactFileDetails | undefined {\n if (!isRecord(value) || !isStringArray(value.readFiles) || !isStringArray(value.modifiedFiles)) return undefined;\n return { readFiles: value.readFiles, modifiedFiles: value.modifiedFiles };\n}\n\nexport function withCanonicalFileSections(summary: string, details: AutocompactFileDetails): string {\n const sections: string[] = [];\n if (details.readFiles.length > 0) sections.push(`<read-files>\\n${details.readFiles.join('\\n')}\\n</read-files>`);\n if (details.modifiedFiles.length > 0) {\n sections.push(`<modified-files>\\n${details.modifiedFiles.join('\\n')}\\n</modified-files>`);\n }\n const normalized = summary.replace(FILE_SECTION_PATTERN, '').trim();\n return sections.length > 0 ? `${normalized}\\n\\n${sections.join('\\n\\n')}` : normalized;\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,36 @@
|
|
|
1
|
-
import { CHECKPOINT_HEADINGS, COMPACTION_THRESHOLDS } from "../../constants/autocompact.mjs";
|
|
2
1
|
import { DEFAULT_COMPACTION_SETTINGS, sessionEntryToContextMessages } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
//#region src/constants/autocompact.ts
|
|
3
|
+
const STATE_CUSTOM_TYPE = "doom-autocompact-state";
|
|
4
|
+
const CHECKPOINT_MESSAGE_TYPE = "doom-autocompact-checkpoint";
|
|
5
|
+
const CONTEXT_MESSAGE_TYPE = "doom-autocompact-context";
|
|
6
|
+
const RESUME_MESSAGE_TYPE = "doom-autocompact-resume";
|
|
7
|
+
const RUNTIME_STATE_MESSAGE_TYPE = "doom-autocompact-runtime-state";
|
|
8
|
+
const COMPACTION_THRESHOLDS = {
|
|
9
|
+
1: {
|
|
10
|
+
ratio: .5,
|
|
11
|
+
capTokens: 2e5
|
|
12
|
+
},
|
|
13
|
+
2: {
|
|
14
|
+
ratio: .75,
|
|
15
|
+
capTokens: 5e5
|
|
16
|
+
},
|
|
17
|
+
3: {
|
|
18
|
+
ratio: .95,
|
|
19
|
+
capTokens: 8e5
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
const CHECKPOINT_HEADINGS = [
|
|
23
|
+
"## Goal",
|
|
24
|
+
"## Constraints & Preferences",
|
|
25
|
+
"## Progress",
|
|
26
|
+
"### Done",
|
|
27
|
+
"### In Progress",
|
|
28
|
+
"### Blocked",
|
|
29
|
+
"## Key Decisions",
|
|
30
|
+
"## Next Steps",
|
|
31
|
+
"## Critical Context"
|
|
32
|
+
];
|
|
33
|
+
//#endregion
|
|
3
34
|
//#region src/services/compactionPolicy/index.ts
|
|
4
35
|
const SHOULD_COMPACT_PATTERN = /<shouldCompact>\s*(true|false)\s*<\/shouldCompact>/i;
|
|
5
36
|
const FILE_SECTION_PATTERN = /\n*<(?:read-files|modified-files)>[\s\S]*?<\/(?:read-files|modified-files)>/g;
|
|
@@ -291,6 +322,6 @@ function withCanonicalFileSections(summary, details) {
|
|
|
291
322
|
return sections.length > 0 ? `${normalized}\n\n${sections.join("\n\n")}` : normalized;
|
|
292
323
|
}
|
|
293
324
|
//#endregion
|
|
294
|
-
export {
|
|
325
|
+
export { STATE_CUSTOM_TYPE as S, withCanonicalFileSections as _, createRequestId as a, RESUME_MESSAGE_TYPE as b, fileOperationsFromMessages as c, mergeFileDetails as d, parseCheckpointDecision as f, thresholdTokens as g, retainedMessagesAfterSnapshot as h, createInitialState as i, isStructuredCheckpoint as l, projectContextMessages as m, checkpointRequestDetails as n, effectiveThresholds as o, parseState as p, checkpointSummaryFromEntry as r, fileDetailsFromUnknown as s, baselineUsageIsSettled as t, latestCheckpointArtifactEntry as u, CHECKPOINT_MESSAGE_TYPE as v, RUNTIME_STATE_MESSAGE_TYPE as x, CONTEXT_MESSAGE_TYPE as y };
|
|
295
326
|
|
|
296
|
-
//# sourceMappingURL=
|
|
327
|
+
//# sourceMappingURL=compactionPolicy-DA7s42KV.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compactionPolicy-DA7s42KV.mjs","names":[],"sources":["../src/constants/autocompact.ts","../src/services/compactionPolicy/index.ts"],"sourcesContent":["export const STATE_CUSTOM_TYPE = 'doom-autocompact-state';\nexport const CHECKPOINT_MESSAGE_TYPE = 'doom-autocompact-checkpoint';\nexport const CONTEXT_MESSAGE_TYPE = 'doom-autocompact-context';\nexport const RESUME_MESSAGE_TYPE = 'doom-autocompact-resume';\nexport const RUNTIME_STATE_MESSAGE_TYPE = 'doom-autocompact-runtime-state';\nexport const STATE_VERSION = 2;\n/** Retrying a malformed checkpoint costs a full summarization call per turn, so a pass that\n * keeps failing is abandoned instead of retried for the rest of the session. */\nexport const MAX_INVALID_CHECKPOINT_ATTEMPTS = 3;\n\nexport const COMPACTION_THRESHOLDS = {\n 1: { ratio: 0.5, capTokens: 200_000 },\n 2: { ratio: 0.75, capTokens: 500_000 },\n 3: { ratio: 0.95, capTokens: 800_000 },\n} as const;\n\nexport const CHECKPOINT_HEADINGS = [\n '## Goal',\n '## Constraints & Preferences',\n '## Progress',\n '### Done',\n '### In Progress',\n '### Blocked',\n '## Key Decisions',\n '## Next Steps',\n '## Critical Context',\n] as const;\n","import {\n DEFAULT_COMPACTION_SETTINGS,\n type FileOperations,\n type SessionEntry,\n sessionEntryToContextMessages,\n} from '@earendil-works/pi-coding-agent';\n\nimport {\n CHECKPOINT_HEADINGS,\n CHECKPOINT_MESSAGE_TYPE,\n COMPACTION_THRESHOLDS,\n CONTEXT_MESSAGE_TYPE,\n STATE_VERSION,\n} from '../../constants/autocompact';\nimport type {\n AutocompactContextDetails,\n AutocompactFileDetails,\n AutocompactRatioOverrides,\n AutocompactTokenOverrides,\n AutocompactMessage,\n AutocompactPass,\n AutocompactState,\n CheckpointDecision,\n CheckpointRequestDetails,\n ContextProjection,\n} from '../../types/autocompact';\n\nconst SHOULD_COMPACT_PATTERN = /<shouldCompact>\\s*(true|false)\\s*<\\/shouldCompact>/i;\nconst FILE_SECTION_PATTERN = /\\n*<(?:read-files|modified-files)>[\\s\\S]*?<\\/(?:read-files|modified-files)>/g;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === 'string');\n}\n\nfunction isPass(value: unknown): value is AutocompactPass {\n return value === 1 || value === 2 || value === 3;\n}\n\nfunction assistantText(entry: SessionEntry): string | undefined {\n if (entry.type !== 'message' || entry.message.role !== 'assistant') return undefined;\n const text = entry.message.content\n .filter((block) => block.type === 'text')\n .map((block) => block.text)\n .join('\\n')\n .trim();\n return text || undefined;\n}\n\nfunction isAutocompactMessage(value: unknown): value is AutocompactMessage {\n return isRecord(value) && typeof value.role === 'string';\n}\n\nexport function contextDetailsFromUnknown(value: unknown): AutocompactContextDetails | undefined {\n if (!isRecord(value) || !isStringArray(value.readFiles) || !isStringArray(value.modifiedFiles)) return undefined;\n if (!Array.isArray(value.retainedMessages) || !value.retainedMessages.every(isAutocompactMessage)) return undefined;\n if (!isRecord(value.doomAutocompact)) return undefined;\n const marker = value.doomAutocompact;\n if (\n marker.version !== STATE_VERSION ||\n (marker.pass !== 2 && marker.pass !== 3) ||\n typeof marker.cycle !== 'number' ||\n typeof marker.requestId !== 'string' ||\n typeof marker.snapshotLeafId !== 'string' ||\n typeof marker.tokensBefore !== 'number'\n )\n return undefined;\n return {\n readFiles: [...value.readFiles],\n modifiedFiles: [...value.modifiedFiles],\n retainedMessages: [...value.retainedMessages],\n doomAutocompact: {\n version: STATE_VERSION,\n cycle: marker.cycle,\n pass: marker.pass,\n requestId: marker.requestId,\n snapshotLeafId: marker.snapshotLeafId,\n tokensBefore: marker.tokensBefore,\n },\n };\n}\n\nexport function createInitialState(): AutocompactState {\n return {\n version: STATE_VERSION,\n cycle: 1,\n pass: 1,\n phase: 'waiting',\n checkpointQueue: [],\n exhaustedPasses: [],\n invalidAttempts: 0,\n baselineTokens: 0,\n baselinePending: false,\n readFiles: [],\n modifiedFiles: [],\n };\n}\n\n/**\n * The ratios each pass fires at, with configured values folded in.\n *\n * The ladder only works if it climbs, so a configured pass never sits below the\n * one before it: a file that says pass 2 fires earlier than pass 1 gets pass 1's\n * ratio for pass 2 rather than a pass that can never contribute.\n */\nexport function compactionRatios(configured: AutocompactRatioOverrides = {}): Record<AutocompactPass, number> {\n let previous = 0;\n const ratios = {} as Record<AutocompactPass, number>;\n for (const pass of [1, 2, 3] as const) {\n const ratio = Math.max(configured[pass] ?? COMPACTION_THRESHOLDS[pass].ratio, previous);\n ratios[pass] = ratio;\n previous = ratio;\n }\n return ratios;\n}\n\nexport function thresholdTokens(\n pass: AutocompactPass,\n contextWindow: number,\n baselineTokens = 0,\n configured: AutocompactRatioOverrides = {},\n): number {\n const threshold = COMPACTION_THRESHOLDS[pass];\n const ratio = compactionRatios(configured)[pass];\n const baseline = Math.max(0, Math.min(baselineTokens, contextWindow));\n const remaining = contextWindow - baseline;\n const staged = baseline + Math.min(Math.floor(remaining * ratio), threshold.capTokens);\n // Pi compacts natively above `contextWindow - reserveTokens`. A staged threshold above that\n // point can never fire, so the ladder would silently degrade into native compaction: on a\n // 200k window the raw pass 3 ratio lands at 190_000, while Pi already compacted at 183_616.\n const nativeTrigger = contextWindow - DEFAULT_COMPACTION_SETTINGS.reserveTokens;\n return nativeTrigger > baseline ? Math.min(staged, nativeTrigger) : staged;\n}\n\n/**\n * Where every pass fires, with a matching model's absolute token checkpoints folded in.\n *\n * A configured token count replaces the ratio only when it fires earlier, so an\n * override can bring a checkpoint forward on a very large window without ever\n * pushing one past the point Pi compacts natively.\n *\n * Two rules keep the ladder usable. A token count at or below the baseline is\n * ignored, because a compaction that lands above it would otherwise satisfy that\n * pass the moment the next cycle opens and re-fire it every turn. And a pass never\n * sits below the one before it, for the same reason {@link compactionRatios}\n * climbs: `evaluateUsage` skips any pass below the one already reached, so a later\n * pass that fires first does not merely reorder the ladder, it locks the earlier\n * passes out of the cycle and forces compaction with no summary ever written.\n */\nexport function effectiveThresholds(\n contextWindow: number,\n baselineTokens = 0,\n configured: AutocompactRatioOverrides = {},\n tokenOverrides: AutocompactTokenOverrides = {},\n): Record<AutocompactPass, number> {\n let previous = 0;\n const thresholds = {} as Record<AutocompactPass, number>;\n for (const pass of [1, 2, 3] as const) {\n const ratioTokens = thresholdTokens(pass, contextWindow, baselineTokens, configured);\n const absolute = tokenOverrides[pass];\n const staged = absolute !== undefined && absolute > baselineTokens ? Math.min(ratioTokens, absolute) : ratioTokens;\n thresholds[pass] = Math.max(staged, previous);\n previous = thresholds[pass];\n }\n return thresholds;\n}\nexport function latestCheckpointArtifactEntry(branchEntries: SessionEntry[]): SessionEntry | undefined {\n return branchEntries.findLast(\n (entry) =>\n entry.type === 'compaction' ||\n // Staged checkpoints are plain entries so they stay out of the agent's LLM context.\n (entry.type === 'custom' && entry.customType === CHECKPOINT_MESSAGE_TYPE) ||\n // Legacy sessions staged checkpoints as custom messages; committed markers still are.\n (entry.type === 'custom_message' &&\n (entry.customType === CHECKPOINT_MESSAGE_TYPE || entry.customType === CONTEXT_MESSAGE_TYPE)),\n );\n}\n\nexport function baselineUsageIsSettled(branchEntries: SessionEntry[]): boolean {\n const boundaryIndex = branchEntries.findLastIndex(\n (entry) =>\n entry.type === 'compaction' || (entry.type === 'custom_message' && entry.customType === CONTEXT_MESSAGE_TYPE),\n );\n return branchEntries.slice(boundaryIndex + 1).some((entry) => {\n if (entry.type !== 'message' || entry.message.role !== 'assistant') return false;\n const { stopReason, usage } = entry.message;\n if (stopReason === 'aborted' || stopReason === 'error' || !usage) return false;\n return (usage.totalTokens || usage.input + usage.output + usage.cacheRead + usage.cacheWrite) > 0;\n });\n}\n\nexport function retainedMessagesAfterSnapshot(\n branchEntries: SessionEntry[],\n snapshotLeafId: string,\n): AutocompactMessage[] {\n const snapshotIndex = branchEntries.findIndex((entry) => entry.id === snapshotLeafId);\n if (snapshotIndex === -1) return [];\n return branchEntries\n .slice(snapshotIndex + 1)\n .filter((entry) => entry.type !== 'custom_message' || entry.customType !== CHECKPOINT_MESSAGE_TYPE)\n .flatMap((entry) => sessionEntryToContextMessages(entry));\n}\n\nexport function projectContextMessages(\n messages: AutocompactMessage[],\n branchEntries: SessionEntry[],\n): ContextProjection {\n const nativeCompactionIndex = branchEntries.findLastIndex((entry) => entry.type === 'compaction');\n const markerEntry = branchEntries\n .slice(nativeCompactionIndex + 1)\n .findLast((entry) => entry.type === 'custom_message' && entry.customType === CONTEXT_MESSAGE_TYPE);\n if (!markerEntry || markerEntry.type !== 'custom_message') {\n return { messages, retainedMessageCount: 0 };\n }\n\n const details = contextDetailsFromUnknown(markerEntry.details);\n const summary = checkpointSummaryFromEntry(markerEntry);\n if (!details || !summary) return { messages, invalidMarker: true, retainedMessageCount: 0 };\n\n const markerMessageIndex = messages.findLastIndex(\n (message) =>\n message.role === 'custom' &&\n message.customType === CONTEXT_MESSAGE_TYPE &&\n contextDetailsFromUnknown(message.details)?.doomAutocompact.requestId === details.doomAutocompact.requestId,\n );\n if (markerMessageIndex === -1) return { messages, invalidMarker: true, retainedMessageCount: 0 };\n\n const summaryMessage: AutocompactMessage = {\n role: 'compactionSummary',\n summary,\n tokensBefore: details.doomAutocompact.tokensBefore,\n timestamp: messages[markerMessageIndex]?.timestamp ?? Date.now(),\n };\n return {\n messages: [summaryMessage, ...details.retainedMessages, ...messages.slice(markerMessageIndex + 1)],\n marker: details.doomAutocompact,\n retainedMessageCount: details.retainedMessages.length,\n };\n}\n\nexport function fileOperationsFromMessages(messages: AutocompactMessage[]): FileOperations {\n const fileOps: FileOperations = { read: new Set(), written: new Set(), edited: new Set() };\n for (const message of messages) {\n if (message.role !== 'assistant') continue;\n for (const block of message.content) {\n if (block.type !== 'toolCall') continue;\n const path = typeof block.arguments.path === 'string' ? block.arguments.path : undefined;\n if (!path) continue;\n if (block.name === 'read') fileOps.read.add(path);\n else if (block.name === 'write') fileOps.written.add(path);\n else if (block.name === 'edit') fileOps.edited.add(path);\n }\n }\n return fileOps;\n}\n\nexport function parseState(value: unknown): AutocompactState | undefined {\n if (!isRecord(value)) return undefined;\n if (value.version !== STATE_VERSION || typeof value.cycle !== 'number' || !isPass(value.pass)) return undefined;\n if (\n value.phase !== 'waiting' &&\n value.phase !== 'checkpoint_pending' &&\n value.phase !== 'checkpoint_ready' &&\n value.phase !== 'compacting'\n )\n return undefined;\n const baselineTokens = value.baselineTokens ?? 0;\n if (typeof baselineTokens !== 'number' || baselineTokens < 0) return undefined;\n const baselinePending = value.baselinePending ?? false;\n if (typeof baselinePending !== 'boolean') return undefined;\n const checkpointQueue = value.checkpointQueue ?? [];\n if (\n !Array.isArray(checkpointQueue) ||\n !checkpointQueue.every(isPass) ||\n checkpointQueue.some((pass, index) => index > 0 && pass <= checkpointQueue[index - 1]!)\n )\n return undefined;\n // Sessions persisted before bounded retry landed simply have no attempt history to restore.\n const exhaustedPasses = value.exhaustedPasses ?? [];\n if (!Array.isArray(exhaustedPasses) || !exhaustedPasses.every(isPass)) return undefined;\n const invalidAttempts = value.invalidAttempts ?? 0;\n if (typeof invalidAttempts !== 'number' || invalidAttempts < 0) return undefined;\n if (!isStringArray(value.readFiles) || !isStringArray(value.modifiedFiles)) return undefined;\n if (value.requestId !== undefined && typeof value.requestId !== 'string') return undefined;\n if (value.compactionPass !== undefined && value.compactionPass !== 2 && value.compactionPass !== 3) return undefined;\n if ('latestCheckpointEntryId' in value) return undefined;\n if (value.latestCheckpointSnapshotLeafId !== undefined && typeof value.latestCheckpointSnapshotLeafId !== 'string')\n return undefined;\n if (value.lastAttemptLeafId !== undefined && typeof value.lastAttemptLeafId !== 'string') return undefined;\n if (value.snapshotLeafId !== undefined && typeof value.snapshotLeafId !== 'string') return undefined;\n if (value.snapshotTokens !== undefined && (typeof value.snapshotTokens !== 'number' || value.snapshotTokens < 0))\n return undefined;\n if (value.pendingCheckpoint !== undefined && typeof value.pendingCheckpoint !== 'string') return undefined;\n\n return {\n version: STATE_VERSION,\n cycle: value.cycle,\n pass: value.pass,\n phase: value.phase,\n checkpointQueue: [...checkpointQueue],\n exhaustedPasses: [...exhaustedPasses],\n invalidAttempts,\n baselineTokens,\n baselinePending,\n readFiles: [...value.readFiles],\n modifiedFiles: [...value.modifiedFiles],\n ...(value.requestId ? { requestId: value.requestId } : {}),\n ...(value.compactionPass ? { compactionPass: value.compactionPass } : {}),\n ...(value.latestCheckpointSnapshotLeafId\n ? { latestCheckpointSnapshotLeafId: value.latestCheckpointSnapshotLeafId }\n : {}),\n ...(value.lastAttemptLeafId ? { lastAttemptLeafId: value.lastAttemptLeafId } : {}),\n ...(value.snapshotLeafId ? { snapshotLeafId: value.snapshotLeafId } : {}),\n ...(value.snapshotTokens !== undefined ? { snapshotTokens: value.snapshotTokens } : {}),\n ...(value.pendingCheckpoint ? { pendingCheckpoint: value.pendingCheckpoint } : {}),\n };\n}\n\nexport function checkpointSummaryFromEntry(entry: SessionEntry | undefined): string | undefined {\n if (!entry) return undefined;\n if (entry.type === 'compaction') return entry.summary.trim() || undefined;\n if (entry.type === 'custom') {\n return isRecord(entry.data) && typeof entry.data.summary === 'string'\n ? entry.data.summary.trim() || undefined\n : undefined;\n }\n if (entry.type === 'custom_message') {\n const content =\n typeof entry.content === 'string'\n ? entry.content\n : entry.content\n .filter((block) => block.type === 'text')\n .map((block) => block.text)\n .join('\\n');\n return content.trim() || undefined;\n }\n return assistantText(entry);\n}\n\nexport function parseCheckpointDecision(response: string): CheckpointDecision {\n const match = response.match(SHOULD_COMPACT_PATTERN);\n const summary = response.replace(SHOULD_COMPACT_PATTERN, '').trim();\n if (!match) return { summary };\n return { summary, shouldCompact: match[1]?.toLowerCase() === 'true' };\n}\n\nexport function isStructuredCheckpoint(summary: string): boolean {\n return CHECKPOINT_HEADINGS.every((heading) => summary.includes(heading));\n}\n\nexport function createRequestId(\n sessionId: string,\n cycle: number,\n pass: AutocompactPass,\n leafId: string | null,\n): string {\n return `${sessionId}:${cycle}:${pass}:${leafId ?? 'root'}`;\n}\n\nexport function checkpointRequestDetails(\n cycle: number,\n pass: AutocompactPass,\n requestId: string,\n): CheckpointRequestDetails {\n return { version: STATE_VERSION, cycle, pass, requestId };\n}\n\nexport function mergeFileDetails(\n current: AutocompactFileDetails,\n fileOps?: FileOperations,\n additional?: AutocompactFileDetails,\n): AutocompactFileDetails {\n const modified = new Set([\n ...current.modifiedFiles,\n ...(additional?.modifiedFiles ?? []),\n ...(fileOps ? [...fileOps.edited, ...fileOps.written] : []),\n ]);\n const read = new Set([...current.readFiles, ...(additional?.readFiles ?? []), ...(fileOps ? [...fileOps.read] : [])]);\n for (const path of modified) read.delete(path);\n return { readFiles: [...read].sort(), modifiedFiles: [...modified].sort() };\n}\n\nexport function fileDetailsFromUnknown(value: unknown): AutocompactFileDetails | undefined {\n if (!isRecord(value) || !isStringArray(value.readFiles) || !isStringArray(value.modifiedFiles)) return undefined;\n return { readFiles: value.readFiles, modifiedFiles: value.modifiedFiles };\n}\n\nexport function withCanonicalFileSections(summary: string, details: AutocompactFileDetails): string {\n const sections: string[] = [];\n if (details.readFiles.length > 0) sections.push(`<read-files>\\n${details.readFiles.join('\\n')}\\n</read-files>`);\n if (details.modifiedFiles.length > 0) {\n sections.push(`<modified-files>\\n${details.modifiedFiles.join('\\n')}\\n</modified-files>`);\n }\n const normalized = summary.replace(FILE_SECTION_PATTERN, '').trim();\n return sections.length > 0 ? `${normalized}\\n\\n${sections.join('\\n\\n')}` : normalized;\n}\n"],"mappings":"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"}
|