@agimon-ai/doompi-autocompact 0.0.1-alpha.7 → 0.0.1-alpha.71

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 (143) hide show
  1. package/README.md +103 -18
  2. package/dist/api-contracts.cjs +1 -0
  3. package/dist/api-contracts.d.cts +2 -0
  4. package/dist/api-contracts.d.mts +2 -0
  5. package/dist/api-contracts.mjs +1 -0
  6. package/dist/{constants.cjs → constants/autocompact.cjs} +1 -1
  7. package/dist/constants/autocompact.cjs.map +1 -0
  8. package/dist/{constants.mjs → constants/autocompact.mjs} +1 -1
  9. package/dist/constants/autocompact.mjs.map +1 -0
  10. package/dist/constants/runtime.cjs +2 -0
  11. package/dist/constants/runtime.cjs.map +1 -0
  12. package/dist/constants/runtime.mjs +2 -0
  13. package/dist/constants/runtime.mjs.map +1 -0
  14. package/dist/controllers/serverAutocompact.cjs +2 -0
  15. package/dist/controllers/serverAutocompact.cjs.map +1 -0
  16. package/dist/controllers/serverAutocompact.mjs +2 -0
  17. package/dist/controllers/serverAutocompact.mjs.map +1 -0
  18. package/dist/extensions/pi.cjs +1 -1
  19. package/dist/extensions/pi.cjs.map +1 -1
  20. package/dist/extensions/pi.d.cts +6 -2
  21. package/dist/extensions/pi.d.cts.map +1 -0
  22. package/dist/extensions/pi.d.mts +6 -2
  23. package/dist/extensions/pi.d.mts.map +1 -0
  24. package/dist/extensions/pi.mjs +1 -1
  25. package/dist/extensions/pi.mjs.map +1 -1
  26. package/dist/extensions/server.cjs +2 -0
  27. package/dist/extensions/server.cjs.map +1 -0
  28. package/dist/extensions/server.d.cts +5 -0
  29. package/dist/extensions/server.d.cts.map +1 -0
  30. package/dist/extensions/server.d.mts +5 -0
  31. package/dist/extensions/server.d.mts.map +1 -0
  32. package/dist/extensions/server.mjs +2 -0
  33. package/dist/extensions/server.mjs.map +1 -0
  34. package/dist/index.cjs +1 -1
  35. package/dist/index.d.cts +3 -4
  36. package/dist/index.d.mts +3 -4
  37. package/dist/index.mjs +1 -1
  38. package/dist/schemas/apiContracts.cjs +2 -0
  39. package/dist/schemas/apiContracts.cjs.map +1 -0
  40. package/dist/schemas/apiContracts.d.cts +53 -0
  41. package/dist/schemas/apiContracts.d.cts.map +1 -0
  42. package/dist/schemas/apiContracts.d.mts +53 -0
  43. package/dist/schemas/apiContracts.d.mts.map +1 -0
  44. package/dist/schemas/apiContracts.mjs +2 -0
  45. package/dist/schemas/apiContracts.mjs.map +1 -0
  46. package/dist/services/autocompactRuntime/index.cjs +44 -0
  47. package/dist/services/autocompactRuntime/index.cjs.map +1 -0
  48. package/dist/services/autocompactRuntime/index.d.cts +23 -0
  49. package/dist/services/autocompactRuntime/index.d.cts.map +1 -0
  50. package/dist/services/autocompactRuntime/index.d.mts +23 -0
  51. package/dist/services/autocompactRuntime/index.d.mts.map +1 -0
  52. package/dist/services/autocompactRuntime/index.mjs +44 -0
  53. package/dist/services/autocompactRuntime/index.mjs.map +1 -0
  54. package/dist/services/autocompactRuntime/type.d.cts +2 -0
  55. package/dist/services/autocompactRuntime/type.d.mts +2 -0
  56. package/dist/services/autocompactTelemetry/index.cjs +2 -0
  57. package/dist/services/autocompactTelemetry/index.cjs.map +1 -0
  58. package/dist/services/autocompactTelemetry/index.d.cts +27 -0
  59. package/dist/services/autocompactTelemetry/index.d.cts.map +1 -0
  60. package/dist/services/autocompactTelemetry/index.d.mts +27 -0
  61. package/dist/services/autocompactTelemetry/index.d.mts.map +1 -0
  62. package/dist/services/autocompactTelemetry/index.mjs +2 -0
  63. package/dist/services/autocompactTelemetry/index.mjs.map +1 -0
  64. package/dist/services/compactionPolicy/index.cjs +8 -0
  65. package/dist/services/compactionPolicy/index.cjs.map +1 -0
  66. package/dist/services/compactionPolicy/index.d.cts +6 -0
  67. package/dist/services/compactionPolicy/index.d.cts.map +1 -0
  68. package/dist/services/compactionPolicy/index.d.mts +6 -0
  69. package/dist/services/compactionPolicy/index.d.mts.map +1 -0
  70. package/dist/services/compactionPolicy/index.mjs +8 -0
  71. package/dist/services/compactionPolicy/index.mjs.map +1 -0
  72. package/dist/services/modelOverrides/index.cjs +2 -0
  73. package/dist/services/modelOverrides/index.cjs.map +1 -0
  74. package/dist/services/modelOverrides/index.mjs +2 -0
  75. package/dist/services/modelOverrides/index.mjs.map +1 -0
  76. package/dist/services/summarizationModel/index.cjs +2 -0
  77. package/dist/services/summarizationModel/index.cjs.map +1 -0
  78. package/dist/{summarizationModel.d.cts → services/summarizationModel/index.d.cts} +3 -5
  79. package/dist/services/summarizationModel/index.d.cts.map +1 -0
  80. package/dist/{summarizationModel.d.mts → services/summarizationModel/index.d.mts} +3 -5
  81. package/dist/services/summarizationModel/index.d.mts.map +1 -0
  82. package/dist/services/summarizationModel/index.mjs +2 -0
  83. package/dist/services/summarizationModel/index.mjs.map +1 -0
  84. package/dist/types/autocompact.d.cts +7 -0
  85. package/dist/types/autocompact.d.cts.map +1 -0
  86. package/dist/types/autocompact.d.mts +7 -0
  87. package/dist/types/autocompact.d.mts.map +1 -0
  88. package/package.json +75 -17
  89. package/src/constants/autocompact.ts +27 -0
  90. package/src/extensions/web.ts +21 -0
  91. package/src/types/autocompactSettings.ts +97 -0
  92. package/src/web/lib/autocompactSettings.ts +32 -0
  93. package/src/web/tsconfig.json +23 -0
  94. package/dist/checkpointWorker.cjs +0 -2
  95. package/dist/checkpointWorker.cjs.map +0 -1
  96. package/dist/checkpointWorker.d.cts +0 -1
  97. package/dist/checkpointWorker.d.mts +0 -1
  98. package/dist/checkpointWorker.mjs +0 -2
  99. package/dist/checkpointWorker.mjs.map +0 -1
  100. package/dist/constants.cjs.map +0 -1
  101. package/dist/constants.mjs.map +0 -1
  102. package/dist/extension.cjs +0 -50
  103. package/dist/extension.cjs.map +0 -1
  104. package/dist/extension.d.cts +0 -36
  105. package/dist/extension.d.cts.map +0 -1
  106. package/dist/extension.d.mts +0 -36
  107. package/dist/extension.d.mts.map +0 -1
  108. package/dist/extension.mjs +0 -50
  109. package/dist/extension.mjs.map +0 -1
  110. package/dist/logSinkTelemetry.cjs +0 -2
  111. package/dist/logSinkTelemetry.cjs.map +0 -1
  112. package/dist/logSinkTelemetry.d.cts +0 -26
  113. package/dist/logSinkTelemetry.d.cts.map +0 -1
  114. package/dist/logSinkTelemetry.d.mts +0 -26
  115. package/dist/logSinkTelemetry.d.mts.map +0 -1
  116. package/dist/logSinkTelemetry.mjs +0 -2
  117. package/dist/logSinkTelemetry.mjs.map +0 -1
  118. package/dist/policy.cjs +0 -8
  119. package/dist/policy.cjs.map +0 -1
  120. package/dist/policy.d.cts +0 -6
  121. package/dist/policy.d.cts.map +0 -1
  122. package/dist/policy.d.mts +0 -6
  123. package/dist/policy.d.mts.map +0 -1
  124. package/dist/policy.mjs +0 -8
  125. package/dist/policy.mjs.map +0 -1
  126. package/dist/standard.cjs +0 -2
  127. package/dist/standard.cjs.map +0 -1
  128. package/dist/standard.d.cts +0 -8
  129. package/dist/standard.d.cts.map +0 -1
  130. package/dist/standard.d.mts +0 -8
  131. package/dist/standard.d.mts.map +0 -1
  132. package/dist/standard.mjs +0 -2
  133. package/dist/standard.mjs.map +0 -1
  134. package/dist/summarizationModel.cjs +0 -2
  135. package/dist/summarizationModel.cjs.map +0 -1
  136. package/dist/summarizationModel.d.cts.map +0 -1
  137. package/dist/summarizationModel.d.mts.map +0 -1
  138. package/dist/summarizationModel.mjs +0 -2
  139. package/dist/summarizationModel.mjs.map +0 -1
  140. package/dist/types.d.cts +0 -5
  141. package/dist/types.d.cts.map +0 -1
  142. package/dist/types.d.mts +0 -5
  143. package/dist/types.d.mts.map +0 -1
