@hansjm10/volt-coding-agent 0.0.0-bootstrap.0 → 0.1.0

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 (1364) hide show
  1. package/BINARY-CAPABILITIES.md +28 -0
  2. package/CHANGELOG.md +4845 -0
  3. package/LICENSE +1 -1
  4. package/README.md +716 -3
  5. package/THIRD-PARTY-NOTICES.md +55 -0
  6. package/dist/LICENSES/clipboard-image-MIT.txt +9 -0
  7. package/dist/LICENSES/highlight.js-10.7.3-BSD-3-Clause.txt +29 -0
  8. package/dist/LICENSES/highlight.js-11.9.0-BSD-3-Clause.txt +29 -0
  9. package/dist/LICENSES/marked-18.0.5-LICENSE.txt +44 -0
  10. package/dist/LICENSES/run-jxa-MIT.txt +9 -0
  11. package/dist/cli/args.d.ts +60 -0
  12. package/dist/cli/args.d.ts.map +1 -0
  13. package/dist/cli/args.js +414 -0
  14. package/dist/cli/args.js.map +1 -0
  15. package/dist/cli/config-selector.d.ts +14 -0
  16. package/dist/cli/config-selector.d.ts.map +1 -0
  17. package/dist/cli/config-selector.js +31 -0
  18. package/dist/cli/config-selector.js.map +1 -0
  19. package/dist/cli/file-processor.d.ts +15 -0
  20. package/dist/cli/file-processor.d.ts.map +1 -0
  21. package/dist/cli/file-processor.js +85 -0
  22. package/dist/cli/file-processor.js.map +1 -0
  23. package/dist/cli/initial-message.d.ts +18 -0
  24. package/dist/cli/initial-message.d.ts.map +1 -0
  25. package/dist/cli/initial-message.js +22 -0
  26. package/dist/cli/initial-message.js.map +1 -0
  27. package/dist/cli/list-models.d.ts +9 -0
  28. package/dist/cli/list-models.d.ts.map +1 -0
  29. package/dist/cli/list-models.js +98 -0
  30. package/dist/cli/list-models.js.map +1 -0
  31. package/dist/cli/project-trust.d.ts +10 -0
  32. package/dist/cli/project-trust.d.ts.map +1 -0
  33. package/dist/cli/project-trust.js +48 -0
  34. package/dist/cli/project-trust.js.map +1 -0
  35. package/dist/cli/session-picker.d.ts +9 -0
  36. package/dist/cli/session-picker.d.ts.map +1 -0
  37. package/dist/cli/session-picker.js +35 -0
  38. package/dist/cli/session-picker.js.map +1 -0
  39. package/dist/cli/startup-ui.d.ts +17 -0
  40. package/dist/cli/startup-ui.d.ts.map +1 -0
  41. package/dist/cli/startup-ui.js +133 -0
  42. package/dist/cli/startup-ui.js.map +1 -0
  43. package/dist/cli.d.ts +3 -0
  44. package/dist/cli.d.ts.map +1 -0
  45. package/dist/cli.js +18 -0
  46. package/dist/cli.js.map +1 -0
  47. package/dist/config.d.ts +85 -0
  48. package/dist/config.d.ts.map +1 -0
  49. package/dist/config.js +487 -0
  50. package/dist/config.js.map +1 -0
  51. package/dist/core/agent-session-runtime.d.ts +160 -0
  52. package/dist/core/agent-session-runtime.d.ts.map +1 -0
  53. package/dist/core/agent-session-runtime.js +397 -0
  54. package/dist/core/agent-session-runtime.js.map +1 -0
  55. package/dist/core/agent-session-services.d.ts +98 -0
  56. package/dist/core/agent-session-services.d.ts.map +1 -0
  57. package/dist/core/agent-session-services.js +125 -0
  58. package/dist/core/agent-session-services.js.map +1 -0
  59. package/dist/core/agent-session.d.ts +739 -0
  60. package/dist/core/agent-session.d.ts.map +1 -0
  61. package/dist/core/agent-session.js +3158 -0
  62. package/dist/core/agent-session.js.map +1 -0
  63. package/dist/core/auth-guidance.d.ts +5 -0
  64. package/dist/core/auth-guidance.d.ts.map +1 -0
  65. package/dist/core/auth-guidance.js +21 -0
  66. package/dist/core/auth-guidance.js.map +1 -0
  67. package/dist/core/auth-storage.d.ts +159 -0
  68. package/dist/core/auth-storage.d.ts.map +1 -0
  69. package/dist/core/auth-storage.js +509 -0
  70. package/dist/core/auth-storage.js.map +1 -0
  71. package/dist/core/bash-executor.d.ts +32 -0
  72. package/dist/core/bash-executor.d.ts.map +1 -0
  73. package/dist/core/bash-executor.js +111 -0
  74. package/dist/core/bash-executor.js.map +1 -0
  75. package/dist/core/compaction/branch-summarization.d.ts +92 -0
  76. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  77. package/dist/core/compaction/branch-summarization.js +257 -0
  78. package/dist/core/compaction/branch-summarization.js.map +1 -0
  79. package/dist/core/compaction/compaction.d.ts +121 -0
  80. package/dist/core/compaction/compaction.d.ts.map +1 -0
  81. package/dist/core/compaction/compaction.js +658 -0
  82. package/dist/core/compaction/compaction.js.map +1 -0
  83. package/dist/core/compaction/index.d.ts +7 -0
  84. package/dist/core/compaction/index.d.ts.map +1 -0
  85. package/dist/core/compaction/index.js +7 -0
  86. package/dist/core/compaction/index.js.map +1 -0
  87. package/dist/core/compaction/utils.d.ts +56 -0
  88. package/dist/core/compaction/utils.d.ts.map +1 -0
  89. package/dist/core/compaction/utils.js +271 -0
  90. package/dist/core/compaction/utils.js.map +1 -0
  91. package/dist/core/defaults.d.ts +3 -0
  92. package/dist/core/defaults.d.ts.map +1 -0
  93. package/dist/core/defaults.js +2 -0
  94. package/dist/core/defaults.js.map +1 -0
  95. package/dist/core/diagnostics.d.ts +15 -0
  96. package/dist/core/diagnostics.d.ts.map +1 -0
  97. package/dist/core/diagnostics.js +2 -0
  98. package/dist/core/diagnostics.js.map +1 -0
  99. package/dist/core/event-bus.d.ts +9 -0
  100. package/dist/core/event-bus.d.ts.map +1 -0
  101. package/dist/core/event-bus.js +25 -0
  102. package/dist/core/event-bus.js.map +1 -0
  103. package/dist/core/exec.d.ts +29 -0
  104. package/dist/core/exec.d.ts.map +1 -0
  105. package/dist/core/exec.js +75 -0
  106. package/dist/core/exec.js.map +1 -0
  107. package/dist/core/experimental.d.ts +2 -0
  108. package/dist/core/experimental.d.ts.map +1 -0
  109. package/dist/core/experimental.js +4 -0
  110. package/dist/core/experimental.js.map +1 -0
  111. package/dist/core/export-html/ansi-to-html.d.ts +22 -0
  112. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  113. package/dist/core/export-html/ansi-to-html.js +249 -0
  114. package/dist/core/export-html/ansi-to-html.js.map +1 -0
  115. package/dist/core/export-html/index.d.ts +37 -0
  116. package/dist/core/export-html/index.d.ts.map +1 -0
  117. package/dist/core/export-html/index.js +234 -0
  118. package/dist/core/export-html/index.js.map +1 -0
  119. package/dist/core/export-html/template.css +1066 -0
  120. package/dist/core/export-html/template.html +55 -0
  121. package/dist/core/export-html/template.js +1864 -0
  122. package/dist/core/export-html/tool-renderer.d.ts +34 -0
  123. package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  124. package/dist/core/export-html/tool-renderer.js +108 -0
  125. package/dist/core/export-html/tool-renderer.js.map +1 -0
  126. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  127. package/dist/core/export-html/vendor/marked.min.js +78 -0
  128. package/dist/core/extensions/index.d.ts +12 -0
  129. package/dist/core/extensions/index.d.ts.map +1 -0
  130. package/dist/core/extensions/index.js +9 -0
  131. package/dist/core/extensions/index.js.map +1 -0
  132. package/dist/core/extensions/loader.d.ts +25 -0
  133. package/dist/core/extensions/loader.d.ts.map +1 -0
  134. package/dist/core/extensions/loader.js +516 -0
  135. package/dist/core/extensions/loader.js.map +1 -0
  136. package/dist/core/extensions/runner.d.ts +180 -0
  137. package/dist/core/extensions/runner.d.ts.map +1 -0
  138. package/dist/core/extensions/runner.js +938 -0
  139. package/dist/core/extensions/runner.js.map +1 -0
  140. package/dist/core/extensions/types.d.ts +1215 -0
  141. package/dist/core/extensions/types.d.ts.map +1 -0
  142. package/dist/core/extensions/types.js +48 -0
  143. package/dist/core/extensions/types.js.map +1 -0
  144. package/dist/core/extensions/wrapper.d.ts +20 -0
  145. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  146. package/dist/core/extensions/wrapper.js +22 -0
  147. package/dist/core/extensions/wrapper.js.map +1 -0
  148. package/dist/core/footer-data-provider.d.ts +54 -0
  149. package/dist/core/footer-data-provider.d.ts.map +1 -0
  150. package/dist/core/footer-data-provider.js +338 -0
  151. package/dist/core/footer-data-provider.js.map +1 -0
  152. package/dist/core/host-actions.d.ts +107 -0
  153. package/dist/core/host-actions.d.ts.map +1 -0
  154. package/dist/core/host-actions.js +632 -0
  155. package/dist/core/host-actions.js.map +1 -0
  156. package/dist/core/host-interaction.d.ts +35 -0
  157. package/dist/core/host-interaction.d.ts.map +1 -0
  158. package/dist/core/host-interaction.js +2 -0
  159. package/dist/core/host-interaction.js.map +1 -0
  160. package/dist/core/http-dispatcher.d.ts +22 -0
  161. package/dist/core/http-dispatcher.d.ts.map +1 -0
  162. package/dist/core/http-dispatcher.js +64 -0
  163. package/dist/core/http-dispatcher.js.map +1 -0
  164. package/dist/core/index.d.ts +18 -0
  165. package/dist/core/index.d.ts.map +1 -0
  166. package/dist/core/index.js +17 -0
  167. package/dist/core/index.js.map +1 -0
  168. package/dist/core/keybindings.d.ts +373 -0
  169. package/dist/core/keybindings.d.ts.map +1 -0
  170. package/dist/core/keybindings.js +303 -0
  171. package/dist/core/keybindings.js.map +1 -0
  172. package/dist/core/lsp/client.d.ts +119 -0
  173. package/dist/core/lsp/client.d.ts.map +1 -0
  174. package/dist/core/lsp/client.js +711 -0
  175. package/dist/core/lsp/client.js.map +1 -0
  176. package/dist/core/lsp/config.d.ts +96 -0
  177. package/dist/core/lsp/config.d.ts.map +1 -0
  178. package/dist/core/lsp/config.js +206 -0
  179. package/dist/core/lsp/config.js.map +1 -0
  180. package/dist/core/lsp/index.d.ts +6 -0
  181. package/dist/core/lsp/index.d.ts.map +1 -0
  182. package/dist/core/lsp/index.js +6 -0
  183. package/dist/core/lsp/index.js.map +1 -0
  184. package/dist/core/lsp/manager.d.ts +122 -0
  185. package/dist/core/lsp/manager.d.ts.map +1 -0
  186. package/dist/core/lsp/manager.js +1136 -0
  187. package/dist/core/lsp/manager.js.map +1 -0
  188. package/dist/core/lsp/trace.d.ts +26 -0
  189. package/dist/core/lsp/trace.d.ts.map +1 -0
  190. package/dist/core/lsp/trace.js +98 -0
  191. package/dist/core/lsp/trace.js.map +1 -0
  192. package/dist/core/lsp/workspace-edit.d.ts +60 -0
  193. package/dist/core/lsp/workspace-edit.d.ts.map +1 -0
  194. package/dist/core/lsp/workspace-edit.js +71 -0
  195. package/dist/core/lsp/workspace-edit.js.map +1 -0
  196. package/dist/core/mcp/audit.d.ts +39 -0
  197. package/dist/core/mcp/audit.d.ts.map +1 -0
  198. package/dist/core/mcp/audit.js +35 -0
  199. package/dist/core/mcp/audit.js.map +1 -0
  200. package/dist/core/mcp/auth.d.ts +7 -0
  201. package/dist/core/mcp/auth.d.ts.map +1 -0
  202. package/dist/core/mcp/auth.js +56 -0
  203. package/dist/core/mcp/auth.js.map +1 -0
  204. package/dist/core/mcp/client-factory.d.ts +20 -0
  205. package/dist/core/mcp/client-factory.d.ts.map +1 -0
  206. package/dist/core/mcp/client-factory.js +200 -0
  207. package/dist/core/mcp/client-factory.js.map +1 -0
  208. package/dist/core/mcp/config-loader.d.ts +9 -0
  209. package/dist/core/mcp/config-loader.d.ts.map +1 -0
  210. package/dist/core/mcp/config-loader.js +104 -0
  211. package/dist/core/mcp/config-loader.js.map +1 -0
  212. package/dist/core/mcp/config-writer.d.ts +21 -0
  213. package/dist/core/mcp/config-writer.d.ts.map +1 -0
  214. package/dist/core/mcp/config-writer.js +124 -0
  215. package/dist/core/mcp/config-writer.js.map +1 -0
  216. package/dist/core/mcp/config.d.ts +32 -0
  217. package/dist/core/mcp/config.d.ts.map +1 -0
  218. package/dist/core/mcp/config.js +385 -0
  219. package/dist/core/mcp/config.js.map +1 -0
  220. package/dist/core/mcp/direct-tools.d.ts +11 -0
  221. package/dist/core/mcp/direct-tools.d.ts.map +1 -0
  222. package/dist/core/mcp/direct-tools.js +47 -0
  223. package/dist/core/mcp/direct-tools.js.map +1 -0
  224. package/dist/core/mcp/gateway-tool.d.ts +29 -0
  225. package/dist/core/mcp/gateway-tool.d.ts.map +1 -0
  226. package/dist/core/mcp/gateway-tool.js +108 -0
  227. package/dist/core/mcp/gateway-tool.js.map +1 -0
  228. package/dist/core/mcp/index.d.ts +19 -0
  229. package/dist/core/mcp/index.d.ts.map +1 -0
  230. package/dist/core/mcp/index.js +18 -0
  231. package/dist/core/mcp/index.js.map +1 -0
  232. package/dist/core/mcp/manager.d.ts +117 -0
  233. package/dist/core/mcp/manager.d.ts.map +1 -0
  234. package/dist/core/mcp/manager.js +819 -0
  235. package/dist/core/mcp/manager.js.map +1 -0
  236. package/dist/core/mcp/metadata-cache.d.ts +27 -0
  237. package/dist/core/mcp/metadata-cache.d.ts.map +1 -0
  238. package/dist/core/mcp/metadata-cache.js +152 -0
  239. package/dist/core/mcp/metadata-cache.js.map +1 -0
  240. package/dist/core/mcp/oauth-flow.d.ts +94 -0
  241. package/dist/core/mcp/oauth-flow.d.ts.map +1 -0
  242. package/dist/core/mcp/oauth-flow.js +473 -0
  243. package/dist/core/mcp/oauth-flow.js.map +1 -0
  244. package/dist/core/mcp/oauth-provider.d.ts +39 -0
  245. package/dist/core/mcp/oauth-provider.d.ts.map +1 -0
  246. package/dist/core/mcp/oauth-provider.js +149 -0
  247. package/dist/core/mcp/oauth-provider.js.map +1 -0
  248. package/dist/core/mcp/oauth-store.d.ts +27 -0
  249. package/dist/core/mcp/oauth-store.d.ts.map +1 -0
  250. package/dist/core/mcp/oauth-store.js +111 -0
  251. package/dist/core/mcp/oauth-store.js.map +1 -0
  252. package/dist/core/mcp/output-store.d.ts +55 -0
  253. package/dist/core/mcp/output-store.d.ts.map +1 -0
  254. package/dist/core/mcp/output-store.js +206 -0
  255. package/dist/core/mcp/output-store.js.map +1 -0
  256. package/dist/core/mcp/rpc.d.ts +13 -0
  257. package/dist/core/mcp/rpc.d.ts.map +1 -0
  258. package/dist/core/mcp/rpc.js +29 -0
  259. package/dist/core/mcp/rpc.js.map +1 -0
  260. package/dist/core/mcp/safety.d.ts +6 -0
  261. package/dist/core/mcp/safety.d.ts.map +1 -0
  262. package/dist/core/mcp/safety.js +65 -0
  263. package/dist/core/mcp/safety.js.map +1 -0
  264. package/dist/core/mcp/search.d.ts +8 -0
  265. package/dist/core/mcp/search.d.ts.map +1 -0
  266. package/dist/core/mcp/search.js +85 -0
  267. package/dist/core/mcp/search.js.map +1 -0
  268. package/dist/core/mcp/server-supervisor.d.ts +59 -0
  269. package/dist/core/mcp/server-supervisor.d.ts.map +1 -0
  270. package/dist/core/mcp/server-supervisor.js +331 -0
  271. package/dist/core/mcp/server-supervisor.js.map +1 -0
  272. package/dist/core/mcp/types.d.ts +321 -0
  273. package/dist/core/mcp/types.d.ts.map +1 -0
  274. package/dist/core/mcp/types.js +2 -0
  275. package/dist/core/mcp/types.js.map +1 -0
  276. package/dist/core/messages.d.ts +78 -0
  277. package/dist/core/messages.d.ts.map +1 -0
  278. package/dist/core/messages.js +138 -0
  279. package/dist/core/messages.js.map +1 -0
  280. package/dist/core/model-catalog-watcher.d.ts +36 -0
  281. package/dist/core/model-catalog-watcher.d.ts.map +1 -0
  282. package/dist/core/model-catalog-watcher.js +101 -0
  283. package/dist/core/model-catalog-watcher.js.map +1 -0
  284. package/dist/core/model-registry.d.ts +160 -0
  285. package/dist/core/model-registry.d.ts.map +1 -0
  286. package/dist/core/model-registry.js +754 -0
  287. package/dist/core/model-registry.js.map +1 -0
  288. package/dist/core/model-resolver.d.ts +111 -0
  289. package/dist/core/model-resolver.d.ts.map +1 -0
  290. package/dist/core/model-resolver.js +534 -0
  291. package/dist/core/model-resolver.js.map +1 -0
  292. package/dist/core/output-guard.d.ts +7 -0
  293. package/dist/core/output-guard.d.ts.map +1 -0
  294. package/dist/core/output-guard.js +89 -0
  295. package/dist/core/output-guard.js.map +1 -0
  296. package/dist/core/package-manager.d.ts +220 -0
  297. package/dist/core/package-manager.d.ts.map +1 -0
  298. package/dist/core/package-manager.js +2217 -0
  299. package/dist/core/package-manager.js.map +1 -0
  300. package/dist/core/project-trust.d.ts +15 -0
  301. package/dist/core/project-trust.d.ts.map +1 -0
  302. package/dist/core/project-trust.js +58 -0
  303. package/dist/core/project-trust.js.map +1 -0
  304. package/dist/core/prompt-templates.d.ts +53 -0
  305. package/dist/core/prompt-templates.d.ts.map +1 -0
  306. package/dist/core/prompt-templates.js +236 -0
  307. package/dist/core/prompt-templates.js.map +1 -0
  308. package/dist/core/provider-attribution.d.ts +4 -0
  309. package/dist/core/provider-attribution.d.ts.map +1 -0
  310. package/dist/core/provider-attribution.js +81 -0
  311. package/dist/core/provider-attribution.js.map +1 -0
  312. package/dist/core/provider-display-names.d.ts +2 -0
  313. package/dist/core/provider-display-names.d.ts.map +1 -0
  314. package/dist/core/provider-display-names.js +36 -0
  315. package/dist/core/provider-display-names.js.map +1 -0
  316. package/dist/core/remote/iroh/access-grant.d.ts +40 -0
  317. package/dist/core/remote/iroh/access-grant.d.ts.map +1 -0
  318. package/dist/core/remote/iroh/access-grant.js +199 -0
  319. package/dist/core/remote/iroh/access-grant.js.map +1 -0
  320. package/dist/core/remote/iroh/active-stream-registry.d.ts +39 -0
  321. package/dist/core/remote/iroh/active-stream-registry.d.ts.map +1 -0
  322. package/dist/core/remote/iroh/active-stream-registry.js +109 -0
  323. package/dist/core/remote/iroh/active-stream-registry.js.map +1 -0
  324. package/dist/core/remote/iroh/audit.d.ts +67 -0
  325. package/dist/core/remote/iroh/audit.d.ts.map +1 -0
  326. package/dist/core/remote/iroh/audit.js +274 -0
  327. package/dist/core/remote/iroh/audit.js.map +1 -0
  328. package/dist/core/remote/iroh/authorization.d.ts +46 -0
  329. package/dist/core/remote/iroh/authorization.d.ts.map +1 -0
  330. package/dist/core/remote/iroh/authorization.js +327 -0
  331. package/dist/core/remote/iroh/authorization.js.map +1 -0
  332. package/dist/core/remote/iroh/control.d.ts +64 -0
  333. package/dist/core/remote/iroh/control.d.ts.map +1 -0
  334. package/dist/core/remote/iroh/control.js +326 -0
  335. package/dist/core/remote/iroh/control.js.map +1 -0
  336. package/dist/core/remote/iroh/device-log-rpc.d.ts +22 -0
  337. package/dist/core/remote/iroh/device-log-rpc.d.ts.map +1 -0
  338. package/dist/core/remote/iroh/device-log-rpc.js +152 -0
  339. package/dist/core/remote/iroh/device-log-rpc.js.map +1 -0
  340. package/dist/core/remote/iroh/engine.d.ts +148 -0
  341. package/dist/core/remote/iroh/engine.d.ts.map +1 -0
  342. package/dist/core/remote/iroh/engine.js +499 -0
  343. package/dist/core/remote/iroh/engine.js.map +1 -0
  344. package/dist/core/remote/iroh/handshake-reader.d.ts +19 -0
  345. package/dist/core/remote/iroh/handshake-reader.d.ts.map +1 -0
  346. package/dist/core/remote/iroh/handshake-reader.js +91 -0
  347. package/dist/core/remote/iroh/handshake-reader.js.map +1 -0
  348. package/dist/core/remote/iroh/handshake.d.ts +119 -0
  349. package/dist/core/remote/iroh/handshake.d.ts.map +1 -0
  350. package/dist/core/remote/iroh/handshake.js +621 -0
  351. package/dist/core/remote/iroh/handshake.js.map +1 -0
  352. package/dist/core/remote/iroh/host-policy.d.ts +13 -0
  353. package/dist/core/remote/iroh/host-policy.d.ts.map +1 -0
  354. package/dist/core/remote/iroh/host-policy.js +15 -0
  355. package/dist/core/remote/iroh/host-policy.js.map +1 -0
  356. package/dist/core/remote/iroh/index.d.ts +25 -0
  357. package/dist/core/remote/iroh/index.d.ts.map +1 -0
  358. package/dist/core/remote/iroh/index.js +25 -0
  359. package/dist/core/remote/iroh/index.js.map +1 -0
  360. package/dist/core/remote/iroh/metadata.d.ts +28 -0
  361. package/dist/core/remote/iroh/metadata.d.ts.map +1 -0
  362. package/dist/core/remote/iroh/metadata.js +16 -0
  363. package/dist/core/remote/iroh/metadata.js.map +1 -0
  364. package/dist/core/remote/iroh/outbound-filter.d.ts +29 -0
  365. package/dist/core/remote/iroh/outbound-filter.d.ts.map +1 -0
  366. package/dist/core/remote/iroh/outbound-filter.js +692 -0
  367. package/dist/core/remote/iroh/outbound-filter.js.map +1 -0
  368. package/dist/core/remote/iroh/protocol.d.ts +60 -0
  369. package/dist/core/remote/iroh/protocol.d.ts.map +1 -0
  370. package/dist/core/remote/iroh/protocol.js +204 -0
  371. package/dist/core/remote/iroh/protocol.js.map +1 -0
  372. package/dist/core/remote/iroh/push.d.ts +179 -0
  373. package/dist/core/remote/iroh/push.d.ts.map +1 -0
  374. package/dist/core/remote/iroh/push.js +662 -0
  375. package/dist/core/remote/iroh/push.js.map +1 -0
  376. package/dist/core/remote/iroh/qr.d.ts +12 -0
  377. package/dist/core/remote/iroh/qr.d.ts.map +1 -0
  378. package/dist/core/remote/iroh/qr.js +27 -0
  379. package/dist/core/remote/iroh/qr.js.map +1 -0
  380. package/dist/core/remote/iroh/rpc-command-filter.d.ts +47 -0
  381. package/dist/core/remote/iroh/rpc-command-filter.d.ts.map +1 -0
  382. package/dist/core/remote/iroh/rpc-command-filter.js +188 -0
  383. package/dist/core/remote/iroh/rpc-command-filter.js.map +1 -0
  384. package/dist/core/remote/iroh/rpc-transport.d.ts +21 -0
  385. package/dist/core/remote/iroh/rpc-transport.d.ts.map +1 -0
  386. package/dist/core/remote/iroh/rpc-transport.js +106 -0
  387. package/dist/core/remote/iroh/rpc-transport.js.map +1 -0
  388. package/dist/core/remote/iroh/state-manager.d.ts +141 -0
  389. package/dist/core/remote/iroh/state-manager.d.ts.map +1 -0
  390. package/dist/core/remote/iroh/state-manager.js +744 -0
  391. package/dist/core/remote/iroh/state-manager.js.map +1 -0
  392. package/dist/core/remote/iroh/state.d.ts +141 -0
  393. package/dist/core/remote/iroh/state.d.ts.map +1 -0
  394. package/dist/core/remote/iroh/state.js +433 -0
  395. package/dist/core/remote/iroh/state.js.map +1 -0
  396. package/dist/core/remote/iroh/ticket.d.ts +46 -0
  397. package/dist/core/remote/iroh/ticket.d.ts.map +1 -0
  398. package/dist/core/remote/iroh/ticket.js +267 -0
  399. package/dist/core/remote/iroh/ticket.js.map +1 -0
  400. package/dist/core/remote/iroh/transcript-text.d.ts +8 -0
  401. package/dist/core/remote/iroh/transcript-text.d.ts.map +1 -0
  402. package/dist/core/remote/iroh/transcript-text.js +26 -0
  403. package/dist/core/remote/iroh/transcript-text.js.map +1 -0
  404. package/dist/core/remote/iroh/workspace-rpc.d.ts +31 -0
  405. package/dist/core/remote/iroh/workspace-rpc.d.ts.map +1 -0
  406. package/dist/core/remote/iroh/workspace-rpc.js +73 -0
  407. package/dist/core/remote/iroh/workspace-rpc.js.map +1 -0
  408. package/dist/core/remote/iroh/workspace.d.ts +16 -0
  409. package/dist/core/remote/iroh/workspace.d.ts.map +1 -0
  410. package/dist/core/remote/iroh/workspace.js +104 -0
  411. package/dist/core/remote/iroh/workspace.js.map +1 -0
  412. package/dist/core/remote/iroh/worktree-rpc.d.ts +83 -0
  413. package/dist/core/remote/iroh/worktree-rpc.d.ts.map +1 -0
  414. package/dist/core/remote/iroh/worktree-rpc.js +148 -0
  415. package/dist/core/remote/iroh/worktree-rpc.js.map +1 -0
  416. package/dist/core/resolve-config-value.d.ts +30 -0
  417. package/dist/core/resolve-config-value.d.ts.map +1 -0
  418. package/dist/core/resolve-config-value.js +245 -0
  419. package/dist/core/resolve-config-value.js.map +1 -0
  420. package/dist/core/resource-loader.d.ts +214 -0
  421. package/dist/core/resource-loader.d.ts.map +1 -0
  422. package/dist/core/resource-loader.js +824 -0
  423. package/dist/core/resource-loader.js.map +1 -0
  424. package/dist/core/review.d.ts +318 -0
  425. package/dist/core/review.d.ts.map +1 -0
  426. package/dist/core/review.js +1271 -0
  427. package/dist/core/review.js.map +1 -0
  428. package/dist/core/rpc/duplex-write-gate.d.ts +29 -0
  429. package/dist/core/rpc/duplex-write-gate.d.ts.map +1 -0
  430. package/dist/core/rpc/duplex-write-gate.js +124 -0
  431. package/dist/core/rpc/duplex-write-gate.js.map +1 -0
  432. package/dist/core/rpc/index.d.ts +6 -0
  433. package/dist/core/rpc/index.d.ts.map +1 -0
  434. package/dist/core/rpc/index.js +5 -0
  435. package/dist/core/rpc/index.js.map +1 -0
  436. package/dist/core/rpc/iroh-transport.d.ts +58 -0
  437. package/dist/core/rpc/iroh-transport.d.ts.map +1 -0
  438. package/dist/core/rpc/iroh-transport.js +278 -0
  439. package/dist/core/rpc/iroh-transport.js.map +1 -0
  440. package/dist/core/rpc/jsonl.d.ts +17 -0
  441. package/dist/core/rpc/jsonl.d.ts.map +1 -0
  442. package/dist/core/rpc/jsonl.js +49 -0
  443. package/dist/core/rpc/jsonl.js.map +1 -0
  444. package/dist/core/rpc/loopback-transport.d.ts +14 -0
  445. package/dist/core/rpc/loopback-transport.d.ts.map +1 -0
  446. package/dist/core/rpc/loopback-transport.js +120 -0
  447. package/dist/core/rpc/loopback-transport.js.map +1 -0
  448. package/dist/core/rpc/transcript.d.ts +37 -0
  449. package/dist/core/rpc/transcript.d.ts.map +1 -0
  450. package/dist/core/rpc/transcript.js +624 -0
  451. package/dist/core/rpc/transcript.js.map +1 -0
  452. package/dist/core/rpc/transport.d.ts +41 -0
  453. package/dist/core/rpc/transport.d.ts.map +1 -0
  454. package/dist/core/rpc/transport.js +155 -0
  455. package/dist/core/rpc/transport.js.map +1 -0
  456. package/dist/core/rpc/types.d.ts +1254 -0
  457. package/dist/core/rpc/types.d.ts.map +1 -0
  458. package/dist/core/rpc/types.js +8 -0
  459. package/dist/core/rpc/types.js.map +1 -0
  460. package/dist/core/rpc/ui-action-args.d.ts +3 -0
  461. package/dist/core/rpc/ui-action-args.d.ts.map +1 -0
  462. package/dist/core/rpc/ui-action-args.js +66 -0
  463. package/dist/core/rpc/ui-action-args.js.map +1 -0
  464. package/dist/core/rpc/ui-actions.d.ts +43 -0
  465. package/dist/core/rpc/ui-actions.d.ts.map +1 -0
  466. package/dist/core/rpc/ui-actions.js +362 -0
  467. package/dist/core/rpc/ui-actions.js.map +1 -0
  468. package/dist/core/sdk.d.ts +138 -0
  469. package/dist/core/sdk.d.ts.map +1 -0
  470. package/dist/core/sdk.js +324 -0
  471. package/dist/core/sdk.js.map +1 -0
  472. package/dist/core/session-cwd.d.ts +19 -0
  473. package/dist/core/session-cwd.d.ts.map +1 -0
  474. package/dist/core/session-cwd.js +38 -0
  475. package/dist/core/session-cwd.js.map +1 -0
  476. package/dist/core/session-manager.d.ts +346 -0
  477. package/dist/core/session-manager.d.ts.map +1 -0
  478. package/dist/core/session-manager.js +1280 -0
  479. package/dist/core/session-manager.js.map +1 -0
  480. package/dist/core/settings-manager.d.ts +359 -0
  481. package/dist/core/settings-manager.d.ts.map +1 -0
  482. package/dist/core/settings-manager.js +1277 -0
  483. package/dist/core/settings-manager.js.map +1 -0
  484. package/dist/core/skills.d.ts +60 -0
  485. package/dist/core/skills.d.ts.map +1 -0
  486. package/dist/core/skills.js +387 -0
  487. package/dist/core/skills.js.map +1 -0
  488. package/dist/core/slash-commands.d.ts +14 -0
  489. package/dist/core/slash-commands.d.ts.map +1 -0
  490. package/dist/core/slash-commands.js +51 -0
  491. package/dist/core/slash-commands.js.map +1 -0
  492. package/dist/core/source-info.d.ts +18 -0
  493. package/dist/core/source-info.d.ts.map +1 -0
  494. package/dist/core/source-info.js +19 -0
  495. package/dist/core/source-info.js.map +1 -0
  496. package/dist/core/subagents/delegation-scope.d.ts +47 -0
  497. package/dist/core/subagents/delegation-scope.d.ts.map +1 -0
  498. package/dist/core/subagents/delegation-scope.js +134 -0
  499. package/dist/core/subagents/delegation-scope.js.map +1 -0
  500. package/dist/core/subagents/index.d.ts +46 -0
  501. package/dist/core/subagents/index.d.ts.map +1 -0
  502. package/dist/core/subagents/index.js +369 -0
  503. package/dist/core/subagents/index.js.map +1 -0
  504. package/dist/core/subagents/manager.d.ts +183 -0
  505. package/dist/core/subagents/manager.d.ts.map +1 -0
  506. package/dist/core/subagents/manager.js +820 -0
  507. package/dist/core/subagents/manager.js.map +1 -0
  508. package/dist/core/system-prompt.d.ts +28 -0
  509. package/dist/core/system-prompt.d.ts.map +1 -0
  510. package/dist/core/system-prompt.js +180 -0
  511. package/dist/core/system-prompt.js.map +1 -0
  512. package/dist/core/telemetry.d.ts +3 -0
  513. package/dist/core/telemetry.d.ts.map +1 -0
  514. package/dist/core/telemetry.js +9 -0
  515. package/dist/core/telemetry.js.map +1 -0
  516. package/dist/core/theme/dark.json +86 -0
  517. package/dist/core/theme/discovery.d.ts +48 -0
  518. package/dist/core/theme/discovery.d.ts.map +1 -0
  519. package/dist/core/theme/discovery.js +239 -0
  520. package/dist/core/theme/discovery.js.map +1 -0
  521. package/dist/core/theme/index.d.ts +6 -0
  522. package/dist/core/theme/index.d.ts.map +1 -0
  523. package/dist/core/theme/index.js +5 -0
  524. package/dist/core/theme/index.js.map +1 -0
  525. package/dist/core/theme/light.json +85 -0
  526. package/dist/core/theme/runtime.d.ts +55 -0
  527. package/dist/core/theme/runtime.d.ts.map +1 -0
  528. package/dist/core/theme/runtime.js +555 -0
  529. package/dist/core/theme/runtime.js.map +1 -0
  530. package/dist/core/theme/theme-schema.json +335 -0
  531. package/dist/core/theme/theme-service.d.ts +37 -0
  532. package/dist/core/theme/theme-service.d.ts.map +1 -0
  533. package/dist/core/theme/theme-service.js +222 -0
  534. package/dist/core/theme/theme-service.js.map +1 -0
  535. package/dist/core/theme/theme.d.ts +100 -0
  536. package/dist/core/theme/theme.d.ts.map +1 -0
  537. package/dist/core/theme/theme.js +243 -0
  538. package/dist/core/theme/theme.js.map +1 -0
  539. package/dist/core/theme/tokens.d.ts +20 -0
  540. package/dist/core/theme/tokens.d.ts.map +1 -0
  541. package/dist/core/theme/tokens.js +178 -0
  542. package/dist/core/theme/tokens.js.map +1 -0
  543. package/dist/core/theme/types.d.ts +21 -0
  544. package/dist/core/theme/types.d.ts.map +1 -0
  545. package/dist/core/theme/types.js +2 -0
  546. package/dist/core/theme/types.js.map +1 -0
  547. package/dist/core/timings.d.ts +8 -0
  548. package/dist/core/timings.d.ts.map +1 -0
  549. package/dist/core/timings.js +31 -0
  550. package/dist/core/timings.js.map +1 -0
  551. package/dist/core/tools/bash.d.ts +68 -0
  552. package/dist/core/tools/bash.d.ts.map +1 -0
  553. package/dist/core/tools/bash.js +345 -0
  554. package/dist/core/tools/bash.js.map +1 -0
  555. package/dist/core/tools/diagnostics-provider.d.ts +12 -0
  556. package/dist/core/tools/diagnostics-provider.d.ts.map +1 -0
  557. package/dist/core/tools/diagnostics-provider.js +2 -0
  558. package/dist/core/tools/diagnostics-provider.js.map +1 -0
  559. package/dist/core/tools/edit-diff.d.ts +77 -0
  560. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  561. package/dist/core/tools/edit-diff.js +506 -0
  562. package/dist/core/tools/edit-diff.js.map +1 -0
  563. package/dist/core/tools/edit.d.ts +56 -0
  564. package/dist/core/tools/edit.d.ts.map +1 -0
  565. package/dist/core/tools/edit.js +300 -0
  566. package/dist/core/tools/edit.js.map +1 -0
  567. package/dist/core/tools/file-mutation-queue.d.ts +6 -0
  568. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
  569. package/dist/core/tools/file-mutation-queue.js +52 -0
  570. package/dist/core/tools/file-mutation-queue.js.map +1 -0
  571. package/dist/core/tools/find.d.ts +35 -0
  572. package/dist/core/tools/find.d.ts.map +1 -0
  573. package/dist/core/tools/find.js +337 -0
  574. package/dist/core/tools/find.js.map +1 -0
  575. package/dist/core/tools/grep.d.ts +37 -0
  576. package/dist/core/tools/grep.d.ts.map +1 -0
  577. package/dist/core/tools/grep.js +305 -0
  578. package/dist/core/tools/grep.js.map +1 -0
  579. package/dist/core/tools/index.d.ts +56 -0
  580. package/dist/core/tools/index.d.ts.map +1 -0
  581. package/dist/core/tools/index.js +174 -0
  582. package/dist/core/tools/index.js.map +1 -0
  583. package/dist/core/tools/ls.d.ts +37 -0
  584. package/dist/core/tools/ls.d.ts.map +1 -0
  585. package/dist/core/tools/ls.js +167 -0
  586. package/dist/core/tools/ls.js.map +1 -0
  587. package/dist/core/tools/lsp.d.ts +59 -0
  588. package/dist/core/tools/lsp.d.ts.map +1 -0
  589. package/dist/core/tools/lsp.js +157 -0
  590. package/dist/core/tools/lsp.js.map +1 -0
  591. package/dist/core/tools/output-accumulator.d.ts +52 -0
  592. package/dist/core/tools/output-accumulator.d.ts.map +1 -0
  593. package/dist/core/tools/output-accumulator.js +184 -0
  594. package/dist/core/tools/output-accumulator.js.map +1 -0
  595. package/dist/core/tools/path-utils.d.ts +10 -0
  596. package/dist/core/tools/path-utils.d.ts.map +1 -0
  597. package/dist/core/tools/path-utils.js +99 -0
  598. package/dist/core/tools/path-utils.js.map +1 -0
  599. package/dist/core/tools/read.d.ts +35 -0
  600. package/dist/core/tools/read.d.ts.map +1 -0
  601. package/dist/core/tools/read.js +292 -0
  602. package/dist/core/tools/read.js.map +1 -0
  603. package/dist/core/tools/render-utils.d.ts +26 -0
  604. package/dist/core/tools/render-utils.d.ts.map +1 -0
  605. package/dist/core/tools/render-utils.js +69 -0
  606. package/dist/core/tools/render-utils.js.map +1 -0
  607. package/dist/core/tools/subagent.d.ts +219 -0
  608. package/dist/core/tools/subagent.d.ts.map +1 -0
  609. package/dist/core/tools/subagent.js +1445 -0
  610. package/dist/core/tools/subagent.js.map +1 -0
  611. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  612. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  613. package/dist/core/tools/tool-definition-wrapper.js +34 -0
  614. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  615. package/dist/core/tools/truncate.d.ts +70 -0
  616. package/dist/core/tools/truncate.d.ts.map +1 -0
  617. package/dist/core/tools/truncate.js +215 -0
  618. package/dist/core/tools/truncate.js.map +1 -0
  619. package/dist/core/tools/web-search.d.ts +69 -0
  620. package/dist/core/tools/web-search.d.ts.map +1 -0
  621. package/dist/core/tools/web-search.js +634 -0
  622. package/dist/core/tools/web-search.js.map +1 -0
  623. package/dist/core/tools/write.d.ts +33 -0
  624. package/dist/core/tools/write.d.ts.map +1 -0
  625. package/dist/core/tools/write.js +210 -0
  626. package/dist/core/tools/write.js.map +1 -0
  627. package/dist/core/trust-manager.d.ts +36 -0
  628. package/dist/core/trust-manager.d.ts.map +1 -0
  629. package/dist/core/trust-manager.js +220 -0
  630. package/dist/core/trust-manager.js.map +1 -0
  631. package/dist/daemon/cli.d.ts +8 -0
  632. package/dist/daemon/cli.d.ts.map +1 -0
  633. package/dist/daemon/cli.js +468 -0
  634. package/dist/daemon/cli.js.map +1 -0
  635. package/dist/daemon/control-client.d.ts +60 -0
  636. package/dist/daemon/control-client.d.ts.map +1 -0
  637. package/dist/daemon/control-client.js +411 -0
  638. package/dist/daemon/control-client.js.map +1 -0
  639. package/dist/daemon/control-protocol.d.ts +507 -0
  640. package/dist/daemon/control-protocol.d.ts.map +1 -0
  641. package/dist/daemon/control-protocol.js +395 -0
  642. package/dist/daemon/control-protocol.js.map +1 -0
  643. package/dist/daemon/control-server.d.ts +77 -0
  644. package/dist/daemon/control-server.d.ts.map +1 -0
  645. package/dist/daemon/control-server.js +327 -0
  646. package/dist/daemon/control-server.js.map +1 -0
  647. package/dist/daemon/conversation-commands.d.ts +176 -0
  648. package/dist/daemon/conversation-commands.d.ts.map +1 -0
  649. package/dist/daemon/conversation-commands.js +1268 -0
  650. package/dist/daemon/conversation-commands.js.map +1 -0
  651. package/dist/daemon/daemon-lock.d.ts +27 -0
  652. package/dist/daemon/daemon-lock.d.ts.map +1 -0
  653. package/dist/daemon/daemon-lock.js +238 -0
  654. package/dist/daemon/daemon-lock.js.map +1 -0
  655. package/dist/daemon/handshake-responses.d.ts +47 -0
  656. package/dist/daemon/handshake-responses.d.ts.map +1 -0
  657. package/dist/daemon/handshake-responses.js +113 -0
  658. package/dist/daemon/handshake-responses.js.map +1 -0
  659. package/dist/daemon/integrated-runtimes.d.ts +137 -0
  660. package/dist/daemon/integrated-runtimes.d.ts.map +1 -0
  661. package/dist/daemon/integrated-runtimes.js +763 -0
  662. package/dist/daemon/integrated-runtimes.js.map +1 -0
  663. package/dist/daemon/iroh-native.d.ts +76 -0
  664. package/dist/daemon/iroh-native.d.ts.map +1 -0
  665. package/dist/daemon/iroh-native.js +18 -0
  666. package/dist/daemon/iroh-native.js.map +1 -0
  667. package/dist/daemon/iroh-resource-guard.d.ts +57 -0
  668. package/dist/daemon/iroh-resource-guard.d.ts.map +1 -0
  669. package/dist/daemon/iroh-resource-guard.js +134 -0
  670. package/dist/daemon/iroh-resource-guard.js.map +1 -0
  671. package/dist/daemon/iroh-service.d.ts +51 -0
  672. package/dist/daemon/iroh-service.d.ts.map +1 -0
  673. package/dist/daemon/iroh-service.js +2604 -0
  674. package/dist/daemon/iroh-service.js.map +1 -0
  675. package/dist/daemon/keep-awake.d.ts +62 -0
  676. package/dist/daemon/keep-awake.d.ts.map +1 -0
  677. package/dist/daemon/keep-awake.js +190 -0
  678. package/dist/daemon/keep-awake.js.map +1 -0
  679. package/dist/daemon/lease-broker.d.ts +139 -0
  680. package/dist/daemon/lease-broker.d.ts.map +1 -0
  681. package/dist/daemon/lease-broker.js +504 -0
  682. package/dist/daemon/lease-broker.js.map +1 -0
  683. package/dist/daemon/log.d.ts +16 -0
  684. package/dist/daemon/log.d.ts.map +1 -0
  685. package/dist/daemon/log.js +40 -0
  686. package/dist/daemon/log.js.map +1 -0
  687. package/dist/daemon/main.d.ts +70 -0
  688. package/dist/daemon/main.d.ts.map +1 -0
  689. package/dist/daemon/main.js +781 -0
  690. package/dist/daemon/main.js.map +1 -0
  691. package/dist/daemon/paths.d.ts +32 -0
  692. package/dist/daemon/paths.d.ts.map +1 -0
  693. package/dist/daemon/paths.js +208 -0
  694. package/dist/daemon/paths.js.map +1 -0
  695. package/dist/daemon/process-identity.d.ts +58 -0
  696. package/dist/daemon/process-identity.d.ts.map +1 -0
  697. package/dist/daemon/process-identity.js +185 -0
  698. package/dist/daemon/process-identity.js.map +1 -0
  699. package/dist/daemon/relay-stream.d.ts +89 -0
  700. package/dist/daemon/relay-stream.d.ts.map +1 -0
  701. package/dist/daemon/relay-stream.js +202 -0
  702. package/dist/daemon/relay-stream.js.map +1 -0
  703. package/dist/daemon/remote-cli.d.ts +7 -0
  704. package/dist/daemon/remote-cli.d.ts.map +1 -0
  705. package/dist/daemon/remote-cli.js +774 -0
  706. package/dist/daemon/remote-cli.js.map +1 -0
  707. package/dist/daemon/service-install.d.ts +43 -0
  708. package/dist/daemon/service-install.d.ts.map +1 -0
  709. package/dist/daemon/service-install.js +198 -0
  710. package/dist/daemon/service-install.js.map +1 -0
  711. package/dist/daemon/session-target.d.ts +62 -0
  712. package/dist/daemon/session-target.d.ts.map +1 -0
  713. package/dist/daemon/session-target.js +66 -0
  714. package/dist/daemon/session-target.js.map +1 -0
  715. package/dist/daemon/spawn.d.ts +53 -0
  716. package/dist/daemon/spawn.d.ts.map +1 -0
  717. package/dist/daemon/spawn.js +205 -0
  718. package/dist/daemon/spawn.js.map +1 -0
  719. package/dist/daemon/state.d.ts +145 -0
  720. package/dist/daemon/state.d.ts.map +1 -0
  721. package/dist/daemon/state.js +454 -0
  722. package/dist/daemon/state.js.map +1 -0
  723. package/dist/daemon/theme-push.d.ts +23 -0
  724. package/dist/daemon/theme-push.d.ts.map +1 -0
  725. package/dist/daemon/theme-push.js +30 -0
  726. package/dist/daemon/theme-push.js.map +1 -0
  727. package/dist/daemon/viewer-feed.d.ts +42 -0
  728. package/dist/daemon/viewer-feed.d.ts.map +1 -0
  729. package/dist/daemon/viewer-feed.js +138 -0
  730. package/dist/daemon/viewer-feed.js.map +1 -0
  731. package/dist/daemon/workspace-directory.d.ts +35 -0
  732. package/dist/daemon/workspace-directory.d.ts.map +1 -0
  733. package/dist/daemon/workspace-directory.js +105 -0
  734. package/dist/daemon/workspace-directory.js.map +1 -0
  735. package/dist/daemon/workspace-streams.d.ts +70 -0
  736. package/dist/daemon/workspace-streams.d.ts.map +1 -0
  737. package/dist/daemon/workspace-streams.js +289 -0
  738. package/dist/daemon/workspace-streams.js.map +1 -0
  739. package/dist/daemon/worktree-manager.d.ts +219 -0
  740. package/dist/daemon/worktree-manager.d.ts.map +1 -0
  741. package/dist/daemon/worktree-manager.js +1204 -0
  742. package/dist/daemon/worktree-manager.js.map +1 -0
  743. package/dist/index.d.ts +44 -0
  744. package/dist/index.d.ts.map +1 -0
  745. package/dist/index.js +57 -0
  746. package/dist/index.js.map +1 -0
  747. package/dist/main.d.ts +12 -0
  748. package/dist/main.d.ts.map +1 -0
  749. package/dist/main.js +773 -0
  750. package/dist/main.js.map +1 -0
  751. package/dist/mcp-cli.d.ts +6 -0
  752. package/dist/mcp-cli.d.ts.map +1 -0
  753. package/dist/mcp-cli.js +347 -0
  754. package/dist/mcp-cli.js.map +1 -0
  755. package/dist/migrations.d.ts +33 -0
  756. package/dist/migrations.d.ts.map +1 -0
  757. package/dist/migrations.js +281 -0
  758. package/dist/migrations.js.map +1 -0
  759. package/dist/modes/index.d.ts +13 -0
  760. package/dist/modes/index.d.ts.map +1 -0
  761. package/dist/modes/index.js +12 -0
  762. package/dist/modes/index.js.map +1 -0
  763. package/dist/modes/interactive/components/armin.d.ts +34 -0
  764. package/dist/modes/interactive/components/armin.d.ts.map +1 -0
  765. package/dist/modes/interactive/components/armin.js +333 -0
  766. package/dist/modes/interactive/components/armin.js.map +1 -0
  767. package/dist/modes/interactive/components/assistant-message.d.ts +22 -0
  768. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  769. package/dist/modes/interactive/components/assistant-message.js +129 -0
  770. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  771. package/dist/modes/interactive/components/bash-execution.d.ts +39 -0
  772. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  773. package/dist/modes/interactive/components/bash-execution.js +212 -0
  774. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  775. package/dist/modes/interactive/components/bordered-loader.d.ts +17 -0
  776. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  777. package/dist/modes/interactive/components/bordered-loader.js +57 -0
  778. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  779. package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  780. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  781. package/dist/modes/interactive/components/branch-summary-message.js +44 -0
  782. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  783. package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  784. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  785. package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
  786. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  787. package/dist/modes/interactive/components/config-selector.d.ts +71 -0
  788. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  789. package/dist/modes/interactive/components/config-selector.js +510 -0
  790. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  791. package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  792. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  793. package/dist/modes/interactive/components/countdown-timer.js +33 -0
  794. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  795. package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
  796. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  797. package/dist/modes/interactive/components/custom-editor.js +70 -0
  798. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  799. package/dist/modes/interactive/components/custom-message.d.ts +20 -0
  800. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  801. package/dist/modes/interactive/components/custom-message.js +76 -0
  802. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  803. package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
  804. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
  805. package/dist/modes/interactive/components/daxnuts.js +140 -0
  806. package/dist/modes/interactive/components/daxnuts.js.map +1 -0
  807. package/dist/modes/interactive/components/diff.d.ts +12 -0
  808. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  809. package/dist/modes/interactive/components/diff.js +133 -0
  810. package/dist/modes/interactive/components/diff.js.map +1 -0
  811. package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  812. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  813. package/dist/modes/interactive/components/dynamic-border.js +21 -0
  814. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  815. package/dist/modes/interactive/components/extension-editor.d.ts +20 -0
  816. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  817. package/dist/modes/interactive/components/extension-editor.js +116 -0
  818. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  819. package/dist/modes/interactive/components/extension-input.d.ts +23 -0
  820. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  821. package/dist/modes/interactive/components/extension-input.js +61 -0
  822. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  823. package/dist/modes/interactive/components/extension-selector.d.ts +27 -0
  824. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  825. package/dist/modes/interactive/components/extension-selector.js +98 -0
  826. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  827. package/dist/modes/interactive/components/first-time-setup.d.ts +25 -0
  828. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -0
  829. package/dist/modes/interactive/components/first-time-setup.js +103 -0
  830. package/dist/modes/interactive/components/first-time-setup.js.map +1 -0
  831. package/dist/modes/interactive/components/footer.d.ts +27 -0
  832. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  833. package/dist/modes/interactive/components/footer.js +180 -0
  834. package/dist/modes/interactive/components/footer.js.map +1 -0
  835. package/dist/modes/interactive/components/hotkeys.d.ts +24 -0
  836. package/dist/modes/interactive/components/hotkeys.d.ts.map +1 -0
  837. package/dist/modes/interactive/components/hotkeys.js +97 -0
  838. package/dist/modes/interactive/components/hotkeys.js.map +1 -0
  839. package/dist/modes/interactive/components/index.d.ts +35 -0
  840. package/dist/modes/interactive/components/index.d.ts.map +1 -0
  841. package/dist/modes/interactive/components/index.js +36 -0
  842. package/dist/modes/interactive/components/index.js.map +1 -0
  843. package/dist/modes/interactive/components/keybinding-hints.d.ts +19 -0
  844. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
  845. package/dist/modes/interactive/components/keybinding-hints.js +48 -0
  846. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
  847. package/dist/modes/interactive/components/login-dialog.d.ts +52 -0
  848. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
  849. package/dist/modes/interactive/components/login-dialog.js +179 -0
  850. package/dist/modes/interactive/components/login-dialog.js.map +1 -0
  851. package/dist/modes/interactive/components/logo.d.ts +25 -0
  852. package/dist/modes/interactive/components/logo.d.ts.map +1 -0
  853. package/dist/modes/interactive/components/logo.js +89 -0
  854. package/dist/modes/interactive/components/logo.js.map +1 -0
  855. package/dist/modes/interactive/components/model-selector.d.ts +47 -0
  856. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  857. package/dist/modes/interactive/components/model-selector.js +278 -0
  858. package/dist/modes/interactive/components/model-selector.js.map +1 -0
  859. package/dist/modes/interactive/components/oauth-selector.d.ts +31 -0
  860. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
  861. package/dist/modes/interactive/components/oauth-selector.js +165 -0
  862. package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
  863. package/dist/modes/interactive/components/remote-control-center.d.ts +110 -0
  864. package/dist/modes/interactive/components/remote-control-center.d.ts.map +1 -0
  865. package/dist/modes/interactive/components/remote-control-center.js +1217 -0
  866. package/dist/modes/interactive/components/remote-control-center.js.map +1 -0
  867. package/dist/modes/interactive/components/review-tools-selector.d.ts +24 -0
  868. package/dist/modes/interactive/components/review-tools-selector.d.ts.map +1 -0
  869. package/dist/modes/interactive/components/review-tools-selector.js +93 -0
  870. package/dist/modes/interactive/components/review-tools-selector.js.map +1 -0
  871. package/dist/modes/interactive/components/scoped-models-selector.d.ts +42 -0
  872. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  873. package/dist/modes/interactive/components/scoped-models-selector.js +290 -0
  874. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  875. package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  876. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
  877. package/dist/modes/interactive/components/session-selector-search.js +155 -0
  878. package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
  879. package/dist/modes/interactive/components/session-selector.d.ts +95 -0
  880. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  881. package/dist/modes/interactive/components/session-selector.js +856 -0
  882. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  883. package/dist/modes/interactive/components/settings-selector.d.ts +77 -0
  884. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  885. package/dist/modes/interactive/components/settings-selector.js +484 -0
  886. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  887. package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  888. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  889. package/dist/modes/interactive/components/show-images-selector.js +39 -0
  890. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  891. package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  892. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  893. package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
  894. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  895. package/dist/modes/interactive/components/streaming-render-coalescer.d.ts +29 -0
  896. package/dist/modes/interactive/components/streaming-render-coalescer.d.ts.map +1 -0
  897. package/dist/modes/interactive/components/streaming-render-coalescer.js +98 -0
  898. package/dist/modes/interactive/components/streaming-render-coalescer.js.map +1 -0
  899. package/dist/modes/interactive/components/subagent-inspector.d.ts +32 -0
  900. package/dist/modes/interactive/components/subagent-inspector.d.ts.map +1 -0
  901. package/dist/modes/interactive/components/subagent-inspector.js +439 -0
  902. package/dist/modes/interactive/components/subagent-inspector.js.map +1 -0
  903. package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  904. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  905. package/dist/modes/interactive/components/theme-selector.js +50 -0
  906. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  907. package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  908. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  909. package/dist/modes/interactive/components/thinking-selector.js +52 -0
  910. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  911. package/dist/modes/interactive/components/tool-execution.d.ts +83 -0
  912. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  913. package/dist/modes/interactive/components/tool-execution.js +421 -0
  914. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  915. package/dist/modes/interactive/components/tree-selector.d.ts +89 -0
  916. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  917. package/dist/modes/interactive/components/tree-selector.js +1208 -0
  918. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  919. package/dist/modes/interactive/components/trust-selector.d.ts +23 -0
  920. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -0
  921. package/dist/modes/interactive/components/trust-selector.js +91 -0
  922. package/dist/modes/interactive/components/trust-selector.js.map +1 -0
  923. package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  924. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  925. package/dist/modes/interactive/components/user-message-selector.js +114 -0
  926. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  927. package/dist/modes/interactive/components/user-message.d.ts +9 -0
  928. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  929. package/dist/modes/interactive/components/user-message.js +42 -0
  930. package/dist/modes/interactive/components/user-message.js.map +1 -0
  931. package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  932. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  933. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  934. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  935. package/dist/modes/interactive/components/volt-announcement.d.ts +5 -0
  936. package/dist/modes/interactive/components/volt-announcement.d.ts.map +1 -0
  937. package/dist/modes/interactive/components/volt-announcement.js +15 -0
  938. package/dist/modes/interactive/components/volt-announcement.js.map +1 -0
  939. package/dist/modes/interactive/daemon-attach.d.ts +154 -0
  940. package/dist/modes/interactive/daemon-attach.d.ts.map +1 -0
  941. package/dist/modes/interactive/daemon-attach.js +552 -0
  942. package/dist/modes/interactive/daemon-attach.js.map +1 -0
  943. package/dist/modes/interactive/drain-viewer.d.ts +31 -0
  944. package/dist/modes/interactive/drain-viewer.d.ts.map +1 -0
  945. package/dist/modes/interactive/drain-viewer.js +166 -0
  946. package/dist/modes/interactive/drain-viewer.js.map +1 -0
  947. package/dist/modes/interactive/interactive-mode.d.ts +502 -0
  948. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  949. package/dist/modes/interactive/interactive-mode.js +7007 -0
  950. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  951. package/dist/modes/interactive/prompt-image-attachments.d.ts +34 -0
  952. package/dist/modes/interactive/prompt-image-attachments.d.ts.map +1 -0
  953. package/dist/modes/interactive/prompt-image-attachments.js +120 -0
  954. package/dist/modes/interactive/prompt-image-attachments.js.map +1 -0
  955. package/dist/modes/interactive/relay-stream-adapter.d.ts +19 -0
  956. package/dist/modes/interactive/relay-stream-adapter.d.ts.map +1 -0
  957. package/dist/modes/interactive/relay-stream-adapter.js +107 -0
  958. package/dist/modes/interactive/relay-stream-adapter.js.map +1 -0
  959. package/dist/modes/print-mode.d.ts +28 -0
  960. package/dist/modes/print-mode.d.ts.map +1 -0
  961. package/dist/modes/print-mode.js +132 -0
  962. package/dist/modes/print-mode.js.map +1 -0
  963. package/dist/modes/rpc/in-process-rpc-client.d.ts +31 -0
  964. package/dist/modes/rpc/in-process-rpc-client.d.ts.map +1 -0
  965. package/dist/modes/rpc/in-process-rpc-client.js +63 -0
  966. package/dist/modes/rpc/in-process-rpc-client.js.map +1 -0
  967. package/dist/modes/rpc/iroh-remote-agent-runtime.d.ts +61 -0
  968. package/dist/modes/rpc/iroh-remote-agent-runtime.d.ts.map +1 -0
  969. package/dist/modes/rpc/iroh-remote-agent-runtime.js +155 -0
  970. package/dist/modes/rpc/iroh-remote-agent-runtime.js.map +1 -0
  971. package/dist/modes/rpc/iroh-remote-rpc-mode.d.ts +69 -0
  972. package/dist/modes/rpc/iroh-remote-rpc-mode.d.ts.map +1 -0
  973. package/dist/modes/rpc/iroh-remote-rpc-mode.js +1223 -0
  974. package/dist/modes/rpc/iroh-remote-rpc-mode.js.map +1 -0
  975. package/dist/modes/rpc/jsonl.d.ts +2 -0
  976. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  977. package/dist/modes/rpc/jsonl.js +2 -0
  978. package/dist/modes/rpc/jsonl.js.map +1 -0
  979. package/dist/modes/rpc/rpc-client-base.d.ts +209 -0
  980. package/dist/modes/rpc/rpc-client-base.d.ts.map +1 -0
  981. package/dist/modes/rpc/rpc-client-base.js +530 -0
  982. package/dist/modes/rpc/rpc-client-base.js.map +1 -0
  983. package/dist/modes/rpc/rpc-client.d.ts +50 -0
  984. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  985. package/dist/modes/rpc/rpc-client.js +190 -0
  986. package/dist/modes/rpc/rpc-client.js.map +1 -0
  987. package/dist/modes/rpc/rpc-command-dispatcher.d.ts +43 -0
  988. package/dist/modes/rpc/rpc-command-dispatcher.d.ts.map +1 -0
  989. package/dist/modes/rpc/rpc-command-dispatcher.js +613 -0
  990. package/dist/modes/rpc/rpc-command-dispatcher.js.map +1 -0
  991. package/dist/modes/rpc/rpc-command-validation.d.ts +2 -0
  992. package/dist/modes/rpc/rpc-command-validation.d.ts.map +1 -0
  993. package/dist/modes/rpc/rpc-command-validation.js +207 -0
  994. package/dist/modes/rpc/rpc-command-validation.js.map +1 -0
  995. package/dist/modes/rpc/rpc-mode.d.ts +48 -0
  996. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  997. package/dist/modes/rpc/rpc-mode.js +1089 -0
  998. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  999. package/dist/modes/rpc/rpc-transport-client.d.ts +26 -0
  1000. package/dist/modes/rpc/rpc-transport-client.d.ts.map +1 -0
  1001. package/dist/modes/rpc/rpc-transport-client.js +76 -0
  1002. package/dist/modes/rpc/rpc-transport-client.js.map +1 -0
  1003. package/dist/modes/rpc/rpc-types.d.ts +2 -0
  1004. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  1005. package/dist/modes/rpc/rpc-types.js +2 -0
  1006. package/dist/modes/rpc/rpc-types.js.map +1 -0
  1007. package/dist/package-manager-cli.d.ts +28 -0
  1008. package/dist/package-manager-cli.d.ts.map +1 -0
  1009. package/dist/package-manager-cli.js +667 -0
  1010. package/dist/package-manager-cli.js.map +1 -0
  1011. package/dist/remote/integrated-runtime-retention.d.ts +17 -0
  1012. package/dist/remote/integrated-runtime-retention.d.ts.map +1 -0
  1013. package/dist/remote/integrated-runtime-retention.js +62 -0
  1014. package/dist/remote/integrated-runtime-retention.js.map +1 -0
  1015. package/dist/remote/iroh-native-adapter.cjs +19 -0
  1016. package/dist/sea/cli.d.ts +4 -0
  1017. package/dist/sea/cli.d.ts.map +1 -0
  1018. package/dist/sea/cli.js +4 -0
  1019. package/dist/sea/cli.js.map +1 -0
  1020. package/dist/sea/register-bedrock.d.ts +2 -0
  1021. package/dist/sea/register-bedrock.d.ts.map +1 -0
  1022. package/dist/sea/register-bedrock.js +4 -0
  1023. package/dist/sea/register-bedrock.js.map +1 -0
  1024. package/dist/store/catalog.d.ts +57 -0
  1025. package/dist/store/catalog.d.ts.map +1 -0
  1026. package/dist/store/catalog.js +331 -0
  1027. package/dist/store/catalog.js.map +1 -0
  1028. package/dist/store/inspector.d.ts +36 -0
  1029. package/dist/store/inspector.d.ts.map +1 -0
  1030. package/dist/store/inspector.js +578 -0
  1031. package/dist/store/inspector.js.map +1 -0
  1032. package/dist/store/install-plan.d.ts +26 -0
  1033. package/dist/store/install-plan.d.ts.map +1 -0
  1034. package/dist/store/install-plan.js +80 -0
  1035. package/dist/store/install-plan.js.map +1 -0
  1036. package/dist/store/render.d.ts +11 -0
  1037. package/dist/store/render.d.ts.map +1 -0
  1038. package/dist/store/render.js +153 -0
  1039. package/dist/store/render.js.map +1 -0
  1040. package/dist/store/resolver.d.ts +22 -0
  1041. package/dist/store/resolver.d.ts.map +1 -0
  1042. package/dist/store/resolver.js +207 -0
  1043. package/dist/store/resolver.js.map +1 -0
  1044. package/dist/store/store-cli.d.ts +7 -0
  1045. package/dist/store/store-cli.d.ts.map +1 -0
  1046. package/dist/store/store-cli.js +636 -0
  1047. package/dist/store/store-cli.js.map +1 -0
  1048. package/dist/store/targets.d.ts +21 -0
  1049. package/dist/store/targets.d.ts.map +1 -0
  1050. package/dist/store/targets.js +55 -0
  1051. package/dist/store/targets.js.map +1 -0
  1052. package/dist/utils/ansi.d.ts +2 -0
  1053. package/dist/utils/ansi.d.ts.map +1 -0
  1054. package/dist/utils/ansi.js +52 -0
  1055. package/dist/utils/ansi.js.map +1 -0
  1056. package/dist/utils/changelog.d.ts +22 -0
  1057. package/dist/utils/changelog.d.ts.map +1 -0
  1058. package/dist/utils/changelog.js +165 -0
  1059. package/dist/utils/changelog.js.map +1 -0
  1060. package/dist/utils/child-process.d.ts +18 -0
  1061. package/dist/utils/child-process.d.ts.map +1 -0
  1062. package/dist/utils/child-process.js +106 -0
  1063. package/dist/utils/child-process.js.map +1 -0
  1064. package/dist/utils/clipboard-image.d.ts +11 -0
  1065. package/dist/utils/clipboard-image.d.ts.map +1 -0
  1066. package/dist/utils/clipboard-image.js +245 -0
  1067. package/dist/utils/clipboard-image.js.map +1 -0
  1068. package/dist/utils/clipboard.d.ts +2 -0
  1069. package/dist/utils/clipboard.d.ts.map +1 -0
  1070. package/dist/utils/clipboard.js +94 -0
  1071. package/dist/utils/clipboard.js.map +1 -0
  1072. package/dist/utils/deprecation.d.ts +4 -0
  1073. package/dist/utils/deprecation.d.ts.map +1 -0
  1074. package/dist/utils/deprecation.js +13 -0
  1075. package/dist/utils/deprecation.js.map +1 -0
  1076. package/dist/utils/durable-atomic-write.d.ts +46 -0
  1077. package/dist/utils/durable-atomic-write.d.ts.map +1 -0
  1078. package/dist/utils/durable-atomic-write.js +104 -0
  1079. package/dist/utils/durable-atomic-write.js.map +1 -0
  1080. package/dist/utils/frontmatter.d.ts +8 -0
  1081. package/dist/utils/frontmatter.d.ts.map +1 -0
  1082. package/dist/utils/frontmatter.js +26 -0
  1083. package/dist/utils/frontmatter.js.map +1 -0
  1084. package/dist/utils/fs-watch.d.ts +5 -0
  1085. package/dist/utils/fs-watch.d.ts.map +1 -0
  1086. package/dist/utils/fs-watch.js +25 -0
  1087. package/dist/utils/fs-watch.js.map +1 -0
  1088. package/dist/utils/git.d.ts +26 -0
  1089. package/dist/utils/git.d.ts.map +1 -0
  1090. package/dist/utils/git.js +195 -0
  1091. package/dist/utils/git.js.map +1 -0
  1092. package/dist/utils/html.d.ts +7 -0
  1093. package/dist/utils/html.d.ts.map +1 -0
  1094. package/dist/utils/html.js +40 -0
  1095. package/dist/utils/html.js.map +1 -0
  1096. package/dist/utils/ignore-files.d.ts +5 -0
  1097. package/dist/utils/ignore-files.d.ts.map +1 -0
  1098. package/dist/utils/ignore-files.js +58 -0
  1099. package/dist/utils/ignore-files.js.map +1 -0
  1100. package/dist/utils/image-codec.d.ts +22 -0
  1101. package/dist/utils/image-codec.d.ts.map +1 -0
  1102. package/dist/utils/image-codec.js +35 -0
  1103. package/dist/utils/image-codec.js.map +1 -0
  1104. package/dist/utils/image-convert.d.ts +9 -0
  1105. package/dist/utils/image-convert.d.ts.map +1 -0
  1106. package/dist/utils/image-convert.js +26 -0
  1107. package/dist/utils/image-convert.js.map +1 -0
  1108. package/dist/utils/image-resize-core.d.ts +31 -0
  1109. package/dist/utils/image-resize-core.d.ts.map +1 -0
  1110. package/dist/utils/image-resize-core.js +181 -0
  1111. package/dist/utils/image-resize-core.js.map +1 -0
  1112. package/dist/utils/image-resize-worker.d.ts +2 -0
  1113. package/dist/utils/image-resize-worker.d.ts.map +1 -0
  1114. package/dist/utils/image-resize-worker.js +31 -0
  1115. package/dist/utils/image-resize-worker.js.map +1 -0
  1116. package/dist/utils/image-resize.d.ts +15 -0
  1117. package/dist/utils/image-resize.d.ts.map +1 -0
  1118. package/dist/utils/image-resize.js +92 -0
  1119. package/dist/utils/image-resize.js.map +1 -0
  1120. package/dist/utils/json.d.ts +3 -0
  1121. package/dist/utils/json.d.ts.map +1 -0
  1122. package/dist/utils/json.js +7 -0
  1123. package/dist/utils/json.js.map +1 -0
  1124. package/dist/utils/mime.d.ts +3 -0
  1125. package/dist/utils/mime.d.ts.map +1 -0
  1126. package/dist/utils/mime.js +69 -0
  1127. package/dist/utils/mime.js.map +1 -0
  1128. package/dist/utils/npm-spec.d.ts +9 -0
  1129. package/dist/utils/npm-spec.d.ts.map +1 -0
  1130. package/dist/utils/npm-spec.js +15 -0
  1131. package/dist/utils/npm-spec.js.map +1 -0
  1132. package/dist/utils/open-browser.d.ts +9 -0
  1133. package/dist/utils/open-browser.d.ts.map +1 -0
  1134. package/dist/utils/open-browser.js +22 -0
  1135. package/dist/utils/open-browser.js.map +1 -0
  1136. package/dist/utils/paths.d.ts +31 -0
  1137. package/dist/utils/paths.d.ts.map +1 -0
  1138. package/dist/utils/paths.js +92 -0
  1139. package/dist/utils/paths.js.map +1 -0
  1140. package/dist/utils/private-files.d.ts +21 -0
  1141. package/dist/utils/private-files.d.ts.map +1 -0
  1142. package/dist/utils/private-files.js +103 -0
  1143. package/dist/utils/private-files.js.map +1 -0
  1144. package/dist/utils/process-env.d.ts +2 -0
  1145. package/dist/utils/process-env.d.ts.map +1 -0
  1146. package/dist/utils/process-env.js +31 -0
  1147. package/dist/utils/process-env.js.map +1 -0
  1148. package/dist/utils/shell.d.ts +30 -0
  1149. package/dist/utils/shell.d.ts.map +1 -0
  1150. package/dist/utils/shell.js +195 -0
  1151. package/dist/utils/shell.js.map +1 -0
  1152. package/dist/utils/sleep.d.ts +5 -0
  1153. package/dist/utils/sleep.d.ts.map +1 -0
  1154. package/dist/utils/sleep.js +17 -0
  1155. package/dist/utils/sleep.js.map +1 -0
  1156. package/dist/utils/syntax-highlight.d.ts +18 -0
  1157. package/dist/utils/syntax-highlight.d.ts.map +1 -0
  1158. package/dist/utils/syntax-highlight.js +139 -0
  1159. package/dist/utils/syntax-highlight.js.map +1 -0
  1160. package/dist/utils/tools-manager.d.ts +3 -0
  1161. package/dist/utils/tools-manager.d.ts.map +1 -0
  1162. package/dist/utils/tools-manager.js +328 -0
  1163. package/dist/utils/tools-manager.js.map +1 -0
  1164. package/dist/utils/version-check.d.ts +15 -0
  1165. package/dist/utils/version-check.d.ts.map +1 -0
  1166. package/dist/utils/version-check.js +61 -0
  1167. package/dist/utils/version-check.js.map +1 -0
  1168. package/dist/utils/volt-user-agent.d.ts +2 -0
  1169. package/dist/utils/volt-user-agent.d.ts.map +1 -0
  1170. package/dist/utils/volt-user-agent.js +5 -0
  1171. package/dist/utils/volt-user-agent.js.map +1 -0
  1172. package/dist/utils/windows-self-update.d.ts +3 -0
  1173. package/dist/utils/windows-self-update.d.ts.map +1 -0
  1174. package/dist/utils/windows-self-update.js +77 -0
  1175. package/dist/utils/windows-self-update.js.map +1 -0
  1176. package/docs/compaction.md +394 -0
  1177. package/docs/containerization.md +111 -0
  1178. package/docs/custom-provider.md +737 -0
  1179. package/docs/daemon.md +190 -0
  1180. package/docs/development.md +70 -0
  1181. package/docs/docs.json +176 -0
  1182. package/docs/extensions.md +2692 -0
  1183. package/docs/images/exy.png +0 -0
  1184. package/docs/images/interactive-mode.png +0 -0
  1185. package/docs/images/tree-view.png +0 -0
  1186. package/docs/index.md +82 -0
  1187. package/docs/iroh-remote-access-design.md +340 -0
  1188. package/docs/iroh-remote-protocol.md +431 -0
  1189. package/docs/json.md +87 -0
  1190. package/docs/keybindings.md +200 -0
  1191. package/docs/live-shared-session-daemon-design.md +1090 -0
  1192. package/docs/lsp.md +143 -0
  1193. package/docs/mcp.md +1044 -0
  1194. package/docs/models.md +495 -0
  1195. package/docs/packages.md +230 -0
  1196. package/docs/prompt-templates.md +108 -0
  1197. package/docs/providers.md +274 -0
  1198. package/docs/quickstart.md +165 -0
  1199. package/docs/rpc.md +2050 -0
  1200. package/docs/sdk.md +1267 -0
  1201. package/docs/security.md +139 -0
  1202. package/docs/session-format.md +412 -0
  1203. package/docs/sessions.md +145 -0
  1204. package/docs/settings.md +371 -0
  1205. package/docs/shell-aliases.md +13 -0
  1206. package/docs/skills.md +243 -0
  1207. package/docs/subagents-design.md +419 -0
  1208. package/docs/terminal-setup.md +148 -0
  1209. package/docs/termux.md +127 -0
  1210. package/docs/themes.md +295 -0
  1211. package/docs/tla/ClientAuth.cfg +16 -0
  1212. package/docs/tla/ClientAuth.tla +205 -0
  1213. package/docs/tla/ClientConn.cfg +16 -0
  1214. package/docs/tla/ClientConn.tla +265 -0
  1215. package/docs/tla/LeaseBroker.cfg +43 -0
  1216. package/docs/tla/LeaseBroker.tla +563 -0
  1217. package/docs/tla/PLAN.md +240 -0
  1218. package/docs/tla/PushOrdering.cfg +17 -0
  1219. package/docs/tla/PushOrdering.tla +183 -0
  1220. package/docs/tla/README.md +205 -0
  1221. package/docs/tla/RelayViewer.cfg +26 -0
  1222. package/docs/tla/RelayViewer.tla +299 -0
  1223. package/docs/tla/SessionTarget.cfg +18 -0
  1224. package/docs/tla/SessionTarget.tla +192 -0
  1225. package/docs/tla/check.sh +34 -0
  1226. package/docs/tmux.md +63 -0
  1227. package/docs/tui.md +949 -0
  1228. package/docs/usage.md +482 -0
  1229. package/docs/windows.md +17 -0
  1230. package/docs/worktrees-design.md +605 -0
  1231. package/examples/README.md +28 -0
  1232. package/examples/extensions/README.md +211 -0
  1233. package/examples/extensions/auto-commit-on-exit.ts +49 -0
  1234. package/examples/extensions/bash-spawn-hook.ts +30 -0
  1235. package/examples/extensions/bookmark.ts +50 -0
  1236. package/examples/extensions/border-status-editor.ts +150 -0
  1237. package/examples/extensions/built-in-tool-renderer.ts +249 -0
  1238. package/examples/extensions/claude-rules.ts +86 -0
  1239. package/examples/extensions/commands.ts +72 -0
  1240. package/examples/extensions/confirm-destructive.ts +59 -0
  1241. package/examples/extensions/custom-compaction.ts +127 -0
  1242. package/examples/extensions/custom-footer.ts +64 -0
  1243. package/examples/extensions/custom-header.ts +72 -0
  1244. package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
  1245. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  1246. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  1247. package/examples/extensions/custom-provider-gitlab-duo/index.ts +400 -0
  1248. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  1249. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  1250. package/examples/extensions/dirty-repo-guard.ts +56 -0
  1251. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  1252. package/examples/extensions/dynamic-resources/dynamic.json +79 -0
  1253. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  1254. package/examples/extensions/dynamic-resources/index.ts +15 -0
  1255. package/examples/extensions/dynamic-tools.ts +74 -0
  1256. package/examples/extensions/event-bus.ts +43 -0
  1257. package/examples/extensions/file-trigger.ts +41 -0
  1258. package/examples/extensions/git-checkpoint.ts +53 -0
  1259. package/examples/extensions/git-merge-and-resolve.ts +115 -0
  1260. package/examples/extensions/github-issue-autocomplete.ts +185 -0
  1261. package/examples/extensions/gondolin/index.ts +531 -0
  1262. package/examples/extensions/gondolin/package-lock.json +185 -0
  1263. package/examples/extensions/gondolin/package.json +19 -0
  1264. package/examples/extensions/handoff.ts +191 -0
  1265. package/examples/extensions/hello.ts +26 -0
  1266. package/examples/extensions/hidden-thinking-label.ts +53 -0
  1267. package/examples/extensions/inline-bash.ts +94 -0
  1268. package/examples/extensions/input-transform-streaming.ts +39 -0
  1269. package/examples/extensions/input-transform.ts +43 -0
  1270. package/examples/extensions/interactive-shell.ts +196 -0
  1271. package/examples/extensions/mac-system-theme.ts +47 -0
  1272. package/examples/extensions/message-renderer.ts +59 -0
  1273. package/examples/extensions/minimal-mode.ts +426 -0
  1274. package/examples/extensions/modal-editor.ts +85 -0
  1275. package/examples/extensions/model-status.ts +31 -0
  1276. package/examples/extensions/notify.ts +55 -0
  1277. package/examples/extensions/overlay-qa-tests.ts +1450 -0
  1278. package/examples/extensions/overlay-test.ts +153 -0
  1279. package/examples/extensions/permission-gate.ts +34 -0
  1280. package/examples/extensions/pirate.ts +47 -0
  1281. package/examples/extensions/plan-mode/README.md +65 -0
  1282. package/examples/extensions/plan-mode/index.ts +340 -0
  1283. package/examples/extensions/plan-mode/utils.ts +168 -0
  1284. package/examples/extensions/preset.ts +436 -0
  1285. package/examples/extensions/project-trust.ts +64 -0
  1286. package/examples/extensions/prompt-customizer.ts +97 -0
  1287. package/examples/extensions/protected-paths.ts +30 -0
  1288. package/examples/extensions/provider-payload.ts +18 -0
  1289. package/examples/extensions/qna.ts +122 -0
  1290. package/examples/extensions/question.ts +277 -0
  1291. package/examples/extensions/questionnaire.ts +440 -0
  1292. package/examples/extensions/rainbow-editor.ts +88 -0
  1293. package/examples/extensions/reload-runtime.ts +37 -0
  1294. package/examples/extensions/rpc-demo.ts +118 -0
  1295. package/examples/extensions/sandbox/index.ts +321 -0
  1296. package/examples/extensions/sandbox/package-lock.json +92 -0
  1297. package/examples/extensions/sandbox/package.json +19 -0
  1298. package/examples/extensions/send-user-message.ts +97 -0
  1299. package/examples/extensions/session-name.ts +27 -0
  1300. package/examples/extensions/shutdown-command.ts +63 -0
  1301. package/examples/extensions/snake.ts +343 -0
  1302. package/examples/extensions/space-invaders.ts +560 -0
  1303. package/examples/extensions/ssh.ts +220 -0
  1304. package/examples/extensions/status-line.ts +32 -0
  1305. package/examples/extensions/structured-output.ts +65 -0
  1306. package/examples/extensions/subagent/README.md +175 -0
  1307. package/examples/extensions/subagent/agents/planner.md +37 -0
  1308. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  1309. package/examples/extensions/subagent/agents/scout.md +50 -0
  1310. package/examples/extensions/subagent/agents/worker.md +24 -0
  1311. package/examples/extensions/subagent/agents.ts +126 -0
  1312. package/examples/extensions/subagent/index.ts +1009 -0
  1313. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  1314. package/examples/extensions/subagent/prompts/implement.md +10 -0
  1315. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  1316. package/examples/extensions/summarize.ts +206 -0
  1317. package/examples/extensions/system-prompt-header.ts +17 -0
  1318. package/examples/extensions/tic-tac-toe.ts +1008 -0
  1319. package/examples/extensions/timed-confirm.ts +70 -0
  1320. package/examples/extensions/titlebar-spinner.ts +58 -0
  1321. package/examples/extensions/todo.ts +297 -0
  1322. package/examples/extensions/tool-override.ts +144 -0
  1323. package/examples/extensions/tools.ts +146 -0
  1324. package/examples/extensions/trigger-compact.ts +50 -0
  1325. package/examples/extensions/truncated-tool.ts +195 -0
  1326. package/examples/extensions/widget-placement.ts +9 -0
  1327. package/examples/extensions/with-deps/index.ts +32 -0
  1328. package/examples/extensions/with-deps/package-lock.json +31 -0
  1329. package/examples/extensions/with-deps/package.json +22 -0
  1330. package/examples/extensions/working-indicator.ts +123 -0
  1331. package/examples/extensions/working-message-test.ts +25 -0
  1332. package/examples/remote/firebase-push-relay/README.md +79 -0
  1333. package/examples/remote/firebase-push-relay/firebase.json +12 -0
  1334. package/examples/remote/firebase-push-relay/firestore.indexes.json +11 -0
  1335. package/examples/remote/firebase-push-relay/firestore.rules +9 -0
  1336. package/examples/remote/firebase-push-relay/functions/core.js +511 -0
  1337. package/examples/remote/firebase-push-relay/functions/core.test.js +273 -0
  1338. package/examples/remote/firebase-push-relay/functions/index.js +413 -0
  1339. package/examples/remote/firebase-push-relay/functions/package-lock.json +2974 -0
  1340. package/examples/remote/firebase-push-relay/functions/package.json +18 -0
  1341. package/examples/remote/iroh-sidecar/README.md +211 -0
  1342. package/examples/remote/iroh-sidecar/client.mjs +554 -0
  1343. package/examples/remote/iroh-sidecar/common.mjs +195 -0
  1344. package/examples/remote/iroh-sidecar/host.mjs +4 -0
  1345. package/examples/remote/iroh-sidecar/package-lock.json +213 -0
  1346. package/examples/remote/iroh-sidecar/package.json +13 -0
  1347. package/examples/remote/iroh-sidecar/source-aware-run.mjs +41 -0
  1348. package/examples/rpc-extension-ui.ts +632 -0
  1349. package/examples/sdk/01-minimal.ts +26 -0
  1350. package/examples/sdk/02-custom-model.ts +53 -0
  1351. package/examples/sdk/03-custom-prompt.ts +70 -0
  1352. package/examples/sdk/04-skills.ts +55 -0
  1353. package/examples/sdk/05-tools.ts +48 -0
  1354. package/examples/sdk/06-extensions.ts +94 -0
  1355. package/examples/sdk/07-context-files.ts +42 -0
  1356. package/examples/sdk/08-prompt-templates.ts +51 -0
  1357. package/examples/sdk/09-api-keys-and-oauth.ts +52 -0
  1358. package/examples/sdk/10-settings.ts +53 -0
  1359. package/examples/sdk/11-sessions.ts +52 -0
  1360. package/examples/sdk/12-full-control.ts +78 -0
  1361. package/examples/sdk/13-session-runtime.ts +67 -0
  1362. package/examples/sdk/README.md +147 -0
  1363. package/npm-shrinkwrap.json +3442 -0
  1364. package/package.json +125 -19
