@bastani/atomic 0.9.4 → 0.9.5-alpha.10

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 (759) hide show
  1. package/CHANGELOG.md +136 -2
  2. package/README.md +2 -2
  3. package/dist/builtin/cursor/CHANGELOG.md +6 -0
  4. package/dist/builtin/cursor/package.json +3 -3
  5. package/dist/builtin/cursor/src/model-mapper.ts +6 -3
  6. package/dist/builtin/intercom/CHANGELOG.md +31 -0
  7. package/dist/builtin/intercom/README.md +29 -21
  8. package/dist/builtin/intercom/broker/broker.ts +9 -120
  9. package/dist/builtin/intercom/broker/client.ts +29 -54
  10. package/dist/builtin/intercom/broker/delivered-message-cache.ts +44 -0
  11. package/dist/builtin/intercom/broker/paths.ts +42 -5
  12. package/dist/builtin/intercom/broker/pending-send-registry.ts +142 -0
  13. package/dist/builtin/intercom/broker/send-handler.ts +106 -0
  14. package/dist/builtin/intercom/broker/send-signature.ts +37 -0
  15. package/dist/builtin/intercom/broker/spawn.ts +78 -10
  16. package/dist/builtin/intercom/config.ts +6 -3
  17. package/dist/builtin/intercom/contact-supervisor-tool.ts +6 -4
  18. package/dist/builtin/intercom/foreground-detach-handoff.ts +136 -0
  19. package/dist/builtin/intercom/index-heavy.ts +50 -54
  20. package/dist/builtin/intercom/index.ts +320 -272
  21. package/dist/builtin/intercom/intercom-tool.ts +9 -3
  22. package/dist/builtin/intercom/lazy-heavy-proxy.ts +114 -0
  23. package/dist/builtin/intercom/lazy-subagent-ack.ts +20 -0
  24. package/dist/builtin/intercom/lazy-tool-execution.ts +39 -0
  25. package/dist/builtin/intercom/lifecycle-lease.ts +51 -0
  26. package/dist/builtin/intercom/lifecycle.ts +37 -20
  27. package/dist/builtin/intercom/package.json +12 -6
  28. package/dist/builtin/intercom/reply-routing.ts +17 -0
  29. package/dist/builtin/intercom/result-renderers.ts +1 -1
  30. package/dist/builtin/intercom/subagent-relay.ts +58 -12
  31. package/dist/builtin/intercom/types.ts +3 -3
  32. package/dist/builtin/intercom/ui/compose.ts +2 -2
  33. package/dist/builtin/intercom/ui/inline-message.ts +2 -2
  34. package/dist/builtin/intercom/ui/session-list.ts +2 -2
  35. package/dist/builtin/mcp/CHANGELOG.md +23 -0
  36. package/dist/builtin/mcp/OAUTH.md +1 -0
  37. package/dist/builtin/mcp/README.md +10 -6
  38. package/dist/builtin/mcp/apps-cancellation.ts +32 -0
  39. package/dist/builtin/mcp/call-tool-result.ts +9 -0
  40. package/dist/builtin/mcp/caller-wait.ts +50 -0
  41. package/dist/builtin/mcp/command-registration.ts +82 -0
  42. package/dist/builtin/mcp/direct-tool-executor.ts +279 -0
  43. package/dist/builtin/mcp/direct-tools.ts +40 -255
  44. package/dist/builtin/mcp/host-html-template.ts +4 -2
  45. package/dist/builtin/mcp/index.ts +274 -239
  46. package/dist/builtin/mcp/init.ts +96 -126
  47. package/dist/builtin/mcp/mcp-auth-flow.ts +247 -237
  48. package/dist/builtin/mcp/mcp-callback-server.ts +89 -68
  49. package/dist/builtin/mcp/mcp-oauth-provider.ts +23 -1
  50. package/dist/builtin/mcp/metadata-hydration.ts +52 -0
  51. package/dist/builtin/mcp/package.json +3 -3
  52. package/dist/builtin/mcp/proxy-auth.ts +4 -4
  53. package/dist/builtin/mcp/proxy-call.ts +111 -40
  54. package/dist/builtin/mcp/proxy-connect.ts +35 -15
  55. package/dist/builtin/mcp/proxy-info-modes.ts +106 -23
  56. package/dist/builtin/mcp/proxy-modes.ts +3 -3
  57. package/dist/builtin/mcp/session-cleanup-barrier.ts +43 -0
  58. package/dist/builtin/mcp/startup-warmup.ts +98 -0
  59. package/dist/builtin/mcp/state-lease.ts +12 -0
  60. package/dist/builtin/mcp/tool-result-renderer.ts +3 -3
  61. package/dist/builtin/mcp/ui-server.ts +8 -8
  62. package/dist/builtin/mcp/ui-session.ts +9 -18
  63. package/dist/builtin/subagents/CHANGELOG.md +60 -0
  64. package/dist/builtin/subagents/README.md +30 -29
  65. package/dist/builtin/subagents/agents/code-simplifier.md +2 -2
  66. package/dist/builtin/subagents/agents/codebase-analyzer.md +2 -2
  67. package/dist/builtin/subagents/agents/codebase-locator.md +2 -2
  68. package/dist/builtin/subagents/agents/codebase-online-researcher.md +2 -2
  69. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +2 -2
  70. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +2 -2
  71. package/dist/builtin/subagents/agents/codebase-research-locator.md +2 -2
  72. package/dist/builtin/subagents/agents/debugger.md +2 -2
  73. package/dist/builtin/subagents/agents/worker.md +2 -2
  74. package/dist/builtin/subagents/package.json +5 -5
  75. package/dist/builtin/subagents/prompts/review-loop.md +1 -1
  76. package/dist/builtin/subagents/skills/subagent/SKILL.md +37 -36
  77. package/dist/builtin/subagents/src/extension/api-lifecycle.ts +64 -0
  78. package/dist/builtin/subagents/src/extension/fanout-child.ts +44 -51
  79. package/dist/builtin/subagents/src/extension/index.ts +289 -320
  80. package/dist/builtin/subagents/src/extension/prompt-guidance.ts +7 -10
  81. package/dist/builtin/subagents/src/extension/schemas.ts +22 -5
  82. package/dist/builtin/subagents/src/extension/startup-maintenance.ts +89 -0
  83. package/dist/builtin/subagents/src/extension/tool-description.ts +29 -0
  84. package/dist/builtin/subagents/src/intercom/intercom-bridge.ts +13 -2
  85. package/dist/builtin/subagents/src/intercom/result-intercom.ts +4 -4
  86. package/dist/builtin/subagents/src/runs/background/async-event-journal.ts +106 -0
  87. package/dist/builtin/subagents/src/runs/background/async-execution-common.ts +26 -20
  88. package/dist/builtin/subagents/src/runs/background/async-execution-single.ts +13 -2
  89. package/dist/builtin/subagents/src/runs/background/async-execution-types.ts +3 -0
  90. package/dist/builtin/subagents/src/runs/background/async-job-tracker.ts +1 -1
  91. package/dist/builtin/subagents/src/runs/background/completion-claims.ts +189 -0
  92. package/dist/builtin/subagents/src/runs/background/completion-dedupe.ts +44 -7
  93. package/dist/builtin/subagents/src/runs/background/completion-notification.ts +34 -0
  94. package/dist/builtin/subagents/src/runs/background/notify.ts +72 -22
  95. package/dist/builtin/subagents/src/runs/background/result-delivery-processor.ts +232 -0
  96. package/dist/builtin/subagents/src/runs/background/result-file-claims.ts +151 -0
  97. package/dist/builtin/subagents/src/runs/background/result-quarantine.ts +72 -0
  98. package/dist/builtin/subagents/src/runs/background/result-retry-scheduler.ts +48 -0
  99. package/dist/builtin/subagents/src/runs/background/result-status.ts +81 -0
  100. package/dist/builtin/subagents/src/runs/background/result-watcher-data.ts +59 -0
  101. package/dist/builtin/subagents/src/runs/background/result-watcher.ts +177 -233
  102. package/dist/builtin/subagents/src/runs/background/run-id-resolver.ts +3 -2
  103. package/dist/builtin/subagents/src/runs/background/stale-run-reconciler.ts +73 -14
  104. package/dist/builtin/subagents/src/runs/background/subagent-runner-streaming.ts +29 -15
  105. package/dist/builtin/subagents/src/runs/background/top-level-async.ts +1 -2
  106. package/dist/builtin/subagents/src/runs/foreground/chain-execution-dynamic-step.ts +1 -0
  107. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-runner.ts +1 -0
  108. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-step.ts +1 -0
  109. package/dist/builtin/subagents/src/runs/foreground/chain-execution-sequential-step.ts +7 -9
  110. package/dist/builtin/subagents/src/runs/foreground/chain-execution-types.ts +3 -13
  111. package/dist/builtin/subagents/src/runs/foreground/chain-execution.ts +2 -15
  112. package/dist/builtin/subagents/src/runs/foreground/execution-attempt-finalize.ts +2 -2
  113. package/dist/builtin/subagents/src/runs/foreground/execution-attempt.ts +63 -46
  114. package/dist/builtin/subagents/src/runs/foreground/execution-detach-reservations.ts +48 -0
  115. package/dist/builtin/subagents/src/runs/foreground/execution-detach-route.ts +17 -0
  116. package/dist/builtin/subagents/src/runs/foreground/execution-run-sync.ts +39 -26
  117. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-async.ts +3 -1
  118. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-chain.ts +3 -51
  119. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-context.ts +6 -11
  120. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-input.ts +11 -2
  121. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +2 -0
  122. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +5 -112
  123. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-resume.ts +2 -0
  124. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +68 -118
  125. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-status.ts +79 -7
  126. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +2 -2
  127. package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +3 -0
  128. package/dist/builtin/subagents/src/runs/shared/pi-args.ts +2 -2
  129. package/dist/builtin/subagents/src/runs/shared/pi-spawn.ts +55 -12
  130. package/dist/builtin/subagents/src/shared/artifacts.ts +22 -11
  131. package/dist/builtin/subagents/src/shared/event-jsonl-writer.ts +294 -0
  132. package/dist/builtin/subagents/src/shared/exclusive-file-publication.ts +44 -0
  133. package/dist/builtin/subagents/src/shared/jsonl-writer.ts +1 -0
  134. package/dist/builtin/subagents/src/shared/model-info.ts +2 -2
  135. package/dist/builtin/subagents/src/shared/settings.ts +20 -10
  136. package/dist/builtin/subagents/src/shared/types-async.ts +3 -1
  137. package/dist/builtin/subagents/src/shared/types-config.ts +2 -0
  138. package/dist/builtin/subagents/src/shared/types-runtime.ts +3 -2
  139. package/dist/builtin/subagents/src/slash/slash-commands.ts +9 -12
  140. package/dist/builtin/subagents/src/slash/slash-live-state.ts +63 -32
  141. package/dist/builtin/subagents/src/tui/render-event-formatting.ts +15 -48
  142. package/dist/builtin/subagents/src/tui/render-layout.ts +9 -0
  143. package/dist/builtin/subagents/src/tui/render-result.ts +7 -0
  144. package/dist/builtin/subagents/src/tui/render-stable-output.ts +1 -0
  145. package/dist/builtin/subagents/src/tui/render-widget-graph.ts +27 -25
  146. package/dist/builtin/subagents/src/tui/render-widget.ts +177 -132
  147. package/dist/builtin/subagents/src/tui/render.ts +1 -1
  148. package/dist/builtin/web-access/CHANGELOG.md +14 -0
  149. package/dist/builtin/web-access/README.md +4 -0
  150. package/dist/builtin/web-access/content-tools.ts +8 -3
  151. package/dist/builtin/web-access/index-heavy.ts +1 -1
  152. package/dist/builtin/web-access/index.ts +190 -46
  153. package/dist/builtin/web-access/lifecycle-lease.ts +38 -0
  154. package/dist/builtin/web-access/package.json +2 -2
  155. package/dist/builtin/web-access/result-renderers.ts +1 -1
  156. package/dist/builtin/web-access/summary-review.ts +1 -1
  157. package/dist/builtin/web-access/web-search-activity.ts +1 -1
  158. package/dist/builtin/web-access/web-search-return.ts +7 -0
  159. package/dist/builtin/web-access/web-search-summary.ts +1 -1
  160. package/dist/builtin/web-access/web-search-tool.ts +4 -2
  161. package/dist/builtin/workflows/CHANGELOG.md +98 -0
  162. package/dist/builtin/workflows/README.md +20 -16
  163. package/dist/builtin/workflows/builtin/deep-research-codebase-utils.ts +33 -9
  164. package/dist/builtin/workflows/builtin/goal-artifacts.ts +3 -1
  165. package/dist/builtin/workflows/builtin/goal-ledger.ts +3 -0
  166. package/dist/builtin/workflows/builtin/goal-prompts.ts +39 -5
  167. package/dist/builtin/workflows/builtin/goal-reducer.ts +21 -0
  168. package/dist/builtin/workflows/builtin/goal-reports.ts +23 -0
  169. package/dist/builtin/workflows/builtin/goal-review.ts +85 -6
  170. package/dist/builtin/workflows/builtin/goal-runner.ts +122 -49
  171. package/dist/builtin/workflows/builtin/goal-schemas.ts +22 -0
  172. package/dist/builtin/workflows/builtin/goal-types.ts +25 -1
  173. package/dist/builtin/workflows/builtin/goal.d.ts +5 -0
  174. package/dist/builtin/workflows/builtin/goal.ts +13 -2
  175. package/dist/builtin/workflows/builtin/index.d.ts +8 -0
  176. package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +16 -5
  177. package/dist/builtin/workflows/builtin/ralph-core.ts +100 -15
  178. package/dist/builtin/workflows/builtin/ralph-models.ts +98 -66
  179. package/dist/builtin/workflows/builtin/ralph-review-gate.ts +37 -5
  180. package/dist/builtin/workflows/builtin/ralph-reviewer-prompt.ts +159 -0
  181. package/dist/builtin/workflows/builtin/ralph-runner.ts +75 -165
  182. package/dist/builtin/workflows/builtin/ralph.d.ts +3 -0
  183. package/dist/builtin/workflows/builtin/ralph.ts +4 -1
  184. package/dist/builtin/workflows/builtin/review-convergence.ts +111 -0
  185. package/dist/builtin/workflows/builtin/shared-prompts.ts +20 -1
  186. package/dist/builtin/workflows/package.json +2 -2
  187. package/dist/builtin/workflows/skills/create-spec/SKILL.md +2 -0
  188. package/dist/builtin/workflows/skills/impeccable/SKILL.md +16 -13
  189. package/dist/builtin/workflows/skills/impeccable/reference/adapt.md +1 -0
  190. package/dist/builtin/workflows/skills/impeccable/reference/adapt.native.md +58 -0
  191. package/dist/builtin/workflows/skills/impeccable/reference/android.md +40 -0
  192. package/dist/builtin/workflows/skills/impeccable/reference/animate.md +2 -0
  193. package/dist/builtin/workflows/skills/impeccable/reference/audit.md +2 -0
  194. package/dist/builtin/workflows/skills/impeccable/reference/audit.native.md +139 -0
  195. package/dist/builtin/workflows/skills/impeccable/reference/bolder.md +69 -62
  196. package/dist/builtin/workflows/skills/impeccable/reference/critique.md +21 -7
  197. package/dist/builtin/workflows/skills/impeccable/reference/document.md +1 -1
  198. package/dist/builtin/workflows/skills/impeccable/reference/hooks.md +92 -0
  199. package/dist/builtin/workflows/skills/impeccable/reference/init.md +29 -7
  200. package/dist/builtin/workflows/skills/impeccable/reference/ios.md +45 -0
  201. package/dist/builtin/workflows/skills/impeccable/reference/layout.md +25 -1
  202. package/dist/builtin/workflows/skills/impeccable/reference/typeset.md +23 -1
  203. package/dist/builtin/workflows/skills/impeccable/scripts/context-signals.mjs +2 -1
  204. package/dist/builtin/workflows/skills/impeccable/scripts/context.mjs +75 -14
  205. package/dist/builtin/workflows/skills/impeccable/scripts/detector/browser/injected/index.mjs +1 -1
  206. package/dist/builtin/workflows/skills/impeccable/scripts/detector/cli/main.mjs +31 -0
  207. package/dist/builtin/workflows/skills/impeccable/scripts/detector/design-system.mjs +64 -0
  208. package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +118 -11
  209. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +16 -11
  210. package/dist/builtin/workflows/skills/impeccable/scripts/detector/registry/antipatterns.mjs +66 -0
  211. package/dist/builtin/workflows/skills/impeccable/scripts/detector/rules/checks.mjs +42 -10
  212. package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/fonts.mjs +30 -0
  213. package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/page.mjs +4 -6
  214. package/dist/builtin/workflows/skills/impeccable/scripts/hook-admin.mjs +660 -0
  215. package/dist/builtin/workflows/skills/impeccable/scripts/hook-before-edit.mjs +516 -0
  216. package/dist/builtin/workflows/skills/impeccable/scripts/hook-lib.mjs +1764 -0
  217. package/dist/builtin/workflows/skills/impeccable/scripts/hook.mjs +61 -0
  218. package/dist/builtin/workflows/skills/impeccable/scripts/lib/impeccable-config.mjs +4 -2
  219. package/dist/builtin/workflows/skills/impeccable/scripts/lib/is-generated.mjs +2 -2
  220. package/dist/builtin/workflows/skills/impeccable/scripts/live/svelte-component.mjs +13 -16
  221. package/dist/builtin/workflows/skills/impeccable/scripts/live-accept.mjs +17 -11
  222. package/dist/builtin/workflows/skills/impeccable/scripts/live-browser.js +104 -37
  223. package/dist/builtin/workflows/skills/impeccable/scripts/live-wrap.mjs +9 -0
  224. package/dist/builtin/workflows/src/durable/backend.ts +12 -0
  225. package/dist/builtin/workflows/src/durable/child-primitive.ts +12 -8
  226. package/dist/builtin/workflows/src/durable/dbos-backend.ts +63 -2
  227. package/dist/builtin/workflows/src/durable/dbos-envelope.ts +28 -0
  228. package/dist/builtin/workflows/src/durable/resume-catalog.ts +12 -0
  229. package/dist/builtin/workflows/src/durable/resume-runtime.ts +5 -2
  230. package/dist/builtin/workflows/src/durable/stage-primitive.ts +167 -28
  231. package/dist/builtin/workflows/src/durable/types.ts +30 -1
  232. package/dist/builtin/workflows/src/engine/primitives/task.ts +3 -1
  233. package/dist/builtin/workflows/src/engine/run-durable-finalize.ts +1 -2
  234. package/dist/builtin/workflows/src/engine/run-returned-status.ts +50 -16
  235. package/dist/builtin/workflows/src/engine/run.ts +32 -32
  236. package/dist/builtin/workflows/src/engine/runtime.ts +5 -0
  237. package/dist/builtin/workflows/src/extension/extension-factory.ts +3 -0
  238. package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +9 -2
  239. package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +137 -27
  240. package/dist/builtin/workflows/src/extension/lifecycle-notifications.ts +22 -6
  241. package/dist/builtin/workflows/src/extension/public-types.ts +1 -1
  242. package/dist/builtin/workflows/src/extension/workflow-command-completions.ts +13 -1
  243. package/dist/builtin/workflows/src/extension/workflow-command-registration.ts +19 -4
  244. package/dist/builtin/workflows/src/extension/workflow-command-surfaces.ts +9 -0
  245. package/dist/builtin/workflows/src/extension/workflow-prompts.ts +17 -17
  246. package/dist/builtin/workflows/src/extension/workflow-run-control-command.ts +48 -23
  247. package/dist/builtin/workflows/src/extension/workflow-schema.ts +15 -2
  248. package/dist/builtin/workflows/src/extension/workflow-tool-control.ts +20 -8
  249. package/dist/builtin/workflows/src/extension/workflow-tool.ts +24 -8
  250. package/dist/builtin/workflows/src/runs/background/status.ts +4 -3
  251. package/dist/builtin/workflows/src/runs/foreground/executor-continuation.ts +13 -3
  252. package/dist/builtin/workflows/src/runs/foreground/executor-direct-helpers.ts +29 -8
  253. package/dist/builtin/workflows/src/runs/foreground/executor-hil.ts +1 -1
  254. package/dist/builtin/workflows/src/runs/foreground/executor-stage-control.ts +8 -0
  255. package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +4 -3
  256. package/dist/builtin/workflows/src/runs/foreground/stage-control-registry.ts +2 -0
  257. package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +18 -19
  258. package/dist/builtin/workflows/src/runs/foreground/stage-runner-unresolved-overflow.ts +38 -0
  259. package/dist/builtin/workflows/src/runs/foreground/stage-tool-execution-buffer.ts +47 -0
  260. package/dist/builtin/workflows/src/runs/shared/model-fallback-candidates.ts +1 -1
  261. package/dist/builtin/workflows/src/runs/shared/worktree-git.ts +155 -20
  262. package/dist/builtin/workflows/src/runs/shared/worktree-types.ts +6 -0
  263. package/dist/builtin/workflows/src/runs/shared/worktree.ts +2 -1
  264. package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +2 -2
  265. package/dist/builtin/workflows/src/shared/authoring-contract-stage.ts +2 -2
  266. package/dist/builtin/workflows/src/shared/persistence-restore-helpers.ts +18 -1
  267. package/dist/builtin/workflows/src/shared/persistence-restore.ts +23 -5
  268. package/dist/builtin/workflows/src/shared/persistence-session-entries.ts +4 -0
  269. package/dist/builtin/workflows/src/shared/resume-continuation.ts +2 -0
  270. package/dist/builtin/workflows/src/shared/returned-run-status.ts +116 -0
  271. package/dist/builtin/workflows/src/shared/workflow-failures-decisions.ts +2 -0
  272. package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +21 -3
  273. package/dist/builtin/workflows/src/tui/graph-view-state.ts +3 -0
  274. package/dist/builtin/workflows/src/tui/graph-view-types.ts +3 -0
  275. package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +1 -23
  276. package/dist/builtin/workflows/src/tui/stage-chat-view-footer-status.ts +54 -9
  277. package/dist/builtin/workflows/src/tui/stage-chat-view-pending-tools.ts +9 -0
  278. package/dist/builtin/workflows/src/tui/stage-chat-view-render-settings.ts +27 -0
  279. package/dist/builtin/workflows/src/tui/stage-chat-view-state.ts +5 -6
  280. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +5 -2
  281. package/dist/builtin/workflows/src/tui/status-list.ts +22 -15
  282. package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +4 -4
  283. package/dist/bun/internal-intercom-broker.d.ts +6 -0
  284. package/dist/bun/internal-intercom-broker.d.ts.map +1 -0
  285. package/dist/bun/internal-intercom-broker.js +39 -0
  286. package/dist/bun/internal-intercom-broker.js.map +1 -0
  287. package/dist/bun/split-loader.d.ts +2 -0
  288. package/dist/bun/split-loader.d.ts.map +1 -0
  289. package/dist/bun/split-loader.js +50 -0
  290. package/dist/bun/split-loader.js.map +1 -0
  291. package/dist/cli/args.d.ts.map +1 -1
  292. package/dist/cli/args.js +2 -2
  293. package/dist/cli/args.js.map +1 -1
  294. package/dist/config.d.ts.map +1 -1
  295. package/dist/config.js +6 -4
  296. package/dist/config.js.map +1 -1
  297. package/dist/core/agent-session-auto-compaction.d.ts +26 -6
  298. package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
  299. package/dist/core/agent-session-auto-compaction.js +178 -19
  300. package/dist/core/agent-session-auto-compaction.js.map +1 -1
  301. package/dist/core/agent-session-compaction.d.ts.map +1 -1
  302. package/dist/core/agent-session-compaction.js +25 -4
  303. package/dist/core/agent-session-compaction.js.map +1 -1
  304. package/dist/core/agent-session-events.d.ts.map +1 -1
  305. package/dist/core/agent-session-events.js +12 -2
  306. package/dist/core/agent-session-events.js.map +1 -1
  307. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  308. package/dist/core/agent-session-extension-bindings.js +1 -1
  309. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  310. package/dist/core/agent-session-message-queue.d.ts.map +1 -1
  311. package/dist/core/agent-session-message-queue.js +1 -1
  312. package/dist/core/agent-session-message-queue.js.map +1 -1
  313. package/dist/core/agent-session-methods.d.ts +13 -4
  314. package/dist/core/agent-session-methods.d.ts.map +1 -1
  315. package/dist/core/agent-session-methods.js.map +1 -1
  316. package/dist/core/agent-session-models.d.ts +2 -2
  317. package/dist/core/agent-session-models.d.ts.map +1 -1
  318. package/dist/core/agent-session-models.js.map +1 -1
  319. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  320. package/dist/core/agent-session-prompt.js +2 -1
  321. package/dist/core/agent-session-prompt.js.map +1 -1
  322. package/dist/core/agent-session-retry.d.ts +2 -0
  323. package/dist/core/agent-session-retry.d.ts.map +1 -1
  324. package/dist/core/agent-session-retry.js +152 -4
  325. package/dist/core/agent-session-retry.js.map +1 -1
  326. package/dist/core/agent-session-services.d.ts +1 -0
  327. package/dist/core/agent-session-services.d.ts.map +1 -1
  328. package/dist/core/agent-session-services.js +4 -2
  329. package/dist/core/agent-session-services.js.map +1 -1
  330. package/dist/core/agent-session-types.d.ts +15 -1
  331. package/dist/core/agent-session-types.d.ts.map +1 -1
  332. package/dist/core/agent-session-types.js +1 -1
  333. package/dist/core/agent-session-types.js.map +1 -1
  334. package/dist/core/agent-session.d.ts +6 -0
  335. package/dist/core/agent-session.d.ts.map +1 -1
  336. package/dist/core/agent-session.js +6 -0
  337. package/dist/core/agent-session.js.map +1 -1
  338. package/dist/core/anthropic-thinking-guard.d.ts +5 -5
  339. package/dist/core/anthropic-thinking-guard.d.ts.map +1 -1
  340. package/dist/core/anthropic-thinking-guard.js +42 -32
  341. package/dist/core/anthropic-thinking-guard.js.map +1 -1
  342. package/dist/core/atomic-guide-command.d.ts.map +1 -1
  343. package/dist/core/atomic-guide-command.js +15 -15
  344. package/dist/core/atomic-guide-command.js.map +1 -1
  345. package/dist/core/auth-storage.d.ts.map +1 -1
  346. package/dist/core/auth-storage.js +14 -9
  347. package/dist/core/auth-storage.js.map +1 -1
  348. package/dist/core/builtin-packages.d.ts.map +1 -1
  349. package/dist/core/builtin-packages.js +8 -4
  350. package/dist/core/builtin-packages.js.map +1 -1
  351. package/dist/core/compaction/compaction.d.ts +2 -0
  352. package/dist/core/compaction/compaction.d.ts.map +1 -1
  353. package/dist/core/compaction/compaction.js +79 -46
  354. package/dist/core/compaction/compaction.js.map +1 -1
  355. package/dist/core/compaction/context-assistant-turns.d.ts +42 -0
  356. package/dist/core/compaction/context-assistant-turns.d.ts.map +1 -0
  357. package/dist/core/compaction/context-assistant-turns.js +87 -0
  358. package/dist/core/compaction/context-assistant-turns.js.map +1 -0
  359. package/dist/core/compaction/context-compaction-critical.d.ts +15 -0
  360. package/dist/core/compaction/context-compaction-critical.d.ts.map +1 -0
  361. package/dist/core/compaction/context-compaction-critical.js +57 -0
  362. package/dist/core/compaction/context-compaction-critical.js.map +1 -0
  363. package/dist/core/compaction/context-compaction-eviction-alternates.d.ts +18 -0
  364. package/dist/core/compaction/context-compaction-eviction-alternates.d.ts.map +1 -0
  365. package/dist/core/compaction/context-compaction-eviction-alternates.js +186 -0
  366. package/dist/core/compaction/context-compaction-eviction-alternates.js.map +1 -0
  367. package/dist/core/compaction/context-compaction-eviction.d.ts +12 -0
  368. package/dist/core/compaction/context-compaction-eviction.d.ts.map +1 -0
  369. package/dist/core/compaction/context-compaction-eviction.js +222 -0
  370. package/dist/core/compaction/context-compaction-eviction.js.map +1 -0
  371. package/dist/core/compaction/context-compaction-prompt.d.ts.map +1 -1
  372. package/dist/core/compaction/context-compaction-prompt.js +1 -1
  373. package/dist/core/compaction/context-compaction-prompt.js.map +1 -1
  374. package/dist/core/compaction/context-compaction-runner.d.ts +7 -1
  375. package/dist/core/compaction/context-compaction-runner.d.ts.map +1 -1
  376. package/dist/core/compaction/context-compaction-runner.js +113 -21
  377. package/dist/core/compaction/context-compaction-runner.js.map +1 -1
  378. package/dist/core/compaction/context-compaction-types.d.ts +2 -0
  379. package/dist/core/compaction/context-compaction-types.d.ts.map +1 -1
  380. package/dist/core/compaction/context-compaction-types.js.map +1 -1
  381. package/dist/core/compaction/context-deletion-application.d.ts +5 -4
  382. package/dist/core/compaction/context-deletion-application.d.ts.map +1 -1
  383. package/dist/core/compaction/context-deletion-application.js +17 -15
  384. package/dist/core/compaction/context-deletion-application.js.map +1 -1
  385. package/dist/core/compaction/context-deletion-store.d.ts.map +1 -1
  386. package/dist/core/compaction/context-deletion-store.js +1 -1
  387. package/dist/core/compaction/context-deletion-store.js.map +1 -1
  388. package/dist/core/compaction/context-deletion-targets.d.ts +2 -1
  389. package/dist/core/compaction/context-deletion-targets.d.ts.map +1 -1
  390. package/dist/core/compaction/context-deletion-targets.js +36 -31
  391. package/dist/core/compaction/context-deletion-targets.js.map +1 -1
  392. package/dist/core/compaction/context-deletion-tool-helpers.d.ts.map +1 -1
  393. package/dist/core/compaction/context-deletion-tool-helpers.js +116 -43
  394. package/dist/core/compaction/context-deletion-tool-helpers.js.map +1 -1
  395. package/dist/core/compaction/context-transcript-analysis.d.ts +4 -2
  396. package/dist/core/compaction/context-transcript-analysis.d.ts.map +1 -1
  397. package/dist/core/compaction/context-transcript-analysis.js +36 -40
  398. package/dist/core/compaction/context-transcript-analysis.js.map +1 -1
  399. package/dist/core/copilot-anthropic-sse-repair.d.ts +23 -0
  400. package/dist/core/copilot-anthropic-sse-repair.d.ts.map +1 -0
  401. package/dist/core/copilot-anthropic-sse-repair.js +340 -0
  402. package/dist/core/copilot-anthropic-sse-repair.js.map +1 -0
  403. package/dist/core/copilot-gemini-reasoning.d.ts +16 -8
  404. package/dist/core/copilot-gemini-reasoning.d.ts.map +1 -1
  405. package/dist/core/copilot-gemini-reasoning.js +27 -22
  406. package/dist/core/copilot-gemini-reasoning.js.map +1 -1
  407. package/dist/core/copilot-hosts.d.ts +12 -0
  408. package/dist/core/copilot-hosts.d.ts.map +1 -0
  409. package/dist/core/copilot-hosts.js +33 -0
  410. package/dist/core/copilot-hosts.js.map +1 -0
  411. package/dist/core/copilot-model-catalog.d.ts.map +1 -1
  412. package/dist/core/copilot-model-catalog.js +3 -2
  413. package/dist/core/copilot-model-catalog.js.map +1 -1
  414. package/dist/core/copilot-model-synthesis.d.ts.map +1 -1
  415. package/dist/core/copilot-model-synthesis.js +3 -1
  416. package/dist/core/copilot-model-synthesis.js.map +1 -1
  417. package/dist/core/extensions/agent-events.d.ts +1 -1
  418. package/dist/core/extensions/agent-events.d.ts.map +1 -1
  419. package/dist/core/extensions/agent-events.js.map +1 -1
  420. package/dist/core/extensions/loader-core.d.ts.map +1 -1
  421. package/dist/core/extensions/loader-core.js +6 -0
  422. package/dist/core/extensions/loader-core.js.map +1 -1
  423. package/dist/core/extensions/loader-virtual-modules.d.ts +8 -1
  424. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  425. package/dist/core/extensions/loader-virtual-modules.js +10 -4
  426. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  427. package/dist/core/extensions/provider-types.d.ts +2 -7
  428. package/dist/core/extensions/provider-types.d.ts.map +1 -1
  429. package/dist/core/extensions/provider-types.js.map +1 -1
  430. package/dist/core/footer-data-provider.d.ts +6 -0
  431. package/dist/core/footer-data-provider.d.ts.map +1 -1
  432. package/dist/core/footer-data-provider.js +72 -29
  433. package/dist/core/footer-data-provider.js.map +1 -1
  434. package/dist/core/http-dispatcher.d.ts.map +1 -1
  435. package/dist/core/http-dispatcher.js +5 -5
  436. package/dist/core/http-dispatcher.js.map +1 -1
  437. package/dist/core/messages.d.ts +9 -0
  438. package/dist/core/messages.d.ts.map +1 -1
  439. package/dist/core/messages.js +100 -18
  440. package/dist/core/messages.js.map +1 -1
  441. package/dist/core/model-registry-builtins.d.ts.map +1 -1
  442. package/dist/core/model-registry-builtins.js +5 -0
  443. package/dist/core/model-registry-builtins.js.map +1 -1
  444. package/dist/core/model-registry-custom-loader.d.ts.map +1 -1
  445. package/dist/core/model-registry-custom-loader.js +49 -8
  446. package/dist/core/model-registry-custom-loader.js.map +1 -1
  447. package/dist/core/model-registry-dynamic.d.ts.map +1 -1
  448. package/dist/core/model-registry-dynamic.js +11 -5
  449. package/dist/core/model-registry-dynamic.js.map +1 -1
  450. package/dist/core/model-registry-loader.d.ts.map +1 -1
  451. package/dist/core/model-registry-loader.js +8 -0
  452. package/dist/core/model-registry-loader.js.map +1 -1
  453. package/dist/core/model-registry-schemas.d.ts +93 -8
  454. package/dist/core/model-registry-schemas.d.ts.map +1 -1
  455. package/dist/core/model-registry-schemas.js +24 -12
  456. package/dist/core/model-registry-schemas.js.map +1 -1
  457. package/dist/core/model-registry-types.d.ts +7 -6
  458. package/dist/core/model-registry-types.d.ts.map +1 -1
  459. package/dist/core/model-registry-types.js.map +1 -1
  460. package/dist/core/model-registry.d.ts +5 -0
  461. package/dist/core/model-registry.d.ts.map +1 -1
  462. package/dist/core/model-registry.js +23 -0
  463. package/dist/core/model-registry.js.map +1 -1
  464. package/dist/core/model-resolver-cli.d.ts.map +1 -1
  465. package/dist/core/model-resolver-cli.js +33 -5
  466. package/dist/core/model-resolver-cli.js.map +1 -1
  467. package/dist/core/model-resolver-initial.d.ts +6 -1
  468. package/dist/core/model-resolver-initial.d.ts.map +1 -1
  469. package/dist/core/model-resolver-initial.js +12 -7
  470. package/dist/core/model-resolver-initial.js.map +1 -1
  471. package/dist/core/model-resolver-scope.d.ts +9 -0
  472. package/dist/core/model-resolver-scope.d.ts.map +1 -1
  473. package/dist/core/model-resolver-scope.js +12 -4
  474. package/dist/core/model-resolver-scope.js.map +1 -1
  475. package/dist/core/model-resolver.d.ts +4 -3
  476. package/dist/core/model-resolver.d.ts.map +1 -1
  477. package/dist/core/model-resolver.js +2 -2
  478. package/dist/core/model-resolver.js.map +1 -1
  479. package/dist/core/openai-responses-payload-sanitizer.d.ts +7 -0
  480. package/dist/core/openai-responses-payload-sanitizer.d.ts.map +1 -0
  481. package/dist/core/openai-responses-payload-sanitizer.js +74 -0
  482. package/dist/core/openai-responses-payload-sanitizer.js.map +1 -0
  483. package/dist/core/package-manager-auto-resources.d.ts +2 -2
  484. package/dist/core/package-manager-auto-resources.d.ts.map +1 -1
  485. package/dist/core/package-manager-auto-resources.js +32 -52
  486. package/dist/core/package-manager-auto-resources.js.map +1 -1
  487. package/dist/core/package-manager-resolver.d.ts.map +1 -1
  488. package/dist/core/package-manager-resolver.js +23 -14
  489. package/dist/core/package-manager-resolver.js.map +1 -1
  490. package/dist/core/package-manager-resource-collector.d.ts +3 -3
  491. package/dist/core/package-manager-resource-collector.d.ts.map +1 -1
  492. package/dist/core/package-manager-resource-collector.js +76 -73
  493. package/dist/core/package-manager-resource-collector.js.map +1 -1
  494. package/dist/core/package-manager-resource-files.d.ts +9 -8
  495. package/dist/core/package-manager-resource-files.d.ts.map +1 -1
  496. package/dist/core/package-manager-resource-files.js +92 -81
  497. package/dist/core/package-manager-resource-files.js.map +1 -1
  498. package/dist/core/prompt-templates-async.d.ts +3 -0
  499. package/dist/core/prompt-templates-async.d.ts.map +1 -0
  500. package/dist/core/prompt-templates-async.js +118 -0
  501. package/dist/core/prompt-templates-async.js.map +1 -0
  502. package/dist/core/provider-context-usage.d.ts +11 -0
  503. package/dist/core/provider-context-usage.d.ts.map +1 -0
  504. package/dist/core/provider-context-usage.js +58 -0
  505. package/dist/core/provider-context-usage.js.map +1 -0
  506. package/dist/core/resource-loader-assets.d.ts +3 -3
  507. package/dist/core/resource-loader-assets.d.ts.map +1 -1
  508. package/dist/core/resource-loader-assets.js +66 -83
  509. package/dist/core/resource-loader-assets.js.map +1 -1
  510. package/dist/core/resource-loader-context-files.d.ts +1 -0
  511. package/dist/core/resource-loader-context-files.d.ts.map +1 -1
  512. package/dist/core/resource-loader-context-files.js +13 -10
  513. package/dist/core/resource-loader-context-files.js.map +1 -1
  514. package/dist/core/resource-loader-core.d.ts +1 -1
  515. package/dist/core/resource-loader-core.d.ts.map +1 -1
  516. package/dist/core/resource-loader-core.js +5 -5
  517. package/dist/core/resource-loader-core.js.map +1 -1
  518. package/dist/core/resource-loader-extensions.d.ts.map +1 -1
  519. package/dist/core/resource-loader-extensions.js +4 -0
  520. package/dist/core/resource-loader-extensions.js.map +1 -1
  521. package/dist/core/resource-loader-reload.d.ts.map +1 -1
  522. package/dist/core/resource-loader-reload.js +54 -7
  523. package/dist/core/resource-loader-reload.js.map +1 -1
  524. package/dist/core/resource-loader-types.d.ts +7 -1
  525. package/dist/core/resource-loader-types.d.ts.map +1 -1
  526. package/dist/core/resource-loader-types.js.map +1 -1
  527. package/dist/core/sdk-types.d.ts +2 -0
  528. package/dist/core/sdk-types.d.ts.map +1 -1
  529. package/dist/core/sdk-types.js.map +1 -1
  530. package/dist/core/sdk.d.ts.map +1 -1
  531. package/dist/core/sdk.js +9 -6
  532. package/dist/core/sdk.js.map +1 -1
  533. package/dist/core/session-entry-normalization.d.ts +7 -0
  534. package/dist/core/session-entry-normalization.d.ts.map +1 -0
  535. package/dist/core/session-entry-normalization.js +14 -0
  536. package/dist/core/session-entry-normalization.js.map +1 -0
  537. package/dist/core/session-manager-core.d.ts.map +1 -1
  538. package/dist/core/session-manager-core.js +1 -0
  539. package/dist/core/session-manager-core.js.map +1 -1
  540. package/dist/core/session-manager-history.d.ts +2 -2
  541. package/dist/core/session-manager-history.d.ts.map +1 -1
  542. package/dist/core/session-manager-history.js +127 -108
  543. package/dist/core/session-manager-history.js.map +1 -1
  544. package/dist/core/settings-manager-basic-accessors.d.ts +3 -2
  545. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  546. package/dist/core/settings-manager-basic-accessors.js +6 -0
  547. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  548. package/dist/core/settings-manager-core.d.ts.map +1 -1
  549. package/dist/core/settings-manager-core.js +3 -2
  550. package/dist/core/settings-manager-core.js.map +1 -1
  551. package/dist/core/settings-storage.d.ts.map +1 -1
  552. package/dist/core/settings-storage.js +2 -1
  553. package/dist/core/settings-storage.js.map +1 -1
  554. package/dist/core/settings-types.d.ts +2 -1
  555. package/dist/core/settings-types.d.ts.map +1 -1
  556. package/dist/core/settings-types.js.map +1 -1
  557. package/dist/core/skills-async.d.ts +3 -0
  558. package/dist/core/skills-async.d.ts.map +1 -0
  559. package/dist/core/skills-async.js +269 -0
  560. package/dist/core/skills-async.js.map +1 -0
  561. package/dist/core/slash-commands.d.ts +2 -0
  562. package/dist/core/slash-commands.d.ts.map +1 -1
  563. package/dist/core/slash-commands.js +141 -0
  564. package/dist/core/slash-commands.js.map +1 -1
  565. package/dist/core/tools/bash.d.ts.map +1 -1
  566. package/dist/core/tools/bash.js +11 -8
  567. package/dist/core/tools/bash.js.map +1 -1
  568. package/dist/core/trust-manager.d.ts +9 -0
  569. package/dist/core/trust-manager.d.ts.map +1 -1
  570. package/dist/core/trust-manager.js +44 -2
  571. package/dist/core/trust-manager.js.map +1 -1
  572. package/dist/index-extensions.d.ts +1 -1
  573. package/dist/index-extensions.d.ts.map +1 -1
  574. package/dist/index-extensions.js.map +1 -1
  575. package/dist/index.d.ts +2 -1
  576. package/dist/index.d.ts.map +1 -1
  577. package/dist/index.js +2 -1
  578. package/dist/index.js.map +1 -1
  579. package/dist/main-deferred-startup.d.ts +33 -0
  580. package/dist/main-deferred-startup.d.ts.map +1 -0
  581. package/dist/main-deferred-startup.js +44 -0
  582. package/dist/main-deferred-startup.js.map +1 -0
  583. package/dist/main-early-input.d.ts +41 -0
  584. package/dist/main-early-input.d.ts.map +1 -0
  585. package/dist/main-early-input.js +154 -0
  586. package/dist/main-early-input.js.map +1 -0
  587. package/dist/main-session.d.ts.map +1 -1
  588. package/dist/main-session.js +1 -0
  589. package/dist/main-session.js.map +1 -1
  590. package/dist/main.d.ts +0 -6
  591. package/dist/main.d.ts.map +1 -1
  592. package/dist/main.js +47 -39
  593. package/dist/main.js.map +1 -1
  594. package/dist/modes/interactive/components/chat-session-host-actions.d.ts.map +1 -1
  595. package/dist/modes/interactive/components/chat-session-host-actions.js +0 -1
  596. package/dist/modes/interactive/components/chat-session-host-actions.js.map +1 -1
  597. package/dist/modes/interactive/components/chat-session-host-events.d.ts.map +1 -1
  598. package/dist/modes/interactive/components/chat-session-host-events.js +15 -0
  599. package/dist/modes/interactive/components/chat-session-host-events.js.map +1 -1
  600. package/dist/modes/interactive/components/settings-selector-options.d.ts.map +1 -1
  601. package/dist/modes/interactive/components/settings-selector-options.js +3 -1
  602. package/dist/modes/interactive/components/settings-selector-options.js.map +1 -1
  603. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  604. package/dist/modes/interactive/components/thinking-selector.js +2 -1
  605. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  606. package/dist/modes/interactive/interactive-agent-events.d.ts.map +1 -1
  607. package/dist/modes/interactive/interactive-agent-events.js +37 -2
  608. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  609. package/dist/modes/interactive/interactive-auth-login.d.ts.map +1 -1
  610. package/dist/modes/interactive/interactive-auth-login.js +0 -1
  611. package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
  612. package/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
  613. package/dist/modes/interactive/interactive-autocomplete.js +21 -9
  614. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  615. package/dist/modes/interactive/interactive-child-ordering.d.ts +7 -0
  616. package/dist/modes/interactive/interactive-child-ordering.d.ts.map +1 -0
  617. package/dist/modes/interactive/interactive-child-ordering.js +26 -0
  618. package/dist/modes/interactive/interactive-child-ordering.js.map +1 -0
  619. package/dist/modes/interactive/interactive-deferred-startup.d.ts +8 -1
  620. package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -1
  621. package/dist/modes/interactive/interactive-deferred-startup.js +86 -26
  622. package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
  623. package/dist/modes/interactive/interactive-editor-actions.d.ts.map +1 -1
  624. package/dist/modes/interactive/interactive-editor-actions.js +13 -13
  625. package/dist/modes/interactive/interactive-editor-actions.js.map +1 -1
  626. package/dist/modes/interactive/interactive-extension-runtime.d.ts.map +1 -1
  627. package/dist/modes/interactive/interactive-extension-runtime.js +16 -0
  628. package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
  629. package/dist/modes/interactive/interactive-hotkeys-debug.d.ts.map +1 -1
  630. package/dist/modes/interactive/interactive-hotkeys-debug.js +4 -3
  631. package/dist/modes/interactive/interactive-hotkeys-debug.js.map +1 -1
  632. package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
  633. package/dist/modes/interactive/interactive-input-handling.js +360 -230
  634. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  635. package/dist/modes/interactive/interactive-mode-base.d.ts +19 -4
  636. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  637. package/dist/modes/interactive/interactive-mode-base.js +46 -4
  638. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  639. package/dist/modes/interactive/interactive-mode-deps.d.ts +3 -3
  640. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
  641. package/dist/modes/interactive/interactive-mode-deps.js +3 -3
  642. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  643. package/dist/modes/interactive/interactive-mode-surface.d.ts +27 -17
  644. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  645. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  646. package/dist/modes/interactive/interactive-mode-types.d.ts +8 -1
  647. package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
  648. package/dist/modes/interactive/interactive-mode-types.js.map +1 -1
  649. package/dist/modes/interactive/interactive-model-routing.d.ts.map +1 -1
  650. package/dist/modes/interactive/interactive-model-routing.js +14 -10
  651. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  652. package/dist/modes/interactive/interactive-onboarding.d.ts +0 -9
  653. package/dist/modes/interactive/interactive-onboarding.d.ts.map +1 -1
  654. package/dist/modes/interactive/interactive-onboarding.js +24 -201
  655. package/dist/modes/interactive/interactive-onboarding.js.map +1 -1
  656. package/dist/modes/interactive/interactive-process-lifecycle.d.ts.map +1 -1
  657. package/dist/modes/interactive/interactive-process-lifecycle.js +43 -9
  658. package/dist/modes/interactive/interactive-process-lifecycle.js.map +1 -1
  659. package/dist/modes/interactive/interactive-render-chat.d.ts.map +1 -1
  660. package/dist/modes/interactive/interactive-render-chat.js +93 -10
  661. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  662. package/dist/modes/interactive/interactive-resource-disclosure.d.ts.map +1 -1
  663. package/dist/modes/interactive/interactive-resource-disclosure.js +3 -2
  664. package/dist/modes/interactive/interactive-resource-disclosure.js.map +1 -1
  665. package/dist/modes/interactive/interactive-resource-rendering.d.ts.map +1 -1
  666. package/dist/modes/interactive/interactive-resource-rendering.js +10 -8
  667. package/dist/modes/interactive/interactive-resource-rendering.js.map +1 -1
  668. package/dist/modes/interactive/interactive-session-routing.d.ts.map +1 -1
  669. package/dist/modes/interactive/interactive-session-routing.js +9 -5
  670. package/dist/modes/interactive/interactive-session-routing.js.map +1 -1
  671. package/dist/modes/interactive/interactive-session-runtime.d.ts.map +1 -1
  672. package/dist/modes/interactive/interactive-session-runtime.js +1 -1
  673. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
  674. package/dist/modes/interactive/interactive-slash-commands.d.ts.map +1 -1
  675. package/dist/modes/interactive/interactive-slash-commands.js +1 -1
  676. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  677. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  678. package/dist/modes/interactive/interactive-startup.js +102 -98
  679. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  680. package/dist/modes/interactive/theme/global-theme.d.ts.map +1 -1
  681. package/dist/modes/interactive/theme/global-theme.js +26 -2
  682. package/dist/modes/interactive/theme/global-theme.js.map +1 -1
  683. package/dist/modes/interactive/theme/theme-class.d.ts +1 -1
  684. package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
  685. package/dist/modes/interactive/theme/theme-class.js +2 -0
  686. package/dist/modes/interactive/theme/theme-class.js.map +1 -1
  687. package/dist/modes/interactive/theme/theme-loading.d.ts +1 -0
  688. package/dist/modes/interactive/theme/theme-loading.d.ts.map +1 -1
  689. package/dist/modes/interactive/theme/theme-loading.js +3 -0
  690. package/dist/modes/interactive/theme/theme-loading.js.map +1 -1
  691. package/dist/modes/interactive/theme/theme.d.ts +1 -1
  692. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  693. package/dist/modes/interactive/theme/theme.js +1 -1
  694. package/dist/modes/interactive/theme/theme.js.map +1 -1
  695. package/dist/utils/child-process.d.ts +8 -1
  696. package/dist/utils/child-process.d.ts.map +1 -1
  697. package/dist/utils/child-process.js +39 -6
  698. package/dist/utils/child-process.js.map +1 -1
  699. package/dist/utils/clipboard-image.d.ts.map +1 -1
  700. package/dist/utils/clipboard-image.js +3 -0
  701. package/dist/utils/clipboard-image.js.map +1 -1
  702. package/dist/utils/event-loop.d.ts +7 -0
  703. package/dist/utils/event-loop.d.ts.map +1 -0
  704. package/dist/utils/event-loop.js +14 -0
  705. package/dist/utils/event-loop.js.map +1 -0
  706. package/dist/utils/fs-watch.d.ts +24 -1
  707. package/dist/utils/fs-watch.d.ts.map +1 -1
  708. package/dist/utils/fs-watch.js +60 -5
  709. package/dist/utils/fs-watch.js.map +1 -1
  710. package/dist/utils/json.d.ts +4 -0
  711. package/dist/utils/json.d.ts.map +1 -1
  712. package/dist/utils/json.js +8 -0
  713. package/dist/utils/json.js.map +1 -1
  714. package/dist/utils/module-require.d.ts +11 -0
  715. package/dist/utils/module-require.d.ts.map +1 -1
  716. package/dist/utils/module-require.js +14 -1
  717. package/dist/utils/module-require.js.map +1 -1
  718. package/dist/utils/split-launcher.d.ts +38 -0
  719. package/dist/utils/split-launcher.d.ts.map +1 -0
  720. package/dist/utils/split-launcher.js +63 -0
  721. package/dist/utils/split-launcher.js.map +1 -0
  722. package/docs/changelog.mdx +19 -0
  723. package/docs/compaction.md +100 -64
  724. package/docs/custom-provider.md +18 -5
  725. package/docs/development.md +4 -0
  726. package/docs/extensions.md +11 -2
  727. package/docs/json.md +3 -1
  728. package/docs/keybindings.md +2 -2
  729. package/docs/models.md +69 -10
  730. package/docs/providers.md +3 -2
  731. package/docs/quickstart.md +15 -11
  732. package/docs/rpc.md +5 -3
  733. package/docs/sdk.md +1 -1
  734. package/docs/settings.md +33 -3
  735. package/docs/subagents.md +40 -5
  736. package/docs/terminal-setup.md +4 -0
  737. package/docs/tools.md +1 -1
  738. package/docs/usage.md +8 -6
  739. package/docs/windows.md +4 -0
  740. package/docs/workflows.md +59 -36
  741. package/examples/extensions/preset.ts +2 -2
  742. package/examples/extensions/subagent/README.md +2 -2
  743. package/examples/extensions/subagent/index.ts +1 -2
  744. package/examples/extensions/subagent/schemas.ts +4 -1
  745. package/examples/sdk/12-full-control.ts +1 -1
  746. package/npm-shrinkwrap.json +538 -51
  747. package/package.json +10 -9
  748. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-behavior.ts +0 -75
  749. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-component.ts +0 -202
  750. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-edit.ts +0 -97
  751. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-editor.ts +0 -160
  752. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-frame.ts +0 -72
  753. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-render-modes.ts +0 -161
  754. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-render-selectors.ts +0 -203
  755. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-selectors.ts +0 -234
  756. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-state.ts +0 -103
  757. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-types.ts +0 -29
  758. package/dist/builtin/subagents/src/runs/foreground/chain-clarify.ts +0 -9
  759. package/dist/builtin/subagents/src/runs/foreground/chain-execution-clarify.ts +0 -117
