@bastani/atomic 0.9.11-alpha.7 → 0.9.11-alpha.9

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 (1798) hide show
  1. package/CHANGELOG.md +98 -0
  2. package/README.md +3 -5
  3. package/dist/builtin/intercom/package.json +3 -3
  4. package/dist/builtin/mcp/CHANGELOG.md +6 -0
  5. package/dist/builtin/mcp/commands.ts +7 -3
  6. package/dist/builtin/mcp/package.json +6 -6
  7. package/dist/builtin/mcp/sampling-handler.ts +1 -5
  8. package/dist/builtin/subagents/CHANGELOG.md +9 -0
  9. package/dist/builtin/subagents/package.json +5 -5
  10. package/dist/builtin/subagents/src/agents/agent-discovery.ts +26 -15
  11. package/dist/builtin/subagents/src/agents/agent-loaders.ts +48 -34
  12. package/dist/builtin/subagents/src/agents/agent-management-helpers.ts +80 -31
  13. package/dist/builtin/subagents/src/agents/agent-management.ts +194 -55
  14. package/dist/builtin/subagents/src/agents/agent-overrides.ts +85 -32
  15. package/dist/builtin/subagents/src/agents/agent-paths.ts +4 -1
  16. package/dist/builtin/subagents/src/agents/agent-selection.ts +1 -1
  17. package/dist/builtin/subagents/src/agents/agent-serializer.ts +1 -4
  18. package/dist/builtin/subagents/src/agents/agents.ts +9 -9
  19. package/dist/builtin/subagents/src/agents/chain-serializer.ts +9 -5
  20. package/dist/builtin/subagents/src/agents/identity.ts +12 -3
  21. package/dist/builtin/subagents/src/agents/skills-paths.ts +64 -24
  22. package/dist/builtin/subagents/src/agents/skills.ts +29 -26
  23. package/dist/builtin/subagents/src/extension/doctor.ts +31 -20
  24. package/dist/builtin/subagents/src/extension/fanout-child.ts +27 -12
  25. package/dist/builtin/subagents/src/extension/index.ts +119 -43
  26. package/dist/builtin/subagents/src/extension/prompt-guidance.ts +0 -1
  27. package/dist/builtin/subagents/src/extension/schemas.ts +304 -177
  28. package/dist/builtin/subagents/src/extension/startup-maintenance.ts +137 -73
  29. package/dist/builtin/subagents/src/intercom/intercom-bridge.ts +49 -21
  30. package/dist/builtin/subagents/src/intercom/result-intercom.ts +76 -38
  31. package/dist/builtin/subagents/src/runs/background/async-event-journal.ts +12 -6
  32. package/dist/builtin/subagents/src/runs/background/async-execution-chain.ts +164 -57
  33. package/dist/builtin/subagents/src/runs/background/async-execution-common.ts +15 -18
  34. package/dist/builtin/subagents/src/runs/background/async-execution-single.ts +66 -27
  35. package/dist/builtin/subagents/src/runs/background/async-execution-types.ts +4 -14
  36. package/dist/builtin/subagents/src/runs/background/async-execution.ts +1 -1
  37. package/dist/builtin/subagents/src/runs/background/async-job-tracker.ts +86 -32
  38. package/dist/builtin/subagents/src/runs/background/async-resume.ts +93 -36
  39. package/dist/builtin/subagents/src/runs/background/async-status.ts +82 -27
  40. package/dist/builtin/subagents/src/runs/background/completion-claims.ts +12 -5
  41. package/dist/builtin/subagents/src/runs/background/completion-dedupe.ts +3 -1
  42. package/dist/builtin/subagents/src/runs/background/completion-notification.ts +3 -1
  43. package/dist/builtin/subagents/src/runs/background/notify.ts +36 -18
  44. package/dist/builtin/subagents/src/runs/background/parallel-groups.ts +28 -14
  45. package/dist/builtin/subagents/src/runs/background/result-delivery-processor.ts +147 -79
  46. package/dist/builtin/subagents/src/runs/background/result-file-claims.ts +20 -5
  47. package/dist/builtin/subagents/src/runs/background/result-quarantine.ts +7 -2
  48. package/dist/builtin/subagents/src/runs/background/result-status.ts +11 -5
  49. package/dist/builtin/subagents/src/runs/background/result-watcher-data.ts +18 -5
  50. package/dist/builtin/subagents/src/runs/background/result-watcher.ts +104 -35
  51. package/dist/builtin/subagents/src/runs/background/run-id-resolver.ts +28 -7
  52. package/dist/builtin/subagents/src/runs/background/run-status.ts +120 -32
  53. package/dist/builtin/subagents/src/runs/background/stale-run-reconciler.ts +98 -39
  54. package/dist/builtin/subagents/src/runs/background/subagent-runner-dynamic.ts +185 -37
  55. package/dist/builtin/subagents/src/runs/background/subagent-runner-finalize.ts +23 -9
  56. package/dist/builtin/subagents/src/runs/background/subagent-runner-output.ts +6 -2
  57. package/dist/builtin/subagents/src/runs/background/subagent-runner-parallel-helpers.ts +34 -18
  58. package/dist/builtin/subagents/src/runs/background/subagent-runner-parallel.ts +175 -26
  59. package/dist/builtin/subagents/src/runs/background/subagent-runner-sequential.ts +68 -23
  60. package/dist/builtin/subagents/src/runs/background/subagent-runner-state.ts +200 -49
  61. package/dist/builtin/subagents/src/runs/background/subagent-runner-step.ts +81 -49
  62. package/dist/builtin/subagents/src/runs/background/subagent-runner-streaming.ts +33 -11
  63. package/dist/builtin/subagents/src/runs/background/subagent-runner-types.ts +16 -6
  64. package/dist/builtin/subagents/src/runs/background/subagent-runner-utils.ts +2 -3
  65. package/dist/builtin/subagents/src/runs/background/subagent-runner.ts +11 -8
  66. package/dist/builtin/subagents/src/runs/foreground/chain-execution-details.ts +5 -2
  67. package/dist/builtin/subagents/src/runs/foreground/chain-execution-dynamic-step.ts +113 -31
  68. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-runner.ts +64 -55
  69. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-step.ts +103 -37
  70. package/dist/builtin/subagents/src/runs/foreground/chain-execution-sequential-step.ts +97 -62
  71. package/dist/builtin/subagents/src/runs/foreground/chain-execution-types.ts +22 -10
  72. package/dist/builtin/subagents/src/runs/foreground/chain-execution.ts +9 -6
  73. package/dist/builtin/subagents/src/runs/foreground/detached-cleanup-barrier.ts +22 -22
  74. package/dist/builtin/subagents/src/runs/foreground/execution-attempt-control.ts +45 -40
  75. package/dist/builtin/subagents/src/runs/foreground/execution-attempt-finalize.ts +6 -5
  76. package/dist/builtin/subagents/src/runs/foreground/execution-attempt.ts +118 -43
  77. package/dist/builtin/subagents/src/runs/foreground/execution-detach-reservations.ts +17 -7
  78. package/dist/builtin/subagents/src/runs/foreground/execution-detach-route.ts +5 -3
  79. package/dist/builtin/subagents/src/runs/foreground/execution-intercom-detach.ts +39 -35
  80. package/dist/builtin/subagents/src/runs/foreground/execution-run-sync.ts +81 -42
  81. package/dist/builtin/subagents/src/runs/foreground/execution-structured-retries.ts +27 -21
  82. package/dist/builtin/subagents/src/runs/foreground/execution-updates.ts +2 -5
  83. package/dist/builtin/subagents/src/runs/foreground/execution-utils.ts +9 -4
  84. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-async.ts +64 -27
  85. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-chain.ts +31 -18
  86. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-context.ts +95 -62
  87. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-input.ts +30 -9
  88. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +106 -96
  89. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +68 -37
  90. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-resume.ts +260 -84
  91. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-runtime.ts +6 -1
  92. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +63 -40
  93. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-status.ts +110 -59
  94. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +20 -3
  95. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-worktree.ts +8 -6
  96. package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +65 -47
  97. package/dist/builtin/subagents/src/runs/shared/chain-outputs.ts +37 -12
  98. package/dist/builtin/subagents/src/runs/shared/dynamic-fanout.ts +120 -34
  99. package/dist/builtin/subagents/src/runs/shared/final-drain.ts +12 -7
  100. package/dist/builtin/subagents/src/runs/shared/intercom-group.ts +3 -2
  101. package/dist/builtin/subagents/src/runs/shared/long-running-guard.ts +8 -3
  102. package/dist/builtin/subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +42 -19
  103. package/dist/builtin/subagents/src/runs/shared/model-candidate-filter.ts +8 -4
  104. package/dist/builtin/subagents/src/runs/shared/model-fallback.ts +103 -38
  105. package/dist/builtin/subagents/src/runs/shared/nested-events-control.ts +30 -20
  106. package/dist/builtin/subagents/src/runs/shared/nested-events-core.ts +45 -20
  107. package/dist/builtin/subagents/src/runs/shared/nested-events-projection.ts +57 -23
  108. package/dist/builtin/subagents/src/runs/shared/nested-events-registry.ts +77 -29
  109. package/dist/builtin/subagents/src/runs/shared/nested-events-sanitize.ts +99 -42
  110. package/dist/builtin/subagents/src/runs/shared/nested-events.ts +32 -26
  111. package/dist/builtin/subagents/src/runs/shared/nested-path.ts +22 -17
  112. package/dist/builtin/subagents/src/runs/shared/nested-render.ts +31 -10
  113. package/dist/builtin/subagents/src/runs/shared/parallel-utils.ts +9 -8
  114. package/dist/builtin/subagents/src/runs/shared/pi-args.ts +54 -30
  115. package/dist/builtin/subagents/src/runs/shared/pi-spawn.ts +17 -13
  116. package/dist/builtin/subagents/src/runs/shared/run-history.ts +13 -6
  117. package/dist/builtin/subagents/src/runs/shared/single-output.ts +11 -6
  118. package/dist/builtin/subagents/src/runs/shared/spawn-env.ts +21 -0
  119. package/dist/builtin/subagents/src/runs/shared/structured-output.ts +33 -19
  120. package/dist/builtin/subagents/src/runs/shared/subagent-control.ts +59 -48
  121. package/dist/builtin/subagents/src/runs/shared/subagent-prompt-runtime.ts +18 -11
  122. package/dist/builtin/subagents/src/runs/shared/workflow-graph.ts +41 -11
  123. package/dist/builtin/subagents/src/runs/shared/worktree-post-create.ts +46 -10
  124. package/dist/builtin/subagents/src/runs/shared/worktree-root.ts +21 -5
  125. package/dist/builtin/subagents/src/runs/shared/worktree.ts +89 -34
  126. package/dist/builtin/subagents/src/shared/artifacts.ts +137 -7
  127. package/dist/builtin/subagents/src/shared/event-jsonl-writer.ts +49 -13
  128. package/dist/builtin/subagents/src/shared/fast-mode.ts +13 -6
  129. package/dist/builtin/subagents/src/shared/fork-context.ts +7 -4
  130. package/dist/builtin/subagents/src/shared/formatters.ts +14 -9
  131. package/dist/builtin/subagents/src/shared/jsonl-writer.ts +2 -1
  132. package/dist/builtin/subagents/src/shared/model-info.ts +10 -3
  133. package/dist/builtin/subagents/src/shared/post-exit-stdio-guard.ts +7 -6
  134. package/dist/builtin/subagents/src/shared/session-tokens.ts +2 -1
  135. package/dist/builtin/subagents/src/shared/settings.ts +39 -43
  136. package/dist/builtin/subagents/src/shared/status-format.ts +10 -2
  137. package/dist/builtin/subagents/src/shared/types-async.ts +22 -19
  138. package/dist/builtin/subagents/src/shared/types-config.ts +1 -1
  139. package/dist/builtin/subagents/src/shared/types-depth.ts +23 -11
  140. package/dist/builtin/subagents/src/shared/types-results.ts +49 -6
  141. package/dist/builtin/subagents/src/shared/types-runtime.ts +16 -17
  142. package/dist/builtin/subagents/src/shared/types.ts +2 -2
  143. package/dist/builtin/subagents/src/shared/utils.ts +34 -20
  144. package/dist/builtin/subagents/src/slash/prompt-template-bridge.ts +44 -47
  145. package/dist/builtin/subagents/src/slash/saved-chain-mapping.ts +5 -7
  146. package/dist/builtin/subagents/src/slash/slash-bridge.ts +3 -3
  147. package/dist/builtin/subagents/src/slash/slash-commands.ts +78 -52
  148. package/dist/builtin/subagents/src/slash/slash-live-state.ts +59 -32
  149. package/dist/builtin/subagents/src/tui/render-chain-graph.ts +120 -32
  150. package/dist/builtin/subagents/src/tui/render-event-formatting.ts +85 -22
  151. package/dist/builtin/subagents/src/tui/render-helpers.ts +16 -6
  152. package/dist/builtin/subagents/src/tui/render-layout.ts +8 -3
  153. package/dist/builtin/subagents/src/tui/render-result-compact.ts +125 -43
  154. package/dist/builtin/subagents/src/tui/render-result.ts +128 -85
  155. package/dist/builtin/subagents/src/tui/render-stable-output.ts +17 -13
  156. package/dist/builtin/subagents/src/tui/render-status-progress.ts +52 -20
  157. package/dist/builtin/subagents/src/tui/render-widget-graph.ts +130 -28
  158. package/dist/builtin/subagents/src/tui/render-widget.ts +54 -27
  159. package/dist/builtin/subagents/src/tui/render.ts +10 -3
  160. package/dist/builtin/web-access/package.json +2 -2
  161. package/dist/builtin/workflows/CHANGELOG.md +31 -0
  162. package/dist/builtin/workflows/README.md +7 -1
  163. package/dist/builtin/workflows/builtin/open-claude-design-phases.ts +104 -40
  164. package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +57 -26
  165. package/dist/builtin/workflows/builtin/open-claude-design-setup.ts +125 -12
  166. package/dist/builtin/workflows/package.json +3 -3
  167. package/dist/builtin/workflows/skills/impeccable/scripts/live-accept.mjs +4 -1
  168. package/dist/builtin/workflows/skills/impeccable/scripts/live-browser-dom.js +5 -1
  169. package/dist/builtin/workflows/skills/impeccable/scripts/live-browser-session.js +7 -1
  170. package/dist/builtin/workflows/skills/impeccable/scripts/live-manual-edit-evidence.mjs +5 -2
  171. package/dist/builtin/workflows/skills/impeccable/scripts/live-server.mjs +7 -1
  172. package/dist/builtin/workflows/src/authoring/typebox-defaults.d.ts +5 -5
  173. package/dist/builtin/workflows/src/authoring/typebox-defaults.ts +160 -197
  174. package/dist/builtin/workflows/src/authoring/workflow.ts +137 -133
  175. package/dist/builtin/workflows/src/authoring.d.ts +3 -3
  176. package/dist/builtin/workflows/src/durable/backend.ts +507 -439
  177. package/dist/builtin/workflows/src/durable/boundary-lifecycle.ts +142 -118
  178. package/dist/builtin/workflows/src/durable/boundary-topology.ts +410 -355
  179. package/dist/builtin/workflows/src/durable/child-invocation.ts +6 -6
  180. package/dist/builtin/workflows/src/durable/child-primitive.ts +109 -101
  181. package/dist/builtin/workflows/src/durable/completed-catalog-stage-groups.ts +234 -194
  182. package/dist/builtin/workflows/src/durable/completed-catalog.ts +379 -372
  183. package/dist/builtin/workflows/src/durable/completed-inspection.ts +118 -116
  184. package/dist/builtin/workflows/src/durable/completed-subtree.ts +24 -20
  185. package/dist/builtin/workflows/src/durable/dbos-backend.ts +484 -418
  186. package/dist/builtin/workflows/src/durable/dbos-embedded-postgres-root.ts +86 -87
  187. package/dist/builtin/workflows/src/durable/dbos-embedded-postgres.ts +171 -149
  188. package/dist/builtin/workflows/src/durable/dbos-envelope.ts +400 -324
  189. package/dist/builtin/workflows/src/durable/dbos-lifecycle.ts +117 -121
  190. package/dist/builtin/workflows/src/durable/dbos-local-postgres.ts +75 -68
  191. package/dist/builtin/workflows/src/durable/dbos-metadata.ts +138 -119
  192. package/dist/builtin/workflows/src/durable/dbos-prompt-reservations.ts +316 -259
  193. package/dist/builtin/workflows/src/durable/dbos-sdk-handle.ts +138 -117
  194. package/dist/builtin/workflows/src/durable/dbos-status-transition.ts +48 -43
  195. package/dist/builtin/workflows/src/durable/dbos-tombstone.ts +14 -14
  196. package/dist/builtin/workflows/src/durable/durable-hash.ts +9 -11
  197. package/dist/builtin/workflows/src/durable/factory.ts +45 -46
  198. package/dist/builtin/workflows/src/durable/format-version.ts +1 -1
  199. package/dist/builtin/workflows/src/durable/index.ts +69 -70
  200. package/dist/builtin/workflows/src/durable/local-command.ts +47 -43
  201. package/dist/builtin/workflows/src/durable/prompt-reservation-state.ts +156 -149
  202. package/dist/builtin/workflows/src/durable/prompt-reservations.ts +16 -16
  203. package/dist/builtin/workflows/src/durable/resume-catalog.ts +11 -11
  204. package/dist/builtin/workflows/src/durable/resume-eligibility.ts +27 -25
  205. package/dist/builtin/workflows/src/durable/resume-runtime.ts +261 -226
  206. package/dist/builtin/workflows/src/durable/retention-policy.ts +31 -30
  207. package/dist/builtin/workflows/src/durable/run-timing.ts +42 -41
  208. package/dist/builtin/workflows/src/durable/scoped-backend.ts +249 -228
  209. package/dist/builtin/workflows/src/durable/stage-primitive.ts +456 -398
  210. package/dist/builtin/workflows/src/durable/stage-topology-validation.ts +199 -186
  211. package/dist/builtin/workflows/src/durable/stage-topology.ts +40 -40
  212. package/dist/builtin/workflows/src/durable/tool-failure-checkpoint.ts +37 -37
  213. package/dist/builtin/workflows/src/durable/tool-outcome.ts +95 -85
  214. package/dist/builtin/workflows/src/durable/tool-primitive.ts +606 -410
  215. package/dist/builtin/workflows/src/durable/types.ts +219 -216
  216. package/dist/builtin/workflows/src/durable/ui-primitive.ts +241 -208
  217. package/dist/builtin/workflows/src/durable/workflow-child-result.ts +40 -37
  218. package/dist/builtin/workflows/src/durable/workflow-status-transition.ts +16 -15
  219. package/dist/builtin/workflows/src/engine/graph-inference.ts +76 -76
  220. package/dist/builtin/workflows/src/engine/options.ts +35 -36
  221. package/dist/builtin/workflows/src/engine/primitives/chain.ts +27 -22
  222. package/dist/builtin/workflows/src/engine/primitives/exit.ts +1 -1
  223. package/dist/builtin/workflows/src/engine/primitives/parallel.ts +64 -52
  224. package/dist/builtin/workflows/src/engine/primitives/task.ts +110 -95
  225. package/dist/builtin/workflows/src/engine/primitives/ui.ts +46 -50
  226. package/dist/builtin/workflows/src/engine/primitives/workflow.ts +194 -160
  227. package/dist/builtin/workflows/src/engine/replay.ts +6 -6
  228. package/dist/builtin/workflows/src/engine/run-durable-admission.ts +30 -30
  229. package/dist/builtin/workflows/src/engine/run-durable-finalize.ts +64 -47
  230. package/dist/builtin/workflows/src/engine/run-durable-stage-session.ts +29 -23
  231. package/dist/builtin/workflows/src/engine/run-durable-topology.ts +246 -219
  232. package/dist/builtin/workflows/src/engine/run-returned-status.ts +60 -57
  233. package/dist/builtin/workflows/src/engine/run-terminal-event.ts +25 -23
  234. package/dist/builtin/workflows/src/engine/run-terminal-failure.ts +45 -42
  235. package/dist/builtin/workflows/src/engine/run-tool-admission-boundary.ts +99 -0
  236. package/dist/builtin/workflows/src/engine/run-tool-control-registry.ts +179 -0
  237. package/dist/builtin/workflows/src/engine/run-tool-execution-tracker.ts +144 -132
  238. package/dist/builtin/workflows/src/engine/run-tool-node-lifecycle.ts +134 -69
  239. package/dist/builtin/workflows/src/engine/run.ts +678 -473
  240. package/dist/builtin/workflows/src/engine/runtime.ts +160 -153
  241. package/dist/builtin/workflows/src/engine/workflow-activity.ts +7 -3
  242. package/dist/builtin/workflows/src/engine/workflow-tool-abort.ts +92 -0
  243. package/dist/builtin/workflows/src/extension/atomic-stage-session.ts +123 -120
  244. package/dist/builtin/workflows/src/extension/background-ui-adapter.ts +108 -112
  245. package/dist/builtin/workflows/src/extension/companions.ts +116 -116
  246. package/dist/builtin/workflows/src/extension/completed-stage-intercom-ask.ts +123 -111
  247. package/dist/builtin/workflows/src/extension/config-file-loader.ts +153 -148
  248. package/dist/builtin/workflows/src/extension/config-loader.ts +264 -283
  249. package/dist/builtin/workflows/src/extension/discovery-loaders.ts +81 -84
  250. package/dist/builtin/workflows/src/extension/discovery.ts +267 -272
  251. package/dist/builtin/workflows/src/extension/dispatcher.ts +214 -217
  252. package/dist/builtin/workflows/src/extension/extension-factory.ts +102 -108
  253. package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +118 -116
  254. package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +413 -419
  255. package/dist/builtin/workflows/src/extension/hil-answer-notifications.ts +270 -261
  256. package/dist/builtin/workflows/src/extension/index.bundle.mjs +33743 -32844
  257. package/dist/builtin/workflows/src/extension/index.ts +37 -37
  258. package/dist/builtin/workflows/src/extension/lifecycle-notification-delivery.ts +64 -64
  259. package/dist/builtin/workflows/src/extension/lifecycle-notifications.ts +384 -378
  260. package/dist/builtin/workflows/src/extension/mcp.ts +35 -35
  261. package/dist/builtin/workflows/src/extension/postmortem-deps.ts +31 -35
  262. package/dist/builtin/workflows/src/extension/public-types.ts +160 -182
  263. package/dist/builtin/workflows/src/extension/render-call.ts +85 -88
  264. package/dist/builtin/workflows/src/extension/render-component.ts +9 -11
  265. package/dist/builtin/workflows/src/extension/render-result.ts +447 -386
  266. package/dist/builtin/workflows/src/extension/renderers.ts +35 -35
  267. package/dist/builtin/workflows/src/extension/runtime-active-block-claim.ts +37 -37
  268. package/dist/builtin/workflows/src/extension/runtime-durable-resume.ts +145 -143
  269. package/dist/builtin/workflows/src/extension/runtime.ts +346 -264
  270. package/dist/builtin/workflows/src/extension/status-writer.ts +95 -95
  271. package/dist/builtin/workflows/src/extension/ui-surface.ts +224 -222
  272. package/dist/builtin/workflows/src/extension/wiring.ts +307 -283
  273. package/dist/builtin/workflows/src/extension/workflow-command-completions.ts +109 -108
  274. package/dist/builtin/workflows/src/extension/workflow-command-registration.ts +257 -227
  275. package/dist/builtin/workflows/src/extension/workflow-command-surfaces.ts +84 -84
  276. package/dist/builtin/workflows/src/extension/workflow-command-utils.ts +126 -132
  277. package/dist/builtin/workflows/src/extension/workflow-durable-resume-command.ts +213 -205
  278. package/dist/builtin/workflows/src/extension/workflow-model-catalog.ts +24 -0
  279. package/dist/builtin/workflows/src/extension/workflow-module-loader.ts +104 -104
  280. package/dist/builtin/workflows/src/extension/workflow-policy.ts +7 -9
  281. package/dist/builtin/workflows/src/extension/workflow-ports.ts +30 -34
  282. package/dist/builtin/workflows/src/extension/workflow-prompts.ts +15 -14
  283. package/dist/builtin/workflows/src/extension/workflow-reload-coordinator.ts +46 -46
  284. package/dist/builtin/workflows/src/extension/workflow-reload-report.ts +28 -25
  285. package/dist/builtin/workflows/src/extension/workflow-resume-picker-rows.ts +48 -45
  286. package/dist/builtin/workflows/src/extension/workflow-resume-shadow.ts +28 -31
  287. package/dist/builtin/workflows/src/extension/workflow-run-control-command.ts +539 -453
  288. package/dist/builtin/workflows/src/extension/workflow-schema.ts +149 -92
  289. package/dist/builtin/workflows/src/extension/workflow-stage-results.ts +182 -194
  290. package/dist/builtin/workflows/src/extension/workflow-status-summary.ts +150 -155
  291. package/dist/builtin/workflows/src/extension/workflow-targets.ts +151 -121
  292. package/dist/builtin/workflows/src/extension/workflow-tool-content.ts +204 -224
  293. package/dist/builtin/workflows/src/extension/workflow-tool-control.ts +512 -372
  294. package/dist/builtin/workflows/src/extension/workflow-tool-inspection.ts +146 -150
  295. package/dist/builtin/workflows/src/extension/workflow-tool-registration.ts +43 -46
  296. package/dist/builtin/workflows/src/extension/workflow-tool-send.ts +341 -292
  297. package/dist/builtin/workflows/src/extension/workflow-tool.ts +122 -129
  298. package/dist/builtin/workflows/src/intercom/intercom-bridge.ts +17 -20
  299. package/dist/builtin/workflows/src/intercom/intercom-routing.ts +62 -62
  300. package/dist/builtin/workflows/src/intercom/result-intercom.ts +123 -123
  301. package/dist/builtin/workflows/src/runs/background/cancellation-registry.ts +72 -59
  302. package/dist/builtin/workflows/src/runs/background/durable-resume-transition.ts +45 -45
  303. package/dist/builtin/workflows/src/runs/background/job-tracker.ts +69 -34
  304. package/dist/builtin/workflows/src/runs/background/quit-tool-node.ts +71 -0
  305. package/dist/builtin/workflows/src/runs/background/quit.ts +359 -138
  306. package/dist/builtin/workflows/src/runs/background/resume-acknowledgements.ts +70 -69
  307. package/dist/builtin/workflows/src/runs/background/run-inspect.ts +85 -80
  308. package/dist/builtin/workflows/src/runs/background/runner.ts +122 -121
  309. package/dist/builtin/workflows/src/runs/background/startup-admission.ts +56 -60
  310. package/dist/builtin/workflows/src/runs/background/status.ts +324 -294
  311. package/dist/builtin/workflows/src/runs/background/workflow-lifecycle-aggregate.ts +23 -17
  312. package/dist/builtin/workflows/src/runs/foreground/executor-abort.ts +311 -309
  313. package/dist/builtin/workflows/src/runs/foreground/executor-child-boundary.ts +228 -201
  314. package/dist/builtin/workflows/src/runs/foreground/executor-child-helpers.ts +56 -51
  315. package/dist/builtin/workflows/src/runs/foreground/executor-continuation.ts +168 -152
  316. package/dist/builtin/workflows/src/runs/foreground/executor-direct-helpers.ts +255 -217
  317. package/dist/builtin/workflows/src/runs/foreground/executor-exit-manager.ts +178 -173
  318. package/dist/builtin/workflows/src/runs/foreground/executor-hil.ts +273 -269
  319. package/dist/builtin/workflows/src/runs/foreground/executor-inputs.ts +59 -56
  320. package/dist/builtin/workflows/src/runs/foreground/executor-lifecycle.ts +368 -361
  321. package/dist/builtin/workflows/src/runs/foreground/executor-outputs.ts +123 -127
  322. package/dist/builtin/workflows/src/runs/foreground/executor-prompt-nodes.ts +355 -339
  323. package/dist/builtin/workflows/src/runs/foreground/executor-queued-user-message.ts +47 -47
  324. package/dist/builtin/workflows/src/runs/foreground/executor-run-finalizers.ts +125 -104
  325. package/dist/builtin/workflows/src/runs/foreground/executor-scheduler.ts +189 -189
  326. package/dist/builtin/workflows/src/runs/foreground/executor-stage-call.ts +294 -250
  327. package/dist/builtin/workflows/src/runs/foreground/executor-stage-context.ts +141 -127
  328. package/dist/builtin/workflows/src/runs/foreground/executor-stage-control.ts +218 -213
  329. package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +406 -364
  330. package/dist/builtin/workflows/src/runs/foreground/executor-stage-replay.ts +143 -127
  331. package/dist/builtin/workflows/src/runs/foreground/executor-stage-types.ts +49 -49
  332. package/dist/builtin/workflows/src/runs/foreground/executor-task-context.ts +1 -1
  333. package/dist/builtin/workflows/src/runs/foreground/executor-task-prompts.ts +148 -153
  334. package/dist/builtin/workflows/src/runs/foreground/executor-types.ts +155 -117
  335. package/dist/builtin/workflows/src/runs/foreground/executor.ts +10 -10
  336. package/dist/builtin/workflows/src/runs/foreground/postmortem-stage-chat.ts +168 -141
  337. package/dist/builtin/workflows/src/runs/foreground/stage-control-registry.ts +356 -379
  338. package/dist/builtin/workflows/src/runs/foreground/stage-delivery-activity.ts +53 -53
  339. package/dist/builtin/workflows/src/runs/foreground/stage-queued-user-messages.ts +95 -0
  340. package/dist/builtin/workflows/src/runs/foreground/stage-runner-candidate.ts +8 -8
  341. package/dist/builtin/workflows/src/runs/foreground/stage-runner-context.ts +232 -232
  342. package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +630 -493
  343. package/dist/builtin/workflows/src/runs/foreground/stage-runner-message-admission.ts +182 -181
  344. package/dist/builtin/workflows/src/runs/foreground/stage-runner-messages.ts +80 -80
  345. package/dist/builtin/workflows/src/runs/foreground/stage-runner-options.ts +78 -78
  346. package/dist/builtin/workflows/src/runs/foreground/stage-runner-output.ts +102 -104
  347. package/dist/builtin/workflows/src/runs/foreground/stage-runner-pause.ts +178 -173
  348. package/dist/builtin/workflows/src/runs/foreground/stage-runner-replacement.ts +31 -32
  349. package/dist/builtin/workflows/src/runs/foreground/stage-runner-send-user-message.ts +114 -105
  350. package/dist/builtin/workflows/src/runs/foreground/stage-runner-session-options.ts +29 -29
  351. package/dist/builtin/workflows/src/runs/foreground/stage-runner-session.ts +44 -52
  352. package/dist/builtin/workflows/src/runs/foreground/stage-runner-structured-output.ts +63 -58
  353. package/dist/builtin/workflows/src/runs/foreground/stage-runner-types.ts +157 -148
  354. package/dist/builtin/workflows/src/runs/foreground/stage-runner-unresolved-overflow.ts +27 -23
  355. package/dist/builtin/workflows/src/runs/foreground/stage-runner.ts +10 -10
  356. package/dist/builtin/workflows/src/runs/foreground/stage-tool-execution-buffer.ts +33 -31
  357. package/dist/builtin/workflows/src/runs/shared/concurrency.ts +53 -53
  358. package/dist/builtin/workflows/src/runs/shared/graph-inference.ts +1 -1
  359. package/dist/builtin/workflows/src/runs/shared/model-fallback-candidates.ts +257 -245
  360. package/dist/builtin/workflows/src/runs/shared/model-fallback-failures.ts +378 -363
  361. package/dist/builtin/workflows/src/runs/shared/prompt-callsite.ts +55 -55
  362. package/dist/builtin/workflows/src/runs/shared/validate-inputs.ts +75 -84
  363. package/dist/builtin/workflows/src/runs/shared/worktree-cache-lifecycle.ts +1 -3
  364. package/dist/builtin/workflows/src/runs/shared/worktree-cwd.ts +96 -83
  365. package/dist/builtin/workflows/src/runs/shared/worktree-diff.ts +9 -2
  366. package/dist/builtin/workflows/src/runs/shared/worktree-git-runner.ts +21 -6
  367. package/dist/builtin/workflows/src/runs/shared/worktree-git.ts +60 -30
  368. package/dist/builtin/workflows/src/runs/shared/worktree-post-create.ts +12 -5
  369. package/dist/builtin/workflows/src/runs/shared/worktree-setup.ts +51 -30
  370. package/dist/builtin/workflows/src/runs/shared/worktree.ts +4 -4
  371. package/dist/builtin/workflows/src/sdk-surface.ts +38 -19
  372. package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +11 -5
  373. package/dist/builtin/workflows/src/shared/authoring-contract-stage.ts +299 -275
  374. package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +21 -7
  375. package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +290 -264
  376. package/dist/builtin/workflows/src/shared/expanded-workflow-graph.ts +220 -211
  377. package/dist/builtin/workflows/src/shared/intercom-group.ts +22 -22
  378. package/dist/builtin/workflows/src/shared/persistence-compaction-policy.ts +30 -30
  379. package/dist/builtin/workflows/src/shared/persistence-restore-helpers.ts +432 -406
  380. package/dist/builtin/workflows/src/shared/persistence-restore.ts +187 -181
  381. package/dist/builtin/workflows/src/shared/persistence-session-entries.ts +211 -212
  382. package/dist/builtin/workflows/src/shared/prompt-callsite-context.ts +3 -3
  383. package/dist/builtin/workflows/src/shared/render-inputs-schema.ts +84 -91
  384. package/dist/builtin/workflows/src/shared/resume-continuation.ts +1 -1
  385. package/dist/builtin/workflows/src/shared/returned-run-status.ts +91 -77
  386. package/dist/builtin/workflows/src/shared/run-visibility.ts +2 -2
  387. package/dist/builtin/workflows/src/shared/schema-introspection.ts +50 -60
  388. package/dist/builtin/workflows/src/shared/serializable.ts +72 -86
  389. package/dist/builtin/workflows/src/shared/session-transcript.ts +44 -39
  390. package/dist/builtin/workflows/src/shared/stage-prompt.ts +183 -202
  391. package/dist/builtin/workflows/src/shared/stage-ui-broker.ts +270 -274
  392. package/dist/builtin/workflows/src/shared/store-factory.ts +8 -8
  393. package/dist/builtin/workflows/src/shared/store-internal.ts +168 -172
  394. package/dist/builtin/workflows/src/shared/store-prompt-methods.ts +196 -200
  395. package/dist/builtin/workflows/src/shared/store-public-types.ts +208 -204
  396. package/dist/builtin/workflows/src/shared/store-run-methods.ts +238 -231
  397. package/dist/builtin/workflows/src/shared/store-stage-methods.ts +284 -285
  398. package/dist/builtin/workflows/src/shared/store-tool-node-methods.ts +43 -36
  399. package/dist/builtin/workflows/src/shared/store-types.ts +263 -263
  400. package/dist/builtin/workflows/src/shared/store.ts +7 -7
  401. package/dist/builtin/workflows/src/shared/timing.ts +36 -34
  402. package/dist/builtin/workflows/src/shared/types.ts +256 -213
  403. package/dist/builtin/workflows/src/shared/workflow-authoring-types.d.ts +10 -4
  404. package/dist/builtin/workflows/src/shared/workflow-authoring-types.ts +81 -59
  405. package/dist/builtin/workflows/src/shared/workflow-failures-classifier.ts +247 -227
  406. package/dist/builtin/workflows/src/shared/workflow-failures-contract.ts +45 -46
  407. package/dist/builtin/workflows/src/shared/workflow-failures-decisions.ts +330 -351
  408. package/dist/builtin/workflows/src/shared/workflow-failures-signals.ts +192 -195
  409. package/dist/builtin/workflows/src/shared/workflow-failures.ts +10 -10
  410. package/dist/builtin/workflows/src/shared/workflow-run-ownership.ts +32 -36
  411. package/dist/builtin/workflows/src/tui/chat-surface-message.ts +157 -184
  412. package/dist/builtin/workflows/src/tui/chat-surface.ts +332 -355
  413. package/dist/builtin/workflows/src/tui/color-utils.ts +21 -30
  414. package/dist/builtin/workflows/src/tui/connectors.ts +57 -61
  415. package/dist/builtin/workflows/src/tui/dispatch-confirm.ts +168 -192
  416. package/dist/builtin/workflows/src/tui/edge.ts +10 -9
  417. package/dist/builtin/workflows/src/tui/graph-canvas.ts +131 -134
  418. package/dist/builtin/workflows/src/tui/graph-theme.ts +139 -148
  419. package/dist/builtin/workflows/src/tui/graph-view-constants.ts +6 -6
  420. package/dist/builtin/workflows/src/tui/graph-view-graph-render.ts +146 -179
  421. package/dist/builtin/workflows/src/tui/graph-view-input.ts +295 -323
  422. package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +291 -327
  423. package/dist/builtin/workflows/src/tui/graph-view-render.ts +171 -191
  424. package/dist/builtin/workflows/src/tui/graph-view-state.ts +317 -303
  425. package/dist/builtin/workflows/src/tui/graph-view-types.ts +65 -59
  426. package/dist/builtin/workflows/src/tui/header.ts +140 -156
  427. package/dist/builtin/workflows/src/tui/host-input-form.ts +47 -45
  428. package/dist/builtin/workflows/src/tui/inline-form-card.ts +277 -266
  429. package/dist/builtin/workflows/src/tui/inline-form-editor-text.ts +61 -62
  430. package/dist/builtin/workflows/src/tui/inline-form-editor.ts +407 -412
  431. package/dist/builtin/workflows/src/tui/inline-form-overlay.ts +203 -214
  432. package/dist/builtin/workflows/src/tui/inline-form-store.ts +24 -24
  433. package/dist/builtin/workflows/src/tui/inputs-overlay.ts +116 -129
  434. package/dist/builtin/workflows/src/tui/inputs-picker-editing.ts +111 -115
  435. package/dist/builtin/workflows/src/tui/inputs-picker-input.ts +255 -269
  436. package/dist/builtin/workflows/src/tui/inputs-picker-render.ts +248 -236
  437. package/dist/builtin/workflows/src/tui/inputs-picker-types.ts +111 -140
  438. package/dist/builtin/workflows/src/tui/inputs-picker.ts +12 -12
  439. package/dist/builtin/workflows/src/tui/keybindings-adapter.ts +49 -57
  440. package/dist/builtin/workflows/src/tui/layout.ts +124 -133
  441. package/dist/builtin/workflows/src/tui/mouse-input.ts +45 -47
  442. package/dist/builtin/workflows/src/tui/node-card.ts +230 -219
  443. package/dist/builtin/workflows/src/tui/overlay-adapter.ts +381 -394
  444. package/dist/builtin/workflows/src/tui/overlay-terminal-modes.ts +20 -19
  445. package/dist/builtin/workflows/src/tui/prompt-card-input.ts +183 -194
  446. package/dist/builtin/workflows/src/tui/prompt-card-render.ts +243 -302
  447. package/dist/builtin/workflows/src/tui/prompt-card-select.ts +76 -98
  448. package/dist/builtin/workflows/src/tui/prompt-card-state.ts +40 -40
  449. package/dist/builtin/workflows/src/tui/prompt-card-text.ts +76 -83
  450. package/dist/builtin/workflows/src/tui/prompt-card.ts +3 -3
  451. package/dist/builtin/workflows/src/tui/renderers.ts +6 -6
  452. package/dist/builtin/workflows/src/tui/run-detail.ts +287 -279
  453. package/dist/builtin/workflows/src/tui/session-list.ts +19 -22
  454. package/dist/builtin/workflows/src/tui/session-overlays.ts +82 -87
  455. package/dist/builtin/workflows/src/tui/session-picker.ts +258 -275
  456. package/dist/builtin/workflows/src/tui/stage-chat-composer-drafts.ts +11 -11
  457. package/dist/builtin/workflows/src/tui/stage-chat-layout.ts +55 -62
  458. package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +220 -263
  459. package/dist/builtin/workflows/src/tui/stage-chat-view-custom-ui.ts +91 -102
  460. package/dist/builtin/workflows/src/tui/stage-chat-view-delivery-activity.ts +51 -59
  461. package/dist/builtin/workflows/src/tui/stage-chat-view-footer-status.ts +154 -208
  462. package/dist/builtin/workflows/src/tui/stage-chat-view-input.ts +174 -208
  463. package/dist/builtin/workflows/src/tui/stage-chat-view-live-events.ts +32 -44
  464. package/dist/builtin/workflows/src/tui/stage-chat-view-pending-tools.ts +2 -4
  465. package/dist/builtin/workflows/src/tui/stage-chat-view-render-helpers.ts +82 -97
  466. package/dist/builtin/workflows/src/tui/stage-chat-view-render-settings.ts +33 -31
  467. package/dist/builtin/workflows/src/tui/stage-chat-view-state.ts +428 -400
  468. package/dist/builtin/workflows/src/tui/stage-chat-view-status.ts +24 -25
  469. package/dist/builtin/workflows/src/tui/stage-chat-view-transcript.ts +181 -197
  470. package/dist/builtin/workflows/src/tui/stage-chat-view-types.ts +125 -134
  471. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +210 -211
  472. package/dist/builtin/workflows/src/tui/status-helpers.ts +65 -69
  473. package/dist/builtin/workflows/src/tui/status-list.ts +316 -294
  474. package/dist/builtin/workflows/src/tui/store-widget-installer.ts +213 -214
  475. package/dist/builtin/workflows/src/tui/submit-pane.ts +114 -130
  476. package/dist/builtin/workflows/src/tui/switcher.ts +116 -134
  477. package/dist/builtin/workflows/src/tui/text-helpers.ts +136 -145
  478. package/dist/builtin/workflows/src/tui/toast.ts +68 -67
  479. package/dist/builtin/workflows/src/tui/widget.ts +265 -285
  480. package/dist/builtin/workflows/src/tui/workflow-attach-pane-handle.ts +12 -17
  481. package/dist/builtin/workflows/src/tui/workflow-attach-pane-types.ts +81 -82
  482. package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +467 -445
  483. package/dist/builtin/workflows/src/tui/workflow-list.ts +130 -145
  484. package/dist/builtin/workflows/src/tui/workflow-notice-card.ts +127 -144
  485. package/dist/builtin/workflows/src/tui/workflow-resume-selector.ts +217 -216
  486. package/dist/builtin/workflows/src/workflows/identity.ts +11 -11
  487. package/dist/builtin/workflows/src/workflows/registry.ts +66 -68
  488. package/dist/bun/cli.js.map +1 -1
  489. package/dist/bun/internal-intercom-broker.d.ts.map +1 -1
  490. package/dist/bun/internal-intercom-broker.js +1 -1
  491. package/dist/bun/internal-intercom-broker.js.map +1 -1
  492. package/dist/bun/register-bedrock.js +1 -1
  493. package/dist/bun/register-bedrock.js.map +1 -1
  494. package/dist/cli/args.d.ts.map +1 -1
  495. package/dist/cli/args.js +8 -1
  496. package/dist/cli/args.js.map +1 -1
  497. package/dist/cli/credential-print.d.ts +170 -0
  498. package/dist/cli/credential-print.d.ts.map +1 -0
  499. package/dist/cli/credential-print.js +513 -0
  500. package/dist/cli/credential-print.js.map +1 -0
  501. package/dist/cli/list-models.d.ts +2 -2
  502. package/dist/cli/list-models.d.ts.map +1 -1
  503. package/dist/cli/list-models.js +5 -5
  504. package/dist/cli/list-models.js.map +1 -1
  505. package/dist/cli/project-trust.d.ts +1 -1
  506. package/dist/cli/project-trust.d.ts.map +1 -1
  507. package/dist/cli/project-trust.js.map +1 -1
  508. package/dist/cli/startup-ui.d.ts.map +1 -1
  509. package/dist/cli/startup-ui.js +13 -6
  510. package/dist/cli/startup-ui.js.map +1 -1
  511. package/dist/config-self-update.d.ts.map +1 -1
  512. package/dist/config-self-update.js +5 -2
  513. package/dist/config-self-update.js.map +1 -1
  514. package/dist/config.d.ts.map +1 -1
  515. package/dist/config.js +1 -3
  516. package/dist/config.js.map +1 -1
  517. package/dist/core/agent-session-accessors.d.ts.map +1 -1
  518. package/dist/core/agent-session-accessors.js +125 -25
  519. package/dist/core/agent-session-accessors.js.map +1 -1
  520. package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
  521. package/dist/core/agent-session-auto-compaction.js +6 -7
  522. package/dist/core/agent-session-auto-compaction.js.map +1 -1
  523. package/dist/core/agent-session-bash.d.ts +1 -1
  524. package/dist/core/agent-session-bash.d.ts.map +1 -1
  525. package/dist/core/agent-session-bash.js +3 -1
  526. package/dist/core/agent-session-bash.js.map +1 -1
  527. package/dist/core/agent-session-compaction.d.ts.map +1 -1
  528. package/dist/core/agent-session-compaction.js +46 -9
  529. package/dist/core/agent-session-compaction.js.map +1 -1
  530. package/dist/core/agent-session-custom-message-commit.d.ts +1 -1
  531. package/dist/core/agent-session-custom-message-commit.d.ts.map +1 -1
  532. package/dist/core/agent-session-custom-message-commit.js +13 -9
  533. package/dist/core/agent-session-custom-message-commit.js.map +1 -1
  534. package/dist/core/agent-session-delivery-forwarding.d.ts +1 -1
  535. package/dist/core/agent-session-delivery-forwarding.d.ts.map +1 -1
  536. package/dist/core/agent-session-delivery-forwarding.js.map +1 -1
  537. package/dist/core/agent-session-events.d.ts.map +1 -1
  538. package/dist/core/agent-session-events.js +15 -8
  539. package/dist/core/agent-session-events.js.map +1 -1
  540. package/dist/core/agent-session-export.d.ts +1 -1
  541. package/dist/core/agent-session-export.d.ts.map +1 -1
  542. package/dist/core/agent-session-export.js.map +1 -1
  543. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  544. package/dist/core/agent-session-extension-bindings.js +17 -10
  545. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  546. package/dist/core/agent-session-message-queue.d.ts +4 -4
  547. package/dist/core/agent-session-message-queue.d.ts.map +1 -1
  548. package/dist/core/agent-session-message-queue.js +21 -12
  549. package/dist/core/agent-session-message-queue.js.map +1 -1
  550. package/dist/core/agent-session-methods.d.ts +8 -9
  551. package/dist/core/agent-session-methods.d.ts.map +1 -1
  552. package/dist/core/agent-session-methods.js.map +1 -1
  553. package/dist/core/agent-session-models.d.ts +1 -1
  554. package/dist/core/agent-session-models.d.ts.map +1 -1
  555. package/dist/core/agent-session-models.js +19 -15
  556. package/dist/core/agent-session-models.js.map +1 -1
  557. package/dist/core/agent-session-persistent-custom-messages.d.ts +1 -1
  558. package/dist/core/agent-session-persistent-custom-messages.d.ts.map +1 -1
  559. package/dist/core/agent-session-persistent-custom-messages.js +6 -4
  560. package/dist/core/agent-session-persistent-custom-messages.js.map +1 -1
  561. package/dist/core/agent-session-post-tool-compaction.d.ts +1 -1
  562. package/dist/core/agent-session-post-tool-compaction.d.ts.map +1 -1
  563. package/dist/core/agent-session-post-tool-compaction.js +2 -4
  564. package/dist/core/agent-session-post-tool-compaction.js.map +1 -1
  565. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  566. package/dist/core/agent-session-prompt.js +7 -11
  567. package/dist/core/agent-session-prompt.js.map +1 -1
  568. package/dist/core/agent-session-queue-pause.d.ts.map +1 -1
  569. package/dist/core/agent-session-queue-pause.js +8 -7
  570. package/dist/core/agent-session-queue-pause.js.map +1 -1
  571. package/dist/core/agent-session-retry.d.ts.map +1 -1
  572. package/dist/core/agent-session-retry.js +31 -8
  573. package/dist/core/agent-session-retry.js.map +1 -1
  574. package/dist/core/agent-session-runtime-auth.d.ts +3 -3
  575. package/dist/core/agent-session-runtime-auth.d.ts.map +1 -1
  576. package/dist/core/agent-session-runtime-auth.js +7 -15
  577. package/dist/core/agent-session-runtime-auth.js.map +1 -1
  578. package/dist/core/agent-session-runtime.d.ts +14 -3
  579. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  580. package/dist/core/agent-session-runtime.js +20 -4
  581. package/dist/core/agent-session-runtime.js.map +1 -1
  582. package/dist/core/agent-session-services.d.ts +3 -8
  583. package/dist/core/agent-session-services.d.ts.map +1 -1
  584. package/dist/core/agent-session-services.js +20 -25
  585. package/dist/core/agent-session-services.js.map +1 -1
  586. package/dist/core/agent-session-state.d.ts +1 -1
  587. package/dist/core/agent-session-state.d.ts.map +1 -1
  588. package/dist/core/agent-session-state.js.map +1 -1
  589. package/dist/core/agent-session-tool-hooks.d.ts.map +1 -1
  590. package/dist/core/agent-session-tool-hooks.js +2 -6
  591. package/dist/core/agent-session-tool-hooks.js.map +1 -1
  592. package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
  593. package/dist/core/agent-session-tool-registry.js +5 -3
  594. package/dist/core/agent-session-tool-registry.js.map +1 -1
  595. package/dist/core/agent-session-transfer.d.ts.map +1 -1
  596. package/dist/core/agent-session-transfer.js +6 -10
  597. package/dist/core/agent-session-transfer.js.map +1 -1
  598. package/dist/core/agent-session-tree.d.ts +1 -1
  599. package/dist/core/agent-session-tree.d.ts.map +1 -1
  600. package/dist/core/agent-session-tree.js +5 -0
  601. package/dist/core/agent-session-tree.js.map +1 -1
  602. package/dist/core/agent-session-types.d.ts +3 -3
  603. package/dist/core/agent-session-types.d.ts.map +1 -1
  604. package/dist/core/agent-session-types.js +4 -1
  605. package/dist/core/agent-session-types.js.map +1 -1
  606. package/dist/core/agent-session.d.ts +16 -12
  607. package/dist/core/agent-session.d.ts.map +1 -1
  608. package/dist/core/agent-session.js +9 -10
  609. package/dist/core/agent-session.js.map +1 -1
  610. package/dist/core/anthropic-thinking-guard.d.ts.map +1 -1
  611. package/dist/core/anthropic-thinking-guard.js +4 -2
  612. package/dist/core/anthropic-thinking-guard.js.map +1 -1
  613. package/dist/core/async/format.d.ts +1 -1
  614. package/dist/core/async/format.d.ts.map +1 -1
  615. package/dist/core/async/format.js +3 -1
  616. package/dist/core/async/format.js.map +1 -1
  617. package/dist/core/async/job-manager.d.ts.map +1 -1
  618. package/dist/core/async/job-manager.js +20 -5
  619. package/dist/core/async/job-manager.js.map +1 -1
  620. package/dist/core/async/session-manager.d.ts.map +1 -1
  621. package/dist/core/async/session-manager.js.map +1 -1
  622. package/dist/core/atomic-guide-command.d.ts.map +1 -1
  623. package/dist/core/atomic-guide-command.js +1 -2
  624. package/dist/core/atomic-guide-command.js.map +1 -1
  625. package/dist/core/auth-guidance.d.ts.map +1 -1
  626. package/dist/core/auth-guidance.js.map +1 -1
  627. package/dist/core/auth-storage-backends.d.ts +1 -0
  628. package/dist/core/auth-storage-backends.d.ts.map +1 -1
  629. package/dist/core/auth-storage-backends.js +18 -4
  630. package/dist/core/auth-storage-backends.js.map +1 -1
  631. package/dist/core/auth-storage.d.ts +13 -140
  632. package/dist/core/auth-storage.d.ts.map +1 -1
  633. package/dist/core/auth-storage.js +69 -379
  634. package/dist/core/auth-storage.js.map +1 -1
  635. package/dist/core/builtin-packages.d.ts.map +1 -1
  636. package/dist/core/builtin-packages.js +1 -4
  637. package/dist/core/builtin-packages.js.map +1 -1
  638. package/dist/core/cache-stats.d.ts.map +1 -1
  639. package/dist/core/cache-stats.js +8 -6
  640. package/dist/core/cache-stats.js.map +1 -1
  641. package/dist/core/callback-activity.d.ts.map +1 -1
  642. package/dist/core/callback-activity.js.map +1 -1
  643. package/dist/core/codex-errors.d.ts.map +1 -1
  644. package/dist/core/codex-errors.js +1 -1
  645. package/dist/core/codex-errors.js.map +1 -1
  646. package/dist/core/codex-fast-mode.d.ts.map +1 -1
  647. package/dist/core/codex-fast-mode.js.map +1 -1
  648. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  649. package/dist/core/compaction/branch-summarization.js +1 -1
  650. package/dist/core/compaction/branch-summarization.js.map +1 -1
  651. package/dist/core/compaction/compaction-boundary.d.ts.map +1 -1
  652. package/dist/core/compaction/compaction-boundary.js +10 -6
  653. package/dist/core/compaction/compaction-boundary.js.map +1 -1
  654. package/dist/core/compaction/compaction-runner.d.ts +1 -1
  655. package/dist/core/compaction/compaction-runner.d.ts.map +1 -1
  656. package/dist/core/compaction/compaction-runner.js +2 -4
  657. package/dist/core/compaction/compaction-runner.js.map +1 -1
  658. package/dist/core/compaction/compaction.d.ts.map +1 -1
  659. package/dist/core/compaction/compaction.js +5 -1
  660. package/dist/core/compaction/compaction.js.map +1 -1
  661. package/dist/core/compaction/deleted-ranges.d.ts.map +1 -1
  662. package/dist/core/compaction/deleted-ranges.js.map +1 -1
  663. package/dist/core/compaction/fallback-planner.d.ts.map +1 -1
  664. package/dist/core/compaction/fallback-planner.js.map +1 -1
  665. package/dist/core/compaction/index.d.ts +6 -6
  666. package/dist/core/compaction/index.d.ts.map +1 -1
  667. package/dist/core/compaction/index.js +6 -6
  668. package/dist/core/compaction/index.js.map +1 -1
  669. package/dist/core/compaction/planner-outcome.d.ts.map +1 -1
  670. package/dist/core/compaction/planner-outcome.js.map +1 -1
  671. package/dist/core/compaction/range-planner-diagnostics.d.ts.map +1 -1
  672. package/dist/core/compaction/range-planner-diagnostics.js +4 -2
  673. package/dist/core/compaction/range-planner-diagnostics.js.map +1 -1
  674. package/dist/core/compaction/range-planner.d.ts.map +1 -1
  675. package/dist/core/compaction/range-planner.js +4 -1
  676. package/dist/core/compaction/range-planner.js.map +1 -1
  677. package/dist/core/compaction/transcript-serialization.d.ts.map +1 -1
  678. package/dist/core/compaction/transcript-serialization.js.map +1 -1
  679. package/dist/core/context-tool-pairing.js +3 -3
  680. package/dist/core/context-tool-pairing.js.map +1 -1
  681. package/dist/core/copilot-env-routing.d.ts +36 -0
  682. package/dist/core/copilot-env-routing.d.ts.map +1 -0
  683. package/dist/core/copilot-env-routing.js +94 -0
  684. package/dist/core/copilot-env-routing.js.map +1 -0
  685. package/dist/core/exec.d.ts.map +1 -1
  686. package/dist/core/exec.js +5 -0
  687. package/dist/core/exec.js.map +1 -1
  688. package/dist/core/experimental.d.ts.map +1 -1
  689. package/dist/core/experimental.js +2 -1
  690. package/dist/core/experimental.js.map +1 -1
  691. package/dist/core/extensions/api-types.d.ts +2 -2
  692. package/dist/core/extensions/api-types.d.ts.map +1 -1
  693. package/dist/core/extensions/api-types.js.map +1 -1
  694. package/dist/core/extensions/context-types.d.ts +7 -1
  695. package/dist/core/extensions/context-types.d.ts.map +1 -1
  696. package/dist/core/extensions/context-types.js.map +1 -1
  697. package/dist/core/extensions/index.d.ts +7 -7
  698. package/dist/core/extensions/index.d.ts.map +1 -1
  699. package/dist/core/extensions/index.js +2 -2
  700. package/dist/core/extensions/index.js.map +1 -1
  701. package/dist/core/extensions/loader-api.d.ts +1 -1
  702. package/dist/core/extensions/loader-api.d.ts.map +1 -1
  703. package/dist/core/extensions/loader-api.js +4 -2
  704. package/dist/core/extensions/loader-api.js.map +1 -1
  705. package/dist/core/extensions/loader-core.d.ts.map +1 -1
  706. package/dist/core/extensions/loader-core.js +2 -2
  707. package/dist/core/extensions/loader-core.js.map +1 -1
  708. package/dist/core/extensions/loader-discovery.d.ts.map +1 -1
  709. package/dist/core/extensions/loader-discovery.js.map +1 -1
  710. package/dist/core/extensions/loader-resources.d.ts.map +1 -1
  711. package/dist/core/extensions/loader-resources.js.map +1 -1
  712. package/dist/core/extensions/loader-runtime.d.ts.map +1 -1
  713. package/dist/core/extensions/loader-runtime.js +23 -11
  714. package/dist/core/extensions/loader-runtime.js.map +1 -1
  715. package/dist/core/extensions/loader-virtual-modules.d.ts +17 -0
  716. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  717. package/dist/core/extensions/loader-virtual-modules.js +288 -19
  718. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  719. package/dist/core/extensions/loader.d.ts.map +1 -1
  720. package/dist/core/extensions/loader.js.map +1 -1
  721. package/dist/core/extensions/provider-types.d.ts +2 -42
  722. package/dist/core/extensions/provider-types.d.ts.map +1 -1
  723. package/dist/core/extensions/provider-types.js.map +1 -1
  724. package/dist/core/extensions/reactive-widget.d.ts.map +1 -1
  725. package/dist/core/extensions/reactive-widget.js.map +1 -1
  726. package/dist/core/extensions/runner-context.d.ts +27 -1
  727. package/dist/core/extensions/runner-context.d.ts.map +1 -1
  728. package/dist/core/extensions/runner-context.js +52 -0
  729. package/dist/core/extensions/runner-context.js.map +1 -1
  730. package/dist/core/extensions/runner-events.d.ts.map +1 -1
  731. package/dist/core/extensions/runner-events.js.map +1 -1
  732. package/dist/core/extensions/runner.d.ts +1 -0
  733. package/dist/core/extensions/runner.d.ts.map +1 -1
  734. package/dist/core/extensions/runner.js +18 -6
  735. package/dist/core/extensions/runner.js.map +1 -1
  736. package/dist/core/extensions/runtime-types.d.ts +3 -1
  737. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  738. package/dist/core/extensions/runtime-types.js.map +1 -1
  739. package/dist/core/extensions/session-events.d.ts.map +1 -1
  740. package/dist/core/extensions/session-events.js.map +1 -1
  741. package/dist/core/extensions/tool-types.d.ts.map +1 -1
  742. package/dist/core/extensions/tool-types.js.map +1 -1
  743. package/dist/core/extensions/types.d.ts +15 -2
  744. package/dist/core/extensions/types.d.ts.map +1 -1
  745. package/dist/core/extensions/types.js +1 -1
  746. package/dist/core/extensions/types.js.map +1 -1
  747. package/dist/core/extensions/ui-types.d.ts +16 -2
  748. package/dist/core/extensions/ui-types.d.ts.map +1 -1
  749. package/dist/core/extensions/ui-types.js.map +1 -1
  750. package/dist/core/fallback-models.d.ts +4 -4
  751. package/dist/core/fallback-models.d.ts.map +1 -1
  752. package/dist/core/fallback-models.js +14 -5
  753. package/dist/core/fallback-models.js.map +1 -1
  754. package/dist/core/flattened-tool-arguments.d.ts.map +1 -1
  755. package/dist/core/flattened-tool-arguments.js.map +1 -1
  756. package/dist/core/footer-data-provider.d.ts +10 -0
  757. package/dist/core/footer-data-provider.d.ts.map +1 -1
  758. package/dist/core/footer-data-provider.js +5 -3
  759. package/dist/core/footer-data-provider.js.map +1 -1
  760. package/dist/core/http-dispatcher.d.ts.map +1 -1
  761. package/dist/core/http-dispatcher.js.map +1 -1
  762. package/dist/core/keybindings.d.ts +1 -1
  763. package/dist/core/keybindings.d.ts.map +1 -1
  764. package/dist/core/keybindings.js.map +1 -1
  765. package/dist/core/messages.d.ts.map +1 -1
  766. package/dist/core/messages.js.map +1 -1
  767. package/dist/core/model-capabilities.d.ts.map +1 -1
  768. package/dist/core/model-capabilities.js +1 -2
  769. package/dist/core/model-capabilities.js.map +1 -1
  770. package/dist/core/model-config.d.ts +542 -0
  771. package/dist/core/model-config.d.ts.map +1 -0
  772. package/dist/core/{model-registry-schemas.js → model-config.js} +85 -34
  773. package/dist/core/model-config.js.map +1 -0
  774. package/dist/core/model-registry.d.ts +25 -85
  775. package/dist/core/model-registry.d.ts.map +1 -1
  776. package/dist/core/model-registry.js +65 -388
  777. package/dist/core/model-registry.js.map +1 -1
  778. package/dist/core/model-resolver-cli.d.ts +2 -2
  779. package/dist/core/model-resolver-cli.d.ts.map +1 -1
  780. package/dist/core/model-resolver-cli.js +2 -2
  781. package/dist/core/model-resolver-cli.js.map +1 -1
  782. package/dist/core/model-resolver-defaults.js.map +1 -1
  783. package/dist/core/model-resolver-initial.d.ts +4 -4
  784. package/dist/core/model-resolver-initial.d.ts.map +1 -1
  785. package/dist/core/model-resolver-initial.js +18 -18
  786. package/dist/core/model-resolver-initial.js.map +1 -1
  787. package/dist/core/model-resolver-patterns.d.ts.map +1 -1
  788. package/dist/core/model-resolver-patterns.js.map +1 -1
  789. package/dist/core/model-resolver-scope.d.ts +3 -3
  790. package/dist/core/model-resolver-scope.d.ts.map +1 -1
  791. package/dist/core/model-resolver-scope.js +16 -6
  792. package/dist/core/model-resolver-scope.js.map +1 -1
  793. package/dist/core/model-resolver-types.d.ts.map +1 -1
  794. package/dist/core/model-resolver-types.js.map +1 -1
  795. package/dist/core/model-resolver.d.ts +3 -3
  796. package/dist/core/model-resolver.d.ts.map +1 -1
  797. package/dist/core/model-resolver.js +1 -1
  798. package/dist/core/model-resolver.js.map +1 -1
  799. package/dist/core/model-runtime-auth.d.ts +7 -0
  800. package/dist/core/model-runtime-auth.d.ts.map +1 -0
  801. package/dist/core/model-runtime-auth.js +17 -0
  802. package/dist/core/model-runtime-auth.js.map +1 -0
  803. package/dist/core/model-runtime-providers.d.ts +6 -0
  804. package/dist/core/model-runtime-providers.d.ts.map +1 -0
  805. package/dist/core/model-runtime-providers.js +22 -0
  806. package/dist/core/model-runtime-providers.js.map +1 -0
  807. package/dist/core/model-runtime-restoration.d.ts +6 -0
  808. package/dist/core/model-runtime-restoration.d.ts.map +1 -0
  809. package/dist/core/model-runtime-restoration.js +21 -0
  810. package/dist/core/model-runtime-restoration.js.map +1 -0
  811. package/dist/core/model-runtime-snapshot.d.ts +16 -0
  812. package/dist/core/model-runtime-snapshot.d.ts.map +1 -0
  813. package/dist/core/model-runtime-snapshot.js +52 -0
  814. package/dist/core/model-runtime-snapshot.js.map +1 -0
  815. package/dist/core/model-runtime-streaming.d.ts +17 -0
  816. package/dist/core/model-runtime-streaming.d.ts.map +1 -0
  817. package/dist/core/model-runtime-streaming.js +66 -0
  818. package/dist/core/model-runtime-streaming.js.map +1 -0
  819. package/dist/core/model-runtime-types.d.ts +21 -0
  820. package/dist/core/model-runtime-types.d.ts.map +1 -0
  821. package/dist/core/model-runtime-types.js +2 -0
  822. package/dist/core/model-runtime-types.js.map +1 -0
  823. package/dist/core/model-runtime.d.ts +50 -29
  824. package/dist/core/model-runtime.d.ts.map +1 -1
  825. package/dist/core/model-runtime.js +332 -90
  826. package/dist/core/model-runtime.js.map +1 -1
  827. package/dist/core/models-store.d.ts +2 -10
  828. package/dist/core/models-store.d.ts.map +1 -1
  829. package/dist/core/models-store.js +2 -29
  830. package/dist/core/models-store.js.map +1 -1
  831. package/dist/core/oauth-login.d.ts +24 -0
  832. package/dist/core/oauth-login.d.ts.map +1 -0
  833. package/dist/core/oauth-login.js +92 -0
  834. package/dist/core/oauth-login.js.map +1 -0
  835. package/dist/core/oauth-provider-metadata.d.ts +5 -0
  836. package/dist/core/oauth-provider-metadata.d.ts.map +1 -0
  837. package/dist/core/oauth-provider-metadata.js +33 -0
  838. package/dist/core/oauth-provider-metadata.js.map +1 -0
  839. package/dist/core/openai-responses-payload-sanitizer.js.map +1 -1
  840. package/dist/core/output-guard.d.ts +44 -0
  841. package/dist/core/output-guard.d.ts.map +1 -1
  842. package/dist/core/output-guard.js +63 -0
  843. package/dist/core/output-guard.js.map +1 -1
  844. package/dist/core/package-manager-auto-resources.d.ts.map +1 -1
  845. package/dist/core/package-manager-auto-resources.js +6 -1
  846. package/dist/core/package-manager-auto-resources.js.map +1 -1
  847. package/dist/core/package-manager-git.d.ts.map +1 -1
  848. package/dist/core/package-manager-git.js +27 -11
  849. package/dist/core/package-manager-git.js.map +1 -1
  850. package/dist/core/package-manager-npm.d.ts.map +1 -1
  851. package/dist/core/package-manager-npm.js +4 -2
  852. package/dist/core/package-manager-npm.js.map +1 -1
  853. package/dist/core/package-manager-operations.d.ts.map +1 -1
  854. package/dist/core/package-manager-operations.js +2 -2
  855. package/dist/core/package-manager-operations.js.map +1 -1
  856. package/dist/core/package-manager-paths.d.ts.map +1 -1
  857. package/dist/core/package-manager-paths.js.map +1 -1
  858. package/dist/core/package-manager-resolver.d.ts.map +1 -1
  859. package/dist/core/package-manager-resolver.js +19 -16
  860. package/dist/core/package-manager-resolver.js.map +1 -1
  861. package/dist/core/package-manager-resource-collector.d.ts.map +1 -1
  862. package/dist/core/package-manager-resource-collector.js +6 -6
  863. package/dist/core/package-manager-resource-collector.js.map +1 -1
  864. package/dist/core/package-manager-resource-files.d.ts.map +1 -1
  865. package/dist/core/package-manager-resource-files.js +4 -3
  866. package/dist/core/package-manager-resource-files.js.map +1 -1
  867. package/dist/core/package-manager-resource-patterns.d.ts.map +1 -1
  868. package/dist/core/package-manager-resource-patterns.js.map +1 -1
  869. package/dist/core/package-manager-settings.d.ts.map +1 -1
  870. package/dist/core/package-manager-settings.js +3 -2
  871. package/dist/core/package-manager-settings.js.map +1 -1
  872. package/dist/core/package-manager-source.d.ts.map +1 -1
  873. package/dist/core/package-manager-source.js +1 -1
  874. package/dist/core/package-manager-source.js.map +1 -1
  875. package/dist/core/package-manager.d.ts +1 -1
  876. package/dist/core/package-manager.d.ts.map +1 -1
  877. package/dist/core/package-manager.js +2 -3
  878. package/dist/core/package-manager.js.map +1 -1
  879. package/dist/core/prompt-templates-async.d.ts.map +1 -1
  880. package/dist/core/prompt-templates-async.js +15 -7
  881. package/dist/core/prompt-templates-async.js.map +1 -1
  882. package/dist/core/prompt-templates.d.ts.map +1 -1
  883. package/dist/core/prompt-templates.js +1 -3
  884. package/dist/core/prompt-templates.js.map +1 -1
  885. package/dist/core/provider-composer-internal.d.ts +53 -0
  886. package/dist/core/provider-composer-internal.d.ts.map +1 -0
  887. package/dist/core/provider-composer-internal.js +273 -0
  888. package/dist/core/provider-composer-internal.js.map +1 -0
  889. package/dist/core/provider-composer.d.ts +16 -0
  890. package/dist/core/provider-composer.d.ts.map +1 -0
  891. package/dist/core/provider-composer.js +108 -0
  892. package/dist/core/provider-composer.js.map +1 -0
  893. package/dist/core/provider-context-usage.d.ts.map +1 -1
  894. package/dist/core/provider-context-usage.js +2 -1
  895. package/dist/core/provider-context-usage.js.map +1 -1
  896. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  897. package/dist/core/remote-catalog-provider.js +74 -122
  898. package/dist/core/remote-catalog-provider.js.map +1 -1
  899. package/dist/core/resolve-config-value.d.ts +8 -7
  900. package/dist/core/resolve-config-value.d.ts.map +1 -1
  901. package/dist/core/resolve-config-value.js +26 -23
  902. package/dist/core/resolve-config-value.js.map +1 -1
  903. package/dist/core/resource-loader-assets.d.ts.map +1 -1
  904. package/dist/core/resource-loader-assets.js +31 -7
  905. package/dist/core/resource-loader-assets.js.map +1 -1
  906. package/dist/core/resource-loader-context-files.d.ts +6 -0
  907. package/dist/core/resource-loader-context-files.d.ts.map +1 -1
  908. package/dist/core/resource-loader-context-files.js +83 -4
  909. package/dist/core/resource-loader-context-files.js.map +1 -1
  910. package/dist/core/resource-loader-core.d.ts +12 -3
  911. package/dist/core/resource-loader-core.d.ts.map +1 -1
  912. package/dist/core/resource-loader-core.js +36 -19
  913. package/dist/core/resource-loader-core.js.map +1 -1
  914. package/dist/core/resource-loader-discovery.d.ts.map +1 -1
  915. package/dist/core/resource-loader-discovery.js.map +1 -1
  916. package/dist/core/resource-loader-extensions.d.ts.map +1 -1
  917. package/dist/core/resource-loader-extensions.js +33 -21
  918. package/dist/core/resource-loader-extensions.js.map +1 -1
  919. package/dist/core/resource-loader-internals.d.ts +13 -6
  920. package/dist/core/resource-loader-internals.d.ts.map +1 -1
  921. package/dist/core/resource-loader-internals.js.map +1 -1
  922. package/dist/core/resource-loader-package-resources.d.ts.map +1 -1
  923. package/dist/core/resource-loader-package-resources.js +1 -1
  924. package/dist/core/resource-loader-package-resources.js.map +1 -1
  925. package/dist/core/resource-loader-paths.js.map +1 -1
  926. package/dist/core/resource-loader-reload.d.ts.map +1 -1
  927. package/dist/core/resource-loader-reload.js +28 -13
  928. package/dist/core/resource-loader-reload.js.map +1 -1
  929. package/dist/core/resource-loader-source-info.d.ts +1 -1
  930. package/dist/core/resource-loader-source-info.d.ts.map +1 -1
  931. package/dist/core/resource-loader-source-info.js +1 -1
  932. package/dist/core/resource-loader-source-info.js.map +1 -1
  933. package/dist/core/resource-loader-types.d.ts +9 -3
  934. package/dist/core/resource-loader-types.d.ts.map +1 -1
  935. package/dist/core/resource-loader-types.js.map +1 -1
  936. package/dist/core/resource-loader.d.ts +1 -1
  937. package/dist/core/resource-loader.d.ts.map +1 -1
  938. package/dist/core/resource-loader.js +1 -1
  939. package/dist/core/resource-loader.js.map +1 -1
  940. package/dist/core/runtime-credentials.d.ts +16 -0
  941. package/dist/core/runtime-credentials.d.ts.map +1 -0
  942. package/dist/core/runtime-credentials.js +42 -0
  943. package/dist/core/runtime-credentials.js.map +1 -0
  944. package/dist/core/sdk-exports.d.ts +1 -1
  945. package/dist/core/sdk-exports.d.ts.map +1 -1
  946. package/dist/core/sdk-exports.js +2 -2
  947. package/dist/core/sdk-exports.js.map +1 -1
  948. package/dist/core/sdk-types.d.ts +4 -10
  949. package/dist/core/sdk-types.d.ts.map +1 -1
  950. package/dist/core/sdk-types.js.map +1 -1
  951. package/dist/core/sdk.d.ts +1 -1
  952. package/dist/core/sdk.d.ts.map +1 -1
  953. package/dist/core/sdk.js +37 -45
  954. package/dist/core/sdk.js.map +1 -1
  955. package/dist/core/session-manager-archive.d.ts.map +1 -1
  956. package/dist/core/session-manager-archive.js +5 -2
  957. package/dist/core/session-manager-archive.js.map +1 -1
  958. package/dist/core/session-manager-classification.js +3 -3
  959. package/dist/core/session-manager-classification.js.map +1 -1
  960. package/dist/core/session-manager-core.d.ts.map +1 -1
  961. package/dist/core/session-manager-core.js +3 -3
  962. package/dist/core/session-manager-core.js.map +1 -1
  963. package/dist/core/session-manager-entries.d.ts +1 -1
  964. package/dist/core/session-manager-entries.d.ts.map +1 -1
  965. package/dist/core/session-manager-entries.js.map +1 -1
  966. package/dist/core/session-manager-history.d.ts.map +1 -1
  967. package/dist/core/session-manager-history.js +13 -5
  968. package/dist/core/session-manager-history.js.map +1 -1
  969. package/dist/core/session-manager-list.d.ts.map +1 -1
  970. package/dist/core/session-manager-list.js +1 -1
  971. package/dist/core/session-manager-list.js.map +1 -1
  972. package/dist/core/session-manager-migrations.js.map +1 -1
  973. package/dist/core/session-manager-storage.d.ts.map +1 -1
  974. package/dist/core/session-manager-storage.js.map +1 -1
  975. package/dist/core/session-manager-types.d.ts.map +1 -1
  976. package/dist/core/session-manager-types.js.map +1 -1
  977. package/dist/core/session-manager.d.ts +4 -4
  978. package/dist/core/session-manager.d.ts.map +1 -1
  979. package/dist/core/session-manager.js +2 -2
  980. package/dist/core/session-manager.js.map +1 -1
  981. package/dist/core/settings-manager-core.d.ts.map +1 -1
  982. package/dist/core/settings-manager-core.js.map +1 -1
  983. package/dist/core/settings-manager-ui-accessors.js +2 -1
  984. package/dist/core/settings-manager-ui-accessors.js.map +1 -1
  985. package/dist/core/settings-storage.d.ts.map +1 -1
  986. package/dist/core/settings-storage.js +3 -3
  987. package/dist/core/settings-storage.js.map +1 -1
  988. package/dist/core/settings-types.d.ts.map +1 -1
  989. package/dist/core/settings-types.js.map +1 -1
  990. package/dist/core/skills-async.d.ts.map +1 -1
  991. package/dist/core/skills-async.js +18 -8
  992. package/dist/core/skills-async.js.map +1 -1
  993. package/dist/core/slash-commands.d.ts.map +1 -1
  994. package/dist/core/slash-commands.js +76 -19
  995. package/dist/core/slash-commands.js.map +1 -1
  996. package/dist/core/system-prompt.d.ts.map +1 -1
  997. package/dist/core/system-prompt.js +5 -19
  998. package/dist/core/system-prompt.js.map +1 -1
  999. package/dist/core/thinking-blocks.d.ts.map +1 -1
  1000. package/dist/core/thinking-blocks.js +2 -2
  1001. package/dist/core/thinking-blocks.js.map +1 -1
  1002. package/dist/core/tools/artifact-protocol.d.ts.map +1 -1
  1003. package/dist/core/tools/artifact-protocol.js.map +1 -1
  1004. package/dist/core/tools/artifacts.d.ts.map +1 -1
  1005. package/dist/core/tools/artifacts.js.map +1 -1
  1006. package/dist/core/tools/ask-user-question/ask-user-question.d.ts.map +1 -1
  1007. package/dist/core/tools/ask-user-question/ask-user-question.js.map +1 -1
  1008. package/dist/core/tools/ask-user-question/state/build-questionnaire.d.ts +1 -1
  1009. package/dist/core/tools/ask-user-question/state/build-questionnaire.d.ts.map +1 -1
  1010. package/dist/core/tools/ask-user-question/state/build-questionnaire.js +1 -1
  1011. package/dist/core/tools/ask-user-question/state/build-questionnaire.js.map +1 -1
  1012. package/dist/core/tools/ask-user-question/state/questionnaire-session.d.ts.map +1 -1
  1013. package/dist/core/tools/ask-user-question/state/questionnaire-session.js +2 -4
  1014. package/dist/core/tools/ask-user-question/state/questionnaire-session.js.map +1 -1
  1015. package/dist/core/tools/ask-user-question/state/state-reducer.d.ts.map +1 -1
  1016. package/dist/core/tools/ask-user-question/state/state-reducer.js.map +1 -1
  1017. package/dist/core/tools/ask-user-question/view/body-residual-spacer.d.ts.map +1 -1
  1018. package/dist/core/tools/ask-user-question/view/body-residual-spacer.js.map +1 -1
  1019. package/dist/core/tools/ask-user-question/view/components/multi-select-view.d.ts.map +1 -1
  1020. package/dist/core/tools/ask-user-question/view/components/multi-select-view.js.map +1 -1
  1021. package/dist/core/tools/ask-user-question/view/components/preview/markdown-content-cache.d.ts +1 -1
  1022. package/dist/core/tools/ask-user-question/view/components/preview/markdown-content-cache.d.ts.map +1 -1
  1023. package/dist/core/tools/ask-user-question/view/components/preview/markdown-content-cache.js.map +1 -1
  1024. package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.d.ts +1 -1
  1025. package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.d.ts.map +1 -1
  1026. package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.js +1 -3
  1027. package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.js.map +1 -1
  1028. package/dist/core/tools/ask-user-question/view/components/submit-picker.d.ts.map +1 -1
  1029. package/dist/core/tools/ask-user-question/view/components/submit-picker.js.map +1 -1
  1030. package/dist/core/tools/ask-user-question/view/components/tab-bar.d.ts.map +1 -1
  1031. package/dist/core/tools/ask-user-question/view/components/tab-bar.js.map +1 -1
  1032. package/dist/core/tools/ask-user-question/view/dialog-builder.d.ts +1 -1
  1033. package/dist/core/tools/ask-user-question/view/dialog-builder.d.ts.map +1 -1
  1034. package/dist/core/tools/ask-user-question/view/dialog-builder.js +1 -1
  1035. package/dist/core/tools/ask-user-question/view/dialog-builder.js.map +1 -1
  1036. package/dist/core/tools/ask-user-question/view/props-adapter.d.ts.map +1 -1
  1037. package/dist/core/tools/ask-user-question/view/props-adapter.js +2 -4
  1038. package/dist/core/tools/ask-user-question/view/props-adapter.js.map +1 -1
  1039. package/dist/core/tools/ask-user-question/view/tab-content-strategy.d.ts +1 -1
  1040. package/dist/core/tools/ask-user-question/view/tab-content-strategy.d.ts.map +1 -1
  1041. package/dist/core/tools/ask-user-question/view/tab-content-strategy.js +2 -9
  1042. package/dist/core/tools/ask-user-question/view/tab-content-strategy.js.map +1 -1
  1043. package/dist/core/tools/bash-async-execution.d.ts.map +1 -1
  1044. package/dist/core/tools/bash-async-execution.js +11 -4
  1045. package/dist/core/tools/bash-async-execution.js.map +1 -1
  1046. package/dist/core/tools/bash-async-jobs.d.ts.map +1 -1
  1047. package/dist/core/tools/bash-async-jobs.js +14 -2
  1048. package/dist/core/tools/bash-async-jobs.js.map +1 -1
  1049. package/dist/core/tools/bash-async-output.d.ts.map +1 -1
  1050. package/dist/core/tools/bash-async-output.js +6 -2
  1051. package/dist/core/tools/bash-async-output.js.map +1 -1
  1052. package/dist/core/tools/bash-interceptor.d.ts.map +1 -1
  1053. package/dist/core/tools/bash-interceptor.js +20 -4
  1054. package/dist/core/tools/bash-interceptor.js.map +1 -1
  1055. package/dist/core/tools/bash-leading-cd.d.ts.map +1 -1
  1056. package/dist/core/tools/bash-leading-cd.js +9 -3
  1057. package/dist/core/tools/bash-leading-cd.js.map +1 -1
  1058. package/dist/core/tools/bash-pty-native.d.ts.map +1 -1
  1059. package/dist/core/tools/bash-pty-native.js.map +1 -1
  1060. package/dist/core/tools/bash-session-environment.d.ts.map +1 -1
  1061. package/dist/core/tools/bash-session-environment.js +24 -12
  1062. package/dist/core/tools/bash-session-environment.js.map +1 -1
  1063. package/dist/core/tools/bash.d.ts.map +1 -1
  1064. package/dist/core/tools/bash.js +123 -27
  1065. package/dist/core/tools/bash.js.map +1 -1
  1066. package/dist/core/tools/block-resolver.d.ts.map +1 -1
  1067. package/dist/core/tools/block-resolver.js.map +1 -1
  1068. package/dist/core/tools/conflict-registry.d.ts.map +1 -1
  1069. package/dist/core/tools/conflict-registry.js.map +1 -1
  1070. package/dist/core/tools/directory-tree.d.ts.map +1 -1
  1071. package/dist/core/tools/directory-tree.js +20 -4
  1072. package/dist/core/tools/directory-tree.js.map +1 -1
  1073. package/dist/core/tools/edit.d.ts.map +1 -1
  1074. package/dist/core/tools/edit.js +37 -13
  1075. package/dist/core/tools/edit.js.map +1 -1
  1076. package/dist/core/tools/fetch-url.d.ts.map +1 -1
  1077. package/dist/core/tools/fetch-url.js +127 -41
  1078. package/dist/core/tools/fetch-url.js.map +1 -1
  1079. package/dist/core/tools/find.d.ts.map +1 -1
  1080. package/dist/core/tools/find.js +176 -46
  1081. package/dist/core/tools/find.js.map +1 -1
  1082. package/dist/core/tools/grep.d.ts.map +1 -1
  1083. package/dist/core/tools/grep.js +43 -10
  1084. package/dist/core/tools/grep.js.map +1 -1
  1085. package/dist/core/tools/hashline-engine/apply.d.ts.map +1 -1
  1086. package/dist/core/tools/hashline-engine/apply.js +6 -6
  1087. package/dist/core/tools/hashline-engine/apply.js.map +1 -1
  1088. package/dist/core/tools/hashline-engine/block.js +1 -1
  1089. package/dist/core/tools/hashline-engine/block.js.map +1 -1
  1090. package/dist/core/tools/hashline-engine/format.d.ts.map +1 -1
  1091. package/dist/core/tools/hashline-engine/format.js +1 -1
  1092. package/dist/core/tools/hashline-engine/format.js.map +1 -1
  1093. package/dist/core/tools/hashline-engine/input.d.ts.map +1 -1
  1094. package/dist/core/tools/hashline-engine/input.js +7 -7
  1095. package/dist/core/tools/hashline-engine/input.js.map +1 -1
  1096. package/dist/core/tools/hashline-engine/parser.js +1 -1
  1097. package/dist/core/tools/hashline-engine/parser.js.map +1 -1
  1098. package/dist/core/tools/hashline-engine/patcher.js +5 -5
  1099. package/dist/core/tools/hashline-engine/patcher.js.map +1 -1
  1100. package/dist/core/tools/hashline-engine/prefixes.js +4 -4
  1101. package/dist/core/tools/hashline-engine/prefixes.js.map +1 -1
  1102. package/dist/core/tools/hashline-engine/recovery.d.ts.map +1 -1
  1103. package/dist/core/tools/hashline-engine/recovery.js +4 -2
  1104. package/dist/core/tools/hashline-engine/recovery.js.map +1 -1
  1105. package/dist/core/tools/hashline-engine/snapshots.js +5 -5
  1106. package/dist/core/tools/hashline-engine/snapshots.js.map +1 -1
  1107. package/dist/core/tools/hashline.d.ts.map +1 -1
  1108. package/dist/core/tools/hashline.js +24 -13
  1109. package/dist/core/tools/hashline.js.map +1 -1
  1110. package/dist/core/tools/index.d.ts +6 -6
  1111. package/dist/core/tools/index.d.ts.map +1 -1
  1112. package/dist/core/tools/index.js +6 -6
  1113. package/dist/core/tools/index.js.map +1 -1
  1114. package/dist/core/tools/ls.d.ts.map +1 -1
  1115. package/dist/core/tools/ls.js +2 -1
  1116. package/dist/core/tools/ls.js.map +1 -1
  1117. package/dist/core/tools/notebook.d.ts.map +1 -1
  1118. package/dist/core/tools/notebook.js +13 -3
  1119. package/dist/core/tools/notebook.js.map +1 -1
  1120. package/dist/core/tools/read-document-extract.d.ts.map +1 -1
  1121. package/dist/core/tools/read-document-extract.js +30 -10
  1122. package/dist/core/tools/read-document-extract.js.map +1 -1
  1123. package/dist/core/tools/read-selectors.d.ts.map +1 -1
  1124. package/dist/core/tools/read-selectors.js +59 -15
  1125. package/dist/core/tools/read-selectors.js.map +1 -1
  1126. package/dist/core/tools/read-url.d.ts.map +1 -1
  1127. package/dist/core/tools/read-url.js +41 -7
  1128. package/dist/core/tools/read-url.js.map +1 -1
  1129. package/dist/core/tools/read.d.ts.map +1 -1
  1130. package/dist/core/tools/read.js +306 -71
  1131. package/dist/core/tools/read.js.map +1 -1
  1132. package/dist/core/tools/resource-selectors.d.ts +4 -0
  1133. package/dist/core/tools/resource-selectors.d.ts.map +1 -1
  1134. package/dist/core/tools/resource-selectors.js +324 -84
  1135. package/dist/core/tools/resource-selectors.js.map +1 -1
  1136. package/dist/core/tools/search-details.d.ts.map +1 -1
  1137. package/dist/core/tools/search-details.js +13 -1
  1138. package/dist/core/tools/search-details.js.map +1 -1
  1139. package/dist/core/tools/search-line-ranges.d.ts.map +1 -1
  1140. package/dist/core/tools/search-line-ranges.js +5 -2
  1141. package/dist/core/tools/search-line-ranges.js.map +1 -1
  1142. package/dist/core/tools/search-native.d.ts.map +1 -1
  1143. package/dist/core/tools/search-native.js.map +1 -1
  1144. package/dist/core/tools/search.d.ts.map +1 -1
  1145. package/dist/core/tools/search.js +244 -90
  1146. package/dist/core/tools/search.js.map +1 -1
  1147. package/dist/core/tools/structured-output.d.ts +1 -1
  1148. package/dist/core/tools/structured-output.d.ts.map +1 -1
  1149. package/dist/core/tools/structured-output.js.map +1 -1
  1150. package/dist/core/tools/todos-execute.d.ts.map +1 -1
  1151. package/dist/core/tools/todos-execute.js +4 -4
  1152. package/dist/core/tools/todos-execute.js.map +1 -1
  1153. package/dist/core/tools/todos-locks.d.ts.map +1 -1
  1154. package/dist/core/tools/todos-locks.js.map +1 -1
  1155. package/dist/core/tools/todos-mutations.js +1 -1
  1156. package/dist/core/tools/todos-mutations.js.map +1 -1
  1157. package/dist/core/tools/todos-paths.js +2 -2
  1158. package/dist/core/tools/todos-paths.js.map +1 -1
  1159. package/dist/core/tools/todos-render.d.ts.map +1 -1
  1160. package/dist/core/tools/todos-render.js +2 -2
  1161. package/dist/core/tools/todos-render.js.map +1 -1
  1162. package/dist/core/tools/todos-storage.d.ts.map +1 -1
  1163. package/dist/core/tools/todos-storage.js +1 -2
  1164. package/dist/core/tools/todos-storage.js.map +1 -1
  1165. package/dist/core/tools/todos-types.d.ts.map +1 -1
  1166. package/dist/core/tools/todos-types.js +1 -11
  1167. package/dist/core/tools/todos-types.js.map +1 -1
  1168. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  1169. package/dist/core/tools/tool-definition-wrapper.js +2 -6
  1170. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  1171. package/dist/core/tools/url-ip-guards.d.ts.map +1 -1
  1172. package/dist/core/tools/url-ip-guards.js +27 -17
  1173. package/dist/core/tools/url-ip-guards.js.map +1 -1
  1174. package/dist/core/tools/write.d.ts.map +1 -1
  1175. package/dist/core/tools/write.js +88 -29
  1176. package/dist/core/tools/write.js.map +1 -1
  1177. package/dist/core/usage-totals.d.ts.map +1 -1
  1178. package/dist/core/usage-totals.js +5 -2
  1179. package/dist/core/usage-totals.js.map +1 -1
  1180. package/dist/core/workflow-stage-admission.d.ts.map +1 -1
  1181. package/dist/core/workflow-stage-admission.js +8 -2
  1182. package/dist/core/workflow-stage-admission.js.map +1 -1
  1183. package/dist/extensions/llama/index.js +1 -1
  1184. package/dist/extensions/llama/index.js.map +1 -1
  1185. package/dist/extensions/llama/provider.d.ts +2 -4
  1186. package/dist/extensions/llama/provider.d.ts.map +1 -1
  1187. package/dist/extensions/llama/provider.js +26 -18
  1188. package/dist/extensions/llama/provider.js.map +1 -1
  1189. package/dist/extensions/llama/ui.d.ts.map +1 -1
  1190. package/dist/extensions/llama/ui.js.map +1 -1
  1191. package/dist/index-extensions.d.ts +2 -2
  1192. package/dist/index-extensions.d.ts.map +1 -1
  1193. package/dist/index-extensions.js +1 -1
  1194. package/dist/index-extensions.js.map +1 -1
  1195. package/dist/index.d.ts +21 -22
  1196. package/dist/index.d.ts.map +1 -1
  1197. package/dist/index.js +25 -26
  1198. package/dist/index.js.map +1 -1
  1199. package/dist/main-deferred-startup.d.ts +1 -1
  1200. package/dist/main-deferred-startup.d.ts.map +1 -1
  1201. package/dist/main-deferred-startup.js +16 -15
  1202. package/dist/main-deferred-startup.js.map +1 -1
  1203. package/dist/main-early-input.js.map +1 -1
  1204. package/dist/main-first-time-setup.d.ts +1 -1
  1205. package/dist/main-first-time-setup.d.ts.map +1 -1
  1206. package/dist/main-first-time-setup.js.map +1 -1
  1207. package/dist/main-runtime-api-key.d.ts +6 -0
  1208. package/dist/main-runtime-api-key.d.ts.map +1 -0
  1209. package/dist/main-runtime-api-key.js +6 -0
  1210. package/dist/main-runtime-api-key.js.map +1 -0
  1211. package/dist/main-session-options.d.ts +2 -2
  1212. package/dist/main-session-options.d.ts.map +1 -1
  1213. package/dist/main-session-options.js +3 -3
  1214. package/dist/main-session-options.js.map +1 -1
  1215. package/dist/main-session.d.ts.map +1 -1
  1216. package/dist/main-session.js +4 -4
  1217. package/dist/main-session.js.map +1 -1
  1218. package/dist/main.d.ts +1 -1
  1219. package/dist/main.d.ts.map +1 -1
  1220. package/dist/main.js +152 -49
  1221. package/dist/main.js.map +1 -1
  1222. package/dist/migrations-config-values.d.ts.map +1 -1
  1223. package/dist/migrations-config-values.js +3 -1
  1224. package/dist/migrations-config-values.js.map +1 -1
  1225. package/dist/migrations.d.ts.map +1 -1
  1226. package/dist/migrations.js.map +1 -1
  1227. package/dist/modes/interactive/chat-input-actions.d.ts.map +1 -1
  1228. package/dist/modes/interactive/chat-input-actions.js +3 -6
  1229. package/dist/modes/interactive/chat-input-actions.js.map +1 -1
  1230. package/dist/modes/interactive/components/atomic-banner.d.ts.map +1 -1
  1231. package/dist/modes/interactive/components/atomic-banner.js +7 -5
  1232. package/dist/modes/interactive/components/atomic-banner.js.map +1 -1
  1233. package/dist/modes/interactive/components/atomic-working-status.d.ts.map +1 -1
  1234. package/dist/modes/interactive/components/atomic-working-status.js +26 -13
  1235. package/dist/modes/interactive/components/atomic-working-status.js.map +1 -1
  1236. package/dist/modes/interactive/components/chat-message-renderer.d.ts +1 -1
  1237. package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
  1238. package/dist/modes/interactive/components/chat-message-renderer.js +6 -5
  1239. package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
  1240. package/dist/modes/interactive/components/chat-session-host-actions.d.ts +3 -2
  1241. package/dist/modes/interactive/components/chat-session-host-actions.d.ts.map +1 -1
  1242. package/dist/modes/interactive/components/chat-session-host-actions.js +14 -18
  1243. package/dist/modes/interactive/components/chat-session-host-actions.js.map +1 -1
  1244. package/dist/modes/interactive/components/chat-session-host-editor.d.ts +4 -4
  1245. package/dist/modes/interactive/components/chat-session-host-editor.d.ts.map +1 -1
  1246. package/dist/modes/interactive/components/chat-session-host-editor.js +9 -4
  1247. package/dist/modes/interactive/components/chat-session-host-editor.js.map +1 -1
  1248. package/dist/modes/interactive/components/chat-session-host-events.d.ts.map +1 -1
  1249. package/dist/modes/interactive/components/chat-session-host-events.js +9 -8
  1250. package/dist/modes/interactive/components/chat-session-host-events.js.map +1 -1
  1251. package/dist/modes/interactive/components/chat-session-host-rendering.d.ts +1 -1
  1252. package/dist/modes/interactive/components/chat-session-host-rendering.d.ts.map +1 -1
  1253. package/dist/modes/interactive/components/chat-session-host-rendering.js +22 -7
  1254. package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -1
  1255. package/dist/modes/interactive/components/chat-session-host-runtime.d.ts +9 -2
  1256. package/dist/modes/interactive/components/chat-session-host-runtime.d.ts.map +1 -1
  1257. package/dist/modes/interactive/components/chat-session-host-runtime.js +15 -13
  1258. package/dist/modes/interactive/components/chat-session-host-runtime.js.map +1 -1
  1259. package/dist/modes/interactive/components/chat-session-host-state.d.ts +2 -2
  1260. package/dist/modes/interactive/components/chat-session-host-state.d.ts.map +1 -1
  1261. package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -1
  1262. package/dist/modes/interactive/components/chat-session-host-terminal-cleanup.d.ts.map +1 -1
  1263. package/dist/modes/interactive/components/chat-session-host-terminal-cleanup.js.map +1 -1
  1264. package/dist/modes/interactive/components/chat-session-host-types.d.ts +9 -2
  1265. package/dist/modes/interactive/components/chat-session-host-types.d.ts.map +1 -1
  1266. package/dist/modes/interactive/components/chat-session-host-types.js.map +1 -1
  1267. package/dist/modes/interactive/components/chat-session-host-utils.d.ts +1 -1
  1268. package/dist/modes/interactive/components/chat-session-host-utils.d.ts.map +1 -1
  1269. package/dist/modes/interactive/components/chat-session-host-utils.js +3 -8
  1270. package/dist/modes/interactive/components/chat-session-host-utils.js.map +1 -1
  1271. package/dist/modes/interactive/components/chat-session-host.d.ts +4 -4
  1272. package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
  1273. package/dist/modes/interactive/components/chat-session-host.js +1 -2
  1274. package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
  1275. package/dist/modes/interactive/components/chat-transcript.d.ts +1 -1
  1276. package/dist/modes/interactive/components/chat-transcript.d.ts.map +1 -1
  1277. package/dist/modes/interactive/components/chat-transcript.js +5 -12
  1278. package/dist/modes/interactive/components/chat-transcript.js.map +1 -1
  1279. package/dist/modes/interactive/components/compaction-boundary-message.d.ts.map +1 -1
  1280. package/dist/modes/interactive/components/compaction-boundary-message.js +18 -7
  1281. package/dist/modes/interactive/components/compaction-boundary-message.js.map +1 -1
  1282. package/dist/modes/interactive/components/config-selector-list.d.ts.map +1 -1
  1283. package/dist/modes/interactive/components/config-selector-list.js +4 -2
  1284. package/dist/modes/interactive/components/config-selector-list.js.map +1 -1
  1285. package/dist/modes/interactive/components/config-selector-project-scope.d.ts.map +1 -1
  1286. package/dist/modes/interactive/components/config-selector-project-scope.js +2 -4
  1287. package/dist/modes/interactive/components/config-selector-project-scope.js.map +1 -1
  1288. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  1289. package/dist/modes/interactive/components/config-selector.js +15 -6
  1290. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  1291. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  1292. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  1293. package/dist/modes/interactive/components/custom-editor.d.ts +11 -0
  1294. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  1295. package/dist/modes/interactive/components/custom-editor.js +21 -5
  1296. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  1297. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
  1298. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  1299. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  1300. package/dist/modes/interactive/components/custom-message.js +1 -3
  1301. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  1302. package/dist/modes/interactive/components/diff.js +2 -2
  1303. package/dist/modes/interactive/components/diff.js.map +1 -1
  1304. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  1305. package/dist/modes/interactive/components/extension-editor.js +1 -1
  1306. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  1307. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
  1308. package/dist/modes/interactive/components/first-time-setup.js +15 -4
  1309. package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
  1310. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  1311. package/dist/modes/interactive/components/footer.js +17 -16
  1312. package/dist/modes/interactive/components/footer.js.map +1 -1
  1313. package/dist/modes/interactive/components/host-input-form-mount.d.ts.map +1 -1
  1314. package/dist/modes/interactive/components/host-input-form-mount.js +4 -2
  1315. package/dist/modes/interactive/components/host-input-form-mount.js.map +1 -1
  1316. package/dist/modes/interactive/components/host-input-form.d.ts.map +1 -1
  1317. package/dist/modes/interactive/components/host-input-form.js +55 -21
  1318. package/dist/modes/interactive/components/host-input-form.js.map +1 -1
  1319. package/dist/modes/interactive/components/host-session-picker.d.ts.map +1 -1
  1320. package/dist/modes/interactive/components/host-session-picker.js +8 -3
  1321. package/dist/modes/interactive/components/host-session-picker.js.map +1 -1
  1322. package/dist/modes/interactive/components/index.d.ts +7 -7
  1323. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  1324. package/dist/modes/interactive/components/index.js +4 -4
  1325. package/dist/modes/interactive/components/index.js.map +1 -1
  1326. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  1327. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  1328. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  1329. package/dist/modes/interactive/components/login-dialog.js +1 -3
  1330. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  1331. package/dist/modes/interactive/components/model-selector.d.ts +4 -3
  1332. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  1333. package/dist/modes/interactive/components/model-selector.js +60 -74
  1334. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  1335. package/dist/modes/interactive/components/oauth-selector.d.ts +4 -3
  1336. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  1337. package/dist/modes/interactive/components/oauth-selector.js +10 -13
  1338. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  1339. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  1340. package/dist/modes/interactive/components/scoped-models-selector.js +5 -1
  1341. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  1342. package/dist/modes/interactive/components/session-selector-list.d.ts +1 -1
  1343. package/dist/modes/interactive/components/session-selector-list.d.ts.map +1 -1
  1344. package/dist/modes/interactive/components/session-selector-list.js.map +1 -1
  1345. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  1346. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  1347. package/dist/modes/interactive/components/settings-selector-handlers.d.ts.map +1 -1
  1348. package/dist/modes/interactive/components/settings-selector-handlers.js.map +1 -1
  1349. package/dist/modes/interactive/components/settings-selector-submenus.d.ts.map +1 -1
  1350. package/dist/modes/interactive/components/settings-selector-submenus.js.map +1 -1
  1351. package/dist/modes/interactive/components/startup-identity.d.ts.map +1 -1
  1352. package/dist/modes/interactive/components/startup-identity.js.map +1 -1
  1353. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  1354. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  1355. package/dist/modes/interactive/components/tree-selector-model.js +1 -9
  1356. package/dist/modes/interactive/components/tree-selector-model.js.map +1 -1
  1357. package/dist/modes/interactive/components/tree-selector-viewport.d.ts.map +1 -1
  1358. package/dist/modes/interactive/components/tree-selector-viewport.js.map +1 -1
  1359. package/dist/modes/interactive/components/working-status.d.ts.map +1 -1
  1360. package/dist/modes/interactive/components/working-status.js +1 -1
  1361. package/dist/modes/interactive/components/working-status.js.map +1 -1
  1362. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  1363. package/dist/modes/interactive/external-editor.js.map +1 -1
  1364. package/dist/modes/interactive/interactive-agent-events.js +20 -13
  1365. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  1366. package/dist/modes/interactive/interactive-auth-login.js +24 -35
  1367. package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
  1368. package/dist/modes/interactive/interactive-auth-routing.d.ts +1 -1
  1369. package/dist/modes/interactive/interactive-auth-routing.d.ts.map +1 -1
  1370. package/dist/modes/interactive/interactive-auth-routing.js +22 -51
  1371. package/dist/modes/interactive/interactive-auth-routing.js.map +1 -1
  1372. package/dist/modes/interactive/interactive-autocomplete.js +7 -13
  1373. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  1374. package/dist/modes/interactive/interactive-bash-compact.d.ts.map +1 -1
  1375. package/dist/modes/interactive/interactive-bash-compact.js +18 -8
  1376. package/dist/modes/interactive/interactive-bash-compact.js.map +1 -1
  1377. package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -1
  1378. package/dist/modes/interactive/interactive-deferred-startup.js +14 -10
  1379. package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
  1380. package/dist/modes/interactive/interactive-editor-actions.js +6 -11
  1381. package/dist/modes/interactive/interactive-editor-actions.js.map +1 -1
  1382. package/dist/modes/interactive/interactive-extension-context.js +4 -4
  1383. package/dist/modes/interactive/interactive-extension-context.js.map +1 -1
  1384. package/dist/modes/interactive/interactive-extension-custom-ui.js +15 -8
  1385. package/dist/modes/interactive/interactive-extension-custom-ui.js.map +1 -1
  1386. package/dist/modes/interactive/interactive-extension-dialogs.js +50 -24
  1387. package/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
  1388. package/dist/modes/interactive/interactive-extension-runtime.js +11 -7
  1389. package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
  1390. package/dist/modes/interactive/interactive-extension-widgets.js +1 -1
  1391. package/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  1392. package/dist/modes/interactive/interactive-global-clear.d.ts +45 -1
  1393. package/dist/modes/interactive/interactive-global-clear.d.ts.map +1 -1
  1394. package/dist/modes/interactive/interactive-global-clear.js +60 -4
  1395. package/dist/modes/interactive/interactive-global-clear.js.map +1 -1
  1396. package/dist/modes/interactive/interactive-hotkeys-debug.js +2 -3
  1397. package/dist/modes/interactive/interactive-hotkeys-debug.js.map +1 -1
  1398. package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
  1399. package/dist/modes/interactive/interactive-input-handling.js +55 -20
  1400. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  1401. package/dist/modes/interactive/interactive-key-identity.d.ts +22 -0
  1402. package/dist/modes/interactive/interactive-key-identity.d.ts.map +1 -0
  1403. package/dist/modes/interactive/interactive-key-identity.js +29 -0
  1404. package/dist/modes/interactive/interactive-key-identity.js.map +1 -0
  1405. package/dist/modes/interactive/interactive-mode-base.d.ts +7 -6
  1406. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  1407. package/dist/modes/interactive/interactive-mode-base.js +12 -12
  1408. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  1409. package/dist/modes/interactive/interactive-mode-deps.d.ts +20 -20
  1410. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
  1411. package/dist/modes/interactive/interactive-mode-deps.js +16 -16
  1412. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  1413. package/dist/modes/interactive/interactive-mode-helpers.d.ts +1 -1
  1414. package/dist/modes/interactive/interactive-mode-helpers.d.ts.map +1 -1
  1415. package/dist/modes/interactive/interactive-mode-helpers.js +3 -9
  1416. package/dist/modes/interactive/interactive-mode-helpers.js.map +1 -1
  1417. package/dist/modes/interactive/interactive-mode-surface.d.ts +8 -7
  1418. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  1419. package/dist/modes/interactive/interactive-mode-surface.js +1 -0
  1420. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  1421. package/dist/modes/interactive/interactive-mode-types.d.ts +2 -2
  1422. package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
  1423. package/dist/modes/interactive/interactive-mode-types.js.map +1 -1
  1424. package/dist/modes/interactive/interactive-model-catalog-startup.d.ts.map +1 -1
  1425. package/dist/modes/interactive/interactive-model-catalog-startup.js +3 -2
  1426. package/dist/modes/interactive/interactive-model-catalog-startup.js.map +1 -1
  1427. package/dist/modes/interactive/interactive-model-routing.js +17 -17
  1428. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  1429. package/dist/modes/interactive/interactive-onboarding.js +7 -7
  1430. package/dist/modes/interactive/interactive-onboarding.js.map +1 -1
  1431. package/dist/modes/interactive/interactive-pause.js.map +1 -1
  1432. package/dist/modes/interactive/interactive-process-lifecycle.js +38 -8
  1433. package/dist/modes/interactive/interactive-process-lifecycle.js.map +1 -1
  1434. package/dist/modes/interactive/interactive-prompt-restore.d.ts +58 -0
  1435. package/dist/modes/interactive/interactive-prompt-restore.d.ts.map +1 -0
  1436. package/dist/modes/interactive/interactive-prompt-restore.js +87 -0
  1437. package/dist/modes/interactive/interactive-prompt-restore.js.map +1 -0
  1438. package/dist/modes/interactive/interactive-prompt-turn.js +18 -3
  1439. package/dist/modes/interactive/interactive-prompt-turn.js.map +1 -1
  1440. package/dist/modes/interactive/interactive-queueing.js +3 -7
  1441. package/dist/modes/interactive/interactive-queueing.js.map +1 -1
  1442. package/dist/modes/interactive/interactive-render-chat.js +47 -36
  1443. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  1444. package/dist/modes/interactive/interactive-resource-disclosure.js +1 -3
  1445. package/dist/modes/interactive/interactive-resource-disclosure.js.map +1 -1
  1446. package/dist/modes/interactive/interactive-resource-paths.js +6 -19
  1447. package/dist/modes/interactive/interactive-resource-paths.js.map +1 -1
  1448. package/dist/modes/interactive/interactive-resource-rendering.js +15 -16
  1449. package/dist/modes/interactive/interactive-resource-rendering.js.map +1 -1
  1450. package/dist/modes/interactive/interactive-selectors.js +3 -5
  1451. package/dist/modes/interactive/interactive-selectors.js.map +1 -1
  1452. package/dist/modes/interactive/interactive-session-routing.js +16 -4
  1453. package/dist/modes/interactive/interactive-session-routing.js.map +1 -1
  1454. package/dist/modes/interactive/interactive-session-runtime.js +11 -0
  1455. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
  1456. package/dist/modes/interactive/interactive-slash-commands.js +12 -7
  1457. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  1458. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  1459. package/dist/modes/interactive/interactive-startup.js +10 -12
  1460. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  1461. package/dist/modes/interactive/interactive-submission.d.ts +24 -0
  1462. package/dist/modes/interactive/interactive-submission.d.ts.map +1 -0
  1463. package/dist/modes/interactive/interactive-submission.js +10 -0
  1464. package/dist/modes/interactive/interactive-submission.js.map +1 -0
  1465. package/dist/modes/interactive/interactive-summarization-retry-events.d.ts +1 -1
  1466. package/dist/modes/interactive/interactive-summarization-retry-events.d.ts.map +1 -1
  1467. package/dist/modes/interactive/interactive-summarization-retry-events.js +4 -2
  1468. package/dist/modes/interactive/interactive-summarization-retry-events.js.map +1 -1
  1469. package/dist/modes/interactive/login-provider-options.d.ts.map +1 -1
  1470. package/dist/modes/interactive/login-provider-options.js +1 -2
  1471. package/dist/modes/interactive/login-provider-options.js.map +1 -1
  1472. package/dist/modes/interactive/theme/global-theme.d.ts +1 -1
  1473. package/dist/modes/interactive/theme/global-theme.d.ts.map +1 -1
  1474. package/dist/modes/interactive/theme/global-theme.js.map +1 -1
  1475. package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
  1476. package/dist/modes/interactive/theme/theme-class.js.map +1 -1
  1477. package/dist/modes/interactive/theme/theme-loading.d.ts.map +1 -1
  1478. package/dist/modes/interactive/theme/theme-loading.js +1 -1
  1479. package/dist/modes/interactive/theme/theme-loading.js.map +1 -1
  1480. package/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  1481. package/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  1482. package/dist/modes/interactive/theme/theme.d.ts +2 -2
  1483. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  1484. package/dist/modes/interactive/theme/theme.js +2 -2
  1485. package/dist/modes/interactive/theme/theme.js.map +1 -1
  1486. package/dist/modes/interactive/whimsical-messages.d.ts.map +1 -1
  1487. package/dist/modes/interactive/whimsical-messages.js.map +1 -1
  1488. package/dist/modes/interactive-engine/activity-watchdog.d.ts +16 -6
  1489. package/dist/modes/interactive-engine/activity-watchdog.d.ts.map +1 -1
  1490. package/dist/modes/interactive-engine/activity-watchdog.js +12 -6
  1491. package/dist/modes/interactive-engine/activity-watchdog.js.map +1 -1
  1492. package/dist/modes/interactive-engine/create-isolated-runtime.d.ts.map +1 -1
  1493. package/dist/modes/interactive-engine/create-isolated-runtime.js +5 -4
  1494. package/dist/modes/interactive-engine/create-isolated-runtime.js.map +1 -1
  1495. package/dist/modes/interactive-engine/engine-child-liveness.d.ts.map +1 -1
  1496. package/dist/modes/interactive-engine/engine-child-liveness.js +6 -4
  1497. package/dist/modes/interactive-engine/engine-child-liveness.js.map +1 -1
  1498. package/dist/modes/interactive-engine/engine-custom-ui.d.ts +3 -2
  1499. package/dist/modes/interactive-engine/engine-custom-ui.d.ts.map +1 -1
  1500. package/dist/modes/interactive-engine/engine-custom-ui.js +32 -11
  1501. package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -1
  1502. package/dist/modes/interactive-engine/engine-diagnostic-view.d.ts +16 -0
  1503. package/dist/modes/interactive-engine/engine-diagnostic-view.d.ts.map +1 -0
  1504. package/dist/modes/interactive-engine/engine-diagnostic-view.js +19 -0
  1505. package/dist/modes/interactive-engine/engine-diagnostic-view.js.map +1 -0
  1506. package/dist/modes/interactive-engine/engine-dialog-host.d.ts +33 -0
  1507. package/dist/modes/interactive-engine/engine-dialog-host.d.ts.map +1 -0
  1508. package/dist/modes/interactive-engine/engine-dialog-host.js +129 -0
  1509. package/dist/modes/interactive-engine/engine-dialog-host.js.map +1 -0
  1510. package/dist/modes/interactive-engine/engine-generation.d.ts +29 -0
  1511. package/dist/modes/interactive-engine/engine-generation.d.ts.map +1 -0
  1512. package/dist/modes/interactive-engine/engine-generation.js +11 -0
  1513. package/dist/modes/interactive-engine/engine-generation.js.map +1 -0
  1514. package/dist/modes/interactive-engine/engine-health.d.ts +101 -0
  1515. package/dist/modes/interactive-engine/engine-health.d.ts.map +1 -0
  1516. package/dist/modes/interactive-engine/engine-health.js +236 -0
  1517. package/dist/modes/interactive-engine/engine-health.js.map +1 -0
  1518. package/dist/modes/interactive-engine/engine-input-form.d.ts.map +1 -1
  1519. package/dist/modes/interactive-engine/engine-input-form.js +12 -3
  1520. package/dist/modes/interactive-engine/engine-input-form.js.map +1 -1
  1521. package/dist/modes/interactive-engine/engine-monitor.d.ts.map +1 -1
  1522. package/dist/modes/interactive-engine/engine-monitor.js +7 -2
  1523. package/dist/modes/interactive-engine/engine-monitor.js.map +1 -1
  1524. package/dist/modes/interactive-engine/engine-render-service.d.ts.map +1 -1
  1525. package/dist/modes/interactive-engine/engine-render-service.js +11 -5
  1526. package/dist/modes/interactive-engine/engine-render-service.js.map +1 -1
  1527. package/dist/modes/interactive-engine/engine-session-picker.d.ts.map +1 -1
  1528. package/dist/modes/interactive-engine/engine-session-picker.js +4 -2
  1529. package/dist/modes/interactive-engine/engine-session-picker.js.map +1 -1
  1530. package/dist/modes/interactive-engine/extension-ui-bridge.d.ts +14 -3
  1531. package/dist/modes/interactive-engine/extension-ui-bridge.d.ts.map +1 -1
  1532. package/dist/modes/interactive-engine/extension-ui-bridge.js +32 -45
  1533. package/dist/modes/interactive-engine/extension-ui-bridge.js.map +1 -1
  1534. package/dist/modes/interactive-engine/input-form-host.d.ts +1 -0
  1535. package/dist/modes/interactive-engine/input-form-host.d.ts.map +1 -1
  1536. package/dist/modes/interactive-engine/input-form-host.js +12 -2
  1537. package/dist/modes/interactive-engine/input-form-host.js.map +1 -1
  1538. package/dist/modes/interactive-engine/isolated-auth.d.ts +2 -2
  1539. package/dist/modes/interactive-engine/isolated-auth.d.ts.map +1 -1
  1540. package/dist/modes/interactive-engine/isolated-auth.js +4 -3
  1541. package/dist/modes/interactive-engine/isolated-auth.js.map +1 -1
  1542. package/dist/modes/interactive-engine/isolated-runtime.d.ts +32 -6
  1543. package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
  1544. package/dist/modes/interactive-engine/isolated-runtime.js +126 -62
  1545. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
  1546. package/dist/modes/interactive-engine/protocol.d.ts +20 -1
  1547. package/dist/modes/interactive-engine/protocol.d.ts.map +1 -1
  1548. package/dist/modes/interactive-engine/protocol.js +183 -55
  1549. package/dist/modes/interactive-engine/protocol.js.map +1 -1
  1550. package/dist/modes/interactive-engine/remote-component.d.ts +38 -0
  1551. package/dist/modes/interactive-engine/remote-component.d.ts.map +1 -1
  1552. package/dist/modes/interactive-engine/remote-component.js +111 -22
  1553. package/dist/modes/interactive-engine/remote-component.js.map +1 -1
  1554. package/dist/modes/interactive-engine/remote-input-ownership.d.ts +48 -0
  1555. package/dist/modes/interactive-engine/remote-input-ownership.d.ts.map +1 -0
  1556. package/dist/modes/interactive-engine/remote-input-ownership.js +42 -0
  1557. package/dist/modes/interactive-engine/remote-input-ownership.js.map +1 -0
  1558. package/dist/modes/interactive-engine/remote-model-catalog.d.ts +0 -1
  1559. package/dist/modes/interactive-engine/remote-model-catalog.d.ts.map +1 -1
  1560. package/dist/modes/interactive-engine/remote-model-catalog.js +14 -47
  1561. package/dist/modes/interactive-engine/remote-model-catalog.js.map +1 -1
  1562. package/dist/modes/interactive-engine/remote-queue-pause.d.ts.map +1 -1
  1563. package/dist/modes/interactive-engine/remote-queue-pause.js.map +1 -1
  1564. package/dist/modes/interactive-engine/remote-renderer.d.ts.map +1 -1
  1565. package/dist/modes/interactive-engine/remote-renderer.js +38 -10
  1566. package/dist/modes/interactive-engine/remote-renderer.js.map +1 -1
  1567. package/dist/modes/interactive-engine/session-picker-host.d.ts +1 -0
  1568. package/dist/modes/interactive-engine/session-picker-host.d.ts.map +1 -1
  1569. package/dist/modes/interactive-engine/session-picker-host.js +4 -0
  1570. package/dist/modes/interactive-engine/session-picker-host.js.map +1 -1
  1571. package/dist/modes/print-mode.d.ts.map +1 -1
  1572. package/dist/modes/print-mode.js.map +1 -1
  1573. package/dist/modes/rpc/jsonl.d.ts +7 -0
  1574. package/dist/modes/rpc/jsonl.d.ts.map +1 -1
  1575. package/dist/modes/rpc/jsonl.js +17 -1
  1576. package/dist/modes/rpc/jsonl.js.map +1 -1
  1577. package/dist/modes/rpc/queued-writer.d.ts +14 -0
  1578. package/dist/modes/rpc/queued-writer.d.ts.map +1 -1
  1579. package/dist/modes/rpc/queued-writer.js +33 -9
  1580. package/dist/modes/rpc/queued-writer.js.map +1 -1
  1581. package/dist/modes/rpc/rpc-bash-request-owners.js +1 -1
  1582. package/dist/modes/rpc/rpc-bash-request-owners.js.map +1 -1
  1583. package/dist/modes/rpc/rpc-client-api.d.ts +4 -4
  1584. package/dist/modes/rpc/rpc-client-api.d.ts.map +1 -1
  1585. package/dist/modes/rpc/rpc-client-api.js +63 -22
  1586. package/dist/modes/rpc/rpc-client-api.js.map +1 -1
  1587. package/dist/modes/rpc/rpc-client-process.d.ts +10 -0
  1588. package/dist/modes/rpc/rpc-client-process.d.ts.map +1 -1
  1589. package/dist/modes/rpc/rpc-client-process.js +72 -15
  1590. package/dist/modes/rpc/rpc-client-process.js.map +1 -1
  1591. package/dist/modes/rpc/rpc-client-waits.d.ts +17 -1
  1592. package/dist/modes/rpc/rpc-client-waits.d.ts.map +1 -1
  1593. package/dist/modes/rpc/rpc-client-waits.js +25 -0
  1594. package/dist/modes/rpc/rpc-client-waits.js.map +1 -1
  1595. package/dist/modes/rpc/rpc-client.d.ts +61 -6
  1596. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  1597. package/dist/modes/rpc/rpc-client.js +200 -145
  1598. package/dist/modes/rpc/rpc-client.js.map +1 -1
  1599. package/dist/modes/rpc/rpc-command-handler.d.ts +2 -2
  1600. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
  1601. package/dist/modes/rpc/rpc-command-handler.js +61 -32
  1602. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  1603. package/dist/modes/rpc/rpc-command-timeouts.d.ts +30 -0
  1604. package/dist/modes/rpc/rpc-command-timeouts.d.ts.map +1 -0
  1605. package/dist/modes/rpc/rpc-command-timeouts.js +52 -0
  1606. package/dist/modes/rpc/rpc-command-timeouts.js.map +1 -0
  1607. package/dist/modes/rpc/rpc-event-buffer.d.ts.map +1 -1
  1608. package/dist/modes/rpc/rpc-event-buffer.js +3 -1
  1609. package/dist/modes/rpc/rpc-event-buffer.js.map +1 -1
  1610. package/dist/modes/rpc/rpc-extension-ui.d.ts +1 -1
  1611. package/dist/modes/rpc/rpc-extension-ui.d.ts.map +1 -1
  1612. package/dist/modes/rpc/rpc-extension-ui.js +44 -16
  1613. package/dist/modes/rpc/rpc-extension-ui.js.map +1 -1
  1614. package/dist/modes/rpc/rpc-generation-buffer.d.ts +21 -0
  1615. package/dist/modes/rpc/rpc-generation-buffer.d.ts.map +1 -0
  1616. package/dist/modes/rpc/rpc-generation-buffer.js +35 -0
  1617. package/dist/modes/rpc/rpc-generation-buffer.js.map +1 -0
  1618. package/dist/modes/rpc/rpc-input-scheduler.d.ts.map +1 -1
  1619. package/dist/modes/rpc/rpc-input-scheduler.js +13 -6
  1620. package/dist/modes/rpc/rpc-input-scheduler.js.map +1 -1
  1621. package/dist/modes/rpc/rpc-input.d.ts +7 -1
  1622. package/dist/modes/rpc/rpc-input.d.ts.map +1 -1
  1623. package/dist/modes/rpc/rpc-input.js +14 -4
  1624. package/dist/modes/rpc/rpc-input.js.map +1 -1
  1625. package/dist/modes/rpc/rpc-keybindings-reload.d.ts.map +1 -1
  1626. package/dist/modes/rpc/rpc-keybindings-reload.js.map +1 -1
  1627. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  1628. package/dist/modes/rpc/rpc-mode.js +17 -18
  1629. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  1630. package/dist/modes/rpc/rpc-oauth-client.d.ts +2 -3
  1631. package/dist/modes/rpc/rpc-oauth-client.d.ts.map +1 -1
  1632. package/dist/modes/rpc/rpc-oauth-client.js +12 -5
  1633. package/dist/modes/rpc/rpc-oauth-client.js.map +1 -1
  1634. package/dist/modes/rpc/rpc-oauth-interaction.d.ts +1 -1
  1635. package/dist/modes/rpc/rpc-oauth-interaction.d.ts.map +1 -1
  1636. package/dist/modes/rpc/rpc-oauth-interaction.js +1 -1
  1637. package/dist/modes/rpc/rpc-oauth-interaction.js.map +1 -1
  1638. package/dist/modes/rpc/rpc-output-buffer.d.ts.map +1 -1
  1639. package/dist/modes/rpc/rpc-output-buffer.js +3 -1
  1640. package/dist/modes/rpc/rpc-output-buffer.js.map +1 -1
  1641. package/dist/modes/rpc/rpc-pending-requests.d.ts +37 -0
  1642. package/dist/modes/rpc/rpc-pending-requests.d.ts.map +1 -0
  1643. package/dist/modes/rpc/rpc-pending-requests.js +57 -0
  1644. package/dist/modes/rpc/rpc-pending-requests.js.map +1 -0
  1645. package/dist/modes/rpc/rpc-provider-auth.d.ts +4 -5
  1646. package/dist/modes/rpc/rpc-provider-auth.d.ts.map +1 -1
  1647. package/dist/modes/rpc/rpc-provider-auth.js +29 -57
  1648. package/dist/modes/rpc/rpc-provider-auth.js.map +1 -1
  1649. package/dist/modes/rpc/rpc-responses.js.map +1 -1
  1650. package/dist/modes/rpc/rpc-session-binding.d.ts +1 -1
  1651. package/dist/modes/rpc/rpc-session-binding.d.ts.map +1 -1
  1652. package/dist/modes/rpc/rpc-session-binding.js +8 -3
  1653. package/dist/modes/rpc/rpc-session-binding.js.map +1 -1
  1654. package/dist/modes/rpc/rpc-terminal-drain.d.ts +52 -0
  1655. package/dist/modes/rpc/rpc-terminal-drain.d.ts.map +1 -0
  1656. package/dist/modes/rpc/rpc-terminal-drain.js +85 -0
  1657. package/dist/modes/rpc/rpc-terminal-drain.js.map +1 -0
  1658. package/dist/modes/rpc/rpc-transport-error.d.ts +49 -0
  1659. package/dist/modes/rpc/rpc-transport-error.d.ts.map +1 -0
  1660. package/dist/modes/rpc/rpc-transport-error.js +78 -0
  1661. package/dist/modes/rpc/rpc-transport-error.js.map +1 -0
  1662. package/dist/modes/rpc/rpc-types.d.ts +12 -7
  1663. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  1664. package/dist/modes/rpc/rpc-types.js.map +1 -1
  1665. package/dist/package-manager-cli-parser.js.map +1 -1
  1666. package/dist/package-manager-cli.d.ts.map +1 -1
  1667. package/dist/package-manager-cli.js +25 -16
  1668. package/dist/package-manager-cli.js.map +1 -1
  1669. package/dist/utils/child-process.d.ts.map +1 -1
  1670. package/dist/utils/child-process.js.map +1 -1
  1671. package/dist/utils/clipboard-image.js +1 -1
  1672. package/dist/utils/clipboard-image.js.map +1 -1
  1673. package/dist/utils/clipboard.d.ts.map +1 -1
  1674. package/dist/utils/clipboard.js.map +1 -1
  1675. package/dist/utils/fs-watch.d.ts.map +1 -1
  1676. package/dist/utils/fs-watch.js +1 -3
  1677. package/dist/utils/fs-watch.js.map +1 -1
  1678. package/dist/utils/git.js +1 -1
  1679. package/dist/utils/git.js.map +1 -1
  1680. package/dist/utils/interactive-engine-bootstrap.d.ts +67 -0
  1681. package/dist/utils/interactive-engine-bootstrap.d.ts.map +1 -0
  1682. package/dist/utils/interactive-engine-bootstrap.js +117 -0
  1683. package/dist/utils/interactive-engine-bootstrap.js.map +1 -0
  1684. package/dist/utils/interactive-engine-env.d.ts +41 -0
  1685. package/dist/utils/interactive-engine-env.d.ts.map +1 -0
  1686. package/dist/utils/interactive-engine-env.js +67 -0
  1687. package/dist/utils/interactive-engine-env.js.map +1 -0
  1688. package/dist/utils/markit.d.ts.map +1 -1
  1689. package/dist/utils/markit.js +15 -5
  1690. package/dist/utils/markit.js.map +1 -1
  1691. package/dist/utils/shell.js +2 -2
  1692. package/dist/utils/shell.js.map +1 -1
  1693. package/dist/utils/split-launcher.d.ts.map +1 -1
  1694. package/dist/utils/split-launcher.js +1 -2
  1695. package/dist/utils/split-launcher.js.map +1 -1
  1696. package/dist/utils/tools-manager.d.ts.map +1 -1
  1697. package/dist/utils/tools-manager.js +8 -34
  1698. package/dist/utils/tools-manager.js.map +1 -1
  1699. package/dist/utils/version-check.d.ts.map +1 -1
  1700. package/dist/utils/version-check.js +1 -1
  1701. package/dist/utils/version-check.js.map +1 -1
  1702. package/docs/changelog.mdx +12 -1
  1703. package/docs/custom-provider.md +27 -4
  1704. package/docs/development.md +14 -15
  1705. package/docs/extensions.md +60 -2
  1706. package/docs/keybindings.md +13 -1
  1707. package/docs/models.md +4 -6
  1708. package/docs/providers.md +28 -2
  1709. package/docs/quickstart.md +2 -1
  1710. package/docs/rpc.md +1 -1
  1711. package/docs/sdk.md +32 -49
  1712. package/docs/security.md +15 -0
  1713. package/docs/session-format.md +2 -0
  1714. package/docs/usage.md +34 -0
  1715. package/docs/workflows.md +89 -12
  1716. package/examples/extensions/border-status-editor.ts +1 -6
  1717. package/examples/extensions/custom-compaction.ts +7 -2
  1718. package/examples/extensions/custom-footer.ts +1 -1
  1719. package/examples/extensions/custom-provider-anthropic/index.ts +14 -2
  1720. package/examples/extensions/custom-provider-gitlab-duo/index.ts +1 -1
  1721. package/examples/extensions/gondolin/index.ts +1 -1
  1722. package/examples/extensions/handoff.ts +2 -2
  1723. package/examples/extensions/hello.ts +1 -1
  1724. package/examples/extensions/minimal-mode.ts +6 -6
  1725. package/examples/extensions/overlay-qa-focus-components.ts +0 -1
  1726. package/examples/extensions/overlay-qa-streaming-input-components.ts +2 -2
  1727. package/examples/extensions/overlay-qa-tests.ts +16 -14
  1728. package/examples/extensions/overlay-qa-toggle-passive-components.ts +3 -5
  1729. package/examples/extensions/overlay-test.ts +3 -6
  1730. package/examples/extensions/plan-mode/index.ts +1 -1
  1731. package/examples/extensions/preset.ts +1 -1
  1732. package/examples/extensions/qna.ts +1 -1
  1733. package/examples/extensions/structured-output.ts +9 -9
  1734. package/examples/extensions/subagent/display.ts +115 -127
  1735. package/examples/extensions/subagent/index.ts +310 -349
  1736. package/examples/extensions/subagent/render.ts +244 -345
  1737. package/examples/extensions/subagent/runner.ts +223 -230
  1738. package/examples/extensions/subagent/schemas.ts +39 -46
  1739. package/examples/extensions/subagent/types.ts +22 -22
  1740. package/examples/extensions/summarize.ts +2 -2
  1741. package/examples/extensions/tic-tac-toe.ts +4 -4
  1742. package/examples/extensions/todo.ts +1 -1
  1743. package/examples/extensions/tool-override.ts +1 -1
  1744. package/examples/extensions/trigger-compact.ts +4 -1
  1745. package/examples/extensions/working-indicator.ts +2 -1
  1746. package/examples/rpc-extension-ui-components.ts +1 -2
  1747. package/examples/sdk/02-custom-model.ts +8 -10
  1748. package/examples/sdk/03-custom-prompt.ts +1 -6
  1749. package/examples/sdk/06-extensions.ts +1 -6
  1750. package/examples/sdk/07-context-files.ts +1 -6
  1751. package/examples/sdk/09-api-keys-and-oauth.ts +17 -23
  1752. package/examples/sdk/12-full-control.ts +10 -12
  1753. package/examples/sdk/README.md +17 -21
  1754. package/npm-shrinkwrap.json +300 -303
  1755. package/package.json +11 -11
  1756. package/dist/core/model-registry-auth.d.ts +0 -10
  1757. package/dist/core/model-registry-auth.d.ts.map +0 -1
  1758. package/dist/core/model-registry-auth.js +0 -98
  1759. package/dist/core/model-registry-auth.js.map +0 -1
  1760. package/dist/core/model-registry-builtins.d.ts +0 -8
  1761. package/dist/core/model-registry-builtins.d.ts.map +0 -1
  1762. package/dist/core/model-registry-builtins.js +0 -104
  1763. package/dist/core/model-registry-builtins.js.map +0 -1
  1764. package/dist/core/model-registry-custom-loader.d.ts +0 -3
  1765. package/dist/core/model-registry-custom-loader.d.ts.map +0 -1
  1766. package/dist/core/model-registry-custom-loader.js +0 -255
  1767. package/dist/core/model-registry-custom-loader.js.map +0 -1
  1768. package/dist/core/model-registry-dynamic.d.ts +0 -7
  1769. package/dist/core/model-registry-dynamic.d.ts.map +0 -1
  1770. package/dist/core/model-registry-dynamic.js +0 -189
  1771. package/dist/core/model-registry-dynamic.js.map +0 -1
  1772. package/dist/core/model-registry-extension-refresh.d.ts +0 -23
  1773. package/dist/core/model-registry-extension-refresh.d.ts.map +0 -1
  1774. package/dist/core/model-registry-extension-refresh.js +0 -32
  1775. package/dist/core/model-registry-extension-refresh.js.map +0 -1
  1776. package/dist/core/model-registry-loader.d.ts +0 -5
  1777. package/dist/core/model-registry-loader.d.ts.map +0 -1
  1778. package/dist/core/model-registry-loader.js +0 -29
  1779. package/dist/core/model-registry-loader.js.map +0 -1
  1780. package/dist/core/model-registry-schemas.d.ts +0 -1399
  1781. package/dist/core/model-registry-schemas.d.ts.map +0 -1
  1782. package/dist/core/model-registry-schemas.js.map +0 -1
  1783. package/dist/core/model-registry-types.d.ts +0 -91
  1784. package/dist/core/model-registry-types.d.ts.map +0 -1
  1785. package/dist/core/model-registry-types.js +0 -2
  1786. package/dist/core/model-registry-types.js.map +0 -1
  1787. package/dist/core/model-registry-validation.d.ts +0 -7
  1788. package/dist/core/model-registry-validation.d.ts.map +0 -1
  1789. package/dist/core/model-registry-validation.js +0 -12
  1790. package/dist/core/model-registry-validation.js.map +0 -1
  1791. package/dist/core/oauth-compat.d.ts +0 -17
  1792. package/dist/core/oauth-compat.d.ts.map +0 -1
  1793. package/dist/core/oauth-compat.js +0 -2
  1794. package/dist/core/oauth-compat.js.map +0 -1
  1795. package/dist/core/oauth-provider-bridge.d.ts +0 -63
  1796. package/dist/core/oauth-provider-bridge.d.ts.map +0 -1
  1797. package/dist/core/oauth-provider-bridge.js +0 -232
  1798. package/dist/core/oauth-provider-bridge.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"compaction-runner.js","sourceRoot":"","sources":["../../../src/core/compaction/compaction-runner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { StreamFn, ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { RetryCallbacks, RetryPolicy } from \"@earendil-works/pi-ai\";\nimport type { Api, Model } from \"@earendil-works/pi-ai/compat\";\nimport { getKeptTailTokenEstimate } from \"./compaction-boundary.js\";\nimport { reconstructCompactedTranscript, validateDeletedRanges } from \"./deleted-ranges.js\";\nimport {\n\tcreateFallbackPlannerBorrower,\n\tplannerAttemptKey,\n\ttype BorrowFallbackPlanner,\n\ttype FallbackPlannerContext,\n} from \"./fallback-planner.js\";\nimport type { TerminalPlannerOutcome } from \"./planner-outcome.js\";\nimport {\n\tMALFORMED_OUTPUT_MESSAGE,\n\tNO_USABLE_RANGES_MESSAGE,\n\tplanDeletedLineRanges,\n\tRangePlanError,\n\tresolvePlannerRequest,\n} from \"./range-planner.js\";\nimport { writeSuccessDiagnosticSidecar } from \"./range-planner-diagnostics.js\";\nimport { nextTrimOffset, rebaseTrimmedRanges, trimRegionHead } from \"./region-trimming.js\";\nimport type {\n\tBorrowedPlanner,\n\tCompactedTranscript,\n\tCompactionPlannerModel,\n\tCompactionUrgency,\n\tPlannerAuth,\n\tRawLineRange,\n\tVerbatimCompactionPreparation,\n} from \"./compaction-types.js\";\nimport { MIN_COMPACTABLE_REGION_LINES } from \"./compaction-types.js\";\n\nexport interface CompactionPlanOptions {\n\tstreamFn: StreamFn;\n\t/** Absolute path of the persisted session file. Undefined for in-memory sessions. */\n\tsessionFilePath?: string;\n\tretry?: RetryPolicy;\n\tcallbacks?: RetryCallbacks;\n}\n\n/** One compaction run's request. Urgency is required; there is no default. */\nexport interface CompactionRunRequest extends CompactionPlanOptions {\n\t/** Per-model credentials; a borrowed candidate uses its own, never the session model's. */\n\tresolveAuth: (model: Model<Api>) => Promise<PlannerAuth | undefined>;\n\tsignal?: AbortSignal;\n\t/** Inherited by the planner and never modified across attempts. */\n\tthinkingLevel: ThinkingLevel | undefined;\n\turgency: CompactionUrgency;\n\t/** Configured fallback candidates. Omitted means borrowing is impossible. */\n\tfallback?: FallbackPlannerContext;\n}\n\nexport type CompactionRungResult = CompactedTranscript & {\n\trung: \"planned\" | \"fresh\";\n\t/** Present only when a borrowed fallback model ranked the lines. */\n\tplannerModel?: CompactionPlannerModel;\n\t/** False only when the fresh rung had to drop the protected tail. */\n\tkeptTail: boolean;\n};\n\n/** Runner-internal fresh-window build: the transcript plus the tail decision. */\ninterface FreshWindowBuild {\n\ttranscript: CompactedTranscript;\n\tkeptTail: boolean;\n}\n\n/**\n * Calculate the single global line threshold from the prepared setting.\n *\n * This is the untrimmed target. Overflow trimming does NOT reuse it:\n * `planWithTrimming` recomputes the threshold against each trimmed view, so the\n * planner is always asked to keep a proportion of the lines it actually\n * received rather than a proportion of a region it never saw.\n *\n * Retained as an exported helper for tests and consumers that need the\n * pre-trim target; production planning goes through `planWithTrimming`.\n */\nexport function targetKeepLines(preparation: VerbatimCompactionPreparation): number {\n\tconst region = preparation.region;\n\treturn Math.max(\n\t\tregion.protectedLineNumbers?.size ?? 0,\n\t\tMath.round(region.lines.length * preparation.parameters.compression_ratio),\n\t);\n}\n\nfunction hardInputLimitFor(model: Model<Api>): number {\n\treturn model.contextWindow > 0 ? model.contextWindow : Number.POSITIVE_INFINITY;\n}\n\nfunction withWholeContextStats(\n\tresult: CompactedTranscript,\n\tpreparation: VerbatimCompactionPreparation,\n\tkeptTail: boolean,\n): CompactedTranscript {\n\tconst tokensAfter = result.stats.tokensAfter + (keptTail ? getKeptTailTokenEstimate(preparation) : 0);\n\tconst percentReduction = preparation.tokensBefore === 0\n\t\t? 0\n\t\t: Math.round((1 - tokensAfter / preparation.tokensBefore) * 1000) / 10;\n\treturn {\n\t\t...result,\n\t\tstats: { ...result.stats, tokensBefore: preparation.tokensBefore, tokensAfter, percentReduction },\n\t};\n}\n\n/**\n * Build a fresh context window and the tail decision that goes with it.\n *\n * Private on purpose: `keptTail` is runner bookkeeping that persistence needs in\n * order to write `firstKeptEntryId: null` when the protected tail is dropped. It\n * is deliberately absent from the public door's return value, which is exactly a\n * `CompactedTranscript`.\n */\nfunction buildFreshTranscript(preparation: VerbatimCompactionPreparation): CompactedTranscript {\n\tconst region = preparation.region;\n\tconst whole: RawLineRange[] = region.lines.length > 0 ? [{ start: 1, end: region.lines.length }] : [];\n\treturn reconstructCompactedTranscript(region, validateDeletedRanges(whole, region));\n}\n\nfunction buildFreshContextWindow(\n\tpreparation: VerbatimCompactionPreparation,\n\thardInputLimit: number,\n): FreshWindowBuild {\n\tconst limit = Number.isFinite(hardInputLimit) && hardInputLimit > 0 ? hardInputLimit : Number.POSITIVE_INFINITY;\n\t// The rule is \"tail under the limit ⇒ tail kept\", so the comparison is the\n\t// tail alone. Explicit protected lines are a hard floor that survives either\n\t// way, and counting the reconstructed protected/marker text here would drop a\n\t// tail that fits. A rebuilt context that still cannot be sent is the post-tool\n\t// gate's problem, not a reason for this rung to discard more.\n\treturn { transcript: buildFreshTranscript(preparation), keptTail: getKeptTailTokenEstimate(preparation) <= limit };\n}\n\n/**\n * Discard every compactable line and start a fresh context window.\n *\n * TOTAL. No provider, no credentials, no network, no signal, no failure mode,\n * no `Promise`. Port of codex `compact_token_budget` →\n * `Session::start_new_context_window`. Atomic's system prompt, context files,\n * and skills are rebuilt per request and were never in the transcript, so they\n * survive automatically.\n *\n * The whole region is emitted as one deletion range and handed to the unchanged\n * `validateDeletedRanges` → `reconstructCompactedTranscript` path, which splits\n * around protected spans and folds prior markers.\n *\n * Returns exactly a `CompactedTranscript` — `text`, `ranges`, `stats` and\n * nothing else. Whether the `preserve_recent` tail survives is a persistence\n * concern and travels on `CompactionRungResult.keptTail`, not on this door.\n */\nexport function startNewContextWindow(\n\tpreparation: VerbatimCompactionPreparation,\n): CompactedTranscript {\n\treturn buildFreshTranscript(preparation);\n}\n\nfunction plannedResult(\n\tpreparation: VerbatimCompactionPreparation,\n\tranges: RawLineRange[],\n\tplannerModel: CompactionPlannerModel | undefined,\n): CompactionRungResult {\n\tconst reconstructed = reconstructCompactedTranscript(\n\t\tpreparation.region,\n\t\tvalidateDeletedRanges(ranges, preparation.region),\n\t);\n\treturn {\n\t\t...withWholeContextStats(reconstructed, preparation, true),\n\t\trung: \"planned\",\n\t\t...(plannerModel ? { plannerModel } : {}),\n\t\tkeptTail: true,\n\t};\n}\n\nfunction borrowedIdentity(planner: BorrowedPlanner): CompactionPlannerModel {\n\treturn {\n\t\tprovider: planner.model.provider,\n\t\tid: planner.model.id,\n\t\t...(planner.budget.reasoning ? { thinkingLevel: planner.budget.reasoning } : {}),\n\t};\n}\n\nfunction terminalError(outcome: TerminalPlannerOutcome | undefined): RangePlanError {\n\tif (!outcome) return new RangePlanError(MALFORMED_OUTPUT_MESSAGE, 1, \"\", false);\n\tif (outcome.kind === \"rateLimited\") {\n\t\treturn new RangePlanError(outcome.message, 1, \"\", false, outcome.diagnosticPath, outcome);\n\t}\n\tif (outcome.kind === \"overflowed\") {\n\t\treturn new RangePlanError(\n\t\t\t\"Compaction range planning exceeded the model context window\",\n\t\t\t1,\n\t\t\t\"\",\n\t\t\ttrue,\n\t\t\toutcome.diagnosticPath,\n\t\t\toutcome,\n\t\t);\n\t}\n\tif (outcome.kind === \"providerError\") {\n\t\treturn new RangePlanError(outcome.message, 1, \"\", false, outcome.diagnosticPath, outcome);\n\t}\n\tconst message = outcome.category === \"malformed_output\" ? MALFORMED_OUTPUT_MESSAGE : NO_USABLE_RANGES_MESSAGE;\n\treturn new RangePlanError(message, 1, outcome.excerpt, false, outcome.diagnosticPath, outcome);\n}\n\ntype PlannerAttempt =\n\t| { kind: \"planned\"; ranges: RawLineRange[] }\n\t| { kind: \"terminal\"; outcome: TerminalPlannerOutcome };\n\n/**\n * Run one planner model, retrying the same model after oldest-first input\n * trimming when the request itself overflows the context window.\n *\n * Trimming continues until no strictly smaller view exists; `nextTrimOffset`\n * halves the remaining suffix, so the walk is finite. Only then is `overflowed`\n * terminal and the ladder advances.\n *\n * Each view gets its own keep target from `compression_ratio`. Reusing the\n * original whole-preparation target is what asked a halved 20-line region to\n * keep 10 of its 10 visible lines — a request for zero deletions, whose obedient\n * empty answer then hits the non-negotiable zero-range rejection. Extra\n * reduction still comes only from the head the runner withheld.\n */\nasync function planWithTrimming(\n\tpreparation: VerbatimCompactionPreparation,\n\tplanner: BorrowedPlanner,\n\toptions: CompactionPlanOptions & { signal?: AbortSignal },\n): Promise<PlannerAttempt> {\n\tlet offset = 0;\n\tfor (;;) {\n\t\tconst region = offset === 0 ? preparation.region : trimRegionHead(preparation.region, offset);\n\t\tif (!region) return { kind: \"terminal\", outcome: { kind: \"overflowed\" } };\n\t\tconst keepTarget = Math.max(\n\t\t\tregion.protectedLineNumbers?.size ?? 0,\n\t\t\tMath.round(region.lines.length * preparation.parameters.compression_ratio),\n\t\t);\n\t\tconst outcome = await planDeletedLineRanges(region, preparation.parameters, planner, keepTarget, options);\n\t\tif (outcome.kind === \"ranked\" || outcome.kind === \"recovered\") {\n\t\t\tif (offset === 0) return { kind: \"planned\", ranges: outcome.ranges };\n\t\t\tconst validated = validateDeletedRanges(outcome.ranges, region);\n\t\t\treturn { kind: \"planned\", ranges: rebaseTrimmedRanges(validated, offset) };\n\t\t}\n\t\tif (outcome.kind !== \"overflowed\") return { kind: \"terminal\", outcome };\n\t\tif (options.signal?.aborted) throw new Error(\"Compaction cancelled\");\n\t\tconst next = nextTrimOffset(preparation.region, offset);\n\t\tif (next === undefined) return { kind: \"terminal\", outcome };\n\t\toffset = next;\n\t}\n}\n\nconst MISSING_AUTH_MESSAGE = \"Compaction provider authentication is unavailable\";\n\n/**\n * A runner-local terminal cause with no provider attempt behind it.\n *\n * Missing credentials are not a provider outcome — no request was made — so no\n * synthetic response is fabricated and no diagnostic sidecar is written. It is\n * carried as `providerError` purely so the ladder can advance past it.\n */\nfunction authFailureOutcome(error: unknown): TerminalPlannerOutcome {\n\tconst message = error instanceof Error ? error.message : error === undefined ? MISSING_AUTH_MESSAGE : String(error);\n\treturn { kind: \"providerError\", message: message || MISSING_AUTH_MESSAGE };\n}\n\n/** Resolve one model's credentials, normalizing a rejection and `undefined` alike. */\nasync function resolvePlannerAuth(\n\tresolveAuth: CompactionRunRequest[\"resolveAuth\"],\n\tmodel: Model<Api>,\n): Promise<{ auth: PlannerAuth } | { failure: TerminalPlannerOutcome }> {\n\ttry {\n\t\tconst auth = await resolveAuth(model);\n\t\treturn auth ? { auth } : { failure: authFailureOutcome(undefined) };\n\t} catch (error) {\n\t\treturn { failure: authFailureOutcome(error) };\n\t}\n}\n\nfunction freshResult(\n\tpreparation: VerbatimCompactionPreparation,\n\thardInputLimit: number,\n): CompactionRungResult {\n\tconst fresh = buildFreshContextWindow(preparation, hardInputLimit);\n\treturn {\n\t\t...withWholeContextStats(fresh.transcript, preparation, fresh.keptTail),\n\t\trung: \"fresh\",\n\t\tkeptTail: fresh.keptTail,\n\t};\n}\n\n/**\n * Produce one compacted transcript, tagged with the rung that produced it.\n *\n * The ladder is: the session model, then each configured fallback model\n * borrowed for one planner request, then — only under `load_bearing` urgency —\n * a fresh context window. A manual `/compact` runs at `recoverable` urgency and\n * therefore cannot reach the context-destroying rung; it fails honestly instead.\n *\n * Unavailable credentials are ladder control flow, not an early throw: a\n * borrowed candidate with its own working credentials can still rank the lines,\n * and a load-bearing caller still reaches the credential-free fresh rung.\n */\nexport async function runVerbatimCompaction(\n\tpreparation: VerbatimCompactionPreparation,\n\tmodel: Model<Api>,\n\trequest: CompactionRunRequest,\n): Promise<CompactionRungResult> {\n\tconst signal = request.signal;\n\tif (signal?.aborted) throw new Error(\"Compaction cancelled\");\n\tconst plannerOptions = {\n\t\tstreamFn: request.streamFn,\n\t\tsessionFilePath: request.sessionFilePath,\n\t\tretry: request.retry,\n\t\tcallbacks: request.callbacks,\n\t\tsignal,\n\t};\n\tconst hardInputLimit = hardInputLimitFor(model);\n\n\t// A region below the planner minimum cannot be made rankable by changing\n\t// models, so no planner is invoked. Only a load-bearing caller can reach a\n\t// preparation this small; recoverable callers were refused before the runner.\n\tif (preparation.region.lines.length < MIN_COMPACTABLE_REGION_LINES) {\n\t\tif (request.urgency !== \"load_bearing\") throw new RangePlanError(NO_USABLE_RANGES_MESSAGE, 0, \"\", false);\n\t\treturn freshResult(preparation, hardInputLimit);\n\t}\n\n\tconst attempted = new Set<string>();\n\t// One borrower per run owns the monotonic cursor, so the configured list is\n\t// walked exactly once no matter how many terminal outcomes occur.\n\tconst borrow: BorrowFallbackPlanner | undefined = request.fallback\n\t\t? createFallbackPlannerBorrower(request.fallback)\n\t\t: undefined;\n\tconst primaryBudget = resolvePlannerRequest(model, request.thinkingLevel);\n\tconst primaryAuth = await resolvePlannerAuth(request.resolveAuth, model);\n\tlet lastTerminal: TerminalPlannerOutcome | undefined = \"failure\" in primaryAuth ? primaryAuth.failure : undefined;\n\tlet borrowed = false;\n\tlet planner: BorrowedPlanner | undefined;\n\n\tif (\"auth\" in primaryAuth) {\n\t\tplanner = { model, budget: primaryBudget, auth: primaryAuth.auth };\n\t} else {\n\t\t// No request was made, but this candidate must not be retried.\n\t\tattempted.add(plannerAttemptKey({ model, budget: primaryBudget, auth: {} }));\n\t\tplanner = borrow ? await borrow(attempted, request.resolveAuth) : undefined;\n\t\tborrowed = planner !== undefined;\n\t}\n\n\twhile (planner) {\n\t\tconst attempt = await planWithTrimming(preparation, planner, plannerOptions);\n\t\tif (signal?.aborted) throw new Error(\"Compaction cancelled\");\n\t\tif (attempt.kind === \"planned\") {\n\t\t\tconst plannerModel = borrowed ? borrowedIdentity(planner) : undefined;\n\t\t\tif (plannerModel) {\n\t\t\t\t// Best-effort: the durable entry already records the borrowed model;\n\t\t\t\t// a sidecar write failure never affects compaction success.\n\t\t\t\twriteSuccessDiagnosticSidecar({\n\t\t\t\t\tsessionFilePath: request.sessionFilePath,\n\t\t\t\t\tmodel: planner.model,\n\t\t\t\t\tsuccessCategory: \"borrowed_planner\",\n\t\t\t\t\t...(plannerModel.thinkingLevel === undefined ? {} : { thinkingLevel: plannerModel.thinkingLevel }),\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn plannedResult(preparation, attempt.ranges, plannerModel);\n\t\t}\n\t\tlastTerminal = attempt.outcome;\n\t\tattempted.add(plannerAttemptKey(planner));\n\t\tplanner = borrow ? await borrow(attempted, request.resolveAuth) : undefined;\n\t\tborrowed = planner !== undefined;\n\t\tif (signal?.aborted) throw new Error(\"Compaction cancelled\");\n\t}\n\n\tif (request.urgency !== \"load_bearing\") throw terminalError(lastTerminal);\n\treturn freshResult(preparation, hardInputLimit);\n}\n"]}
