@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,53 @@
1
+ import { type PidfileContents } from "./main.ts";
2
+ import { type InvalidVoltdStateFile } from "./state.ts";
3
+ export declare const DAEMON_SHUTDOWN_TIMEOUT_MS = 75000;
4
+ export type DaemonProbeState = "healthy" | "shutting-down" | "protocol-mismatch" | "auth-failed" | "unresponsive" | "not-running";
5
+ export interface DaemonProbeResult {
6
+ healthy: boolean;
7
+ state: DaemonProbeState;
8
+ pid?: number;
9
+ version?: string;
10
+ protocolVersion?: number;
11
+ startedAtMs?: number;
12
+ socketPath: string;
13
+ authToken?: string;
14
+ }
15
+ /**
16
+ * Probe the pidfile-published daemon endpoint first, then fall back to the
17
+ * legacy default socket path for older daemons and pre-start diagnostics.
18
+ */
19
+ export declare function probeDaemon(agentDir?: string): Promise<DaemonProbeResult>;
20
+ export declare function resolveDaemonCliInvocation(): {
21
+ nodeArgs: string[];
22
+ entry: string;
23
+ };
24
+ export interface SpawnDaemonResult {
25
+ ok: boolean;
26
+ pid?: number;
27
+ socketPath: string;
28
+ error?: string;
29
+ }
30
+ export interface PublishedDaemonEndpoint {
31
+ socketPath: string;
32
+ authToken?: string;
33
+ }
34
+ /** Read the latest complete pidfile endpoint without probing or auto-starting. */
35
+ export declare function readPublishedDaemonEndpoint(agentDir?: string): PublishedDaemonEndpoint | undefined;
36
+ export interface WaitForDaemonExitOptions {
37
+ agentDir?: string;
38
+ pid?: number;
39
+ pidfile?: PidfileContents;
40
+ socketPath?: string;
41
+ timeoutMs?: number;
42
+ }
43
+ export declare function waitForDaemonExit(options?: WaitForDaemonExitOptions): Promise<"exited" | "timeout">;
44
+ /** Spawn a detached daemon and wait (up to 5s) for the socket to answer a status probe. */
45
+ export declare function spawnDetachedDaemon(agentDir?: string): Promise<SpawnDaemonResult>;
46
+ export interface EnsureDaemonResult extends DaemonProbeResult {
47
+ spawned: boolean;
48
+ error?: string;
49
+ invalidState?: InvalidVoltdStateFile;
50
+ }
51
+ /** Probe the socket; if no healthy daemon answers, spawn one detached. */
52
+ export declare function ensureDaemonRunning(agentDir?: string): Promise<EnsureDaemonResult>;
53
+ //# sourceMappingURL=spawn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../src/daemon/spawn.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,eAAe,EAAe,MAAM,WAAW,CAAC;AAG9D,OAAO,EAAE,KAAK,qBAAqB,EAA0B,MAAM,YAAY,CAAC;AAIhF,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAGjD,MAAM,MAAM,gBAAgB,GACzB,SAAS,GACT,eAAe,GACf,mBAAmB,GACnB,aAAa,GACb,cAAc,GACd,aAAa,CAAC;AAEjB,MAAM,WAAW,iBAAiB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,gBAAgB,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AA2CD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,QAAQ,GAAE,MAAsB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAmB9F;AAED,wBAAgB,0BAA0B,IAAI;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAOlF;AAED,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,OAAO,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,uBAAuB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,kFAAkF;AAClF,wBAAgB,2BAA2B,CAAC,QAAQ,GAAE,MAAsB,GAAG,uBAAuB,GAAG,SAAS,CASjH;AAED,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAcD,wBAAsB,iBAAiB,CAAC,OAAO,GAAE,wBAA6B,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAkB7G;AAED,2FAA2F;AAC3F,wBAAsB,mBAAmB,CAAC,QAAQ,GAAE,MAAsB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAkCtG;AAED,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC5D,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,qBAAqB,CAAC;CACrC;AAED,0EAA0E;AAC1E,wBAAsB,mBAAmB,CAAC,QAAQ,GAAE,MAAsB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA6CvG","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { closeSync, existsSync, openSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { ENV_AGENT_DIR, getAgentDir, getPackageDir, VERSION } from \"../config.ts\";\nimport { type ControlSocketProbe, probeControlSocket } from \"./control-server.ts\";\nimport { type PidfileContents, readPidfile } from \"./main.ts\";\nimport { type DaemonPaths, ensureDaemonDirs, getDaemonPaths } from \"./paths.ts\";\nimport { verifyPidfileProcess } from \"./process-identity.ts\";\nimport { type InvalidVoltdStateFile, inspectVoltdStateFiles } from \"./state.ts\";\n\nconst SPAWN_HEALTH_TIMEOUT_MS = 5000;\nconst SPAWN_HEALTH_POLL_MS = 100;\nexport const DAEMON_SHUTDOWN_TIMEOUT_MS = 75_000;\nconst DAEMON_EXIT_POLL_MS = 200;\n\nexport type DaemonProbeState =\n\t| \"healthy\"\n\t| \"shutting-down\"\n\t| \"protocol-mismatch\"\n\t| \"auth-failed\"\n\t| \"unresponsive\"\n\t| \"not-running\";\n\nexport interface DaemonProbeResult {\n\thealthy: boolean;\n\tstate: DaemonProbeState;\n\tpid?: number;\n\tversion?: string;\n\tprotocolVersion?: number;\n\tstartedAtMs?: number;\n\tsocketPath: string;\n\tauthToken?: string;\n}\n\nfunction daemonProbeFromSocketProbe(\n\tsocketPath: string,\n\tprobe: ControlSocketProbe,\n\tauthToken: string | undefined,\n): DaemonProbeResult {\n\tif (probe.kind === \"healthy\") {\n\t\treturn {\n\t\t\thealthy: true,\n\t\t\tstate: \"healthy\",\n\t\t\tpid: probe.status.pid,\n\t\t\tversion: probe.status.version,\n\t\t\tprotocolVersion: probe.status.protocolVersion,\n\t\t\tstartedAtMs: probe.status.startedAtMs,\n\t\t\tsocketPath,\n\t\t\t...(authToken === undefined ? {} : { authToken }),\n\t\t};\n\t}\n\tif (probe.kind === \"live-rejected\") {\n\t\tconst state: DaemonProbeState =\n\t\t\tprobe.reason === \"protocol_mismatch\"\n\t\t\t\t? \"protocol-mismatch\"\n\t\t\t\t: probe.reason === \"auth_failed\"\n\t\t\t\t\t? \"auth-failed\"\n\t\t\t\t\t: probe.reason === \"shutting_down\"\n\t\t\t\t\t\t? \"shutting-down\"\n\t\t\t\t\t\t: \"unresponsive\";\n\t\treturn {\n\t\t\thealthy: false,\n\t\t\tstate,\n\t\t\t...(probe.version === undefined ? {} : { version: probe.version }),\n\t\t\t...(probe.protocolVersion === undefined ? {} : { protocolVersion: probe.protocolVersion }),\n\t\t\tsocketPath,\n\t\t\t...(authToken === undefined ? {} : { authToken }),\n\t\t};\n\t}\n\tif (probe.kind === \"unresponsive\") {\n\t\treturn { healthy: false, state: \"unresponsive\", socketPath, ...(authToken === undefined ? {} : { authToken }) };\n\t}\n\treturn { healthy: false, state: \"not-running\", socketPath, ...(authToken === undefined ? {} : { authToken }) };\n}\n\n/**\n * Probe the pidfile-published daemon endpoint first, then fall back to the\n * legacy default socket path for older daemons and pre-start diagnostics.\n */\nexport async function probeDaemon(agentDir: string = getAgentDir()): Promise<DaemonProbeResult> {\n\tconst paths = getDaemonPaths(agentDir);\n\tconst pidfile = readPidfile(paths.pidfilePath);\n\tif (pidfile) {\n\t\tconst pidfileProbe = await probeControlSocket(pidfile.socketPath, {\n\t\t\tversion: VERSION,\n\t\t\t...(pidfile.token === undefined ? {} : { authToken: pidfile.token }),\n\t\t});\n\t\tconst pidfileResult = daemonProbeFromSocketProbe(pidfile.socketPath, pidfileProbe, pidfile.token);\n\t\tif (pidfileResult.state !== \"not-running\") {\n\t\t\treturn pidfileResult;\n\t\t}\n\t}\n\tconst probe = await probeControlSocket(paths.socketPath, { version: VERSION });\n\tconst result = daemonProbeFromSocketProbe(paths.socketPath, probe, undefined);\n\tif (result.state !== \"not-running\") {\n\t\treturn result;\n\t}\n\treturn { healthy: false, state: \"not-running\", socketPath: paths.socketPath };\n}\n\nexport function resolveDaemonCliInvocation(): { nodeArgs: string[]; entry: string } {\n\tconst packageDir = getPackageDir();\n\tconst sourceEntry = join(packageDir, \"src\", \"cli.ts\");\n\tif (existsSync(sourceEntry)) {\n\t\treturn { nodeArgs: [\"--conditions\", \"volt-source\"], entry: sourceEntry };\n\t}\n\treturn { nodeArgs: [], entry: join(packageDir, \"dist\", \"cli.js\") };\n}\n\nexport interface SpawnDaemonResult {\n\tok: boolean;\n\tpid?: number;\n\tsocketPath: string;\n\terror?: string;\n}\n\nexport interface PublishedDaemonEndpoint {\n\tsocketPath: string;\n\tauthToken?: string;\n}\n\n/** Read the latest complete pidfile endpoint without probing or auto-starting. */\nexport function readPublishedDaemonEndpoint(agentDir: string = getAgentDir()): PublishedDaemonEndpoint | undefined {\n\tconst pidfile = readPidfile(getDaemonPaths(agentDir).pidfilePath);\n\tif (!pidfile) {\n\t\treturn undefined;\n\t}\n\treturn {\n\t\tsocketPath: pidfile.socketPath,\n\t\t...(pidfile.token === undefined ? {} : { authToken: pidfile.token }),\n\t};\n}\n\nexport interface WaitForDaemonExitOptions {\n\tagentDir?: string;\n\tpid?: number;\n\tpidfile?: PidfileContents;\n\tsocketPath?: string;\n\ttimeoutMs?: number;\n}\n\nfunction processIsGone(pid: number | undefined): boolean {\n\tif (!pid || pid === process.pid) {\n\t\treturn true;\n\t}\n\ttry {\n\t\tprocess.kill(pid, 0);\n\t\treturn false;\n\t} catch (error) {\n\t\treturn !(error instanceof Error && \"code\" in error && (error as NodeJS.ErrnoException).code === \"EPERM\");\n\t}\n}\n\nexport async function waitForDaemonExit(options: WaitForDaemonExitOptions = {}): Promise<\"exited\" | \"timeout\"> {\n\tconst agentDir = options.agentDir ?? getAgentDir();\n\tconst paths = getDaemonPaths(agentDir);\n\tconst deadline = Date.now() + (options.timeoutMs ?? DAEMON_SHUTDOWN_TIMEOUT_MS);\n\tconst targetPid = options.pid ?? options.pidfile?.pid;\n\tconst socketPath = options.socketPath ?? options.pidfile?.socketPath ?? paths.socketPath;\n\twhile (Date.now() < deadline) {\n\t\tconst socketProbe = await probeControlSocket(socketPath, {\n\t\t\tversion: VERSION,\n\t\t\ttimeoutMs: 500,\n\t\t\t...(options.pidfile?.token === undefined ? {} : { authToken: options.pidfile.token }),\n\t\t});\n\t\tif (processIsGone(targetPid) && socketProbe.kind === \"no-listener\") {\n\t\t\treturn \"exited\";\n\t\t}\n\t\tawait new Promise((resolve) => setTimeout(resolve, DAEMON_EXIT_POLL_MS));\n\t}\n\treturn \"timeout\";\n}\n\n/** Spawn a detached daemon and wait (up to 5s) for the socket to answer a status probe. */\nexport async function spawnDetachedDaemon(agentDir: string = getAgentDir()): Promise<SpawnDaemonResult> {\n\tconst paths: DaemonPaths = getDaemonPaths(agentDir);\n\tensureDaemonDirs(paths);\n\tconst { nodeArgs, entry } = resolveDaemonCliInvocation();\n\tconst logFd = openSync(paths.logPath, \"a\", 0o600);\n\tconst child = spawn(process.execPath, [...nodeArgs, entry, \"daemon\", \"run\", \"--foreground\"], {\n\t\tdetached: true,\n\t\twindowsHide: true,\n\t\tstdio: [\"ignore\", logFd, logFd],\n\t\tcwd: agentDir,\n\t\tenv: { ...process.env, [ENV_AGENT_DIR]: agentDir },\n\t});\n\t// An unhandled \"error\" event would crash the calling CLI process; capture it\n\t// and surface it through the health-wait result instead.\n\tlet spawnError: Error | undefined;\n\tchild.once(\"error\", (error) => {\n\t\tspawnError = error;\n\t});\n\tchild.unref();\n\t// The child received duplicated descriptors at spawn; close the parent copy.\n\tcloseSync(logFd);\n\n\tconst deadline = Date.now() + SPAWN_HEALTH_TIMEOUT_MS;\n\twhile (Date.now() < deadline) {\n\t\tif (spawnError) {\n\t\t\treturn { ok: false, socketPath: paths.socketPath, error: `failed to spawn voltd: ${spawnError.message}` };\n\t\t}\n\t\tconst probe = await probeDaemon(agentDir);\n\t\tif (probe.healthy) {\n\t\t\treturn { ok: true, pid: probe.pid, socketPath: probe.socketPath };\n\t\t}\n\t\tawait new Promise((resolve) => setTimeout(resolve, SPAWN_HEALTH_POLL_MS));\n\t}\n\treturn { ok: false, socketPath: paths.socketPath, error: \"daemon did not become healthy within 5s\" };\n}\n\nexport interface EnsureDaemonResult extends DaemonProbeResult {\n\tspawned: boolean;\n\terror?: string;\n\tinvalidState?: InvalidVoltdStateFile;\n}\n\n/** Probe the socket; if no healthy daemon answers, spawn one detached. */\nexport async function ensureDaemonRunning(agentDir: string = getAgentDir()): Promise<EnsureDaemonResult> {\n\tlet probe = await probeDaemon(agentDir);\n\tif (probe.healthy) {\n\t\treturn { ...probe, spawned: false };\n\t}\n\tif (probe.state === \"protocol-mismatch\" || probe.state === \"auth-failed\") {\n\t\treturn { ...probe, spawned: false };\n\t}\n\tif (probe.state === \"unresponsive\") {\n\t\tconst paths = getDaemonPaths(agentDir);\n\t\tconst pidfile = readPidfile(paths.pidfilePath);\n\t\tif (pidfile?.socketPath === probe.socketPath && (await verifyPidfileProcess(pidfile)) === \"match\") {\n\t\t\treturn { ...probe, spawned: false };\n\t\t}\n\t}\n\tif (probe.state === \"shutting-down\") {\n\t\tawait waitForDaemonExit({ agentDir, socketPath: probe.socketPath });\n\t\tprobe = await probeDaemon(agentDir);\n\t\tif (probe.state !== \"not-running\") {\n\t\t\treturn { ...probe, spawned: false };\n\t\t}\n\t}\n\tconst invalidState = inspectVoltdStateFiles(agentDir);\n\tif (invalidState) {\n\t\treturn {\n\t\t\thealthy: false,\n\t\t\tstate: \"not-running\",\n\t\t\tsocketPath: probe.socketPath,\n\t\t\tspawned: false,\n\t\t\terror: invalidState.error,\n\t\t\tinvalidState,\n\t\t};\n\t}\n\tconst spawned = await spawnDetachedDaemon(agentDir);\n\tif (!spawned.ok) {\n\t\treturn {\n\t\t\thealthy: false,\n\t\t\tstate: \"not-running\",\n\t\t\tsocketPath: spawned.socketPath,\n\t\t\tspawned: true,\n\t\t\t...(spawned.error === undefined ? {} : { error: spawned.error }),\n\t\t};\n\t}\n\tconst healthyProbe = await probeDaemon(agentDir);\n\treturn { ...healthyProbe, spawned: true };\n}\n"]}
@@ -0,0 +1,205 @@
1
+ import { spawn } from "node:child_process";
2
+ import { closeSync, existsSync, openSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { ENV_AGENT_DIR, getAgentDir, getPackageDir, VERSION } from "../config.js";
5
+ import { probeControlSocket } from "./control-server.js";
6
+ import { readPidfile } from "./main.js";
7
+ import { ensureDaemonDirs, getDaemonPaths } from "./paths.js";
8
+ import { verifyPidfileProcess } from "./process-identity.js";
9
+ import { inspectVoltdStateFiles } from "./state.js";
10
+ const SPAWN_HEALTH_TIMEOUT_MS = 5000;
11
+ const SPAWN_HEALTH_POLL_MS = 100;
12
+ export const DAEMON_SHUTDOWN_TIMEOUT_MS = 75_000;
13
+ const DAEMON_EXIT_POLL_MS = 200;
14
+ function daemonProbeFromSocketProbe(socketPath, probe, authToken) {
15
+ if (probe.kind === "healthy") {
16
+ return {
17
+ healthy: true,
18
+ state: "healthy",
19
+ pid: probe.status.pid,
20
+ version: probe.status.version,
21
+ protocolVersion: probe.status.protocolVersion,
22
+ startedAtMs: probe.status.startedAtMs,
23
+ socketPath,
24
+ ...(authToken === undefined ? {} : { authToken }),
25
+ };
26
+ }
27
+ if (probe.kind === "live-rejected") {
28
+ const state = probe.reason === "protocol_mismatch"
29
+ ? "protocol-mismatch"
30
+ : probe.reason === "auth_failed"
31
+ ? "auth-failed"
32
+ : probe.reason === "shutting_down"
33
+ ? "shutting-down"
34
+ : "unresponsive";
35
+ return {
36
+ healthy: false,
37
+ state,
38
+ ...(probe.version === undefined ? {} : { version: probe.version }),
39
+ ...(probe.protocolVersion === undefined ? {} : { protocolVersion: probe.protocolVersion }),
40
+ socketPath,
41
+ ...(authToken === undefined ? {} : { authToken }),
42
+ };
43
+ }
44
+ if (probe.kind === "unresponsive") {
45
+ return { healthy: false, state: "unresponsive", socketPath, ...(authToken === undefined ? {} : { authToken }) };
46
+ }
47
+ return { healthy: false, state: "not-running", socketPath, ...(authToken === undefined ? {} : { authToken }) };
48
+ }
49
+ /**
50
+ * Probe the pidfile-published daemon endpoint first, then fall back to the
51
+ * legacy default socket path for older daemons and pre-start diagnostics.
52
+ */
53
+ export async function probeDaemon(agentDir = getAgentDir()) {
54
+ const paths = getDaemonPaths(agentDir);
55
+ const pidfile = readPidfile(paths.pidfilePath);
56
+ if (pidfile) {
57
+ const pidfileProbe = await probeControlSocket(pidfile.socketPath, {
58
+ version: VERSION,
59
+ ...(pidfile.token === undefined ? {} : { authToken: pidfile.token }),
60
+ });
61
+ const pidfileResult = daemonProbeFromSocketProbe(pidfile.socketPath, pidfileProbe, pidfile.token);
62
+ if (pidfileResult.state !== "not-running") {
63
+ return pidfileResult;
64
+ }
65
+ }
66
+ const probe = await probeControlSocket(paths.socketPath, { version: VERSION });
67
+ const result = daemonProbeFromSocketProbe(paths.socketPath, probe, undefined);
68
+ if (result.state !== "not-running") {
69
+ return result;
70
+ }
71
+ return { healthy: false, state: "not-running", socketPath: paths.socketPath };
72
+ }
73
+ export function resolveDaemonCliInvocation() {
74
+ const packageDir = getPackageDir();
75
+ const sourceEntry = join(packageDir, "src", "cli.ts");
76
+ if (existsSync(sourceEntry)) {
77
+ return { nodeArgs: ["--conditions", "volt-source"], entry: sourceEntry };
78
+ }
79
+ return { nodeArgs: [], entry: join(packageDir, "dist", "cli.js") };
80
+ }
81
+ /** Read the latest complete pidfile endpoint without probing or auto-starting. */
82
+ export function readPublishedDaemonEndpoint(agentDir = getAgentDir()) {
83
+ const pidfile = readPidfile(getDaemonPaths(agentDir).pidfilePath);
84
+ if (!pidfile) {
85
+ return undefined;
86
+ }
87
+ return {
88
+ socketPath: pidfile.socketPath,
89
+ ...(pidfile.token === undefined ? {} : { authToken: pidfile.token }),
90
+ };
91
+ }
92
+ function processIsGone(pid) {
93
+ if (!pid || pid === process.pid) {
94
+ return true;
95
+ }
96
+ try {
97
+ process.kill(pid, 0);
98
+ return false;
99
+ }
100
+ catch (error) {
101
+ return !(error instanceof Error && "code" in error && error.code === "EPERM");
102
+ }
103
+ }
104
+ export async function waitForDaemonExit(options = {}) {
105
+ const agentDir = options.agentDir ?? getAgentDir();
106
+ const paths = getDaemonPaths(agentDir);
107
+ const deadline = Date.now() + (options.timeoutMs ?? DAEMON_SHUTDOWN_TIMEOUT_MS);
108
+ const targetPid = options.pid ?? options.pidfile?.pid;
109
+ const socketPath = options.socketPath ?? options.pidfile?.socketPath ?? paths.socketPath;
110
+ while (Date.now() < deadline) {
111
+ const socketProbe = await probeControlSocket(socketPath, {
112
+ version: VERSION,
113
+ timeoutMs: 500,
114
+ ...(options.pidfile?.token === undefined ? {} : { authToken: options.pidfile.token }),
115
+ });
116
+ if (processIsGone(targetPid) && socketProbe.kind === "no-listener") {
117
+ return "exited";
118
+ }
119
+ await new Promise((resolve) => setTimeout(resolve, DAEMON_EXIT_POLL_MS));
120
+ }
121
+ return "timeout";
122
+ }
123
+ /** Spawn a detached daemon and wait (up to 5s) for the socket to answer a status probe. */
124
+ export async function spawnDetachedDaemon(agentDir = getAgentDir()) {
125
+ const paths = getDaemonPaths(agentDir);
126
+ ensureDaemonDirs(paths);
127
+ const { nodeArgs, entry } = resolveDaemonCliInvocation();
128
+ const logFd = openSync(paths.logPath, "a", 0o600);
129
+ const child = spawn(process.execPath, [...nodeArgs, entry, "daemon", "run", "--foreground"], {
130
+ detached: true,
131
+ windowsHide: true,
132
+ stdio: ["ignore", logFd, logFd],
133
+ cwd: agentDir,
134
+ env: { ...process.env, [ENV_AGENT_DIR]: agentDir },
135
+ });
136
+ // An unhandled "error" event would crash the calling CLI process; capture it
137
+ // and surface it through the health-wait result instead.
138
+ let spawnError;
139
+ child.once("error", (error) => {
140
+ spawnError = error;
141
+ });
142
+ child.unref();
143
+ // The child received duplicated descriptors at spawn; close the parent copy.
144
+ closeSync(logFd);
145
+ const deadline = Date.now() + SPAWN_HEALTH_TIMEOUT_MS;
146
+ while (Date.now() < deadline) {
147
+ if (spawnError) {
148
+ return { ok: false, socketPath: paths.socketPath, error: `failed to spawn voltd: ${spawnError.message}` };
149
+ }
150
+ const probe = await probeDaemon(agentDir);
151
+ if (probe.healthy) {
152
+ return { ok: true, pid: probe.pid, socketPath: probe.socketPath };
153
+ }
154
+ await new Promise((resolve) => setTimeout(resolve, SPAWN_HEALTH_POLL_MS));
155
+ }
156
+ return { ok: false, socketPath: paths.socketPath, error: "daemon did not become healthy within 5s" };
157
+ }
158
+ /** Probe the socket; if no healthy daemon answers, spawn one detached. */
159
+ export async function ensureDaemonRunning(agentDir = getAgentDir()) {
160
+ let probe = await probeDaemon(agentDir);
161
+ if (probe.healthy) {
162
+ return { ...probe, spawned: false };
163
+ }
164
+ if (probe.state === "protocol-mismatch" || probe.state === "auth-failed") {
165
+ return { ...probe, spawned: false };
166
+ }
167
+ if (probe.state === "unresponsive") {
168
+ const paths = getDaemonPaths(agentDir);
169
+ const pidfile = readPidfile(paths.pidfilePath);
170
+ if (pidfile?.socketPath === probe.socketPath && (await verifyPidfileProcess(pidfile)) === "match") {
171
+ return { ...probe, spawned: false };
172
+ }
173
+ }
174
+ if (probe.state === "shutting-down") {
175
+ await waitForDaemonExit({ agentDir, socketPath: probe.socketPath });
176
+ probe = await probeDaemon(agentDir);
177
+ if (probe.state !== "not-running") {
178
+ return { ...probe, spawned: false };
179
+ }
180
+ }
181
+ const invalidState = inspectVoltdStateFiles(agentDir);
182
+ if (invalidState) {
183
+ return {
184
+ healthy: false,
185
+ state: "not-running",
186
+ socketPath: probe.socketPath,
187
+ spawned: false,
188
+ error: invalidState.error,
189
+ invalidState,
190
+ };
191
+ }
192
+ const spawned = await spawnDetachedDaemon(agentDir);
193
+ if (!spawned.ok) {
194
+ return {
195
+ healthy: false,
196
+ state: "not-running",
197
+ socketPath: spawned.socketPath,
198
+ spawned: true,
199
+ ...(spawned.error === undefined ? {} : { error: spawned.error }),
200
+ };
201
+ }
202
+ const healthyProbe = await probeDaemon(agentDir);
203
+ return { ...healthyProbe, spawned: true };
204
+ }
205
+ //# sourceMappingURL=spawn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../src/daemon/spawn.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { closeSync, existsSync, openSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { ENV_AGENT_DIR, getAgentDir, getPackageDir, VERSION } from \"../config.ts\";\nimport { type ControlSocketProbe, probeControlSocket } from \"./control-server.ts\";\nimport { type PidfileContents, readPidfile } from \"./main.ts\";\nimport { type DaemonPaths, ensureDaemonDirs, getDaemonPaths } from \"./paths.ts\";\nimport { verifyPidfileProcess } from \"./process-identity.ts\";\nimport { type InvalidVoltdStateFile, inspectVoltdStateFiles } from \"./state.ts\";\n\nconst SPAWN_HEALTH_TIMEOUT_MS = 5000;\nconst SPAWN_HEALTH_POLL_MS = 100;\nexport const DAEMON_SHUTDOWN_TIMEOUT_MS = 75_000;\nconst DAEMON_EXIT_POLL_MS = 200;\n\nexport type DaemonProbeState =\n\t| \"healthy\"\n\t| \"shutting-down\"\n\t| \"protocol-mismatch\"\n\t| \"auth-failed\"\n\t| \"unresponsive\"\n\t| \"not-running\";\n\nexport interface DaemonProbeResult {\n\thealthy: boolean;\n\tstate: DaemonProbeState;\n\tpid?: number;\n\tversion?: string;\n\tprotocolVersion?: number;\n\tstartedAtMs?: number;\n\tsocketPath: string;\n\tauthToken?: string;\n}\n\nfunction daemonProbeFromSocketProbe(\n\tsocketPath: string,\n\tprobe: ControlSocketProbe,\n\tauthToken: string | undefined,\n): DaemonProbeResult {\n\tif (probe.kind === \"healthy\") {\n\t\treturn {\n\t\t\thealthy: true,\n\t\t\tstate: \"healthy\",\n\t\t\tpid: probe.status.pid,\n\t\t\tversion: probe.status.version,\n\t\t\tprotocolVersion: probe.status.protocolVersion,\n\t\t\tstartedAtMs: probe.status.startedAtMs,\n\t\t\tsocketPath,\n\t\t\t...(authToken === undefined ? {} : { authToken }),\n\t\t};\n\t}\n\tif (probe.kind === \"live-rejected\") {\n\t\tconst state: DaemonProbeState =\n\t\t\tprobe.reason === \"protocol_mismatch\"\n\t\t\t\t? \"protocol-mismatch\"\n\t\t\t\t: probe.reason === \"auth_failed\"\n\t\t\t\t\t? \"auth-failed\"\n\t\t\t\t\t: probe.reason === \"shutting_down\"\n\t\t\t\t\t\t? \"shutting-down\"\n\t\t\t\t\t\t: \"unresponsive\";\n\t\treturn {\n\t\t\thealthy: false,\n\t\t\tstate,\n\t\t\t...(probe.version === undefined ? {} : { version: probe.version }),\n\t\t\t...(probe.protocolVersion === undefined ? {} : { protocolVersion: probe.protocolVersion }),\n\t\t\tsocketPath,\n\t\t\t...(authToken === undefined ? {} : { authToken }),\n\t\t};\n\t}\n\tif (probe.kind === \"unresponsive\") {\n\t\treturn { healthy: false, state: \"unresponsive\", socketPath, ...(authToken === undefined ? {} : { authToken }) };\n\t}\n\treturn { healthy: false, state: \"not-running\", socketPath, ...(authToken === undefined ? {} : { authToken }) };\n}\n\n/**\n * Probe the pidfile-published daemon endpoint first, then fall back to the\n * legacy default socket path for older daemons and pre-start diagnostics.\n */\nexport async function probeDaemon(agentDir: string = getAgentDir()): Promise<DaemonProbeResult> {\n\tconst paths = getDaemonPaths(agentDir);\n\tconst pidfile = readPidfile(paths.pidfilePath);\n\tif (pidfile) {\n\t\tconst pidfileProbe = await probeControlSocket(pidfile.socketPath, {\n\t\t\tversion: VERSION,\n\t\t\t...(pidfile.token === undefined ? {} : { authToken: pidfile.token }),\n\t\t});\n\t\tconst pidfileResult = daemonProbeFromSocketProbe(pidfile.socketPath, pidfileProbe, pidfile.token);\n\t\tif (pidfileResult.state !== \"not-running\") {\n\t\t\treturn pidfileResult;\n\t\t}\n\t}\n\tconst probe = await probeControlSocket(paths.socketPath, { version: VERSION });\n\tconst result = daemonProbeFromSocketProbe(paths.socketPath, probe, undefined);\n\tif (result.state !== \"not-running\") {\n\t\treturn result;\n\t}\n\treturn { healthy: false, state: \"not-running\", socketPath: paths.socketPath };\n}\n\nexport function resolveDaemonCliInvocation(): { nodeArgs: string[]; entry: string } {\n\tconst packageDir = getPackageDir();\n\tconst sourceEntry = join(packageDir, \"src\", \"cli.ts\");\n\tif (existsSync(sourceEntry)) {\n\t\treturn { nodeArgs: [\"--conditions\", \"volt-source\"], entry: sourceEntry };\n\t}\n\treturn { nodeArgs: [], entry: join(packageDir, \"dist\", \"cli.js\") };\n}\n\nexport interface SpawnDaemonResult {\n\tok: boolean;\n\tpid?: number;\n\tsocketPath: string;\n\terror?: string;\n}\n\nexport interface PublishedDaemonEndpoint {\n\tsocketPath: string;\n\tauthToken?: string;\n}\n\n/** Read the latest complete pidfile endpoint without probing or auto-starting. */\nexport function readPublishedDaemonEndpoint(agentDir: string = getAgentDir()): PublishedDaemonEndpoint | undefined {\n\tconst pidfile = readPidfile(getDaemonPaths(agentDir).pidfilePath);\n\tif (!pidfile) {\n\t\treturn undefined;\n\t}\n\treturn {\n\t\tsocketPath: pidfile.socketPath,\n\t\t...(pidfile.token === undefined ? {} : { authToken: pidfile.token }),\n\t};\n}\n\nexport interface WaitForDaemonExitOptions {\n\tagentDir?: string;\n\tpid?: number;\n\tpidfile?: PidfileContents;\n\tsocketPath?: string;\n\ttimeoutMs?: number;\n}\n\nfunction processIsGone(pid: number | undefined): boolean {\n\tif (!pid || pid === process.pid) {\n\t\treturn true;\n\t}\n\ttry {\n\t\tprocess.kill(pid, 0);\n\t\treturn false;\n\t} catch (error) {\n\t\treturn !(error instanceof Error && \"code\" in error && (error as NodeJS.ErrnoException).code === \"EPERM\");\n\t}\n}\n\nexport async function waitForDaemonExit(options: WaitForDaemonExitOptions = {}): Promise<\"exited\" | \"timeout\"> {\n\tconst agentDir = options.agentDir ?? getAgentDir();\n\tconst paths = getDaemonPaths(agentDir);\n\tconst deadline = Date.now() + (options.timeoutMs ?? DAEMON_SHUTDOWN_TIMEOUT_MS);\n\tconst targetPid = options.pid ?? options.pidfile?.pid;\n\tconst socketPath = options.socketPath ?? options.pidfile?.socketPath ?? paths.socketPath;\n\twhile (Date.now() < deadline) {\n\t\tconst socketProbe = await probeControlSocket(socketPath, {\n\t\t\tversion: VERSION,\n\t\t\ttimeoutMs: 500,\n\t\t\t...(options.pidfile?.token === undefined ? {} : { authToken: options.pidfile.token }),\n\t\t});\n\t\tif (processIsGone(targetPid) && socketProbe.kind === \"no-listener\") {\n\t\t\treturn \"exited\";\n\t\t}\n\t\tawait new Promise((resolve) => setTimeout(resolve, DAEMON_EXIT_POLL_MS));\n\t}\n\treturn \"timeout\";\n}\n\n/** Spawn a detached daemon and wait (up to 5s) for the socket to answer a status probe. */\nexport async function spawnDetachedDaemon(agentDir: string = getAgentDir()): Promise<SpawnDaemonResult> {\n\tconst paths: DaemonPaths = getDaemonPaths(agentDir);\n\tensureDaemonDirs(paths);\n\tconst { nodeArgs, entry } = resolveDaemonCliInvocation();\n\tconst logFd = openSync(paths.logPath, \"a\", 0o600);\n\tconst child = spawn(process.execPath, [...nodeArgs, entry, \"daemon\", \"run\", \"--foreground\"], {\n\t\tdetached: true,\n\t\twindowsHide: true,\n\t\tstdio: [\"ignore\", logFd, logFd],\n\t\tcwd: agentDir,\n\t\tenv: { ...process.env, [ENV_AGENT_DIR]: agentDir },\n\t});\n\t// An unhandled \"error\" event would crash the calling CLI process; capture it\n\t// and surface it through the health-wait result instead.\n\tlet spawnError: Error | undefined;\n\tchild.once(\"error\", (error) => {\n\t\tspawnError = error;\n\t});\n\tchild.unref();\n\t// The child received duplicated descriptors at spawn; close the parent copy.\n\tcloseSync(logFd);\n\n\tconst deadline = Date.now() + SPAWN_HEALTH_TIMEOUT_MS;\n\twhile (Date.now() < deadline) {\n\t\tif (spawnError) {\n\t\t\treturn { ok: false, socketPath: paths.socketPath, error: `failed to spawn voltd: ${spawnError.message}` };\n\t\t}\n\t\tconst probe = await probeDaemon(agentDir);\n\t\tif (probe.healthy) {\n\t\t\treturn { ok: true, pid: probe.pid, socketPath: probe.socketPath };\n\t\t}\n\t\tawait new Promise((resolve) => setTimeout(resolve, SPAWN_HEALTH_POLL_MS));\n\t}\n\treturn { ok: false, socketPath: paths.socketPath, error: \"daemon did not become healthy within 5s\" };\n}\n\nexport interface EnsureDaemonResult extends DaemonProbeResult {\n\tspawned: boolean;\n\terror?: string;\n\tinvalidState?: InvalidVoltdStateFile;\n}\n\n/** Probe the socket; if no healthy daemon answers, spawn one detached. */\nexport async function ensureDaemonRunning(agentDir: string = getAgentDir()): Promise<EnsureDaemonResult> {\n\tlet probe = await probeDaemon(agentDir);\n\tif (probe.healthy) {\n\t\treturn { ...probe, spawned: false };\n\t}\n\tif (probe.state === \"protocol-mismatch\" || probe.state === \"auth-failed\") {\n\t\treturn { ...probe, spawned: false };\n\t}\n\tif (probe.state === \"unresponsive\") {\n\t\tconst paths = getDaemonPaths(agentDir);\n\t\tconst pidfile = readPidfile(paths.pidfilePath);\n\t\tif (pidfile?.socketPath === probe.socketPath && (await verifyPidfileProcess(pidfile)) === \"match\") {\n\t\t\treturn { ...probe, spawned: false };\n\t\t}\n\t}\n\tif (probe.state === \"shutting-down\") {\n\t\tawait waitForDaemonExit({ agentDir, socketPath: probe.socketPath });\n\t\tprobe = await probeDaemon(agentDir);\n\t\tif (probe.state !== \"not-running\") {\n\t\t\treturn { ...probe, spawned: false };\n\t\t}\n\t}\n\tconst invalidState = inspectVoltdStateFiles(agentDir);\n\tif (invalidState) {\n\t\treturn {\n\t\t\thealthy: false,\n\t\t\tstate: \"not-running\",\n\t\t\tsocketPath: probe.socketPath,\n\t\t\tspawned: false,\n\t\t\terror: invalidState.error,\n\t\t\tinvalidState,\n\t\t};\n\t}\n\tconst spawned = await spawnDetachedDaemon(agentDir);\n\tif (!spawned.ok) {\n\t\treturn {\n\t\t\thealthy: false,\n\t\t\tstate: \"not-running\",\n\t\t\tsocketPath: spawned.socketPath,\n\t\t\tspawned: true,\n\t\t\t...(spawned.error === undefined ? {} : { error: spawned.error }),\n\t\t};\n\t}\n\tconst healthyProbe = await probeDaemon(agentDir);\n\treturn { ...healthyProbe, spawned: true };\n}\n"]}
@@ -0,0 +1,145 @@
1
+ import { type IrohRemoteClient, type IrohRemoteHostState, type IrohRemotePairingSecretTombstone, type IrohRemotePendingPairingTicket, type IrohRemoteRevokedClient, type IrohRemoteWorkspace, type IrohRemoteWorkspaceWorktree } from "../core/remote/iroh/state.ts";
2
+ /**
3
+ * Persistent daemon state. The pairing/client sections reuse the legacy host
4
+ * state shapes verbatim (push targets and live-activity registrations stay
5
+ * embedded in each client, as `src/core/remote/iroh/push.ts` expects). The Iroh
6
+ * identity survives migration; pre-grant client authority is intentionally not imported.
7
+ */
8
+ export interface VoltdStateFileV1 {
9
+ version: 1;
10
+ /** Iroh secret key bytes; MUST survive migration so the saved host identity remains stable. */
11
+ irohSecretKey?: number[];
12
+ clients: IrohRemoteClient[];
13
+ revokedClients: IrohRemoteRevokedClient[];
14
+ workspaces: IrohRemoteWorkspace[];
15
+ worktrees: IrohRemoteWorkspaceWorktree[];
16
+ pendingPairingTickets: IrohRemotePendingPairingTicket[];
17
+ pairingSecretTombstones: IrohRemotePairingSecretTombstone[];
18
+ settings: {
19
+ /** Detached headless runtime retention TTL. */
20
+ detachedRuntimeTtlMs: number;
21
+ /** Tool allowlist applied ONLY to daemon-owned headless runtimes. */
22
+ allowTools: string[] | null;
23
+ /** Active daemon theme (theme_set); undefined falls back to the default theme. */
24
+ themeName?: string;
25
+ /** Push sanitized resolved theme tokens to capable phones (§9.5); OFF by default. */
26
+ themeTokenPush?: boolean;
27
+ /** Hold a keep-awake (prevent system sleep) assertion while the daemon runs; OFF by default. */
28
+ keepAwakeEnabled?: boolean;
29
+ /**
30
+ * Bearer token presented to relay servers (access.shared_token). Seeded
31
+ * from VOLT_IROH_RELAY_AUTH_TOKEN and persisted so bare restarts keep
32
+ * authenticating; pairing tickets carry it to phones.
33
+ */
34
+ relayAuthToken?: string;
35
+ /** Worktree cleanup policies (design §5.3); all opt-in except pruneOnStart. */
36
+ worktreeCleanup?: WorktreeCleanupSettings;
37
+ };
38
+ }
39
+ export interface WorktreeCleanupSettings {
40
+ /** Remove clean, fully merged worktrees after the TTL once their runtime is disposed. */
41
+ retention?: {
42
+ enabled: boolean;
43
+ ttlMs: number;
44
+ };
45
+ /** Reconcile worktree records/checkouts during daemon startup (default true). */
46
+ pruneOnStart?: boolean;
47
+ }
48
+ export interface ResolvedWorktreeCleanupPolicy {
49
+ retention: {
50
+ enabled: boolean;
51
+ ttlMs: number;
52
+ } | undefined;
53
+ pruneOnStart: boolean;
54
+ }
55
+ /** Apply worktree-cleanup defaults: retention off, pruneOnStart on. */
56
+ export declare function resolveWorktreeCleanupPolicy(settings: Pick<VoltdStateFileV1["settings"], "worktreeCleanup">): ResolvedWorktreeCleanupPolicy;
57
+ export declare function createEmptyVoltdState(): VoltdStateFileV1;
58
+ export declare function voltdStateToHostState(state: VoltdStateFileV1): IrohRemoteHostState;
59
+ export declare function hostStateToVoltdState(hostState: IrohRemoteHostState, settings: VoltdStateFileV1["settings"]): VoltdStateFileV1;
60
+ export declare function parseVoltdState(value: unknown): VoltdStateFileV1;
61
+ export declare function getLegacyRemoteStatePath(agentDir: string): string;
62
+ export interface LegacyRemoteStateMigration {
63
+ state: VoltdStateFileV1;
64
+ droppedAccess: {
65
+ clients: number;
66
+ revokedClients: number;
67
+ pendingPairingTickets: number;
68
+ };
69
+ }
70
+ /**
71
+ * One-time migration from remote/iroh-host.json. A pre-grant file keeps the
72
+ * Iroh identity plus validated workspace/worktree metadata, but deliberately
73
+ * drops every old authority-bearing record. Those clients must pair again
74
+ * under an explicit RPC grant; expected pre-grant migration is not corruption.
75
+ */
76
+ export declare function migrateLegacyRemoteState(agentDir: string, statePath: string): LegacyRemoteStateMigration | null;
77
+ export interface VoltdStateStoreOptions {
78
+ agentDir: string;
79
+ statePath: string;
80
+ /** Debounce for coalescing writes; flushes synchronously on close(). */
81
+ debounceMs?: number;
82
+ /** Durable writer seam for deterministic persistence-concurrency tests. */
83
+ writeStateFile?: (path: string, content: string) => Promise<void>;
84
+ }
85
+ export interface LoadVoltdStateResult {
86
+ state: VoltdStateFileV1;
87
+ migratedFromLegacyState: boolean;
88
+ legacyDroppedAccess?: LegacyRemoteStateMigration["droppedAccess"];
89
+ }
90
+ export interface InvalidVoltdStateFile {
91
+ path: string;
92
+ error: string;
93
+ }
94
+ /** Inspect persisted daemon state without modifying or migrating it. */
95
+ export declare function inspectVoltdStateFiles(agentDir: string): InvalidVoltdStateFile | undefined;
96
+ export interface RecoverableVoltdStateBackup {
97
+ path: string;
98
+ preservedIdentity: boolean;
99
+ }
100
+ /** Find the newest validated daemon-state backup that can be safely regenerated. */
101
+ export declare function findRecoverableVoltdStateBackup(agentDir: string): RecoverableVoltdStateBackup | undefined;
102
+ /** Replace current state from a validated backup, preserving the source and backing up the current file. */
103
+ export declare function recoverVoltdStateFromBackup(agentDir: string, backupPath: string): Promise<{
104
+ previousStateBackupPath?: string;
105
+ preservedIdentity: boolean;
106
+ }>;
107
+ /** Back up invalid state and regenerate validated non-authority data when possible. */
108
+ export declare function regenerateInvalidVoltdState(agentDir: string): Promise<{
109
+ backupPath: string;
110
+ preservedIdentity: boolean;
111
+ }>;
112
+ /** Debounced, atomic (tmp + rename, 0600) persistence for VoltdStateFileV1. */
113
+ export declare class VoltdStateStore {
114
+ private readonly statePath;
115
+ private readonly agentDir;
116
+ private readonly debounceMs;
117
+ private readonly writeStateFile;
118
+ private current;
119
+ private flushTimer;
120
+ private pendingFlush;
121
+ private stateRevision;
122
+ private persistedRevision;
123
+ private migrated;
124
+ private legacyDroppedAccess;
125
+ constructor(options: VoltdStateStoreOptions);
126
+ load(): Promise<LoadVoltdStateResult>;
127
+ get state(): VoltdStateFileV1;
128
+ /** Replace the host-state portion (used as the state-manager write hook). */
129
+ setHostState(hostState: IrohRemoteHostState): void;
130
+ getHostState(): IrohRemoteHostState;
131
+ updateSettings(settings: Partial<VoltdStateFileV1["settings"]>): void;
132
+ scheduleFlush(): void;
133
+ /**
134
+ * Force an immediate durable write, cancelling any pending debounce. Use after
135
+ * minting state that must survive a crash the moment it exists (e.g. the freshly
136
+ * generated Iroh identity, before the endpoint starts accepting pairings).
137
+ */
138
+ flush(): Promise<void>;
139
+ /** Flush pending changes and stop the debounce timer (graceful shutdown). */
140
+ close(): Promise<void>;
141
+ private markStateChanged;
142
+ private enqueueWrite;
143
+ private writeNow;
144
+ }
145
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/daemon/state.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { rename } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n\tcreateEmptyIrohRemoteHostState,\n\ttype IrohRemoteClient,\n\ttype IrohRemoteHostState,\n\ttype IrohRemotePairingSecretTombstone,\n\ttype IrohRemotePendingPairingTicket,\n\ttype IrohRemoteRevokedClient,\n\ttype IrohRemoteWorkspace,\n\ttype IrohRemoteWorkspaceWorktree,\n\tparseIrohRemoteHostState,\n} from \"../core/remote/iroh/state.ts\";\nimport { DEFAULT_INTEGRATED_DETACHED_RUNTIME_TTL_MS } from \"../remote/integrated-runtime-retention.ts\";\nimport { writeDurableAtomicFile } from \"../utils/durable-atomic-write.ts\";\n\n/**\n * Persistent daemon state. The pairing/client sections reuse the legacy host\n * state shapes verbatim (push targets and live-activity registrations stay\n * embedded in each client, as `src/core/remote/iroh/push.ts` expects). The Iroh\n * identity survives migration; pre-grant client authority is intentionally not imported.\n */\nexport interface VoltdStateFileV1 {\n\tversion: 1;\n\t/** Iroh secret key bytes; MUST survive migration so the saved host identity remains stable. */\n\tirohSecretKey?: number[];\n\tclients: IrohRemoteClient[];\n\trevokedClients: IrohRemoteRevokedClient[];\n\tworkspaces: IrohRemoteWorkspace[];\n\tworktrees: IrohRemoteWorkspaceWorktree[];\n\tpendingPairingTickets: IrohRemotePendingPairingTicket[];\n\tpairingSecretTombstones: IrohRemotePairingSecretTombstone[];\n\tsettings: {\n\t\t/** Detached headless runtime retention TTL. */\n\t\tdetachedRuntimeTtlMs: number;\n\t\t/** Tool allowlist applied ONLY to daemon-owned headless runtimes. */\n\t\tallowTools: string[] | null;\n\t\t/** Active daemon theme (theme_set); undefined falls back to the default theme. */\n\t\tthemeName?: string;\n\t\t/** Push sanitized resolved theme tokens to capable phones (§9.5); OFF by default. */\n\t\tthemeTokenPush?: boolean;\n\t\t/** Hold a keep-awake (prevent system sleep) assertion while the daemon runs; OFF by default. */\n\t\tkeepAwakeEnabled?: boolean;\n\t\t/**\n\t\t * Bearer token presented to relay servers (access.shared_token). Seeded\n\t\t * from VOLT_IROH_RELAY_AUTH_TOKEN and persisted so bare restarts keep\n\t\t * authenticating; pairing tickets carry it to phones.\n\t\t */\n\t\trelayAuthToken?: string;\n\t\t/** Worktree cleanup policies (design §5.3); all opt-in except pruneOnStart. */\n\t\tworktreeCleanup?: WorktreeCleanupSettings;\n\t};\n}\n\nexport interface WorktreeCleanupSettings {\n\t/** Remove clean, fully merged worktrees after the TTL once their runtime is disposed. */\n\tretention?: { enabled: boolean; ttlMs: number };\n\t/** Reconcile worktree records/checkouts during daemon startup (default true). */\n\tpruneOnStart?: boolean;\n}\n\nexport interface ResolvedWorktreeCleanupPolicy {\n\tretention: { enabled: boolean; ttlMs: number } | undefined;\n\tpruneOnStart: boolean;\n}\n\n/** Apply worktree-cleanup defaults: retention off, pruneOnStart on. */\nexport function resolveWorktreeCleanupPolicy(\n\tsettings: Pick<VoltdStateFileV1[\"settings\"], \"worktreeCleanup\">,\n): ResolvedWorktreeCleanupPolicy {\n\tconst cleanup = settings.worktreeCleanup;\n\tconst retention =\n\t\tcleanup?.retention?.enabled && cleanup.retention.ttlMs > 0\n\t\t\t? { enabled: true, ttlMs: cleanup.retention.ttlMs }\n\t\t\t: undefined;\n\treturn { retention, pruneOnStart: cleanup?.pruneOnStart !== false };\n}\n\nfunction parseWorktreeCleanupSettings(value: unknown): WorktreeCleanupSettings | undefined {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n\t\treturn undefined;\n\t}\n\tconst record = value as Record<string, unknown>;\n\tconst retentionRecord =\n\t\ttypeof record.retention === \"object\" && record.retention !== null && !Array.isArray(record.retention)\n\t\t\t? (record.retention as Record<string, unknown>)\n\t\t\t: undefined;\n\tconst retention =\n\t\tretentionRecord !== undefined &&\n\t\ttypeof retentionRecord.enabled === \"boolean\" &&\n\t\ttypeof retentionRecord.ttlMs === \"number\" &&\n\t\tNumber.isInteger(retentionRecord.ttlMs) &&\n\t\tretentionRecord.ttlMs > 0\n\t\t\t? { enabled: retentionRecord.enabled, ttlMs: retentionRecord.ttlMs }\n\t\t\t: undefined;\n\tconst pruneOnStart = typeof record.pruneOnStart === \"boolean\" ? record.pruneOnStart : undefined;\n\tif (retention === undefined && pruneOnStart === undefined) {\n\t\treturn undefined;\n\t}\n\treturn {\n\t\t...(retention === undefined ? {} : { retention }),\n\t\t...(pruneOnStart === undefined ? {} : { pruneOnStart }),\n\t};\n}\n\nexport function createEmptyVoltdState(): VoltdStateFileV1 {\n\treturn {\n\t\tversion: 1,\n\t\tirohSecretKey: undefined,\n\t\tclients: [],\n\t\trevokedClients: [],\n\t\tworkspaces: [],\n\t\tworktrees: [],\n\t\tpendingPairingTickets: [],\n\t\tpairingSecretTombstones: [],\n\t\tsettings: {\n\t\t\tdetachedRuntimeTtlMs: DEFAULT_INTEGRATED_DETACHED_RUNTIME_TTL_MS,\n\t\t\tallowTools: null,\n\t\t},\n\t};\n}\n\nexport function voltdStateToHostState(state: VoltdStateFileV1): IrohRemoteHostState {\n\treturn {\n\t\thostSecretKey: state.irohSecretKey,\n\t\tclients: state.clients,\n\t\trevokedClients: state.revokedClients,\n\t\tworkspaces: state.workspaces,\n\t\tworktrees: state.worktrees,\n\t\tpendingPairingTickets: state.pendingPairingTickets,\n\t\tpairingSecretTombstones: state.pairingSecretTombstones,\n\t};\n}\n\nexport function hostStateToVoltdState(\n\thostState: IrohRemoteHostState,\n\tsettings: VoltdStateFileV1[\"settings\"],\n): VoltdStateFileV1 {\n\treturn {\n\t\tversion: 1,\n\t\tirohSecretKey: hostState.hostSecretKey,\n\t\tclients: hostState.clients,\n\t\trevokedClients: hostState.revokedClients ?? [],\n\t\tworkspaces: hostState.workspaces,\n\t\tworktrees: hostState.worktrees ?? [],\n\t\tpendingPairingTickets: hostState.pendingPairingTickets ?? [],\n\t\tpairingSecretTombstones: hostState.pairingSecretTombstones ?? [],\n\t\tsettings,\n\t};\n}\n\nexport function parseVoltdState(value: unknown): VoltdStateFileV1 {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n\t\tthrow new Error(\"voltd state must be an object\");\n\t}\n\tconst record = value as Record<string, unknown>;\n\tif (record.version !== 1) {\n\t\tthrow new Error(`unsupported voltd state version: ${String(record.version)}`);\n\t}\n\tconst hostState = parseIrohRemoteHostState({\n\t\t...record,\n\t\thostSecretKey: record.irohSecretKey,\n\t});\n\tconst settings = typeof record.settings === \"object\" && record.settings !== null ? record.settings : {};\n\tconst settingsRecord = settings as Record<string, unknown>;\n\tconst detachedRuntimeTtlMs =\n\t\ttypeof settingsRecord.detachedRuntimeTtlMs === \"number\" &&\n\t\tNumber.isInteger(settingsRecord.detachedRuntimeTtlMs) &&\n\t\tsettingsRecord.detachedRuntimeTtlMs > 0\n\t\t\t? settingsRecord.detachedRuntimeTtlMs\n\t\t\t: DEFAULT_INTEGRATED_DETACHED_RUNTIME_TTL_MS;\n\tconst allowTools = Array.isArray(settingsRecord.allowTools)\n\t\t? settingsRecord.allowTools.filter((tool): tool is string => typeof tool === \"string\")\n\t\t: null;\n\tconst themeName = typeof settingsRecord.themeName === \"string\" ? settingsRecord.themeName : undefined;\n\tconst themeTokenPush = settingsRecord.themeTokenPush === true;\n\tconst keepAwakeEnabled = settingsRecord.keepAwakeEnabled === true;\n\tconst relayAuthToken =\n\t\ttypeof settingsRecord.relayAuthToken === \"string\" && settingsRecord.relayAuthToken.length > 0\n\t\t\t? settingsRecord.relayAuthToken\n\t\t\t: undefined;\n\tconst worktreeCleanup = parseWorktreeCleanupSettings(settingsRecord.worktreeCleanup);\n\treturn hostStateToVoltdState(hostState, {\n\t\tdetachedRuntimeTtlMs,\n\t\tallowTools,\n\t\t...(themeName === undefined ? {} : { themeName }),\n\t\t...(themeTokenPush ? { themeTokenPush } : {}),\n\t\t...(keepAwakeEnabled ? { keepAwakeEnabled } : {}),\n\t\t...(relayAuthToken === undefined ? {} : { relayAuthToken }),\n\t\t...(worktreeCleanup === undefined ? {} : { worktreeCleanup }),\n\t});\n}\n\nexport function getLegacyRemoteStatePath(agentDir: string): string {\n\treturn join(agentDir, \"remote\", \"iroh-host.json\");\n}\n\nexport interface LegacyRemoteStateMigration {\n\tstate: VoltdStateFileV1;\n\tdroppedAccess: {\n\t\tclients: number;\n\t\trevokedClients: number;\n\t\tpendingPairingTickets: number;\n\t};\n}\n\n/**\n * One-time migration from remote/iroh-host.json. A pre-grant file keeps the\n * Iroh identity plus validated workspace/worktree metadata, but deliberately\n * drops every old authority-bearing record. Those clients must pair again\n * under an explicit RPC grant; expected pre-grant migration is not corruption.\n */\nexport function migrateLegacyRemoteState(agentDir: string, statePath: string): LegacyRemoteStateMigration | null {\n\tif (existsSync(statePath)) {\n\t\treturn null;\n\t}\n\tconst legacyPath = getLegacyRemoteStatePath(agentDir);\n\tif (!existsSync(legacyPath)) {\n\t\treturn null;\n\t}\n\tconst parsedJson: unknown = JSON.parse(readFileSync(legacyPath, \"utf8\"));\n\tlet legacyState: IrohRemoteHostState;\n\tlet droppedAccess = { clients: 0, revokedClients: 0, pendingPairingTickets: 0 };\n\ttry {\n\t\tlegacyState = parseIrohRemoteHostState(parsedJson);\n\t} catch (error) {\n\t\tif (!isPreGrantLegacyHostState(parsedJson)) {\n\t\t\tthrow error;\n\t\t}\n\t\tconst record = parsedJson as Record<string, unknown>;\n\t\tdroppedAccess = {\n\t\t\tclients: Array.isArray(record.clients) ? record.clients.length : 0,\n\t\t\trevokedClients: Array.isArray(record.revokedClients) ? record.revokedClients.length : 0,\n\t\t\tpendingPairingTickets: Array.isArray(record.pendingPairingTickets) ? record.pendingPairingTickets.length : 0,\n\t\t};\n\t\tlegacyState = parseIrohRemoteHostState({\n\t\t\t...record,\n\t\t\tclients: [],\n\t\t\trevokedClients: [],\n\t\t\tpendingPairingTickets: [],\n\t\t});\n\t}\n\treturn {\n\t\tstate: hostStateToVoltdState(legacyState, createEmptyVoltdState().settings),\n\t\tdroppedAccess,\n\t};\n}\n\nfunction isPreGrantLegacyHostState(value: unknown): value is Record<string, unknown> {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n\t\treturn false;\n\t}\n\tconst record = value as Record<string, unknown>;\n\tfor (const field of [\"clients\", \"revokedClients\", \"pendingPairingTickets\"] as const) {\n\t\tconst entries = record[field];\n\t\tif (!Array.isArray(entries)) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (\n\t\t\tentries.some(\n\t\t\t\t(entry) => typeof entry === \"object\" && entry !== null && !Array.isArray(entry) && !(\"rpcGrant\" in entry),\n\t\t\t)\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nexport interface VoltdStateStoreOptions {\n\tagentDir: string;\n\tstatePath: string;\n\t/** Debounce for coalescing writes; flushes synchronously on close(). */\n\tdebounceMs?: number;\n\t/** Durable writer seam for deterministic persistence-concurrency tests. */\n\twriteStateFile?: (path: string, content: string) => Promise<void>;\n}\n\nexport interface LoadVoltdStateResult {\n\tstate: VoltdStateFileV1;\n\tmigratedFromLegacyState: boolean;\n\tlegacyDroppedAccess?: LegacyRemoteStateMigration[\"droppedAccess\"];\n}\n\nconst DEFAULT_STATE_DEBOUNCE_MS = 250;\n\nexport interface InvalidVoltdStateFile {\n\tpath: string;\n\terror: string;\n}\n\nfunction stateFileErrorMessage(path: string, error: unknown): string {\n\tconst reason = error instanceof Error ? error.message : String(error);\n\treturn `Daemon state file ${path} is invalid or incompatible: ${reason}`;\n}\n\nfunction invalidStateFileError(path: string, error: unknown): Error {\n\treturn new Error(\n\t\t`${stateFileErrorMessage(path, error)}. Confirm regeneration from /remote or run ` +\n\t\t\t\"`volt daemon regenerate-state`; existing phones will need to pair again.\",\n\t);\n}\n\n/** Inspect persisted daemon state without modifying or migrating it. */\nexport function inspectVoltdStateFiles(agentDir: string): InvalidVoltdStateFile | undefined {\n\tconst statePath = join(agentDir, \"daemon\", \"state.json\");\n\tif (existsSync(statePath)) {\n\t\ttry {\n\t\t\tparseVoltdState(JSON.parse(readFileSync(statePath, \"utf8\")));\n\t\t\treturn undefined;\n\t\t} catch (error) {\n\t\t\treturn { path: statePath, error: stateFileErrorMessage(statePath, error) };\n\t\t}\n\t}\n\tconst legacyPath = getLegacyRemoteStatePath(agentDir);\n\tif (!existsSync(legacyPath)) {\n\t\treturn undefined;\n\t}\n\ttry {\n\t\tmigrateLegacyRemoteState(agentDir, statePath);\n\t\treturn undefined;\n\t} catch (error) {\n\t\treturn { path: legacyPath, error: stateFileErrorMessage(legacyPath, error) };\n\t}\n}\n\nfunction regeneratePreGrantVoltdState(value: unknown): VoltdStateFileV1 | undefined {\n\tif (!isPreGrantLegacyHostState(value)) {\n\t\treturn undefined;\n\t}\n\tconst record = value as Record<string, unknown>;\n\ttry {\n\t\treturn parseVoltdState({\n\t\t\t...record,\n\t\t\tclients: [],\n\t\t\trevokedClients: [],\n\t\t\tpendingPairingTickets: [],\n\t\t});\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction readRecoverableVoltdState(path: string): VoltdStateFileV1 | undefined {\n\ttry {\n\t\tconst value: unknown = JSON.parse(readFileSync(path, \"utf8\"));\n\t\ttry {\n\t\t\treturn parseVoltdState(value);\n\t\t} catch {\n\t\t\treturn regeneratePreGrantVoltdState(value);\n\t\t}\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport interface RecoverableVoltdStateBackup {\n\tpath: string;\n\tpreservedIdentity: boolean;\n}\n\n/** Find the newest validated daemon-state backup that can be safely regenerated. */\nexport function findRecoverableVoltdStateBackup(agentDir: string): RecoverableVoltdStateBackup | undefined {\n\tconst daemonDir = join(agentDir, \"daemon\");\n\tif (!existsSync(daemonDir)) {\n\t\treturn undefined;\n\t}\n\tconst candidates = readdirSync(daemonDir)\n\t\t.filter((name) => /^state\\.json\\.(?:corrupt|invalid)-\\d+$/.test(name))\n\t\t.map((name) => {\n\t\t\tconst path = join(daemonDir, name);\n\t\t\treturn { path, modifiedAtMs: statSync(path).mtimeMs, state: readRecoverableVoltdState(path) };\n\t\t})\n\t\t.filter((candidate): candidate is typeof candidate & { state: VoltdStateFileV1 } => candidate.state !== undefined)\n\t\t.sort((left, right) => right.modifiedAtMs - left.modifiedAtMs);\n\tconst candidate = candidates[0];\n\treturn candidate\n\t\t? { path: candidate.path, preservedIdentity: candidate.state.irohSecretKey !== undefined }\n\t\t: undefined;\n}\n\n/** Replace current state from a validated backup, preserving the source and backing up the current file. */\nexport async function recoverVoltdStateFromBackup(\n\tagentDir: string,\n\tbackupPath: string,\n): Promise<{ previousStateBackupPath?: string; preservedIdentity: boolean }> {\n\tconst candidate = findRecoverableVoltdStateBackup(agentDir);\n\tif (!candidate || candidate.path !== backupPath) {\n\t\tthrow new Error(\"The selected daemon-state recovery backup is no longer available.\");\n\t}\n\tconst recovered = readRecoverableVoltdState(backupPath);\n\tif (!recovered) {\n\t\tthrow new Error(\"The selected daemon-state backup is no longer recoverable.\");\n\t}\n\tconst statePath = join(agentDir, \"daemon\", \"state.json\");\n\tlet previousStateBackupPath: string | undefined;\n\tif (existsSync(statePath)) {\n\t\tpreviousStateBackupPath = `${statePath}.invalid-${Date.now()}`;\n\t\tawait rename(statePath, previousStateBackupPath);\n\t}\n\tawait writeDurableAtomicFile(statePath, `${JSON.stringify(recovered, null, 2)}\\n`);\n\treturn {\n\t\t...(previousStateBackupPath === undefined ? {} : { previousStateBackupPath }),\n\t\tpreservedIdentity: recovered.irohSecretKey !== undefined,\n\t};\n}\n\n/** Back up invalid state and regenerate validated non-authority data when possible. */\nexport async function regenerateInvalidVoltdState(\n\tagentDir: string,\n): Promise<{ backupPath: string; preservedIdentity: boolean }> {\n\tconst invalid = inspectVoltdStateFiles(agentDir);\n\tif (!invalid) {\n\t\tthrow new Error(\"Daemon state is valid; regeneration is not needed.\");\n\t}\n\tlet regenerated: VoltdStateFileV1 | undefined;\n\tif (invalid.path === join(agentDir, \"daemon\", \"state.json\")) {\n\t\ttry {\n\t\t\tregenerated = regeneratePreGrantVoltdState(JSON.parse(readFileSync(invalid.path, \"utf8\")));\n\t\t} catch {\n\t\t\t// Malformed JSON cannot be partially recovered. The original is still backed up below.\n\t\t}\n\t}\n\tconst backupPath = `${invalid.path}.invalid-${Date.now()}`;\n\tawait rename(invalid.path, backupPath);\n\tif (regenerated) {\n\t\tawait writeDurableAtomicFile(invalid.path, `${JSON.stringify(regenerated, null, 2)}\\n`);\n\t}\n\treturn { backupPath, preservedIdentity: regenerated?.irohSecretKey !== undefined };\n}\n\n/** Debounced, atomic (tmp + rename, 0600) persistence for VoltdStateFileV1. */\nexport class VoltdStateStore {\n\tprivate readonly statePath: string;\n\tprivate readonly agentDir: string;\n\tprivate readonly debounceMs: number;\n\tprivate readonly writeStateFile: (path: string, content: string) => Promise<void>;\n\tprivate current: VoltdStateFileV1 | undefined;\n\tprivate flushTimer: NodeJS.Timeout | undefined;\n\tprivate pendingFlush: Promise<void> = Promise.resolve();\n\tprivate stateRevision = 0;\n\tprivate persistedRevision = 0;\n\tprivate migrated = false;\n\tprivate legacyDroppedAccess: LegacyRemoteStateMigration[\"droppedAccess\"] | undefined;\n\n\tconstructor(options: VoltdStateStoreOptions) {\n\t\tthis.statePath = options.statePath;\n\t\tthis.agentDir = options.agentDir;\n\t\tthis.debounceMs = options.debounceMs ?? DEFAULT_STATE_DEBOUNCE_MS;\n\t\tthis.writeStateFile = options.writeStateFile ?? writeDurableAtomicFile;\n\t}\n\n\tasync load(): Promise<LoadVoltdStateResult> {\n\t\tif (this.current) {\n\t\t\treturn {\n\t\t\t\tstate: this.current,\n\t\t\t\tmigratedFromLegacyState: this.migrated,\n\t\t\t\t...(this.legacyDroppedAccess === undefined ? {} : { legacyDroppedAccess: this.legacyDroppedAccess }),\n\t\t\t};\n\t\t}\n\t\tlet migration: LegacyRemoteStateMigration | null;\n\t\ttry {\n\t\t\tmigration = migrateLegacyRemoteState(this.agentDir, this.statePath);\n\t\t} catch (error) {\n\t\t\tthrow invalidStateFileError(getLegacyRemoteStatePath(this.agentDir), error);\n\t\t}\n\t\tif (migration) {\n\t\t\tthis.current = migration.state;\n\t\t\tthis.markStateChanged();\n\t\t\tthis.migrated = true;\n\t\t\tthis.legacyDroppedAccess = migration.droppedAccess;\n\t\t\tawait this.enqueueWrite();\n\t\t\tconst legacyPath = getLegacyRemoteStatePath(this.agentDir);\n\t\t\ttry {\n\t\t\t\tawait rename(legacyPath, `${legacyPath}.migrated`);\n\t\t\t} catch (error) {\n\t\t\t\t// A daemon started concurrently (before the single-instance socket bind)\n\t\t\t\t// may have already migrated and renamed the legacy file. Its absence is\n\t\t\t\t// benign: the migrated content is identical and already persisted, so a\n\t\t\t\t// racing start must not crash here — it will fail cleanly at the socket\n\t\t\t\t// bind instead.\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstate: this.current,\n\t\t\t\tmigratedFromLegacyState: true,\n\t\t\t\tlegacyDroppedAccess: migration.droppedAccess,\n\t\t\t};\n\t\t}\n\t\tif (existsSync(this.statePath)) {\n\t\t\ttry {\n\t\t\t\tthis.current = parseVoltdState(JSON.parse(readFileSync(this.statePath, \"utf8\")));\n\t\t\t} catch (error) {\n\t\t\t\tthrow invalidStateFileError(this.statePath, error);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.current = createEmptyVoltdState();\n\t\t\tthis.markStateChanged();\n\t\t\tawait this.enqueueWrite();\n\t\t}\n\t\treturn { state: this.current, migratedFromLegacyState: false };\n\t}\n\n\tget state(): VoltdStateFileV1 {\n\t\tif (!this.current) {\n\t\t\tthrow new Error(\"voltd state not loaded\");\n\t\t}\n\t\treturn this.current;\n\t}\n\n\t/** Replace the host-state portion (used as the state-manager write hook). */\n\tsetHostState(hostState: IrohRemoteHostState): void {\n\t\tthis.current = hostStateToVoltdState(hostState, this.state.settings);\n\t\tthis.scheduleFlush();\n\t}\n\n\tgetHostState(): IrohRemoteHostState {\n\t\treturn this.current ? voltdStateToHostState(this.current) : createEmptyIrohRemoteHostState();\n\t}\n\n\tupdateSettings(settings: Partial<VoltdStateFileV1[\"settings\"]>): void {\n\t\tthis.current = { ...this.state, settings: { ...this.state.settings, ...settings } };\n\t\tthis.scheduleFlush();\n\t}\n\n\tscheduleFlush(): void {\n\t\tthis.markStateChanged();\n\t\tif (this.flushTimer) {\n\t\t\treturn;\n\t\t}\n\t\tthis.flushTimer = setTimeout(() => {\n\t\t\tthis.flushTimer = undefined;\n\t\t\tvoid this.enqueueWrite().catch(() => {});\n\t\t}, this.debounceMs);\n\t\tthis.flushTimer.unref?.();\n\t}\n\n\t/**\n\t * Force an immediate durable write, cancelling any pending debounce. Use after\n\t * minting state that must survive a crash the moment it exists (e.g. the freshly\n\t * generated Iroh identity, before the endpoint starts accepting pairings).\n\t */\n\tasync flush(): Promise<void> {\n\t\tif (this.flushTimer) {\n\t\t\tclearTimeout(this.flushTimer);\n\t\t\tthis.flushTimer = undefined;\n\t\t}\n\t\tif (this.current) {\n\t\t\t// Force an explicit current-snapshot revision. Besides preserving flush's\n\t\t\t// historical semantics, this catches callers that deliberately mutate the\n\t\t\t// loaded state object before requesting durability.\n\t\t\tthis.markStateChanged();\n\t\t\tawait this.enqueueWrite();\n\t\t} else {\n\t\t\tawait this.pendingFlush;\n\t\t}\n\t}\n\n\t/** Flush pending changes and stop the debounce timer (graceful shutdown). */\n\tasync close(): Promise<void> {\n\t\tawait this.flush();\n\t}\n\n\tprivate markStateChanged(): void {\n\t\tthis.stateRevision++;\n\t}\n\n\tprivate enqueueWrite(): Promise<void> {\n\t\tconst write = this.pendingFlush.then(() => this.writeNow());\n\t\tthis.pendingFlush = write.catch(() => {});\n\t\treturn write;\n\t}\n\n\t/** Must only be invoked through enqueueWrite so atomic renames cannot overtake one another. */\n\tprivate async writeNow(): Promise<void> {\n\t\tif (!this.current || this.persistedRevision >= this.stateRevision) {\n\t\t\treturn;\n\t\t}\n\t\tconst revision = this.stateRevision;\n\t\tconst content = `${JSON.stringify(this.current, null, 2)}\\n`;\n\t\tawait this.writeStateFile(this.statePath, content);\n\t\tthis.persistedRevision = Math.max(this.persistedRevision, revision);\n\t}\n}\n"]}