@aria-cli/tools 1.0.9 → 1.0.10

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 (588) hide show
  1. package/package.json +8 -5
  2. package/dist-cjs/.tsbuildinfo +0 -1
  3. package/dist-cjs/ask-user-interaction.d.ts +0 -10
  4. package/dist-cjs/ask-user-interaction.js +0 -28
  5. package/dist-cjs/ask-user-interaction.js.map +0 -1
  6. package/dist-cjs/cache/web-cache.d.ts +0 -52
  7. package/dist-cjs/cache/web-cache.js +0 -71
  8. package/dist-cjs/cache/web-cache.js.map +0 -1
  9. package/dist-cjs/definitions/arion.d.ts +0 -8
  10. package/dist-cjs/definitions/arion.js +0 -108
  11. package/dist-cjs/definitions/arion.js.map +0 -1
  12. package/dist-cjs/definitions/browser/browser.d.ts +0 -2
  13. package/dist-cjs/definitions/browser/browser.js +0 -422
  14. package/dist-cjs/definitions/browser/browser.js.map +0 -1
  15. package/dist-cjs/definitions/browser/index.d.ts +0 -1
  16. package/dist-cjs/definitions/browser/index.js +0 -9
  17. package/dist-cjs/definitions/browser/index.js.map +0 -1
  18. package/dist-cjs/definitions/browser/pw-downloads.d.ts +0 -13
  19. package/dist-cjs/definitions/browser/pw-downloads.js +0 -118
  20. package/dist-cjs/definitions/browser/pw-downloads.js.map +0 -1
  21. package/dist-cjs/definitions/browser/pw-interactions.d.ts +0 -78
  22. package/dist-cjs/definitions/browser/pw-interactions.js +0 -214
  23. package/dist-cjs/definitions/browser/pw-interactions.js.map +0 -1
  24. package/dist-cjs/definitions/browser/pw-responses.d.ts +0 -28
  25. package/dist-cjs/definitions/browser/pw-responses.js +0 -85
  26. package/dist-cjs/definitions/browser/pw-responses.js.map +0 -1
  27. package/dist-cjs/definitions/browser/pw-session.d.ts +0 -65
  28. package/dist-cjs/definitions/browser/pw-session.js +0 -327
  29. package/dist-cjs/definitions/browser/pw-session.js.map +0 -1
  30. package/dist-cjs/definitions/browser/pw-shared.d.ts +0 -22
  31. package/dist-cjs/definitions/browser/pw-shared.js +0 -73
  32. package/dist-cjs/definitions/browser/pw-shared.js.map +0 -1
  33. package/dist-cjs/definitions/browser/pw-snapshot.d.ts +0 -34
  34. package/dist-cjs/definitions/browser/pw-snapshot.js +0 -308
  35. package/dist-cjs/definitions/browser/pw-snapshot.js.map +0 -1
  36. package/dist-cjs/definitions/browser/pw-state.d.ts +0 -22
  37. package/dist-cjs/definitions/browser/pw-state.js +0 -71
  38. package/dist-cjs/definitions/browser/pw-state.js.map +0 -1
  39. package/dist-cjs/definitions/browser/types.d.ts +0 -277
  40. package/dist-cjs/definitions/browser/types.js +0 -6
  41. package/dist-cjs/definitions/browser/types.js.map +0 -1
  42. package/dist-cjs/definitions/code-intelligence.d.ts +0 -8
  43. package/dist-cjs/definitions/code-intelligence.js +0 -474
  44. package/dist-cjs/definitions/code-intelligence.js.map +0 -1
  45. package/dist-cjs/definitions/core.d.ts +0 -47
  46. package/dist-cjs/definitions/core.js +0 -134
  47. package/dist-cjs/definitions/core.js.map +0 -1
  48. package/dist-cjs/definitions/delegation.d.ts +0 -11
  49. package/dist-cjs/definitions/delegation.js +0 -516
  50. package/dist-cjs/definitions/delegation.js.map +0 -1
  51. package/dist-cjs/definitions/deploy.d.ts +0 -15
  52. package/dist-cjs/definitions/deploy.js +0 -69
  53. package/dist-cjs/definitions/deploy.js.map +0 -1
  54. package/dist-cjs/definitions/filesystem.d.ts +0 -9
  55. package/dist-cjs/definitions/filesystem.js +0 -200
  56. package/dist-cjs/definitions/filesystem.js.map +0 -1
  57. package/dist-cjs/definitions/frg.d.ts +0 -3
  58. package/dist-cjs/definitions/frg.js +0 -67
  59. package/dist-cjs/definitions/frg.js.map +0 -1
  60. package/dist-cjs/definitions/index.d.ts +0 -19
  61. package/dist-cjs/definitions/index.js +0 -44
  62. package/dist-cjs/definitions/index.js.map +0 -1
  63. package/dist-cjs/definitions/memory.d.ts +0 -8
  64. package/dist-cjs/definitions/memory.js +0 -127
  65. package/dist-cjs/definitions/memory.js.map +0 -1
  66. package/dist-cjs/definitions/messaging.d.ts +0 -11
  67. package/dist-cjs/definitions/messaging.js +0 -632
  68. package/dist-cjs/definitions/messaging.js.map +0 -1
  69. package/dist-cjs/definitions/meta.d.ts +0 -11
  70. package/dist-cjs/definitions/meta.js +0 -353
  71. package/dist-cjs/definitions/meta.js.map +0 -1
  72. package/dist-cjs/definitions/network.d.ts +0 -11
  73. package/dist-cjs/definitions/network.js +0 -163
  74. package/dist-cjs/definitions/network.js.map +0 -1
  75. package/dist-cjs/definitions/outlook.d.ts +0 -2
  76. package/dist-cjs/definitions/outlook.js +0 -281
  77. package/dist-cjs/definitions/outlook.js.map +0 -1
  78. package/dist-cjs/definitions/patch/apply-patch.d.ts +0 -11
  79. package/dist-cjs/definitions/patch/apply-patch.js +0 -192
  80. package/dist-cjs/definitions/patch/apply-patch.js.map +0 -1
  81. package/dist-cjs/definitions/patch/fuzzy-match.d.ts +0 -10
  82. package/dist-cjs/definitions/patch/fuzzy-match.js +0 -173
  83. package/dist-cjs/definitions/patch/fuzzy-match.js.map +0 -1
  84. package/dist-cjs/definitions/patch/index.d.ts +0 -1
  85. package/dist-cjs/definitions/patch/index.js +0 -6
  86. package/dist-cjs/definitions/patch/index.js.map +0 -1
  87. package/dist-cjs/definitions/patch/patch-parser.d.ts +0 -50
  88. package/dist-cjs/definitions/patch/patch-parser.js +0 -216
  89. package/dist-cjs/definitions/patch/patch-parser.js.map +0 -1
  90. package/dist-cjs/definitions/patch/sandbox-paths.d.ts +0 -18
  91. package/dist-cjs/definitions/patch/sandbox-paths.js +0 -114
  92. package/dist-cjs/definitions/patch/sandbox-paths.js.map +0 -1
  93. package/dist-cjs/definitions/process/index.d.ts +0 -1
  94. package/dist-cjs/definitions/process/index.js +0 -9
  95. package/dist-cjs/definitions/process/index.js.map +0 -1
  96. package/dist-cjs/definitions/process/process-registry.d.ts +0 -67
  97. package/dist-cjs/definitions/process/process-registry.js +0 -232
  98. package/dist-cjs/definitions/process/process-registry.js.map +0 -1
  99. package/dist-cjs/definitions/process/process.d.ts +0 -9
  100. package/dist-cjs/definitions/process/process.js +0 -390
  101. package/dist-cjs/definitions/process/process.js.map +0 -1
  102. package/dist-cjs/definitions/process/pty-keys.d.ts +0 -13
  103. package/dist-cjs/definitions/process/pty-keys.js +0 -260
  104. package/dist-cjs/definitions/process/pty-keys.js.map +0 -1
  105. package/dist-cjs/definitions/process/session-slug.d.ts +0 -1
  106. package/dist-cjs/definitions/process/session-slug.js +0 -146
  107. package/dist-cjs/definitions/process/session-slug.js.map +0 -1
  108. package/dist-cjs/definitions/quip.d.ts +0 -2
  109. package/dist-cjs/definitions/quip.js +0 -199
  110. package/dist-cjs/definitions/quip.js.map +0 -1
  111. package/dist-cjs/definitions/search.d.ts +0 -9
  112. package/dist-cjs/definitions/search.js +0 -64
  113. package/dist-cjs/definitions/search.js.map +0 -1
  114. package/dist-cjs/definitions/session-history.d.ts +0 -11
  115. package/dist-cjs/definitions/session-history.js +0 -73
  116. package/dist-cjs/definitions/session-history.js.map +0 -1
  117. package/dist-cjs/definitions/shell.d.ts +0 -8
  118. package/dist-cjs/definitions/shell.js +0 -185
  119. package/dist-cjs/definitions/shell.js.map +0 -1
  120. package/dist-cjs/definitions/slack.d.ts +0 -2
  121. package/dist-cjs/definitions/slack.js +0 -184
  122. package/dist-cjs/definitions/slack.js.map +0 -1
  123. package/dist-cjs/definitions/web.d.ts +0 -8
  124. package/dist-cjs/definitions/web.js +0 -113
  125. package/dist-cjs/definitions/web.js.map +0 -1
  126. package/dist-cjs/executors/apply-patch.d.ts +0 -51
  127. package/dist-cjs/executors/apply-patch.js +0 -939
  128. package/dist-cjs/executors/apply-patch.js.map +0 -1
  129. package/dist-cjs/executors/arion.d.ts +0 -50
  130. package/dist-cjs/executors/arion.js +0 -126
  131. package/dist-cjs/executors/arion.js.map +0 -1
  132. package/dist-cjs/executors/code-intelligence.d.ts +0 -138
  133. package/dist-cjs/executors/code-intelligence.js +0 -926
  134. package/dist-cjs/executors/code-intelligence.js.map +0 -1
  135. package/dist-cjs/executors/deploy.d.ts +0 -169
  136. package/dist-cjs/executors/deploy.js +0 -870
  137. package/dist-cjs/executors/deploy.js.map +0 -1
  138. package/dist-cjs/executors/filesystem.d.ts +0 -150
  139. package/dist-cjs/executors/filesystem.js +0 -1168
  140. package/dist-cjs/executors/filesystem.js.map +0 -1
  141. package/dist-cjs/executors/frg-freshness.d.ts +0 -93
  142. package/dist-cjs/executors/frg-freshness.js +0 -628
  143. package/dist-cjs/executors/frg-freshness.js.map +0 -1
  144. package/dist-cjs/executors/frg.d.ts +0 -27
  145. package/dist-cjs/executors/frg.js +0 -335
  146. package/dist-cjs/executors/frg.js.map +0 -1
  147. package/dist-cjs/executors/index.d.ts +0 -44
  148. package/dist-cjs/executors/index.js +0 -144
  149. package/dist-cjs/executors/index.js.map +0 -1
  150. package/dist-cjs/executors/learning-meta.d.ts +0 -87
  151. package/dist-cjs/executors/learning-meta.js +0 -1166
  152. package/dist-cjs/executors/learning-meta.js.map +0 -1
  153. package/dist-cjs/executors/lsp-client.d.ts +0 -38
  154. package/dist-cjs/executors/lsp-client.js +0 -311
  155. package/dist-cjs/executors/lsp-client.js.map +0 -1
  156. package/dist-cjs/executors/memory.d.ts +0 -203
  157. package/dist-cjs/executors/memory.js +0 -797
  158. package/dist-cjs/executors/memory.js.map +0 -1
  159. package/dist-cjs/executors/meta.d.ts +0 -73
  160. package/dist-cjs/executors/meta.js +0 -227
  161. package/dist-cjs/executors/meta.js.map +0 -1
  162. package/dist-cjs/executors/process-registry.d.ts +0 -98
  163. package/dist-cjs/executors/process-registry.js +0 -470
  164. package/dist-cjs/executors/process-registry.js.map +0 -1
  165. package/dist-cjs/executors/pty-session-store.d.ts +0 -14
  166. package/dist-cjs/executors/pty-session-store.js +0 -35
  167. package/dist-cjs/executors/pty-session-store.js.map +0 -1
  168. package/dist-cjs/executors/pty.d.ts +0 -133
  169. package/dist-cjs/executors/pty.js +0 -313
  170. package/dist-cjs/executors/pty.js.map +0 -1
  171. package/dist-cjs/executors/restart.d.ts +0 -13
  172. package/dist-cjs/executors/restart.js +0 -156
  173. package/dist-cjs/executors/restart.js.map +0 -1
  174. package/dist-cjs/executors/search-freshness.d.ts +0 -50
  175. package/dist-cjs/executors/search-freshness.js +0 -235
  176. package/dist-cjs/executors/search-freshness.js.map +0 -1
  177. package/dist-cjs/executors/search-types.d.ts +0 -52
  178. package/dist-cjs/executors/search-types.js +0 -57
  179. package/dist-cjs/executors/search-types.js.map +0 -1
  180. package/dist-cjs/executors/search.d.ts +0 -11
  181. package/dist-cjs/executors/search.js +0 -103
  182. package/dist-cjs/executors/search.js.map +0 -1
  183. package/dist-cjs/executors/self-diagnose.d.ts +0 -89
  184. package/dist-cjs/executors/self-diagnose.js +0 -435
  185. package/dist-cjs/executors/self-diagnose.js.map +0 -1
  186. package/dist-cjs/executors/session-history.d.ts +0 -75
  187. package/dist-cjs/executors/session-history.js +0 -321
  188. package/dist-cjs/executors/session-history.js.map +0 -1
  189. package/dist-cjs/executors/shell-safety.d.ts +0 -27
  190. package/dist-cjs/executors/shell-safety.js +0 -479
  191. package/dist-cjs/executors/shell-safety.js.map +0 -1
  192. package/dist-cjs/executors/shell.d.ts +0 -168
  193. package/dist-cjs/executors/shell.js +0 -1002
  194. package/dist-cjs/executors/shell.js.map +0 -1
  195. package/dist-cjs/executors/utils.d.ts +0 -20
  196. package/dist-cjs/executors/utils.js +0 -74
  197. package/dist-cjs/executors/utils.js.map +0 -1
  198. package/dist-cjs/executors/web.d.ts +0 -89
  199. package/dist-cjs/executors/web.js +0 -548
  200. package/dist-cjs/executors/web.js.map +0 -1
  201. package/dist-cjs/extraction/content-extraction.d.ts +0 -48
  202. package/dist-cjs/extraction/content-extraction.js +0 -244
  203. package/dist-cjs/extraction/content-extraction.js.map +0 -1
  204. package/dist-cjs/extraction/index.d.ts +0 -4
  205. package/dist-cjs/extraction/index.js +0 -9
  206. package/dist-cjs/extraction/index.js.map +0 -1
  207. package/dist-cjs/headless-control-contract.d.ts +0 -3182
  208. package/dist-cjs/headless-control-contract.js +0 -973
  209. package/dist-cjs/headless-control-contract.js.map +0 -1
  210. package/dist-cjs/index.d.ts +0 -62
  211. package/dist-cjs/index.js +0 -438
  212. package/dist-cjs/index.js.map +0 -1
  213. package/dist-cjs/local-control-http-auth.d.ts +0 -2
  214. package/dist-cjs/local-control-http-auth.js +0 -6
  215. package/dist-cjs/local-control-http-auth.js.map +0 -1
  216. package/dist-cjs/mcp/client.d.ts +0 -68
  217. package/dist-cjs/mcp/client.js +0 -186
  218. package/dist-cjs/mcp/client.js.map +0 -1
  219. package/dist-cjs/mcp/connection.d.ts +0 -54
  220. package/dist-cjs/mcp/connection.js +0 -485
  221. package/dist-cjs/mcp/connection.js.map +0 -1
  222. package/dist-cjs/mcp/index.d.ts +0 -10
  223. package/dist-cjs/mcp/index.js +0 -31
  224. package/dist-cjs/mcp/index.js.map +0 -1
  225. package/dist-cjs/mcp/jsonrpc.d.ts +0 -36
  226. package/dist-cjs/mcp/jsonrpc.js +0 -149
  227. package/dist-cjs/mcp/jsonrpc.js.map +0 -1
  228. package/dist-cjs/mcp/types.d.ts +0 -178
  229. package/dist-cjs/mcp/types.js +0 -9
  230. package/dist-cjs/mcp/types.js.map +0 -1
  231. package/dist-cjs/network-control-adapter.d.ts +0 -4
  232. package/dist-cjs/network-control-adapter.js +0 -78
  233. package/dist-cjs/network-control-adapter.js.map +0 -1
  234. package/dist-cjs/network-runtime/address-types.d.ts +0 -201
  235. package/dist-cjs/network-runtime/address-types.js +0 -169
  236. package/dist-cjs/network-runtime/address-types.js.map +0 -1
  237. package/dist-cjs/network-runtime/db-owner-fencing.d.ts +0 -43
  238. package/dist-cjs/network-runtime/db-owner-fencing.js +0 -77
  239. package/dist-cjs/network-runtime/db-owner-fencing.js.map +0 -1
  240. package/dist-cjs/network-runtime/delivery-receipts.d.ts +0 -117
  241. package/dist-cjs/network-runtime/delivery-receipts.js +0 -277
  242. package/dist-cjs/network-runtime/delivery-receipts.js.map +0 -1
  243. package/dist-cjs/network-runtime/direct-endpoint-authority.d.ts +0 -8
  244. package/dist-cjs/network-runtime/direct-endpoint-authority.js +0 -30
  245. package/dist-cjs/network-runtime/direct-endpoint-authority.js.map +0 -1
  246. package/dist-cjs/network-runtime/index.d.ts +0 -24
  247. package/dist-cjs/network-runtime/index.js +0 -173
  248. package/dist-cjs/network-runtime/index.js.map +0 -1
  249. package/dist-cjs/network-runtime/local-control-contract.d.ts +0 -758
  250. package/dist-cjs/network-runtime/local-control-contract.js +0 -634
  251. package/dist-cjs/network-runtime/local-control-contract.js.map +0 -1
  252. package/dist-cjs/network-runtime/node-store-contract.d.ts +0 -49
  253. package/dist-cjs/network-runtime/node-store-contract.js +0 -39
  254. package/dist-cjs/network-runtime/node-store-contract.js.map +0 -1
  255. package/dist-cjs/network-runtime/pair-route-contract.d.ts +0 -100
  256. package/dist-cjs/network-runtime/pair-route-contract.js +0 -81
  257. package/dist-cjs/network-runtime/pair-route-contract.js.map +0 -1
  258. package/dist-cjs/network-runtime/peer-capabilities.d.ts +0 -10
  259. package/dist-cjs/network-runtime/peer-capabilities.js +0 -38
  260. package/dist-cjs/network-runtime/peer-capabilities.js.map +0 -1
  261. package/dist-cjs/network-runtime/peer-principal-ref.d.ts +0 -9
  262. package/dist-cjs/network-runtime/peer-principal-ref.js +0 -16
  263. package/dist-cjs/network-runtime/peer-principal-ref.js.map +0 -1
  264. package/dist-cjs/network-runtime/peer-state-machine.d.ts +0 -70
  265. package/dist-cjs/network-runtime/peer-state-machine.js +0 -130
  266. package/dist-cjs/network-runtime/peer-state-machine.js.map +0 -1
  267. package/dist-cjs/network-runtime/protocol-schemas.d.ts +0 -328
  268. package/dist-cjs/network-runtime/protocol-schemas.js +0 -213
  269. package/dist-cjs/network-runtime/protocol-schemas.js.map +0 -1
  270. package/dist-cjs/network-runtime/runtime-bootstrap-contract.d.ts +0 -81
  271. package/dist-cjs/network-runtime/runtime-bootstrap-contract.js +0 -64
  272. package/dist-cjs/network-runtime/runtime-bootstrap-contract.js.map +0 -1
  273. package/dist-cjs/outlook/desktop-session.d.ts +0 -68
  274. package/dist-cjs/outlook/desktop-session.js +0 -319
  275. package/dist-cjs/outlook/desktop-session.js.map +0 -1
  276. package/dist-cjs/package.json +0 -3
  277. package/dist-cjs/policy.d.ts +0 -43
  278. package/dist-cjs/policy.js +0 -156
  279. package/dist-cjs/policy.js.map +0 -1
  280. package/dist-cjs/providers/brave.d.ts +0 -10
  281. package/dist-cjs/providers/brave.js +0 -67
  282. package/dist-cjs/providers/brave.js.map +0 -1
  283. package/dist-cjs/providers/duckduckgo.d.ts +0 -18
  284. package/dist-cjs/providers/duckduckgo.js +0 -181
  285. package/dist-cjs/providers/duckduckgo.js.map +0 -1
  286. package/dist-cjs/providers/exa.d.ts +0 -10
  287. package/dist-cjs/providers/exa.js +0 -68
  288. package/dist-cjs/providers/exa.js.map +0 -1
  289. package/dist-cjs/providers/firecrawl.d.ts +0 -10
  290. package/dist-cjs/providers/firecrawl.js +0 -60
  291. package/dist-cjs/providers/firecrawl.js.map +0 -1
  292. package/dist-cjs/providers/index.d.ts +0 -8
  293. package/dist-cjs/providers/index.js +0 -18
  294. package/dist-cjs/providers/index.js.map +0 -1
  295. package/dist-cjs/providers/jina.d.ts +0 -10
  296. package/dist-cjs/providers/jina.js +0 -54
  297. package/dist-cjs/providers/jina.js.map +0 -1
  298. package/dist-cjs/providers/router.d.ts +0 -21
  299. package/dist-cjs/providers/router.js +0 -101
  300. package/dist-cjs/providers/router.js.map +0 -1
  301. package/dist-cjs/providers/search-provider.d.ts +0 -35
  302. package/dist-cjs/providers/search-provider.js +0 -37
  303. package/dist-cjs/providers/search-provider.js.map +0 -1
  304. package/dist-cjs/providers/tavily.d.ts +0 -10
  305. package/dist-cjs/providers/tavily.js +0 -59
  306. package/dist-cjs/providers/tavily.js.map +0 -1
  307. package/dist-cjs/quip/desktop-session.d.ts +0 -69
  308. package/dist-cjs/quip/desktop-session.js +0 -354
  309. package/dist-cjs/quip/desktop-session.js.map +0 -1
  310. package/dist-cjs/registry/index.d.ts +0 -1
  311. package/dist-cjs/registry/index.js +0 -7
  312. package/dist-cjs/registry/index.js.map +0 -1
  313. package/dist-cjs/registry/registry.d.ts +0 -156
  314. package/dist-cjs/registry/registry.js +0 -762
  315. package/dist-cjs/registry/registry.js.map +0 -1
  316. package/dist-cjs/runtime-socket-local-control-client.d.ts +0 -10
  317. package/dist-cjs/runtime-socket-local-control-client.js +0 -368
  318. package/dist-cjs/runtime-socket-local-control-client.js.map +0 -1
  319. package/dist-cjs/security/dns-normalization.d.ts +0 -6
  320. package/dist-cjs/security/dns-normalization.js +0 -23
  321. package/dist-cjs/security/dns-normalization.js.map +0 -1
  322. package/dist-cjs/security/dns-pinning.d.ts +0 -27
  323. package/dist-cjs/security/dns-pinning.js +0 -161
  324. package/dist-cjs/security/dns-pinning.js.map +0 -1
  325. package/dist-cjs/security/external-content.d.ts +0 -40
  326. package/dist-cjs/security/external-content.js +0 -96
  327. package/dist-cjs/security/external-content.js.map +0 -1
  328. package/dist-cjs/security/ssrf.d.ts +0 -40
  329. package/dist-cjs/security/ssrf.js +0 -222
  330. package/dist-cjs/security/ssrf.js.map +0 -1
  331. package/dist-cjs/slack/desktop-session.d.ts +0 -69
  332. package/dist-cjs/slack/desktop-session.js +0 -367
  333. package/dist-cjs/slack/desktop-session.js.map +0 -1
  334. package/dist-cjs/tool-factory.d.ts +0 -46
  335. package/dist-cjs/tool-factory.js +0 -51
  336. package/dist-cjs/tool-factory.js.map +0 -1
  337. package/dist-cjs/types.d.ts +0 -1192
  338. package/dist-cjs/types.js +0 -9
  339. package/dist-cjs/types.js.map +0 -1
  340. package/dist-cjs/utils/retry.d.ts +0 -11
  341. package/dist-cjs/utils/retry.js +0 -170
  342. package/dist-cjs/utils/retry.js.map +0 -1
  343. package/dist-cjs/utils/safe-parse-json.d.ts +0 -26
  344. package/dist-cjs/utils/safe-parse-json.js +0 -165
  345. package/dist-cjs/utils/safe-parse-json.js.map +0 -1
  346. package/dist-cjs/utils/url.d.ts +0 -10
  347. package/dist-cjs/utils/url.js +0 -24
  348. package/dist-cjs/utils/url.js.map +0 -1
  349. package/src/__tests__/web-fetch-download.test.ts +0 -433
  350. package/src/__tests__/web-tools.test.ts +0 -619
  351. package/src/ask-user-interaction.ts +0 -33
  352. package/src/cache/web-cache.ts +0 -110
  353. package/src/definitions/arion.ts +0 -118
  354. package/src/definitions/browser/browser.ts +0 -502
  355. package/src/definitions/browser/index.ts +0 -5
  356. package/src/definitions/browser/pw-downloads.ts +0 -142
  357. package/src/definitions/browser/pw-interactions.ts +0 -282
  358. package/src/definitions/browser/pw-responses.ts +0 -98
  359. package/src/definitions/browser/pw-session.ts +0 -405
  360. package/src/definitions/browser/pw-shared.ts +0 -85
  361. package/src/definitions/browser/pw-snapshot.ts +0 -383
  362. package/src/definitions/browser/pw-state.ts +0 -101
  363. package/src/definitions/browser/types.ts +0 -203
  364. package/src/definitions/code-intelligence.ts +0 -526
  365. package/src/definitions/core.ts +0 -118
  366. package/src/definitions/delegation.ts +0 -567
  367. package/src/definitions/deploy.ts +0 -73
  368. package/src/definitions/filesystem.ts +0 -217
  369. package/src/definitions/frg.ts +0 -67
  370. package/src/definitions/index.ts +0 -28
  371. package/src/definitions/memory.ts +0 -150
  372. package/src/definitions/messaging.ts +0 -734
  373. package/src/definitions/meta.ts +0 -392
  374. package/src/definitions/network.ts +0 -179
  375. package/src/definitions/outlook.ts +0 -318
  376. package/src/definitions/patch/apply-patch.ts +0 -235
  377. package/src/definitions/patch/fuzzy-match.ts +0 -217
  378. package/src/definitions/patch/index.ts +0 -1
  379. package/src/definitions/patch/patch-parser.ts +0 -297
  380. package/src/definitions/patch/sandbox-paths.ts +0 -129
  381. package/src/definitions/process/index.ts +0 -5
  382. package/src/definitions/process/process-registry.ts +0 -303
  383. package/src/definitions/process/process.ts +0 -456
  384. package/src/definitions/process/pty-keys.ts +0 -298
  385. package/src/definitions/process/session-slug.ts +0 -147
  386. package/src/definitions/quip.ts +0 -225
  387. package/src/definitions/search.ts +0 -67
  388. package/src/definitions/session-history.ts +0 -79
  389. package/src/definitions/shell.ts +0 -202
  390. package/src/definitions/slack.ts +0 -211
  391. package/src/definitions/web.ts +0 -119
  392. package/src/executors/apply-patch.ts +0 -1035
  393. package/src/executors/arion.ts +0 -199
  394. package/src/executors/code-intelligence.ts +0 -1179
  395. package/src/executors/deploy.ts +0 -1066
  396. package/src/executors/filesystem.ts +0 -1428
  397. package/src/executors/frg-freshness.ts +0 -743
  398. package/src/executors/frg.ts +0 -394
  399. package/src/executors/index.ts +0 -280
  400. package/src/executors/learning-meta.ts +0 -1367
  401. package/src/executors/lsp-client.ts +0 -355
  402. package/src/executors/memory.ts +0 -978
  403. package/src/executors/meta.ts +0 -293
  404. package/src/executors/process-registry.ts +0 -570
  405. package/src/executors/pty-session-store.ts +0 -43
  406. package/src/executors/pty.ts +0 -342
  407. package/src/executors/restart.ts +0 -133
  408. package/src/executors/search-freshness.ts +0 -249
  409. package/src/executors/search-types.ts +0 -98
  410. package/src/executors/search.ts +0 -89
  411. package/src/executors/self-diagnose.ts +0 -552
  412. package/src/executors/session-history.ts +0 -435
  413. package/src/executors/shell-safety.ts +0 -519
  414. package/src/executors/shell.ts +0 -1243
  415. package/src/executors/utils.ts +0 -40
  416. package/src/executors/web.ts +0 -786
  417. package/src/extraction/content-extraction.ts +0 -281
  418. package/src/extraction/index.ts +0 -5
  419. package/src/headless-control-contract.ts +0 -1149
  420. package/src/index.ts +0 -788
  421. package/src/local-control-http-auth.ts +0 -2
  422. package/src/mcp/client.ts +0 -218
  423. package/src/mcp/connection.ts +0 -568
  424. package/src/mcp/index.ts +0 -11
  425. package/src/mcp/jsonrpc.ts +0 -195
  426. package/src/mcp/types.ts +0 -199
  427. package/src/network-control-adapter.ts +0 -88
  428. package/src/network-runtime/address-types.ts +0 -218
  429. package/src/network-runtime/db-owner-fencing.ts +0 -91
  430. package/src/network-runtime/delivery-receipts.ts +0 -372
  431. package/src/network-runtime/direct-endpoint-authority.ts +0 -35
  432. package/src/network-runtime/index.ts +0 -316
  433. package/src/network-runtime/local-control-contract.ts +0 -784
  434. package/src/network-runtime/node-store-contract.ts +0 -46
  435. package/src/network-runtime/pair-route-contract.ts +0 -97
  436. package/src/network-runtime/peer-capabilities.ts +0 -48
  437. package/src/network-runtime/peer-principal-ref.ts +0 -20
  438. package/src/network-runtime/peer-state-machine.ts +0 -160
  439. package/src/network-runtime/protocol-schemas.ts +0 -265
  440. package/src/network-runtime/runtime-bootstrap-contract.ts +0 -83
  441. package/src/outlook/desktop-session.ts +0 -409
  442. package/src/policy.ts +0 -171
  443. package/src/providers/brave.ts +0 -80
  444. package/src/providers/duckduckgo.ts +0 -199
  445. package/src/providers/exa.ts +0 -85
  446. package/src/providers/firecrawl.ts +0 -77
  447. package/src/providers/index.ts +0 -8
  448. package/src/providers/jina.ts +0 -70
  449. package/src/providers/router.ts +0 -121
  450. package/src/providers/search-provider.ts +0 -74
  451. package/src/providers/tavily.ts +0 -74
  452. package/src/quip/desktop-session.ts +0 -435
  453. package/src/registry/index.ts +0 -1
  454. package/src/registry/registry.ts +0 -905
  455. package/src/runtime-socket-local-control-client.ts +0 -632
  456. package/src/security/dns-normalization.ts +0 -34
  457. package/src/security/dns-pinning.ts +0 -138
  458. package/src/security/external-content.ts +0 -129
  459. package/src/security/ssrf.ts +0 -207
  460. package/src/slack/desktop-session.ts +0 -493
  461. package/src/tool-factory.ts +0 -91
  462. package/src/types.ts +0 -1341
  463. package/src/utils/retry.ts +0 -163
  464. package/src/utils/safe-parse-json.ts +0 -176
  465. package/src/utils/url.ts +0 -20
  466. package/tests/benchmarks/registry.bench.ts +0 -57
  467. package/tests/cache/web-cache.test.ts +0 -147
  468. package/tests/critical-integration.test.ts +0 -1465
  469. package/tests/definitions/apply-patch.test.ts +0 -586
  470. package/tests/definitions/browser.test.ts +0 -495
  471. package/tests/definitions/delegation-pause-resume.test.ts +0 -758
  472. package/tests/definitions/execution.test.ts +0 -671
  473. package/tests/definitions/messaging-inbox-scope.test.ts +0 -229
  474. package/tests/definitions/messaging.test.ts +0 -1468
  475. package/tests/definitions/outlook.test.ts +0 -30
  476. package/tests/definitions/process.test.ts +0 -469
  477. package/tests/definitions/slack.test.ts +0 -28
  478. package/tests/definitions/tool-inventory.test.ts +0 -218
  479. package/tests/e2e/delegation-quest-orchestration.e2e.test.ts +0 -433
  480. package/tests/e2e/memory-tool-discovery-contract.e2e.test.ts +0 -81
  481. package/tests/executors/apply-patch.test.ts +0 -538
  482. package/tests/executors/arion.test.ts +0 -309
  483. package/tests/executors/conversation-primitives.test.ts +0 -250
  484. package/tests/executors/deploy.test.ts +0 -746
  485. package/tests/executors/filesystem-tools.test.ts +0 -357
  486. package/tests/executors/filesystem.test.ts +0 -959
  487. package/tests/executors/frg-freshness.test.ts +0 -136
  488. package/tests/executors/frg-merge.test.ts +0 -70
  489. package/tests/executors/frg-session-content.test.ts +0 -40
  490. package/tests/executors/frg.test.ts +0 -56
  491. package/tests/executors/memory-bugfixes.test.ts +0 -257
  492. package/tests/executors/memory-real-memoria.integration.test.ts +0 -316
  493. package/tests/executors/memory.test.ts +0 -853
  494. package/tests/executors/meta-tools.test.ts +0 -411
  495. package/tests/executors/meta.test.ts +0 -683
  496. package/tests/executors/path-containment.test.ts +0 -51
  497. package/tests/executors/process-registry.test.ts +0 -505
  498. package/tests/executors/pty.test.ts +0 -664
  499. package/tests/executors/quest-security.test.ts +0 -249
  500. package/tests/executors/read-file-media.test.ts +0 -230
  501. package/tests/executors/recall-knowledge-schema.test.ts +0 -209
  502. package/tests/executors/recall-tags.test.ts +0 -278
  503. package/tests/executors/remember-null-safety.contract.test.ts +0 -41
  504. package/tests/executors/restart.test.ts +0 -67
  505. package/tests/executors/search-unified.test.ts +0 -381
  506. package/tests/executors/session-history.test.ts +0 -340
  507. package/tests/executors/session-transcript.test.ts +0 -561
  508. package/tests/executors/shell-abort.test.ts +0 -416
  509. package/tests/executors/shell-env-blocklist.test.ts +0 -648
  510. package/tests/executors/shell-env-process.test.ts +0 -245
  511. package/tests/executors/shell-process-registry.test.ts +0 -334
  512. package/tests/executors/shell-tools.test.ts +0 -393
  513. package/tests/executors/shell.test.ts +0 -690
  514. package/tests/executors/web-abort-vs-timeout.test.ts +0 -213
  515. package/tests/executors/web-integration.test.ts +0 -633
  516. package/tests/executors/web-symlink.test.ts +0 -18
  517. package/tests/executors/web.test.ts +0 -1400
  518. package/tests/executors/write-stdin.test.ts +0 -145
  519. package/tests/extraction/content-extraction.test.ts +0 -153
  520. package/tests/guards/tools-default-test-lane.integration.test.ts +0 -21
  521. package/tests/guards/tools-package-test-commands.e2e.test.ts +0 -43
  522. package/tests/guards/tools-test-lane-manifest.contract.test.ts +0 -76
  523. package/tests/guards/tools-vitest-workspace-alias.contract.test.ts +0 -63
  524. package/tests/helpers/async-waits.ts +0 -53
  525. package/tests/integration/headless-control-contract.integration.test.ts +0 -153
  526. package/tests/integration/memory-tool-schema-parity.integration.test.ts +0 -67
  527. package/tests/integration/meta-tools-round-trip.integration.test.ts +0 -506
  528. package/tests/integration/quest-round-trip.test.ts +0 -303
  529. package/tests/integration/registry-executor-flow.test.ts +0 -85
  530. package/tests/integration.test.ts +0 -177
  531. package/tests/loading-tier.test.ts +0 -126
  532. package/tests/mcp/client-reconnect.test.ts +0 -267
  533. package/tests/mcp/connection.test.ts +0 -846
  534. package/tests/mcp/injectable-logger.test.ts +0 -83
  535. package/tests/mcp/jsonrpc.test.ts +0 -109
  536. package/tests/mcp/lifecycle.test.ts +0 -879
  537. package/tests/network-runtime/address-types.contract.test.ts +0 -143
  538. package/tests/network-runtime/continuity-bind-schema.contract.test.ts +0 -203
  539. package/tests/network-runtime/local-control-contract.test.ts +0 -869
  540. package/tests/network-runtime/local-control-invite-token.contract.test.ts +0 -146
  541. package/tests/network-runtime/node-store-contract.test.ts +0 -11
  542. package/tests/network-runtime/pair-protocol-nodeid.contract.test.ts +0 -15
  543. package/tests/network-runtime/peer-state-machine.contract.test.ts +0 -148
  544. package/tests/network-runtime/protocol-schemas.contract.test.ts +0 -512
  545. package/tests/network-runtime/relay-pending-nodeid.contract.test.ts +0 -62
  546. package/tests/network-runtime/runtime-bootstrap-contract.test.ts +0 -227
  547. package/tests/network-runtime/runtime-socket-local-control-client.test.ts +0 -621
  548. package/tests/network-runtime/wait-for-message-script.test.ts +0 -288
  549. package/tests/parallel.test.ts +0 -71
  550. package/tests/policy.test.ts +0 -184
  551. package/tests/print-default-test-lane.ts +0 -14
  552. package/tests/print-test-lane-manifest.ts +0 -22
  553. package/tests/providers/brave.test.ts +0 -159
  554. package/tests/providers/duckduckgo.test.ts +0 -207
  555. package/tests/providers/exa.test.ts +0 -175
  556. package/tests/providers/firecrawl.test.ts +0 -168
  557. package/tests/providers/jina.test.ts +0 -144
  558. package/tests/providers/router.test.ts +0 -328
  559. package/tests/providers/tavily.test.ts +0 -165
  560. package/tests/registry/discovery.test.ts +0 -154
  561. package/tests/registry/injectable-logger.test.ts +0 -230
  562. package/tests/registry/input-validation.test.ts +0 -361
  563. package/tests/registry/interface-completeness.test.ts +0 -85
  564. package/tests/registry/mcp-integration.test.ts +0 -103
  565. package/tests/registry/mcp-read-only-hint.test.ts +0 -60
  566. package/tests/registry/memoria-discovery.test.ts +0 -390
  567. package/tests/registry/nested-validation.test.ts +0 -283
  568. package/tests/registry/pseudo-tool-filtering.test.ts +0 -258
  569. package/tests/registry/registration-lifecycle.test.ts +0 -133
  570. package/tests/registry-validation.test.ts +0 -424
  571. package/tests/registry.test.ts +0 -460
  572. package/tests/security/dns-pinning.test.ts +0 -162
  573. package/tests/security/external-content.test.ts +0 -144
  574. package/tests/security/ssrf.test.ts +0 -118
  575. package/tests/shell-safety-integration.test.ts +0 -32
  576. package/tests/shell-safety.test.ts +0 -365
  577. package/tests/slack/desktop-session.test.ts +0 -50
  578. package/tests/test-lane-manifest.ts +0 -440
  579. package/tests/test-utils.ts +0 -27
  580. package/tests/tool-factory.test.ts +0 -188
  581. package/tests/utils/retry.test.ts +0 -231
  582. package/tests/utils/url.test.ts +0 -63
  583. package/tsconfig.cjs.json +0 -24
  584. package/tsconfig.json +0 -12
  585. package/vitest.config.ts +0 -55
  586. package/vitest.e2e.config.ts +0 -24
  587. package/vitest.integration.config.ts +0 -24
  588. package/vitest.native.config.ts +0 -24
