@markusylisiurunen/tau 0.3.31 → 0.3.33

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 (262) hide show
  1. package/README.md +9 -14
  2. package/dist/core/agent/agent_runtime.js +1505 -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/auth/auth_manager.js.map +1 -1
  7. package/dist/core/auth/auth_storage.js +1 -4
  8. package/dist/core/auth/auth_storage.js.map +1 -1
  9. package/dist/core/auth/credential_store.js.map +1 -1
  10. package/dist/core/commands/registry.js +0 -42
  11. package/dist/core/commands/registry.js.map +1 -1
  12. package/dist/core/config/content_loader.js +3 -1
  13. package/dist/core/config/content_loader.js.map +1 -1
  14. package/dist/core/diff_review/bridge.js.map +1 -1
  15. package/dist/core/diff_review/snapshot.js.map +1 -1
  16. package/dist/core/index.js +1 -1
  17. package/dist/core/index.js.map +1 -1
  18. package/dist/core/install/cli.js.map +1 -1
  19. package/dist/core/models/catalog.js +7 -1
  20. package/dist/core/models/catalog.js.map +1 -1
  21. package/dist/core/models/tau_extensions.js.map +1 -1
  22. package/dist/core/models/tau_model_overrides.js +10 -0
  23. package/dist/core/models/tau_model_overrides.js.map +1 -0
  24. package/dist/core/modes/index.js.map +1 -1
  25. package/dist/core/modes/websocket_server.js.map +1 -1
  26. package/dist/core/nook/cli.js.map +1 -1
  27. package/dist/core/nook/client.js +57 -10
  28. package/dist/core/nook/client.js.map +1 -1
  29. package/dist/core/nook/deploy.js +24 -7
  30. package/dist/core/nook/deploy.js.map +1 -1
  31. package/dist/core/nook/setup.js.map +1 -1
  32. package/dist/core/personas.js +2 -1
  33. package/dist/core/personas.js.map +1 -1
  34. package/dist/core/runtime/agent_model.js +50 -0
  35. package/dist/core/runtime/agent_model.js.map +1 -0
  36. package/dist/core/runtime/chat_runtime.js +173 -63
  37. package/dist/core/runtime/chat_runtime.js.map +1 -1
  38. package/dist/core/runtime/model_executor.js +2 -0
  39. package/dist/core/runtime/model_executor.js.map +1 -0
  40. package/dist/core/runtime/model_sampler.js +21 -0
  41. package/dist/core/runtime/model_sampler.js.map +1 -0
  42. package/dist/core/session/compaction.js +1 -1
  43. package/dist/core/session/compaction.js.map +1 -1
  44. package/dist/core/session/direct_bash.js.map +1 -1
  45. package/dist/core/session/message_accumulator.js +3 -5
  46. package/dist/core/session/message_accumulator.js.map +1 -1
  47. package/dist/core/session/runner.js +197 -98
  48. package/dist/core/session/runner.js.map +1 -1
  49. package/dist/core/static/code_mode/nook/documentation.md +214 -0
  50. package/dist/core/static/code_mode/nook/sandbox_runner.mjs +144 -0
  51. package/dist/core/static/index.js.map +1 -1
  52. package/dist/core/subagents/agent_supervisor.js +337 -0
  53. package/dist/core/subagents/agent_supervisor.js.map +1 -0
  54. package/dist/core/telegram/adapter.js +2 -5
  55. package/dist/core/telegram/adapter.js.map +1 -1
  56. package/dist/core/telegram/cli.js.map +1 -1
  57. package/dist/core/telegram/session_manager.js.map +1 -1
  58. package/dist/core/tool/cli.js.map +1 -1
  59. package/dist/core/tool/pdf_unpack.js.map +1 -1
  60. package/dist/core/tools/activity.js +2 -0
  61. package/dist/core/tools/activity.js.map +1 -0
  62. package/dist/core/tools/bash.js +64 -67
  63. package/dist/core/tools/bash.js.map +1 -1
  64. package/dist/core/tools/catalog.js +46 -24
  65. package/dist/core/tools/catalog.js.map +1 -1
  66. package/dist/core/tools/code_mode.js +65 -58
  67. package/dist/core/tools/code_mode.js.map +1 -1
  68. package/dist/core/tools/code_mode_worker.js +182 -0
  69. package/dist/core/tools/code_mode_worker.js.map +1 -0
  70. package/dist/core/tools/edit.js +11 -12
  71. package/dist/core/tools/edit.js.map +1 -1
  72. package/dist/core/tools/nook.js +234 -217
  73. package/dist/core/tools/nook.js.map +1 -1
  74. package/dist/core/tools/registry.js +27 -13
  75. package/dist/core/tools/registry.js.map +1 -1
  76. package/dist/core/tools/send_input_to_agent.js +75 -90
  77. package/dist/core/tools/send_input_to_agent.js.map +1 -1
  78. package/dist/core/tools/spawn_agent.js +95 -100
  79. package/dist/core/tools/spawn_agent.js.map +1 -1
  80. package/dist/core/tools/terminate_agent.js +75 -82
  81. package/dist/core/tools/terminate_agent.js.map +1 -1
  82. package/dist/core/tools/view_image.js +11 -16
  83. package/dist/core/tools/view_image.js.map +1 -1
  84. package/dist/core/tools/wait_for_agents.js +61 -68
  85. package/dist/core/tools/wait_for_agents.js.map +1 -1
  86. package/dist/core/tools/web.js +10 -147
  87. package/dist/core/tools/web.js.map +1 -1
  88. package/dist/core/tools/write.js +10 -11
  89. package/dist/core/tools/write.js.map +1 -1
  90. package/dist/core/usage/cli.js.map +1 -1
  91. package/dist/core/usage/logs.js.map +1 -1
  92. package/dist/core/utils/model_stream.js.map +1 -1
  93. package/dist/core/utils/project_files.js.map +1 -1
  94. package/dist/core/utils/spawn_capture.js.map +1 -1
  95. package/dist/core/utils/subagent_utils.js.map +1 -1
  96. package/dist/core/utils/tool_preview.js.map +1 -1
  97. package/dist/core/version.js +1 -1
  98. package/dist/diff_tool/app/dist/assets/{angular-html-D8c6NJtn.js → angular-html-DbgxQryr.js} +1 -1
  99. package/dist/diff_tool/app/dist/assets/{angular-ts-CKOHcqki.js → angular-ts-Dzjq8SvI.js} +1 -1
  100. package/dist/diff_tool/app/dist/assets/{apl-CQNGWx_V.js → apl-6AmEMJr-.js} +1 -1
  101. package/dist/diff_tool/app/dist/assets/{astro-DtaLiRs1.js → astro-BM8EbfIg.js} +1 -1
  102. package/dist/diff_tool/app/dist/assets/{blade-8lF6vUn0.js → blade-DiKMnN3e.js} +1 -1
  103. package/dist/diff_tool/app/dist/assets/{c-C4UbPC2L.js → c-DMT5X-u9.js} +1 -1
  104. package/dist/diff_tool/app/dist/assets/{cobol-B-SqiS-l.js → cobol-CACNMc1O.js} +1 -1
  105. package/dist/diff_tool/app/dist/assets/{coffee-Dd1E2KHP.js → coffee-D_WUFE0g.js} +1 -1
  106. package/dist/diff_tool/app/dist/assets/{cpp-fmh9U4o8.js → cpp-BcU9r9kv.js} +1 -1
  107. package/dist/diff_tool/app/dist/assets/{crystal-ZMQ-EyMz.js → crystal-wh93mtUe.js} +1 -1
  108. package/dist/diff_tool/app/dist/assets/{css-3Sj4Fmhw.js → css-CCfuUqEr.js} +1 -1
  109. package/dist/diff_tool/app/dist/assets/{edge-CwGnyfEm.js → edge-DP-spcJf.js} +1 -1
  110. package/dist/diff_tool/app/dist/assets/{elixir-B4YFjqQ-.js → elixir-BXBkaEtJ.js} +1 -1
  111. package/dist/diff_tool/app/dist/assets/{elm-DmUdvg9q.js → elm-BXr8OwKP.js} +1 -1
  112. package/dist/diff_tool/app/dist/assets/{erb-CMpzjtLy.js → erb-Cu5Zacs_.js} +1 -1
  113. package/dist/diff_tool/app/dist/assets/{git-rebase-EqdynY_f.js → git-rebase-DO8LWld4.js} +1 -1
  114. package/dist/diff_tool/app/dist/assets/{glimmer-js-C04Hkqrn.js → glimmer-js-Bh-OAIDW.js} +1 -1
  115. package/dist/diff_tool/app/dist/assets/{glimmer-ts-BYuV-E66.js → glimmer-ts-DI9lHU4q.js} +1 -1
  116. package/dist/diff_tool/app/dist/assets/{glsl-Dw8Wzaba.js → glsl--zoY4RCO.js} +1 -1
  117. package/dist/diff_tool/app/dist/assets/{graphql-CKOWRasR.js → graphql-C8h2T_SC.js} +1 -1
  118. package/dist/diff_tool/app/dist/assets/{hack-DSoYuKAw.js → hack-DAsjGmmw.js} +1 -1
  119. package/dist/diff_tool/app/dist/assets/{haml-CW2clvKn.js → haml-C2BBBsDW.js} +1 -1
  120. package/dist/diff_tool/app/dist/assets/{handlebars-Dt42oUMG.js → handlebars-cZMztphK.js} +1 -1
  121. package/dist/diff_tool/app/dist/assets/{html-BssM8xm3.js → html-BtccomkJ.js} +1 -1
  122. package/dist/diff_tool/app/dist/assets/{html-derivative-7ty0Z2kF.js → html-derivative-qjeUe52-.js} +1 -1
  123. package/dist/diff_tool/app/dist/assets/{http-CzGxCb-E.js → http-Dv8OQO33.js} +1 -1
  124. package/dist/diff_tool/app/dist/assets/{hurl-DMjbA1F9.js → hurl-B6Fnr2ae.js} +1 -1
  125. package/dist/diff_tool/app/dist/assets/index-U7G4V3LV.js +1579 -0
  126. package/dist/diff_tool/app/dist/assets/{java-BVtLVPoR.js → java-BuadWMcp.js} +1 -1
  127. package/dist/diff_tool/app/dist/assets/{javascript-CmzoS6sL.js → javascript-BIKxmHeL.js} +1 -1
  128. package/dist/diff_tool/app/dist/assets/{jinja-MpkGgATF.js → jinja-Cm_guvgu.js} +1 -1
  129. package/dist/diff_tool/app/dist/assets/{jison-BJkiJV2g.js → jison-Sst29gJb.js} +1 -1
  130. package/dist/diff_tool/app/dist/assets/{json-ByAo1NYt.js → json-Bg6l2vym.js} +1 -1
  131. package/dist/diff_tool/app/dist/assets/{jsx-DNzVmx9w.js → jsx-BiREAxkr.js} +1 -1
  132. package/dist/diff_tool/app/dist/assets/{julia-rksgfDyz.js → julia-DAhrWFzr.js} +1 -1
  133. package/dist/diff_tool/app/dist/assets/{just-Bf6HaeeV.js → just-xBwbf5aT.js} +1 -1
  134. package/dist/diff_tool/app/dist/assets/{latex-Cql66cfm.js → latex-Bydg2zYo.js} +1 -1
  135. package/dist/diff_tool/app/dist/assets/{liquid-wULyfiX7.js → liquid-BTsCzVvF.js} +1 -1
  136. package/dist/diff_tool/app/dist/assets/{lua-B1VfQC3R.js → lua-BJt9x0JP.js} +1 -1
  137. package/dist/diff_tool/app/dist/assets/{marko-D8Hd5-bx.js → marko-CWdJkbvC.js} +1 -1
  138. package/dist/diff_tool/app/dist/assets/{mdc-DmQ944Ag.js → mdc-B6ddHTKx.js} +1 -1
  139. package/dist/diff_tool/app/dist/assets/{nginx-BDob-g0F.js → nginx-BwS0G4IK.js} +1 -1
  140. package/dist/diff_tool/app/dist/assets/{nim-Det1uggZ.js → nim-B2VFbcs9.js} +1 -1
  141. package/dist/diff_tool/app/dist/assets/{perl-Dcgc5L27.js → perl-BTeqR-l8.js} +1 -1
  142. package/dist/diff_tool/app/dist/assets/{php-BjwNWaG2.js → php-Crua7nbA.js} +1 -1
  143. package/dist/diff_tool/app/dist/assets/{pug-BNSHQAJG.js → pug-CUlgPjMU.js} +1 -1
  144. package/dist/diff_tool/app/dist/assets/{qml-5kU4d63S.js → qml-DI0IjNUw.js} +1 -1
  145. package/dist/diff_tool/app/dist/assets/{r-T1WpUQOu.js → r-DRexFFDh.js} +1 -1
  146. package/dist/diff_tool/app/dist/assets/{razor-Dp-yzXAB.js → razor-DrkKtFm5.js} +1 -1
  147. package/dist/diff_tool/app/dist/assets/{regexp-CIsu-B9m.js → regexp-DRmxJil7.js} +1 -1
  148. package/dist/diff_tool/app/dist/assets/{rst-ro17CyW2.js → rst-DiRke36z.js} +1 -1
  149. package/dist/diff_tool/app/dist/assets/{ruby-DU34BtJN.js → ruby-t7r9jzAg.js} +1 -1
  150. package/dist/diff_tool/app/dist/assets/{sas-DvM2ogJU.js → sas-CR7Z4kg-.js} +1 -1
  151. package/dist/diff_tool/app/dist/assets/{scss-lF64kkIV.js → scss--CnPWaDv.js} +1 -1
  152. package/dist/diff_tool/app/dist/assets/{shellscript-WmDXBLCa.js → shellscript-Bz7H5174.js} +1 -1
  153. package/dist/diff_tool/app/dist/assets/{shellsession--GggGr4o.js → shellsession-mlKnHJfN.js} +1 -1
  154. package/dist/diff_tool/app/dist/assets/{soy-CxEGzs-_.js → soy-CKu9y9G1.js} +1 -1
  155. package/dist/diff_tool/app/dist/assets/{sql-D8qrGuIn.js → sql-DcvKi3Jj.js} +1 -1
  156. package/dist/diff_tool/app/dist/assets/{stata-5W1sjsQI.js → stata-Yo25QZyV.js} +1 -1
  157. package/dist/diff_tool/app/dist/assets/{surrealql-DprXW366.js → surrealql-CUddZ4Qk.js} +1 -1
  158. package/dist/diff_tool/app/dist/assets/{svelte-CzjcC8Mf.js → svelte-BIhEVbnP.js} +1 -1
  159. package/dist/diff_tool/app/dist/assets/{templ-BOYl0ITc.js → templ-D6FrV4mZ.js} +1 -1
  160. package/dist/diff_tool/app/dist/assets/{tex-fc_nK7Hm.js → tex-BOTYELrL.js} +1 -1
  161. package/dist/diff_tool/app/dist/assets/{ts-tags-q7RBsUYS.js → ts-tags-Kqn1PP6m.js} +1 -1
  162. package/dist/diff_tool/app/dist/assets/{tsx-4vmj3sX4.js → tsx-L3TEJWGL.js} +1 -1
  163. package/dist/diff_tool/app/dist/assets/{twig-67g55beP.js → twig-BpzmhnWz.js} +1 -1
  164. package/dist/diff_tool/app/dist/assets/{typescript-Bx4zhx0M.js → typescript-Dvc5RX4H.js} +1 -1
  165. package/dist/diff_tool/app/dist/assets/{vue-G4plfR7G.js → vue-X1uI3I2A.js} +1 -1
  166. package/dist/diff_tool/app/dist/assets/{vue-html-BiigD-BR.js → vue-html-BMpHEoeQ.js} +1 -1
  167. package/dist/diff_tool/app/dist/assets/{vue-vine-Cbdk3EZl.js → vue-vine-DnTGaA4r.js} +1 -1
  168. package/dist/diff_tool/app/dist/assets/{xml-B3vUkid0.js → xml-QlPQXP0d.js} +1 -1
  169. package/dist/diff_tool/app/dist/assets/{xsl-ClW1O00E.js → xsl-JpRU16Li.js} +1 -1
  170. package/dist/diff_tool/app/dist/assets/{yaml-DBUv6oV4.js → yaml-Djukn3_s.js} +1 -1
  171. package/dist/diff_tool/app/dist/index.html +1 -1
  172. package/dist/diff_tool/http_server.js.map +1 -1
  173. package/dist/diff_tool/index.js.map +1 -1
  174. package/dist/diff_tool/protocol_client.js.map +1 -1
  175. package/dist/diff_tool/review_state.js.map +1 -1
  176. package/dist/execution/cloudflare_sandbox_execution_environment.js.map +1 -1
  177. package/dist/execution/execution_environment.js.map +1 -1
  178. package/dist/execution/fly_sprite_execution_environment.js.map +1 -1
  179. package/dist/execution/tool_backend_execution_environment.js +1 -7
  180. package/dist/execution/tool_backend_execution_environment.js.map +1 -1
  181. package/dist/host/client_tool_broker.js +26 -20
  182. package/dist/host/client_tool_broker.js.map +1 -1
  183. package/dist/host/hosted_ephemeral_agent_session.js +104 -167
  184. package/dist/host/hosted_ephemeral_agent_session.js.map +1 -1
  185. package/dist/host/local_session_host.js +313 -197
  186. package/dist/host/local_session_host.js.map +1 -1
  187. package/dist/host/session_host.js.map +1 -1
  188. package/dist/host/session_protocol_handler.js +121 -101
  189. package/dist/host/session_protocol_handler.js.map +1 -1
  190. package/dist/main.js +10 -2
  191. package/dist/main.js.map +1 -1
  192. package/dist/nook/README.md +1 -1
  193. package/dist/protocol/index.d.ts +1 -1
  194. package/dist/protocol/index.js.map +1 -1
  195. package/dist/protocol/session_protocol.d.ts +19 -21
  196. package/dist/protocol/session_protocol.js +150 -56
  197. package/dist/protocol/session_protocol.js.map +1 -1
  198. package/dist/sdk/client.js.map +1 -1
  199. package/dist/sdk/index.d.ts +1 -1
  200. package/dist/sdk/index.js.map +1 -1
  201. package/dist/sdk/session.js +4 -21
  202. package/dist/sdk/session.js.map +1 -1
  203. package/dist/sdk/types.d.ts +2 -7
  204. package/dist/store/file_session_store.js +13 -9
  205. package/dist/store/file_session_store.js.map +1 -1
  206. package/dist/store/memory_session_store.js.map +1 -1
  207. package/dist/store/session_snapshot_migrations.js +133 -0
  208. package/dist/store/session_snapshot_migrations.js.map +1 -0
  209. package/dist/store/session_store.js.map +1 -1
  210. package/dist/transport/session_protocol_transport_helpers.js.map +1 -1
  211. package/dist/tui/chat_controller/command_hints.js +0 -6
  212. package/dist/tui/chat_controller/command_hints.js.map +1 -1
  213. package/dist/tui/chat_controller/diff_review_service.js.map +1 -1
  214. package/dist/tui/chat_view.js +19 -12
  215. package/dist/tui/chat_view.js.map +1 -1
  216. package/dist/tui/session_chat_app.js +0 -8
  217. package/dist/tui/session_chat_app.js.map +1 -1
  218. package/dist/tui/session_chat_controller.js +94 -115
  219. package/dist/tui/session_chat_controller.js.map +1 -1
  220. package/dist/tui/terminal.js.map +1 -1
  221. package/dist/tui/tool_ui_router.js +12 -226
  222. package/dist/tui/tool_ui_router.js.map +1 -1
  223. package/dist/tui/ui/bash_execution.js +3 -3
  224. package/dist/tui/ui/bash_execution.js.map +1 -1
  225. package/dist/tui/ui/chat_message_model.js +2 -2
  226. package/dist/tui/ui/chat_message_model.js.map +1 -1
  227. package/dist/tui/ui/components/dynamic_border.js.map +1 -1
  228. package/dist/tui/ui/components/editor.js.map +1 -1
  229. package/dist/tui/ui/components/header_box.js.map +1 -1
  230. package/dist/tui/ui/components/header_line.js.map +1 -1
  231. package/dist/tui/ui/components/one_line_segments.js.map +1 -1
  232. package/dist/tui/ui/components/padded_container.js.map +1 -1
  233. package/dist/tui/ui/footer.js.map +1 -1
  234. package/dist/tui/ui/pending_messages.js.map +1 -1
  235. package/dist/tui/ui/session_divider.js.map +1 -1
  236. package/dist/tui/ui/slash_autocomplete.js.map +1 -1
  237. package/dist/tui/ui/subagent_editor_pane.js.map +1 -1
  238. package/dist/tui/ui/subagent_panel.js +39 -2
  239. package/dist/tui/ui/subagent_panel.js.map +1 -1
  240. package/dist/tui/ui/theme/theme.js.map +1 -1
  241. package/dist/tui/ui/tool_ui_model.js +2 -0
  242. package/dist/tui/ui/tool_ui_model.js.map +1 -0
  243. package/dist/tui/ui/tool_ui_registry.js +256 -31
  244. package/dist/tui/ui/tool_ui_registry.js.map +1 -1
  245. package/package.json +10 -10
  246. package/dist/core/events/types.js +0 -2
  247. package/dist/core/events/types.js.map +0 -1
  248. package/dist/core/modes/mode_adapter.js +0 -2
  249. package/dist/core/modes/mode_adapter.js.map +0 -1
  250. package/dist/core/runtime/conversation_turn_runtime.js +0 -88
  251. package/dist/core/runtime/conversation_turn_runtime.js.map +0 -1
  252. package/dist/core/session/core_session.js +0 -86
  253. package/dist/core/session/core_session.js.map +0 -1
  254. package/dist/core/session/pruning.js +0 -587
  255. package/dist/core/session/pruning.js.map +0 -1
  256. package/dist/core/session/session_engine.js +0 -1246
  257. package/dist/core/session/session_engine.js.map +0 -1
  258. package/dist/core/subagents/control_plane.js +0 -339
  259. package/dist/core/subagents/control_plane.js.map +0 -1
  260. package/dist/core/subagents/subagent_engine.js +0 -258
  261. package/dist/core/subagents/subagent_engine.js.map +0 -1
  262. package/dist/diff_tool/app/dist/assets/index-BiNqgTgO.js +0 -1579
