@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,326 @@
1
+ import { createHash } from "node:crypto";
2
+ import { chmod, lstat, mkdir, rm } from "node:fs/promises";
3
+ import { connect } from "node:net";
4
+ import { tmpdir } from "node:os";
5
+ import { basename, dirname, join } from "node:path";
6
+ import { isIrohRemoteRelayMode } from "./protocol.js";
7
+ export const IROH_REMOTE_PAIR_CONTROL_REQUEST_TYPE = "volt_iroh_pair_request";
8
+ export const IROH_REMOTE_PAIR_CONTROL_RESPONSE_TYPE = "volt_iroh_pair_response";
9
+ export const IROH_REMOTE_REVOKE_CONTROL_REQUEST_TYPE = "volt_iroh_revoke_request";
10
+ export const IROH_REMOTE_REVOKE_CONTROL_RESPONSE_TYPE = "volt_iroh_revoke_response";
11
+ export const DEFAULT_IROH_REMOTE_CONTROL_TIMEOUT_MS = 5_000;
12
+ const DEFAULT_IROH_REMOTE_CONTROL_ACTIVE_RETRY_ATTEMPTS = 10;
13
+ const DEFAULT_IROH_REMOTE_CONTROL_ACTIVE_RETRY_DELAY_MS = 250;
14
+ const IROH_REMOTE_CONTROL_ROOT_DIR = "volt-iroh-remote";
15
+ const IROH_REMOTE_UNIX_CONTROL_PATH_MAX_BYTES = 100;
16
+ export function getIrohRemoteControlPath(statePath) {
17
+ const hash = createHash("sha256").update(statePath).digest("hex").slice(0, 32);
18
+ if (process.platform === "win32") {
19
+ return `\\\\.\\pipe\\volt-iroh-remote-${hash}`;
20
+ }
21
+ const defaultPath = join(tmpdir(), IROH_REMOTE_CONTROL_ROOT_DIR, hash, "control.sock");
22
+ if (Buffer.byteLength(defaultPath, "utf8") <= IROH_REMOTE_UNIX_CONTROL_PATH_MAX_BYTES) {
23
+ return defaultPath;
24
+ }
25
+ return join("/tmp", IROH_REMOTE_CONTROL_ROOT_DIR, hash, "control.sock");
26
+ }
27
+ export async function ensureIrohRemoteControlDirectory(controlPath) {
28
+ if (process.platform === "win32") {
29
+ return;
30
+ }
31
+ const controlDir = dirname(controlPath);
32
+ const controlRootDir = dirname(controlDir);
33
+ if (basename(controlRootDir) === IROH_REMOTE_CONTROL_ROOT_DIR) {
34
+ await ensureOwnerOnlyIrohRemoteControlDirectory(controlRootDir);
35
+ }
36
+ await ensureOwnerOnlyIrohRemoteControlDirectory(controlDir);
37
+ }
38
+ export async function listenIrohRemoteControlServer(server, controlPath, options = {}) {
39
+ await ensureIrohRemoteControlDirectory(controlPath);
40
+ const activeRetryAttempts = options.activeRetryAttempts ?? DEFAULT_IROH_REMOTE_CONTROL_ACTIVE_RETRY_ATTEMPTS;
41
+ const activeRetryDelayMs = options.activeRetryDelayMs ?? DEFAULT_IROH_REMOTE_CONTROL_ACTIVE_RETRY_DELAY_MS;
42
+ for (let attempt = 0;; attempt += 1) {
43
+ try {
44
+ await listenServer(server, controlPath);
45
+ return;
46
+ }
47
+ catch (error) {
48
+ if (process.platform === "win32" || !(error instanceof Error) || !isNodeErrorCode(error, "EADDRINUSE")) {
49
+ throw error;
50
+ }
51
+ if (await canConnectToControlPath(controlPath)) {
52
+ if (attempt < activeRetryAttempts) {
53
+ await delay(activeRetryDelayMs);
54
+ continue;
55
+ }
56
+ throw new Error(`Iroh remote host control channel is already active for this state path: ${controlPath}`);
57
+ }
58
+ await rm(controlPath, { force: true });
59
+ }
60
+ }
61
+ }
62
+ function listenServer(server, controlPath) {
63
+ return new Promise((resolveListen, rejectListen) => {
64
+ const cleanup = () => {
65
+ server.off("error", handleError);
66
+ server.off("listening", handleListening);
67
+ };
68
+ const handleError = (error) => {
69
+ cleanup();
70
+ rejectListen(error);
71
+ };
72
+ const handleListening = () => {
73
+ cleanup();
74
+ resolveListen();
75
+ };
76
+ server.once("error", handleError);
77
+ server.once("listening", handleListening);
78
+ try {
79
+ server.listen(controlPath);
80
+ }
81
+ catch (error) {
82
+ cleanup();
83
+ rejectListen(error instanceof Error ? error : new Error(String(error)));
84
+ }
85
+ });
86
+ }
87
+ function canConnectToControlPath(controlPath) {
88
+ return new Promise((resolveConnect) => {
89
+ const socket = connect(controlPath);
90
+ let settled = false;
91
+ const finish = (canConnect) => {
92
+ if (settled)
93
+ return;
94
+ settled = true;
95
+ clearTimeout(timeout);
96
+ socket.destroy();
97
+ resolveConnect(canConnect);
98
+ };
99
+ const timeout = setTimeout(() => finish(false), 250);
100
+ socket.once("connect", () => finish(true));
101
+ socket.once("error", () => finish(false));
102
+ });
103
+ }
104
+ function delay(ms) {
105
+ return new Promise((resolveDelay) => {
106
+ setTimeout(resolveDelay, ms);
107
+ });
108
+ }
109
+ function isNodeErrorCode(error, code) {
110
+ return "code" in error && error.code === code;
111
+ }
112
+ async function ensureOwnerOnlyIrohRemoteControlDirectory(path) {
113
+ await mkdir(path, { recursive: true, mode: 0o700 });
114
+ const pathStat = await lstat(path);
115
+ if (!pathStat.isDirectory() || pathStat.isSymbolicLink()) {
116
+ throw new Error(`Iroh remote host control directory is not a directory: ${path}`);
117
+ }
118
+ const currentUid = process.getuid?.();
119
+ if (currentUid !== undefined && pathStat.uid !== currentUid) {
120
+ throw new Error(`Iroh remote host control directory is owned by another user: ${path}`);
121
+ }
122
+ if ((pathStat.mode & 0o777) !== 0o700) {
123
+ await chmod(path, 0o700);
124
+ }
125
+ }
126
+ export function parseIrohRemoteControlRequest(value) {
127
+ const request = expectRecord(value, "Iroh remote control request");
128
+ const type = expectString(request.type, "control request type");
129
+ if (type === IROH_REMOTE_PAIR_CONTROL_REQUEST_TYPE) {
130
+ return parseIrohRemotePairControlRequestRecord(request);
131
+ }
132
+ if (type === IROH_REMOTE_REVOKE_CONTROL_REQUEST_TYPE) {
133
+ return parseIrohRemoteRevokeControlRequestRecord(request);
134
+ }
135
+ throw new Error(`Unsupported Iroh remote control request type: ${type}`);
136
+ }
137
+ export function parseIrohRemotePairControlRequest(value) {
138
+ return parseIrohRemotePairControlRequestRecord(expectRecord(value, "Iroh remote pair control request"));
139
+ }
140
+ function parseIrohRemotePairControlRequestRecord(request) {
141
+ const type = expectString(request.type, "pair control request type");
142
+ if (type !== IROH_REMOTE_PAIR_CONTROL_REQUEST_TYPE) {
143
+ throw new Error(`Unsupported Iroh remote pair control request type: ${type}`);
144
+ }
145
+ const relayMode = expectOptionalRelayMode(request.relayMode, "pair control request relayMode");
146
+ const unsafeApproval = expectOptionalUnsafeApproval(request.unsafeApproval, "pair control request unsafeApproval");
147
+ const allowTools = expectOptionalString(request.allowTools, "pair control request allowTools");
148
+ const labelHint = expectOptionalString(request.labelHint, "pair control request labelHint");
149
+ const ttlMs = expectOptionalPositiveNumber(request.ttlMs, "pair control request ttlMs");
150
+ return {
151
+ type: IROH_REMOTE_PAIR_CONTROL_REQUEST_TYPE,
152
+ workspace: expectString(request.workspace, "pair control request workspace"),
153
+ ...(allowTools === undefined ? {} : { allowTools }),
154
+ ...(labelHint === undefined ? {} : { labelHint }),
155
+ ...(relayMode === undefined ? {} : { relayMode }),
156
+ ...(ttlMs === undefined ? {} : { ttlMs }),
157
+ ...(unsafeApproval === undefined ? {} : { unsafeApproval }),
158
+ };
159
+ }
160
+ export function parseIrohRemoteRevokeControlRequest(value) {
161
+ return parseIrohRemoteRevokeControlRequestRecord(expectRecord(value, "Iroh remote revoke control request"));
162
+ }
163
+ function parseIrohRemoteRevokeControlRequestRecord(request) {
164
+ const type = expectString(request.type, "revoke control request type");
165
+ if (type !== IROH_REMOTE_REVOKE_CONTROL_REQUEST_TYPE) {
166
+ throw new Error(`Unsupported Iroh remote revoke control request type: ${type}`);
167
+ }
168
+ return {
169
+ type: IROH_REMOTE_REVOKE_CONTROL_REQUEST_TYPE,
170
+ nodeId: expectString(request.nodeId, "revoke control request nodeId"),
171
+ };
172
+ }
173
+ export function parseIrohRemotePairControlResponse(value) {
174
+ const response = expectRecord(value, "Iroh remote pair control response");
175
+ const type = expectString(response.type, "pair control response type");
176
+ if (type !== IROH_REMOTE_PAIR_CONTROL_RESPONSE_TYPE) {
177
+ throw new Error(`Unsupported Iroh remote control response type: ${type}`);
178
+ }
179
+ const success = expectBoolean(response.success, "pair control response success");
180
+ if (!success) {
181
+ return {
182
+ type: IROH_REMOTE_PAIR_CONTROL_RESPONSE_TYPE,
183
+ success: false,
184
+ error: expectString(response.error, "pair control response error"),
185
+ };
186
+ }
187
+ const expiresAt = expectPositiveNumber(response.expiresAt, "pair control response expiresAt");
188
+ return {
189
+ type: IROH_REMOTE_PAIR_CONTROL_RESPONSE_TYPE,
190
+ success: true,
191
+ expiresAt,
192
+ ticket: expectString(response.ticket, "pair control response ticket"),
193
+ };
194
+ }
195
+ export function parseIrohRemoteRevokeControlResponse(value) {
196
+ const response = expectRecord(value, "Iroh remote revoke control response");
197
+ const type = expectString(response.type, "revoke control response type");
198
+ if (type !== IROH_REMOTE_REVOKE_CONTROL_RESPONSE_TYPE) {
199
+ throw new Error(`Unsupported Iroh remote revoke control response type: ${type}`);
200
+ }
201
+ const success = expectBoolean(response.success, "revoke control response success");
202
+ if (!success) {
203
+ return {
204
+ type: IROH_REMOTE_REVOKE_CONTROL_RESPONSE_TYPE,
205
+ success: false,
206
+ error: expectString(response.error, "revoke control response error"),
207
+ };
208
+ }
209
+ return {
210
+ type: IROH_REMOTE_REVOKE_CONTROL_RESPONSE_TYPE,
211
+ success: true,
212
+ closed: expectBoolean(response.closed, "revoke control response closed"),
213
+ closedCount: expectNonNegativeNumber(response.closedCount, "revoke control response closedCount"),
214
+ };
215
+ }
216
+ export async function requestIrohRemotePairingTicket(options) {
217
+ return await requestIrohRemoteControl(options, parseIrohRemotePairControlResponse);
218
+ }
219
+ export async function requestIrohRemoteActiveRevocation(options) {
220
+ return await requestIrohRemoteControl(options, parseIrohRemoteRevokeControlResponse);
221
+ }
222
+ async function requestIrohRemoteControl(options, parseResponse) {
223
+ const controlPath = getIrohRemoteControlPath(options.statePath);
224
+ const timeoutMs = options.timeoutMs ?? DEFAULT_IROH_REMOTE_CONTROL_TIMEOUT_MS;
225
+ const socket = connect(controlPath);
226
+ socket.setEncoding("utf8");
227
+ return await new Promise((resolve, reject) => {
228
+ let buffer = "";
229
+ let settled = false;
230
+ const timeout = setTimeout(() => {
231
+ finish(undefined, new Error("Timed out waiting for a running Iroh remote host control response"));
232
+ }, timeoutMs);
233
+ const finish = (response, error) => {
234
+ if (settled)
235
+ return;
236
+ settled = true;
237
+ clearTimeout(timeout);
238
+ socket.destroy();
239
+ if (error) {
240
+ reject(error);
241
+ return;
242
+ }
243
+ if (!response) {
244
+ reject(new Error("Iroh remote host control channel closed without a response"));
245
+ return;
246
+ }
247
+ resolve(response);
248
+ };
249
+ socket.once("connect", () => {
250
+ socket.write(`${JSON.stringify(options.request)}\n`);
251
+ });
252
+ socket.on("data", (chunk) => {
253
+ buffer += chunk;
254
+ const newlineIndex = buffer.indexOf("\n");
255
+ if (newlineIndex === -1)
256
+ return;
257
+ try {
258
+ finish(parseResponse(JSON.parse(buffer.slice(0, newlineIndex))));
259
+ }
260
+ catch (error) {
261
+ finish(undefined, error instanceof Error ? error : new Error(String(error)));
262
+ }
263
+ });
264
+ socket.once("error", (error) => {
265
+ finish(undefined, new Error(`No running Iroh remote host control channel is available (${error.message})`));
266
+ });
267
+ socket.once("end", () => finish());
268
+ });
269
+ }
270
+ function expectRecord(value, description) {
271
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
272
+ throw new Error(`${description} must be an object`);
273
+ }
274
+ return value;
275
+ }
276
+ function expectString(value, description) {
277
+ if (typeof value !== "string" || value.length === 0) {
278
+ throw new Error(`${description} must be a non-empty string`);
279
+ }
280
+ return value;
281
+ }
282
+ function expectOptionalString(value, description) {
283
+ if (value === undefined)
284
+ return undefined;
285
+ return expectString(value, description);
286
+ }
287
+ function expectBoolean(value, description) {
288
+ if (typeof value !== "boolean") {
289
+ throw new Error(`${description} must be a boolean`);
290
+ }
291
+ return value;
292
+ }
293
+ function expectPositiveNumber(value, description) {
294
+ if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
295
+ throw new Error(`${description} must be a positive number`);
296
+ }
297
+ return value;
298
+ }
299
+ function expectNonNegativeNumber(value, description) {
300
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 0) {
301
+ throw new Error(`${description} must be a non-negative number`);
302
+ }
303
+ return value;
304
+ }
305
+ function expectOptionalPositiveNumber(value, description) {
306
+ if (value === undefined)
307
+ return undefined;
308
+ return expectPositiveNumber(value, description);
309
+ }
310
+ function expectOptionalRelayMode(value, description) {
311
+ if (value === undefined)
312
+ return undefined;
313
+ if (!isIrohRemoteRelayMode(value)) {
314
+ throw new Error(`${description} must be disabled, development, or production`);
315
+ }
316
+ return value;
317
+ }
318
+ function expectOptionalUnsafeApproval(value, description) {
319
+ if (value === undefined)
320
+ return undefined;
321
+ if (value !== "tty_confirmation" && value !== "yes_flag") {
322
+ throw new Error(`${description} must be tty_confirmation or yes_flag`);
323
+ }
324
+ return value;
325
+ }
326
+ //# sourceMappingURL=control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control.js","sourceRoot":"","sources":["../../../../src/core/remote/iroh/control.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { chmod, lstat, mkdir, rm } from \"node:fs/promises\";\nimport { connect, type Server } from \"node:net\";\nimport { tmpdir } from \"node:os\";\nimport { basename, dirname, join } from \"node:path\";\nimport { type IrohRemoteRelayMode, isIrohRemoteRelayMode } from \"./protocol.ts\";\n\nexport const IROH_REMOTE_PAIR_CONTROL_REQUEST_TYPE = \"volt_iroh_pair_request\";\nexport const IROH_REMOTE_PAIR_CONTROL_RESPONSE_TYPE = \"volt_iroh_pair_response\";\nexport const IROH_REMOTE_REVOKE_CONTROL_REQUEST_TYPE = \"volt_iroh_revoke_request\";\nexport const IROH_REMOTE_REVOKE_CONTROL_RESPONSE_TYPE = \"volt_iroh_revoke_response\";\nexport const DEFAULT_IROH_REMOTE_CONTROL_TIMEOUT_MS = 5_000;\n\nconst DEFAULT_IROH_REMOTE_CONTROL_ACTIVE_RETRY_ATTEMPTS = 10;\nconst DEFAULT_IROH_REMOTE_CONTROL_ACTIVE_RETRY_DELAY_MS = 250;\nconst IROH_REMOTE_CONTROL_ROOT_DIR = \"volt-iroh-remote\";\nconst IROH_REMOTE_UNIX_CONTROL_PATH_MAX_BYTES = 100;\n\nexport type IrohRemoteUnsafeApproval = \"tty_confirmation\" | \"yes_flag\";\n\nexport interface IrohRemotePairControlRequest {\n\ttype: typeof IROH_REMOTE_PAIR_CONTROL_REQUEST_TYPE;\n\tallowTools?: string;\n\tlabelHint?: string;\n\trelayMode?: IrohRemoteRelayMode;\n\tttlMs?: number;\n\tunsafeApproval?: IrohRemoteUnsafeApproval;\n\tworkspace: string;\n}\n\nexport interface IrohRemoteRevokeControlRequest {\n\ttype: typeof IROH_REMOTE_REVOKE_CONTROL_REQUEST_TYPE;\n\tnodeId: string;\n}\n\nexport type IrohRemoteControlRequest = IrohRemotePairControlRequest | IrohRemoteRevokeControlRequest;\n\nexport type IrohRemotePairControlResponse =\n\t| {\n\t\t\ttype: typeof IROH_REMOTE_PAIR_CONTROL_RESPONSE_TYPE;\n\t\t\tsuccess: true;\n\t\t\texpiresAt: number;\n\t\t\tticket: string;\n\t }\n\t| {\n\t\t\ttype: typeof IROH_REMOTE_PAIR_CONTROL_RESPONSE_TYPE;\n\t\t\tsuccess: false;\n\t\t\terror: string;\n\t };\n\nexport type IrohRemoteRevokeControlResponse =\n\t| {\n\t\t\ttype: typeof IROH_REMOTE_REVOKE_CONTROL_RESPONSE_TYPE;\n\t\t\tsuccess: true;\n\t\t\tclosed: boolean;\n\t\t\tclosedCount: number;\n\t }\n\t| {\n\t\t\ttype: typeof IROH_REMOTE_REVOKE_CONTROL_RESPONSE_TYPE;\n\t\t\tsuccess: false;\n\t\t\terror: string;\n\t };\n\nexport interface IrohRemoteControlClientOptions<Request extends IrohRemoteControlRequest> {\n\trequest: Request;\n\tstatePath: string;\n\ttimeoutMs?: number;\n}\n\nexport interface IrohRemoteControlServerListenOptions {\n\tactiveRetryAttempts?: number;\n\tactiveRetryDelayMs?: number;\n}\n\nexport type IrohRemotePairControlClientOptions = IrohRemoteControlClientOptions<IrohRemotePairControlRequest>;\nexport type IrohRemoteRevokeControlClientOptions = IrohRemoteControlClientOptions<IrohRemoteRevokeControlRequest>;\n\nexport function getIrohRemoteControlPath(statePath: string): string {\n\tconst hash = createHash(\"sha256\").update(statePath).digest(\"hex\").slice(0, 32);\n\tif (process.platform === \"win32\") {\n\t\treturn `\\\\\\\\.\\\\pipe\\\\volt-iroh-remote-${hash}`;\n\t}\n\tconst defaultPath = join(tmpdir(), IROH_REMOTE_CONTROL_ROOT_DIR, hash, \"control.sock\");\n\tif (Buffer.byteLength(defaultPath, \"utf8\") <= IROH_REMOTE_UNIX_CONTROL_PATH_MAX_BYTES) {\n\t\treturn defaultPath;\n\t}\n\treturn join(\"/tmp\", IROH_REMOTE_CONTROL_ROOT_DIR, hash, \"control.sock\");\n}\n\nexport async function ensureIrohRemoteControlDirectory(controlPath: string): Promise<void> {\n\tif (process.platform === \"win32\") {\n\t\treturn;\n\t}\n\tconst controlDir = dirname(controlPath);\n\tconst controlRootDir = dirname(controlDir);\n\tif (basename(controlRootDir) === IROH_REMOTE_CONTROL_ROOT_DIR) {\n\t\tawait ensureOwnerOnlyIrohRemoteControlDirectory(controlRootDir);\n\t}\n\tawait ensureOwnerOnlyIrohRemoteControlDirectory(controlDir);\n}\n\nexport async function listenIrohRemoteControlServer(\n\tserver: Server,\n\tcontrolPath: string,\n\toptions: IrohRemoteControlServerListenOptions = {},\n): Promise<void> {\n\tawait ensureIrohRemoteControlDirectory(controlPath);\n\tconst activeRetryAttempts = options.activeRetryAttempts ?? DEFAULT_IROH_REMOTE_CONTROL_ACTIVE_RETRY_ATTEMPTS;\n\tconst activeRetryDelayMs = options.activeRetryDelayMs ?? DEFAULT_IROH_REMOTE_CONTROL_ACTIVE_RETRY_DELAY_MS;\n\tfor (let attempt = 0; ; attempt += 1) {\n\t\ttry {\n\t\t\tawait listenServer(server, controlPath);\n\t\t\treturn;\n\t\t} catch (error) {\n\t\t\tif (process.platform === \"win32\" || !(error instanceof Error) || !isNodeErrorCode(error, \"EADDRINUSE\")) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tif (await canConnectToControlPath(controlPath)) {\n\t\t\t\tif (attempt < activeRetryAttempts) {\n\t\t\t\t\tawait delay(activeRetryDelayMs);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tthrow new Error(`Iroh remote host control channel is already active for this state path: ${controlPath}`);\n\t\t\t}\n\t\t\tawait rm(controlPath, { force: true });\n\t\t}\n\t}\n}\n\nfunction listenServer(server: Server, controlPath: string): Promise<void> {\n\treturn new Promise((resolveListen, rejectListen) => {\n\t\tconst cleanup = () => {\n\t\t\tserver.off(\"error\", handleError);\n\t\t\tserver.off(\"listening\", handleListening);\n\t\t};\n\t\tconst handleError = (error: Error) => {\n\t\t\tcleanup();\n\t\t\trejectListen(error);\n\t\t};\n\t\tconst handleListening = () => {\n\t\t\tcleanup();\n\t\t\tresolveListen();\n\t\t};\n\t\tserver.once(\"error\", handleError);\n\t\tserver.once(\"listening\", handleListening);\n\t\ttry {\n\t\t\tserver.listen(controlPath);\n\t\t} catch (error) {\n\t\t\tcleanup();\n\t\t\trejectListen(error instanceof Error ? error : new Error(String(error)));\n\t\t}\n\t});\n}\n\nfunction canConnectToControlPath(controlPath: string): Promise<boolean> {\n\treturn new Promise((resolveConnect) => {\n\t\tconst socket = connect(controlPath);\n\t\tlet settled = false;\n\t\tconst finish = (canConnect: boolean) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tclearTimeout(timeout);\n\t\t\tsocket.destroy();\n\t\t\tresolveConnect(canConnect);\n\t\t};\n\t\tconst timeout = setTimeout(() => finish(false), 250);\n\t\tsocket.once(\"connect\", () => finish(true));\n\t\tsocket.once(\"error\", () => finish(false));\n\t});\n}\n\nfunction delay(ms: number): Promise<void> {\n\treturn new Promise((resolveDelay) => {\n\t\tsetTimeout(resolveDelay, ms);\n\t});\n}\n\nfunction isNodeErrorCode(error: Error, code: string): boolean {\n\treturn \"code\" in error && error.code === code;\n}\n\nasync function ensureOwnerOnlyIrohRemoteControlDirectory(path: string): Promise<void> {\n\tawait mkdir(path, { recursive: true, mode: 0o700 });\n\tconst pathStat = await lstat(path);\n\tif (!pathStat.isDirectory() || pathStat.isSymbolicLink()) {\n\t\tthrow new Error(`Iroh remote host control directory is not a directory: ${path}`);\n\t}\n\tconst currentUid = process.getuid?.();\n\tif (currentUid !== undefined && pathStat.uid !== currentUid) {\n\t\tthrow new Error(`Iroh remote host control directory is owned by another user: ${path}`);\n\t}\n\tif ((pathStat.mode & 0o777) !== 0o700) {\n\t\tawait chmod(path, 0o700);\n\t}\n}\n\nexport function parseIrohRemoteControlRequest(value: unknown): IrohRemoteControlRequest {\n\tconst request = expectRecord(value, \"Iroh remote control request\");\n\tconst type = expectString(request.type, \"control request type\");\n\tif (type === IROH_REMOTE_PAIR_CONTROL_REQUEST_TYPE) {\n\t\treturn parseIrohRemotePairControlRequestRecord(request);\n\t}\n\tif (type === IROH_REMOTE_REVOKE_CONTROL_REQUEST_TYPE) {\n\t\treturn parseIrohRemoteRevokeControlRequestRecord(request);\n\t}\n\tthrow new Error(`Unsupported Iroh remote control request type: ${type}`);\n}\n\nexport function parseIrohRemotePairControlRequest(value: unknown): IrohRemotePairControlRequest {\n\treturn parseIrohRemotePairControlRequestRecord(expectRecord(value, \"Iroh remote pair control request\"));\n}\n\nfunction parseIrohRemotePairControlRequestRecord(request: Record<string, unknown>): IrohRemotePairControlRequest {\n\tconst type = expectString(request.type, \"pair control request type\");\n\tif (type !== IROH_REMOTE_PAIR_CONTROL_REQUEST_TYPE) {\n\t\tthrow new Error(`Unsupported Iroh remote pair control request type: ${type}`);\n\t}\n\tconst relayMode = expectOptionalRelayMode(request.relayMode, \"pair control request relayMode\");\n\tconst unsafeApproval = expectOptionalUnsafeApproval(request.unsafeApproval, \"pair control request unsafeApproval\");\n\tconst allowTools = expectOptionalString(request.allowTools, \"pair control request allowTools\");\n\tconst labelHint = expectOptionalString(request.labelHint, \"pair control request labelHint\");\n\tconst ttlMs = expectOptionalPositiveNumber(request.ttlMs, \"pair control request ttlMs\");\n\treturn {\n\t\ttype: IROH_REMOTE_PAIR_CONTROL_REQUEST_TYPE,\n\t\tworkspace: expectString(request.workspace, \"pair control request workspace\"),\n\t\t...(allowTools === undefined ? {} : { allowTools }),\n\t\t...(labelHint === undefined ? {} : { labelHint }),\n\t\t...(relayMode === undefined ? {} : { relayMode }),\n\t\t...(ttlMs === undefined ? {} : { ttlMs }),\n\t\t...(unsafeApproval === undefined ? {} : { unsafeApproval }),\n\t};\n}\n\nexport function parseIrohRemoteRevokeControlRequest(value: unknown): IrohRemoteRevokeControlRequest {\n\treturn parseIrohRemoteRevokeControlRequestRecord(expectRecord(value, \"Iroh remote revoke control request\"));\n}\n\nfunction parseIrohRemoteRevokeControlRequestRecord(request: Record<string, unknown>): IrohRemoteRevokeControlRequest {\n\tconst type = expectString(request.type, \"revoke control request type\");\n\tif (type !== IROH_REMOTE_REVOKE_CONTROL_REQUEST_TYPE) {\n\t\tthrow new Error(`Unsupported Iroh remote revoke control request type: ${type}`);\n\t}\n\treturn {\n\t\ttype: IROH_REMOTE_REVOKE_CONTROL_REQUEST_TYPE,\n\t\tnodeId: expectString(request.nodeId, \"revoke control request nodeId\"),\n\t};\n}\n\nexport function parseIrohRemotePairControlResponse(value: unknown): IrohRemotePairControlResponse {\n\tconst response = expectRecord(value, \"Iroh remote pair control response\");\n\tconst type = expectString(response.type, \"pair control response type\");\n\tif (type !== IROH_REMOTE_PAIR_CONTROL_RESPONSE_TYPE) {\n\t\tthrow new Error(`Unsupported Iroh remote control response type: ${type}`);\n\t}\n\tconst success = expectBoolean(response.success, \"pair control response success\");\n\tif (!success) {\n\t\treturn {\n\t\t\ttype: IROH_REMOTE_PAIR_CONTROL_RESPONSE_TYPE,\n\t\t\tsuccess: false,\n\t\t\terror: expectString(response.error, \"pair control response error\"),\n\t\t};\n\t}\n\tconst expiresAt = expectPositiveNumber(response.expiresAt, \"pair control response expiresAt\");\n\treturn {\n\t\ttype: IROH_REMOTE_PAIR_CONTROL_RESPONSE_TYPE,\n\t\tsuccess: true,\n\t\texpiresAt,\n\t\tticket: expectString(response.ticket, \"pair control response ticket\"),\n\t};\n}\n\nexport function parseIrohRemoteRevokeControlResponse(value: unknown): IrohRemoteRevokeControlResponse {\n\tconst response = expectRecord(value, \"Iroh remote revoke control response\");\n\tconst type = expectString(response.type, \"revoke control response type\");\n\tif (type !== IROH_REMOTE_REVOKE_CONTROL_RESPONSE_TYPE) {\n\t\tthrow new Error(`Unsupported Iroh remote revoke control response type: ${type}`);\n\t}\n\tconst success = expectBoolean(response.success, \"revoke control response success\");\n\tif (!success) {\n\t\treturn {\n\t\t\ttype: IROH_REMOTE_REVOKE_CONTROL_RESPONSE_TYPE,\n\t\t\tsuccess: false,\n\t\t\terror: expectString(response.error, \"revoke control response error\"),\n\t\t};\n\t}\n\treturn {\n\t\ttype: IROH_REMOTE_REVOKE_CONTROL_RESPONSE_TYPE,\n\t\tsuccess: true,\n\t\tclosed: expectBoolean(response.closed, \"revoke control response closed\"),\n\t\tclosedCount: expectNonNegativeNumber(response.closedCount, \"revoke control response closedCount\"),\n\t};\n}\n\nexport async function requestIrohRemotePairingTicket(\n\toptions: IrohRemotePairControlClientOptions,\n): Promise<IrohRemotePairControlResponse> {\n\treturn await requestIrohRemoteControl(options, parseIrohRemotePairControlResponse);\n}\n\nexport async function requestIrohRemoteActiveRevocation(\n\toptions: IrohRemoteRevokeControlClientOptions,\n): Promise<IrohRemoteRevokeControlResponse> {\n\treturn await requestIrohRemoteControl(options, parseIrohRemoteRevokeControlResponse);\n}\n\nasync function requestIrohRemoteControl<Response>(\n\toptions: IrohRemoteControlClientOptions<IrohRemoteControlRequest>,\n\tparseResponse: (value: unknown) => Response,\n): Promise<Response> {\n\tconst controlPath = getIrohRemoteControlPath(options.statePath);\n\tconst timeoutMs = options.timeoutMs ?? DEFAULT_IROH_REMOTE_CONTROL_TIMEOUT_MS;\n\tconst socket = connect(controlPath);\n\tsocket.setEncoding(\"utf8\");\n\n\treturn await new Promise<Response>((resolve, reject) => {\n\t\tlet buffer = \"\";\n\t\tlet settled = false;\n\t\tconst timeout = setTimeout(() => {\n\t\t\tfinish(undefined, new Error(\"Timed out waiting for a running Iroh remote host control response\"));\n\t\t}, timeoutMs);\n\n\t\tconst finish = (response?: Response, error?: Error) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tclearTimeout(timeout);\n\t\t\tsocket.destroy();\n\t\t\tif (error) {\n\t\t\t\treject(error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!response) {\n\t\t\t\treject(new Error(\"Iroh remote host control channel closed without a response\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresolve(response);\n\t\t};\n\n\t\tsocket.once(\"connect\", () => {\n\t\t\tsocket.write(`${JSON.stringify(options.request)}\\n`);\n\t\t});\n\t\tsocket.on(\"data\", (chunk: string) => {\n\t\t\tbuffer += chunk;\n\t\t\tconst newlineIndex = buffer.indexOf(\"\\n\");\n\t\t\tif (newlineIndex === -1) return;\n\t\t\ttry {\n\t\t\t\tfinish(parseResponse(JSON.parse(buffer.slice(0, newlineIndex))));\n\t\t\t} catch (error) {\n\t\t\t\tfinish(undefined, error instanceof Error ? error : new Error(String(error)));\n\t\t\t}\n\t\t});\n\t\tsocket.once(\"error\", (error) => {\n\t\t\tfinish(undefined, new Error(`No running Iroh remote host control channel is available (${error.message})`));\n\t\t});\n\t\tsocket.once(\"end\", () => finish());\n\t});\n}\n\nfunction expectRecord(value: unknown, description: string): Record<string, unknown> {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n\t\tthrow new Error(`${description} must be an object`);\n\t}\n\treturn value as Record<string, unknown>;\n}\n\nfunction expectString(value: unknown, description: string): string {\n\tif (typeof value !== \"string\" || value.length === 0) {\n\t\tthrow new Error(`${description} must be a non-empty string`);\n\t}\n\treturn value;\n}\n\nfunction expectOptionalString(value: unknown, description: string): string | undefined {\n\tif (value === undefined) return undefined;\n\treturn expectString(value, description);\n}\n\nfunction expectBoolean(value: unknown, description: string): boolean {\n\tif (typeof value !== \"boolean\") {\n\t\tthrow new Error(`${description} must be a boolean`);\n\t}\n\treturn value;\n}\n\nfunction expectPositiveNumber(value: unknown, description: string): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n\t\tthrow new Error(`${description} must be a positive number`);\n\t}\n\treturn value;\n}\n\nfunction expectNonNegativeNumber(value: unknown, description: string): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n\t\tthrow new Error(`${description} must be a non-negative number`);\n\t}\n\treturn value;\n}\n\nfunction expectOptionalPositiveNumber(value: unknown, description: string): number | undefined {\n\tif (value === undefined) return undefined;\n\treturn expectPositiveNumber(value, description);\n}\n\nfunction expectOptionalRelayMode(value: unknown, description: string): IrohRemoteRelayMode | undefined {\n\tif (value === undefined) return undefined;\n\tif (!isIrohRemoteRelayMode(value)) {\n\t\tthrow new Error(`${description} must be disabled, development, or production`);\n\t}\n\treturn value;\n}\n\nfunction expectOptionalUnsafeApproval(value: unknown, description: string): IrohRemoteUnsafeApproval | undefined {\n\tif (value === undefined) return undefined;\n\tif (value !== \"tty_confirmation\" && value !== \"yes_flag\") {\n\t\tthrow new Error(`${description} must be tty_confirmation or yes_flag`);\n\t}\n\treturn value;\n}\n"]}
@@ -0,0 +1,22 @@
1
+ import { type IrohRemoteRpcErrorResponse } from "./rpc-command-filter.ts";
2
+ export declare const IROH_REMOTE_UPLOAD_DEVICE_LOGS_RPC_TYPE = "upload_device_logs";
3
+ export declare const IROH_REMOTE_DEVICE_LOGS_DIR_SEGMENTS: readonly [".volt", "device-logs"];
4
+ export declare const DEFAULT_IROH_REMOTE_DEVICE_LOG_MAX_CONTENT_BYTES: number;
5
+ export interface IrohRemoteDeviceLogUploadRpcData {
6
+ path: string;
7
+ byteCount: number;
8
+ }
9
+ export type IrohRemoteDeviceLogUploadRpcResponse = {
10
+ id?: string;
11
+ type: "response";
12
+ command: typeof IROH_REMOTE_UPLOAD_DEVICE_LOGS_RPC_TYPE;
13
+ success: true;
14
+ data: IrohRemoteDeviceLogUploadRpcData;
15
+ } | IrohRemoteRpcErrorResponse;
16
+ export interface HandleIrohRemoteDeviceLogUploadRpcCommandOptions {
17
+ workspacePath: string;
18
+ maxContentBytes?: number;
19
+ now?: () => Date;
20
+ }
21
+ export declare function handleIrohRemoteDeviceLogUploadRpcCommand(command: Record<string, unknown>, options: HandleIrohRemoteDeviceLogUploadRpcCommandOptions): Promise<IrohRemoteDeviceLogUploadRpcResponse>;
22
+ //# sourceMappingURL=device-log-rpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-log-rpc.d.ts","sourceRoot":"","sources":["../../../../src/core/remote/iroh/device-log-rpc.ts"],"names":[],"mappings":"AAKA,OAAO,EAAoC,KAAK,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAE5G,eAAO,MAAM,uCAAuC,uBAAuB,CAAC;AAE5E,eAAO,MAAM,oCAAoC,mCAAoC,CAAC;AAEtF,eAAO,MAAM,gDAAgD,QAAkB,CAAC;AAMhF,MAAM,WAAW,gCAAgC;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,oCAAoC,GAC7C;IACA,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,OAAO,uCAAuC,CAAC;IACxD,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,gCAAgC,CAAC;CACtC,GACD,0BAA0B,CAAC;AAE9B,MAAM,WAAW,gDAAgD;IAChE,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CACjB;AAED,wBAAsB,yCAAyC,CAC9D,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,EAAE,gDAAgD,GACvD,OAAO,CAAC,oCAAoC,CAAC,CAgC/C","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport type { Stats } from \"node:fs\";\nimport { chmod, lstat, mkdir, realpath } from \"node:fs/promises\";\nimport { isAbsolute, join, relative, sep } from \"node:path\";\nimport { writeDurableAtomicFile } from \"../../../utils/durable-atomic-write.ts\";\nimport { createIrohRemoteRpcErrorResponse, type IrohRemoteRpcErrorResponse } from \"./rpc-command-filter.ts\";\n\nexport const IROH_REMOTE_UPLOAD_DEVICE_LOGS_RPC_TYPE = \"upload_device_logs\";\n\nexport const IROH_REMOTE_DEVICE_LOGS_DIR_SEGMENTS = [\".volt\", \"device-logs\"] as const;\n\nexport const DEFAULT_IROH_REMOTE_DEVICE_LOG_MAX_CONTENT_BYTES = 4 * 1024 * 1024;\n\nconst DEVICE_LOG_FILE_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;\nconst DEVICE_LOG_DIRECTORY_MODE = 0o700;\nconst DEVICE_LOG_FILE_MODE = 0o600;\n\nexport interface IrohRemoteDeviceLogUploadRpcData {\n\tpath: string;\n\tbyteCount: number;\n}\n\nexport type IrohRemoteDeviceLogUploadRpcResponse =\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"response\";\n\t\t\tcommand: typeof IROH_REMOTE_UPLOAD_DEVICE_LOGS_RPC_TYPE;\n\t\t\tsuccess: true;\n\t\t\tdata: IrohRemoteDeviceLogUploadRpcData;\n\t }\n\t| IrohRemoteRpcErrorResponse;\n\nexport interface HandleIrohRemoteDeviceLogUploadRpcCommandOptions {\n\tworkspacePath: string;\n\tmaxContentBytes?: number;\n\tnow?: () => Date;\n}\n\nexport async function handleIrohRemoteDeviceLogUploadRpcCommand(\n\tcommand: Record<string, unknown>,\n\toptions: HandleIrohRemoteDeviceLogUploadRpcCommandOptions,\n): Promise<IrohRemoteDeviceLogUploadRpcResponse> {\n\tconst id = typeof command.id === \"string\" ? command.id : undefined;\n\tconst request = parseIrohRemoteDeviceLogUploadCommand(command, options);\n\tif (!request.ok) {\n\t\treturn createIrohRemoteRpcErrorResponse(id, IROH_REMOTE_UPLOAD_DEVICE_LOGS_RPC_TYPE, request.error);\n\t}\n\n\ttry {\n\t\tconst directory = await resolveSafeDeviceLogDirectory(options.workspacePath);\n\t\tconst targetPath = join(directory, request.fileName);\n\t\tawait writeDurableAtomicFile(targetPath, request.content, {\n\t\t\tdirectoryMode: DEVICE_LOG_DIRECTORY_MODE,\n\t\t\tfileMode: DEVICE_LOG_FILE_MODE,\n\t\t});\n\t} catch (error: unknown) {\n\t\treturn createIrohRemoteRpcErrorResponse(\n\t\t\tid,\n\t\t\tIROH_REMOTE_UPLOAD_DEVICE_LOGS_RPC_TYPE,\n\t\t\t`Failed to write device log: ${error instanceof Error ? error.message : String(error)}`,\n\t\t);\n\t}\n\n\treturn {\n\t\tid,\n\t\ttype: \"response\",\n\t\tcommand: IROH_REMOTE_UPLOAD_DEVICE_LOGS_RPC_TYPE,\n\t\tsuccess: true,\n\t\tdata: {\n\t\t\tpath: [...IROH_REMOTE_DEVICE_LOGS_DIR_SEGMENTS, request.fileName].join(\"/\"),\n\t\t\tbyteCount: request.byteCount,\n\t\t},\n\t};\n}\n\nasync function resolveSafeDeviceLogDirectory(workspacePath: string): Promise<string> {\n\tconst workspaceRoot = await realpath(workspacePath);\n\tawait assertRealDirectory(workspaceRoot, \"workspace\");\n\n\tlet parent = workspaceRoot;\n\tconst verifiedComponents: Array<{ canonicalPath: string; label: string; parentPath: string; path: string }> = [];\n\tfor (const segment of IROH_REMOTE_DEVICE_LOGS_DIR_SEGMENTS) {\n\t\tconst candidate = join(parent, segment);\n\t\tawait ensureRealDirectory(candidate, segment);\n\t\tconst canonicalCandidate = await realpath(candidate);\n\n\t\t// Recheck after realpath so swapping an existing directory for a symlink\n\t\t// during validation is caught before any client content is written.\n\t\tawait assertRealDirectory(candidate, segment);\n\t\tif (canonicalCandidate === parent || !isPathInside(parent, canonicalCandidate)) {\n\t\t\tthrow new Error(`${segment} directory escapes its verified parent`);\n\t\t}\n\t\tverifiedComponents.push({\n\t\t\tcanonicalPath: canonicalCandidate,\n\t\t\tlabel: segment,\n\t\t\tparentPath: parent,\n\t\t\tpath: candidate,\n\t\t});\n\t\tparent = canonicalCandidate;\n\t}\n\n\tif (!isPathInside(workspaceRoot, parent)) {\n\t\tthrow new Error(\"device log directory escapes the workspace\");\n\t}\n\t// Node does not expose portable openat/renameat APIs tied to a verified\n\t// directory fd. Rechecking each component immediately before the atomic\n\t// write rejects stable swaps and narrows the residual same-user race window.\n\tfor (const component of verifiedComponents) {\n\t\tawait hardenRealDirectory(component.path, component.label);\n\t\tconst currentCanonicalPath = await realpath(component.path);\n\t\tif (\n\t\t\tcurrentCanonicalPath !== component.canonicalPath ||\n\t\t\tcurrentCanonicalPath === component.parentPath ||\n\t\t\t!isPathInside(component.parentPath, currentCanonicalPath)\n\t\t) {\n\t\t\tthrow new Error(`${component.label} directory changed during validation`);\n\t\t}\n\t}\n\treturn parent;\n}\n\nasync function hardenRealDirectory(path: string, label: string): Promise<void> {\n\tawait assertRealDirectory(path, label);\n\tawait chmod(path, DEVICE_LOG_DIRECTORY_MODE);\n\tconst info = await assertRealDirectory(path, label);\n\tif (process.platform !== \"win32\" && (info.mode & 0o777) !== DEVICE_LOG_DIRECTORY_MODE) {\n\t\tthrow new Error(`${label} directory must use owner-only permissions`);\n\t}\n}\n\nasync function ensureRealDirectory(path: string, label: string): Promise<void> {\n\ttry {\n\t\tawait assertRealDirectory(path, label);\n\t\treturn;\n\t} catch (error) {\n\t\tif (!isErrnoException(error, \"ENOENT\")) {\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\ttry {\n\t\tawait mkdir(path, { mode: DEVICE_LOG_DIRECTORY_MODE });\n\t} catch (error) {\n\t\t// Another upload may have created the directory after our lstat. Validate\n\t\t// the winning entry below; anything other than that race is a real failure.\n\t\tif (!isErrnoException(error, \"EEXIST\")) {\n\t\t\tthrow error;\n\t\t}\n\t}\n\tawait assertRealDirectory(path, label);\n}\n\nasync function assertRealDirectory(path: string, label: string): Promise<Stats> {\n\tconst info = await lstat(path);\n\tif (info.isSymbolicLink()) {\n\t\tthrow new Error(`${label} directory must not be a symbolic link`);\n\t}\n\tif (!info.isDirectory()) {\n\t\tthrow new Error(`${label} path must be a directory`);\n\t}\n\treturn info;\n}\n\nfunction isPathInside(root: string, candidate: string): boolean {\n\tconst relativePath = relative(root, candidate);\n\treturn (\n\t\trelativePath === \"\" ||\n\t\t(relativePath !== \"..\" && !relativePath.startsWith(`..${sep}`) && !isAbsolute(relativePath))\n\t);\n}\n\nfunction isErrnoException(error: unknown, code: string): error is NodeJS.ErrnoException {\n\treturn error instanceof Error && \"code\" in error && (error as NodeJS.ErrnoException).code === code;\n}\n\nfunction parseIrohRemoteDeviceLogUploadCommand(\n\tcommand: Record<string, unknown>,\n\toptions: HandleIrohRemoteDeviceLogUploadRpcCommandOptions,\n): { ok: true; fileName: string; content: string; byteCount: number } | { ok: false; error: string } {\n\tif (typeof command.content !== \"string\" || command.content.length === 0) {\n\t\treturn { ok: false, error: 'Invalid RPC command payload: \"content\" must be a non-empty string' };\n\t}\n\tconst byteCount = Buffer.byteLength(command.content, \"utf8\");\n\tconst maxContentBytes = options.maxContentBytes ?? DEFAULT_IROH_REMOTE_DEVICE_LOG_MAX_CONTENT_BYTES;\n\tif (byteCount > maxContentBytes) {\n\t\treturn { ok: false, error: `Device log content exceeds maximum size of ${maxContentBytes} bytes` };\n\t}\n\tif (command.fileName === undefined) {\n\t\tconst timestamp = (options.now?.() ?? new Date())\n\t\t\t.toISOString()\n\t\t\t.replaceAll(\":\", \"-\")\n\t\t\t.replace(/\\.\\d+Z$/, \"Z\");\n\t\treturn { ok: true, fileName: `device-${timestamp}.log`, content: command.content, byteCount };\n\t}\n\tif (typeof command.fileName !== \"string\" || !DEVICE_LOG_FILE_NAME_PATTERN.test(command.fileName)) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\terror: 'Invalid RPC command payload: \"fileName\" must contain only letters, digits, \".\", \"_\", or \"-\" and must not start with \".\"',\n\t\t};\n\t}\n\treturn { ok: true, fileName: command.fileName, content: command.content, byteCount };\n}\n"]}
@@ -0,0 +1,152 @@
1
+ import { Buffer } from "node:buffer";
2
+ import { chmod, lstat, mkdir, realpath } from "node:fs/promises";
3
+ import { isAbsolute, join, relative, sep } from "node:path";
4
+ import { writeDurableAtomicFile } from "../../../utils/durable-atomic-write.js";
5
+ import { createIrohRemoteRpcErrorResponse } from "./rpc-command-filter.js";
6
+ export const IROH_REMOTE_UPLOAD_DEVICE_LOGS_RPC_TYPE = "upload_device_logs";
7
+ export const IROH_REMOTE_DEVICE_LOGS_DIR_SEGMENTS = [".volt", "device-logs"];
8
+ export const DEFAULT_IROH_REMOTE_DEVICE_LOG_MAX_CONTENT_BYTES = 4 * 1024 * 1024;
9
+ const DEVICE_LOG_FILE_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
10
+ const DEVICE_LOG_DIRECTORY_MODE = 0o700;
11
+ const DEVICE_LOG_FILE_MODE = 0o600;
12
+ export async function handleIrohRemoteDeviceLogUploadRpcCommand(command, options) {
13
+ const id = typeof command.id === "string" ? command.id : undefined;
14
+ const request = parseIrohRemoteDeviceLogUploadCommand(command, options);
15
+ if (!request.ok) {
16
+ return createIrohRemoteRpcErrorResponse(id, IROH_REMOTE_UPLOAD_DEVICE_LOGS_RPC_TYPE, request.error);
17
+ }
18
+ try {
19
+ const directory = await resolveSafeDeviceLogDirectory(options.workspacePath);
20
+ const targetPath = join(directory, request.fileName);
21
+ await writeDurableAtomicFile(targetPath, request.content, {
22
+ directoryMode: DEVICE_LOG_DIRECTORY_MODE,
23
+ fileMode: DEVICE_LOG_FILE_MODE,
24
+ });
25
+ }
26
+ catch (error) {
27
+ return createIrohRemoteRpcErrorResponse(id, IROH_REMOTE_UPLOAD_DEVICE_LOGS_RPC_TYPE, `Failed to write device log: ${error instanceof Error ? error.message : String(error)}`);
28
+ }
29
+ return {
30
+ id,
31
+ type: "response",
32
+ command: IROH_REMOTE_UPLOAD_DEVICE_LOGS_RPC_TYPE,
33
+ success: true,
34
+ data: {
35
+ path: [...IROH_REMOTE_DEVICE_LOGS_DIR_SEGMENTS, request.fileName].join("/"),
36
+ byteCount: request.byteCount,
37
+ },
38
+ };
39
+ }
40
+ async function resolveSafeDeviceLogDirectory(workspacePath) {
41
+ const workspaceRoot = await realpath(workspacePath);
42
+ await assertRealDirectory(workspaceRoot, "workspace");
43
+ let parent = workspaceRoot;
44
+ const verifiedComponents = [];
45
+ for (const segment of IROH_REMOTE_DEVICE_LOGS_DIR_SEGMENTS) {
46
+ const candidate = join(parent, segment);
47
+ await ensureRealDirectory(candidate, segment);
48
+ const canonicalCandidate = await realpath(candidate);
49
+ // Recheck after realpath so swapping an existing directory for a symlink
50
+ // during validation is caught before any client content is written.
51
+ await assertRealDirectory(candidate, segment);
52
+ if (canonicalCandidate === parent || !isPathInside(parent, canonicalCandidate)) {
53
+ throw new Error(`${segment} directory escapes its verified parent`);
54
+ }
55
+ verifiedComponents.push({
56
+ canonicalPath: canonicalCandidate,
57
+ label: segment,
58
+ parentPath: parent,
59
+ path: candidate,
60
+ });
61
+ parent = canonicalCandidate;
62
+ }
63
+ if (!isPathInside(workspaceRoot, parent)) {
64
+ throw new Error("device log directory escapes the workspace");
65
+ }
66
+ // Node does not expose portable openat/renameat APIs tied to a verified
67
+ // directory fd. Rechecking each component immediately before the atomic
68
+ // write rejects stable swaps and narrows the residual same-user race window.
69
+ for (const component of verifiedComponents) {
70
+ await hardenRealDirectory(component.path, component.label);
71
+ const currentCanonicalPath = await realpath(component.path);
72
+ if (currentCanonicalPath !== component.canonicalPath ||
73
+ currentCanonicalPath === component.parentPath ||
74
+ !isPathInside(component.parentPath, currentCanonicalPath)) {
75
+ throw new Error(`${component.label} directory changed during validation`);
76
+ }
77
+ }
78
+ return parent;
79
+ }
80
+ async function hardenRealDirectory(path, label) {
81
+ await assertRealDirectory(path, label);
82
+ await chmod(path, DEVICE_LOG_DIRECTORY_MODE);
83
+ const info = await assertRealDirectory(path, label);
84
+ if (process.platform !== "win32" && (info.mode & 0o777) !== DEVICE_LOG_DIRECTORY_MODE) {
85
+ throw new Error(`${label} directory must use owner-only permissions`);
86
+ }
87
+ }
88
+ async function ensureRealDirectory(path, label) {
89
+ try {
90
+ await assertRealDirectory(path, label);
91
+ return;
92
+ }
93
+ catch (error) {
94
+ if (!isErrnoException(error, "ENOENT")) {
95
+ throw error;
96
+ }
97
+ }
98
+ try {
99
+ await mkdir(path, { mode: DEVICE_LOG_DIRECTORY_MODE });
100
+ }
101
+ catch (error) {
102
+ // Another upload may have created the directory after our lstat. Validate
103
+ // the winning entry below; anything other than that race is a real failure.
104
+ if (!isErrnoException(error, "EEXIST")) {
105
+ throw error;
106
+ }
107
+ }
108
+ await assertRealDirectory(path, label);
109
+ }
110
+ async function assertRealDirectory(path, label) {
111
+ const info = await lstat(path);
112
+ if (info.isSymbolicLink()) {
113
+ throw new Error(`${label} directory must not be a symbolic link`);
114
+ }
115
+ if (!info.isDirectory()) {
116
+ throw new Error(`${label} path must be a directory`);
117
+ }
118
+ return info;
119
+ }
120
+ function isPathInside(root, candidate) {
121
+ const relativePath = relative(root, candidate);
122
+ return (relativePath === "" ||
123
+ (relativePath !== ".." && !relativePath.startsWith(`..${sep}`) && !isAbsolute(relativePath)));
124
+ }
125
+ function isErrnoException(error, code) {
126
+ return error instanceof Error && "code" in error && error.code === code;
127
+ }
128
+ function parseIrohRemoteDeviceLogUploadCommand(command, options) {
129
+ if (typeof command.content !== "string" || command.content.length === 0) {
130
+ return { ok: false, error: 'Invalid RPC command payload: "content" must be a non-empty string' };
131
+ }
132
+ const byteCount = Buffer.byteLength(command.content, "utf8");
133
+ const maxContentBytes = options.maxContentBytes ?? DEFAULT_IROH_REMOTE_DEVICE_LOG_MAX_CONTENT_BYTES;
134
+ if (byteCount > maxContentBytes) {
135
+ return { ok: false, error: `Device log content exceeds maximum size of ${maxContentBytes} bytes` };
136
+ }
137
+ if (command.fileName === undefined) {
138
+ const timestamp = (options.now?.() ?? new Date())
139
+ .toISOString()
140
+ .replaceAll(":", "-")
141
+ .replace(/\.\d+Z$/, "Z");
142
+ return { ok: true, fileName: `device-${timestamp}.log`, content: command.content, byteCount };
143
+ }
144
+ if (typeof command.fileName !== "string" || !DEVICE_LOG_FILE_NAME_PATTERN.test(command.fileName)) {
145
+ return {
146
+ ok: false,
147
+ error: 'Invalid RPC command payload: "fileName" must contain only letters, digits, ".", "_", or "-" and must not start with "."',
148
+ };
149
+ }
150
+ return { ok: true, fileName: command.fileName, content: command.content, byteCount };
151
+ }
152
+ //# sourceMappingURL=device-log-rpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-log-rpc.js","sourceRoot":"","sources":["../../../../src/core/remote/iroh/device-log-rpc.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport type { Stats } from \"node:fs\";\nimport { chmod, lstat, mkdir, realpath } from \"node:fs/promises\";\nimport { isAbsolute, join, relative, sep } from \"node:path\";\nimport { writeDurableAtomicFile } from \"../../../utils/durable-atomic-write.ts\";\nimport { createIrohRemoteRpcErrorResponse, type IrohRemoteRpcErrorResponse } from \"./rpc-command-filter.ts\";\n\nexport const IROH_REMOTE_UPLOAD_DEVICE_LOGS_RPC_TYPE = \"upload_device_logs\";\n\nexport const IROH_REMOTE_DEVICE_LOGS_DIR_SEGMENTS = [\".volt\", \"device-logs\"] as const;\n\nexport const DEFAULT_IROH_REMOTE_DEVICE_LOG_MAX_CONTENT_BYTES = 4 * 1024 * 1024;\n\nconst DEVICE_LOG_FILE_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;\nconst DEVICE_LOG_DIRECTORY_MODE = 0o700;\nconst DEVICE_LOG_FILE_MODE = 0o600;\n\nexport interface IrohRemoteDeviceLogUploadRpcData {\n\tpath: string;\n\tbyteCount: number;\n}\n\nexport type IrohRemoteDeviceLogUploadRpcResponse =\n\t| {\n\t\t\tid?: string;\n\t\t\ttype: \"response\";\n\t\t\tcommand: typeof IROH_REMOTE_UPLOAD_DEVICE_LOGS_RPC_TYPE;\n\t\t\tsuccess: true;\n\t\t\tdata: IrohRemoteDeviceLogUploadRpcData;\n\t }\n\t| IrohRemoteRpcErrorResponse;\n\nexport interface HandleIrohRemoteDeviceLogUploadRpcCommandOptions {\n\tworkspacePath: string;\n\tmaxContentBytes?: number;\n\tnow?: () => Date;\n}\n\nexport async function handleIrohRemoteDeviceLogUploadRpcCommand(\n\tcommand: Record<string, unknown>,\n\toptions: HandleIrohRemoteDeviceLogUploadRpcCommandOptions,\n): Promise<IrohRemoteDeviceLogUploadRpcResponse> {\n\tconst id = typeof command.id === \"string\" ? command.id : undefined;\n\tconst request = parseIrohRemoteDeviceLogUploadCommand(command, options);\n\tif (!request.ok) {\n\t\treturn createIrohRemoteRpcErrorResponse(id, IROH_REMOTE_UPLOAD_DEVICE_LOGS_RPC_TYPE, request.error);\n\t}\n\n\ttry {\n\t\tconst directory = await resolveSafeDeviceLogDirectory(options.workspacePath);\n\t\tconst targetPath = join(directory, request.fileName);\n\t\tawait writeDurableAtomicFile(targetPath, request.content, {\n\t\t\tdirectoryMode: DEVICE_LOG_DIRECTORY_MODE,\n\t\t\tfileMode: DEVICE_LOG_FILE_MODE,\n\t\t});\n\t} catch (error: unknown) {\n\t\treturn createIrohRemoteRpcErrorResponse(\n\t\t\tid,\n\t\t\tIROH_REMOTE_UPLOAD_DEVICE_LOGS_RPC_TYPE,\n\t\t\t`Failed to write device log: ${error instanceof Error ? error.message : String(error)}`,\n\t\t);\n\t}\n\n\treturn {\n\t\tid,\n\t\ttype: \"response\",\n\t\tcommand: IROH_REMOTE_UPLOAD_DEVICE_LOGS_RPC_TYPE,\n\t\tsuccess: true,\n\t\tdata: {\n\t\t\tpath: [...IROH_REMOTE_DEVICE_LOGS_DIR_SEGMENTS, request.fileName].join(\"/\"),\n\t\t\tbyteCount: request.byteCount,\n\t\t},\n\t};\n}\n\nasync function resolveSafeDeviceLogDirectory(workspacePath: string): Promise<string> {\n\tconst workspaceRoot = await realpath(workspacePath);\n\tawait assertRealDirectory(workspaceRoot, \"workspace\");\n\n\tlet parent = workspaceRoot;\n\tconst verifiedComponents: Array<{ canonicalPath: string; label: string; parentPath: string; path: string }> = [];\n\tfor (const segment of IROH_REMOTE_DEVICE_LOGS_DIR_SEGMENTS) {\n\t\tconst candidate = join(parent, segment);\n\t\tawait ensureRealDirectory(candidate, segment);\n\t\tconst canonicalCandidate = await realpath(candidate);\n\n\t\t// Recheck after realpath so swapping an existing directory for a symlink\n\t\t// during validation is caught before any client content is written.\n\t\tawait assertRealDirectory(candidate, segment);\n\t\tif (canonicalCandidate === parent || !isPathInside(parent, canonicalCandidate)) {\n\t\t\tthrow new Error(`${segment} directory escapes its verified parent`);\n\t\t}\n\t\tverifiedComponents.push({\n\t\t\tcanonicalPath: canonicalCandidate,\n\t\t\tlabel: segment,\n\t\t\tparentPath: parent,\n\t\t\tpath: candidate,\n\t\t});\n\t\tparent = canonicalCandidate;\n\t}\n\n\tif (!isPathInside(workspaceRoot, parent)) {\n\t\tthrow new Error(\"device log directory escapes the workspace\");\n\t}\n\t// Node does not expose portable openat/renameat APIs tied to a verified\n\t// directory fd. Rechecking each component immediately before the atomic\n\t// write rejects stable swaps and narrows the residual same-user race window.\n\tfor (const component of verifiedComponents) {\n\t\tawait hardenRealDirectory(component.path, component.label);\n\t\tconst currentCanonicalPath = await realpath(component.path);\n\t\tif (\n\t\t\tcurrentCanonicalPath !== component.canonicalPath ||\n\t\t\tcurrentCanonicalPath === component.parentPath ||\n\t\t\t!isPathInside(component.parentPath, currentCanonicalPath)\n\t\t) {\n\t\t\tthrow new Error(`${component.label} directory changed during validation`);\n\t\t}\n\t}\n\treturn parent;\n}\n\nasync function hardenRealDirectory(path: string, label: string): Promise<void> {\n\tawait assertRealDirectory(path, label);\n\tawait chmod(path, DEVICE_LOG_DIRECTORY_MODE);\n\tconst info = await assertRealDirectory(path, label);\n\tif (process.platform !== \"win32\" && (info.mode & 0o777) !== DEVICE_LOG_DIRECTORY_MODE) {\n\t\tthrow new Error(`${label} directory must use owner-only permissions`);\n\t}\n}\n\nasync function ensureRealDirectory(path: string, label: string): Promise<void> {\n\ttry {\n\t\tawait assertRealDirectory(path, label);\n\t\treturn;\n\t} catch (error) {\n\t\tif (!isErrnoException(error, \"ENOENT\")) {\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\ttry {\n\t\tawait mkdir(path, { mode: DEVICE_LOG_DIRECTORY_MODE });\n\t} catch (error) {\n\t\t// Another upload may have created the directory after our lstat. Validate\n\t\t// the winning entry below; anything other than that race is a real failure.\n\t\tif (!isErrnoException(error, \"EEXIST\")) {\n\t\t\tthrow error;\n\t\t}\n\t}\n\tawait assertRealDirectory(path, label);\n}\n\nasync function assertRealDirectory(path: string, label: string): Promise<Stats> {\n\tconst info = await lstat(path);\n\tif (info.isSymbolicLink()) {\n\t\tthrow new Error(`${label} directory must not be a symbolic link`);\n\t}\n\tif (!info.isDirectory()) {\n\t\tthrow new Error(`${label} path must be a directory`);\n\t}\n\treturn info;\n}\n\nfunction isPathInside(root: string, candidate: string): boolean {\n\tconst relativePath = relative(root, candidate);\n\treturn (\n\t\trelativePath === \"\" ||\n\t\t(relativePath !== \"..\" && !relativePath.startsWith(`..${sep}`) && !isAbsolute(relativePath))\n\t);\n}\n\nfunction isErrnoException(error: unknown, code: string): error is NodeJS.ErrnoException {\n\treturn error instanceof Error && \"code\" in error && (error as NodeJS.ErrnoException).code === code;\n}\n\nfunction parseIrohRemoteDeviceLogUploadCommand(\n\tcommand: Record<string, unknown>,\n\toptions: HandleIrohRemoteDeviceLogUploadRpcCommandOptions,\n): { ok: true; fileName: string; content: string; byteCount: number } | { ok: false; error: string } {\n\tif (typeof command.content !== \"string\" || command.content.length === 0) {\n\t\treturn { ok: false, error: 'Invalid RPC command payload: \"content\" must be a non-empty string' };\n\t}\n\tconst byteCount = Buffer.byteLength(command.content, \"utf8\");\n\tconst maxContentBytes = options.maxContentBytes ?? DEFAULT_IROH_REMOTE_DEVICE_LOG_MAX_CONTENT_BYTES;\n\tif (byteCount > maxContentBytes) {\n\t\treturn { ok: false, error: `Device log content exceeds maximum size of ${maxContentBytes} bytes` };\n\t}\n\tif (command.fileName === undefined) {\n\t\tconst timestamp = (options.now?.() ?? new Date())\n\t\t\t.toISOString()\n\t\t\t.replaceAll(\":\", \"-\")\n\t\t\t.replace(/\\.\\d+Z$/, \"Z\");\n\t\treturn { ok: true, fileName: `device-${timestamp}.log`, content: command.content, byteCount };\n\t}\n\tif (typeof command.fileName !== \"string\" || !DEVICE_LOG_FILE_NAME_PATTERN.test(command.fileName)) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\terror: 'Invalid RPC command payload: \"fileName\" must contain only letters, digits, \".\", \"_\", or \"-\" and must not start with \".\"',\n\t\t};\n\t}\n\treturn { ok: true, fileName: command.fileName, content: command.content, byteCount };\n}\n"]}