@mesh-tech/mesh-cli 0.1.1 → 0.12.1

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 (504) hide show
  1. package/assets/intent/agents-fence.md +10 -0
  2. package/assets/intent/intent-claude-gate.mjs +255 -0
  3. package/assets/log-shipper.mjs +94 -0
  4. package/bin/mesh.mjs +80 -0
  5. package/dist/bin/mesh.d.ts +7 -9
  6. package/dist/bin/mesh.d.ts.map +1 -1
  7. package/dist/bin/mesh.js +20878 -37
  8. package/dist/bin/mesh.js.map +7 -1
  9. package/dist/build-info.json +4 -0
  10. package/dist/src/commands/agent-api-client.d.ts +79 -0
  11. package/dist/src/commands/agent-api-client.d.ts.map +1 -0
  12. package/dist/src/commands/agent-api-client.js +170 -0
  13. package/dist/src/commands/agent-api-client.js.map +1 -0
  14. package/dist/src/commands/artifacts.d.ts +13 -0
  15. package/dist/src/commands/artifacts.d.ts.map +1 -0
  16. package/dist/src/commands/artifacts.js +140 -0
  17. package/dist/src/commands/artifacts.js.map +1 -0
  18. package/dist/src/commands/cluster.d.ts +45 -0
  19. package/dist/src/commands/cluster.d.ts.map +1 -0
  20. package/dist/src/commands/cluster.js +259 -0
  21. package/dist/src/commands/cluster.js.map +1 -0
  22. package/dist/src/commands/conversations.d.ts +61 -0
  23. package/dist/src/commands/conversations.d.ts.map +1 -0
  24. package/dist/src/commands/conversations.js +239 -0
  25. package/dist/src/commands/conversations.js.map +1 -0
  26. package/dist/src/commands/create-app.d.ts +26 -3
  27. package/dist/src/commands/create-app.d.ts.map +1 -1
  28. package/dist/src/commands/create-app.js +465 -107
  29. package/dist/src/commands/create-app.js.map +1 -1
  30. package/dist/src/commands/deploy.d.ts +19 -0
  31. package/dist/src/commands/deploy.d.ts.map +1 -1
  32. package/dist/src/commands/deploy.js +83 -142
  33. package/dist/src/commands/deploy.js.map +1 -1
  34. package/dist/src/commands/dev-doctor.d.ts +137 -0
  35. package/dist/src/commands/dev-doctor.d.ts.map +1 -0
  36. package/dist/src/commands/dev-doctor.js +671 -0
  37. package/dist/src/commands/dev-doctor.js.map +1 -0
  38. package/dist/src/commands/dev-launch.d.ts +59 -0
  39. package/dist/src/commands/dev-launch.d.ts.map +1 -0
  40. package/dist/src/commands/dev-launch.js +118 -0
  41. package/dist/src/commands/dev-launch.js.map +1 -0
  42. package/dist/src/commands/dev-token-server.d.ts +32 -0
  43. package/dist/src/commands/dev-token-server.d.ts.map +1 -0
  44. package/dist/src/commands/dev-token-server.js +68 -0
  45. package/dist/src/commands/dev-token-server.js.map +1 -0
  46. package/dist/src/commands/dev.d.ts +289 -2
  47. package/dist/src/commands/dev.d.ts.map +1 -1
  48. package/dist/src/commands/dev.js +2501 -574
  49. package/dist/src/commands/dev.js.map +1 -1
  50. package/dist/src/commands/docs.d.ts +3 -0
  51. package/dist/src/commands/docs.d.ts.map +1 -0
  52. package/dist/src/commands/docs.js +262 -0
  53. package/dist/src/commands/docs.js.map +1 -0
  54. package/dist/src/commands/hub/index.d.ts +99 -0
  55. package/dist/src/commands/hub/index.d.ts.map +1 -0
  56. package/dist/src/commands/hub/index.js +452 -0
  57. package/dist/src/commands/hub/index.js.map +1 -0
  58. package/dist/src/commands/init.d.ts +65 -0
  59. package/dist/src/commands/init.d.ts.map +1 -0
  60. package/dist/src/commands/init.js +370 -0
  61. package/dist/src/commands/init.js.map +1 -0
  62. package/dist/src/commands/install-shim.d.ts +28 -0
  63. package/dist/src/commands/install-shim.d.ts.map +1 -0
  64. package/dist/src/commands/install-shim.js +191 -0
  65. package/dist/src/commands/install-shim.js.map +1 -0
  66. package/dist/src/commands/local/auth-provision.d.ts +71 -0
  67. package/dist/src/commands/local/auth-provision.d.ts.map +1 -0
  68. package/dist/src/commands/local/auth-provision.js +286 -0
  69. package/dist/src/commands/local/auth-provision.js.map +1 -0
  70. package/dist/src/commands/local/dev-local.d.ts +97 -0
  71. package/dist/src/commands/local/dev-local.d.ts.map +1 -0
  72. package/dist/src/commands/local/dev-local.js +306 -0
  73. package/dist/src/commands/local/dev-local.js.map +1 -0
  74. package/dist/src/commands/local/docker-runner.d.ts +37 -0
  75. package/dist/src/commands/local/docker-runner.d.ts.map +1 -0
  76. package/dist/src/commands/local/docker-runner.js +104 -0
  77. package/dist/src/commands/local/docker-runner.js.map +1 -0
  78. package/dist/src/commands/local/helpers.d.ts +22 -0
  79. package/dist/src/commands/local/helpers.d.ts.map +1 -0
  80. package/dist/src/commands/local/helpers.js +46 -0
  81. package/dist/src/commands/local/helpers.js.map +1 -0
  82. package/dist/src/commands/local/hub-local.d.ts +51 -0
  83. package/dist/src/commands/local/hub-local.d.ts.map +1 -0
  84. package/dist/src/commands/local/hub-local.js +197 -0
  85. package/dist/src/commands/local/hub-local.js.map +1 -0
  86. package/dist/src/commands/local/index.d.ts +23 -0
  87. package/dist/src/commands/local/index.d.ts.map +1 -0
  88. package/dist/src/commands/local/index.js +386 -0
  89. package/dist/src/commands/local/index.js.map +1 -0
  90. package/dist/src/commands/local/mocks.d.ts +361 -0
  91. package/dist/src/commands/local/mocks.d.ts.map +1 -0
  92. package/dist/src/commands/local/mocks.js +756 -0
  93. package/dist/src/commands/local/mocks.js.map +1 -0
  94. package/dist/src/commands/local/seed-zitadel.d.ts +151 -0
  95. package/dist/src/commands/local/seed-zitadel.d.ts.map +1 -0
  96. package/dist/src/commands/local/seed-zitadel.js +408 -0
  97. package/dist/src/commands/local/seed-zitadel.js.map +1 -0
  98. package/dist/src/commands/local/seed.d.ts +106 -0
  99. package/dist/src/commands/local/seed.d.ts.map +1 -0
  100. package/dist/src/commands/local/seed.js +252 -0
  101. package/dist/src/commands/local/seed.js.map +1 -0
  102. package/dist/src/commands/local/stack.d.ts +173 -0
  103. package/dist/src/commands/local/stack.d.ts.map +1 -0
  104. package/dist/src/commands/local/stack.js +499 -0
  105. package/dist/src/commands/local/stack.js.map +1 -0
  106. package/dist/src/commands/login.d.ts +256 -12
  107. package/dist/src/commands/login.d.ts.map +1 -1
  108. package/dist/src/commands/login.js +978 -50
  109. package/dist/src/commands/login.js.map +1 -1
  110. package/dist/src/commands/peer-addressing.d.ts +51 -0
  111. package/dist/src/commands/peer-addressing.d.ts.map +1 -0
  112. package/dist/src/commands/peer-addressing.js +64 -0
  113. package/dist/src/commands/peer-addressing.js.map +1 -0
  114. package/dist/src/commands/port-ownership.d.ts +69 -0
  115. package/dist/src/commands/port-ownership.d.ts.map +1 -0
  116. package/dist/src/commands/port-ownership.js +161 -0
  117. package/dist/src/commands/port-ownership.js.map +1 -0
  118. package/dist/src/commands/registry-publish.d.ts +3 -0
  119. package/dist/src/commands/registry-publish.d.ts.map +1 -0
  120. package/dist/src/commands/registry-publish.js +161 -0
  121. package/dist/src/commands/registry-publish.js.map +1 -0
  122. package/dist/src/commands/registry.d.ts +146 -2
  123. package/dist/src/commands/registry.d.ts.map +1 -1
  124. package/dist/src/commands/registry.js +541 -85
  125. package/dist/src/commands/registry.js.map +1 -1
  126. package/dist/src/commands/secrets/index.d.ts.map +1 -1
  127. package/dist/src/commands/secrets/index.js +15 -1
  128. package/dist/src/commands/secrets/index.js.map +1 -1
  129. package/dist/src/commands/secrets/migrate-config.d.ts +24 -0
  130. package/dist/src/commands/secrets/migrate-config.d.ts.map +1 -0
  131. package/dist/src/commands/secrets/migrate-config.js +277 -0
  132. package/dist/src/commands/secrets/migrate-config.js.map +1 -0
  133. package/dist/src/commands/secrets/set.d.ts +1 -0
  134. package/dist/src/commands/secrets/set.d.ts.map +1 -1
  135. package/dist/src/commands/secrets/set.js +96 -2
  136. package/dist/src/commands/secrets/set.js.map +1 -1
  137. package/dist/src/commands/skills.d.ts +34 -0
  138. package/dist/src/commands/skills.d.ts.map +1 -0
  139. package/dist/src/commands/skills.js +207 -0
  140. package/dist/src/commands/skills.js.map +1 -0
  141. package/dist/src/commands/stack.d.ts.map +1 -1
  142. package/dist/src/commands/stack.js +361 -23
  143. package/dist/src/commands/stack.js.map +1 -1
  144. package/dist/src/commands/temporal.d.ts +15 -0
  145. package/dist/src/commands/temporal.d.ts.map +1 -0
  146. package/dist/src/commands/temporal.js +781 -0
  147. package/dist/src/commands/temporal.js.map +1 -0
  148. package/dist/src/commands/tenant.d.ts +56 -0
  149. package/dist/src/commands/tenant.d.ts.map +1 -0
  150. package/dist/src/commands/tenant.js +233 -0
  151. package/dist/src/commands/tenant.js.map +1 -0
  152. package/dist/src/commands/tunnel/index.d.ts +49 -3
  153. package/dist/src/commands/tunnel/index.d.ts.map +1 -1
  154. package/dist/src/commands/tunnel/index.js +331 -8
  155. package/dist/src/commands/tunnel/index.js.map +1 -1
  156. package/dist/src/commands/vcs/clone.d.ts +3 -0
  157. package/dist/src/commands/vcs/clone.d.ts.map +1 -0
  158. package/dist/src/commands/vcs/clone.js +20 -0
  159. package/dist/src/commands/vcs/clone.js.map +1 -0
  160. package/dist/src/commands/vcs/common.d.ts +21 -0
  161. package/dist/src/commands/vcs/common.d.ts.map +1 -0
  162. package/dist/src/commands/vcs/common.js +62 -0
  163. package/dist/src/commands/vcs/common.js.map +1 -0
  164. package/dist/src/commands/vcs/drafts.d.ts +13 -0
  165. package/dist/src/commands/vcs/drafts.d.ts.map +1 -0
  166. package/dist/src/commands/vcs/drafts.js +45 -0
  167. package/dist/src/commands/vcs/drafts.js.map +1 -0
  168. package/dist/src/commands/vcs/get.d.ts +8 -0
  169. package/dist/src/commands/vcs/get.d.ts.map +1 -0
  170. package/dist/src/commands/vcs/get.js +61 -0
  171. package/dist/src/commands/vcs/get.js.map +1 -0
  172. package/dist/src/commands/vcs/index.d.ts +3 -0
  173. package/dist/src/commands/vcs/index.d.ts.map +1 -0
  174. package/dist/src/commands/vcs/index.js +58 -0
  175. package/dist/src/commands/vcs/index.js.map +1 -0
  176. package/dist/src/commands/vcs/propose.d.ts +23 -0
  177. package/dist/src/commands/vcs/propose.d.ts.map +1 -0
  178. package/dist/src/commands/vcs/propose.js +94 -0
  179. package/dist/src/commands/vcs/propose.js.map +1 -0
  180. package/dist/src/commands/vcs/review.d.ts +15 -0
  181. package/dist/src/commands/vcs/review.d.ts.map +1 -0
  182. package/dist/src/commands/vcs/review.js +35 -0
  183. package/dist/src/commands/vcs/review.js.map +1 -0
  184. package/dist/src/commands/vcs-enrich.d.ts +15 -0
  185. package/dist/src/commands/vcs-enrich.d.ts.map +1 -0
  186. package/dist/src/commands/vcs-enrich.js +28 -0
  187. package/dist/src/commands/vcs-enrich.js.map +1 -0
  188. package/dist/src/commands/vpn/index.d.ts +24 -0
  189. package/dist/src/commands/vpn/index.d.ts.map +1 -0
  190. package/dist/src/commands/vpn/index.js +543 -0
  191. package/dist/src/commands/vpn/index.js.map +1 -0
  192. package/dist/src/commands/vpn/tunnel.d.ts +11 -0
  193. package/dist/src/commands/vpn/tunnel.d.ts.map +1 -0
  194. package/dist/src/commands/vpn/tunnel.js +188 -0
  195. package/dist/src/commands/vpn/tunnel.js.map +1 -0
  196. package/dist/src/commands/workflow.d.ts +24 -0
  197. package/dist/src/commands/workflow.d.ts.map +1 -0
  198. package/dist/src/commands/workflow.js +577 -0
  199. package/dist/src/commands/workflow.js.map +1 -0
  200. package/dist/src/docs/assemble.d.ts +217 -0
  201. package/dist/src/docs/assemble.d.ts.map +1 -0
  202. package/dist/src/docs/assemble.js +739 -0
  203. package/dist/src/docs/assemble.js.map +1 -0
  204. package/dist/src/docs/cli-reference.d.ts +93 -0
  205. package/dist/src/docs/cli-reference.d.ts.map +1 -0
  206. package/dist/src/docs/cli-reference.js +256 -0
  207. package/dist/src/docs/cli-reference.js.map +1 -0
  208. package/dist/src/docs/discover.d.ts +60 -0
  209. package/dist/src/docs/discover.d.ts.map +1 -0
  210. package/dist/src/docs/discover.js +233 -0
  211. package/dist/src/docs/discover.js.map +1 -0
  212. package/dist/src/docs/portal.d.ts +79 -0
  213. package/dist/src/docs/portal.d.ts.map +1 -0
  214. package/dist/src/docs/portal.js +242 -0
  215. package/dist/src/docs/portal.js.map +1 -0
  216. package/dist/src/docs/registry-docs.d.ts +43 -0
  217. package/dist/src/docs/registry-docs.d.ts.map +1 -0
  218. package/dist/src/docs/registry-docs.js +138 -0
  219. package/dist/src/docs/registry-docs.js.map +1 -0
  220. package/dist/src/docs/schema.d.ts +48 -0
  221. package/dist/src/docs/schema.d.ts.map +1 -0
  222. package/dist/src/docs/schema.js +96 -0
  223. package/dist/src/docs/schema.js.map +1 -0
  224. package/dist/src/docs/serve.d.ts +27 -0
  225. package/dist/src/docs/serve.d.ts.map +1 -0
  226. package/dist/src/docs/serve.js +102 -0
  227. package/dist/src/docs/serve.js.map +1 -0
  228. package/dist/src/docs/start.d.ts +80 -0
  229. package/dist/src/docs/start.d.ts.map +1 -0
  230. package/dist/src/docs/start.js +313 -0
  231. package/dist/src/docs/start.js.map +1 -0
  232. package/dist/src/eval/agent-eval.d.mts +14 -0
  233. package/dist/src/eval/agent-eval.d.mts.map +1 -0
  234. package/dist/src/eval/agent-eval.mjs +273 -0
  235. package/dist/src/eval/agent-eval.mjs.map +1 -0
  236. package/dist/src/index.js +624 -7
  237. package/dist/src/index.js.map +7 -1
  238. package/dist/src/program.d.ts +26 -0
  239. package/dist/src/program.d.ts.map +1 -0
  240. package/dist/src/program.js +76 -0
  241. package/dist/src/program.js.map +1 -0
  242. package/dist/src/utils/auth-preflight.d.ts +159 -0
  243. package/dist/src/utils/auth-preflight.d.ts.map +1 -0
  244. package/dist/src/utils/auth-preflight.js +298 -0
  245. package/dist/src/utils/auth-preflight.js.map +1 -0
  246. package/dist/src/utils/aws-auth.d.ts +181 -0
  247. package/dist/src/utils/aws-auth.d.ts.map +1 -0
  248. package/dist/src/utils/aws-auth.js +527 -0
  249. package/dist/src/utils/aws-auth.js.map +1 -0
  250. package/dist/src/utils/bastion.d.ts +1 -1
  251. package/dist/src/utils/bastion.d.ts.map +1 -1
  252. package/dist/src/utils/bastion.js +29 -8
  253. package/dist/src/utils/bastion.js.map +1 -1
  254. package/dist/src/utils/build-info.d.ts +33 -0
  255. package/dist/src/utils/build-info.d.ts.map +1 -0
  256. package/dist/src/utils/build-info.js +102 -0
  257. package/dist/src/utils/build-info.js.map +1 -0
  258. package/dist/src/utils/capture-history.d.ts +62 -0
  259. package/dist/src/utils/capture-history.d.ts.map +1 -0
  260. package/dist/src/utils/capture-history.js +94 -0
  261. package/dist/src/utils/capture-history.js.map +1 -0
  262. package/dist/src/utils/deploy-preflight.d.ts +52 -0
  263. package/dist/src/utils/deploy-preflight.d.ts.map +1 -0
  264. package/dist/src/utils/deploy-preflight.js +183 -0
  265. package/dist/src/utils/deploy-preflight.js.map +1 -0
  266. package/dist/src/utils/errors.d.ts +75 -0
  267. package/dist/src/utils/errors.d.ts.map +1 -0
  268. package/dist/src/utils/errors.js +106 -0
  269. package/dist/src/utils/errors.js.map +1 -0
  270. package/dist/src/utils/first-party-contexts.d.ts +40 -0
  271. package/dist/src/utils/first-party-contexts.d.ts.map +1 -0
  272. package/dist/src/utils/first-party-contexts.js +53 -0
  273. package/dist/src/utils/first-party-contexts.js.map +1 -0
  274. package/dist/src/utils/index.d.ts +2 -0
  275. package/dist/src/utils/index.d.ts.map +1 -1
  276. package/dist/src/utils/index.js +2 -0
  277. package/dist/src/utils/index.js.map +1 -1
  278. package/dist/src/utils/kubeconfig.d.ts +62 -0
  279. package/dist/src/utils/kubeconfig.d.ts.map +1 -0
  280. package/dist/src/utils/kubeconfig.js +118 -0
  281. package/dist/src/utils/kubeconfig.js.map +1 -0
  282. package/dist/src/utils/log.d.ts +27 -1
  283. package/dist/src/utils/log.d.ts.map +1 -1
  284. package/dist/src/utils/log.js +59 -5
  285. package/dist/src/utils/log.js.map +1 -1
  286. package/dist/src/utils/pid.d.ts +47 -0
  287. package/dist/src/utils/pid.d.ts.map +1 -0
  288. package/dist/src/utils/pid.js +83 -0
  289. package/dist/src/utils/pid.js.map +1 -0
  290. package/dist/src/utils/pulumi-run.d.ts +23 -0
  291. package/dist/src/utils/pulumi-run.d.ts.map +1 -0
  292. package/dist/src/utils/pulumi-run.js +112 -0
  293. package/dist/src/utils/pulumi-run.js.map +1 -0
  294. package/dist/src/utils/pulumi.d.ts +15 -0
  295. package/dist/src/utils/pulumi.d.ts.map +1 -1
  296. package/dist/src/utils/pulumi.js +35 -0
  297. package/dist/src/utils/pulumi.js.map +1 -1
  298. package/dist/src/utils/reachability.d.ts +29 -0
  299. package/dist/src/utils/reachability.d.ts.map +1 -0
  300. package/dist/src/utils/reachability.js +81 -0
  301. package/dist/src/utils/reachability.js.map +1 -0
  302. package/dist/src/utils/recover-conversation.d.ts +154 -0
  303. package/dist/src/utils/recover-conversation.d.ts.map +1 -0
  304. package/dist/src/utils/recover-conversation.js +314 -0
  305. package/dist/src/utils/recover-conversation.js.map +1 -0
  306. package/dist/src/utils/registry-broker.d.ts +148 -0
  307. package/dist/src/utils/registry-broker.d.ts.map +1 -0
  308. package/dist/src/utils/registry-broker.js +180 -0
  309. package/dist/src/utils/registry-broker.js.map +1 -0
  310. package/dist/src/utils/socks-forward.d.ts +40 -0
  311. package/dist/src/utils/socks-forward.d.ts.map +1 -0
  312. package/dist/src/utils/socks-forward.js +97 -0
  313. package/dist/src/utils/socks-forward.js.map +1 -0
  314. package/dist/src/utils/stack-flag.d.ts +23 -0
  315. package/dist/src/utils/stack-flag.d.ts.map +1 -0
  316. package/dist/src/utils/stack-flag.js +41 -0
  317. package/dist/src/utils/stack-flag.js.map +1 -0
  318. package/dist/src/utils/tailscale-targets.d.ts +52 -0
  319. package/dist/src/utils/tailscale-targets.d.ts.map +1 -0
  320. package/dist/src/utils/tailscale-targets.js +93 -0
  321. package/dist/src/utils/tailscale-targets.js.map +1 -0
  322. package/dist/src/utils/tailscale.d.ts +277 -0
  323. package/dist/src/utils/tailscale.d.ts.map +1 -0
  324. package/dist/src/utils/tailscale.js +1007 -0
  325. package/dist/src/utils/tailscale.js.map +1 -0
  326. package/dist/src/utils/temporal-auth.d.ts +43 -0
  327. package/dist/src/utils/temporal-auth.d.ts.map +1 -0
  328. package/dist/src/utils/temporal-auth.js +176 -0
  329. package/dist/src/utils/temporal-auth.js.map +1 -0
  330. package/dist/src/utils/temporal-codec.d.ts +101 -0
  331. package/dist/src/utils/temporal-codec.d.ts.map +1 -0
  332. package/dist/src/utils/temporal-codec.js +319 -0
  333. package/dist/src/utils/temporal-codec.js.map +1 -0
  334. package/dist/src/utils/tunnel-ownership.d.ts +130 -0
  335. package/dist/src/utils/tunnel-ownership.d.ts.map +1 -0
  336. package/dist/src/utils/tunnel-ownership.js +274 -0
  337. package/dist/src/utils/tunnel-ownership.js.map +1 -0
  338. package/dist/src/utils/vpn-join.d.ts +32 -0
  339. package/dist/src/utils/vpn-join.d.ts.map +1 -0
  340. package/dist/src/utils/vpn-join.js +62 -0
  341. package/dist/src/utils/vpn-join.js.map +1 -0
  342. package/dist/src/utils/vpn.d.ts +62 -0
  343. package/dist/src/utils/vpn.d.ts.map +1 -0
  344. package/dist/src/utils/vpn.js +183 -0
  345. package/dist/src/utils/vpn.js.map +1 -0
  346. package/dist/src/utils/workflow-fingerprint.d.ts +49 -0
  347. package/dist/src/utils/workflow-fingerprint.d.ts.map +1 -0
  348. package/dist/src/utils/workflow-fingerprint.js +135 -0
  349. package/dist/src/utils/workflow-fingerprint.js.map +1 -0
  350. package/dist/src/utils/worktree-identity.d.ts +86 -0
  351. package/dist/src/utils/worktree-identity.d.ts.map +1 -0
  352. package/dist/src/utils/worktree-identity.js +164 -0
  353. package/dist/src/utils/worktree-identity.js.map +1 -0
  354. package/fragments/agents/AGENTS.md.hbs +92 -0
  355. package/fragments/agents/CLAUDE.md.hbs +8 -0
  356. package/fragments/base/Pulumi.dev.yaml.hbs +10 -0
  357. package/fragments/base/Pulumi.yaml.hbs +9 -0
  358. package/fragments/base/index.ts.hbs +107 -0
  359. package/fragments/base/package.json.hbs +22 -0
  360. package/{templates/api-web-db/api → fragments/base}/tsconfig.json +3 -4
  361. package/fragments/bucket/api/src/storage.ts.hbs +81 -0
  362. package/fragments/database/api/src/db.ts.hbs +23 -0
  363. package/fragments/database/prisma/schema.prisma.hbs +18 -0
  364. package/{templates/api-web-db → fragments/service}/api/.dockerignore +2 -0
  365. package/fragments/service/api/package.json.hbs +40 -0
  366. package/fragments/service/api/src/index.ts.hbs +58 -0
  367. package/{templates/api-web-db → fragments/service/api}/tsconfig.json +5 -3
  368. package/fragments/temporal/worker/.dockerignore +4 -0
  369. package/fragments/temporal/worker/Dockerfile +15 -0
  370. package/{templates/temporal-api-worker → fragments/temporal}/worker/package.json.hbs +3 -2
  371. package/fragments/temporal/worker/src/activities.ts.hbs +14 -0
  372. package/fragments/temporal/worker/src/worker.ts.hbs +27 -0
  373. package/fragments/temporal/worker/src/workflows.ts.hbs +24 -0
  374. package/fragments/temporal/worker/tsconfig.json +13 -0
  375. package/package.json +36 -22
  376. package/skills/core/SKILL.md +365 -0
  377. package/skills/pull-remote-agent-context/SKILL.md +194 -0
  378. package/stack/docker-compose.hub.yml +134 -0
  379. package/stack/docker-compose.yml +447 -0
  380. package/stack/hub/Dockerfile.api +18 -0
  381. package/stack/hub/Dockerfile.auth +10 -0
  382. package/stack/hub/Dockerfile.ui +10 -0
  383. package/stack/init/01-databases.sql +12 -0
  384. package/stack/observability/blackbox.yml +20 -0
  385. package/stack/observability/otel-collector.yaml +73 -0
  386. package/stack/observability/prometheus.yml +36 -0
  387. package/stack/observability/tempo.yaml +25 -0
  388. package/stack/temporal/local.yaml +44 -0
  389. package/templates/api-auth/AGENTS.md.hbs +16 -0
  390. package/templates/api-auth/Pulumi.dev.yaml.hbs +8 -0
  391. package/templates/api-auth/Pulumi.yaml.hbs +8 -0
  392. package/templates/api-auth/README.md.hbs +67 -0
  393. package/templates/api-auth/api/package.json.hbs +28 -0
  394. package/templates/api-auth/api/src/index.ts.hbs +96 -0
  395. package/templates/api-auth/api/src/schema.ts.hbs +35 -0
  396. package/templates/api-auth/api/src/seed-authz.ts.hbs +48 -0
  397. package/templates/api-auth/api/src/spicedb-http-provider.ts.hbs +89 -0
  398. package/templates/api-auth/index.ts.hbs +65 -0
  399. package/templates/api-auth/package.json.hbs +20 -0
  400. package/templates/api-auth/skills/develop/SKILL.md.hbs +32 -0
  401. package/templates/api-role-gating/AGENTS.md.hbs +20 -0
  402. package/templates/api-role-gating/Pulumi.dev.yaml.hbs +8 -0
  403. package/templates/api-role-gating/Pulumi.yaml.hbs +8 -0
  404. package/templates/api-role-gating/README.md.hbs +64 -0
  405. package/templates/api-role-gating/api/Dockerfile +17 -0
  406. package/templates/api-role-gating/api/package.json.hbs +28 -0
  407. package/templates/api-role-gating/api/src/authn.ts.hbs +29 -0
  408. package/templates/api-role-gating/api/src/authz.ts.hbs +12 -0
  409. package/templates/api-role-gating/api/src/main.ts.hbs +58 -0
  410. package/templates/api-role-gating/api/src/schema.ts.hbs +22 -0
  411. package/templates/api-role-gating/api/tsconfig.json +13 -0
  412. package/templates/api-role-gating/index.ts.hbs +107 -0
  413. package/templates/api-role-gating/package.json.hbs +21 -0
  414. package/templates/api-role-gating/skills/develop/SKILL.md.hbs +60 -0
  415. package/templates/api-role-gating/tsconfig.json +10 -0
  416. package/templates/apps-repo/README.md.hbs +24 -0
  417. package/templates/apps-repo/gitignore +41 -0
  418. package/templates/apps-repo/npmrc.hbs +7 -0
  419. package/templates/apps-repo/package.json.hbs +15 -0
  420. package/templates/apps-repo/pnpm-workspace.yaml +3 -0
  421. package/templates/apps-repo/tsconfig.json +18 -0
  422. package/templates/external-service/AGENTS.md.hbs +20 -0
  423. package/templates/external-service/Pulumi.dev.yaml.hbs +8 -0
  424. package/templates/external-service/Pulumi.yaml.hbs +8 -0
  425. package/templates/external-service/README.md.hbs +56 -0
  426. package/templates/external-service/api/Dockerfile +15 -0
  427. package/templates/external-service/api/package.json.hbs +25 -0
  428. package/templates/external-service/api/src/index.ts.hbs +81 -0
  429. package/templates/external-service/index.ts.hbs +82 -0
  430. package/templates/external-service/mocks/vendorpay/package.json.hbs +9 -0
  431. package/templates/external-service/mocks/vendorpay/server.mjs.hbs +61 -0
  432. package/templates/external-service/package.json.hbs +34 -0
  433. package/templates/external-service/skills/develop/SKILL.md.hbs +55 -0
  434. package/templates/external-service/tsconfig.json +10 -0
  435. package/templates/platform-repo/AGENTS.md.hbs +18 -0
  436. package/templates/platform-repo/README.md.hbs +38 -0
  437. package/templates/platform-repo/core/Pulumi.yaml.hbs +12 -0
  438. package/templates/platform-repo/core/Pulumi.{{tenant}}-{{env}}.yaml.hbs +57 -0
  439. package/templates/platform-repo/core/index.ts +62 -0
  440. package/templates/platform-repo/core/package.json.hbs +22 -0
  441. package/templates/platform-repo/core/tsconfig.json +8 -0
  442. package/templates/platform-repo/package.json.hbs +15 -0
  443. package/templates/platform-repo/platform/Pulumi.yaml.hbs +12 -0
  444. package/templates/platform-repo/platform/Pulumi.{{tenant}}-{{env}}.yaml.hbs +59 -0
  445. package/templates/platform-repo/platform/index.ts +95 -0
  446. package/templates/platform-repo/platform/package.json.hbs +26 -0
  447. package/templates/platform-repo/platform/tsconfig.json +8 -0
  448. package/templates/platform-repo/pnpm-workspace.yaml +3 -0
  449. package/templates/workflow/AGENTS.md.hbs +15 -0
  450. package/templates/workflow/Pulumi.dev.yaml.hbs +8 -0
  451. package/templates/workflow/Pulumi.yaml.hbs +8 -0
  452. package/templates/workflow/README.md.hbs +45 -0
  453. package/templates/workflow/api/.dockerignore +4 -0
  454. package/templates/workflow/api/Dockerfile +15 -0
  455. package/templates/{temporal-api-worker → workflow}/api/package.json.hbs +8 -6
  456. package/templates/workflow/api/src/index.ts.hbs +130 -0
  457. package/templates/workflow/api/tsconfig.json +14 -0
  458. package/templates/workflow/index.ts.hbs +67 -0
  459. package/templates/workflow/package.json.hbs +20 -0
  460. package/templates/workflow/skills/develop/SKILL.md.hbs +32 -0
  461. package/templates/workflow/tsconfig.json +10 -0
  462. package/templates/workflow/worker/.dockerignore +4 -0
  463. package/templates/workflow/worker/Dockerfile +13 -0
  464. package/templates/workflow/worker/package.json.hbs +25 -0
  465. package/templates/workflow/worker/src/worker.ts.hbs +24 -0
  466. package/templates/workflow/worker/tsconfig.json +14 -0
  467. package/dist/src/commands/devbox.d.ts +0 -22
  468. package/dist/src/commands/devbox.d.ts.map +0 -1
  469. package/dist/src/commands/devbox.js +0 -463
  470. package/dist/src/commands/devbox.js.map +0 -1
  471. package/templates/api-web-db/api/Dockerfile +0 -16
  472. package/templates/api-web-db/api/package.json.hbs +0 -21
  473. package/templates/api-web-db/api/src/index.ts.hbs +0 -123
  474. package/templates/api-web-db/package.json.hbs +0 -27
  475. package/templates/api-web-db/sst.config.ts.hbs +0 -151
  476. package/templates/api-web-db/web/.dockerignore +0 -3
  477. package/templates/api-web-db/web/Dockerfile +0 -17
  478. package/templates/api-web-db/web/app/lib/db.server.ts +0 -36
  479. package/templates/api-web-db/web/app/root.tsx +0 -29
  480. package/templates/api-web-db/web/app/routes/home.tsx.hbs +0 -114
  481. package/templates/api-web-db/web/app/routes.ts +0 -3
  482. package/templates/api-web-db/web/package.json.hbs +0 -30
  483. package/templates/api-web-db/web/prisma/schema.prisma +0 -25
  484. package/templates/api-web-db/web/prisma.config.ts +0 -18
  485. package/templates/api-web-db/web/react-router.config.ts +0 -5
  486. package/templates/api-web-db/web/tsconfig.json +0 -19
  487. package/templates/api-web-db/web/vite.config.ts +0 -9
  488. package/templates/temporal-api-worker/README.md.hbs +0 -133
  489. package/templates/temporal-api-worker/api/src/index.ts.hbs +0 -145
  490. package/templates/temporal-api-worker/package.json.hbs +0 -29
  491. package/templates/temporal-api-worker/sst.config.ts.hbs +0 -161
  492. package/templates/temporal-api-worker/worker/Dockerfile +0 -11
  493. package/templates/temporal-api-worker/worker/src/bundle-workflows.ts +0 -38
  494. package/templates/temporal-api-worker/worker/src/worker.ts.hbs +0 -93
  495. /package/templates/{temporal-api-worker → api-auth}/api/.dockerignore +0 -0
  496. /package/templates/{temporal-api-worker → api-auth}/api/Dockerfile +0 -0
  497. /package/templates/{temporal-api-worker → api-auth}/api/tsconfig.json +0 -0
  498. /package/templates/{temporal-api-worker → api-auth}/tsconfig.json +0 -0
  499. /package/templates/{temporal-api-worker/worker → api-role-gating/api}/.dockerignore +0 -0
  500. /package/templates/{temporal-api-worker/worker → external-service/api}/tsconfig.json +0 -0
  501. /package/templates/{temporal-api-worker → workflow}/api/src/encryption-codec.ts +0 -0
  502. /package/templates/{temporal-api-worker → workflow}/worker/src/activities.ts.hbs +0 -0
  503. /package/templates/{temporal-api-worker → workflow}/worker/src/encryption-codec.ts +0 -0
  504. /package/templates/{temporal-api-worker → workflow}/worker/src/workflows.ts.hbs +0 -0
