@markusylisiurunen/tau 0.3.76 → 0.3.78

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 (285) hide show
  1. package/dist/core/agent/agent_runtime.js +6 -11
  2. package/dist/core/agent/agent_runtime.js.map +1 -1
  3. package/dist/core/cli.js +2 -5
  4. package/dist/core/cli.js.map +1 -1
  5. package/dist/core/commands/registry.js +2 -1
  6. package/dist/core/commands/registry.js.map +1 -1
  7. package/dist/core/config/builtin_themes.js +0 -30
  8. package/dist/core/config/builtin_themes.js.map +1 -1
  9. package/dist/core/config/content_loader.js +19 -308
  10. package/dist/core/config/content_loader.js.map +1 -1
  11. package/dist/core/config/index.js +1 -1
  12. package/dist/core/config/index.js.map +1 -1
  13. package/dist/core/config/paths.js +0 -1
  14. package/dist/core/config/paths.js.map +1 -1
  15. package/dist/core/config/runtime.js +2 -3
  16. package/dist/core/config/runtime.js.map +1 -1
  17. package/dist/core/config/runtime_config_snapshot.js +0 -1
  18. package/dist/core/config/runtime_config_snapshot.js.map +1 -1
  19. package/dist/core/config/schema.js +17 -234
  20. package/dist/core/config/schema.js.map +1 -1
  21. package/dist/core/config/skills_loader.js +0 -8
  22. package/dist/core/config/skills_loader.js.map +1 -1
  23. package/dist/core/config/theme_variants.js.map +1 -1
  24. package/dist/core/config/virtual_bundle.js +3 -9
  25. package/dist/core/config/virtual_bundle.js.map +1 -1
  26. package/dist/core/config/virtual_defaults.js +0 -2
  27. package/dist/core/config/virtual_defaults.js.map +1 -1
  28. package/dist/core/debug.js +8 -25
  29. package/dist/core/debug.js.map +1 -1
  30. package/dist/core/diff_review/bridge.js +2 -24
  31. package/dist/core/diff_review/bridge.js.map +1 -1
  32. package/dist/core/index.js +0 -1
  33. package/dist/core/index.js.map +1 -1
  34. package/dist/core/models/catalog.js +2 -3
  35. package/dist/core/models/catalog.js.map +1 -1
  36. package/dist/core/personas.js +7 -89
  37. package/dist/core/personas.js.map +1 -1
  38. package/dist/core/runtime/agent_model.js +0 -2
  39. package/dist/core/runtime/agent_model.js.map +1 -1
  40. package/dist/core/runtime/chat_runtime.js +4 -6
  41. package/dist/core/runtime/chat_runtime.js.map +1 -1
  42. package/dist/core/runtime/session_prompt_composer.js +12 -27
  43. package/dist/core/runtime/session_prompt_composer.js.map +1 -1
  44. package/dist/core/static/index.js +4 -7
  45. package/dist/core/static/index.js.map +1 -1
  46. package/dist/core/static/tau_docs/client-tools.md +1 -1
  47. package/dist/core/static/tau_docs/config-reference.md +30 -153
  48. package/dist/core/static/tau_docs/configuration.md +9 -21
  49. package/dist/core/static/tau_docs/credentials.md +9 -28
  50. package/dist/core/static/tau_docs/image-generation.md +1 -1
  51. package/dist/core/static/tau_docs/node-sdk.md +1 -1
  52. package/dist/core/static/tau_docs/ownership-and-scope.md +5 -5
  53. package/dist/core/static/tau_docs/pdf-unpacking.md +1 -1
  54. package/dist/core/static/tau_docs/personas.md +9 -20
  55. package/dist/core/static/tau_docs/prompts-and-project-context.md +1 -11
  56. package/dist/core/static/tau_docs/remote-sessions.md +6 -22
  57. package/dist/core/static/tau_docs/security.md +2 -2
  58. package/dist/core/static/tau_docs/session-protocol-methods.md +1 -7
  59. package/dist/core/static/tau_docs/session-protocol.md +2 -0
  60. package/dist/core/static/tau_docs/sessions.md +2 -14
  61. package/dist/core/static/tau_docs/skills.md +1 -23
  62. package/dist/core/static/tau_docs/speech-generation.md +1 -1
  63. package/dist/core/static/tau_docs/subagents.md +26 -99
  64. package/dist/core/static/tau_docs/telegram.md +14 -22
  65. package/dist/core/static/tau_docs/tools.md +6 -6
  66. package/dist/core/static/tau_docs/troubleshooting.md +19 -20
  67. package/dist/core/static/tau_docs/tui.md +18 -44
  68. package/dist/core/subagents/agent_supervisor.js +5 -6
  69. package/dist/core/subagents/agent_supervisor.js.map +1 -1
  70. package/dist/core/subagents/format.js +1 -1
  71. package/dist/core/subagents/format.js.map +1 -1
  72. package/dist/core/subagents/prompt.js +7 -0
  73. package/dist/core/subagents/prompt.js.map +1 -0
  74. package/dist/core/subagents/registry.js +14 -43
  75. package/dist/core/subagents/registry.js.map +1 -1
  76. package/dist/core/subagents/types.js +2 -2
  77. package/dist/core/subagents/types.js.map +1 -1
  78. package/dist/core/telegram/adapter.js +23 -30
  79. package/dist/core/telegram/adapter.js.map +1 -1
  80. package/dist/core/telegram/cli.js +4 -5
  81. package/dist/core/telegram/cli.js.map +1 -1
  82. package/dist/core/telegram/config.js +32 -57
  83. package/dist/core/telegram/config.js.map +1 -1
  84. package/dist/core/telegram/local_session_client.js +0 -3
  85. package/dist/core/telegram/local_session_client.js.map +1 -1
  86. package/dist/core/telegram/runtime.js +3 -5
  87. package/dist/core/telegram/runtime.js.map +1 -1
  88. package/dist/core/telegram/session_manager.js +29 -52
  89. package/dist/core/telegram/session_manager.js.map +1 -1
  90. package/dist/core/telegram/tts.js +11 -9
  91. package/dist/core/telegram/tts.js.map +1 -1
  92. package/dist/core/telegram/workspace.js +13 -18
  93. package/dist/core/telegram/workspace.js.map +1 -1
  94. package/dist/core/tool/image_generate.js +37 -14
  95. package/dist/core/tool/image_generate.js.map +1 -1
  96. package/dist/core/tool/media.js +84 -4
  97. package/dist/core/tool/media.js.map +1 -1
  98. package/dist/core/tool/pdf_unpack.js +17 -10
  99. package/dist/core/tool/pdf_unpack.js.map +1 -1
  100. package/dist/core/tool/speech_generate.js +30 -13
  101. package/dist/core/tool/speech_generate.js.map +1 -1
  102. package/dist/core/tools/catalog.js +10 -5
  103. package/dist/core/tools/catalog.js.map +1 -1
  104. package/dist/core/tools/send_input_to_agent.js +1 -1
  105. package/dist/core/tools/send_input_to_agent.js.map +1 -1
  106. package/dist/core/tools/spawn_agent.js +13 -30
  107. package/dist/core/tools/spawn_agent.js.map +1 -1
  108. package/dist/core/tools/view_image.js +12 -17
  109. package/dist/core/tools/view_image.js.map +1 -1
  110. package/dist/core/types.js.map +1 -1
  111. package/dist/core/usage/logs.js.map +1 -1
  112. package/dist/core/utils/gemini_transcription.js +5 -95
  113. package/dist/core/utils/gemini_transcription.js.map +1 -1
  114. package/dist/core/utils/{gemini_speech.js → speech.js} +167 -428
  115. package/dist/core/utils/speech.js.map +1 -0
  116. package/dist/core/utils/speech_to_text.js +24 -52
  117. package/dist/core/utils/speech_to_text.js.map +1 -1
  118. package/dist/core/utils/speech_to_text_keywords.js +65 -0
  119. package/dist/core/utils/speech_to_text_keywords.js.map +1 -1
  120. package/dist/core/version.js +1 -1
  121. package/dist/diff_tool/app/dist/assets/{angular-html-BjHlbeCk.js → angular-html-CnO8qept.js} +1 -1
  122. package/dist/diff_tool/app/dist/assets/{angular-ts-5J5hsUV-.js → angular-ts-DPXUio9Z.js} +1 -1
  123. package/dist/diff_tool/app/dist/assets/{apl-ChIs51_N.js → apl-X8YsymsQ.js} +1 -1
  124. package/dist/diff_tool/app/dist/assets/{astro-RtGdbaIT.js → astro-BQ9k8AQ0.js} +1 -1
  125. package/dist/diff_tool/app/dist/assets/{blade-Cuc0ZzS1.js → blade-DZ1LYIzB.js} +1 -1
  126. package/dist/diff_tool/app/dist/assets/{c-IpjS3QEt.js → c-VLTwNh7z.js} +1 -1
  127. package/dist/diff_tool/app/dist/assets/{chapel-BvHOmF40.js → chapel-5s-sGN8D.js} +1 -1
  128. package/dist/diff_tool/app/dist/assets/{cobol-BWLkapNx.js → cobol-C9RzwrVu.js} +1 -1
  129. package/dist/diff_tool/app/dist/assets/{coffee-lfdf_MuK.js → coffee-BHvjZ343.js} +1 -1
  130. package/dist/diff_tool/app/dist/assets/{cpp-GvMfdutG.js → cpp-CBTVXbBp.js} +1 -1
  131. package/dist/diff_tool/app/dist/assets/{crystal--kdmUeXB.js → crystal-DQJua4y4.js} +1 -1
  132. package/dist/diff_tool/app/dist/assets/{css-CnlOazId.js → css-BQflXFb6.js} +1 -1
  133. package/dist/diff_tool/app/dist/assets/{edge-CwnxQiFe.js → edge-BmdmXGH4.js} +1 -1
  134. package/dist/diff_tool/app/dist/assets/{elixir-BVO19qQd.js → elixir-oiOLs98L.js} +1 -1
  135. package/dist/diff_tool/app/dist/assets/{elm-BK3istEo.js → elm-BgYuiU4E.js} +1 -1
  136. package/dist/diff_tool/app/dist/assets/{erb-CO4uKwKD.js → erb-CvFrXpyY.js} +1 -1
  137. package/dist/diff_tool/app/dist/assets/{git-rebase-CDrrgbGV.js → git-rebase-D3Zo1BLH.js} +1 -1
  138. package/dist/diff_tool/app/dist/assets/{glimmer-js-7CFSyo6c.js → glimmer-js-B4-8E3lJ.js} +1 -1
  139. package/dist/diff_tool/app/dist/assets/{glimmer-ts-Ofllf2Yo.js → glimmer-ts-CtKkD0t_.js} +1 -1
  140. package/dist/diff_tool/app/dist/assets/{glsl-K_36bq1K.js → glsl-BAqforx_.js} +1 -1
  141. package/dist/diff_tool/app/dist/assets/{graphql-BMZnssUN.js → graphql-DuE1RMyL.js} +1 -1
  142. package/dist/diff_tool/app/dist/assets/{hack-MG_t8QNs.js → hack-CHBcXjz1.js} +1 -1
  143. package/dist/diff_tool/app/dist/assets/{haml-0hDK-uCt.js → haml-DAs2z3tD.js} +1 -1
  144. package/dist/diff_tool/app/dist/assets/{handlebars-D4_MRJPB.js → handlebars-CfAla6QK.js} +1 -1
  145. package/dist/diff_tool/app/dist/assets/{html-BCi--7qp.js → html-D5co0BLD.js} +1 -1
  146. package/dist/diff_tool/app/dist/assets/{html-derivative-DYq2AWiD.js → html-derivative-BZaWEmAT.js} +1 -1
  147. package/dist/diff_tool/app/dist/assets/{http-BmLFm2Pm.js → http-Cii5MjJE.js} +1 -1
  148. package/dist/diff_tool/app/dist/assets/{hurl-CT71cK69.js → hurl-Bur-XdJO.js} +1 -1
  149. package/dist/diff_tool/app/dist/assets/index-CZUi_I-p.js +340 -0
  150. package/dist/diff_tool/app/dist/assets/{java-Bm2FCq-d.js → java-DN39wI4w.js} +1 -1
  151. package/dist/diff_tool/app/dist/assets/{javascript-C7oEny21.js → javascript-VUReF1H4.js} +1 -1
  152. package/dist/diff_tool/app/dist/assets/{jinja-igQBS-SS.js → jinja-BcrfV1JB.js} +1 -1
  153. package/dist/diff_tool/app/dist/assets/{jison-BrOUp4rK.js → jison-Bez5Mtmy.js} +1 -1
  154. package/dist/diff_tool/app/dist/assets/{json-DsuR7Nai.js → json-ChV8m0Le.js} +1 -1
  155. package/dist/diff_tool/app/dist/assets/{jsx-BdomFXcA.js → jsx-D0SXNtM0.js} +1 -1
  156. package/dist/diff_tool/app/dist/assets/{julia-DqOG4pbM.js → julia-DvhpcBwG.js} +1 -1
  157. package/dist/diff_tool/app/dist/assets/{just-ZrSTuT0n.js → just-BGwe8S6x.js} +1 -1
  158. package/dist/diff_tool/app/dist/assets/{latex-DbmtZIwN.js → latex-pWSag83P.js} +1 -1
  159. package/dist/diff_tool/app/dist/assets/{liquid-DKnUlRIp.js → liquid-UdnqDjKz.js} +1 -1
  160. package/dist/diff_tool/app/dist/assets/{lua-Cyq3f59a.js → lua-CjDHeHEr.js} +1 -1
  161. package/dist/diff_tool/app/dist/assets/{marko-hmOsFPHQ.js → marko-yLX6iW68.js} +1 -1
  162. package/dist/diff_tool/app/dist/assets/{mdc-BnnQmDC-.js → mdc-BOLj6Oyq.js} +1 -1
  163. package/dist/diff_tool/app/dist/assets/{nginx-C0zLUSna.js → nginx-5r5xPc2T.js} +1 -1
  164. package/dist/diff_tool/app/dist/assets/{nim-Oljl3c5n.js → nim-9exKQYMz.js} +1 -1
  165. package/dist/diff_tool/app/dist/assets/{org-Cp4CA-0c.js → org-B2fpAlbt.js} +1 -1
  166. package/dist/diff_tool/app/dist/assets/{perl-DstDVYmJ.js → perl-DV2fcwyY.js} +1 -1
  167. package/dist/diff_tool/app/dist/assets/{php-Cc3bNZ7J.js → php-D-AthX_E.js} +1 -1
  168. package/dist/diff_tool/app/dist/assets/{pug-B3xDUzl0.js → pug-DuKcQxFj.js} +1 -1
  169. package/dist/diff_tool/app/dist/assets/{qml-B9iDahKk.js → qml-C16b4SYx.js} +1 -1
  170. package/dist/diff_tool/app/dist/assets/{r-B7M5ZSBC.js → r-B1ZldnJf.js} +1 -1
  171. package/dist/diff_tool/app/dist/assets/{razor-BlfV6bjQ.js → razor-TYmslaAB.js} +1 -1
  172. package/dist/diff_tool/app/dist/assets/{regexp-BVT0NBj6.js → regexp-dWCffmDD.js} +1 -1
  173. package/dist/diff_tool/app/dist/assets/{rst-Cq-Mcher.js → rst-DEkLr2YR.js} +1 -1
  174. package/dist/diff_tool/app/dist/assets/{ruby-5uCK_s01.js → ruby-BJnJzr4u.js} +1 -1
  175. package/dist/diff_tool/app/dist/assets/{sas-m4dYluKN.js → sas-DeRsDbUE.js} +1 -1
  176. package/dist/diff_tool/app/dist/assets/{scss-DFiJcBQH.js → scss-SGV_CwKm.js} +1 -1
  177. package/dist/diff_tool/app/dist/assets/{shellscript-DCtSkJJQ.js → shellscript-BI7khmmR.js} +1 -1
  178. package/dist/diff_tool/app/dist/assets/{shellsession-_DntbpLM.js → shellsession-Nupw_Vvw.js} +1 -1
  179. package/dist/diff_tool/app/dist/assets/{soy-Dd1fWsG8.js → soy-B96cBzxv.js} +1 -1
  180. package/dist/diff_tool/app/dist/assets/{sql-Bygp5F-5.js → sql-CsIdKfaO.js} +1 -1
  181. package/dist/diff_tool/app/dist/assets/{stata-CqIA1VQD.js → stata-Dnq48cE6.js} +1 -1
  182. package/dist/diff_tool/app/dist/assets/{surrealql-C2-2C-z3.js → surrealql-D6lw4TiD.js} +1 -1
  183. package/dist/diff_tool/app/dist/assets/{svelte-CrTy7VSb.js → svelte-ChVoq9tB.js} +1 -1
  184. package/dist/diff_tool/app/dist/assets/{templ-B_h9AHFJ.js → templ-Dh1EXuHD.js} +1 -1
  185. package/dist/diff_tool/app/dist/assets/{tex-AwlGuBDG.js → tex-KTYusNFe.js} +1 -1
  186. package/dist/diff_tool/app/dist/assets/{ts-tags--oqU6stH.js → ts-tags-DC2RU1_R.js} +1 -1
  187. package/dist/diff_tool/app/dist/assets/{tsx-Cx-oUPFA.js → tsx-DtIM39Jy.js} +1 -1
  188. package/dist/diff_tool/app/dist/assets/{twig-DMQw3R9O.js → twig-C6D_TA3n.js} +1 -1
  189. package/dist/diff_tool/app/dist/assets/{typescript-BCtu9W7E.js → typescript-BGAE5iuw.js} +1 -1
  190. package/dist/diff_tool/app/dist/assets/{typst-jGrqJHSo.js → typst-nWoGZ22y.js} +1 -1
  191. package/dist/diff_tool/app/dist/assets/{vue-html-DTMalvg7.js → vue-html-prNdIjLu.js} +1 -1
  192. package/dist/diff_tool/app/dist/assets/{vue-GFZcsvXd.js → vue-iyHf-l4z.js} +1 -1
  193. package/dist/diff_tool/app/dist/assets/{vue-vine-BwDeqLrM.js → vue-vine-KSSlnVeg.js} +1 -1
  194. package/dist/diff_tool/app/dist/assets/{xml-CoXyuOzf.js → xml-DdCC83Xd.js} +1 -1
  195. package/dist/diff_tool/app/dist/assets/{xsl-BQFm34CN.js → xsl-DSqZxsez.js} +1 -1
  196. package/dist/diff_tool/app/dist/assets/{yaml-CbO2A_pF.js → yaml-CZcBUWvf.js} +1 -1
  197. package/dist/diff_tool/app/dist/index.html +1 -1
  198. package/dist/diff_tool/http_server.js +2 -9
  199. package/dist/diff_tool/http_server.js.map +1 -1
  200. package/dist/diff_tool/index.js +2 -2
  201. package/dist/diff_tool/index.js.map +1 -1
  202. package/dist/diff_tool/launcher.js +14 -8
  203. package/dist/diff_tool/launcher.js.map +1 -1
  204. package/dist/diff_tool/protocol_client.js +0 -7
  205. package/dist/diff_tool/protocol_client.js.map +1 -1
  206. package/dist/diff_tool/review_state.js +4 -10
  207. package/dist/diff_tool/review_state.js.map +1 -1
  208. package/dist/diff_tool/review_state_persistence.js +12 -7
  209. package/dist/diff_tool/review_state_persistence.js.map +1 -1
  210. package/dist/diff_tool/shared_types.js +0 -48
  211. package/dist/diff_tool/shared_types.js.map +1 -1
  212. package/dist/execution/fly_sprite_execution_environment.js +4 -2
  213. package/dist/execution/fly_sprite_execution_environment.js.map +1 -1
  214. package/dist/host/execution_runtime.js +1 -1
  215. package/dist/host/execution_runtime.js.map +1 -1
  216. package/dist/host/hosted_ephemeral_agent_session.js +1 -1
  217. package/dist/host/hosted_ephemeral_agent_session.js.map +1 -1
  218. package/dist/host/local_session_host.js +8 -18
  219. package/dist/host/local_session_host.js.map +1 -1
  220. package/dist/main.js +7 -93
  221. package/dist/main.js.map +1 -1
  222. package/dist/protocol/index.d.ts +1 -1
  223. package/dist/protocol/index.js.map +1 -1
  224. package/dist/protocol/session_protocol.d.ts +4 -23
  225. package/dist/protocol/session_protocol.js +3 -30
  226. package/dist/protocol/session_protocol.js.map +1 -1
  227. package/dist/sdk/local_client.js +0 -6
  228. package/dist/sdk/local_client.js.map +1 -1
  229. package/dist/store/session_snapshot_migrations.js +32 -1
  230. package/dist/store/session_snapshot_migrations.js.map +1 -1
  231. package/dist/tui/chat_controller/diff_review_service.js +0 -15
  232. package/dist/tui/chat_controller/diff_review_service.js.map +1 -1
  233. package/dist/tui/chat_view.js +6 -4
  234. package/dist/tui/chat_view.js.map +1 -1
  235. package/dist/tui/listen_capture.js +7 -26
  236. package/dist/tui/listen_capture.js.map +1 -1
  237. package/dist/tui/session_chat_app.js +4 -21
  238. package/dist/tui/session_chat_app.js.map +1 -1
  239. package/dist/tui/session_chat_controller.js +81 -59
  240. package/dist/tui/session_chat_controller.js.map +1 -1
  241. package/dist/tui/speech_playback.js +10 -8
  242. package/dist/tui/speech_playback.js.map +1 -1
  243. package/dist/tui/ui/custom_editor.js +21 -15
  244. package/dist/tui/ui/custom_editor.js.map +1 -1
  245. package/dist/tui/ui/pending_messages.js +2 -1
  246. package/dist/tui/ui/pending_messages.js.map +1 -1
  247. package/dist/tui/ui/slash_autocomplete.js +1 -8
  248. package/dist/tui/ui/slash_autocomplete.js.map +1 -1
  249. package/dist/tui/ui/subagent_panel.js +1 -12
  250. package/dist/tui/ui/subagent_panel.js.map +1 -1
  251. package/package.json +3 -3
  252. package/dist/core/config/diff_tool.js +0 -51
  253. package/dist/core/config/diff_tool.js.map +0 -1
  254. package/dist/core/install/cli.js +0 -260
  255. package/dist/core/install/cli.js.map +0 -1
  256. package/dist/core/models/tau_model_overrides.js +0 -4
  257. package/dist/core/models/tau_model_overrides.js.map +0 -1
  258. package/dist/core/subagents/default.js +0 -8
  259. package/dist/core/subagents/default.js.map +0 -1
  260. package/dist/core/utils/gemini_speech.js.map +0 -1
  261. package/dist/core/utils/openai_transcription.js +0 -594
  262. package/dist/core/utils/openai_transcription.js.map +0 -1
  263. package/dist/diff_tool/app/dist/assets/index-DyaXBald.js +0 -340
  264. package/dist/execution/cloudflare_sandbox_execution_environment.js +0 -563
  265. package/dist/execution/cloudflare_sandbox_execution_environment.js.map +0 -1
  266. package/dist/execution/sandbox_tool_helpers.js +0 -30
  267. package/dist/execution/sandbox_tool_helpers.js.map +0 -1
  268. package/dist/starter/prompts/approval-review-branch.md +0 -7
  269. package/dist/starter/prompts/approval-review-current-changes.md +0 -7
  270. package/dist/starter/prompts/approval-review-last-commit.md +0 -7
  271. package/dist/starter/prompts/commit-all.md +0 -9
  272. package/dist/starter/prompts/commit-staged.md +0 -9
  273. package/dist/starter/prompts/guided-review-branch.md +0 -7
  274. package/dist/starter/prompts/guided-review-current-changes.md +0 -7
  275. package/dist/starter/prompts/guided-review-last-commit.md +0 -7
  276. package/dist/starter/prompts/plan.md +0 -7
  277. package/dist/starter/prompts/review-branch.md +0 -7
  278. package/dist/starter/prompts/review-current-changes.md +0 -7
  279. package/dist/starter/prompts/review-last-commit.md +0 -7
  280. package/dist/starter/prompts/rewrite-prompt.md +0 -89
  281. package/dist/starter/skills/approval-review/SKILL.md +0 -219
  282. package/dist/starter/skills/code-review/SKILL.md +0 -102
  283. package/dist/starter/skills/guided-review/SKILL.md +0 -152
  284. package/dist/starter/skills/plan/SKILL.md +0 -53
  285. /package/dist/core/static/prompts/{default-subagent-wrapper.md → subagent-wrapper.md} +0 -0