1
+ {"version":3,"file":"compaction-runner.js","sourceRoot":"","sources":["../../../src/core/compaction/compaction-runner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { StreamFn, ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { RetryCallbacks, RetryPolicy } from \"@earendil-works/pi-ai\";\nimport type { Api, Model } from \"@earendil-works/pi-ai/compat\";\nimport { getKeptTailTokenEstimate } from \"./compaction-boundary.js\";\nimport type {\n\tBorrowedPlanner,\n\tCompactedTranscript,\n\tCompactionPlannerModel,\n\tCompactionUrgency,\n\tPlannerAuth,\n\tRawLineRange,\n\tVerbatimCompactionPreparation,\n} from \"./compaction-types.js\";\nimport { MIN_COMPACTABLE_REGION_LINES } from \"./compaction-types.js\";\nimport { reconstructCompactedTranscript, validateDeletedRanges } from \"./deleted-ranges.js\";\nimport {\n\ttype BorrowFallbackPlanner,\n\tcreateFallbackPlannerBorrower,\n\ttype FallbackPlannerContext,\n\tplannerAttemptKey,\n} from \"./fallback-planner.js\";\nimport type { TerminalPlannerOutcome } from \"./planner-outcome.js\";\nimport {\n\tMALFORMED_OUTPUT_MESSAGE,\n\tNO_USABLE_RANGES_MESSAGE,\n\tplanDeletedLineRanges,\n\tRangePlanError,\n\tresolvePlannerRequest,\n} from \"./range-planner.js\";\nimport { writeSuccessDiagnosticSidecar } from \"./range-planner-diagnostics.js\";\nimport { nextTrimOffset, rebaseTrimmedRanges, trimRegionHead } from \"./region-trimming.js\";\n\nexport interface CompactionPlanOptions {\n\tstreamFn: StreamFn;\n\t/** Absolute path of the persisted session file. Undefined for in-memory sessions. */\n\tsessionFilePath?: string;\n\tretry?: RetryPolicy;\n\tcallbacks?: RetryCallbacks;\n}\n\n/** One compaction run's request. Urgency is required; there is no default. */\nexport interface CompactionRunRequest extends CompactionPlanOptions {\n\t/** Per-model credentials; a borrowed candidate uses its own, never the session model's. */\n\tresolveAuth: (model: Model<Api>) => Promise<PlannerAuth | undefined>;\n\tsignal?: AbortSignal;\n\t/** Inherited by the planner and never modified across attempts. */\n\tthinkingLevel: ThinkingLevel | undefined;\n\turgency: CompactionUrgency;\n\t/** Configured fallback candidates. Omitted means borrowing is impossible. */\n\tfallback?: FallbackPlannerContext;\n}\n\nexport type CompactionRungResult = CompactedTranscript & {\n\trung: \"planned\" | \"fresh\";\n\t/** Present only when a borrowed fallback model ranked the lines. */\n\tplannerModel?: CompactionPlannerModel;\n\t/** False only when the fresh rung had to drop the protected tail. */\n\tkeptTail: boolean;\n};\n\n/** Runner-internal fresh-window build: the transcript plus the tail decision. */\ninterface FreshWindowBuild {\n\ttranscript: CompactedTranscript;\n\tkeptTail: boolean;\n}\n\n/**\n * Calculate the single global line threshold from the prepared setting.\n *\n * This is the untrimmed target. Overflow trimming does NOT reuse it:\n * `planWithTrimming` recomputes the threshold against each trimmed view, so the\n * planner is always asked to keep a proportion of the lines it actually\n * received rather than a proportion of a region it never saw.\n *\n * Retained as an exported helper for tests and consumers that need the\n * pre-trim target; production planning goes through `planWithTrimming`.\n */\nexport function targetKeepLines(preparation: VerbatimCompactionPreparation): number {\n\tconst region = preparation.region;\n\treturn Math.max(\n\t\tregion.protectedLineNumbers?.size ?? 0,\n\t\tMath.round(region.lines.length * preparation.parameters.compression_ratio),\n\t);\n}\n\nfunction hardInputLimitFor(model: Model<Api>): number {\n\treturn model.contextWindow > 0 ? model.contextWindow : Number.POSITIVE_INFINITY;\n}\n\nfunction withWholeContextStats(\n\tresult: CompactedTranscript,\n\tpreparation: VerbatimCompactionPreparation,\n\tkeptTail: boolean,\n): CompactedTranscript {\n\tconst tokensAfter = result.stats.tokensAfter + (keptTail ? getKeptTailTokenEstimate(preparation) : 0);\n\tconst percentReduction =\n\t\tpreparation.tokensBefore === 0 ? 0 : Math.round((1 - tokensAfter / preparation.tokensBefore) * 1000) / 10;\n\treturn {\n\t\t...result,\n\t\tstats: { ...result.stats, tokensBefore: preparation.tokensBefore, tokensAfter, percentReduction },\n\t};\n}\n\n/**\n * Build a fresh context window and the tail decision that goes with it.\n *\n * Private on purpose: `keptTail` is runner bookkeeping that persistence needs in\n * order to write `firstKeptEntryId: null` when the protected tail is dropped. It\n * is deliberately absent from the public door's return value, which is exactly a\n * `CompactedTranscript`.\n */\nfunction buildFreshTranscript(preparation: VerbatimCompactionPreparation): CompactedTranscript {\n\tconst region = preparation.region;\n\tconst whole: RawLineRange[] = region.lines.length > 0 ? [{ start: 1, end: region.lines.length }] : [];\n\treturn reconstructCompactedTranscript(region, validateDeletedRanges(whole, region));\n}\n\nfunction buildFreshContextWindow(preparation: VerbatimCompactionPreparation, hardInputLimit: number): FreshWindowBuild {\n\tconst limit = Number.isFinite(hardInputLimit) && hardInputLimit > 0 ? hardInputLimit : Number.POSITIVE_INFINITY;\n\t// The rule is \"tail under the limit ⇒ tail kept\", so the comparison is the\n\t// tail alone. Explicit protected lines are a hard floor that survives either\n\t// way, and counting the reconstructed protected/marker text here would drop a\n\t// tail that fits. A rebuilt context that still cannot be sent is the post-tool\n\t// gate's problem, not a reason for this rung to discard more.\n\treturn { transcript: buildFreshTranscript(preparation), keptTail: getKeptTailTokenEstimate(preparation) <= limit };\n}\n\n/**\n * Discard every compactable line and start a fresh context window.\n *\n * TOTAL. No provider, no credentials, no network, no signal, no failure mode,\n * no `Promise`. Port of codex `compact_token_budget` →\n * `Session::start_new_context_window`. Atomic's system prompt, context files,\n * and skills are rebuilt per request and were never in the transcript, so they\n * survive automatically.\n *\n * The whole region is emitted as one deletion range and handed to the unchanged\n * `validateDeletedRanges` → `reconstructCompactedTranscript` path, which splits\n * around protected spans and folds prior markers.\n *\n * Returns exactly a `CompactedTranscript` — `text`, `ranges`, `stats` and\n * nothing else. Whether the `preserve_recent` tail survives is a persistence\n * concern and travels on `CompactionRungResult.keptTail`, not on this door.\n */\nexport function startNewContextWindow(preparation: VerbatimCompactionPreparation): CompactedTranscript {\n\treturn buildFreshTranscript(preparation);\n}\n\nfunction plannedResult(\n\tpreparation: VerbatimCompactionPreparation,\n\tranges: RawLineRange[],\n\tplannerModel: CompactionPlannerModel | undefined,\n): CompactionRungResult {\n\tconst reconstructed = reconstructCompactedTranscript(\n\t\tpreparation.region,\n\t\tvalidateDeletedRanges(ranges, preparation.region),\n\t);\n\treturn {\n\t\t...withWholeContextStats(reconstructed, preparation, true),\n\t\trung: \"planned\",\n\t\t...(plannerModel ? { plannerModel } : {}),\n\t\tkeptTail: true,\n\t};\n}\n\nfunction borrowedIdentity(planner: BorrowedPlanner): CompactionPlannerModel {\n\treturn {\n\t\tprovider: planner.model.provider,\n\t\tid: planner.model.id,\n\t\t...(planner.budget.reasoning ? { thinkingLevel: planner.budget.reasoning } : {}),\n\t};\n}\n\nfunction terminalError(outcome: TerminalPlannerOutcome | undefined): RangePlanError {\n\tif (!outcome) return new RangePlanError(MALFORMED_OUTPUT_MESSAGE, 1, \"\", false);\n\tif (outcome.kind === \"rateLimited\") {\n\t\treturn new RangePlanError(outcome.message, 1, \"\", false, outcome.diagnosticPath, outcome);\n\t}\n\tif (outcome.kind === \"overflowed\") {\n\t\treturn new RangePlanError(\n\t\t\t\"Compaction range planning exceeded the model context window\",\n\t\t\t1,\n\t\t\t\"\",\n\t\t\ttrue,\n\t\t\toutcome.diagnosticPath,\n\t\t\toutcome,\n\t\t);\n\t}\n\tif (outcome.kind === \"providerError\") {\n\t\treturn new RangePlanError(outcome.message, 1, \"\", false, outcome.diagnosticPath, outcome);\n\t}\n\tconst message = outcome.category === \"malformed_output\" ? MALFORMED_OUTPUT_MESSAGE : NO_USABLE_RANGES_MESSAGE;\n\treturn new RangePlanError(message, 1, outcome.excerpt, false, outcome.diagnosticPath, outcome);\n}\n\ntype PlannerAttempt =\n\t| { kind: \"planned\"; ranges: RawLineRange[] }\n\t| { kind: \"terminal\"; outcome: TerminalPlannerOutcome };\n\n/**\n * Run one planner model, retrying the same model after oldest-first input\n * trimming when the request itself overflows the context window.\n *\n * Trimming continues until no strictly smaller view exists; `nextTrimOffset`\n * halves the remaining suffix, so the walk is finite. Only then is `overflowed`\n * terminal and the ladder advances.\n *\n * Each view gets its own keep target from `compression_ratio`. Reusing the\n * original whole-preparation target is what asked a halved 20-line region to\n * keep 10 of its 10 visible lines — a request for zero deletions, whose obedient\n * empty answer then hits the non-negotiable zero-range rejection. Extra\n * reduction still comes only from the head the runner withheld.\n */\nasync function planWithTrimming(\n\tpreparation: VerbatimCompactionPreparation,\n\tplanner: BorrowedPlanner,\n\toptions: CompactionPlanOptions & { signal?: AbortSignal },\n): Promise<PlannerAttempt> {\n\tlet offset = 0;\n\tfor (;;) {\n\t\tconst region = offset === 0 ? preparation.region : trimRegionHead(preparation.region, offset);\n\t\tif (!region) return { kind: \"terminal\", outcome: { kind: \"overflowed\" } };\n\t\tconst keepTarget = Math.max(\n\t\t\tregion.protectedLineNumbers?.size ?? 0,\n\t\t\tMath.round(region.lines.length * preparation.parameters.compression_ratio),\n\t\t);\n\t\tconst outcome = await planDeletedLineRanges(region, preparation.parameters, planner, keepTarget, options);\n\t\tif (outcome.kind === \"ranked\" || outcome.kind === \"recovered\") {\n\t\t\tif (offset === 0) return { kind: \"planned\", ranges: outcome.ranges };\n\t\t\tconst validated = validateDeletedRanges(outcome.ranges, region);\n\t\t\treturn { kind: \"planned\", ranges: rebaseTrimmedRanges(validated, offset) };\n\t\t}\n\t\tif (outcome.kind !== \"overflowed\") return { kind: \"terminal\", outcome };\n\t\tif (options.signal?.aborted) throw new Error(\"Compaction cancelled\");\n\t\tconst next = nextTrimOffset(preparation.region, offset);\n\t\tif (next === undefined) return { kind: \"terminal\", outcome };\n\t\toffset = next;\n\t}\n}\n\nconst MISSING_AUTH_MESSAGE = \"Compaction provider authentication is unavailable\";\n\n/**\n * A runner-local terminal cause with no provider attempt behind it.\n *\n * Missing credentials are not a provider outcome — no request was made — so no\n * synthetic response is fabricated and no diagnostic sidecar is written. It is\n * carried as `providerError` purely so the ladder can advance past it.\n */\nfunction authFailureOutcome(error: unknown): TerminalPlannerOutcome {\n\tconst message = error instanceof Error ? error.message : error === undefined ? MISSING_AUTH_MESSAGE : String(error);\n\treturn { kind: \"providerError\", message: message || MISSING_AUTH_MESSAGE };\n}\n\n/** Resolve one model's credentials, normalizing a rejection and `undefined` alike. */\nasync function resolvePlannerAuth(\n\tresolveAuth: CompactionRunRequest[\"resolveAuth\"],\n\tmodel: Model<Api>,\n): Promise<{ auth: PlannerAuth } | { failure: TerminalPlannerOutcome }> {\n\ttry {\n\t\tconst auth = await resolveAuth(model);\n\t\treturn auth ? { auth } : { failure: authFailureOutcome(undefined) };\n\t} catch (error) {\n\t\treturn { failure: authFailureOutcome(error) };\n\t}\n}\n\nfunction freshResult(preparation: VerbatimCompactionPreparation, hardInputLimit: number): CompactionRungResult {\n\tconst fresh = buildFreshContextWindow(preparation, hardInputLimit);\n\treturn {\n\t\t...withWholeContextStats(fresh.transcript, preparation, fresh.keptTail),\n\t\trung: \"fresh\",\n\t\tkeptTail: fresh.keptTail,\n\t};\n}\n\n/**\n * Produce one compacted transcript, tagged with the rung that produced it.\n *\n * The ladder is: the session model, then each configured fallback model\n * borrowed for one planner request, then — only under `load_bearing` urgency —\n * a fresh context window. A manual `/compact` runs at `recoverable` urgency and\n * therefore cannot reach the context-destroying rung; it fails honestly instead.\n *\n * Unavailable credentials are ladder control flow, not an early throw: a\n * borrowed candidate with its own working credentials can still rank the lines,\n * and a load-bearing caller still reaches the credential-free fresh rung.\n */\nexport async function runVerbatimCompaction(\n\tpreparation: VerbatimCompactionPreparation,\n\tmodel: Model<Api>,\n\trequest: CompactionRunRequest,\n): Promise<CompactionRungResult> {\n\tconst signal = request.signal;\n\tif (signal?.aborted) throw new Error(\"Compaction cancelled\");\n\tconst plannerOptions = {\n\t\tstreamFn: request.streamFn,\n\t\tsessionFilePath: request.sessionFilePath,\n\t\tretry: request.retry,\n\t\tcallbacks: request.callbacks,\n\t\tsignal,\n\t};\n\tconst hardInputLimit = hardInputLimitFor(model);\n\n\t// A region below the planner minimum cannot be made rankable by changing\n\t// models, so no planner is invoked. Only a load-bearing caller can reach a\n\t// preparation this small; recoverable callers were refused before the runner.\n\tif (preparation.region.lines.length < MIN_COMPACTABLE_REGION_LINES) {\n\t\tif (request.urgency !== \"load_bearing\") throw new RangePlanError(NO_USABLE_RANGES_MESSAGE, 0, \"\", false);\n\t\treturn freshResult(preparation, hardInputLimit);\n\t}\n\n\tconst attempted = new Set<string>();\n\t// One borrower per run owns the monotonic cursor, so the configured list is\n\t// walked exactly once no matter how many terminal outcomes occur.\n\tconst borrow: BorrowFallbackPlanner | undefined = request.fallback\n\t\t? createFallbackPlannerBorrower(request.fallback)\n\t\t: undefined;\n\tconst primaryBudget = resolvePlannerRequest(model, request.thinkingLevel);\n\tconst primaryAuth = await resolvePlannerAuth(request.resolveAuth, model);\n\tlet lastTerminal: TerminalPlannerOutcome | undefined = \"failure\" in primaryAuth ? primaryAuth.failure : undefined;\n\tlet borrowed = false;\n\tlet planner: BorrowedPlanner | undefined;\n\n\tif (\"auth\" in primaryAuth) {\n\t\tplanner = { model, budget: primaryBudget, auth: primaryAuth.auth };\n\t} else {\n\t\t// No request was made, but this candidate must not be retried.\n\t\tattempted.add(plannerAttemptKey({ model, budget: primaryBudget, auth: {} }));\n\t\tplanner = borrow ? await borrow(attempted, request.resolveAuth) : undefined;\n\t\tborrowed = planner !== undefined;\n\t}\n\n\twhile (planner) {\n\t\tconst attempt = await planWithTrimming(preparation, planner, plannerOptions);\n\t\tif (signal?.aborted) throw new Error(\"Compaction cancelled\");\n\t\tif (attempt.kind === \"planned\") {\n\t\t\tconst plannerModel = borrowed ? borrowedIdentity(planner) : undefined;\n\t\t\tif (plannerModel) {\n\t\t\t\t// Best-effort: the durable entry already records the borrowed model;\n\t\t\t\t// a sidecar write failure never affects compaction success.\n\t\t\t\twriteSuccessDiagnosticSidecar({\n\t\t\t\t\tsessionFilePath: request.sessionFilePath,\n\t\t\t\t\tmodel: planner.model,\n\t\t\t\t\tsuccessCategory: \"borrowed_planner\",\n\t\t\t\t\t...(plannerModel.thinkingLevel === undefined ? {} : { thinkingLevel: plannerModel.thinkingLevel }),\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn plannedResult(preparation, attempt.ranges, plannerModel);\n\t\t}\n\t\tlastTerminal = attempt.outcome;\n\t\tattempted.add(plannerAttemptKey(planner));\n\t\tplanner = borrow ? await borrow(attempted, request.resolveAuth) : undefined;\n\t\tborrowed = planner !== undefined;\n\t\tif (signal?.aborted) throw new Error(\"Compaction cancelled\");\n\t}\n\n\tif (request.urgency !== \"load_bearing\") throw terminalError(lastTerminal);\n\treturn freshResult(preparation, hardInputLimit);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/compaction.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,GAAG,EAAoB,KAAK,EAAE,MAAM,8BAA8B,CAAC;AACjF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG1D,MAAM,WAAW,kBAAkB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,gFAAgF;IAChF,iBAAiB,EAAE,MAAM,CAAC;IAC1B,+EAA+E;IAC/E,eAAe,EAAE,MAAM,CAAC;IACxB,+FAA+F;IAC/F,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,2BAA2B,EAAE,kBAKzC,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,CAYtE;AAgBD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,KAAK,GAAG,SAAS,CAShF;AAED,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAuBD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,oBAAoB,CA4BpF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAGjH;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAC1C,eAAO,MAAM,sBAAsB,QAAuC,CAAC;AAgC3E,mFAAmF;AACnF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,UAAO,GAAG,MAAM,CAIjF;AAYD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAOzF;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAE5F;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CA6B5D"}
1
+ {"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/compaction.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,GAAG,EAAoB,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAEjF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,WAAW,kBAAkB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,gFAAgF;IAChF,iBAAiB,EAAE,MAAM,CAAC;IAC1B,+EAA+E;IAC/E,eAAe,EAAE,MAAM,CAAC;IACxB,+FAA+F;IAC/F,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,2BAA2B,EAAE,kBAKzC,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,CAiBtE;AAgBD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,KAAK,GAAG,SAAS,CAShF;AAED,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAuBD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,oBAAoB,CA4BpF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAGjH;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAC1C,eAAO,MAAM,sBAAsB,QAAuC,CAAC;AAgC3E,mFAAmF;AACnF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,UAAO,GAAG,MAAM,CAIjF;AAYD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAOzF;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAE5F;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CA6B5D"}
@@ -27,7 +27,11 @@ export function calculateContextTokens(usage, api) {
27
27
  const hasComponents = input > 0 || output > 0 || cacheTokens > 0;
28
28
  if (!hasComponents)
29
29
  return Math.max(0, usage.totalTokens || 0);
30
- const cacheMirrorsInput = api === "anthropic-messages" && input > 0 && cacheTokens > 0 && cacheTokens >= input * 0.9 && cacheTokens <= input * 1.1;
30
+ const cacheMirrorsInput = api === "anthropic-messages" &&
31
+ input > 0 &&
32
+ cacheTokens > 0 &&
33
+ cacheTokens >= input * 0.9 &&
34
+ cacheTokens <= input * 1.1;
31
35
  const promptTokens = cacheMirrorsInput ? input : input + cacheTokens;
32
36
  return promptTokens + output;
33
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"compaction.js","sourceRoot":"","sources":["../../../src/core/compaction/compaction.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Neutral context-usage metrics for deciding when a session needs compaction.\n */\n\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { Api, AssistantMessage, Usage } from \"@earendil-works/pi-ai/compat\";\nimport type { SessionEntry } from \"../session-manager.ts\";\nimport { messageIsLlmVisible, userLikeContentBlockIsLlmVisible } from \"../messages.ts\";\n\nexport interface CompactionSettings {\n\tenabled: boolean;\n\treserveTokens: number;\n\t/** Fraction of compactable context to keep. 0.3 is aggressive, 0.7 is light. */\n\tcompression_ratio: number;\n\t/** Number of recent context-eligible messages to preserve in standard mode. */\n\tpreserve_recent: number;\n\t/** Focus query for relevance-based pruning; auto-detected when omitted in settings/options. */\n\tquery?: string;\n}\n\nexport const DEFAULT_COMPACTION_SETTINGS: CompactionSettings = {\n\tenabled: true,\n\treserveTokens: 16384,\n\tcompression_ratio: 0.5,\n\tpreserve_recent: 2,\n};\n\n/**\n * Calculate active context-window tokens from provider usage.\n *\n * Prefer normalized component fields over `totalTokens`: some providers expose\n * `totalTokens` as a billing/cumulative total, while the footer needs an active\n * context estimate. Some Anthropic-compatible endpoints mirror cached input in\n * both `input` and `cacheRead`/`cacheWrite`; only Anthropic Messages usage uses\n * the near-equal-bucket guard because OpenAI APIs expose disjoint normalized\n * components that must always be summed.\n */\nexport function calculateContextTokens(usage: Usage, api?: Api): number {\n\tconst input = Math.max(0, usage.input || 0);\n\tconst output = Math.max(0, usage.output || 0);\n\tconst cacheRead = Math.max(0, usage.cacheRead || 0);\n\tconst cacheWrite = Math.max(0, usage.cacheWrite || 0);\n\tconst cacheTokens = cacheRead + cacheWrite;\n\tconst hasComponents = input > 0 || output > 0 || cacheTokens > 0;\n\tif (!hasComponents) return Math.max(0, usage.totalTokens || 0);\n\n\tconst cacheMirrorsInput = api === \"anthropic-messages\" && input > 0 && cacheTokens > 0 && cacheTokens >= input * 0.9 && cacheTokens <= input * 1.1;\n\tconst promptTokens = cacheMirrorsInput ? input : input + cacheTokens;\n\treturn promptTokens + output;\n}\n\n/**\n * Get usage from an assistant message if available.\n * Skips aborted and error messages as they don't have valid usage data.\n */\nfunction getAssistantUsage(msg: AgentMessage): Usage | undefined {\n\tif (msg.role === \"assistant\" && \"usage\" in msg) {\n\t\tconst assistantMsg = msg as AssistantMessage;\n\t\tif (assistantMsg.stopReason !== \"aborted\" && assistantMsg.stopReason !== \"error\" && assistantMsg.usage) {\n\t\t\treturn assistantMsg.usage;\n\t\t}\n\t}\n\treturn undefined;\n}\n\n/**\n * Find the last non-aborted assistant message usage from session entries.\n */\nexport function getLastAssistantUsage(entries: SessionEntry[]): Usage | undefined {\n\tfor (let i = entries.length - 1; i >= 0; i--) {\n\t\tconst entry = entries[i];\n\t\tif (entry.type === \"message\") {\n\t\t\tconst usage = getAssistantUsage(entry.message);\n\t\t\tif (usage) return usage;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport interface ContextUsageEstimate {\n\ttokens: number;\n\tusageTokens: number;\n\ttrailingTokens: number;\n\tlastUsageIndex: number | null;\n}\n\nfunction getLastAssistantUsageInfo(messages: AgentMessage[]): { usage: Usage; api: Api; index: number } | undefined {\n\tlet latestPrefixTimestamp = Number.NEGATIVE_INFINITY;\n\tlet usageInfo: { usage: Usage; api: Api; index: number } | undefined;\n\n\tfor (let i = 0; i < messages.length; i++) {\n\t\tconst message = messages[i];\n\t\tconst usage = getAssistantUsage(message);\n\t\tif (\n\t\t\tusage &&\n\t\t\tmessage.role === \"assistant\" &&\n\t\t\tmessage.timestamp >= latestPrefixTimestamp &&\n\t\t\tcalculateContextTokens(usage, message.api) > 0\n\t\t) {\n\t\t\tusageInfo = { usage, api: message.api, index: i };\n\t\t}\n\t\tlatestPrefixTimestamp = Math.max(latestPrefixTimestamp, message.timestamp);\n\t}\n\n\treturn usageInfo;\n}\n\n/**\n * Estimate context tokens from messages, using the last assistant usage when available.\n * If there are messages after the last usage, estimate their tokens with estimateTokens.\n */\nexport function estimateContextTokens(messages: AgentMessage[]): ContextUsageEstimate {\n\tconst usageInfo = getLastAssistantUsageInfo(messages);\n\n\tif (!usageInfo) {\n\t\tlet estimated = 0;\n\t\tfor (const message of messages) {\n\t\t\testimated += estimateTokens(message);\n\t\t}\n\t\treturn {\n\t\t\ttokens: estimated,\n\t\t\tusageTokens: 0,\n\t\t\ttrailingTokens: estimated,\n\t\t\tlastUsageIndex: null,\n\t\t};\n\t}\n\n\tconst usageTokens = calculateContextTokens(usageInfo.usage, usageInfo.api);\n\tlet trailingTokens = 0;\n\tfor (let i = usageInfo.index + 1; i < messages.length; i++) {\n\t\ttrailingTokens += estimateTokens(messages[i]);\n\t}\n\n\treturn {\n\t\ttokens: usageTokens + trailingTokens,\n\t\tusageTokens,\n\t\ttrailingTokens,\n\t\tlastUsageIndex: usageInfo.index,\n\t};\n}\n\n/**\n * Check if compaction should trigger based on context usage.\n */\nexport function shouldCompact(contextTokens: number, contextWindow: number, settings: CompactionSettings): boolean {\n\tif (!settings.enabled) return false;\n\treturn contextTokens > contextWindow - settings.reserveTokens;\n}\n\n/**\n * Shared image-token estimation used by every compaction/context-accounting path.\n *\n * Providers fold image tokens into their reported prompt/input usage, so usage-based\n * accounting already captures actual image cost. For heuristic paths (trailing\n * messages without usage, transcript content-block estimates) a single conservative\n * fixed estimate keeps both the context-window threshold check and the transcript\n * planner consistent.\n */\nexport const ESTIMATED_IMAGE_CHARS = 4800;\nexport const ESTIMATED_IMAGE_TOKENS = Math.ceil(ESTIMATED_IMAGE_CHARS / 4);\n\nfunction safeSerializedPayloadLength(value: unknown, fallback: string): number {\n\ttry {\n\t\tconst serialized = JSON.stringify(value);\n\t\tif (typeof serialized === \"string\") return serialized.length;\n\t} catch {\n\t\t// Cyclic and otherwise unserializable future blocks use a conservative marker below.\n\t}\n\treturn fallback.length;\n}\n\nfunction nonEmptyBlockType(block: unknown): string | undefined {\n\tif (!block || typeof block !== \"object\") return undefined;\n\tconst type = (block as { type?: unknown }).type;\n\treturn typeof type === \"string\" && type.trim().length > 0 ? type : undefined;\n}\n\nfunction estimateContentBlockChars(block: unknown): number {\n\tconst type = nonEmptyBlockType(block);\n\tif (!type) return 0;\n\tconst record = block as Record<string, unknown>;\n\tif (type === \"image\") return ESTIMATED_IMAGE_CHARS;\n\tif (type === \"text\") return typeof record.text === \"string\" ? record.text.length : 0;\n\tif (type === \"thinking\") return typeof record.thinking === \"string\" ? record.thinking.length : 0;\n\tif (type === \"toolCall\") {\n\t\tconst nameLength = typeof record.name === \"string\" ? record.name.length : 0;\n\t\treturn nameLength + safeSerializedPayloadLength(record.arguments, \"[unserializable tool arguments]\");\n\t}\n\treturn safeSerializedPayloadLength(block, `[unserializable ${type} block]`);\n}\n\n/** Estimate one raw content block after the caller applies provider visibility. */\nexport function estimateContentBlockTokens(block: unknown, visible = true): number {\n\tif (!visible) return 0;\n\tconst chars = estimateContentBlockChars(block);\n\treturn chars > 0 ? Math.ceil(chars / 4) : 0;\n}\n\nfunction estimateUserLikeContentTokens(content: unknown): number {\n\tif (typeof content === \"string\") return content.trim().length > 0 ? Math.ceil(content.length / 4) : 0;\n\tif (!Array.isArray(content)) return 0;\n\tconst chars = content.reduce(\n\t\t(total, block) => total + (userLikeContentBlockIsLlmVisible(block) ? estimateContentBlockChars(block) : 0),\n\t\t0,\n\t);\n\treturn chars > 0 ? Math.ceil(chars / 4) : 0;\n}\n\n/**\n * Count image content blocks in a message content array (text or block array).\n *\n * Exported as the canonical image-counting contract so tests can verify the\n * heuristic independently of the transcript-based estimation used in production.\n */\nexport function countImageContentBlocks(content: string | Array<{ type: string }>): number {\n\tif (typeof content === \"string\" || !Array.isArray(content)) return 0;\n\tlet count = 0;\n\tfor (const block of content) {\n\t\tif (block && typeof block === \"object\" && block.type === \"image\") count += 1;\n\t}\n\treturn count;\n}\n\n/**\n * Estimate the token cost of only the image content blocks in a message content array.\n *\n * Exported as the canonical image-token-estimation contract so tests can verify\n * the heuristic independently of the transcript-based estimation used in production.\n */\nexport function estimateImageContentTokens(content: string | Array<{ type: string }>): number {\n\treturn countImageContentBlocks(content) * ESTIMATED_IMAGE_TOKENS;\n}\n\n/**\n * Estimate token count for a message using chars/4 heuristic.\n * This is conservative (overestimates tokens).\n */\nexport function estimateTokens(message: AgentMessage): number {\n\tif (!message || typeof message !== \"object\" || !messageIsLlmVisible(message)) return 0;\n\n\tswitch (message.role) {\n\t\tcase \"user\":\n\t\tcase \"custom\":\n\t\t\treturn estimateUserLikeContentTokens((message as { content?: unknown }).content);\n\t\tcase \"assistant\": {\n\t\t\tconst content = (message as { content?: unknown }).content;\n\t\t\tif (!Array.isArray(content)) return 0;\n\t\t\tconst chars = content.reduce((total, block) => total + estimateContentBlockChars(block), 0);\n\t\t\treturn chars > 0 ? Math.ceil(chars / 4) : 0;\n\t\t}\n\t\tcase \"toolResult\": {\n\t\t\tconst content = (message as { content?: unknown }).content;\n\t\t\tif (!Array.isArray(content)) return 0;\n\t\t\tconst chars = content.reduce((total, block) => total + estimateContentBlockChars(block), 0);\n\t\t\treturn chars > 0 ? Math.ceil(chars / 4) : 0;\n\t\t}\n\t\tcase \"bashExecution\": {\n\t\t\tconst command = typeof message.command === \"string\" ? message.command : \"\";\n\t\t\tconst output = typeof message.output === \"string\" ? message.output : \"\";\n\t\t\treturn Math.ceil((command.length + output.length) / 4);\n\t\t}\n\t\tcase \"branchSummary\":\n\t\t\treturn typeof message.summary === \"string\" ? Math.ceil(message.summary.length / 4) : 0;\n\t}\n\n\treturn 0;\n}\n"]}
1
+ {"version":3,"file":"compaction.js","sourceRoot":"","sources":["../../../src/core/compaction/compaction.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Neutral context-usage metrics for deciding when a session needs compaction.\n */\n\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { Api, AssistantMessage, Usage } from \"@earendil-works/pi-ai/compat\";\nimport { messageIsLlmVisible, userLikeContentBlockIsLlmVisible } from \"../messages.ts\";\nimport type { SessionEntry } from \"../session-manager.ts\";\n\nexport interface CompactionSettings {\n\tenabled: boolean;\n\treserveTokens: number;\n\t/** Fraction of compactable context to keep. 0.3 is aggressive, 0.7 is light. */\n\tcompression_ratio: number;\n\t/** Number of recent context-eligible messages to preserve in standard mode. */\n\tpreserve_recent: number;\n\t/** Focus query for relevance-based pruning; auto-detected when omitted in settings/options. */\n\tquery?: string;\n}\n\nexport const DEFAULT_COMPACTION_SETTINGS: CompactionSettings = {\n\tenabled: true,\n\treserveTokens: 16384,\n\tcompression_ratio: 0.5,\n\tpreserve_recent: 2,\n};\n\n/**\n * Calculate active context-window tokens from provider usage.\n *\n * Prefer normalized component fields over `totalTokens`: some providers expose\n * `totalTokens` as a billing/cumulative total, while the footer needs an active\n * context estimate. Some Anthropic-compatible endpoints mirror cached input in\n * both `input` and `cacheRead`/`cacheWrite`; only Anthropic Messages usage uses\n * the near-equal-bucket guard because OpenAI APIs expose disjoint normalized\n * components that must always be summed.\n */\nexport function calculateContextTokens(usage: Usage, api?: Api): number {\n\tconst input = Math.max(0, usage.input || 0);\n\tconst output = Math.max(0, usage.output || 0);\n\tconst cacheRead = Math.max(0, usage.cacheRead || 0);\n\tconst cacheWrite = Math.max(0, usage.cacheWrite || 0);\n\tconst cacheTokens = cacheRead + cacheWrite;\n\tconst hasComponents = input > 0 || output > 0 || cacheTokens > 0;\n\tif (!hasComponents) return Math.max(0, usage.totalTokens || 0);\n\n\tconst cacheMirrorsInput =\n\t\tapi === \"anthropic-messages\" &&\n\t\tinput > 0 &&\n\t\tcacheTokens > 0 &&\n\t\tcacheTokens >= input * 0.9 &&\n\t\tcacheTokens <= input * 1.1;\n\tconst promptTokens = cacheMirrorsInput ? input : input + cacheTokens;\n\treturn promptTokens + output;\n}\n\n/**\n * Get usage from an assistant message if available.\n * Skips aborted and error messages as they don't have valid usage data.\n */\nfunction getAssistantUsage(msg: AgentMessage): Usage | undefined {\n\tif (msg.role === \"assistant\" && \"usage\" in msg) {\n\t\tconst assistantMsg = msg as AssistantMessage;\n\t\tif (assistantMsg.stopReason !== \"aborted\" && assistantMsg.stopReason !== \"error\" && assistantMsg.usage) {\n\t\t\treturn assistantMsg.usage;\n\t\t}\n\t}\n\treturn undefined;\n}\n\n/**\n * Find the last non-aborted assistant message usage from session entries.\n */\nexport function getLastAssistantUsage(entries: SessionEntry[]): Usage | undefined {\n\tfor (let i = entries.length - 1; i >= 0; i--) {\n\t\tconst entry = entries[i];\n\t\tif (entry.type === \"message\") {\n\t\t\tconst usage = getAssistantUsage(entry.message);\n\t\t\tif (usage) return usage;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport interface ContextUsageEstimate {\n\ttokens: number;\n\tusageTokens: number;\n\ttrailingTokens: number;\n\tlastUsageIndex: number | null;\n}\n\nfunction getLastAssistantUsageInfo(messages: AgentMessage[]): { usage: Usage; api: Api; index: number } | undefined {\n\tlet latestPrefixTimestamp = Number.NEGATIVE_INFINITY;\n\tlet usageInfo: { usage: Usage; api: Api; index: number } | undefined;\n\n\tfor (let i = 0; i < messages.length; i++) {\n\t\tconst message = messages[i];\n\t\tconst usage = getAssistantUsage(message);\n\t\tif (\n\t\t\tusage &&\n\t\t\tmessage.role === \"assistant\" &&\n\t\t\tmessage.timestamp >= latestPrefixTimestamp &&\n\t\t\tcalculateContextTokens(usage, message.api) > 0\n\t\t) {\n\t\t\tusageInfo = { usage, api: message.api, index: i };\n\t\t}\n\t\tlatestPrefixTimestamp = Math.max(latestPrefixTimestamp, message.timestamp);\n\t}\n\n\treturn usageInfo;\n}\n\n/**\n * Estimate context tokens from messages, using the last assistant usage when available.\n * If there are messages after the last usage, estimate their tokens with estimateTokens.\n */\nexport function estimateContextTokens(messages: AgentMessage[]): ContextUsageEstimate {\n\tconst usageInfo = getLastAssistantUsageInfo(messages);\n\n\tif (!usageInfo) {\n\t\tlet estimated = 0;\n\t\tfor (const message of messages) {\n\t\t\testimated += estimateTokens(message);\n\t\t}\n\t\treturn {\n\t\t\ttokens: estimated,\n\t\t\tusageTokens: 0,\n\t\t\ttrailingTokens: estimated,\n\t\t\tlastUsageIndex: null,\n\t\t};\n\t}\n\n\tconst usageTokens = calculateContextTokens(usageInfo.usage, usageInfo.api);\n\tlet trailingTokens = 0;\n\tfor (let i = usageInfo.index + 1; i < messages.length; i++) {\n\t\ttrailingTokens += estimateTokens(messages[i]);\n\t}\n\n\treturn {\n\t\ttokens: usageTokens + trailingTokens,\n\t\tusageTokens,\n\t\ttrailingTokens,\n\t\tlastUsageIndex: usageInfo.index,\n\t};\n}\n\n/**\n * Check if compaction should trigger based on context usage.\n */\nexport function shouldCompact(contextTokens: number, contextWindow: number, settings: CompactionSettings): boolean {\n\tif (!settings.enabled) return false;\n\treturn contextTokens > contextWindow - settings.reserveTokens;\n}\n\n/**\n * Shared image-token estimation used by every compaction/context-accounting path.\n *\n * Providers fold image tokens into their reported prompt/input usage, so usage-based\n * accounting already captures actual image cost. For heuristic paths (trailing\n * messages without usage, transcript content-block estimates) a single conservative\n * fixed estimate keeps both the context-window threshold check and the transcript\n * planner consistent.\n */\nexport const ESTIMATED_IMAGE_CHARS = 4800;\nexport const ESTIMATED_IMAGE_TOKENS = Math.ceil(ESTIMATED_IMAGE_CHARS / 4);\n\nfunction safeSerializedPayloadLength(value: unknown, fallback: string): number {\n\ttry {\n\t\tconst serialized = JSON.stringify(value);\n\t\tif (typeof serialized === \"string\") return serialized.length;\n\t} catch {\n\t\t// Cyclic and otherwise unserializable future blocks use a conservative marker below.\n\t}\n\treturn fallback.length;\n}\n\nfunction nonEmptyBlockType(block: unknown): string | undefined {\n\tif (!block || typeof block !== \"object\") return undefined;\n\tconst type = (block as { type?: unknown }).type;\n\treturn typeof type === \"string\" && type.trim().length > 0 ? type : undefined;\n}\n\nfunction estimateContentBlockChars(block: unknown): number {\n\tconst type = nonEmptyBlockType(block);\n\tif (!type) return 0;\n\tconst record = block as Record<string, unknown>;\n\tif (type === \"image\") return ESTIMATED_IMAGE_CHARS;\n\tif (type === \"text\") return typeof record.text === \"string\" ? record.text.length : 0;\n\tif (type === \"thinking\") return typeof record.thinking === \"string\" ? record.thinking.length : 0;\n\tif (type === \"toolCall\") {\n\t\tconst nameLength = typeof record.name === \"string\" ? record.name.length : 0;\n\t\treturn nameLength + safeSerializedPayloadLength(record.arguments, \"[unserializable tool arguments]\");\n\t}\n\treturn safeSerializedPayloadLength(block, `[unserializable ${type} block]`);\n}\n\n/** Estimate one raw content block after the caller applies provider visibility. */\nexport function estimateContentBlockTokens(block: unknown, visible = true): number {\n\tif (!visible) return 0;\n\tconst chars = estimateContentBlockChars(block);\n\treturn chars > 0 ? Math.ceil(chars / 4) : 0;\n}\n\nfunction estimateUserLikeContentTokens(content: unknown): number {\n\tif (typeof content === \"string\") return content.trim().length > 0 ? Math.ceil(content.length / 4) : 0;\n\tif (!Array.isArray(content)) return 0;\n\tconst chars = content.reduce(\n\t\t(total, block) => total + (userLikeContentBlockIsLlmVisible(block) ? estimateContentBlockChars(block) : 0),\n\t\t0,\n\t);\n\treturn chars > 0 ? Math.ceil(chars / 4) : 0;\n}\n\n/**\n * Count image content blocks in a message content array (text or block array).\n *\n * Exported as the canonical image-counting contract so tests can verify the\n * heuristic independently of the transcript-based estimation used in production.\n */\nexport function countImageContentBlocks(content: string | Array<{ type: string }>): number {\n\tif (typeof content === \"string\" || !Array.isArray(content)) return 0;\n\tlet count = 0;\n\tfor (const block of content) {\n\t\tif (block && typeof block === \"object\" && block.type === \"image\") count += 1;\n\t}\n\treturn count;\n}\n\n/**\n * Estimate the token cost of only the image content blocks in a message content array.\n *\n * Exported as the canonical image-token-estimation contract so tests can verify\n * the heuristic independently of the transcript-based estimation used in production.\n */\nexport function estimateImageContentTokens(content: string | Array<{ type: string }>): number {\n\treturn countImageContentBlocks(content) * ESTIMATED_IMAGE_TOKENS;\n}\n\n/**\n * Estimate token count for a message using chars/4 heuristic.\n * This is conservative (overestimates tokens).\n */\nexport function estimateTokens(message: AgentMessage): number {\n\tif (!message || typeof message !== \"object\" || !messageIsLlmVisible(message)) return 0;\n\n\tswitch (message.role) {\n\t\tcase \"user\":\n\t\tcase \"custom\":\n\t\t\treturn estimateUserLikeContentTokens((message as { content?: unknown }).content);\n\t\tcase \"assistant\": {\n\t\t\tconst content = (message as { content?: unknown }).content;\n\t\t\tif (!Array.isArray(content)) return 0;\n\t\t\tconst chars = content.reduce((total, block) => total + estimateContentBlockChars(block), 0);\n\t\t\treturn chars > 0 ? Math.ceil(chars / 4) : 0;\n\t\t}\n\t\tcase \"toolResult\": {\n\t\t\tconst content = (message as { content?: unknown }).content;\n\t\t\tif (!Array.isArray(content)) return 0;\n\t\t\tconst chars = content.reduce((total, block) => total + estimateContentBlockChars(block), 0);\n\t\t\treturn chars > 0 ? Math.ceil(chars / 4) : 0;\n\t\t}\n\t\tcase \"bashExecution\": {\n\t\t\tconst command = typeof message.command === \"string\" ? message.command : \"\";\n\t\t\tconst output = typeof message.output === \"string\" ? message.output : \"\";\n\t\t\treturn Math.ceil((command.length + output.length) / 4);\n\t\t}\n\t\tcase \"branchSummary\":\n\t\t\treturn typeof message.summary === \"string\" ? Math.ceil(message.summary.length / 4) : 0;\n\t}\n\n\treturn 0;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"deleted-ranges.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/deleted-ranges.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,mBAAmB,EAEnB,cAAc,EAEd,YAAY,EACZ,eAAe,EACf,MAAM,uBAAuB,CAAC;AA+B/B,4FAA4F;AAC5F,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,cAAc,GAAG,eAAe,CAiBlG;AAmDD,yEAAyE;AACzE,wBAAgB,8BAA8B,CAC7C,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,eAAe,GACrB,mBAAmB,CA6BrB"}
1
+ {"version":3,"file":"deleted-ranges.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/deleted-ranges.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,mBAAmB,EAEnB,cAAc,EAEd,YAAY,EACZ,eAAe,EACf,MAAM,uBAAuB,CAAC;AA+B/B,4FAA4F;AAC5F,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,cAAc,GAAG,eAAe,CAiBlG;AAmDD,yEAAyE;AACzE,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,eAAe,GAAG,mBAAmB,CA6BnH"}
@@ -1 +1 @@
1
- {"version":3,"file":"deleted-ranges.js","sourceRoot":"","sources":["../../../src/core/compaction/deleted-ranges.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tCompactedTranscript,\n\tLineRange,\n\tNumberedRegion,\n\tRawLineEndpoint,\n\tRawLineRange,\n\tValidatedRanges,\n} from \"./compaction-types.js\";\nimport { filteredMarker } from \"./transcript-serialization.js\";\n\nfunction coerceEndpoint(value: RawLineEndpoint | undefined): number | undefined {\n\tif (value === undefined) return undefined;\n\tconst number = Number(value);\n\treturn Number.isFinite(number) ? Math.trunc(number) : undefined;\n}\n\nfunction mergeRanges(ranges: LineRange[]): LineRange[] {\n\tconst merged: LineRange[] = [];\n\tfor (const range of ranges) {\n\t\tconst current = merged[merged.length - 1];\n\t\tif (current && range.start <= current.end + 1) current.end = Math.max(current.end, range.end);\n\t\telse merged.push({ ...range });\n\t}\n\treturn merged;\n}\n\nfunction splitAroundProtected(range: LineRange, protectedLines: ReadonlySet<number>): LineRange[] {\n\tconst fragments: LineRange[] = [];\n\tlet start = range.start;\n\tfor (let line = range.start; line <= range.end; line++) {\n\t\tif (!protectedLines.has(line)) continue;\n\t\tif (start < line) fragments.push({ start, end: line - 1 });\n\t\tstart = line + 1;\n\t}\n\tif (start <= range.end) fragments.push({ start, end: range.end });\n\treturn fragments;\n}\n\n/** Normalize untrusted model ranges into the sole range type accepted by reconstruction. */\nexport function validateDeletedRanges(raw: RawLineRange[], region: NumberedRegion): ValidatedRanges {\n\tconst totalLines = region.lines.length;\n\tconst normalized: LineRange[] = [];\n\tfor (const candidate of raw) {\n\t\tlet start = coerceEndpoint(candidate.start);\n\t\tlet end = coerceEndpoint(candidate.end);\n\t\tif (start === undefined || end === undefined) continue;\n\t\tif (start > end) [start, end] = [end, start];\n\t\tstart = Math.max(1, start);\n\t\tend = Math.min(totalLines, end);\n\t\tif (start <= end) normalized.push({ start, end });\n\t}\n\tnormalized.sort((left, right) => left.start - right.start || left.end - right.end);\n\n\tconst protectedLines = new Set(region.protectedLineNumbers ?? []);\n\tconst split = mergeRanges(normalized).flatMap((range) => splitAroundProtected(range, protectedLines));\n\treturn Object.assign(split, { __brand: \"ValidatedRanges\" as const });\n}\n\nfunction rangesToDeletedLines(ranges: ValidatedRanges, lineCount: number): boolean[] {\n\tconst deleted = Array.from({ length: lineCount }, () => false);\n\tfor (const range of ranges) {\n\t\tfor (let line = range.start; line <= range.end; line++) deleted[line - 1] = true;\n\t}\n\treturn deleted;\n}\n\nfunction foldAdjacentMarkers(region: NumberedRegion, ranges: ValidatedRanges): LineRange[] {\n\tconst deleted = rangesToDeletedLines(ranges, region.lines.length);\n\tlet changed = true;\n\twhile (changed) {\n\t\tchanged = false;\n\t\tfor (const lineNumber of region.priorMarkerNs.keys()) {\n\t\t\tconst index = lineNumber - 1;\n\t\t\tif (deleted[index]) continue;\n\t\t\tconst previousDeleted = index > 0 ? (deleted[index - 1] ?? false) : false;\n\t\t\tconst nextDeleted = index + 1 < deleted.length ? (deleted[index + 1] ?? false) : false;\n\t\t\tif (previousDeleted || nextDeleted) {\n\t\t\t\tdeleted[index] = true;\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst folded: LineRange[] = [];\n\tlet start: number | undefined;\n\tfor (let index = 0; index <= deleted.length; index++) {\n\t\t// Sentinel iteration at index === deleted.length: treat as not deleted so a\n\t\t// trailing open range closes without reading past the array bounds.\n\t\tconst isDeleted = index < deleted.length ? (deleted[index] ?? false) : false;\n\t\tif (isDeleted && start === undefined) start = index + 1;\n\t\tif (!isDeleted && start !== undefined) {\n\t\t\tfolded.push({ start, end: index });\n\t\t\tstart = undefined;\n\t\t}\n\t}\n\treturn folded;\n}\n\nfunction cumulativeDeletedCount(region: NumberedRegion, range: LineRange): number {\n\tlet count = range.end - range.start + 1;\n\tfor (let line = range.start; line <= range.end; line++) {\n\t\tconst priorCount = region.priorMarkerNs.get(line);\n\t\tif (priorCount !== undefined) count += priorCount - 1;\n\t}\n\treturn count;\n}\n\n/** Rebuild a compacted transcript mechanically from validated ranges. */\nexport function reconstructCompactedTranscript(\n\tregion: NumberedRegion,\n\tranges: ValidatedRanges,\n): CompactedTranscript {\n\tconst finalRanges = foldAdjacentMarkers(region, ranges);\n\tconst output: string[] = [];\n\tlet line = 1;\n\tfor (const range of finalRanges) {\n\t\twhile (line < range.start) output.push(region.lines[line++ - 1]);\n\t\toutput.push(filteredMarker(cumulativeDeletedCount(region, range)));\n\t\tline = range.end + 1;\n\t}\n\twhile (line <= region.lines.length) output.push(region.lines[line++ - 1]);\n\n\tconst text = output.join(\"\\n\");\n\tconst linesDeleted = finalRanges.reduce((total, range) => total + range.end - range.start + 1, 0);\n\tconst tokensAfter = Math.ceil(text.length / 4);\n\tconst percentReduction =\n\t\tregion.tokenEstimate === 0 ? 0 : Math.round((1 - tokensAfter / region.tokenEstimate) * 1000) / 10;\n\treturn {\n\t\ttext,\n\t\tranges: finalRanges,\n\t\tstats: {\n\t\t\tlinesBefore: region.lines.length,\n\t\t\tlinesDeleted,\n\t\t\tlinesKept: region.lines.length - linesDeleted,\n\t\t\trangeCount: finalRanges.length,\n\t\t\ttokensBefore: region.tokenEstimate,\n\t\t\ttokensAfter,\n\t\t\tpercentReduction,\n\t\t},\n\t};\n}\n"]}
1
+ {"version":3,"file":"deleted-ranges.js","sourceRoot":"","sources":["../../../src/core/compaction/deleted-ranges.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tCompactedTranscript,\n\tLineRange,\n\tNumberedRegion,\n\tRawLineEndpoint,\n\tRawLineRange,\n\tValidatedRanges,\n} from \"./compaction-types.js\";\nimport { filteredMarker } from \"./transcript-serialization.js\";\n\nfunction coerceEndpoint(value: RawLineEndpoint | undefined): number | undefined {\n\tif (value === undefined) return undefined;\n\tconst number = Number(value);\n\treturn Number.isFinite(number) ? Math.trunc(number) : undefined;\n}\n\nfunction mergeRanges(ranges: LineRange[]): LineRange[] {\n\tconst merged: LineRange[] = [];\n\tfor (const range of ranges) {\n\t\tconst current = merged[merged.length - 1];\n\t\tif (current && range.start <= current.end + 1) current.end = Math.max(current.end, range.end);\n\t\telse merged.push({ ...range });\n\t}\n\treturn merged;\n}\n\nfunction splitAroundProtected(range: LineRange, protectedLines: ReadonlySet<number>): LineRange[] {\n\tconst fragments: LineRange[] = [];\n\tlet start = range.start;\n\tfor (let line = range.start; line <= range.end; line++) {\n\t\tif (!protectedLines.has(line)) continue;\n\t\tif (start < line) fragments.push({ start, end: line - 1 });\n\t\tstart = line + 1;\n\t}\n\tif (start <= range.end) fragments.push({ start, end: range.end });\n\treturn fragments;\n}\n\n/** Normalize untrusted model ranges into the sole range type accepted by reconstruction. */\nexport function validateDeletedRanges(raw: RawLineRange[], region: NumberedRegion): ValidatedRanges {\n\tconst totalLines = region.lines.length;\n\tconst normalized: LineRange[] = [];\n\tfor (const candidate of raw) {\n\t\tlet start = coerceEndpoint(candidate.start);\n\t\tlet end = coerceEndpoint(candidate.end);\n\t\tif (start === undefined || end === undefined) continue;\n\t\tif (start > end) [start, end] = [end, start];\n\t\tstart = Math.max(1, start);\n\t\tend = Math.min(totalLines, end);\n\t\tif (start <= end) normalized.push({ start, end });\n\t}\n\tnormalized.sort((left, right) => left.start - right.start || left.end - right.end);\n\n\tconst protectedLines = new Set(region.protectedLineNumbers ?? []);\n\tconst split = mergeRanges(normalized).flatMap((range) => splitAroundProtected(range, protectedLines));\n\treturn Object.assign(split, { __brand: \"ValidatedRanges\" as const });\n}\n\nfunction rangesToDeletedLines(ranges: ValidatedRanges, lineCount: number): boolean[] {\n\tconst deleted = Array.from({ length: lineCount }, () => false);\n\tfor (const range of ranges) {\n\t\tfor (let line = range.start; line <= range.end; line++) deleted[line - 1] = true;\n\t}\n\treturn deleted;\n}\n\nfunction foldAdjacentMarkers(region: NumberedRegion, ranges: ValidatedRanges): LineRange[] {\n\tconst deleted = rangesToDeletedLines(ranges, region.lines.length);\n\tlet changed = true;\n\twhile (changed) {\n\t\tchanged = false;\n\t\tfor (const lineNumber of region.priorMarkerNs.keys()) {\n\t\t\tconst index = lineNumber - 1;\n\t\t\tif (deleted[index]) continue;\n\t\t\tconst previousDeleted = index > 0 ? (deleted[index - 1] ?? false) : false;\n\t\t\tconst nextDeleted = index + 1 < deleted.length ? (deleted[index + 1] ?? false) : false;\n\t\t\tif (previousDeleted || nextDeleted) {\n\t\t\t\tdeleted[index] = true;\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst folded: LineRange[] = [];\n\tlet start: number | undefined;\n\tfor (let index = 0; index <= deleted.length; index++) {\n\t\t// Sentinel iteration at index === deleted.length: treat as not deleted so a\n\t\t// trailing open range closes without reading past the array bounds.\n\t\tconst isDeleted = index < deleted.length ? (deleted[index] ?? false) : false;\n\t\tif (isDeleted && start === undefined) start = index + 1;\n\t\tif (!isDeleted && start !== undefined) {\n\t\t\tfolded.push({ start, end: index });\n\t\t\tstart = undefined;\n\t\t}\n\t}\n\treturn folded;\n}\n\nfunction cumulativeDeletedCount(region: NumberedRegion, range: LineRange): number {\n\tlet count = range.end - range.start + 1;\n\tfor (let line = range.start; line <= range.end; line++) {\n\t\tconst priorCount = region.priorMarkerNs.get(line);\n\t\tif (priorCount !== undefined) count += priorCount - 1;\n\t}\n\treturn count;\n}\n\n/** Rebuild a compacted transcript mechanically from validated ranges. */\nexport function reconstructCompactedTranscript(region: NumberedRegion, ranges: ValidatedRanges): CompactedTranscript {\n\tconst finalRanges = foldAdjacentMarkers(region, ranges);\n\tconst output: string[] = [];\n\tlet line = 1;\n\tfor (const range of finalRanges) {\n\t\twhile (line < range.start) output.push(region.lines[line++ - 1]);\n\t\toutput.push(filteredMarker(cumulativeDeletedCount(region, range)));\n\t\tline = range.end + 1;\n\t}\n\twhile (line <= region.lines.length) output.push(region.lines[line++ - 1]);\n\n\tconst text = output.join(\"\\n\");\n\tconst linesDeleted = finalRanges.reduce((total, range) => total + range.end - range.start + 1, 0);\n\tconst tokensAfter = Math.ceil(text.length / 4);\n\tconst percentReduction =\n\t\tregion.tokenEstimate === 0 ? 0 : Math.round((1 - tokensAfter / region.tokenEstimate) * 1000) / 10;\n\treturn {\n\t\ttext,\n\t\tranges: finalRanges,\n\t\tstats: {\n\t\t\tlinesBefore: region.lines.length,\n\t\t\tlinesDeleted,\n\t\t\tlinesKept: region.lines.length - linesDeleted,\n\t\t\trangeCount: finalRanges.length,\n\t\t\ttokensBefore: region.tokenEstimate,\n\t\t\ttokensAfter,\n\t\t\tpercentReduction,\n\t\t},\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"fallback-planner.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/fallback-planner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAqC,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACpG,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAG1E;;;;;;;GAOG;AACH,MAAM,WAAW,sBAAsB;IACtC,qEAAqE;IACrE,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,kEAAkE;IAClE,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,iEAAiE;IACjE,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/C,2EAA2E;IAC3E,QAAQ,CAAC,oBAAoB,EAAE,aAAa,GAAG,SAAS,CAAC;CACzD;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAElE;AAeD,+EAA+E;AAC/E,MAAM,MAAM,qBAAqB,GAAG,CACnC,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,EAC9B,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,KAChE,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC;AAE1C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,sBAAsB,GAAG,qBAAqB,CA6BpG"}
1
+ {"version":3,"file":"fallback-planner.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/fallback-planner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,KAAK,mBAAmB,EAAqC,MAAM,uBAAuB,CAAC;AACpG,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAG1E;;;;;;;GAOG;AACH,MAAM,WAAW,sBAAsB;IACtC,qEAAqE;IACrE,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,kEAAkE;IAClE,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,iEAAiE;IACjE,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/C,2EAA2E;IAC3E,QAAQ,CAAC,oBAAoB,EAAE,aAAa,GAAG,SAAS,CAAC;CACzD;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAElE;AAeD,+EAA+E;AAC/E,MAAM,MAAM,qBAAqB,GAAG,CACnC,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,EAC9B,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,KAChE,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC;AAE1C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,sBAAsB,GAAG,qBAAqB,CA6BpG"}
@@ -1 +1 @@
1
- {"version":3,"file":"fallback-planner.js","sourceRoot":"","sources":["../../../src/core/compaction/fallback-planner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAA4B,MAAM,uBAAuB,CAAC;AAEpG,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAqB3D;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAwB;IACzD,OAAO,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAC7D,CAAC;AAqBD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,6BAA6B,CAAC,OAA+B;IAC5E,MAAM,IAAI,GAAwB,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAU,EAAE,CAAC;IAChF,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE;QACvC,OAAO,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;YACvD,MAAM,KAAK,GAAG,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACrD,mEAAmE;YACnE,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;YAEpB,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;YAC3F,IAAI,CAAC,SAAS;gBAAE,SAAS;YACzB,kEAAkE;YAClE,iDAAiD;YACjD,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,oBAAoB,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC;YAC7G,MAAM,GAAG,GAAG,WAAW,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YAC3D,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC3D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAEvB,IAAI,IAA6B,CAAC;YAClC,IAAI,CAAC;gBACJ,IAAI,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC;YAAC,MAAM,CAAC;gBACR,uEAAuE;gBACvE,IAAI,GAAG,SAAS,CAAC;YAClB,CAAC;YACD,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACjD,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC,CAAC;AACH,CAAC","sourcesContent":["/**\n * Borrow a configured fallback model for one compaction planner request.\n *\n * This is deliberately a *weaker* capability than main-chat model fallback. The\n * borrowing door returns a `BorrowedPlanner` **value**: it holds no session\n * handle, so it cannot write `agent.state.model`, append a model-change entry,\n * change the session thinking level, refresh the system prompt, emit\n * `model_changed`/`model_select`, or call `agent.continue()`.\n * `_trySwitchToFallbackModel` does all of those and is not reused or modified.\n *\n * The attempted-key set belongs to the compaction run and is read-only here, so\n * borrowing never touches the main chat's `_fallbackAttemptedKeys`.\n */\n\nimport type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Api, Model } from \"@earendil-works/pi-ai/compat\";\nimport { fallbackKey, resolveFallbackModel, type FallbackModelLookup } from \"../fallback-models.js\";\nimport type { BorrowedPlanner, PlannerAuth } from \"./compaction-types.js\";\nimport { resolvePlannerRequest } from \"./range-planner.js\";\n\n/**\n * Everything candidate selection needs.\n *\n * The RFC's §5.1 signature takes only `attempted` and `resolveAuth`, which\n * cannot select a candidate on its own: it names no fallback list, no model\n * registry, no preferred provider, and no inherited reasoning level. Those\n * inputs travel in this context object rather than through hidden state.\n */\nexport interface FallbackPlannerContext {\n\t/** The session's effective `fallbackModels`, in configured order. */\n\treadonly fallbackModels: readonly string[];\n\t/** Model registry used to resolve and authenticate candidates. */\n\treadonly registry: FallbackModelLookup;\n\t/** Provider preferred when an unqualified entry is ambiguous. */\n\treadonly preferredProvider: string | undefined;\n\t/** Session level inherited when a candidate carries no `:level` suffix. */\n\treadonly sessionThinkingLevel: ThinkingLevel | undefined;\n}\n\n/**\n * Identity of one planner attempt: `provider/model:<effective reasoning>`.\n *\n * The key must be derived from the *effective* level the request will carry,\n * not from the raw optional `model:level` suffix. An unsuffixed entry for the\n * session model inherits the session level, so keying it as `provider/model:`\n * would let the identical request run a second time.\n */\nexport function plannerAttemptKey(planner: BorrowedPlanner): string {\n\treturn fallbackKey(planner.model, planner.budget.reasoning);\n}\n\n/**\n * Run-local traversal state for one compaction's fallback walk.\n *\n * Kept out of the borrower's arguments and out of module scope: concurrent\n * compactions each own one of these, so nothing is shared.\n */\ninterface FallbackPlannerWalk {\n\t/** Next configured list position to inspect. Only ever advances. */\n\tnextIndex: number;\n\t/** Effective `provider/model:level` identities already inspected this run. */\n\tconsumed: Set<string>;\n}\n\n/** The exact two-argument borrowing door, bound to one run's configuration. */\nexport type BorrowFallbackPlanner = (\n\tattempted: ReadonlySet<string>,\n\tresolveAuth: (model: Model<Api>) => Promise<PlannerAuth | undefined>,\n) => Promise<BorrowedPlanner | undefined>;\n\n/**\n * Build the borrowing door for one compaction run.\n *\n * The RFC's top-level two-argument signature names no fallback list, registry,\n * preferred provider, inherited reasoning level, or traversal cursor, so a\n * stateless exported function cannot select a candidate without hidden shared\n * state — unsafe under concurrent compactions. Binding the configuration and the\n * run-local cursor in a closure keeps the returned door exactly two arguments\n * while `attempted` stays a `ReadonlySet` the borrower never writes.\n *\n * The walk is one monotonic pass. Each list position is inspected at most once,\n * whether it fails to resolve, has no usable credentials, duplicates an earlier\n * identity, or yields a planner. Without the cursor, an entry that could not\n * resolve earlier could be returned after a later candidate once the registry\n * changed, producing a B→A order the configured list never asked for.\n */\nexport function createFallbackPlannerBorrower(context: FallbackPlannerContext): BorrowFallbackPlanner {\n\tconst walk: FallbackPlannerWalk = { nextIndex: 0, consumed: new Set<string>() };\n\treturn async (attempted, resolveAuth) => {\n\t\twhile (walk.nextIndex < context.fallbackModels.length) {\n\t\t\tconst entry = context.fallbackModels[walk.nextIndex];\n\t\t\t// Advance before any work: this list position is spent either way.\n\t\t\twalk.nextIndex += 1;\n\n\t\t\tconst candidate = resolveFallbackModel(entry, context.registry, context.preferredProvider);\n\t\t\tif (!candidate) continue;\n\t\t\t// Resolve the budget first: the identity depends on the effective\n\t\t\t// reasoning level, which inheritance may supply.\n\t\t\tconst budget = resolvePlannerRequest(candidate.model, context.sessionThinkingLevel, candidate.thinkingLevel);\n\t\t\tconst key = fallbackKey(candidate.model, budget.reasoning);\n\t\t\tif (attempted.has(key) || walk.consumed.has(key)) continue;\n\t\t\twalk.consumed.add(key);\n\n\t\t\tlet auth: PlannerAuth | undefined;\n\t\t\ttry {\n\t\t\t\tauth = await resolveAuth(candidate.model);\n\t\t\t} catch {\n\t\t\t\t// A candidate whose credentials cannot be resolved is simply unusable.\n\t\t\t\tauth = undefined;\n\t\t\t}\n\t\t\tif (!auth) continue;\n\t\t\treturn { model: candidate.model, budget, auth };\n\t\t}\n\t\treturn undefined;\n\t};\n}\n"]}
1
+ {"version":3,"file":"fallback-planner.js","sourceRoot":"","sources":["../../../src/core/compaction/fallback-planner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAA4B,WAAW,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAEpG,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAqB3D;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAwB;IACzD,OAAO,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAC7D,CAAC;AAqBD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,6BAA6B,CAAC,OAA+B;IAC5E,MAAM,IAAI,GAAwB,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAU,EAAE,CAAC;IAChF,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE;QACvC,OAAO,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;YACvD,MAAM,KAAK,GAAG,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACrD,mEAAmE;YACnE,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;YAEpB,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;YAC3F,IAAI,CAAC,SAAS;gBAAE,SAAS;YACzB,kEAAkE;YAClE,iDAAiD;YACjD,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,oBAAoB,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC;YAC7G,MAAM,GAAG,GAAG,WAAW,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YAC3D,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC3D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAEvB,IAAI,IAA6B,CAAC;YAClC,IAAI,CAAC;gBACJ,IAAI,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC;YAAC,MAAM,CAAC;gBACR,uEAAuE;gBACvE,IAAI,GAAG,SAAS,CAAC;YAClB,CAAC;YACD,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACjD,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC,CAAC;AACH,CAAC","sourcesContent":["/**\n * Borrow a configured fallback model for one compaction planner request.\n *\n * This is deliberately a *weaker* capability than main-chat model fallback. The\n * borrowing door returns a `BorrowedPlanner` **value**: it holds no session\n * handle, so it cannot write `agent.state.model`, append a model-change entry,\n * change the session thinking level, refresh the system prompt, emit\n * `model_changed`/`model_select`, or call `agent.continue()`.\n * `_trySwitchToFallbackModel` does all of those and is not reused or modified.\n *\n * The attempted-key set belongs to the compaction run and is read-only here, so\n * borrowing never touches the main chat's `_fallbackAttemptedKeys`.\n */\n\nimport type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Api, Model } from \"@earendil-works/pi-ai/compat\";\nimport { type FallbackModelLookup, fallbackKey, resolveFallbackModel } from \"../fallback-models.js\";\nimport type { BorrowedPlanner, PlannerAuth } from \"./compaction-types.js\";\nimport { resolvePlannerRequest } from \"./range-planner.js\";\n\n/**\n * Everything candidate selection needs.\n *\n * The RFC's §5.1 signature takes only `attempted` and `resolveAuth`, which\n * cannot select a candidate on its own: it names no fallback list, no model\n * registry, no preferred provider, and no inherited reasoning level. Those\n * inputs travel in this context object rather than through hidden state.\n */\nexport interface FallbackPlannerContext {\n\t/** The session's effective `fallbackModels`, in configured order. */\n\treadonly fallbackModels: readonly string[];\n\t/** Model registry used to resolve and authenticate candidates. */\n\treadonly registry: FallbackModelLookup;\n\t/** Provider preferred when an unqualified entry is ambiguous. */\n\treadonly preferredProvider: string | undefined;\n\t/** Session level inherited when a candidate carries no `:level` suffix. */\n\treadonly sessionThinkingLevel: ThinkingLevel | undefined;\n}\n\n/**\n * Identity of one planner attempt: `provider/model:<effective reasoning>`.\n *\n * The key must be derived from the *effective* level the request will carry,\n * not from the raw optional `model:level` suffix. An unsuffixed entry for the\n * session model inherits the session level, so keying it as `provider/model:`\n * would let the identical request run a second time.\n */\nexport function plannerAttemptKey(planner: BorrowedPlanner): string {\n\treturn fallbackKey(planner.model, planner.budget.reasoning);\n}\n\n/**\n * Run-local traversal state for one compaction's fallback walk.\n *\n * Kept out of the borrower's arguments and out of module scope: concurrent\n * compactions each own one of these, so nothing is shared.\n */\ninterface FallbackPlannerWalk {\n\t/** Next configured list position to inspect. Only ever advances. */\n\tnextIndex: number;\n\t/** Effective `provider/model:level` identities already inspected this run. */\n\tconsumed: Set<string>;\n}\n\n/** The exact two-argument borrowing door, bound to one run's configuration. */\nexport type BorrowFallbackPlanner = (\n\tattempted: ReadonlySet<string>,\n\tresolveAuth: (model: Model<Api>) => Promise<PlannerAuth | undefined>,\n) => Promise<BorrowedPlanner | undefined>;\n\n/**\n * Build the borrowing door for one compaction run.\n *\n * The RFC's top-level two-argument signature names no fallback list, registry,\n * preferred provider, inherited reasoning level, or traversal cursor, so a\n * stateless exported function cannot select a candidate without hidden shared\n * state — unsafe under concurrent compactions. Binding the configuration and the\n * run-local cursor in a closure keeps the returned door exactly two arguments\n * while `attempted` stays a `ReadonlySet` the borrower never writes.\n *\n * The walk is one monotonic pass. Each list position is inspected at most once,\n * whether it fails to resolve, has no usable credentials, duplicates an earlier\n * identity, or yields a planner. Without the cursor, an entry that could not\n * resolve earlier could be returned after a later candidate once the registry\n * changed, producing a B→A order the configured list never asked for.\n */\nexport function createFallbackPlannerBorrower(context: FallbackPlannerContext): BorrowFallbackPlanner {\n\tconst walk: FallbackPlannerWalk = { nextIndex: 0, consumed: new Set<string>() };\n\treturn async (attempted, resolveAuth) => {\n\t\twhile (walk.nextIndex < context.fallbackModels.length) {\n\t\t\tconst entry = context.fallbackModels[walk.nextIndex];\n\t\t\t// Advance before any work: this list position is spent either way.\n\t\t\twalk.nextIndex += 1;\n\n\t\t\tconst candidate = resolveFallbackModel(entry, context.registry, context.preferredProvider);\n\t\t\tif (!candidate) continue;\n\t\t\t// Resolve the budget first: the identity depends on the effective\n\t\t\t// reasoning level, which inheritance may supply.\n\t\t\tconst budget = resolvePlannerRequest(candidate.model, context.sessionThinkingLevel, candidate.thinkingLevel);\n\t\t\tconst key = fallbackKey(candidate.model, budget.reasoning);\n\t\t\tif (attempted.has(key) || walk.consumed.has(key)) continue;\n\t\t\twalk.consumed.add(key);\n\n\t\t\tlet auth: PlannerAuth | undefined;\n\t\t\ttry {\n\t\t\t\tauth = await resolveAuth(candidate.model);\n\t\t\t} catch {\n\t\t\t\t// A candidate whose credentials cannot be resolved is simply unusable.\n\t\t\t\tauth = undefined;\n\t\t\t}\n\t\t\tif (!auth) continue;\n\t\t\treturn { model: candidate.model, budget, auth };\n\t\t}\n\t\treturn undefined;\n\t};\n}\n"]}
@@ -3,16 +3,16 @@
3
3
  */
4
4
  export * from "./branch-summarization.ts";
5
5
  export * from "./compaction.ts";
6
- export * from "./compaction-types.js";
7
- export * from "./compaction-parameters.js";
8
6
  export * from "./compaction-boundary.js";
9
- export * from "./planner-outcome.js";
7
+ export * from "./compaction-parameters.js";
8
+ export * from "./compaction-runner.js";
9
+ export * from "./compaction-types.js";
10
+ export * from "./deleted-ranges.js";
10
11
  export * from "./fallback-planner.js";
11
- export * from "./region-trimming.js";
12
+ export * from "./planner-outcome.js";
12
13
  export * from "./range-planner.js";
13
14
  export * from "./range-planner-diagnostics.js";
14
- export * from "./compaction-runner.js";
15
- export * from "./deleted-ranges.js";
15
+ export * from "./region-trimming.js";
16
16
  export * from "./transcript-serialization.js";
17
17
  export * from "./utils.ts";
18
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,YAAY,CAAC"}
@@ -3,16 +3,16 @@
3
3
  */
4
4
  export * from "./branch-summarization.js";
5
5
  export * from "./compaction.js";
6
- export * from "./compaction-types.js";
7
- export * from "./compaction-parameters.js";
8
6
  export * from "./compaction-boundary.js";
9
- export * from "./planner-outcome.js";
7
+ export * from "./compaction-parameters.js";
8
+ export * from "./compaction-runner.js";
9
+ export * from "./compaction-types.js";
10
+ export * from "./deleted-ranges.js";
10
11
  export * from "./fallback-planner.js";
11
- export * from "./region-trimming.js";
12
+ export * from "./planner-outcome.js";
12
13
  export * from "./range-planner.js";
13
14
  export * from "./range-planner-diagnostics.js";
14
- export * from "./compaction-runner.js";
15
- export * from "./deleted-ranges.js";
15
+ export * from "./region-trimming.js";
16
16
  export * from "./transcript-serialization.js";
17
17
  export * from "./utils.js";
18
18
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/compaction/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,YAAY,CAAC","sourcesContent":["/**\n * Compaction support utilities.\n */\n\nexport * from \"./branch-summarization.ts\";\nexport * from \"./compaction.ts\";\nexport * from \"./compaction-types.js\";\nexport * from \"./compaction-parameters.js\";\nexport * from \"./compaction-boundary.js\";\nexport * from \"./planner-outcome.js\";\nexport * from \"./fallback-planner.js\";\nexport * from \"./region-trimming.js\";\nexport * from \"./range-planner.js\";\nexport * from \"./range-planner-diagnostics.js\";\nexport * from \"./compaction-runner.js\";\nexport * from \"./deleted-ranges.js\";\nexport * from \"./transcript-serialization.js\";\nexport * from \"./utils.ts\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/compaction/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,YAAY,CAAC","sourcesContent":["/**\n * Compaction support utilities.\n */\n\nexport * from \"./branch-summarization.ts\";\nexport * from \"./compaction.ts\";\nexport * from \"./compaction-boundary.js\";\nexport * from \"./compaction-parameters.js\";\nexport * from \"./compaction-runner.js\";\nexport * from \"./compaction-types.js\";\nexport * from \"./deleted-ranges.js\";\nexport * from \"./fallback-planner.js\";\nexport * from \"./planner-outcome.js\";\nexport * from \"./range-planner.js\";\nexport * from \"./range-planner-diagnostics.js\";\nexport * from \"./region-trimming.js\";\nexport * from \"./transcript-serialization.js\";\nexport * from \"./utils.ts\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"planner-outcome.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/planner-outcome.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAE1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAEhF,sDAAsD;AACtD,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,cAAc,CAAC;AAEzD,6CAA6C;AAC7C,MAAM,MAAM,cAAc,GACvB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,YAAY,EAAE,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,YAAY,EAAE,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GACrE;IACA,IAAI,EAAE,aAAa,CAAC;IACpB;;;;;;OAMG;IACH,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACvB,GACD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,yBAAyB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GACnG;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvE,oFAAoF;AACpF,MAAM,MAAM,sBAAsB,GAAG,OAAO,CAC3C,cAAc,EACd;IAAE,IAAI,EAAE,aAAa,GAAG,UAAU,GAAG,YAAY,GAAG,eAAe,CAAA;CAAE,CACrE,CAAC;AAEF,+DAA+D;AAC/D,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,QAAQ,GAAG,WAAW,CAAA;CAAE,CAAC,CAE9H;AA6DD,8EAA8E;AAC9E,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,OAAO,GAAG,cAAc,GAAG,gBAAgB,CAAC;AAE3F;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,GAAG,mBAAmB,CAM7G;AAED,6FAA6F;AAC7F,wBAAgB,sBAAsB,CACrC,KAAK,EAAE;IAAE,GAAG,EAAE,GAAG,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,EACjD,YAAY,EAAE,MAAM,GAClB,gBAAgB,CAmBlB;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,eAAe,EAAE,OAAO,GAAG,OAAO,CAEhG"}
1
+ {"version":3,"file":"planner-outcome.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/planner-outcome.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAE1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAEhF,sDAAsD;AACtD,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,cAAc,CAAC;AAEzD,6CAA6C;AAC7C,MAAM,MAAM,cAAc,GACvB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,YAAY,EAAE,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,YAAY,EAAE,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GACrE;IACA,IAAI,EAAE,aAAa,CAAC;IACpB;;;;;;OAMG;IACH,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACvB,GACD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,yBAAyB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GACnG;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvE,oFAAoF;AACpF,MAAM,MAAM,sBAAsB,GAAG,OAAO,CAC3C,cAAc,EACd;IAAE,IAAI,EAAE,aAAa,GAAG,UAAU,GAAG,YAAY,GAAG,eAAe,CAAA;CAAE,CACrE,CAAC;AAEF,+DAA+D;AAC/D,wBAAgB,gBAAgB,CAC/B,OAAO,EAAE,cAAc,GACrB,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,QAAQ,GAAG,WAAW,CAAA;CAAE,CAAC,CAEtE;AA6DD,8EAA8E;AAC9E,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,OAAO,GAAG,cAAc,GAAG,gBAAgB,CAAC;AAE3F;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,GAAG,mBAAmB,CAM7G;AAED,6FAA6F;AAC7F,wBAAgB,sBAAsB,CACrC,KAAK,EAAE;IAAE,GAAG,EAAE,GAAG,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,EACjD,YAAY,EAAE,MAAM,GAClB,gBAAgB,CAmBlB;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,eAAe,EAAE,OAAO,GAAG,OAAO,CAEhG"}
@@ -1 +1 @@
1
- {"version":3,"file":"planner-outcome.js","sourceRoot":"","sources":["../../../src/core/compaction/planner-outcome.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAmCjE,+DAA+D;AAC/D,MAAM,UAAU,gBAAgB,CAAC,OAAuB;IACvD,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC;AAClE,CAAC;AAED,SAAS,yBAAyB,CAAC,QAA2B;IAC7D,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,uBAAuB,GAAG,yBAAyB,CAAC;IACzD,mBAAmB;IACnB,qBAAqB;IACrB,6BAA6B;IAC7B,mBAAmB;IACnB,oBAAoB;IACpB,eAAe;IACf,gBAAgB;IAChB,SAAS;CACT,CAAC,CAAC;AAEH;;;;;;;;;GASG;AACH,MAAM,yBAAyB,GAAG,eAAe,CAAC;AAElD;;;;GAIG;AACH,MAAM,oBAAoB,GAAG,yBAAyB,CAAC;IACtD,YAAY;IACZ,aAAa;IACb,mBAAmB;IACnB,KAAK;IACL,sBAAsB;IACtB,eAAe;IACf,iBAAiB;IACjB,mBAAmB;CACnB,CAAC,CAAC;AAEH;;;;;;;;GAQG;AACH,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AAKpD;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAA0B,EAAE,aAAqB;IACvF,IAAI,iBAAiB,CAAC,QAAQ,EAAE,aAAa,CAAC;QAAE,OAAO,UAAU,CAAC;IAClE,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,IAAI,EAAE,CAAC;IAC5C,IAAI,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IACrG,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,cAAc,CAAC;IAChG,OAAO,gBAAgB,CAAC;AACzB,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,sBAAsB,CACrC,KAAiD,EACjD,YAAoB;IAEpB,OAAO;QACN,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,EAAE;QACX,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,KAAK,EAAE,KAAK,CAAC,EAAE;QACf,KAAK,EAAE;YACN,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;YACT,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE,CAAC;YACb,WAAW,EAAE,CAAC;YACd,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;SACpE;QACD,UAAU,EAAE,OAAO;QACnB,YAAY;QACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACD,CAAC;AACvB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAA0B,EAAE,eAAwB;IACtF,OAAO,QAAQ,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,eAAe,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AACrG,CAAC","sourcesContent":["/**\n * Typed outcomes for one compaction planner attempt.\n *\n * `planDeletedLineRanges` used to collapse ranked success, silent partial\n * recovery, reasoning starvation, rate limiting, malformed output, and context\n * overflow into \"ranges or throw\". Callers could not tell a throttle from\n * garbage without string-matching an error message. This module makes each\n * outcome a distinct value so the rung ladder, the `0600` diagnostic sidecar,\n * and the UI can separate them.\n *\n * Cancellation is deliberately NOT a variant: an abort still throws.\n */\n\nimport type { Api, AssistantMessage } from \"@earendil-works/pi-ai/compat\";\nimport { isContextOverflow } from \"@earendil-works/pi-ai/compat\";\nimport type { RawLineRange } from \"./compaction-types.js\";\nimport type { DiagnosticFailureCategory } from \"./range-planner-diagnostics.js\";\n\n/** Which limit a `rateLimited` outcome represents. */\nexport type PlannerLimitClass = \"quota\" | \"rate_limited\";\n\n/** Every way one planner attempt can end. */\nexport type PlannerOutcome =\n\t| { kind: \"ranked\"; ranges: RawLineRange[] }\n\t| { kind: \"recovered\"; ranges: RawLineRange[]; recoveredCount: number }\n\t| {\n\t\t\tkind: \"rateLimited\";\n\t\t\t/**\n\t\t\t * Which limit this was, independent of retry activity. Quota/billing\n\t\t\t * exhaustion and transient throttling are different facts and must stay\n\t\t\t * separable in code and diagnostics; `exhausted` records only whether a\n\t\t\t * retry was actually scheduled, which cannot tell them apart when retry\n\t\t\t * is disabled.\n\t\t\t */\n\t\t\tcategory: PlannerLimitClass;\n\t\t\texhausted: boolean;\n\t\t\tmessage: string;\n\t\t\tdiagnosticPath?: string;\n\t }\n\t| { kind: \"unusable\"; category: DiagnosticFailureCategory; excerpt: string; diagnosticPath?: string }\n\t| { kind: \"overflowed\"; diagnosticPath?: string }\n\t| { kind: \"providerError\"; message: string; diagnosticPath?: string };\n\n/** A planner outcome that cannot produce a boundary and must advance the ladder. */\nexport type TerminalPlannerOutcome = Extract<\n\tPlannerOutcome,\n\t{ kind: \"rateLimited\" | \"unusable\" | \"overflowed\" | \"providerError\" }\n>;\n\n/** Whether this outcome produced validated deletion ranges. */\nexport function isPlannerSuccess(outcome: PlannerOutcome): outcome is Extract<PlannerOutcome, { kind: \"ranked\" | \"recovered\" }> {\n\treturn outcome.kind === \"ranked\" || outcome.kind === \"recovered\";\n}\n\nfunction buildProviderErrorPattern(patterns: readonly string[]): RegExp {\n\treturn new RegExp(patterns.join(\"|\"), \"i\");\n}\n\n/**\n * Quota/billing exhaustion. Mirrors pi-ai's\n * `NON_RETRYABLE_PROVIDER_LIMIT_ERROR_PATTERN` (`utils/retry.js`), which takes\n * precedence over the transient patterns and never spends backoff.\n */\nconst QUOTA_EXHAUSTED_PATTERN = buildProviderErrorPattern([\n\t\"GoUsageLimitError\",\n\t\"FreeUsageLimitError\",\n\t\"Monthly usage limit reached\",\n\t\"available balance\",\n\t\"insufficient_quota\",\n\t\"out of budget\",\n\t\"quota exceeded\",\n\t\"billing\",\n]);\n\n/**\n * Generic usage-limit wording, e.g. Codex's \"The usage limit has been reached\".\n *\n * This is a deliberate **local addition**, not a mirror: pi-ai lists it in\n * neither its non-retryable nor its retryable pattern, so `retryAssistantCall`\n * never schedules a backoff for it. Classifying it as transient throttling would\n * report `exhausted: true` for a retry budget that was never spent, so Atomic\n * treats it as quota exhaustion (`exhausted: false`). pi-ai's own\n * `Monthly usage limit reached` entry above already covers the specific form.\n */\nconst LOCAL_USAGE_LIMIT_PATTERN = /usage.?limit/i;\n\n/**\n * Transient throttling and provider-load failures. This is the rate-limit\n * subset of pi-ai's `RETRYABLE_PROVIDER_ERROR_PATTERN`, minus the individual\n * status codes, which `HTTP_5XX_PATTERN` generalizes below.\n */\nconst RATE_LIMITED_PATTERN = buildProviderErrorPattern([\n\t\"overloaded\",\n\t\"rate.?limit\",\n\t\"too many requests\",\n\t\"429\",\n\t\"service.?unavailable\",\n\t\"server.?error\",\n\t\"internal.?error\",\n\t\"ResourceExhausted\",\n]);\n\n/**\n * The whole HTTP 5xx class, bounded so it cannot match inside a longer number.\n *\n * A deliberate local broadening: the RFC and the acceptance contract enumerate\n * `5xx`, while pi-ai lists only 500/502/503/504/524, so a `501` would otherwise\n * fall through to `providerError`. The consequence is that pi-ai may schedule no\n * backoff for a status Atomic types as rate limiting — which is exactly why\n * `exhausted` reports *observed* retry activity rather than assuming it.\n */\nconst HTTP_5XX_PATTERN = /(?<![\\d.])5\\d\\d(?![\\d.])/;\n\n/** How a failed planner response is classified before an outcome is built. */\nexport type PlannerFailureClass = \"overflow\" | \"quota\" | \"rate_limited\" | \"provider_error\";\n\n/**\n * Classify one failed planner response.\n *\n * Context overflow wins first because pi-ai's `isContextOverflow` already\n * excludes rate/throttle text, and overflow is recoverable by trimming.\n * Quota/billing exhaustion then wins over transient throttling, matching pi-ai's\n * own precedence.\n */\nexport function classifyPlannerFailure(response: AssistantMessage, contextWindow: number): PlannerFailureClass {\n\tif (isContextOverflow(response, contextWindow)) return \"overflow\";\n\tconst message = response.errorMessage ?? \"\";\n\tif (QUOTA_EXHAUSTED_PATTERN.test(message) || LOCAL_USAGE_LIMIT_PATTERN.test(message)) return \"quota\";\n\tif (RATE_LIMITED_PATTERN.test(message) || HTTP_5XX_PATTERN.test(message)) return \"rate_limited\";\n\treturn \"provider_error\";\n}\n\n/** Build a synthetic error response so a thrown transport failure classifies identically. */\nexport function syntheticErrorResponse(\n\tmodel: { api: Api; provider: string; id: string },\n\terrorMessage: string,\n): AssistantMessage {\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent: [],\n\t\tapi: model.api,\n\t\tprovider: model.provider,\n\t\tmodel: model.id,\n\t\tusage: {\n\t\t\tinput: 0,\n\t\t\toutput: 0,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t\ttotalTokens: 0,\n\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t},\n\t\tstopReason: \"error\",\n\t\terrorMessage,\n\t\ttimestamp: Date.now(),\n\t} as AssistantMessage;\n}\n\n/**\n * Reasoning starvation fingerprint: the response stopped at the output limit,\n * produced no usable deletion record, and billed reasoning tokens.\n *\n * This is a diagnostic category only. Codex has no starvation concept and never\n * retries one; neither does Atomic. A starved outcome advances the ladder\n * exactly like any other `unusable` output.\n */\nexport function isReasoningStarved(response: AssistantMessage, hasUsableRanges: boolean): boolean {\n\treturn response.stopReason === \"length\" && !hasUsableRanges && (response.usage?.reasoning ?? 0) > 0;\n}\n"]}
1
+ {"version":3,"file":"planner-outcome.js","sourceRoot":"","sources":["../../../src/core/compaction/planner-outcome.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAmCjE,+DAA+D;AAC/D,MAAM,UAAU,gBAAgB,CAC/B,OAAuB;IAEvB,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC;AAClE,CAAC;AAED,SAAS,yBAAyB,CAAC,QAA2B;IAC7D,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,uBAAuB,GAAG,yBAAyB,CAAC;IACzD,mBAAmB;IACnB,qBAAqB;IACrB,6BAA6B;IAC7B,mBAAmB;IACnB,oBAAoB;IACpB,eAAe;IACf,gBAAgB;IAChB,SAAS;CACT,CAAC,CAAC;AAEH;;;;;;;;;GASG;AACH,MAAM,yBAAyB,GAAG,eAAe,CAAC;AAElD;;;;GAIG;AACH,MAAM,oBAAoB,GAAG,yBAAyB,CAAC;IACtD,YAAY;IACZ,aAAa;IACb,mBAAmB;IACnB,KAAK;IACL,sBAAsB;IACtB,eAAe;IACf,iBAAiB;IACjB,mBAAmB;CACnB,CAAC,CAAC;AAEH;;;;;;;;GAQG;AACH,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AAKpD;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAA0B,EAAE,aAAqB;IACvF,IAAI,iBAAiB,CAAC,QAAQ,EAAE,aAAa,CAAC;QAAE,OAAO,UAAU,CAAC;IAClE,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,IAAI,EAAE,CAAC;IAC5C,IAAI,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IACrG,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,cAAc,CAAC;IAChG,OAAO,gBAAgB,CAAC;AACzB,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,sBAAsB,CACrC,KAAiD,EACjD,YAAoB;IAEpB,OAAO;QACN,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,EAAE;QACX,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,KAAK,EAAE,KAAK,CAAC,EAAE;QACf,KAAK,EAAE;YACN,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;YACT,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE,CAAC;YACb,WAAW,EAAE,CAAC;YACd,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;SACpE;QACD,UAAU,EAAE,OAAO;QACnB,YAAY;QACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACD,CAAC;AACvB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAA0B,EAAE,eAAwB;IACtF,OAAO,QAAQ,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,eAAe,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AACrG,CAAC","sourcesContent":["/**\n * Typed outcomes for one compaction planner attempt.\n *\n * `planDeletedLineRanges` used to collapse ranked success, silent partial\n * recovery, reasoning starvation, rate limiting, malformed output, and context\n * overflow into \"ranges or throw\". Callers could not tell a throttle from\n * garbage without string-matching an error message. This module makes each\n * outcome a distinct value so the rung ladder, the `0600` diagnostic sidecar,\n * and the UI can separate them.\n *\n * Cancellation is deliberately NOT a variant: an abort still throws.\n */\n\nimport type { Api, AssistantMessage } from \"@earendil-works/pi-ai/compat\";\nimport { isContextOverflow } from \"@earendil-works/pi-ai/compat\";\nimport type { RawLineRange } from \"./compaction-types.js\";\nimport type { DiagnosticFailureCategory } from \"./range-planner-diagnostics.js\";\n\n/** Which limit a `rateLimited` outcome represents. */\nexport type PlannerLimitClass = \"quota\" | \"rate_limited\";\n\n/** Every way one planner attempt can end. */\nexport type PlannerOutcome =\n\t| { kind: \"ranked\"; ranges: RawLineRange[] }\n\t| { kind: \"recovered\"; ranges: RawLineRange[]; recoveredCount: number }\n\t| {\n\t\t\tkind: \"rateLimited\";\n\t\t\t/**\n\t\t\t * Which limit this was, independent of retry activity. Quota/billing\n\t\t\t * exhaustion and transient throttling are different facts and must stay\n\t\t\t * separable in code and diagnostics; `exhausted` records only whether a\n\t\t\t * retry was actually scheduled, which cannot tell them apart when retry\n\t\t\t * is disabled.\n\t\t\t */\n\t\t\tcategory: PlannerLimitClass;\n\t\t\texhausted: boolean;\n\t\t\tmessage: string;\n\t\t\tdiagnosticPath?: string;\n\t }\n\t| { kind: \"unusable\"; category: DiagnosticFailureCategory; excerpt: string; diagnosticPath?: string }\n\t| { kind: \"overflowed\"; diagnosticPath?: string }\n\t| { kind: \"providerError\"; message: string; diagnosticPath?: string };\n\n/** A planner outcome that cannot produce a boundary and must advance the ladder. */\nexport type TerminalPlannerOutcome = Extract<\n\tPlannerOutcome,\n\t{ kind: \"rateLimited\" | \"unusable\" | \"overflowed\" | \"providerError\" }\n>;\n\n/** Whether this outcome produced validated deletion ranges. */\nexport function isPlannerSuccess(\n\toutcome: PlannerOutcome,\n): outcome is Extract<PlannerOutcome, { kind: \"ranked\" | \"recovered\" }> {\n\treturn outcome.kind === \"ranked\" || outcome.kind === \"recovered\";\n}\n\nfunction buildProviderErrorPattern(patterns: readonly string[]): RegExp {\n\treturn new RegExp(patterns.join(\"|\"), \"i\");\n}\n\n/**\n * Quota/billing exhaustion. Mirrors pi-ai's\n * `NON_RETRYABLE_PROVIDER_LIMIT_ERROR_PATTERN` (`utils/retry.js`), which takes\n * precedence over the transient patterns and never spends backoff.\n */\nconst QUOTA_EXHAUSTED_PATTERN = buildProviderErrorPattern([\n\t\"GoUsageLimitError\",\n\t\"FreeUsageLimitError\",\n\t\"Monthly usage limit reached\",\n\t\"available balance\",\n\t\"insufficient_quota\",\n\t\"out of budget\",\n\t\"quota exceeded\",\n\t\"billing\",\n]);\n\n/**\n * Generic usage-limit wording, e.g. Codex's \"The usage limit has been reached\".\n *\n * This is a deliberate **local addition**, not a mirror: pi-ai lists it in\n * neither its non-retryable nor its retryable pattern, so `retryAssistantCall`\n * never schedules a backoff for it. Classifying it as transient throttling would\n * report `exhausted: true` for a retry budget that was never spent, so Atomic\n * treats it as quota exhaustion (`exhausted: false`). pi-ai's own\n * `Monthly usage limit reached` entry above already covers the specific form.\n */\nconst LOCAL_USAGE_LIMIT_PATTERN = /usage.?limit/i;\n\n/**\n * Transient throttling and provider-load failures. This is the rate-limit\n * subset of pi-ai's `RETRYABLE_PROVIDER_ERROR_PATTERN`, minus the individual\n * status codes, which `HTTP_5XX_PATTERN` generalizes below.\n */\nconst RATE_LIMITED_PATTERN = buildProviderErrorPattern([\n\t\"overloaded\",\n\t\"rate.?limit\",\n\t\"too many requests\",\n\t\"429\",\n\t\"service.?unavailable\",\n\t\"server.?error\",\n\t\"internal.?error\",\n\t\"ResourceExhausted\",\n]);\n\n/**\n * The whole HTTP 5xx class, bounded so it cannot match inside a longer number.\n *\n * A deliberate local broadening: the RFC and the acceptance contract enumerate\n * `5xx`, while pi-ai lists only 500/502/503/504/524, so a `501` would otherwise\n * fall through to `providerError`. The consequence is that pi-ai may schedule no\n * backoff for a status Atomic types as rate limiting — which is exactly why\n * `exhausted` reports *observed* retry activity rather than assuming it.\n */\nconst HTTP_5XX_PATTERN = /(?<![\\d.])5\\d\\d(?![\\d.])/;\n\n/** How a failed planner response is classified before an outcome is built. */\nexport type PlannerFailureClass = \"overflow\" | \"quota\" | \"rate_limited\" | \"provider_error\";\n\n/**\n * Classify one failed planner response.\n *\n * Context overflow wins first because pi-ai's `isContextOverflow` already\n * excludes rate/throttle text, and overflow is recoverable by trimming.\n * Quota/billing exhaustion then wins over transient throttling, matching pi-ai's\n * own precedence.\n */\nexport function classifyPlannerFailure(response: AssistantMessage, contextWindow: number): PlannerFailureClass {\n\tif (isContextOverflow(response, contextWindow)) return \"overflow\";\n\tconst message = response.errorMessage ?? \"\";\n\tif (QUOTA_EXHAUSTED_PATTERN.test(message) || LOCAL_USAGE_LIMIT_PATTERN.test(message)) return \"quota\";\n\tif (RATE_LIMITED_PATTERN.test(message) || HTTP_5XX_PATTERN.test(message)) return \"rate_limited\";\n\treturn \"provider_error\";\n}\n\n/** Build a synthetic error response so a thrown transport failure classifies identically. */\nexport function syntheticErrorResponse(\n\tmodel: { api: Api; provider: string; id: string },\n\terrorMessage: string,\n): AssistantMessage {\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent: [],\n\t\tapi: model.api,\n\t\tprovider: model.provider,\n\t\tmodel: model.id,\n\t\tusage: {\n\t\t\tinput: 0,\n\t\t\toutput: 0,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t\ttotalTokens: 0,\n\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t},\n\t\tstopReason: \"error\",\n\t\terrorMessage,\n\t\ttimestamp: Date.now(),\n\t} as AssistantMessage;\n}\n\n/**\n * Reasoning starvation fingerprint: the response stopped at the output limit,\n * produced no usable deletion record, and billed reasoning tokens.\n *\n * This is a diagnostic category only. Codex has no starvation concept and never\n * retries one; neither does Atomic. A starved outcome advances the ladder\n * exactly like any other `unusable` output.\n */\nexport function isReasoningStarved(response: AssistantMessage, hasUsableRanges: boolean): boolean {\n\treturn response.stopReason === \"length\" && !hasUsableRanges && (response.usage?.reasoning ?? 0) > 0;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"range-planner-diagnostics.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/range-planner-diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AA+BxF,yDAAyD;AACzD,MAAM,MAAM,yBAAyB,GAClC,kBAAkB,GAClB,kBAAkB,GAClB,gBAAgB,GAChB,cAAc;AAChB,kEAAkE;GAChE,SAAS;AACX,2EAA2E;GACzE,cAAc;AAChB,uEAAuE;GACrE,OAAO;AACT,sEAAsE;GACpE,kBAAkB,CAAC;AAEtB,mEAAmE;AACnE,MAAM,MAAM,0BAA0B,GAAG,yBAAyB,CAAC;AAEnE,+DAA+D;AAC/D,MAAM,WAAW,mBAAmB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,gEAAgE;AAChE,MAAM,WAAW,oBAAoB;IACpC,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,yBAAyB,CAAC;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IACzB,uDAAuD;IACvD,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,KAAK,EAAE,mBAAmB,CAAC;CAC3B;AAED,0EAA0E;AAC1E,MAAM,WAAW,kBAAkB;IAClC,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,0BAA0B,CAAC;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IACzB,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,KAAK,EAAE,mBAAmB,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IACjC,wFAAwF;IACxF,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,8CAA8C;IAC9C,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,sFAAsF;IACtF,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,gEAAgE;IAChE,QAAQ,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACvC,qDAAqD;IACrD,eAAe,EAAE,MAAM,CAAC;IACxB,4BAA4B;IAC5B,eAAe,EAAE,yBAAyB,CAAC;IAC3C,uCAAuC;IACvC,cAAc,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,iBAAS,sBAAsB,CAAC,GAAG,EAAE,iBAAiB,GAAG,oBAAoB,CAoB5E;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAMrE;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,iBAAiB,GAAG,MAAM,GAAG,SAAS,CAIjF;AAED;;GAEG;AACH,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAElC,yDAAyD;AACzD,MAAM,WAAW,yBAAyB;IACzC,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,0BAA0B,CAAC;IAC7C,mBAAmB,EAAE,MAAM,CAAC;CAC5B;AAED,iBAAS,oBAAoB,CAAC,GAAG,EAAE,yBAAyB,GAAG,kBAAkB,CAkBhF;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,yBAAyB,GAAG,MAAM,GAAG,SAAS,CAIjG;AAED,OAAO,EAAE,oBAAoB,EAAE,CAAC;AAEhC,iEAAiE;AACjE,MAAM,MAAM,yBAAyB,GAAG,kBAAkB,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IACjC,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,yBAAyB,CAAC;IAC3C,oFAAoF;IACpF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uDAAuD;IACvD,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,KAAK,EAAE,mBAAmB,CAAC;CAC3B;AAED,MAAM,WAAW,wBAAwB;IACxC,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,6DAA6D;IAC7D,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,eAAe,EAAE,yBAAyB,CAAC;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,iBAAS,mBAAmB,CAAC,GAAG,EAAE,wBAAwB,GAAG,iBAAiB,CAe7E;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,wBAAwB,GAAG,MAAM,GAAG,SAAS,CAI/F;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
1
+ {"version":3,"file":"range-planner-diagnostics.d.ts","sourceRoot":"","sources":["../../../src/core/compaction/range-planner-diagnostics.ts"],"names":[],"mappings":"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"}
@@ -8,9 +8,9 @@
8
8
  * Additionally, successful partial recovery from length-truncated responses
9
9
  * writes a private recovery diagnostic sidecar for operational observability.
10
10
  */
11
+ import { uuidv7 } from "@earendil-works/pi-ai";
11
12
  import { chmodSync, writeFileSync } from "fs";
12
13
  import { basename, dirname, join } from "path";
13
- import { uuidv7 } from "@earendil-works/pi-ai";
14
14
  /**
15
15
  * Write one private sidecar, never replacing an existing record.
16
16
  *
@@ -33,7 +33,9 @@ function writeSidecar(sessionFilePath, kind, payload) {
33
33
  try {
34
34
  chmodSync(filePath, 0o600);
35
35
  }
36
- catch { /* best-effort on non-POSIX */ }
36
+ catch {
37
+ /* best-effort on non-POSIX */
38
+ }
37
39
  return filePath;
38
40
  }
39
41
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"range-planner-diagnostics.js","sourceRoot":"","sources":["../../../src/core/compaction/range-planner-diagnostics.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Diagnostic sidecar writer for compaction planner output.\n *\n * When the one-pass range planner returns malformed output or no usable ranges,\n * this module writes a private diagnostic file next to the persisted session\n * file. The sidecar is never written for in-memory sessions.\n *\n * Additionally, successful partial recovery from length-truncated responses\n * writes a private recovery diagnostic sidecar for operational observability.\n */\n\nimport { chmodSync, writeFileSync } from \"fs\";\nimport { basename, dirname, join } from \"path\";\nimport { uuidv7 } from \"@earendil-works/pi-ai\";\nimport type { Api, AssistantMessage, Model, Usage } from \"@earendil-works/pi-ai/compat\";\n\n/**\n * Write one private sidecar, never replacing an existing record.\n *\n * Names were previously millisecond-only, so two attempts inside the same\n * millisecond — easy to hit across overflow trims or a fast fallback walk —\n * selected the same path and the second write silently replaced the first.\n * A `uuidv7()` discriminator plus exclusive creation (`flag: \"wx\"`) keeps one\n * durable record per attempt. Retry on collision; every other failure stays\n * best-effort and never changes the planner outcome.\n */\nfunction writeSidecar(sessionFilePath: string, kind: string, payload: unknown): string | undefined {\n\tconst dir = dirname(sessionFilePath);\n\tconst base = basename(sessionFilePath, \".jsonl\");\n\tconst timestamp = Date.now();\n\tconst body = JSON.stringify(payload, null, 2);\n\tfor (let attempt = 0; attempt < 4; attempt++) {\n\t\tconst filePath = join(dir, `${base}-compaction-${kind}-${timestamp}-${uuidv7()}.json`);\n\t\ttry {\n\t\t\twriteFileSync(filePath, body, { encoding: \"utf-8\", mode: 0o600, flag: \"wx\" });\n\t\t\ttry { chmodSync(filePath, 0o600); } catch { /* best-effort on non-POSIX */ }\n\t\t\treturn filePath;\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException)?.code === \"EEXIST\") continue;\n\t\t\treturn undefined;\n\t\t}\n\t}\n\treturn undefined;\n}\n\n/** Failure categories emitted in diagnostic sidecars. */\nexport type DiagnosticFailureCategory =\n\t| \"malformed_output\"\n\t| \"no_usable_ranges\"\n\t| \"provider_error\"\n\t| \"stream_error\"\n\t/** Length stop, no usable record, and billed reasoning tokens. */\n\t| \"starved\"\n\t/** Transient throttling, whether or not a retry was actually scheduled. */\n\t| \"rate_limited\"\n\t/** Quota, billing, or usage-limit exhaustion; never spends backoff. */\n\t| \"quota\"\n\t/** The planner request itself exceeded the model's context window. */\n\t| \"context_overflow\";\n\n/** Recovery categories emitted in recovery diagnostic sidecars. */\nexport type DiagnosticRecoveryCategory = \"partial_length_recovery\";\n\n/** Safe model metadata subset (no credentials, no headers). */\nexport interface DiagnosticModelMeta {\n\tprovider: string;\n\tid: string;\n\tapi: string;\n\tcontextWindow: number;\n\tmaxTokens: number;\n}\n\n/** Full diagnostic payload written as the sidecar JSON file. */\nexport interface CompactionDiagnostic {\n\tversion: 1;\n\ttimestamp: string;\n\tfailureCategory: DiagnosticFailureCategory;\n\tfailureMessage: string;\n\trawResponse: string;\n\tstopReason: string | undefined;\n\tproviderError: string | undefined;\n\tusage: Usage | undefined;\n\t/** Undefined since the planner sends no output cap. */\n\trequestMaxTokens: number | undefined;\n\t/**\n\t * Whether a retry was actually scheduled before the final failure. It records\n\t * retry activity, not the failure identity: a `rate_limited` record with retry\n\t * disabled is `false`, and `quota` is always `false`.\n\t */\n\trateLimitExhausted?: boolean;\n\tmodel: DiagnosticModelMeta;\n}\n\n/** Recovery diagnostic payload written on successful partial recovery. */\nexport interface RecoveryDiagnostic {\n\tversion: 1;\n\ttimestamp: string;\n\trecoveryCategory: DiagnosticRecoveryCategory;\n\trawResponse: string;\n\tstopReason: string | undefined;\n\tusage: Usage | undefined;\n\trequestMaxTokens: number | undefined;\n\tmodel: DiagnosticModelMeta;\n\trecoveredRangeCount: number;\n}\n\nexport interface DiagnosticContext {\n\t/** Absolute path to the persisted session file, or undefined for in-memory sessions. */\n\tsessionFilePath: string | undefined;\n\t/** The model used for the planner request. */\n\tmodel: Model<Api>;\n\t/** The maxTokens value sent in the planner request; undefined when no cap is sent. */\n\trequestMaxTokens: number | undefined;\n\t/** The full assistant response message, if one was received. */\n\tresponse: AssistantMessage | undefined;\n\t/** The full raw text extracted from the response. */\n\trawResponseText: string;\n\t/** The failure category. */\n\tfailureCategory: DiagnosticFailureCategory;\n\t/** The user-facing failure message. */\n\tfailureMessage: string;\n\t/** Retry activity for a limit failure; see CompactionDiagnostic. */\n\trateLimitExhausted?: boolean;\n}\n\nfunction buildDiagnosticPayload(ctx: DiagnosticContext): CompactionDiagnostic {\n\treturn {\n\t\tversion: 1,\n\t\ttimestamp: new Date().toISOString(),\n\t\tfailureCategory: ctx.failureCategory,\n\t\tfailureMessage: ctx.failureMessage,\n\t\trawResponse: ctx.rawResponseText,\n\t\tstopReason: ctx.response?.stopReason,\n\t\tproviderError: ctx.response?.errorMessage,\n\t\tusage: ctx.response?.usage,\n\t\trequestMaxTokens: ctx.requestMaxTokens,\n\t\t...(ctx.rateLimitExhausted === undefined ? {} : { rateLimitExhausted: ctx.rateLimitExhausted }),\n\t\tmodel: {\n\t\t\tprovider: ctx.model.provider,\n\t\t\tid: ctx.model.id,\n\t\t\tapi: ctx.model.api,\n\t\t\tcontextWindow: ctx.model.contextWindow,\n\t\t\tmaxTokens: ctx.model.maxTokens,\n\t\t},\n\t};\n}\n\n/**\n * Derive the sidecar file path from a session file path and current timestamp.\n * The sidecar sits alongside the session file with a `-compaction-diagnostic-<ts>.json` suffix.\n */\nexport function diagnosticSidecarPath(sessionFilePath: string): string {\n\tconst dir = dirname(sessionFilePath);\n\tconst base = basename(sessionFilePath, \".jsonl\");\n\t// Includes a per-attempt discriminator so two attempts inside one millisecond\n\t// cannot select the same path; see `writeSidecar`.\n\treturn join(dir, `${base}-compaction-diagnostic-${Date.now()}-${uuidv7()}.json`);\n}\n\n/**\n * Attempt to write a diagnostic sidecar file. Returns the written path on\n * success, or undefined if the session is in-memory or writing fails.\n *\n * The file is written with mode 0o600 (owner-only read/write) on platforms\n * that support POSIX permissions.\n */\nexport function writeDiagnosticSidecar(ctx: DiagnosticContext): string | undefined {\n\tif (!ctx.sessionFilePath) return undefined;\n\n\treturn writeSidecar(ctx.sessionFilePath, \"diagnostic\", buildDiagnosticPayload(ctx));\n}\n\n/**\n * Build the diagnostic payload without writing. Exported for testing.\n */\nexport { buildDiagnosticPayload };\n\n/** Context for writing a recovery diagnostic sidecar. */\nexport interface RecoveryDiagnosticContext {\n\tsessionFilePath: string | undefined;\n\tmodel: Model<Api>;\n\trequestMaxTokens: number | undefined;\n\tresponse: AssistantMessage;\n\trawResponseText: string;\n\trecoveryCategory: DiagnosticRecoveryCategory;\n\trecoveredRangeCount: number;\n}\n\nfunction buildRecoveryPayload(ctx: RecoveryDiagnosticContext): RecoveryDiagnostic {\n\treturn {\n\t\tversion: 1,\n\t\ttimestamp: new Date().toISOString(),\n\t\trecoveryCategory: ctx.recoveryCategory,\n\t\trawResponse: ctx.rawResponseText,\n\t\tstopReason: ctx.response.stopReason,\n\t\tusage: ctx.response.usage,\n\t\trequestMaxTokens: ctx.requestMaxTokens,\n\t\tmodel: {\n\t\t\tprovider: ctx.model.provider,\n\t\t\tid: ctx.model.id,\n\t\t\tapi: ctx.model.api,\n\t\t\tcontextWindow: ctx.model.contextWindow,\n\t\t\tmaxTokens: ctx.model.maxTokens,\n\t\t},\n\t\trecoveredRangeCount: ctx.recoveredRangeCount,\n\t};\n}\n\n/**\n * Write a recovery diagnostic sidecar on successful partial recovery.\n * Returns the written path on success, or undefined if write fails or session is in-memory.\n * Write failures are silently swallowed — recovery success is never affected.\n */\nexport function writeRecoveryDiagnosticSidecar(ctx: RecoveryDiagnosticContext): string | undefined {\n\tif (!ctx.sessionFilePath) return undefined;\n\n\treturn writeSidecar(ctx.sessionFilePath, \"recovery\", buildRecoveryPayload(ctx));\n}\n\nexport { buildRecoveryPayload };\n\n/** Success categories emitted in success diagnostic sidecars. */\nexport type DiagnosticSuccessCategory = \"borrowed_planner\";\n\n/**\n * Success diagnostic payload written when a *borrowed* fallback model ranked\n * the lines. The RFC requires the borrowed identity to appear in diagnostics but\n * defines no payload; this is the chosen shape, and it carries only safe data —\n * no key, headers, auth, prompt, or transcript.\n */\nexport interface SuccessDiagnostic {\n\tversion: 1;\n\ttimestamp: string;\n\tsuccessCategory: DiagnosticSuccessCategory;\n\t/** Effective reasoning level of the successful planner request, when it had one. */\n\tthinkingLevel?: string;\n\t/** Undefined since the planner sends no output cap. */\n\trequestMaxTokens: number | undefined;\n\tmodel: DiagnosticModelMeta;\n}\n\nexport interface SuccessDiagnosticContext {\n\tsessionFilePath: string | undefined;\n\t/** The model that actually produced the accepted ranking. */\n\tmodel: Model<Api>;\n\tsuccessCategory: DiagnosticSuccessCategory;\n\tthinkingLevel?: string;\n}\n\nfunction buildSuccessPayload(ctx: SuccessDiagnosticContext): SuccessDiagnostic {\n\treturn {\n\t\tversion: 1,\n\t\ttimestamp: new Date().toISOString(),\n\t\tsuccessCategory: ctx.successCategory,\n\t\t...(ctx.thinkingLevel === undefined ? {} : { thinkingLevel: ctx.thinkingLevel }),\n\t\trequestMaxTokens: undefined,\n\t\tmodel: {\n\t\t\tprovider: ctx.model.provider,\n\t\t\tid: ctx.model.id,\n\t\t\tapi: ctx.model.api,\n\t\t\tcontextWindow: ctx.model.contextWindow,\n\t\t\tmaxTokens: ctx.model.maxTokens,\n\t\t},\n\t};\n}\n\n/**\n * Write a success sidecar naming the borrowed model that ranked the lines.\n *\n * Best-effort: an in-memory session or a write failure never changes compaction\n * success. The filename uses a distinct `-compaction-success-<ts>.json` suffix so\n * it cannot collide with the primary model's failure sidecar.\n */\nexport function writeSuccessDiagnosticSidecar(ctx: SuccessDiagnosticContext): string | undefined {\n\tif (!ctx.sessionFilePath) return undefined;\n\n\treturn writeSidecar(ctx.sessionFilePath, \"success\", buildSuccessPayload(ctx));\n}\n\nexport { buildSuccessPayload };\n"]}
1
+ {"version":3,"file":"range-planner-diagnostics.js","sourceRoot":"","sources":["../../../src/core/compaction/range-planner-diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE/C;;;;;;;;;GASG;AACH,SAAS,YAAY,CAAC,eAAuB,EAAE,IAAY,EAAE,OAAgB;IAC5E,MAAM,GAAG,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9C,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,eAAe,IAAI,IAAI,SAAS,IAAI,MAAM,EAAE,OAAO,CAAC,CAAC;QACvF,IAAI,CAAC;YACJ,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9E,IAAI,CAAC;gBACJ,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACR,8BAA8B;YAC/B,CAAC;YACD,OAAO,QAAQ,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAK,KAA+B,EAAE,IAAI,KAAK,QAAQ;gBAAE,SAAS;YAClE,OAAO,SAAS,CAAC;QAClB,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAkFD,SAAS,sBAAsB,CAAC,GAAsB;IACrD,OAAO;QACN,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,eAAe,EAAE,GAAG,CAAC,eAAe;QACpC,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,WAAW,EAAE,GAAG,CAAC,eAAe;QAChC,UAAU,EAAE,GAAG,CAAC,QAAQ,EAAE,UAAU;QACpC,aAAa,EAAE,GAAG,CAAC,QAAQ,EAAE,YAAY;QACzC,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE,KAAK;QAC1B,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;QACtC,GAAG,CAAC,GAAG,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,GAAG,CAAC,kBAAkB,EAAE,CAAC;QAC/F,KAAK,EAAE;YACN,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ;YAC5B,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE;YAChB,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG;YAClB,aAAa,EAAE,GAAG,CAAC,KAAK,CAAC,aAAa;YACtC,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS;SAC9B;KACD,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,eAAuB;IAC5D,MAAM,GAAG,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IACjD,8EAA8E;IAC9E,mDAAmD;IACnD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,0BAA0B,IAAI,CAAC,GAAG,EAAE,IAAI,MAAM,EAAE,OAAO,CAAC,CAAC;AAClF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAsB;IAC5D,IAAI,CAAC,GAAG,CAAC,eAAe;QAAE,OAAO,SAAS,CAAC;IAE3C,OAAO,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,YAAY,EAAE,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC;AACrF,CAAC;AAED;;GAEG;AACH,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAalC,SAAS,oBAAoB,CAAC,GAA8B;IAC3D,OAAO;QACN,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;QACtC,WAAW,EAAE,GAAG,CAAC,eAAe;QAChC,UAAU,EAAE,GAAG,CAAC,QAAQ,CAAC,UAAU;QACnC,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK;QACzB,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;QACtC,KAAK,EAAE;YACN,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ;YAC5B,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE;YAChB,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG;YAClB,aAAa,EAAE,GAAG,CAAC,KAAK,CAAC,aAAa;YACtC,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS;SAC9B;QACD,mBAAmB,EAAE,GAAG,CAAC,mBAAmB;KAC5C,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,8BAA8B,CAAC,GAA8B;IAC5E,IAAI,CAAC,GAAG,CAAC,eAAe;QAAE,OAAO,SAAS,CAAC;IAE3C,OAAO,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,EAAE,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,OAAO,EAAE,oBAAoB,EAAE,CAAC;AA8BhC,SAAS,mBAAmB,CAAC,GAA6B;IACzD,OAAO;QACN,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,eAAe,EAAE,GAAG,CAAC,eAAe;QACpC,GAAG,CAAC,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC;QAChF,gBAAgB,EAAE,SAAS;QAC3B,KAAK,EAAE;YACN,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ;YAC5B,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE;YAChB,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG;YAClB,aAAa,EAAE,GAAG,CAAC,KAAK,CAAC,aAAa;YACtC,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS;SAC9B;KACD,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,6BAA6B,CAAC,GAA6B;IAC1E,IAAI,CAAC,GAAG,CAAC,eAAe;QAAE,OAAO,SAAS,CAAC;IAE3C,OAAO,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,SAAS,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC","sourcesContent":["/**\n * Diagnostic sidecar writer for compaction planner output.\n *\n * When the one-pass range planner returns malformed output or no usable ranges,\n * this module writes a private diagnostic file next to the persisted session\n * file. The sidecar is never written for in-memory sessions.\n *\n * Additionally, successful partial recovery from length-truncated responses\n * writes a private recovery diagnostic sidecar for operational observability.\n */\n\nimport { uuidv7 } from \"@earendil-works/pi-ai\";\nimport type { Api, AssistantMessage, Model, Usage } from \"@earendil-works/pi-ai/compat\";\nimport { chmodSync, writeFileSync } from \"fs\";\nimport { basename, dirname, join } from \"path\";\n\n/**\n * Write one private sidecar, never replacing an existing record.\n *\n * Names were previously millisecond-only, so two attempts inside the same\n * millisecond — easy to hit across overflow trims or a fast fallback walk —\n * selected the same path and the second write silently replaced the first.\n * A `uuidv7()` discriminator plus exclusive creation (`flag: \"wx\"`) keeps one\n * durable record per attempt. Retry on collision; every other failure stays\n * best-effort and never changes the planner outcome.\n */\nfunction writeSidecar(sessionFilePath: string, kind: string, payload: unknown): string | undefined {\n\tconst dir = dirname(sessionFilePath);\n\tconst base = basename(sessionFilePath, \".jsonl\");\n\tconst timestamp = Date.now();\n\tconst body = JSON.stringify(payload, null, 2);\n\tfor (let attempt = 0; attempt < 4; attempt++) {\n\t\tconst filePath = join(dir, `${base}-compaction-${kind}-${timestamp}-${uuidv7()}.json`);\n\t\ttry {\n\t\t\twriteFileSync(filePath, body, { encoding: \"utf-8\", mode: 0o600, flag: \"wx\" });\n\t\t\ttry {\n\t\t\t\tchmodSync(filePath, 0o600);\n\t\t\t} catch {\n\t\t\t\t/* best-effort on non-POSIX */\n\t\t\t}\n\t\t\treturn filePath;\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException)?.code === \"EEXIST\") continue;\n\t\t\treturn undefined;\n\t\t}\n\t}\n\treturn undefined;\n}\n\n/** Failure categories emitted in diagnostic sidecars. */\nexport type DiagnosticFailureCategory =\n\t| \"malformed_output\"\n\t| \"no_usable_ranges\"\n\t| \"provider_error\"\n\t| \"stream_error\"\n\t/** Length stop, no usable record, and billed reasoning tokens. */\n\t| \"starved\"\n\t/** Transient throttling, whether or not a retry was actually scheduled. */\n\t| \"rate_limited\"\n\t/** Quota, billing, or usage-limit exhaustion; never spends backoff. */\n\t| \"quota\"\n\t/** The planner request itself exceeded the model's context window. */\n\t| \"context_overflow\";\n\n/** Recovery categories emitted in recovery diagnostic sidecars. */\nexport type DiagnosticRecoveryCategory = \"partial_length_recovery\";\n\n/** Safe model metadata subset (no credentials, no headers). */\nexport interface DiagnosticModelMeta {\n\tprovider: string;\n\tid: string;\n\tapi: string;\n\tcontextWindow: number;\n\tmaxTokens: number;\n}\n\n/** Full diagnostic payload written as the sidecar JSON file. */\nexport interface CompactionDiagnostic {\n\tversion: 1;\n\ttimestamp: string;\n\tfailureCategory: DiagnosticFailureCategory;\n\tfailureMessage: string;\n\trawResponse: string;\n\tstopReason: string | undefined;\n\tproviderError: string | undefined;\n\tusage: Usage | undefined;\n\t/** Undefined since the planner sends no output cap. */\n\trequestMaxTokens: number | undefined;\n\t/**\n\t * Whether a retry was actually scheduled before the final failure. It records\n\t * retry activity, not the failure identity: a `rate_limited` record with retry\n\t * disabled is `false`, and `quota` is always `false`.\n\t */\n\trateLimitExhausted?: boolean;\n\tmodel: DiagnosticModelMeta;\n}\n\n/** Recovery diagnostic payload written on successful partial recovery. */\nexport interface RecoveryDiagnostic {\n\tversion: 1;\n\ttimestamp: string;\n\trecoveryCategory: DiagnosticRecoveryCategory;\n\trawResponse: string;\n\tstopReason: string | undefined;\n\tusage: Usage | undefined;\n\trequestMaxTokens: number | undefined;\n\tmodel: DiagnosticModelMeta;\n\trecoveredRangeCount: number;\n}\n\nexport interface DiagnosticContext {\n\t/** Absolute path to the persisted session file, or undefined for in-memory sessions. */\n\tsessionFilePath: string | undefined;\n\t/** The model used for the planner request. */\n\tmodel: Model<Api>;\n\t/** The maxTokens value sent in the planner request; undefined when no cap is sent. */\n\trequestMaxTokens: number | undefined;\n\t/** The full assistant response message, if one was received. */\n\tresponse: AssistantMessage | undefined;\n\t/** The full raw text extracted from the response. */\n\trawResponseText: string;\n\t/** The failure category. */\n\tfailureCategory: DiagnosticFailureCategory;\n\t/** The user-facing failure message. */\n\tfailureMessage: string;\n\t/** Retry activity for a limit failure; see CompactionDiagnostic. */\n\trateLimitExhausted?: boolean;\n}\n\nfunction buildDiagnosticPayload(ctx: DiagnosticContext): CompactionDiagnostic {\n\treturn {\n\t\tversion: 1,\n\t\ttimestamp: new Date().toISOString(),\n\t\tfailureCategory: ctx.failureCategory,\n\t\tfailureMessage: ctx.failureMessage,\n\t\trawResponse: ctx.rawResponseText,\n\t\tstopReason: ctx.response?.stopReason,\n\t\tproviderError: ctx.response?.errorMessage,\n\t\tusage: ctx.response?.usage,\n\t\trequestMaxTokens: ctx.requestMaxTokens,\n\t\t...(ctx.rateLimitExhausted === undefined ? {} : { rateLimitExhausted: ctx.rateLimitExhausted }),\n\t\tmodel: {\n\t\t\tprovider: ctx.model.provider,\n\t\t\tid: ctx.model.id,\n\t\t\tapi: ctx.model.api,\n\t\t\tcontextWindow: ctx.model.contextWindow,\n\t\t\tmaxTokens: ctx.model.maxTokens,\n\t\t},\n\t};\n}\n\n/**\n * Derive the sidecar file path from a session file path and current timestamp.\n * The sidecar sits alongside the session file with a `-compaction-diagnostic-<ts>.json` suffix.\n */\nexport function diagnosticSidecarPath(sessionFilePath: string): string {\n\tconst dir = dirname(sessionFilePath);\n\tconst base = basename(sessionFilePath, \".jsonl\");\n\t// Includes a per-attempt discriminator so two attempts inside one millisecond\n\t// cannot select the same path; see `writeSidecar`.\n\treturn join(dir, `${base}-compaction-diagnostic-${Date.now()}-${uuidv7()}.json`);\n}\n\n/**\n * Attempt to write a diagnostic sidecar file. Returns the written path on\n * success, or undefined if the session is in-memory or writing fails.\n *\n * The file is written with mode 0o600 (owner-only read/write) on platforms\n * that support POSIX permissions.\n */\nexport function writeDiagnosticSidecar(ctx: DiagnosticContext): string | undefined {\n\tif (!ctx.sessionFilePath) return undefined;\n\n\treturn writeSidecar(ctx.sessionFilePath, \"diagnostic\", buildDiagnosticPayload(ctx));\n}\n\n/**\n * Build the diagnostic payload without writing. Exported for testing.\n */\nexport { buildDiagnosticPayload };\n\n/** Context for writing a recovery diagnostic sidecar. */\nexport interface RecoveryDiagnosticContext {\n\tsessionFilePath: string | undefined;\n\tmodel: Model<Api>;\n\trequestMaxTokens: number | undefined;\n\tresponse: AssistantMessage;\n\trawResponseText: string;\n\trecoveryCategory: DiagnosticRecoveryCategory;\n\trecoveredRangeCount: number;\n}\n\nfunction buildRecoveryPayload(ctx: RecoveryDiagnosticContext): RecoveryDiagnostic {\n\treturn {\n\t\tversion: 1,\n\t\ttimestamp: new Date().toISOString(),\n\t\trecoveryCategory: ctx.recoveryCategory,\n\t\trawResponse: ctx.rawResponseText,\n\t\tstopReason: ctx.response.stopReason,\n\t\tusage: ctx.response.usage,\n\t\trequestMaxTokens: ctx.requestMaxTokens,\n\t\tmodel: {\n\t\t\tprovider: ctx.model.provider,\n\t\t\tid: ctx.model.id,\n\t\t\tapi: ctx.model.api,\n\t\t\tcontextWindow: ctx.model.contextWindow,\n\t\t\tmaxTokens: ctx.model.maxTokens,\n\t\t},\n\t\trecoveredRangeCount: ctx.recoveredRangeCount,\n\t};\n}\n\n/**\n * Write a recovery diagnostic sidecar on successful partial recovery.\n * Returns the written path on success, or undefined if write fails or session is in-memory.\n * Write failures are silently swallowed — recovery success is never affected.\n */\nexport function writeRecoveryDiagnosticSidecar(ctx: RecoveryDiagnosticContext): string | undefined {\n\tif (!ctx.sessionFilePath) return undefined;\n\n\treturn writeSidecar(ctx.sessionFilePath, \"recovery\", buildRecoveryPayload(ctx));\n}\n\nexport { buildRecoveryPayload };\n\n/** Success categories emitted in success diagnostic sidecars. */\nexport type DiagnosticSuccessCategory = \"borrowed_planner\";\n\n/**\n * Success diagnostic payload written when a *borrowed* fallback model ranked\n * the lines. The RFC requires the borrowed identity to appear in diagnostics but\n * defines no payload; this is the chosen shape, and it carries only safe data —\n * no key, headers, auth, prompt, or transcript.\n */\nexport interface SuccessDiagnostic {\n\tversion: 1;\n\ttimestamp: string;\n\tsuccessCategory: DiagnosticSuccessCategory;\n\t/** Effective reasoning level of the successful planner request, when it had one. */\n\tthinkingLevel?: string;\n\t/** Undefined since the planner sends no output cap. */\n\trequestMaxTokens: number | undefined;\n\tmodel: DiagnosticModelMeta;\n}\n\nexport interface SuccessDiagnosticContext {\n\tsessionFilePath: string | undefined;\n\t/** The model that actually produced the accepted ranking. */\n\tmodel: Model<Api>;\n\tsuccessCategory: DiagnosticSuccessCategory;\n\tthinkingLevel?: string;\n}\n\nfunction buildSuccessPayload(ctx: SuccessDiagnosticContext): SuccessDiagnostic {\n\treturn {\n\t\tversion: 1,\n\t\ttimestamp: new Date().toISOString(),\n\t\tsuccessCategory: ctx.successCategory,\n\t\t...(ctx.thinkingLevel === undefined ? {} : { thinkingLevel: ctx.thinkingLevel }),\n\t\trequestMaxTokens: undefined,\n\t\tmodel: {\n\t\t\tprovider: ctx.model.provider,\n\t\t\tid: ctx.model.id,\n\t\t\tapi: ctx.model.api,\n\t\t\tcontextWindow: ctx.model.contextWindow,\n\t\t\tmaxTokens: ctx.model.maxTokens,\n\t\t},\n\t};\n}\n\n/**\n * Write a success sidecar naming the borrowed model that ranked the lines.\n *\n * Best-effort: an in-memory session or a write failure never changes compaction\n * success. The filename uses a distinct `-compaction-success-<ts>.json` suffix so\n * it cannot collide with the primary model's failure sidecar.\n */\nexport function writeSuccessDiagnosticSidecar(ctx: SuccessDiagnosticContext): string | undefined {\n\tif (!ctx.sessionFilePath) return undefined;\n\n\treturn writeSidecar(ctx.sessionFilePath, \"success\", buildSuccessPayload(ctx));\n}\n\nexport { buildSuccessPayload };\n"]}