@markusylisiurunen/tau 0.3.32 → 0.3.34

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 (343) hide show
  1. package/README.md +15 -20
  2. package/dist/core/agent/agent_runtime.js +1551 -0
  3. package/dist/core/agent/agent_runtime.js.map +1 -0
  4. package/dist/core/agent/events.js +2 -0
  5. package/dist/core/agent/events.js.map +1 -0
  6. package/dist/core/commands/registry.js +0 -42
  7. package/dist/core/commands/registry.js.map +1 -1
  8. package/dist/core/config/content_loader.js +7 -3
  9. package/dist/core/config/content_loader.js.map +1 -1
  10. package/dist/core/index.js +3 -2
  11. package/dist/core/index.js.map +1 -1
  12. package/dist/core/models/catalog.js +7 -1
  13. package/dist/core/models/catalog.js.map +1 -1
  14. package/dist/core/models/tau_model_overrides.js +10 -0
  15. package/dist/core/models/tau_model_overrides.js.map +1 -0
  16. package/dist/core/modes/index.js.map +1 -1
  17. package/dist/core/personas.js +4 -2
  18. package/dist/core/personas.js.map +1 -1
  19. package/dist/core/runtime/agent_model.js +50 -0
  20. package/dist/core/runtime/agent_model.js.map +1 -0
  21. package/dist/core/runtime/chat_runtime.js +175 -63
  22. package/dist/core/runtime/chat_runtime.js.map +1 -1
  23. package/dist/core/runtime/model_executor.js +2 -0
  24. package/dist/core/runtime/model_executor.js.map +1 -0
  25. package/dist/core/runtime/model_sampler.js +21 -0
  26. package/dist/core/runtime/model_sampler.js.map +1 -0
  27. package/dist/core/session/auto_compaction_archive.js +239 -0
  28. package/dist/core/session/auto_compaction_archive.js.map +1 -0
  29. package/dist/core/session/compaction.js +97 -29
  30. package/dist/core/session/compaction.js.map +1 -1
  31. package/dist/core/session/direct_bash.js.map +1 -1
  32. package/dist/core/session/message_accumulator.js +3 -5
  33. package/dist/core/session/message_accumulator.js.map +1 -1
  34. package/dist/core/session/runner.js +274 -102
  35. package/dist/core/session/runner.js.map +1 -1
  36. package/dist/core/subagents/agent_supervisor.js +378 -0
  37. package/dist/core/subagents/agent_supervisor.js.map +1 -0
  38. package/dist/core/subagents/format.js +101 -0
  39. package/dist/core/subagents/format.js.map +1 -0
  40. package/dist/core/subagents/registry.js +3 -1
  41. package/dist/core/subagents/registry.js.map +1 -1
  42. package/dist/core/subagents/types.js +1 -0
  43. package/dist/core/subagents/types.js.map +1 -1
  44. package/dist/core/tools/activity.js +2 -0
  45. package/dist/core/tools/activity.js.map +1 -0
  46. package/dist/core/tools/bash.js +64 -67
  47. package/dist/core/tools/bash.js.map +1 -1
  48. package/dist/core/tools/catalog.js +49 -25
  49. package/dist/core/tools/catalog.js.map +1 -1
  50. package/dist/core/tools/code_mode.js +65 -58
  51. package/dist/core/tools/code_mode.js.map +1 -1
  52. package/dist/core/tools/edit.js +11 -12
  53. package/dist/core/tools/edit.js.map +1 -1
  54. package/dist/core/tools/interrupt_agent.js +119 -0
  55. package/dist/core/tools/interrupt_agent.js.map +1 -0
  56. package/dist/core/tools/list_agents.js +64 -0
  57. package/dist/core/tools/list_agents.js.map +1 -0
  58. package/dist/core/tools/nook.js +3 -2
  59. package/dist/core/tools/nook.js.map +1 -1
  60. package/dist/core/tools/registry.js +27 -13
  61. package/dist/core/tools/registry.js.map +1 -1
  62. package/dist/core/tools/send_input_to_agent.js +77 -93
  63. package/dist/core/tools/send_input_to_agent.js.map +1 -1
  64. package/dist/core/tools/spawn_agent.js +94 -114
  65. package/dist/core/tools/spawn_agent.js.map +1 -1
  66. package/dist/core/tools/tool_names.js +4 -2
  67. package/dist/core/tools/tool_names.js.map +1 -1
  68. package/dist/core/tools/view_image.js +11 -16
  69. package/dist/core/tools/view_image.js.map +1 -1
  70. package/dist/core/tools/wait_for_agents.js +76 -137
  71. package/dist/core/tools/wait_for_agents.js.map +1 -1
  72. package/dist/core/tools/web.js +3 -3
  73. package/dist/core/tools/web.js.map +1 -1
  74. package/dist/core/tools/write.js +10 -11
  75. package/dist/core/tools/write.js.map +1 -1
  76. package/dist/core/usage/logs.js.map +1 -1
  77. package/dist/core/utils/compact.js +19 -10
  78. package/dist/core/utils/compact.js.map +1 -1
  79. package/dist/core/utils/subagent_utils.js.map +1 -1
  80. package/dist/core/version.js +1 -1
  81. package/dist/diff_tool/app/dist/assets/actionscript-3-Cs6JJXT5.js +1 -0
  82. package/dist/diff_tool/app/dist/assets/ahk-CA9gdOdF.js +1 -0
  83. package/dist/diff_tool/app/dist/assets/ahk2-_6rzW9BS.js +1 -0
  84. package/dist/diff_tool/app/dist/assets/{angular-html-DbgxQryr.js → angular-html-vSIwre92.js} +1 -1
  85. package/dist/diff_tool/app/dist/assets/{angular-ts-Dzjq8SvI.js → angular-ts-B9yWa-IT.js} +1 -1
  86. package/dist/diff_tool/app/dist/assets/apex-KFGFyKwG.js +1 -0
  87. package/dist/diff_tool/app/dist/assets/{apl-6AmEMJr-.js → apl-CBg9ewu1.js} +1 -1
  88. package/dist/diff_tool/app/dist/assets/asciidoc-SCjQUq34.js +1 -0
  89. package/dist/diff_tool/app/dist/assets/{astro-BM8EbfIg.js → astro-BVjxSYjj.js} +1 -1
  90. package/dist/diff_tool/app/dist/assets/{bat-Bo4NYOV-.js → bat-qdxAdBWQ.js} +1 -1
  91. package/dist/diff_tool/app/dist/assets/bird2-CYIUgYqB.js +1 -0
  92. package/dist/diff_tool/app/dist/assets/{blade-DiKMnN3e.js → blade-jvqV5kiv.js} +1 -1
  93. package/dist/diff_tool/app/dist/assets/bsl-_VjlB9mv.js +1 -0
  94. package/dist/diff_tool/app/dist/assets/{c-DMT5X-u9.js → c-DDAfW08c.js} +1 -1
  95. package/dist/diff_tool/app/dist/assets/c3-D0apG41V.js +1 -0
  96. package/dist/diff_tool/app/dist/assets/catppuccin-frappe-C9Q5zVZY.js +1 -0
  97. package/dist/diff_tool/app/dist/assets/catppuccin-latte-CtsyrtPq.js +1 -0
  98. package/dist/diff_tool/app/dist/assets/catppuccin-macchiato-R8nAf1vR.js +1 -0
  99. package/dist/diff_tool/app/dist/assets/catppuccin-mocha-DjuaAJKi.js +1 -0
  100. package/dist/diff_tool/app/dist/assets/chapel-Qflwfgbt.js +1 -0
  101. package/dist/diff_tool/app/dist/assets/clarity-CtfBBspg.js +1 -0
  102. package/dist/diff_tool/app/dist/assets/{cobol-CACNMc1O.js → cobol-4iJI1LUg.js} +1 -1
  103. package/dist/diff_tool/app/dist/assets/{coffee-D_WUFE0g.js → coffee-C9LbGGO3.js} +1 -1
  104. package/dist/diff_tool/app/dist/assets/coq-DuBRPxYg.js +1 -0
  105. package/dist/diff_tool/app/dist/assets/cpp-B-x6veTx.js +1 -0
  106. package/dist/diff_tool/app/dist/assets/{crystal-wh93mtUe.js → crystal-S06EUmKn.js} +1 -1
  107. package/dist/diff_tool/app/dist/assets/{css-CCfuUqEr.js → css-DA4RYriG.js} +1 -1
  108. package/dist/diff_tool/app/dist/assets/{edge-DP-spcJf.js → edge-7dx6BjGp.js} +1 -1
  109. package/dist/diff_tool/app/dist/assets/{elixir-BXBkaEtJ.js → elixir-DPywG97a.js} +1 -1
  110. package/dist/diff_tool/app/dist/assets/{elm-BXr8OwKP.js → elm-Dgo_WnqC.js} +1 -1
  111. package/dist/diff_tool/app/dist/assets/emacs-lisp-c_oH4hRZ.js +1 -0
  112. package/dist/diff_tool/app/dist/assets/{erb-Cu5Zacs_.js → erb-CVW4PjFl.js} +1 -1
  113. package/dist/diff_tool/app/dist/assets/{gdresource-C0sCabJj.js → gdresource-xMC7jr7x.js} +1 -1
  114. package/dist/diff_tool/app/dist/assets/gdscript-DYvRD3hg.js +1 -0
  115. package/dist/diff_tool/app/dist/assets/{git-rebase-DO8LWld4.js → git-rebase-CtU0gmBJ.js} +1 -1
  116. package/dist/diff_tool/app/dist/assets/{glimmer-js-Bh-OAIDW.js → glimmer-js-twAYiPP2.js} +1 -1
  117. package/dist/diff_tool/app/dist/assets/{glimmer-ts-DI9lHU4q.js → glimmer-ts-BfNoXayN.js} +1 -1
  118. package/dist/diff_tool/app/dist/assets/{glsl--zoY4RCO.js → glsl-D_XrtFF7.js} +1 -1
  119. package/dist/diff_tool/app/dist/assets/{graphql-C8h2T_SC.js → graphql-B_GeapzM.js} +1 -1
  120. package/dist/diff_tool/app/dist/assets/hack-BCaCVoSX.js +1 -0
  121. package/dist/diff_tool/app/dist/assets/{haml-C2BBBsDW.js → haml-z9Mz7I1O.js} +1 -1
  122. package/dist/diff_tool/app/dist/assets/{handlebars-cZMztphK.js → handlebars-D0FVYagc.js} +1 -1
  123. package/dist/diff_tool/app/dist/assets/haxe-C8oCnwJJ.js +1 -0
  124. package/dist/diff_tool/app/dist/assets/{html-BtccomkJ.js → html-BOM4tb7u.js} +1 -1
  125. package/dist/diff_tool/app/dist/assets/{html-derivative-qjeUe52-.js → html-derivative-CsSlhJgr.js} +1 -1
  126. package/dist/diff_tool/app/dist/assets/{http-Dv8OQO33.js → http-Cjy9oaQn.js} +1 -1
  127. package/dist/diff_tool/app/dist/assets/{hurl-B6Fnr2ae.js → hurl-CjLQ7ql5.js} +1 -1
  128. package/dist/diff_tool/app/dist/assets/hxml-Dcm88srW.js +1 -0
  129. package/dist/diff_tool/app/dist/assets/index-QO81yN6b.js +1550 -0
  130. package/dist/diff_tool/app/dist/assets/{java-BuadWMcp.js → java-cn8DiFD8.js} +1 -1
  131. package/dist/diff_tool/app/dist/assets/{javascript-BIKxmHeL.js → javascript-CEnHZaZM.js} +1 -1
  132. package/dist/diff_tool/app/dist/assets/{jinja-Cm_guvgu.js → jinja-DIp6kVk7.js} +1 -1
  133. package/dist/diff_tool/app/dist/assets/{jison-Sst29gJb.js → jison-Dx116ito.js} +1 -1
  134. package/dist/diff_tool/app/dist/assets/{json-Bg6l2vym.js → json-C6B9h0n5.js} +1 -1
  135. package/dist/diff_tool/app/dist/assets/{jsx-BiREAxkr.js → jsx-CDEGT2B2.js} +1 -1
  136. package/dist/diff_tool/app/dist/assets/{julia-DAhrWFzr.js → julia-CsIJA3Km.js} +1 -1
  137. package/dist/diff_tool/app/dist/assets/{just-xBwbf5aT.js → just-DZRYvkQw.js} +1 -1
  138. package/dist/diff_tool/app/dist/assets/kanagawa-dragon-Bozd7klA.js +1 -0
  139. package/dist/diff_tool/app/dist/assets/kanagawa-lotus-BmuOG9ZW.js +1 -0
  140. package/dist/diff_tool/app/dist/assets/kanagawa-wave-BML5mF2J.js +1 -0
  141. package/dist/diff_tool/app/dist/assets/latex-CeR-RQOI.js +1 -0
  142. package/dist/diff_tool/app/dist/assets/{liquid-BTsCzVvF.js → liquid-Dhf8N4mn.js} +1 -1
  143. package/dist/diff_tool/app/dist/assets/{llvm-Cm23YOpf.js → llvm-DqHOMS-s.js} +1 -1
  144. package/dist/diff_tool/app/dist/assets/{lua-BJt9x0JP.js → lua-zVTVaJzn.js} +1 -1
  145. package/dist/diff_tool/app/dist/assets/luau-C2pBCSgt.js +1 -0
  146. package/dist/diff_tool/app/dist/assets/{marko-CWdJkbvC.js → marko-BGPq5r3o.js} +1 -1
  147. package/dist/diff_tool/app/dist/assets/mdc-D8K78bym.js +1 -0
  148. package/dist/diff_tool/app/dist/assets/mermaid-BxpfTIzt.js +1 -0
  149. package/dist/diff_tool/app/dist/assets/mojo-CFuIV2fl.js +1 -0
  150. package/dist/diff_tool/app/dist/assets/monokai-B_bV9PQ9.js +1 -0
  151. package/dist/diff_tool/app/dist/assets/moonbit-DgjMoLWr.js +1 -0
  152. package/dist/diff_tool/app/dist/assets/move-BYnGhZoM.js +1 -0
  153. package/dist/diff_tool/app/dist/assets/{nginx-BwS0G4IK.js → nginx-Bo-bEa75.js} +1 -1
  154. package/dist/diff_tool/app/dist/assets/{nim-B2VFbcs9.js → nim-Bfy5M54r.js} +1 -1
  155. package/dist/diff_tool/app/dist/assets/nsis-CjNLYCLg.js +1 -0
  156. package/dist/diff_tool/app/dist/assets/nushell-DHYfO66s.js +1 -0
  157. package/dist/diff_tool/app/dist/assets/org-BKetN7sT.js +1 -0
  158. package/dist/diff_tool/app/dist/assets/{perl-BTeqR-l8.js → perl-WiwTOQTV.js} +1 -1
  159. package/dist/diff_tool/app/dist/assets/{php-Crua7nbA.js → php-CM2FzhGV.js} +1 -1
  160. package/dist/diff_tool/app/dist/assets/{powershell-DshXNtvi.js → powershell-CCSX75yM.js} +1 -1
  161. package/dist/diff_tool/app/dist/assets/prisma-DMgNhnYS.js +1 -0
  162. package/dist/diff_tool/app/dist/assets/{pug-CUlgPjMU.js → pug-D2WvUHZ-.js} +1 -1
  163. package/dist/diff_tool/app/dist/assets/{qml-DI0IjNUw.js → qml-DGPbc6TL.js} +1 -1
  164. package/dist/diff_tool/app/dist/assets/r-CCFYJ_KM.js +1 -0
  165. package/dist/diff_tool/app/dist/assets/{razor-DrkKtFm5.js → razor-D1JuQWQz.js} +1 -1
  166. package/dist/diff_tool/app/dist/assets/rbs-C0MpOrj4.js +1 -0
  167. package/dist/diff_tool/app/dist/assets/red-DX1BQOs8.js +1 -0
  168. package/dist/diff_tool/app/dist/assets/{regexp-DRmxJil7.js → regexp-zTiHwMow.js} +1 -1
  169. package/dist/diff_tool/app/dist/assets/rose-pine-aMsaMD1D.js +1 -0
  170. package/dist/diff_tool/app/dist/assets/rose-pine-dawn-8PwUyIlP.js +1 -0
  171. package/dist/diff_tool/app/dist/assets/rose-pine-moon-DO-qXg-I.js +1 -0
  172. package/dist/diff_tool/app/dist/assets/{rst-DiRke36z.js → rst-CuUAArfH.js} +1 -1
  173. package/dist/diff_tool/app/dist/assets/{ruby-t7r9jzAg.js → ruby-DznrLCoG.js} +1 -1
  174. package/dist/diff_tool/app/dist/assets/{sas-CR7Z4kg-.js → sas-D2hJmLva.js} +1 -1
  175. package/dist/diff_tool/app/dist/assets/{scala-DKOlJaKm.js → scala-BiFt_7mu.js} +1 -1
  176. package/dist/diff_tool/app/dist/assets/{scss--CnPWaDv.js → scss-Cjb3p_6n.js} +1 -1
  177. package/dist/diff_tool/app/dist/assets/{shellscript-Bz7H5174.js → shellscript-BtwI-tfX.js} +1 -1
  178. package/dist/diff_tool/app/dist/assets/{shellsession-mlKnHJfN.js → shellsession-BYirS1xP.js} +1 -1
  179. package/dist/diff_tool/app/dist/assets/smalltalk-BHpQb5nM.js +1 -0
  180. package/dist/diff_tool/app/dist/assets/smithy-Dgaz7aur.js +1 -0
  181. package/dist/diff_tool/app/dist/assets/solarized-dark-UdsmMDCL.js +1 -0
  182. package/dist/diff_tool/app/dist/assets/solarized-light-C1IUL_tW.js +1 -0
  183. package/dist/diff_tool/app/dist/assets/solidity-Bj7E1mRn.js +1 -0
  184. package/dist/diff_tool/app/dist/assets/{soy-CKu9y9G1.js → soy-D4Ndk7-j.js} +1 -1
  185. package/dist/diff_tool/app/dist/assets/{sql-DcvKi3Jj.js → sql-DbLQ5SJl.js} +1 -1
  186. package/dist/diff_tool/app/dist/assets/{stata-Yo25QZyV.js → stata-BXoNBosJ.js} +1 -1
  187. package/dist/diff_tool/app/dist/assets/surrealql-toyTYnAL.js +1 -0
  188. package/dist/diff_tool/app/dist/assets/{svelte-BIhEVbnP.js → svelte-BEpa7pAW.js} +1 -1
  189. package/dist/diff_tool/app/dist/assets/swift-CyEgAFGc.js +1 -0
  190. package/dist/diff_tool/app/dist/assets/system-verilog-Dh5ihWbf.js +1 -0
  191. package/dist/diff_tool/app/dist/assets/{templ-D6FrV4mZ.js → templ-CZfW_RJI.js} +1 -1
  192. package/dist/diff_tool/app/dist/assets/tex-COemmIIu.js +1 -0
  193. package/dist/diff_tool/app/dist/assets/theming-B5HubD5i.js +1 -0
  194. package/dist/diff_tool/app/dist/assets/theming-BTK0wyKj.js +1 -0
  195. package/dist/diff_tool/app/dist/assets/theming-BTUlzJFw.js +1 -0
  196. package/dist/diff_tool/app/dist/assets/theming-BURFlYfV.js +1 -0
  197. package/dist/diff_tool/app/dist/assets/theming-BVZjihoZ.js +1 -0
  198. package/dist/diff_tool/app/dist/assets/theming-BWSkzMBn.js +1 -0
  199. package/dist/diff_tool/app/dist/assets/theming-BchIqPOb.js +1 -0
  200. package/dist/diff_tool/app/dist/assets/theming-CeLfRn2P.js +1 -0
  201. package/dist/diff_tool/app/dist/assets/theming-DMjwMSwU.js +1 -0
  202. package/dist/diff_tool/app/dist/assets/theming-QWGGdlwd.js +1 -0
  203. package/dist/diff_tool/app/dist/assets/{ts-tags-Kqn1PP6m.js → ts-tags-CMVUY_BA.js} +1 -1
  204. package/dist/diff_tool/app/dist/assets/{tsx-L3TEJWGL.js → tsx-BTvP6uzd.js} +1 -1
  205. package/dist/diff_tool/app/dist/assets/twig-DzP5RjJc.js +1 -0
  206. package/dist/diff_tool/app/dist/assets/{typescript-Dvc5RX4H.js → typescript-CQaGlMoX.js} +1 -1
  207. package/dist/diff_tool/app/dist/assets/{v-DETTlOr0.js → v-DBj4K9d_.js} +1 -1
  208. package/dist/diff_tool/app/dist/assets/{vb-Djn5o6TS.js → vb-DOwzaHZ0.js} +1 -1
  209. package/dist/diff_tool/app/dist/assets/verilog-B2gwz-sJ.js +1 -0
  210. package/dist/diff_tool/app/dist/assets/{vue-X1uI3I2A.js → vue-DaVWTtvb.js} +1 -1
  211. package/dist/diff_tool/app/dist/assets/{vue-html-BMpHEoeQ.js → vue-html-BA_OH0Xt.js} +1 -1
  212. package/dist/diff_tool/app/dist/assets/{vue-vine-DnTGaA4r.js → vue-vine-C_H4XbNR.js} +1 -1
  213. package/dist/diff_tool/app/dist/assets/{xml-QlPQXP0d.js → xml-1JLzpunp.js} +1 -1
  214. package/dist/diff_tool/app/dist/assets/{xsl-JpRU16Li.js → xsl-GtZi0Erj.js} +1 -1
  215. package/dist/diff_tool/app/dist/assets/{yaml-Djukn3_s.js → yaml-LueTtDDo.js} +1 -1
  216. package/dist/diff_tool/app/dist/index.html +1 -1
  217. package/dist/execution/execution_environment.js.map +1 -1
  218. package/dist/execution/tool_backend_execution_environment.js +1 -7
  219. package/dist/execution/tool_backend_execution_environment.js.map +1 -1
  220. package/dist/host/client_tool_broker.js +28 -21
  221. package/dist/host/client_tool_broker.js.map +1 -1
  222. package/dist/host/hosted_ephemeral_agent_session.js +109 -167
  223. package/dist/host/hosted_ephemeral_agent_session.js.map +1 -1
  224. package/dist/host/local_session_host.js +340 -248
  225. package/dist/host/local_session_host.js.map +1 -1
  226. package/dist/host/session_host.js.map +1 -1
  227. package/dist/host/session_protocol_handler.js +125 -105
  228. package/dist/host/session_protocol_handler.js.map +1 -1
  229. package/dist/main.js +10 -2
  230. package/dist/main.js.map +1 -1
  231. package/dist/protocol/index.d.ts +1 -1
  232. package/dist/protocol/session_protocol.d.ts +70 -36
  233. package/dist/protocol/session_protocol.js +235 -80
  234. package/dist/protocol/session_protocol.js.map +1 -1
  235. package/dist/sdk/index.d.ts +1 -1
  236. package/dist/sdk/index.js.map +1 -1
  237. package/dist/sdk/session.js +8 -25
  238. package/dist/sdk/session.js.map +1 -1
  239. package/dist/sdk/types.d.ts +4 -9
  240. package/dist/starter/prompts/approval-review-branch.md +7 -0
  241. package/dist/starter/prompts/approval-review-current-changes.md +7 -0
  242. package/dist/starter/prompts/approval-review-last-commit.md +7 -0
  243. package/dist/starter/skills/approval-review/SKILL.md +219 -0
  244. package/dist/store/file_session_store.js +13 -9
  245. package/dist/store/file_session_store.js.map +1 -1
  246. package/dist/store/session_snapshot_migrations.js +152 -0
  247. package/dist/store/session_snapshot_migrations.js.map +1 -0
  248. package/dist/tui/chat_controller/command_hints.js +0 -6
  249. package/dist/tui/chat_controller/command_hints.js.map +1 -1
  250. package/dist/tui/chat_view.js +19 -12
  251. package/dist/tui/chat_view.js.map +1 -1
  252. package/dist/tui/session_chat_app.js +0 -8
  253. package/dist/tui/session_chat_app.js.map +1 -1
  254. package/dist/tui/session_chat_controller.js +122 -178
  255. package/dist/tui/session_chat_controller.js.map +1 -1
  256. package/dist/tui/tool_ui_router.js +12 -226
  257. package/dist/tui/tool_ui_router.js.map +1 -1
  258. package/dist/tui/ui/bash_execution.js +3 -3
  259. package/dist/tui/ui/bash_execution.js.map +1 -1
  260. package/dist/tui/ui/chat_message_model.js +2 -2
  261. package/dist/tui/ui/chat_message_model.js.map +1 -1
  262. package/dist/tui/ui/subagent_panel.js +59 -26
  263. package/dist/tui/ui/subagent_panel.js.map +1 -1
  264. package/dist/tui/ui/tool_ui_model.js +2 -0
  265. package/dist/tui/ui/tool_ui_model.js.map +1 -0
  266. package/dist/tui/ui/tool_ui_registry.js +310 -36
  267. package/dist/tui/ui/tool_ui_registry.js.map +1 -1
  268. package/package.json +4 -4
  269. package/dist/core/events/types.js +0 -2
  270. package/dist/core/events/types.js.map +0 -1
  271. package/dist/core/modes/mode_adapter.js +0 -2
  272. package/dist/core/modes/mode_adapter.js.map +0 -1
  273. package/dist/core/runtime/conversation_turn_runtime.js +0 -88
  274. package/dist/core/runtime/conversation_turn_runtime.js.map +0 -1
  275. package/dist/core/session/core_session.js +0 -86
  276. package/dist/core/session/core_session.js.map +0 -1
  277. package/dist/core/session/pruning.js +0 -587
  278. package/dist/core/session/pruning.js.map +0 -1
  279. package/dist/core/session/session_engine.js +0 -1246
  280. package/dist/core/session/session_engine.js.map +0 -1
  281. package/dist/core/subagents/control_plane.js +0 -339
  282. package/dist/core/subagents/control_plane.js.map +0 -1
  283. package/dist/core/subagents/subagent_engine.js +0 -258
  284. package/dist/core/subagents/subagent_engine.js.map +0 -1
  285. package/dist/core/tools/terminate_agent.js +0 -162
  286. package/dist/core/tools/terminate_agent.js.map +0 -1
  287. package/dist/diff_tool/app/dist/assets/actionscript-3--17pq3dv.js +0 -1
  288. package/dist/diff_tool/app/dist/assets/apex-VAyPSnFM.js +0 -1
  289. package/dist/diff_tool/app/dist/assets/asciidoc-DE70LPWp.js +0 -1
  290. package/dist/diff_tool/app/dist/assets/bird2-C6vDhewU.js +0 -1
  291. package/dist/diff_tool/app/dist/assets/bsl-BkkzgIyY.js +0 -1
  292. package/dist/diff_tool/app/dist/assets/c3-BFHwR3_K.js +0 -1
  293. package/dist/diff_tool/app/dist/assets/catppuccin-frappe-3VR1Za6u.js +0 -1
  294. package/dist/diff_tool/app/dist/assets/catppuccin-latte-DwIHMF0Q.js +0 -1
  295. package/dist/diff_tool/app/dist/assets/catppuccin-macchiato-DYnBP6_5.js +0 -1
  296. package/dist/diff_tool/app/dist/assets/catppuccin-mocha-DYhrFGRu.js +0 -1
  297. package/dist/diff_tool/app/dist/assets/clarity-SemFz856.js +0 -1
  298. package/dist/diff_tool/app/dist/assets/coq-BrsZFFmf.js +0 -1
  299. package/dist/diff_tool/app/dist/assets/cpp-BcU9r9kv.js +0 -1
  300. package/dist/diff_tool/app/dist/assets/emacs-lisp-B4R74twV.js +0 -1
  301. package/dist/diff_tool/app/dist/assets/gdscript-Cp2uCuqX.js +0 -1
  302. package/dist/diff_tool/app/dist/assets/hack-DAsjGmmw.js +0 -1
  303. package/dist/diff_tool/app/dist/assets/haxe-OTjmBuCE.js +0 -1
  304. package/dist/diff_tool/app/dist/assets/hxml-B0Qn7Nwc.js +0 -1
  305. package/dist/diff_tool/app/dist/assets/index-U7G4V3LV.js +0 -1579
  306. package/dist/diff_tool/app/dist/assets/kanagawa-dragon-CXtmUGW6.js +0 -1
  307. package/dist/diff_tool/app/dist/assets/kanagawa-lotus-BN08jTvb.js +0 -1
  308. package/dist/diff_tool/app/dist/assets/kanagawa-wave-CTweb8Dz.js +0 -1
  309. package/dist/diff_tool/app/dist/assets/latex-Bydg2zYo.js +0 -1
  310. package/dist/diff_tool/app/dist/assets/luau-FMPmPwt6.js +0 -1
  311. package/dist/diff_tool/app/dist/assets/mdc-B6ddHTKx.js +0 -1
  312. package/dist/diff_tool/app/dist/assets/mermaid-Bk4SNUv9.js +0 -1
  313. package/dist/diff_tool/app/dist/assets/mojo-BgCJLMeH.js +0 -1
  314. package/dist/diff_tool/app/dist/assets/monokai-CdkpiU2Y.js +0 -1
  315. package/dist/diff_tool/app/dist/assets/moonbit-CaWjb8XO.js +0 -1
  316. package/dist/diff_tool/app/dist/assets/move-B1IS1UjX.js +0 -1
  317. package/dist/diff_tool/app/dist/assets/nushell-DcLAeLz5.js +0 -1
  318. package/dist/diff_tool/app/dist/assets/pierre-dark-CpLgRqie.js +0 -1
  319. package/dist/diff_tool/app/dist/assets/pierre-dark-protanopia-deuteranopia-B35FxJx-.js +0 -1
  320. package/dist/diff_tool/app/dist/assets/pierre-dark-soft-kZQmAZld.js +0 -1
  321. package/dist/diff_tool/app/dist/assets/pierre-dark-tritanopia-CpjhbsIL.js +0 -1
  322. package/dist/diff_tool/app/dist/assets/pierre-dark-vibrant-CpQYzh95.js +0 -1
  323. package/dist/diff_tool/app/dist/assets/pierre-light-CoaEpmwp.js +0 -1
  324. package/dist/diff_tool/app/dist/assets/pierre-light-protanopia-deuteranopia-0fSaH845.js +0 -1
  325. package/dist/diff_tool/app/dist/assets/pierre-light-soft-lWLdNTOI.js +0 -1
  326. package/dist/diff_tool/app/dist/assets/pierre-light-tritanopia-CEbqgOJL.js +0 -1
  327. package/dist/diff_tool/app/dist/assets/pierre-light-vibrant-D80Fkn33.js +0 -1
  328. package/dist/diff_tool/app/dist/assets/prisma-BsRQq5mF.js +0 -1
  329. package/dist/diff_tool/app/dist/assets/r-DRexFFDh.js +0 -1
  330. package/dist/diff_tool/app/dist/assets/red-CJ3rzSJv.js +0 -1
  331. package/dist/diff_tool/app/dist/assets/rose-pine-BthvhNj6.js +0 -1
  332. package/dist/diff_tool/app/dist/assets/rose-pine-dawn-Dg85fqjY.js +0 -1
  333. package/dist/diff_tool/app/dist/assets/rose-pine-moon-hon4tzzS.js +0 -1
  334. package/dist/diff_tool/app/dist/assets/smalltalk-B16xEiuN.js +0 -1
  335. package/dist/diff_tool/app/dist/assets/solarized-dark-DV17i1UV.js +0 -1
  336. package/dist/diff_tool/app/dist/assets/solarized-light-DSh2HLQt.js +0 -1
  337. package/dist/diff_tool/app/dist/assets/solidity-CKzVLygQ.js +0 -1
  338. package/dist/diff_tool/app/dist/assets/surrealql-CUddZ4Qk.js +0 -1
  339. package/dist/diff_tool/app/dist/assets/swift-DonLKvLd.js +0 -1
  340. package/dist/diff_tool/app/dist/assets/system-verilog-DJ5XKQeo.js +0 -1
  341. package/dist/diff_tool/app/dist/assets/tex-BOTYELrL.js +0 -1
  342. package/dist/diff_tool/app/dist/assets/twig-BpzmhnWz.js +0 -1
  343. package/dist/diff_tool/app/dist/assets/verilog-CiiDBU1e.js +0 -1
@@ -6,7 +6,7 @@ import { captureDiffReviewSnapshot, DiffReviewBridge, } from "../core/diff_revie
6
6
  import { buildDiffReviewInstructions } from "../core/diff_review/review_instructions.js";
7
7
  import { createDefaultCoreDeps } from "../core/runtime/deps.js";
8
8
  import { runDirectBashCommand } from "../core/session/direct_bash.js";
9
- import { parseSessionPruneFraction, parseSessionPruneFractionAndGuidance, } from "../core/session/pruning.js";
9
+ import { SUBAGENT_ACTIVITY_FACET_KIND } from "../core/subagents/types.js";
10
10
  import { REASONING_LEVELS } from "../core/types.js";
11
11
  import { formatAdaptiveNumber, formatTokenWindow } from "../core/utils/format.js";
12
12
  import { extractAssistantText } from "../core/utils/messages.js";
@@ -103,9 +103,6 @@ export class SessionChatController {
103
103
  diff: (argsText) => this.startDiffReview(argsText),
104
104
  compactSummaryOnly: (extra) => this.compactSession("summary-only", extra),
105
105
  compactSummaryAndLast: (extra) => this.compactSession("summary-and-last", extra),
106
- pruneEarliest: (extra) => this.pruneSession("earliest", extra),
107
- pruneLargest: (extra) => this.pruneSession("largest", extra),
108
- pruneSmart: (extra) => this.pruneSession("smart", extra),
109
106
  reload: () => this.reloadContent(),
110
107
  listen: () => this.startListenCaptureFromCommand(),
111
108
  speak: () => this.speakLastAssistantMessage(),
@@ -170,7 +167,7 @@ export class SessionChatController {
170
167
  onCtrlP: () => void this.cyclePersonality(),
171
168
  onCtrlS: () => void this.stashEditorToClipboard(),
172
169
  onCtrlY: () => void this.toggleListenCapture(),
173
- onCtrlG: () => this.terminateSelectedSubagent(),
170
+ onCtrlG: () => this.interruptSelectedSubagent(),
174
171
  onEscape: () => void this.interrupt(),
175
172
  beforeSubmit: (text) => this.beforeSubmit(text),
176
173
  onChange: (text) => this.handleEditorChange(text),
@@ -409,12 +406,18 @@ export class SessionChatController {
409
406
  this.isStreaming = true;
410
407
  this.startTurnTimer();
411
408
  this.view.startWorkingIcon();
412
- this.view.handleToolUiEvent({
413
- type: "bash_started",
409
+ this.view.updateLocalToolUi({
414
410
  toolCallId,
415
- command,
411
+ toolName: "bash",
412
+ status: "running",
416
413
  headerTarget,
417
- }, "local");
414
+ activity: {
415
+ type: "bash_started",
416
+ toolCallId,
417
+ command,
418
+ headerTarget,
419
+ },
420
+ });
418
421
  this.refreshStatus();
419
422
  try {
420
423
  const backend = createSdkToolExecutionBackend({
@@ -436,27 +439,42 @@ export class SessionChatController {
436
439
  this.hiddenHistoryEntryIds.add(result.userHistoryEntryId);
437
440
  this.renderedMessageIds.push(result.userHistoryEntryId);
438
441
  }
439
- this.view.handleToolUiEvent({
440
- type: "bash_execution",
442
+ this.view.updateLocalToolUi({
441
443
  toolCallId,
442
- command: result.command,
444
+ toolName: "bash",
445
+ status: result.exitCode === 0 ? "succeeded" : "failed",
443
446
  headerTarget,
444
- exitCode: result.exitCode,
445
- truncationInfo: result.truncationInfo,
446
- uiText: result.uiText,
447
- durationMs: result.durationMs,
448
- labelOverride: options.labelOverride,
449
- }, "local");
447
+ activity: {
448
+ type: "bash_execution",
449
+ toolCallId,
450
+ command: result.command,
451
+ headerTarget,
452
+ exitCode: result.exitCode,
453
+ truncationInfo: result.truncationInfo,
454
+ uiText: result.uiText,
455
+ durationMs: result.durationMs,
456
+ labelOverride: options.labelOverride,
457
+ },
458
+ resultText: result.uiText.fullLines.map((line) => line.text).join("\n"),
459
+ });
450
460
  await this.syncFromSessionSnapshot();
451
461
  }
452
462
  catch (error) {
453
- this.view.handleToolUiEvent({
454
- type: "bash_blocked",
463
+ const reason = error.message || "bash failed";
464
+ this.view.updateLocalToolUi({
455
465
  toolCallId,
456
- command,
466
+ toolName: "bash",
467
+ status: "blocked",
457
468
  headerTarget,
458
- reason: error.message || "bash failed",
459
- }, "local");
469
+ activity: {
470
+ type: "bash_blocked",
471
+ toolCallId,
472
+ command,
473
+ headerTarget,
474
+ reason,
475
+ },
476
+ resultText: reason,
477
+ });
460
478
  await this.syncFromSessionSnapshot();
461
479
  }
462
480
  finally {
@@ -492,9 +510,7 @@ export class SessionChatController {
492
510
  });
493
511
  }
494
512
  submitSteeringText(text) {
495
- void this.session
496
- .steer(text, { historyEntryId: `session-steer-${randomUUID()}` })
497
- .catch((error) => {
513
+ void this.session.steer(text).catch((error) => {
498
514
  if (!this.isPendingMessageCancellation(error)) {
499
515
  this.view.addSystemMessage(`steering failed: ${error.message}`, "error");
500
516
  }
@@ -941,7 +957,7 @@ export class SessionChatController {
941
957
  if (this.tryApplyFastContentAppendDelta(delta)) {
942
958
  return true;
943
959
  }
944
- if (this.tryApplyFastToolFacetDelta(delta)) {
960
+ if (this.tryApplyFastToolUiDelta(delta)) {
945
961
  return true;
946
962
  }
947
963
  if (this.tryApplyFastAgentDelta(delta)) {
@@ -1015,30 +1031,19 @@ export class SessionChatController {
1015
1031
  this.refreshStatus();
1016
1032
  return true;
1017
1033
  }
1018
- tryApplyFastToolFacetDelta(delta) {
1019
- if (delta.delta.type !== "snapshot.patch") {
1020
- return false;
1021
- }
1022
- const facetChanges = delta.delta.changes.filter((change) => change.type === "facet.set");
1023
- if (facetChanges.length !== 1 ||
1034
+ tryApplyFastToolUiDelta(delta) {
1035
+ if (delta.delta.type !== "snapshot.patch" ||
1036
+ delta.delta.changes.length === 0 ||
1024
1037
  delta.delta.changes.some((change) => change.type !== "tool.set" && change.type !== "facet.set")) {
1025
1038
  return false;
1026
1039
  }
1027
- const facetChange = facetChanges[0];
1028
- const nextFacet = facetChange.facet;
1029
- if (nextFacet.kind !== "tau.tool-ui-events" || nextFacet.subject.type !== "tool") {
1030
- return false;
1031
- }
1032
- const previousEvents = toolUiEventsFromFacet(this.snapshot.facets[nextFacet.id]);
1033
- const nextEvents = toolUiEventsFromFacet(nextFacet);
1034
- if (!canAppendToolUiEvents(nextEvents, previousEvents)) {
1040
+ const facetChanges = delta.delta.changes.filter((change) => change.type === "facet.set");
1041
+ if (facetChanges.some(({ facet }) => facet.kind !== "tau.tool-ui-events" || facet.subject.type !== "tool")) {
1035
1042
  return false;
1036
1043
  }
1037
1044
  this.snapshot = applySessionProtocolDelta(this.snapshot, delta);
1038
1045
  this.observedSessionRevision = Math.max(this.observedSessionRevision, this.snapshot.revision);
1039
- for (const event of nextEvents.slice(previousEvents.length)) {
1040
- this.view.handleToolUiEvent(event, "session");
1041
- }
1046
+ this.view.reconcileToolUiSession(getToolUiModelsInModelOrder(this.snapshot));
1042
1047
  this.refreshStatus();
1043
1048
  return true;
1044
1049
  }
@@ -1127,7 +1132,7 @@ export class SessionChatController {
1127
1132
  };
1128
1133
  }
1129
1134
  if (message.message.role === "toolResult" &&
1130
- hasToolUiFacetForToolCall(this.snapshot, message.message.toolCallId)) {
1135
+ this.snapshot.tools[message.message.toolCallId]) {
1131
1136
  return undefined;
1132
1137
  }
1133
1138
  if (isCoreMessage(message.message)) {
@@ -1143,15 +1148,11 @@ export class SessionChatController {
1143
1148
  this.finishObservedSessionTurn();
1144
1149
  }
1145
1150
  syncSnapshotToolAndAgentUi(snapshot) {
1146
- this.view.reconcileToolUiSession(Object.keys(snapshot.tools));
1147
- for (const event of getToolUiEventsInModelOrder(snapshot)) {
1148
- this.view.handleToolUiEvent(event, "session");
1149
- }
1150
- for (const agent of Object.values(snapshot.agents)) {
1151
- for (const event of subagentUiEventsFromAgentRun(agent)) {
1152
- this.view.handleSubagentEvent(event);
1153
- }
1154
- }
1151
+ this.view.reconcileToolUiSession(getToolUiModelsInModelOrder(snapshot));
1152
+ this.view.reconcileSubagentUiSession(Object.values(snapshot.agents).map((agent) => ({
1153
+ state: structuredClone(agent),
1154
+ activity: getSubagentActivity(snapshot, agent.id),
1155
+ })));
1155
1156
  }
1156
1157
  collectAssistantMessages(snapshot) {
1157
1158
  const messages = [];
@@ -1425,37 +1426,6 @@ export class SessionChatController {
1425
1426
  this.refreshStatus();
1426
1427
  }
1427
1428
  }
1428
- async pruneSession(strategy, extraText) {
1429
- if (this.isSessionOperationActive()) {
1430
- this.view.addSystemMessage("cannot prune while a session turn is running", "warn");
1431
- return;
1432
- }
1433
- const extra = extraText?.trim() ?? "";
1434
- const parsed = strategy === "smart"
1435
- ? parseSessionPruneFractionAndGuidance(extra)
1436
- : { fraction: parseSessionPruneFraction(extra) };
1437
- if (parsed.fraction === null) {
1438
- this.view.addSystemMessage("invalid prune fraction. use a number between 0 and 1.", "error");
1439
- return;
1440
- }
1441
- if (strategy === "smart" && parsed.fraction !== 0) {
1442
- this.view.addSystemMessage("sampling prune candidates...", "success");
1443
- }
1444
- try {
1445
- const result = await this.session.pruneToolResults(strategy, {
1446
- fraction: parsed.fraction,
1447
- ...("guidance" in parsed && parsed.guidance !== undefined
1448
- ? { guidance: parsed.guidance }
1449
- : {}),
1450
- });
1451
- this.syncRenderedHistory(result.snapshot);
1452
- this.refreshStatus();
1453
- this.view.addSystemMessage(result.message, result.noop ? "warn" : "success");
1454
- }
1455
- catch (error) {
1456
- this.view.addSystemMessage(`prune failed: ${error.message}`, "error");
1457
- }
1458
- }
1459
1429
  async speakLastAssistantMessage() {
1460
1430
  if (this.speakTask) {
1461
1431
  this.view.addSystemMessage("speech playback already in progress", "warn");
@@ -1870,21 +1840,21 @@ export class SessionChatController {
1870
1840
  this.view.addSystemMessage("rewind failed.", "error");
1871
1841
  }
1872
1842
  }
1873
- terminateSelectedSubagent() {
1843
+ interruptSelectedSubagent() {
1874
1844
  const selectedId = this.view.getSelectedSubagentId();
1875
1845
  if (!selectedId) {
1876
1846
  this.view.addSystemMessage("no active subagent selected", "warn");
1877
1847
  return;
1878
1848
  }
1879
1849
  void this.session
1880
- .terminateSubagent(selectedId)
1850
+ .interruptSubagent(selectedId)
1881
1851
  .then((result) => {
1882
1852
  if (!result.found) {
1883
1853
  this.view.addSystemMessage(`unknown subagent id: ${selectedId}`, "warn");
1884
1854
  }
1885
1855
  })
1886
1856
  .catch((err) => {
1887
- this.view.addSystemMessage(`failed to terminate subagent: ${err.message}`, "error");
1857
+ this.view.addSystemMessage(`failed to interrupt subagent: ${err.message}`, "error");
1888
1858
  });
1889
1859
  }
1890
1860
  async stashEditorToClipboard() {
@@ -1922,11 +1892,6 @@ function getTimelineMessages(snapshot) {
1922
1892
  function isMessageInTimeline(snapshot, messageId) {
1923
1893
  return snapshot.timeline.some((item) => item.type === "message" && item.messageId === messageId);
1924
1894
  }
1925
- function hasToolUiFacetForToolCall(snapshot, toolCallId) {
1926
- return Object.values(snapshot.facets).some((facet) => facet.kind === "tau.tool-ui-events" &&
1927
- facet.subject.type === "tool" &&
1928
- facet.subject.id === toolCallId);
1929
- }
1930
1895
  function assistantPartialFromProtocolMessage(message) {
1931
1896
  if (message.message.role !== "assistant") {
1932
1897
  return { text: "", thinking: "" };
@@ -2017,30 +1982,54 @@ function isToolUiEvent(value) {
2017
1982
  "toolCallId" in value &&
2018
1983
  typeof value.toolCallId === "string");
2019
1984
  }
2020
- function getToolUiEventsInModelOrder(snapshot) {
1985
+ function getToolUiModelsInModelOrder(snapshot) {
2021
1986
  const facetsByToolId = new Map();
2022
1987
  for (const facet of Object.values(snapshot.facets)) {
2023
1988
  if (facet.kind === "tau.tool-ui-events" && facet.subject.type === "tool") {
2024
1989
  facetsByToolId.set(facet.subject.id, facet);
2025
1990
  }
2026
1991
  }
2027
- const events = [];
2028
- const emittedFacetIds = new Set();
2029
- for (const toolId of getToolIdsInModelOrder(snapshot)) {
2030
- const facet = facetsByToolId.get(toolId);
2031
- if (!facet) {
2032
- continue;
2033
- }
2034
- emittedFacetIds.add(facet.id);
2035
- events.push(...toolUiEventsFromFacet(facet));
2036
- }
2037
- for (const facet of Object.values(snapshot.facets)) {
2038
- if (emittedFacetIds.has(facet.id)) {
2039
- continue;
2040
- }
2041
- events.push(...toolUiEventsFromFacet(facet));
1992
+ const messagesById = new Map(snapshot.messages.map((message) => [message.id, message]));
1993
+ return getToolIdsInModelOrder(snapshot).map((toolId) => {
1994
+ const tool = snapshot.tools[toolId];
1995
+ const activities = toolUiEventsFromFacet(facetsByToolId.get(toolId));
1996
+ const activity = activities.at(-1);
1997
+ const resultMessage = tool.status === "streaming" ? undefined : messagesById.get(tool.resultMessageId ?? "");
1998
+ const resultMessageText = resultMessage?.message.role === "toolResult"
1999
+ ? resultMessage.message.content
2000
+ .flatMap((content) => (content.type === "text" ? [content.text] : []))
2001
+ .join("\n")
2002
+ : undefined;
2003
+ const resultText = resultMessageText || (tool.status === "streaming" ? undefined : (tool.error ?? tool.summary));
2004
+ const activityCode = activity && "code" in activity ? activity.code : undefined;
2005
+ const code = activityCode ?? getToolCallCode(tool, messagesById);
2006
+ return {
2007
+ toolCallId: tool.toolCallId,
2008
+ toolName: tool.toolName,
2009
+ status: tool.status,
2010
+ headerTarget: activity?.headerTarget ?? tool.toolName,
2011
+ ...(code !== undefined ? { code } : {}),
2012
+ ...(activity ? { activity } : {}),
2013
+ ...(resultText ? { resultText } : {}),
2014
+ };
2015
+ });
2016
+ }
2017
+ function getToolCallCode(tool, messagesById) {
2018
+ if (tool.status === "streaming")
2019
+ return undefined;
2020
+ const message = messagesById.get(tool.call.messageId);
2021
+ if (message?.message.role !== "assistant")
2022
+ return undefined;
2023
+ const content = message.message.content[tool.call.contentIndex];
2024
+ if (content?.type !== "toolCall" ||
2025
+ content.id !== tool.toolCallId ||
2026
+ typeof content.arguments !== "object" ||
2027
+ content.arguments === null ||
2028
+ !("code" in content.arguments) ||
2029
+ typeof content.arguments.code !== "string") {
2030
+ return undefined;
2042
2031
  }
2043
- return events;
2032
+ return content.arguments.code;
2044
2033
  }
2045
2034
  function getToolIdsInModelOrder(snapshot) {
2046
2035
  const messageOrder = new Map(snapshot.messages.map((message, index) => [message.id, index]));
@@ -2061,25 +2050,19 @@ function toolUiEventsFromFacet(facet) {
2061
2050
  }
2062
2051
  return facet.data.events.filter(isToolUiEvent);
2063
2052
  }
2064
- function canAppendToolUiEvents(events, previousEvents) {
2065
- if (previousEvents.length > events.length) {
2066
- return false;
2067
- }
2068
- if (previousEvents.length === 0) {
2069
- return true;
2070
- }
2071
- return previousEvents.every((event, index) => JSON.stringify(event) === JSON.stringify(events[index]));
2053
+ function getSubagentActivity(snapshot, agentId) {
2054
+ const facet = Object.values(snapshot.facets).find((candidate) => candidate.kind === SUBAGENT_ACTIVITY_FACET_KIND &&
2055
+ candidate.subject.type === "agent" &&
2056
+ candidate.subject.id === agentId);
2057
+ return typeof facet?.data.text === "string" ? facet.data.text : undefined;
2072
2058
  }
2073
- function subagentUiEventsFromAgentRun(agent) {
2074
- const state = subagentStateFromAgentRun(agent);
2075
- const events = [{ type: "subagent_spawned", state }];
2076
- if (agent.progress !== undefined) {
2077
- events.push(subagentProgressEventFromAgentRun(agent));
2078
- }
2079
- if (agent.abortRequested) {
2080
- events.push({ type: "subagent_abort_requested", id: agent.id });
2059
+ function subagentUiEventsFromAgentRun(agent, startedType = "subagent_spawned") {
2060
+ const state = structuredClone(agent);
2061
+ const events = [{ type: startedType, state }];
2062
+ if (agent.run.interruptRequested) {
2063
+ events.push({ type: "subagent_interrupt_requested", state });
2081
2064
  }
2082
- if (agent.status !== "running") {
2065
+ if (agent.run.status !== "running") {
2083
2066
  events.push({ type: "subagent_finished", state });
2084
2067
  }
2085
2068
  return events;
@@ -2088,64 +2071,25 @@ function subagentUiEventsForAgentDelta(previous, next) {
2088
2071
  if (!previous) {
2089
2072
  return subagentUiEventsFromAgentRun(next);
2090
2073
  }
2074
+ if (previous.run.revision !== next.run.revision) {
2075
+ return subagentUiEventsFromAgentRun(next, "subagent_run_started");
2076
+ }
2077
+ const state = structuredClone(next);
2091
2078
  const events = [];
2092
- if (!previous.abortRequested && next.abortRequested) {
2093
- events.push({ type: "subagent_abort_requested", id: next.id });
2079
+ if (!previous.run.interruptRequested && next.run.interruptRequested) {
2080
+ events.push({ type: "subagent_interrupt_requested", state });
2094
2081
  }
2095
- if (next.status !== "running") {
2096
- events.push({
2097
- type: "subagent_finished",
2098
- state: subagentStateFromAgentRun(next),
2099
- });
2082
+ if (previous.run.status === "running" && next.run.status !== "running") {
2083
+ events.push({ type: "subagent_finished", state });
2100
2084
  return events;
2101
2085
  }
2102
- if (agentProgressChanged(previous, next)) {
2103
- events.push(subagentProgressEventFromAgentRun(next));
2086
+ if (agentStateChanged(previous, next)) {
2087
+ events.push({ type: "subagent_updated", state });
2104
2088
  }
2105
2089
  return events;
2106
2090
  }
2107
- function subagentStateFromAgentRun(agent) {
2108
- const status = agent.status === "succeeded"
2109
- ? "success"
2110
- : agent.status === "failed"
2111
- ? "error"
2112
- : agent.status === "cancelled"
2113
- ? "aborted"
2114
- : "running";
2115
- const state = {
2116
- id: agent.id,
2117
- name: agent.name,
2118
- title: agent.title,
2119
- status,
2120
- ...(agent.modelLabel !== undefined ? { modelLabel: agent.modelLabel } : {}),
2121
- costTotal: agent.costTotal,
2122
- turns: agent.turns,
2123
- toolCalls: agent.toolCalls,
2124
- usage: { ...agent.usage },
2125
- startedAt: agent.startedAt,
2126
- ...(agent.finishedAt !== undefined ? { finishedAt: agent.finishedAt } : {}),
2127
- abortRequested: agent.abortRequested,
2128
- ...(agent.error !== undefined ? { error: agent.error } : {}),
2129
- ...(agent.finalText !== undefined ? { finalText: agent.finalText } : {}),
2130
- };
2131
- return state;
2132
- }
2133
- function subagentProgressEventFromAgentRun(agent) {
2134
- return {
2135
- type: "subagent_progress",
2136
- id: agent.id,
2137
- text: agent.progress ?? "",
2138
- costTotal: agent.costTotal,
2139
- turns: agent.turns,
2140
- toolCalls: agent.toolCalls,
2141
- usage: { ...agent.usage },
2142
- };
2143
- }
2144
- function agentProgressChanged(previous, next) {
2145
- return (previous.progress !== next.progress ||
2146
- previous.costTotal !== next.costTotal ||
2147
- previous.turns !== next.turns ||
2148
- previous.toolCalls !== next.toolCalls ||
2091
+ function agentStateChanged(previous, next) {
2092
+ return (previous.costTotal !== next.costTotal ||
2149
2093
  previous.usage.input !== next.usage.input ||
2150
2094
  previous.usage.output !== next.usage.output ||
2151
2095
  previous.usage.cacheRead !== next.usage.cacheRead ||