@ai-agent-forge/agent-forge 0.88.2 → 0.88.3

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 (453) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +1 -1
  3. package/bundled-plugins/agent-loop-policy/agent-forge.json +1 -1
  4. package/bundled-plugins/agent-loop-policy/plugin.json +1 -1
  5. package/bundled-plugins/coding-tools/agent-forge.json +1 -1
  6. package/bundled-plugins/coding-tools/plugin.json +1 -1
  7. package/bundled-plugins/compaction-policy/agent-forge.json +1 -1
  8. package/bundled-plugins/compaction-policy/plugin.json +1 -1
  9. package/bundled-plugins/overflow-policy/agent-forge.json +1 -1
  10. package/bundled-plugins/overflow-policy/plugin.json +1 -1
  11. package/bundled-plugins/provider-failover/agent-forge.json +1 -1
  12. package/bundled-plugins/provider-failover/plugin.json +1 -1
  13. package/bundled-plugins/retry-policy/agent-forge.json +1 -1
  14. package/bundled-plugins/retry-policy/plugin.json +1 -1
  15. package/dist/artifacts/paged-read.d.ts +6 -1
  16. package/dist/artifacts/paged-read.d.ts.map +1 -1
  17. package/dist/artifacts/paged-read.js.map +1 -1
  18. package/dist/bundle/.build-manifest.json +240 -230
  19. package/dist/bundle/chunks/{anthropic-messages-PLAKXR73.js → anthropic-messages-3FJHRAJL.js} +2 -2
  20. package/dist/bundle/chunks/anthropic.js +1 -1
  21. package/dist/bundle/chunks/{azure-openai-responses-OUWQ2AZD.js → azure-openai-responses-GCL47IDS.js} +1 -1
  22. package/dist/bundle/chunks/bedrock-converse-stream.js +1 -1
  23. package/dist/bundle/chunks/{chunk-6F5JWGKE.js → chunk-32YDZI4J.js} +1 -1
  24. package/dist/bundle/chunks/{chunk-LSP24WNH.js → chunk-755VNWIF.js} +12 -12
  25. package/dist/bundle/chunks/{chunk-HTC5K5SM.js → chunk-B42Y2VME.js} +94 -89
  26. package/dist/bundle/chunks/{chunk-DRQDKNXA.js → chunk-BVVSHK6W.js} +1 -1
  27. package/dist/bundle/chunks/{chunk-6R7UI4IY.js → chunk-QDLOMKF6.js} +1 -1
  28. package/dist/bundle/chunks/{chunk-44I47ACN.js → chunk-V3ACW7VD.js} +1 -1
  29. package/dist/bundle/chunks/{google-generative-ai-DLII6DAT.js → google-generative-ai-6BMXWA44.js} +1 -1
  30. package/dist/bundle/chunks/{google-vertex-G7BZL7GM.js → google-vertex-6H7NLRTK.js} +1 -1
  31. package/dist/bundle/chunks/image-resize-worker.js +1 -1
  32. package/dist/bundle/chunks/{mistral-conversations-JXUK24ID.js → mistral-conversations-IXUHSFSJ.js} +1 -1
  33. package/dist/bundle/chunks/{openai-codex-responses-5GSGFIPG.js → openai-codex-responses-YHUAEVCM.js} +1 -1
  34. package/dist/bundle/chunks/openai-codex.js +1 -1
  35. package/dist/bundle/chunks/{openai-completions-EI2I6DTG.js → openai-completions-ULQCFC72.js} +1 -1
  36. package/dist/bundle/chunks/openai-responses-NLLAJDPS.js +2 -0
  37. package/dist/bundle/chunks/{openrouter-images-G4GQRUSG.js → openrouter-images-GZZQZXMS.js} +1 -1
  38. package/dist/bundle/chunks/openrouter.js +1 -1
  39. package/dist/bundle/chunks/{pi-messages-PWU2VJMR.js → pi-messages-EJTI2EJ3.js} +1 -1
  40. package/dist/bundle/chunks/virtual-modules-TQWEGNNZ.js +5 -0
  41. package/dist/bundle/cli.js +1 -1
  42. package/dist/bundle/client.js +1 -1
  43. package/dist/bundle/index.js +1 -1
  44. package/dist/bundle/rpc-entry.js +1 -1
  45. package/dist/cli/args.d.ts +0 -1
  46. package/dist/cli/args.d.ts.map +1 -1
  47. package/dist/cli/args.js +1 -4
  48. package/dist/cli/args.js.map +1 -1
  49. package/dist/cli/config-selector.d.ts.map +1 -1
  50. package/dist/cli/config-selector.js +1 -1
  51. package/dist/cli/config-selector.js.map +1 -1
  52. package/dist/cli/experimental/cli.d.ts +3 -3
  53. package/dist/cli/experimental/cli.d.ts.map +1 -1
  54. package/dist/cli/experimental/cli.js +2 -2
  55. package/dist/cli/experimental/cli.js.map +1 -1
  56. package/dist/cli/experimental/commands/agent-forge.d.ts +15 -0
  57. package/dist/cli/experimental/commands/agent-forge.d.ts.map +1 -0
  58. package/dist/cli/experimental/commands/{pi.js → agent-forge.js} +4 -4
  59. package/dist/cli/experimental/commands/agent-forge.js.map +1 -0
  60. package/dist/cli/startup-ui.d.ts.map +1 -1
  61. package/dist/cli/startup-ui.js +1 -1
  62. package/dist/cli/startup-ui.js.map +1 -1
  63. package/dist/config.d.ts +4 -4
  64. package/dist/config.d.ts.map +1 -1
  65. package/dist/config.js +7 -7
  66. package/dist/config.js.map +1 -1
  67. package/dist/core/agent-forge-manifest.d.ts +7 -0
  68. package/dist/core/agent-forge-manifest.d.ts.map +1 -0
  69. package/dist/core/{pi-manifest.js → agent-forge-manifest.js} +4 -4
  70. package/dist/core/agent-forge-manifest.js.map +1 -0
  71. package/dist/core/agent-session-compaction.d.ts +1 -1
  72. package/dist/core/agent-session-compaction.d.ts.map +1 -1
  73. package/dist/core/agent-session-compaction.js +3 -3
  74. package/dist/core/agent-session-compaction.js.map +1 -1
  75. package/dist/core/agent-session-lifecycle.d.ts.map +1 -1
  76. package/dist/core/agent-session-lifecycle.js +12 -1
  77. package/dist/core/agent-session-lifecycle.js.map +1 -1
  78. package/dist/core/agent-session-projection.d.ts.map +1 -1
  79. package/dist/core/agent-session-projection.js +3 -3
  80. package/dist/core/agent-session-projection.js.map +1 -1
  81. package/dist/core/agent-session-services.d.ts +1 -1
  82. package/dist/core/agent-session-services.d.ts.map +1 -1
  83. package/dist/core/agent-session-services.js +1 -1
  84. package/dist/core/agent-session-services.js.map +1 -1
  85. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  86. package/dist/core/compaction/branch-summarization.js +1 -1
  87. package/dist/core/compaction/branch-summarization.js.map +1 -1
  88. package/dist/core/experimental.d.ts.map +1 -1
  89. package/dist/core/experimental.js +1 -3
  90. package/dist/core/experimental.js.map +1 -1
  91. package/dist/core/extensions/capability-runtime-store.d.ts +20 -1
  92. package/dist/core/extensions/capability-runtime-store.d.ts.map +1 -1
  93. package/dist/core/extensions/capability-runtime-store.js +67 -0
  94. package/dist/core/extensions/capability-runtime-store.js.map +1 -1
  95. package/dist/core/extensions/capability-runtime-types.d.ts +14 -0
  96. package/dist/core/extensions/capability-runtime-types.d.ts.map +1 -1
  97. package/dist/core/extensions/capability-runtime-types.js +7 -1
  98. package/dist/core/extensions/capability-runtime-types.js.map +1 -1
  99. package/dist/core/extensions/capability-runtime.d.ts.map +1 -1
  100. package/dist/core/extensions/capability-runtime.js +144 -42
  101. package/dist/core/extensions/capability-runtime.js.map +1 -1
  102. package/dist/core/extensions/virtual-modules.d.ts.map +1 -1
  103. package/dist/core/extensions/virtual-modules.js +6 -1
  104. package/dist/core/extensions/virtual-modules.js.map +1 -1
  105. package/dist/core/facade/coding-agent-facade.d.ts +1 -1
  106. package/dist/core/facade/coding-agent-facade.d.ts.map +1 -1
  107. package/dist/core/facade/coding-agent-facade.js +1 -1
  108. package/dist/core/facade/coding-agent-facade.js.map +1 -1
  109. package/dist/core/i18n/locales/zh-cn/core-contract-final.d.ts +1 -1
  110. package/dist/core/i18n/locales/zh-cn/core-contract-final.d.ts.map +1 -1
  111. package/dist/core/i18n/locales/zh-cn/core-contract-final.js +3 -3
  112. package/dist/core/i18n/locales/zh-cn/core-contract-final.js.map +1 -1
  113. package/dist/core/i18n/locales/zh-cn/core-contract-plugins.d.ts.map +1 -1
  114. package/dist/core/i18n/locales/zh-cn/core-contract-plugins.js +1 -1
  115. package/dist/core/i18n/locales/zh-cn/core-contract-plugins.js.map +1 -1
  116. package/dist/core/i18n/locales/zh-cn/core-errors.d.ts.map +1 -1
  117. package/dist/core/i18n/locales/zh-cn/core-errors.js +1 -1
  118. package/dist/core/i18n/locales/zh-cn/core-errors.js.map +1 -1
  119. package/dist/core/i18n/locales/zh-cn/tui-components-misc.d.ts.map +1 -1
  120. package/dist/core/i18n/locales/zh-cn/tui-components-misc.js +2 -0
  121. package/dist/core/i18n/locales/zh-cn/tui-components-misc.js.map +1 -1
  122. package/dist/core/model-resolver.d.ts +2 -0
  123. package/dist/core/model-resolver.d.ts.map +1 -1
  124. package/dist/core/model-resolver.js +4 -1
  125. package/dist/core/model-resolver.js.map +1 -1
  126. package/dist/core/package-resource-collection.d.ts.map +1 -1
  127. package/dist/core/package-resource-collection.js +5 -5
  128. package/dist/core/package-resource-collection.js.map +1 -1
  129. package/dist/core/provider-composer.d.ts.map +1 -1
  130. package/dist/core/provider-composer.js +3 -3
  131. package/dist/core/provider-composer.js.map +1 -1
  132. package/dist/core/resource-loader.d.ts.map +1 -1
  133. package/dist/core/resource-loader.js +1 -1
  134. package/dist/core/resource-loader.js.map +1 -1
  135. package/dist/core/sdk.d.ts +1 -1
  136. package/dist/core/sdk.d.ts.map +1 -1
  137. package/dist/core/sdk.js +6 -7
  138. package/dist/core/sdk.js.map +1 -1
  139. package/dist/core/session-manager.d.ts.map +1 -1
  140. package/dist/core/session-manager.js +4 -4
  141. package/dist/core/session-manager.js.map +1 -1
  142. package/dist/core/settings-manager.d.ts.map +1 -1
  143. package/dist/core/settings-manager.js +5 -10
  144. package/dist/core/settings-manager.js.map +1 -1
  145. package/dist/core/timings.d.ts.map +1 -1
  146. package/dist/core/timings.js +1 -3
  147. package/dist/core/timings.js.map +1 -1
  148. package/dist/core/tools/render-utils.d.ts +1 -1
  149. package/dist/core/tools/render-utils.d.ts.map +1 -1
  150. package/dist/core/tools/render-utils.js.map +1 -1
  151. package/dist/core/tools/tool-definition.d.ts +1 -1
  152. package/dist/core/tools/tool-definition.d.ts.map +1 -1
  153. package/dist/core/tools/tool-definition.js.map +1 -1
  154. package/dist/core/trace-retention.d.ts +16 -1
  155. package/dist/core/trace-retention.d.ts.map +1 -1
  156. package/dist/core/trace-retention.js +43 -20
  157. package/dist/core/trace-retention.js.map +1 -1
  158. package/dist/export-html/ansi-to-html.d.ts.map +1 -0
  159. package/dist/export-html/ansi-to-html.js.map +1 -0
  160. package/dist/{core/export-html → export-html}/index.d.ts +1 -1
  161. package/dist/export-html/index.d.ts.map +1 -0
  162. package/dist/{core/export-html → export-html}/index.js +5 -5
  163. package/dist/export-html/index.js.map +1 -0
  164. package/dist/{core/export-html → export-html}/tool-renderer.d.ts +2 -2
  165. package/dist/export-html/tool-renderer.d.ts.map +1 -0
  166. package/dist/export-html/tool-renderer.js.map +1 -0
  167. package/dist/{modes/interactive → host}/model-catalog-refresh.d.ts +1 -1
  168. package/dist/host/model-catalog-refresh.d.ts.map +1 -0
  169. package/dist/{modes/interactive → host}/model-catalog-refresh.js +1 -1
  170. package/dist/host/model-catalog-refresh.js.map +1 -0
  171. package/dist/index.d.ts +5 -5
  172. package/dist/index.d.ts.map +1 -1
  173. package/dist/index.js +12 -12
  174. package/dist/index.js.map +1 -1
  175. package/dist/main.d.ts.map +1 -1
  176. package/dist/main.js +25 -14
  177. package/dist/main.js.map +1 -1
  178. package/dist/modes/interactive/components/agents-view.d.ts.map +1 -1
  179. package/dist/modes/interactive/components/agents-view.js +1 -1
  180. package/dist/modes/interactive/components/agents-view.js.map +1 -1
  181. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  182. package/dist/modes/interactive/components/armin.js +1 -1
  183. package/dist/modes/interactive/components/armin.js.map +1 -1
  184. package/dist/modes/interactive/components/assistant-message.d.ts +3 -0
  185. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  186. package/dist/modes/interactive/components/assistant-message.js +83 -24
  187. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  188. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  189. package/dist/modes/interactive/components/bash-execution.js +1 -1
  190. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  191. package/dist/modes/interactive/components/bordered-loader.d.ts +1 -1
  192. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  193. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  194. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  195. package/dist/modes/interactive/components/branch-summary-message.js +1 -1
  196. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  197. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  198. package/dist/modes/interactive/components/compaction-summary-message.js +1 -1
  199. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  200. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  201. package/dist/modes/interactive/components/config-selector.js +1 -1
  202. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  203. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
  204. package/dist/modes/interactive/components/custom-entry.js +1 -1
  205. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  206. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  207. package/dist/modes/interactive/components/custom-message.js +1 -1
  208. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  209. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  210. package/dist/modes/interactive/components/daxnuts.js +1 -1
  211. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  212. package/dist/modes/interactive/components/dialog-editor.d.ts.map +1 -1
  213. package/dist/modes/interactive/components/dialog-editor.js +1 -1
  214. package/dist/modes/interactive/components/dialog-editor.js.map +1 -1
  215. package/dist/modes/interactive/components/dialog-input.d.ts.map +1 -1
  216. package/dist/modes/interactive/components/dialog-input.js +1 -1
  217. package/dist/modes/interactive/components/dialog-input.js.map +1 -1
  218. package/dist/modes/interactive/components/dialog-selector.d.ts.map +1 -1
  219. package/dist/modes/interactive/components/dialog-selector.js +1 -1
  220. package/dist/modes/interactive/components/dialog-selector.js.map +1 -1
  221. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  222. package/dist/modes/interactive/components/diff.js +1 -1
  223. package/dist/modes/interactive/components/diff.js.map +1 -1
  224. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  225. package/dist/modes/interactive/components/dynamic-border.js +1 -1
  226. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  227. package/dist/modes/interactive/components/first-time-setup.d.ts +1 -1
  228. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
  229. package/dist/modes/interactive/components/first-time-setup.js +1 -1
  230. package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
  231. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  232. package/dist/modes/interactive/components/footer.js +1 -1
  233. package/dist/modes/interactive/components/footer.js.map +1 -1
  234. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  235. package/dist/modes/interactive/components/keybinding-hints.js +1 -1
  236. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  237. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  238. package/dist/modes/interactive/components/login-dialog.js +1 -1
  239. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  240. package/dist/modes/interactive/components/mermaid.d.ts +1 -1
  241. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -1
  242. package/dist/modes/interactive/components/mermaid.js.map +1 -1
  243. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  244. package/dist/modes/interactive/components/model-selector.js +2 -2
  245. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  246. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  247. package/dist/modes/interactive/components/oauth-selector.js +1 -1
  248. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  249. package/dist/modes/interactive/components/plugin-manager-entry.d.ts.map +1 -1
  250. package/dist/modes/interactive/components/plugin-manager-entry.js +1 -1
  251. package/dist/modes/interactive/components/plugin-manager-entry.js.map +1 -1
  252. package/dist/modes/interactive/components/plugin-selection-entry.d.ts.map +1 -1
  253. package/dist/modes/interactive/components/plugin-selection-entry.js +1 -1
  254. package/dist/modes/interactive/components/plugin-selection-entry.js.map +1 -1
  255. package/dist/modes/interactive/components/queue-manager-selector.d.ts.map +1 -1
  256. package/dist/modes/interactive/components/queue-manager-selector.js +1 -1
  257. package/dist/modes/interactive/components/queue-manager-selector.js.map +1 -1
  258. package/dist/modes/interactive/components/render-types.d.ts +1 -1
  259. package/dist/modes/interactive/components/render-types.d.ts.map +1 -1
  260. package/dist/modes/interactive/components/render-types.js.map +1 -1
  261. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  262. package/dist/modes/interactive/components/scoped-models-selector.js +1 -1
  263. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  264. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  265. package/dist/modes/interactive/components/session-selector.js +2 -2
  266. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  267. package/dist/modes/interactive/components/settings-selector.d.ts +1 -1
  268. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  269. package/dist/modes/interactive/components/settings-selector.js +1 -1
  270. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  271. package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -1
  272. package/dist/modes/interactive/components/settings-submenu.js +1 -1
  273. package/dist/modes/interactive/components/settings-submenu.js.map +1 -1
  274. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  275. package/dist/modes/interactive/components/show-images-selector.js +1 -1
  276. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  277. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  278. package/dist/modes/interactive/components/skill-invocation-message.js +1 -1
  279. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  280. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  281. package/dist/modes/interactive/components/status-indicator.js +1 -1
  282. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  283. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  284. package/dist/modes/interactive/components/theme-selector.js +1 -1
  285. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  286. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  287. package/dist/modes/interactive/components/thinking-selector.js +1 -1
  288. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  289. package/dist/modes/interactive/components/tool-execution.d.ts +2 -0
  290. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  291. package/dist/modes/interactive/components/tool-execution.js +96 -4
  292. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  293. package/dist/modes/interactive/components/tool-run-group.d.ts.map +1 -1
  294. package/dist/modes/interactive/components/tool-run-group.js +1 -1
  295. package/dist/modes/interactive/components/tool-run-group.js.map +1 -1
  296. package/dist/modes/interactive/components/tree-list.d.ts.map +1 -1
  297. package/dist/modes/interactive/components/tree-list.js +1 -1
  298. package/dist/modes/interactive/components/tree-list.js.map +1 -1
  299. package/dist/modes/interactive/components/tree-render.d.ts.map +1 -1
  300. package/dist/modes/interactive/components/tree-render.js +1 -1
  301. package/dist/modes/interactive/components/tree-render.js.map +1 -1
  302. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  303. package/dist/modes/interactive/components/tree-selector.js +1 -1
  304. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  305. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  306. package/dist/modes/interactive/components/user-message-selector.js +1 -1
  307. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  308. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  309. package/dist/modes/interactive/components/user-message.js +1 -1
  310. package/dist/modes/interactive/components/user-message.js.map +1 -1
  311. package/dist/modes/interactive/components/workflow-view.d.ts.map +1 -1
  312. package/dist/modes/interactive/components/workflow-view.js +1 -1
  313. package/dist/modes/interactive/components/workflow-view.js.map +1 -1
  314. package/dist/modes/interactive/interactive-auth.d.ts +1 -1
  315. package/dist/modes/interactive/interactive-auth.d.ts.map +1 -1
  316. package/dist/modes/interactive/interactive-auth.js +1 -1
  317. package/dist/modes/interactive/interactive-auth.js.map +1 -1
  318. package/dist/modes/interactive/interactive-commands.d.ts +123 -6
  319. package/dist/modes/interactive/interactive-commands.d.ts.map +1 -1
  320. package/dist/modes/interactive/interactive-commands.js +691 -4
  321. package/dist/modes/interactive/interactive-commands.js.map +1 -1
  322. package/dist/modes/interactive/interactive-events.d.ts +174 -0
  323. package/dist/modes/interactive/interactive-events.d.ts.map +1 -0
  324. package/dist/modes/interactive/interactive-events.js +704 -0
  325. package/dist/modes/interactive/interactive-events.js.map +1 -0
  326. package/dist/modes/interactive/interactive-format.d.ts.map +1 -1
  327. package/dist/modes/interactive/interactive-format.js +1 -1
  328. package/dist/modes/interactive/interactive-format.js.map +1 -1
  329. package/dist/modes/interactive/interactive-lifecycle.d.ts +94 -0
  330. package/dist/modes/interactive/interactive-lifecycle.d.ts.map +1 -0
  331. package/dist/modes/interactive/interactive-lifecycle.js +177 -0
  332. package/dist/modes/interactive/interactive-lifecycle.js.map +1 -0
  333. package/dist/modes/interactive/interactive-mode.d.ts +240 -133
  334. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  335. package/dist/modes/interactive/interactive-mode.js +251 -2159
  336. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  337. package/dist/modes/interactive/interactive-queues.d.ts +96 -0
  338. package/dist/modes/interactive/interactive-queues.d.ts.map +1 -0
  339. package/dist/modes/interactive/interactive-queues.js +183 -0
  340. package/dist/modes/interactive/interactive-queues.js.map +1 -0
  341. package/dist/modes/interactive/interactive-selectors.d.ts +95 -5
  342. package/dist/modes/interactive/interactive-selectors.d.ts.map +1 -1
  343. package/dist/modes/interactive/interactive-selectors.js +517 -6
  344. package/dist/modes/interactive/interactive-selectors.js.map +1 -1
  345. package/dist/modes/interactive/startup-services.d.ts +31 -0
  346. package/dist/modes/interactive/startup-services.d.ts.map +1 -0
  347. package/dist/modes/interactive/startup-services.js +123 -0
  348. package/dist/modes/interactive/startup-services.js.map +1 -0
  349. package/dist/modes/memory-preheat.d.ts +11 -0
  350. package/dist/modes/memory-preheat.d.ts.map +1 -0
  351. package/dist/modes/memory-preheat.js +20 -0
  352. package/dist/modes/memory-preheat.js.map +1 -0
  353. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  354. package/dist/modes/rpc/rpc-mode.js +3 -1
  355. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  356. package/dist/remote/server-assembly.d.ts.map +1 -1
  357. package/dist/remote/server-assembly.js +7 -2
  358. package/dist/remote/server-assembly.js.map +1 -1
  359. package/dist/suites/builtin-suites.d.ts.map +1 -0
  360. package/dist/suites/builtin-suites.js.map +1 -0
  361. package/dist/suites/resolved-agent-profile.d.ts.map +1 -0
  362. package/dist/suites/resolved-agent-profile.js.map +1 -0
  363. package/dist/suites/suite-lifecycle.d.ts.map +1 -0
  364. package/dist/suites/suite-lifecycle.js.map +1 -0
  365. package/dist/suites/suite-loader.d.ts.map +1 -0
  366. package/dist/suites/suite-loader.js.map +1 -0
  367. package/dist/{modes/interactive/theme → theme}/dark.json +1 -1
  368. package/dist/{modes/interactive/theme → theme}/light.json +1 -1
  369. package/dist/{modes/interactive/theme → theme}/theme-controller.d.ts +1 -1
  370. package/dist/theme/theme-controller.d.ts.map +1 -0
  371. package/dist/{modes/interactive/theme → theme}/theme-controller.js +1 -1
  372. package/dist/theme/theme-controller.js.map +1 -0
  373. package/dist/{modes/interactive/theme → theme}/theme.d.ts +1 -1
  374. package/dist/theme/theme.d.ts.map +1 -0
  375. package/dist/{modes/interactive/theme → theme}/theme.js +5 -5
  376. package/dist/theme/theme.js.map +1 -0
  377. package/docs/compaction.md +7 -7
  378. package/docs/environment-variables.md +10 -4
  379. package/docs/keybindings.md +3 -3
  380. package/docs/models.md +17 -17
  381. package/docs/packages.md +1 -1
  382. package/docs/prompt-templates.md +1 -1
  383. package/docs/rpc.md +2 -2
  384. package/docs/sdk.md +5 -5
  385. package/docs/session-format.md +3 -3
  386. package/docs/settings.md +15 -1
  387. package/docs/shell-aliases.md +1 -1
  388. package/docs/skills.md +1 -1
  389. package/docs/terminal-setup.md +17 -17
  390. package/docs/themes.md +5 -5
  391. package/docs/tmux.md +4 -4
  392. package/docs/tui.md +1 -1
  393. package/docs/usage.md +292 -292
  394. package/docs/windows.md +1 -1
  395. package/examples/extensions/bash-spawn-hook/index.ts +1 -1
  396. package/examples/extensions/dynamic-resources/dynamic.json +1 -1
  397. package/examples/extensions/mcp-stdio/index.d.ts +64 -0
  398. package/examples/extensions/mcp-stdio/index.d.ts.map +1 -0
  399. package/examples/extensions/mcp-stdio/index.js +292 -0
  400. package/examples/extensions/mcp-stdio/index.js.map +1 -0
  401. package/examples/extensions/with-deps/package-lock.json +2 -2
  402. package/examples/extensions/with-deps/package.json +1 -6
  403. package/examples/extensions/with-deps/plugin.json +1 -1
  404. package/package.json +2 -2
  405. package/dist/bundle/chunks/openai-responses-AUJQ3NWT.js +0 -2
  406. package/dist/bundle/chunks/virtual-modules-MRXD3RWG.js +0 -5
  407. package/dist/cli/experimental/commands/pi.d.ts +0 -15
  408. package/dist/cli/experimental/commands/pi.d.ts.map +0 -1
  409. package/dist/cli/experimental/commands/pi.js.map +0 -1
  410. package/dist/core/export-html/ansi-to-html.d.ts.map +0 -1
  411. package/dist/core/export-html/ansi-to-html.js.map +0 -1
  412. package/dist/core/export-html/index.d.ts.map +0 -1
  413. package/dist/core/export-html/index.js.map +0 -1
  414. package/dist/core/export-html/tool-renderer.d.ts.map +0 -1
  415. package/dist/core/export-html/tool-renderer.js.map +0 -1
  416. package/dist/core/pi-manifest.d.ts +0 -7
  417. package/dist/core/pi-manifest.d.ts.map +0 -1
  418. package/dist/core/pi-manifest.js.map +0 -1
  419. package/dist/modes/interactive/model-catalog-refresh.d.ts.map +0 -1
  420. package/dist/modes/interactive/model-catalog-refresh.js.map +0 -1
  421. package/dist/modes/interactive/theme/theme-controller.d.ts.map +0 -1
  422. package/dist/modes/interactive/theme/theme-controller.js.map +0 -1
  423. package/dist/modes/interactive/theme/theme.d.ts.map +0 -1
  424. package/dist/modes/interactive/theme/theme.js.map +0 -1
  425. package/dist/profiles/builtin-suites.d.ts.map +0 -1
  426. package/dist/profiles/builtin-suites.js.map +0 -1
  427. package/dist/profiles/resolved-agent-profile.d.ts.map +0 -1
  428. package/dist/profiles/resolved-agent-profile.js.map +0 -1
  429. package/dist/profiles/suite-lifecycle.d.ts.map +0 -1
  430. package/dist/profiles/suite-lifecycle.js.map +0 -1
  431. package/dist/profiles/suite-loader.d.ts.map +0 -1
  432. package/dist/profiles/suite-loader.js.map +0 -1
  433. package/dist/utils/deprecation.d.ts +0 -4
  434. package/dist/utils/deprecation.d.ts.map +0 -1
  435. package/dist/utils/deprecation.js +0 -13
  436. package/dist/utils/deprecation.js.map +0 -1
  437. /package/dist/{core/export-html → export-html}/ansi-to-html.d.ts +0 -0
  438. /package/dist/{core/export-html → export-html}/ansi-to-html.js +0 -0
  439. /package/dist/{core/export-html → export-html}/template.css +0 -0
  440. /package/dist/{core/export-html → export-html}/template.html +0 -0
  441. /package/dist/{core/export-html → export-html}/template.js +0 -0
  442. /package/dist/{core/export-html → export-html}/tool-renderer.js +0 -0
  443. /package/dist/{core/export-html → export-html}/vendor/highlight.min.js +0 -0
  444. /package/dist/{core/export-html → export-html}/vendor/marked.min.js +0 -0
  445. /package/dist/{profiles → suites}/builtin-suites.d.ts +0 -0
  446. /package/dist/{profiles → suites}/builtin-suites.js +0 -0
  447. /package/dist/{profiles → suites}/resolved-agent-profile.d.ts +0 -0
  448. /package/dist/{profiles → suites}/resolved-agent-profile.js +0 -0
  449. /package/dist/{profiles → suites}/suite-lifecycle.d.ts +0 -0
  450. /package/dist/{profiles → suites}/suite-lifecycle.js +0 -0
  451. /package/dist/{profiles → suites}/suite-loader.d.ts +0 -0
  452. /package/dist/{profiles → suites}/suite-loader.js +0 -0
  453. /package/dist/{modes/interactive/theme → theme}/theme-schema.json +0 -0
