@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,395 @@
1
+ import { Buffer } from "node:buffer";
2
+ import { isIrohRemoteAccessPresetName, parseIrohRemoteRpcCapabilities, parseIrohRemoteRpcGrant, } from "../core/remote/iroh/access-grant.js";
3
+ /**
4
+ * Wire types and framing for the voltd control plane: JSONL over the unix
5
+ * socket ~/.volt/agent/daemon/voltd.sock. Shared by the daemon, the TUI, and
6
+ * the CLI. Zero runtime deps beyond node:buffer.
7
+ */
8
+ export const PROTOCOL_VERSION = 1;
9
+ /** Hard cap per JSONL line; longer lines close the connection with a fatal frame. */
10
+ export const CONTROL_MAX_LINE_BYTES = 8 * 1024 * 1024;
11
+ /**
12
+ * Control-hello capability advertised by TUIs that can serve worktree-bound
13
+ * conversations over the byte relay (worktree-cwd sanitization). The daemon
14
+ * never offers worktree-session relays to control clients without it.
15
+ */
16
+ export const CONTROL_WORKTREES_CAPABILITY = "worktrees";
17
+ /** Status capability for cancellable, immediately-invalidated pairing tickets. */
18
+ export const CONTROL_PAIR_CANCEL_CAPABILITY = "pair_cancel";
19
+ /** TUI/CLI understands per-device tool + RPC grant control messages and relay preambles. */
20
+ export const CONTROL_RPC_GRANTS_CAPABILITY = "rpc_grants";
21
+ /** RPC command types the daemon executes on behalf of a TUI relay. */
22
+ export const RELAY_RPC_COMMAND_TYPES = new Set([
23
+ "register_push_target",
24
+ "register_live_activity",
25
+ "unregister_live_activity",
26
+ "unregister_workspace",
27
+ // worktrees.v1: create/list only — remove_worktree is management-stream-only.
28
+ "create_worktree",
29
+ "list_worktrees",
30
+ "set_keep_awake",
31
+ "get_keep_awake",
32
+ "set_web_search_key",
33
+ "get_web_search_status",
34
+ ]);
35
+ // ============================================================================
36
+ // Framing
37
+ // ============================================================================
38
+ export function encodeControlLine(message) {
39
+ return Buffer.from(`${JSON.stringify(message)}\n`, "utf8");
40
+ }
41
+ export class ControlFrameTooLargeError extends Error {
42
+ constructor(byteLength) {
43
+ super(`control frame of ${byteLength} bytes exceeds the ${CONTROL_MAX_LINE_BYTES} byte cap`);
44
+ this.name = "ControlFrameTooLargeError";
45
+ }
46
+ }
47
+ /**
48
+ * Incremental JSONL decoder with the 8 MiB line cap. Feed raw socket chunks;
49
+ * complete lines come back parsed. Throws ControlFrameTooLargeError when the
50
+ * buffered partial line exceeds the cap (callers must close the connection).
51
+ */
52
+ export class ControlLineDecoder {
53
+ buffered = Buffer.alloc(0);
54
+ push(chunk) {
55
+ this.buffered = this.buffered.length === 0 ? Buffer.from(chunk) : Buffer.concat([this.buffered, chunk]);
56
+ const messages = [];
57
+ while (true) {
58
+ const newlineIndex = this.buffered.indexOf(0x0a);
59
+ if (newlineIndex === -1) {
60
+ if (this.buffered.length > CONTROL_MAX_LINE_BYTES) {
61
+ throw new ControlFrameTooLargeError(this.buffered.length);
62
+ }
63
+ return messages;
64
+ }
65
+ if (newlineIndex > CONTROL_MAX_LINE_BYTES) {
66
+ throw new ControlFrameTooLargeError(newlineIndex);
67
+ }
68
+ const line = this.buffered.subarray(0, newlineIndex).toString("utf8");
69
+ this.buffered = this.buffered.subarray(newlineIndex + 1);
70
+ if (line.trim().length === 0) {
71
+ continue;
72
+ }
73
+ messages.push(JSON.parse(line));
74
+ }
75
+ }
76
+ /**
77
+ * Parse complete lines one at a time, invoking handle per message. When
78
+ * handle returns "stop" (relay handoff), decoding halts immediately and any
79
+ * bytes past the consumed line stay buffered for drainRemainder(). Unlike
80
+ * push(), bytes arriving after a stop are never JSON-decoded — required for
81
+ * relay hellos, where everything after the hello line is opaque payload.
82
+ */
83
+ pushEach(chunk, handle) {
84
+ this.buffered = this.buffered.length === 0 ? Buffer.from(chunk) : Buffer.concat([this.buffered, chunk]);
85
+ while (true) {
86
+ const newlineIndex = this.buffered.indexOf(0x0a);
87
+ if (newlineIndex === -1) {
88
+ if (this.buffered.length > CONTROL_MAX_LINE_BYTES) {
89
+ throw new ControlFrameTooLargeError(this.buffered.length);
90
+ }
91
+ return;
92
+ }
93
+ if (newlineIndex > CONTROL_MAX_LINE_BYTES) {
94
+ throw new ControlFrameTooLargeError(newlineIndex);
95
+ }
96
+ const line = this.buffered.subarray(0, newlineIndex).toString("utf8");
97
+ this.buffered = this.buffered.subarray(newlineIndex + 1);
98
+ if (line.trim().length === 0) {
99
+ continue;
100
+ }
101
+ if (handle(JSON.parse(line)) === "stop") {
102
+ return;
103
+ }
104
+ }
105
+ }
106
+ /** Bytes buffered past the last complete line (used when switching a relay conn to raw mode). */
107
+ drainRemainder() {
108
+ const remainder = this.buffered;
109
+ this.buffered = Buffer.alloc(0);
110
+ return remainder;
111
+ }
112
+ }
113
+ function isRecord(value) {
114
+ return typeof value === "object" && value !== null && !Array.isArray(value);
115
+ }
116
+ function isOptionalString(value) {
117
+ return value === undefined || typeof value === "string";
118
+ }
119
+ function isOptionalNumber(value) {
120
+ return value === undefined || typeof value === "number";
121
+ }
122
+ function isControlAccessSelection(value, allowDefault) {
123
+ if (value.access !== undefined) {
124
+ return (isIrohRemoteAccessPresetName(value.access) &&
125
+ value.allowedTools === undefined &&
126
+ value.rpcCapabilities === undefined);
127
+ }
128
+ if (value.allowedTools === undefined && value.rpcCapabilities === undefined) {
129
+ return allowDefault;
130
+ }
131
+ if (!Array.isArray(value.allowedTools) || !value.allowedTools.every((entry) => typeof entry === "string")) {
132
+ return false;
133
+ }
134
+ try {
135
+ parseIrohRemoteRpcCapabilities(value.rpcCapabilities);
136
+ return true;
137
+ }
138
+ catch {
139
+ return false;
140
+ }
141
+ }
142
+ function isPushDeliveryStatus(value) {
143
+ return (value === "sent" ||
144
+ value === "no_push_target" ||
145
+ value === "duplicate" ||
146
+ value === "failed" ||
147
+ value === "invalid_target");
148
+ }
149
+ function isLiveActivityToolGlyph(value) {
150
+ return (isRecord(value) &&
151
+ typeof value.name === "string" &&
152
+ typeof value.symbolName === "string" &&
153
+ (value.status === "started" || value.status === "completed" || value.status === "failed"));
154
+ }
155
+ function isLiveActivityContentState(value) {
156
+ return (isRecord(value) &&
157
+ (value.status === "running" ||
158
+ value.status === "completed" ||
159
+ value.status === "failed" ||
160
+ value.status === "waiting") &&
161
+ typeof value.statusText === "string" &&
162
+ (value.currentTool === undefined || isLiveActivityToolGlyph(value.currentTool)) &&
163
+ Array.isArray(value.recentTools) &&
164
+ value.recentTools.every(isLiveActivityToolGlyph) &&
165
+ isOptionalString(value.sessionID) &&
166
+ isOptionalString(value.workspaceName) &&
167
+ typeof value.updatedAtEpochSeconds === "number");
168
+ }
169
+ function isPushNotificationIntent(value) {
170
+ return (isRecord(value) &&
171
+ typeof value.eventId === "string" &&
172
+ typeof value.kind === "string" &&
173
+ typeof value.title === "string" &&
174
+ typeof value.body === "string" &&
175
+ isOptionalString(value.sessionId) &&
176
+ isOptionalString(value.workspace));
177
+ }
178
+ function isLiveActivityUpdateIntent(value) {
179
+ return (isRecord(value) &&
180
+ typeof value.eventId === "string" &&
181
+ typeof value.kind === "string" &&
182
+ (value.activityEvent === undefined || value.activityEvent === "update" || value.activityEvent === "end") &&
183
+ isLiveActivityContentState(value.contentState) &&
184
+ isOptionalNumber(value.staleDateEpochSeconds) &&
185
+ isOptionalNumber(value.dismissalDateEpochSeconds));
186
+ }
187
+ export function parseHelloMessage(value) {
188
+ if (!isRecord(value) || value.type !== "hello") {
189
+ return undefined;
190
+ }
191
+ if (typeof value.protocolVersion !== "number") {
192
+ return undefined;
193
+ }
194
+ if (value.role === "control") {
195
+ if (typeof value.pid !== "number" ||
196
+ typeof value.version !== "string" ||
197
+ (value.client !== "tui" && value.client !== "cli")) {
198
+ return undefined;
199
+ }
200
+ if (value.capabilities !== undefined &&
201
+ (!Array.isArray(value.capabilities) || !value.capabilities.every((entry) => typeof entry === "string"))) {
202
+ return undefined;
203
+ }
204
+ if (value.controlToken !== undefined && typeof value.controlToken !== "string") {
205
+ return undefined;
206
+ }
207
+ return {
208
+ type: "hello",
209
+ role: "control",
210
+ protocolVersion: value.protocolVersion,
211
+ pid: value.pid,
212
+ version: value.version,
213
+ client: value.client,
214
+ ...(value.controlToken === undefined ? {} : { controlToken: value.controlToken }),
215
+ ...(value.capabilities === undefined ? {} : { capabilities: value.capabilities }),
216
+ };
217
+ }
218
+ if (value.role === "relay") {
219
+ if (typeof value.relayId !== "string" || typeof value.relayToken !== "string") {
220
+ return undefined;
221
+ }
222
+ return {
223
+ type: "hello",
224
+ role: "relay",
225
+ protocolVersion: value.protocolVersion,
226
+ relayId: value.relayId,
227
+ relayToken: value.relayToken,
228
+ };
229
+ }
230
+ return undefined;
231
+ }
232
+ export function isControlRequest(value) {
233
+ if (!isRecord(value) || typeof value.type !== "string" || typeof value.id !== "string") {
234
+ return false;
235
+ }
236
+ switch (value.type) {
237
+ case "status":
238
+ case "shutdown":
239
+ case "clients_list":
240
+ return true;
241
+ case "pair_request":
242
+ return ((value.workspaceName === undefined || typeof value.workspaceName === "string") &&
243
+ isControlAccessSelection(value, true));
244
+ case "lease_acquire":
245
+ case "lease_release":
246
+ return typeof value.workspaceName === "string" && typeof value.sessionId === "string";
247
+ case "lease_rekey":
248
+ return (typeof value.workspaceName === "string" &&
249
+ typeof value.oldSessionId === "string" &&
250
+ typeof value.newSessionId === "string");
251
+ case "pair_cancel":
252
+ return typeof value.requestId === "string";
253
+ case "client_access_update":
254
+ return (typeof value.clientNodeId === "string" &&
255
+ typeof value.expectedRevision === "number" &&
256
+ Number.isSafeInteger(value.expectedRevision) &&
257
+ value.expectedRevision >= 1 &&
258
+ isControlAccessSelection(value, false));
259
+ case "client_revoke":
260
+ case "client_approve_repair":
261
+ return typeof value.clientNodeId === "string";
262
+ case "workspace_register":
263
+ return typeof value.name === "string" && typeof value.path === "string";
264
+ case "workspace_unregister":
265
+ return typeof value.name === "string";
266
+ case "worktree_create":
267
+ return (typeof value.workspaceName === "string" &&
268
+ (value.worktreeName === undefined || typeof value.worktreeName === "string") &&
269
+ (value.branch === undefined || typeof value.branch === "string") &&
270
+ (value.baseRef === undefined || typeof value.baseRef === "string"));
271
+ case "worktree_adopt":
272
+ return (typeof value.workspaceName === "string" &&
273
+ typeof value.path === "string" &&
274
+ (value.worktreeName === undefined || typeof value.worktreeName === "string") &&
275
+ (value.baseRef === undefined || typeof value.baseRef === "string"));
276
+ case "worktree_list":
277
+ case "worktree_prune":
278
+ return value.workspaceName === undefined || typeof value.workspaceName === "string";
279
+ case "worktree_remove":
280
+ return (typeof value.workspaceName === "string" &&
281
+ typeof value.worktreeId === "string" &&
282
+ (value.force === undefined || typeof value.force === "boolean"));
283
+ case "worktree_resolve":
284
+ return typeof value.path === "string";
285
+ case "worktree_bind":
286
+ return (typeof value.workspaceName === "string" &&
287
+ typeof value.worktreeId === "string" &&
288
+ typeof value.sessionId === "string");
289
+ case "theme_set":
290
+ return typeof value.theme === "string";
291
+ case "keep_awake_set":
292
+ return typeof value.enabled === "boolean";
293
+ case "viewer_subscribe":
294
+ case "viewer_unsubscribe":
295
+ case "viewer_abort":
296
+ return typeof value.viewerFeedId === "string";
297
+ case "relay_rpc":
298
+ return (typeof value.relayId === "string" &&
299
+ typeof value.clientNodeId === "string" &&
300
+ typeof value.workspaceName === "string" &&
301
+ typeof value.sessionId === "string" &&
302
+ isRecord(value.command) &&
303
+ typeof value.command.type === "string");
304
+ case "relay_notification_delivery":
305
+ return (typeof value.clientNodeId === "string" &&
306
+ typeof value.workspaceName === "string" &&
307
+ typeof value.sessionId === "string" &&
308
+ isPushNotificationIntent(value.notification));
309
+ case "relay_live_activity_delivery":
310
+ return (typeof value.clientNodeId === "string" &&
311
+ typeof value.workspaceName === "string" &&
312
+ typeof value.sessionId === "string" &&
313
+ isLiveActivityUpdateIntent(value.update));
314
+ default:
315
+ return false;
316
+ }
317
+ }
318
+ export function isControlResponse(value) {
319
+ if (!isRecord(value) || typeof value.type !== "string" || typeof value.id !== "string") {
320
+ return false;
321
+ }
322
+ switch (value.type) {
323
+ case "ok":
324
+ case "error":
325
+ case "lease_granted":
326
+ case "lease_pending":
327
+ case "lease_denied":
328
+ case "status_result":
329
+ case "clients_result":
330
+ case "client_access_updated":
331
+ case "pair_started":
332
+ return true;
333
+ case "worktree_result":
334
+ return isRecord(value.worktree);
335
+ case "worktrees_result":
336
+ return Array.isArray(value.worktrees);
337
+ case "worktree_prune_result":
338
+ return Array.isArray(value.results);
339
+ case "worktree_resolve_result":
340
+ return (typeof value.workspaceName === "string" &&
341
+ typeof value.workspacePath === "string" &&
342
+ typeof value.worktreeId === "string" &&
343
+ typeof value.worktreePath === "string");
344
+ case "keep_awake_result":
345
+ return isRecord(value.keepAwake);
346
+ case "relay_rpc_result":
347
+ return isRecord(value.response);
348
+ case "relay_push_delivery_result":
349
+ return isPushDeliveryStatus(value.status);
350
+ default:
351
+ return false;
352
+ }
353
+ }
354
+ export function isControlEvent(value) {
355
+ if (!isRecord(value) || typeof value.type !== "string") {
356
+ return false;
357
+ }
358
+ switch (value.type) {
359
+ case "relay_offer":
360
+ case "relay_closed":
361
+ case "viewer_event":
362
+ case "viewer_end":
363
+ case "theme_snapshot":
364
+ case "pairing_progress":
365
+ case "daemon_shutdown":
366
+ return true;
367
+ case "keep_awake_changed":
368
+ return isRecord(value.keepAwake);
369
+ default:
370
+ return false;
371
+ }
372
+ }
373
+ export function isHelloAck(value) {
374
+ return isRecord(value) && value.type === "hello_ack" && typeof value.ok === "boolean";
375
+ }
376
+ export function isRelayPreamble(value) {
377
+ if (!isRecord(value) ||
378
+ value.type !== "relay_preamble" ||
379
+ typeof value.relayId !== "string" ||
380
+ !isRecord(value.authorization) ||
381
+ !isRecord(value.resolvedTarget)) {
382
+ return false;
383
+ }
384
+ try {
385
+ if (typeof value.authorization.allowedTools !== "string") {
386
+ return false;
387
+ }
388
+ parseIrohRemoteRpcGrant(value.authorization.rpcGrant, "relay rpcGrant");
389
+ return true;
390
+ }
391
+ catch {
392
+ return false;
393
+ }
394
+ }
395
+ //# sourceMappingURL=control-protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control-protocol.js","sourceRoot":"","sources":["../../src/daemon/control-protocol.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport {\n\ttype IrohRemoteAccessPresetName,\n\ttype IrohRemoteRpcCapability,\n\ttype IrohRemoteRpcGrant,\n\tisIrohRemoteAccessPresetName,\n\tparseIrohRemoteRpcCapabilities,\n\tparseIrohRemoteRpcGrant,\n} from \"../core/remote/iroh/access-grant.ts\";\nimport type {\n\tIrohRemoteLiveActivityUpdateIntent,\n\tIrohRemotePushNotificationDeliveryStatus,\n\tIrohRemotePushNotificationIntent,\n} from \"../core/remote/iroh/push.ts\";\n\n/**\n * Wire types and framing for the voltd control plane: JSONL over the unix\n * socket ~/.volt/agent/daemon/voltd.sock. Shared by the daemon, the TUI, and\n * the CLI. Zero runtime deps beyond node:buffer.\n */\n\nexport const PROTOCOL_VERSION = 1;\n\n/** Hard cap per JSONL line; longer lines close the connection with a fatal frame. */\nexport const CONTROL_MAX_LINE_BYTES = 8 * 1024 * 1024;\n\nexport type LeaseState = \"unowned\" | \"daemon-active\" | \"daemon-detached\" | \"daemon-draining\" | \"tui-owned\";\n\nexport type ControlClientKind = \"tui\" | \"cli\";\n\n/**\n * Control-hello capability advertised by TUIs that can serve worktree-bound\n * conversations over the byte relay (worktree-cwd sanitization). The daemon\n * never offers worktree-session relays to control clients without it.\n */\nexport const CONTROL_WORKTREES_CAPABILITY = \"worktrees\";\n/** Status capability for cancellable, immediately-invalidated pairing tickets. */\nexport const CONTROL_PAIR_CANCEL_CAPABILITY = \"pair_cancel\";\n/** TUI/CLI understands per-device tool + RPC grant control messages and relay preambles. */\nexport const CONTROL_RPC_GRANTS_CAPABILITY = \"rpc_grants\";\n\nexport type HelloMessage =\n\t| {\n\t\t\ttype: \"hello\";\n\t\t\trole: \"control\";\n\t\t\tprotocolVersion: number;\n\t\t\tpid: number;\n\t\t\tversion: string;\n\t\t\tclient: ControlClientKind;\n\t\t\t/** Per-daemon instance token read from the local pidfile. */\n\t\t\tcontrolToken?: string;\n\t\t\t/** Optional client capabilities (e.g. \"worktrees\"); absent for old clients. */\n\t\t\tcapabilities?: string[];\n\t }\n\t| {\n\t\t\ttype: \"hello\";\n\t\t\trole: \"relay\";\n\t\t\tprotocolVersion: number;\n\t\t\trelayId: string;\n\t\t\trelayToken: string;\n\t };\n\nexport interface HelloAck {\n\ttype: \"hello_ack\";\n\tok: boolean;\n\terror?: \"protocol_mismatch\" | \"shutting_down\" | \"bad_relay_token\" | \"auth_failed\";\n\t/** daemon-assigned, present when ok (control role) */\n\tconnectionId?: string;\n\t/** daemon package version */\n\tversion?: string;\n\tprotocolVersion?: number;\n}\n\n// ============================================================================\n// Requests and responses (control role)\n// ============================================================================\n\nexport type ControlAccessSelection =\n\t| { access?: IrohRemoteAccessPresetName; allowedTools?: never; rpcCapabilities?: never }\n\t| { access?: never; allowedTools: string[]; rpcCapabilities: IrohRemoteRpcCapability[] };\n\nexport type ControlRequest =\n\t| { type: \"status\"; id: string }\n\t| { type: \"shutdown\"; id: string }\n\t| {\n\t\t\ttype: \"lease_acquire\";\n\t\t\tid: string;\n\t\t\tworkspaceName: string;\n\t\t\tsessionId: string;\n\t\t\t/** reserved; true => lease_denied{force_unsupported} */\n\t\t\tforce?: boolean;\n\t }\n\t| { type: \"lease_release\"; id: string; workspaceName: string; sessionId: string }\n\t| { type: \"lease_rekey\"; id: string; workspaceName: string; oldSessionId: string; newSessionId: string }\n\t| ({ type: \"pair_request\"; id: string; workspaceName?: string } & ControlAccessSelection) // progress arrives as pairing_progress events\n\t| { type: \"pair_cancel\"; id: string; requestId: string }\n\t| { type: \"clients_list\"; id: string }\n\t| ({\n\t\t\ttype: \"client_access_update\";\n\t\t\tid: string;\n\t\t\tclientNodeId: string;\n\t\t\texpectedRevision: number;\n\t } & ControlAccessSelection)\n\t| { type: \"client_revoke\"; id: string; clientNodeId: string }\n\t| { type: \"client_approve_repair\"; id: string; clientNodeId: string }\n\t| { type: \"workspace_register\"; id: string; name: string; path: string }\n\t| { type: \"workspace_unregister\"; id: string; name: string }\n\t| {\n\t\t\ttype: \"worktree_create\";\n\t\t\tid: string;\n\t\t\tworkspaceName: string;\n\t\t\tworktreeName?: string;\n\t\t\tbranch?: string;\n\t\t\tbaseRef?: string;\n\t }\n\t| {\n\t\t\ttype: \"worktree_adopt\";\n\t\t\tid: string;\n\t\t\tworkspaceName: string;\n\t\t\tpath: string;\n\t\t\tworktreeName?: string;\n\t\t\tbaseRef?: string;\n\t }\n\t| { type: \"worktree_list\"; id: string; workspaceName?: string }\n\t| { type: \"worktree_remove\"; id: string; workspaceName: string; worktreeId: string; force?: boolean }\n\t| { type: \"worktree_prune\"; id: string; workspaceName?: string }\n\t/** Resolve a filesystem path to the daemon-managed worktree containing it. */\n\t| { type: \"worktree_resolve\"; id: string; path: string }\n\t/** Bind a session id to a worktree (TUI-created worktree sessions). */\n\t| { type: \"worktree_bind\"; id: string; workspaceName: string; worktreeId: string; sessionId: string }\n\t| { type: \"theme_set\"; id: string; theme: string } // name; daemon resolves + broadcasts\n\t| { type: \"keep_awake_set\"; id: string; enabled: boolean } // hold/release the host sleep-prevention assertion\n\t| { type: \"viewer_subscribe\"; id: string; viewerFeedId: string }\n\t| { type: \"viewer_unsubscribe\"; id: string; viewerFeedId: string }\n\t| { type: \"viewer_abort\"; id: string; viewerFeedId: string }\n\t| {\n\t\t\ttype: \"relay_rpc\";\n\t\t\tid: string;\n\t\t\t/** Active relay whose phone command is being forwarded. */\n\t\t\trelayId: string;\n\t\t\t/** paired phone client the relayed conversation belongs to */\n\t\t\tclientNodeId: string;\n\t\t\tworkspaceName: string;\n\t\t\t/** the TUI's current session id for the relayed conversation */\n\t\t\tsessionId: string;\n\t\t\t/**\n\t\t\t * Verbatim phone RPC command forwarded from a TUI-owned conversation.\n\t\t\t * The daemon executes it against its real state (push targets, live\n\t\t\t * activities, workspace registry) and returns the RPC response in\n\t\t\t * relay_rpc_result.\n\t\t\t */\n\t\t\tcommand: Record<string, unknown> & { type: string };\n\t }\n\t| {\n\t\t\ttype: \"relay_notification_delivery\";\n\t\t\tid: string;\n\t\t\t/** paired phone client the relayed conversation belongs to */\n\t\t\tclientNodeId: string;\n\t\t\tworkspaceName: string;\n\t\t\t/** the TUI's current session id for the relayed conversation */\n\t\t\tsessionId: string;\n\t\t\tnotification: IrohRemotePushNotificationIntent;\n\t }\n\t| {\n\t\t\ttype: \"relay_live_activity_delivery\";\n\t\t\tid: string;\n\t\t\t/** paired phone client the relayed conversation belongs to */\n\t\t\tclientNodeId: string;\n\t\t\tworkspaceName: string;\n\t\t\t/** the TUI's current session id for the relayed conversation */\n\t\t\tsessionId: string;\n\t\t\tupdate: IrohRemoteLiveActivityUpdateIntent;\n\t };\n\n/** RPC command types the daemon executes on behalf of a TUI relay. */\nexport const RELAY_RPC_COMMAND_TYPES: ReadonlySet<string> = new Set([\n\t\"register_push_target\",\n\t\"register_live_activity\",\n\t\"unregister_live_activity\",\n\t\"unregister_workspace\",\n\t// worktrees.v1: create/list only — remove_worktree is management-stream-only.\n\t\"create_worktree\",\n\t\"list_worktrees\",\n\t\"set_keep_awake\",\n\t\"get_keep_awake\",\n\t\"set_web_search_key\",\n\t\"get_web_search_status\",\n]);\n\n/** Host keep-awake assertion state as reported over the control plane. */\nexport interface ControlKeepAwakeStatus {\n\t/** Desired (persisted) state. */\n\tenabled: boolean;\n\t/** Actual state; `degraded` means enabled but the assertion is not held. */\n\tstate: \"disabled\" | \"active\" | \"degraded\";\n\tmethod?: string;\n\treason?: string;\n}\n\nexport interface ControlLeaseStatus {\n\tworkspaceName: string;\n\tsessionId: string;\n\tstate: LeaseState;\n\trelayCount: number;\n\tstreamCount: number;\n}\n\nexport interface ControlWorkspaceStatus {\n\tname: string;\n\tpath: string;\n\t/** Workspace-specific headless tool grant, when configured. */\n\tallowedTools?: string[];\n}\n\n/**\n * Worktree status over the LOCAL control socket. Unlike the iroh wire, the\n * control plane is trusted (same user), so checkout paths are included for\n * display.\n */\nexport interface ControlWorktreeStatus {\n\tid: string;\n\tworkspaceName: string;\n\tpath: string;\n\tbranch: string;\n\tbaseRef?: string;\n\tcreatedAt: number;\n\tsessionIds: string[];\n\tavailable?: boolean;\n\tdirty?: boolean;\n\t/** Branch commits vs the base ref (merge-back guidance). */\n\taheadBehind?: { ahead: number; behind: number };\n}\n\nexport interface ControlClientStatus {\n\tclientNodeId: string;\n\tlabel?: string;\n\tpairedAtMs: number;\n\t/** Added to protocol v1 after launch; absent on older running daemons. */\n\tlastSeenAtMs?: number;\n\t/** Persisted headless tool grant for this paired device. */\n\tallowedTools?: string[];\n\trpcGrant?: IrohRemoteRpcGrant;\n}\n\nexport interface ControlRevokedClientStatus {\n\tclientNodeId: string;\n\tlabel?: string;\n\tpairedAtMs: number;\n\tlastSeenAtMs?: number;\n\trevokedAtMs: number;\n\t/** Present after the desktop explicitly allows this identity to use a fresh pairing ticket. */\n\trePairApprovedAtMs?: number;\n\trpcGrant?: IrohRemoteRpcGrant;\n}\n\nexport interface DaemonRemotePolicyStatus {\n\t/** Daemon-wide override; null delegates to workspace and device grants. */\n\tallowTools: string[] | null;\n\t/** Retention window for idle, detached daemon-owned runtimes. */\n\tdetachedRuntimeTtlMs: number;\n}\n\nexport type ControlResponse =\n\t| { type: \"ok\"; id: string }\n\t| { type: \"error\"; id: string; code: string; message: string }\n\t| { type: \"lease_granted\"; id: string; workspaceName: string; sessionId: string; handoff: \"cold\" | \"warm\" | \"none\" }\n\t| { type: \"lease_pending\"; id: string; viewerFeedId: string }\n\t// lease_pending is provisional; the terminal response for the same id arrives\n\t// when the drain completes (lease_granted) or fails (error{drain_failed})\n\t| { type: \"lease_denied\"; id: string; reason: \"held_by_tui\" | \"force_unsupported\" | \"draining_elsewhere\" }\n\t| {\n\t\t\ttype: \"status_result\";\n\t\t\tid: string;\n\t\t\tversion: string;\n\t\t\tprotocolVersion: number;\n\t\t\tpid: number;\n\t\t\tstartedAtMs: number;\n\t\t\t/** Optional feature flags for protocol-v1 additions. */\n\t\t\tcapabilities?: string[];\n\t\t\tleases: ControlLeaseStatus[];\n\t\t\tphoneConnections: number;\n\t\t\tworkspaces: ControlWorkspaceStatus[];\n\t\t\tclients: ControlClientStatus[];\n\t\t\t/** Revoked identities retained for explicit repair approval; absent on older running daemons. */\n\t\t\trevokedClients?: ControlRevokedClientStatus[];\n\t\t\t/** Added to protocol v1 after launch; absent on older running daemons. */\n\t\t\tremotePolicy?: DaemonRemotePolicyStatus;\n\t\t\tkeepAwake: ControlKeepAwakeStatus;\n\t }\n\t| { type: \"keep_awake_result\"; id: string; keepAwake: ControlKeepAwakeStatus }\n\t| { type: \"clients_result\"; id: string; clients: ControlClientStatus[] }\n\t| { type: \"client_access_updated\"; id: string; client: ControlClientStatus }\n\t| { type: \"worktree_result\"; id: string; worktree: ControlWorktreeStatus }\n\t| { type: \"worktrees_result\"; id: string; worktrees: ControlWorktreeStatus[] }\n\t| {\n\t\t\ttype: \"worktree_resolve_result\";\n\t\t\tid: string;\n\t\t\t/** Parent workspace the worktree belongs to. */\n\t\t\tworkspaceName: string;\n\t\t\t/** Parent workspace checkout path (control plane is local/trusted). */\n\t\t\tworkspacePath: string;\n\t\t\tworktreeId: string;\n\t\t\tworktreePath: string;\n\t }\n\t| {\n\t\t\ttype: \"worktree_prune_result\";\n\t\t\tid: string;\n\t\t\tresults: Array<{ workspaceName: string; removedRecords: string[]; orphanCheckouts: string[] }>;\n\t }\n\t| { type: \"pair_started\"; id: string; requestId: string }\n\t| {\n\t\t\ttype: \"relay_rpc_result\";\n\t\t\tid: string;\n\t\t\t/** verbatim RPC response object for the TUI to forward to the phone */\n\t\t\tresponse: Record<string, unknown>;\n\t\t\t/** refreshed workspace metadata after a successful unregister_workspace */\n\t\t\tworkspaceMetadata?: { workspaceNames: string[]; workspaces: Array<{ name: string; status: string }> };\n\t }\n\t| { type: \"relay_push_delivery_result\"; id: string; status: IrohRemotePushNotificationDeliveryStatus };\n\n// ============================================================================\n// Unsolicited events (daemon -> control clients)\n// ============================================================================\n\nexport type RelayCloseReason =\n\t| \"phone_disconnected\"\n\t| \"tui_disconnected\"\n\t| \"lease_transferred\"\n\t| \"session_rekeyed_reconnect\"\n\t| \"workspace_unregistered\"\n\t| \"host_shutdown\"\n\t| \"error\";\n\nexport type ControlEvent =\n\t| {\n\t\t\ttype: \"relay_offer\";\n\t\t\trelayId: string;\n\t\t\t/** single-use, 10s expiry */\n\t\t\trelayToken: string;\n\t\t\tworkspaceName: string;\n\t\t\tsessionId: string;\n\t\t\tclientNodeId: string;\n\t\t\tconnectionId: string;\n\t\t\tstreamId: string;\n\t }\n\t| { type: \"relay_closed\"; relayId: string; reason: RelayCloseReason }\n\t| {\n\t\t\ttype: \"viewer_event\";\n\t\t\tviewerFeedId: string;\n\t\t\tseq: number;\n\t\t\t/** AgentSessionEvent JSON, or {kind:\"truncated\"} when the buffer overflowed */\n\t\t\tevent: unknown;\n\t }\n\t| { type: \"viewer_end\"; viewerFeedId: string; reason: \"granted\" | \"cancelled\" | \"error\" }\n\t| { type: \"theme_snapshot\"; themeName: string; tokens: Record<string, string> }\n\t| { type: \"keep_awake_changed\"; keepAwake: ControlKeepAwakeStatus }\n\t| {\n\t\t\ttype: \"pairing_progress\";\n\t\t\trequestId: string;\n\t\t\tphase: \"ticket\" | \"qr\" | \"waiting\" | \"completed\" | \"failed\";\n\t\t\tticket?: string;\n\t\t\tqrLines?: string[];\n\t\t\tclientNodeId?: string;\n\t\t\terror?: string;\n\t }\n\t| { type: \"daemon_shutdown\" };\n\nexport interface ControlFatal {\n\ttype: \"fatal\";\n\terror: string;\n}\n\nexport type ControlMessage = HelloMessage | HelloAck | ControlRequest | ControlResponse | ControlEvent | ControlFatal;\n\n/** One JSONL relay preamble line follows a successful relay hello_ack. */\nexport interface RelayPreamble {\n\ttype: \"relay_preamble\";\n\trelayId: string;\n\t/** verbatim phone handshake JSON as received (parsed object, re-serialized) */\n\thandshake: unknown;\n\t/** authorization subset — everything the TUI needs to serve the stream */\n\tauthorization: {\n\t\tclientNodeId: string;\n\t\tworkspaceName: string;\n\t\tworkspacePath: string;\n\t\t/** Headless agent tool grant, carried for visibility; TUI-owned sessions retain their full local tools. */\n\t\tallowedTools: string;\n\t\trpcGrant: IrohRemoteRpcGrant;\n\t\t/** Present when the conversation is bound to a daemon-managed worktree. */\n\t\tworktreeId?: string;\n\t\t/** Worktree checkout path — the TUI sanitizes with this as the root. */\n\t\tworktreePath?: string;\n\t\t/** Registered-workspace-relative git source root for nested repo worktrees. */\n\t\tworktreeSourceRootRelativePath?: string;\n\t};\n\t/**\n\t * The daemon's Iroh node id: the TUI writes it into the handshake response\n\t * so the phone's saved-host identity verification passes over the relay.\n\t */\n\thostNodeId?: string;\n\trelayMode?: \"disabled\" | \"development\" | \"production\";\n\trelayUrls?: string[];\n\tconnectionId: string;\n\tstreamId: string;\n\tresolvedTarget: {\n\t\tsessionId: string;\n\t\tsessionFilePath?: string;\n\t\tselection: \"created\" | \"created_after_missing\" | \"resumed\";\n\t\trequestedSessionId?: string;\n\t\tworkspaceName: string;\n\t\tworkspacePath: string;\n\t\tworktreeId?: string;\n\t\t/** POSIX-style path relative to the registered workspace root. */\n\t\tworkingDirectory?: string;\n\t};\n}\n\n// ============================================================================\n// Framing\n// ============================================================================\n\nexport function encodeControlLine(message: object): Buffer {\n\treturn Buffer.from(`${JSON.stringify(message)}\\n`, \"utf8\");\n}\n\nexport class ControlFrameTooLargeError extends Error {\n\tconstructor(byteLength: number) {\n\t\tsuper(`control frame of ${byteLength} bytes exceeds the ${CONTROL_MAX_LINE_BYTES} byte cap`);\n\t\tthis.name = \"ControlFrameTooLargeError\";\n\t}\n}\n\n/**\n * Incremental JSONL decoder with the 8 MiB line cap. Feed raw socket chunks;\n * complete lines come back parsed. Throws ControlFrameTooLargeError when the\n * buffered partial line exceeds the cap (callers must close the connection).\n */\nexport class ControlLineDecoder {\n\tprivate buffered: Buffer = Buffer.alloc(0);\n\n\tpush(chunk: Buffer): unknown[] {\n\t\tthis.buffered = this.buffered.length === 0 ? Buffer.from(chunk) : Buffer.concat([this.buffered, chunk]);\n\t\tconst messages: unknown[] = [];\n\t\twhile (true) {\n\t\t\tconst newlineIndex = this.buffered.indexOf(0x0a);\n\t\t\tif (newlineIndex === -1) {\n\t\t\t\tif (this.buffered.length > CONTROL_MAX_LINE_BYTES) {\n\t\t\t\t\tthrow new ControlFrameTooLargeError(this.buffered.length);\n\t\t\t\t}\n\t\t\t\treturn messages;\n\t\t\t}\n\t\t\tif (newlineIndex > CONTROL_MAX_LINE_BYTES) {\n\t\t\t\tthrow new ControlFrameTooLargeError(newlineIndex);\n\t\t\t}\n\t\t\tconst line = this.buffered.subarray(0, newlineIndex).toString(\"utf8\");\n\t\t\tthis.buffered = this.buffered.subarray(newlineIndex + 1);\n\t\t\tif (line.trim().length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tmessages.push(JSON.parse(line));\n\t\t}\n\t}\n\n\t/**\n\t * Parse complete lines one at a time, invoking handle per message. When\n\t * handle returns \"stop\" (relay handoff), decoding halts immediately and any\n\t * bytes past the consumed line stay buffered for drainRemainder(). Unlike\n\t * push(), bytes arriving after a stop are never JSON-decoded — required for\n\t * relay hellos, where everything after the hello line is opaque payload.\n\t */\n\tpushEach(chunk: Buffer, handle: (message: unknown) => \"continue\" | \"stop\"): void {\n\t\tthis.buffered = this.buffered.length === 0 ? Buffer.from(chunk) : Buffer.concat([this.buffered, chunk]);\n\t\twhile (true) {\n\t\t\tconst newlineIndex = this.buffered.indexOf(0x0a);\n\t\t\tif (newlineIndex === -1) {\n\t\t\t\tif (this.buffered.length > CONTROL_MAX_LINE_BYTES) {\n\t\t\t\t\tthrow new ControlFrameTooLargeError(this.buffered.length);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (newlineIndex > CONTROL_MAX_LINE_BYTES) {\n\t\t\t\tthrow new ControlFrameTooLargeError(newlineIndex);\n\t\t\t}\n\t\t\tconst line = this.buffered.subarray(0, newlineIndex).toString(\"utf8\");\n\t\t\tthis.buffered = this.buffered.subarray(newlineIndex + 1);\n\t\t\tif (line.trim().length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (handle(JSON.parse(line)) === \"stop\") {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Bytes buffered past the last complete line (used when switching a relay conn to raw mode). */\n\tdrainRemainder(): Buffer {\n\t\tconst remainder = this.buffered;\n\t\tthis.buffered = Buffer.alloc(0);\n\t\treturn remainder;\n\t}\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isOptionalString(value: unknown): boolean {\n\treturn value === undefined || typeof value === \"string\";\n}\n\nfunction isOptionalNumber(value: unknown): boolean {\n\treturn value === undefined || typeof value === \"number\";\n}\n\nfunction isControlAccessSelection(value: Record<string, unknown>, allowDefault: boolean): boolean {\n\tif (value.access !== undefined) {\n\t\treturn (\n\t\t\tisIrohRemoteAccessPresetName(value.access) &&\n\t\t\tvalue.allowedTools === undefined &&\n\t\t\tvalue.rpcCapabilities === undefined\n\t\t);\n\t}\n\tif (value.allowedTools === undefined && value.rpcCapabilities === undefined) {\n\t\treturn allowDefault;\n\t}\n\tif (!Array.isArray(value.allowedTools) || !value.allowedTools.every((entry) => typeof entry === \"string\")) {\n\t\treturn false;\n\t}\n\ttry {\n\t\tparseIrohRemoteRpcCapabilities(value.rpcCapabilities);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction isPushDeliveryStatus(value: unknown): value is IrohRemotePushNotificationDeliveryStatus {\n\treturn (\n\t\tvalue === \"sent\" ||\n\t\tvalue === \"no_push_target\" ||\n\t\tvalue === \"duplicate\" ||\n\t\tvalue === \"failed\" ||\n\t\tvalue === \"invalid_target\"\n\t);\n}\n\nfunction isLiveActivityToolGlyph(value: unknown): boolean {\n\treturn (\n\t\tisRecord(value) &&\n\t\ttypeof value.name === \"string\" &&\n\t\ttypeof value.symbolName === \"string\" &&\n\t\t(value.status === \"started\" || value.status === \"completed\" || value.status === \"failed\")\n\t);\n}\n\nfunction isLiveActivityContentState(value: unknown): boolean {\n\treturn (\n\t\tisRecord(value) &&\n\t\t(value.status === \"running\" ||\n\t\t\tvalue.status === \"completed\" ||\n\t\t\tvalue.status === \"failed\" ||\n\t\t\tvalue.status === \"waiting\") &&\n\t\ttypeof value.statusText === \"string\" &&\n\t\t(value.currentTool === undefined || isLiveActivityToolGlyph(value.currentTool)) &&\n\t\tArray.isArray(value.recentTools) &&\n\t\tvalue.recentTools.every(isLiveActivityToolGlyph) &&\n\t\tisOptionalString(value.sessionID) &&\n\t\tisOptionalString(value.workspaceName) &&\n\t\ttypeof value.updatedAtEpochSeconds === \"number\"\n\t);\n}\n\nfunction isPushNotificationIntent(value: unknown): value is IrohRemotePushNotificationIntent {\n\treturn (\n\t\tisRecord(value) &&\n\t\ttypeof value.eventId === \"string\" &&\n\t\ttypeof value.kind === \"string\" &&\n\t\ttypeof value.title === \"string\" &&\n\t\ttypeof value.body === \"string\" &&\n\t\tisOptionalString(value.sessionId) &&\n\t\tisOptionalString(value.workspace)\n\t);\n}\n\nfunction isLiveActivityUpdateIntent(value: unknown): value is IrohRemoteLiveActivityUpdateIntent {\n\treturn (\n\t\tisRecord(value) &&\n\t\ttypeof value.eventId === \"string\" &&\n\t\ttypeof value.kind === \"string\" &&\n\t\t(value.activityEvent === undefined || value.activityEvent === \"update\" || value.activityEvent === \"end\") &&\n\t\tisLiveActivityContentState(value.contentState) &&\n\t\tisOptionalNumber(value.staleDateEpochSeconds) &&\n\t\tisOptionalNumber(value.dismissalDateEpochSeconds)\n\t);\n}\n\nexport function parseHelloMessage(value: unknown): HelloMessage | undefined {\n\tif (!isRecord(value) || value.type !== \"hello\") {\n\t\treturn undefined;\n\t}\n\tif (typeof value.protocolVersion !== \"number\") {\n\t\treturn undefined;\n\t}\n\tif (value.role === \"control\") {\n\t\tif (\n\t\t\ttypeof value.pid !== \"number\" ||\n\t\t\ttypeof value.version !== \"string\" ||\n\t\t\t(value.client !== \"tui\" && value.client !== \"cli\")\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (\n\t\t\tvalue.capabilities !== undefined &&\n\t\t\t(!Array.isArray(value.capabilities) || !value.capabilities.every((entry) => typeof entry === \"string\"))\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (value.controlToken !== undefined && typeof value.controlToken !== \"string\") {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn {\n\t\t\ttype: \"hello\",\n\t\t\trole: \"control\",\n\t\t\tprotocolVersion: value.protocolVersion,\n\t\t\tpid: value.pid,\n\t\t\tversion: value.version,\n\t\t\tclient: value.client,\n\t\t\t...(value.controlToken === undefined ? {} : { controlToken: value.controlToken }),\n\t\t\t...(value.capabilities === undefined ? {} : { capabilities: value.capabilities as string[] }),\n\t\t};\n\t}\n\tif (value.role === \"relay\") {\n\t\tif (typeof value.relayId !== \"string\" || typeof value.relayToken !== \"string\") {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn {\n\t\t\ttype: \"hello\",\n\t\t\trole: \"relay\",\n\t\t\tprotocolVersion: value.protocolVersion,\n\t\t\trelayId: value.relayId,\n\t\t\trelayToken: value.relayToken,\n\t\t};\n\t}\n\treturn undefined;\n}\n\nexport function isControlRequest(value: unknown): value is ControlRequest {\n\tif (!isRecord(value) || typeof value.type !== \"string\" || typeof value.id !== \"string\") {\n\t\treturn false;\n\t}\n\tswitch (value.type) {\n\t\tcase \"status\":\n\t\tcase \"shutdown\":\n\t\tcase \"clients_list\":\n\t\t\treturn true;\n\t\tcase \"pair_request\":\n\t\t\treturn (\n\t\t\t\t(value.workspaceName === undefined || typeof value.workspaceName === \"string\") &&\n\t\t\t\tisControlAccessSelection(value, true)\n\t\t\t);\n\t\tcase \"lease_acquire\":\n\t\tcase \"lease_release\":\n\t\t\treturn typeof value.workspaceName === \"string\" && typeof value.sessionId === \"string\";\n\t\tcase \"lease_rekey\":\n\t\t\treturn (\n\t\t\t\ttypeof value.workspaceName === \"string\" &&\n\t\t\t\ttypeof value.oldSessionId === \"string\" &&\n\t\t\t\ttypeof value.newSessionId === \"string\"\n\t\t\t);\n\t\tcase \"pair_cancel\":\n\t\t\treturn typeof value.requestId === \"string\";\n\t\tcase \"client_access_update\":\n\t\t\treturn (\n\t\t\t\ttypeof value.clientNodeId === \"string\" &&\n\t\t\t\ttypeof value.expectedRevision === \"number\" &&\n\t\t\t\tNumber.isSafeInteger(value.expectedRevision) &&\n\t\t\t\tvalue.expectedRevision >= 1 &&\n\t\t\t\tisControlAccessSelection(value, false)\n\t\t\t);\n\t\tcase \"client_revoke\":\n\t\tcase \"client_approve_repair\":\n\t\t\treturn typeof value.clientNodeId === \"string\";\n\t\tcase \"workspace_register\":\n\t\t\treturn typeof value.name === \"string\" && typeof value.path === \"string\";\n\t\tcase \"workspace_unregister\":\n\t\t\treturn typeof value.name === \"string\";\n\t\tcase \"worktree_create\":\n\t\t\treturn (\n\t\t\t\ttypeof value.workspaceName === \"string\" &&\n\t\t\t\t(value.worktreeName === undefined || typeof value.worktreeName === \"string\") &&\n\t\t\t\t(value.branch === undefined || typeof value.branch === \"string\") &&\n\t\t\t\t(value.baseRef === undefined || typeof value.baseRef === \"string\")\n\t\t\t);\n\t\tcase \"worktree_adopt\":\n\t\t\treturn (\n\t\t\t\ttypeof value.workspaceName === \"string\" &&\n\t\t\t\ttypeof value.path === \"string\" &&\n\t\t\t\t(value.worktreeName === undefined || typeof value.worktreeName === \"string\") &&\n\t\t\t\t(value.baseRef === undefined || typeof value.baseRef === \"string\")\n\t\t\t);\n\t\tcase \"worktree_list\":\n\t\tcase \"worktree_prune\":\n\t\t\treturn value.workspaceName === undefined || typeof value.workspaceName === \"string\";\n\t\tcase \"worktree_remove\":\n\t\t\treturn (\n\t\t\t\ttypeof value.workspaceName === \"string\" &&\n\t\t\t\ttypeof value.worktreeId === \"string\" &&\n\t\t\t\t(value.force === undefined || typeof value.force === \"boolean\")\n\t\t\t);\n\t\tcase \"worktree_resolve\":\n\t\t\treturn typeof value.path === \"string\";\n\t\tcase \"worktree_bind\":\n\t\t\treturn (\n\t\t\t\ttypeof value.workspaceName === \"string\" &&\n\t\t\t\ttypeof value.worktreeId === \"string\" &&\n\t\t\t\ttypeof value.sessionId === \"string\"\n\t\t\t);\n\t\tcase \"theme_set\":\n\t\t\treturn typeof value.theme === \"string\";\n\t\tcase \"keep_awake_set\":\n\t\t\treturn typeof value.enabled === \"boolean\";\n\t\tcase \"viewer_subscribe\":\n\t\tcase \"viewer_unsubscribe\":\n\t\tcase \"viewer_abort\":\n\t\t\treturn typeof value.viewerFeedId === \"string\";\n\t\tcase \"relay_rpc\":\n\t\t\treturn (\n\t\t\t\ttypeof value.relayId === \"string\" &&\n\t\t\t\ttypeof value.clientNodeId === \"string\" &&\n\t\t\t\ttypeof value.workspaceName === \"string\" &&\n\t\t\t\ttypeof value.sessionId === \"string\" &&\n\t\t\t\tisRecord(value.command) &&\n\t\t\t\ttypeof value.command.type === \"string\"\n\t\t\t);\n\t\tcase \"relay_notification_delivery\":\n\t\t\treturn (\n\t\t\t\ttypeof value.clientNodeId === \"string\" &&\n\t\t\t\ttypeof value.workspaceName === \"string\" &&\n\t\t\t\ttypeof value.sessionId === \"string\" &&\n\t\t\t\tisPushNotificationIntent(value.notification)\n\t\t\t);\n\t\tcase \"relay_live_activity_delivery\":\n\t\t\treturn (\n\t\t\t\ttypeof value.clientNodeId === \"string\" &&\n\t\t\t\ttypeof value.workspaceName === \"string\" &&\n\t\t\t\ttypeof value.sessionId === \"string\" &&\n\t\t\t\tisLiveActivityUpdateIntent(value.update)\n\t\t\t);\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\nexport function isControlResponse(value: unknown): value is ControlResponse {\n\tif (!isRecord(value) || typeof value.type !== \"string\" || typeof value.id !== \"string\") {\n\t\treturn false;\n\t}\n\tswitch (value.type) {\n\t\tcase \"ok\":\n\t\tcase \"error\":\n\t\tcase \"lease_granted\":\n\t\tcase \"lease_pending\":\n\t\tcase \"lease_denied\":\n\t\tcase \"status_result\":\n\t\tcase \"clients_result\":\n\t\tcase \"client_access_updated\":\n\t\tcase \"pair_started\":\n\t\t\treturn true;\n\t\tcase \"worktree_result\":\n\t\t\treturn isRecord(value.worktree);\n\t\tcase \"worktrees_result\":\n\t\t\treturn Array.isArray(value.worktrees);\n\t\tcase \"worktree_prune_result\":\n\t\t\treturn Array.isArray(value.results);\n\t\tcase \"worktree_resolve_result\":\n\t\t\treturn (\n\t\t\t\ttypeof value.workspaceName === \"string\" &&\n\t\t\t\ttypeof value.workspacePath === \"string\" &&\n\t\t\t\ttypeof value.worktreeId === \"string\" &&\n\t\t\t\ttypeof value.worktreePath === \"string\"\n\t\t\t);\n\t\tcase \"keep_awake_result\":\n\t\t\treturn isRecord(value.keepAwake);\n\t\tcase \"relay_rpc_result\":\n\t\t\treturn isRecord(value.response);\n\t\tcase \"relay_push_delivery_result\":\n\t\t\treturn isPushDeliveryStatus(value.status);\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\nexport function isControlEvent(value: unknown): value is ControlEvent {\n\tif (!isRecord(value) || typeof value.type !== \"string\") {\n\t\treturn false;\n\t}\n\tswitch (value.type) {\n\t\tcase \"relay_offer\":\n\t\tcase \"relay_closed\":\n\t\tcase \"viewer_event\":\n\t\tcase \"viewer_end\":\n\t\tcase \"theme_snapshot\":\n\t\tcase \"pairing_progress\":\n\t\tcase \"daemon_shutdown\":\n\t\t\treturn true;\n\t\tcase \"keep_awake_changed\":\n\t\t\treturn isRecord(value.keepAwake);\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\nexport function isHelloAck(value: unknown): value is HelloAck {\n\treturn isRecord(value) && value.type === \"hello_ack\" && typeof value.ok === \"boolean\";\n}\n\nexport function isRelayPreamble(value: unknown): value is RelayPreamble {\n\tif (\n\t\t!isRecord(value) ||\n\t\tvalue.type !== \"relay_preamble\" ||\n\t\ttypeof value.relayId !== \"string\" ||\n\t\t!isRecord(value.authorization) ||\n\t\t!isRecord(value.resolvedTarget)\n\t) {\n\t\treturn false;\n\t}\n\ttry {\n\t\tif (typeof value.authorization.allowedTools !== \"string\") {\n\t\t\treturn false;\n\t\t}\n\t\tparseIrohRemoteRpcGrant(value.authorization.rpcGrant, \"relay rpcGrant\");\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n"]}
@@ -0,0 +1,77 @@
1
+ import { type Socket } from "node:net";
2
+ import { CONTROL_MAX_LINE_BYTES, type ControlClientKind, type ControlEvent, type ControlRequest, type ControlResponse, type HelloMessage } from "./control-protocol.ts";
3
+ export interface ControlConnection {
4
+ readonly connectionId: string;
5
+ readonly client: ControlClientKind;
6
+ readonly pid: number;
7
+ readonly version: string;
8
+ /** Capabilities from the control hello (empty for old clients). */
9
+ readonly capabilities: ReadonlySet<string>;
10
+ send(message: ControlResponse | ControlEvent): void;
11
+ close(): void;
12
+ }
13
+ export interface RelayAdmission {
14
+ /** Validate a relay hello; on success the server hands over the raw socket. */
15
+ admitRelay(hello: Extract<HelloMessage, {
16
+ role: "relay";
17
+ }>, socket: Socket, bufferedRemainder: Buffer): boolean;
18
+ }
19
+ export interface ControlServerHandlers {
20
+ /**
21
+ * Handle one request; respond via connection.send (possibly multiple times
22
+ * for provisional responses). Thrown errors become error responses.
23
+ */
24
+ onRequest(connection: ControlConnection, request: ControlRequest): Promise<void> | void;
25
+ onConnectionClosed?(connection: ControlConnection): void;
26
+ relayAdmission?: RelayAdmission;
27
+ /** When true, hellos are rejected with error "shutting_down". */
28
+ isShuttingDown?(): boolean;
29
+ log?(level: "info" | "warn" | "error", message: string): void;
30
+ }
31
+ export interface ControlServerOptions {
32
+ socketPath: string;
33
+ version: string;
34
+ /** Optional local control-plane token published in the daemon pidfile. */
35
+ authToken?: string;
36
+ handlers: ControlServerHandlers;
37
+ }
38
+ export interface ControlServer {
39
+ readonly socketPath: string;
40
+ connections(): ControlConnection[];
41
+ broadcast(event: ControlEvent): void;
42
+ sendTo(connectionId: string, event: ControlEvent): boolean;
43
+ close(): Promise<void>;
44
+ }
45
+ type ControlStatusProbe = ControlResponse & {
46
+ type: "status_result";
47
+ };
48
+ export type ControlSocketProbe = {
49
+ kind: "healthy";
50
+ status: ControlStatusProbe;
51
+ } | {
52
+ kind: "live-rejected";
53
+ reason: "shutting_down" | "protocol_mismatch" | "bad_relay_token" | "auth_failed" | "fatal" | "other";
54
+ error?: string;
55
+ version?: string;
56
+ protocolVersion?: number;
57
+ } | {
58
+ kind: "unresponsive";
59
+ error?: string;
60
+ } | {
61
+ kind: "no-listener";
62
+ cause: "not-found" | "refused" | "reset" | "error";
63
+ error?: string;
64
+ };
65
+ export declare function startControlServer(options: ControlServerOptions): Promise<ControlServer>;
66
+ /**
67
+ * Probe an existing socket with a status request. The result distinguishes a
68
+ * provably dead/stale path from a live daemon that answered but rejected us;
69
+ * callers must only unlink a socket after a no-listener result.
70
+ */
71
+ export declare function probeControlSocket(socketPath: string, options?: {
72
+ version: string;
73
+ timeoutMs?: number;
74
+ authToken?: string;
75
+ }): Promise<ControlSocketProbe>;
76
+ export { CONTROL_MAX_LINE_BYTES };
77
+ //# sourceMappingURL=control-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control-server.d.ts","sourceRoot":"","sources":["../../src/daemon/control-server.ts"],"names":[],"mappings":"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","sourcesContent":["import { chmodSync, lstatSync, rmSync, type Stats } from \"node:fs\";\nimport { createConnection, createServer, type Server, type Socket } from \"node:net\";\nimport {\n\tCONTROL_MAX_LINE_BYTES,\n\ttype ControlClientKind,\n\ttype ControlEvent,\n\tControlLineDecoder,\n\ttype ControlRequest,\n\ttype ControlResponse,\n\tencodeControlLine,\n\ttype HelloAck,\n\ttype HelloMessage,\n\tisControlRequest,\n\tisHelloAck,\n\tPROTOCOL_VERSION,\n\tparseHelloMessage,\n} from \"./control-protocol.ts\";\n\nexport interface ControlConnection {\n\treadonly connectionId: string;\n\treadonly client: ControlClientKind;\n\treadonly pid: number;\n\treadonly version: string;\n\t/** Capabilities from the control hello (empty for old clients). */\n\treadonly capabilities: ReadonlySet<string>;\n\tsend(message: ControlResponse | ControlEvent): void;\n\tclose(): void;\n}\n\nexport interface RelayAdmission {\n\t/** Validate a relay hello; on success the server hands over the raw socket. */\n\tadmitRelay(hello: Extract<HelloMessage, { role: \"relay\" }>, socket: Socket, bufferedRemainder: Buffer): boolean;\n}\n\nexport interface ControlServerHandlers {\n\t/**\n\t * Handle one request; respond via connection.send (possibly multiple times\n\t * for provisional responses). Thrown errors become error responses.\n\t */\n\tonRequest(connection: ControlConnection, request: ControlRequest): Promise<void> | void;\n\tonConnectionClosed?(connection: ControlConnection): void;\n\trelayAdmission?: RelayAdmission;\n\t/** When true, hellos are rejected with error \"shutting_down\". */\n\tisShuttingDown?(): boolean;\n\tlog?(level: \"info\" | \"warn\" | \"error\", message: string): void;\n}\n\nexport interface ControlServerOptions {\n\tsocketPath: string;\n\tversion: string;\n\t/** Optional local control-plane token published in the daemon pidfile. */\n\tauthToken?: string;\n\thandlers: ControlServerHandlers;\n}\n\nexport interface ControlServer {\n\treadonly socketPath: string;\n\tconnections(): ControlConnection[];\n\tbroadcast(event: ControlEvent): void;\n\tsendTo(connectionId: string, event: ControlEvent): boolean;\n\tclose(): Promise<void>;\n}\n\ntype ControlStatusProbe = ControlResponse & { type: \"status_result\" };\n\nexport type ControlSocketProbe =\n\t| { kind: \"healthy\"; status: ControlStatusProbe }\n\t| {\n\t\t\tkind: \"live-rejected\";\n\t\t\treason: \"shutting_down\" | \"protocol_mismatch\" | \"bad_relay_token\" | \"auth_failed\" | \"fatal\" | \"other\";\n\t\t\terror?: string;\n\t\t\tversion?: string;\n\t\t\tprotocolVersion?: number;\n\t }\n\t| { kind: \"unresponsive\"; error?: string }\n\t| { kind: \"no-listener\"; cause: \"not-found\" | \"refused\" | \"reset\" | \"error\"; error?: string };\n\nlet controlConnectionSequence = 0;\n\nexport async function startControlServer(options: ControlServerOptions): Promise<ControlServer> {\n\tconst { socketPath, version, authToken, handlers } = options;\n\tconst connections = new Map<string, ControlConnectionImpl>();\n\n\tclass ControlConnectionImpl implements ControlConnection {\n\t\treadonly connectionId: string;\n\t\treadonly client: ControlClientKind;\n\t\treadonly pid: number;\n\t\treadonly version: string;\n\t\treadonly capabilities: ReadonlySet<string>;\n\t\tprivate readonly socket: Socket;\n\n\t\tconstructor(socket: Socket, hello: Extract<HelloMessage, { role: \"control\" }>) {\n\t\t\tthis.connectionId = `c-${++controlConnectionSequence}`;\n\t\t\tthis.client = hello.client;\n\t\t\tthis.pid = hello.pid;\n\t\t\tthis.version = hello.version;\n\t\t\tthis.capabilities = new Set(hello.capabilities ?? []);\n\t\t\tthis.socket = socket;\n\t\t}\n\n\t\tsend(message: ControlResponse | ControlEvent): void {\n\t\t\tif (!this.socket.destroyed) {\n\t\t\t\tthis.socket.write(encodeControlLine(message));\n\t\t\t}\n\t\t}\n\n\t\tclose(): void {\n\t\t\tthis.socket.destroy();\n\t\t}\n\t}\n\n\tconst server: Server = createServer((socket) => {\n\t\tconst decoder = new ControlLineDecoder();\n\t\tlet established: ControlConnectionImpl | undefined;\n\t\tlet handedOffToRelay = false;\n\n\t\tconst fatal = (error: string) => {\n\t\t\ttry {\n\t\t\t\tsocket.write(encodeControlLine({ type: \"fatal\", error }));\n\t\t\t} catch {\n\t\t\t\t// best-effort\n\t\t\t}\n\t\t\tsocket.destroy();\n\t\t};\n\n\t\tconst handleHello = (hello: HelloMessage | undefined): boolean => {\n\t\t\tif (!hello) {\n\t\t\t\tfatal(\"invalid_hello\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (handlers.isShuttingDown?.()) {\n\t\t\t\tconst ack: HelloAck = {\n\t\t\t\t\ttype: \"hello_ack\",\n\t\t\t\t\tok: false,\n\t\t\t\t\terror: \"shutting_down\",\n\t\t\t\t\tversion,\n\t\t\t\t\tprotocolVersion: PROTOCOL_VERSION,\n\t\t\t\t};\n\t\t\t\tsocket.end(encodeControlLine(ack));\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (hello.protocolVersion !== PROTOCOL_VERSION) {\n\t\t\t\tconst ack: HelloAck = {\n\t\t\t\t\ttype: \"hello_ack\",\n\t\t\t\t\tok: false,\n\t\t\t\t\terror: \"protocol_mismatch\",\n\t\t\t\t\tversion,\n\t\t\t\t\tprotocolVersion: PROTOCOL_VERSION,\n\t\t\t\t};\n\t\t\t\tsocket.end(encodeControlLine(ack));\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (hello.role === \"control\" && authToken !== undefined && hello.controlToken !== authToken) {\n\t\t\t\tconst ack: HelloAck = {\n\t\t\t\t\ttype: \"hello_ack\",\n\t\t\t\t\tok: false,\n\t\t\t\t\terror: \"auth_failed\",\n\t\t\t\t\tversion,\n\t\t\t\t\tprotocolVersion: PROTOCOL_VERSION,\n\t\t\t\t};\n\t\t\t\tsocket.end(encodeControlLine(ack));\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (hello.role === \"relay\") {\n\t\t\t\tconst remainder = decoder.drainRemainder();\n\t\t\t\tsocket.removeListener(\"data\", onData);\n\t\t\t\thandedOffToRelay = true;\n\t\t\t\tlet admitted = false;\n\t\t\t\ttry {\n\t\t\t\t\tadmitted = handlers.relayAdmission?.admitRelay(hello, socket, remainder) ?? false;\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// admitRelay may have partly taken ownership of the socket before\n\t\t\t\t\t// throwing, and the socket now carries raw relay bytes — so a\n\t\t\t\t\t// synchronous failure must NOT fall through to onData's generic catch,\n\t\t\t\t\t// which would inject a misleading fatal(\"frame_too_large\") control\n\t\t\t\t\t// frame into the raw stream and destroy a socket the relay path may\n\t\t\t\t\t// own. Log the real reason and tear down cleanly instead.\n\t\t\t\t\thandlers.log?.(\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t\t`relay admission threw: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t);\n\t\t\t\t\tsocket.destroy();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (!admitted) {\n\t\t\t\t\tconst ack: HelloAck = { type: \"hello_ack\", ok: false, error: \"bad_relay_token\" };\n\t\t\t\t\tsocket.end(encodeControlLine(ack));\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\testablished = new ControlConnectionImpl(socket, hello);\n\t\t\tconnections.set(established.connectionId, established);\n\t\t\tconst ack: HelloAck = {\n\t\t\t\ttype: \"hello_ack\",\n\t\t\t\tok: true,\n\t\t\t\tconnectionId: established.connectionId,\n\t\t\t\tversion,\n\t\t\t\tprotocolVersion: PROTOCOL_VERSION,\n\t\t\t};\n\t\t\tsocket.write(encodeControlLine(ack));\n\t\t\treturn true;\n\t\t};\n\n\t\tconst handleMessage = (message: unknown): void => {\n\t\t\tconst connection = established;\n\t\t\tif (!connection) {\n\t\t\t\tif (!handleHello(parseHelloMessage(message))) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!isControlRequest(message)) {\n\t\t\t\tconst id =\n\t\t\t\t\ttypeof message === \"object\" && message !== null && typeof (message as { id?: unknown }).id === \"string\"\n\t\t\t\t\t\t? ((message as { id: string }).id ?? \"\")\n\t\t\t\t\t\t: \"\";\n\t\t\t\tconnection.send({ type: \"error\", id, code: \"invalid_request\", message: \"unrecognized control request\" });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tPromise.resolve(handlers.onRequest(connection, message)).catch((error) => {\n\t\t\t\tconnection.send({\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\tid: message.id,\n\t\t\t\t\tcode: \"internal_error\",\n\t\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t\t});\n\t\t\t});\n\t\t};\n\n\t\tconst onData = (chunk: Buffer) => {\n\t\t\ttry {\n\t\t\t\t// One line at a time: a relay hello hands the socket off mid-chunk and\n\t\t\t\t// any trailing bytes must stay undecoded (they are raw relay payload).\n\t\t\t\tdecoder.pushEach(chunk, (message) => {\n\t\t\t\t\thandleMessage(message);\n\t\t\t\t\treturn handedOffToRelay ? \"stop\" : \"continue\";\n\t\t\t\t});\n\t\t\t} catch {\n\t\t\t\tfatal(\"frame_too_large\");\n\t\t\t}\n\t\t};\n\n\t\tsocket.on(\"data\", onData);\n\t\tsocket.on(\"error\", () => {\n\t\t\tsocket.destroy();\n\t\t});\n\t\tsocket.on(\"close\", () => {\n\t\t\tif (established) {\n\t\t\t\tconnections.delete(established.connectionId);\n\t\t\t\thandlers.onConnectionClosed?.(established);\n\t\t\t}\n\t\t});\n\t});\n\n\tserver.maxConnections = 256;\n\n\tawait new Promise<void>((resolve, reject) => {\n\t\tserver.once(\"error\", reject);\n\t\tserver.listen(socketPath, () => {\n\t\t\tserver.removeListener(\"error\", reject);\n\t\t\tresolve();\n\t\t});\n\t});\n\tlet boundSocketStats: Stats | undefined;\n\ttry {\n\t\tboundSocketStats = lstatSync(socketPath);\n\t} catch {\n\t\t// Best-effort ownership check: close() will skip unlinking when it cannot\n\t\t// prove the path still belongs to this server.\n\t}\n\ttry {\n\t\tchmodSync(socketPath, 0o600);\n\t} catch {\n\t\t// The socket may live on a filesystem without chmod support; directory perms still apply.\n\t}\n\n\treturn {\n\t\tsocketPath,\n\t\tconnections() {\n\t\t\treturn Array.from(connections.values());\n\t\t},\n\t\tbroadcast(event: ControlEvent) {\n\t\t\tfor (const connection of connections.values()) {\n\t\t\t\tconnection.send(event);\n\t\t\t}\n\t\t},\n\t\tsendTo(connectionId: string, event: ControlEvent) {\n\t\t\tconst connection = connections.get(connectionId);\n\t\t\tif (!connection) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconnection.send(event);\n\t\t\treturn true;\n\t\t},\n\t\tasync close() {\n\t\t\tfor (const connection of connections.values()) {\n\t\t\t\tconnection.close();\n\t\t\t}\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tserver.close(() => resolve());\n\t\t\t});\n\t\t\tif (process.platform !== \"win32\" && boundSocketStats) {\n\t\t\t\ttry {\n\t\t\t\t\tconst currentStats = lstatSync(socketPath);\n\t\t\t\t\tif (\n\t\t\t\t\t\tcurrentStats.isSocket() &&\n\t\t\t\t\t\tcurrentStats.dev === boundSocketStats.dev &&\n\t\t\t\t\t\tcurrentStats.ino === boundSocketStats.ino\n\t\t\t\t\t) {\n\t\t\t\t\t\trmSync(socketPath, { force: true });\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Already gone or not ours.\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * Probe an existing socket with a status request. The result distinguishes a\n * provably dead/stale path from a live daemon that answered but rejected us;\n * callers must only unlink a socket after a no-listener result.\n */\nexport async function probeControlSocket(\n\tsocketPath: string,\n\toptions: { version: string; timeoutMs?: number; authToken?: string } = { version: \"0.0.0\" },\n): Promise<ControlSocketProbe> {\n\tconst timeoutMs = options.timeoutMs ?? 2000;\n\treturn new Promise((resolve) => {\n\t\tlet settled = false;\n\t\tlet connected = false;\n\t\tlet lastError: Error | undefined;\n\t\tconst classifyNoListener = (error: Error | undefined): ControlSocketProbe => {\n\t\t\tconst code = error instanceof Error && \"code\" in error ? (error as NodeJS.ErrnoException).code : undefined;\n\t\t\tif (code === \"ENOENT\") {\n\t\t\t\treturn { kind: \"no-listener\", cause: \"not-found\", ...(error ? { error: error.message } : {}) };\n\t\t\t}\n\t\t\tif (code === \"ECONNREFUSED\") {\n\t\t\t\treturn { kind: \"no-listener\", cause: \"refused\", ...(error ? { error: error.message } : {}) };\n\t\t\t}\n\t\t\tif (code === \"ECONNRESET\") {\n\t\t\t\treturn { kind: \"no-listener\", cause: \"reset\", ...(error ? { error: error.message } : {}) };\n\t\t\t}\n\t\t\treturn { kind: \"no-listener\", cause: \"error\", ...(error ? { error: error.message } : {}) };\n\t\t};\n\t\tconst settle = (value: ControlSocketProbe) => {\n\t\t\tif (settled) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsettled = true;\n\t\t\tclearTimeout(timer);\n\t\t\tsocket.destroy();\n\t\t\tresolve(value);\n\t\t};\n\t\tconst timer = setTimeout(() => settle({ kind: \"unresponsive\" }), timeoutMs);\n\t\tconst socket = createConnection(socketPath);\n\t\tconst decoder = new ControlLineDecoder();\n\t\tsocket.on(\"error\", (error) => {\n\t\t\tlastError = error instanceof Error ? error : new Error(String(error));\n\t\t\tsettle(connected ? { kind: \"unresponsive\", error: lastError.message } : classifyNoListener(lastError));\n\t\t});\n\t\tsocket.on(\"close\", () => {\n\t\t\tsettle(\n\t\t\t\tconnected\n\t\t\t\t\t? { kind: \"unresponsive\", ...(lastError ? { error: lastError.message } : {}) }\n\t\t\t\t\t: classifyNoListener(lastError),\n\t\t\t);\n\t\t});\n\t\tsocket.on(\"connect\", () => {\n\t\t\tconnected = true;\n\t\t\tconst hello: HelloMessage = {\n\t\t\t\ttype: \"hello\",\n\t\t\t\trole: \"control\",\n\t\t\t\tprotocolVersion: PROTOCOL_VERSION,\n\t\t\t\tpid: process.pid,\n\t\t\t\tversion: options.version,\n\t\t\t\tclient: \"cli\",\n\t\t\t\t...(options.authToken === undefined ? {} : { controlToken: options.authToken }),\n\t\t\t};\n\t\t\tsocket.write(encodeControlLine(hello));\n\t\t\tsocket.write(encodeControlLine({ type: \"status\", id: \"probe\" }));\n\t\t});\n\t\tsocket.on(\"data\", (chunk) => {\n\t\t\tlet messages: unknown[];\n\t\t\ttry {\n\t\t\t\tmessages = decoder.push(chunk);\n\t\t\t} catch (error) {\n\t\t\t\tsettle({ kind: \"unresponsive\", error: error instanceof Error ? error.message : String(error) });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfor (const message of messages) {\n\t\t\t\tif (isControlStatusProbe(message)) {\n\t\t\t\t\tsettle({ kind: \"healthy\", status: message });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (isHelloAck(message) && !message.ok) {\n\t\t\t\t\tsettle({\n\t\t\t\t\t\tkind: \"live-rejected\",\n\t\t\t\t\t\treason: message.error ?? \"other\",\n\t\t\t\t\t\t...(message.error === undefined ? {} : { error: message.error }),\n\t\t\t\t\t\t...(message.version === undefined ? {} : { version: message.version }),\n\t\t\t\t\t\t...(message.protocolVersion === undefined ? {} : { protocolVersion: message.protocolVersion }),\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (typeof message === \"object\" && message !== null && (message as { type?: unknown }).type === \"fatal\") {\n\t\t\t\t\tconst error = (message as { error?: unknown }).error;\n\t\t\t\t\tsettle({ kind: \"live-rejected\", reason: \"fatal\", ...(typeof error === \"string\" ? { error } : {}) });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\nfunction isControlStatusProbe(value: unknown): value is ControlStatusProbe {\n\treturn typeof value === \"object\" && value !== null && (value as { type?: unknown }).type === \"status_result\";\n}\n\nexport { CONTROL_MAX_LINE_BYTES };\n"]}