package/README.md CHANGED
@@ -1,36 +1,121 @@
1
1
  # @agimon-ai/doompi-autocompact
2
2
 
3
- Staged checkpoint steering and iterative context compaction for Doompi.
3
+ Staged checkpoint summarization and iterative context compaction for DoomPi.
4
4
 
5
- Compaction runs on a three-pass ladder in a worker thread, so the session never blocks on
6
- it. It reads the live plan, task graph, and team snapshot and commits them next to the
7
- summary as authoritative, rather than leaving coordination state to be reconstructed from
8
- prose.
5
+ Part of the [DoomPi distribution](https://www.npmjs.com/package/@agimon-ai/doompi).
9
6
 
10
- Part of [Doompi](https://www.npmjs.com/package/@agimon-ai/doompi), a coding agent that loads
11
- only the skills and tools you name. This package is composed by Doompi and is not usually
12
- installed on its own.
7
+ Instead of waiting for one final summary near the context limit, Autocompact creates up to three
8
+ asynchronous checkpoints and combines each checkpoint with subsequent messages.
9
+
10
+ > **Alpha:** thresholds and compaction steering may change between releases.
11
+
12
+ ## Requirements
13
+
14
+ - Node.js 22.19.0 or newer
15
+ - Pi 0.85.0
16
+ - Authentication for the model selected for summarization
13
17
 
14
18
  ## Install
15
19
 
20
+ `doompi init` and `dpi init` include Autocompact in `default.packages` in `.doom/modes.yaml`.
21
+ Remove it or move it to a named layer to change which major modes load it. Pi discovers its sole
22
+ extension entry through `package.json.pi.extensions`. For direct Pi installation:
23
+
16
24
  ```bash
17
- npm install @agimon-ai/doompi-autocompact
25
+ pi install npm:@agimon-ai/doompi-autocompact
26
+ ```
27
+
28
+ The extension entry is `@agimon-ai/doompi-autocompact/extensions/pi`.
29
+
30
+ ## Checkpoint ladder
31
+
32
+ The standard adapter uses thresholds around 50%, 75%, and 95% of the usable context window,
33
+ subject to token caps and Pi's native-compaction clamp:
34
+
35
+ 1. create an initial compact summary;
36
+ 2. combine it with later messages and allow the model to decide whether compaction is ready;
37
+ 3. combine again and force compaction on the final pass.
38
+
39
+ ## Per-model token checkpoints
40
+
41
+ Ratios scale with the window, which is usually what you want. On a very large window they can
42
+ also mean the first checkpoint waits far longer than you would like: half of a one-million-token
43
+ window is 500,000 tokens. `modes.autocompact.overrides` pins individual passes to an absolute
44
+ token count for the models you name, and leaves every other model on the ratio ladder.
45
+
46
+ ```yaml
47
+ modes:
48
+ autocompact:
49
+ overrides:
50
+ - model: 'claude-opus-4-[6-9]'
51
+ tokens:
52
+ pass1: 75000
53
+ pass2: 150000
54
+ pass3: 200000
18
55
  ```
19
56
 
20
- ## How it loads
57
+ - Entries are tried in file order and the first match wins. A model matching nothing behaves
58
+ exactly as it does without this key.
59
+ - `model` is a glob supporting `*` and character classes such as `[6-9]`. A pattern containing
60
+ `/` is matched against `provider/id`, anything else against the bare model id, because the
61
+ wildcard does not cross the separator. Matching ignores case.
62
+ - The lower of the ratio and the token count wins, so an override can only bring a checkpoint
63
+ forward, never push one past the point Pi compacts natively.
64
+ - Counts are compared against total context usage, not against growth since the last compaction.
65
+ - A count at or below the current cycle's baseline is ignored and the pass falls back to its
66
+ ratio. Without that, a compaction landing above the count would satisfy the pass as soon as
67
+ the next cycle opened and re-fire it every turn.
68
+ - A pass never fires before the one before it. A list that puts a later pass lower is raised to
69
+ match, the same way a ratio below the previous pass is.
70
+ - A repository config replaces the global list whole rather than merging entry by entry.
71
+ - These keys are not on the cockpit settings page; edit `.doom/config.yaml` directly.
72
+ Summarization runs asynchronously in the background, on the session's own provider, so a model
73
+ registered by a Pi provider extension summarizes through that extension. Checkpoints are
74
+ persisted as hidden session entries and used for later steering.
21
75
 
22
- Doompi loads this unconditionally. It is core, not a layer, so it does not appear in
23
- `.doom/modes.yaml`: making it optional would only create broken configurations.
76
+ DoomPi uses the configured planning subagent model and thinking level when available, then falls
77
+ back to the active Pi model. Standalone Pi without DoomPi planning configuration uses the active
78
+ model. Each checkpoint can therefore make another provider request, consume quota, and require the
79
+ credentials for the selected model. Provider errors or missing authentication affect checkpoint
80
+ generation rather than granting a free local summary.
24
81
 
25
- Extension entry: `@agimon-ai/doompi-autocompact/extensions/pi`
82
+ ## Coordination state
26
83
 
27
- ## Entry points
84
+ Autocompact does not own `@agimon-ai/doompi-task` or `@agimon-ai/doompi-team` persistence. The
85
+ standard adapter reads best-effort snapshots from those packages when available, while Task's
86
+ `tasks.json` and Team's run and intercom state remain owned by their respective packages. Missing
87
+ snapshot data is reported as unavailable and must not be inferred from an Autocompact summary.
28
88
 
29
- | Import |
30
- | --------------------------------------------- |
31
- | `@agimon-ai/doompi-autocompact` |
32
- | `@agimon-ai/doompi-autocompact/extensions/pi` |
89
+ ## Public API
90
+
91
+ ```ts
92
+ import { installAutocompactRuntime, thresholdTokens } from '@agimon-ai/doompi-autocompact';
93
+ import type { AutocompactPass } from '@agimon-ai/doompi-autocompact';
94
+ ```
95
+
96
+ Normal Pi activation should use the discovered `extensions/pi` entry. Host integrations can call
97
+ `installAutocompactRuntime` to install package resources into the shared runner-scoped Cordis host.
98
+ The extension entry manages its plugin lifecycle and releases the host lease when the Pi session
99
+ shuts down. `thresholdTokens` exposes the threshold policy for hosts that need to preview or test
100
+ checkpoint boundaries.
101
+
102
+ ## Development
103
+
104
+ ```bash
105
+ pnpm build
106
+ pnpm typecheck
107
+ pnpm test
108
+ pnpm lint
109
+ ```
110
+
111
+ Maintained by [Agimon](https://agimon.ai/about).
33
112
 
34
113
  ## License
35
114
 
36
115
  MIT
116
+
117
+ ## Extension lifecycle and source layout
118
+
119
+ `extensions/pi.ts` declares the Autocompact runtime's optional services, typed events, and `onStop` cleanup. Shutdown cancels checkpoint generation and awaits pending work before releasing telemetry and runtime state. Session-tree changes retain their existing generation cancellation behavior. The runtime and policy live in `services/<name>/`, with constants and shared types in dedicated roots.
120
+
121
+ The direct server entry declares validated configuration resources and a native-fallback status activity from `controllers/serverAutocompact.ts`. The web entry declares settings sections. Flat `exports/` publishes reusable capabilities without forwarding extension entry points.
@@ -0,0 +1 @@
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("./schemas/apiContracts.cjs");exports.apiContracts=e.apiContracts,exports.default=e.apiContracts;
@@ -0,0 +1,2 @@
1
+ import { apiContracts } from "./schemas/apiContracts.cjs";
2
+ export { apiContracts, apiContracts as default };
@@ -0,0 +1,2 @@
1
+ import { apiContracts } from "./schemas/apiContracts.mjs";
2
+ export { apiContracts, apiContracts as default };
@@ -0,0 +1 @@
1
+ import{apiContracts as e}from"./schemas/apiContracts.mjs";export{e as apiContracts,e as default};
@@ -1,2 +1,2 @@
1
1
  const e={1:{ratio:.5,capTokens:2e5},2:{ratio:.75,capTokens:5e5},3:{ratio:.95,capTokens:8e5}},t=[`## Goal`,`## Constraints & Preferences`,`## Progress`,`### Done`,`### In Progress`,`### Blocked`,`## Key Decisions`,`## Next Steps`,`## Critical Context`];exports.CHECKPOINT_HEADINGS=t,exports.CHECKPOINT_MESSAGE_TYPE=`doom-autocompact-checkpoint`,exports.COMPACTION_THRESHOLDS=e,exports.CONTEXT_MESSAGE_TYPE=`doom-autocompact-context`,exports.RESUME_MESSAGE_TYPE=`doom-autocompact-resume`,exports.RUNTIME_STATE_MESSAGE_TYPE=`doom-autocompact-runtime-state`,exports.STATE_CUSTOM_TYPE=`doom-autocompact-state`;
2
- //# sourceMappingURL=constants.cjs.map
2
+ //# sourceMappingURL=autocompact.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autocompact.cjs","names":[],"sources":["../../src/constants/autocompact.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"],"mappings":"AAAA,MAUa,EAAwB,CACnC,EAAG,CAAE,MAAO,GAAK,UAAW,GAAQ,EACpC,EAAG,CAAE,MAAO,IAAM,UAAW,GAAQ,EACrC,EAAG,CAAE,MAAO,IAAM,UAAW,GAAQ,CACvC,EAEa,EAAsB,CACjC,UACA,+BACA,cACA,WACA,kBACA,cACA,mBACA,gBACA,qBACF"}
@@ -1,2 +1,2 @@
1
1
  const e=`doom-autocompact-state`,t=`doom-autocompact-checkpoint`,n=`doom-autocompact-context`,r=`doom-autocompact-resume`,i=`doom-autocompact-runtime-state`,a={1:{ratio:.5,capTokens:2e5},2:{ratio:.75,capTokens:5e5},3:{ratio:.95,capTokens:8e5}},o=[`## Goal`,`## Constraints & Preferences`,`## Progress`,`### Done`,`### In Progress`,`### Blocked`,`## Key Decisions`,`## Next Steps`,`## Critical Context`];export{o as CHECKPOINT_HEADINGS,t as CHECKPOINT_MESSAGE_TYPE,a as COMPACTION_THRESHOLDS,n as CONTEXT_MESSAGE_TYPE,r as RESUME_MESSAGE_TYPE,i as RUNTIME_STATE_MESSAGE_TYPE,e as STATE_CUSTOM_TYPE};
2
- //# sourceMappingURL=constants.mjs.map
2
+ //# sourceMappingURL=autocompact.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autocompact.mjs","names":[],"sources":["../../src/constants/autocompact.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"],"mappings":"AAAA,MAAa,EAAoB,yBACpB,EAA0B,8BAC1B,EAAuB,2BACvB,EAAsB,0BACtB,EAA6B,iCAM7B,EAAwB,CACnC,EAAG,CAAE,MAAO,GAAK,UAAW,GAAQ,EACpC,EAAG,CAAE,MAAO,IAAM,UAAW,GAAQ,EACrC,EAAG,CAAE,MAAO,IAAM,UAAW,GAAQ,CACvC,EAEa,EAAsB,CACjC,UACA,+BACA,cACA,WACA,kBACA,cACA,mBACA,gBACA,qBACF"}
@@ -0,0 +1,2 @@
1
+ const e={waiting:`waiting`,checkpointPending:`checkpoint_pending`,checkpointReady:`checkpoint_ready`,compacting:`compacting`};exports.FOOTER_SOURCE=`doom-autocompact`,exports.PLAN_DOCUMENT_ENTRY=`agent-harness-plan-document`,exports.ROOT_WORKING_LEAF=`@root`,exports.STATE_PHASE=e,exports.STATUS_KEY=`doom-autocompact`;
2
+ //# sourceMappingURL=runtime.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.cjs","names":[],"sources":["../../src/constants/runtime.ts"],"sourcesContent":["export const ROOT_WORKING_LEAF = '@root';\nexport const PLAN_DOCUMENT_ENTRY = 'agent-harness-plan-document';\nexport const FOOTER_SOURCE = 'doom-autocompact';\nexport const FOOTER_ORDER = 20;\nexport const STATUS_KEY = 'doom-autocompact';\nexport const STATE_PHASE = {\n waiting: 'waiting',\n checkpointPending: 'checkpoint_pending',\n checkpointReady: 'checkpoint_ready',\n compacting: 'compacting',\n} as const;\n\n/**\n * Above this, the context hook is worth a telemetry event. Below it the hook is\n * noise against a round trip measured in seconds, and it runs on every request.\n */\nexport const SLOW_CONTEXT_HOOK_MS = 25;\n"],"mappings":"AAAA,MAKa,EAAc,CACzB,QAAS,UACT,kBAAmB,qBACnB,gBAAiB,mBACjB,WAAY,YACd"}
@@ -0,0 +1,2 @@
1
+ const e=`@root`,t=`agent-harness-plan-document`,n=`doom-autocompact`,r=`doom-autocompact`,i={waiting:`waiting`,checkpointPending:`checkpoint_pending`,checkpointReady:`checkpoint_ready`,compacting:`compacting`};export{n as FOOTER_SOURCE,t as PLAN_DOCUMENT_ENTRY,e as ROOT_WORKING_LEAF,i as STATE_PHASE,r as STATUS_KEY};
2
+ //# sourceMappingURL=runtime.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.mjs","names":[],"sources":["../../src/constants/runtime.ts"],"sourcesContent":["export const ROOT_WORKING_LEAF = '@root';\nexport const PLAN_DOCUMENT_ENTRY = 'agent-harness-plan-document';\nexport const FOOTER_SOURCE = 'doom-autocompact';\nexport const FOOTER_ORDER = 20;\nexport const STATUS_KEY = 'doom-autocompact';\nexport const STATE_PHASE = {\n waiting: 'waiting',\n checkpointPending: 'checkpoint_pending',\n checkpointReady: 'checkpoint_ready',\n compacting: 'compacting',\n} as const;\n\n/**\n * Above this, the context hook is worth a telemetry event. Below it the hook is\n * noise against a round trip measured in seconds, and it runs on every request.\n */\nexport const SLOW_CONTEXT_HOOK_MS = 25;\n"],"mappings":"AAAA,MAAa,EAAoB,QACpB,EAAsB,8BACtB,EAAgB,mBAEhB,EAAa,mBACb,EAAc,CACzB,QAAS,UACT,kBAAmB,qBACnB,gBAAiB,mBACjB,WAAY,YACd"}
@@ -0,0 +1,2 @@
1
+ let e=require("@agimon-ai/doompi-config");const t={name:`doompi/autocompact-config`,kind:`context`,read:t=>JSON.stringify((0,e.loadDoomConfig)(t.repoRoot).modes?.autocompact??{})},n={name:`doompi-autocompact`,start(t){let n=(0,e.loadDoomConfig)(t.repoRoot).modes?.autocompact?.enabled===!0;return t.client.setStatus(`doom-autocompact`,n?`native fallback`:void 0),()=>t.client.setStatus(`doom-autocompact`,void 0)}};exports.autocompactActivity=n,exports.autocompactResource=t;
2
+ //# sourceMappingURL=serverAutocompact.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serverAutocompact.cjs","names":["loadDoomConfig"],"sources":["../../src/controllers/serverAutocompact.ts"],"sourcesContent":["import { loadDoomConfig } from '@agimon-ai/doompi-config';\nimport { type DoomHeadlessActivity, type DoomHeadlessResource } from '@agimon-ai/doompi-core/headless';\n\nexport const autocompactResource: DoomHeadlessResource = {\n name: 'doompi/autocompact-config',\n kind: 'context',\n read: (execution) => JSON.stringify(loadDoomConfig(execution.repoRoot).modes?.autocompact ?? {}),\n};\n\nexport const autocompactActivity: DoomHeadlessActivity = {\n name: 'doompi-autocompact',\n start(execution) {\n const enabled = loadDoomConfig(execution.repoRoot).modes?.autocompact?.enabled === true;\n execution.client.setStatus('doom-autocompact', enabled ? 'native fallback' : undefined);\n return () => execution.client.setStatus('doom-autocompact', undefined);\n },\n};\n"],"mappings":"0CAGA,MAAa,EAA4C,CACvD,KAAM,4BACN,KAAM,UACN,KAAO,GAAc,KAAK,WAAA,EAAUA,EAAAA,eAAAA,CAAe,EAAU,QAAQ,CAAC,CAAC,OAAO,aAAe,CAAC,CAAC,CACjG,EAEa,EAA4C,CACvD,KAAM,qBACN,MAAM,EAAW,CACf,IAAM,GAAA,EAAUA,EAAAA,eAAAA,CAAe,EAAU,QAAQ,CAAC,CAAC,OAAO,aAAa,UAAY,GAEnF,OADA,EAAU,OAAO,UAAU,mBAAoB,EAAU,kBAAoB,IAAA,EAAS,MACzE,EAAU,OAAO,UAAU,mBAAoB,IAAA,EAAS,CACvE,CACF"}
@@ -0,0 +1,2 @@
1
+ import{loadDoomConfig as e}from"@agimon-ai/doompi-config";const t={name:`doompi/autocompact-config`,kind:`context`,read:t=>JSON.stringify(e(t.repoRoot).modes?.autocompact??{})},n={name:`doompi-autocompact`,start(t){let n=e(t.repoRoot).modes?.autocompact?.enabled===!0;return t.client.setStatus(`doom-autocompact`,n?`native fallback`:void 0),()=>t.client.setStatus(`doom-autocompact`,void 0)}};export{n as autocompactActivity,t as autocompactResource};
2
+ //# sourceMappingURL=serverAutocompact.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serverAutocompact.mjs","names":[],"sources":["../../src/controllers/serverAutocompact.ts"],"sourcesContent":["import { loadDoomConfig } from '@agimon-ai/doompi-config';\nimport { type DoomHeadlessActivity, type DoomHeadlessResource } from '@agimon-ai/doompi-core/headless';\n\nexport const autocompactResource: DoomHeadlessResource = {\n name: 'doompi/autocompact-config',\n kind: 'context',\n read: (execution) => JSON.stringify(loadDoomConfig(execution.repoRoot).modes?.autocompact ?? {}),\n};\n\nexport const autocompactActivity: DoomHeadlessActivity = {\n name: 'doompi-autocompact',\n start(execution) {\n const enabled = loadDoomConfig(execution.repoRoot).modes?.autocompact?.enabled === true;\n execution.client.setStatus('doom-autocompact', enabled ? 'native fallback' : undefined);\n return () => execution.client.setStatus('doom-autocompact', undefined);\n },\n};\n"],"mappings":"0DAGA,MAAa,EAA4C,CACvD,KAAM,4BACN,KAAM,UACN,KAAO,GAAc,KAAK,UAAU,EAAe,EAAU,QAAQ,CAAC,CAAC,OAAO,aAAe,CAAC,CAAC,CACjG,EAEa,EAA4C,CACvD,KAAM,qBACN,MAAM,EAAW,CACf,IAAM,EAAU,EAAe,EAAU,QAAQ,CAAC,CAAC,OAAO,aAAa,UAAY,GAEnF,OADA,EAAU,OAAO,UAAU,mBAAoB,EAAU,kBAAoB,IAAA,EAAS,MACzE,EAAU,OAAO,UAAU,mBAAoB,IAAA,EAAS,CACvE,CACF"}
@@ -1,2 +1,2 @@
1
- var e=require(`../standard.cjs`).registerStandardAutocompactExtension;module.exports=e;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../services/autocompactRuntime/index.cjs"),t=(0,require("@agimon-ai/doompi-core/pi-extension").definePiExtension)(`@agimon-ai/doompi-autocompact`,({pi:t,options:n})=>{let r=e.createAutocompactRuntime(t,n);return{services:[r.plugin],events:r.events,onStop:r.stop}});exports.autocompactExtension=t,exports.default=t;
2
2
  //# sourceMappingURL=pi.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"pi.cjs","names":["registerStandardAutocompactExtension"],"sources":["../../src/extensions/pi.ts"],"sourcesContent":["import { registerStandardAutocompactExtension } from '../standard.ts';\n\nexport default registerStandardAutocompactExtension;\n"],"mappings":"AAEA,IAAA,4BAAeA,CAAAA"}
1
+ {"version":3,"file":"pi.cjs","names":["definePiExtension","createAutocompactRuntime"],"sources":["../../src/extensions/pi.ts"],"sourcesContent":["import { definePiExtension } from '@agimon-ai/doompi-core/pi-extension';\n\nimport { createAutocompactRuntime, type AutocompactDependencies } from '../services/autocompactRuntime';\nexport const autocompactExtension = definePiExtension<AutocompactDependencies>(\n '@agimon-ai/doompi-autocompact',\n ({ pi, options }) => {\n const runtime = createAutocompactRuntime(pi, options);\n return { services: [runtime.plugin], events: runtime.events, onStop: runtime.stop };\n },\n);\nexport default autocompactExtension;\n"],"mappings":"2JAGa,GAAA,+CAAuBA,CAAAA,CAAAA,kBAAAA,CAClC,iCACC,CAAE,KAAI,aAAc,CACnB,IAAM,EAAUC,EAAAA,yBAAyB,EAAI,CAAO,EACpD,MAAO,CAAE,SAAU,CAAC,EAAQ,MAAM,EAAG,OAAQ,EAAQ,OAAQ,OAAQ,EAAQ,IAAK,CACpF,CACF"}
@@ -1,2 +1,6 @@
1
- import { registerStandardAutocompactExtension } from "../standard.cjs";
2
- export = registerStandardAutocompactExtension;
1
+ import { AutocompactDependencies } from "../services/autocompactRuntime/index.cjs";
2
+ //#region src/extensions/pi.d.ts
3
+ export declare const autocompactExtension: import("@agimon-ai/doompi-core/runtime-pi-extension").DefinedPiExtension<AutocompactDependencies>;
4
+ //#endregion
5
+ export { autocompactExtension as default };
6
+ //# sourceMappingURL=pi.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.d.cts","names":[],"sources":["../../src/extensions/pi.ts"],"mappings":";;qBAGa,4EAAoB,mBAAA"}
@@ -1,2 +1,6 @@
1
- import { registerStandardAutocompactExtension } from "../standard.mjs";
2
- export { registerStandardAutocompactExtension as default };
1
+ import { AutocompactDependencies } from "../services/autocompactRuntime/index.mjs";
2
+ //#region src/extensions/pi.d.ts
3
+ export declare const autocompactExtension: import("@agimon-ai/doompi-core/runtime-pi-extension").DefinedPiExtension<AutocompactDependencies>;
4
+ //#endregion
5
+ export { autocompactExtension as default };
6
+ //# sourceMappingURL=pi.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.d.mts","names":[],"sources":["../../src/extensions/pi.ts"],"mappings":";;qBAGa,4EAAoB,mBAAA"}
@@ -1,2 +1,2 @@
1
- import{registerStandardAutocompactExtension as e}from"../standard.mjs";var t=e;export{t as default};
1
+ import{createAutocompactRuntime as e}from"../services/autocompactRuntime/index.mjs";import{definePiExtension as t}from"@agimon-ai/doompi-core/pi-extension";const n=t(`@agimon-ai/doompi-autocompact`,({pi:t,options:n})=>{let r=e(t,n);return{services:[r.plugin],events:r.events,onStop:r.stop}});export{n as autocompactExtension,n as default};
2
2
  //# sourceMappingURL=pi.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"pi.mjs","names":[],"sources":["../../src/extensions/pi.ts"],"sourcesContent":["import { registerStandardAutocompactExtension } from '../standard.ts';\n\nexport default registerStandardAutocompactExtension;\n"],"mappings":"uEAEA,IAAA,EAAe"}
1
+ {"version":3,"file":"pi.mjs","names":[],"sources":["../../src/extensions/pi.ts"],"sourcesContent":["import { definePiExtension } from '@agimon-ai/doompi-core/pi-extension';\n\nimport { createAutocompactRuntime, type AutocompactDependencies } from '../services/autocompactRuntime';\nexport const autocompactExtension = definePiExtension<AutocompactDependencies>(\n '@agimon-ai/doompi-autocompact',\n ({ pi, options }) => {\n const runtime = createAutocompactRuntime(pi, options);\n return { services: [runtime.plugin], events: runtime.events, onStop: runtime.stop };\n },\n);\nexport default autocompactExtension;\n"],"mappings":"4JAGA,MAAa,EAAuB,EAClC,iCACC,CAAE,KAAI,aAAc,CACnB,IAAM,EAAU,EAAyB,EAAI,CAAO,EACpD,MAAO,CAAE,SAAU,CAAC,EAAQ,MAAM,EAAG,OAAQ,EAAQ,OAAQ,OAAQ,EAAQ,IAAK,CACpF,CACF"}
@@ -0,0 +1,2 @@
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../controllers/serverAutocompact.cjs"),t=(0,require("@agimon-ai/doompi-core/server-facet").defineServerPlugin)({name:`@agimon-ai/doompi-autocompact`,session:{resources:[e.autocompactResource],activities:[e.autocompactActivity]}});exports.autocompactServerFacet=t,exports.default=t;
2
+ //# sourceMappingURL=server.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.cjs","names":["defineServerPlugin","autocompactResource","autocompactActivity"],"sources":["../../src/extensions/server.ts"],"sourcesContent":["import { defineServerPlugin } from '@agimon-ai/doompi-core/server-facet';\n\nimport { autocompactResource, autocompactActivity } from '../controllers/serverAutocompact';\nexport const autocompactServerFacet = defineServerPlugin({\n name: '@agimon-ai/doompi-autocompact',\n session: { resources: [autocompactResource], activities: [autocompactActivity] },\n});\nexport default autocompactServerFacet;\n"],"mappings":"uJAGa,GAAA,+CAAyBA,CAAAA,CAAAA,mBAAAA,CAAmB,CACvD,KAAM,gCACN,QAAS,CAAE,UAAW,CAACC,EAAAA,mBAAmB,EAAG,WAAY,CAACC,EAAAA,mBAAmB,CAAE,CACjF,CAAC"}
@@ -0,0 +1,5 @@
1
+ //#region src/extensions/server.d.ts
2
+ export declare const autocompactServerFacet: import("@agimon-ai/doompi-core/server-facet").DoomServerFacet;
3
+ //#endregion
4
+ export { autocompactServerFacet as default };
5
+ //# sourceMappingURL=server.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.cts","names":[],"sources":["../../src/extensions/server.ts"],"mappings":";qBAGa,sEAAsB"}
@@ -0,0 +1,5 @@
1
+ //#region src/extensions/server.d.ts
2
+ export declare const autocompactServerFacet: import("@agimon-ai/doompi-core/server-facet").DoomServerFacet;
3
+ //#endregion
4
+ export { autocompactServerFacet as default };
5
+ //# sourceMappingURL=server.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.mts","names":[],"sources":["../../src/extensions/server.ts"],"mappings":";qBAGa,sEAAsB"}
@@ -0,0 +1,2 @@
1
+ import{autocompactActivity as e,autocompactResource as t}from"../controllers/serverAutocompact.mjs";import{defineServerPlugin as n}from"@agimon-ai/doompi-core/server-facet";const r=n({name:`@agimon-ai/doompi-autocompact`,session:{resources:[t],activities:[e]}});export{r as autocompactServerFacet,r as default};
2
+ //# sourceMappingURL=server.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.mjs","names":[],"sources":["../../src/extensions/server.ts"],"sourcesContent":["import { defineServerPlugin } from '@agimon-ai/doompi-core/server-facet';\n\nimport { autocompactResource, autocompactActivity } from '../controllers/serverAutocompact';\nexport const autocompactServerFacet = defineServerPlugin({\n name: '@agimon-ai/doompi-autocompact',\n session: { resources: [autocompactResource], activities: [autocompactActivity] },\n});\nexport default autocompactServerFacet;\n"],"mappings":"6KAGA,MAAa,EAAyB,EAAmB,CACvD,KAAM,gCACN,QAAS,CAAE,UAAW,CAAC,CAAmB,EAAG,WAAY,CAAC,CAAmB,CAAE,CACjF,CAAC"}
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./policy.cjs`),t=require(`./extension.cjs`);exports.registerAutocompactExtension=t.registerAutocompactExtension,exports.thresholdTokens=e.thresholdTokens;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./services/compactionPolicy/index.cjs");exports.thresholdTokens=e.thresholdTokens;
package/dist/index.d.cts CHANGED
@@ -1,4 +1,3 @@
1
- import { registerAutocompactExtension } from "./extension.cjs";
2
- import { AutocompactPass } from "./types.cjs";
3
- import { thresholdTokens } from "./policy.cjs";
4
- export { type AutocompactPass, registerAutocompactExtension, thresholdTokens };
1
+ import { AutocompactPass } from "./types/autocompact.cjs";
2
+ import { thresholdTokens } from "./services/compactionPolicy/index.cjs";
3
+ export { type AutocompactPass, thresholdTokens };
package/dist/index.d.mts CHANGED
@@ -1,4 +1,3 @@
1
- import { registerAutocompactExtension } from "./extension.mjs";
2
- import { AutocompactPass } from "./types.mjs";
3
- import { thresholdTokens } from "./policy.mjs";
4
- export { type AutocompactPass, registerAutocompactExtension, thresholdTokens };
1
+ import { AutocompactPass } from "./types/autocompact.mjs";
2
+ import { thresholdTokens } from "./services/compactionPolicy/index.mjs";
3
+ export { type AutocompactPass, thresholdTokens };
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{thresholdTokens as e}from"./policy.mjs";import{registerAutocompactExtension as t}from"./extension.mjs";export{t as registerAutocompactExtension,e as thresholdTokens};
1
+ import{thresholdTokens as e}from"./services/compactionPolicy/index.mjs";export{e as thresholdTokens};
@@ -0,0 +1,2 @@
1
+ const e=(0,require("@agimon-ai/doompi-core/api-contracts").defineApiContract)({version:1,http:[],sockets:[],dynamic:[]});exports.apiContracts=e,exports.default=e;
2
+ //# sourceMappingURL=apiContracts.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiContracts.cjs","names":["defineApiContract"],"sources":["../../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract } from '@agimon-ai/doompi-core/api-contracts';\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,GAAA,gDAAeA,CAAAA,CAAAA,kBAAAA,CAAkB,CAAE,QAAS,EAAG,KAAM,CAAC,EAAG,QAAS,CAAC,EAAG,QAAS,CAAC,CAAE,CAAC"}
@@ -0,0 +1,53 @@
1
+ //#region src/schemas/apiContracts.d.ts
2
+ /** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */
3
+ export declare const apiContracts: {
4
+ version: 1;
5
+ protocols?: Record<string, string> | undefined;
6
+ schemas?: Record<string, boolean | object> | undefined;
7
+ http: {
8
+ id: string;
9
+ scope: "global" | "session" | "workspace";
10
+ basePath?: string | undefined;
11
+ path: string;
12
+ method: "DELETE" | "GET" | "HEAD" | "OPTIONS" | "PATCH" | "POST" | "PUT";
13
+ description: string;
14
+ availability?: string | undefined;
15
+ authentication: "device" | "none" | "owner";
16
+ parameters?: {
17
+ name: string;
18
+ in: "header" | "path" | "query";
19
+ required: boolean;
20
+ schema: boolean | object;
21
+ }[] | undefined;
22
+ body?: {
23
+ contentType: string;
24
+ contentTypes?: string[] | undefined;
25
+ required: boolean;
26
+ schema: boolean | object;
27
+ } | undefined;
28
+ responses: Record<string, {
29
+ description: string;
30
+ contentType?: string | undefined;
31
+ schema?: boolean | object | undefined;
32
+ events?: Record<string, boolean | object> | undefined;
33
+ }>;
34
+ }[];
35
+ sockets: {
36
+ id: string;
37
+ scope: "global" | "session" | "workspace";
38
+ description: string;
39
+ availability?: string | undefined;
40
+ service: string;
41
+ member: string;
42
+ direction: "client-to-server" | "server-to-client";
43
+ kind: "channel" | "method" | "state";
44
+ input: boolean | object;
45
+ output?: boolean | object | undefined;
46
+ errors?: boolean | object | undefined;
47
+ }[];
48
+ dynamic: string[];
49
+ gaps?: string[] | undefined;
50
+ };
51
+ //#endregion
52
+ export { apiContracts as default };
53
+ //# sourceMappingURL=apiContracts.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiContracts.d.cts","names":[],"sources":["../../src/schemas/apiContracts.ts"],"mappings":";;qBAGa"}
@@ -0,0 +1,53 @@
1
+ //#region src/schemas/apiContracts.d.ts
2
+ /** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */
3
+ export declare const apiContracts: {
4
+ version: 1;
5
+ protocols?: Record<string, string> | undefined;
6
+ schemas?: Record<string, boolean | object> | undefined;
7
+ http: {
8
+ id: string;
9
+ scope: "global" | "session" | "workspace";
10
+ basePath?: string | undefined;
11
+ path: string;
12
+ method: "DELETE" | "GET" | "HEAD" | "OPTIONS" | "PATCH" | "POST" | "PUT";
13
+ description: string;
14
+ availability?: string | undefined;
15
+ authentication: "device" | "none" | "owner";
16
+ parameters?: {
17
+ name: string;
18
+ in: "header" | "path" | "query";
19
+ required: boolean;
20
+ schema: boolean | object;
21
+ }[] | undefined;
22
+ body?: {
23
+ contentType: string;
24
+ contentTypes?: string[] | undefined;
25
+ required: boolean;
26
+ schema: boolean | object;
27
+ } | undefined;
28
+ responses: Record<string, {
29
+ description: string;
30
+ contentType?: string | undefined;
31
+ schema?: boolean | object | undefined;
32
+ events?: Record<string, boolean | object> | undefined;
33
+ }>;
34
+ }[];
35
+ sockets: {
36
+ id: string;
37
+ scope: "global" | "session" | "workspace";
38
+ description: string;
39
+ availability?: string | undefined;
40
+ service: string;
41
+ member: string;
42
+ direction: "client-to-server" | "server-to-client";
43
+ kind: "channel" | "method" | "state";
44
+ input: boolean | object;
45
+ output?: boolean | object | undefined;
46
+ errors?: boolean | object | undefined;
47
+ }[];
48
+ dynamic: string[];
49
+ gaps?: string[] | undefined;
50
+ };
51
+ //#endregion
52
+ export { apiContracts as default };
53
+ //# sourceMappingURL=apiContracts.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiContracts.d.mts","names":[],"sources":["../../src/schemas/apiContracts.ts"],"mappings":";;qBAGa"}
@@ -0,0 +1,2 @@
1
+ import{defineApiContract as e}from"@agimon-ai/doompi-core/api-contracts";const t=e({version:1,http:[],sockets:[],dynamic:[]});export{t as apiContracts,t as default};
2
+ //# sourceMappingURL=apiContracts.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiContracts.mjs","names":[],"sources":["../../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract } from '@agimon-ai/doompi-core/api-contracts';\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":"yEAGA,MAAa,EAAe,EAAkB,CAAE,QAAS,EAAG,KAAM,CAAC,EAAG,QAAS,CAAC,EAAG,QAAS,CAAC,CAAE,CAAC"}
@@ -0,0 +1,44 @@
1
+ const e=require("../../constants/autocompact.cjs"),t=require("../compactionPolicy/index.cjs"),n=require("../../constants/runtime.cjs"),r=require("../autocompactTelemetry/index.cjs"),i=require("../modelOverrides/index.cjs"),a=require("../summarizationModel/index.cjs");let o=require("@earendil-works/pi-coding-agent"),s=require("@agimon-ai/doompi-config"),c=require("@agimon-ai/doompi-core/context-contributions"),l=require("@agimon-ai/doompi-core/ui-hub");function u(e,t={}){return{"pi.session.id":e.sessionManager.getSessionId(),...t}}function d(e){for(let n=e.length-1;n>=0;--n){let r=e[n];if(r?.type!==`custom`||r.customType!==`doom-autocompact-state`)continue;let i=t.parseState(r.data);if(i)return i}}function f(e){for(let t of e.sessionManager.getBranch().toReversed())if((t.type!==`custom`||t.customType!==`doom-autocompact-state`)&&t.type!==`label`)return t.id;return n.ROOT_WORKING_LEAF}function p(e){return e instanceof Error?e.message:String(e)}function m(e){for(let t of e.toReversed()){if(t.type!==`custom`||t.customType!==`agent-harness-plan-document`)continue;if(!t.data||typeof t.data!=`object`)return;let e=t.data;return typeof e.content!=`string`||typeof e.path!=`string`?void 0:{content:e.content,path:e.path}}}const h=Object.freeze({entries:Object.freeze([]),errors:Object.freeze([])});function g(e){if(!e)return h;try{return e.snapshot()}catch(e){return{entries:[],errors:[{source:c.DOOM_CONTEXT_CONTRIBUTIONS_SERVICE,id:`service-snapshot`,label:`Context contributions`,order:0,message:p(e)}]}}}function _(e){let t=e.entries.map(e=>`### ${e.label}\n${e.text}`);return t.push(...e.errors.map(e=>`### ${e.label}\n(unavailable: ${e.message})`)),t.length>0?t.join(`
2
+
3
+ `):`(no registered context contributions)`}function v(e,t){let n=m(e);return{...n?{planPath:n.path}:{},contributions:t.entries,contributionErrors:t.errors}}function y(e){return`<compaction-runtime-state>
4
+ Authoritative runtime state captured when compaction committed. Use it to resume coordination without reconstructing state from the summary.
5
+ <active-plan>
6
+ ${e.planPath?`Source: ${e.planPath}\nExact plan content is restored separately by Doom Plan.`:`(no active plan document)`}
7
+ </active-plan>
8
+ <context-contributions>
9
+ ${_({entries:e.contributions,errors:e.contributionErrors})}
10
+ </context-contributions>
11
+ </compaction-runtime-state>`}function b(e){return{"autocompact.runtime.plan_present":!!e.planPath,"autocompact.runtime.contribution_count":e.contributions.length,"autocompact.runtime.contribution_error_count":e.contributionErrors.length}}function x(e){let t=e.plan?`Source: ${e.plan.path}\n\n${e.plan.content}`:`(no active plan document)`,n=[e.readFiles.length>0?`Read files: ${e.readFiles.join(`, `)}`:void 0,e.modifiedFiles.length>0?`Modified files: ${e.modifiedFiles.join(`, `)}`:void 0].filter(e=>!!e);return`<compaction-steering priority="user,plan,context-contributions,important-context,recent-messages">
12
+ <user-prompt source="conversation">
13
+ Treat the user's explicit goals, constraints, corrections, and preferences in the conversation as authoritative. Newer user instructions override older ones.
14
+ </user-prompt>
15
+ <active-plan>
16
+ ${t}
17
+ </active-plan>
18
+ <context-contributions>
19
+ ${_(e.contextContributions)}
20
+ </context-contributions>
21
+ <important-context>
22
+ ${n.length>0?n.join(`
23
+ `):`(none recorded outside the conversation)`}
24
+ </important-context>
25
+ </compaction-steering>`}function S(e,t){let n=e===2?`Start with exactly <shouldCompact>true</shouldCompact> or <shouldCompact>false</shouldCompact>. Use true when the staged summary safely retains the important parent context. Use false only when it is not yet sufficient for safe compaction.
26
+
27
+ `:``;return`Create Doom autocompact checkpoint pass ${e}.
28
+
29
+ ${x(t)}
30
+
31
+ Apply the steering evidence in priority order. Do not invent plan or contributed runtime state. Preserve verified facts and mark unresolved inference explicitly. Newer evidence replaces superseded information.
32
+
33
+ ${n}Return only the decision tag when required, followed by a concise structured checkpoint using every heading below. Keep exact goals, constraints, decisions, blockers, commands, errors, file paths, validation evidence, and the immediate next action. Separate verified facts from unresolved inference.
34
+
35
+ ## Goal
36
+ ## Constraints & Preferences
37
+ ## Progress
38
+ ### Done
39
+ ### In Progress
40
+ ### Blocked
41
+ ## Key Decisions
42
+ ## Next Steps
43
+ ## Critical Context`}function C(e,n,r){let i=t.projectContextMessages((0,o.buildSessionContext)(n).messages,n).messages;if(e===1||!r)return i;let a=n.findIndex(e=>e.id===r);return a===-1?i:n.slice(a+1).filter(e=>e.type!==`custom_message`||e.customType!==`doom-autocompact-checkpoint`).flatMap(e=>(0,o.sessionEntryToContextMessages)(e))}const w={enabled:!0,ratios:{},overrides:[]};function T(e,t){let n;try{n=(0,s.loadDoomConfig)((0,s.getHarnessState)().root??e).modes}catch(e){return process.emitWarning(`Doom autocompact configuration could not be loaded; using the active session model instead.`),t?.(e),w}let r=n?.autocompact,i=(r&&(r.model!==void 0||r.thinking!==void 0)?{...r.model?{model:r.model}:{},...r.thinking?{thinking:r.thinking}:{}}:void 0)??n?.planning?.subagents,a=r?.thresholds;return{enabled:r?.enabled??!0,...i?{agent:i}:{},ratios:{...a?.pass1===void 0?{}:{1:a.pass1},...a?.pass2===void 0?{}:{2:a.pass2},...a?.pass3===void 0?{}:{3:a.pass3}},overrides:r?.overrides??[]}}function E(e){let t=T(e.cwd).agent,n=t?.model?a.parseModelReference(t.model):void 0,r=n?e.modelRegistry.find(n.provider,n.modelId):void 0,i=r??e.model;if(!i)return;let o=t?.thinking??(r?n?.thinking:void 0)??e.thinkingLevel;return{model:i,...o?{thinkingLevel:o}:{}}}async function D(e,t){let n=t(e.context);if(!n)throw Error(`No active model is available for autocompact summarization.`);let r=await e.context.modelRegistry.getApiKeyAndHeaders(n.model);if(!r.ok)throw Error(r.error);let i=e.context.modelRegistry.getProvider(n.model.provider);if(!i)throw Error(`No provider is registered for "${n.model.provider}" in this session.`);return(0,o.generateSummary)(e.messages,n.model,o.DEFAULT_COMPACTION_SETTINGS.reserveTokens,r.apiKey,r.headers,e.signal,e.instructions,e.previousCheckpoint,n.thinkingLevel,(e,t,n)=>i.streamSimple(e,t,n),r.env)}function O(e,t,n=`info`){e?.hasUI&&e.ui.notify(t,n)}function k(a,s={}){let p=s.resolveModel??E,h=s.generateCheckpoint??(e=>D(e,p)),_=s.telemetry??r.createAutocompactTelemetry(),x=s.doomIntegrations??!0,w=new Set,k=new Set,A=new Set,j=!0,M=0,N=t.createInitialState(),P,F,I,L,R=!1,z=async()=>{j=!1,M+=1,F?.abort(Error(`Autocompact runtime is shutting down.`)),F=void 0,await Promise.allSettled(A),I=void 0,L=void 0,P=void 0,w.clear(),k.clear(),N=t.createInitialState(),R=!1,await _.shutdown()},B=e=>{e.inject([c.DOOM_CONTEXT_CONTRIBUTIONS_SERVICE],e=>{let t=(0,c.requireDoomContextContributions)(e);return L=t,()=>{L===t&&(L=void 0)}}),x&&e.inject([l.DOOM_UI_HUB_SERVICE],e=>{let t=(0,l.requireDoomUiHub)(e).registerFooter({source:n.FOOTER_SOURCE,id:`autocompact`,order:20});return I=t,()=>{t.dispose(),I===t&&(I=void 0)}})},V=e=>{if(!j)return;let t=N.phase===n.STATE_PHASE.checkpointPending?`summarizing`:N.phase===n.STATE_PHASE.checkpointReady?`applying`:void 0;I?.update(t?{fullText:`Compacting p${N.pass}`,compactText:`C${N.pass}`}:void 0);let r=e??P;r?.hasUI&&r.ui.setStatus(n.STATUS_KEY,t?`Compacting pass ${N.pass} (${t})…`:void 0)},H=()=>{j&&(a.appendEntry(e.STATE_CUSTOM_TYPE,{...N}),V())},U=()=>{delete N.requestId,delete N.snapshotLeafId,delete N.snapshotTokens,delete N.pendingCheckpoint,delete N.compactionPass},W=e=>{N.checkpointQueue=N.checkpointQueue.filter(t=>t!==e)},G=e=>{j&&(N=d(e.sessionManager.getBranch())??t.createInitialState(),!(N.phase===n.STATE_PHASE.checkpointReady&&N.requestId&&N.snapshotLeafId&&N.pendingCheckpoint||N.phase===n.STATE_PHASE.waiting)&&(F?.abort(),F=void 0,N.phase=n.STATE_PHASE.waiting,U(),H()))},ee=t=>{j&&a.sendMessage({customType:e.RESUME_MESSAGE_TYPE,content:`${t} Continue from the compacted checkpoint's immediate next action without repeating completed work.`,display:!1,details:{version:2,cycle:N.cycle,pass:N.pass}},{triggerTurn:!0,deliverAs:`steer`})},K=(e,t)=>{let r=N.invalidAttempts+1,i=r>=3;return N.phase=n.STATE_PHASE.waiting,t&&(N.lastAttemptLeafId=t),i?(W(e),N.exhaustedPasses=[...N.exhaustedPasses,e],N.invalidAttempts=0):N.invalidAttempts=r,U(),H(),{attempts:r,exhausted:i}},te=(e,t)=>{if(!j||e!==N.requestId||N.phase!==n.STATE_PHASE.checkpointPending)return;let r=N.pass,{attempts:i,exhausted:a}=K(r,N.snapshotLeafId),o=t instanceof Error?t.message:String(t);O(P,a?`Doom autocompact summarization pass ${r} failed ${i} times and was abandoned: ${o}`:`Doom autocompact summarization pass ${r} failed: ${o}`,`error`)},ne=(e,t)=>{j&&!R&&(R=!0,_.recordWarning(r.AUTOCOMPACT_EVENT.configurationLoadFailed,t,u(e,{"autocompact.cycle":N.cycle,"autocompact.pass":N.pass})))},q=(e,t,n)=>{if(j)for(let i of t.errors)O(e,`Doom autocompact context contribution degraded (${i.source}/${i.id}): ${i.message}`,`warning`),_.recordWarning(r.AUTOCOMPACT_EVENT.contextContributionDegraded,Error(i.message),{...n,"autocompact.context_contribution.source":i.source,"autocompact.context_contribution.id":i.id,"autocompact.context_contribution.order":i.order})},J=(t,n,r)=>{if(!j)return{contributions:[],contributionErrors:[]};let i=g(L);q(t,i,r);let o=v(n,i);return a.sendMessage({customType:e.RUNTIME_STATE_MESSAGE_TYPE,content:y(o),display:!1,details:{version:2,...o}}),o},re=(i,s)=>{if(!j||!N.requestId||!N.snapshotLeafId||!N.pendingCheckpoint)return!1;let c=s.sessionManager.getBranch(),l=t.projectContextMessages((0,o.buildSessionContext)(c).messages,c).messages,d=t.mergeFileDetails(N,t.fileOperationsFromMessages(l)),p=N.requestId,m=N.cycle,h=t.withCanonicalFileSections(N.pendingCheckpoint,d),g={...d,doomAutocompact:{version:2,cycle:m,pass:i,requestId:p,snapshotLeafId:N.snapshotLeafId,tokensBefore:N.snapshotTokens??s.getContextUsage()?.tokens??0},retainedMessages:t.retainedMessagesAfterSnapshot(c,N.snapshotLeafId)},v=s.isIdle();a.sendMessage({customType:e.CONTEXT_MESSAGE_TYPE,content:h,display:!1,details:g});let y=f(s),x=u(s,{"autocompact.request.id":p,"autocompact.cycle":m,"autocompact.pass":i}),S=J(s,c,x);return v&&a.setLabel(y,`autocompact:c${m}:p${i}`),N.readFiles=d.readFiles,N.modifiedFiles=d.modifiedFiles,delete N.latestCheckpointSnapshotLeafId,N.phase=n.STATE_PHASE.waiting,N.checkpointQueue=[],N.exhaustedPasses=[],N.invalidAttempts=0,N.baselinePending=!0,delete N.lastAttemptLeafId,U(),N.cycle+=1,N.pass=1,H(),_.recordEvent(r.AUTOCOMPACT_EVENT.contextCommitted,u(s,{"autocompact.request.id":p,"autocompact.cycle":m,"autocompact.pass":i,"autocompact.snapshot_leaf_id":g.doomAutocompact.snapshotLeafId,"autocompact.tokens_before":g.doomAutocompact.tokensBefore,"autocompact.message_count.before":l.length,"autocompact.message_count.retained":g.retainedMessages.length,"autocompact.apply_mode":v?`idle`:`turn_end`,...b(S)})),v&&ee(`Asynchronous compaction completed.`),!0},ie=(e,i,a)=>{if(!j)return;let o=M,s=i.sessionManager.getBranch(),c=f(i),l=t.createRequestId(i.sessionManager.getSessionId(),N.cycle,e,c),d=e>1?t.checkpointSummaryFromEntry(t.latestCheckpointArtifactEntry(s)):void 0,p=C(e,s,N.latestCheckpointSnapshotLeafId),v=g(L),y=u(i,{"autocompact.request.id":l,"autocompact.cycle":N.cycle,"autocompact.pass":e,"autocompact.snapshot_leaf_id":c,"autocompact.tokens_before":a,"autocompact.message_count.before":p.length});q(i,v,y),N.phase=n.STATE_PHASE.checkpointPending,N.pass=e,N.requestId=l,N.snapshotLeafId=c,N.snapshotTokens=a,delete N.pendingCheckpoint,delete N.compactionPass,delete N.lastAttemptLeafId,H(),F?.abort(),F=new AbortController;let b=F.signal,x=_.runInSpan(`doom_autocompact.checkpoint`,y,async()=>{await _.recordEvent(r.AUTOCOMPACT_EVENT.checkpointStarted,y);try{let t=await h({messages:p,instructions:S(e,{plan:m(s),contextContributions:v,readFiles:N.readFiles,modifiedFiles:N.modifiedFiles}),...d?{previousCheckpoint:d}:{},context:i,signal:b});if(!j||o!==M)throw b.reason??Error(`Autocompact checkpoint became stale.`);if(!t.trim())throw Error(`Summarization returned an empty checkpoint.`);return await _.recordEvent(r.AUTOCOMPACT_EVENT.checkpointCompleted,{...y,"autocompact.checkpoint.characters":t.length}),t}catch(e){throw j&&o===M&&await _.recordError(r.AUTOCOMPACT_EVENT.checkpointFailed,e,y),e}}).then(e=>{j&&o===M&&l===N.requestId&&N.phase===n.STATE_PHASE.checkpointPending&&(N.phase=n.STATE_PHASE.checkpointReady,N.pendingCheckpoint=e.trim(),H(),P&&Q(P))}).catch(e=>{j&&o===M&&te(l,e)});A.add(x),x.finally(()=>A.delete(x))},Y=e=>{if(!j||N.phase!==n.STATE_PHASE.waiting||e.hasPendingMessages())return!1;let r=T(e.cwd,t=>ne(e,t));if(!r.enabled)return!1;let a=e.getContextUsage();if(!a||a.tokens===null)return!1;if(N.baselinePending)return t.baselineUsageIsSettled(e.sessionManager.getBranch())?(N.baselineTokens=a.tokens,N.baselinePending=!1,H(),!1):!1;let o=f(e);if(N.lastAttemptLeafId===o)return!1;let s=i.resolveModelTokenOverrides(e.model,r.overrides),c=t.effectiveThresholds(a.contextWindow,N.baselineTokens,r.ratios,s);for(let e of[1,2,3])e<N.pass||N.checkpointQueue.includes(e)||N.exhaustedPasses.includes(e)||a.tokens>=c[e]&&N.checkpointQueue.push(e);let l=N.checkpointQueue[0];return l?(ie(l,e,a.tokens),!0):!1},X=(n,r)=>{if(!j)return;let i=N.snapshotLeafId;a.appendEntry(e.CHECKPOINT_MESSAGE_TYPE,{...t.checkpointRequestDetails(N.cycle,n,N.requestId??`completed`),summary:r}),i&&(N.latestCheckpointSnapshotLeafId=i)},Z=e=>{if(!j||N.phase!==n.STATE_PHASE.checkpointReady||!N.requestId||!N.pendingCheckpoint)return`none`;let i=N.pass,a=t.parseCheckpointDecision(N.pendingCheckpoint);if(!t.isStructuredCheckpoint(a.summary)){let t=N.snapshotLeafId,n=N.requestId,{attempts:a,exhausted:o}=K(i,t),s=Error(`Summarization pass ${i} returned an incomplete checkpoint.`);return O(e,o?`Doom autocompact summarization pass ${i} returned an incomplete checkpoint ${a} times and was abandoned.`:`Doom autocompact summarization pass ${i} returned an incomplete checkpoint.`,`error`),_.recordError(r.AUTOCOMPACT_EVENT.checkpointInvalid,s,u(e,{"autocompact.cycle":N.cycle,"autocompact.pass":i,"autocompact.checkpoint.attempts":a,"autocompact.checkpoint.exhausted":o,...n?{"autocompact.request.id":n}:{}})),`invalid`}return N.invalidAttempts=0,i===1?(X(1,a.summary),W(1),N.phase=n.STATE_PHASE.waiting,N.pass=2,U(),H(),`pass1`):i===2&&a.shouldCompact!==!0?(X(2,a.summary),W(2),N.phase=n.STATE_PHASE.waiting,N.pass=3,U(),H(),`deferred`):(N.pendingCheckpoint=a.summary,re(i,e)?`committed`:`invalid`)};function Q(e){j&&(P=e,e.isIdle()&&Z(e)!==`committed`&&Y(e))}let $=e=>{j&&(M+=1,F?.abort(Error(`Autocompact session generation was replaced.`)),F=void 0,w.clear(),k.clear(),P=e,G(e),Q(e))},ae=(e,n)=>{if(!j)return;let i=t.projectContextMessages(e.messages,n.sessionManager.getBranch());if(i.invalidMarker){let e=n.sessionManager.getLeafId()??`@root`;k.has(e)||(k.add(e),_.recordError(r.AUTOCOMPACT_EVENT.contextMarkerInvalid,Error(`Doom autocompact context marker is malformed.`),u(n,{"autocompact.leaf_id":e})));return}if(i.marker)return w.has(i.marker.requestId)||(w.add(i.marker.requestId),_.recordEvent(r.AUTOCOMPACT_EVENT.contextApplied,u(n,{"autocompact.request.id":i.marker.requestId,"autocompact.cycle":i.marker.cycle,"autocompact.pass":i.marker.pass,"autocompact.snapshot_leaf_id":i.marker.snapshotLeafId,"autocompact.tokens_before":i.marker.tokensBefore,"autocompact.message_count.before":e.messages.length,"autocompact.message_count.after":i.messages.length,"autocompact.message_count.retained":i.retainedMessageCount}))),{messages:i.messages}};return{plugin:B,stop:z,events:{context:(e,t)=>{let n=Date.now();try{return ae(e,t)}finally{let i=Date.now()-n;i>=25&&_.recordEvent(r.AUTOCOMPACT_EVENT.contextHookSlow,u(t,{hook_ms:i,"autocompact.message_count":e.messages.length}))}},session_start:(e,t)=>$(t),session_tree:(e,t)=>$(t),turn_end:(e,t)=>{if(j){if(P=t,t.isIdle()){Q(t);return}N.phase===n.STATE_PHASE.checkpointReady&&(e.toolResults?.length??0)>0&&!t.hasPendingMessages()&&Z(t)!==`none`||Y(t)}},agent_settled:(e,t)=>{j&&Q(t)},session_before_compact:e=>{if(j&&e.reason===`threshold`)return N.phase===n.STATE_PHASE.checkpointPending||N.phase===n.STATE_PHASE.checkpointReady||N.baselinePending?{cancel:!0}:void 0},session_compact:(e,i)=>{if(!j)return;M+=1,F?.abort(),F=void 0;let o=t.fileDetailsFromUnknown(e.compactionEntry.details),s=t.mergeFileDetails(N,void 0,o);N.readFiles=s.readFiles,N.modifiedFiles=s.modifiedFiles,delete N.latestCheckpointSnapshotLeafId,N.baselinePending=!0,N.phase=n.STATE_PHASE.waiting,U(),N.checkpointQueue=[],N.exhaustedPasses=[],N.invalidAttempts=0,delete N.lastAttemptLeafId,a.setLabel(e.compactionEntry.id,`autocompact:c${N.cycle}:external`);let c=N.cycle,l=u(i,{"autocompact.cycle":c,"autocompact.native.reason":e.reason}),d=J(i,i.sessionManager.getBranch(),l);N.cycle+=1,N.pass=1,H(),_.recordEvent(r.AUTOCOMPACT_EVENT.nativeCompactionCompleted,u(i,{"autocompact.cycle":c,"autocompact.native.reason":e.reason,"autocompact.native.from_extension":e.fromExtension,"autocompact.tokens_before":e.compactionEntry.tokensBefore,...b(d)}))}}}}exports.autocompactRuntimeConfig=T,exports.createAutocompactRuntime=k,exports.generateCheckpointWithPi=D,exports.resolveDoomSummarizationModel=E;
44
+ //# sourceMappingURL=index.cjs.map