@@ -0,0 +1,704 @@
1
+ import { Spacer, Text } from "@agent-forge/tui";
2
+ import { parseSkillBlock } from "../../core/agent-session.js";
3
+ import { CACHE_TTL_MS, collectCacheMisses, detectCacheMiss } from "../../core/cache-stats.js";
4
+ import { t } from "../../core/i18n/index.js";
5
+ import { createCompactionSummaryMessage } from "../../core/messages.js";
6
+ import { sessionEntryToContextMessages } from "../../core/session-manager.js";
7
+ import { theme } from "../../theme/theme.js";
8
+ import { AssistantMessageComponent } from "./components/assistant-message.js";
9
+ import { BashExecutionComponent } from "./components/bash-execution.js";
10
+ import { BranchSummaryMessageComponent } from "./components/branch-summary-message.js";
11
+ import { CompactionSummaryMessageComponent } from "./components/compaction-summary-message.js";
12
+ import { CustomMessageComponent } from "./components/custom-message.js";
13
+ import { formatTokens } from "./components/footer.js";
14
+ import { SkillInvocationMessageComponent } from "./components/skill-invocation-message.js";
15
+ import { BranchSummaryStatusIndicator, CompactionStatusIndicator, RetryStatusIndicator, } from "./components/status-indicator.js";
16
+ import { ToolExecutionComponent } from "./components/tool-execution.js";
17
+ import { ToolRunGroupComponent } from "./components/tool-run-group.js";
18
+ import { UserMessageComponent } from "./components/user-message.js";
19
+ function isCustomSessionEntry(item) {
20
+ return "type" in item && item.type === "custom";
21
+ }
22
+ function isCompactionCostNotice(item) {
23
+ return "type" in item && item.type === "compaction_cost";
24
+ }
25
+ export function subscribeToAgent(host) {
26
+ host.unsubscribe = host.facade.subscribe(async (event) => {
27
+ await host.handleEvent(event);
28
+ });
29
+ }
30
+ export async function handleEvent(host, event) {
31
+ if (!host.isInitialized) {
32
+ await host.init();
33
+ }
34
+ host.footer.invalidate();
35
+ // Failover snapshots land as entry_appended events; the ticker decides here
36
+ // whether the per-second countdown re-render is needed (§4.7 Phase 3).
37
+ host.failoverTicker?.refresh();
38
+ switch (event.type) {
39
+ case "agent_start":
40
+ host.pendingTools.clear();
41
+ // Restore main escape handler if retry handler is still active
42
+ // (retry success event fires later, but we need main handler now)
43
+ if (host.retryEscapeHandler) {
44
+ host.defaultEditor.onEscape = host.retryEscapeHandler;
45
+ host.retryEscapeHandler = undefined;
46
+ }
47
+ break;
48
+ case "turn_start":
49
+ if (host.settingsManager.getShowTerminalProgress()) {
50
+ host.ui.terminal.setProgress(true);
51
+ }
52
+ if (host.workingVisible) {
53
+ if (host.activeStatusIndicator?.kind !== "working") {
54
+ host.showWorkingStatusIndicator();
55
+ }
56
+ }
57
+ else {
58
+ host.clearStatusIndicator();
59
+ }
60
+ host.ui.requestRender();
61
+ break;
62
+ case "queue_update":
63
+ host.updatePendingMessagesDisplay();
64
+ host.ui.requestRender();
65
+ break;
66
+ case "entry_appended":
67
+ // Custom entries have no renderer source since the legacy extension
68
+ // surface was removed; nothing to append to the chat.
69
+ break;
70
+ case "session_info_changed":
71
+ host.updateTerminalTitle();
72
+ host.footer.invalidate();
73
+ host.ui.requestRender();
74
+ break;
75
+ case "thinking_level_changed":
76
+ host.footer.invalidate();
77
+ host.updateEditorBorderColor();
78
+ break;
79
+ case "message_start":
80
+ if (event.message.role === "custom") {
81
+ host.addMessageToChat(event.message);
82
+ host.ui.requestRender();
83
+ }
84
+ else if (event.message.role === "user") {
85
+ host.addMessageToChat(event.message);
86
+ host.updatePendingMessagesDisplay();
87
+ host.ui.requestRender();
88
+ }
89
+ else if (event.message.role === "assistant") {
90
+ // D-083: a new assistant turn closes the previous turn's
91
+ // tool-run group (tools executed between the turns) and
92
+ // starts a fresh one on its first toolCall.
93
+ host.activeToolRunGroup?.markRunComplete();
94
+ host.activeToolRunGroup = undefined;
95
+ host.streamingComponent = new AssistantMessageComponent(undefined, host.hideThinkingBlock, host.getMarkdownThemeWithSettings(), host.hiddenThinkingLabel, host.outputPad, host.getMarkdownTransformers());
96
+ // D-083: components created after a ctrl+o toggle inherit the
97
+ // current expansion so detail mode holds across turns.
98
+ if (host.toolOutputExpanded) {
99
+ host.streamingComponent.setExpanded(true);
100
+ }
101
+ host.streamingMessage = event.message;
102
+ host.chatContainer.addChild(host.streamingComponent);
103
+ host.streamingComponent.updateContent(host.streamingMessage, true);
104
+ host.ui.requestRender();
105
+ }
106
+ break;
107
+ case "message_update":
108
+ if (host.streamingComponent && event.message.role === "assistant") {
109
+ host.streamingMessage = event.message;
110
+ host.streamingComponent.updateContent(host.streamingMessage, true);
111
+ for (const content of host.streamingMessage.content) {
112
+ if (content.type === "toolCall") {
113
+ if (!host.pendingTools.has(content.id)) {
114
+ const component = new ToolExecutionComponent(content.name, content.id, content.arguments, {
115
+ showImages: host.settingsManager.getShowImages(),
116
+ imageWidthCells: host.settingsManager.getImageWidthCells(),
117
+ }, host.getRegisteredToolDefinition(content.name), host.ui, host.facade.getCwd());
118
+ component.setExpanded(host.toolOutputExpanded);
119
+ host.addToolToRunGroup(component);
120
+ host.pendingTools.set(content.id, component);
121
+ }
122
+ else {
123
+ const component = host.pendingTools.get(content.id);
124
+ // v8 ignore next -- has() 已确认键存在,get() 恒返回组件
125
+ if (component) {
126
+ component.updateArgs(content.arguments);
127
+ }
128
+ }
129
+ }
130
+ }
131
+ host.ui.requestRender();
132
+ }
133
+ break;
134
+ case "message_end":
135
+ if (event.message.role === "user")
136
+ break;
137
+ if (host.streamingComponent && event.message.role === "assistant") {
138
+ host.streamingMessage = event.message;
139
+ let errorMessage;
140
+ if (host.streamingMessage.stopReason === "aborted") {
141
+ const retryAttempt = host.facade.getRetryAttempt();
142
+ errorMessage =
143
+ retryAttempt > 0
144
+ ? retryAttempt === 1
145
+ ? t("Aborted after {count} retry attempt", { count: retryAttempt })
146
+ : t("Aborted after {count} retry attempts", { count: retryAttempt })
147
+ : t("Operation aborted");
148
+ host.streamingMessage.errorMessage = errorMessage;
149
+ }
150
+ host.streamingComponent.updateContent(host.streamingMessage, false);
151
+ if (host.streamingMessage.stopReason === "aborted" || host.streamingMessage.stopReason === "error") {
152
+ if (!errorMessage) {
153
+ errorMessage = host.streamingMessage.errorMessage || t("Error");
154
+ }
155
+ for (const [, component] of host.pendingTools.entries()) {
156
+ component.updateResult({
157
+ content: [{ type: "text", text: errorMessage }],
158
+ isError: true,
159
+ });
160
+ host.activeToolRunGroup?.noteResult(true);
161
+ }
162
+ // No tool execution follows an aborted/errored message:
163
+ // finalize the group marker here.
164
+ host.activeToolRunGroup?.markRunComplete();
165
+ host.pendingTools.clear();
166
+ }
167
+ else {
168
+ // Args are now complete - trigger diff computation for edit tools
169
+ for (const [, component] of host.pendingTools.entries()) {
170
+ component.setArgsComplete();
171
+ }
172
+ host.maybeShowThinkingDropNotice(host.streamingMessage);
173
+ host.maybeShowCacheMissNotice(host.streamingMessage);
174
+ }
175
+ host.streamingComponent = undefined;
176
+ host.streamingMessage = undefined;
177
+ // D-083: a toolUse stop reason is followed by tool execution
178
+ // events (start/end arrive after message_end — the session
179
+ // executes tools once the streamed message completes), so the
180
+ // group stays open for setActiveTool/noteResult here and is
181
+ // finalized at agent_end / the next message_start.
182
+ host.footer.invalidate();
183
+ }
184
+ host.ui.requestRender();
185
+ break;
186
+ case "bash_execution_update":
187
+ // The bash execution callback handles TUI output rendering.
188
+ break;
189
+ case "tool_execution_start": {
190
+ let component = host.pendingTools.get(event.toolCallId);
191
+ if (!component) {
192
+ component = new ToolExecutionComponent(event.toolName, event.toolCallId, event.args, {
193
+ showImages: host.settingsManager.getShowImages(),
194
+ imageWidthCells: host.settingsManager.getImageWidthCells(),
195
+ }, host.getRegisteredToolDefinition(event.toolName), host.ui, host.facade.getCwd());
196
+ component.setExpanded(host.toolOutputExpanded);
197
+ host.addToolToRunGroup(component);
198
+ host.pendingTools.set(event.toolCallId, component);
199
+ }
200
+ component.markExecutionStarted();
201
+ host.activeToolRunGroup?.setActiveTool(event.toolName);
202
+ host.ui.requestRender();
203
+ break;
204
+ }
205
+ case "tool_execution_update": {
206
+ const component = host.pendingTools.get(event.toolCallId);
207
+ if (component) {
208
+ component.updateResult({ ...event.partialResult, isError: false }, true);
209
+ host.ui.requestRender();
210
+ }
211
+ break;
212
+ }
213
+ case "tool_execution_end": {
214
+ const component = host.pendingTools.get(event.toolCallId);
215
+ if (component) {
216
+ component.updateResult({ ...event.result, isError: event.isError });
217
+ host.activeToolRunGroup?.noteResult(event.isError);
218
+ host.pendingTools.delete(event.toolCallId);
219
+ host.ui.requestRender();
220
+ }
221
+ break;
222
+ }
223
+ case "capability_command_result": {
224
+ const links = event.result.links?.map((link) => `${link.label}: ${link.url}`) ?? [];
225
+ const message = [event.result.message, ...links].filter(Boolean).join("\n");
226
+ if (event.result.status === "error")
227
+ host.showError(message);
228
+ else
229
+ host.showStatus(message);
230
+ host.ui.requestRender();
231
+ break;
232
+ }
233
+ case "agent_end":
234
+ if (host.settingsManager.getShowTerminalProgress()) {
235
+ host.ui.terminal.setProgress(false);
236
+ }
237
+ host.clearStatusIndicator("working");
238
+ if (host.streamingComponent) {
239
+ host.chatContainer.removeChild(host.streamingComponent);
240
+ host.streamingComponent = undefined;
241
+ host.streamingMessage = undefined;
242
+ }
243
+ host.pendingTools.clear();
244
+ // D-083: the whole agent turn (messages + tool executions) is
245
+ // over — finalize the last group's marker (count/sole-tool name
246
+ // + failure count). Completed groups stay in the transcript.
247
+ host.activeToolRunGroup?.markRunComplete();
248
+ host.activeToolRunGroup = undefined;
249
+ host.ui.requestRender();
250
+ break;
251
+ case "agent_settled":
252
+ await host.checkShutdownRequested();
253
+ break;
254
+ case "compaction_start": {
255
+ if (host.settingsManager.getShowTerminalProgress()) {
256
+ host.ui.terminal.setProgress(true);
257
+ }
258
+ // Keep editor active; submissions are queued during compaction.
259
+ host.autoCompactionEscapeHandler = host.defaultEditor.onEscape;
260
+ host.defaultEditor.onEscape = () => {
261
+ host.facade.abortCompaction();
262
+ };
263
+ host.showStatusIndicator(new CompactionStatusIndicator(host.ui, event.reason));
264
+ host.ui.requestRender();
265
+ break;
266
+ }
267
+ case "compaction_end": {
268
+ if (host.settingsManager.getShowTerminalProgress()) {
269
+ host.ui.terminal.setProgress(false);
270
+ }
271
+ if (host.autoCompactionEscapeHandler) {
272
+ host.defaultEditor.onEscape = host.autoCompactionEscapeHandler;
273
+ host.autoCompactionEscapeHandler = undefined;
274
+ }
275
+ host.clearStatusIndicator("compaction");
276
+ if (event.aborted) {
277
+ if (event.reason === "manual") {
278
+ host.showError(t("Compaction cancelled"));
279
+ }
280
+ else {
281
+ host.showStatus(t("Auto-compaction cancelled"));
282
+ }
283
+ }
284
+ else if (event.result) {
285
+ const entries = host.facade.getContextEntries();
286
+ if (entries[0]?.type !== "compaction") {
287
+ throw new Error(t("Completed compaction is missing from the session context"));
288
+ }
289
+ host.chatContainer.clear();
290
+ // The latest compaction is prepended for model context; append it below at its chronological position.
291
+ host.renderSessionEntries(entries.slice(1));
292
+ host.addMessageToChat(createCompactionSummaryMessage(event.result.summary, event.result.tokensBefore, new Date().toISOString()));
293
+ if (event.result.usage) {
294
+ host.addCompactionCostNotice({
295
+ type: "compaction_cost",
296
+ kind: "compaction",
297
+ usage: event.result.usage,
298
+ });
299
+ }
300
+ host.footer.invalidate();
301
+ }
302
+ else if (event.errorMessage) {
303
+ if (event.reason === "manual") {
304
+ host.showError(event.errorMessage);
305
+ }
306
+ else {
307
+ host.chatContainer.addChild(new Spacer(1));
308
+ host.chatContainer.addChild(new Text(theme.fg("error", event.errorMessage), 1, 0));
309
+ }
310
+ }
311
+ void host.flushCompactionQueue({ willRetry: event.willRetry });
312
+ host.ui.requestRender();
313
+ break;
314
+ }
315
+ case "compaction_skipped": {
316
+ host.showStatus(t("Auto-compaction skipped: nothing to compact"));
317
+ host.ui.requestRender();
318
+ break;
319
+ }
320
+ case "auto_retry_start": {
321
+ // Set up escape to abort retry
322
+ host.retryEscapeHandler = host.defaultEditor.onEscape;
323
+ host.defaultEditor.onEscape = () => {
324
+ host.facade.abortRetry();
325
+ };
326
+ host.showStatusIndicator(new RetryStatusIndicator(host.ui, event.attempt, event.maxAttempts, event.delayMs));
327
+ host.ui.requestRender();
328
+ break;
329
+ }
330
+ case "auto_retry_end": {
331
+ // Restore escape handler
332
+ if (host.retryEscapeHandler) {
333
+ host.defaultEditor.onEscape = host.retryEscapeHandler;
334
+ host.retryEscapeHandler = undefined;
335
+ }
336
+ host.clearStatusIndicator("retry");
337
+ // Show error only on final failure (success shows normal response)
338
+ if (!event.success) {
339
+ host.showError(t("Retry failed after {count} attempts: {error}", {
340
+ count: event.attempt,
341
+ error: event.finalError || t("Unknown error"),
342
+ }));
343
+ }
344
+ host.ui.requestRender();
345
+ break;
346
+ }
347
+ case "summarization_retry_scheduled": {
348
+ host.showError(event.errorMessage);
349
+ host.showStatusIndicator(new RetryStatusIndicator(host.ui, event.attempt, event.maxAttempts, event.delayMs));
350
+ host.ui.requestRender();
351
+ break;
352
+ }
353
+ case "summarization_retry_attempt_start": {
354
+ host.clearStatusIndicator("retry");
355
+ if (event.source === "branchSummary") {
356
+ host.showStatusIndicator(new BranchSummaryStatusIndicator(host.ui));
357
+ }
358
+ else {
359
+ host.showStatusIndicator(new CompactionStatusIndicator(host.ui, event.reason));
360
+ }
361
+ host.ui.requestRender();
362
+ break;
363
+ }
364
+ case "summarization_retry_finished": {
365
+ host.clearStatusIndicator("retry");
366
+ host.ui.requestRender();
367
+ break;
368
+ }
369
+ }
370
+ }
371
+ /** Extract text content from a user message */
372
+ export function getUserMessageText(message) {
373
+ if (message.role !== "user")
374
+ return "";
375
+ const textBlocks = typeof message.content === "string"
376
+ ? [{ type: "text", text: message.content }]
377
+ : message.content.filter((c) => c.type === "text");
378
+ return textBlocks.map((c) => c.text).join("");
379
+ }
380
+ export function addMessageToChat(host, message, options) {
381
+ switch (message.role) {
382
+ case "bashExecution": {
383
+ const component = new BashExecutionComponent(message.command, host.ui, message.excludeFromContext);
384
+ if (message.output) {
385
+ component.appendOutput(message.output);
386
+ }
387
+ component.setComplete(message.exitCode, message.cancelled, message.truncated ? { truncated: true } : undefined, message.fullOutputPath);
388
+ host.chatContainer.addChild(component);
389
+ break;
390
+ }
391
+ case "custom": {
392
+ if (message.display) {
393
+ const renderer = undefined;
394
+ const component = new CustomMessageComponent(message, renderer, host.getMarkdownThemeWithSettings(), host.outputPad);
395
+ component.setExpanded(host.toolOutputExpanded);
396
+ host.chatContainer.addChild(component);
397
+ }
398
+ break;
399
+ }
400
+ case "compactionSummary": {
401
+ host.chatContainer.addChild(new Spacer(1));
402
+ const component = new CompactionSummaryMessageComponent(message, host.getMarkdownThemeWithSettings());
403
+ component.setExpanded(host.toolOutputExpanded);
404
+ host.chatContainer.addChild(component);
405
+ break;
406
+ }
407
+ case "branchSummary": {
408
+ host.chatContainer.addChild(new Spacer(1));
409
+ const component = new BranchSummaryMessageComponent(message, host.getMarkdownThemeWithSettings());
410
+ component.setExpanded(host.toolOutputExpanded);
411
+ host.chatContainer.addChild(component);
412
+ break;
413
+ }
414
+ case "user": {
415
+ const textContent = host.getUserMessageText(message);
416
+ if (textContent) {
417
+ if (host.chatContainer.children.length > 0) {
418
+ host.chatContainer.addChild(new Spacer(1));
419
+ }
420
+ const skillBlock = parseSkillBlock(textContent);
421
+ if (skillBlock) {
422
+ // Render skill block (collapsible)
423
+ const component = new SkillInvocationMessageComponent(skillBlock, host.getMarkdownThemeWithSettings());
424
+ component.setExpanded(host.toolOutputExpanded);
425
+ host.chatContainer.addChild(component);
426
+ // Render user message separately if present
427
+ if (skillBlock.userMessage) {
428
+ host.chatContainer.addChild(new Spacer(1));
429
+ const userComponent = new UserMessageComponent(skillBlock.userMessage, host.getMarkdownThemeWithSettings(), host.outputPad, host.getMarkdownTransformers());
430
+ host.chatContainer.addChild(userComponent);
431
+ }
432
+ }
433
+ else {
434
+ const userComponent = new UserMessageComponent(textContent, host.getMarkdownThemeWithSettings(), host.outputPad, host.getMarkdownTransformers());
435
+ host.chatContainer.addChild(userComponent);
436
+ }
437
+ if (options?.populateHistory) {
438
+ host.editor.addToHistory?.(textContent);
439
+ }
440
+ }
441
+ break;
442
+ }
443
+ case "assistant": {
444
+ const assistantComponent = new AssistantMessageComponent(message, host.hideThinkingBlock, host.getMarkdownThemeWithSettings(), host.hiddenThinkingLabel, host.outputPad, host.getMarkdownTransformers());
445
+ // D-083: restored/finished-turn thinking must follow detail mode
446
+ // (ctrl+o) — the setToolsExpanded loop only reaches children on
447
+ // toggle, not components created while already expanded.
448
+ if (host.toolOutputExpanded) {
449
+ assistantComponent.setExpanded(true);
450
+ }
451
+ host.chatContainer.addChild(assistantComponent);
452
+ break;
453
+ }
454
+ case "toolResult": {
455
+ // Tool results are rendered inline with tool calls, handled separately
456
+ break;
457
+ }
458
+ default: {
459
+ // v8 ignore next -- exhaustive over AgentMessage roles
460
+ const _exhaustive = message;
461
+ }
462
+ }
463
+ }
464
+ export function renderSessionItems(host, items, options = {}) {
465
+ host.pendingTools.clear();
466
+ const renderedPendingTools = new Map();
467
+ // Cache-miss notices are not persisted; re-derive them from the full entry
468
+ // list and re-inject them after the assistant messages that paid for them.
469
+ const cacheMisses = host.settingsManager.getShowCacheMissNotices()
470
+ ? collectCacheMisses(host.facade.getEntries(), host.facade.getModelPriceSource())
471
+ : new Map();
472
+ if (options.updateFooter) {
473
+ host.footer.invalidate();
474
+ host.updateEditorBorderColor();
475
+ }
476
+ for (const item of items) {
477
+ if (isCustomSessionEntry(item)) {
478
+ // No entry renderer source since the legacy extension surface was
479
+ // removed; previously renderer-less entries were skipped as well.
480
+ continue;
481
+ }
482
+ if (isCompactionCostNotice(item)) {
483
+ host.addCompactionCostNotice(item);
484
+ continue;
485
+ }
486
+ const message = item;
487
+ // Assistant messages need special handling for tool calls
488
+ if (message.role === "assistant") {
489
+ host.addMessageToChat(message);
490
+ // No message_start on the restore path: reset the group pointer
491
+ // so each assistant message forms its own tool-run group (D-083).
492
+ host.activeToolRunGroup = undefined;
493
+ // Render tool call components
494
+ for (const content of message.content) {
495
+ if (content.type === "toolCall") {
496
+ const component = new ToolExecutionComponent(content.name, content.id, content.arguments, {
497
+ showImages: host.settingsManager.getShowImages(),
498
+ imageWidthCells: host.settingsManager.getImageWidthCells(),
499
+ }, host.getRegisteredToolDefinition(content.name), host.ui, host.facade.getCwd());
500
+ component.setExpanded(host.toolOutputExpanded);
501
+ host.addToolToRunGroup(component);
502
+ if (message.stopReason === "aborted" || message.stopReason === "error") {
503
+ let errorMessage;
504
+ if (message.stopReason === "aborted") {
505
+ const retryAttempt = host.facade.getRetryAttempt();
506
+ errorMessage =
507
+ retryAttempt > 0
508
+ ? retryAttempt === 1
509
+ ? t("Aborted after {count} retry attempt", { count: retryAttempt })
510
+ : t("Aborted after {count} retry attempts", { count: retryAttempt })
511
+ : t("Operation aborted");
512
+ }
513
+ else {
514
+ errorMessage = message.errorMessage || t("Error");
515
+ }
516
+ component.updateResult({ content: [{ type: "text", text: errorMessage }], isError: true });
517
+ host.noteResultInActiveToolRunGroup(true);
518
+ }
519
+ else {
520
+ renderedPendingTools.set(content.id, component);
521
+ }
522
+ }
523
+ }
524
+ host.markActiveToolRunGroupComplete();
525
+ if (message.stopReason !== "aborted" && message.stopReason !== "error") {
526
+ const miss = cacheMisses.get(message);
527
+ if (miss)
528
+ host.addCacheMissNotice(miss);
529
+ }
530
+ }
531
+ else if (message.role === "toolResult") {
532
+ // Match tool results to pending tool components
533
+ const component = renderedPendingTools.get(message.toolCallId);
534
+ if (component) {
535
+ component.updateResult(message);
536
+ // Failure never goes silent (D-083): count it on the group
537
+ // the restored tool call belongs to.
538
+ host.noteResultInActiveToolRunGroup(message.isError);
539
+ renderedPendingTools.delete(message.toolCallId);
540
+ }
541
+ }
542
+ else {
543
+ // All other messages use standard rendering
544
+ host.addMessageToChat(message, options);
545
+ }
546
+ }
547
+ for (const [toolCallId, component] of renderedPendingTools) {
548
+ host.pendingTools.set(toolCallId, component);
549
+ }
550
+ // Groups stay in the transcript; reset the pointer so a live turn
551
+ // starts a fresh group (D-083).
552
+ host.activeToolRunGroup = undefined;
553
+ host.ui.requestRender();
554
+ }
555
+ /**
556
+ * Render session entries to chat. Used for initial load and rebuild after compaction.
557
+ * @param entries Compaction-aware session entries to render
558
+ * @param options.updateFooter Update footer state
559
+ * @param options.populateHistory Add user messages to editor history
560
+ */
561
+ export function renderSessionEntries(host, entries, options = {}) {
562
+ const items = entries.flatMap((entry) => {
563
+ if (entry.type === "custom") {
564
+ return [entry];
565
+ }
566
+ const messages = sessionEntryToContextMessages(entry);
567
+ if ((entry.type === "compaction" || entry.type === "branch_summary") && entry.usage && messages.length > 0) {
568
+ return [...messages, { type: "compaction_cost", kind: entry.type, usage: entry.usage }];
569
+ }
570
+ return messages;
571
+ });
572
+ host.renderSessionItems(items, options);
573
+ }
574
+ /**
575
+ * Render billing usage for a compaction or branch summary. The notice is derived
576
+ * from persisted summary usage and is not stored as a separate session entry.
577
+ */
578
+ export function addCompactionCostNotice(host, notice) {
579
+ if (!host.settingsManager.getShowCacheMissNotices())
580
+ return;
581
+ const { usage } = notice;
582
+ const tokens = usage.input + usage.output + usage.cacheRead + usage.cacheWrite;
583
+ const cost = usage.cost.total >= 0.01 ? ` (~$${usage.cost.total.toFixed(2)})` : "";
584
+ const label = notice.kind === "compaction" ? t("Compaction") : t("Branch summary");
585
+ host.chatContainer.addChild(new Spacer(1));
586
+ host.chatContainer.addChild(new Text(theme.fg("warning", `${label}: ${t("{tokens} tokens billed{cost}", { tokens: formatTokens(tokens), cost })}`), 1, 0));
587
+ }
588
+ function countDroppedThinkingBlocks(message) {
589
+ let count = 0;
590
+ for (const diagnostic of message.diagnostics ?? []) {
591
+ if (diagnostic.type !== "anthropic_input_transformations")
592
+ continue;
593
+ const transformations = diagnostic.details?.transformations;
594
+ if (!Array.isArray(transformations))
595
+ continue;
596
+ count += transformations.filter((transformation) => typeof transformation === "object" &&
597
+ transformation !== null &&
598
+ transformation.type === "thinking_dropped").length;
599
+ }
600
+ return count;
601
+ }
602
+ export function maybeShowThinkingDropNotice(host, message) {
603
+ if (!host.settingsManager.getShowCacheMissNotices())
604
+ return;
605
+ const droppedCount = countDroppedThinkingBlocks(message);
606
+ if (droppedCount === 0)
607
+ return;
608
+ let previousDroppedCount = 0;
609
+ // message_end reaches the UI before the current message is persisted,
610
+ // so the branch's last assistant message is the previous response.
611
+ const entries = host.facade.getEntries();
612
+ for (let i = entries.length - 1; i >= 0; i--) {
613
+ const entry = entries[i];
614
+ if (entry.type === "message" && entry.message.role === "assistant") {
615
+ previousDroppedCount = countDroppedThinkingBlocks(entry.message);
616
+ break;
617
+ }
618
+ }
619
+ if (droppedCount <= previousDroppedCount)
620
+ return;
621
+ host.chatContainer.addChild(new Spacer(1));
622
+ host.chatContainer.addChild(new Text(theme.fg("warning", t("Anthropic dropped {count} thinking blocks (details in session)", { count: droppedCount })), 1, 0));
623
+ }
624
+ /**
625
+ * Show a transcript notice when a completed assistant message paid for a
626
+ * significant cache miss. Only states observable facts: the miss itself,
627
+ * a model switch, or an idle gap past the cache TTL.
628
+ */
629
+ export function maybeShowCacheMissNotice(host, message) {
630
+ if (!host.settingsManager.getShowCacheMissNotices())
631
+ return;
632
+ // Entries don't contain `message` yet: message_end fires before persistence.
633
+ const miss = detectCacheMiss(host.facade.getEntries(), message, host.facade.getModelPriceSource());
634
+ if (miss)
635
+ host.addCacheMissNotice(miss);
636
+ }
637
+ export function addCacheMissNotice(host, miss) {
638
+ if (miss.missedTokens < 20_000 && miss.missedCost < 0.1)
639
+ return;
640
+ const cost = miss.missedCost >= 0.01 ? ` (~$${miss.missedCost.toFixed(2)})` : "";
641
+ const reBilled = t("{tokens} tokens re-billed{cost}", { tokens: formatTokens(miss.missedTokens), cost });
642
+ let label = t("Cache miss");
643
+ if (miss.modelChanged) {
644
+ label = t("Cache miss after model switch");
645
+ }
646
+ else if (miss.idleMs >= CACHE_TTL_MS) {
647
+ label = t("Cache miss after {minutes}m idle", { minutes: Math.round(miss.idleMs / 60_000) });
648
+ }
649
+ const text = theme.fg("warning", `${label}: ${reBilled}`);
650
+ host.chatContainer.addChild(new Spacer(1));
651
+ host.chatContainer.addChild(new Text(text, 1, 0));
652
+ }
653
+ export function renderInitialMessages(host) {
654
+ const entries = host.facade.getContextEntries();
655
+ host.renderSessionEntries(entries, {
656
+ updateFooter: true,
657
+ populateHistory: true,
658
+ });
659
+ // Show compaction info if session was compacted
660
+ const allEntries = host.facade.getEntries();
661
+ const compactionCount = allEntries.filter((e) => e.type === "compaction").length;
662
+ if (compactionCount > 0) {
663
+ host.showStatus(compactionCount === 1
664
+ ? t("Session compacted {count} time", { count: compactionCount })
665
+ : t("Session compacted {count} times", { count: compactionCount }));
666
+ }
667
+ }
668
+ export function rebuildChatFromMessages(host) {
669
+ host.chatContainer.clear();
670
+ host.renderSessionEntries(host.facade.getContextEntries());
671
+ }
672
+ export function getRegisteredToolDefinition(host, toolName) {
673
+ return host.facade.getToolDefinition(toolName);
674
+ }
675
+ export function getMarkdownTransformers(host) {
676
+ return [host.mermaidMarkdownTransformer];
677
+ }
678
+ /**
679
+ * D-083 quiet transcript: mount a tool component into the current
680
+ * assistant turn's tool-run group (creating the group on first tool of
681
+ * the turn) instead of the chat container directly. Collapsed groups
682
+ * render one dim marker line for the whole turn.
683
+ */
684
+ export function addToolToRunGroup(host, component) {
685
+ if (!host.activeToolRunGroup) {
686
+ host.activeToolRunGroup = new ToolRunGroupComponent();
687
+ host.activeToolRunGroup.setExpanded(host.toolOutputExpanded);
688
+ host.chatContainer.addChild(host.activeToolRunGroup);
689
+ }
690
+ host.activeToolRunGroup.addTool(component);
691
+ }
692
+ /**
693
+ * Narrowing-safe faces for the active group inside renderSessionItems:
694
+ * addToolToRunGroup may (re)assign host.activeToolRunGroup behind the
695
+ * compiler's back, so group reads go through methods instead of the
696
+ * narrowed property reference.
697
+ */
698
+ export function noteResultInActiveToolRunGroup(host, isError) {
699
+ host.activeToolRunGroup?.noteResult(isError);
700
+ }
701
+ export function markActiveToolRunGroupComplete(host) {
702
+ host.activeToolRunGroup?.markRunComplete();
703
+ }
704
+ //# sourceMappingURL=interactive-events.js.map