@@ -1,1066 +0,0 @@
1
- /**
2
- * @aria/tools - Deploy tool executor
3
- *
4
- * Deploys ARIA to a remote machine via SSH. Handles OS detection,
5
- * Node.js installation, repo setup, keypair generation, TLS cert
6
- * discovery/provisioning, firewall configuration, config writing,
7
- * daemon startup, and health check.
8
- */
9
-
10
- import { spawn } from "node:child_process";
11
- import type { ToolContext, ToolResult } from "../types.js";
12
- import { success, fail } from "./utils.js";
13
-
14
- // ============================================================================
15
- // Types
16
- // ============================================================================
17
-
18
- export interface DeployInput {
19
- /** SSH target (e.g. "claude@10.0.0.1") */
20
- target: string;
21
- /** Git repo URL (default: current origin) */
22
- repo_url?: string;
23
- /** Branch to deploy (default: main) */
24
- branch?: string;
25
- /** Arion identity name (default: hostname of target) */
26
- arion_name?: string;
27
- /** Mesh coordination URL */
28
- coordination_url?: string;
29
- /** Path to SSH private key */
30
- ssh_key_path?: string;
31
- /** Git commit hash to checkout after clone (pins exact code version) */
32
- commit_hash?: string;
33
- /** Verify GPG signature on HEAD commit after checkout */
34
- verify_signatures?: boolean;
35
- }
36
-
37
- export interface DeployOutput {
38
- success: boolean;
39
- host: string;
40
- port: number | null;
41
- fingerprint: string | null;
42
- arionName: string;
43
- tlsType: TlsType | null;
44
- }
45
-
46
- export type TlsType = "real-ca" | "letsencrypt" | "private-ca";
47
-
48
- export interface OSInfo {
49
- os: "linux" | "darwin" | "windows" | "unknown";
50
- }
51
-
52
- export type LinuxDistro = "apt" | "dnf" | "apk";
53
-
54
- export type FirewallType = "ufw" | "iptables" | "firewalld" | "windows" | "none";
55
-
56
- export interface TlsDiscoveryResult {
57
- found: boolean;
58
- type?: TlsType;
59
- cert?: string;
60
- key?: string;
61
- }
62
-
63
- // ============================================================================
64
- // Pure Helper Functions (exported for testing)
65
- // ============================================================================
66
-
67
- /**
68
- * Detect OS type from `uname -s` output.
69
- */
70
- export function detectOS(unameOutput: string): OSInfo {
71
- const trimmed = unameOutput.trim();
72
- if (!trimmed || trimmed === "UNKNOWN") {
73
- return { os: "unknown" };
74
- }
75
- if (trimmed === "Linux") {
76
- return { os: "linux" };
77
- }
78
- if (trimmed === "Darwin") {
79
- return { os: "darwin" };
80
- }
81
- // MINGW, MSYS, CYGWIN, or Windows-style output
82
- if (/^(MINGW|MSYS|CYGWIN)/i.test(trimmed) || /windows/i.test(trimmed)) {
83
- return { os: "windows" };
84
- }
85
- return { os: "unknown" };
86
- }
87
-
88
- /**
89
- * Detect Linux distribution from /etc/os-release content.
90
- * Returns the package manager type to use.
91
- */
92
- export function detectLinuxDistro(osReleaseContent: string): LinuxDistro {
93
- const lower = osReleaseContent.toLowerCase();
94
-
95
- // Extract ID and ID_LIKE fields
96
- const idMatch = lower.match(/^id=(.+)$/m);
97
- const idLikeMatch = lower.match(/^id_like=(.+)$/m);
98
- const id = idMatch?.[1]?.replace(/"/g, "").trim() ?? "";
99
- const idLike = idLikeMatch?.[1]?.replace(/"/g, "").trim() ?? "";
100
-
101
- // Alpine
102
- if (id === "alpine") {
103
- return "apk";
104
- }
105
-
106
- // Debian/Ubuntu family
107
- if (
108
- id === "debian" ||
109
- id === "ubuntu" ||
110
- idLike.includes("debian") ||
111
- idLike.includes("ubuntu")
112
- ) {
113
- return "apt";
114
- }
115
-
116
- // RHEL/Fedora/CentOS/Amazon Linux family
117
- if (
118
- id === "fedora" ||
119
- id === "rhel" ||
120
- id === "centos" ||
121
- id === "amzn" ||
122
- id === "rocky" ||
123
- id === "almalinux" ||
124
- idLike.includes("fedora") ||
125
- idLike.includes("rhel") ||
126
- idLike.includes("centos") ||
127
- idLike.includes("suse")
128
- ) {
129
- return "dnf";
130
- }
131
-
132
- // Default to apt (nvm-based install works universally)
133
- return "apt";
134
- }
135
-
136
- /**
137
- * Get the shell command to install Node.js for a given OS and distro.
138
- */
139
- export function getNodeInstallCommand(osInfo: OSInfo, distro: LinuxDistro): string {
140
- switch (osInfo.os) {
141
- case "linux":
142
- switch (distro) {
143
- case "apk":
144
- return "apk add --no-cache nodejs npm";
145
- case "dnf":
146
- return "dnf module install -y nodejs:22 || dnf install -y nodejs";
147
- case "apt":
148
- default:
149
- return (
150
- "curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash && " +
151
- 'export NVM_DIR="$HOME/.nvm" && . "$NVM_DIR/nvm.sh" && nvm install 22'
152
- );
153
- }
154
-
155
- case "darwin":
156
- return (
157
- "command -v brew >/dev/null && brew install node@22 || " +
158
- "{ curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash && " +
159
- 'export NVM_DIR="$HOME/.nvm" && . "$NVM_DIR/nvm.sh" && nvm install 22; }'
160
- );
161
-
162
- case "windows":
163
- return "winget install --id OpenJS.NodeJS.LTS --accept-source-agreements --accept-package-agreements";
164
-
165
- default:
166
- throw new Error(`Unsupported OS: ${osInfo.os}. Deploy supports Linux, macOS, and Windows.`);
167
- }
168
- }
169
-
170
- /**
171
- * Generate firewall commands to open ARIA ports (443/tcp + 51820/udp).
172
- */
173
- export function getFirewallCommands(firewallType: FirewallType): string {
174
- switch (firewallType) {
175
- case "ufw":
176
- return "ufw allow 443/tcp && ufw allow 51820/udp";
177
-
178
- case "iptables":
179
- return (
180
- "iptables -A INPUT -p tcp --dport 443 -j ACCEPT && " +
181
- "iptables -A INPUT -p udp --dport 51820 -j ACCEPT"
182
- );
183
-
184
- case "firewalld":
185
- return (
186
- "firewall-cmd --permanent --add-port=443/tcp && " +
187
- "firewall-cmd --permanent --add-port=51820/udp && " +
188
- "firewall-cmd --reload"
189
- );
190
-
191
- case "windows":
192
- return (
193
- 'netsh advfirewall firewall add rule name="ARIA HTTPS" dir=in action=allow protocol=tcp localport=443 && ' +
194
- 'netsh advfirewall firewall add rule name="ARIA WireGuard" dir=in action=allow protocol=udp localport=51820'
195
- );
196
-
197
- case "none":
198
- return "";
199
- }
200
- }
201
-
202
- /**
203
- * Parse TLS cert discovery output from the remote host.
204
- * The discovery script outputs JSON: { found, type?, cert?, key? }
205
- */
206
- export function discoverTlsCerts(sshOutput: string): TlsDiscoveryResult {
207
- if (!sshOutput || !sshOutput.trim()) {
208
- return { found: false };
209
- }
210
- try {
211
- const data = JSON.parse(sshOutput.trim());
212
- if (data.found === true && data.cert && data.key) {
213
- return {
214
- found: true,
215
- type: data.type as TlsType,
216
- cert: data.cert,
217
- key: data.key,
218
- };
219
- }
220
- return { found: false };
221
- } catch {
222
- return { found: false };
223
- }
224
- }
225
-
226
- /**
227
- * Build the config JSON object for ~/.aria/config.json.
228
- */
229
- export function buildConfigJson(params: {
230
- arionName: string;
231
- coordinationUrl?: string;
232
- tlsCert?: string;
233
- tlsKey?: string;
234
- }): Record<string, unknown> {
235
- const config: Record<string, unknown> = {
236
- arion_name: params.arionName,
237
- };
238
- if (params.coordinationUrl) {
239
- config.coordination_url = params.coordinationUrl;
240
- }
241
- if (params.tlsCert && params.tlsKey) {
242
- config.tls = {
243
- cert: params.tlsCert,
244
- key: params.tlsKey,
245
- };
246
- }
247
- return config;
248
- }
249
-
250
- /**
251
- * Construct the health check URL for the deployed daemon.
252
- */
253
- export function buildHealthCheckUrl(host: string, port?: number): string {
254
- const p = port ?? 443;
255
- return `https://${host}:${p}/api/v1/network/peers`;
256
- }
257
-
258
- function buildRemoteRuntimePidLookupCommand(repoDir: string): string {
259
- return `
260
- export NVM_DIR="$HOME/.nvm" && [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
261
- cd ${repoDir} && node --input-type=module <<'NODE'
262
- import { resolveOrCreateNode, resolveRuntimeRootDirectory, readRuntimeOwnerRecord } from "./packages/server/dist/index.js";
263
- const ariaHome = process.env.ARIA_HOME || (process.env.HOME + "/.aria");
264
- const resolved = await resolveOrCreateNode({ ariaHome });
265
- const record = readRuntimeOwnerRecord(resolveRuntimeRootDirectory(), resolved.nodeId);
266
- if (record?.runtimePid) {
267
- console.log(String(record.runtimePid));
268
- }
269
- NODE
270
- `;
271
- }
272
-
273
- function buildRemoteRuntimeStatusLookupCommand(repoDir: string): string {
274
- return `
275
- export NVM_DIR="$HOME/.nvm" && [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
276
- cd ${repoDir} && node --input-type=module <<'NODE'
277
- import { createRuntimeSocketLocalControlClient } from "./packages/tools/dist/index.js";
278
- import { resolveOrCreateNode, resolveRuntimeRootDirectory, readRuntimeOwnerRecord } from "./packages/server/dist/index.js";
279
- const ariaHome = process.env.ARIA_HOME || (process.env.HOME + "/.aria");
280
- const resolved = await resolveOrCreateNode({ ariaHome });
281
- const record = readRuntimeOwnerRecord(resolveRuntimeRootDirectory(), resolved.nodeId);
282
- if (!record?.runtimeSocket) {
283
- process.exit(1);
284
- }
285
- const client = createRuntimeSocketLocalControlClient({ runtimeSocket: record.runtimeSocket });
286
- const status = await client.getRuntimeStatus();
287
- console.log(JSON.stringify(status));
288
- NODE
289
- `;
290
- }
291
-
292
- // ============================================================================
293
- // Input Validators (A1 — prevent shell injection)
294
- // ============================================================================
295
-
296
- /**
297
- * Validate git repo URL — must be HTTPS with no shell metacharacters.
298
- */
299
- export function validateRepoUrl(url: string): string | null {
300
- if (!url) return null;
301
- if (!/^https?:\/\/[a-zA-Z0-9.-]+\/[a-zA-Z0-9_.\/-]+(?:\.git)?$/.test(url)) {
302
- return "Invalid repo URL format. Use 'https://host/org/repo.git'.";
303
- }
304
- return null;
305
- }
306
-
307
- /**
308
- * Validate branch name — alphanumeric, dots, slashes, hyphens, underscores.
309
- * Rejects shell metacharacters and path traversal.
310
- */
311
- export function validateBranch(branch: string): string | null {
312
- if (!branch) return null;
313
- if (!/^[a-zA-Z0-9_.\/-]+$/.test(branch) || branch.includes("..")) {
314
- return "Invalid branch name. Alphanumeric, dots, slashes, hyphens only.";
315
- }
316
- return null;
317
- }
318
-
319
- /**
320
- * Validate arion name — alphanumeric, underscores, hyphens only.
321
- */
322
- export function validateArionName(name: string): string | null {
323
- if (!name) return null;
324
- if (!/^[a-zA-Z0-9_-]+$/.test(name)) {
325
- return "Invalid arion name. Alphanumeric, underscores, hyphens only.";
326
- }
327
- return null;
328
- }
329
-
330
- /**
331
- * Validate SSH key path — reject traversal and shell metacharacters.
332
- */
333
- export function validateSshKeyPath(keyPath: string): string | null {
334
- if (!keyPath) return null;
335
- if (keyPath.includes("..") || /[;|&`$(){}!<>]/.test(keyPath)) {
336
- return "Invalid SSH key path. No traversal or shell metacharacters.";
337
- }
338
- return null;
339
- }
340
-
341
- /**
342
- * Validate git commit hash — must be 7-64 lowercase hex characters.
343
- * Rejects non-hex, too-short, and shell injection attempts.
344
- */
345
- export function validateCommitHash(hash: string): string | null {
346
- if (!hash) return null;
347
- if (!/^[a-f0-9]{7,64}$/.test(hash)) {
348
- return "Invalid commit hash. Must be 7-64 lowercase hex characters.";
349
- }
350
- return null;
351
- }
352
-
353
- /**
354
- * Pinned pnpm version — matches packageManager field in root package.json.
355
- * Prevents unpinned `pnpm@latest` from pulling a compromised version.
356
- */
357
- export const PINNED_PNPM_VERSION = "10.28.2";
358
-
359
- // ============================================================================
360
- // Rollback Mechanism (A2)
361
- // ============================================================================
362
-
363
- /**
364
- * Represents a mutating deploy step that can be undone.
365
- */
366
- export interface DeployStep {
367
- /** Human-readable step name */
368
- name: string;
369
- /** Shell command to reverse this step (empty string = not reversible) */
370
- undoCmd: string;
371
- }
372
-
373
- /**
374
- * Get firewall undo commands to reverse port-opening rules.
375
- */
376
- export function getFirewallUndoCommands(firewallType: FirewallType): string {
377
- switch (firewallType) {
378
- case "ufw":
379
- return "ufw delete allow 443/tcp && ufw delete allow 51820/udp";
380
-
381
- case "iptables":
382
- return (
383
- "iptables -D INPUT -p tcp --dport 443 -j ACCEPT && " +
384
- "iptables -D INPUT -p udp --dport 51820 -j ACCEPT"
385
- );
386
-
387
- case "firewalld":
388
- return (
389
- "firewall-cmd --permanent --remove-port=443/tcp && " +
390
- "firewall-cmd --permanent --remove-port=51820/udp && " +
391
- "firewall-cmd --reload"
392
- );
393
-
394
- case "windows":
395
- return (
396
- 'netsh advfirewall firewall delete rule name="ARIA HTTPS" && ' +
397
- 'netsh advfirewall firewall delete rule name="ARIA WireGuard"'
398
- );
399
-
400
- case "none":
401
- return "";
402
- }
403
- }
404
-
405
- /**
406
- * Build rollback commands from recorded deploy steps.
407
- * Returns commands in reverse order (last step undone first).
408
- * Skips steps with empty undoCmd.
409
- */
410
- export function buildRollbackCommands(steps: DeployStep[]): string[] {
411
- return steps
412
- .filter((s) => s.undoCmd.length > 0)
413
- .reverse()
414
- .map((s) => s.undoCmd);
415
- }
416
-
417
- // ============================================================================
418
- // Idempotency — Deep Merge Config (A3)
419
- // ============================================================================
420
-
421
- /**
422
- * Deep-merge two config objects. Preserves nested objects from existing config
423
- * while applying updates. Does not mutate inputs.
424
- */
425
- export function deepMergeConfig(
426
- existing: Record<string, unknown>,
427
- update: Record<string, unknown>,
428
- ): Record<string, unknown> {
429
- const result: Record<string, unknown> = {};
430
-
431
- // Copy all existing keys
432
- for (const key of Object.keys(existing)) {
433
- const val = existing[key];
434
- if (val !== null && typeof val === "object" && !Array.isArray(val)) {
435
- result[key] = { ...(val as Record<string, unknown>) };
436
- } else {
437
- result[key] = val;
438
- }
439
- }
440
-
441
- // Apply updates
442
- for (const key of Object.keys(update)) {
443
- const updateVal = update[key];
444
- const existingVal = result[key];
445
-
446
- if (
447
- updateVal !== null &&
448
- typeof updateVal === "object" &&
449
- !Array.isArray(updateVal) &&
450
- existingVal !== null &&
451
- typeof existingVal === "object" &&
452
- !Array.isArray(existingVal)
453
- ) {
454
- // Recursive merge for nested objects
455
- result[key] = deepMergeConfig(
456
- existingVal as Record<string, unknown>,
457
- updateVal as Record<string, unknown>,
458
- );
459
- } else {
460
- result[key] = updateVal;
461
- }
462
- }
463
-
464
- return result;
465
- }
466
-
467
- // ============================================================================
468
- // Key Permissions (A3)
469
- // ============================================================================
470
-
471
- /**
472
- * Get chmod commands to restrict key and config file permissions to owner-only.
473
- */
474
- export function getKeyPermissionCommands(): string {
475
- return "chmod 600 ~/.aria/signing-key.json && chmod 600 ~/.aria/config.json";
476
- }
477
-
478
- // ============================================================================
479
- // SSH Helper
480
- // ============================================================================
481
-
482
- /**
483
- * Validate SSH target format — prevent command injection.
484
- */
485
- function validateTarget(target: string): string | null {
486
- if (!target) {
487
- return "target is required (e.g. 'user@host')";
488
- }
489
- // Block shell metacharacters that could enable injection
490
- if (/[;|&`$(){}!<>\s]/.test(target)) {
491
- return "Invalid target format. Use 'user@host' or 'hostname'.";
492
- }
493
- return null;
494
- }
495
-
496
- /**
497
- * Execute a command on the remote host via SSH.
498
- * Returns { stdout, stderr, exitCode }.
499
- */
500
- export function sshExec(
501
- target: string,
502
- command: string,
503
- options?: { sshKeyPath?: string; timeoutMs?: number; abortSignal?: AbortSignal },
504
- ): Promise<{ stdout: string; stderr: string; exitCode: number }> {
505
- return new Promise((resolve, reject) => {
506
- const args: string[] = [
507
- "-o",
508
- "StrictHostKeyChecking=accept-new",
509
- "-o",
510
- "ConnectTimeout=10",
511
- "-o",
512
- "BatchMode=yes",
513
- ];
514
- if (options?.sshKeyPath) {
515
- args.push("-i", options.sshKeyPath);
516
- }
517
- args.push(target, command);
518
-
519
- const child = spawn("ssh", args, {
520
- stdio: ["ignore", "pipe", "pipe"],
521
- });
522
-
523
- let stdout = "";
524
- let stderr = "";
525
-
526
- child.stdout.on("data", (data: Buffer) => {
527
- stdout += data.toString();
528
- });
529
- child.stderr.on("data", (data: Buffer) => {
530
- stderr += data.toString();
531
- });
532
-
533
- const timeoutMs = options?.timeoutMs ?? 120_000;
534
- const timer = setTimeout(() => {
535
- child.kill("SIGTERM");
536
- reject(new Error(`SSH command timed out after ${timeoutMs}ms: ${command}`));
537
- }, timeoutMs);
538
-
539
- if (options?.abortSignal) {
540
- options.abortSignal.addEventListener(
541
- "abort",
542
- () => {
543
- child.kill("SIGTERM");
544
- clearTimeout(timer);
545
- reject(new Error("SSH command aborted"));
546
- },
547
- { once: true },
548
- );
549
- }
550
-
551
- child.on("close", (code) => {
552
- clearTimeout(timer);
553
- resolve({ stdout: stdout.trim(), stderr: stderr.trim(), exitCode: code ?? 1 });
554
- });
555
-
556
- child.on("error", (err) => {
557
- clearTimeout(timer);
558
- reject(err);
559
- });
560
- });
561
- }
562
-
563
- // ============================================================================
564
- // TLS Discovery Script (run on remote host)
565
- // ============================================================================
566
-
567
- const TLS_DISCOVERY_SCRIPT = `
568
- node -e "
569
- const fs = require('fs');
570
- const path = require('path');
571
-
572
- // Check Let's Encrypt first
573
- const leDirs = ['/etc/letsencrypt/live'];
574
- for (const dir of leDirs) {
575
- try {
576
- const domains = fs.readdirSync(dir).filter(d => !d.startsWith('.'));
577
- for (const domain of domains) {
578
- const cert = path.join(dir, domain, 'fullchain.pem');
579
- const key = path.join(dir, domain, 'privkey.pem');
580
- if (fs.existsSync(cert) && fs.existsSync(key)) {
581
- console.log(JSON.stringify({ found: true, type: 'letsencrypt', cert, key }));
582
- process.exit(0);
583
- }
584
- }
585
- } catch {}
586
- }
587
-
588
- // Check standard SSL locations
589
- const sslPairs = [
590
- ['/etc/ssl/certs/server.crt', '/etc/ssl/private/server.key'],
591
- ['/etc/ssl/certs/aria.crt', '/etc/ssl/private/aria.key'],
592
- ];
593
- for (const [cert, key] of sslPairs) {
594
- if (fs.existsSync(cert) && fs.existsSync(key)) {
595
- console.log(JSON.stringify({ found: true, type: 'real-ca', cert, key }));
596
- process.exit(0);
597
- }
598
- }
599
-
600
- console.log(JSON.stringify({ found: false }));
601
- "
602
- `;
603
-
604
- // ============================================================================
605
- // Firewall Detection Script (run on remote host)
606
- // ============================================================================
607
-
608
- const FIREWALL_DETECT_SCRIPT = `
609
- if command -v ufw >/dev/null 2>&1; then echo "ufw"
610
- elif command -v firewall-cmd >/dev/null 2>&1; then echo "firewalld"
611
- elif command -v iptables >/dev/null 2>&1; then echo "iptables"
612
- else echo "none"
613
- fi
614
- `;
615
-
616
- // ============================================================================
617
- // Deploy Executor
618
- // ============================================================================
619
-
620
- /**
621
- * Deploy ARIA to a remote machine via SSH.
622
- *
623
- * Steps:
624
- * 1. SSH connectivity check
625
- * 2. OS detection (uname -s)
626
- * 3. Linux distro detection (for package manager selection)
627
- * 4. Install Node.js 20+ if missing
628
- * 5. Enable corepack + pnpm
629
- * 6. Clone or update repo
630
- * 7. pnpm install && pnpm build
631
- * 8. Generate Ed25519 signing keypair if not present
632
- * 9. TLS cert discovery + optional provisioning
633
- * 10. Firewall port opening (443/tcp + 51820/udp)
634
- * 11. Write ~/.aria/config.json
635
- * 12. Start daemon on port 443
636
- * 13. Health check (curl endpoint)
637
- */
638
- export async function executeDeploy(input: DeployInput, ctx: ToolContext): Promise<ToolResult> {
639
- // Validate all inputs before any SSH calls (A1 — prevent shell injection)
640
- const targetError = validateTarget(input.target);
641
- if (targetError) {
642
- return fail(targetError);
643
- }
644
- const repoErr = validateRepoUrl(input.repo_url ?? "");
645
- if (repoErr) return fail(repoErr);
646
- const branchErr = validateBranch(input.branch ?? "");
647
- if (branchErr) return fail(branchErr);
648
- const nameErr = validateArionName(input.arion_name ?? "");
649
- if (nameErr) return fail(nameErr);
650
- const keyErr = validateSshKeyPath(input.ssh_key_path ?? "");
651
- if (keyErr) return fail(keyErr);
652
- const hashErr = validateCommitHash(input.commit_hash ?? "");
653
- if (hashErr) return fail(hashErr);
654
-
655
- const sshOpts = { sshKeyPath: input.ssh_key_path, abortSignal: ctx.abortSignal };
656
- const branch = input.branch ?? "main";
657
- const repoUrl = input.repo_url ?? "https://github.com/aria-ai/aria.git";
658
-
659
- // Request user confirmation — this is a dangerous operation
660
- const confirmed = await ctx.confirm(
661
- `Deploy ARIA to ${input.target}? This will install Node.js, clone the repo, build, and start the daemon.`,
662
- );
663
- if (!confirmed) {
664
- return fail("User cancelled deployment");
665
- }
666
-
667
- // Track mutating steps for rollback on failure (A2)
668
- const completedSteps: DeployStep[] = [];
669
- let deployFailed = false;
670
-
671
- try {
672
- // Step 1: SSH connectivity check
673
- const connectivity = await sshExec(input.target, "echo ARIA_SSH_OK", sshOpts);
674
- if (connectivity.exitCode !== 0 || !connectivity.stdout.includes("ARIA_SSH_OK")) {
675
- return fail(
676
- `SSH connectivity failed to ${input.target}: ${connectivity.stderr || "no response"}`,
677
- );
678
- }
679
-
680
- // Step 2: Detect OS
681
- const osResult = await sshExec(input.target, "uname -s 2>/dev/null || echo UNKNOWN", sshOpts);
682
- const osInfo = detectOS(osResult.stdout);
683
-
684
- if (osInfo.os === "unknown") {
685
- return fail(`Unsupported OS detected from uname: ${osResult.stdout.trim()}`);
686
- }
687
-
688
- // Step 3: Detect Linux distro for package manager selection
689
- let distro: LinuxDistro = "apt";
690
- if (osInfo.os === "linux") {
691
- const distroResult = await sshExec(
692
- input.target,
693
- "cat /etc/os-release 2>/dev/null || echo ''",
694
- sshOpts,
695
- );
696
- distro = detectLinuxDistro(distroResult.stdout);
697
- }
698
-
699
- // Step 4: Install Node.js 20+ if not present
700
- const nodeCheck = await sshExec(
701
- input.target,
702
- 'node --version 2>/dev/null || echo "NO_NODE"',
703
- sshOpts,
704
- );
705
- const hasNode =
706
- nodeCheck.stdout.startsWith("v") && parseInt(nodeCheck.stdout.slice(1), 10) >= 20;
707
-
708
- if (!hasNode) {
709
- const installCmd = getNodeInstallCommand(osInfo, distro);
710
- const installResult = await sshExec(input.target, installCmd, {
711
- ...sshOpts,
712
- timeoutMs: 300_000,
713
- });
714
- if (installResult.exitCode !== 0) {
715
- return fail(`Node.js installation failed: ${installResult.stderr}`);
716
- }
717
- }
718
-
719
- // Step 5: Enable corepack + pnpm (pinned version — never use @latest)
720
- const corepackCmd = `export NVM_DIR="$HOME/.nvm" && [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"; corepack enable && corepack prepare pnpm@${PINNED_PNPM_VERSION} --activate`;
721
- const corepackResult = await sshExec(input.target, corepackCmd, sshOpts);
722
- if (corepackResult.exitCode !== 0) {
723
- return fail(`corepack/pnpm setup failed: ${corepackResult.stderr}`);
724
- }
725
-
726
- // Step 6: Clone or update repo
727
- const repoDir = "~/aria";
728
- const cloneCmd = `
729
- export NVM_DIR="$HOME/.nvm" && [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
730
- if [ -d ${repoDir}/.git ]; then
731
- cd ${repoDir} && git fetch origin && git checkout ${branch} && git pull origin ${branch}
732
- else
733
- git clone --branch ${branch} ${repoUrl} ${repoDir}
734
- fi
735
- `;
736
- const cloneResult = await sshExec(input.target, cloneCmd, {
737
- ...sshOpts,
738
- timeoutMs: 180_000,
739
- });
740
- if (cloneResult.exitCode !== 0) {
741
- return fail(`Repo clone/update failed: ${cloneResult.stderr}`);
742
- }
743
-
744
- // Step 6b: Pin to exact commit hash if provided (prevents MITM on branch refs)
745
- if (input.commit_hash) {
746
- const checkoutResult = await sshExec(
747
- input.target,
748
- `cd ${repoDir} && git checkout ${input.commit_hash}`,
749
- sshOpts,
750
- );
751
- if (checkoutResult.exitCode !== 0) {
752
- return fail(`Commit hash checkout failed: ${checkoutResult.stderr}`);
753
- }
754
- }
755
-
756
- // Step 6c: Verify GPG signature on HEAD if requested
757
- if (input.verify_signatures) {
758
- const gpgResult = await sshExec(
759
- input.target,
760
- `cd ${repoDir} && git verify-commit HEAD`,
761
- sshOpts,
762
- );
763
- if (gpgResult.exitCode !== 0) {
764
- return fail(
765
- `GPG signature verification failed: ${gpgResult.stderr}. ` +
766
- `Set verify_signatures=false to skip.`,
767
- );
768
- }
769
- }
770
-
771
- // Step 7: pnpm install && pnpm build
772
- const buildCmd = `
773
- export NVM_DIR="$HOME/.nvm" && [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
774
- cd ${repoDir} && pnpm install --frozen-lockfile && pnpm store verify && pnpm build
775
- `;
776
- const buildResult = await sshExec(input.target, buildCmd, {
777
- ...sshOpts,
778
- timeoutMs: 600_000,
779
- });
780
- if (buildResult.exitCode !== 0) {
781
- return fail(`Build failed: ${buildResult.stderr}`);
782
- }
783
-
784
- // Step 8: Generate Ed25519 signing keypair if not present
785
- const keypairCmd = `
786
- mkdir -p ~/.aria
787
- if [ ! -f ~/.aria/signing-key.json ]; then
788
- node -e "
789
- const crypto = require('crypto');
790
- const { publicKey, privateKey } = crypto.generateKeyPairSync('ed25519');
791
- const pub = publicKey.export({ type: 'spki', format: 'der' }).toString('base64');
792
- const priv = privateKey.export({ type: 'pkcs8', format: 'der' }).toString('base64');
793
- const fp = crypto.createHash('sha256').update(Buffer.from(pub, 'base64')).digest('hex');
794
- const data = JSON.stringify({ publicKey: pub, privateKey: priv, fingerprint: fp }, null, 2);
795
- require('fs').writeFileSync(process.env.HOME + '/.aria/signing-key.json', data, { mode: 0o600 });
796
- console.log(JSON.stringify({ publicKey: pub, fingerprint: fp }));
797
- "
798
- else
799
- node -e "
800
- const data = JSON.parse(require('fs').readFileSync(process.env.HOME + '/.aria/signing-key.json', 'utf8'));
801
- console.log(JSON.stringify({ publicKey: data.publicKey, fingerprint: data.fingerprint }));
802
- "
803
- fi
804
- `;
805
- const keypairResult = await sshExec(input.target, keypairCmd, sshOpts);
806
- if (keypairResult.exitCode !== 0) {
807
- return fail(`Keypair generation failed: ${keypairResult.stderr}`);
808
- }
809
- completedSteps.push({ name: "keypair", undoCmd: "" }); // keypair is not rolled back (idempotent)
810
-
811
- // A3: Set key file permissions (chmod 600)
812
- const chmodKeyResult = await sshExec(
813
- input.target,
814
- "chmod 600 ~/.aria/signing-key.json",
815
- sshOpts,
816
- );
817
- if (chmodKeyResult.exitCode !== 0) {
818
- // Non-fatal — best effort
819
- }
820
-
821
- let fingerprint: string | null = null;
822
- try {
823
- const keypairData = JSON.parse(keypairResult.stdout);
824
- fingerprint = keypairData.fingerprint ?? null;
825
- } catch {
826
- // Non-fatal — fingerprint is informational
827
- }
828
-
829
- // Step 9: TLS cert discovery + optional provisioning
830
- const tlsResult = await sshExec(input.target, TLS_DISCOVERY_SCRIPT, sshOpts);
831
- let tlsInfo = discoverTlsCerts(tlsResult.stdout);
832
- let tlsType: TlsType | null = null;
833
-
834
- if (tlsInfo.found && tlsInfo.type) {
835
- tlsType = tlsInfo.type;
836
- } else {
837
- // Try Let's Encrypt auto-provisioning
838
- const hostnameResult = await sshExec(
839
- input.target,
840
- "hostname -f 2>/dev/null || hostname",
841
- sshOpts,
842
- );
843
- const hostname = hostnameResult.stdout.trim();
844
-
845
- // Only attempt certbot if we have a domain name (not just an IP)
846
- if (hostname && !/^[\d.]+$/.test(hostname) && !/^[\da-f:]+$/i.test(hostname)) {
847
- const certbotResult = await sshExec(
848
- input.target,
849
- `command -v certbot >/dev/null 2>&1 && certbot certonly --standalone -d ${hostname} --non-interactive --agree-tos --register-unsafely-without-email 2>&1 || echo "NO_CERTBOT"`,
850
- { ...sshOpts, timeoutMs: 120_000 },
851
- );
852
- if (certbotResult.exitCode === 0 && !certbotResult.stdout.includes("NO_CERTBOT")) {
853
- tlsInfo = {
854
- found: true,
855
- type: "letsencrypt",
856
- cert: `/etc/letsencrypt/live/${hostname}/fullchain.pem`,
857
- key: `/etc/letsencrypt/live/${hostname}/privkey.pem`,
858
- };
859
- tlsType = "letsencrypt";
860
- }
861
- }
862
-
863
- // Fall back to ARIA private CA
864
- if (!tlsType) {
865
- const privateCaCmd = `
866
- export NVM_DIR="$HOME/.nvm" && [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
867
- cd ~/aria && node -e "
868
- const { ensureMeshCerts } = require('./packages/server/dist/tls/mesh-certs.js');
869
- ensureMeshCerts().then(r => console.log(JSON.stringify({ cert: r.certPath, key: r.keyPath })));
870
- " 2>/dev/null || echo '{"cert":"~/.aria/tls/server.crt","key":"~/.aria/tls/server.key"}'
871
- `;
872
- const privateCaResult = await sshExec(input.target, privateCaCmd, sshOpts);
873
- try {
874
- const caPaths = JSON.parse(privateCaResult.stdout);
875
- tlsInfo = {
876
- found: true,
877
- type: "private-ca",
878
- cert: caPaths.cert,
879
- key: caPaths.key,
880
- };
881
- tlsType = "private-ca";
882
- } catch {
883
- // TLS setup failed, proceed without — daemon may still start on HTTP
884
- }
885
- }
886
- }
887
-
888
- // Step 10: Firewall port opening (A2 — tracked for rollback)
889
- let firewallType: FirewallType = "none";
890
- if (osInfo.os === "linux") {
891
- const fwDetect = await sshExec(input.target, FIREWALL_DETECT_SCRIPT, sshOpts);
892
- firewallType = fwDetect.stdout.trim() as FirewallType;
893
- const fwCmds = getFirewallCommands(firewallType);
894
- if (fwCmds) {
895
- const fwResult = await sshExec(input.target, fwCmds, sshOpts);
896
- if (fwResult.exitCode === 0) {
897
- completedSteps.push({
898
- name: "firewall",
899
- undoCmd: getFirewallUndoCommands(firewallType),
900
- });
901
- }
902
- // Best-effort — don't fail the deploy if firewall commands fail (may need sudo)
903
- }
904
- }
905
-
906
- // Derive arion name from target hostname if not provided
907
- const host = input.target.includes("@") ? input.target.split("@")[1]! : input.target;
908
- const arionName = input.arion_name ?? host.replace(/[^a-zA-Z0-9-]/g, "-");
909
-
910
- // Step 11: Write ~/.aria/config.json (A3 — deep merge for idempotency)
911
- const configObj = buildConfigJson({
912
- arionName,
913
- coordinationUrl: input.coordination_url,
914
- tlsCert: tlsInfo.found ? tlsInfo.cert : undefined,
915
- tlsKey: tlsInfo.found ? tlsInfo.key : undefined,
916
- });
917
- const configJson = JSON.stringify(configObj);
918
- // Escape for shell — replace single quotes
919
- const escapedConfig = configJson.replace(/'/g, "'\\''");
920
- const configCmd = `
921
- mkdir -p ~/.aria
922
- if [ -f ~/.aria/config.json ]; then
923
- node -e "
924
- const fs = require('fs');
925
- const existing = JSON.parse(fs.readFileSync(process.env.HOME + '/.aria/config.json', 'utf8'));
926
- const updates = JSON.parse('${escapedConfig}');
927
- // Deep merge: preserve nested objects
928
- function deepMerge(target, source) {
929
- for (const key of Object.keys(source)) {
930
- if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key]) &&
931
- target[key] && typeof target[key] === 'object' && !Array.isArray(target[key])) {
932
- deepMerge(target[key], source[key]);
933
- } else {
934
- target[key] = source[key];
935
- }
936
- }
937
- return target;
938
- }
939
- deepMerge(existing, updates);
940
- fs.writeFileSync(process.env.HOME + '/.aria/config.json', JSON.stringify(existing, null, 2), { mode: 0o600 });
941
- "
942
- else
943
- echo '${escapedConfig}' > ~/.aria/config.json && chmod 600 ~/.aria/config.json
944
- fi
945
- `;
946
- const configResult = await sshExec(input.target, configCmd, sshOpts);
947
- if (configResult.exitCode !== 0) {
948
- deployFailed = true;
949
- return fail(`Config write failed: ${configResult.stderr}`);
950
- }
951
- completedSteps.push({ name: "config", undoCmd: "rm -f ~/.aria/config.json" });
952
-
953
- // A3: Set config file permissions (chmod 600)
954
- await sshExec(input.target, "chmod 600 ~/.aria/config.json", sshOpts);
955
-
956
- // Step 12: Start daemon (nohup, backgrounded) on port 443
957
- const runtimePidLookupCmd = buildRemoteRuntimePidLookupCommand(repoDir);
958
- const runtimeStatusLookupCmd = buildRemoteRuntimeStatusLookupCommand(repoDir);
959
- const daemonCmd = `
960
- # Kill existing daemon if running
961
- PID=$(${runtimePidLookupCmd} 2>/dev/null || true)
962
- [ -n "$PID" ] && kill "$PID" 2>/dev/null || true
963
- export NVM_DIR="$HOME/.nvm" && [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
964
- cd ${repoDir}
965
- nohup node packages/cli/bin/aria.js daemon --arion ${arionName} --port 443 > ~/.aria/daemon.log 2>&1 &
966
- echo $!
967
- `;
968
- const daemonResult = await sshExec(input.target, daemonCmd, sshOpts);
969
- if (daemonResult.exitCode !== 0) {
970
- deployFailed = true;
971
- return fail(`Daemon start failed: ${daemonResult.stderr}`);
972
- }
973
- completedSteps.push({
974
- name: "daemon",
975
- undoCmd: `PID=$(${runtimePidLookupCmd} 2>/dev/null || true); [ -n "$PID" ] && kill "$PID" 2>/dev/null || true`,
976
- });
977
-
978
- // Step 13: Health check — wait for runtime owner/socket status then verify endpoint (A3 — mandatory)
979
- const healthCmd = `
980
- for i in $(seq 1 15); do
981
- STATUS=$(${runtimeStatusLookupCmd} 2>/dev/null || true)
982
- if [ -n "$STATUS" ]; then
983
- echo "$STATUS"
984
- exit 0
985
- fi
986
- sleep 1
987
- done
988
- echo "TIMEOUT"
989
- exit 1
990
- `;
991
- const healthResult = await sshExec(input.target, healthCmd, {
992
- ...sshOpts,
993
- timeoutMs: 30_000,
994
- });
995
-
996
- let port: number | null = null;
997
- if (healthResult.exitCode === 0 && !healthResult.stdout.includes("TIMEOUT")) {
998
- try {
999
- const runtimeStatus = JSON.parse(healthResult.stdout);
1000
- port = runtimeStatus.port ?? null;
1001
- } catch {
1002
- // Non-fatal
1003
- }
1004
- }
1005
-
1006
- // A3: Mandatory health check — verify HTTP(S) endpoint returns 2xx
1007
- if (port) {
1008
- const healthUrl = buildHealthCheckUrl(host, port);
1009
- const curlCmd = `curl -sSk -o /dev/null -w "%{http_code}" ${healthUrl} 2>/dev/null || echo "000"`;
1010
- const curlResult = await sshExec(input.target, curlCmd, {
1011
- ...sshOpts,
1012
- timeoutMs: 10_000,
1013
- });
1014
- const httpCode = parseInt(curlResult.stdout.trim(), 10);
1015
- if (isNaN(httpCode) || httpCode < 200 || httpCode >= 300) {
1016
- deployFailed = true;
1017
- return fail(
1018
- `Health check failed: ${healthUrl} returned HTTP ${curlResult.stdout.trim()}. ` +
1019
- `Check ~/.aria/daemon.log on ${input.target}.`,
1020
- );
1021
- }
1022
- } else if (healthResult.exitCode !== 0) {
1023
- deployFailed = true;
1024
- return fail(
1025
- `Health check failed: runtime owner/socket status not available within 15s. ` +
1026
- `Check ~/.aria/daemon.log on ${input.target}.`,
1027
- );
1028
- }
1029
-
1030
- const output: DeployOutput = {
1031
- success: true,
1032
- host,
1033
- port,
1034
- fingerprint,
1035
- arionName,
1036
- tlsType,
1037
- };
1038
-
1039
- const statusLine = `Daemon running (port ${port ?? "unknown"})`;
1040
- const tlsLine = tlsType ? `TLS: ${tlsType}` : "TLS: none (HTTP only)";
1041
-
1042
- return success(
1043
- `ARIA deployed to ${input.target}.\n` +
1044
- `Arion: ${arionName}\n` +
1045
- `Fingerprint: ${fingerprint ?? "unknown"}\n` +
1046
- `${tlsLine}\n` +
1047
- `${statusLine}`,
1048
- output,
1049
- );
1050
- } catch (error) {
1051
- deployFailed = true;
1052
- return fail(`Deploy failed: ${error instanceof Error ? error.message : String(error)}`);
1053
- } finally {
1054
- // A2: Rollback on failure — undo completed steps in reverse order
1055
- if (deployFailed && completedSteps.length > 0) {
1056
- const rollbackCmds = buildRollbackCommands(completedSteps);
1057
- for (const cmd of rollbackCmds) {
1058
- try {
1059
- await sshExec(input.target, cmd, sshOpts);
1060
- } catch {
1061
- // Best-effort rollback — don't throw during cleanup
1062
- }
1063
- }
1064
- }
1065
- }
1066
- }