@@ -0,0 +1,186 @@
1
+ import { analyzeCompactableAssistantTurns } from "./context-assistant-turns.js";
2
+ import { reconcileToolDependencies, validateContextDeletionRequest } from "./context-deletion-application.js";
3
+ import { canDeleteTarget, deletionRequestFromTargets, getDeletedEntryIds, } from "./context-deletion-targets.js";
4
+ export function hasFitBudget(result, tokenBudget) {
5
+ return result !== undefined && result.deletedTargets.length > 0 && result.stats.tokensAfter <= tokenBudget;
6
+ }
7
+ export function assistantTurnsForTargets(transcript, targets) {
8
+ return analyzeCompactableAssistantTurns(transcript, targets).turns;
9
+ }
10
+ export function repairSignedTurnTargets(transcript, targets) {
11
+ const reconciled = reconcileToolDependencies(transcript, targets);
12
+ const deletedEntryIds = getDeletedEntryIds(reconciled);
13
+ const restoredSignedIds = new Set();
14
+ for (const turn of assistantTurnsForTargets(transcript, reconciled)) {
15
+ const deleted = turn.signedThinkingEntryIds.filter((entryId) => deletedEntryIds.has(entryId));
16
+ if (deleted.length === 0)
17
+ continue;
18
+ if (!turn.active && deleted.length === turn.signedThinkingEntryIds.length)
19
+ continue;
20
+ for (const entryId of turn.signedThinkingEntryIds)
21
+ restoredSignedIds.add(entryId);
22
+ }
23
+ if (restoredSignedIds.size === 0)
24
+ return reconciled;
25
+ const restoredCallIds = new Set();
26
+ for (const entry of transcript.entries) {
27
+ if (!restoredSignedIds.has(entry.entryId))
28
+ continue;
29
+ for (const callId of entry.toolCallIds)
30
+ restoredCallIds.add(callId);
31
+ }
32
+ const restoredResultIds = new Set(transcript.entries
33
+ .filter((entry) => entry.toolResultFor && restoredCallIds.has(entry.toolResultFor))
34
+ .map((entry) => entry.entryId));
35
+ return reconcileToolDependencies(transcript, reconciled.filter((target) => !restoredSignedIds.has(target.entryId) && !restoredResultIds.has(target.entryId)));
36
+ }
37
+ export function targetsWithGroup(planned, entryIds) {
38
+ const deleted = getDeletedEntryIds(planned);
39
+ return [
40
+ ...planned,
41
+ ...entryIds
42
+ .filter((entryId) => !deleted.has(entryId))
43
+ .map((entryId) => ({ kind: "entry", entryId })),
44
+ ];
45
+ }
46
+ export function validateTargets(transcript, targets) {
47
+ try {
48
+ const result = validateContextDeletionRequest(deletionRequestFromTargets(targets), transcript);
49
+ const order = new Map(transcript.entries.map((entry, index) => [entry.entryId, index]));
50
+ return {
51
+ ...result,
52
+ deletedTargets: [...result.deletedTargets].sort((left, right) => {
53
+ const entryDelta = (order.get(left.entryId) ?? Number.MAX_SAFE_INTEGER) -
54
+ (order.get(right.entryId) ?? Number.MAX_SAFE_INTEGER);
55
+ if (entryDelta !== 0)
56
+ return entryDelta;
57
+ const leftBlock = left.kind === "content_block" ? left.blockIndex : -1;
58
+ const rightBlock = right.kind === "content_block" ? right.blockIndex : -1;
59
+ return leftBlock - rightBlock;
60
+ }),
61
+ };
62
+ }
63
+ catch {
64
+ return undefined;
65
+ }
66
+ }
67
+ export function tryGroup(transcript, planned, group, repairBoundary) {
68
+ const directTargets = targetsWithGroup(planned, group.entryIds);
69
+ const direct = validateTargets(transcript, directTargets);
70
+ if (direct)
71
+ return direct;
72
+ if (!repairBoundary)
73
+ return undefined;
74
+ const repaired = repairSignedTurnTargets(transcript, directTargets);
75
+ const result = validateTargets(transcript, repaired);
76
+ if (!result)
77
+ return undefined;
78
+ const deleted = getDeletedEntryIds(result.deletedTargets);
79
+ return group.entryIds.every((entryId) => deleted.has(entryId)) ? result : undefined;
80
+ }
81
+ export function currentHistoricalSignedGroups(transcript, planned) {
82
+ const deleted = getDeletedEntryIds(planned);
83
+ const order = new Map(transcript.entries.map((entry, index) => [entry.entryId, index]));
84
+ const tokens = new Map(transcript.entries.map((entry) => [entry.entryId, entry.tokenEstimate]));
85
+ return assistantTurnsForTargets(transcript, planned)
86
+ .filter((turn) => !turn.active)
87
+ .map((turn) => turn.signedThinkingEntryIds.filter((entryId) => !deleted.has(entryId)))
88
+ .filter((entryIds) => entryIds.length > 0)
89
+ .filter((entryIds) => entryIds.every((entryId) => canDeleteTarget(transcript, { kind: "entry", entryId })))
90
+ .map((entryIds) => ({
91
+ entryIds,
92
+ order: order.get(entryIds[0]) ?? Number.MAX_SAFE_INTEGER,
93
+ tokens: entryIds.reduce((sum, entryId) => sum + (tokens.get(entryId) ?? 0), 0),
94
+ boundary: false,
95
+ }));
96
+ }
97
+ function targetIdentity(target) {
98
+ return target.kind === "entry"
99
+ ? `entry:${target.entryId}`
100
+ : `content_block:${target.entryId}:${target.blockIndex}`;
101
+ }
102
+ function boundaryRestorationSignature(transcript, planned, group) {
103
+ try {
104
+ const repaired = repairSignedTurnTargets(transcript, targetsWithGroup(planned, group.entryIds));
105
+ const retainedKeys = new Set(repaired.map(targetIdentity));
106
+ const restoredKeys = planned
107
+ .map(targetIdentity)
108
+ .filter((key) => !retainedKeys.has(key))
109
+ .sort();
110
+ return restoredKeys.length > 0 ? restoredKeys.join("|") : undefined;
111
+ }
112
+ catch {
113
+ return undefined;
114
+ }
115
+ }
116
+ export function skippedBoundaryRestorationGroups(transcript, planned, skipped) {
117
+ const bySignature = new Map();
118
+ for (const group of skipped) {
119
+ const signature = boundaryRestorationSignature(transcript, planned, group);
120
+ if (!signature)
121
+ continue;
122
+ const matches = bySignature.get(signature) ?? [];
123
+ matches.push(group);
124
+ bySignature.set(signature, matches);
125
+ }
126
+ return [...bySignature.values()].filter((groups) => groups.length > 1);
127
+ }
128
+ function deletionPlanSignature(targets) {
129
+ return targets.map(targetIdentity).sort().join("|");
130
+ }
131
+ const ALTERNATE_BOUNDARY_STATE_LIMIT = 16;
132
+ function retainBoundedAlternateStates(states) {
133
+ const deduplicated = [...new Map(states.map((state) => [state.signature, state])).values()].sort((left, right) => left.tokensAfter - right.tokensAfter || left.signature.localeCompare(right.signature));
134
+ // Retain both near-fit and less-committed plans so different turn topologies survive the bounded search.
135
+ if (deduplicated.length <= ALTERNATE_BOUNDARY_STATE_LIMIT)
136
+ return deduplicated;
137
+ const retained = [];
138
+ for (let index = 0; index < ALTERNATE_BOUNDARY_STATE_LIMIT / 2; index++) {
139
+ retained.push(deduplicated[index], deduplicated[deduplicated.length - 1 - index]);
140
+ }
141
+ return retained.sort((left, right) => left.tokensAfter - right.tokensAfter || left.signature.localeCompare(right.signature));
142
+ }
143
+ export function alternateBoundaryPlan(transcript, initialTargets, initialResult, groups, tokenBudget) {
144
+ let states = [
145
+ {
146
+ targets: [...initialTargets],
147
+ tokensAfter: initialResult?.stats.tokensAfter ?? transcript.tokensBefore,
148
+ signature: deletionPlanSignature(initialTargets),
149
+ },
150
+ ];
151
+ for (const group of groups) {
152
+ const expanded = [...states];
153
+ let fitting;
154
+ for (const state of states) {
155
+ const result = tryGroup(transcript, state.targets, group, true);
156
+ if (!result)
157
+ continue;
158
+ if (result.deletedTargets.length > 0 && result.stats.tokensAfter <= tokenBudget) {
159
+ if (!fitting || result.stats.tokensAfter > fitting.stats.tokensAfter)
160
+ fitting = result;
161
+ continue;
162
+ }
163
+ expanded.push({
164
+ targets: [...result.deletedTargets],
165
+ tokensAfter: result.stats.tokensAfter,
166
+ signature: deletionPlanSignature(result.deletedTargets),
167
+ });
168
+ }
169
+ if (fitting)
170
+ return fitting;
171
+ states = retainBoundedAlternateStates(expanded);
172
+ }
173
+ for (const state of states) {
174
+ let targets = state.targets;
175
+ for (const group of currentHistoricalSignedGroups(transcript, targets)) {
176
+ const result = tryGroup(transcript, targets, group, false);
177
+ if (!result)
178
+ continue;
179
+ targets = [...result.deletedTargets];
180
+ if (hasFitBudget(result, tokenBudget))
181
+ return result;
182
+ }
183
+ }
184
+ return undefined;
185
+ }
186
+ //# sourceMappingURL=context-compaction-eviction-alternates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-compaction-eviction-alternates.js","sourceRoot":"","sources":["../../../src/core/compaction/context-compaction-eviction-alternates.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ContextDeletionTarget } from \"../session-manager.js\";\nimport { analyzeCompactableAssistantTurns } from \"./context-assistant-turns.js\";\nimport type { CompactableTranscript, ValidatedContextDeletionResult } from \"./context-compaction-types.js\";\nimport { reconcileToolDependencies, validateContextDeletionRequest } from \"./context-deletion-application.js\";\nimport {\n\tcanDeleteTarget,\n\tdeletionRequestFromTargets,\n\tgetDeletedEntryIds,\n} from \"./context-deletion-targets.js\";\n\nexport interface EvictionGroup {\n\tentryIds: string[];\n\torder: number;\n\ttokens: number;\n\tboundary: boolean;\n}\n\nexport function hasFitBudget(\n\tresult: ValidatedContextDeletionResult | undefined,\n\ttokenBudget: number,\n): result is ValidatedContextDeletionResult {\n\treturn result !== undefined && result.deletedTargets.length > 0 && result.stats.tokensAfter <= tokenBudget;\n}\n\nexport function assistantTurnsForTargets(\n\ttranscript: CompactableTranscript,\n\ttargets: readonly ContextDeletionTarget[],\n) {\n\treturn analyzeCompactableAssistantTurns(transcript, targets).turns;\n}\n\nexport function repairSignedTurnTargets(\n\ttranscript: CompactableTranscript,\n\ttargets: readonly ContextDeletionTarget[],\n): ContextDeletionTarget[] {\n\tconst reconciled = reconcileToolDependencies(transcript, targets);\n\tconst deletedEntryIds = getDeletedEntryIds(reconciled);\n\tconst restoredSignedIds = new Set<string>();\n\tfor (const turn of assistantTurnsForTargets(transcript, reconciled)) {\n\t\tconst deleted = turn.signedThinkingEntryIds.filter((entryId) => deletedEntryIds.has(entryId));\n\t\tif (deleted.length === 0) continue;\n\t\tif (!turn.active && deleted.length === turn.signedThinkingEntryIds.length) continue;\n\t\tfor (const entryId of turn.signedThinkingEntryIds) restoredSignedIds.add(entryId);\n\t}\n\tif (restoredSignedIds.size === 0) return reconciled;\n\n\tconst restoredCallIds = new Set<string>();\n\tfor (const entry of transcript.entries) {\n\t\tif (!restoredSignedIds.has(entry.entryId)) continue;\n\t\tfor (const callId of entry.toolCallIds) restoredCallIds.add(callId);\n\t}\n\tconst restoredResultIds = new Set(\n\t\ttranscript.entries\n\t\t\t.filter((entry) => entry.toolResultFor && restoredCallIds.has(entry.toolResultFor))\n\t\t\t.map((entry) => entry.entryId),\n\t);\n\treturn reconcileToolDependencies(\n\t\ttranscript,\n\t\treconciled.filter((target) => !restoredSignedIds.has(target.entryId) && !restoredResultIds.has(target.entryId)),\n\t);\n}\n\nexport function targetsWithGroup(\n\tplanned: readonly ContextDeletionTarget[],\n\tentryIds: readonly string[],\n): ContextDeletionTarget[] {\n\tconst deleted = getDeletedEntryIds(planned);\n\treturn [\n\t\t...planned,\n\t\t...entryIds\n\t\t\t.filter((entryId) => !deleted.has(entryId))\n\t\t\t.map((entryId): ContextDeletionTarget => ({ kind: \"entry\", entryId })),\n\t];\n}\n\nexport function validateTargets(\n\ttranscript: CompactableTranscript,\n\ttargets: readonly ContextDeletionTarget[],\n): ValidatedContextDeletionResult | undefined {\n\ttry {\n\t\tconst result = validateContextDeletionRequest(deletionRequestFromTargets(targets), transcript);\n\t\tconst order = new Map(transcript.entries.map((entry, index) => [entry.entryId, index]));\n\t\treturn {\n\t\t\t...result,\n\t\t\tdeletedTargets: [...result.deletedTargets].sort((left, right) => {\n\t\t\t\tconst entryDelta =\n\t\t\t\t\t(order.get(left.entryId) ?? Number.MAX_SAFE_INTEGER) -\n\t\t\t\t\t(order.get(right.entryId) ?? Number.MAX_SAFE_INTEGER);\n\t\t\t\tif (entryDelta !== 0) return entryDelta;\n\t\t\t\tconst leftBlock = left.kind === \"content_block\" ? left.blockIndex : -1;\n\t\t\t\tconst rightBlock = right.kind === \"content_block\" ? right.blockIndex : -1;\n\t\t\t\treturn leftBlock - rightBlock;\n\t\t\t}),\n\t\t};\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function tryGroup(\n\ttranscript: CompactableTranscript,\n\tplanned: readonly ContextDeletionTarget[],\n\tgroup: EvictionGroup,\n\trepairBoundary: boolean,\n): ValidatedContextDeletionResult | undefined {\n\tconst directTargets = targetsWithGroup(planned, group.entryIds);\n\tconst direct = validateTargets(transcript, directTargets);\n\tif (direct) return direct;\n\tif (!repairBoundary) return undefined;\n\tconst repaired = repairSignedTurnTargets(transcript, directTargets);\n\tconst result = validateTargets(transcript, repaired);\n\tif (!result) return undefined;\n\tconst deleted = getDeletedEntryIds(result.deletedTargets);\n\treturn group.entryIds.every((entryId) => deleted.has(entryId)) ? result : undefined;\n}\n\nexport function currentHistoricalSignedGroups(\n\ttranscript: CompactableTranscript,\n\tplanned: readonly ContextDeletionTarget[],\n): EvictionGroup[] {\n\tconst deleted = getDeletedEntryIds(planned);\n\tconst order = new Map(transcript.entries.map((entry, index) => [entry.entryId, index]));\n\tconst tokens = new Map(transcript.entries.map((entry) => [entry.entryId, entry.tokenEstimate]));\n\treturn assistantTurnsForTargets(transcript, planned)\n\t\t.filter((turn) => !turn.active)\n\t\t.map((turn) => turn.signedThinkingEntryIds.filter((entryId) => !deleted.has(entryId)))\n\t\t.filter((entryIds) => entryIds.length > 0)\n\t\t.filter((entryIds) => entryIds.every((entryId) => canDeleteTarget(transcript, { kind: \"entry\", entryId })))\n\t\t.map((entryIds) => ({\n\t\t\tentryIds,\n\t\t\torder: order.get(entryIds[0]!) ?? Number.MAX_SAFE_INTEGER,\n\t\t\ttokens: entryIds.reduce((sum, entryId) => sum + (tokens.get(entryId) ?? 0), 0),\n\t\t\tboundary: false,\n\t\t}));\n}\n\nfunction targetIdentity(target: ContextDeletionTarget): string {\n\treturn target.kind === \"entry\"\n\t\t? `entry:${target.entryId}`\n\t\t: `content_block:${target.entryId}:${target.blockIndex}`;\n}\n\nfunction boundaryRestorationSignature(\n\ttranscript: CompactableTranscript,\n\tplanned: readonly ContextDeletionTarget[],\n\tgroup: EvictionGroup,\n): string | undefined {\n\ttry {\n\t\tconst repaired = repairSignedTurnTargets(transcript, targetsWithGroup(planned, group.entryIds));\n\t\tconst retainedKeys = new Set(repaired.map(targetIdentity));\n\t\tconst restoredKeys = planned\n\t\t\t.map(targetIdentity)\n\t\t\t.filter((key) => !retainedKeys.has(key))\n\t\t\t.sort();\n\t\treturn restoredKeys.length > 0 ? restoredKeys.join(\"|\") : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function skippedBoundaryRestorationGroups(\n\ttranscript: CompactableTranscript,\n\tplanned: readonly ContextDeletionTarget[],\n\tskipped: readonly EvictionGroup[],\n): EvictionGroup[][] {\n\tconst bySignature = new Map<string, EvictionGroup[]>();\n\tfor (const group of skipped) {\n\t\tconst signature = boundaryRestorationSignature(transcript, planned, group);\n\t\tif (!signature) continue;\n\t\tconst matches = bySignature.get(signature) ?? [];\n\t\tmatches.push(group);\n\t\tbySignature.set(signature, matches);\n\t}\n\treturn [...bySignature.values()].filter((groups) => groups.length > 1);\n}\n\ninterface AlternateBoundaryState {\n\ttargets: ContextDeletionTarget[];\n\ttokensAfter: number;\n\tsignature: string;\n}\n\nfunction deletionPlanSignature(targets: readonly ContextDeletionTarget[]): string {\n\treturn targets.map(targetIdentity).sort().join(\"|\");\n}\n\nconst ALTERNATE_BOUNDARY_STATE_LIMIT = 16;\n\nfunction retainBoundedAlternateStates(states: readonly AlternateBoundaryState[]): AlternateBoundaryState[] {\n\tconst deduplicated = [...new Map(states.map((state) => [state.signature, state])).values()].sort(\n\t\t(left, right) => left.tokensAfter - right.tokensAfter || left.signature.localeCompare(right.signature),\n\t);\n\t// Retain both near-fit and less-committed plans so different turn topologies survive the bounded search.\n\tif (deduplicated.length <= ALTERNATE_BOUNDARY_STATE_LIMIT) return deduplicated;\n\n\tconst retained: AlternateBoundaryState[] = [];\n\tfor (let index = 0; index < ALTERNATE_BOUNDARY_STATE_LIMIT / 2; index++) {\n\t\tretained.push(deduplicated[index]!, deduplicated[deduplicated.length - 1 - index]!);\n\t}\n\treturn retained.sort(\n\t\t(left, right) => left.tokensAfter - right.tokensAfter || left.signature.localeCompare(right.signature),\n\t);\n}\n\nexport function alternateBoundaryPlan(\n\ttranscript: CompactableTranscript,\n\tinitialTargets: readonly ContextDeletionTarget[],\n\tinitialResult: ValidatedContextDeletionResult | undefined,\n\tgroups: readonly EvictionGroup[],\n\ttokenBudget: number,\n): ValidatedContextDeletionResult | undefined {\n\tlet states: AlternateBoundaryState[] = [\n\t\t{\n\t\t\ttargets: [...initialTargets],\n\t\t\ttokensAfter: initialResult?.stats.tokensAfter ?? transcript.tokensBefore,\n\t\t\tsignature: deletionPlanSignature(initialTargets),\n\t\t},\n\t];\n\n\tfor (const group of groups) {\n\t\tconst expanded = [...states];\n\t\tlet fitting: ValidatedContextDeletionResult | undefined;\n\t\tfor (const state of states) {\n\t\t\tconst result = tryGroup(transcript, state.targets, group, true);\n\t\t\tif (!result) continue;\n\t\t\tif (result.deletedTargets.length > 0 && result.stats.tokensAfter <= tokenBudget) {\n\t\t\t\tif (!fitting || result.stats.tokensAfter > fitting.stats.tokensAfter) fitting = result;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\texpanded.push({\n\t\t\t\ttargets: [...result.deletedTargets],\n\t\t\t\ttokensAfter: result.stats.tokensAfter,\n\t\t\t\tsignature: deletionPlanSignature(result.deletedTargets),\n\t\t\t});\n\t\t}\n\t\tif (fitting) return fitting;\n\t\tstates = retainBoundedAlternateStates(expanded);\n\t}\n\n\tfor (const state of states) {\n\t\tlet targets = state.targets;\n\t\tfor (const group of currentHistoricalSignedGroups(transcript, targets)) {\n\t\t\tconst result = tryGroup(transcript, targets, group, false);\n\t\t\tif (!result) continue;\n\t\t\ttargets = [...result.deletedTargets];\n\t\t\tif (hasFitBudget(result, tokenBudget)) return result;\n\t\t}\n\t}\n\treturn undefined;\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import type { CompactableTranscript, ValidatedContextDeletionResult } from "./context-compaction-types.js";
2
+ /**
3
+ * Finite deterministic eviction phases:
4
+ * 1. Batch or sweep non-boundary groups in transcript order.
5
+ * 2. Try repaired boundary prefixes, then individual boundaries by token value.
6
+ * 3. Sweep newly historical signed groups exposed by those deletions.
7
+ * 4. Retry skipped boundaries by shared restoration component, then individually.
8
+ * 5. Search bounded alternate boundary states (at most 16 per boundary) and their signed groups.
9
+ * 6. Fail with the best validated stats after every finite candidate set is exhausted.
10
+ */
11
+ export declare function runDeterministicContextEviction(transcript: CompactableTranscript, tokenBudget: number): ValidatedContextDeletionResult;
12
+ //# sourceMappingURL=context-compaction-eviction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-compaction-eviction.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/context-compaction-eviction.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,qBAAqB,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAgH3G;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,CAC9C,UAAU,EAAE,qBAAqB,EACjC,WAAW,EAAE,MAAM,GACjB,8BAA8B,CAmHhC","sourcesContent":["import type { ContextDeletionTarget } from \"../session-manager.js\";\nimport { relaxTranscriptForCriticalEviction } from \"./context-compaction-critical.js\";\nimport {\n\talternateBoundaryPlan,\n\tassistantTurnsForTargets,\n\tcurrentHistoricalSignedGroups,\n\ttype EvictionGroup,\n\thasFitBudget,\n\trepairSignedTurnTargets,\n\tskippedBoundaryRestorationGroups,\n\ttargetsWithGroup,\n\ttryGroup,\n\tvalidateTargets,\n} from \"./context-compaction-eviction-alternates.js\";\nimport type { CompactableTranscript, ValidatedContextDeletionResult } from \"./context-compaction-types.js\";\nimport { transcriptEntryStartsNewTurn } from \"./context-assistant-turns.js\";\nimport { canDeleteTarget, getDeletedEntryIds } from \"./context-deletion-targets.js\";\n\nfunction terminalDeterministicEvictionError(\n\treason: string,\n\tlastValidated: ValidatedContextDeletionResult | undefined,\n\ttokenBudget: number,\n): Error {\n\tconst statsText = lastValidated\n\t\t? `achieved tokensAfter=${lastValidated.stats.tokensAfter}, reduction=${lastValidated.stats.percentReduction}%, deletionTargets=${lastValidated.deletedTargets.length}`\n\t\t: \"achieved no validated deletion targets\";\n\treturn new Error(\n\t\t`Context deterministic overflow eviction failed: ${reason}; ${statsText}; budget=${tokenBudget}; nothing more was safely deletable`,\n\t);\n}\n\nfunction initialEvictionGroups(transcript: CompactableTranscript): EvictionGroup[] {\n\tconst turns = assistantTurnsForTargets(transcript, []);\n\tconst signedGroupByEntryId = new Map<string, string[]>();\n\tconst activeSignedIds = new Set<string>();\n\tfor (const turn of turns) {\n\t\tif (turn.active) {\n\t\t\tfor (const entryId of turn.signedThinkingEntryIds) activeSignedIds.add(entryId);\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const entryId of turn.signedThinkingEntryIds) {\n\t\t\tsignedGroupByEntryId.set(entryId, turn.signedThinkingEntryIds);\n\t\t}\n\t}\n\n\tconst entryById = new Map(transcript.entries.map((entry, index) => [entry.entryId, { entry, index }]));\n\tconst grouped = new Set<string>();\n\tconst groups: EvictionGroup[] = [];\n\tfor (let index = 0; index < transcript.entries.length; index++) {\n\t\tconst entry = transcript.entries[index]!;\n\t\tif (activeSignedIds.has(entry.entryId) || grouped.has(entry.entryId)) continue;\n\t\tconst entryIds = signedGroupByEntryId.get(entry.entryId) ?? [entry.entryId];\n\t\tfor (const entryId of entryIds) grouped.add(entryId);\n\t\tif (!entryIds.every((entryId) => canDeleteTarget(transcript, { kind: \"entry\", entryId }))) continue;\n\t\tgroups.push({\n\t\t\tentryIds: [...entryIds],\n\t\t\torder: index,\n\t\t\ttokens: entryIds.reduce((sum, entryId) => sum + (entryById.get(entryId)?.entry.tokenEstimate ?? 0), 0),\n\t\t\tboundary: entryIds.length === 1 && transcriptEntryStartsNewTurn(entry),\n\t\t});\n\t}\n\treturn groups;\n}\n\nfunction repairedFittingBoundaryPrefix(\n\ttranscript: CompactableTranscript,\n\tplanned: readonly ContextDeletionTarget[],\n\tgroups: readonly EvictionGroup[],\n\ttokenBudget: number,\n\tcurrentTokens: number,\n): ValidatedContextDeletionResult | undefined {\n\tconst required = currentTokens - tokenBudget;\n\tif (required <= 0) return undefined;\n\tlet rawRemoved = 0;\n\tlet lowerBound = 0;\n\twhile (lowerBound < groups.length && rawRemoved < required) {\n\t\trawRemoved += groups[lowerBound]!.tokens;\n\t\tlowerBound += 1;\n\t}\n\tif (rawRemoved < required) return undefined;\n\n\tlet prospective = [...planned];\n\tfor (let index = 0; index < groups.length; index++) {\n\t\tprospective = targetsWithGroup(prospective, groups[index]!.entryIds);\n\t\tif (index + 1 < lowerBound) continue;\n\t\tconst repaired = repairSignedTurnTargets(transcript, prospective);\n\t\tconst validated = validateTargets(transcript, repaired);\n\t\tif (!validated || !hasFitBudget(validated, tokenBudget)) continue;\n\t\tconst deleted = getDeletedEntryIds(validated.deletedTargets);\n\t\tconst prefixRetained = groups\n\t\t\t.slice(0, index + 1)\n\t\t\t.some((group) => group.entryIds.some((entryId) => !deleted.has(entryId)));\n\t\tif (!prefixRetained) return validated;\n\t}\n\treturn undefined;\n}\n\nfunction adoptSmallestFittingPrefix(\n\ttranscript: CompactableTranscript,\n\tplanned: readonly ContextDeletionTarget[],\n\tgroups: readonly EvictionGroup[],\n\ttokenBudget: number,\n): ValidatedContextDeletionResult | undefined {\n\tif (groups.length === 0) return undefined;\n\tconst prefixTargets = (count: number): ContextDeletionTarget[] =>\n\t\tgroups.slice(0, count).reduce((targets, group) => targetsWithGroup(targets, group.entryIds), [...planned]);\n\tconst full = validateTargets(transcript, prefixTargets(groups.length));\n\tif (!full) return undefined;\n\tif (!hasFitBudget(full, tokenBudget)) return full;\n\n\tlet low = 1;\n\tlet high = groups.length;\n\tlet best = full;\n\twhile (low <= high) {\n\t\tconst middle = Math.floor((low + high) / 2);\n\t\tconst result = validateTargets(transcript, prefixTargets(middle));\n\t\tif (result && hasFitBudget(result, tokenBudget)) {\n\t\t\tbest = result;\n\t\t\thigh = middle - 1;\n\t\t} else {\n\t\t\tlow = middle + 1;\n\t\t}\n\t}\n\treturn best;\n}\n\n/**\n * Finite deterministic eviction phases:\n * 1. Batch or sweep non-boundary groups in transcript order.\n * 2. Try repaired boundary prefixes, then individual boundaries by token value.\n * 3. Sweep newly historical signed groups exposed by those deletions.\n * 4. Retry skipped boundaries by shared restoration component, then individually.\n * 5. Search bounded alternate boundary states (at most 16 per boundary) and their signed groups.\n * 6. Fail with the best validated stats after every finite candidate set is exhausted.\n */\nexport function runDeterministicContextEviction(\n\ttranscript: CompactableTranscript,\n\ttokenBudget: number,\n): ValidatedContextDeletionResult {\n\tconst relaxed = relaxTranscriptForCriticalEviction(transcript);\n\tconst groups = initialEvictionGroups(relaxed);\n\tconst nonBoundaries = groups.filter((group) => !group.boundary).sort((left, right) => left.order - right.order);\n\tconst boundaries = groups\n\t\t.filter((group) => group.boundary)\n\t\t.sort((left, right) => right.tokens - left.tokens || left.order - right.order);\n\tlet planned: ContextDeletionTarget[] = [];\n\tlet lastValidated: ValidatedContextDeletionResult | undefined;\n\tconst skippedBoundaries: EvictionGroup[] = [];\n\n\tif (relaxed.tokensBefore > tokenBudget) {\n\t\tconst batch = adoptSmallestFittingPrefix(relaxed, planned, nonBoundaries, tokenBudget);\n\t\tif (batch) {\n\t\t\tplanned = [...batch.deletedTargets];\n\t\t\tlastValidated = batch;\n\t\t\tif (hasFitBudget(lastValidated, tokenBudget)) return lastValidated;\n\t\t} else {\n\t\t\tfor (const group of nonBoundaries) {\n\t\t\t\tconst result = tryGroup(relaxed, planned, group, false);\n\t\t\t\tif (!result) continue;\n\t\t\t\tplanned = [...result.deletedTargets];\n\t\t\t\tlastValidated = result;\n\t\t\t\tif (hasFitBudget(lastValidated, tokenBudget)) return lastValidated;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor (const group of nonBoundaries) {\n\t\t\tconst result = tryGroup(relaxed, planned, group, false);\n\t\t\tif (!result) continue;\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tconst boundaryBaseTargets = [...planned];\n\tconst boundaryBaseResult = lastValidated;\n\tconst boundaryBatch = repairedFittingBoundaryPrefix(\n\t\trelaxed,\n\t\tplanned,\n\t\tboundaries,\n\t\ttokenBudget,\n\t\tlastValidated?.stats.tokensAfter ?? relaxed.tokensBefore,\n\t);\n\tif (boundaryBatch) {\n\t\tconst standalone = boundaries[0] ? tryGroup(relaxed, [], boundaries[0], true) : undefined;\n\t\treturn standalone && hasFitBudget(standalone, tokenBudget) && standalone.stats.tokensAfter > boundaryBatch.stats.tokensAfter\n\t\t\t? standalone\n\t\t\t: boundaryBatch;\n\t}\n\n\tfor (const group of boundaries) {\n\t\tconst result = tryGroup(relaxed, planned, group, true);\n\t\tif (!result || (lastValidated && result.stats.tokensAfter >= lastValidated.stats.tokensAfter)) {\n\t\t\tskippedBoundaries.push(group);\n\t\t\tcontinue;\n\t\t}\n\t\tplanned = [...result.deletedTargets];\n\t\tlastValidated = result;\n\t\tif (hasFitBudget(lastValidated, tokenBudget)) {\n\t\t\tconst standalone = tryGroup(relaxed, [], group, true);\n\t\t\treturn standalone && hasFitBudget(standalone, tokenBudget) && standalone.stats.tokensAfter > result.stats.tokensAfter\n\t\t\t\t? standalone\n\t\t\t\t: result;\n\t\t}\n\t}\n\n\tfor (const group of currentHistoricalSignedGroups(relaxed, planned)) {\n\t\tconst result = tryGroup(relaxed, planned, group, false);\n\t\tif (!result) continue;\n\t\tplanned = [...result.deletedTargets];\n\t\tlastValidated = result;\n\t\tif (hasFitBudget(lastValidated, tokenBudget)) return lastValidated;\n\t}\n\n\tconst groupedRetryIds = new Set<string>();\n\tfor (const component of skippedBoundaryRestorationGroups(relaxed, planned, skippedBoundaries)) {\n\t\tconst entryIds = component.flatMap((group) => group.entryIds);\n\t\tfor (const entryId of entryIds) groupedRetryIds.add(entryId);\n\t\tconst combined: EvictionGroup = {\n\t\t\tentryIds,\n\t\t\torder: Math.min(...component.map((group) => group.order)),\n\t\t\ttokens: component.reduce((sum, group) => sum + group.tokens, 0),\n\t\t\tboundary: true,\n\t\t};\n\t\tconst result = tryGroup(relaxed, planned, combined, true);\n\t\tif (!result) continue;\n\t\tconst deleted = getDeletedEntryIds(result.deletedTargets);\n\t\tif (!entryIds.every((entryId) => deleted.has(entryId))) continue;\n\t\tif (lastValidated && result.stats.tokensAfter >= lastValidated.stats.tokensAfter && !hasFitBudget(result, tokenBudget)) {\n\t\t\tcontinue;\n\t\t}\n\t\tplanned = [...result.deletedTargets];\n\t\tlastValidated = result;\n\t\tif (hasFitBudget(lastValidated, tokenBudget)) return lastValidated;\n\t}\n\n\tfor (const group of skippedBoundaries) {\n\t\tif (group.entryIds.some((entryId) => groupedRetryIds.has(entryId))) continue;\n\t\tconst result = tryGroup(relaxed, planned, group, true);\n\t\tif (!result || (lastValidated && result.stats.tokensAfter >= lastValidated.stats.tokensAfter)) continue;\n\t\tplanned = [...result.deletedTargets];\n\t\tlastValidated = result;\n\t\tif (hasFitBudget(lastValidated, tokenBudget)) return lastValidated;\n\t}\n\n\tconst alternate = alternateBoundaryPlan(\n\t\trelaxed,\n\t\tboundaryBaseTargets,\n\t\tboundaryBaseResult,\n\t\tboundaries,\n\t\ttokenBudget,\n\t);\n\tif (alternate) return alternate;\n\n\tthrow terminalDeterministicEvictionError(\"candidate sweep exhausted\", lastValidated, tokenBudget);\n}\n"]}
@@ -0,0 +1,222 @@
1
+ import { relaxTranscriptForCriticalEviction } from "./context-compaction-critical.js";
2
+ import { alternateBoundaryPlan, assistantTurnsForTargets, currentHistoricalSignedGroups, hasFitBudget, repairSignedTurnTargets, skippedBoundaryRestorationGroups, targetsWithGroup, tryGroup, validateTargets, } from "./context-compaction-eviction-alternates.js";
3
+ import { transcriptEntryStartsNewTurn } from "./context-assistant-turns.js";
4
+ import { canDeleteTarget, getDeletedEntryIds } from "./context-deletion-targets.js";
5
+ function terminalDeterministicEvictionError(reason, lastValidated, tokenBudget) {
6
+ const statsText = lastValidated
7
+ ? `achieved tokensAfter=${lastValidated.stats.tokensAfter}, reduction=${lastValidated.stats.percentReduction}%, deletionTargets=${lastValidated.deletedTargets.length}`
8
+ : "achieved no validated deletion targets";
9
+ return new Error(`Context deterministic overflow eviction failed: ${reason}; ${statsText}; budget=${tokenBudget}; nothing more was safely deletable`);
10
+ }
11
+ function initialEvictionGroups(transcript) {
12
+ const turns = assistantTurnsForTargets(transcript, []);
13
+ const signedGroupByEntryId = new Map();
14
+ const activeSignedIds = new Set();
15
+ for (const turn of turns) {
16
+ if (turn.active) {
17
+ for (const entryId of turn.signedThinkingEntryIds)
18
+ activeSignedIds.add(entryId);
19
+ continue;
20
+ }
21
+ for (const entryId of turn.signedThinkingEntryIds) {
22
+ signedGroupByEntryId.set(entryId, turn.signedThinkingEntryIds);
23
+ }
24
+ }
25
+ const entryById = new Map(transcript.entries.map((entry, index) => [entry.entryId, { entry, index }]));
26
+ const grouped = new Set();
27
+ const groups = [];
28
+ for (let index = 0; index < transcript.entries.length; index++) {
29
+ const entry = transcript.entries[index];
30
+ if (activeSignedIds.has(entry.entryId) || grouped.has(entry.entryId))
31
+ continue;
32
+ const entryIds = signedGroupByEntryId.get(entry.entryId) ?? [entry.entryId];
33
+ for (const entryId of entryIds)
34
+ grouped.add(entryId);
35
+ if (!entryIds.every((entryId) => canDeleteTarget(transcript, { kind: "entry", entryId })))
36
+ continue;
37
+ groups.push({
38
+ entryIds: [...entryIds],
39
+ order: index,
40
+ tokens: entryIds.reduce((sum, entryId) => sum + (entryById.get(entryId)?.entry.tokenEstimate ?? 0), 0),
41
+ boundary: entryIds.length === 1 && transcriptEntryStartsNewTurn(entry),
42
+ });
43
+ }
44
+ return groups;
45
+ }
46
+ function repairedFittingBoundaryPrefix(transcript, planned, groups, tokenBudget, currentTokens) {
47
+ const required = currentTokens - tokenBudget;
48
+ if (required <= 0)
49
+ return undefined;
50
+ let rawRemoved = 0;
51
+ let lowerBound = 0;
52
+ while (lowerBound < groups.length && rawRemoved < required) {
53
+ rawRemoved += groups[lowerBound].tokens;
54
+ lowerBound += 1;
55
+ }
56
+ if (rawRemoved < required)
57
+ return undefined;
58
+ let prospective = [...planned];
59
+ for (let index = 0; index < groups.length; index++) {
60
+ prospective = targetsWithGroup(prospective, groups[index].entryIds);
61
+ if (index + 1 < lowerBound)
62
+ continue;
63
+ const repaired = repairSignedTurnTargets(transcript, prospective);
64
+ const validated = validateTargets(transcript, repaired);
65
+ if (!validated || !hasFitBudget(validated, tokenBudget))
66
+ continue;
67
+ const deleted = getDeletedEntryIds(validated.deletedTargets);
68
+ const prefixRetained = groups
69
+ .slice(0, index + 1)
70
+ .some((group) => group.entryIds.some((entryId) => !deleted.has(entryId)));
71
+ if (!prefixRetained)
72
+ return validated;
73
+ }
74
+ return undefined;
75
+ }
76
+ function adoptSmallestFittingPrefix(transcript, planned, groups, tokenBudget) {
77
+ if (groups.length === 0)
78
+ return undefined;
79
+ const prefixTargets = (count) => groups.slice(0, count).reduce((targets, group) => targetsWithGroup(targets, group.entryIds), [...planned]);
80
+ const full = validateTargets(transcript, prefixTargets(groups.length));
81
+ if (!full)
82
+ return undefined;
83
+ if (!hasFitBudget(full, tokenBudget))
84
+ return full;
85
+ let low = 1;
86
+ let high = groups.length;
87
+ let best = full;
88
+ while (low <= high) {
89
+ const middle = Math.floor((low + high) / 2);
90
+ const result = validateTargets(transcript, prefixTargets(middle));
91
+ if (result && hasFitBudget(result, tokenBudget)) {
92
+ best = result;
93
+ high = middle - 1;
94
+ }
95
+ else {
96
+ low = middle + 1;
97
+ }
98
+ }
99
+ return best;
100
+ }
101
+ /**
102
+ * Finite deterministic eviction phases:
103
+ * 1. Batch or sweep non-boundary groups in transcript order.
104
+ * 2. Try repaired boundary prefixes, then individual boundaries by token value.
105
+ * 3. Sweep newly historical signed groups exposed by those deletions.
106
+ * 4. Retry skipped boundaries by shared restoration component, then individually.
107
+ * 5. Search bounded alternate boundary states (at most 16 per boundary) and their signed groups.
108
+ * 6. Fail with the best validated stats after every finite candidate set is exhausted.
109
+ */
110
+ export function runDeterministicContextEviction(transcript, tokenBudget) {
111
+ const relaxed = relaxTranscriptForCriticalEviction(transcript);
112
+ const groups = initialEvictionGroups(relaxed);
113
+ const nonBoundaries = groups.filter((group) => !group.boundary).sort((left, right) => left.order - right.order);
114
+ const boundaries = groups
115
+ .filter((group) => group.boundary)
116
+ .sort((left, right) => right.tokens - left.tokens || left.order - right.order);
117
+ let planned = [];
118
+ let lastValidated;
119
+ const skippedBoundaries = [];
120
+ if (relaxed.tokensBefore > tokenBudget) {
121
+ const batch = adoptSmallestFittingPrefix(relaxed, planned, nonBoundaries, tokenBudget);
122
+ if (batch) {
123
+ planned = [...batch.deletedTargets];
124
+ lastValidated = batch;
125
+ if (hasFitBudget(lastValidated, tokenBudget))
126
+ return lastValidated;
127
+ }
128
+ else {
129
+ for (const group of nonBoundaries) {
130
+ const result = tryGroup(relaxed, planned, group, false);
131
+ if (!result)
132
+ continue;
133
+ planned = [...result.deletedTargets];
134
+ lastValidated = result;
135
+ if (hasFitBudget(lastValidated, tokenBudget))
136
+ return lastValidated;
137
+ }
138
+ }
139
+ }
140
+ else {
141
+ for (const group of nonBoundaries) {
142
+ const result = tryGroup(relaxed, planned, group, false);
143
+ if (!result)
144
+ continue;
145
+ return result;
146
+ }
147
+ }
148
+ const boundaryBaseTargets = [...planned];
149
+ const boundaryBaseResult = lastValidated;
150
+ const boundaryBatch = repairedFittingBoundaryPrefix(relaxed, planned, boundaries, tokenBudget, lastValidated?.stats.tokensAfter ?? relaxed.tokensBefore);
151
+ if (boundaryBatch) {
152
+ const standalone = boundaries[0] ? tryGroup(relaxed, [], boundaries[0], true) : undefined;
153
+ return standalone && hasFitBudget(standalone, tokenBudget) && standalone.stats.tokensAfter > boundaryBatch.stats.tokensAfter
154
+ ? standalone
155
+ : boundaryBatch;
156
+ }
157
+ for (const group of boundaries) {
158
+ const result = tryGroup(relaxed, planned, group, true);
159
+ if (!result || (lastValidated && result.stats.tokensAfter >= lastValidated.stats.tokensAfter)) {
160
+ skippedBoundaries.push(group);
161
+ continue;
162
+ }
163
+ planned = [...result.deletedTargets];
164
+ lastValidated = result;
165
+ if (hasFitBudget(lastValidated, tokenBudget)) {
166
+ const standalone = tryGroup(relaxed, [], group, true);
167
+ return standalone && hasFitBudget(standalone, tokenBudget) && standalone.stats.tokensAfter > result.stats.tokensAfter
168
+ ? standalone
169
+ : result;
170
+ }
171
+ }
172
+ for (const group of currentHistoricalSignedGroups(relaxed, planned)) {
173
+ const result = tryGroup(relaxed, planned, group, false);
174
+ if (!result)
175
+ continue;
176
+ planned = [...result.deletedTargets];
177
+ lastValidated = result;
178
+ if (hasFitBudget(lastValidated, tokenBudget))
179
+ return lastValidated;
180
+ }
181
+ const groupedRetryIds = new Set();
182
+ for (const component of skippedBoundaryRestorationGroups(relaxed, planned, skippedBoundaries)) {
183
+ const entryIds = component.flatMap((group) => group.entryIds);
184
+ for (const entryId of entryIds)
185
+ groupedRetryIds.add(entryId);
186
+ const combined = {
187
+ entryIds,
188
+ order: Math.min(...component.map((group) => group.order)),
189
+ tokens: component.reduce((sum, group) => sum + group.tokens, 0),
190
+ boundary: true,
191
+ };
192
+ const result = tryGroup(relaxed, planned, combined, true);
193
+ if (!result)
194
+ continue;
195
+ const deleted = getDeletedEntryIds(result.deletedTargets);
196
+ if (!entryIds.every((entryId) => deleted.has(entryId)))
197
+ continue;
198
+ if (lastValidated && result.stats.tokensAfter >= lastValidated.stats.tokensAfter && !hasFitBudget(result, tokenBudget)) {
199
+ continue;
200
+ }
201
+ planned = [...result.deletedTargets];
202
+ lastValidated = result;
203
+ if (hasFitBudget(lastValidated, tokenBudget))
204
+ return lastValidated;
205
+ }
206
+ for (const group of skippedBoundaries) {
207
+ if (group.entryIds.some((entryId) => groupedRetryIds.has(entryId)))
208
+ continue;
209
+ const result = tryGroup(relaxed, planned, group, true);
210
+ if (!result || (lastValidated && result.stats.tokensAfter >= lastValidated.stats.tokensAfter))
211
+ continue;
212
+ planned = [...result.deletedTargets];
213
+ lastValidated = result;
214
+ if (hasFitBudget(lastValidated, tokenBudget))
215
+ return lastValidated;
216
+ }
217
+ const alternate = alternateBoundaryPlan(relaxed, boundaryBaseTargets, boundaryBaseResult, boundaries, tokenBudget);
218
+ if (alternate)
219
+ return alternate;
220
+ throw terminalDeterministicEvictionError("candidate sweep exhausted", lastValidated, tokenBudget);
221
+ }
222
+ //# sourceMappingURL=context-compaction-eviction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-compaction-eviction.js","sourceRoot":"","sources":["../../../src/core/compaction/context-compaction-eviction.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ContextDeletionTarget } from \"../session-manager.js\";\nimport { relaxTranscriptForCriticalEviction } from \"./context-compaction-critical.js\";\nimport {\n\talternateBoundaryPlan,\n\tassistantTurnsForTargets,\n\tcurrentHistoricalSignedGroups,\n\ttype EvictionGroup,\n\thasFitBudget,\n\trepairSignedTurnTargets,\n\tskippedBoundaryRestorationGroups,\n\ttargetsWithGroup,\n\ttryGroup,\n\tvalidateTargets,\n} from \"./context-compaction-eviction-alternates.js\";\nimport type { CompactableTranscript, ValidatedContextDeletionResult } from \"./context-compaction-types.js\";\nimport { transcriptEntryStartsNewTurn } from \"./context-assistant-turns.js\";\nimport { canDeleteTarget, getDeletedEntryIds } from \"./context-deletion-targets.js\";\n\nfunction terminalDeterministicEvictionError(\n\treason: string,\n\tlastValidated: ValidatedContextDeletionResult | undefined,\n\ttokenBudget: number,\n): Error {\n\tconst statsText = lastValidated\n\t\t? `achieved tokensAfter=${lastValidated.stats.tokensAfter}, reduction=${lastValidated.stats.percentReduction}%, deletionTargets=${lastValidated.deletedTargets.length}`\n\t\t: \"achieved no validated deletion targets\";\n\treturn new Error(\n\t\t`Context deterministic overflow eviction failed: ${reason}; ${statsText}; budget=${tokenBudget}; nothing more was safely deletable`,\n\t);\n}\n\nfunction initialEvictionGroups(transcript: CompactableTranscript): EvictionGroup[] {\n\tconst turns = assistantTurnsForTargets(transcript, []);\n\tconst signedGroupByEntryId = new Map<string, string[]>();\n\tconst activeSignedIds = new Set<string>();\n\tfor (const turn of turns) {\n\t\tif (turn.active) {\n\t\t\tfor (const entryId of turn.signedThinkingEntryIds) activeSignedIds.add(entryId);\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const entryId of turn.signedThinkingEntryIds) {\n\t\t\tsignedGroupByEntryId.set(entryId, turn.signedThinkingEntryIds);\n\t\t}\n\t}\n\n\tconst entryById = new Map(transcript.entries.map((entry, index) => [entry.entryId, { entry, index }]));\n\tconst grouped = new Set<string>();\n\tconst groups: EvictionGroup[] = [];\n\tfor (let index = 0; index < transcript.entries.length; index++) {\n\t\tconst entry = transcript.entries[index]!;\n\t\tif (activeSignedIds.has(entry.entryId) || grouped.has(entry.entryId)) continue;\n\t\tconst entryIds = signedGroupByEntryId.get(entry.entryId) ?? [entry.entryId];\n\t\tfor (const entryId of entryIds) grouped.add(entryId);\n\t\tif (!entryIds.every((entryId) => canDeleteTarget(transcript, { kind: \"entry\", entryId }))) continue;\n\t\tgroups.push({\n\t\t\tentryIds: [...entryIds],\n\t\t\torder: index,\n\t\t\ttokens: entryIds.reduce((sum, entryId) => sum + (entryById.get(entryId)?.entry.tokenEstimate ?? 0), 0),\n\t\t\tboundary: entryIds.length === 1 && transcriptEntryStartsNewTurn(entry),\n\t\t});\n\t}\n\treturn groups;\n}\n\nfunction repairedFittingBoundaryPrefix(\n\ttranscript: CompactableTranscript,\n\tplanned: readonly ContextDeletionTarget[],\n\tgroups: readonly EvictionGroup[],\n\ttokenBudget: number,\n\tcurrentTokens: number,\n): ValidatedContextDeletionResult | undefined {\n\tconst required = currentTokens - tokenBudget;\n\tif (required <= 0) return undefined;\n\tlet rawRemoved = 0;\n\tlet lowerBound = 0;\n\twhile (lowerBound < groups.length && rawRemoved < required) {\n\t\trawRemoved += groups[lowerBound]!.tokens;\n\t\tlowerBound += 1;\n\t}\n\tif (rawRemoved < required) return undefined;\n\n\tlet prospective = [...planned];\n\tfor (let index = 0; index < groups.length; index++) {\n\t\tprospective = targetsWithGroup(prospective, groups[index]!.entryIds);\n\t\tif (index + 1 < lowerBound) continue;\n\t\tconst repaired = repairSignedTurnTargets(transcript, prospective);\n\t\tconst validated = validateTargets(transcript, repaired);\n\t\tif (!validated || !hasFitBudget(validated, tokenBudget)) continue;\n\t\tconst deleted = getDeletedEntryIds(validated.deletedTargets);\n\t\tconst prefixRetained = groups\n\t\t\t.slice(0, index + 1)\n\t\t\t.some((group) => group.entryIds.some((entryId) => !deleted.has(entryId)));\n\t\tif (!prefixRetained) return validated;\n\t}\n\treturn undefined;\n}\n\nfunction adoptSmallestFittingPrefix(\n\ttranscript: CompactableTranscript,\n\tplanned: readonly ContextDeletionTarget[],\n\tgroups: readonly EvictionGroup[],\n\ttokenBudget: number,\n): ValidatedContextDeletionResult | undefined {\n\tif (groups.length === 0) return undefined;\n\tconst prefixTargets = (count: number): ContextDeletionTarget[] =>\n\t\tgroups.slice(0, count).reduce((targets, group) => targetsWithGroup(targets, group.entryIds), [...planned]);\n\tconst full = validateTargets(transcript, prefixTargets(groups.length));\n\tif (!full) return undefined;\n\tif (!hasFitBudget(full, tokenBudget)) return full;\n\n\tlet low = 1;\n\tlet high = groups.length;\n\tlet best = full;\n\twhile (low <= high) {\n\t\tconst middle = Math.floor((low + high) / 2);\n\t\tconst result = validateTargets(transcript, prefixTargets(middle));\n\t\tif (result && hasFitBudget(result, tokenBudget)) {\n\t\t\tbest = result;\n\t\t\thigh = middle - 1;\n\t\t} else {\n\t\t\tlow = middle + 1;\n\t\t}\n\t}\n\treturn best;\n}\n\n/**\n * Finite deterministic eviction phases:\n * 1. Batch or sweep non-boundary groups in transcript order.\n * 2. Try repaired boundary prefixes, then individual boundaries by token value.\n * 3. Sweep newly historical signed groups exposed by those deletions.\n * 4. Retry skipped boundaries by shared restoration component, then individually.\n * 5. Search bounded alternate boundary states (at most 16 per boundary) and their signed groups.\n * 6. Fail with the best validated stats after every finite candidate set is exhausted.\n */\nexport function runDeterministicContextEviction(\n\ttranscript: CompactableTranscript,\n\ttokenBudget: number,\n): ValidatedContextDeletionResult {\n\tconst relaxed = relaxTranscriptForCriticalEviction(transcript);\n\tconst groups = initialEvictionGroups(relaxed);\n\tconst nonBoundaries = groups.filter((group) => !group.boundary).sort((left, right) => left.order - right.order);\n\tconst boundaries = groups\n\t\t.filter((group) => group.boundary)\n\t\t.sort((left, right) => right.tokens - left.tokens || left.order - right.order);\n\tlet planned: ContextDeletionTarget[] = [];\n\tlet lastValidated: ValidatedContextDeletionResult | undefined;\n\tconst skippedBoundaries: EvictionGroup[] = [];\n\n\tif (relaxed.tokensBefore > tokenBudget) {\n\t\tconst batch = adoptSmallestFittingPrefix(relaxed, planned, nonBoundaries, tokenBudget);\n\t\tif (batch) {\n\t\t\tplanned = [...batch.deletedTargets];\n\t\t\tlastValidated = batch;\n\t\t\tif (hasFitBudget(lastValidated, tokenBudget)) return lastValidated;\n\t\t} else {\n\t\t\tfor (const group of nonBoundaries) {\n\t\t\t\tconst result = tryGroup(relaxed, planned, group, false);\n\t\t\t\tif (!result) continue;\n\t\t\t\tplanned = [...result.deletedTargets];\n\t\t\t\tlastValidated = result;\n\t\t\t\tif (hasFitBudget(lastValidated, tokenBudget)) return lastValidated;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor (const group of nonBoundaries) {\n\t\t\tconst result = tryGroup(relaxed, planned, group, false);\n\t\t\tif (!result) continue;\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tconst boundaryBaseTargets = [...planned];\n\tconst boundaryBaseResult = lastValidated;\n\tconst boundaryBatch = repairedFittingBoundaryPrefix(\n\t\trelaxed,\n\t\tplanned,\n\t\tboundaries,\n\t\ttokenBudget,\n\t\tlastValidated?.stats.tokensAfter ?? relaxed.tokensBefore,\n\t);\n\tif (boundaryBatch) {\n\t\tconst standalone = boundaries[0] ? tryGroup(relaxed, [], boundaries[0], true) : undefined;\n\t\treturn standalone && hasFitBudget(standalone, tokenBudget) && standalone.stats.tokensAfter > boundaryBatch.stats.tokensAfter\n\t\t\t? standalone\n\t\t\t: boundaryBatch;\n\t}\n\n\tfor (const group of boundaries) {\n\t\tconst result = tryGroup(relaxed, planned, group, true);\n\t\tif (!result || (lastValidated && result.stats.tokensAfter >= lastValidated.stats.tokensAfter)) {\n\t\t\tskippedBoundaries.push(group);\n\t\t\tcontinue;\n\t\t}\n\t\tplanned = [...result.deletedTargets];\n\t\tlastValidated = result;\n\t\tif (hasFitBudget(lastValidated, tokenBudget)) {\n\t\t\tconst standalone = tryGroup(relaxed, [], group, true);\n\t\t\treturn standalone && hasFitBudget(standalone, tokenBudget) && standalone.stats.tokensAfter > result.stats.tokensAfter\n\t\t\t\t? standalone\n\t\t\t\t: result;\n\t\t}\n\t}\n\n\tfor (const group of currentHistoricalSignedGroups(relaxed, planned)) {\n\t\tconst result = tryGroup(relaxed, planned, group, false);\n\t\tif (!result) continue;\n\t\tplanned = [...result.deletedTargets];\n\t\tlastValidated = result;\n\t\tif (hasFitBudget(lastValidated, tokenBudget)) return lastValidated;\n\t}\n\n\tconst groupedRetryIds = new Set<string>();\n\tfor (const component of skippedBoundaryRestorationGroups(relaxed, planned, skippedBoundaries)) {\n\t\tconst entryIds = component.flatMap((group) => group.entryIds);\n\t\tfor (const entryId of entryIds) groupedRetryIds.add(entryId);\n\t\tconst combined: EvictionGroup = {\n\t\t\tentryIds,\n\t\t\torder: Math.min(...component.map((group) => group.order)),\n\t\t\ttokens: component.reduce((sum, group) => sum + group.tokens, 0),\n\t\t\tboundary: true,\n\t\t};\n\t\tconst result = tryGroup(relaxed, planned, combined, true);\n\t\tif (!result) continue;\n\t\tconst deleted = getDeletedEntryIds(result.deletedTargets);\n\t\tif (!entryIds.every((entryId) => deleted.has(entryId))) continue;\n\t\tif (lastValidated && result.stats.tokensAfter >= lastValidated.stats.tokensAfter && !hasFitBudget(result, tokenBudget)) {\n\t\t\tcontinue;\n\t\t}\n\t\tplanned = [...result.deletedTargets];\n\t\tlastValidated = result;\n\t\tif (hasFitBudget(lastValidated, tokenBudget)) return lastValidated;\n\t}\n\n\tfor (const group of skippedBoundaries) {\n\t\tif (group.entryIds.some((entryId) => groupedRetryIds.has(entryId))) continue;\n\t\tconst result = tryGroup(relaxed, planned, group, true);\n\t\tif (!result || (lastValidated && result.stats.tokensAfter >= lastValidated.stats.tokensAfter)) continue;\n\t\tplanned = [...result.deletedTargets];\n\t\tlastValidated = result;\n\t\tif (hasFitBudget(lastValidated, tokenBudget)) return lastValidated;\n\t}\n\n\tconst alternate = alternateBoundaryPlan(\n\t\trelaxed,\n\t\tboundaryBaseTargets,\n\t\tboundaryBaseResult,\n\t\tboundaries,\n\t\ttokenBudget,\n\t);\n\tif (alternate) return alternate;\n\n\tthrow terminalDeterministicEvictionError(\"candidate sweep exhausted\", lastValidated, tokenBudget);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"context-compaction-prompt.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/context-compaction-prompt.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACX,qBAAqB,EAErB,2BAA2B,EAC3B,MAAM,+BAA+B,CAAC;AAWvC,eAAO,MAAM,gCAAgC,sTAE0N,CAAC;AAsFxQ,MAAM,WAAW,+BAA+B;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,IAAI,IAAI,CAAC;CAChB;AAED,wBAAgB,oCAAoC,CAAC,UAAU,EAAE,qBAAqB,GAAG,+BAA+B,CAWvH;AA+DD,wBAAgB,4BAA4B,CAC3C,UAAU,EAAE,qBAAqB,EACjC,kBAAkB,SAAgE,EAClF,UAAU,GAAE,2BAA2E,GACrF,MAAM,CAER","sourcesContent":["import { mkdtempSync, rmSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type {\n\tCompactableTranscript,\n\tCompactableTranscriptEntry,\n\tContextCompactionParameters,\n} from \"./context-compaction-types.ts\";\nimport {\n\tcontextCompactionTargetLabel,\n\tcontextCompactionTargetReductionPercent,\n} from \"./context-compaction-metrics.ts\";\nimport { getTranscriptCompactionParameters } from \"./context-compaction-strategy.ts\";\nimport { isExcludedFromLlmContext } from \"./context-transcript-analysis.ts\";\n\nconst CONTEXT_MANIFEST_MAX_ENTRIES = 80;\nconst CONTEXT_MANIFEST_PREVIEW_CHARS = 240;\n\nexport const CONTEXT_COMPACTION_SYSTEM_PROMPT = `You are a context compaction assistant.\n\nYour task is to read relevant parts of a conversation between a user and an AI assistant provided via a transcript file, then run a series of tools to apply deletion-only verbatim compaction using the exact context_delete or context_grep_delete format specified.`;\n\nfunction contextCompactionFixedPrompt(parameters: ContextCompactionParameters): string {\n\tconst targetLabel = contextCompactionTargetLabel(parameters);\n\treturn `Reference the provided transcript file transcript and use your search/read tools for small inspections, then use context_delete or context_grep_delete for deletions.\n\nCompaction records deletion targets, not replacement content.\nFor context_delete, use id-only targets: stable entryId values and optional blockIndex values only.\nFor context_grep_delete, use a concise literal or regex pattern to select matching entries or blocks; do not paste full transcript entries or content-block bodies.\nDo not summarize, paraphrase, or generate replacement context; those are not accepted compaction outputs.\nDo not mutate retained transcript objects or content.\nDeletion tool calls are the compaction action.\n\nStrategy:\n- Start by calling context_compaction_budget to see how much of the context window is full and how much reduction is needed.\n- Spend a few turns exploring with search/read tools to gain high confidence of candidate blocks to remove.\n- Prefer high-confidence exploit actions after that: delete obvious low-value entries via context_grep_delete or context_delete.\n- Use grep deletion for repeated low-value patterns.\n- Use exact id deletion for inspected one-off stale entries.\n- Check context_compaction_budget after deletion batches to track progress.\n- Strict requirement: reduce current context by at least ${targetLabel} before finishing. This is a hard completion gate, not a loose goal.\n- Do not send a final plain-text completion message until context_compaction_budget reports at least ${targetLabel} currentReductionPercent.\n- If the strict ${targetLabel} reduction is not met yet, continue removing low-value message entries or content blocks with context_delete/context_grep_delete.\n- Use the focus query to preserve relevant context: ${JSON.stringify(parameters.query)}.\n\nWhat Gets Deleted:\n- Redundant tool outputs: file reads already acted on, grep/search results already processed, passing test output no longer needed.\n- Exploratory dead ends: irrelevant files read, unhelpful or empty searches.\n- Verbose boilerplate: license headers, import blocks the agent isn't modifying, configuration files read for reference.\n- Superseded information: earlier versions of files that have since been edited, old error messages from bugs already fixed.\n- Stale/superseded image context: image content blocks (shown as type \"image\" / text \"[image]\") in older tool results, custom messages, or old user-pasted attachments that the agent has already inspected and no longer needs. Image blocks are large (each costs far more tokens than its \"[image]\" text preview suggests, as reported by context_compaction_budget imageTokenPercent). When images dominate the context, prefer deleting these stale image content blocks before removing useful recent text. Use context_grep_delete with the literal pattern \"[image]\" and target \"content_block\" to find image candidates, then confirm they are stale with context_read_entry before deleting. User text blocks remain protected. Old non-recent user image blocks may be deleted only when non-image user content remains in the same entry; old image-only user entries may be deleted as whole entries only when another task-bearing entry remains.\n\nWhat Survives:\n- Active file paths and line numbers: Any reference the agent might need to navigate.\n- Current error messages: Unresolved bugs and their exact text.\n- Reasoning decisions: Why the agent chose approach A over B. An agent's chain of thought (why it chose this file, what pattern it noticed, what fix it decided on) carries more information-per-token than the raw grep output or file content that informed those decisions.\n- Recent tool calls and their results: The last 3-5 operations.\n- User instructions: The original task and any clarifications.\n- Task-relevant images: Images that are part of the active user task (for example, a screenshot the user just asked about, or the most recent image-bearing result the agent is still acting on). Recent user images and recent tool results are protected by preserve_recent, so do not delete images the agent still needs.\n\nConditionally Deleted:\n- Old Reasoning decisions: If there is nothing else to remove and the target reduction is not met, you can remove entire stale assistant entries, EXCEPT do not delete individual content blocks from any retained assistant message that contains thinking or redacted_thinking blocks. Thinking-bearing assistant messages are all-or-nothing for replay safety.\n\n<output_format>\nCall the context_delete tool one or more times with deletion targets in this shape:\n{ \"deletions\": [{ \"kind\": \"entry\", \"entryId\": \"...\" }] }\n\nFor content-block deletions, use:\n{ \"kind\": \"content_block\", \"entryId\": \"...\", \"blockIndex\": 0 }\n\nThe tool applies and validates deletion targets immediately. You can continue calling it for additional deletions if useful.\n\nFor guarded bulk deletion by text match, call context_grep_delete with a literal pattern or regex. It removes valid matching context, silently ignores candidates that validation does not allow so they are not counted as removals, enforces a per-call maxMatches safety cap and optional expectedMatchCount, and validates through the same tool-call/tool-result safety rules. maxMatches only limits one tool call; there is no cumulative cap across corrected or repeated deletion calls.\n\nThe full transcript is available as a JSONL file path in the prompt, but do NOT try to load the whole file into context. Use context_search_transcript to find candidate entry IDs and context_read_entry to read only small slices (for example maxChars 1000-4000) before deleting.\n\nWhen the strict ${targetLabel} reduction requirement is met, reply with a brief plain-text completion message. Do not include deletion target IDs outside tool calls.\n</output_format>`;\n}\n\nfunction truncateForPrompt(text: string, maxChars: number): string {\n\tif (text.length <= maxChars) return text;\n\treturn `${text.slice(0, maxChars)}\\n[... ${text.length - maxChars} more characters omitted from context compaction prompt]`;\n}\n\nfunction transcriptEntryFilePayload(entry: CompactableTranscriptEntry): unknown {\n\treturn {\n\t\tentryId: entry.entryId,\n\t\tentryType: entry.entryType,\n\t\trole: entry.role,\n\t\tprotected: entry.protected,\n\t\ttokenEstimate: entry.tokenEstimate,\n\t\ttoolCallIds: entry.toolCallIds,\n\t\ttoolResultFor: entry.toolResultFor,\n\t\ttext: entry.text,\n\t\tcontentBlocks: entry.contentBlocks.map((block) => ({\n\t\t\tblockIndex: block.blockIndex,\n\t\t\ttype: block.type,\n\t\t\tprotected: block.protected,\n\t\t\ttoolCallId: block.toolCallId,\n\t\t\ttokenEstimate: block.tokenEstimate,\n\t\t\ttext: block.text,\n\t\t})),\n\t};\n}\n\nexport interface ContextCompactionTranscriptFile {\n\tpath: string;\n\tcleanup(): void;\n}\n\nexport function writeContextCompactionTranscriptFile(transcript: CompactableTranscript): ContextCompactionTranscriptFile {\n\tconst directory = mkdtempSync(join(tmpdir(), \"atomic-context-transcript-\"));\n\tconst path = join(directory, \"transcript.jsonl\");\n\tconst lines = transcript.entries\n\t\t.filter((entry) => !isExcludedFromLlmContext(entry.message))\n\t\t.map((entry) => JSON.stringify(transcriptEntryFilePayload(entry)));\n\twriteFileSync(path, `${lines.join(\"\\n\")}\\n`, \"utf8\");\n\treturn {\n\t\tpath,\n\t\tcleanup: () => rmSync(directory, { recursive: true, force: true }),\n\t};\n}\n\nfunction contextCompactionTranscriptManifest(transcript: CompactableTranscript, transcriptFilePath: string): unknown {\n\tconst eligibleEntries = transcript.entries.filter((entry) => !isExcludedFromLlmContext(entry.message));\n\tconst selectedEntryIds = new Set<string>();\n\tconst selectedEntries: CompactableTranscriptEntry[] = [];\n\tconst addEntry = (entry: CompactableTranscriptEntry): void => {\n\t\tif (selectedEntryIds.has(entry.entryId) || selectedEntries.length >= CONTEXT_MANIFEST_MAX_ENTRIES) return;\n\t\tselectedEntryIds.add(entry.entryId);\n\t\tselectedEntries.push(entry);\n\t};\n\n\tfor (const entry of eligibleEntries.filter((entry) => entry.protected)) {\n\t\taddEntry(entry);\n\t}\n\tfor (const entry of [...eligibleEntries]\n\t\t.filter((entry) => !entry.protected)\n\t\t.sort((left, right) => right.tokenEstimate - left.tokenEstimate)) {\n\t\taddEntry(entry);\n\t}\n\tselectedEntries.sort((left, right) => eligibleEntries.indexOf(left) - eligibleEntries.indexOf(right));\n\n\treturn {\n\t\ttranscriptFilePath,\n\t\ttranscriptFileFormat: \"jsonl: one compactable transcript entry per line with full text and contentBlocks text\",\n\t\ttotalEntries: eligibleEntries.length,\n\t\tmanifestEntries: selectedEntries.length,\n\t\tomittedEntries: Math.max(0, eligibleEntries.length - selectedEntries.length),\n\t\ttokensBefore: transcript.tokensBefore,\n\t\tprotectedEntryIds: transcript.protectedEntryIds,\n\t\tentries: selectedEntries.map((entry) => ({\n\t\t\tentryId: entry.entryId,\n\t\t\trole: entry.role,\n\t\t\tprotected: entry.protected,\n\t\t\ttokenEstimate: entry.tokenEstimate,\n\t\t\ttoolCallIds: entry.toolCallIds,\n\t\t\ttoolResultFor: entry.toolResultFor,\n\t\t\tcontentBlockCount: entry.contentBlocks.length,\n\t\t\tcontentBlocks: entry.contentBlocks.map((block) => ({\n\t\t\t\tblockIndex: block.blockIndex,\n\t\t\t\ttype: block.type,\n\t\t\t\tprotected: block.protected,\n\t\t\t\ttoolCallId: block.toolCallId,\n\t\t\t\ttokenEstimate: block.tokenEstimate,\n\t\t\t})),\n\t\t\tpreview: truncateForPrompt(entry.text, CONTEXT_MANIFEST_PREVIEW_CHARS),\n\t\t})),\n\t};\n}\n\nfunction contextCompactionParametersPrompt(parameters: ContextCompactionParameters): string {\n\treturn `\\n<compaction-parameters>\\n${JSON.stringify(\n\t\t{\n\t\t\tcompression_ratio: parameters.compression_ratio,\n\t\t\tpreserve_recent: parameters.preserve_recent,\n\t\t\tquery: parameters.query,\n\t\t\ttarget_reduction_percent: contextCompactionTargetReductionPercent(parameters),\n\t\t},\n\t\tnull,\n\t\t2,\n\t)}\\n</compaction-parameters>`;\n}\n\nexport function buildContextCompactionPrompt(\n\ttranscript: CompactableTranscript,\n\ttranscriptFilePath = \"<transcript file will be written during context compaction>\",\n\tparameters: ContextCompactionParameters = getTranscriptCompactionParameters(transcript),\n): string {\n\treturn `${contextCompactionFixedPrompt(parameters)}${contextCompactionParametersPrompt(parameters)}\\n\\n<transcript-file>\\n${transcriptFilePath}\\n</transcript-file>\\n\\n<context-manifest>\\n${JSON.stringify(contextCompactionTranscriptManifest(transcript, transcriptFilePath), null, 2)}\\n</context-manifest>`;\n}\n"]}
1
+ {"version":3,"file":"context-compaction-prompt.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/context-compaction-prompt.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACX,qBAAqB,EAErB,2BAA2B,EAC3B,MAAM,+BAA+B,CAAC;AAWvC,eAAO,MAAM,gCAAgC,sTAE0N,CAAC;AAsFxQ,MAAM,WAAW,+BAA+B;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,IAAI,IAAI,CAAC;CAChB;AAED,wBAAgB,oCAAoC,CAAC,UAAU,EAAE,qBAAqB,GAAG,+BAA+B,CAWvH;AA+DD,wBAAgB,4BAA4B,CAC3C,UAAU,EAAE,qBAAqB,EACjC,kBAAkB,SAAgE,EAClF,UAAU,GAAE,2BAA2E,GACrF,MAAM,CAER","sourcesContent":["import { mkdtempSync, rmSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type {\n\tCompactableTranscript,\n\tCompactableTranscriptEntry,\n\tContextCompactionParameters,\n} from \"./context-compaction-types.ts\";\nimport {\n\tcontextCompactionTargetLabel,\n\tcontextCompactionTargetReductionPercent,\n} from \"./context-compaction-metrics.ts\";\nimport { getTranscriptCompactionParameters } from \"./context-compaction-strategy.ts\";\nimport { isExcludedFromLlmContext } from \"./context-transcript-analysis.ts\";\n\nconst CONTEXT_MANIFEST_MAX_ENTRIES = 80;\nconst CONTEXT_MANIFEST_PREVIEW_CHARS = 240;\n\nexport const CONTEXT_COMPACTION_SYSTEM_PROMPT = `You are a context compaction assistant.\n\nYour task is to read relevant parts of a conversation between a user and an AI assistant provided via a transcript file, then run a series of tools to apply deletion-only verbatim compaction using the exact context_delete or context_grep_delete format specified.`;\n\nfunction contextCompactionFixedPrompt(parameters: ContextCompactionParameters): string {\n\tconst targetLabel = contextCompactionTargetLabel(parameters);\n\treturn `Reference the provided transcript file transcript and use your search/read tools for small inspections, then use context_delete or context_grep_delete for deletions.\n\nCompaction records deletion targets, not replacement content.\nFor context_delete, use id-only targets: stable entryId values and optional blockIndex values only.\nFor context_grep_delete, use a concise literal or regex pattern to select matching entries or blocks; do not paste full transcript entries or content-block bodies.\nDo not summarize, paraphrase, or generate replacement context; those are not accepted compaction outputs.\nDo not mutate retained transcript objects or content.\nDeletion tool calls are the compaction action.\n\nStrategy:\n- Start by calling context_compaction_budget to see how much of the context window is full and how much reduction is needed.\n- Spend a few turns exploring with search/read tools to gain high confidence of candidate blocks to remove.\n- Prefer high-confidence exploit actions after that: delete obvious low-value entries via context_grep_delete or context_delete.\n- Use grep deletion for repeated low-value patterns.\n- Use exact id deletion for inspected one-off stale entries.\n- Check context_compaction_budget after deletion batches to track progress.\n- Strict requirement: reduce current context by at least ${targetLabel} before finishing. This is a hard completion gate, not a loose goal.\n- Do not send a final plain-text completion message until context_compaction_budget reports at least ${targetLabel} currentReductionPercent.\n- If the strict ${targetLabel} reduction is not met yet, continue removing low-value message entries or content blocks with context_delete/context_grep_delete.\n- Use the focus query to preserve relevant context: ${JSON.stringify(parameters.query)}.\n\nWhat Gets Deleted:\n- Redundant tool outputs: file reads already acted on, grep/search results already processed, passing test output no longer needed.\n- Exploratory dead ends: irrelevant files read, unhelpful or empty searches.\n- Verbose boilerplate: license headers, import blocks the agent isn't modifying, configuration files read for reference.\n- Superseded information: earlier versions of files that have since been edited, old error messages from bugs already fixed.\n- Stale/superseded image context: image content blocks (shown as type \"image\" / text \"[image]\") in older tool results, custom messages, or old user-pasted attachments that the agent has already inspected and no longer needs. Image blocks are large (each costs far more tokens than its \"[image]\" text preview suggests, as reported by context_compaction_budget imageTokenPercent). When images dominate the context, prefer deleting these stale image content blocks before removing useful recent text. Use context_grep_delete with the literal pattern \"[image]\" and target \"content_block\" to find image candidates, then confirm they are stale with context_read_entry before deleting. User text blocks remain protected. Old non-recent user image blocks may be deleted only when non-image user content remains in the same entry; old image-only user entries may be deleted as whole entries only when another task-bearing entry remains.\n\nWhat Survives:\n- Active file paths and line numbers: Any reference the agent might need to navigate.\n- Current error messages: Unresolved bugs and their exact text.\n- Reasoning decisions: Why the agent chose approach A over B. An agent's chain of thought (why it chose this file, what pattern it noticed, what fix it decided on) carries more information-per-token than the raw grep output or file content that informed those decisions.\n- Recent tool calls and their results: The last 3-5 operations.\n- User instructions: The original task and any clarifications.\n- Task-relevant images: Images that are part of the active user task (for example, a screenshot the user just asked about, or the most recent image-bearing result the agent is still acting on). Recent user images and recent tool results are protected by preserve_recent, so do not delete images the agent still needs.\n\nConditionally Deleted:\n- Old reasoning decisions: If there is nothing else to remove and the target reduction is not met, you may omit signed reasoning only as a complete logical assistant tool-use turn sequence. Each provider-visible user-like input starts a turn: a non-empty user/custom input (non-whitespace text or an image), a context-eligible bash execution, or a non-empty branch summary. Empty/whitespace-only user or custom inputs and empty branch summaries do not establish a boundary; whitespace-only branch summaries do because their wrapper is visible. Assistant messages and intervening tool results remain in that turn until the next visible user-like input. Never delete any thinking/redacted_thinking-bearing assistant entry from the current final logical turn; a trailing visible input without an assistant response makes the preceding assistant turn historical. In a completed historical turn, retain all thinking/redacted_thinking-bearing assistant entries or delete all of them as whole entries; never retain a proper subset. Never delete individual content blocks from a retained thinking-bearing assistant message.\n\n<output_format>\nCall the context_delete tool one or more times with deletion targets in this shape:\n{ \"deletions\": [{ \"kind\": \"entry\", \"entryId\": \"...\" }] }\n\nFor content-block deletions, use:\n{ \"kind\": \"content_block\", \"entryId\": \"...\", \"blockIndex\": 0 }\n\nThe tool applies and validates deletion targets immediately. You can continue calling it for additional deletions if useful.\n\nFor guarded bulk deletion by text match, call context_grep_delete with a literal pattern or regex. It removes valid matching context, silently ignores candidates that validation does not allow so they are not counted as removals, enforces a per-call maxMatches safety cap and optional expectedMatchCount, and validates through the same tool-call/tool-result safety rules. maxMatches only limits one tool call; there is no cumulative cap across corrected or repeated deletion calls.\n\nThe full transcript is available as a JSONL file path in the prompt, but do NOT try to load the whole file into context. Use context_search_transcript to find candidate entry IDs and context_read_entry to read only small slices (for example maxChars 1000-4000) before deleting.\n\nWhen the strict ${targetLabel} reduction requirement is met, reply with a brief plain-text completion message. Do not include deletion target IDs outside tool calls.\n</output_format>`;\n}\n\nfunction truncateForPrompt(text: string, maxChars: number): string {\n\tif (text.length <= maxChars) return text;\n\treturn `${text.slice(0, maxChars)}\\n[... ${text.length - maxChars} more characters omitted from context compaction prompt]`;\n}\n\nfunction transcriptEntryFilePayload(entry: CompactableTranscriptEntry): unknown {\n\treturn {\n\t\tentryId: entry.entryId,\n\t\tentryType: entry.entryType,\n\t\trole: entry.role,\n\t\tprotected: entry.protected,\n\t\ttokenEstimate: entry.tokenEstimate,\n\t\ttoolCallIds: entry.toolCallIds,\n\t\ttoolResultFor: entry.toolResultFor,\n\t\ttext: entry.text,\n\t\tcontentBlocks: entry.contentBlocks.map((block) => ({\n\t\t\tblockIndex: block.blockIndex,\n\t\t\ttype: block.type,\n\t\t\tprotected: block.protected,\n\t\t\ttoolCallId: block.toolCallId,\n\t\t\ttokenEstimate: block.tokenEstimate,\n\t\t\ttext: block.text,\n\t\t})),\n\t};\n}\n\nexport interface ContextCompactionTranscriptFile {\n\tpath: string;\n\tcleanup(): void;\n}\n\nexport function writeContextCompactionTranscriptFile(transcript: CompactableTranscript): ContextCompactionTranscriptFile {\n\tconst directory = mkdtempSync(join(tmpdir(), \"atomic-context-transcript-\"));\n\tconst path = join(directory, \"transcript.jsonl\");\n\tconst lines = transcript.entries\n\t\t.filter((entry) => !isExcludedFromLlmContext(entry.message))\n\t\t.map((entry) => JSON.stringify(transcriptEntryFilePayload(entry)));\n\twriteFileSync(path, `${lines.join(\"\\n\")}\\n`, \"utf8\");\n\treturn {\n\t\tpath,\n\t\tcleanup: () => rmSync(directory, { recursive: true, force: true }),\n\t};\n}\n\nfunction contextCompactionTranscriptManifest(transcript: CompactableTranscript, transcriptFilePath: string): unknown {\n\tconst eligibleEntries = transcript.entries.filter((entry) => !isExcludedFromLlmContext(entry.message));\n\tconst selectedEntryIds = new Set<string>();\n\tconst selectedEntries: CompactableTranscriptEntry[] = [];\n\tconst addEntry = (entry: CompactableTranscriptEntry): void => {\n\t\tif (selectedEntryIds.has(entry.entryId) || selectedEntries.length >= CONTEXT_MANIFEST_MAX_ENTRIES) return;\n\t\tselectedEntryIds.add(entry.entryId);\n\t\tselectedEntries.push(entry);\n\t};\n\n\tfor (const entry of eligibleEntries.filter((entry) => entry.protected)) {\n\t\taddEntry(entry);\n\t}\n\tfor (const entry of [...eligibleEntries]\n\t\t.filter((entry) => !entry.protected)\n\t\t.sort((left, right) => right.tokenEstimate - left.tokenEstimate)) {\n\t\taddEntry(entry);\n\t}\n\tselectedEntries.sort((left, right) => eligibleEntries.indexOf(left) - eligibleEntries.indexOf(right));\n\n\treturn {\n\t\ttranscriptFilePath,\n\t\ttranscriptFileFormat: \"jsonl: one compactable transcript entry per line with full text and contentBlocks text\",\n\t\ttotalEntries: eligibleEntries.length,\n\t\tmanifestEntries: selectedEntries.length,\n\t\tomittedEntries: Math.max(0, eligibleEntries.length - selectedEntries.length),\n\t\ttokensBefore: transcript.tokensBefore,\n\t\tprotectedEntryIds: transcript.protectedEntryIds,\n\t\tentries: selectedEntries.map((entry) => ({\n\t\t\tentryId: entry.entryId,\n\t\t\trole: entry.role,\n\t\t\tprotected: entry.protected,\n\t\t\ttokenEstimate: entry.tokenEstimate,\n\t\t\ttoolCallIds: entry.toolCallIds,\n\t\t\ttoolResultFor: entry.toolResultFor,\n\t\t\tcontentBlockCount: entry.contentBlocks.length,\n\t\t\tcontentBlocks: entry.contentBlocks.map((block) => ({\n\t\t\t\tblockIndex: block.blockIndex,\n\t\t\t\ttype: block.type,\n\t\t\t\tprotected: block.protected,\n\t\t\t\ttoolCallId: block.toolCallId,\n\t\t\t\ttokenEstimate: block.tokenEstimate,\n\t\t\t})),\n\t\t\tpreview: truncateForPrompt(entry.text, CONTEXT_MANIFEST_PREVIEW_CHARS),\n\t\t})),\n\t};\n}\n\nfunction contextCompactionParametersPrompt(parameters: ContextCompactionParameters): string {\n\treturn `\\n<compaction-parameters>\\n${JSON.stringify(\n\t\t{\n\t\t\tcompression_ratio: parameters.compression_ratio,\n\t\t\tpreserve_recent: parameters.preserve_recent,\n\t\t\tquery: parameters.query,\n\t\t\ttarget_reduction_percent: contextCompactionTargetReductionPercent(parameters),\n\t\t},\n\t\tnull,\n\t\t2,\n\t)}\\n</compaction-parameters>`;\n}\n\nexport function buildContextCompactionPrompt(\n\ttranscript: CompactableTranscript,\n\ttranscriptFilePath = \"<transcript file will be written during context compaction>\",\n\tparameters: ContextCompactionParameters = getTranscriptCompactionParameters(transcript),\n): string {\n\treturn `${contextCompactionFixedPrompt(parameters)}${contextCompactionParametersPrompt(parameters)}\\n\\n<transcript-file>\\n${transcriptFilePath}\\n</transcript-file>\\n\\n<context-manifest>\\n${JSON.stringify(contextCompactionTranscriptManifest(transcript, transcriptFilePath), null, 2)}\\n</context-manifest>`;\n}\n"]}
@@ -48,7 +48,7 @@ What Survives:
48
48
  - Task-relevant images: Images that are part of the active user task (for example, a screenshot the user just asked about, or the most recent image-bearing result the agent is still acting on). Recent user images and recent tool results are protected by preserve_recent, so do not delete images the agent still needs.
