@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,468 @@
1
+ import { existsSync, readFileSync, statSync } from "node:fs";
2
+ import { open } from "node:fs/promises";
3
+ import { createInterface } from "node:readline";
4
+ import { getAgentDir, VERSION } from "../config.js";
5
+ import { createDaemonClient } from "./control-client.js";
6
+ import { createIrohDaemonService } from "./iroh-service.js";
7
+ import { readPidfile, runVoltDaemon } from "./main.js";
8
+ import { getDaemonPaths } from "./paths.js";
9
+ import { verifyPidfileProcess } from "./process-identity.js";
10
+ import { installDaemonService, uninstallDaemonService } from "./service-install.js";
11
+ import { DAEMON_SHUTDOWN_TIMEOUT_MS, ensureDaemonRunning, probeDaemon, waitForDaemonExit } from "./spawn.js";
12
+ import { inspectVoltdStateFiles, regenerateInvalidVoltdState } from "./state.js";
13
+ const STOP_TIMEOUT_MS = DAEMON_SHUTDOWN_TIMEOUT_MS; // 60s drain cap + margin
14
+ const DEFAULT_LOG_TAIL_LINES = 200;
15
+ function printDaemonUsage() {
16
+ console.error(`Usage: volt daemon <command>
17
+
18
+ Commands:
19
+ start Start the background daemon (no-op if already running).
20
+ stop Ask the daemon to shut down gracefully.
21
+ status [--json] Show daemon status; exit 0 when running, 1 when not.
22
+ restart Stop then start; persistent state survives.
23
+ regenerate-state Back up invalid state and regenerate it after confirmation.
24
+ keep-awake [on|off] Prevent the host from sleeping while voltd runs; no arg prints state.
25
+ logs [-f] [-n N] Tail the daemon log (default ${DEFAULT_LOG_TAIL_LINES} lines).
26
+ install-service Register a login service (launchd/systemd) that starts the daemon.
27
+ uninstall-service Remove the login service.
28
+ run --foreground Run the daemon in this process (internal; used by start).
29
+ `);
30
+ }
31
+ async function requestStatus(agentDir) {
32
+ const probe = await probeDaemon(agentDir);
33
+ if (!probe.healthy) {
34
+ return undefined;
35
+ }
36
+ const client = createDaemonClient({
37
+ socketPath: probe.socketPath,
38
+ client: "cli",
39
+ version: VERSION,
40
+ authToken: probe.authToken,
41
+ reconnect: false,
42
+ });
43
+ try {
44
+ const statusProbe = await client.request({ type: "status" });
45
+ return statusProbe.type === "status_result" ? statusProbe : undefined;
46
+ }
47
+ finally {
48
+ await client.close();
49
+ }
50
+ }
51
+ async function daemonStart(agentDir) {
52
+ const result = await ensureDaemonRunning(agentDir);
53
+ if (!result.healthy) {
54
+ if (result.state === "protocol-mismatch") {
55
+ console.error("Error: a different voltd protocol version is already running; stop it before starting this version.");
56
+ }
57
+ else if (result.state === "unresponsive") {
58
+ console.error("Error: voltd socket is occupied but not responding; not starting a second daemon.");
59
+ }
60
+ else if (result.state === "auth-failed") {
61
+ console.error("Error: voltd rejected the local daemon metadata; not starting a second daemon.");
62
+ }
63
+ else if (result.state === "shutting-down") {
64
+ console.error("Error: existing voltd did not finish shutting down within the timeout.");
65
+ }
66
+ else {
67
+ console.error(`Error: ${result.error ?? "failed to start voltd (daemon did not become healthy within 5s)."}`);
68
+ if (result.invalidState) {
69
+ console.error("Run `volt daemon regenerate-state` to review and confirm regeneration.");
70
+ }
71
+ }
72
+ console.error(`Check the log: ${getDaemonPaths(agentDir).logPath}`);
73
+ process.exitCode = 1;
74
+ return;
75
+ }
76
+ console.error(`voltd ${result.version ?? VERSION} ${result.spawned ? "started" : "already running"} (pid ${result.pid})`);
77
+ console.error(`socket: ${result.socketPath}`);
78
+ }
79
+ /**
80
+ * SIGTERM a pidfile-recorded daemon, but only after verifying the pid still
81
+ * refers to the voltd that wrote the pidfile (a recycled pid must never
82
+ * receive the signal). Returns whether SIGTERM was sent, refused, or the
83
+ * process was already gone.
84
+ */
85
+ async function signalPidfileDaemon(pidfilePath, context) {
86
+ const pidfile = readPidfile(pidfilePath);
87
+ if (!pidfile) {
88
+ return "gone";
89
+ }
90
+ const verification = await verifyPidfileProcess(pidfile);
91
+ if (verification === "mismatch") {
92
+ console.error(`Error: pid ${pidfile.pid} from the pidfile is not verifiable as voltd (recycled pid?); not sending SIGTERM.`);
93
+ console.error(`Remove ${pidfilePath} if it is stale.`);
94
+ process.exitCode = 1;
95
+ return "refused";
96
+ }
97
+ if (verification === "gone") {
98
+ return "gone";
99
+ }
100
+ try {
101
+ process.kill(pidfile.pid, "SIGTERM");
102
+ console.error(`${context}; sent SIGTERM to pid ${pidfile.pid}`);
103
+ return "sent";
104
+ }
105
+ catch {
106
+ // Process exited between verification and signal.
107
+ return "gone";
108
+ }
109
+ }
110
+ async function daemonStop(agentDir) {
111
+ const paths = getDaemonPaths(agentDir);
112
+ const probe = await probeDaemon(agentDir);
113
+ const pidfile = readPidfile(paths.pidfilePath);
114
+ if (!probe.healthy) {
115
+ if (probe.state === "shutting-down") {
116
+ console.error("voltd is already draining; waiting for exit");
117
+ if ((await waitForDaemonExit({
118
+ agentDir,
119
+ pidfile,
120
+ socketPath: probe.socketPath,
121
+ timeoutMs: STOP_TIMEOUT_MS,
122
+ })) === "exited") {
123
+ console.error("voltd stopped");
124
+ return;
125
+ }
126
+ }
127
+ const signalResult = await signalPidfileDaemon(paths.pidfilePath, "voltd socket unreachable");
128
+ if (signalResult === "sent") {
129
+ if ((await waitForDaemonExit({ agentDir, pidfile, timeoutMs: STOP_TIMEOUT_MS })) === "exited") {
130
+ console.error("voltd stopped");
131
+ return;
132
+ }
133
+ console.error("Error: voltd did not stop after SIGTERM");
134
+ process.exitCode = 1;
135
+ return;
136
+ }
137
+ if (signalResult === "refused") {
138
+ return;
139
+ }
140
+ console.error("voltd is not running");
141
+ return;
142
+ }
143
+ const client = createDaemonClient({
144
+ socketPath: probe.socketPath,
145
+ client: "cli",
146
+ version: VERSION,
147
+ authToken: probe.authToken,
148
+ reconnect: false,
149
+ });
150
+ try {
151
+ await client.request({ type: "shutdown" });
152
+ }
153
+ catch {
154
+ // The daemon may close the socket before the ok lands; fall through to the poll.
155
+ }
156
+ finally {
157
+ await client.close();
158
+ }
159
+ if ((await waitForDaemonExit({
160
+ agentDir,
161
+ pid: probe.pid,
162
+ pidfile,
163
+ socketPath: probe.socketPath,
164
+ timeoutMs: STOP_TIMEOUT_MS,
165
+ })) === "exited") {
166
+ console.error("voltd stopped");
167
+ return;
168
+ }
169
+ const signalResult = await signalPidfileDaemon(paths.pidfilePath, "voltd did not stop over the control socket");
170
+ if (signalResult === "sent") {
171
+ if ((await waitForDaemonExit({ agentDir, pidfile, socketPath: probe.socketPath, timeoutMs: STOP_TIMEOUT_MS })) ===
172
+ "exited") {
173
+ console.error("voltd stopped");
174
+ return;
175
+ }
176
+ console.error("Error: voltd did not stop after SIGTERM");
177
+ process.exitCode = 1;
178
+ return;
179
+ }
180
+ if (signalResult === "refused") {
181
+ return;
182
+ }
183
+ console.error("Error: voltd did not stop within the timeout");
184
+ process.exitCode = 1;
185
+ }
186
+ function formatKeepAwake(keepAwake) {
187
+ // Older daemons predate the field; report that instead of guessing "off".
188
+ if (!keepAwake) {
189
+ return "unknown (daemon predates keep-awake)";
190
+ }
191
+ if (!keepAwake.enabled) {
192
+ return "off";
193
+ }
194
+ return keepAwake.state === "active" ? "on (active)" : `on (degraded: ${keepAwake.reason ?? "unknown"})`;
195
+ }
196
+ function formatUptime(startedAtMs) {
197
+ const totalSeconds = Math.max(0, Math.floor((Date.now() - startedAtMs) / 1000));
198
+ const hours = Math.floor(totalSeconds / 3600);
199
+ const minutes = Math.floor((totalSeconds % 3600) / 60);
200
+ const seconds = totalSeconds % 60;
201
+ return hours > 0 ? `${hours}h${minutes}m${seconds}s` : minutes > 0 ? `${minutes}m${seconds}s` : `${seconds}s`;
202
+ }
203
+ async function daemonStatus(agentDir, json) {
204
+ const status = await requestStatus(agentDir);
205
+ if (!status) {
206
+ if (json) {
207
+ console.log(JSON.stringify({ running: false }));
208
+ }
209
+ else {
210
+ console.error("voltd is not running");
211
+ }
212
+ process.exitCode = 1;
213
+ return;
214
+ }
215
+ if (json) {
216
+ console.log(JSON.stringify({ running: true, ...status, id: undefined, type: undefined }));
217
+ return;
218
+ }
219
+ console.error(`voltd ${status.version} (protocol ${status.protocolVersion})`);
220
+ console.error(`pid: ${status.pid}`);
221
+ console.error(`uptime: ${formatUptime(status.startedAtMs)}`);
222
+ console.error(`keep awake: ${formatKeepAwake(status.keepAwake)}`);
223
+ console.error(`phone connections: ${status.phoneConnections}`);
224
+ console.error(`workspaces: ${status.workspaces.length}`);
225
+ for (const workspace of status.workspaces) {
226
+ console.error(` ${workspace.name} -> ${workspace.path}`);
227
+ }
228
+ console.error(`paired clients: ${status.clients.length}`);
229
+ for (const client of status.clients) {
230
+ console.error(` ${client.clientNodeId}${client.label ? ` (${client.label})` : ""}`);
231
+ }
232
+ console.error(`leases: ${status.leases.length}`);
233
+ for (const lease of status.leases) {
234
+ console.error(` ${lease.workspaceName}/${lease.sessionId}: ${lease.state} (streams ${lease.streamCount}, relays ${lease.relayCount})`);
235
+ }
236
+ }
237
+ async function daemonKeepAwake(agentDir, args) {
238
+ const mode = args[0];
239
+ if (mode !== undefined && mode !== "on" && mode !== "off" && mode !== "status") {
240
+ console.error("Error: volt daemon keep-awake takes on, off, or no argument");
241
+ process.exitCode = 1;
242
+ return;
243
+ }
244
+ if (mode === undefined || mode === "status") {
245
+ const status = await requestStatus(agentDir);
246
+ if (!status) {
247
+ console.error("voltd is not running");
248
+ process.exitCode = 1;
249
+ return;
250
+ }
251
+ console.error(`keep awake: ${formatKeepAwake(status.keepAwake)}`);
252
+ return;
253
+ }
254
+ const probe = await probeDaemon(agentDir);
255
+ if (!probe.healthy) {
256
+ console.error("voltd is not running");
257
+ process.exitCode = 1;
258
+ return;
259
+ }
260
+ const client = createDaemonClient({
261
+ socketPath: probe.socketPath,
262
+ client: "cli",
263
+ version: VERSION,
264
+ authToken: probe.authToken,
265
+ reconnect: false,
266
+ });
267
+ try {
268
+ const response = await client.request({ type: "keep_awake_set", enabled: mode === "on" });
269
+ if (response.type === "error") {
270
+ console.error(`Error: ${response.message}`);
271
+ process.exitCode = 1;
272
+ return;
273
+ }
274
+ if (response.type !== "keep_awake_result") {
275
+ console.error("Error: this voltd version does not support keep-awake; restart the daemon after upgrading");
276
+ process.exitCode = 1;
277
+ return;
278
+ }
279
+ console.error(`keep awake: ${formatKeepAwake(response.keepAwake)}`);
280
+ if (response.keepAwake.enabled && response.keepAwake.state === "degraded") {
281
+ process.exitCode = 1;
282
+ }
283
+ }
284
+ finally {
285
+ await client.close();
286
+ }
287
+ }
288
+ function tailLines(content, count) {
289
+ const lines = content.split("\n");
290
+ if (lines.at(-1) === "") {
291
+ lines.pop();
292
+ }
293
+ return lines.slice(-count);
294
+ }
295
+ async function promptConfirm(message) {
296
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
297
+ return false;
298
+ }
299
+ return new Promise((resolve) => {
300
+ const readline = createInterface({ input: process.stdin, output: process.stdout });
301
+ readline.question(`${message} [y/N] `, (answer) => {
302
+ readline.close();
303
+ resolve(answer.trim().toLowerCase() === "y" || answer.trim().toLowerCase() === "yes");
304
+ });
305
+ });
306
+ }
307
+ async function daemonRegenerateState(agentDir) {
308
+ const probe = await probeDaemon(agentDir);
309
+ if (probe.healthy || probe.state !== "not-running") {
310
+ console.error(`Error: voltd must be fully stopped before regenerating state (currently ${probe.state}).`);
311
+ process.exitCode = 1;
312
+ return;
313
+ }
314
+ const invalidState = inspectVoltdStateFiles(agentDir);
315
+ if (!invalidState) {
316
+ console.error("Daemon state is valid; regeneration is not needed.");
317
+ return;
318
+ }
319
+ console.error(invalidState.error);
320
+ console.error("Regeneration preserves validated identity/settings when safe and drops invalid access records.");
321
+ console.error("If the identity cannot be preserved, all phones will need to pair again.");
322
+ if (!(await promptConfirm("Back up the invalid file and regenerate daemon state?"))) {
323
+ console.error("Daemon state was not changed.");
324
+ process.exitCode = 1;
325
+ return;
326
+ }
327
+ const { backupPath, preservedIdentity } = await regenerateInvalidVoltdState(agentDir);
328
+ console.error(`Backed up invalid daemon state to ${backupPath}`);
329
+ console.error(preservedIdentity ? "Preserved the Iroh identity." : "A new Iroh identity will be created.");
330
+ console.error("Run `volt daemon start` to create fresh state.");
331
+ }
332
+ async function daemonLogs(agentDir, args) {
333
+ const paths = getDaemonPaths(agentDir);
334
+ const follow = args.includes("-f") || args.includes("--follow");
335
+ let lineCount = DEFAULT_LOG_TAIL_LINES;
336
+ const nIndex = args.indexOf("-n");
337
+ if (nIndex !== -1) {
338
+ const parsed = Number(args[nIndex + 1]);
339
+ if (!Number.isInteger(parsed) || parsed <= 0) {
340
+ console.error("Error: -n requires a positive integer");
341
+ process.exitCode = 1;
342
+ return;
343
+ }
344
+ lineCount = parsed;
345
+ }
346
+ if (!existsSync(paths.logPath)) {
347
+ console.error(`No daemon log at ${paths.logPath}`);
348
+ process.exitCode = 1;
349
+ return;
350
+ }
351
+ for (const line of tailLines(readFileSync(paths.logPath, "utf8"), lineCount)) {
352
+ console.log(line);
353
+ }
354
+ if (!follow) {
355
+ return;
356
+ }
357
+ let offset = statSync(paths.logPath).size;
358
+ while (true) {
359
+ await new Promise((resolve) => setTimeout(resolve, 500));
360
+ let size;
361
+ try {
362
+ size = statSync(paths.logPath).size;
363
+ }
364
+ catch {
365
+ continue;
366
+ }
367
+ if (size < offset) {
368
+ offset = 0; // rotated
369
+ }
370
+ if (size === offset) {
371
+ continue;
372
+ }
373
+ const handle = await open(paths.logPath, "r");
374
+ try {
375
+ const { buffer, bytesRead } = await handle.read(Buffer.alloc(size - offset), 0, size - offset, offset);
376
+ process.stdout.write(buffer.subarray(0, bytesRead));
377
+ offset += bytesRead;
378
+ }
379
+ finally {
380
+ await handle.close();
381
+ }
382
+ }
383
+ }
384
+ /** Router for `volt daemon <command>`; returns true when the args were handled. */
385
+ export async function handleDaemonCommand(args, options) {
386
+ if (args[0] !== "daemon") {
387
+ return false;
388
+ }
389
+ const command = args[1];
390
+ if (command === undefined || command === "--help" || command === "-h") {
391
+ printDaemonUsage();
392
+ return true;
393
+ }
394
+ if (options.isStandaloneBinary) {
395
+ console.error("Error: volt daemon is not available from the standalone binary release.");
396
+ console.error("Use a Node.js npm install or a source checkout with optional @number0/iroh dependencies.");
397
+ process.exitCode = 1;
398
+ return true;
399
+ }
400
+ const agentDir = options.agentDir ?? getAgentDir();
401
+ const rest = args.slice(2);
402
+ switch (command) {
403
+ case "start":
404
+ await daemonStart(agentDir);
405
+ return true;
406
+ case "stop":
407
+ await daemonStop(agentDir);
408
+ return true;
409
+ case "status":
410
+ await daemonStatus(agentDir, rest.includes("--json"));
411
+ return true;
412
+ case "restart":
413
+ await daemonStop(agentDir);
414
+ if ((process.exitCode ?? 0) === 0) {
415
+ await daemonStart(agentDir);
416
+ }
417
+ return true;
418
+ case "regenerate-state":
419
+ await daemonRegenerateState(agentDir);
420
+ return true;
421
+ case "keep-awake":
422
+ await daemonKeepAwake(agentDir, rest);
423
+ return true;
424
+ case "logs":
425
+ await daemonLogs(agentDir, rest);
426
+ return true;
427
+ case "install-service": {
428
+ const result = await installDaemonService({ agentDir });
429
+ for (const message of result.messages) {
430
+ console.error(message);
431
+ }
432
+ if (!result.ok) {
433
+ process.exitCode = 1;
434
+ }
435
+ return true;
436
+ }
437
+ case "uninstall-service": {
438
+ const result = await uninstallDaemonService({ agentDir });
439
+ for (const message of result.messages) {
440
+ console.error(message);
441
+ }
442
+ if (!result.ok) {
443
+ process.exitCode = 1;
444
+ }
445
+ return true;
446
+ }
447
+ case "run": {
448
+ if (!rest.includes("--foreground")) {
449
+ console.error("Error: volt daemon run requires --foreground");
450
+ process.exitCode = 1;
451
+ return true;
452
+ }
453
+ const code = await runVoltDaemon({ agentDir, foreground: true }, [createIrohDaemonService()]);
454
+ // The run loop resolves only after shutdown() has awaited all cleanup, but
455
+ // the native iroh handle can keep the event loop alive afterwards (notably
456
+ // on Windows), leaving a zombie that clients still probe as "draining".
457
+ // Exit deterministically now that teardown is complete.
458
+ process.exit(code);
459
+ return true;
460
+ }
461
+ default:
462
+ console.error(`Error: Unknown daemon command: ${command}`);
463
+ printDaemonUsage();
464
+ process.exitCode = 1;
465
+ return true;
466
+ }
467
+ }
468
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/daemon/cli.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { open } from \"node:fs/promises\";\nimport { createInterface } from \"node:readline\";\nimport { getAgentDir, VERSION } from \"../config.ts\";\nimport { createDaemonClient } from \"./control-client.ts\";\nimport type { ControlKeepAwakeStatus, ControlResponse } from \"./control-protocol.ts\";\nimport { createIrohDaemonService } from \"./iroh-service.ts\";\nimport { readPidfile, runVoltDaemon } from \"./main.ts\";\nimport { getDaemonPaths } from \"./paths.ts\";\nimport { verifyPidfileProcess } from \"./process-identity.ts\";\nimport { installDaemonService, uninstallDaemonService } from \"./service-install.ts\";\nimport { DAEMON_SHUTDOWN_TIMEOUT_MS, ensureDaemonRunning, probeDaemon, waitForDaemonExit } from \"./spawn.ts\";\nimport { inspectVoltdStateFiles, regenerateInvalidVoltdState } from \"./state.ts\";\n\nconst STOP_TIMEOUT_MS = DAEMON_SHUTDOWN_TIMEOUT_MS; // 60s drain cap + margin\nconst DEFAULT_LOG_TAIL_LINES = 200;\n\ntype StatusResult = ControlResponse & { type: \"status_result\" };\n\nfunction printDaemonUsage(): void {\n\tconsole.error(`Usage: volt daemon <command>\n\nCommands:\n start Start the background daemon (no-op if already running).\n stop Ask the daemon to shut down gracefully.\n status [--json] Show daemon status; exit 0 when running, 1 when not.\n restart Stop then start; persistent state survives.\n regenerate-state Back up invalid state and regenerate it after confirmation.\n keep-awake [on|off] Prevent the host from sleeping while voltd runs; no arg prints state.\n logs [-f] [-n N] Tail the daemon log (default ${DEFAULT_LOG_TAIL_LINES} lines).\n install-service Register a login service (launchd/systemd) that starts the daemon.\n uninstall-service Remove the login service.\n run --foreground Run the daemon in this process (internal; used by start).\n`);\n}\n\nasync function requestStatus(agentDir: string): Promise<StatusResult | undefined> {\n\tconst probe = await probeDaemon(agentDir);\n\tif (!probe.healthy) {\n\t\treturn undefined;\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});\n\ttry {\n\t\tconst statusProbe = await client.request({ type: \"status\" });\n\t\treturn statusProbe.type === \"status_result\" ? statusProbe : undefined;\n\t} finally {\n\t\tawait client.close();\n\t}\n}\n\nasync function daemonStart(agentDir: string): Promise<void> {\n\tconst result = await ensureDaemonRunning(agentDir);\n\tif (!result.healthy) {\n\t\tif (result.state === \"protocol-mismatch\") {\n\t\t\tconsole.error(\n\t\t\t\t\"Error: a different voltd protocol version is already running; stop it before starting this version.\",\n\t\t\t);\n\t\t} else if (result.state === \"unresponsive\") {\n\t\t\tconsole.error(\"Error: voltd socket is occupied but not responding; not starting a second daemon.\");\n\t\t} else if (result.state === \"auth-failed\") {\n\t\t\tconsole.error(\"Error: voltd rejected the local daemon metadata; not starting a second daemon.\");\n\t\t} else if (result.state === \"shutting-down\") {\n\t\t\tconsole.error(\"Error: existing voltd did not finish shutting down within the timeout.\");\n\t\t} else {\n\t\t\tconsole.error(`Error: ${result.error ?? \"failed to start voltd (daemon did not become healthy within 5s).\"}`);\n\t\t\tif (result.invalidState) {\n\t\t\t\tconsole.error(\"Run `volt daemon regenerate-state` to review and confirm regeneration.\");\n\t\t\t}\n\t\t}\n\t\tconsole.error(`Check the log: ${getDaemonPaths(agentDir).logPath}`);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tconsole.error(\n\t\t`voltd ${result.version ?? VERSION} ${result.spawned ? \"started\" : \"already running\"} (pid ${result.pid})`,\n\t);\n\tconsole.error(`socket: ${result.socketPath}`);\n}\n\n/**\n * SIGTERM a pidfile-recorded daemon, but only after verifying the pid still\n * refers to the voltd that wrote the pidfile (a recycled pid must never\n * receive the signal). Returns whether SIGTERM was sent, refused, or the\n * process was already gone.\n */\nasync function signalPidfileDaemon(pidfilePath: string, context: string): Promise<\"sent\" | \"refused\" | \"gone\"> {\n\tconst pidfile = readPidfile(pidfilePath);\n\tif (!pidfile) {\n\t\treturn \"gone\";\n\t}\n\tconst verification = await verifyPidfileProcess(pidfile);\n\tif (verification === \"mismatch\") {\n\t\tconsole.error(\n\t\t\t`Error: pid ${pidfile.pid} from the pidfile is not verifiable as voltd (recycled pid?); not sending SIGTERM.`,\n\t\t);\n\t\tconsole.error(`Remove ${pidfilePath} if it is stale.`);\n\t\tprocess.exitCode = 1;\n\t\treturn \"refused\";\n\t}\n\tif (verification === \"gone\") {\n\t\treturn \"gone\";\n\t}\n\ttry {\n\t\tprocess.kill(pidfile.pid, \"SIGTERM\");\n\t\tconsole.error(`${context}; sent SIGTERM to pid ${pidfile.pid}`);\n\t\treturn \"sent\";\n\t} catch {\n\t\t// Process exited between verification and signal.\n\t\treturn \"gone\";\n\t}\n}\n\nasync function daemonStop(agentDir: string): Promise<void> {\n\tconst paths = getDaemonPaths(agentDir);\n\tconst probe = await probeDaemon(agentDir);\n\tconst pidfile = readPidfile(paths.pidfilePath);\n\tif (!probe.healthy) {\n\t\tif (probe.state === \"shutting-down\") {\n\t\t\tconsole.error(\"voltd is already draining; waiting for exit\");\n\t\t\tif (\n\t\t\t\t(await waitForDaemonExit({\n\t\t\t\t\tagentDir,\n\t\t\t\t\tpidfile,\n\t\t\t\t\tsocketPath: probe.socketPath,\n\t\t\t\t\ttimeoutMs: STOP_TIMEOUT_MS,\n\t\t\t\t})) === \"exited\"\n\t\t\t) {\n\t\t\t\tconsole.error(\"voltd stopped\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tconst signalResult = await signalPidfileDaemon(paths.pidfilePath, \"voltd socket unreachable\");\n\t\tif (signalResult === \"sent\") {\n\t\t\tif ((await waitForDaemonExit({ agentDir, pidfile, timeoutMs: STOP_TIMEOUT_MS })) === \"exited\") {\n\t\t\t\tconsole.error(\"voltd stopped\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconsole.error(\"Error: voltd did not stop after SIGTERM\");\n\t\t\tprocess.exitCode = 1;\n\t\t\treturn;\n\t\t}\n\t\tif (signalResult === \"refused\") {\n\t\t\treturn;\n\t\t}\n\t\tconsole.error(\"voltd is not running\");\n\t\treturn;\n\t}\n\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});\n\ttry {\n\t\tawait client.request({ type: \"shutdown\" });\n\t} catch {\n\t\t// The daemon may close the socket before the ok lands; fall through to the poll.\n\t} finally {\n\t\tawait client.close();\n\t}\n\n\tif (\n\t\t(await waitForDaemonExit({\n\t\t\tagentDir,\n\t\t\tpid: probe.pid,\n\t\t\tpidfile,\n\t\t\tsocketPath: probe.socketPath,\n\t\t\ttimeoutMs: STOP_TIMEOUT_MS,\n\t\t})) === \"exited\"\n\t) {\n\t\tconsole.error(\"voltd stopped\");\n\t\treturn;\n\t}\n\tconst signalResult = await signalPidfileDaemon(paths.pidfilePath, \"voltd did not stop over the control socket\");\n\tif (signalResult === \"sent\") {\n\t\tif (\n\t\t\t(await waitForDaemonExit({ agentDir, pidfile, socketPath: probe.socketPath, timeoutMs: STOP_TIMEOUT_MS })) ===\n\t\t\t\"exited\"\n\t\t) {\n\t\t\tconsole.error(\"voltd stopped\");\n\t\t\treturn;\n\t\t}\n\t\tconsole.error(\"Error: voltd did not stop after SIGTERM\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tif (signalResult === \"refused\") {\n\t\treturn;\n\t}\n\tconsole.error(\"Error: voltd did not stop within the timeout\");\n\tprocess.exitCode = 1;\n}\n\nfunction formatKeepAwake(keepAwake: ControlKeepAwakeStatus | undefined): string {\n\t// Older daemons predate the field; report that instead of guessing \"off\".\n\tif (!keepAwake) {\n\t\treturn \"unknown (daemon predates keep-awake)\";\n\t}\n\tif (!keepAwake.enabled) {\n\t\treturn \"off\";\n\t}\n\treturn keepAwake.state === \"active\" ? \"on (active)\" : `on (degraded: ${keepAwake.reason ?? \"unknown\"})`;\n}\n\nfunction formatUptime(startedAtMs: number): string {\n\tconst totalSeconds = Math.max(0, Math.floor((Date.now() - startedAtMs) / 1000));\n\tconst hours = Math.floor(totalSeconds / 3600);\n\tconst minutes = Math.floor((totalSeconds % 3600) / 60);\n\tconst seconds = totalSeconds % 60;\n\treturn hours > 0 ? `${hours}h${minutes}m${seconds}s` : minutes > 0 ? `${minutes}m${seconds}s` : `${seconds}s`;\n}\n\nasync function daemonStatus(agentDir: string, json: boolean): Promise<void> {\n\tconst status = await requestStatus(agentDir);\n\tif (!status) {\n\t\tif (json) {\n\t\t\tconsole.log(JSON.stringify({ running: false }));\n\t\t} else {\n\t\t\tconsole.error(\"voltd is not running\");\n\t\t}\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tif (json) {\n\t\tconsole.log(JSON.stringify({ running: true, ...status, id: undefined, type: undefined }));\n\t\treturn;\n\t}\n\tconsole.error(`voltd ${status.version} (protocol ${status.protocolVersion})`);\n\tconsole.error(`pid: ${status.pid}`);\n\tconsole.error(`uptime: ${formatUptime(status.startedAtMs)}`);\n\tconsole.error(`keep awake: ${formatKeepAwake(status.keepAwake)}`);\n\tconsole.error(`phone connections: ${status.phoneConnections}`);\n\tconsole.error(`workspaces: ${status.workspaces.length}`);\n\tfor (const workspace of status.workspaces) {\n\t\tconsole.error(` ${workspace.name} -> ${workspace.path}`);\n\t}\n\tconsole.error(`paired clients: ${status.clients.length}`);\n\tfor (const client of status.clients) {\n\t\tconsole.error(` ${client.clientNodeId}${client.label ? ` (${client.label})` : \"\"}`);\n\t}\n\tconsole.error(`leases: ${status.leases.length}`);\n\tfor (const lease of status.leases) {\n\t\tconsole.error(\n\t\t\t` ${lease.workspaceName}/${lease.sessionId}: ${lease.state} (streams ${lease.streamCount}, relays ${lease.relayCount})`,\n\t\t);\n\t}\n}\n\nasync function daemonKeepAwake(agentDir: string, args: string[]): Promise<void> {\n\tconst mode = args[0];\n\tif (mode !== undefined && mode !== \"on\" && mode !== \"off\" && mode !== \"status\") {\n\t\tconsole.error(\"Error: volt daemon keep-awake takes on, off, or no argument\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tif (mode === undefined || mode === \"status\") {\n\t\tconst status = await requestStatus(agentDir);\n\t\tif (!status) {\n\t\t\tconsole.error(\"voltd is not running\");\n\t\t\tprocess.exitCode = 1;\n\t\t\treturn;\n\t\t}\n\t\tconsole.error(`keep awake: ${formatKeepAwake(status.keepAwake)}`);\n\t\treturn;\n\t}\n\tconst probe = await probeDaemon(agentDir);\n\tif (!probe.healthy) {\n\t\tconsole.error(\"voltd is not running\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\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});\n\ttry {\n\t\tconst response = await client.request({ type: \"keep_awake_set\", enabled: mode === \"on\" });\n\t\tif (response.type === \"error\") {\n\t\t\tconsole.error(`Error: ${response.message}`);\n\t\t\tprocess.exitCode = 1;\n\t\t\treturn;\n\t\t}\n\t\tif (response.type !== \"keep_awake_result\") {\n\t\t\tconsole.error(\"Error: this voltd version does not support keep-awake; restart the daemon after upgrading\");\n\t\t\tprocess.exitCode = 1;\n\t\t\treturn;\n\t\t}\n\t\tconsole.error(`keep awake: ${formatKeepAwake(response.keepAwake)}`);\n\t\tif (response.keepAwake.enabled && response.keepAwake.state === \"degraded\") {\n\t\t\tprocess.exitCode = 1;\n\t\t}\n\t} finally {\n\t\tawait client.close();\n\t}\n}\n\nfunction tailLines(content: string, count: number): string[] {\n\tconst lines = content.split(\"\\n\");\n\tif (lines.at(-1) === \"\") {\n\t\tlines.pop();\n\t}\n\treturn lines.slice(-count);\n}\n\nasync function promptConfirm(message: string): Promise<boolean> {\n\tif (!process.stdin.isTTY || !process.stdout.isTTY) {\n\t\treturn false;\n\t}\n\treturn new Promise((resolve) => {\n\t\tconst readline = createInterface({ input: process.stdin, output: process.stdout });\n\t\treadline.question(`${message} [y/N] `, (answer) => {\n\t\t\treadline.close();\n\t\t\tresolve(answer.trim().toLowerCase() === \"y\" || answer.trim().toLowerCase() === \"yes\");\n\t\t});\n\t});\n}\n\nasync function daemonRegenerateState(agentDir: string): Promise<void> {\n\tconst probe = await probeDaemon(agentDir);\n\tif (probe.healthy || probe.state !== \"not-running\") {\n\t\tconsole.error(`Error: voltd must be fully stopped before regenerating state (currently ${probe.state}).`);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tconst invalidState = inspectVoltdStateFiles(agentDir);\n\tif (!invalidState) {\n\t\tconsole.error(\"Daemon state is valid; regeneration is not needed.\");\n\t\treturn;\n\t}\n\tconsole.error(invalidState.error);\n\tconsole.error(\"Regeneration preserves validated identity/settings when safe and drops invalid access records.\");\n\tconsole.error(\"If the identity cannot be preserved, all phones will need to pair again.\");\n\tif (!(await promptConfirm(\"Back up the invalid file and regenerate daemon state?\"))) {\n\t\tconsole.error(\"Daemon state was not changed.\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tconst { backupPath, preservedIdentity } = await regenerateInvalidVoltdState(agentDir);\n\tconsole.error(`Backed up invalid daemon state to ${backupPath}`);\n\tconsole.error(preservedIdentity ? \"Preserved the Iroh identity.\" : \"A new Iroh identity will be created.\");\n\tconsole.error(\"Run `volt daemon start` to create fresh state.\");\n}\n\nasync function daemonLogs(agentDir: string, args: string[]): Promise<void> {\n\tconst paths = getDaemonPaths(agentDir);\n\tconst follow = args.includes(\"-f\") || args.includes(\"--follow\");\n\tlet lineCount = DEFAULT_LOG_TAIL_LINES;\n\tconst nIndex = args.indexOf(\"-n\");\n\tif (nIndex !== -1) {\n\t\tconst parsed = Number(args[nIndex + 1]);\n\t\tif (!Number.isInteger(parsed) || parsed <= 0) {\n\t\t\tconsole.error(\"Error: -n requires a positive integer\");\n\t\t\tprocess.exitCode = 1;\n\t\t\treturn;\n\t\t}\n\t\tlineCount = parsed;\n\t}\n\tif (!existsSync(paths.logPath)) {\n\t\tconsole.error(`No daemon log at ${paths.logPath}`);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tfor (const line of tailLines(readFileSync(paths.logPath, \"utf8\"), lineCount)) {\n\t\tconsole.log(line);\n\t}\n\tif (!follow) {\n\t\treturn;\n\t}\n\tlet offset = statSync(paths.logPath).size;\n\twhile (true) {\n\t\tawait new Promise((resolve) => setTimeout(resolve, 500));\n\t\tlet size: number;\n\t\ttry {\n\t\t\tsize = statSync(paths.logPath).size;\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\tif (size < offset) {\n\t\t\toffset = 0; // rotated\n\t\t}\n\t\tif (size === offset) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst handle = await open(paths.logPath, \"r\");\n\t\ttry {\n\t\t\tconst { buffer, bytesRead } = await handle.read(Buffer.alloc(size - offset), 0, size - offset, offset);\n\t\t\tprocess.stdout.write(buffer.subarray(0, bytesRead));\n\t\t\toffset += bytesRead;\n\t\t} finally {\n\t\t\tawait handle.close();\n\t\t}\n\t}\n}\n\nexport interface DaemonCommandOptions {\n\tagentDir?: string;\n\t/** Standalone releases omit the native Iroh adapter. */\n\tisStandaloneBinary: boolean;\n}\n\n/** Router for `volt daemon <command>`; returns true when the args were handled. */\nexport async function handleDaemonCommand(args: string[], options: DaemonCommandOptions): Promise<boolean> {\n\tif (args[0] !== \"daemon\") {\n\t\treturn false;\n\t}\n\tconst command = args[1];\n\tif (command === undefined || command === \"--help\" || command === \"-h\") {\n\t\tprintDaemonUsage();\n\t\treturn true;\n\t}\n\tif (options.isStandaloneBinary) {\n\t\tconsole.error(\"Error: volt daemon 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 agentDir = options.agentDir ?? getAgentDir();\n\tconst rest = args.slice(2);\n\n\tswitch (command) {\n\t\tcase \"start\":\n\t\t\tawait daemonStart(agentDir);\n\t\t\treturn true;\n\t\tcase \"stop\":\n\t\t\tawait daemonStop(agentDir);\n\t\t\treturn true;\n\t\tcase \"status\":\n\t\t\tawait daemonStatus(agentDir, rest.includes(\"--json\"));\n\t\t\treturn true;\n\t\tcase \"restart\":\n\t\t\tawait daemonStop(agentDir);\n\t\t\tif ((process.exitCode ?? 0) === 0) {\n\t\t\t\tawait daemonStart(agentDir);\n\t\t\t}\n\t\t\treturn true;\n\t\tcase \"regenerate-state\":\n\t\t\tawait daemonRegenerateState(agentDir);\n\t\t\treturn true;\n\t\tcase \"keep-awake\":\n\t\t\tawait daemonKeepAwake(agentDir, rest);\n\t\t\treturn true;\n\t\tcase \"logs\":\n\t\t\tawait daemonLogs(agentDir, rest);\n\t\t\treturn true;\n\t\tcase \"install-service\": {\n\t\t\tconst result = await installDaemonService({ agentDir });\n\t\t\tfor (const message of result.messages) {\n\t\t\t\tconsole.error(message);\n\t\t\t}\n\t\t\tif (!result.ok) {\n\t\t\t\tprocess.exitCode = 1;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\tcase \"uninstall-service\": {\n\t\t\tconst result = await uninstallDaemonService({ agentDir });\n\t\t\tfor (const message of result.messages) {\n\t\t\t\tconsole.error(message);\n\t\t\t}\n\t\t\tif (!result.ok) {\n\t\t\t\tprocess.exitCode = 1;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\tcase \"run\": {\n\t\t\tif (!rest.includes(\"--foreground\")) {\n\t\t\t\tconsole.error(\"Error: volt daemon run requires --foreground\");\n\t\t\t\tprocess.exitCode = 1;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tconst code = await runVoltDaemon({ agentDir, foreground: true }, [createIrohDaemonService()]);\n\t\t\t// The run loop resolves only after shutdown() has awaited all cleanup, but\n\t\t\t// the native iroh handle can keep the event loop alive afterwards (notably\n\t\t\t// on Windows), leaving a zombie that clients still probe as \"draining\".\n\t\t\t// Exit deterministically now that teardown is complete.\n\t\t\tprocess.exit(code);\n\t\t\treturn true;\n\t\t}\n\t\tdefault:\n\t\t\tconsole.error(`Error: Unknown daemon command: ${command}`);\n\t\t\tprintDaemonUsage();\n\t\t\tprocess.exitCode = 1;\n\t\t\treturn true;\n\t}\n}\n"]}
@@ -0,0 +1,60 @@
1
+ import type { Duplex } from "node:stream";
2
+ import { type ControlClientKind, type ControlEvent, type ControlRequest, type ControlResponse, type RelayPreamble } from "./control-protocol.ts";
3
+ export type DaemonClientConnectionState = "connected" | "reconnecting" | "gone";
4
+ export type DaemonClientGoneReason = "closed" | "protocol_mismatch" | "dial_failed";
5
+ export interface DaemonClientEndpoint {
6
+ socketPath: string;
7
+ authToken?: string;
8
+ }
9
+ export interface DaemonClientOptions {
10
+ socketPath: string;
11
+ client: ControlClientKind;
12
+ version: string;
13
+ /** Per-daemon instance token read from the local pidfile. */
14
+ authToken?: string;
15
+ /** Re-read daemon discovery metadata before every dial after the first. */
16
+ refreshEndpoint?(): DaemonClientEndpoint | undefined;
17
+ /** Capabilities advertised in the control hello (e.g. "worktrees"). */
18
+ capabilities?: string[];
19
+ onEvent?(event: ControlEvent): void;
20
+ onConnectionStateChange?(state: DaemonClientConnectionState): void;
21
+ /** Reconnect forever with backoff (default true for TUI clients). */
22
+ reconnect?: boolean;
23
+ minBackoffMs?: number;
24
+ maxBackoffMs?: number;
25
+ helloTimeoutMs?: number;
26
+ }
27
+ export interface RelayOfferInfo {
28
+ relayId: string;
29
+ relayToken: string;
30
+ }
31
+ export declare class DaemonClientClosedError extends Error {
32
+ constructor(message?: string);
33
+ }
34
+ export interface DaemonClient {
35
+ readonly connectionState: DaemonClientConnectionState;
36
+ /** hello_ack payload of the current connection, when connected. */
37
+ readonly serverInfo: {
38
+ version?: string;
39
+ protocolVersion?: number;
40
+ connectionId?: string;
41
+ } | undefined;
42
+ readonly goneReason: DaemonClientGoneReason | undefined;
43
+ /** Connect (or await the in-flight connect). Rejects when reconnect is off and the dial fails. */
44
+ connect(): Promise<void>;
45
+ request(req: DistributiveOmit<ControlRequest, "id">): Promise<ControlResponse>;
46
+ /**
47
+ * Await the next response for a request id (used after a provisional
48
+ * lease_pending). Rejects with DaemonClientClosedError on disconnect.
49
+ */
50
+ waitForResponse(id: string): Promise<ControlResponse>;
51
+ /** Dial a fresh control endpoint with role:"relay"; returns the raw duplex after the preamble. */
52
+ openRelay(offer: RelayOfferInfo): Promise<{
53
+ preamble: RelayPreamble;
54
+ stream: Duplex;
55
+ }>;
56
+ close(): Promise<void>;
57
+ }
58
+ export type DistributiveOmit<T, K extends keyof T> = T extends unknown ? Omit<T, K> : never;
59
+ export declare function createDaemonClient(options: DaemonClientOptions): DaemonClient;
60
+ //# sourceMappingURL=control-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control-client.d.ts","sourceRoot":"","sources":["../../src/daemon/control-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACN,KAAK,iBAAiB,EACtB,KAAK,YAAY,EAEjB,KAAK,cAAc,EACnB,KAAK,eAAe,EAQpB,KAAK,aAAa,EAClB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,2BAA2B,GAAG,WAAW,GAAG,cAAc,GAAG,MAAM,CAAC;AAChF,MAAM,MAAM,sBAAsB,GAAG,QAAQ,GAAG,mBAAmB,GAAG,aAAa,CAAC;AAEpF,MAAM,WAAW,oBAAoB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,eAAe,CAAC,IAAI,oBAAoB,GAAG,SAAS,CAAC;IACrD,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,CAAC,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IACpC,uBAAuB,CAAC,CAAC,KAAK,EAAE,2BAA2B,GAAG,IAAI,CAAC;IACnE,qEAAqE;IACrE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,uBAAwB,SAAQ,KAAK;IACjD,YAAY,OAAO,SAA6B,EAG/C;CACD;AAED,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,eAAe,EAAE,2BAA2B,CAAC;IACtD,mEAAmE;IACnE,QAAQ,CAAC,UAAU,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IACvG,QAAQ,CAAC,UAAU,EAAE,sBAAsB,GAAG,SAAS,CAAC;IACxD,kGAAkG;IAClG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,OAAO,CAAC,GAAG,EAAE,gBAAgB,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC/E;;;OAGG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACtD,kGAAkG;IAClG,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,aAAa,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,CAAC,SAAS,OAAO,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;AAgB5F,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,YAAY,CAqZ7E","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { createConnection, type Socket } from \"node:net\";\nimport type { Duplex } from \"node:stream\";\nimport {\n\ttype ControlClientKind,\n\ttype ControlEvent,\n\tControlLineDecoder,\n\ttype ControlRequest,\n\ttype ControlResponse,\n\tencodeControlLine,\n\ttype HelloAck,\n\tisControlEvent,\n\tisControlResponse,\n\tisHelloAck,\n\tisRelayPreamble,\n\tPROTOCOL_VERSION,\n\ttype RelayPreamble,\n} from \"./control-protocol.ts\";\n\nexport type DaemonClientConnectionState = \"connected\" | \"reconnecting\" | \"gone\";\nexport type DaemonClientGoneReason = \"closed\" | \"protocol_mismatch\" | \"dial_failed\";\n\nexport interface DaemonClientEndpoint {\n\tsocketPath: string;\n\tauthToken?: string;\n}\n\nexport interface DaemonClientOptions {\n\tsocketPath: string;\n\tclient: ControlClientKind;\n\tversion: string;\n\t/** Per-daemon instance token read from the local pidfile. */\n\tauthToken?: string;\n\t/** Re-read daemon discovery metadata before every dial after the first. */\n\trefreshEndpoint?(): DaemonClientEndpoint | undefined;\n\t/** Capabilities advertised in the control hello (e.g. \"worktrees\"). */\n\tcapabilities?: string[];\n\tonEvent?(event: ControlEvent): void;\n\tonConnectionStateChange?(state: DaemonClientConnectionState): void;\n\t/** Reconnect forever with backoff (default true for TUI clients). */\n\treconnect?: boolean;\n\tminBackoffMs?: number;\n\tmaxBackoffMs?: number;\n\thelloTimeoutMs?: number;\n}\n\nexport interface RelayOfferInfo {\n\trelayId: string;\n\trelayToken: string;\n}\n\nexport class DaemonClientClosedError extends Error {\n\tconstructor(message = \"daemon connection closed\") {\n\t\tsuper(message);\n\t\tthis.name = \"DaemonClientClosedError\";\n\t}\n}\n\nexport interface DaemonClient {\n\treadonly connectionState: DaemonClientConnectionState;\n\t/** hello_ack payload of the current connection, when connected. */\n\treadonly serverInfo: { version?: string; protocolVersion?: number; connectionId?: string } | undefined;\n\treadonly goneReason: DaemonClientGoneReason | undefined;\n\t/** Connect (or await the in-flight connect). Rejects when reconnect is off and the dial fails. */\n\tconnect(): Promise<void>;\n\trequest(req: DistributiveOmit<ControlRequest, \"id\">): Promise<ControlResponse>;\n\t/**\n\t * Await the next response for a request id (used after a provisional\n\t * lease_pending). Rejects with DaemonClientClosedError on disconnect.\n\t */\n\twaitForResponse(id: string): Promise<ControlResponse>;\n\t/** Dial a fresh control endpoint with role:\"relay\"; returns the raw duplex after the preamble. */\n\topenRelay(offer: RelayOfferInfo): Promise<{ preamble: RelayPreamble; stream: Duplex }>;\n\tclose(): Promise<void>;\n}\n\nexport type DistributiveOmit<T, K extends keyof T> = T extends unknown ? Omit<T, K> : never;\n\ninterface PendingRequest {\n\tresolve(response: ControlResponse): void;\n\treject(error: Error): void;\n}\n\n/** Responses that announce a later terminal response for the same id. */\nfunction isProvisionalControlResponse(response: ControlResponse): boolean {\n\treturn response.type === \"lease_pending\";\n}\n\nconst DEFAULT_MIN_BACKOFF_MS = 250;\nconst DEFAULT_MAX_BACKOFF_MS = 5000;\nconst DEFAULT_HELLO_TIMEOUT_MS = 5000;\n\nexport function createDaemonClient(options: DaemonClientOptions): DaemonClient {\n\tconst reconnectEnabled = options.reconnect ?? true;\n\tconst minBackoffMs = options.minBackoffMs ?? DEFAULT_MIN_BACKOFF_MS;\n\tconst maxBackoffMs = options.maxBackoffMs ?? DEFAULT_MAX_BACKOFF_MS;\n\tconst helloTimeoutMs = options.helloTimeoutMs ?? DEFAULT_HELLO_TIMEOUT_MS;\n\n\tlet state: DaemonClientConnectionState = \"reconnecting\";\n\tlet socket: Socket | undefined;\n\tlet endpoint: DaemonClientEndpoint = {\n\t\tsocketPath: options.socketPath,\n\t\t...(options.authToken === undefined ? {} : { authToken: options.authToken }),\n\t};\n\tlet connectedEndpoint: DaemonClientEndpoint | undefined;\n\tlet hasAttemptedDial = false;\n\t// The socket for an in-flight dial (before hello_ack promotes it to `socket`).\n\t// Tracked so close() can destroy a mid-handshake dial instead of leaking it.\n\tlet dialing: Socket | undefined;\n\tlet serverInfo: { version?: string; protocolVersion?: number; connectionId?: string } | undefined;\n\tlet closed = false;\n\tlet goneReason: DaemonClientGoneReason | undefined;\n\tlet backoffMs = minBackoffMs;\n\tlet reconnectTimer: NodeJS.Timeout | undefined;\n\tlet connectPromise: Promise<void> | undefined;\n\tconst pending = new Map<string, PendingRequest>();\n\t/**\n\t * Terminal-response promises armed when a provisional response resolves the\n\t * original request. Armed synchronously inside the data handler: the\n\t * provisional and terminal frames can arrive in one socket read, while the\n\t * caller's waitForResponse only runs after the resolve's microtask — without\n\t * this, the terminal response would resolve the already-resolved original\n\t * promise and be lost.\n\t */\n\tconst followUps = new Map<string, Promise<ControlResponse>>();\n\n\tconst setState = (next: DaemonClientConnectionState) => {\n\t\tif (state === next) {\n\t\t\treturn;\n\t\t}\n\t\tstate = next;\n\t\toptions.onConnectionStateChange?.(next);\n\t};\n\n\tconst failPending = () => {\n\t\tconst entries = Array.from(pending.values());\n\t\tpending.clear();\n\t\tfollowUps.clear();\n\t\tfor (const entry of entries) {\n\t\t\tentry.reject(new DaemonClientClosedError());\n\t\t}\n\t};\n\n\tconst scheduleReconnect = () => {\n\t\tif (closed || !reconnectEnabled || reconnectTimer) {\n\t\t\treturn;\n\t\t}\n\t\tsetState(\"reconnecting\");\n\t\tconst jitter = 1 + (Math.random() * 0.4 - 0.2);\n\t\tconst delay = Math.min(maxBackoffMs, backoffMs) * jitter;\n\t\tbackoffMs = Math.min(maxBackoffMs, backoffMs * 2);\n\t\treconnectTimer = setTimeout(() => {\n\t\t\treconnectTimer = undefined;\n\t\t\tvoid dial().catch(() => {\n\t\t\t\tscheduleReconnect();\n\t\t\t});\n\t\t}, delay);\n\t\treconnectTimer.unref?.();\n\t};\n\n\tconst dial = (): Promise<void> => {\n\t\tif (closed) {\n\t\t\treturn Promise.reject(new DaemonClientClosedError());\n\t\t}\n\t\tif (connectPromise) {\n\t\t\treturn connectPromise;\n\t\t}\n\t\tif (socket && !socket.destroyed) {\n\t\t\t// A racing dial (manual connect vs the backoff timer) must never stack\n\t\t\t// a second live connection: the orphaned socket would keep delivering\n\t\t\t// duplicate events and hold a phantom daemon connection open.\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\tif (hasAttemptedDial && options.refreshEndpoint) {\n\t\t\ttry {\n\t\t\t\tconst refreshed = options.refreshEndpoint();\n\t\t\t\tif (refreshed) {\n\t\t\t\t\t// Replace the complete endpoint so a tokenless legacy pidfile also\n\t\t\t\t\t// clears credentials from the previous daemon instance.\n\t\t\t\t\tendpoint = {\n\t\t\t\t\t\tsocketPath: refreshed.socketPath,\n\t\t\t\t\t\t...(refreshed.authToken === undefined ? {} : { authToken: refreshed.authToken }),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconst refreshError = error instanceof Error ? error : new Error(String(error));\n\t\t\t\tif (reconnectEnabled) {\n\t\t\t\t\tscheduleReconnect();\n\t\t\t\t} else {\n\t\t\t\t\tgoneReason = \"dial_failed\";\n\t\t\t\t\tsetState(\"gone\");\n\t\t\t\t}\n\t\t\t\treturn Promise.reject(refreshError);\n\t\t\t}\n\t\t}\n\t\thasAttemptedDial = true;\n\t\tconst dialEndpoint = endpoint;\n\t\tconnectPromise = new Promise<void>((resolve, reject) => {\n\t\t\tconst dialed = createConnection(dialEndpoint.socketPath);\n\t\t\tdialing = dialed;\n\t\t\tconst decoder = new ControlLineDecoder();\n\t\t\tlet acked = false;\n\t\t\tlet dialSettled = false;\n\t\t\tconst helloTimer = setTimeout(() => {\n\t\t\t\tfailDial(new Error(\"daemon hello timed out\"));\n\t\t\t}, helloTimeoutMs);\n\t\t\thelloTimer.unref?.();\n\n\t\t\tconst failDial = (error: Error, fatalReason?: DaemonClientGoneReason) => {\n\t\t\t\tif (dialSettled) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tdialSettled = true;\n\t\t\t\tclearTimeout(helloTimer);\n\t\t\t\tconnectPromise = undefined;\n\t\t\t\tdialing = undefined;\n\t\t\t\tdialed.destroy();\n\t\t\t\tif (fatalReason) {\n\t\t\t\t\tclosed = true;\n\t\t\t\t\tgoneReason = fatalReason;\n\t\t\t\t\tsetState(\"gone\");\n\t\t\t\t} else if (reconnectEnabled && !closed) {\n\t\t\t\t\tscheduleReconnect();\n\t\t\t\t} else {\n\t\t\t\t\tgoneReason = \"dial_failed\";\n\t\t\t\t\tsetState(\"gone\");\n\t\t\t\t}\n\t\t\t\treject(error);\n\t\t\t};\n\n\t\t\tdialed.on(\"connect\", () => {\n\t\t\t\tdialed.write(\n\t\t\t\t\tencodeControlLine({\n\t\t\t\t\t\ttype: \"hello\",\n\t\t\t\t\t\trole: \"control\",\n\t\t\t\t\t\tprotocolVersion: PROTOCOL_VERSION,\n\t\t\t\t\t\tpid: process.pid,\n\t\t\t\t\t\tversion: options.version,\n\t\t\t\t\t\tclient: options.client,\n\t\t\t\t\t\t...(dialEndpoint.authToken === undefined ? {} : { controlToken: dialEndpoint.authToken }),\n\t\t\t\t\t\t...(options.capabilities === undefined ? {} : { capabilities: options.capabilities }),\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t});\n\t\t\tdialed.on(\"data\", (chunk) => {\n\t\t\t\tlet messages: unknown[];\n\t\t\t\ttry {\n\t\t\t\t\tmessages = decoder.push(chunk);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tdialed.destroy(error instanceof Error ? error : new Error(String(error)));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tfor (const message of messages) {\n\t\t\t\t\tif (!acked) {\n\t\t\t\t\t\tif (!isHelloAck(message)) {\n\t\t\t\t\t\t\tfailDial(new Error(\"daemon did not answer hello\"));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst ack: HelloAck = message;\n\t\t\t\t\t\tif (!ack.ok) {\n\t\t\t\t\t\t\tfailDial(\n\t\t\t\t\t\t\t\tnew Error(`daemon rejected hello: ${ack.error ?? \"unknown\"}`),\n\t\t\t\t\t\t\t\tack.error === \"protocol_mismatch\" ? \"protocol_mismatch\" : undefined,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (closed) {\n\t\t\t\t\t\t\t// close() ran while this dial was mid-handshake. Do not adopt\n\t\t\t\t\t\t\t// the socket or flip to \"connected\"; drop the late ack and the\n\t\t\t\t\t\t\t// now-orphaned connection instead of leaking it.\n\t\t\t\t\t\t\tdialSettled = true;\n\t\t\t\t\t\t\tclearTimeout(helloTimer);\n\t\t\t\t\t\t\tconnectPromise = undefined;\n\t\t\t\t\t\t\tdialing = undefined;\n\t\t\t\t\t\t\tdialed.destroy();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tacked = true;\n\t\t\t\t\t\tdialSettled = true;\n\t\t\t\t\t\tclearTimeout(helloTimer);\n\t\t\t\t\t\tdialing = undefined;\n\t\t\t\t\t\tsocket = dialed;\n\t\t\t\t\t\tconnectedEndpoint = dialEndpoint;\n\t\t\t\t\t\tserverInfo = {\n\t\t\t\t\t\t\tversion: ack.version,\n\t\t\t\t\t\t\tprotocolVersion: ack.protocolVersion,\n\t\t\t\t\t\t\tconnectionId: ack.connectionId,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbackoffMs = minBackoffMs;\n\t\t\t\t\t\t// A pending backoff dial is now redundant (and dial()'s live-socket\n\t\t\t\t\t\t// guard would make it a no-op anyway); drop it.\n\t\t\t\t\t\tif (reconnectTimer) {\n\t\t\t\t\t\t\tclearTimeout(reconnectTimer);\n\t\t\t\t\t\t\treconnectTimer = undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconnectPromise = undefined;\n\t\t\t\t\t\tgoneReason = undefined;\n\t\t\t\t\t\tsetState(\"connected\");\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (isControlResponse(message)) {\n\t\t\t\t\t\tconst entry = pending.get(message.id);\n\t\t\t\t\t\tif (entry) {\n\t\t\t\t\t\t\tif (isProvisionalControlResponse(message)) {\n\t\t\t\t\t\t\t\tconst followUp = registerPending(message.id);\n\t\t\t\t\t\t\t\t// Unclaimed on disconnect is fine; waitForResponse consumers\n\t\t\t\t\t\t\t\t// still observe the rejection through the same promise.\n\t\t\t\t\t\t\t\tfollowUp.catch(() => {});\n\t\t\t\t\t\t\t\tfollowUps.set(message.id, followUp);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Keep any armed followUps entry: the terminal response may\n\t\t\t\t\t\t\t\t// resolve it before waitForResponse claims it.\n\t\t\t\t\t\t\t\tpending.delete(message.id);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tentry.resolve(message);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (isControlEvent(message)) {\n\t\t\t\t\t\toptions.onEvent?.(message);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tdialed.on(\"error\", (error) => {\n\t\t\t\tif (!acked) {\n\t\t\t\t\tfailDial(error instanceof Error ? error : new Error(String(error)));\n\t\t\t\t}\n\t\t\t});\n\t\t\tdialed.on(\"close\", () => {\n\t\t\t\tif (!acked) {\n\t\t\t\t\tfailDial(new DaemonClientClosedError(\"daemon connection closed before hello\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (socket === dialed) {\n\t\t\t\t\tsocket = undefined;\n\t\t\t\t\tconnectedEndpoint = undefined;\n\t\t\t\t\tserverInfo = undefined;\n\t\t\t\t\tfailPending();\n\t\t\t\t\tif (closed) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (reconnectEnabled) {\n\t\t\t\t\t\tscheduleReconnect();\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// A reconnect-disabled client (e.g. `volt remote pair`) has no path\n\t\t\t\t\t\t// back to the daemon once its established connection drops.\n\t\t\t\t\t\t// Transition to \"gone\" so onConnectionStateChange fires and callers\n\t\t\t\t\t\t// awaiting the connection (whenConnectionLost) unblock instead of\n\t\t\t\t\t\t// hanging forever.\n\t\t\t\t\t\tgoneReason = \"closed\";\n\t\t\t\t\t\tsetState(\"gone\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\treturn connectPromise;\n\t};\n\n\tconst send = (request: ControlRequest): void => {\n\t\tif (!socket || socket.destroyed) {\n\t\t\tthrow new DaemonClientClosedError(\"not connected to daemon\");\n\t\t}\n\t\tsocket.write(encodeControlLine(request));\n\t};\n\n\tconst registerPending = (id: string): Promise<ControlResponse> => {\n\t\treturn new Promise<ControlResponse>((resolve, reject) => {\n\t\t\tpending.set(id, { resolve, reject });\n\t\t});\n\t};\n\n\treturn {\n\t\tget connectionState() {\n\t\t\treturn state;\n\t\t},\n\t\tget serverInfo() {\n\t\t\treturn serverInfo;\n\t\t},\n\t\tget goneReason() {\n\t\t\treturn goneReason;\n\t\t},\n\t\tasync connect() {\n\t\t\tif (closed) {\n\t\t\t\tthrow new DaemonClientClosedError();\n\t\t\t}\n\t\t\tif (socket && !socket.destroyed) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait dial();\n\t\t},\n\t\tasync request(req) {\n\t\t\tif (!socket || socket.destroyed) {\n\t\t\t\tif (reconnectTimer && !connectPromise) {\n\t\t\t\t\tthrow new DaemonClientClosedError(\"not connected to daemon\");\n\t\t\t\t}\n\t\t\t\tawait this.connect();\n\t\t\t}\n\t\t\tconst id = randomUUID();\n\t\t\tconst responsePromise = registerPending(id);\n\t\t\tsend({ ...req, id } as ControlRequest);\n\t\t\treturn responsePromise;\n\t\t},\n\t\twaitForResponse(id: string) {\n\t\t\tconst followUp = followUps.get(id);\n\t\t\tif (followUp) {\n\t\t\t\tfollowUps.delete(id);\n\t\t\t\treturn followUp;\n\t\t\t}\n\t\t\treturn registerPending(id);\n\t\t},\n\t\topenRelay(offer: RelayOfferInfo) {\n\t\t\t// Established clients use the exact endpoint that issued the offer;\n\t\t\t// direct relay-only clients retain the original static endpoint.\n\t\t\tconst relayEndpoint = connectedEndpoint ?? endpoint;\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tconst relaySocket = createConnection(relayEndpoint.socketPath);\n\t\t\t\tconst decoder = new ControlLineDecoder();\n\t\t\t\tlet acked = false;\n\t\t\t\tlet settled = false;\n\n\t\t\t\tconst fail = (error: Error) => {\n\t\t\t\t\tif (settled) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tsettled = true;\n\t\t\t\t\trelaySocket.destroy();\n\t\t\t\t\treject(error);\n\t\t\t\t};\n\n\t\t\t\tconst onData = (chunk: Buffer) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// One line at a time: bytes after the preamble are raw relay\n\t\t\t\t\t\t// payload and must never be JSON-decoded.\n\t\t\t\t\t\tdecoder.pushEach(chunk, (message) => {\n\t\t\t\t\t\t\tif (!acked) {\n\t\t\t\t\t\t\t\tif (!isHelloAck(message) || !message.ok) {\n\t\t\t\t\t\t\t\t\tfail(new Error(\"relay hello rejected\"));\n\t\t\t\t\t\t\t\t\treturn \"stop\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tacked = true;\n\t\t\t\t\t\t\t\treturn \"continue\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!isRelayPreamble(message)) {\n\t\t\t\t\t\t\t\tfail(new Error(\"expected relay preamble\"));\n\t\t\t\t\t\t\t\treturn \"stop\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsettled = true;\n\t\t\t\t\t\t\trelaySocket.removeListener(\"data\", onData);\n\t\t\t\t\t\t\trelaySocket.pause();\n\t\t\t\t\t\t\tconst remainder = decoder.drainRemainder();\n\t\t\t\t\t\t\tif (remainder.length > 0) {\n\t\t\t\t\t\t\t\trelaySocket.unshift(remainder);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tresolve({ preamble: message, stream: relaySocket });\n\t\t\t\t\t\t\treturn \"stop\";\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tfail(error instanceof Error ? error : new Error(String(error)));\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\trelaySocket.on(\"connect\", () => {\n\t\t\t\t\trelaySocket.write(\n\t\t\t\t\t\tencodeControlLine({\n\t\t\t\t\t\t\ttype: \"hello\",\n\t\t\t\t\t\t\trole: \"relay\",\n\t\t\t\t\t\t\tprotocolVersion: PROTOCOL_VERSION,\n\t\t\t\t\t\t\trelayId: offer.relayId,\n\t\t\t\t\t\t\trelayToken: offer.relayToken,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t\trelaySocket.on(\"data\", onData);\n\t\t\t\trelaySocket.on(\"error\", (error) => fail(error instanceof Error ? error : new Error(String(error))));\n\t\t\t\trelaySocket.on(\"close\", () => fail(new DaemonClientClosedError(\"relay connection closed\")));\n\t\t\t});\n\t\t},\n\t\tasync close() {\n\t\t\tclosed = true;\n\t\t\tgoneReason = \"closed\";\n\t\t\tif (reconnectTimer) {\n\t\t\t\tclearTimeout(reconnectTimer);\n\t\t\t\treconnectTimer = undefined;\n\t\t\t}\n\t\t\tfailPending();\n\t\t\tsocket?.destroy();\n\t\t\tsocket = undefined;\n\t\t\tconnectedEndpoint = undefined;\n\t\t\t// Destroy a dial that is still mid-handshake; otherwise a late hello_ack\n\t\t\t// would leave a live, owner-less daemon connection open.\n\t\t\tdialing?.destroy();\n\t\t\tdialing = undefined;\n\t\t\tconnectPromise = undefined;\n\t\t\tsetState(\"gone\");\n\t\t},\n\t};\n}\n"]}