@bastani/atomic 0.9.16-alpha.4 → 0.9.16-alpha.5

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 (404) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +11 -6
  3. package/dist/builtin/intercom/CHANGELOG.md +15 -0
  4. package/dist/builtin/intercom/README.md +6 -4
  5. package/dist/builtin/intercom/broker/broker.ts +34 -8
  6. package/dist/builtin/intercom/broker/client.ts +13 -0
  7. package/dist/builtin/intercom/broker/pending-question-index.ts +50 -0
  8. package/dist/builtin/intercom/broker/send-handler.ts +8 -0
  9. package/dist/builtin/intercom/index.bundle.mjs +2041 -1210
  10. package/dist/builtin/intercom/package.json +2 -2
  11. package/dist/builtin/intercom/skills/intercom/SKILL.md +20 -19
  12. package/dist/builtin/mcp/index.bundle.mjs +1774 -1025
  13. package/dist/builtin/mcp/package.json +2 -2
  14. package/dist/builtin/subagents/CHANGELOG.md +11 -0
  15. package/dist/builtin/subagents/README.md +3 -3
  16. package/dist/builtin/subagents/package.json +3 -3
  17. package/dist/builtin/subagents/skills/subagent/SKILL.md +4 -4
  18. package/dist/builtin/subagents/src/extension/index.bundle.mjs +2641 -1505
  19. package/dist/builtin/web-access/index.bundle.mjs +1750 -1001
  20. package/dist/builtin/web-access/package.json +2 -2
  21. package/dist/builtin/workflows/CHANGELOG.md +20 -0
  22. package/dist/builtin/workflows/README.md +1 -1
  23. package/dist/builtin/workflows/builtin/goal-ledger.ts +54 -10
  24. package/dist/builtin/workflows/builtin/goal-runner.ts +57 -12
  25. package/dist/builtin/workflows/package.json +2 -2
  26. package/dist/builtin/workflows/src/extension/index.bundle.mjs +13603 -12021
  27. package/dist/builtin/workflows/src/index.bundle.mjs +2331 -1277
  28. package/dist/bun/split-loader.js +2 -1
  29. package/dist/bun/split-loader.js.map +1 -1
  30. package/dist/cli/args.d.ts.map +1 -1
  31. package/dist/cli/args.js +6 -1
  32. package/dist/cli/args.js.map +1 -1
  33. package/dist/cli/file-processor.d.ts.map +1 -1
  34. package/dist/cli/file-processor.js +2 -1
  35. package/dist/cli/file-processor.js.map +1 -1
  36. package/dist/config-package-identity.d.ts.map +1 -1
  37. package/dist/config-package-identity.js +2 -1
  38. package/dist/config-package-identity.js.map +1 -1
  39. package/dist/config.d.ts.map +1 -1
  40. package/dist/config.js +2 -1
  41. package/dist/config.js.map +1 -1
  42. package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
  43. package/dist/core/agent-session-auto-compaction.js +64 -28
  44. package/dist/core/agent-session-auto-compaction.js.map +1 -1
  45. package/dist/core/agent-session-compaction.d.ts +2 -0
  46. package/dist/core/agent-session-compaction.d.ts.map +1 -1
  47. package/dist/core/agent-session-compaction.js +25 -5
  48. package/dist/core/agent-session-compaction.js.map +1 -1
  49. package/dist/core/agent-session-custom-message-commit.d.ts.map +1 -1
  50. package/dist/core/agent-session-custom-message-commit.js +12 -0
  51. package/dist/core/agent-session-custom-message-commit.js.map +1 -1
  52. package/dist/core/agent-session-events.d.ts.map +1 -1
  53. package/dist/core/agent-session-events.js +2 -0
  54. package/dist/core/agent-session-events.js.map +1 -1
  55. package/dist/core/agent-session-export.d.ts +3 -1
  56. package/dist/core/agent-session-export.d.ts.map +1 -1
  57. package/dist/core/agent-session-export.js +22 -2
  58. package/dist/core/agent-session-export.js.map +1 -1
  59. package/dist/core/agent-session-message-queue.d.ts +3 -0
  60. package/dist/core/agent-session-message-queue.d.ts.map +1 -1
  61. package/dist/core/agent-session-message-queue.js +10 -0
  62. package/dist/core/agent-session-message-queue.js.map +1 -1
  63. package/dist/core/agent-session-methods.d.ts +15 -9
  64. package/dist/core/agent-session-methods.d.ts.map +1 -1
  65. package/dist/core/agent-session-methods.js.map +1 -1
  66. package/dist/core/agent-session-models.d.ts +8 -13
  67. package/dist/core/agent-session-models.d.ts.map +1 -1
  68. package/dist/core/agent-session-models.js +53 -19
  69. package/dist/core/agent-session-models.js.map +1 -1
  70. package/dist/core/agent-session-post-tool-compaction.d.ts.map +1 -1
  71. package/dist/core/agent-session-post-tool-compaction.js +12 -0
  72. package/dist/core/agent-session-post-tool-compaction.js.map +1 -1
  73. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  74. package/dist/core/agent-session-prompt.js +3 -1
  75. package/dist/core/agent-session-prompt.js.map +1 -1
  76. package/dist/core/agent-session-tool-registry.js +3 -3
  77. package/dist/core/agent-session-tool-registry.js.map +1 -1
  78. package/dist/core/agent-session-transfer.d.ts.map +1 -1
  79. package/dist/core/agent-session-transfer.js +1 -0
  80. package/dist/core/agent-session-transfer.js.map +1 -1
  81. package/dist/core/agent-session-tree.d.ts.map +1 -1
  82. package/dist/core/agent-session-tree.js +1 -1
  83. package/dist/core/agent-session-tree.js.map +1 -1
  84. package/dist/core/agent-session-types.d.ts +3 -0
  85. package/dist/core/agent-session-types.d.ts.map +1 -1
  86. package/dist/core/agent-session-types.js.map +1 -1
  87. package/dist/core/agent-session.d.ts +2 -0
  88. package/dist/core/agent-session.d.ts.map +1 -1
  89. package/dist/core/agent-session.js +2 -0
  90. package/dist/core/agent-session.js.map +1 -1
  91. package/dist/core/auth-storage-backends.d.ts.map +1 -1
  92. package/dist/core/auth-storage-backends.js +10 -6
  93. package/dist/core/auth-storage-backends.js.map +1 -1
  94. package/dist/core/auth-storage.d.ts.map +1 -1
  95. package/dist/core/auth-storage.js +4 -3
  96. package/dist/core/auth-storage.js.map +1 -1
  97. package/dist/core/builtin-packages.d.ts.map +1 -1
  98. package/dist/core/builtin-packages.js +2 -1
  99. package/dist/core/builtin-packages.js.map +1 -1
  100. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  101. package/dist/core/compaction/branch-summarization.js +6 -0
  102. package/dist/core/compaction/branch-summarization.js.map +1 -1
  103. package/dist/core/compaction/compaction-runner.d.ts +3 -1
  104. package/dist/core/compaction/compaction-runner.d.ts.map +1 -1
  105. package/dist/core/compaction/compaction-runner.js +30 -4
  106. package/dist/core/compaction/compaction-runner.js.map +1 -1
  107. package/dist/core/compaction/compaction-types.d.ts +3 -1
  108. package/dist/core/compaction/compaction-types.d.ts.map +1 -1
  109. package/dist/core/compaction/compaction-types.js.map +1 -1
  110. package/dist/core/compaction/range-planner.d.ts +3 -1
  111. package/dist/core/compaction/range-planner.d.ts.map +1 -1
  112. package/dist/core/compaction/range-planner.js +11 -1
  113. package/dist/core/compaction/range-planner.js.map +1 -1
  114. package/dist/core/compaction/session-summarization.d.ts.map +1 -1
  115. package/dist/core/compaction/session-summarization.js +6 -0
  116. package/dist/core/compaction/session-summarization.js.map +1 -1
  117. package/dist/core/extensions/api-types.d.ts +8 -3
  118. package/dist/core/extensions/api-types.d.ts.map +1 -1
  119. package/dist/core/extensions/api-types.js.map +1 -1
  120. package/dist/core/extensions/index.d.ts +2 -2
  121. package/dist/core/extensions/index.d.ts.map +1 -1
  122. package/dist/core/extensions/index.js +1 -1
  123. package/dist/core/extensions/index.js.map +1 -1
  124. package/dist/core/extensions/loader-api.d.ts +5 -1
  125. package/dist/core/extensions/loader-api.d.ts.map +1 -1
  126. package/dist/core/extensions/loader-api.js +124 -36
  127. package/dist/core/extensions/loader-api.js.map +1 -1
  128. package/dist/core/extensions/loader-core.d.ts.map +1 -1
  129. package/dist/core/extensions/loader-core.js +18 -4
  130. package/dist/core/extensions/loader-core.js.map +1 -1
  131. package/dist/core/extensions/loader-runtime.d.ts.map +1 -1
  132. package/dist/core/extensions/loader-runtime.js +10 -2
  133. package/dist/core/extensions/loader-runtime.js.map +1 -1
  134. package/dist/core/extensions/session-events.d.ts +11 -2
  135. package/dist/core/extensions/session-events.d.ts.map +1 -1
  136. package/dist/core/extensions/session-events.js.map +1 -1
  137. package/dist/core/extensions/tool-events.d.ts +13 -3
  138. package/dist/core/extensions/tool-events.d.ts.map +1 -1
  139. package/dist/core/extensions/tool-events.js +3 -0
  140. package/dist/core/extensions/tool-events.js.map +1 -1
  141. package/dist/core/extensions/types.d.ts +1 -1
  142. package/dist/core/extensions/types.d.ts.map +1 -1
  143. package/dist/core/extensions/types.js +1 -1
  144. package/dist/core/extensions/types.js.map +1 -1
  145. package/dist/core/extensions/ui-types.d.ts +2 -2
  146. package/dist/core/extensions/ui-types.js.map +1 -1
  147. package/dist/core/footer-data-provider.d.ts +1 -1
  148. package/dist/core/footer-data-provider.js +1 -1
  149. package/dist/core/footer-data-provider.js.map +1 -1
  150. package/dist/core/keybindings.d.ts +17 -16
  151. package/dist/core/keybindings.d.ts.map +1 -1
  152. package/dist/core/keybindings.js +23 -6
  153. package/dist/core/keybindings.js.map +1 -1
  154. package/dist/core/model-config.d.ts.map +1 -1
  155. package/dist/core/model-config.js +2 -1
  156. package/dist/core/model-config.js.map +1 -1
  157. package/dist/core/model-resolver-initial.d.ts +1 -0
  158. package/dist/core/model-resolver-initial.d.ts.map +1 -1
  159. package/dist/core/model-resolver-initial.js +9 -5
  160. package/dist/core/model-resolver-initial.js.map +1 -1
  161. package/dist/core/models-store.d.ts.map +1 -1
  162. package/dist/core/models-store.js +2 -1
  163. package/dist/core/models-store.js.map +1 -1
  164. package/dist/core/package-manager-git.d.ts.map +1 -1
  165. package/dist/core/package-manager-git.js +2 -1
  166. package/dist/core/package-manager-git.js.map +1 -1
  167. package/dist/core/package-manager-manifest.d.ts.map +1 -1
  168. package/dist/core/package-manager-manifest.js +2 -1
  169. package/dist/core/package-manager-manifest.js.map +1 -1
  170. package/dist/core/package-manager-npm.d.ts.map +1 -1
  171. package/dist/core/package-manager-npm.js +4 -3
  172. package/dist/core/package-manager-npm.js.map +1 -1
  173. package/dist/core/package-manager-operations.d.ts.map +1 -1
  174. package/dist/core/package-manager-operations.js +2 -1
  175. package/dist/core/package-manager-operations.js.map +1 -1
  176. package/dist/core/package-manager-resource-collector.d.ts.map +1 -1
  177. package/dist/core/package-manager-resource-collector.js +2 -1
  178. package/dist/core/package-manager-resource-collector.js.map +1 -1
  179. package/dist/core/package-manager-resource-files.d.ts.map +1 -1
  180. package/dist/core/package-manager-resource-files.js +7 -2
  181. package/dist/core/package-manager-resource-files.js.map +1 -1
  182. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  183. package/dist/core/remote-catalog-provider.js +2 -1
  184. package/dist/core/remote-catalog-provider.js.map +1 -1
  185. package/dist/core/resource-loader-context-files.d.ts.map +1 -1
  186. package/dist/core/resource-loader-context-files.js +3 -2
  187. package/dist/core/resource-loader-context-files.js.map +1 -1
  188. package/dist/core/sdk-exports.d.ts +5 -3
  189. package/dist/core/sdk-exports.d.ts.map +1 -1
  190. package/dist/core/sdk-exports.js +4 -2
  191. package/dist/core/sdk-exports.js.map +1 -1
  192. package/dist/core/sdk.d.ts.map +1 -1
  193. package/dist/core/sdk.js +7 -3
  194. package/dist/core/sdk.js.map +1 -1
  195. package/dist/core/session-manager-core.d.ts +2 -2
  196. package/dist/core/session-manager-core.d.ts.map +1 -1
  197. package/dist/core/session-manager-core.js +4 -4
  198. package/dist/core/session-manager-core.js.map +1 -1
  199. package/dist/core/session-manager-entries.d.ts +2 -2
  200. package/dist/core/session-manager-entries.d.ts.map +1 -1
  201. package/dist/core/session-manager-entries.js +4 -3
  202. package/dist/core/session-manager-entries.js.map +1 -1
  203. package/dist/core/session-manager-storage.d.ts.map +1 -1
  204. package/dist/core/session-manager-storage.js +4 -2
  205. package/dist/core/session-manager-storage.js.map +1 -1
  206. package/dist/core/session-manager-types.d.ts +2 -0
  207. package/dist/core/session-manager-types.d.ts.map +1 -1
  208. package/dist/core/session-manager-types.js.map +1 -1
  209. package/dist/core/settings-diagnostics.d.ts +4 -0
  210. package/dist/core/settings-diagnostics.d.ts.map +1 -0
  211. package/dist/core/settings-diagnostics.js +12 -0
  212. package/dist/core/settings-diagnostics.js.map +1 -0
  213. package/dist/core/settings-manager-basic-accessors.d.ts +4 -0
  214. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  215. package/dist/core/settings-manager-basic-accessors.js +23 -0
  216. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  217. package/dist/core/settings-manager-core.d.ts.map +1 -1
  218. package/dist/core/settings-manager-core.js +10 -2
  219. package/dist/core/settings-manager-core.js.map +1 -1
  220. package/dist/core/settings-storage.d.ts.map +1 -1
  221. package/dist/core/settings-storage.js +10 -3
  222. package/dist/core/settings-storage.js.map +1 -1
  223. package/dist/core/settings-types.d.ts +2 -0
  224. package/dist/core/settings-types.d.ts.map +1 -1
  225. package/dist/core/settings-types.js.map +1 -1
  226. package/dist/core/skills.d.ts.map +1 -1
  227. package/dist/core/skills.js +51 -33
  228. package/dist/core/skills.js.map +1 -1
  229. package/dist/core/slash-commands.d.ts.map +1 -1
  230. package/dist/core/slash-commands.js +3 -2
  231. package/dist/core/slash-commands.js.map +1 -1
  232. package/dist/core/system-prompt.d.ts.map +1 -1
  233. package/dist/core/system-prompt.js +11 -2
  234. package/dist/core/system-prompt.js.map +1 -1
  235. package/dist/core/tools/ask-user-question/config.d.ts.map +1 -1
  236. package/dist/core/tools/ask-user-question/config.js +2 -1
  237. package/dist/core/tools/ask-user-question/config.js.map +1 -1
  238. package/dist/core/tools/bash.d.ts +13 -1
  239. package/dist/core/tools/bash.d.ts.map +1 -1
  240. package/dist/core/tools/bash.js +9 -5
  241. package/dist/core/tools/bash.js.map +1 -1
  242. package/dist/core/tools/index.d.ts +21 -5
  243. package/dist/core/tools/index.d.ts.map +1 -1
  244. package/dist/core/tools/index.js +45 -13
  245. package/dist/core/tools/index.js.map +1 -1
  246. package/dist/core/tools/powershell.d.ts +83 -0
  247. package/dist/core/tools/powershell.d.ts.map +1 -0
  248. package/dist/core/tools/powershell.js +89 -0
  249. package/dist/core/tools/powershell.js.map +1 -0
  250. package/dist/core/usage-totals.d.ts.map +1 -1
  251. package/dist/core/usage-totals.js +2 -1
  252. package/dist/core/usage-totals.js.map +1 -1
  253. package/dist/extensions/llama/client.d.ts +6 -0
  254. package/dist/extensions/llama/client.d.ts.map +1 -1
  255. package/dist/extensions/llama/client.js +12 -0
  256. package/dist/extensions/llama/client.js.map +1 -1
  257. package/dist/extensions/llama/index.d.ts.map +1 -1
  258. package/dist/extensions/llama/index.js +2 -0
  259. package/dist/extensions/llama/index.js.map +1 -1
  260. package/dist/extensions/llama/provider.d.ts +3 -1
  261. package/dist/extensions/llama/provider.d.ts.map +1 -1
  262. package/dist/extensions/llama/provider.js +25 -8
  263. package/dist/extensions/llama/provider.js.map +1 -1
  264. package/dist/index-extensions.d.ts +2 -2
  265. package/dist/index-extensions.d.ts.map +1 -1
  266. package/dist/index-extensions.js +1 -1
  267. package/dist/index-extensions.js.map +1 -1
  268. package/dist/index.d.ts +4 -3
  269. package/dist/index.d.ts.map +1 -1
  270. package/dist/index.js +4 -3
  271. package/dist/index.js.map +1 -1
  272. package/dist/main-stdio.d.ts.map +1 -1
  273. package/dist/main-stdio.js +4 -2
  274. package/dist/main-stdio.js.map +1 -1
  275. package/dist/main.d.ts.map +1 -1
  276. package/dist/main.js +10 -3
  277. package/dist/main.js.map +1 -1
  278. package/dist/migrations-config-values.d.ts.map +1 -1
  279. package/dist/migrations-config-values.js +2 -1
  280. package/dist/migrations-config-values.js.map +1 -1
  281. package/dist/migrations.d.ts.map +1 -1
  282. package/dist/migrations.js +5 -4
  283. package/dist/migrations.js.map +1 -1
  284. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  285. package/dist/modes/interactive/components/footer.js +2 -1
  286. package/dist/modes/interactive/components/footer.js.map +1 -1
  287. package/dist/modes/interactive/components/model-selector.d.ts +2 -2
  288. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  289. package/dist/modes/interactive/components/model-selector.js +27 -16
  290. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  291. package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
  292. package/dist/modes/interactive/components/settings-selector-items.js +67 -14
  293. package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
  294. package/dist/modes/interactive/components/settings-selector-submenus.d.ts +7 -1
  295. package/dist/modes/interactive/components/settings-selector-submenus.d.ts.map +1 -1
  296. package/dist/modes/interactive/components/settings-selector-submenus.js +38 -3
  297. package/dist/modes/interactive/components/settings-selector-submenus.js.map +1 -1
  298. package/dist/modes/interactive/components/settings-selector-types.d.ts +5 -1
  299. package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
  300. package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
  301. package/dist/modes/interactive/components/thinking-selector.d.ts +15 -6
  302. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  303. package/dist/modes/interactive/components/thinking-selector.js +65 -27
  304. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  305. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  306. package/dist/modes/interactive/external-editor.js +2 -1
  307. package/dist/modes/interactive/external-editor.js.map +1 -1
  308. package/dist/modes/interactive/interactive-agent-events.js +2 -0
  309. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  310. package/dist/modes/interactive/interactive-auth-login.d.ts +1 -1
  311. package/dist/modes/interactive/interactive-auth-login.d.ts.map +1 -1
  312. package/dist/modes/interactive/interactive-auth-login.js +9 -1
  313. package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
  314. package/dist/modes/interactive/interactive-autocomplete.js +9 -0
  315. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  316. package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -1
  317. package/dist/modes/interactive/interactive-deferred-startup.js +2 -0
  318. package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
  319. package/dist/modes/interactive/interactive-editor-actions.js +11 -10
  320. package/dist/modes/interactive/interactive-editor-actions.js.map +1 -1
  321. package/dist/modes/interactive/interactive-input-handling.js +6 -0
  322. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  323. package/dist/modes/interactive/interactive-mode-deps.d.ts +1 -0
  324. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
  325. package/dist/modes/interactive/interactive-mode-deps.js +1 -0
  326. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  327. package/dist/modes/interactive/interactive-mode-surface.d.ts +7 -0
  328. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  329. package/dist/modes/interactive/interactive-mode-surface.js +0 -1
  330. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  331. package/dist/modes/interactive/interactive-mode-types.d.ts +3 -0
  332. package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
  333. package/dist/modes/interactive/interactive-mode-types.js.map +1 -1
  334. package/dist/modes/interactive/interactive-model-routing.d.ts +16 -1
  335. package/dist/modes/interactive/interactive-model-routing.d.ts.map +1 -1
  336. package/dist/modes/interactive/interactive-model-routing.js +62 -3
  337. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  338. package/dist/modes/interactive/interactive-render-chat.js +18 -0
  339. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  340. package/dist/modes/interactive/interactive-selectors.js +10 -8
  341. package/dist/modes/interactive/interactive-selectors.js.map +1 -1
  342. package/dist/modes/interactive/interactive-slash-commands.js +6 -5
  343. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  344. package/dist/modes/interactive/interactive-startup.js +9 -1
  345. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  346. package/dist/modes/interactive/theme/theme-parse.d.ts.map +1 -1
  347. package/dist/modes/interactive/theme/theme-parse.js +2 -1
  348. package/dist/modes/interactive/theme/theme-parse.js.map +1 -1
  349. package/dist/modes/json-event.d.ts +15 -18
  350. package/dist/modes/json-event.d.ts.map +1 -1
  351. package/dist/modes/json-event.js +21 -17
  352. package/dist/modes/json-event.js.map +1 -1
  353. package/dist/modes/rpc/rpc-client-api.d.ts +4 -0
  354. package/dist/modes/rpc/rpc-client-api.d.ts.map +1 -1
  355. package/dist/modes/rpc/rpc-client-api.js +3 -0
  356. package/dist/modes/rpc/rpc-client-api.js.map +1 -1
  357. package/dist/utils/frontmatter.d.ts.map +1 -1
  358. package/dist/utils/frontmatter.js +2 -1
  359. package/dist/utils/frontmatter.js.map +1 -1
  360. package/dist/utils/management-http.d.ts +2 -0
  361. package/dist/utils/management-http.d.ts.map +1 -1
  362. package/dist/utils/management-http.js +11 -7
  363. package/dist/utils/management-http.js.map +1 -1
  364. package/dist/utils/shell.d.ts +3 -0
  365. package/dist/utils/shell.d.ts.map +1 -1
  366. package/dist/utils/shell.js +41 -10
  367. package/dist/utils/shell.js.map +1 -1
  368. package/dist/utils/syntax-highlight.d.ts +1 -0
  369. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  370. package/dist/utils/syntax-highlight.js +61 -1
  371. package/dist/utils/syntax-highlight.js.map +1 -1
  372. package/dist/utils/text.d.ts +8 -0
  373. package/dist/utils/text.d.ts.map +1 -0
  374. package/dist/utils/text.js +9 -0
  375. package/dist/utils/text.js.map +1 -0
  376. package/docs/changelog.mdx +1 -1
  377. package/docs/compaction.md +16 -3
  378. package/docs/containerization.md +17 -0
  379. package/docs/custom-provider.md +1 -1
  380. package/docs/environment-variables.md +3 -3
  381. package/docs/extensions.md +22 -5
  382. package/docs/index.md +12 -10
  383. package/docs/intercom.md +5 -3
  384. package/docs/keybindings.md +1 -1
  385. package/docs/llama-cpp.md +1 -1
  386. package/docs/models.md +2 -0
  387. package/docs/quickstart.md +80 -9
  388. package/docs/rpc.md +24 -1
  389. package/docs/sdk.md +11 -0
  390. package/docs/settings.md +16 -7
  391. package/docs/skills.md +3 -2
  392. package/docs/subagents.md +7 -0
  393. package/docs/termux.md +1 -1
  394. package/docs/usage.md +4 -3
  395. package/docs/windows.md +33 -3
  396. package/docs/workflows.md +20 -10
  397. package/examples/extensions/border-status-editor.ts +1 -1
  398. package/examples/extensions/git-checkpoint.ts +1 -1
  399. package/examples/extensions/notify.ts +1 -1
  400. package/examples/extensions/titlebar-spinner.ts +1 -1
  401. package/examples/rpc-extension-ui.ts +1 -1
  402. package/examples/sdk/README.md +1 -1
  403. package/npm-shrinkwrap.json +73 -65
  404. package/package.json +11 -13