@@ -1,6 +1,6 @@
1
1
  import { dirname } from "node:path/posix";
2
2
  import { createCommandRegistry, } from "../core/commands/index.js";
3
- import { getGoogleApiKey } from "../core/config/index.js";
3
+ import { getElevenLabsApiKey, getOpenAIApiKey } from "../core/config/index.js";
4
4
  import { captureDiffReviewSnapshot, DiffReviewBridge, } from "../core/diff_review/index.js";
5
5
  import { buildDiffReviewInstructions } from "../core/diff_review/review_instructions.js";
6
6
  import { createDefaultCoreDeps } from "../core/runtime/deps.js";
@@ -12,8 +12,9 @@ import { formatAdaptiveNumber, formatCwd, formatTokenWindow } from "../core/util
12
12
  import { extractAssistantText } from "../core/utils/messages.js";
13
13
  import { getSpeechToTextRecordingMaxDurationMs, getSpeechToTextStreamingSampleRate, SPEECH_TO_TEXT_CLIENT_MAX_DURATION_MS, } from "../core/utils/speech_to_text.js";
14
14
  import { collectSpeechToTextContext } from "../core/utils/speech_to_text_context.js";
15
- import { hasAutoCompactionContinuationMetadata } from "../core/utils/user_metadata.js";
15
+ import { formatTauUserText, hasAutoCompactionContinuationMetadata, splitTauUserText, } from "../core/utils/user_metadata.js";
16
16
  import { APP_VERSION } from "../core/version.js";