@@ -0,0 +1,63 @@
1
+ import { createLoopbackRpcTransportPair } from "../../core/rpc/index.js";
2
+ import { runRpcMode } from "./rpc-mode.js";
3
+ import { RpcTransportClient } from "./rpc-transport-client.js";
4
+ /**
5
+ * RPC client backed by runRpcMode in the same Node.js process.
6
+ *
7
+ * stop() closes the client transport and waits for RPC mode shutdown. By default
8
+ * shutdown also disposes the supplied AgentSessionRuntime.
9
+ */
10
+ export class InProcessRpcClient extends RpcTransportClient {
11
+ modeClosed;
12
+ modeReady;
13
+ constructor(options) {
14
+ const pair = createLoopbackRpcTransportPair();
15
+ super({ transport: pair.client, requestTimeoutMs: options.requestTimeoutMs });
16
+ const initialEventListener = options.onEvent;
17
+ if (initialEventListener) {
18
+ this.onEvent((event) => {
19
+ initialEventListener(event, this);
20
+ });
21
+ }
22
+ let readySettled = false;
23
+ let resolveReady = () => { };
24
+ let rejectReady = () => { };
25
+ this.modeReady = new Promise((resolve, reject) => {
26
+ resolveReady = () => {
27
+ readySettled = true;
28
+ resolve();
29
+ };
30
+ rejectReady = (error) => {
31
+ readySettled = true;
32
+ reject(error);
33
+ };
34
+ });
35
+ void this.modeReady.catch(() => { });
36
+ this.modeClosed = runRpcMode(options.runtimeHost, {
37
+ transport: pair.server,
38
+ disposeRuntimeOnClose: options.disposeRuntimeOnClose,
39
+ exitProcess: false,
40
+ onReady: resolveReady,
41
+ });
42
+ void this.modeClosed.catch((error) => {
43
+ if (!readySettled) {
44
+ rejectReady(error);
45
+ }
46
+ void pair.server.close();
47
+ });
48
+ }
49
+ async start() {
50
+ await super.start();
51
+ await this.modeReady;
52
+ }
53
+ async stop() {
54
+ await super.stop();
55
+ await this.modeClosed;
56
+ }
57
+ }
58
+ export async function createInProcessRpcClient(runtimeHost, options = {}) {
59
+ const client = new InProcessRpcClient({ runtimeHost, ...options });
60
+ await client.start();
61
+ return client;
62
+ }
63
+ //# sourceMappingURL=in-process-rpc-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-process-rpc-client.js","sourceRoot":"","sources":["../../../src/modes/rpc/in-process-rpc-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AAEzE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAiB/D;;;;;GAKG;AACH,MAAM,OAAO,kBAAmB,SAAQ,kBAAkB;IACxC,UAAU,CAAgB;IAC1B,SAAS,CAAgB;IAE1C,YAAY,OAA6C,EAAE;QAC1D,MAAM,IAAI,GAAG,8BAA8B,EAAE,CAAC;QAC9C,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAE9E,MAAM,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;QAC7C,IAAI,oBAAoB,EAAE,CAAC;YAC1B,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;gBACvB,oBAAoB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAAA,CAClC,CAAC,CAAC;QACJ,CAAC;QAED,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,IAAI,YAAY,GAAe,GAAG,EAAE,CAAC,EAAC,CAAC,CAAC;QACxC,IAAI,WAAW,GAA6B,GAAG,EAAE,CAAC,EAAC,CAAC,CAAC;QACrD,IAAI,CAAC,SAAS,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;YACvD,YAAY,GAAG,GAAG,EAAE,CAAC;gBACpB,YAAY,GAAG,IAAI,CAAC;gBACpB,OAAO,EAAE,CAAC;YAAA,CACV,CAAC;YACF,WAAW,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;gBACxB,YAAY,GAAG,IAAI,CAAC;gBACpB,MAAM,CAAC,KAAK,CAAC,CAAC;YAAA,CACd,CAAC;QAAA,CACF,CAAC,CAAC;QACH,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;QAEpC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE;YACjD,SAAS,EAAE,IAAI,CAAC,MAAM;YACtB,qBAAqB,EAAE,OAAO,CAAC,qBAAqB;YACpD,WAAW,EAAE,KAAK;YAClB,OAAO,EAAE,YAAY;SACrB,CAAC,CAAC;QACH,KAAK,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE,CAAC;YAC9C,IAAI,CAAC,YAAY,EAAE,CAAC;gBACnB,WAAW,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;YACD,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAAA,CACzB,CAAC,CAAC;IAAA,CACH;IAED,KAAK,CAAC,KAAK,GAAkB;QAC5B,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QACpB,MAAM,IAAI,CAAC,SAAS,CAAC;IAAA,CACrB;IAED,KAAK,CAAC,IAAI,GAAkB;QAC3B,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,IAAI,CAAC,UAAU,CAAC;IAAA,CACtB;CACD;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC7C,WAAgC,EAChC,OAAO,GAA8B,EAAE,EACT;IAC9B,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,EAAE,WAAW,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACnE,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACrB,OAAO,MAAM,CAAC;AAAA,CACd","sourcesContent":["import type { AgentSessionRuntime } from \"../../core/agent-session-runtime.ts\";\nimport { createLoopbackRpcTransportPair } from \"../../core/rpc/index.ts\";\nimport type { RpcClientEvent } from \"./rpc-client-base.ts\";\nimport { runRpcMode } from \"./rpc-mode.ts\";\nimport { RpcTransportClient } from \"./rpc-transport-client.ts\";\n\nexport type InProcessRpcClientEventListener = (event: RpcClientEvent, client: InProcessRpcClient) => void;\n\nexport interface InProcessRpcClientOptions {\n\t/** Milliseconds to wait for a command response. Defaults to 30 seconds. */\n\trequestTimeoutMs?: number;\n\t/** Defaults to true. Set false when another owner retains the runtime after this loopback client stops. */\n\tdisposeRuntimeOnClose?: boolean;\n\t/** Initial event listener registered before startup completes. */\n\tonEvent?: InProcessRpcClientEventListener;\n}\n\ninterface InProcessRpcClientConstructorOptions extends InProcessRpcClientOptions {\n\truntimeHost: AgentSessionRuntime;\n}\n\n/**\n * RPC client backed by runRpcMode in the same Node.js process.\n *\n * stop() closes the client transport and waits for RPC mode shutdown. By default\n * shutdown also disposes the supplied AgentSessionRuntime.\n */\nexport class InProcessRpcClient extends RpcTransportClient {\n\tprivate readonly modeClosed: Promise<void>;\n\tprivate readonly modeReady: Promise<void>;\n\n\tconstructor(options: InProcessRpcClientConstructorOptions) {\n\t\tconst pair = createLoopbackRpcTransportPair();\n\t\tsuper({ transport: pair.client, requestTimeoutMs: options.requestTimeoutMs });\n\n\t\tconst initialEventListener = options.onEvent;\n\t\tif (initialEventListener) {\n\t\t\tthis.onEvent((event) => {\n\t\t\t\tinitialEventListener(event, this);\n\t\t\t});\n\t\t}\n\n\t\tlet readySettled = false;\n\t\tlet resolveReady: () => void = () => {};\n\t\tlet rejectReady: (error: unknown) => void = () => {};\n\t\tthis.modeReady = new Promise<void>((resolve, reject) => {\n\t\t\tresolveReady = () => {\n\t\t\t\treadySettled = true;\n\t\t\t\tresolve();\n\t\t\t};\n\t\t\trejectReady = (error) => {\n\t\t\t\treadySettled = true;\n\t\t\t\treject(error);\n\t\t\t};\n\t\t});\n\t\tvoid this.modeReady.catch(() => {});\n\n\t\tthis.modeClosed = runRpcMode(options.runtimeHost, {\n\t\t\ttransport: pair.server,\n\t\t\tdisposeRuntimeOnClose: options.disposeRuntimeOnClose,\n\t\t\texitProcess: false,\n\t\t\tonReady: resolveReady,\n\t\t});\n\t\tvoid this.modeClosed.catch((error: unknown) => {\n\t\t\tif (!readySettled) {\n\t\t\t\trejectReady(error);\n\t\t\t}\n\t\t\tvoid pair.server.close();\n\t\t});\n\t}\n\n\tasync start(): Promise<void> {\n\t\tawait super.start();\n\t\tawait this.modeReady;\n\t}\n\n\tasync stop(): Promise<void> {\n\t\tawait super.stop();\n\t\tawait this.modeClosed;\n\t}\n}\n\nexport async function createInProcessRpcClient(\n\truntimeHost: AgentSessionRuntime,\n\toptions: InProcessRpcClientOptions = {},\n): Promise<InProcessRpcClient> {\n\tconst client = new InProcessRpcClient({ runtimeHost, ...options });\n\tawait client.start();\n\treturn client;\n}\n"]}
@@ -0,0 +1,61 @@
1
+ import { type AgentSessionRuntime } from "../../core/agent-session-runtime.ts";
2
+ import { type IrohRemoteRuntimeToolPolicy } from "../../core/remote/iroh/index.ts";
3
+ import { type SessionManager } from "../../core/session-manager.ts";
4
+ import { type SubagentRuntimeCreatedEvent } from "../../core/subagents/index.ts";
5
+ import { type ResolvedSessionTargetWithManager } from "../../daemon/session-target.ts";
6
+ export interface IrohRemoteAgentRuntimeOptions {
7
+ /** Legacy unresolved grant used by direct callers. Daemon runtimes pass toolPolicy instead. */
8
+ allowTools?: string;
9
+ /** Pre-composed client/workspace/daemon policy. Preserves an explicit deny-all. */
10
+ toolPolicy?: IrohRemoteRuntimeToolPolicy;
11
+ agentDir?: string;
12
+ conversationTarget?: IrohRemoteAgentRuntimeConversationTarget;
13
+ /** Runtime working directory for tools/session state. */
14
+ cwd: string;
15
+ /** Project/config root for .volt resources. Defaults to cwd. */
16
+ projectCwd?: string;
17
+ onSubagentRuntimeCreated?: (event: IrohRemoteSubagentRuntimeCreatedEvent) => void | Promise<void>;
18
+ profile?: string;
19
+ projectTrusted?: boolean;
20
+ /** Pre-resolved session target (daemon path); skips internal target resolution. */
21
+ resolvedSessionTarget?: ResolvedSessionTargetWithManager<SessionManager>;
22
+ resumeSessionId?: string;
23
+ sessionDir?: string;
24
+ /** Validate the resolved session cwd before services/tools are created. */
25
+ validateCwd?: (cwd: string) => Promise<void> | void;
26
+ }
27
+ export interface IrohRemoteSubagentRuntimeCreatedEvent extends SubagentRuntimeCreatedEvent {
28
+ parentSessionId: string;
29
+ parentSessionFile?: string;
30
+ }
31
+ export type IrohRemoteAgentRuntimeConversationTarget = {
32
+ target: "last";
33
+ resumeSessionId?: string;
34
+ } | {
35
+ target: "new";
36
+ } | {
37
+ target: "session";
38
+ sessionId: string;
39
+ };
40
+ export type IrohRemoteAgentRuntimeSessionSelection = {
41
+ kind: "created";
42
+ sessionFile?: string;
43
+ sessionId: string;
44
+ } | {
45
+ kind: "created_after_missing";
46
+ requestedSessionId: string;
47
+ sessionFile?: string;
48
+ sessionId: string;
49
+ } | {
50
+ kind: "resumed";
51
+ requestedSessionId: string;
52
+ sessionFile?: string;
53
+ sessionId: string;
54
+ };
55
+ export interface IrohRemoteAgentRuntimeResult {
56
+ runtime: AgentSessionRuntime;
57
+ sessionSelection: IrohRemoteAgentRuntimeSessionSelection;
58
+ }
59
+ export declare function createIrohRemoteAgentRuntime(options: IrohRemoteAgentRuntimeOptions): Promise<AgentSessionRuntime>;
60
+ export declare function createIrohRemoteAgentRuntimeWithSessionSelection(options: IrohRemoteAgentRuntimeOptions): Promise<IrohRemoteAgentRuntimeResult>;
61
+ //# sourceMappingURL=iroh-remote-agent-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iroh-remote-agent-runtime.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/iroh-remote-agent-runtime.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,KAAK,mBAAmB,EAGxB,MAAM,qCAAqC,CAAC;AAK7C,OAAO,EACN,KAAK,2BAA2B,EAGhC,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE1F,OAAO,EAAmB,KAAK,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAClG,OAAO,EAGN,KAAK,gCAAgC,EAErC,MAAM,gCAAgC,CAAC;AAIxC,MAAM,WAAW,6BAA6B;IAC7C,+FAA+F;IAC/F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mFAAmF;IACnF,UAAU,CAAC,EAAE,2BAA2B,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,wCAAwC,CAAC;IAC9D,yDAAyD;IACzD,GAAG,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wBAAwB,CAAC,EAAE,CAAC,KAAK,EAAE,qCAAqC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClG,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mFAAmF;IACnF,qBAAqB,CAAC,EAAE,gCAAgC,CAAC,cAAc,CAAC,CAAC;IACzE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACpD;AAED,MAAM,WAAW,qCAAsC,SAAQ,2BAA2B;IACzF,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,wCAAwC,GACjD;IACA,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;CACxB,GACD;IACA,MAAM,EAAE,KAAK,CAAC;CACb,GACD;IACA,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACjB,CAAC;AAEL,MAAM,MAAM,sCAAsC,GAC/C;IACA,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACjB,GACD;IACA,IAAI,EAAE,uBAAuB,CAAC;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACjB,GACD;IACA,IAAI,EAAE,SAAS,CAAC;IAChB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACjB,CAAC;AAEL,MAAM,WAAW,4BAA4B;IAC5C,OAAO,EAAE,mBAAmB,CAAC;IAC7B,gBAAgB,EAAE,sCAAsC,CAAC;CACzD;AAED,wBAAsB,4BAA4B,CACjD,OAAO,EAAE,6BAA6B,GACpC,OAAO,CAAC,mBAAmB,CAAC,CAE9B;AAED,wBAAsB,gDAAgD,CACrE,OAAO,EAAE,6BAA6B,GACpC,OAAO,CAAC,4BAA4B,CAAC,CA6EvC","sourcesContent":["import { join } from \"node:path\";\nimport { ENV_AGENT_DIR, getAgentDir } from \"../../config.ts\";\nimport {\n\ttype AgentSessionRuntime,\n\ttype CreateAgentSessionRuntimeFactory,\n\tcreateAgentSessionRuntime,\n} from \"../../core/agent-session-runtime.ts\";\nimport { createAgentSessionFromServices, createAgentSessionServices } from \"../../core/agent-session-services.ts\";\nimport { formatNoModelsAvailableMessage } from \"../../core/auth-guidance.ts\";\nimport { AuthStorage } from \"../../core/auth-storage.ts\";\nimport { applyHttpProxySettings, configureHttpDispatcher } from \"../../core/http-dispatcher.ts\";\nimport {\n\ttype IrohRemoteRuntimeToolPolicy,\n\tparseIrohRemoteAllowTools,\n\tusesDefaultIrohRemoteAllowTools,\n} from \"../../core/remote/iroh/index.ts\";\nimport { getDefaultSessionDir, type SessionManager } from \"../../core/session-manager.ts\";\nimport { SettingsManager } from \"../../core/settings-manager.ts\";\nimport { SubagentManager, type SubagentRuntimeCreatedEvent } from \"../../core/subagents/index.ts\";\nimport {\n\tcreateSessionManagerTargetStore,\n\ttype IrohRemoteSessionTarget,\n\ttype ResolvedSessionTargetWithManager,\n\tresolveIrohRemoteSessionTarget,\n} from \"../../daemon/session-target.ts\";\nimport { runMigrations } from \"../../migrations.ts\";\nimport { resolvePath } from \"../../utils/paths.ts\";\n\nexport interface IrohRemoteAgentRuntimeOptions {\n\t/** Legacy unresolved grant used by direct callers. Daemon runtimes pass toolPolicy instead. */\n\tallowTools?: string;\n\t/** Pre-composed client/workspace/daemon policy. Preserves an explicit deny-all. */\n\ttoolPolicy?: IrohRemoteRuntimeToolPolicy;\n\tagentDir?: string;\n\tconversationTarget?: IrohRemoteAgentRuntimeConversationTarget;\n\t/** Runtime working directory for tools/session state. */\n\tcwd: string;\n\t/** Project/config root for .volt resources. Defaults to cwd. */\n\tprojectCwd?: string;\n\tonSubagentRuntimeCreated?: (event: IrohRemoteSubagentRuntimeCreatedEvent) => void | Promise<void>;\n\tprofile?: string;\n\tprojectTrusted?: boolean;\n\t/** Pre-resolved session target (daemon path); skips internal target resolution. */\n\tresolvedSessionTarget?: ResolvedSessionTargetWithManager<SessionManager>;\n\tresumeSessionId?: string;\n\tsessionDir?: string;\n\t/** Validate the resolved session cwd before services/tools are created. */\n\tvalidateCwd?: (cwd: string) => Promise<void> | void;\n}\n\nexport interface IrohRemoteSubagentRuntimeCreatedEvent extends SubagentRuntimeCreatedEvent {\n\tparentSessionId: string;\n\tparentSessionFile?: string;\n}\n\nexport type IrohRemoteAgentRuntimeConversationTarget =\n\t| {\n\t\t\ttarget: \"last\";\n\t\t\tresumeSessionId?: string;\n\t }\n\t| {\n\t\t\ttarget: \"new\";\n\t }\n\t| {\n\t\t\ttarget: \"session\";\n\t\t\tsessionId: string;\n\t };\n\nexport type IrohRemoteAgentRuntimeSessionSelection =\n\t| {\n\t\t\tkind: \"created\";\n\t\t\tsessionFile?: string;\n\t\t\tsessionId: string;\n\t }\n\t| {\n\t\t\tkind: \"created_after_missing\";\n\t\t\trequestedSessionId: string;\n\t\t\tsessionFile?: string;\n\t\t\tsessionId: string;\n\t }\n\t| {\n\t\t\tkind: \"resumed\";\n\t\t\trequestedSessionId: string;\n\t\t\tsessionFile?: string;\n\t\t\tsessionId: string;\n\t };\n\nexport interface IrohRemoteAgentRuntimeResult {\n\truntime: AgentSessionRuntime;\n\tsessionSelection: IrohRemoteAgentRuntimeSessionSelection;\n}\n\nexport async function createIrohRemoteAgentRuntime(\n\toptions: IrohRemoteAgentRuntimeOptions,\n): Promise<AgentSessionRuntime> {\n\treturn (await createIrohRemoteAgentRuntimeWithSessionSelection(options)).runtime;\n}\n\nexport async function createIrohRemoteAgentRuntimeWithSessionSelection(\n\toptions: IrohRemoteAgentRuntimeOptions,\n): Promise<IrohRemoteAgentRuntimeResult> {\n\tconst agentDir = resolvePath(options.agentDir ?? getAgentDir());\n\tconst projectCwd = resolvePath(options.projectCwd ?? options.cwd);\n\trunIrohRemoteStartupMigrations(projectCwd, agentDir);\n\tconst authStorage = AuthStorage.create(join(agentDir, \"auth.json\"));\n\tconst tools = options.toolPolicy ? [...options.toolPolicy.tools] : parseIrohRemoteAllowTools(options.allowTools);\n\tconst allowUnlistedExtensionTools =\n\t\toptions.toolPolicy?.allowUnlistedExtensionTools ?? usesDefaultIrohRemoteAllowTools(options.allowTools);\n\tconst projectTrusted = options.projectTrusted ?? false;\n\n\tconst createRuntime: CreateAgentSessionRuntimeFactory = async (runtimeOptions) => {\n\t\tconst profile = Object.hasOwn(runtimeOptions, \"profile\") ? runtimeOptions.profile : options.profile;\n\t\tconst settingsManager = SettingsManager.create(projectCwd, runtimeOptions.agentDir, {\n\t\t\tprofile,\n\t\t\tprojectTrusted,\n\t\t});\n\t\tapplyHttpProxySettings(settingsManager.getGlobalSettings().httpProxy);\n\t\tconfigureHttpDispatcher(settingsManager.getHttpIdleTimeoutMs());\n\t\tconst services = await createAgentSessionServices({\n\t\t\tauthStorage,\n\t\t\tcwd: runtimeOptions.cwd,\n\t\t\tprojectCwd,\n\t\t\tagentDir: runtimeOptions.agentDir,\n\t\t\tsettingsManager,\n\t\t});\n\t\tconst subagentManager = new SubagentManager({\n\t\t\tcreateRuntime,\n\t\t\tcwd: runtimeOptions.cwd,\n\t\t\tagentDir: runtimeOptions.agentDir,\n\t\t\tresourceLoader: services.resourceLoader,\n\t\t\tparentSessionManager: runtimeOptions.sessionManager,\n\t\t\t...(runtimeOptions.subagentContext ? { subagentContext: runtimeOptions.subagentContext } : {}),\n\t\t\tretainRuntimeOnDispose: options.onSubagentRuntimeCreated !== undefined,\n\t\t\tonRuntimeCreated: options.onSubagentRuntimeCreated\n\t\t\t\t? (event) =>\n\t\t\t\t\t\toptions.onSubagentRuntimeCreated?.({\n\t\t\t\t\t\t\t...event,\n\t\t\t\t\t\t\tparentSessionId: runtimeOptions.sessionManager.getSessionId(),\n\t\t\t\t\t\t\t...(runtimeOptions.sessionManager.getSessionFile()\n\t\t\t\t\t\t\t\t? { parentSessionFile: runtimeOptions.sessionManager.getSessionFile() }\n\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t})\n\t\t\t\t: undefined,\n\t\t});\n\t\tconst created = await createAgentSessionFromServices({\n\t\t\tservices,\n\t\t\tsessionManager: runtimeOptions.sessionManager,\n\t\t\tsessionStartEvent: runtimeOptions.sessionStartEvent,\n\t\t\ttools,\n\t\t\tallowUnlistedExtensionTools,\n\t\t\tsubagentToolManager: subagentManager,\n\t\t});\n\t\treturn {\n\t\t\t...created,\n\t\t\tservices,\n\t\t\tdiagnostics: services.diagnostics,\n\t\t};\n\t};\n\n\tconst sessionTarget = await createIrohRemoteSessionManager(options, agentDir);\n\tawait options.validateCwd?.(sessionTarget.sessionManager.getCwd());\n\tconst runtime = await createAgentSessionRuntime(createRuntime, {\n\t\tcwd: sessionTarget.sessionManager.getCwd(),\n\t\tagentDir,\n\t\tsessionManager: sessionTarget.sessionManager,\n\t\tprofile: options.profile,\n\t});\n\tconst errors = runtime.diagnostics.filter((diagnostic) => diagnostic.type === \"error\");\n\tif (errors.length > 0) {\n\t\tawait runtime.dispose();\n\t\tthrow new Error(errors.map((diagnostic) => diagnostic.message).join(\"\\n\"));\n\t}\n\tif (!runtime.session.model) {\n\t\tawait runtime.dispose();\n\t\tthrow new Error(formatNoModelsAvailableMessage());\n\t}\n\treturn { runtime, sessionSelection: sessionTarget.selection };\n}\n\nasync function createIrohRemoteSessionManager(\n\toptions: IrohRemoteAgentRuntimeOptions,\n\tagentDir: string,\n): Promise<{ sessionManager: SessionManager; selection: IrohRemoteAgentRuntimeSessionSelection }> {\n\tconst resolved =\n\t\toptions.resolvedSessionTarget ??\n\t\t(await resolveIrohRemoteSessionTarget(\n\t\t\tgetSessionTarget(options),\n\t\t\t{ name: \"\", path: options.cwd },\n\t\t\tcreateSessionManagerTargetStore(\n\t\t\t\toptions.cwd,\n\t\t\t\toptions.sessionDir ?? getDefaultSessionDir(options.projectCwd ?? options.cwd, agentDir),\n\t\t\t\t{ listAll: true, preserveSessionCwd: true },\n\t\t\t),\n\t\t));\n\treturn {\n\t\tsessionManager: resolved.sessionManager,\n\t\tselection: toSessionSelection(resolved),\n\t};\n}\n\nfunction toSessionSelection(\n\tresolved: ResolvedSessionTargetWithManager<SessionManager>,\n): IrohRemoteAgentRuntimeSessionSelection {\n\tconst sessionFile = resolved.sessionManager.getSessionFile();\n\tif (resolved.selection === \"created\") {\n\t\treturn {\n\t\t\tkind: \"created\",\n\t\t\tsessionFile,\n\t\t\tsessionId: resolved.sessionId,\n\t\t};\n\t}\n\treturn {\n\t\tkind: resolved.selection,\n\t\trequestedSessionId: resolved.requestedSessionId ?? resolved.sessionId,\n\t\tsessionFile,\n\t\tsessionId: resolved.sessionId,\n\t};\n}\n\nfunction getSessionTarget(options: IrohRemoteAgentRuntimeOptions): IrohRemoteSessionTarget {\n\tconst target = getConversationTarget(options);\n\tif (target.target === \"last\") {\n\t\treturn target.resumeSessionId === undefined\n\t\t\t? { kind: \"last\" }\n\t\t\t: { kind: \"last\", resumeSessionId: target.resumeSessionId };\n\t}\n\tif (target.target === \"session\") {\n\t\treturn { kind: \"session\", sessionId: target.sessionId };\n\t}\n\treturn { kind: \"new\" };\n}\n\nfunction getConversationTarget(options: IrohRemoteAgentRuntimeOptions): IrohRemoteAgentRuntimeConversationTarget {\n\tif (options.conversationTarget !== undefined) {\n\t\treturn options.conversationTarget;\n\t}\n\tif (options.resumeSessionId !== undefined) {\n\t\treturn { target: \"last\", resumeSessionId: options.resumeSessionId };\n\t}\n\treturn { target: \"new\" };\n}\n\nfunction runIrohRemoteStartupMigrations(cwd: string, agentDir: string): void {\n\tconst previousAgentDir = process.env[ENV_AGENT_DIR];\n\tconst previousLog = console.log;\n\ttry {\n\t\tprocess.env[ENV_AGENT_DIR] = agentDir;\n\t\tconsole.log = (...data: Parameters<typeof console.log>) => console.error(...data);\n\t\trunMigrations(cwd);\n\t} finally {\n\t\tconsole.log = previousLog;\n\t\tif (previousAgentDir === undefined) {\n\t\t\tdelete process.env[ENV_AGENT_DIR];\n\t\t} else {\n\t\t\tprocess.env[ENV_AGENT_DIR] = previousAgentDir;\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,155 @@
1
+ import { join } from "node:path";
2
+ import { ENV_AGENT_DIR, getAgentDir } from "../../config.js";
3
+ import { createAgentSessionRuntime, } from "../../core/agent-session-runtime.js";
4
+ import { createAgentSessionFromServices, createAgentSessionServices } from "../../core/agent-session-services.js";
5
+ import { formatNoModelsAvailableMessage } from "../../core/auth-guidance.js";
6
+ import { AuthStorage } from "../../core/auth-storage.js";
7
+ import { applyHttpProxySettings, configureHttpDispatcher } from "../../core/http-dispatcher.js";
8
+ import { parseIrohRemoteAllowTools, usesDefaultIrohRemoteAllowTools, } from "../../core/remote/iroh/index.js";
9
+ import { getDefaultSessionDir } from "../../core/session-manager.js";
10
+ import { SettingsManager } from "../../core/settings-manager.js";
11
+ import { SubagentManager } from "../../core/subagents/index.js";
12
+ import { createSessionManagerTargetStore, resolveIrohRemoteSessionTarget, } from "../../daemon/session-target.js";
13
+ import { runMigrations } from "../../migrations.js";
14
+ import { resolvePath } from "../../utils/paths.js";
15
+ export async function createIrohRemoteAgentRuntime(options) {
16
+ return (await createIrohRemoteAgentRuntimeWithSessionSelection(options)).runtime;
17
+ }
18
+ export async function createIrohRemoteAgentRuntimeWithSessionSelection(options) {
19
+ const agentDir = resolvePath(options.agentDir ?? getAgentDir());
20
+ const projectCwd = resolvePath(options.projectCwd ?? options.cwd);
21
+ runIrohRemoteStartupMigrations(projectCwd, agentDir);
22
+ const authStorage = AuthStorage.create(join(agentDir, "auth.json"));
23
+ const tools = options.toolPolicy ? [...options.toolPolicy.tools] : parseIrohRemoteAllowTools(options.allowTools);
24
+ const allowUnlistedExtensionTools = options.toolPolicy?.allowUnlistedExtensionTools ?? usesDefaultIrohRemoteAllowTools(options.allowTools);
25
+ const projectTrusted = options.projectTrusted ?? false;
26
+ const createRuntime = async (runtimeOptions) => {
27
+ const profile = Object.hasOwn(runtimeOptions, "profile") ? runtimeOptions.profile : options.profile;
28
+ const settingsManager = SettingsManager.create(projectCwd, runtimeOptions.agentDir, {
29
+ profile,
30
+ projectTrusted,
31
+ });
32
+ applyHttpProxySettings(settingsManager.getGlobalSettings().httpProxy);
33
+ configureHttpDispatcher(settingsManager.getHttpIdleTimeoutMs());
34
+ const services = await createAgentSessionServices({
35
+ authStorage,
36
+ cwd: runtimeOptions.cwd,
37
+ projectCwd,
38
+ agentDir: runtimeOptions.agentDir,
39
+ settingsManager,
40
+ });
41
+ const subagentManager = new SubagentManager({
42
+ createRuntime,
43
+ cwd: runtimeOptions.cwd,
44
+ agentDir: runtimeOptions.agentDir,
45
+ resourceLoader: services.resourceLoader,
46
+ parentSessionManager: runtimeOptions.sessionManager,
47
+ ...(runtimeOptions.subagentContext ? { subagentContext: runtimeOptions.subagentContext } : {}),
48
+ retainRuntimeOnDispose: options.onSubagentRuntimeCreated !== undefined,
49
+ onRuntimeCreated: options.onSubagentRuntimeCreated
50
+ ? (event) => options.onSubagentRuntimeCreated?.({
51
+ ...event,
52
+ parentSessionId: runtimeOptions.sessionManager.getSessionId(),
53
+ ...(runtimeOptions.sessionManager.getSessionFile()
54
+ ? { parentSessionFile: runtimeOptions.sessionManager.getSessionFile() }
55
+ : {}),
56
+ })
57
+ : undefined,
58
+ });
59
+ const created = await createAgentSessionFromServices({
60
+ services,
61
+ sessionManager: runtimeOptions.sessionManager,
62
+ sessionStartEvent: runtimeOptions.sessionStartEvent,
63
+ tools,
64
+ allowUnlistedExtensionTools,
65
+ subagentToolManager: subagentManager,
66
+ });
67
+ return {
68
+ ...created,
69
+ services,
70
+ diagnostics: services.diagnostics,
71
+ };
72
+ };
73
+ const sessionTarget = await createIrohRemoteSessionManager(options, agentDir);
74
+ await options.validateCwd?.(sessionTarget.sessionManager.getCwd());
75
+ const runtime = await createAgentSessionRuntime(createRuntime, {
76
+ cwd: sessionTarget.sessionManager.getCwd(),
77
+ agentDir,
78
+ sessionManager: sessionTarget.sessionManager,
79
+ profile: options.profile,
80
+ });
81
+ const errors = runtime.diagnostics.filter((diagnostic) => diagnostic.type === "error");
82
+ if (errors.length > 0) {
83
+ await runtime.dispose();
84
+ throw new Error(errors.map((diagnostic) => diagnostic.message).join("\n"));
85
+ }
86
+ if (!runtime.session.model) {
87
+ await runtime.dispose();
88
+ throw new Error(formatNoModelsAvailableMessage());
89
+ }
90
+ return { runtime, sessionSelection: sessionTarget.selection };
91
+ }
92
+ async function createIrohRemoteSessionManager(options, agentDir) {
93
+ const resolved = options.resolvedSessionTarget ??
94
+ (await resolveIrohRemoteSessionTarget(getSessionTarget(options), { name: "", path: options.cwd }, createSessionManagerTargetStore(options.cwd, options.sessionDir ?? getDefaultSessionDir(options.projectCwd ?? options.cwd, agentDir), { listAll: true, preserveSessionCwd: true })));
95
+ return {
96
+ sessionManager: resolved.sessionManager,
97
+ selection: toSessionSelection(resolved),
98
+ };
99
+ }
100
+ function toSessionSelection(resolved) {
101
+ const sessionFile = resolved.sessionManager.getSessionFile();
102
+ if (resolved.selection === "created") {
103
+ return {
104
+ kind: "created",
105
+ sessionFile,
106
+ sessionId: resolved.sessionId,
107
+ };
108
+ }
109
+ return {
110
+ kind: resolved.selection,
111
+ requestedSessionId: resolved.requestedSessionId ?? resolved.sessionId,
112
+ sessionFile,
113
+ sessionId: resolved.sessionId,
114
+ };
115
+ }
116
+ function getSessionTarget(options) {
117
+ const target = getConversationTarget(options);
118
+ if (target.target === "last") {
119
+ return target.resumeSessionId === undefined
120
+ ? { kind: "last" }
121
+ : { kind: "last", resumeSessionId: target.resumeSessionId };
122
+ }
123
+ if (target.target === "session") {
124
+ return { kind: "session", sessionId: target.sessionId };
125
+ }
126
+ return { kind: "new" };
127
+ }
128
+ function getConversationTarget(options) {
129
+ if (options.conversationTarget !== undefined) {
130
+ return options.conversationTarget;
131
+ }
132
+ if (options.resumeSessionId !== undefined) {
133
+ return { target: "last", resumeSessionId: options.resumeSessionId };
134
+ }
135
+ return { target: "new" };
136
+ }
137
+ function runIrohRemoteStartupMigrations(cwd, agentDir) {
138
+ const previousAgentDir = process.env[ENV_AGENT_DIR];
139
+ const previousLog = console.log;
140
+ try {
141
+ process.env[ENV_AGENT_DIR] = agentDir;
142
+ console.log = (...data) => console.error(...data);
143
+ runMigrations(cwd);
144
+ }
145
+ finally {
146
+ console.log = previousLog;
147
+ if (previousAgentDir === undefined) {
148
+ delete process.env[ENV_AGENT_DIR];
149
+ }
150
+ else {
151
+ process.env[ENV_AGENT_DIR] = previousAgentDir;
152
+ }
153
+ }
154
+ }
155
+ //# sourceMappingURL=iroh-remote-agent-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iroh-remote-agent-runtime.js","sourceRoot":"","sources":["../../../src/modes/rpc/iroh-remote-agent-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAGN,yBAAyB,GACzB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,8BAA8B,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAClH,OAAO,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAChG,OAAO,EAEN,yBAAyB,EACzB,+BAA+B,GAC/B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAuB,MAAM,+BAA+B,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAoC,MAAM,+BAA+B,CAAC;AAClG,OAAO,EACN,+BAA+B,EAG/B,8BAA8B,GAC9B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAkEnD,MAAM,CAAC,KAAK,UAAU,4BAA4B,CACjD,OAAsC,EACP;IAC/B,OAAO,CAAC,MAAM,gDAAgD,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AAAA,CACjF;AAED,MAAM,CAAC,KAAK,UAAU,gDAAgD,CACrE,OAAsC,EACE;IACxC,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,QAAQ,IAAI,WAAW,EAAE,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IAClE,8BAA8B,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;IACpE,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACjH,MAAM,2BAA2B,GAChC,OAAO,CAAC,UAAU,EAAE,2BAA2B,IAAI,+BAA+B,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACxG,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,KAAK,CAAC;IAEvD,MAAM,aAAa,GAAqC,KAAK,EAAE,cAAc,EAAE,EAAE,CAAC;QACjF,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QACpG,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,UAAU,EAAE,cAAc,CAAC,QAAQ,EAAE;YACnF,OAAO;YACP,cAAc;SACd,CAAC,CAAC;QACH,sBAAsB,CAAC,eAAe,CAAC,iBAAiB,EAAE,CAAC,SAAS,CAAC,CAAC;QACtE,uBAAuB,CAAC,eAAe,CAAC,oBAAoB,EAAE,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,MAAM,0BAA0B,CAAC;YACjD,WAAW;YACX,GAAG,EAAE,cAAc,CAAC,GAAG;YACvB,UAAU;YACV,QAAQ,EAAE,cAAc,CAAC,QAAQ;YACjC,eAAe;SACf,CAAC,CAAC;QACH,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC;YAC3C,aAAa;YACb,GAAG,EAAE,cAAc,CAAC,GAAG;YACvB,QAAQ,EAAE,cAAc,CAAC,QAAQ;YACjC,cAAc,EAAE,QAAQ,CAAC,cAAc;YACvC,oBAAoB,EAAE,cAAc,CAAC,cAAc;YACnD,GAAG,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,cAAc,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9F,sBAAsB,EAAE,OAAO,CAAC,wBAAwB,KAAK,SAAS;YACtE,gBAAgB,EAAE,OAAO,CAAC,wBAAwB;gBACjD,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CACV,OAAO,CAAC,wBAAwB,EAAE,CAAC;oBAClC,GAAG,KAAK;oBACR,eAAe,EAAE,cAAc,CAAC,cAAc,CAAC,YAAY,EAAE;oBAC7D,GAAG,CAAC,cAAc,CAAC,cAAc,CAAC,cAAc,EAAE;wBACjD,CAAC,CAAC,EAAE,iBAAiB,EAAE,cAAc,CAAC,cAAc,CAAC,cAAc,EAAE,EAAE;wBACvE,CAAC,CAAC,EAAE,CAAC;iBACN,CAAC;gBACJ,CAAC,CAAC,SAAS;SACZ,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,8BAA8B,CAAC;YACpD,QAAQ;YACR,cAAc,EAAE,cAAc,CAAC,cAAc;YAC7C,iBAAiB,EAAE,cAAc,CAAC,iBAAiB;YACnD,KAAK;YACL,2BAA2B;YAC3B,mBAAmB,EAAE,eAAe;SACpC,CAAC,CAAC;QACH,OAAO;YACN,GAAG,OAAO;YACV,QAAQ;YACR,WAAW,EAAE,QAAQ,CAAC,WAAW;SACjC,CAAC;IAAA,CACF,CAAC;IAEF,MAAM,aAAa,GAAG,MAAM,8BAA8B,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC9E,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC,aAAa,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,MAAM,yBAAyB,CAAC,aAAa,EAAE;QAC9D,GAAG,EAAE,aAAa,CAAC,cAAc,CAAC,MAAM,EAAE;QAC1C,QAAQ;QACR,cAAc,EAAE,aAAa,CAAC,cAAc;QAC5C,OAAO,EAAE,OAAO,CAAC,OAAO;KACxB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IACvF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC5B,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,8BAA8B,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,aAAa,CAAC,SAAS,EAAE,CAAC;AAAA,CAC9D;AAED,KAAK,UAAU,8BAA8B,CAC5C,OAAsC,EACtC,QAAgB,EACiF;IACjG,MAAM,QAAQ,GACb,OAAO,CAAC,qBAAqB;QAC7B,CAAC,MAAM,8BAA8B,CACpC,gBAAgB,CAAC,OAAO,CAAC,EACzB,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,EAC/B,+BAA+B,CAC9B,OAAO,CAAC,GAAG,EACX,OAAO,CAAC,UAAU,IAAI,oBAAoB,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,EACvF,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAC3C,CACD,CAAC,CAAC;IACJ,OAAO;QACN,cAAc,EAAE,QAAQ,CAAC,cAAc;QACvC,SAAS,EAAE,kBAAkB,CAAC,QAAQ,CAAC;KACvC,CAAC;AAAA,CACF;AAED,SAAS,kBAAkB,CAC1B,QAA0D,EACjB;IACzC,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;IAC7D,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO;YACN,IAAI,EAAE,SAAS;YACf,WAAW;YACX,SAAS,EAAE,QAAQ,CAAC,SAAS;SAC7B,CAAC;IACH,CAAC;IACD,OAAO;QACN,IAAI,EAAE,QAAQ,CAAC,SAAS;QACxB,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB,IAAI,QAAQ,CAAC,SAAS;QACrE,WAAW;QACX,SAAS,EAAE,QAAQ,CAAC,SAAS;KAC7B,CAAC;AAAA,CACF;AAED,SAAS,gBAAgB,CAAC,OAAsC,EAA2B;IAC1F,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,eAAe,KAAK,SAAS;YAC1C,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;YAClB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC;IAC9D,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;IACzD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAAA,CACvB;AAED,SAAS,qBAAqB,CAAC,OAAsC,EAA4C;IAChH,IAAI,OAAO,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;QAC9C,OAAO,OAAO,CAAC,kBAAkB,CAAC;IACnC,CAAC;IACD,IAAI,OAAO,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC;IACrE,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAAA,CACzB;AAED,SAAS,8BAA8B,CAAC,GAAW,EAAE,QAAgB,EAAQ;IAC5E,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC;IAChC,IAAI,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAC;QACtC,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,IAAoC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QAClF,aAAa,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;YAAS,CAAC;QACV,OAAO,CAAC,GAAG,GAAG,WAAW,CAAC;QAC1B,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACpC,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,gBAAgB,CAAC;QAC/C,CAAC;IACF,CAAC;AAAA,CACD","sourcesContent":["import { join } from \"node:path\";\nimport { ENV_AGENT_DIR, getAgentDir } from \"../../config.ts\";\nimport {\n\ttype AgentSessionRuntime,\n\ttype CreateAgentSessionRuntimeFactory,\n\tcreateAgentSessionRuntime,\n} from \"../../core/agent-session-runtime.ts\";\nimport { createAgentSessionFromServices, createAgentSessionServices } from \"../../core/agent-session-services.ts\";\nimport { formatNoModelsAvailableMessage } from \"../../core/auth-guidance.ts\";\nimport { AuthStorage } from \"../../core/auth-storage.ts\";\nimport { applyHttpProxySettings, configureHttpDispatcher } from \"../../core/http-dispatcher.ts\";\nimport {\n\ttype IrohRemoteRuntimeToolPolicy,\n\tparseIrohRemoteAllowTools,\n\tusesDefaultIrohRemoteAllowTools,\n} from \"../../core/remote/iroh/index.ts\";\nimport { getDefaultSessionDir, type SessionManager } from \"../../core/session-manager.ts\";\nimport { SettingsManager } from \"../../core/settings-manager.ts\";\nimport { SubagentManager, type SubagentRuntimeCreatedEvent } from \"../../core/subagents/index.ts\";\nimport {\n\tcreateSessionManagerTargetStore,\n\ttype IrohRemoteSessionTarget,\n\ttype ResolvedSessionTargetWithManager,\n\tresolveIrohRemoteSessionTarget,\n} from \"../../daemon/session-target.ts\";\nimport { runMigrations } from \"../../migrations.ts\";\nimport { resolvePath } from \"../../utils/paths.ts\";\n\nexport interface IrohRemoteAgentRuntimeOptions {\n\t/** Legacy unresolved grant used by direct callers. Daemon runtimes pass toolPolicy instead. */\n\tallowTools?: string;\n\t/** Pre-composed client/workspace/daemon policy. Preserves an explicit deny-all. */\n\ttoolPolicy?: IrohRemoteRuntimeToolPolicy;\n\tagentDir?: string;\n\tconversationTarget?: IrohRemoteAgentRuntimeConversationTarget;\n\t/** Runtime working directory for tools/session state. */\n\tcwd: string;\n\t/** Project/config root for .volt resources. Defaults to cwd. */\n\tprojectCwd?: string;\n\tonSubagentRuntimeCreated?: (event: IrohRemoteSubagentRuntimeCreatedEvent) => void | Promise<void>;\n\tprofile?: string;\n\tprojectTrusted?: boolean;\n\t/** Pre-resolved session target (daemon path); skips internal target resolution. */\n\tresolvedSessionTarget?: ResolvedSessionTargetWithManager<SessionManager>;\n\tresumeSessionId?: string;\n\tsessionDir?: string;\n\t/** Validate the resolved session cwd before services/tools are created. */\n\tvalidateCwd?: (cwd: string) => Promise<void> | void;\n}\n\nexport interface IrohRemoteSubagentRuntimeCreatedEvent extends SubagentRuntimeCreatedEvent {\n\tparentSessionId: string;\n\tparentSessionFile?: string;\n}\n\nexport type IrohRemoteAgentRuntimeConversationTarget =\n\t| {\n\t\t\ttarget: \"last\";\n\t\t\tresumeSessionId?: string;\n\t }\n\t| {\n\t\t\ttarget: \"new\";\n\t }\n\t| {\n\t\t\ttarget: \"session\";\n\t\t\tsessionId: string;\n\t };\n\nexport type IrohRemoteAgentRuntimeSessionSelection =\n\t| {\n\t\t\tkind: \"created\";\n\t\t\tsessionFile?: string;\n\t\t\tsessionId: string;\n\t }\n\t| {\n\t\t\tkind: \"created_after_missing\";\n\t\t\trequestedSessionId: string;\n\t\t\tsessionFile?: string;\n\t\t\tsessionId: string;\n\t }\n\t| {\n\t\t\tkind: \"resumed\";\n\t\t\trequestedSessionId: string;\n\t\t\tsessionFile?: string;\n\t\t\tsessionId: string;\n\t };\n\nexport interface IrohRemoteAgentRuntimeResult {\n\truntime: AgentSessionRuntime;\n\tsessionSelection: IrohRemoteAgentRuntimeSessionSelection;\n}\n\nexport async function createIrohRemoteAgentRuntime(\n\toptions: IrohRemoteAgentRuntimeOptions,\n): Promise<AgentSessionRuntime> {\n\treturn (await createIrohRemoteAgentRuntimeWithSessionSelection(options)).runtime;\n}\n\nexport async function createIrohRemoteAgentRuntimeWithSessionSelection(\n\toptions: IrohRemoteAgentRuntimeOptions,\n): Promise<IrohRemoteAgentRuntimeResult> {\n\tconst agentDir = resolvePath(options.agentDir ?? getAgentDir());\n\tconst projectCwd = resolvePath(options.projectCwd ?? options.cwd);\n\trunIrohRemoteStartupMigrations(projectCwd, agentDir);\n\tconst authStorage = AuthStorage.create(join(agentDir, \"auth.json\"));\n\tconst tools = options.toolPolicy ? [...options.toolPolicy.tools] : parseIrohRemoteAllowTools(options.allowTools);\n\tconst allowUnlistedExtensionTools =\n\t\toptions.toolPolicy?.allowUnlistedExtensionTools ?? usesDefaultIrohRemoteAllowTools(options.allowTools);\n\tconst projectTrusted = options.projectTrusted ?? false;\n\n\tconst createRuntime: CreateAgentSessionRuntimeFactory = async (runtimeOptions) => {\n\t\tconst profile = Object.hasOwn(runtimeOptions, \"profile\") ? runtimeOptions.profile : options.profile;\n\t\tconst settingsManager = SettingsManager.create(projectCwd, runtimeOptions.agentDir, {\n\t\t\tprofile,\n\t\t\tprojectTrusted,\n\t\t});\n\t\tapplyHttpProxySettings(settingsManager.getGlobalSettings().httpProxy);\n\t\tconfigureHttpDispatcher(settingsManager.getHttpIdleTimeoutMs());\n\t\tconst services = await createAgentSessionServices({\n\t\t\tauthStorage,\n\t\t\tcwd: runtimeOptions.cwd,\n\t\t\tprojectCwd,\n\t\t\tagentDir: runtimeOptions.agentDir,\n\t\t\tsettingsManager,\n\t\t});\n\t\tconst subagentManager = new SubagentManager({\n\t\t\tcreateRuntime,\n\t\t\tcwd: runtimeOptions.cwd,\n\t\t\tagentDir: runtimeOptions.agentDir,\n\t\t\tresourceLoader: services.resourceLoader,\n\t\t\tparentSessionManager: runtimeOptions.sessionManager,\n\t\t\t...(runtimeOptions.subagentContext ? { subagentContext: runtimeOptions.subagentContext } : {}),\n\t\t\tretainRuntimeOnDispose: options.onSubagentRuntimeCreated !== undefined,\n\t\t\tonRuntimeCreated: options.onSubagentRuntimeCreated\n\t\t\t\t? (event) =>\n\t\t\t\t\t\toptions.onSubagentRuntimeCreated?.({\n\t\t\t\t\t\t\t...event,\n\t\t\t\t\t\t\tparentSessionId: runtimeOptions.sessionManager.getSessionId(),\n\t\t\t\t\t\t\t...(runtimeOptions.sessionManager.getSessionFile()\n\t\t\t\t\t\t\t\t? { parentSessionFile: runtimeOptions.sessionManager.getSessionFile() }\n\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t})\n\t\t\t\t: undefined,\n\t\t});\n\t\tconst created = await createAgentSessionFromServices({\n\t\t\tservices,\n\t\t\tsessionManager: runtimeOptions.sessionManager,\n\t\t\tsessionStartEvent: runtimeOptions.sessionStartEvent,\n\t\t\ttools,\n\t\t\tallowUnlistedExtensionTools,\n\t\t\tsubagentToolManager: subagentManager,\n\t\t});\n\t\treturn {\n\t\t\t...created,\n\t\t\tservices,\n\t\t\tdiagnostics: services.diagnostics,\n\t\t};\n\t};\n\n\tconst sessionTarget = await createIrohRemoteSessionManager(options, agentDir);\n\tawait options.validateCwd?.(sessionTarget.sessionManager.getCwd());\n\tconst runtime = await createAgentSessionRuntime(createRuntime, {\n\t\tcwd: sessionTarget.sessionManager.getCwd(),\n\t\tagentDir,\n\t\tsessionManager: sessionTarget.sessionManager,\n\t\tprofile: options.profile,\n\t});\n\tconst errors = runtime.diagnostics.filter((diagnostic) => diagnostic.type === \"error\");\n\tif (errors.length > 0) {\n\t\tawait runtime.dispose();\n\t\tthrow new Error(errors.map((diagnostic) => diagnostic.message).join(\"\\n\"));\n\t}\n\tif (!runtime.session.model) {\n\t\tawait runtime.dispose();\n\t\tthrow new Error(formatNoModelsAvailableMessage());\n\t}\n\treturn { runtime, sessionSelection: sessionTarget.selection };\n}\n\nasync function createIrohRemoteSessionManager(\n\toptions: IrohRemoteAgentRuntimeOptions,\n\tagentDir: string,\n): Promise<{ sessionManager: SessionManager; selection: IrohRemoteAgentRuntimeSessionSelection }> {\n\tconst resolved =\n\t\toptions.resolvedSessionTarget ??\n\t\t(await resolveIrohRemoteSessionTarget(\n\t\t\tgetSessionTarget(options),\n\t\t\t{ name: \"\", path: options.cwd },\n\t\t\tcreateSessionManagerTargetStore(\n\t\t\t\toptions.cwd,\n\t\t\t\toptions.sessionDir ?? getDefaultSessionDir(options.projectCwd ?? options.cwd, agentDir),\n\t\t\t\t{ listAll: true, preserveSessionCwd: true },\n\t\t\t),\n\t\t));\n\treturn {\n\t\tsessionManager: resolved.sessionManager,\n\t\tselection: toSessionSelection(resolved),\n\t};\n}\n\nfunction toSessionSelection(\n\tresolved: ResolvedSessionTargetWithManager<SessionManager>,\n): IrohRemoteAgentRuntimeSessionSelection {\n\tconst sessionFile = resolved.sessionManager.getSessionFile();\n\tif (resolved.selection === \"created\") {\n\t\treturn {\n\t\t\tkind: \"created\",\n\t\t\tsessionFile,\n\t\t\tsessionId: resolved.sessionId,\n\t\t};\n\t}\n\treturn {\n\t\tkind: resolved.selection,\n\t\trequestedSessionId: resolved.requestedSessionId ?? resolved.sessionId,\n\t\tsessionFile,\n\t\tsessionId: resolved.sessionId,\n\t};\n}\n\nfunction getSessionTarget(options: IrohRemoteAgentRuntimeOptions): IrohRemoteSessionTarget {\n\tconst target = getConversationTarget(options);\n\tif (target.target === \"last\") {\n\t\treturn target.resumeSessionId === undefined\n\t\t\t? { kind: \"last\" }\n\t\t\t: { kind: \"last\", resumeSessionId: target.resumeSessionId };\n\t}\n\tif (target.target === \"session\") {\n\t\treturn { kind: \"session\", sessionId: target.sessionId };\n\t}\n\treturn { kind: \"new\" };\n}\n\nfunction getConversationTarget(options: IrohRemoteAgentRuntimeOptions): IrohRemoteAgentRuntimeConversationTarget {\n\tif (options.conversationTarget !== undefined) {\n\t\treturn options.conversationTarget;\n\t}\n\tif (options.resumeSessionId !== undefined) {\n\t\treturn { target: \"last\", resumeSessionId: options.resumeSessionId };\n\t}\n\treturn { target: \"new\" };\n}\n\nfunction runIrohRemoteStartupMigrations(cwd: string, agentDir: string): void {\n\tconst previousAgentDir = process.env[ENV_AGENT_DIR];\n\tconst previousLog = console.log;\n\ttry {\n\t\tprocess.env[ENV_AGENT_DIR] = agentDir;\n\t\tconsole.log = (...data: Parameters<typeof console.log>) => console.error(...data);\n\t\trunMigrations(cwd);\n\t} finally {\n\t\tconsole.log = previousLog;\n\t\tif (previousAgentDir === undefined) {\n\t\t\tdelete process.env[ENV_AGENT_DIR];\n\t\t} else {\n\t\t\tprocess.env[ENV_AGENT_DIR] = previousAgentDir;\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,69 @@
1
+ import type { AgentSessionRuntime } from "../../core/agent-session-runtime.ts";
2
+ import { type IrohRemoteOutboundValueDecorator, type IrohRemotePushNotificationDelivery, type IrohRemoteRpcGrant } from "../../core/remote/iroh/index.ts";
3
+ import { type IrohRpcTransportOptions, type RpcTransport } from "../../core/rpc/index.ts";
4
+ import { type RpcModeOptions, type RpcSessionChange } from "./rpc-mode.ts";
5
+ import type { RpcRegisterPushTargetResponse } from "./rpc-types.ts";
6
+ export interface IrohRemoteRpcModeOptions extends IrohRpcTransportOptions {
7
+ rpcGrant: IrohRemoteRpcGrant;
8
+ /** Recheck persisted authority at each command boundary when the host owns grant state. */
9
+ isRpcGrantCurrent?: () => boolean | Promise<boolean>;
10
+ decorateOutbound?: IrohRemoteOutboundValueDecorator;
11
+ disposeRuntimeOnClose?: boolean;
12
+ notificationDelivery?: IrohRemotePushNotificationDelivery;
13
+ onClientCapabilitiesChanged?: (features: string[]) => void;
14
+ onResponseWritten?: (response: Record<string, unknown>) => void | Promise<void>;
15
+ onSessionChanged?: (session: RpcSessionChange) => void | Promise<void>;
16
+ onWorkflowEvent?: RpcModeOptions["onWorkflowEvent"];
17
+ registerPushTarget?: (args: unknown) => Promise<RpcRegisterPushTargetResponse>;
18
+ remoteCommandHandler?: (command: Record<string, unknown>) => object | Promise<object | undefined> | undefined;
19
+ remoteWorkspacePath?: string;
20
+ /** Drop extension_ui_request frames (relayed streams: dialogs are answered in the owning TUI). */
21
+ suppressExtensionUiRequests?: boolean;
22
+ workspaceName?: string;
23
+ workspacePath: string;
24
+ /** Extra roots (worktree parent checkout, worktrees root) redacted on every outbound frame. */
25
+ additionalRedactedPaths?: string[];
26
+ }
27
+ export type IrohRemoteNotificationKind = "conversation_completed" | "review_completed" | "action_completed" | "host_notice";
28
+ export interface IrohRemoteNotificationRequest {
29
+ type: "notification_request";
30
+ eventId: string;
31
+ kind: IrohRemoteNotificationKind;
32
+ title: string;
33
+ body: string;
34
+ sessionId?: string;
35
+ workspace?: string;
36
+ }
37
+ type IrohRemoteRunTerminalOutcome = "completed" | "failed" | "aborted";
38
+ export interface IrohRemoteCompletionState {
39
+ sessionId: string;
40
+ runId?: string;
41
+ terminalOutcome?: IrohRemoteRunTerminalOutcome;
42
+ }
43
+ export interface IrohRemoteCompletedCommand {
44
+ command: string;
45
+ id: string | undefined;
46
+ initialState: IrohRemoteCompletionState | undefined;
47
+ finalState: IrohRemoteCompletionState | undefined;
48
+ response?: Record<string, unknown>;
49
+ }
50
+ interface IrohRemoteCloseDeferringRpcTransportOptions {
51
+ transport: RpcTransport;
52
+ getCompletionState?: () => IrohRemoteCompletionState;
53
+ onCommandCompleted?: (completion: IrohRemoteCompletedCommand) => void | Promise<void>;
54
+ onResponseWritten?: (response: Record<string, unknown>) => void | Promise<void>;
55
+ waitForPromptCompletion(): Promise<void>;
56
+ }
57
+ interface IrohRemoteHostCommandRpcTransportOptions {
58
+ handleCommand?: (command: Record<string, unknown>) => object | Promise<object | undefined> | undefined;
59
+ isRpcGrantCurrent?: () => boolean | Promise<boolean>;
60
+ transport: RpcTransport;
61
+ }
62
+ /** Run Volt RPC in-process over an authorized Iroh bidirectional stream. */
63
+ export declare function runIrohRemoteRpcMode(runtimeHost: AgentSessionRuntime, options: IrohRemoteRpcModeOptions): Promise<void>;
64
+ export declare function createIrohRemoteHostCommandRpcTransport(options: IrohRemoteHostCommandRpcTransportOptions): RpcTransport & {
65
+ setRpcModeStartupComplete?(startupComplete: boolean): void;
66
+ };
67
+ export declare function createIrohRemoteCloseDeferringRpcTransport(options: IrohRemoteCloseDeferringRpcTransportOptions): RpcTransport;
68
+ export {};
69
+ //# sourceMappingURL=iroh-remote-rpc-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iroh-remote-rpc-mode.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/iroh-remote-rpc-mode.ts"],"names":[],"mappings":"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","sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { randomUUID } from \"node:crypto\";\nimport type { AgentMessage } from \"@hansjm10/volt-agent-core\";\nimport type { AgentSessionEvent } from \"../../core/agent-session.ts\";\nimport type { AgentSessionRuntime } from \"../../core/agent-session-runtime.ts\";\nimport { REVIEW_BRANCH_ACTION_ID, REVIEW_UNCOMMITTED_ACTION_ID } from \"../../core/host-actions.ts\";\nimport { type CustomMessage, extractVisibleTextContent } from \"../../core/messages.ts\";\nimport {\n\tcreateIrohRemoteFilteredRpcTransport,\n\tcreateIrohRemoteOutboundFilteredRpcTransport,\n\tcreateIrohRemoteRpcErrorResponse,\n\ttype IrohRemoteLiveActivityContentState,\n\ttype IrohRemoteLiveActivityToolGlyph,\n\ttype IrohRemoteLiveActivityUpdateIntent,\n\ttype IrohRemoteOutboundValueDecorator,\n\ttype IrohRemotePushNotificationDelivery,\n\ttype IrohRemoteRpcGrant,\n\tsanitizeIrohRemoteTranscriptText,\n} from \"../../core/remote/iroh/index.ts\";\nimport {\n\tcreateIrohRpcTransport,\n\ttype IrohRpcTransportOptions,\n\ttype RpcCloseHandler,\n\ttype RpcLineHandler,\n\ttype RpcTranscriptItem,\n\ttype RpcTransport,\n} from \"../../core/rpc/index.ts\";\nimport { extractMessageImages, projectSessionTranscript } from \"../../core/rpc/transcript.ts\";\nimport type { CustomMessageEntry, SessionEntry, SessionMessageEntry } from \"../../core/session-manager.ts\";\nimport { type RpcModeOptions, type RpcSessionChange, runRpcMode } from \"./rpc-mode.ts\";\nimport type { RpcRegisterPushTargetResponse } from \"./rpc-types.ts\";\n\nexport interface IrohRemoteRpcModeOptions extends IrohRpcTransportOptions {\n\trpcGrant: IrohRemoteRpcGrant;\n\t/** Recheck persisted authority at each command boundary when the host owns grant state. */\n\tisRpcGrantCurrent?: () => boolean | Promise<boolean>;\n\tdecorateOutbound?: IrohRemoteOutboundValueDecorator;\n\tdisposeRuntimeOnClose?: boolean;\n\tnotificationDelivery?: IrohRemotePushNotificationDelivery;\n\tonClientCapabilitiesChanged?: (features: string[]) => void;\n\tonResponseWritten?: (response: Record<string, unknown>) => void | Promise<void>;\n\tonSessionChanged?: (session: RpcSessionChange) => void | Promise<void>;\n\tonWorkflowEvent?: RpcModeOptions[\"onWorkflowEvent\"];\n\tregisterPushTarget?: (args: unknown) => Promise<RpcRegisterPushTargetResponse>;\n\tremoteCommandHandler?: (command: Record<string, unknown>) => object | Promise<object | undefined> | undefined;\n\tremoteWorkspacePath?: string;\n\t/** Drop extension_ui_request frames (relayed streams: dialogs are answered in the owning TUI). */\n\tsuppressExtensionUiRequests?: boolean;\n\tworkspaceName?: string;\n\tworkspacePath: string;\n\t/** Extra roots (worktree parent checkout, worktrees root) redacted on every outbound frame. */\n\tadditionalRedactedPaths?: string[];\n}\n\nexport type IrohRemoteNotificationKind =\n\t| \"conversation_completed\"\n\t| \"review_completed\"\n\t| \"action_completed\"\n\t| \"host_notice\";\n\nexport interface IrohRemoteNotificationRequest {\n\ttype: \"notification_request\";\n\teventId: string;\n\tkind: IrohRemoteNotificationKind;\n\ttitle: string;\n\tbody: string;\n\tsessionId?: string;\n\tworkspace?: string;\n}\n\ntype IrohRemoteRunTerminalOutcome = \"completed\" | \"failed\" | \"aborted\";\n\nexport interface IrohRemoteCompletionState {\n\tsessionId: string;\n\trunId?: string;\n\tterminalOutcome?: IrohRemoteRunTerminalOutcome;\n}\n\nexport interface IrohRemoteCompletedCommand {\n\tcommand: string;\n\tid: string | undefined;\n\tinitialState: IrohRemoteCompletionState | undefined;\n\tfinalState: IrohRemoteCompletionState | undefined;\n\tresponse?: Record<string, unknown>;\n}\n\ninterface PendingIrohRemoteCommand {\n\tcommand: string;\n\tid: string | undefined;\n\tinitialState: IrohRemoteCompletionState | undefined;\n\tdone: Promise<void>;\n\tresponseMatched: boolean;\n\tfinish(): void;\n}\n\ninterface IrohRemoteCloseDeferringRpcTransportOptions {\n\ttransport: RpcTransport;\n\tgetCompletionState?: () => IrohRemoteCompletionState;\n\tonCommandCompleted?: (completion: IrohRemoteCompletedCommand) => void | Promise<void>;\n\tonResponseWritten?: (response: Record<string, unknown>) => void | Promise<void>;\n\twaitForPromptCompletion(): Promise<void>;\n}\n\ninterface IrohRemoteCloseDeferringRpcTransport extends RpcTransport {\n\tsetRpcModeStartupComplete(startupComplete: boolean): void;\n}\n\ninterface IrohRemoteHostCommandRpcTransportOptions {\n\thandleCommand?: (command: Record<string, unknown>) => object | Promise<object | undefined> | undefined;\n\tisRpcGrantCurrent?: () => boolean | Promise<boolean>;\n\ttransport: RpcTransport;\n}\n\n/**\n * Cap on the per-stream completion-notification dedup set. Duplicate suppression\n * only needs recent history, so a very long-lived relay stream doing thousands of\n * turns evicts oldest-first rather than growing the set without bound.\n */\nconst MAX_SENT_NOTIFICATION_EVENT_IDS = 512;\n\n/**\n * Scalar cap for tool result text shipped to remote clients (transcript entries\n * and tool_execution_end frames). Mirrors REMOTE_TOOL_OUTPUT_MAX_SCALARS in\n * daemon/conversation-commands.ts so live events and fetched history agree.\n */\nconst IROH_REMOTE_TOOL_OUTPUT_MAX_SCALARS = 8_000;\n\n/** Run Volt RPC in-process over an authorized Iroh bidirectional stream. */\nexport function runIrohRemoteRpcMode(\n\truntimeHost: AgentSessionRuntime,\n\toptions: IrohRemoteRpcModeOptions,\n): Promise<void> {\n\tconst sentNotificationEventIds = new Set<string>();\n\tlet detachLiveActivityUpdates: (() => void) | undefined;\n\tlet detachTranscriptEntryEvents: (() => void) | undefined;\n\tlet transportClosed = false;\n\tconst attachLiveActivityUpdates = () => {\n\t\tdetachLiveActivityUpdates?.();\n\t\tdetachLiveActivityUpdates = attachIrohRemoteLiveActivityUpdates(\n\t\t\truntimeHost,\n\t\t\toptions.notificationDelivery,\n\t\t\toptions.workspaceName,\n\t\t);\n\t};\n\tconst filteredOutboundTransport = createIrohRemoteOutboundFilteredRpcTransport({\n\t\tdecorate: options.decorateOutbound,\n\t\tremoteWorkspacePath: options.remoteWorkspacePath,\n\t\ttransport: createIrohRpcTransport(options),\n\t\tworkspacePath: options.workspacePath,\n\t\tadditionalRedactedPaths: options.additionalRedactedPaths,\n\t});\n\tconst suppressingTransport: RpcTransport = options.suppressExtensionUiRequests\n\t\t? {\n\t\t\t\t...filteredOutboundTransport,\n\t\t\t\twrite: (value) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\ttypeof value === \"object\" &&\n\t\t\t\t\t\tvalue !== null &&\n\t\t\t\t\t\t(value as { type?: unknown }).type === \"extension_ui_request\"\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn Promise.resolve();\n\t\t\t\t\t}\n\t\t\t\t\treturn filteredOutboundTransport.write(value);\n\t\t\t\t},\n\t\t\t}\n\t\t: filteredOutboundTransport;\n\t// Attach bounded, sanitized tool result text to live tool_execution_end\n\t// frames so remote clients can show real output in tool details.\n\tconst outboundTransport: RpcTransport = {\n\t\t...suppressingTransport,\n\t\twrite: (value) =>\n\t\t\tsuppressingTransport.write(\n\t\t\t\tdecorateIrohRemoteToolExecutionEnd(value, {\n\t\t\t\t\tremoteWorkspacePath: options.remoteWorkspacePath,\n\t\t\t\t\tworkspacePath: options.workspacePath,\n\t\t\t\t}),\n\t\t\t),\n\t};\n\tconst attachTranscriptEntryEvents = () => {\n\t\tdetachTranscriptEntryEvents?.();\n\t\tdetachTranscriptEntryEvents = attachIrohRemoteTranscriptEntryEvents(runtimeHost, outboundTransport, {\n\t\t\tremoteWorkspacePath: options.remoteWorkspacePath,\n\t\t\tworkspacePath: options.workspacePath,\n\t\t});\n\t};\n\tattachTranscriptEntryEvents();\n\tconst deliverCompletionNotification = async (notification: IrohRemoteNotificationRequest): Promise<void> => {\n\t\tif (options.notificationDelivery) {\n\t\t\tconst deliveryStatus = await options.notificationDelivery.deliverNotification(notification);\n\t\t\tif (deliveryStatus === \"sent\" || deliveryStatus === \"duplicate\") {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tawait outboundTransport.write(notification);\n\t};\n\tconst closeDeferringTransport = createIrohRemoteCloseDeferringRpcTransport({\n\t\ttransport: outboundTransport,\n\t\tgetCompletionState: () => getIrohRemoteCompletionState(runtimeHost),\n\t\tonCommandCompleted: async (completion) => {\n\t\t\tconst notification = createIrohRemoteCompletionNotification(completion, options.workspaceName);\n\t\t\tif (!notification || sentNotificationEventIds.has(notification.eventId)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (sentNotificationEventIds.size >= MAX_SENT_NOTIFICATION_EVENT_IDS) {\n\t\t\t\t// Set preserves insertion order, so the first value is the oldest.\n\t\t\t\tconst oldest = sentNotificationEventIds.values().next().value;\n\t\t\t\tif (oldest !== undefined) {\n\t\t\t\t\tsentNotificationEventIds.delete(oldest);\n\t\t\t\t}\n\t\t\t}\n\t\t\tsentNotificationEventIds.add(notification.eventId);\n\t\t\ttry {\n\t\t\t\tawait deliverCompletionNotification(notification);\n\t\t\t} catch (error: unknown) {\n\t\t\t\tsentNotificationEventIds.delete(notification.eventId);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\t\tonResponseWritten: options.onResponseWritten,\n\t\twaitForPromptCompletion: () => runtimeHost.session.waitForIdle(),\n\t});\n\n\tconst filteredTransport = createIrohRemoteFilteredRpcTransport({\n\t\ttransport: closeDeferringTransport,\n\t\trpcGrant: options.rpcGrant,\n\t});\n\tconst remoteHostCommandTransport =\n\t\toptions.remoteCommandHandler || options.isRpcGrantCurrent\n\t\t\t? createIrohRemoteHostCommandRpcTransport({\n\t\t\t\t\thandleCommand: options.remoteCommandHandler,\n\t\t\t\t\tisRpcGrantCurrent: options.isRpcGrantCurrent,\n\t\t\t\t\ttransport: filteredTransport,\n\t\t\t\t})\n\t\t\t: filteredTransport;\n\n\treturn runRpcMode(runtimeHost, {\n\t\tallowUiActionInvocation: true,\n\t\tdisposeRuntimeOnClose: options.disposeRuntimeOnClose,\n\t\tonSessionChanged: async (session) => {\n\t\t\tawait options.onSessionChanged?.(session);\n\t\t\tif (!transportClosed) {\n\t\t\t\tattachLiveActivityUpdates();\n\t\t\t\tattachTranscriptEntryEvents();\n\t\t\t}\n\t\t},\n\t\tonClientCapabilitiesChanged: options.onClientCapabilitiesChanged,\n\t\tonWorkflowEvent: options.onWorkflowEvent,\n\t\trequireRemoteSafeUiActions: true,\n\t\ttransport: remoteHostCommandTransport,\n\t\texitProcess: false,\n\t\tregisterPushTarget: options.registerPushTarget,\n\t}).finally(() => {\n\t\ttransportClosed = true;\n\t\tdetachTranscriptEntryEvents?.();\n\t\tdetachLiveActivityUpdates?.();\n\t});\n}\n\ninterface IrohRemoteTranscriptEventOptions {\n\tremoteWorkspacePath?: string;\n\tworkspacePath: string;\n}\n\nfunction attachIrohRemoteTranscriptEntryEvents(\n\truntimeHost: AgentSessionRuntime,\n\ttransport: RpcTransport,\n\toptions: IrohRemoteTranscriptEventOptions,\n): () => void {\n\tconst emittedFinalEntryIds = new Set<string>();\n\treturn runtimeHost.session.subscribe((event) => {\n\t\tif (event.type !== \"message_end\") {\n\t\t\treturn;\n\t\t}\n\t\tconst message = event.message;\n\t\tqueueMicrotask(() => {\n\t\t\tconst entry = findPersistedMessageEntry(runtimeHost, message);\n\t\t\tif (!entry || emittedFinalEntryIds.has(entry.id)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst transcriptEvent = createIrohRemoteTranscriptEntryEvent(entry, runtimeHost, options);\n\t\t\tif (!transcriptEvent) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\temittedFinalEntryIds.add(entry.id);\n\t\t\tvoid Promise.resolve(transport.write(transcriptEvent)).catch(() => {});\n\t\t});\n\t});\n}\n\ntype IrohRemoteTranscriptSourceEntry = SessionMessageEntry | CustomMessageEntry;\n\ninterface IrohRemoteStoredToolCall {\n\tid: string;\n\tname: string;\n\targuments: Record<string, unknown>;\n}\n\nfunction findPersistedMessageEntry(\n\truntimeHost: AgentSessionRuntime,\n\tmessage: unknown,\n): IrohRemoteTranscriptSourceEntry | undefined {\n\tconst branch = runtimeHost.session.sessionManager.getBranch();\n\tfor (let index = branch.length - 1; index >= 0; index--) {\n\t\tconst entry = branch[index];\n\t\tif (entry.type === \"message\" && entry.message === message) {\n\t\t\treturn entry;\n\t\t}\n\t\tif (entry.type === \"custom_message\" && isMatchingReviewCustomMessageEntry(entry, message)) {\n\t\t\treturn entry;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction isMatchingReviewCustomMessageEntry(entry: CustomMessageEntry, message: unknown): message is CustomMessage {\n\tif (entry.customType !== \"review\" || entry.display !== true || !isReviewCustomMessage(message)) {\n\t\treturn false;\n\t}\n\treturn customMessageContentMatches(entry.content, message.content);\n}\n\nfunction isReviewCustomMessage(message: unknown): message is CustomMessage {\n\tif (typeof message !== \"object\" || message === null || Array.isArray(message)) {\n\t\treturn false;\n\t}\n\tconst candidate = message as Partial<CustomMessage>;\n\treturn candidate.role === \"custom\" && candidate.customType === \"review\" && candidate.display === true;\n}\n\nfunction customMessageContentMatches(left: CustomMessageEntry[\"content\"], right: CustomMessage[\"content\"]): boolean {\n\tif (typeof left === \"string\" || typeof right === \"string\") {\n\t\treturn left === right;\n\t}\n\ttry {\n\t\treturn JSON.stringify(left) === JSON.stringify(right);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction createIrohRemoteTranscriptEntryEvent(\n\tentry: IrohRemoteTranscriptSourceEntry,\n\truntimeHost: AgentSessionRuntime,\n\toptions: IrohRemoteTranscriptEventOptions,\n): Record<string, unknown> | undefined {\n\tconst projectedEvent = createIrohRemoteProjectedTranscriptEntryEvent(entry, runtimeHost, options);\n\tif (projectedEvent) {\n\t\treturn projectedEvent;\n\t}\n\n\tif (entry.type === \"custom_message\") {\n\t\tif (entry.customType !== \"review\" || entry.display !== true) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst text = extractVisibleTextContent(entry.content);\n\t\treturn text ? createIrohRemoteTranscriptEntryEventValue(entry, \"assistant\", text, options) : undefined;\n\t}\n\tconst message = entry.message;\n\tif (message.role === \"user\" || message.role === \"assistant\") {\n\t\tconst text = extractVisibleTextContent(message.content);\n\t\tconst imageCount = message.role === \"user\" ? extractMessageImages(message.content).length : 0;\n\t\tif (!text && imageCount === 0) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn createIrohRemoteTranscriptEntryEventValue(\n\t\t\tentry,\n\t\t\tmessage.role,\n\t\t\ttext,\n\t\t\toptions,\n\t\t\timageCount > 0 ? { imageCount } : {},\n\t\t);\n\t}\n\tif (message.role === \"toolResult\") {\n\t\tconst status = message.isError ? \"failed\" : \"completed\";\n\t\tconst toolName =\n\t\t\ttypeof message.toolName === \"string\" && message.toolName.trim() ? message.toolName.trim() : \"tool\";\n\t\tconst toolCall = collectIrohRemoteToolCalls(runtimeHost.session.sessionManager.getBranch()).get(\n\t\t\tmessage.toolCallId,\n\t\t);\n\t\tconst imageCount = extractMessageImages(message.content).length;\n\t\treturn createIrohRemoteTranscriptEntryEventValue(entry, \"tool\", `${toolName} ${status}`, options, {\n\t\t\ttoolName,\n\t\t\tstatus,\n\t\t\tsummary: `${toolName} ${status}`,\n\t\t\t...(toolName === \"subagent\"\n\t\t\t\t? {\n\t\t\t\t\t\t...projectIrohRemoteSubagentTranscriptArgs(toolCall?.arguments, options),\n\t\t\t\t\t\t...projectIrohRemoteSubagentTranscriptDetails(message.details, options),\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t\t...sanitizeIrohRemoteToolOutputFields(extractVisibleTextContent(message.content), options),\n\t\t\t...(imageCount > 0 ? { imageCount } : {}),\n\t\t});\n\t}\n\tif (message.role === \"bashExecution\") {\n\t\tconst failed = message.cancelled || (message.exitCode !== undefined && message.exitCode !== 0);\n\t\tconst status = failed ? \"failed\" : \"completed\";\n\t\tconst exit = message.cancelled\n\t\t\t? \"cancelled\"\n\t\t\t: message.exitCode === undefined\n\t\t\t\t? status\n\t\t\t\t: `exit ${message.exitCode}`;\n\t\treturn createIrohRemoteTranscriptEntryEventValue(\n\t\t\tentry,\n\t\t\t\"tool\",\n\t\t\t`bash ${exit}`,\n\t\t\toptions,\n\t\t\tsanitizeIrohRemoteToolOutputFields(message.output, options, message.truncated === true),\n\t\t);\n\t}\n\treturn undefined;\n}\n\nfunction createIrohRemoteProjectedTranscriptEntryEvent(\n\tentry: IrohRemoteTranscriptSourceEntry,\n\truntimeHost: AgentSessionRuntime,\n\toptions: IrohRemoteTranscriptEventOptions,\n): Record<string, unknown> | undefined {\n\tconst item = projectSessionTranscript(runtimeHost.session.sessionManager, { limit: 200 }).items.find(\n\t\t(transcriptItem) => transcriptItem.id === entry.id,\n\t);\n\tif (!item) {\n\t\treturn undefined;\n\t}\n\treturn {\n\t\ttype: \"transcript_entry\",\n\t\tentry: {\n\t\t\tentryId: item.id,\n\t\t\tcreatedAt: item.timestamp,\n\t\t\t...createIrohRemoteProjectedTranscriptEntryFields(item, options),\n\t\t\t...(item.role === \"tool\" ? getIrohRemoteToolOutputFields(entry, options) : {}),\n\t\t},\n\t\tfinal: true,\n\t};\n}\n\n/** Sanitized, bounded tool result text for a persisted tool transcript entry. */\nfunction getIrohRemoteToolOutputFields(\n\tentry: IrohRemoteTranscriptSourceEntry,\n\toptions: IrohRemoteTranscriptEventOptions,\n): Record<string, unknown> {\n\tif (entry.type !== \"message\") {\n\t\treturn {};\n\t}\n\tconst message = entry.message;\n\tif (message.role === \"toolResult\") {\n\t\treturn sanitizeIrohRemoteToolOutputFields(extractVisibleTextContent(message.content), options);\n\t}\n\tif (message.role === \"bashExecution\") {\n\t\treturn sanitizeIrohRemoteToolOutputFields(message.output, options, message.truncated === true);\n\t}\n\treturn {};\n}\n\nfunction sanitizeIrohRemoteToolOutputFields(\n\tvalue: unknown,\n\toptions: IrohRemoteTranscriptEventOptions,\n\thostTruncated = false,\n): Record<string, unknown> {\n\tif (typeof value !== \"string\" || value.trim().length === 0) {\n\t\treturn {};\n\t}\n\tconst sanitized = sanitizeIrohRemoteTranscriptText(value, options, \"preserve\");\n\tconst scalars = Array.from(sanitized.text);\n\tconst truncated = sanitized.truncated || hostTruncated || scalars.length > IROH_REMOTE_TOOL_OUTPUT_MAX_SCALARS;\n\treturn {\n\t\toutput:\n\t\t\tscalars.length > IROH_REMOTE_TOOL_OUTPUT_MAX_SCALARS\n\t\t\t\t? scalars.slice(0, IROH_REMOTE_TOOL_OUTPUT_MAX_SCALARS).join(\"\")\n\t\t\t\t: sanitized.text,\n\t\toutputTruncated: truncated,\n\t};\n}\n\n/**\n * Adds `output`/`outputTruncated` to outbound tool_execution_end frames. The\n * generic outbound filter still sanitizes the whole frame afterwards; the text\n * is pre-sanitized and truncated here so the added field is bounded regardless.\n */\nfunction decorateIrohRemoteToolExecutionEnd(value: object, options: IrohRemoteTranscriptEventOptions): object {\n\tif (!isRecord(value) || value.type !== \"tool_execution_end\" || \"output\" in value) {\n\t\treturn value;\n\t}\n\tconst result = value.result;\n\tif (!isRecord(result)) {\n\t\treturn value;\n\t}\n\tconst outputFields = sanitizeIrohRemoteToolOutputFields(extractVisibleTextContent(result.content), options);\n\treturn Object.keys(outputFields).length > 0 ? { ...value, ...outputFields } : value;\n}\n\nfunction createIrohRemoteProjectedTranscriptEntryFields(\n\titem: RpcTranscriptItem,\n\toptions: IrohRemoteTranscriptEventOptions,\n): Record<string, unknown> {\n\tif (item.role === \"tool\") {\n\t\tconst summary = sanitizeIrohRemoteTranscriptText(item.summary, options, \"summary\");\n\t\tconst fields: Record<string, unknown> = {\n\t\t\trole: \"tool\",\n\t\t\ttext: summary.text,\n\t\t\ttruncated: summary.truncated,\n\t\t\ttoolName: item.toolName,\n\t\t\tstatus: item.status,\n\t\t\tsummary: summary.text,\n\t\t};\n\t\tif (item.path) {\n\t\t\tfields.path = item.path;\n\t\t}\n\t\tif (item.args) {\n\t\t\tfields.args = item.args;\n\t\t}\n\t\tif (item.details) {\n\t\t\tfields.details = item.details;\n\t\t}\n\t\tif (item.diffPreview) {\n\t\t\tfields.diffPreview = item.diffPreview;\n\t\t}\n\t\tif (item.patchPreview) {\n\t\t\tfields.patchPreview = item.patchPreview;\n\t\t}\n\t\tif (item.imageCount) {\n\t\t\tfields.imageCount = item.imageCount;\n\t\t}\n\t\treturn fields;\n\t}\n\n\tconst text = sanitizeIrohRemoteTranscriptText(item.text, options);\n\tconst fields: Record<string, unknown> = {\n\t\trole: item.role,\n\t\ttext: text.text,\n\t\ttruncated: text.truncated,\n\t};\n\tif (item.role === \"summary\") {\n\t\tfields.title = item.title;\n\t}\n\tif (item.role === \"user\" && item.imageCount) {\n\t\tfields.imageCount = item.imageCount;\n\t}\n\treturn fields;\n}\n\nfunction createIrohRemoteTranscriptEntryEventValue(\n\tentry: SessionEntry,\n\trole: \"user\" | \"assistant\" | \"system\" | \"tool\",\n\ttext: string,\n\toptions: IrohRemoteTranscriptEventOptions,\n\textraEntryFields: Record<string, unknown> = {},\n): Record<string, unknown> {\n\tconst sanitized = sanitizeIrohRemoteTranscriptText(text, options, role === \"tool\" ? \"summary\" : \"preserve\");\n\treturn {\n\t\ttype: \"transcript_entry\",\n\t\tentry: {\n\t\t\tentryId: entry.id,\n\t\t\tcreatedAt: normalizeIrohRemoteTranscriptTimestamp(entry.timestamp),\n\t\t\trole,\n\t\t\ttext: sanitized.text,\n\t\t\ttruncated: sanitized.truncated,\n\t\t\t...extraEntryFields,\n\t\t},\n\t\tfinal: true,\n\t};\n}\n\nfunction collectIrohRemoteToolCalls(entries: SessionEntry[]): Map<string, IrohRemoteStoredToolCall> {\n\tconst toolCalls = new Map<string, IrohRemoteStoredToolCall>();\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"message\" || entry.message.role !== \"assistant\") {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const block of entry.message.content) {\n\t\t\tif (isIrohRemoteStoredToolCall(block)) {\n\t\t\t\ttoolCalls.set(block.id, block);\n\t\t\t}\n\t\t}\n\t}\n\treturn toolCalls;\n}\n\nfunction isIrohRemoteStoredToolCall(value: unknown): value is IrohRemoteStoredToolCall {\n\treturn (\n\t\tisRecord(value) &&\n\t\tvalue.type === \"toolCall\" &&\n\t\ttypeof value.id === \"string\" &&\n\t\ttypeof value.name === \"string\" &&\n\t\tisRecord(value.arguments)\n\t);\n}\n\nfunction projectIrohRemoteSubagentTranscriptArgs(\n\targs: Record<string, unknown> | undefined,\n\toptions: IrohRemoteTranscriptEventOptions,\n): Record<string, unknown> {\n\tif (!args) {\n\t\treturn {};\n\t}\n\tconst projected: Record<string, unknown> = {};\n\tcopyIrohRemoteBoundedString(args, projected, \"agent\", options, 200);\n\tcopyIrohRemoteBoundedString(args, projected, \"task\", options, 1_000);\n\tconst tasks = projectIrohRemoteSubagentInputArray(args.tasks, options);\n\tif (tasks) {\n\t\tprojected.tasks = tasks;\n\t}\n\tconst chain = projectIrohRemoteSubagentInputArray(args.chain, options);\n\tif (chain) {\n\t\tprojected.chain = chain;\n\t}\n\treturn Object.keys(projected).length > 0 ? { args: projected } : {};\n}\n\nfunction projectIrohRemoteSubagentInputArray(\n\tvalue: unknown,\n\toptions: IrohRemoteTranscriptEventOptions,\n): Array<{ agent: string; task: string }> | undefined {\n\tif (!Array.isArray(value)) {\n\t\treturn undefined;\n\t}\n\tconst projected = value\n\t\t.map((item) => {\n\t\t\tif (!isRecord(item)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tconst agent = getIrohRemoteBoundedString(item.agent, options, 200);\n\t\t\tconst task = getIrohRemoteBoundedString(item.task, options, 1_000);\n\t\t\treturn agent && task ? { agent, task } : undefined;\n\t\t})\n\t\t.filter((item): item is { agent: string; task: string } => item !== undefined);\n\treturn projected.length > 0 ? projected : undefined;\n}\n\nfunction projectIrohRemoteSubagentTranscriptDetails(\n\tdetails: unknown,\n\toptions: IrohRemoteTranscriptEventOptions,\n): Record<string, unknown> {\n\tif (!isRecord(details)) {\n\t\treturn {};\n\t}\n\tconst projected: Record<string, unknown> = {};\n\tcopyIrohRemoteBoundedString(details, projected, \"mode\", options, 200);\n\tcopyIrohRemoteBoundedString(details, projected, \"status\", options, 200);\n\tcopyIrohRemoteBoundedString(details, projected, \"subagentId\", options, 200);\n\tcopyIrohRemoteBoundedString(details, projected, \"sessionId\", options, 200);\n\tcopyIrohRemoteSubagentNumericDetails(details, projected);\n\tcopyIrohRemoteBoundedString(details, projected, \"currentActivity\", options, 300);\n\tconst summary = projectIrohRemoteSubagentSummary(details.summary);\n\tif (summary) {\n\t\tprojected.summary = summary;\n\t}\n\tconst childSessions = projectIrohRemoteSubagentDetailArray(details.childSessions, options);\n\tif (childSessions) {\n\t\tprojected.childSessions = childSessions;\n\t}\n\tconst agent = projectIrohRemoteSubagentAgent(details.agent, options);\n\tif (agent) {\n\t\tprojected.agent = agent;\n\t}\n\tconst output = projectIrohRemoteSubagentOutput(details.output, options);\n\tif (output) {\n\t\tprojected.output = output;\n\t}\n\tconst error = projectIrohRemoteSubagentError(details.error, options);\n\tif (error) {\n\t\tprojected.error = error;\n\t}\n\tconst children = projectIrohRemoteSubagentDetailArray(details.children, options);\n\tif (children) {\n\t\tprojected.children = children;\n\t}\n\tconst tasks = projectIrohRemoteSubagentDetailArray(details.tasks, options);\n\tif (tasks) {\n\t\tprojected.tasks = tasks;\n\t}\n\tconst steps = projectIrohRemoteSubagentDetailArray(details.steps, options);\n\tif (steps) {\n\t\tprojected.steps = steps;\n\t}\n\treturn Object.keys(projected).length > 0 ? { details: projected } : {};\n}\n\nconst IROH_REMOTE_SUBAGENT_NUMERIC_KEYS = [\"startedAt\", \"durationMs\", \"toolCalls\", \"tokens\"] as const;\nconst IROH_REMOTE_SUBAGENT_TREE_DEPTH_LIMIT = 5;\n\nfunction copyIrohRemoteSubagentNumericDetails(from: Record<string, unknown>, to: Record<string, unknown>): void {\n\tfor (const key of IROH_REMOTE_SUBAGENT_NUMERIC_KEYS) {\n\t\tconst numberValue = getIrohRemoteFiniteNumber(from[key]);\n\t\tif (numberValue !== undefined) {\n\t\t\tto[key] = numberValue;\n\t\t}\n\t}\n}\n\nfunction projectIrohRemoteSubagentSummary(value: unknown): Record<string, number> | undefined {\n\tif (!isRecord(value)) {\n\t\treturn undefined;\n\t}\n\tconst projected: Record<string, number> = {};\n\tfor (const key of [\n\t\t\"total\",\n\t\t\"completed\",\n\t\t\"failed\",\n\t\t\"aborted\",\n\t\t\"running\",\n\t\t\"maxTasks\",\n\t\t\"maxConcurrency\",\n\t\t\"stoppedAt\",\n\t]) {\n\t\tconst numberValue = getIrohRemoteFiniteNumber(value[key]);\n\t\tif (numberValue !== undefined) {\n\t\t\tprojected[key] = numberValue;\n\t\t}\n\t}\n\treturn Object.keys(projected).length > 0 ? projected : undefined;\n}\n\nfunction projectIrohRemoteSubagentDetailArray(\n\tvalue: unknown,\n\toptions: IrohRemoteTranscriptEventOptions,\n\tdepth = 0,\n): Array<Record<string, unknown>> | undefined {\n\tif (!Array.isArray(value) || depth >= IROH_REMOTE_SUBAGENT_TREE_DEPTH_LIMIT) {\n\t\treturn undefined;\n\t}\n\tconst projected = value\n\t\t.map((item) => projectIrohRemoteSubagentTask(item, options, depth))\n\t\t.filter((item): item is Record<string, unknown> => item !== undefined);\n\treturn projected.length > 0 ? projected : undefined;\n}\n\nfunction projectIrohRemoteSubagentTask(\n\tvalue: unknown,\n\toptions: IrohRemoteTranscriptEventOptions,\n\tdepth = 0,\n): Record<string, unknown> | undefined {\n\tif (!isRecord(value)) {\n\t\treturn undefined;\n\t}\n\tconst projected: Record<string, unknown> = {};\n\tconst index = getIrohRemoteFiniteNumber(value.index);\n\tif (index !== undefined) {\n\t\tprojected.index = index;\n\t}\n\tcopyIrohRemoteBoundedString(value, projected, \"subagentId\", options, 200);\n\tcopyIrohRemoteBoundedString(value, projected, \"sessionId\", options, 200);\n\tconst agent = projectIrohRemoteSubagentAgent(value.agent, options);\n\tif (agent) {\n\t\tprojected.agent = agent;\n\t}\n\tcopyIrohRemoteBoundedString(value, projected, \"status\", options, 200);\n\tcopyIrohRemoteBoundedString(value, projected, \"task\", options, 1_000);\n\tcopyIrohRemoteSubagentNumericDetails(value, projected);\n\tcopyIrohRemoteBoundedString(value, projected, \"currentActivity\", options, 300);\n\tconst error = projectIrohRemoteSubagentError(value.error, options);\n\tif (error) {\n\t\tprojected.error = error;\n\t}\n\tconst children = projectIrohRemoteSubagentDetailArray(value.children, options, depth + 1);\n\tif (children) {\n\t\tprojected.children = children;\n\t}\n\treturn Object.keys(projected).length > 0 ? projected : undefined;\n}\n\nfunction projectIrohRemoteSubagentAgent(\n\tvalue: unknown,\n\toptions: IrohRemoteTranscriptEventOptions,\n): Record<string, string> | undefined {\n\tif (!isRecord(value)) {\n\t\treturn undefined;\n\t}\n\tconst projected: Record<string, string> = {};\n\tcopyIrohRemoteBoundedString(value, projected, \"name\", options, 200);\n\tcopyIrohRemoteBoundedString(value, projected, \"source\", options, 200);\n\treturn Object.keys(projected).length > 0 ? projected : undefined;\n}\n\nfunction projectIrohRemoteSubagentOutput(\n\tvalue: unknown,\n\toptions: IrohRemoteTranscriptEventOptions,\n): Record<string, unknown> | undefined {\n\tif (!isRecord(value)) {\n\t\treturn undefined;\n\t}\n\tconst projected: Record<string, unknown> = {};\n\tcopyIrohRemoteBoundedString(value, projected, \"text\", options, 1_000);\n\tfor (const key of [\"bytes\", \"omittedBytes\", \"maxBytes\"]) {\n\t\tconst numberValue = getIrohRemoteFiniteNumber(value[key]);\n\t\tif (numberValue !== undefined) {\n\t\t\tprojected[key] = numberValue;\n\t\t}\n\t}\n\tif (typeof value.truncated === \"boolean\") {\n\t\tprojected.truncated = value.truncated;\n\t}\n\treturn Object.keys(projected).length > 0 ? projected : undefined;\n}\n\nfunction projectIrohRemoteSubagentError(\n\tvalue: unknown,\n\toptions: IrohRemoteTranscriptEventOptions,\n): Record<string, string> | undefined {\n\tif (!isRecord(value)) {\n\t\treturn undefined;\n\t}\n\tconst message = getIrohRemoteBoundedString(value.message, options, 1_000);\n\treturn message ? { message } : undefined;\n}\n\nfunction copyIrohRemoteBoundedString(\n\tfrom: Record<string, unknown>,\n\tto: Record<string, unknown>,\n\tkey: string,\n\toptions: IrohRemoteTranscriptEventOptions,\n\tmaxScalars: number,\n): void {\n\tconst value = getIrohRemoteBoundedString(from[key], options, maxScalars);\n\tif (value) {\n\t\tto[key] = value;\n\t}\n}\n\nfunction getIrohRemoteBoundedString(\n\tvalue: unknown,\n\toptions: IrohRemoteTranscriptEventOptions,\n\tmaxScalars: number,\n): string | undefined {\n\tif (typeof value !== \"string\" || value.trim().length === 0) {\n\t\treturn undefined;\n\t}\n\treturn truncateUnicodeScalars(sanitizeIrohRemoteTranscriptText(value, options, \"summary\").text, maxScalars);\n}\n\nfunction getIrohRemoteFiniteNumber(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction truncateUnicodeScalars(value: string, maxLength: number): string {\n\tconst scalars = Array.from(value);\n\treturn scalars.length <= maxLength ? value : scalars.slice(0, maxLength).join(\"\");\n}\n\nfunction normalizeIrohRemoteTranscriptTimestamp(timestamp: string): string {\n\tconst date = new Date(timestamp);\n\treturn Number.isNaN(date.getTime()) ? new Date(0).toISOString() : date.toISOString();\n}\n\nfunction attachIrohRemoteLiveActivityUpdates(\n\truntimeHost: AgentSessionRuntime,\n\tdelivery: IrohRemotePushNotificationDelivery | undefined,\n\tworkspaceName: string | undefined,\n): () => void {\n\tif (!delivery?.deliverLiveActivityUpdate) {\n\t\treturn () => {};\n\t}\n\tconst updater = new IrohRemoteLiveActivityUpdater(runtimeHost, delivery, workspaceName);\n\tconst unsubscribe = runtimeHost.session.subscribe((event) => {\n\t\tvoid updater.handle(event).catch(() => {});\n\t});\n\tupdater.start();\n\treturn unsubscribe;\n}\n\nclass IrohRemoteLiveActivityUpdater {\n\tprivate readonly delivery: Required<Pick<IrohRemotePushNotificationDelivery, \"deliverLiveActivityUpdate\">>;\n\tprivate readonly runtimeHost: AgentSessionRuntime;\n\tprivate readonly workspaceName: string | undefined;\n\tprivate readonly toolIndexesByCallId = new Map<string, number>();\n\tprivate readonly instanceId = randomUUID();\n\tprivate deliveryQueue: Promise<void> = Promise.resolve();\n\tprivate recentTools: IrohRemoteLiveActivityToolGlyph[] = [];\n\tprivate sequence = 0;\n\tprivate active = false;\n\tprivate pendingTerminalStatus: \"completed\" | \"failed\" | undefined;\n\n\tconstructor(\n\t\truntimeHost: AgentSessionRuntime,\n\t\tdelivery: IrohRemotePushNotificationDelivery,\n\t\tworkspaceName: string | undefined,\n\t) {\n\t\tif (!delivery.deliverLiveActivityUpdate) {\n\t\t\tthrow new Error(\"live activity delivery is unavailable\");\n\t\t}\n\t\tthis.runtimeHost = runtimeHost;\n\t\tthis.delivery = { deliverLiveActivityUpdate: delivery.deliverLiveActivityUpdate.bind(delivery) };\n\t\tthis.workspaceName = workspaceName;\n\t}\n\n\tstart(): void {\n\t\tif (!this.runtimeHost.session.isStreaming) {\n\t\t\treturn;\n\t\t}\n\t\tthis.active = true;\n\t\tvoid this.sendUpdate(\"running\").catch(() => {});\n\t}\n\n\tasync handle(event: AgentSessionEvent): Promise<void> {\n\t\tswitch (event.type) {\n\t\t\tcase \"agent_start\":\n\t\t\t\tthis.active = true;\n\t\t\t\tthis.pendingTerminalStatus = undefined;\n\t\t\t\tthis.recentTools = [];\n\t\t\t\tthis.toolIndexesByCallId.clear();\n\t\t\t\tawait this.sendUpdate(\"running\");\n\t\t\t\tbreak;\n\t\t\tcase \"tool_execution_start\":\n\t\t\t\tthis.active = true;\n\t\t\t\tif (this.recordTool(event.toolCallId, createLiveActivityToolGlyph(event.toolName, \"started\"))) {\n\t\t\t\t\tawait this.sendUpdate(\"running\");\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"tool_execution_end\":\n\t\t\t\tthis.active = true;\n\t\t\t\tif (\n\t\t\t\t\tthis.recordTool(\n\t\t\t\t\t\tevent.toolCallId,\n\t\t\t\t\t\tcreateLiveActivityToolGlyph(event.toolName, event.isError ? \"failed\" : \"completed\"),\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tawait this.sendUpdate(\"running\");\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"agent_end\":\n\t\t\t\tif (!this.active) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.pendingTerminalStatus = getRunTerminalOutcome(event.messages) === \"completed\" ? \"completed\" : \"failed\";\n\t\t\t\tbreak;\n\t\t\tcase \"agent_settled\": {\n\t\t\t\tif (!this.active || this.pendingTerminalStatus === undefined) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst terminalStatus = this.pendingTerminalStatus;\n\t\t\t\t// End the old run synchronously so delayed delivery cannot clear state\n\t\t\t\t// established by a newer agent_start handler.\n\t\t\t\tthis.active = false;\n\t\t\t\tthis.pendingTerminalStatus = undefined;\n\t\t\t\tthis.toolIndexesByCallId.clear();\n\t\t\t\tawait this.sendUpdate(terminalStatus);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tprivate recordTool(toolCallId: string | undefined, tool: IrohRemoteLiveActivityToolGlyph): boolean {\n\t\tconst normalizedCallId = typeof toolCallId === \"string\" && toolCallId.length > 0 ? toolCallId : undefined;\n\t\tif (normalizedCallId) {\n\t\t\tconst existingIndex = this.toolIndexesByCallId.get(normalizedCallId);\n\t\t\tif (existingIndex !== undefined && existingIndex < this.recentTools.length) {\n\t\t\t\tthis.recentTools[existingIndex] = tool;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\tif (this.recentTools.at(-1)?.name === tool.name) {\n\t\t\treturn false;\n\t\t}\n\t\tthis.recentTools.push(tool);\n\t\twhile (this.recentTools.length > 6) {\n\t\t\tthis.recentTools.shift();\n\t\t\tfor (const [callId, index] of this.toolIndexesByCallId) {\n\t\t\t\tif (index === 0) {\n\t\t\t\t\tthis.toolIndexesByCallId.delete(callId);\n\t\t\t\t} else {\n\t\t\t\t\tthis.toolIndexesByCallId.set(callId, index - 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (normalizedCallId) {\n\t\t\tthis.toolIndexesByCallId.set(normalizedCallId, this.recentTools.length - 1);\n\t\t}\n\t\treturn true;\n\t}\n\n\tprivate async sendUpdate(\n\t\tstatus: IrohRemoteLiveActivityContentState[\"status\"],\n\t\tactivityEvent: \"update\" | \"end\" = \"update\",\n\t): Promise<void> {\n\t\tconst nowSeconds = Math.floor(Date.now() / 1000);\n\t\tconst currentTool = this.recentTools.at(-1);\n\t\tconst completionState = getIrohRemoteCompletionState(this.runtimeHost);\n\t\tconst contentState: IrohRemoteLiveActivityContentState = {\n\t\t\tstatus,\n\t\t\tstatusText: liveActivityStatusText(status, currentTool),\n\t\t\t...(currentTool === undefined ? {} : { currentTool }),\n\t\t\trecentTools: this.recentTools.slice(-6),\n\t\t\tsessionID: completionState.sessionId,\n\t\t\t...(this.workspaceName === undefined ? {} : { workspaceName: this.workspaceName }),\n\t\t\tupdatedAtEpochSeconds: nowSeconds,\n\t\t};\n\t\tconst update: IrohRemoteLiveActivityUpdateIntent = {\n\t\t\teventId: `live-activity:${completionState.sessionId}:${completionState.runId ?? \"active\"}:${this.instanceId}:${++this.sequence}`,\n\t\t\tkind: activityEvent === \"end\" ? \"live_activity_end\" : \"live_activity_update\",\n\t\t\tactivityEvent,\n\t\t\tcontentState,\n\t\t\t...(activityEvent === \"end\"\n\t\t\t\t? { dismissalDateEpochSeconds: nowSeconds + 45 }\n\t\t\t\t: { staleDateEpochSeconds: nowSeconds + 90 }),\n\t\t};\n\t\tconst delivery = this.deliveryQueue.then(() => this.delivery.deliverLiveActivityUpdate(update));\n\t\tthis.deliveryQueue = delivery.then(\n\t\t\t() => {},\n\t\t\t() => {},\n\t\t);\n\t\tawait delivery;\n\t}\n}\n\nfunction createLiveActivityToolGlyph(\n\ttoolName: string | undefined,\n\tstatus: IrohRemoteLiveActivityToolGlyph[\"status\"],\n): IrohRemoteLiveActivityToolGlyph {\n\tconst name = sanitizeLiveActivityToolName(toolName);\n\treturn {\n\t\tname,\n\t\tsymbolName: liveActivitySymbolNameForTool(name),\n\t\tstatus,\n\t};\n}\n\nfunction sanitizeLiveActivityToolName(toolName: string | undefined): string {\n\tconst trimmed = toolName?.trim();\n\tif (!trimmed) {\n\t\treturn \"tool\";\n\t}\n\treturn trimmed.slice(0, 32);\n}\n\nexport function createIrohRemoteHostCommandRpcTransport(\n\toptions: IrohRemoteHostCommandRpcTransportOptions,\n): RpcTransport & { setRpcModeStartupComplete?(startupComplete: boolean): void } {\n\tlet pendingInboundCommand = Promise.resolve();\n\tconst inboundCommandContext = new AsyncLocalStorage<boolean>();\n\tconst startupAwareTransport = options.transport as {\n\t\tsetRpcModeStartupComplete?: (startupComplete: boolean) => void;\n\t};\n\tconst waitForPendingInboundCommand = async (): Promise<void> => {\n\t\t// Command handlers themselves call transport backpressure/flush/close.\n\t\t// Awaiting their own pending promise would form a cycle; external callers\n\t\t// still wait for the full serialized inbound command chain.\n\t\tif (inboundCommandContext.getStore() === true) {\n\t\t\treturn;\n\t\t}\n\t\tawait pendingInboundCommand;\n\t};\n\n\tconst writeHandlerError = async (line: string, error: unknown): Promise<void> => {\n\t\tconst target = getIrohRemoteRpcErrorTarget(line);\n\t\tawait options.transport.write(\n\t\t\tcreateIrohRemoteRpcErrorResponse(\n\t\t\t\ttarget.id,\n\t\t\t\ttarget.command,\n\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t),\n\t\t);\n\t};\n\n\tconst handleLine = async (line: string, handler: RpcLineHandler): Promise<void> => {\n\t\tconst command = parseIrohRemoteHostCommandLine(line);\n\t\tif (!command) {\n\t\t\tawait handler(line);\n\t\t\treturn;\n\t\t}\n\t\tlet response: object | undefined;\n\t\ttry {\n\t\t\tif (options.isRpcGrantCurrent && !(await options.isRpcGrantCurrent())) {\n\t\t\t\tconst target = getIrohRemoteRpcErrorTarget(line);\n\t\t\t\tresponse = createIrohRemoteRpcErrorResponse(target.id, target.command, \"RPC grant is stale; reconnect\");\n\t\t\t} else {\n\t\t\t\tresponse = await options.handleCommand?.(command);\n\t\t\t}\n\t\t} catch (error: unknown) {\n\t\t\tawait writeHandlerError(line, error);\n\t\t\treturn;\n\t\t}\n\t\tif (response === undefined) {\n\t\t\tawait handler(line);\n\t\t\treturn;\n\t\t}\n\t\tawait options.transport.write(response);\n\t};\n\n\treturn {\n\t\tsetRpcModeStartupComplete(startupComplete: boolean) {\n\t\t\tstartupAwareTransport.setRpcModeStartupComplete?.(startupComplete);\n\t\t},\n\t\twrite(value) {\n\t\t\treturn options.transport.write(value);\n\t\t},\n\t\tonLine(handler: RpcLineHandler): () => void {\n\t\t\treturn options.transport.onLine((line) => {\n\t\t\t\tpendingInboundCommand = pendingInboundCommand.then(\n\t\t\t\t\t() => inboundCommandContext.run(true, () => handleLine(line, handler)),\n\t\t\t\t\t() => inboundCommandContext.run(true, () => handleLine(line, handler)),\n\t\t\t\t);\n\t\t\t\tvoid pendingInboundCommand.catch(() => {});\n\t\t\t\treturn pendingInboundCommand;\n\t\t\t});\n\t\t},\n\t\tonClose(handler: RpcCloseHandler): () => void {\n\t\t\treturn options.transport.onClose?.(handler) ?? (() => {});\n\t\t},\n\t\tasync waitForBackpressure() {\n\t\t\tawait waitForPendingInboundCommand();\n\t\t\tawait options.transport.waitForBackpressure?.();\n\t\t},\n\t\tasync flush() {\n\t\t\tawait waitForPendingInboundCommand();\n\t\t\tawait options.transport.flush?.();\n\t\t},\n\t\tasync close() {\n\t\t\tawait waitForPendingInboundCommand();\n\t\t\tawait options.transport.close();\n\t\t},\n\t};\n}\n\nfunction parseIrohRemoteHostCommandLine(line: string): Record<string, unknown> | undefined {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(line);\n\t} catch {\n\t\treturn undefined;\n\t}\n\tif (!isRecord(parsed) || typeof parsed.type !== \"string\") {\n\t\treturn undefined;\n\t}\n\treturn parsed;\n}\n\nfunction getIrohRemoteRpcErrorTarget(line: string): { id: string | undefined; command: string } {\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(line);\n\t\tif (!isRecord(parsed)) {\n\t\t\treturn { id: undefined, command: \"unknown\" };\n\t\t}\n\t\treturn {\n\t\t\tid: typeof parsed.id === \"string\" ? parsed.id : undefined,\n\t\t\tcommand: typeof parsed.type === \"string\" ? parsed.type : \"unknown\",\n\t\t};\n\t} catch {\n\t\treturn { id: undefined, command: \"parse\" };\n\t}\n}\n\nfunction liveActivityStatusText(\n\tstatus: IrohRemoteLiveActivityContentState[\"status\"],\n\tcurrentTool: IrohRemoteLiveActivityToolGlyph | undefined,\n): string {\n\tif (status === \"completed\") {\n\t\treturn \"Volt finished\";\n\t}\n\tif (status === \"failed\") {\n\t\treturn \"Volt needs attention\";\n\t}\n\tif (status === \"waiting\") {\n\t\treturn \"Waiting for input\";\n\t}\n\treturn currentTool ? `Using ${currentTool.name}` : \"Volt is thinking\";\n}\n\nfunction liveActivitySymbolNameForTool(toolName: string): string {\n\tswitch (toolName.toLowerCase()) {\n\t\tcase \"read\":\n\t\t\treturn \"doc.text.magnifyingglass\";\n\t\tcase \"write\":\n\t\t\treturn \"square.and.pencil\";\n\t\tcase \"edit\":\n\t\t\treturn \"pencil.and.outline\";\n\t\tcase \"bash\":\n\t\tcase \"shell\":\n\t\tcase \"terminal\":\n\t\t\treturn \"terminal\";\n\t\tcase \"find\":\n\t\tcase \"grep\":\n\t\tcase \"search\":\n\t\tcase \"rg\":\n\t\t\treturn \"magnifyingglass\";\n\t\tcase \"lsp\":\n\t\t\treturn \"point.3.connected.trianglepath.dotted\";\n\t\tcase \"build\":\n\t\tcase \"build_sim\":\n\t\tcase \"build_run_sim\":\n\t\t\treturn \"hammer\";\n\t\tcase \"test\":\n\t\tcase \"test_sim\":\n\t\t\treturn \"checkmark.seal\";\n\t\tcase \"screenshot\":\n\t\tcase \"snapshot_ui\":\n\t\t\treturn \"camera.viewfinder\";\n\t\tcase \"tap\":\n\t\tcase \"touch\":\n\t\tcase \"gesture\":\n\t\tcase \"swipe\":\n\t\tcase \"drag\":\n\t\t\treturn \"hand.tap\";\n\t\tdefault:\n\t\t\treturn \"sparkles\";\n\t}\n}\n\nexport function createIrohRemoteCloseDeferringRpcTransport(\n\toptions: IrohRemoteCloseDeferringRpcTransportOptions,\n): RpcTransport {\n\tconst pendingCommands = new Set<PendingIrohRemoteCommand>();\n\tlet rpcModeStartupComplete = true;\n\tlet startupCompletedPendingCommand = false;\n\tlet startupCleanClosePending = false;\n\tconst startupCleanCloseHandlers = new Set<() => void>();\n\n\tconst createPendingCommand = (command: string, id: string | undefined): PendingIrohRemoteCommand => {\n\t\tlet finished = false;\n\t\tlet resolveDone = () => {};\n\t\tconst pending: PendingIrohRemoteCommand = {\n\t\t\tcommand,\n\t\t\tid,\n\t\t\tinitialState: options.getCompletionState?.(),\n\t\t\tdone: new Promise<void>((resolve) => {\n\t\t\t\tresolveDone = resolve;\n\t\t\t}),\n\t\t\tresponseMatched: false,\n\t\t\tfinish() {\n\t\t\t\tif (finished) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tfinished = true;\n\t\t\t\tpendingCommands.delete(pending);\n\t\t\t\tif (!rpcModeStartupComplete) {\n\t\t\t\t\tstartupCompletedPendingCommand = true;\n\t\t\t\t}\n\t\t\t\tresolveDone();\n\t\t\t},\n\t\t};\n\t\tpendingCommands.add(pending);\n\t\treturn pending;\n\t};\n\n\tconst waitForPendingCommands = async (): Promise<void> => {\n\t\twhile (pendingCommands.size > 0) {\n\t\t\tawait Promise.allSettled([...pendingCommands].map((pending) => pending.done));\n\t\t}\n\t};\n\n\tconst findPendingCommand = (command: string, id: string | undefined): PendingIrohRemoteCommand | undefined => {\n\t\tfor (const pending of pendingCommands) {\n\t\t\tif (!pending.responseMatched && pending.command === command && pending.id === id) {\n\t\t\t\treturn pending;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t};\n\n\tconst trackInboundLine = (line: string): PendingIrohRemoteCommand | undefined => {\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(line);\n\t\t} catch {\n\t\t\treturn createPendingCommand(\"parse\", undefined);\n\t\t}\n\t\tif (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n\t\t\treturn createPendingCommand(\"unknown\", undefined);\n\t\t}\n\t\tconst command = parsed as Record<string, unknown>;\n\t\tif (typeof command.type !== \"string\") {\n\t\t\treturn createPendingCommand(\"unknown\", typeof command.id === \"string\" ? command.id : undefined);\n\t\t}\n\t\tif (command.type === \"extension_ui_response\" || command.type === \"host_action_response\") {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn createPendingCommand(command.type, typeof command.id === \"string\" ? command.id : undefined);\n\t};\n\n\tconst notifyCompletedCommand = async (\n\t\tpending: PendingIrohRemoteCommand,\n\t\tresponse?: Record<string, unknown>,\n\t): Promise<void> => {\n\t\tawait options.onCommandCompleted?.({\n\t\t\tcommand: pending.command,\n\t\t\tid: pending.id,\n\t\t\tinitialState: pending.initialState,\n\t\t\tfinalState: options.getCompletionState?.(),\n\t\t\tresponse,\n\t\t});\n\t};\n\n\tconst finishAfterCommandCompletion = async (\n\t\tpending: PendingIrohRemoteCommand,\n\t\tresponse?: Record<string, unknown>,\n\t): Promise<void> => {\n\t\ttry {\n\t\t\tawait notifyCompletedCommand(pending, response);\n\t\t} finally {\n\t\t\tpending.finish();\n\t\t}\n\t};\n\n\tconst finishAfterPromptCompletion = async (pending: PendingIrohRemoteCommand): Promise<void> => {\n\t\ttry {\n\t\t\t// Prompt success is emitted just before AgentSession starts the run.\n\t\t\t// Steer/follow_up success means input was accepted into an active session run.\n\t\t\t// Yield once so waitForIdle observes that run or any accepted queued input.\n\t\t\tawait Promise.resolve();\n\t\t\tawait options.waitForPromptCompletion();\n\t\t\tawait notifyCompletedCommand(pending);\n\t\t} finally {\n\t\t\tpending.finish();\n\t\t}\n\t};\n\n\tconst trackOutboundResponse = (value: object): void => {\n\t\tconst response = value as Record<string, unknown>;\n\t\tif (response.type !== \"response\" || typeof response.command !== \"string\") {\n\t\t\treturn;\n\t\t}\n\t\tconst pending = findPendingCommand(response.command, typeof response.id === \"string\" ? response.id : undefined);\n\t\tif (!pending) {\n\t\t\treturn;\n\t\t}\n\t\tpending.responseMatched = true;\n\t\tif (response.success === true && shouldWaitForRemoteResponseCompletion(pending.command, response)) {\n\t\t\tvoid finishAfterPromptCompletion(pending).catch(() => {});\n\t\t\treturn;\n\t\t}\n\t\tif (response.success === true && isCompletedReviewInvocationResponse(pending.command, response)) {\n\t\t\tvoid finishAfterCommandCompletion(pending, response).catch(() => {});\n\t\t\treturn;\n\t\t}\n\t\tpending.finish();\n\t};\n\n\tconst notifyResponseWritten = async (value: object, writeResult: void | Promise<void>): Promise<void> => {\n\t\tawait writeResult;\n\t\tconst response = value as Record<string, unknown>;\n\t\tif (response.type !== \"response\") {\n\t\t\treturn;\n\t\t}\n\t\tawait options.onResponseWritten?.(response);\n\t};\n\n\tconst transport: IrohRemoteCloseDeferringRpcTransport = {\n\t\tsetRpcModeStartupComplete(startupComplete) {\n\t\t\trpcModeStartupComplete = startupComplete;\n\t\t\tif (!rpcModeStartupComplete || !startupCleanClosePending) {\n\t\t\t\tif (rpcModeStartupComplete) {\n\t\t\t\t\tstartupCompletedPendingCommand = false;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstartupCleanClosePending = false;\n\t\t\tstartupCompletedPendingCommand = false;\n\t\t\tfor (const handler of startupCleanCloseHandlers) {\n\t\t\t\thandler();\n\t\t\t}\n\t\t},\n\t\twrite(value) {\n\t\t\ttrackOutboundResponse(value);\n\t\t\tconst result = options.transport.write(value);\n\t\t\tif (options.onResponseWritten && (value as Record<string, unknown>).type === \"response\") {\n\t\t\t\treturn notifyResponseWritten(value, result);\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\tonLine(handler: RpcLineHandler): () => void {\n\t\t\treturn options.transport.onLine(async (line) => {\n\t\t\t\tconst pending = trackInboundLine(line);\n\t\t\t\ttry {\n\t\t\t\t\tawait handler(line);\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\tpending?.finish();\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tonClose(handler: RpcCloseHandler): () => void {\n\t\t\tlet active = true;\n\t\t\tconst handleCleanClose = () => {\n\t\t\t\tvoid waitForPendingCommands().then(() => {\n\t\t\t\t\tif (active) {\n\t\t\t\t\t\thandler();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t\tstartupCleanCloseHandlers.add(handleCleanClose);\n\t\t\tconst detach =\n\t\t\t\toptions.transport.onClose?.((error) => {\n\t\t\t\t\tif (!active) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\thandler(error);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (!rpcModeStartupComplete && (pendingCommands.size > 0 || startupCompletedPendingCommand)) {\n\t\t\t\t\t\tstartupCleanClosePending = true;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\thandleCleanClose();\n\t\t\t\t}) ?? (() => {});\n\t\t\treturn () => {\n\t\t\t\tactive = false;\n\t\t\t\tstartupCleanCloseHandlers.delete(handleCleanClose);\n\t\t\t\tdetach();\n\t\t\t};\n\t\t},\n\t\tasync waitForBackpressure() {\n\t\t\tawait options.transport.waitForBackpressure?.();\n\t\t},\n\t\tasync flush() {\n\t\t\tawait options.transport.flush?.();\n\t\t},\n\t\tclose() {\n\t\t\treturn options.transport.close();\n\t\t},\n\t};\n\treturn transport;\n}\n\nfunction getIrohRemoteCompletionState(runtimeHost: AgentSessionRuntime): IrohRemoteCompletionState {\n\treturn {\n\t\tsessionId: runtimeHost.session.sessionId,\n\t\trunId: runtimeHost.session.sessionManager.getLeafId() ?? undefined,\n\t\tterminalOutcome: getRunTerminalOutcome(runtimeHost.session.messages),\n\t};\n}\n\nfunction createIrohRemoteCompletionNotification(\n\tcompletion: IrohRemoteCompletedCommand,\n\tworkspaceName: string | undefined,\n): IrohRemoteNotificationRequest | undefined {\n\tconst finalState = getChangedFinalCompletionState(completion);\n\tif (!finalState) {\n\t\treturn undefined;\n\t}\n\tconst workspace = getSafeNotificationWorkspace(workspaceName);\n\tconst workspaceDetails = workspace === undefined ? {} : { workspace };\n\tif (isConversationCompletionCommand(completion.command)) {\n\t\tswitch (finalState.terminalOutcome) {\n\t\t\tcase \"failed\":\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"notification_request\",\n\t\t\t\t\teventId: `conversation:${finalState.sessionId}:${finalState.runId}:failed`,\n\t\t\t\t\tkind: \"host_notice\",\n\t\t\t\t\ttitle: workspace === undefined ? \"Volt needs attention\" : `Volt needs attention in ${workspace}`,\n\t\t\t\t\tbody: \"Open Volt to view the error.\",\n\t\t\t\t\tsessionId: finalState.sessionId,\n\t\t\t\t\t...workspaceDetails,\n\t\t\t\t};\n\t\t\tcase \"aborted\":\n\t\t\t\treturn undefined;\n\t\t\tcase \"completed\":\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"notification_request\",\n\t\t\t\t\teventId: `conversation:${finalState.sessionId}:${finalState.runId}:completed`,\n\t\t\t\t\tkind: \"conversation_completed\",\n\t\t\t\t\ttitle: workspace === undefined ? \"Volt finished\" : `Volt finished in ${workspace}`,\n\t\t\t\t\tbody: \"Your conversation is ready.\",\n\t\t\t\t\tsessionId: finalState.sessionId,\n\t\t\t\t\t...workspaceDetails,\n\t\t\t\t};\n\t\t}\n\t}\n\tif (isCompletedReviewInvocationResponse(completion.command, completion.response)) {\n\t\treturn {\n\t\t\ttype: \"notification_request\",\n\t\t\teventId: `review:${finalState.sessionId}:${finalState.runId}:completed`,\n\t\t\tkind: \"review_completed\",\n\t\t\ttitle: workspace === undefined ? \"Review complete\" : `Review complete in ${workspace}`,\n\t\t\tbody: \"Open Volt to see the findings.\",\n\t\t\tsessionId: finalState.sessionId,\n\t\t\t...workspaceDetails,\n\t\t};\n\t}\n\treturn undefined;\n}\n\nfunction getSafeNotificationWorkspace(workspaceName: string | undefined): string | undefined {\n\tif (workspaceName === undefined) {\n\t\treturn undefined;\n\t}\n\tconst trimmed = workspaceName.trim();\n\tif (trimmed.length === 0 || trimmed.includes(\"/\") || trimmed.includes(\"\\\\\") || trimmed.includes(\"\\0\")) {\n\t\treturn undefined;\n\t}\n\treturn trimmed;\n}\n\nfunction getChangedFinalCompletionState(\n\tcompletion: IrohRemoteCompletedCommand,\n): { sessionId: string; runId: string; terminalOutcome: IrohRemoteRunTerminalOutcome } | undefined {\n\tconst finalState = completion.finalState;\n\tif (!finalState?.runId) {\n\t\treturn undefined;\n\t}\n\tconst initialState = completion.initialState;\n\tif (initialState?.sessionId === finalState.sessionId && initialState.runId === finalState.runId) {\n\t\treturn undefined;\n\t}\n\treturn {\n\t\tsessionId: finalState.sessionId,\n\t\trunId: finalState.runId,\n\t\tterminalOutcome: finalState.terminalOutcome ?? \"completed\",\n\t};\n}\n\nfunction getRunTerminalOutcome(messages: readonly AgentMessage[]): IrohRemoteRunTerminalOutcome {\n\tfor (let index = messages.length - 1; index >= 0; index--) {\n\t\tconst message = messages[index];\n\t\tif (message.role !== \"assistant\") {\n\t\t\tcontinue;\n\t\t}\n\t\tif (message.stopReason === \"error\") {\n\t\t\treturn \"failed\";\n\t\t}\n\t\tif (message.stopReason === \"aborted\") {\n\t\t\treturn \"aborted\";\n\t\t}\n\t\treturn \"completed\";\n\t}\n\treturn \"completed\";\n}\n\nfunction isConversationCompletionCommand(command: string): boolean {\n\treturn command === \"prompt\" || command === \"steer\" || command === \"follow_up\";\n}\n\nfunction shouldWaitForRemoteResponseCompletion(command: string, response: Record<string, unknown>): boolean {\n\tif (isConversationCompletionCommand(command)) {\n\t\treturn true;\n\t}\n\tif (command !== \"invoke_ui_action\") {\n\t\treturn false;\n\t}\n\tconst data = response.data;\n\tif (!isRecord(data)) {\n\t\treturn false;\n\t}\n\treturn data.status === \"accepted\" || data.status === \"queued\";\n}\n\nfunction isCompletedReviewInvocationResponse(\n\tcommand: string,\n\tresponse: Record<string, unknown> | undefined,\n): response is Record<string, unknown> & { data: { action: string; status: \"completed\" } } {\n\tif (command !== \"invoke_ui_action\" || !response) {\n\t\treturn false;\n\t}\n\tconst data = response.data;\n\tif (!isRecord(data)) {\n\t\treturn false;\n\t}\n\treturn data.status === \"completed\" && isReviewActionId(data.action);\n}\n\nfunction isReviewActionId(action: unknown): boolean {\n\treturn action === REVIEW_UNCOMMITTED_ACTION_ID || action === REVIEW_BRANCH_ACTION_ID;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"]}