@@ -1,4 +1,5 @@
1
1
  import { isContextOverflow, isRecoverableLength } from "@bastani/pi-ai/compat";
2
+ import { emitSessionCompactFailed } from "./agent-session-compaction.js";
2
3
  import { calculateContextTokens, estimateContextTokens, shouldCompact, } from "./compaction/index.js";
3
4
  import { MIN_RESPONSES_MAX_OUTPUT_TOKENS } from "./openai-responses-payload-sanitizer.js";
4
5
  import { getLatestCompactionBoundaryEntry } from "./session-manager.js";
@@ -93,6 +94,9 @@ export async function _checkCompaction(assistantMessage, skipAbortedCheck = true
93
94
  // recoverable output truncation stops without claiming overflow.
94
95
  if (contextOverflow)
95
96
  this._contextOverflowUnresolved = true;
97
+ const errorMessage = contextOverflow
98
+ ? "Context overflow recovery failed after one compact-and-retry attempt. Try reducing context or switching to a larger-context model."
99
+ : "Response truncation recovery stopped after one retry.";
96
100
  this._emit({
97
101
  type: "compaction_end",
98
102
  reason: "overflow",
@@ -100,9 +104,14 @@ export async function _checkCompaction(assistantMessage, skipAbortedCheck = true
100
104
  aborted: false,
101
105
  willRetry: false,
102
106
  ...(contextOverflow ? { unresolvedOverflow: true } : {}),
103
- errorMessage: contextOverflow
104
- ? "Context overflow recovery failed after one compact-and-retry attempt. Try reducing context or switching to a larger-context model."
105
- : "Response truncation recovery stopped after one retry.",
107
+ errorMessage,
108
+ });
109
+ await emitSessionCompactFailed(this, {
110
+ reason: "overflow",
111
+ errorMessage,
112
+ aborted: false,
113
+ willRetry: false,
114
+ fromExtension: false,
106
115
  });
107
116
  return;
108
117
  }
@@ -142,39 +151,42 @@ export async function _checkCompaction(assistantMessage, skipAbortedCheck = true
142
151
  return;
143
152
  }
144
153
  // Case 2: Threshold - context is getting large
145
- // For error messages (no usage data), estimate from last successful response.
146
- // This ensures sessions that hit persistent API errors (e.g. 529) can still compact.
147
- let contextTokens;
148
- if (assistantMessage.stopReason === "error") {
154
+ // For errors or all-zero provider usage, estimate from message content.
155
+ let contextTokens = calculateContextTokens(assistantMessage.usage, assistantMessage.api);
156
+ if (assistantMessage.stopReason === "error" || contextTokens === 0) {
149
157
  const messages = this.agent.state.messages;
150
158
  const estimate = estimateContextTokens(messages);
151
- if (estimate.lastUsageIndex === null)
152
- return; // No usage data at all
153
- // Verify the usage source is post-compaction. Kept pre-compaction messages
154
- // have stale usage reflecting the old (larger) context and would falsely
155
- // trigger compaction right after one just finished.
156
- const usageMsg = messages[estimate.lastUsageIndex];
157
- if (compactionBoundaryEntry &&
158
- usageMsg.role === "assistant" &&
159
- usageMsg.timestamp <= new Date(compactionBoundaryEntry.timestamp).getTime()) {
160
- return;
159
+ // Without provider usage, estimate.tokens is the pure message-size estimate.
160
+ // Only usage-backed estimates need the stale pre-compaction check.
161
+ if (estimate.lastUsageIndex !== null) {
162
+ const usageMsg = messages[estimate.lastUsageIndex];
163
+ if (compactionBoundaryEntry &&
164
+ usageMsg.role === "assistant" &&
165
+ usageMsg.timestamp <= new Date(compactionBoundaryEntry.timestamp).getTime()) {
166
+ return;
167
+ }
161
168
  }
162
169
  contextTokens = estimate.tokens;
163
170
  }
164
- else {
165
- contextTokens = calculateContextTokens(assistantMessage.usage, assistantMessage.api);
166
- }
167
171
  if (shouldCompact(contextTokens, contextWindow, settings)) {
168
172
  const willRetry = shouldRetryAfterThresholdCompaction(assistantMessage, desiredMaxOutput, isLiveTurnCompletion);
169
173
  if (willRetry && isRetryWorthyOutputBudgetError(assistantMessage)) {
170
174
  if (this._outputBudgetErrorContinuationAttempts >= MAX_OUTPUT_BUDGET_ERROR_CONTINUATION_ATTEMPTS) {
175
+ const errorMessage = "Output-budget recovery stopped after a compact-and-retry attempt. Try reducing context or switching to a larger-context model.";
171
176
  this._emit({
172
177
  type: "compaction_end",
173
178
  reason: "threshold",
174
179
  result: undefined,
175
180
  aborted: false,
176
181
  willRetry: false,
177
- errorMessage: "Output-budget recovery stopped after a compact-and-retry attempt. Try reducing context or switching to a larger-context model.",
182
+ errorMessage,
183
+ });
184
+ await emitSessionCompactFailed(this, {
185
+ reason: "threshold",
186
+ errorMessage,
187
+ aborted: false,
188
+ willRetry: false,
189
+ fromExtension: false,
178
190
  });
179
191
  return;
180
192
  }
@@ -403,6 +415,7 @@ export async function _runAutoCompaction(reason, willRetry, urgency = reason ===
403
415
  this._autoCompactionAbortController = controller;
404
416
  this._autoCompactionCompletion = completion.promise;
405
417
  this._compactionReason = reason;
418
+ let fromExtension = false;
406
419
  try {
407
420
  this._emit({ type: "compaction_start", reason });
408
421
  }
@@ -430,6 +443,12 @@ export async function _runAutoCompaction(reason, willRetry, urgency = reason ===
430
443
  unresolvedOverflow: overflowUnresolved.call(this, urgency === "load_bearing"),
431
444
  ...(manualTakeoverPending ? { manualTakeoverPending: true } : {}),
432
445
  });
446
+ await emitSessionCompactFailed(this, {
447
+ reason,
448
+ aborted: false,
449
+ willRetry: false,
450
+ fromExtension: false,
451
+ });
433
452
  return manualTakeoverPending ? "deferred" : "failed";
434
453
  }
435
454
  // Resolve auth only after extension hooks have had an opportunity to cancel
@@ -445,6 +464,9 @@ export async function _runAutoCompaction(reason, willRetry, urgency = reason ===
445
464
  backupLabel: urgency === "load_bearing" ? "overflow-auto-compact" : "auto-compact",
446
465
  reason,
447
466
  urgency,
467
+ onCompactionSource: (value) => {
468
+ fromExtension = value;
469
+ },
448
470
  // Only an actual context overflow proved the context cannot fit. A
449
471
  // recoverable length stop must never reach the fresh-context fallback.
450
472
  ...(urgency === "load_bearing" ? { allowSmallRegion: true } : {}),
@@ -460,6 +482,12 @@ export async function _runAutoCompaction(reason, willRetry, urgency = reason ===
460
482
  unresolvedOverflow: overflowUnresolved.call(this, urgency === "load_bearing"),
461
483
  ...(manualTakeoverPending ? { manualTakeoverPending: true } : {}),
462
484
  });
485
+ await emitSessionCompactFailed(this, {
486
+ reason,
487
+ aborted: false,
488
+ willRetry: false,
489
+ fromExtension,
490
+ });
463
491
  return manualTakeoverPending ? "deferred" : "not_compactable";
464
492
  }
465
493
  if (willRetry) {
@@ -482,6 +510,13 @@ export async function _runAutoCompaction(reason, willRetry, urgency = reason ===
482
510
  const errorMessage = error instanceof Error ? error.message : "compaction failed";
483
511
  const aborted = errorMessage === "Compaction cancelled" || (error instanceof Error && error.name === "AbortError");
484
512
  const manualTakeoverPending = hasPendingManualCompactionTakeover.call(this);
513
+ const formattedErrorMessage = aborted
514
+ ? undefined
515
+ : reason === "overflow"
516
+ ? urgency === "recoverable"
517
+ ? `Response truncation recovery failed: ${errorMessage}`
518
+ : `Context overflow recovery failed: ${errorMessage}`
519
+ : `Auto-compaction failed: ${errorMessage}`;
485
520
  this._emit({
486
521
  type: "compaction_end",
487
522
  reason,
@@ -490,13 +525,14 @@ export async function _runAutoCompaction(reason, willRetry, urgency = reason ===
490
525
  willRetry: false,
491
526
  unresolvedOverflow: overflowUnresolved.call(this, urgency === "load_bearing", aborted),
492
527
  ...(manualTakeoverPending ? { manualTakeoverPending: true } : {}),
493
- errorMessage: aborted
494
- ? undefined
495
- : reason === "overflow"
496
- ? urgency === "recoverable"
497
- ? `Response truncation recovery failed: ${errorMessage}`
498
- : `Context overflow recovery failed: ${errorMessage}`
499
- : `Auto-compaction failed: ${errorMessage}`,
528
+ errorMessage: formattedErrorMessage,
529
+ });
530
+ await emitSessionCompactFailed(this, {
531
+ reason,
532
+ errorMessage: formattedErrorMessage,
533
+ aborted,
534
+ willRetry: false,
535
+ fromExtension,
500
536
  });
501
537
  return manualTakeoverPending ? "deferred" : "failed";
502
538
  }
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-auto-compaction.js","sourceRoot":"","sources":["../../src/core/agent-session-auto-compaction.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage } from \"@bastani/pi-ai/compat\";\nimport { isContextOverflow, isRecoverableLength } from \"@bastani/pi-ai/compat\";\nimport type { AgentSessionInternalSurface as AgentSession, AutoCompactionRunOutcome } from \"./agent-session-methods.ts\";\nimport {\n\ttype CompactionUrgency,\n\tcalculateContextTokens,\n\testimateContextTokens,\n\tshouldCompact,\n} from \"./compaction/index.ts\";\nimport { MIN_RESPONSES_MAX_OUTPUT_TOKENS } from \"./openai-responses-payload-sanitizer.ts\";\nimport { getLatestCompactionBoundaryEntry } from \"./session-manager.ts\";\n\n/**\n * Upper bound on direct continuations after a response reaches its requested\n * output cap. Context-limited truncations use one compact-and-retry attempt\n * instead; this bound preserves Atomic's separate output-cap continuation.\n */\nexport const MAX_LENGTH_CONTINUATION_ATTEMPTS = 3;\n\nexport const MAX_OUTPUT_BUDGET_ERROR_CONTINUATION_ATTEMPTS = 1;\n\ntype JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\ntype ProviderErrorDetails = {\n\tmessage?: string;\n\tcode?: string;\n\tparam?: string;\n};\n\n/** Create the settlement boundary for a regular automatic compaction run. */\nexport function createAutoCompactionCompletion(): {\n\tpromise: Promise<void>;\n\tresolve: () => void;\n} {\n\tlet resolve!: () => void;\n\tconst promise = new Promise<void>((done) => {\n\t\tresolve = done;\n\t});\n\treturn { promise, resolve };\n}\n\nconst OUTPUT_BUDGET_PARAMETER_PATTERN = /\\bmax_output_tokens\\b/;\nconst OUTPUT_BUDGET_UNDERFLOW_PATTERN = new RegExp(\n\t`(?:integer\\\\s+below\\\\s+minimum\\\\s+value|expected\\\\s+(?:a\\\\s+)?value\\\\s*>=\\\\s*${MIN_RESPONSES_MAX_OUTPUT_TOKENS}|got\\\\s+1\\\\s+instead)`,\n);\n\nexport async function _checkCompaction(\n\tthis: AgentSession,\n\tassistantMessage: AssistantMessage,\n\tskipAbortedCheck = true,\n): Promise<void> {\n\tif (this._pendingPostToolCompactionGuard) {\n\t\tconst { result } = this._pendingPostToolCompactionGuard;\n\t\tthis._pendingPostToolCompactionGuard = undefined;\n\t\tthis._emit({\n\t\t\ttype: \"compaction_end\",\n\t\t\treason: \"threshold\",\n\t\t\tresult,\n\t\t\taborted: true,\n\t\t\twillRetry: false,\n\t\t\tmidTurn: true,\n\t\t\t...(hasPendingManualCompactionTakeover.call(this) ? { manualTakeoverPending: true } : {}),\n\t\t});\n\t}\n\tif (\n\t\tthis._postToolCompactionPreflightError !== undefined &&\n\t\tassistantMessage.errorMessage === this._postToolCompactionPreflightError\n\t) {\n\t\tthis._postToolCompactionPreflightError = undefined;\n\t\treturn;\n\t}\n\t// The agent_end path passes skipAbortedCheck=true; the pre-prompt path passes\n\t// false. Only the live turn-completion path may auto-continue a truncated\n\t// response — before a fresh user prompt we must not resume the old turn.\n\tconst isLiveTurnCompletion = skipAbortedCheck;\n\tconst settings = this.settingsManager.getCompactionSettings();\n\tconst contextWindow = this.model?.contextWindow ?? 0;\n\t// Skip overflow handling if the message came from a different model.\n\t// This handles the case where user switched from a smaller-context model (e.g. opus)\n\t// to a larger-context model (e.g. codex) - the overflow error from the old model\n\t// shouldn't trigger compaction for the new model.\n\tconst sameModel =\n\t\tthis.model !== undefined &&\n\t\tassistantMessage.provider === this.model.provider &&\n\t\tassistantMessage.model === this.model.id;\n\tconst contextOverflow = sameModel && isContextOverflow(assistantMessage, contextWindow);\n\tif (!settings.enabled) {\n\t\t// Compaction cannot recover this turn, so a configured fallback chain may\n\t\t// advance to a larger-context candidate instead of dead-ending.\n\t\tif (contextOverflow) this._contextOverflowUnresolved = true;\n\t\treturn;\n\t}\n\n\t// Skip if message was aborted (user cancelled) - unless skipAbortedCheck is false\n\tif (skipAbortedCheck && assistantMessage.stopReason === \"aborted\") return;\n\n\t// Skip compaction checks if this assistant message is older than the latest\n\t// compaction boundary. This prevents a stale pre-compaction usage/error\n\t// from retriggering compaction on the first prompt after compaction.\n\tconst compactionBoundaryEntry = getLatestCompactionBoundaryEntry(this.sessionManager.getBranch());\n\tconst assistantIsFromBeforeCompactionBoundary =\n\t\tcompactionBoundaryEntry !== null &&\n\t\tassistantMessage.timestamp <= new Date(compactionBoundaryEntry.timestamp).getTime();\n\tif (assistantIsFromBeforeCompactionBoundary) {\n\t\treturn;\n\t}\n\n\t// Case 1: Recoverable failure. Explicit/silent context overflow still uses\n\t// context metadata. A length stop below the model's original requested output\n\t// cap instead receives one compact-and-retry independent of context metadata.\n\t// This recovers a chat response; `truncated-range-recovery` separately parses\n\t// deletion records from a compaction planner response and is not involved here.\n\tconst desiredMaxOutput = this.model?.maxTokens ?? 0;\n\tconst recoverableLength =\n\t\tisLiveTurnCompletion && sameModel && isRecoverableLength(assistantMessage, desiredMaxOutput);\n\tif (contextOverflow || recoverableLength) {\n\t\tconst willRetry = assistantMessage.stopReason !== \"stop\";\n\t\tif (!willRetry) {\n\t\t\tawait this._runAutoCompaction(\"overflow\", false);\n\t\t\treturn;\n\t\t}\n\n\t\tconst recoveryAttempted = contextOverflow\n\t\t\t? this._overflowRecoveryAttempted\n\t\t\t: this._recoverableLengthRecoveryAttempted;\n\t\tif (recoveryAttempted) {\n\t\t\t// One recovery of this kind has already been spent on this turn. A real\n\t\t\t// context overflow may now advance to a larger-context fallback; a\n\t\t\t// recoverable output truncation stops without claiming overflow.\n\t\t\tif (contextOverflow) this._contextOverflowUnresolved = true;\n\t\t\tthis._emit({\n\t\t\t\ttype: \"compaction_end\",\n\t\t\t\treason: \"overflow\",\n\t\t\t\tresult: undefined,\n\t\t\t\taborted: false,\n\t\t\t\twillRetry: false,\n\t\t\t\t...(contextOverflow ? { unresolvedOverflow: true } : {}),\n\t\t\t\terrorMessage: contextOverflow\n\t\t\t\t\t? \"Context overflow recovery failed after one compact-and-retry attempt. Try reducing context or switching to a larger-context model.\"\n\t\t\t\t\t: \"Response truncation recovery stopped after one retry.\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (contextOverflow) this._overflowRecoveryAttempted = true;\n\t\telse this._recoverableLengthRecoveryAttempted = true;\n\t\tlet outcome: AutoCompactionRunOutcome;\n\t\ttry {\n\t\t\toutcome = contextOverflow\n\t\t\t\t? await this._runAutoCompaction(\"overflow\", willRetry)\n\t\t\t\t: await this._runAutoCompaction(\"overflow\", willRetry, \"recoverable\");\n\t\t} catch (error) {\n\t\t\tif (contextOverflow) this._overflowRecoveryAttempted = false;\n\t\t\telse this._recoverableLengthRecoveryAttempted = false;\n\t\t\tthrow error;\n\t\t}\n\t\tif (outcome === \"compacted\" || outcome === \"failed\") return;\n\t\t// No boundary means there is no context to free. Keep this recovery\n\t\t// attempt spent while its one direct continuation is pending, so another\n\t\t// below-cap stop cannot start a new compaction cycle.\n\t\tif (\n\t\t\trecoverableLength &&\n\t\t\toutcome === \"not_compactable\" &&\n\t\t\tthis._compactionAbortController === undefined &&\n\t\t\tthis._manualCompactionPromise === undefined\n\t\t) {\n\t\t\tthis._resumeAfterLengthTruncation();\n\t\t\treturn;\n\t\t}\n\t\tif (contextOverflow) this._overflowRecoveryAttempted = false;\n\t\telse this._recoverableLengthRecoveryAttempted = false;\n\t\treturn;\n\t}\n\n\t// Case 2: Threshold - context is getting large\n\t// For error messages (no usage data), estimate from last successful response.\n\t// This ensures sessions that hit persistent API errors (e.g. 529) can still compact.\n\tlet contextTokens: number;\n\tif (assistantMessage.stopReason === \"error\") {\n\t\tconst messages = this.agent.state.messages;\n\t\tconst estimate = estimateContextTokens(messages);\n\t\tif (estimate.lastUsageIndex === null) return; // No usage data at all\n\t\t// Verify the usage source is post-compaction. Kept pre-compaction messages\n\t\t// have stale usage reflecting the old (larger) context and would falsely\n\t\t// trigger compaction right after one just finished.\n\t\tconst usageMsg = messages[estimate.lastUsageIndex];\n\t\tif (\n\t\t\tcompactionBoundaryEntry &&\n\t\t\tusageMsg.role === \"assistant\" &&\n\t\t\t(usageMsg as AssistantMessage).timestamp <= new Date(compactionBoundaryEntry.timestamp).getTime()\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tcontextTokens = estimate.tokens;\n\t} else {\n\t\tcontextTokens = calculateContextTokens(assistantMessage.usage, assistantMessage.api);\n\t}\n\tif (shouldCompact(contextTokens, contextWindow, settings)) {\n\t\tconst willRetry = shouldRetryAfterThresholdCompaction(assistantMessage, desiredMaxOutput, isLiveTurnCompletion);\n\t\tif (willRetry && isRetryWorthyOutputBudgetError(assistantMessage)) {\n\t\t\tif (this._outputBudgetErrorContinuationAttempts >= MAX_OUTPUT_BUDGET_ERROR_CONTINUATION_ATTEMPTS) {\n\t\t\t\tthis._emit({\n\t\t\t\t\ttype: \"compaction_end\",\n\t\t\t\t\treason: \"threshold\",\n\t\t\t\t\tresult: undefined,\n\t\t\t\t\taborted: false,\n\t\t\t\t\twillRetry: false,\n\t\t\t\t\terrorMessage:\n\t\t\t\t\t\t\"Output-budget recovery stopped after a compact-and-retry attempt. Try reducing context or switching to a larger-context model.\",\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis._outputBudgetErrorContinuationAttempts += 1;\n\t\t}\n\t\tawait this._runAutoCompaction(\"threshold\", willRetry);\n\t\treturn;\n\t}\n\n\t// A length stop that reached its requested output cap is not the\n\t// context-limited truncation recovered above. Preserve Atomic's bounded\n\t// direct-continuation policy for that distinct case.\n\tif (\n\t\tisLiveTurnCompletion &&\n\t\tisOutputCappedLengthStop(assistantMessage, desiredMaxOutput) &&\n\t\tthis._compactionAbortController === undefined &&\n\t\tthis._manualCompactionPromise === undefined\n\t) {\n\t\tthis._resumeAfterLengthTruncation();\n\t}\n}\n\nexport function isRetryWorthyLengthStop(assistantMessage: AssistantMessage): boolean {\n\treturn assistantMessage.stopReason === \"length\" && assistantMessage.usage.output > 0;\n}\n\nexport function isOutputCappedLengthStop(assistantMessage: AssistantMessage, desiredMaxOutput: number): boolean {\n\treturn isRetryWorthyLengthStop(assistantMessage) && !isRecoverableLength(assistantMessage, desiredMaxOutput);\n}\n\nfunction isJsonRecord(value: JsonValue): value is { [key: string]: JsonValue } {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction stringField(record: { [key: string]: JsonValue }, key: string): string | undefined {\n\tconst value = record[key];\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\nfunction parseProviderErrorDetails(errorMessage: string): ProviderErrorDetails | undefined {\n\tconst start = errorMessage.indexOf(\"{\");\n\tconst end = errorMessage.lastIndexOf(\"}\");\n\tif (start === -1 || end <= start) return undefined;\n\n\ttry {\n\t\tconst parsed = JSON.parse(errorMessage.slice(start, end + 1)) as JsonValue;\n\t\tif (!isJsonRecord(parsed)) return undefined;\n\n\t\tconst nestedError = parsed.error;\n\t\tif (nestedError !== undefined && isJsonRecord(nestedError)) {\n\t\t\treturn {\n\t\t\t\tmessage: stringField(nestedError, \"message\"),\n\t\t\t\tcode: stringField(nestedError, \"code\") ?? stringField(parsed, \"code\"),\n\t\t\t\tparam: stringField(nestedError, \"param\") ?? stringField(parsed, \"param\"),\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tmessage: stringField(parsed, \"message\"),\n\t\t\tcode: stringField(parsed, \"code\"),\n\t\t\tparam: stringField(parsed, \"param\"),\n\t\t};\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction isOutputBudgetUnderflowText(text: string): boolean {\n\tconst message = text.toLowerCase();\n\treturn OUTPUT_BUDGET_PARAMETER_PATTERN.test(message) && OUTPUT_BUDGET_UNDERFLOW_PATTERN.test(message);\n}\n\nfunction isStructuredOutputBudgetUnderflow(details: ProviderErrorDetails): boolean {\n\tconst message = details.message?.toLowerCase() ?? \"\";\n\tconst param = details.param?.toLowerCase();\n\tif (!OUTPUT_BUDGET_UNDERFLOW_PATTERN.test(message)) return false;\n\treturn param !== undefined\n\t\t? OUTPUT_BUDGET_PARAMETER_PATTERN.test(param)\n\t\t: OUTPUT_BUDGET_PARAMETER_PATTERN.test(message);\n}\n\nexport function isRetryWorthyOutputBudgetError(assistantMessage: AssistantMessage): boolean {\n\tif (assistantMessage.stopReason !== \"error\" || !assistantMessage.errorMessage) return false;\n\tif (assistantMessage.api !== \"openai-responses\") return false;\n\n\tconst structuredDetails = parseProviderErrorDetails(assistantMessage.errorMessage);\n\tif (structuredDetails && isStructuredOutputBudgetUnderflow(structuredDetails)) return true;\n\n\treturn isOutputBudgetUnderflowText(assistantMessage.errorMessage);\n}\n\nexport function shouldRetryAfterThresholdCompaction(\n\tassistantMessage: AssistantMessage,\n\tdesiredMaxOutput: number,\n\tisLiveTurnCompletion: boolean,\n): boolean {\n\treturn (\n\t\tisRetryWorthyOutputBudgetError(assistantMessage) ||\n\t\t(isLiveTurnCompletion && isOutputCappedLengthStop(assistantMessage, desiredMaxOutput))\n\t);\n}\n\n/**\n * Internal: remove an incomplete assistant from retry context before auto-continuing after compaction.\n */\n\nexport function _dropTrailingAutoCompactionRetryAssistantIfPresent(this: AgentSession): void {\n\tconst messages = this.agent.state.messages;\n\tconst lastMsg = messages[messages.length - 1];\n\tif (lastMsg?.role !== \"assistant\") return;\n\tconst stopReason = (lastMsg as AssistantMessage).stopReason;\n\tif (stopReason === \"error\" || stopReason === \"length\") {\n\t\tthis.agent.state.messages = messages.slice(0, -1);\n\t}\n}\n\n/**\n * Internal: schedule a live post-event continuation after compaction_end listeners can flush queues.\n * The grace period preserves listener ordering. Queue-only probes wait for transient work to become\n * idle, while retry probes remain tied to the turn that scheduled them and are abandoned if another\n * turn owns the agent when the grace period ends.\n */\n\nexport function _schedulePostAutoCompactionContinuationProbe(\n\tthis: AgentSession,\n\t_reason: \"overflow\" | \"threshold\",\n\twillRetry: boolean,\n): void {\n\tconst token = this._postCompactionContinuationToken + 1;\n\tthis._postCompactionContinuationToken = token;\n\tconst fallbackScopeGeneration = this._fallbackOriginGeneration;\n\tlet pending: Promise<void>;\n\tpending = new Promise<void>((resolve) => {\n\t\tsetTimeout(() => {\n\t\t\tvoid (async () => {\n\t\t\t\tconst settleIfOwned = async (): Promise<void> => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tfallbackScopeGeneration === undefined ||\n\t\t\t\t\t\tthis._fallbackOriginGeneration !== fallbackScopeGeneration ||\n\t\t\t\t\t\ttypeof this._settleFallbackModelScope !== \"function\"\n\t\t\t\t\t)\n\t\t\t\t\t\treturn;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this._settleFallbackModelScope();\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// A listener must not strand the continuation waiter. The fallback\n\t\t\t\t\t\t// state was already settled before lifecycle notifications ran.\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\ttry {\n\t\t\t\t\tif (willRetry) {\n\t\t\t\t\t\tif (this._postCompactionContinuationToken !== token) return;\n\t\t\t\t\t\tif (this.isCompacting || this.isStreaming) return;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait this.agent.waitForIdle();\n\t\t\t\t\t\tif (this._postCompactionContinuationToken !== token) return;\n\t\t\t\t\t\tif (this.isCompacting || this.isStreaming) return;\n\t\t\t\t\t\tif (!this.agent.hasQueuedMessages()) {\n\t\t\t\t\t\t\tawait settleIfOwned();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// A queued message starts the next user turn. Settle before Agent\n\t\t\t\t\t\t// snapshots the next request's model.\n\t\t\t\t\t\tawait settleIfOwned();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this._pendingPostCompactionContinuation !== pending) return;\n\t\t\t\t\t// Clear this probe before entering the next run. Its promise is\n\t\t\t\t\t// still awaited by _awaitPendingPostCompactionContinuation, but\n\t\t\t\t\t// the nested agent_end must be free to schedule a new probe.\n\t\t\t\t\tthis._pendingPostCompactionContinuation = undefined;\n\t\t\t\t\tawait this._resumeAfterAutoCompaction();\n\t\t\t\t\tif (willRetry && this._pendingPostCompactionContinuation === undefined) {\n\t\t\t\t\t\tawait settleIfOwned();\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\tif (this._pendingPostCompactionContinuation === pending) {\n\t\t\t\t\t\tthis._pendingPostCompactionContinuation = undefined;\n\t\t\t\t\t}\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t})();\n\t\t}, 100);\n\t});\n\tthis._pendingPostCompactionContinuation = pending;\n}\n\nexport async function _awaitPendingPostCompactionContinuation(this: AgentSession): Promise<void> {\n\tconst pending = this._pendingPostCompactionContinuation;\n\tif (pending === undefined) return;\n\tawait pending;\n}\n\n/**\n * Internal: resume generation after successful auto-compaction only when active work remains.\n */\n\nexport async function _resumeAfterAutoCompaction(this: AgentSession): Promise<void> {\n\ttry {\n\t\tawait this._runAgentContinue();\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthis._emit({\n\t\t\ttype: \"agent_continue_error\",\n\t\t\tsource: \"post_compaction\",\n\t\t\terrorMessage: `Post-compaction continuation failed: ${message}`,\n\t\t});\n\t}\n}\n\n/**\n * Internal: resume a response that reached its requested output cap when the\n * context does not warrant compaction. Bounded so a model that repeatedly\n * stops at that cap can still terminate.\n */\n\nexport function _resumeAfterLengthTruncation(this: AgentSession): void {\n\tif (this._lengthContinuationAttempts >= MAX_LENGTH_CONTINUATION_ATTEMPTS) return;\n\tthis._lengthContinuationAttempts += 1;\n\t// agent.continue() rejects an assistant tail; drop the incomplete\n\t// length-stopped message so the preceding user/tool-result anchors the\n\t// continuation. It remains persisted in session history.\n\tthis._dropTrailingAutoCompactionRetryAssistantIfPresent();\n\tthis._schedulePostAutoCompactionContinuationProbe(\"threshold\", true);\n}\n\n/**\n * Whether an overflow turn is now unrecoverable by compaction, recording it on\n * the session so a configured fallback chain may advance to another candidate.\n */\nfunction overflowUnresolved(this: AgentSession, loadBearing: boolean, aborted = false): boolean | undefined {\n\tif (!loadBearing || aborted) return undefined;\n\tthis._contextOverflowUnresolved = true;\n\treturn true;\n}\n\nexport function hasPendingManualCompactionTakeover(this: AgentSession): boolean {\n\treturn this._compactionReason === \"manual\" && this._compactionAbortController !== undefined;\n}\n\nexport async function _runAutoCompaction(\n\tthis: AgentSession,\n\treason: \"overflow\" | \"threshold\",\n\twillRetry: boolean,\n\turgency: CompactionUrgency = reason === \"overflow\" ? \"load_bearing\" : \"recoverable\",\n): Promise<AutoCompactionRunOutcome> {\n\tif (\n\t\tthis._compactionAbortController !== undefined ||\n\t\tthis._manualCompactionPromise !== undefined ||\n\t\tthis._autoCompactionAbortController !== undefined\n\t)\n\t\treturn \"deferred\";\n\n\tconst controller = new AbortController();\n\tconst completion = createAutoCompactionCompletion();\n\tthis._autoCompactionAbortController = controller;\n\tthis._autoCompactionCompletion = completion.promise;\n\tthis._compactionReason = reason;\n\ttry {\n\t\tthis._emit({ type: \"compaction_start\", reason });\n\t} catch (error) {\n\t\t// A throwing start listener still propagates, matching current behavior,\n\t\t// but must not leave ownership published with no owner running.\n\t\tif (this._autoCompactionAbortController === controller) this._autoCompactionAbortController = undefined;\n\t\tif (this._compactionReason === reason) this._compactionReason = undefined;\n\t\tcompletion.resolve();\n\t\tif (this._autoCompactionCompletion === completion.promise) this._autoCompactionCompletion = undefined;\n\t\tthrow error;\n\t}\n\n\ttry {\n\t\tif (!this.model) {\n\t\t\tconst manualTakeoverPending = hasPendingManualCompactionTakeover.call(this);\n\t\t\tthis._emit({\n\t\t\t\ttype: \"compaction_end\",\n\t\t\t\treason,\n\t\t\t\tresult: undefined,\n\t\t\t\taborted: false,\n\t\t\t\twillRetry: false,\n\t\t\t\tunresolvedOverflow: overflowUnresolved.call(this, urgency === \"load_bearing\"),\n\t\t\t\t...(manualTakeoverPending ? { manualTakeoverPending: true } : {}),\n\t\t\t});\n\t\t\treturn manualTakeoverPending ? \"deferred\" : \"failed\";\n\t\t}\n\n\t\t// Resolve auth only after extension hooks have had an opportunity to cancel\n\t\t// compaction or provide compacted text, so local extension compaction does not\n\t\t// require provider credentials. Missing auth then fails model-driven compaction\n\t\t// before persistence or continuation, matching other provider-call failures.\n\t\tconst result = await this._applyVerbatimCompaction({\n\t\t\tresolvePlannerAuth: async (candidate) => {\n\t\t\t\tconst authResult = await this._getRequiredRequestAuth(candidate);\n\t\t\t\treturn authResult.apiKey || authResult.headers ? authResult : undefined;\n\t\t\t},\n\t\t\tabortController: controller,\n\t\t\tbackupLabel: urgency === \"load_bearing\" ? \"overflow-auto-compact\" : \"auto-compact\",\n\t\t\treason,\n\t\t\turgency,\n\t\t\t// Only an actual context overflow proved the context cannot fit. A\n\t\t\t// recoverable length stop must never reach the fresh-context fallback.\n\t\t\t...(urgency === \"load_bearing\" ? { allowSmallRegion: true } : {}),\n\t\t});\n\t\tif (!result) {\n\t\t\tconst manualTakeoverPending = hasPendingManualCompactionTakeover.call(this);\n\t\t\tthis._emit({\n\t\t\t\ttype: \"compaction_end\",\n\t\t\t\treason,\n\t\t\t\tresult: undefined,\n\t\t\t\taborted: false,\n\t\t\t\twillRetry: false,\n\t\t\t\tunresolvedOverflow: overflowUnresolved.call(this, urgency === \"load_bearing\"),\n\t\t\t\t...(manualTakeoverPending ? { manualTakeoverPending: true } : {}),\n\t\t\t});\n\t\t\treturn manualTakeoverPending ? \"deferred\" : \"not_compactable\";\n\t\t}\n\n\t\tif (willRetry) {\n\t\t\tthis._dropTrailingAutoCompactionRetryAssistantIfPresent();\n\t\t}\n\n\t\tthis._emit({\n\t\t\ttype: \"compaction_end\",\n\t\t\treason,\n\t\t\tresult,\n\t\t\taborted: false,\n\t\t\twillRetry,\n\t\t\t...(hasPendingManualCompactionTakeover.call(this) ? { manualTakeoverPending: true } : {}),\n\t\t});\n\t\tif (!hasPendingManualCompactionTakeover.call(this)) {\n\t\t\tthis._schedulePostAutoCompactionContinuationProbe(reason, willRetry);\n\t\t}\n\t\treturn \"compacted\";\n\t} catch (error) {\n\t\tconst errorMessage = error instanceof Error ? error.message : \"compaction failed\";\n\t\tconst aborted =\n\t\t\terrorMessage === \"Compaction cancelled\" || (error instanceof Error && error.name === \"AbortError\");\n\t\tconst manualTakeoverPending = hasPendingManualCompactionTakeover.call(this);\n\t\tthis._emit({\n\t\t\ttype: \"compaction_end\",\n\t\t\treason,\n\t\t\tresult: undefined,\n\t\t\taborted,\n\t\t\twillRetry: false,\n\t\t\tunresolvedOverflow: overflowUnresolved.call(this, urgency === \"load_bearing\", aborted),\n\t\t\t...(manualTakeoverPending ? { manualTakeoverPending: true } : {}),\n\t\t\terrorMessage: aborted\n\t\t\t\t? undefined\n\t\t\t\t: reason === \"overflow\"\n\t\t\t\t\t? urgency === \"recoverable\"\n\t\t\t\t\t\t? `Response truncation recovery failed: ${errorMessage}`\n\t\t\t\t\t\t: `Context overflow recovery failed: ${errorMessage}`\n\t\t\t\t\t: `Auto-compaction failed: ${errorMessage}`,\n\t\t});\n\t\treturn manualTakeoverPending ? \"deferred\" : \"failed\";\n\t} finally {\n\t\tif (this._autoCompactionAbortController === controller) this._autoCompactionAbortController = undefined;\n\t\tif (this._compactionReason === reason) this._compactionReason = undefined;\n\t\tcompletion.resolve();\n\t\tif (this._autoCompactionCompletion === completion.promise) this._autoCompactionCompletion = undefined;\n\t}\n}\n\n/**\n * Toggle auto-compaction setting.\n */\n\nexport const agentSessionAutoCompactionMethods = {\n\t_awaitPendingPostCompactionContinuation,\n\t_checkCompaction,\n\t_dropTrailingAutoCompactionRetryAssistantIfPresent,\n\t_schedulePostAutoCompactionContinuationProbe,\n\t_resumeAfterAutoCompaction,\n\t_resumeAfterLengthTruncation,\n\t_runAutoCompaction,\n};\n"]}
1
+ {"version":3,"file":"agent-session-auto-compaction.js","sourceRoot":"","sources":["../../src/core/agent-session-auto-compaction.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage } from \"@bastani/pi-ai/compat\";\nimport { isContextOverflow, isRecoverableLength } from \"@bastani/pi-ai/compat\";\nimport { emitSessionCompactFailed } from \"./agent-session-compaction.ts\";\nimport type { AgentSessionInternalSurface as AgentSession, AutoCompactionRunOutcome } from \"./agent-session-methods.ts\";\nimport {\n\ttype CompactionUrgency,\n\tcalculateContextTokens,\n\testimateContextTokens,\n\tshouldCompact,\n} from \"./compaction/index.ts\";\nimport { MIN_RESPONSES_MAX_OUTPUT_TOKENS } from \"./openai-responses-payload-sanitizer.ts\";\nimport { getLatestCompactionBoundaryEntry } from \"./session-manager.ts\";\n\n/**\n * Upper bound on direct continuations after a response reaches its requested\n * output cap. Context-limited truncations use one compact-and-retry attempt\n * instead; this bound preserves Atomic's separate output-cap continuation.\n */\nexport const MAX_LENGTH_CONTINUATION_ATTEMPTS = 3;\n\nexport const MAX_OUTPUT_BUDGET_ERROR_CONTINUATION_ATTEMPTS = 1;\n\ntype JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\ntype ProviderErrorDetails = {\n\tmessage?: string;\n\tcode?: string;\n\tparam?: string;\n};\n\n/** Create the settlement boundary for a regular automatic compaction run. */\nexport function createAutoCompactionCompletion(): {\n\tpromise: Promise<void>;\n\tresolve: () => void;\n} {\n\tlet resolve!: () => void;\n\tconst promise = new Promise<void>((done) => {\n\t\tresolve = done;\n\t});\n\treturn { promise, resolve };\n}\n\nconst OUTPUT_BUDGET_PARAMETER_PATTERN = /\\bmax_output_tokens\\b/;\nconst OUTPUT_BUDGET_UNDERFLOW_PATTERN = new RegExp(\n\t`(?:integer\\\\s+below\\\\s+minimum\\\\s+value|expected\\\\s+(?:a\\\\s+)?value\\\\s*>=\\\\s*${MIN_RESPONSES_MAX_OUTPUT_TOKENS}|got\\\\s+1\\\\s+instead)`,\n);\n\nexport async function _checkCompaction(\n\tthis: AgentSession,\n\tassistantMessage: AssistantMessage,\n\tskipAbortedCheck = true,\n): Promise<void> {\n\tif (this._pendingPostToolCompactionGuard) {\n\t\tconst { result } = this._pendingPostToolCompactionGuard;\n\t\tthis._pendingPostToolCompactionGuard = undefined;\n\t\tthis._emit({\n\t\t\ttype: \"compaction_end\",\n\t\t\treason: \"threshold\",\n\t\t\tresult,\n\t\t\taborted: true,\n\t\t\twillRetry: false,\n\t\t\tmidTurn: true,\n\t\t\t...(hasPendingManualCompactionTakeover.call(this) ? { manualTakeoverPending: true } : {}),\n\t\t});\n\t}\n\tif (\n\t\tthis._postToolCompactionPreflightError !== undefined &&\n\t\tassistantMessage.errorMessage === this._postToolCompactionPreflightError\n\t) {\n\t\tthis._postToolCompactionPreflightError = undefined;\n\t\treturn;\n\t}\n\t// The agent_end path passes skipAbortedCheck=true; the pre-prompt path passes\n\t// false. Only the live turn-completion path may auto-continue a truncated\n\t// response — before a fresh user prompt we must not resume the old turn.\n\tconst isLiveTurnCompletion = skipAbortedCheck;\n\tconst settings = this.settingsManager.getCompactionSettings();\n\tconst contextWindow = this.model?.contextWindow ?? 0;\n\t// Skip overflow handling if the message came from a different model.\n\t// This handles the case where user switched from a smaller-context model (e.g. opus)\n\t// to a larger-context model (e.g. codex) - the overflow error from the old model\n\t// shouldn't trigger compaction for the new model.\n\tconst sameModel =\n\t\tthis.model !== undefined &&\n\t\tassistantMessage.provider === this.model.provider &&\n\t\tassistantMessage.model === this.model.id;\n\tconst contextOverflow = sameModel && isContextOverflow(assistantMessage, contextWindow);\n\tif (!settings.enabled) {\n\t\t// Compaction cannot recover this turn, so a configured fallback chain may\n\t\t// advance to a larger-context candidate instead of dead-ending.\n\t\tif (contextOverflow) this._contextOverflowUnresolved = true;\n\t\treturn;\n\t}\n\n\t// Skip if message was aborted (user cancelled) - unless skipAbortedCheck is false\n\tif (skipAbortedCheck && assistantMessage.stopReason === \"aborted\") return;\n\n\t// Skip compaction checks if this assistant message is older than the latest\n\t// compaction boundary. This prevents a stale pre-compaction usage/error\n\t// from retriggering compaction on the first prompt after compaction.\n\tconst compactionBoundaryEntry = getLatestCompactionBoundaryEntry(this.sessionManager.getBranch());\n\tconst assistantIsFromBeforeCompactionBoundary =\n\t\tcompactionBoundaryEntry !== null &&\n\t\tassistantMessage.timestamp <= new Date(compactionBoundaryEntry.timestamp).getTime();\n\tif (assistantIsFromBeforeCompactionBoundary) {\n\t\treturn;\n\t}\n\n\t// Case 1: Recoverable failure. Explicit/silent context overflow still uses\n\t// context metadata. A length stop below the model's original requested output\n\t// cap instead receives one compact-and-retry independent of context metadata.\n\t// This recovers a chat response; `truncated-range-recovery` separately parses\n\t// deletion records from a compaction planner response and is not involved here.\n\tconst desiredMaxOutput = this.model?.maxTokens ?? 0;\n\tconst recoverableLength =\n\t\tisLiveTurnCompletion && sameModel && isRecoverableLength(assistantMessage, desiredMaxOutput);\n\tif (contextOverflow || recoverableLength) {\n\t\tconst willRetry = assistantMessage.stopReason !== \"stop\";\n\t\tif (!willRetry) {\n\t\t\tawait this._runAutoCompaction(\"overflow\", false);\n\t\t\treturn;\n\t\t}\n\n\t\tconst recoveryAttempted = contextOverflow\n\t\t\t? this._overflowRecoveryAttempted\n\t\t\t: this._recoverableLengthRecoveryAttempted;\n\t\tif (recoveryAttempted) {\n\t\t\t// One recovery of this kind has already been spent on this turn. A real\n\t\t\t// context overflow may now advance to a larger-context fallback; a\n\t\t\t// recoverable output truncation stops without claiming overflow.\n\t\t\tif (contextOverflow) this._contextOverflowUnresolved = true;\n\t\t\tconst errorMessage = contextOverflow\n\t\t\t\t? \"Context overflow recovery failed after one compact-and-retry attempt. Try reducing context or switching to a larger-context model.\"\n\t\t\t\t: \"Response truncation recovery stopped after one retry.\";\n\t\t\tthis._emit({\n\t\t\t\ttype: \"compaction_end\",\n\t\t\t\treason: \"overflow\",\n\t\t\t\tresult: undefined,\n\t\t\t\taborted: false,\n\t\t\t\twillRetry: false,\n\t\t\t\t...(contextOverflow ? { unresolvedOverflow: true } : {}),\n\t\t\t\terrorMessage,\n\t\t\t});\n\t\t\tawait emitSessionCompactFailed(this, {\n\t\t\t\treason: \"overflow\",\n\t\t\t\terrorMessage,\n\t\t\t\taborted: false,\n\t\t\t\twillRetry: false,\n\t\t\t\tfromExtension: false,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (contextOverflow) this._overflowRecoveryAttempted = true;\n\t\telse this._recoverableLengthRecoveryAttempted = true;\n\t\tlet outcome: AutoCompactionRunOutcome;\n\t\ttry {\n\t\t\toutcome = contextOverflow\n\t\t\t\t? await this._runAutoCompaction(\"overflow\", willRetry)\n\t\t\t\t: await this._runAutoCompaction(\"overflow\", willRetry, \"recoverable\");\n\t\t} catch (error) {\n\t\t\tif (contextOverflow) this._overflowRecoveryAttempted = false;\n\t\t\telse this._recoverableLengthRecoveryAttempted = false;\n\t\t\tthrow error;\n\t\t}\n\t\tif (outcome === \"compacted\" || outcome === \"failed\") return;\n\t\t// No boundary means there is no context to free. Keep this recovery\n\t\t// attempt spent while its one direct continuation is pending, so another\n\t\t// below-cap stop cannot start a new compaction cycle.\n\t\tif (\n\t\t\trecoverableLength &&\n\t\t\toutcome === \"not_compactable\" &&\n\t\t\tthis._compactionAbortController === undefined &&\n\t\t\tthis._manualCompactionPromise === undefined\n\t\t) {\n\t\t\tthis._resumeAfterLengthTruncation();\n\t\t\treturn;\n\t\t}\n\t\tif (contextOverflow) this._overflowRecoveryAttempted = false;\n\t\telse this._recoverableLengthRecoveryAttempted = false;\n\t\treturn;\n\t}\n\n\t// Case 2: Threshold - context is getting large\n\t// For errors or all-zero provider usage, estimate from message content.\n\tlet contextTokens = calculateContextTokens(assistantMessage.usage, assistantMessage.api);\n\tif (assistantMessage.stopReason === \"error\" || contextTokens === 0) {\n\t\tconst messages = this.agent.state.messages;\n\t\tconst estimate = estimateContextTokens(messages);\n\t\t// Without provider usage, estimate.tokens is the pure message-size estimate.\n\t\t// Only usage-backed estimates need the stale pre-compaction check.\n\t\tif (estimate.lastUsageIndex !== null) {\n\t\t\tconst usageMsg = messages[estimate.lastUsageIndex];\n\t\t\tif (\n\t\t\t\tcompactionBoundaryEntry &&\n\t\t\t\tusageMsg.role === \"assistant\" &&\n\t\t\t\t(usageMsg as AssistantMessage).timestamp <= new Date(compactionBoundaryEntry.timestamp).getTime()\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tcontextTokens = estimate.tokens;\n\t}\n\tif (shouldCompact(contextTokens, contextWindow, settings)) {\n\t\tconst willRetry = shouldRetryAfterThresholdCompaction(assistantMessage, desiredMaxOutput, isLiveTurnCompletion);\n\t\tif (willRetry && isRetryWorthyOutputBudgetError(assistantMessage)) {\n\t\t\tif (this._outputBudgetErrorContinuationAttempts >= MAX_OUTPUT_BUDGET_ERROR_CONTINUATION_ATTEMPTS) {\n\t\t\t\tconst errorMessage =\n\t\t\t\t\t\"Output-budget recovery stopped after a compact-and-retry attempt. Try reducing context or switching to a larger-context model.\";\n\t\t\t\tthis._emit({\n\t\t\t\t\ttype: \"compaction_end\",\n\t\t\t\t\treason: \"threshold\",\n\t\t\t\t\tresult: undefined,\n\t\t\t\t\taborted: false,\n\t\t\t\t\twillRetry: false,\n\t\t\t\t\terrorMessage,\n\t\t\t\t});\n\t\t\t\tawait emitSessionCompactFailed(this, {\n\t\t\t\t\treason: \"threshold\",\n\t\t\t\t\terrorMessage,\n\t\t\t\t\taborted: false,\n\t\t\t\t\twillRetry: false,\n\t\t\t\t\tfromExtension: false,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis._outputBudgetErrorContinuationAttempts += 1;\n\t\t}\n\t\tawait this._runAutoCompaction(\"threshold\", willRetry);\n\t\treturn;\n\t}\n\n\t// A length stop that reached its requested output cap is not the\n\t// context-limited truncation recovered above. Preserve Atomic's bounded\n\t// direct-continuation policy for that distinct case.\n\tif (\n\t\tisLiveTurnCompletion &&\n\t\tisOutputCappedLengthStop(assistantMessage, desiredMaxOutput) &&\n\t\tthis._compactionAbortController === undefined &&\n\t\tthis._manualCompactionPromise === undefined\n\t) {\n\t\tthis._resumeAfterLengthTruncation();\n\t}\n}\n\nexport function isRetryWorthyLengthStop(assistantMessage: AssistantMessage): boolean {\n\treturn assistantMessage.stopReason === \"length\" && assistantMessage.usage.output > 0;\n}\n\nexport function isOutputCappedLengthStop(assistantMessage: AssistantMessage, desiredMaxOutput: number): boolean {\n\treturn isRetryWorthyLengthStop(assistantMessage) && !isRecoverableLength(assistantMessage, desiredMaxOutput);\n}\n\nfunction isJsonRecord(value: JsonValue): value is { [key: string]: JsonValue } {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction stringField(record: { [key: string]: JsonValue }, key: string): string | undefined {\n\tconst value = record[key];\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\nfunction parseProviderErrorDetails(errorMessage: string): ProviderErrorDetails | undefined {\n\tconst start = errorMessage.indexOf(\"{\");\n\tconst end = errorMessage.lastIndexOf(\"}\");\n\tif (start === -1 || end <= start) return undefined;\n\n\ttry {\n\t\tconst parsed = JSON.parse(errorMessage.slice(start, end + 1)) as JsonValue;\n\t\tif (!isJsonRecord(parsed)) return undefined;\n\n\t\tconst nestedError = parsed.error;\n\t\tif (nestedError !== undefined && isJsonRecord(nestedError)) {\n\t\t\treturn {\n\t\t\t\tmessage: stringField(nestedError, \"message\"),\n\t\t\t\tcode: stringField(nestedError, \"code\") ?? stringField(parsed, \"code\"),\n\t\t\t\tparam: stringField(nestedError, \"param\") ?? stringField(parsed, \"param\"),\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tmessage: stringField(parsed, \"message\"),\n\t\t\tcode: stringField(parsed, \"code\"),\n\t\t\tparam: stringField(parsed, \"param\"),\n\t\t};\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction isOutputBudgetUnderflowText(text: string): boolean {\n\tconst message = text.toLowerCase();\n\treturn OUTPUT_BUDGET_PARAMETER_PATTERN.test(message) && OUTPUT_BUDGET_UNDERFLOW_PATTERN.test(message);\n}\n\nfunction isStructuredOutputBudgetUnderflow(details: ProviderErrorDetails): boolean {\n\tconst message = details.message?.toLowerCase() ?? \"\";\n\tconst param = details.param?.toLowerCase();\n\tif (!OUTPUT_BUDGET_UNDERFLOW_PATTERN.test(message)) return false;\n\treturn param !== undefined\n\t\t? OUTPUT_BUDGET_PARAMETER_PATTERN.test(param)\n\t\t: OUTPUT_BUDGET_PARAMETER_PATTERN.test(message);\n}\n\nexport function isRetryWorthyOutputBudgetError(assistantMessage: AssistantMessage): boolean {\n\tif (assistantMessage.stopReason !== \"error\" || !assistantMessage.errorMessage) return false;\n\tif (assistantMessage.api !== \"openai-responses\") return false;\n\n\tconst structuredDetails = parseProviderErrorDetails(assistantMessage.errorMessage);\n\tif (structuredDetails && isStructuredOutputBudgetUnderflow(structuredDetails)) return true;\n\n\treturn isOutputBudgetUnderflowText(assistantMessage.errorMessage);\n}\n\nexport function shouldRetryAfterThresholdCompaction(\n\tassistantMessage: AssistantMessage,\n\tdesiredMaxOutput: number,\n\tisLiveTurnCompletion: boolean,\n): boolean {\n\treturn (\n\t\tisRetryWorthyOutputBudgetError(assistantMessage) ||\n\t\t(isLiveTurnCompletion && isOutputCappedLengthStop(assistantMessage, desiredMaxOutput))\n\t);\n}\n\n/**\n * Internal: remove an incomplete assistant from retry context before auto-continuing after compaction.\n */\n\nexport function _dropTrailingAutoCompactionRetryAssistantIfPresent(this: AgentSession): void {\n\tconst messages = this.agent.state.messages;\n\tconst lastMsg = messages[messages.length - 1];\n\tif (lastMsg?.role !== \"assistant\") return;\n\tconst stopReason = (lastMsg as AssistantMessage).stopReason;\n\tif (stopReason === \"error\" || stopReason === \"length\") {\n\t\tthis.agent.state.messages = messages.slice(0, -1);\n\t}\n}\n\n/**\n * Internal: schedule a live post-event continuation after compaction_end listeners can flush queues.\n * The grace period preserves listener ordering. Queue-only probes wait for transient work to become\n * idle, while retry probes remain tied to the turn that scheduled them and are abandoned if another\n * turn owns the agent when the grace period ends.\n */\n\nexport function _schedulePostAutoCompactionContinuationProbe(\n\tthis: AgentSession,\n\t_reason: \"overflow\" | \"threshold\",\n\twillRetry: boolean,\n): void {\n\tconst token = this._postCompactionContinuationToken + 1;\n\tthis._postCompactionContinuationToken = token;\n\tconst fallbackScopeGeneration = this._fallbackOriginGeneration;\n\tlet pending: Promise<void>;\n\tpending = new Promise<void>((resolve) => {\n\t\tsetTimeout(() => {\n\t\t\tvoid (async () => {\n\t\t\t\tconst settleIfOwned = async (): Promise<void> => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tfallbackScopeGeneration === undefined ||\n\t\t\t\t\t\tthis._fallbackOriginGeneration !== fallbackScopeGeneration ||\n\t\t\t\t\t\ttypeof this._settleFallbackModelScope !== \"function\"\n\t\t\t\t\t)\n\t\t\t\t\t\treturn;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this._settleFallbackModelScope();\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// A listener must not strand the continuation waiter. The fallback\n\t\t\t\t\t\t// state was already settled before lifecycle notifications ran.\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\ttry {\n\t\t\t\t\tif (willRetry) {\n\t\t\t\t\t\tif (this._postCompactionContinuationToken !== token) return;\n\t\t\t\t\t\tif (this.isCompacting || this.isStreaming) return;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait this.agent.waitForIdle();\n\t\t\t\t\t\tif (this._postCompactionContinuationToken !== token) return;\n\t\t\t\t\t\tif (this.isCompacting || this.isStreaming) return;\n\t\t\t\t\t\tif (!this.agent.hasQueuedMessages()) {\n\t\t\t\t\t\t\tawait settleIfOwned();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// A queued message starts the next user turn. Settle before Agent\n\t\t\t\t\t\t// snapshots the next request's model.\n\t\t\t\t\t\tawait settleIfOwned();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this._pendingPostCompactionContinuation !== pending) return;\n\t\t\t\t\t// Clear this probe before entering the next run. Its promise is\n\t\t\t\t\t// still awaited by _awaitPendingPostCompactionContinuation, but\n\t\t\t\t\t// the nested agent_end must be free to schedule a new probe.\n\t\t\t\t\tthis._pendingPostCompactionContinuation = undefined;\n\t\t\t\t\tawait this._resumeAfterAutoCompaction();\n\t\t\t\t\tif (willRetry && this._pendingPostCompactionContinuation === undefined) {\n\t\t\t\t\t\tawait settleIfOwned();\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\tif (this._pendingPostCompactionContinuation === pending) {\n\t\t\t\t\t\tthis._pendingPostCompactionContinuation = undefined;\n\t\t\t\t\t}\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t})();\n\t\t}, 100);\n\t});\n\tthis._pendingPostCompactionContinuation = pending;\n}\n\nexport async function _awaitPendingPostCompactionContinuation(this: AgentSession): Promise<void> {\n\tconst pending = this._pendingPostCompactionContinuation;\n\tif (pending === undefined) return;\n\tawait pending;\n}\n\n/**\n * Internal: resume generation after successful auto-compaction only when active work remains.\n */\n\nexport async function _resumeAfterAutoCompaction(this: AgentSession): Promise<void> {\n\ttry {\n\t\tawait this._runAgentContinue();\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthis._emit({\n\t\t\ttype: \"agent_continue_error\",\n\t\t\tsource: \"post_compaction\",\n\t\t\terrorMessage: `Post-compaction continuation failed: ${message}`,\n\t\t});\n\t}\n}\n\n/**\n * Internal: resume a response that reached its requested output cap when the\n * context does not warrant compaction. Bounded so a model that repeatedly\n * stops at that cap can still terminate.\n */\n\nexport function _resumeAfterLengthTruncation(this: AgentSession): void {\n\tif (this._lengthContinuationAttempts >= MAX_LENGTH_CONTINUATION_ATTEMPTS) return;\n\tthis._lengthContinuationAttempts += 1;\n\t// agent.continue() rejects an assistant tail; drop the incomplete\n\t// length-stopped message so the preceding user/tool-result anchors the\n\t// continuation. It remains persisted in session history.\n\tthis._dropTrailingAutoCompactionRetryAssistantIfPresent();\n\tthis._schedulePostAutoCompactionContinuationProbe(\"threshold\", true);\n}\n\n/**\n * Whether an overflow turn is now unrecoverable by compaction, recording it on\n * the session so a configured fallback chain may advance to another candidate.\n */\nfunction overflowUnresolved(this: AgentSession, loadBearing: boolean, aborted = false): boolean | undefined {\n\tif (!loadBearing || aborted) return undefined;\n\tthis._contextOverflowUnresolved = true;\n\treturn true;\n}\n\nexport function hasPendingManualCompactionTakeover(this: AgentSession): boolean {\n\treturn this._compactionReason === \"manual\" && this._compactionAbortController !== undefined;\n}\n\nexport async function _runAutoCompaction(\n\tthis: AgentSession,\n\treason: \"overflow\" | \"threshold\",\n\twillRetry: boolean,\n\turgency: CompactionUrgency = reason === \"overflow\" ? \"load_bearing\" : \"recoverable\",\n): Promise<AutoCompactionRunOutcome> {\n\tif (\n\t\tthis._compactionAbortController !== undefined ||\n\t\tthis._manualCompactionPromise !== undefined ||\n\t\tthis._autoCompactionAbortController !== undefined\n\t)\n\t\treturn \"deferred\";\n\n\tconst controller = new AbortController();\n\tconst completion = createAutoCompactionCompletion();\n\tthis._autoCompactionAbortController = controller;\n\tthis._autoCompactionCompletion = completion.promise;\n\tthis._compactionReason = reason;\n\tlet fromExtension = false;\n\ttry {\n\t\tthis._emit({ type: \"compaction_start\", reason });\n\t} catch (error) {\n\t\t// A throwing start listener still propagates, matching current behavior,\n\t\t// but must not leave ownership published with no owner running.\n\t\tif (this._autoCompactionAbortController === controller) this._autoCompactionAbortController = undefined;\n\t\tif (this._compactionReason === reason) this._compactionReason = undefined;\n\t\tcompletion.resolve();\n\t\tif (this._autoCompactionCompletion === completion.promise) this._autoCompactionCompletion = undefined;\n\t\tthrow error;\n\t}\n\n\ttry {\n\t\tif (!this.model) {\n\t\t\tconst manualTakeoverPending = hasPendingManualCompactionTakeover.call(this);\n\t\t\tthis._emit({\n\t\t\t\ttype: \"compaction_end\",\n\t\t\t\treason,\n\t\t\t\tresult: undefined,\n\t\t\t\taborted: false,\n\t\t\t\twillRetry: false,\n\t\t\t\tunresolvedOverflow: overflowUnresolved.call(this, urgency === \"load_bearing\"),\n\t\t\t\t...(manualTakeoverPending ? { manualTakeoverPending: true } : {}),\n\t\t\t});\n\t\t\tawait emitSessionCompactFailed(this, {\n\t\t\t\treason,\n\t\t\t\taborted: false,\n\t\t\t\twillRetry: false,\n\t\t\t\tfromExtension: false,\n\t\t\t});\n\t\t\treturn manualTakeoverPending ? \"deferred\" : \"failed\";\n\t\t}\n\n\t\t// Resolve auth only after extension hooks have had an opportunity to cancel\n\t\t// compaction or provide compacted text, so local extension compaction does not\n\t\t// require provider credentials. Missing auth then fails model-driven compaction\n\t\t// before persistence or continuation, matching other provider-call failures.\n\t\tconst result = await this._applyVerbatimCompaction({\n\t\t\tresolvePlannerAuth: async (candidate) => {\n\t\t\t\tconst authResult = await this._getRequiredRequestAuth(candidate);\n\t\t\t\treturn authResult.apiKey || authResult.headers ? authResult : undefined;\n\t\t\t},\n\t\t\tabortController: controller,\n\t\t\tbackupLabel: urgency === \"load_bearing\" ? \"overflow-auto-compact\" : \"auto-compact\",\n\t\t\treason,\n\t\t\turgency,\n\t\t\tonCompactionSource: (value) => {\n\t\t\t\tfromExtension = value;\n\t\t\t},\n\t\t\t// Only an actual context overflow proved the context cannot fit. A\n\t\t\t// recoverable length stop must never reach the fresh-context fallback.\n\t\t\t...(urgency === \"load_bearing\" ? { allowSmallRegion: true } : {}),\n\t\t});\n\t\tif (!result) {\n\t\t\tconst manualTakeoverPending = hasPendingManualCompactionTakeover.call(this);\n\t\t\tthis._emit({\n\t\t\t\ttype: \"compaction_end\",\n\t\t\t\treason,\n\t\t\t\tresult: undefined,\n\t\t\t\taborted: false,\n\t\t\t\twillRetry: false,\n\t\t\t\tunresolvedOverflow: overflowUnresolved.call(this, urgency === \"load_bearing\"),\n\t\t\t\t...(manualTakeoverPending ? { manualTakeoverPending: true } : {}),\n\t\t\t});\n\t\t\tawait emitSessionCompactFailed(this, {\n\t\t\t\treason,\n\t\t\t\taborted: false,\n\t\t\t\twillRetry: false,\n\t\t\t\tfromExtension,\n\t\t\t});\n\t\t\treturn manualTakeoverPending ? \"deferred\" : \"not_compactable\";\n\t\t}\n\n\t\tif (willRetry) {\n\t\t\tthis._dropTrailingAutoCompactionRetryAssistantIfPresent();\n\t\t}\n\n\t\tthis._emit({\n\t\t\ttype: \"compaction_end\",\n\t\t\treason,\n\t\t\tresult,\n\t\t\taborted: false,\n\t\t\twillRetry,\n\t\t\t...(hasPendingManualCompactionTakeover.call(this) ? { manualTakeoverPending: true } : {}),\n\t\t});\n\t\tif (!hasPendingManualCompactionTakeover.call(this)) {\n\t\t\tthis._schedulePostAutoCompactionContinuationProbe(reason, willRetry);\n\t\t}\n\t\treturn \"compacted\";\n\t} catch (error) {\n\t\tconst errorMessage = error instanceof Error ? error.message : \"compaction failed\";\n\t\tconst aborted =\n\t\t\terrorMessage === \"Compaction cancelled\" || (error instanceof Error && error.name === \"AbortError\");\n\t\tconst manualTakeoverPending = hasPendingManualCompactionTakeover.call(this);\n\t\tconst formattedErrorMessage = aborted\n\t\t\t? undefined\n\t\t\t: reason === \"overflow\"\n\t\t\t\t? urgency === \"recoverable\"\n\t\t\t\t\t? `Response truncation recovery failed: ${errorMessage}`\n\t\t\t\t\t: `Context overflow recovery failed: ${errorMessage}`\n\t\t\t\t: `Auto-compaction failed: ${errorMessage}`;\n\t\tthis._emit({\n\t\t\ttype: \"compaction_end\",\n\t\t\treason,\n\t\t\tresult: undefined,\n\t\t\taborted,\n\t\t\twillRetry: false,\n\t\t\tunresolvedOverflow: overflowUnresolved.call(this, urgency === \"load_bearing\", aborted),\n\t\t\t...(manualTakeoverPending ? { manualTakeoverPending: true } : {}),\n\t\t\terrorMessage: formattedErrorMessage,\n\t\t});\n\t\tawait emitSessionCompactFailed(this, {\n\t\t\treason,\n\t\t\terrorMessage: formattedErrorMessage,\n\t\t\taborted,\n\t\t\twillRetry: false,\n\t\t\tfromExtension,\n\t\t});\n\t\treturn manualTakeoverPending ? \"deferred\" : \"failed\";\n\t} finally {\n\t\tif (this._autoCompactionAbortController === controller) this._autoCompactionAbortController = undefined;\n\t\tif (this._compactionReason === reason) this._compactionReason = undefined;\n\t\tcompletion.resolve();\n\t\tif (this._autoCompactionCompletion === completion.promise) this._autoCompactionCompletion = undefined;\n\t}\n}\n\n/**\n * Toggle auto-compaction setting.\n */\n\nexport const agentSessionAutoCompactionMethods = {\n\t_awaitPendingPostCompactionContinuation,\n\t_checkCompaction,\n\t_dropTrailingAutoCompactionRetryAssistantIfPresent,\n\t_schedulePostAutoCompactionContinuationProbe,\n\t_resumeAfterAutoCompaction,\n\t_resumeAfterLengthTruncation,\n\t_runAutoCompaction,\n};\n"]}
@@ -1,6 +1,8 @@
1
1
  import type { AgentSessionInternalSurface as AgentSession, VerbatimCompactionApplyOptions } from "./agent-session-methods.ts";
2
2
  import { type VerbatimCompactionParameters, type VerbatimCompactionResult } from "./compaction/index.ts";
3
+ import type { SessionCompactFailedEvent } from "./extensions/index.ts";
3
4
  export declare function _applyVerbatimCompaction(this: AgentSession, options: VerbatimCompactionApplyOptions): Promise<VerbatimCompactionResult | undefined>;
5
+ export declare function emitSessionCompactFailed(session: AgentSession, event: Omit<SessionCompactFailedEvent, "type">): Promise<void>;
4
6
  /**
5
7
  * Persist one verbatim line-subset compaction boundary.
6
8
  *
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session-compaction.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-compaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,2BAA2B,IAAI,YAAY,EAC3C,8BAA8B,EAC9B,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAWN,KAAK,4BAA4B,EAEjC,KAAK,wBAAwB,EAE7B,MAAM,uBAAuB,CAAC;AAkD/B,wBAAsB,wBAAwB,CAC7C,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,8BAA8B,GACrC,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC,CA8J/C;AA2DD;;;;;;;GAOG;AACH,wBAAgB,OAAO,CACtB,IAAI,EAAE,YAAY,EAClB,OAAO,GAAE,OAAO,CAAC,4BAA4B,CAAM,GACjD,OAAO,CAAC,wBAAwB,CAAC,CA2CnC;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAGxD;AACD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAE3D;AACD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAEnF;AAED,eAAO,MAAM,6BAA6B;;;;;;CAMzC,CAAC"}
1
+ {"version":3,"file":"agent-session-compaction.d.ts","sourceRoot":"","sources":["../../src/core/agent-session-compaction.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,2BAA2B,IAAI,YAAY,EAC3C,8BAA8B,EAC9B,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAWN,KAAK,4BAA4B,EAEjC,KAAK,wBAAwB,EAE7B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAIX,yBAAyB,EACzB,MAAM,uBAAuB,CAAC;AAiD/B,wBAAsB,wBAAwB,CAC7C,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,8BAA8B,GACrC,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC,CAmK/C;AAED,wBAAsB,wBAAwB,CAC7C,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,IAAI,CAAC,yBAAyB,EAAE,MAAM,CAAC,GAC5C,OAAO,CAAC,IAAI,CAAC,CAIf;AA4ED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CACtB,IAAI,EAAE,YAAY,EAClB,OAAO,GAAE,OAAO,CAAC,4BAA4B,CAAM,GACjD,OAAO,CAAC,wBAAwB,CAAC,CA2CnC;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAGxD;AACD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAE3D;AACD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAEnF;AAED,eAAO,MAAM,6BAA6B;;;;;;CAMzC,CAAC"}
@@ -110,6 +110,7 @@ export async function _applyVerbatimCompaction(options) {
110
110
  keptTail: true,
111
111
  };
112
112
  fromExtension = true;
113
+ options.onCompactionSource?.(true);
113
114
  }
114
115
  }
115
116
  if (!compacted) {
@@ -135,6 +136,7 @@ export async function _applyVerbatimCompaction(options) {
135
136
  stats: run.stats,
136
137
  rung: run.rung,
137
138
  ...(run.plannerModel ? { plannerModel: run.plannerModel } : {}),
139
+ ...(run.usage ? { usage: run.usage } : {}),
138
140
  keptTail: run.keptTail,
139
141
  };
140
142
  }
@@ -152,7 +154,7 @@ export async function _applyVerbatimCompaction(options) {
152
154
  ...(compacted.plannerModel ? { plannerModel: compacted.plannerModel } : {}),
153
155
  ...(backupPath ? { backupPath } : {}),
154
156
  };
155
- const entryId = this.sessionManager.appendCompaction(compacted.text, firstKeptEntryId, preparation.tokensBefore, details);
157
+ const entryId = this.sessionManager.appendCompaction(compacted.text, firstKeptEntryId, preparation.tokensBefore, details, compacted.usage);
156
158
  this.agent.state.messages = this.sessionManager.buildSessionContext().messages;
157
159
  const result = {
158
160
  compactedText: compacted.text,
@@ -163,6 +165,7 @@ export async function _applyVerbatimCompaction(options) {
163
165
  promptVersion: VERBATIM_COMPACTION_PROMPT_VERSION,
164
166
  rung: compacted.rung,
165
167
  ...(compacted.plannerModel ? { plannerModel: compacted.plannerModel } : {}),
168
+ ...(compacted.usage ? { usage: compacted.usage } : {}),
166
169
  ...(backupPath ? { backupPath } : {}),
167
170
  };
168
171
  const compactionEntry = this.sessionManager.getEntry(entryId);
@@ -186,6 +189,11 @@ export async function _applyVerbatimCompaction(options) {
186
189
  }
187
190
  return result;
188
191
  }
192
+ export async function emitSessionCompactFailed(session, event) {
193
+ if (session._extensionRunner?.hasHandlers("session_compact_failed")) {
194
+ await session._extensionRunner.emit({ type: "session_compact_failed", ...event });
195
+ }
196
+ }
189
197
  function clearOwnedManualCompactionState(controller) {
190
198
  if (this._compactionAbortController !== controller)
191
199
  return;
@@ -196,9 +204,10 @@ function clearOwnedManualCompactionState(controller) {
196
204
  // emitted, a new /compact must own a new run rather than join the settled one.
197
205
  this._manualCompactionPromise = undefined;
198
206
  }
199
- function emitManualCompactionFailure(controller, error) {
207
+ async function emitManualCompactionFailure(controller, error, fromExtension) {
200
208
  const message = error instanceof Error ? error.message : String(error);
201
209
  const aborted = message === "Compaction cancelled" || (error instanceof Error && error.name === "AbortError");
210
+ const errorMessage = aborted ? undefined : `Compaction failed: ${message}`;
202
211
  clearOwnedManualCompactionState.call(this, controller);
203
212
  this._emit({
204
213
  type: "compaction_end",
@@ -206,11 +215,19 @@ function emitManualCompactionFailure(controller, error) {
206
215
  result: undefined,
207
216
  aborted,
208
217
  willRetry: false,
209
- errorMessage: aborted ? undefined : `Compaction failed: ${message}`,
218
+ errorMessage,
219
+ });
220
+ await emitSessionCompactFailed(this, {
221
+ reason: "manual",
222
+ errorMessage,
223
+ aborted,
224
+ willRetry: false,
225
+ fromExtension,
210
226
  });
211
227
  }
212
228
  async function runOwnedManualCompaction(controller, options) {
213
229
  this._emit({ type: "compaction_start", reason: "manual" });
230
+ let fromExtension = false;
214
231
  try {
215
232
  if (!this.model)
216
233
  throw new Error(formatNoModelSelectedMessage());
@@ -227,6 +244,9 @@ async function runOwnedManualCompaction(controller, options) {
227
244
  backupLabel: "compact",
228
245
  reason: "manual",
229
246
  urgency: "recoverable",
247
+ onCompactionSource: (value) => {
248
+ fromExtension = value;
249
+ },
230
250
  });
231
251
  if (!result)
232
252
  throw new Error("Nothing to compact (session too small)");
@@ -237,7 +257,7 @@ async function runOwnedManualCompaction(controller, options) {
237
257
  return result;
238
258
  }
239
259
  catch (error) {
240
- emitManualCompactionFailure.call(this, controller, error);
260
+ await emitManualCompactionFailure.call(this, controller, error, fromExtension);
241
261
  throw error;
242
262
  }
243
263
  }
@@ -282,7 +302,7 @@ export function compact(options = {}) {
282
302
  catch (error) {
283
303
  // The abort drain can fail before the planner starts. Finish the
284
304
  // manual lifecycle so event consumers can release queued input.
285
- emitManualCompactionFailure.call(this, controller, error);
305
+ await emitManualCompactionFailure.call(this, controller, error, false);
286
306
  throw error;
287
307
  }
288
308
  return runOwnedManualCompaction.call(this, controller, options);