@synap-core/cli 1.12.2 → 1.13.1-next.20261102.ec3d166

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 (354) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +38 -11
  3. package/dist/build-info.json +2 -3
  4. package/dist/commands/agents.d.ts +0 -1
  5. package/dist/commands/agents.js +13 -3
  6. package/dist/commands/agents.js.map +1 -1
  7. package/dist/commands/app.js +2 -1
  8. package/dist/commands/app.js.map +1 -1
  9. package/dist/commands/automation.js +46 -41
  10. package/dist/commands/automation.js.map +1 -1
  11. package/dist/commands/box.d.ts +42 -0
  12. package/dist/commands/box.js +89 -0
  13. package/dist/commands/box.js.map +1 -0
  14. package/dist/commands/bridge-setup.js +3 -1
  15. package/dist/commands/bridge-setup.js.map +1 -1
  16. package/dist/commands/capability.d.ts +87 -1
  17. package/dist/commands/capability.js +174 -64
  18. package/dist/commands/capability.js.map +1 -1
  19. package/dist/commands/close-questions.d.ts +27 -0
  20. package/dist/commands/close-questions.js +49 -0
  21. package/dist/commands/close-questions.js.map +1 -0
  22. package/dist/commands/close-questions.test.d.ts +1 -0
  23. package/dist/commands/close-questions.test.js +52 -0
  24. package/dist/commands/close-questions.test.js.map +1 -0
  25. package/dist/commands/connect.d.ts +1 -3
  26. package/dist/commands/connect.js +2 -2
  27. package/dist/commands/connect.js.map +1 -1
  28. package/dist/commands/context.js +72 -43
  29. package/dist/commands/context.js.map +1 -1
  30. package/dist/commands/data-extra.d.ts +13 -0
  31. package/dist/commands/data-extra.js +35 -6
  32. package/dist/commands/data-extra.js.map +1 -1
  33. package/dist/commands/data.js +2 -1
  34. package/dist/commands/data.js.map +1 -1
  35. package/dist/commands/doctor.d.ts +39 -0
  36. package/dist/commands/doctor.js +136 -14
  37. package/dist/commands/doctor.js.map +1 -1
  38. package/dist/commands/hooks.d.ts +19 -0
  39. package/dist/commands/hooks.js +70 -0
  40. package/dist/commands/hooks.js.map +1 -0
  41. package/dist/commands/import.d.ts +25 -0
  42. package/dist/commands/import.js +98 -12
  43. package/dist/commands/import.js.map +1 -1
  44. package/dist/commands/init.d.ts +14 -0
  45. package/dist/commands/init.js +63 -21
  46. package/dist/commands/init.js.map +1 -1
  47. package/dist/commands/keys-request.d.ts +48 -0
  48. package/dist/commands/keys-request.js +236 -0
  49. package/dist/commands/keys-request.js.map +1 -0
  50. package/dist/commands/keys-request.test.d.ts +1 -0
  51. package/dist/commands/keys-request.test.js +176 -0
  52. package/dist/commands/keys-request.test.js.map +1 -0
  53. package/dist/commands/knowledge.d.ts +6 -0
  54. package/dist/commands/knowledge.js +13 -3
  55. package/dist/commands/knowledge.js.map +1 -1
  56. package/dist/commands/lens.js +2 -1
  57. package/dist/commands/lens.js.map +1 -1
  58. package/dist/commands/market-authoring.js +1 -1
  59. package/dist/commands/market-authoring.js.map +1 -1
  60. package/dist/commands/market.d.ts +61 -4
  61. package/dist/commands/market.js +106 -48
  62. package/dist/commands/market.js.map +1 -1
  63. package/dist/commands/mcp.d.ts +1 -1
  64. package/dist/commands/mcp.js +14 -9
  65. package/dist/commands/mcp.js.map +1 -1
  66. package/dist/commands/observe.category.test.d.ts +1 -0
  67. package/dist/commands/observe.category.test.js +59 -0
  68. package/dist/commands/observe.category.test.js.map +1 -0
  69. package/dist/commands/observe.d.ts +3 -0
  70. package/dist/commands/observe.js +7 -5
  71. package/dist/commands/observe.js.map +1 -1
  72. package/dist/commands/observe.title.test.d.ts +1 -0
  73. package/dist/commands/observe.title.test.js +37 -0
  74. package/dist/commands/observe.title.test.js.map +1 -0
  75. package/dist/commands/playbook.js +9 -0
  76. package/dist/commands/playbook.js.map +1 -1
  77. package/dist/commands/pods.d.ts +6 -1
  78. package/dist/commands/pods.js +38 -17
  79. package/dist/commands/pods.js.map +1 -1
  80. package/dist/commands/proposals-actions.js +7 -1
  81. package/dist/commands/proposals-actions.js.map +1 -1
  82. package/dist/commands/proton-setup.js +3 -1
  83. package/dist/commands/proton-setup.js.map +1 -1
  84. package/dist/commands/providers.d.ts +22 -6
  85. package/dist/commands/providers.js +39 -32
  86. package/dist/commands/providers.js.map +1 -1
  87. package/dist/commands/raycast.d.ts +15 -0
  88. package/dist/commands/raycast.js +36 -10
  89. package/dist/commands/raycast.js.map +1 -1
  90. package/dist/commands/session-feed-wait.d.ts +48 -0
  91. package/dist/commands/session-feed-wait.js +261 -0
  92. package/dist/commands/session-feed-wait.js.map +1 -0
  93. package/dist/commands/session-post.d.ts +40 -0
  94. package/dist/commands/session-post.js +96 -0
  95. package/dist/commands/session-post.js.map +1 -0
  96. package/dist/commands/session-wait.d.ts +9 -4
  97. package/dist/commands/session-wait.js +20 -5
  98. package/dist/commands/session-wait.js.map +1 -1
  99. package/dist/commands/sessions.d.ts +2 -0
  100. package/dist/commands/sessions.js +23 -0
  101. package/dist/commands/sessions.js.map +1 -1
  102. package/dist/commands/skills-commands.d.ts +2 -0
  103. package/dist/commands/skills-commands.js +9 -1
  104. package/dist/commands/skills-commands.js.map +1 -1
  105. package/dist/commands/skills-commands.test.d.ts +1 -0
  106. package/dist/commands/skills-commands.test.js +57 -0
  107. package/dist/commands/skills-commands.test.js.map +1 -0
  108. package/dist/commands/status.js +13 -7
  109. package/dist/commands/status.js.map +1 -1
  110. package/dist/commands/statusline.backoff.test.js +13 -3
  111. package/dist/commands/statusline.backoff.test.js.map +1 -1
  112. package/dist/commands/statusline.d.ts +104 -9
  113. package/dist/commands/statusline.js +392 -148
  114. package/dist/commands/statusline.js.map +1 -1
  115. package/dist/commands/statusline.line2.test.d.ts +15 -0
  116. package/dist/commands/statusline.line2.test.js +226 -0
  117. package/dist/commands/statusline.line2.test.js.map +1 -0
  118. package/dist/commands/statusline.needs-you.test.d.ts +1 -0
  119. package/dist/commands/statusline.needs-you.test.js +17 -0
  120. package/dist/commands/statusline.needs-you.test.js.map +1 -0
  121. package/dist/commands/statusline.now.test.d.ts +10 -0
  122. package/dist/commands/statusline.now.test.js +250 -0
  123. package/dist/commands/statusline.now.test.js.map +1 -0
  124. package/dist/commands/tracks.d.ts +68 -6
  125. package/dist/commands/tracks.js +272 -16
  126. package/dist/commands/tracks.js.map +1 -1
  127. package/dist/commands/upload.js +12 -0
  128. package/dist/commands/upload.js.map +1 -1
  129. package/dist/commands/wait.d.ts +124 -0
  130. package/dist/commands/wait.js +384 -0
  131. package/dist/commands/wait.js.map +1 -0
  132. package/dist/commands/wait.test.d.ts +8 -0
  133. package/dist/commands/wait.test.js +308 -0
  134. package/dist/commands/wait.test.js.map +1 -0
  135. package/dist/commands/whoami.d.ts +7 -0
  136. package/dist/commands/whoami.js +17 -0
  137. package/dist/commands/whoami.js.map +1 -1
  138. package/dist/commands/worker-accounts.d.ts +149 -0
  139. package/dist/commands/worker-accounts.js +339 -0
  140. package/dist/commands/worker-accounts.js.map +1 -0
  141. package/dist/commands/worker-accounts.test.d.ts +1 -0
  142. package/dist/commands/worker-accounts.test.js +224 -0
  143. package/dist/commands/worker-accounts.test.js.map +1 -0
  144. package/dist/commands/worker-github-app.d.ts +63 -0
  145. package/dist/commands/worker-github-app.js +161 -0
  146. package/dist/commands/worker-github-app.js.map +1 -0
  147. package/dist/commands/worker-github-app.test.d.ts +1 -0
  148. package/dist/commands/worker-github-app.test.js +102 -0
  149. package/dist/commands/worker-github-app.test.js.map +1 -0
  150. package/dist/commands/worker-github-broker.d.ts +39 -0
  151. package/dist/commands/worker-github-broker.js +106 -0
  152. package/dist/commands/worker-github-broker.js.map +1 -0
  153. package/dist/commands/worker-github-broker.test.d.ts +1 -0
  154. package/dist/commands/worker-github-broker.test.js +90 -0
  155. package/dist/commands/worker-github-broker.test.js.map +1 -0
  156. package/dist/commands/worker-runs.test.d.ts +1 -0
  157. package/dist/commands/worker-runs.test.js +150 -0
  158. package/dist/commands/worker-runs.test.js.map +1 -0
  159. package/dist/commands/worker-worktrees.d.ts +34 -0
  160. package/dist/commands/worker-worktrees.js +87 -0
  161. package/dist/commands/worker-worktrees.js.map +1 -0
  162. package/dist/commands/worker.d.ts +406 -10
  163. package/dist/commands/worker.js +1180 -126
  164. package/dist/commands/worker.js.map +1 -1
  165. package/dist/commands/worker.test.js +588 -11
  166. package/dist/commands/worker.test.js.map +1 -1
  167. package/dist/index.js +220 -28
  168. package/dist/index.js.map +1 -1
  169. package/dist/lib/agent-door.d.ts +1 -3
  170. package/dist/lib/agent-door.js +10 -7
  171. package/dist/lib/agent-door.js.map +1 -1
  172. package/dist/lib/agents-config.d.ts +9 -0
  173. package/dist/lib/agents-config.js +20 -0
  174. package/dist/lib/agents-config.js.map +1 -1
  175. package/dist/lib/atomic-file.d.ts +20 -1
  176. package/dist/lib/atomic-file.js +100 -2
  177. package/dist/lib/atomic-file.js.map +1 -1
  178. package/dist/lib/auth.d.ts +28 -2
  179. package/dist/lib/auth.js +52 -12
  180. package/dist/lib/auth.js.map +1 -1
  181. package/dist/lib/box/egress.d.ts +82 -0
  182. package/dist/lib/box/egress.js +264 -0
  183. package/dist/lib/box/egress.js.map +1 -0
  184. package/dist/lib/box/evidence.d.ts +86 -0
  185. package/dist/lib/box/evidence.js +121 -0
  186. package/dist/lib/box/evidence.js.map +1 -0
  187. package/dist/lib/box/job-server.d.ts +72 -0
  188. package/dist/lib/box/job-server.js +250 -0
  189. package/dist/lib/box/job-server.js.map +1 -0
  190. package/dist/lib/box/provisioner.d.ts +83 -0
  191. package/dist/lib/box/provisioner.js +312 -0
  192. package/dist/lib/box/provisioner.js.map +1 -0
  193. package/dist/lib/box/proxmox.d.ts +112 -0
  194. package/dist/lib/box/proxmox.js +211 -0
  195. package/dist/lib/box/proxmox.js.map +1 -0
  196. package/dist/lib/box/wire.d.ts +98 -0
  197. package/dist/lib/box/wire.js +70 -0
  198. package/dist/lib/box/wire.js.map +1 -0
  199. package/dist/lib/bridge-invocation.test.d.ts +1 -0
  200. package/dist/lib/bridge-invocation.test.js +75 -0
  201. package/dist/lib/bridge-invocation.test.js.map +1 -0
  202. package/dist/lib/bridge-status.d.ts +144 -0
  203. package/dist/lib/bridge-status.js +227 -0
  204. package/dist/lib/bridge-status.js.map +1 -0
  205. package/dist/lib/bridge-status.test.d.ts +6 -0
  206. package/dist/lib/bridge-status.test.js +197 -0
  207. package/dist/lib/bridge-status.test.js.map +1 -0
  208. package/dist/lib/client-header.test.d.ts +1 -0
  209. package/dist/lib/client-header.test.js +103 -0
  210. package/dist/lib/client-header.test.js.map +1 -0
  211. package/dist/lib/conversation-headers.d.ts +89 -9
  212. package/dist/lib/conversation-headers.js +156 -3
  213. package/dist/lib/conversation-headers.js.map +1 -1
  214. package/dist/lib/conversation-headers.test.d.ts +1 -0
  215. package/dist/lib/conversation-headers.test.js +78 -0
  216. package/dist/lib/conversation-headers.test.js.map +1 -0
  217. package/dist/lib/credential-class.d.ts +40 -2
  218. package/dist/lib/credential-class.js +48 -6
  219. package/dist/lib/credential-class.js.map +1 -1
  220. package/dist/lib/device-connect.d.ts +45 -0
  221. package/dist/lib/device-connect.js +60 -0
  222. package/dist/lib/device-connect.js.map +1 -1
  223. package/dist/lib/exporter-coverage.d.ts +1 -1
  224. package/dist/lib/exporter-coverage.js +1 -1
  225. package/dist/lib/goal-words.d.ts +38 -0
  226. package/dist/lib/goal-words.js +115 -0
  227. package/dist/lib/goal-words.js.map +1 -0
  228. package/dist/lib/hub-client.d.ts +87 -8
  229. package/dist/lib/hub-client.js +205 -70
  230. package/dist/lib/hub-client.js.map +1 -1
  231. package/dist/lib/init-handoff.d.ts +8 -0
  232. package/dist/lib/init-handoff.js +9 -2
  233. package/dist/lib/init-handoff.js.map +1 -1
  234. package/dist/lib/key-locations.d.ts +3 -3
  235. package/dist/lib/key-locations.js +3 -39
  236. package/dist/lib/key-locations.js.map +1 -1
  237. package/dist/lib/key-source.d.ts +3 -1
  238. package/dist/lib/key-source.js +7 -4
  239. package/dist/lib/key-source.js.map +1 -1
  240. package/dist/lib/knowledge-title.d.ts +3 -2
  241. package/dist/lib/knowledge-title.js +3 -2
  242. package/dist/lib/knowledge-title.js.map +1 -1
  243. package/dist/lib/machine-instance.d.ts +7 -5
  244. package/dist/lib/machine-instance.js +7 -5
  245. package/dist/lib/machine-instance.js.map +1 -1
  246. package/dist/lib/mcp-bridge.d.ts +50 -0
  247. package/dist/lib/mcp-bridge.js +232 -11
  248. package/dist/lib/mcp-bridge.js.map +1 -1
  249. package/dist/lib/mcp-bridge.test.js +224 -4
  250. package/dist/lib/mcp-bridge.test.js.map +1 -1
  251. package/dist/lib/mcp-call.d.ts +5 -1
  252. package/dist/lib/mcp-call.js +7 -6
  253. package/dist/lib/mcp-call.js.map +1 -1
  254. package/dist/lib/mcp-connector-url.test.d.ts +1 -0
  255. package/dist/lib/mcp-connector-url.test.js +13 -0
  256. package/dist/lib/mcp-connector-url.test.js.map +1 -0
  257. package/dist/lib/mcp-snippets.d.ts +16 -0
  258. package/dist/lib/mcp-snippets.js +20 -2
  259. package/dist/lib/mcp-snippets.js.map +1 -1
  260. package/dist/lib/now-line.d.ts +66 -0
  261. package/dist/lib/now-line.js +193 -0
  262. package/dist/lib/now-line.js.map +1 -0
  263. package/dist/lib/now-line.test.d.ts +5 -0
  264. package/dist/lib/now-line.test.js +177 -0
  265. package/dist/lib/now-line.test.js.map +1 -0
  266. package/dist/lib/package-updates.d.ts +66 -0
  267. package/dist/lib/package-updates.js +76 -0
  268. package/dist/lib/package-updates.js.map +1 -0
  269. package/dist/lib/pod-moved.d.ts +70 -0
  270. package/dist/lib/pod-moved.js +146 -0
  271. package/dist/lib/pod-moved.js.map +1 -0
  272. package/dist/lib/pod-reach.d.ts +39 -0
  273. package/dist/lib/pod-reach.js +117 -0
  274. package/dist/lib/pod-reach.js.map +1 -0
  275. package/dist/lib/pod-reach.test.d.ts +1 -0
  276. package/dist/lib/pod-reach.test.js +67 -0
  277. package/dist/lib/pod-reach.test.js.map +1 -0
  278. package/dist/lib/pod.d.ts +8 -4
  279. package/dist/lib/pod.js +12 -10
  280. package/dist/lib/pod.js.map +1 -1
  281. package/dist/lib/register-claude-code-mcp.test.d.ts +1 -0
  282. package/dist/lib/register-claude-code-mcp.test.js +97 -0
  283. package/dist/lib/register-claude-code-mcp.test.js.map +1 -0
  284. package/dist/lib/review-credential.js +3 -1
  285. package/dist/lib/review-credential.js.map +1 -1
  286. package/dist/lib/safe-open.d.ts +5 -3
  287. package/dist/lib/safe-open.js +9 -8
  288. package/dist/lib/safe-open.js.map +1 -1
  289. package/dist/lib/self-host.d.ts +17 -0
  290. package/dist/lib/self-host.js +24 -0
  291. package/dist/lib/self-host.js.map +1 -0
  292. package/dist/lib/session-feed.d.ts +185 -0
  293. package/dist/lib/session-feed.js +257 -0
  294. package/dist/lib/session-feed.js.map +1 -0
  295. package/dist/lib/targets.d.ts +52 -3
  296. package/dist/lib/targets.js +150 -209
  297. package/dist/lib/targets.js.map +1 -1
  298. package/dist/lib/term.d.ts +24 -0
  299. package/dist/lib/term.js +52 -0
  300. package/dist/lib/term.js.map +1 -0
  301. package/dist/lib/term.test.d.ts +1 -0
  302. package/dist/lib/term.test.js +29 -0
  303. package/dist/lib/term.test.js.map +1 -0
  304. package/dist/lib/transcript-index.d.ts +94 -0
  305. package/dist/lib/transcript-index.js +321 -0
  306. package/dist/lib/transcript-index.js.map +1 -0
  307. package/dist/lib/transcript-index.test.d.ts +10 -0
  308. package/dist/lib/transcript-index.test.js +200 -0
  309. package/dist/lib/transcript-index.test.js.map +1 -0
  310. package/dist/lib/wait-help.d.ts +11 -0
  311. package/dist/lib/wait-help.js +25 -0
  312. package/dist/lib/wait-help.js.map +1 -0
  313. package/dist/lib/wait-state.d.ts +57 -0
  314. package/dist/lib/wait-state.js +114 -0
  315. package/dist/lib/wait-state.js.map +1 -0
  316. package/dist/lib/wake-hook-settings.d.ts +57 -0
  317. package/dist/lib/wake-hook-settings.js +153 -0
  318. package/dist/lib/wake-hook-settings.js.map +1 -0
  319. package/dist/lib/wake-state.d.ts +65 -0
  320. package/dist/lib/wake-state.js +122 -0
  321. package/dist/lib/wake-state.js.map +1 -0
  322. package/package.json +5 -2
  323. package/skills/README.md +1 -1
  324. package/skills/agent-os/SKILL.md +8 -8
  325. package/skills/synap/SKILL.md +178 -88
  326. package/skills/synap/code-skills.md +84 -0
  327. package/skills/synap/concepts.md +38 -20
  328. package/skills/synap/creative-loop.md +1 -1
  329. package/skills/synap/document-embeds.md +17 -1
  330. package/skills/synap/focus-sessions.md +17 -8
  331. package/skills/synap/from-intent.md +33 -17
  332. package/skills/synap/governance-rules.md +3 -1
  333. package/skills/synap/lenses.md +4 -4
  334. package/skills/synap/linking.md +2 -2
  335. package/skills/synap/mental-model.md +1 -1
  336. package/skills/synap/operating-mode-rules.md +1 -1
  337. package/skills/synap/quick-reference.md +2 -1
  338. package/skills/synap/reflexes.md +8 -8
  339. package/skills/synap/viewframe-cells.md +1 -1
  340. package/skills/synap/work-model.md +24 -10
  341. package/skills/synap/workspace-design.md +5 -5
  342. package/skills/synap/writes.md +16 -9
  343. package/skills/synap/writing-titles.md +7 -0
  344. package/skills/synap-app/SKILL.md +148 -66
  345. package/skills/synap-app/creating-the-base-app.md +12 -7
  346. package/skills/synap-app/governance.md +27 -16
  347. package/skills/synap-app/install-commands.md +18 -9
  348. package/skills/synap-app/overview.md +16 -9
  349. package/skills/synap-app/using-the-sdk.md +75 -25
  350. package/skills/synap-market/SKILL.md +1 -1
  351. package/skills/synap-market/governance-and-catalog.md +1 -1
  352. package/skills/synap-schema/SKILL.md +24 -21
  353. package/skills/synap-schema/intent-vocabulary-ssot.md +24 -21
  354. package/templates/box/runner.py +206 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provisioner.js","sourceRoot":"","sources":["../../../src/lib/box/provisioner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,UAAU,EAAmB,MAAM,eAAe,CAAC;AAG5E,OAAO,EACL,cAAc,EACd,sBAAsB,GAKvB,MAAM,WAAW,CAAC;AAWnB,8EAA8E;AAC9E,MAAM,CAAC,MAAM,cAAc,GAAe,EAAE,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;AAEjH;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAc,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAE/G,mGAAmG;AACnG,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,CAAC;AAChC,2FAA2F;AAC3F,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAC;AAEjC,+EAA+E;AAC/E,MAAM,UAAU,WAAW,CAAC,CAAY;IACtC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;IACrB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAA2B,EAAE,CAAC;QACnE,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACpE,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,CAAc,EAAE,CAAa;IACvD,IAAI,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,iBAAiB,EAAE,CAAC;QAC3C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,CAAC,CAAC,cAAc,SAAS,CAAC,CAAC,iBAAiB,KAAK,EAAE,CAAC;IACvG,CAAC;IACD,IAAI,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,iBAAiB,EAAE,CAAC;QAC3C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,iBAAiB,GAAG,EAAE,CAAC;IAC7G,CAAC;IACD,IAAI,CAAC,CAAC,WAAW,KAAK,IAAI,IAAI,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC;QAC/D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,cAAc,GAAG,EAAE,CAAC;IAC9G,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAiBD,MAAM,IAAI,GAA2B;IACnC,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,eAAe;IACvB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,iBAAiB;IACzB,MAAM,EAAE,UAAU;IAClB,OAAO,EAAE,kBAAkB;IAC3B,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,eAAe;IACtB,OAAO,EAAE,WAAW;IACpB,MAAM,EAAE,iBAAiB;IACzB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,mEAAmE;CAC7E,CAAC;AAEF,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,0BAA0B,CAAC;AAC9E,CAAC;AAED,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAmB,EAAE,IAAyB,EAAE,GAAwB;IACjG,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,CAAC,IAAI,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,SAAS;QAC/B,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAClB,GAAG,CAAC,+BAA+B,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,iCAAiC,CAAC,CAAC,IAAI,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,SAAoB,EAAE,IAAqB;IACtE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACjC,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACjE,MAAM,GAAG,GAAc,EAAE,GAAG,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IACjF,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,YAAY,GAAG,IAAI,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,aAAa,GAAG,IAAI,CAAC;IAErD,IAAI,KAAK,GAAwB,OAAO,CAAC;IACzC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,WAA+B,CAAC;IACpC,8FAA8F;IAC9F,MAAM,KAAK,GAAa,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,mCAAmC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxG,IAAI,IAAI,GAAe,GAAG,EAAE,GAAE,CAAC,CAAC;IAChC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IAEzD,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACnD,IAAI,KAAK,CAAC,aAAa,IAAI,CAAC,OAAO,EAAE,CAAC;gBACpC,OAAO,GAAG,IAAI,CAAC;gBACf,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,kBAAkB,CAAC,CAAC;gBAC1C,IAAI,EAAE,CAAC;YACT,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;gBAClC,IAAI,GAAG,IAAI,CAAC;gBACZ,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC1C,IAAI,EAAE,CAAC;gBACP,OAAO;YACT,CAAC;YACD,wEAAwE;YACxE,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,uBAAwB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,WAAW,KAAK,qCAAqC,CAAC;QACtD,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;IACF,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAEhD,IAAI,KAAiC,CAAC;IACtC,MAAM,GAAG,GAAG,CAAC,EAAU,EAAE,IAAgB,EAAE,EAAE;QAC3C,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YACtB,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,CAAC;QACT,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC,CAAC;IAEF,MAAM,IAAI,EAAE,CAAC;IACb,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,wBAAwB,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/F,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;QACnC,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE;YAAE,OAAO;QAC5B,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;YACpB,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE;gBAChB,QAAQ,GAAG,IAAI,CAAC;gBAChB,KAAK,CAAC,IAAI,CAAC,wCAAwC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,2BAA2B,CAAC,CAAC;YAC5G,CAAC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,KAAK,GAAG,SAAS,CAAC;QAClB,KAAK,IAAI,EAAE,CAAC;QACZ,GAAG,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,EAAE,GAAG,EAAE;YAClC,QAAQ,GAAG,IAAI,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,2BAA2B,MAAM,CAAC,WAAW,sCAAsC,CAAC,CAAC;QAClG,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,IAAI,EAAE,GAAkB,IAAI,CAAC;IAC7B,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,IAAI,MAAM,GAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC;IAClE,IAAI,CAAC;QACH,kFAAkF;QAClF,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YAC/C,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACnG,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;gBACf,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACrB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,WAAW,GAAG,iBAAkB,GAAa,CAAC,OAAO,EAAE,CAAC;YAC1D,CAAC;QACH,CAAC;QACD,IAAI,EAAE,EAAE,CAAC;YACP,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAC5C,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,SAAS,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;YAChD,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE;gBACf,WAAW,KAAK,0CAA0C,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,+BAA+B,CAAC;YACrH,CAAC,CAAC,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;YAC/E,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK;gBAAE,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACnD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC;YAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;gBACnC,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBACjC,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,SAAS,IAAI,YAAY,CAAC,CAAC;oBACjD,MAAM;gBACR,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,aAAa,IAAI,YAAY,CAAC,YAAa,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC5F,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnD,MAAM,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,IAAI,UAAU,EAAE,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1D,IAAI,CAAC;QACH,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QAEtB,MAAM,KAAK,GAAwB,EAAE,CAAC;QACtC,IAAI,QAAQ,GAAG,IAAI,CAAC;QACpB,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,IAAI,CAAC,QAAQ;oBAAE,MAAM,IAAI,sBAAsB,EAAE,CAAC;gBAClD,0EAA0E;gBAC1E,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBACvD,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC9D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;gBACrH,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACnD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,cAAc;oBAAE,OAAO,IAAI,CAAC;gBAC/C,IAAI,GAAG,YAAY,sBAAsB;oBAAE,QAAQ,GAAG,KAAK,CAAC;gBAC5D,mEAAmE;gBACnE,mDAAmD;gBACnD,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;gBACrB,GAAG,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,2BAA4B,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;YAC3G,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAe,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QAC1F,MAAM,IAAI,GAAG,cAAc,CAAC;YAC1B,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,OAAO;YACP,SAAS;YACT,UAAU,EAAE,GAAG,EAAE;YACjB,GAAG;YACH,aAAa,EAAE,GAAG,EAAE,OAAO,IAAI,EAAE;YACjC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,KAAK;SACN,CAAC,CAAC;QACH,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACjC,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,cAAc,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,oBAAqB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACpE,IAAI,GAAG,YAAY,cAAc;gBAAE,OAAO,IAAI,CAAC;YAC/C,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;YAAS,CAAC;QACT,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,IAAI,EAAE;YAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAaD,MAAM,SAAS,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAE9E,6EAA6E;AAC7E,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,IAAqB,EAAE,IAAkB;IACnE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC;IACtC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9C,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACtE,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;gBACd,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ;oBAAE,IAAI,CAAC,GAAG,CAAC,uBAAuB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC/E,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;gBACxB,IAAI,IAAI,CAAC,IAAI;oBAAE,OAAO;gBACtB,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC9B,SAAS;YACX,CAAC;YACD,QAAQ,GAAG,EAAE,CAAC;YACd,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACnC,IAAI,GAAG,EAAE,CAAC;gBACR,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;gBAC9E,MAAM,MAAM,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;gBACpD,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YAChD,CAAC;YACD,IAAI,IAAI,CAAC,IAAI;gBAAE,OAAO;YACtB,IAAI,CAAC,GAAG;gBAAE,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,UAAW,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7C,IAAI,IAAI,CAAC,IAAI;gBAAE,MAAM,GAAG,CAAC;YACzB,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * The Proxmox backend of the run box: one fresh unprivileged LXC per run,