17
+ import { launchBuiltInDiffTool } from "../diff_tool/launcher.js";
17
18
  import { applySessionProtocolDelta, applySessionProtocolSubagentActivitiesMessage, } from "../protocol/session_protocol.js";
18
19
  import { TauSessionProtocolResponseError } from "../transport/errors.js";
19
20
  import { copyAssistantCodeToClipboard, copyAssistantTextToClipboard, } from "./chat_controller/assistant_clipboard.js";
@@ -25,9 +26,10 @@ import { InterruptLifecycle } from "./chat_controller/interrupt_lifecycle.js";
25
26
  import { formatDurationMs, formatFooterTokenCount, formatSessionCost, } from "./chat_controller/status_format.js";
26
27
  import { copyTextToClipboard } from "./clipboard.js";
27
28
  import { DOUBLE_PRESS_WINDOW_MS } from "./constants.js";
28
- import { cleanupListenTempFile, createListenTempFilePath, createListenTranscription, deleteListenTempFile, getSpeechToTextApiKey, getSpeechToTextApiKeyErrorMessage, getSpeechToTextProvider, LISTEN_CAPTURE_START_TIMEOUT_MS, LISTEN_RECORDING_MIN_BYTES, readListenAudio, startListenAudioCapture, } from "./listen_capture.js";
29
+ import { cleanupListenTempFile, createListenTempFilePath, createListenTranscription, deleteListenTempFile, getSpeechToTextApiKey, getSpeechToTextApiKeyErrorMessage, LISTEN_CAPTURE_START_TIMEOUT_MS, LISTEN_RECORDING_MIN_BYTES, readListenAudio, startListenAudioCapture, } from "./listen_capture.js";
29
30
  import { createSdkDiffSnapshotDeps, createSdkToolExecutionBackend, } from "./session_tool_execution_backend.js";