@@ -0,0 +1,543 @@
1
+ /**
2
+ * mesh vpn — Headscale VPN management commands
3
+ *
4
+ * Commands:
5
+ * mesh vpn connect <context> Connect to VPN via Tailscale + OIDC
6
+ * mesh vpn disconnect Disconnect from VPN
7
+ * mesh vpn status Show VPN control plane status
8
+ * mesh vpn api-key Create a Headscale API key
9
+ * mesh vpn pre-auth-key Create a pre-authentication key for a user
10
+ * mesh vpn users List registered VPN users
11
+ *
12
+ * All commands shell out to kubectl. The user must have kubeconfig
13
+ * configured for the target cluster (e.g., via `aws eks update-kubeconfig`).
14
+ */
15
+ import { execFileSync } from "child_process";
16
+ import * as net from "node:net";
17
+ import { logInfo, logSuccess, logError, logWarn } from "../../utils/index.js";
18
+ import { getContextConfig } from "../login.js";
19
+ import { registerTunnelSubcommands } from "./tunnel.js";
20
+ import { ensureDaemon, joinHeadscale, daemonState, stopDaemon, tailscaleAvailable, readDaemonMeta, findRunningDaemon, } from "../../utils/tailscale.js";
21
+ // =============================================================================
22
+ // Constants
23
+ // =============================================================================
24
+ /** Default namespace follows the convention: {tenant}-{env}-headscale */
25
+ function defaultNamespace(tenant, env) {
26
+ return `${tenant}-${env}-headscale`;
27
+ }
28
+ const HEADSCALE_POD = "headscale-0";
29
+ const HEADSCALE_CONTAINER = "headscale";
30
+ // =============================================================================
31
+ // Helpers
32
+ // =============================================================================
33
+ function resolveNamespace(options) {
34
+ return options.namespace ?? defaultNamespace(options.tenant, options.env);
35
+ }
36
+ /**
37
+ * Run a headscale CLI command inside the headscale pod.
38
+ * Returns stdout as a string. Throws on non-zero exit.
39
+ */
40
+ function headscaleExec(namespace, args, opts) {
41
+ const cmd = ["headscale", ...args];
42
+ if (opts?.json) {
43
+ cmd.push("--output", "json");
44
+ }
45
+ const execOpts = {
46
+ encoding: "utf-8",
47
+ stdio: ["pipe", "pipe", "pipe"],
48
+ };
49
+ try {
50
+ const result = execFileSync("kubectl", [
51
+ "exec",
52
+ "-n", namespace,
53
+ HEADSCALE_POD,
54
+ "-c", HEADSCALE_CONTAINER,
55
+ "--",
56
+ ...cmd,
57
+ ], execOpts);
58
+ return result.trim();
59
+ }
60
+ catch (error) {
61
+ const execError = error;
62
+ const stderr = execError.stderr?.toString().trim() ?? "";
63
+ if (stderr) {
64
+ throw new Error(stderr);
65
+ }
66
+ throw error;
67
+ }
68
+ }
69
+ /**
70
+ * Derive the likely EKS cluster name from tenant/env convention.
71
+ */
72
+ function clusterName(tenant, env) {
73
+ return `${tenant}-${env}-eks`;
74
+ }
75
+ /**
76
+ * Check that the headscale pod is running and reachable.
77
+ */
78
+ function assertPodReady(namespace, options) {
79
+ try {
80
+ const output = execFileSync("kubectl", [
81
+ "get", "pod", HEADSCALE_POD,
82
+ "-n", namespace,
83
+ "-o", "jsonpath={.status.phase}",
84
+ ], { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
85
+ if (output.trim() !== "Running") {
86
+ logError(`Headscale pod is not running (status: ${output.trim()})`);
87
+ process.exit(1);
88
+ }
89
+ }
90
+ catch (err) {
91
+ const stderr = err.stderr?.toString() ?? "";
92
+ logError(`Cannot reach headscale pod in namespace ${namespace}`);
93
+ if (stderr.includes("expired") || stderr.includes("token")) {
94
+ logInfo("Your AWS credentials appear to be expired. Refresh them and retry.");
95
+ }
96
+ else {
97
+ const cluster = clusterName(options.tenant, options.env);
98
+ logInfo("Make sure your kubeconfig is configured for the target cluster:");
99
+ const region = process.env.AWS_REGION ?? process.env.AWS_DEFAULT_REGION ?? "us-east-2";
100
+ logInfo(` aws eks update-kubeconfig --name ${cluster} --region ${region}`);
101
+ }
102
+ process.exit(1);
103
+ }
104
+ }
105
+ // =============================================================================
106
+ // Commands
107
+ // =============================================================================
108
+ async function vpnStatus(options) {
109
+ const ns = resolveNamespace(options);
110
+ logInfo(`Checking Headscale in namespace ${ns}...`);
111
+ assertPodReady(ns, options);
112
+ // Get pod details
113
+ const podJson = execFileSync("kubectl", [
114
+ "get", "pod", HEADSCALE_POD,
115
+ "-n", ns,
116
+ "-o", "json",
117
+ ], { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
118
+ const pod = JSON.parse(podJson);
119
+ const container = pod.status?.containerStatuses?.find((c) => c.name === HEADSCALE_CONTAINER);
120
+ const image = container?.image ?? "unknown";
121
+ const ready = container?.ready ?? false;
122
+ const restarts = container?.restartCount ?? 0;
123
+ // Get the HTTPRoute hostname
124
+ let endpoint = "unknown";
125
+ try {
126
+ endpoint = execFileSync("kubectl", [
127
+ "get", "httproute",
128
+ "-n", ns,
129
+ "-o", "jsonpath={.items[0].spec.hostnames[0]}",
130
+ ], { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }).trim();
131
+ if (endpoint) {
132
+ endpoint = `https://${endpoint}`;
133
+ }
134
+ }
135
+ catch {
136
+ // HTTPRoute may not exist
137
+ }
138
+ // List users
139
+ let userCount = 0;
140
+ try {
141
+ const usersJson = headscaleExec(ns, ["users", "list"], { json: true });
142
+ const users = JSON.parse(usersJson);
143
+ userCount = Array.isArray(users) ? users.length : 0;
144
+ }
145
+ catch {
146
+ // Users may not be queryable yet
147
+ }
148
+ // List nodes
149
+ let nodeCount = 0;
150
+ try {
151
+ const nodesJson = headscaleExec(ns, ["nodes", "list"], { json: true });
152
+ const nodes = JSON.parse(nodesJson);
153
+ nodeCount = Array.isArray(nodes) ? nodes.length : 0;
154
+ }
155
+ catch {
156
+ // Nodes may not be queryable
157
+ }
158
+ console.log("");
159
+ console.log(` Endpoint: ${endpoint}`);
160
+ console.log(` Image: ${image}`);
161
+ console.log(` Ready: ${ready ? "yes" : "no"}`);
162
+ console.log(` Restarts: ${restarts}`);
163
+ console.log(` Namespace: ${ns}`);
164
+ console.log(` Users: ${userCount}`);
165
+ console.log(` Nodes: ${nodeCount}`);
166
+ console.log("");
167
+ if (ready) {
168
+ logSuccess("Headscale is healthy");
169
+ }
170
+ else {
171
+ logWarn("Headscale pod is not ready");
172
+ }
173
+ }
174
+ async function createApiKey(options) {
175
+ const ns = resolveNamespace(options);
176
+ logInfo(`Creating Headscale API key in namespace ${ns}...`);
177
+ assertPodReady(ns, options);
178
+ try {
179
+ const output = headscaleExec(ns, ["apikeys", "create"]);
180
+ console.log("");
181
+ logSuccess("API key created:");
182
+ console.log("");
183
+ console.log(` ${output}`);
184
+ console.log("");
185
+ logWarn("Store this key securely — it cannot be retrieved again.");
186
+ }
187
+ catch (error) {
188
+ const message = error instanceof Error ? error.message : String(error);
189
+ logError(`Failed to create API key: ${message}`);
190
+ process.exit(1);
191
+ }
192
+ }
193
+ async function createPreAuthKey(options) {
194
+ const ns = resolveNamespace(options);
195
+ const { user, expiration, reusable, ephemeral } = options;
196
+ logInfo(`Creating pre-auth key for user "${user}" in namespace ${ns}...`);
197
+ assertPodReady(ns, options);
198
+ // Ensure the user exists
199
+ try {
200
+ headscaleExec(ns, ["users", "create", user]);
201
+ logInfo(`Created user "${user}"`);
202
+ }
203
+ catch (error) {
204
+ const message = error instanceof Error ? error.message : String(error);
205
+ // "already exists" is fine
206
+ if (!message.includes("already exists")) {
207
+ logError(`Failed to create user: ${message}`);
208
+ process.exit(1);
209
+ }
210
+ logInfo(`User "${user}" already exists`);
211
+ }
212
+ const args = ["preauthkeys", "create", "--user", user];
213
+ if (expiration) {
214
+ args.push("--expiration", expiration);
215
+ }
216
+ if (reusable) {
217
+ args.push("--reusable");
218
+ }
219
+ if (ephemeral) {
220
+ args.push("--ephemeral");
221
+ }
222
+ try {
223
+ const output = headscaleExec(ns, args);
224
+ console.log("");
225
+ logSuccess("Pre-authentication key created:");
226
+ console.log("");
227
+ console.log(` ${output}`);
228
+ console.log("");
229
+ logInfo("Use this key to register a node:");
230
+ logInfo(` tailscale up --login-server <endpoint> --authkey ${output}`);
231
+ }
232
+ catch (error) {
233
+ const message = error instanceof Error ? error.message : String(error);
234
+ logError(`Failed to create pre-auth key: ${message}`);
235
+ process.exit(1);
236
+ }
237
+ }
238
+ async function listUsers(options) {
239
+ const ns = resolveNamespace(options);
240
+ logInfo(`Listing Headscale users in namespace ${ns}...`);
241
+ assertPodReady(ns, options);
242
+ try {
243
+ const output = headscaleExec(ns, ["users", "list"]);
244
+ console.log("");
245
+ console.log(output);
246
+ console.log("");
247
+ }
248
+ catch (error) {
249
+ const message = error instanceof Error ? error.message : String(error);
250
+ logError(`Failed to list users: ${message}`);
251
+ process.exit(1);
252
+ }
253
+ }
254
+ // =============================================================================
255
+ // VPN Connect / Disconnect
256
+ // =============================================================================
257
+ /**
258
+ * Derive the VPN (Headscale) endpoint from a mesh login context.
259
+ *
260
+ * The login config stores an issuer URL like:
261
+ * https://identity.dev.mesh-platform.trabian.com
262
+ * The VPN endpoint follows the same domain with "vpn" as the subdomain:
263
+ * https://vpn.dev.mesh-platform.trabian.com
264
+ */
265
+ function vpnEndpointFromContext(context) {
266
+ const config = getContextConfig(context);
267
+ if (!config) {
268
+ throw new Error(`No configuration found for "${context}".\n` +
269
+ `Run: mesh login ${context} (or add the context to ~/.config/mesh/config.json)`);
270
+ }
271
+ const issuerUrl = new URL(config.issuer);
272
+ // Replace the first subdomain ("identity") with "vpn"
273
+ const hostParts = issuerUrl.hostname.split(".");
274
+ if (hostParts.length < 3) {
275
+ throw new Error(`Cannot derive VPN endpoint from issuer "${config.issuer}". ` +
276
+ `Expected a subdomain like identity.<env>.<domain>.`);
277
+ }
278
+ hostParts[0] = "vpn";
279
+ return `https://${hostParts.join(".")}`;
280
+ }
281
+ /** Split a platform context ("mesh.dev") into its tenant + env. Pure. */
282
+ export function parseContextTenantEnv(context) {
283
+ const [tenant, env] = context.split(".");
284
+ return { tenant: tenant || "mesh", env: env || "dev" };
285
+ }
286
+ /** Ephemeral free TCP port on loopback for the userspace daemon's SOCKS proxy. */
287
+ function findFreePort() {
288
+ return new Promise((resolve, reject) => {
289
+ const srv = net.createServer();
290
+ srv.on("error", reject);
291
+ srv.listen(0, "127.0.0.1", () => {
292
+ const addr = srv.address();
293
+ const port = typeof addr === "object" && addr ? addr.port : 0;
294
+ srv.close(() => resolve(port));
295
+ });
296
+ });
297
+ }
298
+ /**
299
+ * Check whether the `tailscale` CLI is installed and return its path,
300
+ * or null if not found.
301
+ */
302
+ function findTailscale() {
303
+ try {
304
+ return execFileSync("which", ["tailscale"], {
305
+ encoding: "utf-8",
306
+ stdio: ["pipe", "pipe", "pipe"],
307
+ }).trim() || null;
308
+ }
309
+ catch {
310
+ return null;
311
+ }
312
+ }
313
+ /** Return Tailscale's full status, or null if tailscale is not running. */
314
+ function tailscaleStatus() {
315
+ try {
316
+ const json = execFileSync("tailscale", ["status", "--json"], {
317
+ encoding: "utf-8",
318
+ stdio: ["pipe", "pipe", "pipe"],
319
+ });
320
+ return JSON.parse(json);
321
+ }
322
+ catch {
323
+ return null;
324
+ }
325
+ }
326
+ /** Return Tailscale's BackendState, or null if tailscale is not running. */
327
+ export function tailscaleBackendState() {
328
+ return tailscaleStatus()?.BackendState ?? null;
329
+ }
330
+ /**
331
+ * Normalize a control server URL for comparison.
332
+ * Trims trailing slashes and lowercases the origin.
333
+ */
334
+ function normalizeControlUrl(url) {
335
+ try {
336
+ const u = new URL(url);
337
+ return `${u.protocol}//${u.host}`.toLowerCase();
338
+ }
339
+ catch {
340
+ return url.replace(/\/+$/, "").toLowerCase();
341
+ }
342
+ }
343
+ async function vpnConnect(context, opts = {}) {
344
+ const endpoint = vpnEndpointFromContext(context);
345
+ if (opts.system) {
346
+ // Whole-machine VPN via the GUI Tailscale.app daemon. Opt-in only: it needs
347
+ // the GUI app installed/running and CANNOT run headless or under the safehouse
348
+ // sandbox (dyld can't load the app bundle's Sparkle.framework → abort trap).
349
+ await vpnConnectSystem(endpoint);
350
+ return;
351
+ }
352
+ await vpnConnectUserspace(context, endpoint);
353
+ }
354
+ /**
355
+ * Default path: bring up the per-tenant userspace `tailscaled` (brew formula, NOT
356
+ * the GUI app) and register this machine with the platform Headscale. This is the
357
+ * same daemon `mesh dev --transport tailscale` / `mesh vpn tunnel` already use, so
358
+ * it runs headless and under the sandbox. It exposes a local SOCKS5 proxy — the
359
+ * userspace analog of system-wide routing — instead of a system TUN; for
360
+ * auto-forwarded VPC services (Temporal, RDS, …) use `mesh vpn tunnel` / `mesh dev`.
361
+ */
362
+ async function vpnConnectUserspace(context, loginServer) {
363
+ if (!tailscaleAvailable()) {
364
+ logError("Standalone tailscale/tailscaled not found.");
365
+ logInfo("Install it: brew install tailscale");
366
+ logInfo("(The GUI Tailscale.app is not used here — for whole-machine VPN see `mesh vpn connect --system`.)");
367
+ process.exit(1);
368
+ }
369
+ const { tenant } = parseContextTenantEnv(context);
370
+ const region = process.env.AWS_REGION ?? process.env.AWS_DEFAULT_REGION ?? "us-east-2";
371
+ if (daemonState(tenant).backendState === "Running") {
372
+ // Prefer daemon.json; recover the real bound port from argv if meta is missing
373
+ // (older build) so a "connected" session always shows how to reach it.
374
+ const port = readDaemonMeta(tenant)?.socksPort ?? findRunningDaemon(tenant)?.socksPort;
375
+ logSuccess(`Already connected to the platform VPN for '${tenant}' (userspace).`);
376
+ if (port)
377
+ logInfo(` SOCKS5 proxy: 127.0.0.1:${port} (route a tool via ALL_PROXY=socks5://127.0.0.1:${port})`);
378
+ return;
379
+ }
380
+ logInfo(`Connecting to the platform VPN for '${tenant}' (userspace tailscaled)…`);
381
+ const socksPort = readDaemonMeta(tenant)?.socksPort ?? (await findFreePort());
382
+ const realPort = await ensureDaemon(tenant, { region, socksPort });
383
+ // Interactive join — joinHeadscale relays the one-time registration URL for
384
+ // headless/SSH machines (no local browser to pop) and polls up to ~5 min.
385
+ await joinHeadscale(tenant, loginServer);
386
+ logSuccess(`VPN connected (userspace) for '${tenant}'.`);
387
+ logInfo(` SOCKS5 proxy: 127.0.0.1:${realPort} — route a tool via ALL_PROXY=socks5://127.0.0.1:${realPort}`);
388
+ logInfo(" For auto-forwarded VPC services (Temporal, RDS, …): mesh vpn tunnel up (or mesh dev)");
389
+ }
390
+ /** Opt-in whole-machine VPN via the GUI Tailscale.app daemon (`mesh vpn connect --system`). */
391
+ async function vpnConnectSystem(endpoint) {
392
+ if (!findTailscale()) {
393
+ logError("Tailscale CLI not found.");
394
+ logInfo("Install it: brew install tailscale (or see https://tailscale.com/download)");
395
+ process.exit(1);
396
+ }
397
+ // If already connected to *this* endpoint, short-circuit. But if connected
398
+ // to a different control server, fall through and reconnect — otherwise the
399
+ // user would silently stay on the wrong tailnet.
400
+ const status = tailscaleStatus();
401
+ if (status?.BackendState === "Running") {
402
+ const current = status.ControlURL ? normalizeControlUrl(status.ControlURL) : null;
403
+ const target = normalizeControlUrl(endpoint);
404
+ if (current === target) {
405
+ logSuccess(`Already connected to VPN at ${endpoint}.`);
406
+ logInfo("Run: tailscale status to see connected nodes.");
407
+ return;
408
+ }
409
+ if (current) {
410
+ logWarn(`Currently connected to ${current}. Reconnecting to ${target}...`);
411
+ }
412
+ }
413
+ logInfo(`Connecting to VPN at ${endpoint}...`);
414
+ logInfo("A browser window will open for Zitadel authentication.");
415
+ console.log("");
416
+ // tailscale up is interactive (opens browser), so we inherit stdio.
417
+ // On macOS, Tailscale.app owns the daemon — `tailscale up` talks to it.
418
+ // On Linux, tailscaled runs as root and `tailscale up` may need sudo.
419
+ //
420
+ // --reset: wipe prior prefs so this command is idempotent. Without it,
421
+ // tailscale refuses to apply prefs if a previous session set non-default
422
+ // flags that aren't re-specified here.
423
+ // --accept-routes: accept subnet routes advertised by the Headscale
424
+ // SubnetRouter so clients can reach in-VPC services (EKS, RDS, internal LBs).
425
+ const upArgs = [
426
+ "up",
427
+ "--reset",
428
+ "--login-server", endpoint,
429
+ "--accept-routes",
430
+ ];
431
+ try {
432
+ execFileSync("tailscale", upArgs, { stdio: "inherit" });
433
+ console.log("");
434
+ logSuccess("VPN connected.");
435
+ }
436
+ catch (error) {
437
+ const code = error.status;
438
+ const isPermissionError = process.platform === "linux" && (code === 1 || code === 2);
439
+ console.log("");
440
+ logError(`tailscale up failed (exit ${code}).`);
441
+ if (isPermissionError) {
442
+ logInfo("On Linux, tailscaled runs as root — you may need sudo:");
443
+ logInfo(` sudo tailscale ${upArgs.join(" ")}`);
444
+ }
445
+ process.exit(1);
446
+ }
447
+ }
448
+ async function vpnDisconnect(opts) {
449
+ if (opts.system) {
450
+ // Whole-machine GUI Tailscale down (opt-in, mirrors `connect --system`).
451
+ if (!findTailscale()) {
452
+ logError("Tailscale CLI not found.");
453
+ process.exit(1);
454
+ }
455
+ if (tailscaleBackendState() !== "Running") {
456
+ logInfo("System VPN is not connected.");
457
+ return;
458
+ }
459
+ logInfo("Disconnecting system VPN…");
460
+ try {
461
+ execFileSync("tailscale", ["down"], { stdio: "inherit" });
462
+ logSuccess("VPN disconnected.");
463
+ }
464
+ catch (error) {
465
+ const code = error.status;
466
+ logError(`tailscale down failed (exit ${code}). Try: sudo tailscale down`);
467
+ process.exit(1);
468
+ }
469
+ return;
470
+ }
471
+ // Default: stop the tenant's userspace daemon (leaves the Headscale node
472
+ // identity in the statedir so a later `connect` rejoins without re-login).
473
+ const { tenant } = opts;
474
+ if (daemonState(tenant).backendState === "Down") {
475
+ logInfo(`No userspace VPN daemon running for '${tenant}'.`);
476
+ return;
477
+ }
478
+ logInfo(`Disconnecting userspace VPN for '${tenant}'…`);
479
+ stopDaemon(tenant);
480
+ logSuccess(`VPN disconnected for '${tenant}'.`);
481
+ }
482
+ // =============================================================================
483
+ // Registration
484
+ // =============================================================================
485
+ export function registerVpnCommands(program) {
486
+ const vpn = program
487
+ .command("vpn")
488
+ .description("Headscale VPN management")
489
+ .option("-t, --tenant <tenant>", "Platform tenant", "mesh")
490
+ .option("-e, --env <env>", "Platform environment", "dev")
491
+ .option("-n, --namespace <namespace>", "Override K8s namespace (default: {tenant}-{env}-headscale)");
492
+ vpn
493
+ .command("status")
494
+ .description("Show VPN control plane status")
495
+ .action(async () => {
496
+ const opts = vpn.opts();
497
+ await vpnStatus(opts);
498
+ });
499
+ vpn
500
+ .command("connect")
501
+ .description("Connect to the platform VPN (userspace tailscaled; opens browser for Zitadel auth)")
502
+ .argument("<context>", 'Platform context (e.g., "mesh.dev")')
503
+ .option("--system", "Use the whole-machine GUI Tailscale.app instead (system TUN; cannot run headless/sandboxed)")
504
+ .action(async (context, cmdOpts) => {
505
+ await vpnConnect(context, cmdOpts);
506
+ });
507
+ vpn
508
+ .command("disconnect")
509
+ .description("Disconnect from the platform VPN — stops the tenant's shared userspace daemon " +
510
+ "(also ends any active `mesh vpn tunnel` / `mesh dev` forwards for it); --system for GUI Tailscale")
511
+ .option("--system", "Disconnect the whole-machine GUI Tailscale instead of the userspace daemon")
512
+ .action(async (cmdOpts) => {
513
+ const { tenant } = vpn.opts();
514
+ await vpnDisconnect({ tenant, system: cmdOpts.system });
515
+ });
516
+ vpn
517
+ .command("api-key")
518
+ .description("Create a Headscale API key")
519
+ .action(async () => {
520
+ const opts = vpn.opts();
521
+ await createApiKey(opts);
522
+ });
523
+ vpn
524
+ .command("pre-auth-key")
525
+ .description("Create a pre-authentication key for node registration")
526
+ .requiredOption("-u, --user <user>", "User/namespace to create the key for (e.g., matt@trabian.com)")
527
+ .option("--expiration <duration>", "Key expiration (e.g., 24h, 7d)", "24h")
528
+ .option("--reusable", "Allow key to be used multiple times")
529
+ .option("--ephemeral", "Nodes registered with this key are ephemeral")
530
+ .action(async (cmdOpts) => {
531
+ const parentOpts = vpn.opts();
532
+ await createPreAuthKey({ ...parentOpts, ...cmdOpts });
533
+ });
534
+ vpn
535
+ .command("users")
536
+ .description("List registered VPN users")
537
+ .action(async () => {
538
+ const opts = vpn.opts();
539
+ await listUsers(opts);
540
+ });
541
+ registerTunnelSubcommands(vpn);
542
+ }
543
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/vpn/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * `mesh vpn tunnel` — userspace-Tailscale tunnels to a tenant's VPC services.
3
+ *
4
+ * Stands up the tenant's `localhost:PORT` set (drop-in for the SSM tunnels)
5
+ * backed by a per-tenant userspace `tailscaled` + SOCKS5 forwarders. Detached
6
+ * and managed: `up` starts everything and returns; `down`/`status` manage it.
7
+ * (MESH-2040 / Slice 1 of MESH-2014; graduates the MESH-2036 spike.)
8
+ */
9
+ import type { Command } from "commander";
10
+ export declare function registerTunnelSubcommands(vpn: Command): void;
11
+ //# sourceMappingURL=tunnel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../../../../src/commands/vpn/tunnel.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8LzC,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAkC5D"}