3
+ * linked-cloned from a template CT, on the isolated box bridge, destroyed after.
4
+ *
5
+ * It talks to the Proxmox API with a POOL-SCOPED token (least privilege: it
6
+ * can clone, configure, start, stop and destroy guests of ONE pool, and read
7
+ * node memory, one storage's fill and the thin pools' fill — nothing else;
8
+ * host side in `my server` docs/RUNBOX.md, `scripts/box/setup-box-access.sh`). TLS is verified against the host's own CA, pinned by file,
9
+ * never `rejectUnauthorized: false`.
10
+ */
11
+ export interface ProxmoxConfig {
12
+ /** e.g. https://10.10.0.1:8006 */
13
+ endpoint: string;
14
+ /** `user@realm!tokenid=secret` */
15
+ token: string;
16
+ /** PEM of the host CA (/etc/pve/pve-root-ca.pem). */
17
+ ca: string;
18
+ node: string;
19
+ /**
20
+ * The name the host certificate is checked against when the endpoint is an
21
+ * address it does not list. The founder's host cert names 192.168.1.201,
22
+ * `main` and `main.local.lan`, not 10.10.0.1 (read 2026-10-26), so the
23
+ * provisioner connects to 10.10.0.1 and verifies the cert as `main`.
24
+ */
25
+ serverName?: string;
26
+ }
27
+ export interface ProxmoxApi {
28
+ get<T>(path: string): Promise<T>;
29
+ post<T>(path: string, params?: Record<string, string | number>): Promise<T>;
30
+ put<T>(path: string, params?: Record<string, string | number>): Promise<T>;
31
+ del<T>(path: string, params?: Record<string, string | number>): Promise<T>;
32
+ }
33
+ export declare class ProxmoxError extends Error {
34
+ readonly status: number;
35
+ constructor(status: number, message: string);
36
+ }
37
+ export declare function createProxmoxApi(cfg: ProxmoxConfig): ProxmoxApi;
38
+ export interface BoxHostConfig {
39
+ /** VMID of the template CT (a Proxmox template, linked clones only). */
40
+ templateVmid: number;
41
+ /** The pool every box is created in; the token can touch nothing else. */
42
+ pool: string;
43
+ /** Storage the template and its linked clones live on (the fill guard reads it). */
44
+ storage: string;
45
+ /**
46
+ * The LVM thin pool behind `storage`, `vg/lv` (e.g. `pve/data`), for the
47
+ * metadata guard. Unset = no metadata guard (said once at start).
48
+ */
49
+ thinpool?: string;
50
+ /** The isolated box bridge. */
51
+ bridge: string;
52
+ /** First three octets of the box subnet, e.g. "10.20.0". */
53
+ subnetPrefix: string;
54
+ /** VMIDs reserved for boxes, inclusive. */
55
+ vmidMin: number;
56
+ vmidMax: number;
57
+ cpuunits: number;
58
+ }
59
+ /** Every box carries this tag; the reaper touches nothing without it. */
60
+ export declare const BOX_TAG = "synap-box";
61
+ export interface BoxHandle {
62
+ vmid: number;
63
+ ip: string;
64
+ }
65
+ export interface HostReading {
66
+ memAvailableMb: number;
67
+ storageUsedPct: number;
68
+ /** Thin pool metadata fill; null only when no `thinpool` is configured (never for a failed read: that throws). */
69
+ metaUsedPct: number | null;
70
+ }
71
+ export interface ListedBox {
72
+ vmid: number;
73
+ name: string;
74
+ }
75
+ export interface BoxBackend {
76
+ readHost(): Promise<HostReading>;
77
+ /** Clone, size, attach to the bridge and start a box for one run. */
78
+ create(runId: string, limits: {
79
+ cpus: number;
80
+ memoryMb: number;
81
+ }): Promise<BoxHandle>;
82
+ /** Stop and destroy; idempotent (a box already gone is success). */
83
+ destroy(vmid: number): Promise<void>;
84
+ /** Every tagged box in the pool (the reaper destroys those no run holds). */
85
+ list(): Promise<ListedBox[]>;
86
+ }
87
+ /** The IP a box gets on the bridge, by its VMID slot (.10 upward). */
88
+ export declare function boxIpFor(cfg: BoxHostConfig, vmid: number): string;
89
+ type ClusterGuest = {
90
+ vmid?: number;
91
+ type?: string;
92
+ name?: string;
93
+ pool?: string;
94
+ tags?: string;
95
+ template?: number;
96
+ };
97
+ /**
98
+ * The boxes the reaper may destroy: guests of the box pool, in the box VMID
99
+ * range, tagged `synap-box`, never the template. Read from /cluster/resources
100
+ * (VM.Audit + Pool.Audit on the pool), not the deprecated GET /pools/{id}.
101
+ */
102
+ export declare function boxesOf(cfg: BoxHostConfig, guests: readonly ClusterGuest[]): ListedBox[];
103
+ type ThinPool = {
104
+ lv: string;
105
+ vg: string;
106
+ metadata_size: number;
107
+ metadata_used: number;
108
+ };
109
+ /** Metadata fill of `vg/lv`; throws when the pool is not listed (a missing reading is never "fine"). */
110
+ export declare function thinMetaPct(spec: string, pools: readonly ThinPool[]): number;
111
+ export declare function createProxmoxBackend(api: ProxmoxApi, node: string, cfg: BoxHostConfig): BoxBackend;
112
+ export {};
@@ -0,0 +1,211 @@
1
+ /**
2
+ * The Proxmox backend of the run box: one fresh unprivileged LXC per run,
3
+ * linked-cloned from a template CT, on the isolated box bridge, destroyed after.
4
+ *
5
+ * It talks to the Proxmox API with a POOL-SCOPED token (least privilege: it
6
+ * can clone, configure, start, stop and destroy guests of ONE pool, and read
7
+ * node memory, one storage's fill and the thin pools' fill — nothing else;
8
+ * host side in `my server` docs/RUNBOX.md, `scripts/box/setup-box-access.sh`). TLS is verified against the host's own CA, pinned by file,
9
+ * never `rejectUnauthorized: false`.
10
+ */
11
+ import https from "node:https";
12
+ export class ProxmoxError extends Error {
13
+ status;
14
+ constructor(status, message) {
15
+ super(message);
16
+ this.status = status;
17
+ this.name = "ProxmoxError";
18
+ }
19
+ }
20
+ export function createProxmoxApi(cfg) {
21
+ const base = new URL("/api2/json", cfg.endpoint);
22
+ const agent = new https.Agent({ ca: cfg.ca, keepAlive: true, ...(cfg.serverName ? { servername: cfg.serverName } : {}) });
23
+ function request(method, path, params) {
24
+ const url = new URL(base.pathname + path, base);
25
+ let body;
26
+ const form = params
27
+ ? new URLSearchParams(Object.entries(params).map(([k, v]) => [k, String(v)])).toString()
28
+ : "";
29
+ if (method === "GET" || method === "DELETE") {
30
+ if (form)
31
+ url.search = form;
32
+ }
33
+ else {
34
+ body = form;
35
+ }
36
+ return new Promise((resolve, reject) => {
37
+ const req = https.request(url, {
38
+ method,
39
+ agent,
40
+ headers: {
41
+ Authorization: `PVEAPIToken=${cfg.token}`,
42
+ ...(body !== undefined
43
+ ? { "Content-Type": "application/x-www-form-urlencoded", "Content-Length": Buffer.byteLength(body) }
44
+ : {}),
45
+ },
46
+ timeout: 30_000,
47
+ }, (res) => {
48
+ const chunks = [];
49
+ res.on("data", (c) => chunks.push(c));
50
+ res.on("end", () => {
51
+ const text = Buffer.concat(chunks).toString("utf8");
52
+ if ((res.statusCode ?? 500) >= 400) {
53
+ reject(new ProxmoxError(res.statusCode ?? 500, `${method} ${path}: HTTP ${res.statusCode} ${res.statusMessage ?? ""} ${text.slice(0, 300)}`.trim()));
54
+ return;
55
+ }
56
+ try {
57
+ resolve(JSON.parse(text).data);
58
+ }
59
+ catch {
60
+ reject(new ProxmoxError(res.statusCode ?? 500, `${method} ${path}: not JSON`));
61
+ }
62
+ });
63
+ });
64
+ req.on("timeout", () => req.destroy(new Error(`${method} ${path}: timed out`)));
65
+ req.on("error", reject);
66
+ if (body !== undefined)
67
+ req.write(body);
68
+ req.end();
69
+ });
70
+ }
71
+ return {
72
+ get: (p) => request("GET", p),
73
+ post: (p, params) => request("POST", p, params),
74
+ put: (p, params) => request("PUT", p, params),
75
+ del: (p, params) => request("DELETE", p, params),
76
+ };
77
+ }
78
+ /** Every box carries this tag; the reaper touches nothing without it. */
79
+ export const BOX_TAG = "synap-box";
80
+ /** The IP a box gets on the bridge, by its VMID slot (.10 upward). */
81
+ export function boxIpFor(cfg, vmid) {
82
+ return `${cfg.subnetPrefix}.${10 + (vmid - cfg.vmidMin)}`;
83
+ }
84
+ /**
85
+ * The boxes the reaper may destroy: guests of the box pool, in the box VMID
86
+ * range, tagged `synap-box`, never the template. Read from /cluster/resources
87
+ * (VM.Audit + Pool.Audit on the pool), not the deprecated GET /pools/{id}.
88
+ */
89
+ export function boxesOf(cfg, guests) {
90
+ return guests
91
+ .filter((g) => g.type === "lxc" && typeof g.vmid === "number" && g.pool === cfg.pool)
92
+ .filter((g) => g.vmid !== cfg.templateVmid && !g.template)
93
+ .filter((g) => g.vmid >= cfg.vmidMin && g.vmid <= cfg.vmidMax)
94
+ .filter((g) => (g.tags ?? "").split(/[;, ]/).includes(BOX_TAG))
95
+ .map((g) => ({ vmid: g.vmid, name: g.name ?? "" }));
96
+ }
97
+ /** Metadata fill of `vg/lv`; throws when the pool is not listed (a missing reading is never "fine"). */
98
+ export function thinMetaPct(spec, pools) {
99
+ const [vg, lv] = spec.split("/");
100
+ const p = pools.find((t) => t.vg === vg && t.lv === lv);
101
+ if (!p)
102
+ throw new Error(`thin pool ${spec} not found on the node`);
103
+ return p.metadata_size > 0 ? (p.metadata_used / p.metadata_size) * 100 : 100;
104
+ }
105
+ export function createProxmoxBackend(api, node, cfg) {
106
+ const n = encodeURIComponent(node);
107
+ async function waitTask(upid, timeoutMs = 120_000) {
108
+ const deadline = Date.now() + timeoutMs;
109
+ for (;;) {
110
+ const t = await api.get(`/nodes/${n}/tasks/${encodeURIComponent(upid)}/status`);
111
+ if (t.status === "stopped") {
112
+ if (t.exitstatus !== "OK")
113
+ throw new ProxmoxError(500, `task ${upid} ended: ${t.exitstatus}`);
114
+ return;
115
+ }
116
+ if (Date.now() > deadline)
117
+ throw new ProxmoxError(504, `task ${upid} still running after ${timeoutMs} ms`);
118
+ await new Promise((r) => setTimeout(r, 1000));
119
+ }
120
+ }
121
+ /**
122
+ * The first VMID of the box range that is free cluster-wide. /cluster/resources
123
+ * shows only the guests this token may audit (the pool), so each candidate is
124
+ * confirmed by /cluster/nextid?vmid=N, which checks every guest.
125
+ */
126
+ async function freeVmid() {
127
+ const seen = new Set((await api.get(`/cluster/resources?type=vm`)).map((g) => g.vmid).filter((v) => typeof v === "number"));
128
+ for (let id = cfg.vmidMin; id <= cfg.vmidMax; id++) {
129
+ if (seen.has(id))
130
+ continue;
131
+ try {
132
+ await api.get(`/cluster/nextid?vmid=${id}`);
133
+ return id;
134
+ }
135
+ catch (err) {
136
+ if (err instanceof ProxmoxError && err.status === 400)
137
+ continue; // "VM <id> already exists"
138
+ throw err;
139
+ }
140
+ }
141
+ return null;
142
+ }
143
+ async function destroy(vmid) {
144
+ try {
145
+ const st = await api.get(`/nodes/${n}/lxc/${vmid}/status/current`);
146
+ if (st.status === "running") {
147
+ await waitTask(await api.post(`/nodes/${n}/lxc/${vmid}/status/stop`));
148
+ }
149
+ await waitTask(await api.del(`/nodes/${n}/lxc/${vmid}`, { purge: 1, "destroy-unreferenced-disks": 1 }));
150
+ }
151
+ catch (err) {
152
+ // A box already gone is the outcome we want.
153
+ if (err instanceof ProxmoxError && (err.status === 404 || /does not exist/.test(err.message)))
154
+ return;
155
+ throw err;
156
+ }
157
+ }
158
+ return {
159
+ async readHost() {
160
+ // `memory.free` here is MemFree; total - used is MemAvailable (read on
161
+ // the host 2026-10-26: within 1% of /proc/meminfo MemAvailable).
162
+ const status = await api.get(`/nodes/${n}/status`);
163
+ const st = await api.get(`/nodes/${n}/storage/${encodeURIComponent(cfg.storage)}/status`);
164
+ const metaUsedPct = cfg.thinpool
165
+ ? thinMetaPct(cfg.thinpool, await api.get(`/nodes/${n}/disks/lvmthin`))
166
+ : null;
167
+ return {
168
+ memAvailableMb: Math.floor((status.memory.total - status.memory.used) / 1024 / 1024),
169
+ storageUsedPct: st.total > 0 ? (st.used / st.total) * 100 : 100,
170
+ metaUsedPct,
171
+ };
172
+ },
173
+ async create(runId, limits) {
174
+ const vmid = await freeVmid();
175
+ if (vmid === null)
176
+ throw new ProxmoxError(503, `no free VMID in ${cfg.vmidMin}-${cfg.vmidMax}`);
177
+ const ip = boxIpFor(cfg, vmid);
178
+ const upid = await api.post(`/nodes/${n}/lxc/${cfg.templateVmid}/clone`, {
179
+ newid: vmid,
180
+ hostname: `box-${runId.slice(0, 8)}`,
181
+ pool: cfg.pool,
182
+ full: 0,
183
+ description: `synap box run ${runId}`,
184
+ });
185
+ await waitTask(upid);
186
+ try {
187
+ await api.put(`/nodes/${n}/lxc/${vmid}/config`, {
188
+ cores: limits.cpus,
189
+ memory: limits.memoryMb,
190
+ swap: 0,
191
+ cpuunits: cfg.cpuunits,
192
+ // No gateway: the box's only reachable neighbour is the provisioner.
193
+ net0: `name=eth0,bridge=${cfg.bridge},ip=${ip}/24,firewall=0`,
194
+ tags: `${BOX_TAG};run-${runId.slice(0, 8)}`,
195
+ onboot: 0,
196
+ });
197
+ await waitTask(await api.post(`/nodes/${n}/lxc/${vmid}/status/start`));
198
+ }
199
+ catch (err) {
200
+ await destroy(vmid).catch(() => undefined);
201
+ throw err;
202
+ }
203
+ return { vmid, ip };
204
+ },
205
+ destroy,
206
+ async list() {
207
+ return boxesOf(cfg, await api.get(`/cluster/resources?type=vm`));
208
+ },
209
+ };
210
+ }
211
+ //# sourceMappingURL=proxmox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxmox.js","sourceRoot":"","sources":["../../../src/lib/box/proxmox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * The pod side of a box run, as the provisioner sees it: lease, heartbeat,
3
+ * upload, finish. ONE module, so the wire shape lives in one place. Contract:
4
+ * lanes/code-runtime/BOX-CONTRACT.md v2 (2026-10-26, owned by the pod lane),
5
+ * Hub routes `/api/hub/box-runs/*`.
6
+ *
7
+ * Every call carries the COMPUTER's own key (device flow, scope `box.runner`):
8
+ * the provisioner is a computer that pulls runs, never an agent.
9
+ */
10
+ import type { HubConfig } from "../hub-client.js";
11
+ import type { BlockedEgress } from "./egress.js";
12
+ import type { InstalledPackage, RunLog } from "./evidence.js";
13
+ export type BoxLanguage = "python" | "node";
14
+ export interface BoxLimits {
15
+ wallSeconds: number;
16
+ cpus: number;
17
+ memoryMb: number;
18
+ diskMb: number;
19
+ outMb: number;
20
+ }
21
+ export interface BoxScript {
22
+ skillId: string;
23
+ name: string;
24
+ language: BoxLanguage;
25
+ entrypoint: string;
26
+ code: string;
27
+ packages: Array<{
28
+ name: string;
29
+ version: string;
30
+ }>;
31
+ /** Run-phase egress allowlist: host names, optionally `host:port`. */
32
+ hosts: string[];
33
+ limits: BoxLimits;
34
+ }
35
+ export interface LeasedRun {
36
+ id: string;
37
+ leaseId: string;
38
+ leaseExpiresAt: string;
39
+ heartbeatIntervalSeconds: number;
40
+ script: BoxScript;
41
+ parameters: unknown;
42
+ queuedAt: string;
43
+ attempt: number;
44
+ }
45
+ export interface HeartbeatReply {
46
+ leaseExpiresAt: string;
47
+ stopRequested: boolean;
48
+ }
49
+ export interface UploadTicket {
50
+ uploadUrl: string;
51
+ method: string;
52
+ headers: Record<string, string>;
53
+ uploadToken: string;
54
+ expiresAt: string;
55
+ maxBytes: number;
56
+ }
57
+ /** BOX-CONTRACT v2: timeout and infra are stored as failed with the verdict kept. */
58
+ export type FinishStatus = "done" | "failed" | "stopped" | "timeout" | "infra";
59
+ export interface FinishedFile {
60
+ path: string;
61
+ size: number;
62
+ sha256: string;
63
+ /** Absent when the file could not be uploaded: it is recorded in the evidence only. */
64
+ uploadToken?: string;
65
+ title?: string;
66
+ }
67
+ export interface FinishBody {
68
+ leaseId: string;
69
+ status: FinishStatus;
70
+ exitCode: number | null;
71
+ durationMs: number;
72
+ /** Required when status = infra. */
73
+ infraReason?: string;
74
+ log: RunLog;
75
+ files: FinishedFile[];
76
+ blockedEgress: BlockedEgress[];
77
+ installedPackages: InstalledPackage[];
78
+ }
79
+ /** 404 / 409: the pod no longer holds this lease for us. Stop, destroy, never finish. */
80
+ export declare class LeaseLostError extends Error {
81
+ constructor(runId: string, status: number);
82
+ }
83
+ /** The run has no workspace: its files cannot be stored (record them `stored: false`). */
84
+ export declare class WorkspaceRequiredError extends Error {
85
+ constructor();
86
+ }
87
+ export interface BoxHub {
88
+ lease(): Promise<LeasedRun | null>;
89
+ heartbeat(run: LeasedRun, phase: "setup" | "running"): Promise<HeartbeatReply>;
90
+ upload(run: LeasedRun, file: {
91
+ filename: string;
92
+ mimeType: string;
93
+ bytes: Buffer;
94
+ }): Promise<string>;
95
+ finish(run: LeasedRun, body: FinishBody): Promise<unknown>;
96
+ }
97
+ export type FetchLike = (url: string, init: RequestInit) => Promise<Response>;
98
+ export declare function createBoxHub(cfg: Pick<HubConfig, "podUrl" | "apiKey">, fetchImpl?: FetchLike): BoxHub;
@@ -0,0 +1,70 @@
1
+ /**
2
+ * The pod side of a box run, as the provisioner sees it: lease, heartbeat,
3
+ * upload, finish. ONE module, so the wire shape lives in one place. Contract:
4
+ * lanes/code-runtime/BOX-CONTRACT.md v2 (2026-10-26, owned by the pod lane),
5
+ * Hub routes `/api/hub/box-runs/*`.
6
+ *
7
+ * Every call carries the COMPUTER's own key (device flow, scope `box.runner`):
8
+ * the provisioner is a computer that pulls runs, never an agent.
9
+ */
10
+ /** 404 / 409: the pod no longer holds this lease for us. Stop, destroy, never finish. */
11
+ export class LeaseLostError extends Error {
12
+ constructor(runId, status) {
13
+ super(`lease on box run ${runId} lost (HTTP ${status})`);
14
+ this.name = "LeaseLostError";
15
+ }
16
+ }
17
+ /** The run has no workspace: its files cannot be stored (record them `stored: false`). */
18
+ export class WorkspaceRequiredError extends Error {
19
+ constructor() {
20
+ super("the run has no workspace: its files cannot be stored");
21
+ this.name = "WorkspaceRequiredError";
22
+ }
23
+ }
24
+ export function createBoxHub(cfg, fetchImpl = fetch) {
25
+ const base = `${cfg.podUrl.replace(/\/+$/, "")}/api/hub/box-runs`;
26
+ async function post(path, body, runId) {
27
+ const res = await fetchImpl(`${base}${path}`, {
28
+ method: "POST",
29
+ headers: { Authorization: `Bearer ${cfg.apiKey}`, "Content-Type": "application/json" },
30
+ body: JSON.stringify(body),
31
+ signal: AbortSignal.timeout(30_000),
32
+ });
33
+ if (runId && (res.status === 404 || res.status === 409))
34
+ throw new LeaseLostError(runId, res.status);
35
+ if (!res.ok) {
36
+ const text = await res.text().catch(() => "");
37
+ if (res.status === 400 && /WORKSPACE_REQUIRED/.test(text))
38
+ throw new WorkspaceRequiredError();
39
+ throw new Error(`POST box-runs${path} failed (HTTP ${res.status})${text ? `: ${text.slice(0, 300)}` : ""}`);
40
+ }
41
+ return res.json();
42
+ }
43
+ const runPath = (run, verb) => `/${encodeURIComponent(run.id)}/${verb}`;
44
+ return {
45
+ async lease() {
46
+ const body = (await post("/lease", {}));
47
+ return body.run ?? null;
48
+ },
49
+ async heartbeat(run, phase) {
50
+ return (await post(runPath(run, "heartbeat"), { leaseId: run.leaseId, phase }, run.id));
51
+ },
52
+ async upload(run, file) {
53
+ const ticket = (await post(runPath(run, "uploads"), { leaseId: run.leaseId, filename: file.filename, mimeType: file.mimeType, size: file.bytes.length }, run.id));
54
+ // Straight to object storage with exactly the headers the pod signed.
55
+ const put = await fetchImpl(ticket.uploadUrl, {
56
+ method: ticket.method || "PUT",
57
+ headers: ticket.headers,
58
+ body: new Uint8Array(file.bytes),
59
+ signal: AbortSignal.timeout(10 * 60_000),
60
+ });
61
+ if (!put.ok)
62
+ throw new Error(`storing ${file.filename} failed (HTTP ${put.status})`);
63
+ return ticket.uploadToken;
64
+ },
65
+ async finish(run, body) {
66
+ return post(runPath(run, "finish"), body, run.id);
67
+ },
68
+ };
69
+ }
70
+ //# sourceMappingURL=wire.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire.js","sourceRoot":"","sources":["../../../src/lib/box/wire.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Which CLI the claude-code MCP bridge entry names (`resolveBridgeInvocation`).
3
+ * On 2026-11-02 `~/.claude.json` named `node …/synap-cli/dist/index.js mcp
4
+ * bridge`: the global `synap` was an `npm link` of a checkout, and the
5
+ * registration wrote the link's RESOLVED target, so installing a release never
6
+ * reached the bridge. These rows build each install shape on disk and pin what
7
+ * gets registered: the bin npm installed, never what it resolves to.
8
+ */
9
+ import fs from "node:fs";
10
+ import os from "node:os";
11
+ import path from "node:path";
12
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
13
+ import { bridgeInvocationNote, resolveBridgeInvocation } from "./targets.js";
14
+ const NODE = "/usr/local/bin/node";
15
+ let tmp;
16
+ function file(p) {
17
+ fs.mkdirSync(path.dirname(p), { recursive: true });
18
+ fs.writeFileSync(p, "#!/usr/bin/env node\n");
19
+ return p;
20
+ }
21
+ function link(target, at) {
22
+ fs.mkdirSync(path.dirname(at), { recursive: true });
23
+ fs.symlinkSync(target, at);
24
+ return at;
25
+ }
26
+ /** `npm i -g @synap-core/cli` under `<tmp>/prefix`: the package dir plus its bin link. */
27
+ function globalInstall() {
28
+ const entry = file(path.join(tmp, "prefix", "lib", "node_modules", "@synap-core", "cli", "dist", "index.js"));
29
+ const bin = link("../lib/node_modules/@synap-core/cli/dist/index.js", path.join(tmp, "prefix", "bin", "synap"));
30
+ return { bin, entry };
31
+ }
32
+ beforeEach(() => {
33
+ tmp = fs.mkdtempSync(path.join(os.tmpdir(), "synap-bridge-inv-"));
34
+ });
35
+ afterEach(() => {
36
+ fs.rmSync(tmp, { recursive: true, force: true });
37
+ });
38
+ describe("resolveBridgeInvocation", () => {
39
+ it("an npm install run from its bin registers the bin, not the resolved dist path", () => {
40
+ const { bin } = globalInstall();
41
+ const inv = resolveBridgeInvocation(bin, NODE);
42
+ expect(inv.kind).toBe("installed");
43
+ expect(inv.command).toEqual([NODE, bin]);
44
+ expect(bridgeInvocationNote(inv)).toBeNull();
45
+ });
46
+ it("an npm install run through its package path still registers the bin next to it", () => {
47
+ const { bin, entry } = globalInstall();
48
+ const inv = resolveBridgeInvocation(entry, NODE);
49
+ expect(inv.kind).toBe("installed");
50
+ expect(inv.command).toEqual([NODE, bin]);
51
+ });
52
+ it("a global install that links a checkout registers the bin, and says it is a checkout", () => {
53
+ const checkoutEntry = file(path.join(tmp, "checkout", "synap-cli", "dist", "index.js"));
54
+ link(path.join(tmp, "checkout", "synap-cli"), path.join(tmp, "prefix", "lib", "node_modules", "@synap-core", "cli"));
55
+ const bin = link("../lib/node_modules/@synap-core/cli/dist/index.js", path.join(tmp, "prefix", "bin", "synap"));
56
+ const inv = resolveBridgeInvocation(bin, NODE);
57
+ expect(inv.kind).toBe("linked");
58
+ expect(inv.command).toEqual([NODE, bin]);
59
+ const note = bridgeInvocationNote(inv) ?? "";
60
+ expect(note).toContain(fs.realpathSync(checkoutEntry));
61
+ expect(note).toContain("npm install -g @synap-core/cli@next");
62
+ });
63
+ it("a checkout build run directly is kept, and said", () => {
64
+ const entry = file(path.join(tmp, "checkout", "synap-cli", "dist", "index.js"));
65
+ const inv = resolveBridgeInvocation(entry, NODE);
66
+ expect(inv.kind).toBe("checkout");
67
+ expect(inv.command).toEqual([NODE, fs.realpathSync(entry)]);
68
+ expect(bridgeInvocationNote(inv)).toContain("checkout build");
69
+ });
70
+ it("a throwaway npx copy falls back to the synap on PATH", () => {
71
+ const entry = file(path.join(tmp, "_npx", "abc", "node_modules", "@synap-core", "cli", "dist", "index.js"));
72
+ expect(resolveBridgeInvocation(entry, NODE)).toEqual({ kind: "npx", command: ["synap"] });
73
+ });
74
+ });
75
+ //# sourceMappingURL=bridge-invocation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-invocation.test.js","sourceRoot":"","sources":["../../src/lib/bridge-invocation.test.ts"],"names":[],"mappings":"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"}