@@ -0,0 +1,337 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { AgentRuntime, createAgentSpec } from "../agent/agent_runtime.js";
3
+ import { resolveAgentModel } from "../runtime/agent_model.js";
4
+ import { createDefaultCoreDeps } from "../runtime/deps.js";
5
+ import { ToolCatalog } from "../tools/catalog.js";
6
+ import { appendUsageLogEntry, getUsageCostTotal, getUsageTotals, } from "../usage/logs.js";
7
+ import { extractAssistantText } from "../utils/messages.js";
8
+ import { extractAssistantTextForProgress, formatToolUiEventForProgress, getToolResultFirstLine, } from "../utils/subagent_utils.js";
9
+ const MAX_ACTIVE_SUBAGENTS = 8;
10
+ async function raceWithAbort(promise, signal) {
11
+ if (!signal)
12
+ return await promise;
13
+ signal.throwIfAborted();
14
+ return await new Promise((resolve, reject) => {
15
+ const onAbort = () => reject(new Error("aborted"));
16
+ signal.addEventListener("abort", onAbort, { once: true });
17
+ promise.then((value) => {
18
+ signal.removeEventListener("abort", onAbort);
19
+ resolve(value);
20
+ }, (error) => {
21
+ signal.removeEventListener("abort", onAbort);
22
+ reject(error);
23
+ });
24
+ });
25
+ }
26
+ export class AgentSupervisor {
27
+ options;
28
+ records = new Map();
29
+ deps;
30
+ constructor(options) {
31
+ this.options = options;
32
+ this.deps = options.deps ?? createDefaultCoreDeps();
33
+ }
34
+ reset() {
35
+ this.retainOrigins(new Set());
36
+ }
37
+ retainOrigins(originHistoryEntryIds) {
38
+ for (const [id, record] of this.records) {
39
+ if (originHistoryEntryIds.has(record.originHistoryEntryId))
40
+ continue;
41
+ this.records.delete(id);
42
+ record.runtime.dispose();
43
+ }
44
+ }
45
+ getActiveCount() {
46
+ return [...this.records.values()].filter((record) => record.status === "running").length;
47
+ }
48
+ getActiveCompactionContext() {
49
+ const active = [...this.records.values()].filter((record) => record.status === "running");
50
+ if (active.length === 0)
51
+ return undefined;
52
+ const entries = active
53
+ .map((record) => {
54
+ const abort = record.abortRequested ? ", abort requested" : "";
55
+ return `- ${record.id}: ${record.title} (name: ${record.name}, status: ${record.status}${abort})`;
56
+ })
57
+ .join("\n");
58
+ return `<active-subagents>\n${entries}\n</active-subagents>`;
59
+ }
60
+ spawn(options) {
61
+ if (this.getActiveCount() >= MAX_ACTIVE_SUBAGENTS) {
62
+ return {
63
+ ok: false,
64
+ reason: `Subagent limit reached (max ${MAX_ACTIVE_SUBAGENTS} active). Wait for existing agents to finish.`,
65
+ };
66
+ }
67
+ const workingDirectory = options.runtimeConfig.workingDirectory.trim();
68
+ if (!workingDirectory) {
69
+ return { ok: false, reason: "Subagent workingDirectory must not be blank." };
70
+ }
71
+ const id = randomUUID();
72
+ const runtimeConfig = { ...options.runtimeConfig, workingDirectory };
73
+ const persona = {
74
+ id: `${options.personaId ?? "subagent"}-${runtimeConfig.name}`,
75
+ label: runtimeConfig.name,
76
+ description: runtimeConfig.description ?? "Background agent",
77
+ source: "project",
78
+ systemPrompt: runtimeConfig.systemPrompt,
79
+ model: runtimeConfig.model,
80
+ settings: runtimeConfig.settings ?? {},
81
+ tools: runtimeConfig.tools,
82
+ skills: [],
83
+ };
84
+ const runtime = new AgentRuntime({
85
+ spec: createAgentSpec({
86
+ ...resolveAgentModel(persona, options.config, {
87
+ includeModelNotice: true,
88
+ deps: this.deps,
89
+ }),
90
+ systemPrompt: runtimeConfig.systemPrompt,
91
+ tools: ToolCatalog.createSubagentRegistry(runtimeConfig.tools, options.backend, workingDirectory, options.config),
92
+ }),
93
+ eventSink: async (event) => await this.recordAgentEvent(id, event),
94
+ clock: this.deps.clock,
95
+ });
96
+ const record = {
97
+ id,
98
+ name: runtimeConfig.name,
99
+ title: options.title,
100
+ modelLabel: options.modelLabel,
101
+ originHistoryEntryId: options.originHistoryEntryId,
102
+ runtimeConfig,
103
+ config: options.config,
104
+ backend: options.backend,
105
+ personaId: options.personaId,
106
+ runtime,
107
+ status: "running",
108
+ costTotal: 0,
109
+ turns: 0,
110
+ toolCalls: 0,
111
+ usage: {
112
+ input: 0,
113
+ output: 0,
114
+ cacheRead: 0,
115
+ cacheWrite: 0,
116
+ contextWindowUsageTokens: 0,
117
+ contextWindow: runtimeConfig.model.contextWindow,
118
+ },
119
+ startedAt: Date.now(),
120
+ abortRequested: false,
121
+ completion: Promise.resolve(undefined),
122
+ };
123
+ this.records.set(id, record);
124
+ this.startRun(record, options.prompt);
125
+ return { ok: true, id };
126
+ }
127
+ sendInput(options) {
128
+ const record = this.records.get(options.id);
129
+ if (!record)
130
+ return { ok: false, reason: `Unknown subagent ID: ${options.id}` };
131
+ if (record.status === "running") {
132
+ return {
133
+ ok: false,
134
+ reason: `Subagent ${options.id} is already running. Wait for it to finish before sending input.`,
135
+ };
136
+ }
137
+ if (this.getActiveCount() >= MAX_ACTIVE_SUBAGENTS) {
138
+ return {
139
+ ok: false,
140
+ reason: `Subagent limit reached (max ${MAX_ACTIVE_SUBAGENTS} active). Wait for existing agents to finish.`,
141
+ };
142
+ }
143
+ this.startRun(record, options.prompt);
144
+ return { ok: true, id: record.id, name: record.name, title: record.title };
145
+ }
146
+ async waitForAgents(ids, signal) {
147
+ const missing = ids.filter((id) => !this.records.has(id));
148
+ if (missing.length > 0)
149
+ throw new Error(`Unknown subagent ID(s): ${missing.join(", ")}`);
150
+ await raceWithAbort(Promise.race(ids.map((id) => this.waitForRecord(id))), signal);
151
+ return this.getCompletedRecords(ids).map((record) => this.toResult(record));
152
+ }
153
+ async terminate(id, signal) {
154
+ const record = this.records.get(id);
155
+ if (!record)
156
+ return undefined;
157
+ if (record.status === "running") {
158
+ record.abortRequested = true;
159
+ record.runtime.interrupt();
160
+ await this.emit({ type: "subagent_abort_requested", id });
161
+ }
162
+ return this.toResult(await raceWithAbort(this.waitForRecord(id), signal));
163
+ }
164
+ getSnapshot(id) {
165
+ const record = this.records.get(id);
166
+ return record ? this.toSnapshot(record) : undefined;
167
+ }
168
+ listSnapshots() {
169
+ return [...this.records.values()].map((record) => this.toSnapshot(record));
170
+ }
171
+ startRun(record, prompt) {
172
+ record.status = "running";
173
+ record.startedAt = Date.now();
174
+ record.finishedAt = undefined;
175
+ record.abortRequested = false;
176
+ record.error = undefined;
177
+ record.finalText = undefined;
178
+ record.completion = this.emit({ type: "subagent_spawned", state: this.toSnapshot(record) })
179
+ .then(async () => {
180
+ if (record.abortRequested) {
181
+ throw new Error("subagent was interrupted");
182
+ }
183
+ return await record.runtime.submit(prompt);
184
+ })
185
+ .then((result) => {
186
+ if (record.abortRequested || result.aborted) {
187
+ throw new Error("subagent was interrupted");
188
+ }
189
+ if (result.blocked)
190
+ throw new Error(result.blocked.message);
191
+ if (result.limitReached)
192
+ throw new Error(result.limitReached.message);
193
+ const assistant = [...record.runtime.rawHistory]
194
+ .reverse()
195
+ .find((message) => message.role === "assistant");
196
+ const finalText = assistant ? extractAssistantText(assistant).trim() : "";
197
+ if (!finalText)
198
+ throw new Error("Sub-agent produced an empty response.");
199
+ record.status = "success";
200
+ record.finalText = finalText;
201
+ return record;
202
+ })
203
+ .catch((error) => {
204
+ const aborted = record.abortRequested;
205
+ record.status = aborted ? "aborted" : "error";
206
+ record.error = aborted ? undefined : error instanceof Error ? error.message : String(error);
207
+ return record;
208
+ })
209
+ .then(async (resolved) => {
210
+ resolved.finishedAt = Date.now();
211
+ if (this.records.get(resolved.id) === resolved) {
212
+ await this.emit({ type: "subagent_finished", state: this.toSnapshot(resolved) });
213
+ }
214
+ return resolved;
215
+ });
216
+ }
217
+ async recordAgentEvent(id, event) {
218
+ const record = this.records.get(id);
219
+ if (!record)
220
+ return;
221
+ let text = "";
222
+ switch (event.type) {
223
+ case "assistant_final": {
224
+ const usage = getUsageTotals(event.message.usage);
225
+ const cost = getUsageCostTotal(event.message.usage);
226
+ record.turns += 1;
227
+ record.costTotal += cost;
228
+ record.usage = {
229
+ input: record.usage.input + usage.input,
230
+ output: record.usage.output + usage.output,
231
+ cacheRead: record.usage.cacheRead + usage.cacheRead,
232
+ cacheWrite: record.usage.cacheWrite + usage.cacheWrite,
233
+ contextWindowUsageTokens: usage.input + usage.output + usage.cacheRead + usage.cacheWrite,
234
+ contextWindow: record.runtimeConfig.model.contextWindow,
235
+ };
236
+ (this.options.recordUsage ?? appendUsageLogEntry)({
237
+ timestamp: event.message.timestamp,
238
+ sessionId: record.id,
239
+ personaId: record.personaId ?? event.personaId,
240
+ provider: event.message.provider,
241
+ model: event.message.model,
242
+ api: event.message.api,
243
+ reasoningEffort: event.reasoningEffort,
244
+ usage,
245
+ cost: { total: cost },
246
+ agent: { type: "subagent", name: record.name },
247
+ });
248
+ text = extractAssistantTextForProgress(event.message) ?? "";
249
+ break;
250
+ }
251
+ case "tool_call_admitted":
252
+ record.toolCalls += 1;
253
+ return;
254
+ case "tool_activity":
255
+ text = formatToolUiEventForProgress(event.activity) ?? "";
256
+ break;
257
+ case "tool_result":
258
+ if (event.message.isError) {
259
+ const firstLine = getToolResultFirstLine(event.message);
260
+ text = firstLine
261
+ ? `${event.message.toolName}: ${firstLine}`
262
+ : `${event.message.toolName}: tool returned an error`;
263
+ }
264
+ break;
265
+ case "turn_started":
266
+ text = "assistant: thinking";
267
+ break;
268
+ case "turn_finished":
269
+ if (event.outcome === "completed")
270
+ text = "done";
271
+ break;
272
+ case "notice":
273
+ text = event.text;
274
+ break;
275
+ default:
276
+ return;
277
+ }
278
+ await this.emit({
279
+ type: "subagent_progress",
280
+ id,
281
+ text,
282
+ costTotal: record.costTotal,
283
+ turns: record.turns,
284
+ toolCalls: record.toolCalls,
285
+ usage: { ...record.usage },
286
+ });
287
+ }
288
+ getCompletedRecords(ids) {
289
+ return ids
290
+ .map((id) => this.records.get(id))
291
+ .filter((record) => record !== undefined && record.status !== "running");
292
+ }
293
+ async waitForRecord(id) {
294
+ const record = this.records.get(id);
295
+ if (!record)
296
+ throw new Error(`Unknown subagent ID: ${id}`);
297
+ return await record.completion;
298
+ }
299
+ toSnapshot(record) {
300
+ return {
301
+ id: record.id,
302
+ name: record.name,
303
+ title: record.title,
304
+ modelLabel: record.modelLabel,
305
+ status: record.status,
306
+ costTotal: record.costTotal,
307
+ turns: record.turns,
308
+ toolCalls: record.toolCalls,
309
+ usage: { ...record.usage },
310
+ startedAt: record.startedAt,
311
+ finishedAt: record.finishedAt,
312
+ abortRequested: record.abortRequested,
313
+ error: record.error,
314
+ finalText: record.finalText,
315
+ };
316
+ }
317
+ toResult(record) {
318
+ const { usage: _usage, runtime: _runtime, completion: _completion, ...result } = record;
319
+ return {
320
+ id: result.id,
321
+ name: result.name,
322
+ title: result.title,
323
+ status: result.status,
324
+ costTotal: result.costTotal,
325
+ turns: result.turns,
326
+ toolCalls: result.toolCalls,
327
+ finalText: result.finalText,
328
+ error: result.error,
329
+ startedAt: result.startedAt,
330
+ finishedAt: result.finishedAt,
331
+ };
332
+ }
333
+ async emit(event) {
334
+ await this.options.onEvent(event);
335
+ }
336
+ }
337
+ //# sourceMappingURL=agent_supervisor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent_supervisor.js","sourceRoot":"","sources":["../../../src/core/subagents/agent_supervisor.ts"],"names":[],"mappings":"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"}
@@ -121,15 +121,12 @@ function stripCommandMention(command) {
121
121
  function normalizeTelegramUsername(username) {
122
122
  return username.trim().replace(/^@+/, "").toLowerCase();
123
123
  }
124
- function escapeRegExp(value) {
125
- return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
126
- }
127
124
  function hasTelegramMention(text, username) {
128
125
  const normalizedUsername = normalizeTelegramUsername(username);
129
126
  if (!normalizedUsername) {
130
127
  return false;
131
128
  }
132
- const mentionPattern = new RegExp(`(^|[^A-Za-z0-9_])@${escapeRegExp(normalizedUsername)}(?=$|[^A-Za-z0-9_])`, "i");
129
+ const mentionPattern = new RegExp(`(^|[^A-Za-z0-9_])@${RegExp.escape(normalizedUsername)}(?=$|[^A-Za-z0-9_])`, "i");
133
130
  return mentionPattern.test(text);
134
131
  }
135
132
  function stripTelegramMention(text, username) {
@@ -137,7 +134,7 @@ function stripTelegramMention(text, username) {
137
134
  if (!normalizedUsername) {
138
135
  return text.trim();
139
136
  }
140
- const mentionPattern = new RegExp(`(^|[^A-Za-z0-9_])@${escapeRegExp(normalizedUsername)}(?=$|[^A-Za-z0-9_])`, "gi");
137
+ const mentionPattern = new RegExp(`(^|[^A-Za-z0-9_])@${RegExp.escape(normalizedUsername)}(?=$|[^A-Za-z0-9_])`, "gi");
141
138
  return text
142
139
  .replace(mentionPattern, (_match, prefix) => prefix)
143
140
  .replace(/\s+/g, " ")