30
31
  import { runSpeechPlaybackTask } from "./speech_playback.js";
32
+ const TRANSCRIPTION_GUIDANCE = "Some or all of this message may have been transcribed from speech and may contain misheard words or other transcription errors.";
31
33
  const LISTEN_CAPTURE_START_CANCELLED = Symbol("listen capture start cancelled");
32
34
  export class SessionChatController {
33
35
  view;
@@ -36,7 +38,6 @@ export class SessionChatController {
36
38
  targetLabel;
37
39
  configuredClientToolNames;
38
40
  config;
39
- defaultDiffTool;
40
41
  diffToolLauncher;
41
42
  deps;
42
43
  speechToTextDeps;
@@ -83,6 +84,8 @@ export class SessionChatController {
83
84
  activeListenTranscription;
84
85
  listenActivityLabel;
85
86
  listenPreview;
87
+ editorHiddenSystemMessages = [];
88
+ submissionHiddenSystemMessages = [];
86
89
  pendingEditorMutations = 0;
87
90
  speechActivityLabel;
88
91
  speakTask;
@@ -95,7 +98,6 @@ export class SessionChatController {
95
98
  this.targetLabel = options.targetLabel;
96
99
  this.configuredClientToolNames = options.configuredClientToolNames ?? [];
97
100
  this.config = options.config ?? {};
98
- this.defaultDiffTool = options.defaultDiffTool;
99
101
  this.diffToolLauncher = options.diffToolLauncher;
100
102
  this.deps = options.deps ?? createDefaultCoreDeps();
101
103
  this.speechToTextDeps = options.speechToTextDeps;
@@ -127,7 +129,6 @@ export class SessionChatController {
127
129
  refreshStatus: () => this.refreshStatus(),
128
130
  startTurnTimer: () => this.startTurnTimer(),
129
131
  stopTurnTimer: () => this.stopTurnTimer(),
130
- getDiffToolConfig: () => this.resolveDiffToolConfig(),
131
132
  startSession: (args) => this.startDiffReviewBridge(args, this.session, this.snapshot),
132
133
  onReviewReturned: (review) => this.handleReturnedDiffReview(review, this.session),
133
134
  });
@@ -185,12 +186,21 @@ export class SessionChatController {
185
186
  onCtrlP: () => void this.cyclePersonality(),
186
187
  onCtrlS: () => void this.stashEditorToClipboard(),
187
188
  onCtrlY: () => void this.toggleListenCapture(),
189
+ onDisabledSubmit: (mode) => {
190
+ if (this.listenRecording && !this.listenTransition) {
191
+ void this.runListenTransition(() => this.stopListenCapture(mode));
192
+ }
193
+ },
188
194
  onCtrlG: () => this.interruptSelectedSubagent(),
189
195
  onEscape: () => void this.interrupt(),
190
- beforeSubmit: (text) => this.beforeSubmit(text),
196
+ beforeSubmit: (text) => {
197
+ const allowed = this.beforeSubmit(text);
198
+ this.submissionHiddenSystemMessages = allowed ? [...this.editorHiddenSystemMessages] : [];
199
+ return allowed;
200
+ },
191
201
  onChange: (text) => this.handleEditorChange(text),
192
- onSubmit: (text) => void this.handleSubmit(text),
193
- onSteerSubmit: (text) => void this.submitSteeringMessage(text),
202
+ onSubmit: (text) => void this.handleSubmit(text, this.takeHiddenSystemSubmission()),
203
+ onQueueSubmit: (text) => void this.handleSubmit(text, this.takeHiddenSystemSubmission(), "queue"),
194
204
  onAltUp: () => void this.cancelPendingMessagesIntoEditor(),
195
205
  onAltDown: () => this.cycleSubagentSelection(),
196
206
  };
@@ -218,7 +228,16 @@ export class SessionChatController {
218
228
  }
219
229
  return true;
220
230
  }
221
- async handleSubmit(text) {
231
+ takeHiddenSystemSubmission() {
232
+ const hiddenSystemMessages = this.submissionHiddenSystemMessages;
233
+ this.submissionHiddenSystemMessages = [];
234
+ this.editorHiddenSystemMessages = [];
235
+ return hiddenSystemMessages;
236
+ }
237
+ formatSubmittedText(text, hiddenSystemMessages) {
238
+ return formatTauUserText({ text, hiddenSystemMessages });
239
+ }
240
+ async handleSubmit(text, hiddenSystemMessages = [], mode = "steer") {
222
241
  const trimmed = text.trim();
223
242
  if (!trimmed) {
224
243
  if (this.isStreaming || this.submittedTurnInProgress) {
@@ -256,7 +275,11 @@ export class SessionChatController {
256
275
  if (trimmed.startsWith("!")) {
257
276
  return;
258
277
  }
259
- this.submitQueuedText(trimmed);
278
+ const submittedText = this.formatSubmittedText(trimmed, hiddenSystemMessages);
279
+ if (mode === "steer")
280
+ this.submitSteeringText(submittedText);
281
+ else
282
+ this.submitQueuedText(submittedText);
260
283
  return;
261
284
  }
262
285
  if (trimmed.startsWith("/") && this.isSingleLineInput(text)) {
@@ -286,7 +309,7 @@ export class SessionChatController {
286
309
  }
287
310
  return;
288
311
  }
289
- await this.runSessionTurn(() => this.session.submit(trimmed));
312
+ await this.runSessionTurn(() => this.session.submit(this.formatSubmittedText(trimmed, hiddenSystemMessages)));
290
313
  }
291
314
  async onUserInput(text) {
292
315
  await this.handleSubmit(text);
@@ -307,6 +330,10 @@ export class SessionChatController {
307
330
  this.view.showFooterNotice(`theme set to ${themeId}`, "default");
308
331
  }
309
332
  handleEditorChange(text) {
333
+ if (!text.trim())
334
+ this.editorHiddenSystemMessages = [];
335
+ else
336
+ this.submissionHiddenSystemMessages = [];
310
337
  const wasBash = this.isBashMode;
311
338
  const wasBashIncognito = this.isBashIncognito;
312
339
  if (text.trim().length > 0) {
@@ -333,7 +360,6 @@ export class SessionChatController {
333
360
  themes: () => this.themeIds.map((id) => ({ id })),
334
361
  autocompletePaths: async (query, limit) => (await this.session.autocompletePaths({ query, limit })).paths,
335
362
  skills: () => this.snapshot.catalog.skills.map((skill) => skill.name),
336
- subagents: () => Object.keys(this.getCurrentPersonaSnapshot()?.subagents ?? {}),
337
363
  };
338
364
  }
339
365
  buildStartupIntroTitle() {
@@ -453,21 +479,6 @@ export class SessionChatController {
453
479
  this.view.requestRender();
454
480
  }
455
481
  }
456
- async submitSteeringMessage(text) {
457
- const trimmed = text.trim();
458
- if (!trimmed) {
459
- return;
460
- }
461
- if (!this.isSessionOperationActive()) {
462
- await this.runSessionTurn(() => this.session.submit(trimmed));
463
- return;
464
- }
465
- if (this.isBlockingSessionOperationActive()) {
466
- this.view.showFooterNotice("wait for tau to become idle before submitting input", "default");
467
- return;
468
- }
469
- this.submitSteeringText(trimmed);
470
- }
471
482
  submitQueuedText(text) {
472
483
  void this.session.queue(text).catch((error) => {
473
484
  if (!this.isPendingMessageCancellation(error)) {
@@ -493,8 +504,17 @@ export class SessionChatController {
493
504
  if (cancelled.length === 0) {
494
505
  return;
495
506
  }
496
- const editorText = this.view.getEditorText();
497
- this.view.setEditorText([...(editorText ? [editorText] : []), ...cancelled.map((message) => message.text)].join("\n\n---\n\n"));
507
+ const editor = splitTauUserText(this.view.getEditorText());
508
+ const restored = cancelled.map((message) => splitTauUserText(message.text));
509
+ const hiddenSystemMessages = [
510
+ ...this.editorHiddenSystemMessages,
511
+ ...[editor, ...restored].flatMap((message) => message.hiddenSystemBlocks.map((block) => block.text)),
512
+ ];
513
+ this.view.setEditorText([
514
+ ...(editor.displayText ? [editor.displayText] : []),
515
+ ...restored.map((message) => message.displayText),
516
+ ].join("\n\n---\n\n"));
517
+ this.editorHiddenSystemMessages = hiddenSystemMessages;
498
518
  this.view.requestRender();
499
519
  }
500
520
  catch (error) {
@@ -651,7 +671,7 @@ export class SessionChatController {
651
671
  const apiKey = getSpeechToTextApiKey(this.config, this.deps);
652
672
  if (!apiKey) {
653
673
  this.view.addTranscriptNotice("speech-to-text is not configured", "error", [
654
- getSpeechToTextApiKeyErrorMessage(this.config, "use /listen"),
674
+ getSpeechToTextApiKeyErrorMessage("use /listen"),
655
675
  ]);
656
676
  return;
657
677
  }
@@ -672,7 +692,7 @@ export class SessionChatController {
672
692
  deps: this.deps,
673
693
  audioPath,
674
694
  signal: abortController.signal,
675
- streamingSampleRate: getSpeechToTextStreamingSampleRate(getSpeechToTextProvider(this.config)),
695
+ streamingSampleRate: getSpeechToTextStreamingSampleRate(),
676
696
  onAudioChunk: (audio) => transcription?.appendAudio(audio),
677
697
  });
678
698
  completion = capture.completion;
@@ -714,7 +734,7 @@ export class SessionChatController {
714
734
  if (this.listenRecording !== recording || this.listenTransition)
715
735
  return;
716
736
  void this.runListenTransition(() => this.stopListenCapture());
717
- }, getSpeechToTextRecordingMaxDurationMs(getSpeechToTextProvider(this.config)));
737
+ }, getSpeechToTextRecordingMaxDurationMs());
718
738
  this.listenRecording = recording;
719
739
  this.refreshStatus();
720
740
  void this.watchListenRecording(recording);
@@ -761,7 +781,7 @@ export class SessionChatController {
761
781
  clearTimeout(timeout);
762
782
  }
763
783
  }
764
- async stopListenCapture() {
784
+ async stopListenCapture(mode) {
765
785
  const recording = this.listenRecording;
766
786
  if (!recording)
767
787
  return;
@@ -781,7 +801,9 @@ export class SessionChatController {
781
801
  return;
782
802
  }
783
803
  const durationMs = Math.min(Math.max(Date.now() - recording.startedAt, 0), SPEECH_TO_TEXT_CLIENT_MAX_DURATION_MS);
784
- await this.transcribeListenAudioFile(recording.audioPath, durationMs, recording.transcription);
804
+ const transcribed = await this.transcribeListenAudioFile(recording.audioPath, durationMs, recording.transcription);
805
+ if (mode && transcribed && !this.disposed)
806
+ this.view.submitEditor(mode);
785
807
  }
786
808
  async retryRetainedListenAudio() {
787
809
  if (this.pendingEditorMutations > 0) {
@@ -797,7 +819,9 @@ export class SessionChatController {
797
819
  this.view.showFooterNotice("no failed speech recording to retry", "default");
798
820
  return;
799
821
  }
800
- await this.runListenTransition(() => this.transcribeListenAudioFile(retainedAudio.audioPath, retainedAudio.durationMs));
822
+ await this.runListenTransition(async () => {
823
+ await this.transcribeListenAudioFile(retainedAudio.audioPath, retainedAudio.durationMs);
824
+ });
801
825
  }
802
826
  async discardRetainedListenAudio() {
803
827
  if (this.listenRecording || this.listenTransition || this.listenActivityLabel) {
@@ -854,7 +878,7 @@ export class SessionChatController {
854
878
  this.retainedListenAudio = undefined;
855
879
  }
856
880
  await cleanupListenTempFile(audioPath);
857
- return;
881
+ return false;
858
882
  }
859
883
  if (!this.listenPreview)
860
884
  this.beginListenPreview();
@@ -868,7 +892,7 @@ export class SessionChatController {
868
892
  `recording retained at ${audioPath}`,
869
893
  "run /listen discard to delete it",
870
894
  ]);
871
- return;
895
+ return false;
872
896
  }
873
897
  let audio;
874
898
  try {
@@ -883,7 +907,7 @@ export class SessionChatController {
883
907
  this.retainedListenAudio = undefined;
884
908
  }
885
909
  await cleanupListenTempFile(audioPath);
886
- return;
910
+ return false;
887
911
  }
888
912
  if (audio.byteLength < LISTEN_RECORDING_MIN_BYTES) {
889
913
  transcription?.abort();
@@ -892,7 +916,7 @@ export class SessionChatController {
892
916
  this.retainedListenAudio = undefined;
893
917
  }
894
918
  await cleanupListenTempFile(audioPath);
895
- return;
919
+ return false;
896
920
  }
897
921
  if (this.disposed) {
898
922
  transcription?.abort();
@@ -900,7 +924,7 @@ export class SessionChatController {
900
924
  this.retainedListenAudio = undefined;
901
925
  }
902
926
  await cleanupListenTempFile(audioPath);
903
- return;
927
+ return false;
904
928
  }
905
929
  let activeTranscription = transcription;
906
930
  this.listenActivityLabel = "transcribing voice input";
@@ -913,8 +937,11 @@ export class SessionChatController {
913
937
  mimeType: "audio/wav",
914
938
  });
915
939
  if (this.listenPreview !== preview)
916
- return;
940
+ return false;
917
941
  preview.commit(text);
942
+ if (text.trim() && !this.editorHiddenSystemMessages.includes(TRANSCRIPTION_GUIDANCE)) {
943
+ this.editorHiddenSystemMessages.push(TRANSCRIPTION_GUIDANCE);
944
+ }
918
945
  this.retainedListenAudio = undefined;
919
946
  try {
920
947
  await deleteListenTempFile(audioPath);
@@ -925,6 +952,7 @@ export class SessionChatController {
925
952
  `recording remains at ${audioPath}; delete it manually`,
926
953
  ]);
927
954
  }
955
+ return Boolean(text.trim());
928
956
  }
929
957
  catch (error) {
930
958
  this.retainedListenAudio = { audioPath, durationMs };
@@ -933,6 +961,7 @@ export class SessionChatController {
933
961
  `recording retained at ${audioPath}`,
934
962
  "run /listen retry to try again, or /listen discard to delete it",
935
963
  ]);
964
+ return false;
936
965
  }
937
966
  finally {
938
967
  activeTranscription?.abort();
@@ -1143,13 +1172,6 @@ export class SessionChatController {
1143
1172
  switch (snapshot.kind) {
1144
1173
  case "local":
1145
1174
  return { kind: "local", cwd: snapshot.cwd };
1146
- case "cloudflare-sandbox":
1147
- return {
1148
- kind: "cloudflare-sandbox",
1149
- bridgeId: snapshot.bridgeId,
1150
- sandboxId: snapshot.sandboxId,
1151
- cwd: snapshot.cwd,
1152
- };
1153
1175
  case "fly-sprite":
1154
1176
  return {
1155
1177
  kind: "fly-sprite",
@@ -1986,10 +2008,11 @@ export class SessionChatController {
1986
2008
  this.view.showFooterNotice("last assistant message was empty.", "default");
1987
2009
  return;
1988
2010
  }
1989
- const apiKey = getGoogleApiKey(this.config, this.deps.env.env());
1990
- if (!apiKey) {
2011
+ const openAIApiKey = getOpenAIApiKey(this.config, this.deps.env.env());
2012
+ const elevenLabsApiKey = getElevenLabsApiKey(this.config, this.deps.env.env());
2013
+ if (!openAIApiKey || !elevenLabsApiKey) {
1991
2014
  this.view.addTranscriptNotice("speech synthesis is not configured", "error", [
1992
- "set GEMINI_API_KEY or apiKeys.google to use /speak",
2015
+ "set OPENAI_API_KEY or apiKeys.openai for rewriting and ELEVENLABS_API_KEY or apiKeys.elevenlabs for synthesis to use /speak",
1993
2016
  ]);
1994
2017
  return;
1995
2018
  }
@@ -1998,7 +2021,8 @@ export class SessionChatController {
1998
2021
  this.view.startWorkingIcon();
1999
2022
  const abortController = new AbortController();
2000
2023
  const completion = this.runSpeakTask({
2001
- apiKey,
2024
+ openAIApiKey,
2025
+ elevenLabsApiKey,
2002
2026
  sourceText,
2003
2027
  signal: abortController.signal,
2004
2028
  });
@@ -2028,7 +2052,9 @@ export class SessionChatController {
2028
2052
  async runSpeakTask(args) {
2029
2053
  await runSpeechPlaybackTask({
2030
2054
  deps: this.deps,
2031
- apiKey: args.apiKey,
2055
+ openAIApiKey: args.openAIApiKey,
2056
+ elevenLabsApiKey: args.elevenLabsApiKey,
2057
+ voiceId: this.config.speech?.voiceId,
2032
2058
  sourceText: args.sourceText,
2033
2059
  signal: args.signal,
2034
2060
  onActivityLabel: (hint) => {
@@ -2249,9 +2275,6 @@ export class SessionChatController {
2249
2275
  !this.listenActivityLabel &&
2250
2276
  !this.speakTask);
2251
2277
  }
2252
- resolveDiffToolConfig() {
2253
- return this.config.diffTool ?? this.defaultDiffTool;
2254
- }
2255
2278
  async startDiffReviewBridge(args, session, sessionSnapshot, executionEnvironment = session) {
2256
2279
  const cwd = sessionSnapshot.executionEnvironment.cwd;
2257
2280
  const backend = createSdkToolExecutionBackend({ executionEnvironment, cwd });
@@ -2276,7 +2299,6 @@ export class SessionChatController {
2276
2299
  ...(options.reasoning !== undefined ? { reasoning: options.reasoning } : {}),
2277
2300
  }),
2278
2301
  deps: this.deps,
2279
- ...(this.diffToolLauncher ? { toolLauncher: this.diffToolLauncher } : {}),
2280
2302
  });
2281
2303
  const unsubscribeEphemeral = session.onEphemeral((message) => {
2282
2304
  const event = message.event;
@@ -2297,7 +2319,7 @@ export class SessionChatController {
2297
2319
  if (args.signal.aborted) {
2298
2320
  throw new Error("diff review start aborted");
2299
2321
  }
2300
- await bridge.launchTool(args.diffTool);
2322
+ await bridge.launchTool(this.diffToolLauncher ?? launchBuiltInDiffTool);
2301
2323
  }
2302
2324
  catch (error) {
2303
2325
  unsubscribeEphemeral();