49
49
 
50
50
  Conditionally Deleted:
51
- - Old Reasoning decisions: If there is nothing else to remove and the target reduction is not met, you can remove entire stale assistant entries, EXCEPT do not delete individual content blocks from any retained assistant message that contains thinking or redacted_thinking blocks. Thinking-bearing assistant messages are all-or-nothing for replay safety.
51
+ - Old reasoning decisions: If there is nothing else to remove and the target reduction is not met, you may omit signed reasoning only as a complete logical assistant tool-use turn sequence. Each provider-visible user-like input starts a turn: a non-empty user/custom input (non-whitespace text or an image), a context-eligible bash execution, or a non-empty branch summary. Empty/whitespace-only user or custom inputs and empty branch summaries do not establish a boundary; whitespace-only branch summaries do because their wrapper is visible. Assistant messages and intervening tool results remain in that turn until the next visible user-like input. Never delete any thinking/redacted_thinking-bearing assistant entry from the current final logical turn; a trailing visible input without an assistant response makes the preceding assistant turn historical. In a completed historical turn, retain all thinking/redacted_thinking-bearing assistant entries or delete all of them as whole entries; never retain a proper subset. Never delete individual content blocks from a retained thinking-bearing assistant message.
52
52
 
53
53
  <output_format>
54
54
  Call the context_delete tool one or more times with deletion targets in this shape: