@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 @@
1
+ {"version":3,"file":"remote-cli.js","sourceRoot":"","sources":["../../src/daemon/remote-cli.ts"],"names":[],"mappings":"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","sourcesContent":["import { basename, resolve } from \"node:path\";\nimport { getAgentDir, VERSION } from \"../config.ts\";\nimport { type IrohRemoteAccessPresetName, isIrohRemoteAccessPresetName } from \"../core/remote/iroh/access-grant.ts\";\nimport { formatIrohRemoteTicketQrCode } from \"../core/remote/iroh/qr.ts\";\nimport { getIrohRemotePairingVerificationDetails } from \"../core/remote/iroh/ticket.ts\";\nimport { spawnProcess, waitForChildProcess } from \"../utils/child-process.ts\";\nimport { createDaemonClient, type DaemonClient } from \"./control-client.ts\";\nimport type { ControlEvent, ControlResponse } from \"./control-protocol.ts\";\nimport { ensureDaemonRunning, probeDaemon } from \"./spawn.ts\";\n\nfunction printRemoteUsage(): void {\n\tconsole.error(`Usage: volt remote <command>\n\nCommands:\n pair [--workspace <name>] [--access coding|review|chat|full]\n Create a pairing ticket (default access: coding).\n access <node-id> set <preset> Update a paired device's tool and RPC access.\n status [--json] Show daemon status (workspaces, clients, leases).\n clients List paired clients.\n revoke <node-id> Revoke a paired client and close its connections.\n approve-repair <node-id> Allow a revoked client node ID to re-pair.\n workspace add [path] [--name <name>]\n Register a workspace with the daemon.\n workspace remove <name> Unregister an empty workspace (refuses while worktrees exist).\n workspace list List registered workspaces.\n worktree add [--workspace <name>] [--name <id>] [--branch <ref>] [--base <ref>]\n Create a daemon-managed git worktree.\n worktree adopt <path> [--workspace <name>] [--name <id>] [--base <ref>]\n Adopt an existing git worktree checkout.\n worktree list [--workspace <name>] [--json]\n List daemon-managed worktrees.\n worktree remove <id> [--workspace <name>] [--force]\n Remove a worktree (refuses dirty/busy without --force).\n worktree prune [--workspace <name>]\n Reconcile worktree records against the filesystem.\n worktree diff <id> [--workspace <name>]\n Show the worktree branch's diff against its base ref.\n\n\"volt remote host\" has been replaced by the background daemon. Run \"volt daemon start\"\n(or enable remote.background). See docs/daemon.md.\n`);\n}\n\ninterface RemoteControlSession {\n\tclient: DaemonClient;\n\tevents: (handler: (event: ControlEvent) => void) => void;\n\t/** Resolves if the daemon control connection is lost before close() is called. */\n\twhenConnectionLost: Promise<void>;\n\tclose(): Promise<void>;\n}\n\nasync function connectToDaemon(options: { autoStart: boolean }): Promise<RemoteControlSession | undefined> {\n\tconst agentDir = getAgentDir();\n\tlet probe = await probeDaemon(agentDir);\n\tif (!probe.healthy && options.autoStart) {\n\t\tprobe = await ensureDaemonRunning(agentDir);\n\t}\n\tif (!probe.healthy) {\n\t\tconsole.error(\"voltd is not running. Start it with: volt daemon start\");\n\t\tprocess.exitCode = 1;\n\t\treturn undefined;\n\t}\n\tconst handlers = new Set<(event: ControlEvent) => void>();\n\tlet closing = false;\n\tlet resolveConnectionLost: () => void = () => {};\n\tconst whenConnectionLost = new Promise<void>((resolve) => {\n\t\tresolveConnectionLost = resolve;\n\t});\n\tconst client = createDaemonClient({\n\t\tsocketPath: probe.socketPath,\n\t\tclient: \"cli\",\n\t\tversion: VERSION,\n\t\tauthToken: probe.authToken,\n\t\treconnect: false,\n\t\tonEvent: (event) => {\n\t\t\tfor (const handler of handlers) {\n\t\t\t\thandler(event);\n\t\t\t}\n\t\t},\n\t\tonConnectionStateChange: (nextState) => {\n\t\t\tif (nextState === \"gone\" && !closing) {\n\t\t\t\tresolveConnectionLost();\n\t\t\t}\n\t\t},\n\t});\n\ttry {\n\t\tawait client.connect();\n\t} catch (error) {\n\t\tconsole.error(`Error: could not connect to voltd: ${error instanceof Error ? error.message : String(error)}`);\n\t\tprocess.exitCode = 1;\n\t\treturn undefined;\n\t}\n\treturn {\n\t\tclient,\n\t\tevents: (handler) => {\n\t\t\thandlers.add(handler);\n\t\t},\n\t\twhenConnectionLost,\n\t\tclose: () => {\n\t\t\tclosing = true;\n\t\t\treturn client.close();\n\t\t},\n\t};\n}\n\nfunction reportControlError(response: ControlResponse, context: string): boolean {\n\tif (response.type === \"error\") {\n\t\tconst code = response.code === \"workspace_has_worktrees\" ? ` [${response.code}]` : \"\";\n\t\tconsole.error(`Error: ${context}${code}: ${response.message}`);\n\t\tprocess.exitCode = 1;\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n/** Render only the non-secret ticket fields a user should compare in Volt. */\nexport function formatRemotePairingVerificationLines(ticket: string): string[] {\n\tconst details = getIrohRemotePairingVerificationDetails(ticket);\n\treturn [\n\t\t\"verify these details in Volt before confirming:\",\n\t\t\" Fingerprint\",\n\t\t` ${details.hostFingerprint}`,\n\t\t\" Host ID\",\n\t\t` ${details.hostNodeId}`,\n\t\t\" Workspace\",\n\t\t` ${details.workspace}`,\n\t\t\" Relay mode\",\n\t\t` ${details.relayMode}`,\n\t\t\" HTTPS relay origins\",\n\t\t...(details.relayOrigins.length === 0 ? [\" none\"] : details.relayOrigins.map((origin) => ` ${origin}`)),\n\t\t\" Expires (UTC)\",\n\t\t` ${details.expiresAt === undefined ? \"not specified\" : new Date(details.expiresAt).toISOString()}`,\n\t];\n}\n\nasync function handlePairCommand(args: string[]): Promise<void> {\n\tlet workspaceName: string | undefined;\n\tlet access: IrohRemoteAccessPresetName = \"coding\";\n\tconst accessIndex = args.indexOf(\"--access\");\n\tif (accessIndex !== -1) {\n\t\tconst value = args[accessIndex + 1];\n\t\tif (!isIrohRemoteAccessPresetName(value)) {\n\t\t\tconsole.error(\"Error: --access requires coding, review, chat, or full\");\n\t\t\tprocess.exitCode = 1;\n\t\t\treturn;\n\t\t}\n\t\taccess = value;\n\t}\n\tconst workspaceIndex = args.indexOf(\"--workspace\");\n\tif (workspaceIndex !== -1) {\n\t\tworkspaceName = args[workspaceIndex + 1];\n\t\tif (!workspaceName) {\n\t\t\tconsole.error(\"Error: --workspace requires a value\");\n\t\t\tprocess.exitCode = 1;\n\t\t\treturn;\n\t\t}\n\t}\n\n\tconst session = await connectToDaemon({ autoStart: true });\n\tif (!session) {\n\t\treturn;\n\t}\n\ttry {\n\t\t// Default the pairing workspace to the daemon workspace registered for the cwd,\n\t\t// registering the cwd when nothing matches (name = basename).\n\t\tif (workspaceName === undefined) {\n\t\t\tconst status = await session.client.request({ type: \"status\" });\n\t\t\tif (status.type !== \"status_result\") {\n\t\t\t\treportControlError(status, \"status\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst cwd = resolve(process.cwd());\n\t\t\tconst match = status.workspaces\n\t\t\t\t.filter((workspace) => cwd === workspace.path || cwd.startsWith(`${workspace.path}/`))\n\t\t\t\t.sort((left, right) => right.path.length - left.path.length)[0];\n\t\t\tif (match) {\n\t\t\t\tworkspaceName = match.name;\n\t\t\t} else {\n\t\t\t\tworkspaceName = basename(cwd) || \"workspace\";\n\t\t\t\tconst registered = await session.client.request({\n\t\t\t\t\ttype: \"workspace_register\",\n\t\t\t\t\tname: workspaceName,\n\t\t\t\t\tpath: cwd,\n\t\t\t\t});\n\t\t\t\tif (reportControlError(registered, \"workspace register\")) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconsole.error(`registered workspace: ${workspaceName} -> ${cwd}`);\n\t\t\t}\n\t\t}\n\n\t\tconst done = new Promise<void>((resolveDone) => {\n\t\t\tsession.events((event) => {\n\t\t\t\tif (event.type !== \"pairing_progress\") {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (event.phase === \"ticket\" && event.ticket) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor (const line of formatRemotePairingVerificationLines(event.ticket)) console.error(line);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t`pairing failed: ticket verification details are invalid: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tprocess.exitCode = 1;\n\t\t\t\t\t\tresolveDone();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (process.stderr.isTTY) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconsole.error(\"pairing ticket QR:\");\n\t\t\t\t\t\t\tconsole.error(formatIrohRemoteTicketQrCode(event.ticket));\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t`Could not render pairing QR: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconsole.error(\"pairing ticket:\");\n\t\t\t\t\tconsole.log(event.ticket);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (event.phase === \"waiting\") {\n\t\t\t\t\tconsole.error(\"waiting for the phone to pair (Ctrl-C to stop waiting)...\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (event.phase === \"completed\") {\n\t\t\t\t\tconsole.error(`paired: ${event.clientNodeId ?? \"client\"}`);\n\t\t\t\t\tresolveDone();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (event.phase === \"failed\") {\n\t\t\t\t\tconsole.error(`pairing failed: ${event.error ?? \"unknown error\"}`);\n\t\t\t\t\tprocess.exitCode = 1;\n\t\t\t\t\tresolveDone();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tconst response = await session.client.request({\n\t\t\ttype: \"pair_request\",\n\t\t\taccess,\n\t\t\t...(workspaceName === undefined ? {} : { workspaceName }),\n\t\t});\n\t\tif (reportControlError(response, \"pair\")) {\n\t\t\treturn;\n\t\t}\n\t\tawait Promise.race([\n\t\t\tdone,\n\t\t\tsession.whenConnectionLost.then(() => {\n\t\t\t\tconsole.error(\"Error: lost connection to voltd while waiting for the phone to pair\");\n\t\t\t\tprocess.exitCode = 1;\n\t\t\t}),\n\t\t]);\n\t} finally {\n\t\tawait session.close();\n\t}\n}\n\nasync function handleStatusCommand(args: string[]): Promise<void> {\n\tconst session = await connectToDaemon({ autoStart: false });\n\tif (!session) {\n\t\treturn;\n\t}\n\ttry {\n\t\tconst response = await session.client.request({ type: \"status\" });\n\t\tif (response.type !== \"status_result\") {\n\t\t\treportControlError(response, \"status\");\n\t\t\treturn;\n\t\t}\n\t\tif (args.includes(\"--json\")) {\n\t\t\tconsole.log(JSON.stringify({ ...response, id: undefined, type: undefined }, null, 2));\n\t\t\treturn;\n\t\t}\n\t\tconsole.error(`voltd ${response.version} (pid ${response.pid})`);\n\t\tconsole.error(`workspaces: ${response.workspaces.length}`);\n\t\tfor (const workspace of response.workspaces) {\n\t\t\tconsole.error(` ${workspace.name} -> ${workspace.path}`);\n\t\t}\n\t\tconsole.error(`paired clients: ${response.clients.length}`);\n\t\tfor (const client of response.clients) {\n\t\t\tconsole.error(` ${client.clientNodeId}${client.label ? ` (${client.label})` : \"\"}`);\n\t\t}\n\t\tconsole.error(`phone connections: ${response.phoneConnections}`);\n\t\tconsole.error(`leases: ${response.leases.length}`);\n\t\tfor (const lease of response.leases) {\n\t\t\tconsole.error(\n\t\t\t\t` ${lease.workspaceName}/${lease.sessionId}: ${lease.state} (streams ${lease.streamCount}, relays ${lease.relayCount})`,\n\t\t\t);\n\t\t}\n\t} finally {\n\t\tawait session.close();\n\t}\n}\n\nasync function handleClientsCommand(): Promise<void> {\n\tconst session = await connectToDaemon({ autoStart: false });\n\tif (!session) {\n\t\treturn;\n\t}\n\ttry {\n\t\tconst response = await session.client.request({ type: \"clients_list\" });\n\t\tif (response.type !== \"clients_result\") {\n\t\t\treportControlError(response, \"clients\");\n\t\t\treturn;\n\t\t}\n\t\tconsole.log(JSON.stringify(response.clients, null, 2));\n\t} finally {\n\t\tawait session.close();\n\t}\n}\n\nasync function handleAccessCommand(args: string[]): Promise<void> {\n\tconst [nodeId, action, presetValue] = args;\n\tif (!nodeId || action !== \"set\" || !isIrohRemoteAccessPresetName(presetValue)) {\n\t\tconsole.error(\"Error: usage: volt remote access <node-id> set coding|review|chat|full\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tconst session = await connectToDaemon({ autoStart: false });\n\tif (!session) return;\n\ttry {\n\t\tconst clients = await session.client.request({ type: \"clients_list\" });\n\t\tif (clients.type !== \"clients_result\") {\n\t\t\treportControlError(clients, \"clients\");\n\t\t\treturn;\n\t\t}\n\t\tconst client = clients.clients.find((entry) => entry.clientNodeId === nodeId);\n\t\tif (!client) {\n\t\t\tconsole.error(`Error: paired client not found: ${nodeId}`);\n\t\t\tprocess.exitCode = 1;\n\t\t\treturn;\n\t\t}\n\t\tif (!client.rpcGrant) {\n\t\t\tconsole.error(`Error: paired client has no RPC grant and must re-pair: ${nodeId}`);\n\t\t\tprocess.exitCode = 1;\n\t\t\treturn;\n\t\t}\n\t\tconst response = await session.client.request({\n\t\t\ttype: \"client_access_update\",\n\t\t\tclientNodeId: nodeId,\n\t\t\texpectedRevision: client.rpcGrant.revision,\n\t\t\taccess: presetValue,\n\t\t});\n\t\tif (reportControlError(response, \"access set\")) return;\n\t\tif (response.type !== \"client_access_updated\" || response.client.rpcGrant === undefined) {\n\t\t\tconsole.error(\"Error: unexpected daemon response for access set\");\n\t\t\tprocess.exitCode = 1;\n\t\t\treturn;\n\t\t}\n\t\tconsole.error(`updated access for ${nodeId}: ${presetValue} (revision ${response.client.rpcGrant.revision})`);\n\t} finally {\n\t\tawait session.close();\n\t}\n}\n\nasync function handleRevokeCommand(args: string[]): Promise<void> {\n\tconst all = args.includes(\"--all\");\n\tconst positionals = args.filter((arg) => !arg.startsWith(\"--\"));\n\tif (!all && positionals.length === 0) {\n\t\tconsole.error(\"Error: Missing node id to revoke\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tconst session = await connectToDaemon({ autoStart: false });\n\tif (!session) {\n\t\treturn;\n\t}\n\ttry {\n\t\tlet nodeIds = positionals;\n\t\tif (all) {\n\t\t\tconst clients = await session.client.request({ type: \"clients_list\" });\n\t\t\tif (clients.type !== \"clients_result\") {\n\t\t\t\treportControlError(clients, \"clients\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tnodeIds = clients.clients.map((client) => client.clientNodeId);\n\t\t\tif (nodeIds.length === 0) {\n\t\t\t\tconsole.error(\"No paired clients to revoke\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tlet revokedCount = 0;\n\t\tfor (const nodeId of nodeIds) {\n\t\t\tconst response = await session.client.request({ type: \"client_revoke\", clientNodeId: nodeId });\n\t\t\tif (response.type === \"error\") {\n\t\t\t\tconsole.error(`Error: revoke ${nodeId}: ${response.message}`);\n\t\t\t\tprocess.exitCode = 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\trevokedCount++;\n\t\t\tconsole.error(`Revoked ${nodeId}`);\n\t\t}\n\t\tif (all) {\n\t\t\tconsole.error(`Revoked ${revokedCount} client${revokedCount === 1 ? \"\" : \"s\"}`);\n\t\t}\n\t} finally {\n\t\tawait session.close();\n\t}\n}\n\nasync function handleApproveRepairCommand(args: string[]): Promise<void> {\n\tconst nodeId = args[0];\n\tif (!nodeId) {\n\t\tconsole.error(\"Error: Missing node id to approve for re-pair\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tconst session = await connectToDaemon({ autoStart: false });\n\tif (!session) {\n\t\treturn;\n\t}\n\ttry {\n\t\tconst response = await session.client.request({ type: \"client_approve_repair\", clientNodeId: nodeId });\n\t\tif (reportControlError(response, \"approve-repair\")) {\n\t\t\treturn;\n\t\t}\n\t\tconsole.error(`Approved re-pair for ${nodeId}`);\n\t} finally {\n\t\tawait session.close();\n\t}\n}\n\nasync function handleWorkspaceCommand(args: string[]): Promise<void> {\n\tconst subcommand = args[0];\n\tif (subcommand === \"add\") {\n\t\tconst rest = args.slice(1);\n\t\tlet name: string | undefined;\n\t\tconst nameIndex = rest.indexOf(\"--name\");\n\t\tif (nameIndex !== -1) {\n\t\t\tname = rest[nameIndex + 1];\n\t\t\tif (!name) {\n\t\t\t\tconsole.error(\"Error: --name requires a value\");\n\t\t\t\tprocess.exitCode = 1;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\trest.splice(nameIndex, 2);\n\t\t}\n\t\tconst path = resolve(rest[0] ?? process.cwd());\n\t\tconst workspaceName = name ?? basename(path) ?? \"workspace\";\n\t\tconst session = await connectToDaemon({ autoStart: true });\n\t\tif (!session) {\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst response = await session.client.request({ type: \"workspace_register\", name: workspaceName, path });\n\t\t\tif (reportControlError(response, \"workspace add\")) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconsole.error(`registered workspace: ${workspaceName} -> ${path}`);\n\t\t} finally {\n\t\t\tawait session.close();\n\t\t}\n\t\treturn;\n\t}\n\tif (subcommand === \"remove\") {\n\t\tconst name = args[1];\n\t\tif (!name) {\n\t\t\tconsole.error(\"Error: workspace remove requires a name\");\n\t\t\tprocess.exitCode = 1;\n\t\t\treturn;\n\t\t}\n\t\tconst session = await connectToDaemon({ autoStart: false });\n\t\tif (!session) {\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst response = await session.client.request({ type: \"workspace_unregister\", name });\n\t\t\tif (reportControlError(response, \"workspace remove\")) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconsole.error(`unregistered workspace: ${name}`);\n\t\t} finally {\n\t\t\tawait session.close();\n\t\t}\n\t\treturn;\n\t}\n\tif (subcommand === \"list\") {\n\t\tconst session = await connectToDaemon({ autoStart: false });\n\t\tif (!session) {\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst response = await session.client.request({ type: \"status\" });\n\t\t\tif (response.type !== \"status_result\") {\n\t\t\t\treportControlError(response, \"workspace list\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconsole.log(JSON.stringify(response.workspaces, null, 2));\n\t\t} finally {\n\t\t\tawait session.close();\n\t\t}\n\t\treturn;\n\t}\n\tconsole.error(`Error: Unknown workspace command: ${subcommand ?? \"<missing>\"}`);\n\tprintRemoteUsage();\n\tprocess.exitCode = 1;\n}\n\nfunction takeFlagValue(args: string[], flag: string): { ok: true; value: string | undefined } | { ok: false } {\n\tconst index = args.indexOf(flag);\n\tif (index === -1) {\n\t\treturn { ok: true, value: undefined };\n\t}\n\tconst value = args[index + 1];\n\tif (!value) {\n\t\tconsole.error(`Error: ${flag} requires a value`);\n\t\tprocess.exitCode = 1;\n\t\treturn { ok: false };\n\t}\n\targs.splice(index, 2);\n\treturn { ok: true, value };\n}\n\n/**\n * Default the workspace to the daemon workspace registered for the cwd (same\n * prefix match as pairing), without auto-registering on miss.\n */\nasync function resolveWorkspaceNameForCwd(session: RemoteControlSession): Promise<string | undefined> {\n\tconst status = await session.client.request({ type: \"status\" });\n\tif (status.type !== \"status_result\") {\n\t\treportControlError(status, \"status\");\n\t\treturn undefined;\n\t}\n\tconst cwd = resolve(process.cwd());\n\tconst match = status.workspaces\n\t\t.filter((workspace) => cwd === workspace.path || cwd.startsWith(`${workspace.path}/`))\n\t\t.sort((left, right) => right.path.length - left.path.length)[0];\n\tif (!match) {\n\t\tconsole.error(\"Error: no registered workspace matches the current directory; pass --workspace <name>\");\n\t\tprocess.exitCode = 1;\n\t\treturn undefined;\n\t}\n\treturn match.name;\n}\n\nasync function handleWorktreeCommand(args: string[]): Promise<void> {\n\tconst subcommand = args[0];\n\tif (\n\t\tsubcommand !== \"add\" &&\n\t\tsubcommand !== \"adopt\" &&\n\t\tsubcommand !== \"list\" &&\n\t\tsubcommand !== \"remove\" &&\n\t\tsubcommand !== \"prune\" &&\n\t\tsubcommand !== \"diff\"\n\t) {\n\t\tconsole.error(`Error: Unknown worktree command: ${subcommand ?? \"<missing>\"}`);\n\t\tprintRemoteUsage();\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tconst rest = args.slice(1);\n\tconst workspaceFlag = takeFlagValue(rest, \"--workspace\");\n\tif (!workspaceFlag.ok) {\n\t\treturn;\n\t}\n\tconst session = await connectToDaemon({ autoStart: false });\n\tif (!session) {\n\t\treturn;\n\t}\n\ttry {\n\t\tlet workspaceName = workspaceFlag.value;\n\t\tif (\n\t\t\tworkspaceName === undefined &&\n\t\t\t(subcommand === \"add\" || subcommand === \"adopt\" || subcommand === \"remove\" || subcommand === \"diff\")\n\t\t) {\n\t\t\tworkspaceName = await resolveWorkspaceNameForCwd(session);\n\t\t\tif (workspaceName === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (subcommand === \"add\") {\n\t\t\tconst nameFlag = takeFlagValue(rest, \"--name\");\n\t\t\tconst branchFlag = takeFlagValue(rest, \"--branch\");\n\t\t\tconst baseFlag = takeFlagValue(rest, \"--base\");\n\t\t\tif (!nameFlag.ok || !branchFlag.ok || !baseFlag.ok || workspaceName === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst response = await session.client.request({\n\t\t\t\ttype: \"worktree_create\",\n\t\t\t\tworkspaceName,\n\t\t\t\t...(nameFlag.value === undefined ? {} : { worktreeName: nameFlag.value }),\n\t\t\t\t...(branchFlag.value === undefined ? {} : { branch: branchFlag.value }),\n\t\t\t\t...(baseFlag.value === undefined ? {} : { baseRef: baseFlag.value }),\n\t\t\t});\n\t\t\tif (reportControlError(response, \"worktree add\")) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (response.type !== \"worktree_result\") {\n\t\t\t\tconsole.error(\"Error: unexpected daemon response for worktree add\");\n\t\t\t\tprocess.exitCode = 1;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconsole.error(\n\t\t\t\t`created worktree ${response.worktree.id} (branch ${response.worktree.branch}) -> ${response.worktree.path}`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tif (subcommand === \"adopt\") {\n\t\t\tconst nameFlag = takeFlagValue(rest, \"--name\");\n\t\t\tconst baseFlag = takeFlagValue(rest, \"--base\");\n\t\t\tconst path = rest.filter((arg) => !arg.startsWith(\"--\"))[0];\n\t\t\tif (!nameFlag.ok || !baseFlag.ok || workspaceName === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!path) {\n\t\t\t\tconsole.error(\"Error: worktree adopt requires a path\");\n\t\t\t\tprocess.exitCode = 1;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst response = await session.client.request({\n\t\t\t\ttype: \"worktree_adopt\",\n\t\t\t\tworkspaceName,\n\t\t\t\tpath: resolve(path),\n\t\t\t\t...(nameFlag.value === undefined ? {} : { worktreeName: nameFlag.value }),\n\t\t\t\t...(baseFlag.value === undefined ? {} : { baseRef: baseFlag.value }),\n\t\t\t});\n\t\t\tif (reportControlError(response, \"worktree adopt\")) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (response.type !== \"worktree_result\") {\n\t\t\t\tconsole.error(\"Error: unexpected daemon response for worktree adopt\");\n\t\t\t\tprocess.exitCode = 1;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconsole.error(\n\t\t\t\t`adopted worktree ${response.worktree.id} (branch ${response.worktree.branch}) -> ${response.worktree.path}`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tif (subcommand === \"list\") {\n\t\t\tconst response = await session.client.request({\n\t\t\t\ttype: \"worktree_list\",\n\t\t\t\t...(workspaceName === undefined ? {} : { workspaceName }),\n\t\t\t});\n\t\t\tif (reportControlError(response, \"worktree list\")) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (response.type !== \"worktrees_result\") {\n\t\t\t\tconsole.error(\"Error: unexpected daemon response for worktree list\");\n\t\t\t\tprocess.exitCode = 1;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (rest.includes(\"--json\")) {\n\t\t\t\tconsole.log(JSON.stringify(response.worktrees, null, 2));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfor (const worktree of response.worktrees) {\n\t\t\t\tconst aheadBehind =\n\t\t\t\t\tworktree.aheadBehind === undefined\n\t\t\t\t\t\t? \"\"\n\t\t\t\t\t\t: ` (+${worktree.aheadBehind.ahead}/-${worktree.aheadBehind.behind})`;\n\t\t\t\tconsole.error(\n\t\t\t\t\t`${worktree.workspaceName}/${worktree.id}: ${worktree.branch}${aheadBehind}` +\n\t\t\t\t\t\t`${worktree.available === false ? \" (missing)\" : \"\"}${worktree.dirty === true ? \" (dirty)\" : \"\"}` +\n\t\t\t\t\t\t` -> ${worktree.path}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (response.worktrees.length === 0) {\n\t\t\t\tconsole.error(\"no worktrees\");\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (subcommand === \"diff\") {\n\t\t\tconst worktreeId = rest.filter((arg) => !arg.startsWith(\"--\"))[0];\n\t\t\tif (!worktreeId || workspaceName === undefined) {\n\t\t\t\tif (!worktreeId) {\n\t\t\t\t\tconsole.error(\"Error: worktree diff requires a worktree id\");\n\t\t\t\t\tprocess.exitCode = 1;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst response = await session.client.request({ type: \"worktree_list\", workspaceName });\n\t\t\tif (reportControlError(response, \"worktree diff\")) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (response.type !== \"worktrees_result\") {\n\t\t\t\tconsole.error(\"Error: unexpected daemon response for worktree diff\");\n\t\t\t\tprocess.exitCode = 1;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst worktree = response.worktrees.find((entry) => entry.id === worktreeId);\n\t\t\tif (!worktree) {\n\t\t\t\tconsole.error(`Error: no worktree ${worktreeId} in workspace ${workspaceName}`);\n\t\t\t\tprocess.exitCode = 1;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (worktree.available === false) {\n\t\t\t\tconsole.error(`Error: worktree ${worktreeId} checkout is missing (${worktree.path})`);\n\t\t\t\tprocess.exitCode = 1;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Read-only, run locally in the user's terminal; the daemon never mutates\n\t\t\t// the main checkout (design §5.3).\n\t\t\tconst child = spawnProcess(\"git\", [\"-C\", worktree.path, \"diff\", `${worktree.baseRef ?? \"HEAD\"}...HEAD`], {\n\t\t\t\tstdio: [\"ignore\", \"inherit\", \"inherit\"],\n\t\t\t});\n\t\t\tconst code = await waitForChildProcess(child);\n\t\t\tif (code !== 0) {\n\t\t\t\tprocess.exitCode = 1;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (subcommand === \"remove\") {\n\t\t\tconst force = rest.includes(\"--force\");\n\t\t\tconst worktreeId = rest.filter((arg) => !arg.startsWith(\"--\"))[0];\n\t\t\tif (!worktreeId) {\n\t\t\t\tconsole.error(\"Error: worktree remove requires a worktree id\");\n\t\t\t\tprocess.exitCode = 1;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (workspaceName === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst response = await session.client.request({\n\t\t\t\ttype: \"worktree_remove\",\n\t\t\t\tworkspaceName,\n\t\t\t\tworktreeId,\n\t\t\t\t...(force ? { force } : {}),\n\t\t\t});\n\t\t\tif (reportControlError(response, \"worktree remove\")) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconsole.error(`removed worktree ${worktreeId}`);\n\t\t\treturn;\n\t\t}\n\t\tconst response = await session.client.request({\n\t\t\ttype: \"worktree_prune\",\n\t\t\t...(workspaceName === undefined ? {} : { workspaceName }),\n\t\t});\n\t\tif (reportControlError(response, \"worktree prune\")) {\n\t\t\treturn;\n\t\t}\n\t\tif (response.type !== \"worktree_prune_result\") {\n\t\t\tconsole.error(\"Error: unexpected daemon response for worktree prune\");\n\t\t\tprocess.exitCode = 1;\n\t\t\treturn;\n\t\t}\n\t\tfor (const result of response.results) {\n\t\t\tconsole.error(\n\t\t\t\t`${result.workspaceName}: removed ${result.removedRecords.length} record(s), ` +\n\t\t\t\t\t`quarantined ${result.orphanCheckouts.length} orphan checkout(s)`,\n\t\t\t);\n\t\t}\n\t} finally {\n\t\tawait session.close();\n\t}\n}\n\n/** Router for `volt remote <command>` (daemon control clients); returns true when handled. */\nexport async function handleRemoteControlCommand(\n\targs: string[],\n\toptions: { isStandaloneBinary: boolean },\n): Promise<boolean> {\n\tif (args[0] !== \"remote\") {\n\t\treturn false;\n\t}\n\tconst command = args[1];\n\tif (command === undefined || command === \"--help\" || command === \"-h\") {\n\t\tprintRemoteUsage();\n\t\treturn true;\n\t}\n\tif (command === \"host\") {\n\t\tconsole.error(\n\t\t\t'\"volt remote host\" has been replaced by the background daemon. Run \"volt daemon start\" (or enable remote.background). See docs/daemon.md.',\n\t\t);\n\t\tprocess.exitCode = 1;\n\t\treturn true;\n\t}\n\tif (options.isStandaloneBinary) {\n\t\tconsole.error(\"Error: volt remote is not available from the standalone binary release.\");\n\t\tconsole.error(\"Use a Node.js npm install or a source checkout with optional @number0/iroh dependencies.\");\n\t\tprocess.exitCode = 1;\n\t\treturn true;\n\t}\n\tconst rest = args.slice(2);\n\tswitch (command) {\n\t\tcase \"pair\":\n\t\t\tawait handlePairCommand(rest);\n\t\t\treturn true;\n\t\tcase \"status\":\n\t\t\tawait handleStatusCommand(rest);\n\t\t\treturn true;\n\t\tcase \"clients\":\n\t\t\tawait handleClientsCommand();\n\t\t\treturn true;\n\t\tcase \"access\":\n\t\t\tawait handleAccessCommand(rest);\n\t\t\treturn true;\n\t\tcase \"revoke\":\n\t\t\tawait handleRevokeCommand(rest);\n\t\t\treturn true;\n\t\tcase \"approve-repair\":\n\t\t\tawait handleApproveRepairCommand(rest);\n\t\t\treturn true;\n\t\tcase \"workspace\":\n\t\t\tawait handleWorkspaceCommand(rest);\n\t\t\treturn true;\n\t\tcase \"worktree\":\n\t\t\tawait handleWorktreeCommand(rest);\n\t\t\treturn true;\n\t\tdefault:\n\t\t\tconsole.error(`Error: Unknown remote command: ${command}`);\n\t\t\tprintRemoteUsage();\n\t\t\tprocess.exitCode = 1;\n\t\t\treturn true;\n\t}\n}\n"]}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * `volt daemon install-service` (M9): generate and register an OS login
3
+ * service — a launchd LaunchAgent on macOS, a systemd user unit on Linux —
4
+ * that runs `volt daemon run --foreground` so the daemon comes back after
5
+ * logout/login without anything having to spawn it on demand.
6
+ *
7
+ * The service does NOT auto-restart after `volt daemon stop` (KeepAlive off /
8
+ * Restart=no): a graceful stop stays stopped until the next login or a manual
9
+ * `volt daemon start`. This also avoids restart loops with the daemon's
10
+ * single-instance exit when something else already started one.
11
+ */
12
+ export declare const LAUNCHD_SERVICE_LABEL = "com.github.hansjm10.voltd";
13
+ export declare const SYSTEMD_SERVICE_NAME = "voltd.service";
14
+ export interface DaemonServiceInvocation {
15
+ /** Full program argv: node executable, entry, "daemon", "run", "--foreground". */
16
+ programArguments: string[];
17
+ agentDir: string;
18
+ /** Captures pre-logger crashes; the daemon's own log is voltd.log. */
19
+ serviceLogPath: string;
20
+ }
21
+ export declare function getDaemonServiceInvocation(agentDir?: string): DaemonServiceInvocation;
22
+ export declare function getLaunchdPlistPath(home?: string): string;
23
+ export declare function getSystemdUnitPath(home?: string): string;
24
+ export declare function renderLaunchdPlist(invocation: DaemonServiceInvocation): string;
25
+ export declare function renderSystemdUnit(invocation: DaemonServiceInvocation): string;
26
+ export type RunServiceCommand = (command: string, args: string[]) => Promise<{
27
+ code: number;
28
+ output: string;
29
+ }>;
30
+ export interface ServiceInstallResult {
31
+ ok: boolean;
32
+ definitionPath: string;
33
+ messages: string[];
34
+ }
35
+ export interface ServiceInstallOptions {
36
+ platform?: NodeJS.Platform;
37
+ agentDir?: string;
38
+ home?: string;
39
+ runCommand?: RunServiceCommand;
40
+ }
41
+ export declare function installDaemonService(options?: ServiceInstallOptions): Promise<ServiceInstallResult>;
42
+ export declare function uninstallDaemonService(options?: ServiceInstallOptions): Promise<ServiceInstallResult>;
43
+ //# sourceMappingURL=service-install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-install.d.ts","sourceRoot":"","sources":["../../src/daemon/service-install.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,qBAAqB,8BAA8B,CAAC;AACjE,eAAO,MAAM,oBAAoB,kBAAkB,CAAC;AAEpD,MAAM,WAAW,uBAAuB;IACvC,kFAAkF;IAClF,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,cAAc,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,GAAE,MAAsB,GAAG,uBAAuB,CAQpG;AAED,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,MAAkB,GAAG,MAAM,CAEpE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAKxD;AAMD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,uBAAuB,GAAG,MAAM,CA8B9E;AAUD,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,uBAAuB,GAAG,MAAM,CAgB7E;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAgB/G,MAAM,WAAW,oBAAoB;IACpC,EAAE,EAAE,OAAO,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAC/B;AAED,wBAAsB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAwD7G;AAED,wBAAsB,sBAAsB,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAwC/G","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { existsSync, mkdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { ENV_AGENT_DIR, getAgentDir } from \"../config.ts\";\nimport { getDaemonPaths } from \"./paths.ts\";\nimport { resolveDaemonCliInvocation } from \"./spawn.ts\";\n\n/**\n * `volt daemon install-service` (M9): generate and register an OS login\n * service — a launchd LaunchAgent on macOS, a systemd user unit on Linux —\n * that runs `volt daemon run --foreground` so the daemon comes back after\n * logout/login without anything having to spawn it on demand.\n *\n * The service does NOT auto-restart after `volt daemon stop` (KeepAlive off /\n * Restart=no): a graceful stop stays stopped until the next login or a manual\n * `volt daemon start`. This also avoids restart loops with the daemon's\n * single-instance exit when something else already started one.\n */\n\nexport const LAUNCHD_SERVICE_LABEL = \"com.github.hansjm10.voltd\";\nexport const SYSTEMD_SERVICE_NAME = \"voltd.service\";\n\nexport interface DaemonServiceInvocation {\n\t/** Full program argv: node executable, entry, \"daemon\", \"run\", \"--foreground\". */\n\tprogramArguments: string[];\n\tagentDir: string;\n\t/** Captures pre-logger crashes; the daemon's own log is voltd.log. */\n\tserviceLogPath: string;\n}\n\nexport function getDaemonServiceInvocation(agentDir: string = getAgentDir()): DaemonServiceInvocation {\n\tconst { nodeArgs, entry } = resolveDaemonCliInvocation();\n\tconst paths = getDaemonPaths(agentDir);\n\treturn {\n\t\tprogramArguments: [process.execPath, ...nodeArgs, entry, \"daemon\", \"run\", \"--foreground\"],\n\t\tagentDir,\n\t\tserviceLogPath: join(paths.daemonDir, \"voltd.service.log\"),\n\t};\n}\n\nexport function getLaunchdPlistPath(home: string = homedir()): string {\n\treturn join(home, \"Library\", \"LaunchAgents\", `${LAUNCHD_SERVICE_LABEL}.plist`);\n}\n\nexport function getSystemdUnitPath(home?: string): string {\n\t// An explicit home (tests) wins; otherwise honor XDG_CONFIG_HOME.\n\tconst configHome =\n\t\thome !== undefined ? join(home, \".config\") : process.env.XDG_CONFIG_HOME || join(homedir(), \".config\");\n\treturn join(configHome, \"systemd\", \"user\", SYSTEMD_SERVICE_NAME);\n}\n\nfunction escapeXml(value: string): string {\n\treturn value.replaceAll(\"&\", \"&amp;\").replaceAll(\"<\", \"&lt;\").replaceAll(\">\", \"&gt;\").replaceAll('\"', \"&quot;\");\n}\n\nexport function renderLaunchdPlist(invocation: DaemonServiceInvocation): string {\n\tconst args = invocation.programArguments.map((argument) => `\\t\\t<string>${escapeXml(argument)}</string>`).join(\"\\n\");\n\treturn `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>Label</key>\n\t<string>${LAUNCHD_SERVICE_LABEL}</string>\n\t<key>ProgramArguments</key>\n\t<array>\n${args}\n\t</array>\n\t<key>RunAtLoad</key>\n\t<true/>\n\t<key>KeepAlive</key>\n\t<false/>\n\t<key>EnvironmentVariables</key>\n\t<dict>\n\t\t<key>${ENV_AGENT_DIR}</key>\n\t\t<string>${escapeXml(invocation.agentDir)}</string>\n\t</dict>\n\t<key>StandardOutPath</key>\n\t<string>${escapeXml(invocation.serviceLogPath)}</string>\n\t<key>StandardErrorPath</key>\n\t<string>${escapeXml(invocation.serviceLogPath)}</string>\n\t<key>ProcessType</key>\n\t<string>Background</string>\n</dict>\n</plist>\n`;\n}\n\n/** systemd-style quoting: wrap args containing spaces/quotes in double quotes. */\nfunction systemdQuote(argument: string): string {\n\tif (/^[A-Za-z0-9_@%+=:,./-]+$/.test(argument)) {\n\t\treturn argument;\n\t}\n\treturn `\"${argument.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll('\"', '\\\\\"')}\"`;\n}\n\nexport function renderSystemdUnit(invocation: DaemonServiceInvocation): string {\n\tconst execStart = invocation.programArguments.map(systemdQuote).join(\" \");\n\treturn `[Unit]\nDescription=Volt background daemon (voltd)\n\n[Service]\nType=simple\nExecStart=${execStart}\nEnvironment=${ENV_AGENT_DIR}=${systemdQuote(invocation.agentDir)}\nRestart=no\nStandardOutput=append:${invocation.serviceLogPath}\nStandardError=append:${invocation.serviceLogPath}\n\n[Install]\nWantedBy=default.target\n`;\n}\n\nexport type RunServiceCommand = (command: string, args: string[]) => Promise<{ code: number; output: string }>;\n\nconst defaultRunCommand: RunServiceCommand = (command, args) =>\n\tnew Promise((resolve) => {\n\t\tconst child = spawn(command, args, { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n\t\tlet output = \"\";\n\t\tchild.stdout?.on(\"data\", (chunk: Buffer) => {\n\t\t\toutput += chunk.toString(\"utf8\");\n\t\t});\n\t\tchild.stderr?.on(\"data\", (chunk: Buffer) => {\n\t\t\toutput += chunk.toString(\"utf8\");\n\t\t});\n\t\tchild.on(\"error\", (error) => resolve({ code: 127, output: error.message }));\n\t\tchild.on(\"close\", (code) => resolve({ code: code ?? 1, output }));\n\t});\n\nexport interface ServiceInstallResult {\n\tok: boolean;\n\tdefinitionPath: string;\n\tmessages: string[];\n}\n\nexport interface ServiceInstallOptions {\n\tplatform?: NodeJS.Platform;\n\tagentDir?: string;\n\thome?: string;\n\trunCommand?: RunServiceCommand;\n}\n\nexport async function installDaemonService(options: ServiceInstallOptions = {}): Promise<ServiceInstallResult> {\n\tconst platform = options.platform ?? process.platform;\n\tconst agentDir = options.agentDir ?? getAgentDir();\n\tconst runCommand = options.runCommand ?? defaultRunCommand;\n\tconst invocation = getDaemonServiceInvocation(agentDir);\n\tmkdirSync(dirname(invocation.serviceLogPath), { recursive: true, mode: 0o700 });\n\n\tif (platform === \"darwin\") {\n\t\tconst plistPath = getLaunchdPlistPath(options.home);\n\t\tmkdirSync(dirname(plistPath), { recursive: true });\n\t\twriteFileSync(plistPath, renderLaunchdPlist(invocation), { mode: 0o644 });\n\t\tconst messages = [`Wrote ${plistPath}`];\n\t\tconst uid = typeof process.getuid === \"function\" ? process.getuid() : 501;\n\t\t// Re-bootstrapping an already-loaded label fails; boot it out first.\n\t\tawait runCommand(\"launchctl\", [\"bootout\", `gui/${uid}/${LAUNCHD_SERVICE_LABEL}`]);\n\t\tconst bootstrap = await runCommand(\"launchctl\", [\"bootstrap\", `gui/${uid}`, plistPath]);\n\t\tif (bootstrap.code === 0) {\n\t\t\tmessages.push(\"Loaded launchd service (starts at login).\");\n\t\t\treturn { ok: true, definitionPath: plistPath, messages };\n\t\t}\n\t\tconst legacyLoad = await runCommand(\"launchctl\", [\"load\", \"-w\", plistPath]);\n\t\tif (legacyLoad.code === 0) {\n\t\t\tmessages.push(\"Loaded launchd service (starts at login).\");\n\t\t\treturn { ok: true, definitionPath: plistPath, messages };\n\t\t}\n\t\tmessages.push(\n\t\t\t`launchctl load failed (${bootstrap.output.trim() || legacyLoad.output.trim() || \"unknown error\"}); ` +\n\t\t\t\t`load manually with: launchctl bootstrap gui/${uid} ${plistPath}`,\n\t\t);\n\t\treturn { ok: false, definitionPath: plistPath, messages };\n\t}\n\n\tif (platform === \"linux\") {\n\t\tconst unitPath = getSystemdUnitPath(options.home);\n\t\tmkdirSync(dirname(unitPath), { recursive: true });\n\t\twriteFileSync(unitPath, renderSystemdUnit(invocation), { mode: 0o644 });\n\t\tconst messages = [`Wrote ${unitPath}`];\n\t\tconst reload = await runCommand(\"systemctl\", [\"--user\", \"daemon-reload\"]);\n\t\tconst enable = await runCommand(\"systemctl\", [\"--user\", \"enable\", \"--now\", SYSTEMD_SERVICE_NAME]);\n\t\tif (reload.code === 0 && enable.code === 0) {\n\t\t\tmessages.push(\"Enabled systemd user service (starts at login).\");\n\t\t\tmessages.push(\"For boot-without-login, also run: loginctl enable-linger\");\n\t\t\treturn { ok: true, definitionPath: unitPath, messages };\n\t\t}\n\t\tmessages.push(\n\t\t\t`systemctl failed (${(reload.output + enable.output).trim() || \"unknown error\"}); ` +\n\t\t\t\t`enable manually with: systemctl --user enable --now ${SYSTEMD_SERVICE_NAME}`,\n\t\t);\n\t\treturn { ok: false, definitionPath: unitPath, messages };\n\t}\n\n\treturn {\n\t\tok: false,\n\t\tdefinitionPath: \"\",\n\t\tmessages: [`volt daemon install-service is not supported on ${platform}.`],\n\t};\n}\n\nexport async function uninstallDaemonService(options: ServiceInstallOptions = {}): Promise<ServiceInstallResult> {\n\tconst platform = options.platform ?? process.platform;\n\tconst runCommand = options.runCommand ?? defaultRunCommand;\n\n\tif (platform === \"darwin\") {\n\t\tconst plistPath = getLaunchdPlistPath(options.home);\n\t\tconst messages: string[] = [];\n\t\tconst uid = typeof process.getuid === \"function\" ? process.getuid() : 501;\n\t\tconst bootout = await runCommand(\"launchctl\", [\"bootout\", `gui/${uid}/${LAUNCHD_SERVICE_LABEL}`]);\n\t\tif (bootout.code !== 0) {\n\t\t\tawait runCommand(\"launchctl\", [\"unload\", plistPath]);\n\t\t}\n\t\tif (existsSync(plistPath)) {\n\t\t\trmSync(plistPath, { force: true });\n\t\t\tmessages.push(`Removed ${plistPath}`);\n\t\t} else {\n\t\t\tmessages.push(\"No launchd service was installed.\");\n\t\t}\n\t\treturn { ok: true, definitionPath: plistPath, messages };\n\t}\n\n\tif (platform === \"linux\") {\n\t\tconst unitPath = getSystemdUnitPath(options.home);\n\t\tconst messages: string[] = [];\n\t\tawait runCommand(\"systemctl\", [\"--user\", \"disable\", \"--now\", SYSTEMD_SERVICE_NAME]);\n\t\tif (existsSync(unitPath)) {\n\t\t\trmSync(unitPath, { force: true });\n\t\t\tmessages.push(`Removed ${unitPath}`);\n\t\t} else {\n\t\t\tmessages.push(\"No systemd user service was installed.\");\n\t\t}\n\t\tawait runCommand(\"systemctl\", [\"--user\", \"daemon-reload\"]);\n\t\treturn { ok: true, definitionPath: unitPath, messages };\n\t}\n\n\treturn {\n\t\tok: false,\n\t\tdefinitionPath: \"\",\n\t\tmessages: [`volt daemon uninstall-service is not supported on ${platform}.`],\n\t};\n}\n"]}
@@ -0,0 +1,198 @@
1
+ import { spawn } from "node:child_process";
2
+ import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { dirname, join } from "node:path";
5
+ import { ENV_AGENT_DIR, getAgentDir } from "../config.js";
6
+ import { getDaemonPaths } from "./paths.js";
7
+ import { resolveDaemonCliInvocation } from "./spawn.js";
8
+ /**
9
+ * `volt daemon install-service` (M9): generate and register an OS login
10
+ * service — a launchd LaunchAgent on macOS, a systemd user unit on Linux —
11
+ * that runs `volt daemon run --foreground` so the daemon comes back after
12
+ * logout/login without anything having to spawn it on demand.
13
+ *
14
+ * The service does NOT auto-restart after `volt daemon stop` (KeepAlive off /
15
+ * Restart=no): a graceful stop stays stopped until the next login or a manual
16
+ * `volt daemon start`. This also avoids restart loops with the daemon's
17
+ * single-instance exit when something else already started one.
18
+ */
19
+ export const LAUNCHD_SERVICE_LABEL = "com.github.hansjm10.voltd";
20
+ export const SYSTEMD_SERVICE_NAME = "voltd.service";
21
+ export function getDaemonServiceInvocation(agentDir = getAgentDir()) {
22
+ const { nodeArgs, entry } = resolveDaemonCliInvocation();
23
+ const paths = getDaemonPaths(agentDir);
24
+ return {
25
+ programArguments: [process.execPath, ...nodeArgs, entry, "daemon", "run", "--foreground"],
26
+ agentDir,
27
+ serviceLogPath: join(paths.daemonDir, "voltd.service.log"),
28
+ };
29
+ }
30
+ export function getLaunchdPlistPath(home = homedir()) {
31
+ return join(home, "Library", "LaunchAgents", `${LAUNCHD_SERVICE_LABEL}.plist`);
32
+ }
33
+ export function getSystemdUnitPath(home) {
34
+ // An explicit home (tests) wins; otherwise honor XDG_CONFIG_HOME.
35
+ const configHome = home !== undefined ? join(home, ".config") : process.env.XDG_CONFIG_HOME || join(homedir(), ".config");
36
+ return join(configHome, "systemd", "user", SYSTEMD_SERVICE_NAME);
37
+ }
38
+ function escapeXml(value) {
39
+ return value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;");
40
+ }
41
+ export function renderLaunchdPlist(invocation) {
42
+ const args = invocation.programArguments.map((argument) => `\t\t<string>${escapeXml(argument)}</string>`).join("\n");
43
+ return `<?xml version="1.0" encoding="UTF-8"?>
44
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
45
+ <plist version="1.0">
46
+ <dict>
47
+ <key>Label</key>
48
+ <string>${LAUNCHD_SERVICE_LABEL}</string>
49
+ <key>ProgramArguments</key>
50
+ <array>
51
+ ${args}
52
+ </array>
53
+ <key>RunAtLoad</key>
54
+ <true/>
55
+ <key>KeepAlive</key>
56
+ <false/>
57
+ <key>EnvironmentVariables</key>
58
+ <dict>
59
+ <key>${ENV_AGENT_DIR}</key>
60
+ <string>${escapeXml(invocation.agentDir)}</string>
61
+ </dict>
62
+ <key>StandardOutPath</key>
63
+ <string>${escapeXml(invocation.serviceLogPath)}</string>
64
+ <key>StandardErrorPath</key>
65
+ <string>${escapeXml(invocation.serviceLogPath)}</string>
66
+ <key>ProcessType</key>
67
+ <string>Background</string>
68
+ </dict>
69
+ </plist>
70
+ `;
71
+ }
72
+ /** systemd-style quoting: wrap args containing spaces/quotes in double quotes. */
73
+ function systemdQuote(argument) {
74
+ if (/^[A-Za-z0-9_@%+=:,./-]+$/.test(argument)) {
75
+ return argument;
76
+ }
77
+ return `"${argument.replaceAll("\\", "\\\\").replaceAll('"', '\\"')}"`;
78
+ }
79
+ export function renderSystemdUnit(invocation) {
80
+ const execStart = invocation.programArguments.map(systemdQuote).join(" ");
81
+ return `[Unit]
82
+ Description=Volt background daemon (voltd)
83
+
84
+ [Service]
85
+ Type=simple
86
+ ExecStart=${execStart}
87
+ Environment=${ENV_AGENT_DIR}=${systemdQuote(invocation.agentDir)}
88
+ Restart=no
89
+ StandardOutput=append:${invocation.serviceLogPath}
90
+ StandardError=append:${invocation.serviceLogPath}
91
+
92
+ [Install]
93
+ WantedBy=default.target
94
+ `;
95
+ }
96
+ const defaultRunCommand = (command, args) => new Promise((resolve) => {
97
+ const child = spawn(command, args, { stdio: ["ignore", "pipe", "pipe"] });
98
+ let output = "";
99
+ child.stdout?.on("data", (chunk) => {
100
+ output += chunk.toString("utf8");
101
+ });
102
+ child.stderr?.on("data", (chunk) => {
103
+ output += chunk.toString("utf8");
104
+ });
105
+ child.on("error", (error) => resolve({ code: 127, output: error.message }));
106
+ child.on("close", (code) => resolve({ code: code ?? 1, output }));
107
+ });
108
+ export async function installDaemonService(options = {}) {
109
+ const platform = options.platform ?? process.platform;
110
+ const agentDir = options.agentDir ?? getAgentDir();
111
+ const runCommand = options.runCommand ?? defaultRunCommand;
112
+ const invocation = getDaemonServiceInvocation(agentDir);
113
+ mkdirSync(dirname(invocation.serviceLogPath), { recursive: true, mode: 0o700 });
114
+ if (platform === "darwin") {
115
+ const plistPath = getLaunchdPlistPath(options.home);
116
+ mkdirSync(dirname(plistPath), { recursive: true });
117
+ writeFileSync(plistPath, renderLaunchdPlist(invocation), { mode: 0o644 });
118
+ const messages = [`Wrote ${plistPath}`];
119
+ const uid = typeof process.getuid === "function" ? process.getuid() : 501;
120
+ // Re-bootstrapping an already-loaded label fails; boot it out first.
121
+ await runCommand("launchctl", ["bootout", `gui/${uid}/${LAUNCHD_SERVICE_LABEL}`]);
122
+ const bootstrap = await runCommand("launchctl", ["bootstrap", `gui/${uid}`, plistPath]);
123
+ if (bootstrap.code === 0) {
124
+ messages.push("Loaded launchd service (starts at login).");
125
+ return { ok: true, definitionPath: plistPath, messages };
126
+ }
127
+ const legacyLoad = await runCommand("launchctl", ["load", "-w", plistPath]);
128
+ if (legacyLoad.code === 0) {
129
+ messages.push("Loaded launchd service (starts at login).");
130
+ return { ok: true, definitionPath: plistPath, messages };
131
+ }
132
+ messages.push(`launchctl load failed (${bootstrap.output.trim() || legacyLoad.output.trim() || "unknown error"}); ` +
133
+ `load manually with: launchctl bootstrap gui/${uid} ${plistPath}`);
134
+ return { ok: false, definitionPath: plistPath, messages };
135
+ }
136
+ if (platform === "linux") {
137
+ const unitPath = getSystemdUnitPath(options.home);
138
+ mkdirSync(dirname(unitPath), { recursive: true });
139
+ writeFileSync(unitPath, renderSystemdUnit(invocation), { mode: 0o644 });
140
+ const messages = [`Wrote ${unitPath}`];
141
+ const reload = await runCommand("systemctl", ["--user", "daemon-reload"]);
142
+ const enable = await runCommand("systemctl", ["--user", "enable", "--now", SYSTEMD_SERVICE_NAME]);
143
+ if (reload.code === 0 && enable.code === 0) {
144
+ messages.push("Enabled systemd user service (starts at login).");
145
+ messages.push("For boot-without-login, also run: loginctl enable-linger");
146
+ return { ok: true, definitionPath: unitPath, messages };
147
+ }
148
+ messages.push(`systemctl failed (${(reload.output + enable.output).trim() || "unknown error"}); ` +
149
+ `enable manually with: systemctl --user enable --now ${SYSTEMD_SERVICE_NAME}`);
150
+ return { ok: false, definitionPath: unitPath, messages };
151
+ }
152
+ return {
153
+ ok: false,
154
+ definitionPath: "",
155
+ messages: [`volt daemon install-service is not supported on ${platform}.`],
156
+ };
157
+ }
158
+ export async function uninstallDaemonService(options = {}) {
159
+ const platform = options.platform ?? process.platform;
160
+ const runCommand = options.runCommand ?? defaultRunCommand;
161
+ if (platform === "darwin") {
162
+ const plistPath = getLaunchdPlistPath(options.home);
163
+ const messages = [];
164
+ const uid = typeof process.getuid === "function" ? process.getuid() : 501;
165
+ const bootout = await runCommand("launchctl", ["bootout", `gui/${uid}/${LAUNCHD_SERVICE_LABEL}`]);
166
+ if (bootout.code !== 0) {
167
+ await runCommand("launchctl", ["unload", plistPath]);
168
+ }
169
+ if (existsSync(plistPath)) {
170
+ rmSync(plistPath, { force: true });
171
+ messages.push(`Removed ${plistPath}`);
172
+ }
173
+ else {
174
+ messages.push("No launchd service was installed.");
175
+ }
176
+ return { ok: true, definitionPath: plistPath, messages };
177
+ }
178
+ if (platform === "linux") {
179
+ const unitPath = getSystemdUnitPath(options.home);
180
+ const messages = [];
181
+ await runCommand("systemctl", ["--user", "disable", "--now", SYSTEMD_SERVICE_NAME]);
182
+ if (existsSync(unitPath)) {
183
+ rmSync(unitPath, { force: true });
184
+ messages.push(`Removed ${unitPath}`);
185
+ }
186
+ else {
187
+ messages.push("No systemd user service was installed.");
188
+ }
189
+ await runCommand("systemctl", ["--user", "daemon-reload"]);
190
+ return { ok: true, definitionPath: unitPath, messages };
191
+ }
192
+ return {
193
+ ok: false,
194
+ definitionPath: "",
195
+ messages: [`volt daemon uninstall-service is not supported on ${platform}.`],
196
+ };
197
+ }
198
+ //# sourceMappingURL=service-install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-install.js","sourceRoot":"","sources":["../../src/daemon/service-install.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { existsSync, mkdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { ENV_AGENT_DIR, getAgentDir } from \"../config.ts\";\nimport { getDaemonPaths } from \"./paths.ts\";\nimport { resolveDaemonCliInvocation } from \"./spawn.ts\";\n\n/**\n * `volt daemon install-service` (M9): generate and register an OS login\n * service — a launchd LaunchAgent on macOS, a systemd user unit on Linux —\n * that runs `volt daemon run --foreground` so the daemon comes back after\n * logout/login without anything having to spawn it on demand.\n *\n * The service does NOT auto-restart after `volt daemon stop` (KeepAlive off /\n * Restart=no): a graceful stop stays stopped until the next login or a manual\n * `volt daemon start`. This also avoids restart loops with the daemon's\n * single-instance exit when something else already started one.\n */\n\nexport const LAUNCHD_SERVICE_LABEL = \"com.github.hansjm10.voltd\";\nexport const SYSTEMD_SERVICE_NAME = \"voltd.service\";\n\nexport interface DaemonServiceInvocation {\n\t/** Full program argv: node executable, entry, \"daemon\", \"run\", \"--foreground\". */\n\tprogramArguments: string[];\n\tagentDir: string;\n\t/** Captures pre-logger crashes; the daemon's own log is voltd.log. */\n\tserviceLogPath: string;\n}\n\nexport function getDaemonServiceInvocation(agentDir: string = getAgentDir()): DaemonServiceInvocation {\n\tconst { nodeArgs, entry } = resolveDaemonCliInvocation();\n\tconst paths = getDaemonPaths(agentDir);\n\treturn {\n\t\tprogramArguments: [process.execPath, ...nodeArgs, entry, \"daemon\", \"run\", \"--foreground\"],\n\t\tagentDir,\n\t\tserviceLogPath: join(paths.daemonDir, \"voltd.service.log\"),\n\t};\n}\n\nexport function getLaunchdPlistPath(home: string = homedir()): string {\n\treturn join(home, \"Library\", \"LaunchAgents\", `${LAUNCHD_SERVICE_LABEL}.plist`);\n}\n\nexport function getSystemdUnitPath(home?: string): string {\n\t// An explicit home (tests) wins; otherwise honor XDG_CONFIG_HOME.\n\tconst configHome =\n\t\thome !== undefined ? join(home, \".config\") : process.env.XDG_CONFIG_HOME || join(homedir(), \".config\");\n\treturn join(configHome, \"systemd\", \"user\", SYSTEMD_SERVICE_NAME);\n}\n\nfunction escapeXml(value: string): string {\n\treturn value.replaceAll(\"&\", \"&amp;\").replaceAll(\"<\", \"&lt;\").replaceAll(\">\", \"&gt;\").replaceAll('\"', \"&quot;\");\n}\n\nexport function renderLaunchdPlist(invocation: DaemonServiceInvocation): string {\n\tconst args = invocation.programArguments.map((argument) => `\\t\\t<string>${escapeXml(argument)}</string>`).join(\"\\n\");\n\treturn `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>Label</key>\n\t<string>${LAUNCHD_SERVICE_LABEL}</string>\n\t<key>ProgramArguments</key>\n\t<array>\n${args}\n\t</array>\n\t<key>RunAtLoad</key>\n\t<true/>\n\t<key>KeepAlive</key>\n\t<false/>\n\t<key>EnvironmentVariables</key>\n\t<dict>\n\t\t<key>${ENV_AGENT_DIR}</key>\n\t\t<string>${escapeXml(invocation.agentDir)}</string>\n\t</dict>\n\t<key>StandardOutPath</key>\n\t<string>${escapeXml(invocation.serviceLogPath)}</string>\n\t<key>StandardErrorPath</key>\n\t<string>${escapeXml(invocation.serviceLogPath)}</string>\n\t<key>ProcessType</key>\n\t<string>Background</string>\n</dict>\n</plist>\n`;\n}\n\n/** systemd-style quoting: wrap args containing spaces/quotes in double quotes. */\nfunction systemdQuote(argument: string): string {\n\tif (/^[A-Za-z0-9_@%+=:,./-]+$/.test(argument)) {\n\t\treturn argument;\n\t}\n\treturn `\"${argument.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll('\"', '\\\\\"')}\"`;\n}\n\nexport function renderSystemdUnit(invocation: DaemonServiceInvocation): string {\n\tconst execStart = invocation.programArguments.map(systemdQuote).join(\" \");\n\treturn `[Unit]\nDescription=Volt background daemon (voltd)\n\n[Service]\nType=simple\nExecStart=${execStart}\nEnvironment=${ENV_AGENT_DIR}=${systemdQuote(invocation.agentDir)}\nRestart=no\nStandardOutput=append:${invocation.serviceLogPath}\nStandardError=append:${invocation.serviceLogPath}\n\n[Install]\nWantedBy=default.target\n`;\n}\n\nexport type RunServiceCommand = (command: string, args: string[]) => Promise<{ code: number; output: string }>;\n\nconst defaultRunCommand: RunServiceCommand = (command, args) =>\n\tnew Promise((resolve) => {\n\t\tconst child = spawn(command, args, { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n\t\tlet output = \"\";\n\t\tchild.stdout?.on(\"data\", (chunk: Buffer) => {\n\t\t\toutput += chunk.toString(\"utf8\");\n\t\t});\n\t\tchild.stderr?.on(\"data\", (chunk: Buffer) => {\n\t\t\toutput += chunk.toString(\"utf8\");\n\t\t});\n\t\tchild.on(\"error\", (error) => resolve({ code: 127, output: error.message }));\n\t\tchild.on(\"close\", (code) => resolve({ code: code ?? 1, output }));\n\t});\n\nexport interface ServiceInstallResult {\n\tok: boolean;\n\tdefinitionPath: string;\n\tmessages: string[];\n}\n\nexport interface ServiceInstallOptions {\n\tplatform?: NodeJS.Platform;\n\tagentDir?: string;\n\thome?: string;\n\trunCommand?: RunServiceCommand;\n}\n\nexport async function installDaemonService(options: ServiceInstallOptions = {}): Promise<ServiceInstallResult> {\n\tconst platform = options.platform ?? process.platform;\n\tconst agentDir = options.agentDir ?? getAgentDir();\n\tconst runCommand = options.runCommand ?? defaultRunCommand;\n\tconst invocation = getDaemonServiceInvocation(agentDir);\n\tmkdirSync(dirname(invocation.serviceLogPath), { recursive: true, mode: 0o700 });\n\n\tif (platform === \"darwin\") {\n\t\tconst plistPath = getLaunchdPlistPath(options.home);\n\t\tmkdirSync(dirname(plistPath), { recursive: true });\n\t\twriteFileSync(plistPath, renderLaunchdPlist(invocation), { mode: 0o644 });\n\t\tconst messages = [`Wrote ${plistPath}`];\n\t\tconst uid = typeof process.getuid === \"function\" ? process.getuid() : 501;\n\t\t// Re-bootstrapping an already-loaded label fails; boot it out first.\n\t\tawait runCommand(\"launchctl\", [\"bootout\", `gui/${uid}/${LAUNCHD_SERVICE_LABEL}`]);\n\t\tconst bootstrap = await runCommand(\"launchctl\", [\"bootstrap\", `gui/${uid}`, plistPath]);\n\t\tif (bootstrap.code === 0) {\n\t\t\tmessages.push(\"Loaded launchd service (starts at login).\");\n\t\t\treturn { ok: true, definitionPath: plistPath, messages };\n\t\t}\n\t\tconst legacyLoad = await runCommand(\"launchctl\", [\"load\", \"-w\", plistPath]);\n\t\tif (legacyLoad.code === 0) {\n\t\t\tmessages.push(\"Loaded launchd service (starts at login).\");\n\t\t\treturn { ok: true, definitionPath: plistPath, messages };\n\t\t}\n\t\tmessages.push(\n\t\t\t`launchctl load failed (${bootstrap.output.trim() || legacyLoad.output.trim() || \"unknown error\"}); ` +\n\t\t\t\t`load manually with: launchctl bootstrap gui/${uid} ${plistPath}`,\n\t\t);\n\t\treturn { ok: false, definitionPath: plistPath, messages };\n\t}\n\n\tif (platform === \"linux\") {\n\t\tconst unitPath = getSystemdUnitPath(options.home);\n\t\tmkdirSync(dirname(unitPath), { recursive: true });\n\t\twriteFileSync(unitPath, renderSystemdUnit(invocation), { mode: 0o644 });\n\t\tconst messages = [`Wrote ${unitPath}`];\n\t\tconst reload = await runCommand(\"systemctl\", [\"--user\", \"daemon-reload\"]);\n\t\tconst enable = await runCommand(\"systemctl\", [\"--user\", \"enable\", \"--now\", SYSTEMD_SERVICE_NAME]);\n\t\tif (reload.code === 0 && enable.code === 0) {\n\t\t\tmessages.push(\"Enabled systemd user service (starts at login).\");\n\t\t\tmessages.push(\"For boot-without-login, also run: loginctl enable-linger\");\n\t\t\treturn { ok: true, definitionPath: unitPath, messages };\n\t\t}\n\t\tmessages.push(\n\t\t\t`systemctl failed (${(reload.output + enable.output).trim() || \"unknown error\"}); ` +\n\t\t\t\t`enable manually with: systemctl --user enable --now ${SYSTEMD_SERVICE_NAME}`,\n\t\t);\n\t\treturn { ok: false, definitionPath: unitPath, messages };\n\t}\n\n\treturn {\n\t\tok: false,\n\t\tdefinitionPath: \"\",\n\t\tmessages: [`volt daemon install-service is not supported on ${platform}.`],\n\t};\n}\n\nexport async function uninstallDaemonService(options: ServiceInstallOptions = {}): Promise<ServiceInstallResult> {\n\tconst platform = options.platform ?? process.platform;\n\tconst runCommand = options.runCommand ?? defaultRunCommand;\n\n\tif (platform === \"darwin\") {\n\t\tconst plistPath = getLaunchdPlistPath(options.home);\n\t\tconst messages: string[] = [];\n\t\tconst uid = typeof process.getuid === \"function\" ? process.getuid() : 501;\n\t\tconst bootout = await runCommand(\"launchctl\", [\"bootout\", `gui/${uid}/${LAUNCHD_SERVICE_LABEL}`]);\n\t\tif (bootout.code !== 0) {\n\t\t\tawait runCommand(\"launchctl\", [\"unload\", plistPath]);\n\t\t}\n\t\tif (existsSync(plistPath)) {\n\t\t\trmSync(plistPath, { force: true });\n\t\t\tmessages.push(`Removed ${plistPath}`);\n\t\t} else {\n\t\t\tmessages.push(\"No launchd service was installed.\");\n\t\t}\n\t\treturn { ok: true, definitionPath: plistPath, messages };\n\t}\n\n\tif (platform === \"linux\") {\n\t\tconst unitPath = getSystemdUnitPath(options.home);\n\t\tconst messages: string[] = [];\n\t\tawait runCommand(\"systemctl\", [\"--user\", \"disable\", \"--now\", SYSTEMD_SERVICE_NAME]);\n\t\tif (existsSync(unitPath)) {\n\t\t\trmSync(unitPath, { force: true });\n\t\t\tmessages.push(`Removed ${unitPath}`);\n\t\t} else {\n\t\t\tmessages.push(\"No systemd user service was installed.\");\n\t\t}\n\t\tawait runCommand(\"systemctl\", [\"--user\", \"daemon-reload\"]);\n\t\treturn { ok: true, definitionPath: unitPath, messages };\n\t}\n\n\treturn {\n\t\tok: false,\n\t\tdefinitionPath: \"\",\n\t\tmessages: [`volt daemon uninstall-service is not supported on ${platform}.`],\n\t};\n}\n"]}
@@ -0,0 +1,62 @@
1
+ import { SessionManager } from "../core/session-manager.ts";
2
+ /**
3
+ * Conversation target for a remote session, after the owner's last-session
4
+ * bookkeeping has been applied ("last" carries the remembered session id).
5
+ */
6
+ export type IrohRemoteSessionTarget = {
7
+ kind: "last";
8
+ resumeSessionId?: string;
9
+ } | {
10
+ kind: "new";
11
+ } | {
12
+ kind: "session";
13
+ sessionId: string;
14
+ };
15
+ export type IrohRemoteSessionTargetSelection = "created" | "created_after_missing" | "resumed";
16
+ export interface ResolvedSessionTarget {
17
+ /** Concrete id (existing file id, or freshly created). */
18
+ sessionId: string;
19
+ sessionFilePath?: string;
20
+ selection: IrohRemoteSessionTargetSelection;
21
+ /** Present for created_after_missing/resumed selections. */
22
+ requestedSessionId?: string;
23
+ workspaceName: string;
24
+ workspacePath: string;
25
+ }
26
+ export interface SessionTargetSessionHandle {
27
+ getSessionId(): string;
28
+ getSessionFile(): string | undefined;
29
+ }
30
+ /** Minimal session-store surface consumed by target resolution — injectable for tests. */
31
+ export interface SessionTargetSessionStore<H extends SessionTargetSessionHandle = SessionTargetSessionHandle> {
32
+ /** Existing sessions for the workspace (only entries whose files exist on disk). */
33
+ list(): Promise<Array<{
34
+ id: string;
35
+ path: string;
36
+ }>>;
37
+ open(path: string): H;
38
+ create(): H;
39
+ }
40
+ export interface ResolvedSessionTargetWithManager<H extends SessionTargetSessionHandle = SessionTargetSessionHandle> extends ResolvedSessionTarget {
41
+ sessionManager: H;
42
+ }
43
+ /**
44
+ * Resolve a conversation target to a concrete session, matching the historical
45
+ * behavior of createIrohRemoteAgentRuntimeWithSessionSelection exactly:
46
+ *
47
+ * - new: always create -> "created"
48
+ * - last without a remembered id: create -> "created"
49
+ * - last with a remembered id: open if it exists -> "resumed", else create -> "created_after_missing"
50
+ * - session: open if it exists -> "resumed", else throw session_unavailable
51
+ * (the wire protocol forbids created_after_missing for explicit session targets)
52
+ */
53
+ export declare function resolveIrohRemoteSessionTarget<H extends SessionTargetSessionHandle>(target: IrohRemoteSessionTarget, workspace: {
54
+ name: string;
55
+ path: string;
56
+ }, sessions: SessionTargetSessionStore<H>): Promise<ResolvedSessionTargetWithManager<H>>;
57
+ /** Real SessionManager-backed store for a workspace cwd + session dir. */
58
+ export declare function createSessionManagerTargetStore(cwd: string, sessionDir: string, options?: {
59
+ listAll?: boolean;
60
+ preserveSessionCwd?: boolean;
61
+ }): SessionTargetSessionStore<SessionManager>;
62
+ //# sourceMappingURL=session-target.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-target.d.ts","sourceRoot":"","sources":["../../src/daemon/session-target.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAChC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1C,MAAM,MAAM,gCAAgC,GAAG,SAAS,GAAG,uBAAuB,GAAG,SAAS,CAAC;AAE/F,MAAM,WAAW,qBAAqB;IACrC,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,gCAAgC,CAAC;IAC5C,4DAA4D;IAC5D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,0BAA0B;IAC1C,YAAY,IAAI,MAAM,CAAC;IACvB,cAAc,IAAI,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,4FAA0F;AAC1F,MAAM,WAAW,yBAAyB,CAAC,CAAC,SAAS,0BAA0B,GAAG,0BAA0B;IAC3G,oFAAoF;IACpF,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IACrD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC;IACtB,MAAM,IAAI,CAAC,CAAC;CACZ;AAED,MAAM,WAAW,gCAAgC,CAAC,CAAC,SAAS,0BAA0B,GAAG,0BAA0B,CAClH,SAAQ,qBAAqB;IAC7B,cAAc,EAAE,CAAC,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,wBAAsB,8BAA8B,CAAC,CAAC,SAAS,0BAA0B,EACxF,MAAM,EAAE,uBAAuB,EAC/B,SAAS,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EACzC,QAAQ,EAAE,yBAAyB,CAAC,CAAC,CAAC,GACpC,OAAO,CAAC,gCAAgC,CAAC,CAAC,CAAC,CAAC,CAwC9C;AAED,0EAA0E;AAC1E,wBAAgB,+BAA+B,CAC9C,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/D,yBAAyB,CAAC,cAAc,CAAC,CAiB3C","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { isIrohRemoteSessionId } from \"../core/remote/iroh/handshake.ts\";\nimport { IrohRemoteOutcomeError } from \"../core/remote/iroh/protocol.ts\";\nimport { SessionManager } from \"../core/session-manager.ts\";\n\n/**\n * Conversation target for a remote session, after the owner's last-session\n * bookkeeping has been applied (\"last\" carries the remembered session id).\n */\nexport type IrohRemoteSessionTarget =\n\t| { kind: \"last\"; resumeSessionId?: string }\n\t| { kind: \"new\" }\n\t| { kind: \"session\"; sessionId: string };\n\nexport type IrohRemoteSessionTargetSelection = \"created\" | \"created_after_missing\" | \"resumed\";\n\nexport interface ResolvedSessionTarget {\n\t/** Concrete id (existing file id, or freshly created). */\n\tsessionId: string;\n\tsessionFilePath?: string;\n\tselection: IrohRemoteSessionTargetSelection;\n\t/** Present for created_after_missing/resumed selections. */\n\trequestedSessionId?: string;\n\tworkspaceName: string;\n\tworkspacePath: string;\n}\n\nexport interface SessionTargetSessionHandle {\n\tgetSessionId(): string;\n\tgetSessionFile(): string | undefined;\n}\n\n/** Minimal session-store surface consumed by target resolution — injectable for tests. */\nexport interface SessionTargetSessionStore<H extends SessionTargetSessionHandle = SessionTargetSessionHandle> {\n\t/** Existing sessions for the workspace (only entries whose files exist on disk). */\n\tlist(): Promise<Array<{ id: string; path: string }>>;\n\topen(path: string): H;\n\tcreate(): H;\n}\n\nexport interface ResolvedSessionTargetWithManager<H extends SessionTargetSessionHandle = SessionTargetSessionHandle>\n\textends ResolvedSessionTarget {\n\tsessionManager: H;\n}\n\n/**\n * Resolve a conversation target to a concrete session, matching the historical\n * behavior of createIrohRemoteAgentRuntimeWithSessionSelection exactly:\n *\n * - new: always create -> \"created\"\n * - last without a remembered id: create -> \"created\"\n * - last with a remembered id: open if it exists -> \"resumed\", else create -> \"created_after_missing\"\n * - session: open if it exists -> \"resumed\", else throw session_unavailable\n * (the wire protocol forbids created_after_missing for explicit session targets)\n */\nexport async function resolveIrohRemoteSessionTarget<H extends SessionTargetSessionHandle>(\n\ttarget: IrohRemoteSessionTarget,\n\tworkspace: { name: string; path: string },\n\tsessions: SessionTargetSessionStore<H>,\n): Promise<ResolvedSessionTargetWithManager<H>> {\n\tconst resolved = (\n\t\tsessionManager: H,\n\t\tselection: IrohRemoteSessionTargetSelection,\n\t\trequestedSessionId?: string,\n\t): ResolvedSessionTargetWithManager<H> => ({\n\t\tsessionId: sessionManager.getSessionId(),\n\t\t...(sessionManager.getSessionFile() === undefined ? {} : { sessionFilePath: sessionManager.getSessionFile() }),\n\t\tselection,\n\t\t...(requestedSessionId === undefined ? {} : { requestedSessionId }),\n\t\tworkspaceName: workspace.name,\n\t\tworkspacePath: workspace.path,\n\t\tsessionManager,\n\t});\n\n\tif (target.kind === \"new\") {\n\t\treturn resolved(sessions.create(), \"created\");\n\t}\n\n\tconst requestedSessionId = target.kind === \"last\" ? target.resumeSessionId : target.sessionId;\n\tif (requestedSessionId === undefined) {\n\t\treturn resolved(sessions.create(), \"created\");\n\t}\n\n\tif (!isIrohRemoteSessionId(requestedSessionId)) {\n\t\tif (target.kind === \"session\") {\n\t\t\tthrow new IrohRemoteOutcomeError(\"session_unavailable\", \"session not found in workspace\");\n\t\t}\n\t\treturn resolved(sessions.create(), \"created_after_missing\", requestedSessionId);\n\t}\n\n\tconst existingSession = (await sessions.list()).find((session) => session.id === requestedSessionId);\n\tif (!existingSession) {\n\t\tif (target.kind === \"session\") {\n\t\t\tthrow new IrohRemoteOutcomeError(\"session_unavailable\", \"session not found in workspace\");\n\t\t}\n\t\treturn resolved(sessions.create(), \"created_after_missing\", requestedSessionId);\n\t}\n\n\treturn resolved(sessions.open(existingSession.path), \"resumed\", requestedSessionId);\n}\n\n/** Real SessionManager-backed store for a workspace cwd + session dir. */\nexport function createSessionManagerTargetStore(\n\tcwd: string,\n\tsessionDir: string,\n\toptions: { listAll?: boolean; preserveSessionCwd?: boolean } = {},\n): SessionTargetSessionStore<SessionManager> {\n\treturn {\n\t\tasync list() {\n\t\t\tconst sessions = options.listAll\n\t\t\t\t? await SessionManager.listAll(sessionDir)\n\t\t\t\t: await SessionManager.list(cwd, sessionDir);\n\t\t\treturn sessions\n\t\t\t\t.filter((session) => existsSync(session.path))\n\t\t\t\t.map((session) => ({ id: session.id, path: session.path }));\n\t\t},\n\t\topen(path: string) {\n\t\t\treturn SessionManager.open(path, sessionDir, options.preserveSessionCwd ? undefined : cwd);\n\t\t},\n\t\tcreate() {\n\t\t\treturn SessionManager.create(cwd, sessionDir);\n\t\t},\n\t};\n}\n"]}
@@ -0,0 +1,66 @@
1
+ import { existsSync } from "node:fs";
2
+ import { isIrohRemoteSessionId } from "../core/remote/iroh/handshake.js";
3
+ import { IrohRemoteOutcomeError } from "../core/remote/iroh/protocol.js";
4
+ import { SessionManager } from "../core/session-manager.js";
5
+ /**
6
+ * Resolve a conversation target to a concrete session, matching the historical
7
+ * behavior of createIrohRemoteAgentRuntimeWithSessionSelection exactly:
8
+ *
9
+ * - new: always create -> "created"
10
+ * - last without a remembered id: create -> "created"
11
+ * - last with a remembered id: open if it exists -> "resumed", else create -> "created_after_missing"
12
+ * - session: open if it exists -> "resumed", else throw session_unavailable
13
+ * (the wire protocol forbids created_after_missing for explicit session targets)
14
+ */
15
+ export async function resolveIrohRemoteSessionTarget(target, workspace, sessions) {
16
+ const resolved = (sessionManager, selection, requestedSessionId) => ({
17
+ sessionId: sessionManager.getSessionId(),
18
+ ...(sessionManager.getSessionFile() === undefined ? {} : { sessionFilePath: sessionManager.getSessionFile() }),
19
+ selection,
20
+ ...(requestedSessionId === undefined ? {} : { requestedSessionId }),
21
+ workspaceName: workspace.name,
22
+ workspacePath: workspace.path,
23
+ sessionManager,
24
+ });
25
+ if (target.kind === "new") {
26
+ return resolved(sessions.create(), "created");
27
+ }
28
+ const requestedSessionId = target.kind === "last" ? target.resumeSessionId : target.sessionId;
29
+ if (requestedSessionId === undefined) {
30
+ return resolved(sessions.create(), "created");
31
+ }
32
+ if (!isIrohRemoteSessionId(requestedSessionId)) {
33
+ if (target.kind === "session") {
34
+ throw new IrohRemoteOutcomeError("session_unavailable", "session not found in workspace");
35
+ }
36
+ return resolved(sessions.create(), "created_after_missing", requestedSessionId);
37
+ }
38
+ const existingSession = (await sessions.list()).find((session) => session.id === requestedSessionId);
39
+ if (!existingSession) {
40
+ if (target.kind === "session") {
41
+ throw new IrohRemoteOutcomeError("session_unavailable", "session not found in workspace");
42
+ }
43
+ return resolved(sessions.create(), "created_after_missing", requestedSessionId);
44
+ }
45
+ return resolved(sessions.open(existingSession.path), "resumed", requestedSessionId);
46
+ }
47
+ /** Real SessionManager-backed store for a workspace cwd + session dir. */
48
+ export function createSessionManagerTargetStore(cwd, sessionDir, options = {}) {
49
+ return {
50
+ async list() {
51
+ const sessions = options.listAll
52
+ ? await SessionManager.listAll(sessionDir)
53
+ : await SessionManager.list(cwd, sessionDir);
54
+ return sessions
55
+ .filter((session) => existsSync(session.path))
56
+ .map((session) => ({ id: session.id, path: session.path }));
57
+ },
58
+ open(path) {
59
+ return SessionManager.open(path, sessionDir, options.preserveSessionCwd ? undefined : cwd);
60
+ },
61
+ create() {
62
+ return SessionManager.create(cwd, sessionDir);
63
+ },
64
+ };
65
+ }
66
+ //# sourceMappingURL=session-target.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-target.js","sourceRoot":"","sources":["../../src/daemon/session-target.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { isIrohRemoteSessionId } from \"../core/remote/iroh/handshake.ts\";\nimport { IrohRemoteOutcomeError } from \"../core/remote/iroh/protocol.ts\";\nimport { SessionManager } from \"../core/session-manager.ts\";\n\n/**\n * Conversation target for a remote session, after the owner's last-session\n * bookkeeping has been applied (\"last\" carries the remembered session id).\n */\nexport type IrohRemoteSessionTarget =\n\t| { kind: \"last\"; resumeSessionId?: string }\n\t| { kind: \"new\" }\n\t| { kind: \"session\"; sessionId: string };\n\nexport type IrohRemoteSessionTargetSelection = \"created\" | \"created_after_missing\" | \"resumed\";\n\nexport interface ResolvedSessionTarget {\n\t/** Concrete id (existing file id, or freshly created). */\n\tsessionId: string;\n\tsessionFilePath?: string;\n\tselection: IrohRemoteSessionTargetSelection;\n\t/** Present for created_after_missing/resumed selections. */\n\trequestedSessionId?: string;\n\tworkspaceName: string;\n\tworkspacePath: string;\n}\n\nexport interface SessionTargetSessionHandle {\n\tgetSessionId(): string;\n\tgetSessionFile(): string | undefined;\n}\n\n/** Minimal session-store surface consumed by target resolution — injectable for tests. */\nexport interface SessionTargetSessionStore<H extends SessionTargetSessionHandle = SessionTargetSessionHandle> {\n\t/** Existing sessions for the workspace (only entries whose files exist on disk). */\n\tlist(): Promise<Array<{ id: string; path: string }>>;\n\topen(path: string): H;\n\tcreate(): H;\n}\n\nexport interface ResolvedSessionTargetWithManager<H extends SessionTargetSessionHandle = SessionTargetSessionHandle>\n\textends ResolvedSessionTarget {\n\tsessionManager: H;\n}\n\n/**\n * Resolve a conversation target to a concrete session, matching the historical\n * behavior of createIrohRemoteAgentRuntimeWithSessionSelection exactly:\n *\n * - new: always create -> \"created\"\n * - last without a remembered id: create -> \"created\"\n * - last with a remembered id: open if it exists -> \"resumed\", else create -> \"created_after_missing\"\n * - session: open if it exists -> \"resumed\", else throw session_unavailable\n * (the wire protocol forbids created_after_missing for explicit session targets)\n */\nexport async function resolveIrohRemoteSessionTarget<H extends SessionTargetSessionHandle>(\n\ttarget: IrohRemoteSessionTarget,\n\tworkspace: { name: string; path: string },\n\tsessions: SessionTargetSessionStore<H>,\n): Promise<ResolvedSessionTargetWithManager<H>> {\n\tconst resolved = (\n\t\tsessionManager: H,\n\t\tselection: IrohRemoteSessionTargetSelection,\n\t\trequestedSessionId?: string,\n\t): ResolvedSessionTargetWithManager<H> => ({\n\t\tsessionId: sessionManager.getSessionId(),\n\t\t...(sessionManager.getSessionFile() === undefined ? {} : { sessionFilePath: sessionManager.getSessionFile() }),\n\t\tselection,\n\t\t...(requestedSessionId === undefined ? {} : { requestedSessionId }),\n\t\tworkspaceName: workspace.name,\n\t\tworkspacePath: workspace.path,\n\t\tsessionManager,\n\t});\n\n\tif (target.kind === \"new\") {\n\t\treturn resolved(sessions.create(), \"created\");\n\t}\n\n\tconst requestedSessionId = target.kind === \"last\" ? target.resumeSessionId : target.sessionId;\n\tif (requestedSessionId === undefined) {\n\t\treturn resolved(sessions.create(), \"created\");\n\t}\n\n\tif (!isIrohRemoteSessionId(requestedSessionId)) {\n\t\tif (target.kind === \"session\") {\n\t\t\tthrow new IrohRemoteOutcomeError(\"session_unavailable\", \"session not found in workspace\");\n\t\t}\n\t\treturn resolved(sessions.create(), \"created_after_missing\", requestedSessionId);\n\t}\n\n\tconst existingSession = (await sessions.list()).find((session) => session.id === requestedSessionId);\n\tif (!existingSession) {\n\t\tif (target.kind === \"session\") {\n\t\t\tthrow new IrohRemoteOutcomeError(\"session_unavailable\", \"session not found in workspace\");\n\t\t}\n\t\treturn resolved(sessions.create(), \"created_after_missing\", requestedSessionId);\n\t}\n\n\treturn resolved(sessions.open(existingSession.path), \"resumed\", requestedSessionId);\n}\n\n/** Real SessionManager-backed store for a workspace cwd + session dir. */\nexport function createSessionManagerTargetStore(\n\tcwd: string,\n\tsessionDir: string,\n\toptions: { listAll?: boolean; preserveSessionCwd?: boolean } = {},\n): SessionTargetSessionStore<SessionManager> {\n\treturn {\n\t\tasync list() {\n\t\t\tconst sessions = options.listAll\n\t\t\t\t? await SessionManager.listAll(sessionDir)\n\t\t\t\t: await SessionManager.list(cwd, sessionDir);\n\t\t\treturn sessions\n\t\t\t\t.filter((session) => existsSync(session.path))\n\t\t\t\t.map((session) => ({ id: session.id, path: session.path }));\n\t\t},\n\t\topen(path: string) {\n\t\t\treturn SessionManager.open(path, sessionDir, options.preserveSessionCwd ? undefined : cwd);\n\t\t},\n\t\tcreate() {\n\t\t\treturn SessionManager.create(cwd, sessionDir);\n\t\t},\n\t};\n}\n"]}