@mesh-tech/mesh-cli 0.1.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +20826 -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 +21 -0
  63. package/dist/src/commands/install-shim.d.ts.map +1 -0
  64. package/dist/src/commands/install-shim.js +132 -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 +4 -0
  134. package/dist/src/commands/secrets/set.d.ts.map +1 -1
  135. package/dist/src/commands/secrets/set.js +243 -64
  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 +35 -21
  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,319 @@
1
+ /**
2
+ * Temporal payload decryption helpers for mesh CLI.
3
+ *
4
+ * Mirrors the AES-256-GCM codec in `@mesh-tech/app-kit/temporal-codec`. The CLI
5
+ * can't depend on app-kit directly because app-kit depends on mesh-cli — so
6
+ * the codec logic is intentionally duplicated here, kept small, and bounded
7
+ * to read-only decryption (the CLI never encrypts).
8
+ *
9
+ * Wire format (matches app-kit EncryptionCodec):
10
+ * metadata["encoding"] = "binary/encrypted"
11
+ * metadata["encryption-key-id"] = first 16 hex chars of SHA-256(encodingKey)
12
+ * data = IV (12 bytes) || ciphertext || GCM auth tag (16 bytes)
13
+ *
14
+ * Decryption of `data` yields a serialized Temporal Payload protobuf, whose
15
+ * inner `encoding` metadata tells you how to interpret the inner bytes
16
+ * (`json/plain`, `binary/plain`, etc.). We hand-decode the Payload message
17
+ * (a trivial 2-field protobuf) instead of depending on `@temporalio/proto`,
18
+ * so the CLI stays dependency-clean and doesn't need a Temporal SDK peer.
19
+ */
20
+ import { execFileSync } from "child_process";
21
+ import { webcrypto as crypto } from "node:crypto";
22
+ import { logSuccess, logWarn } from "./log.js";
23
+ // ── Encoding key resolution ────────────────────────────────────────────────
24
+ /**
25
+ * Read the Temporal encoding key from a Kubernetes secret in the given
26
+ * namespace. Returns `undefined` when kubectl is unavailable, the secret
27
+ * doesn't exist, or the caller isn't authenticated to the cluster.
28
+ *
29
+ * The K8s secret is preferred over Pulumi stack output because personal dev
30
+ * stacks ship a placeholder encoding key that cannot decrypt deployed
31
+ * payloads; the K8s secret is always authoritative for a given namespace.
32
+ *
33
+ * @param namespace - Kubernetes namespace matching the Temporal namespace
34
+ * (mesh apps use the same name for both).
35
+ */
36
+ export function resolveTemporalEncodingKeyFromK8s(namespace) {
37
+ const secretName = `${namespace}-temporal-encoding-key`;
38
+ try {
39
+ const b64 = execFileSync("kubectl", [
40
+ "get",
41
+ "secret",
42
+ secretName,
43
+ "-n",
44
+ namespace,
45
+ "-o",
46
+ "jsonpath={.data.TEMPORAL_ENCODING_KEY}",
47
+ ], { encoding: "utf-8", timeout: 10_000, stdio: ["pipe", "pipe", "pipe"] }).trim();
48
+ if (!b64)
49
+ return undefined;
50
+ return Buffer.from(b64, "base64").toString("utf-8");
51
+ }
52
+ catch {
53
+ // kubectl missing, secret absent, or no cluster access — caller decides.
54
+ return undefined;
55
+ }
56
+ }
57
+ // ── AES-256-GCM decryption ─────────────────────────────────────────────────
58
+ const ENCRYPTED_ENCODING = "binary/encrypted";
59
+ const IV_LENGTH = 12;
60
+ async function deriveKey(encodingKey) {
61
+ const keyData = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(encodingKey));
62
+ return crypto.subtle.importKey("raw", keyData, { name: "AES-GCM" }, false, ["decrypt"]);
63
+ }
64
+ async function aesGcmDecrypt(data, key) {
65
+ const iv = data.slice(0, IV_LENGTH);
66
+ const ciphertextWithTag = data.slice(IV_LENGTH);
67
+ const decrypted = await crypto.subtle.decrypt({ name: "AES-GCM", iv }, key, ciphertextWithTag);
68
+ return new Uint8Array(decrypted);
69
+ }
70
+ /**
71
+ * Build a decrypter closure for the given encoding key.
72
+ */
73
+ export async function createPayloadDecrypter(encodingKey) {
74
+ const key = await deriveKey(encodingKey);
75
+ return async (payload) => {
76
+ if (!payload?.metadata)
77
+ return null;
78
+ const encodingBytes = payload.metadata["encoding"];
79
+ if (!encodingBytes)
80
+ return null;
81
+ const encoding = new TextDecoder().decode(encodingBytes);
82
+ if (encoding !== ENCRYPTED_ENCODING)
83
+ return null;
84
+ if (!payload.data)
85
+ return "[encrypted payload missing data]";
86
+ let inner;
87
+ try {
88
+ const decrypted = await aesGcmDecrypt(payload.data, key);
89
+ inner = decodePayloadProtobuf(decrypted);
90
+ }
91
+ catch (err) {
92
+ const msg = err instanceof Error ? err.message : String(err);
93
+ return `[undecryptable: ${msg}]`;
94
+ }
95
+ return decodeInnerPayload(inner);
96
+ };
97
+ }
98
+ /**
99
+ * Build a raw (Payload-in, Payload-out) decrypter for the given encoding key.
100
+ *
101
+ * This is the fixture-capture counterpart of {@link createPayloadDecrypter}:
102
+ * where that one renders a payload for human display (lossy — binary payloads
103
+ * become placeholders), this one returns the exact decrypted inner Payload so
104
+ * the bytes can be re-serialized into a replayable proto3-JSON history.
105
+ */
106
+ export async function createRawPayloadDecrypter(encodingKey) {
107
+ const key = await deriveKey(encodingKey);
108
+ return async (payload) => {
109
+ if (!payload?.metadata)
110
+ return null;
111
+ const encodingBytes = payload.metadata["encoding"];
112
+ if (!encodingBytes)
113
+ return null;
114
+ const encoding = new TextDecoder().decode(encodingBytes);
115
+ if (encoding !== ENCRYPTED_ENCODING)
116
+ return null;
117
+ if (!payload.data) {
118
+ throw new Error("encrypted payload has no data to decrypt");
119
+ }
120
+ const decrypted = await aesGcmDecrypt(payload.data, key);
121
+ return decodePayloadProtobuf(decrypted);
122
+ };
123
+ }
124
+ // ── Hand-rolled Payload protobuf decoder ──────────────────────────────────
125
+ //
126
+ // temporal.api.common.v1.Payload has exactly two fields:
127
+ // message Payload {
128
+ // map<string, bytes> metadata = 1; // field 1, length-delimited
129
+ // bytes data = 2; // field 2, length-delimited
130
+ // }
131
+ // A protobuf `map<K, V>` is syntactic sugar for:
132
+ // repeated MapEntry { K key = 1; V value = 2; }
133
+ // so each metadata entry is itself a length-delimited submessage with two
134
+ // inner length-delimited fields.
135
+ //
136
+ // Decoding this by hand avoids pulling in `@temporalio/proto` as a peer dep.
137
+ function readVarint(buf, pos) {
138
+ let value = 0;
139
+ let shift = 0;
140
+ let next = pos;
141
+ while (next < buf.length) {
142
+ const byte = buf[next];
143
+ next += 1;
144
+ value |= (byte & 0x7f) << shift;
145
+ if ((byte & 0x80) === 0)
146
+ return { value, next };
147
+ shift += 7;
148
+ if (shift >= 32)
149
+ throw new Error("varint too large");
150
+ }
151
+ throw new Error("truncated varint");
152
+ }
153
+ function readLengthDelimited(buf, pos) {
154
+ const { value: length, next: afterLen } = readVarint(buf, pos);
155
+ const end = afterLen + length;
156
+ if (end > buf.length)
157
+ throw new Error("truncated length-delimited field");
158
+ return { bytes: buf.slice(afterLen, end), next: end };
159
+ }
160
+ /**
161
+ * Decode a serialized `temporal.api.common.v1.Payload`.
162
+ *
163
+ * Unknown fields and wire types are skipped rather than throwing; we only
164
+ * need the two documented fields and Temporal's wire format is stable.
165
+ */
166
+ function decodePayloadProtobuf(buf) {
167
+ const metadata = {};
168
+ let data;
169
+ let pos = 0;
170
+ while (pos < buf.length) {
171
+ const { value: tag, next: afterTag } = readVarint(buf, pos);
172
+ const fieldNumber = tag >>> 3;
173
+ const wireType = tag & 0x7;
174
+ pos = afterTag;
175
+ if (wireType === 2) {
176
+ const { bytes, next } = readLengthDelimited(buf, pos);
177
+ pos = next;
178
+ if (fieldNumber === 1) {
179
+ const entry = decodeMetadataEntry(bytes);
180
+ if (entry)
181
+ metadata[entry.key] = entry.value;
182
+ }
183
+ else if (fieldNumber === 2) {
184
+ data = bytes;
185
+ }
186
+ // Other fields: ignore.
187
+ }
188
+ else if (wireType === 0) {
189
+ // varint — skip
190
+ pos = readVarint(buf, pos).next;
191
+ }
192
+ else if (wireType === 1) {
193
+ pos += 8; // fixed64
194
+ }
195
+ else if (wireType === 5) {
196
+ pos += 4; // fixed32
197
+ }
198
+ else {
199
+ throw new Error(`unsupported wire type ${wireType} at pos ${pos}`);
200
+ }
201
+ }
202
+ return { metadata, data: data ?? new Uint8Array(0) };
203
+ }
204
+ function decodeMetadataEntry(buf) {
205
+ let key;
206
+ let value;
207
+ let pos = 0;
208
+ while (pos < buf.length) {
209
+ const { value: tag, next: afterTag } = readVarint(buf, pos);
210
+ const fieldNumber = tag >>> 3;
211
+ const wireType = tag & 0x7;
212
+ pos = afterTag;
213
+ if (wireType !== 2) {
214
+ // Skip unsupported fields defensively.
215
+ if (wireType === 0)
216
+ pos = readVarint(buf, pos).next;
217
+ else if (wireType === 1)
218
+ pos += 8;
219
+ else if (wireType === 5)
220
+ pos += 4;
221
+ else
222
+ throw new Error(`unsupported metadata wire type ${wireType}`);
223
+ continue;
224
+ }
225
+ const { bytes, next } = readLengthDelimited(buf, pos);
226
+ pos = next;
227
+ if (fieldNumber === 1)
228
+ key = new TextDecoder().decode(bytes);
229
+ else if (fieldNumber === 2)
230
+ value = bytes;
231
+ }
232
+ if (key === undefined || value === undefined)
233
+ return null;
234
+ return { key, value };
235
+ }
236
+ /**
237
+ * Render a decrypted inner Payload as a human-readable string.
238
+ *
239
+ * Handles the common encodings Mesh workers emit:
240
+ * - `json/plain` → pretty-printed JSON
241
+ * - `binary/null` → literal `null`
242
+ * - `binary/plain` → `[binary N bytes]`
243
+ * - anything else → `[encoding=X, N bytes]`
244
+ */
245
+ function decodeInnerPayload(payload) {
246
+ const meta = payload.metadata ?? {};
247
+ const encodingBytes = meta["encoding"];
248
+ const encoding = encodingBytes
249
+ ? new TextDecoder().decode(encodingBytes)
250
+ : "unknown";
251
+ const data = payload.data ?? new Uint8Array(0);
252
+ if (encoding === "binary/null")
253
+ return "null";
254
+ if (encoding === "json/plain") {
255
+ const text = new TextDecoder().decode(data);
256
+ try {
257
+ return JSON.stringify(JSON.parse(text), null, 2);
258
+ }
259
+ catch {
260
+ // Not valid JSON despite the encoding claim — surface the raw text so
261
+ // the debugger sees whatever garbage the worker actually wrote.
262
+ return text;
263
+ }
264
+ }
265
+ if (encoding === "binary/plain")
266
+ return `[binary, ${data.length} bytes]`;
267
+ return `[encoding=${encoding}, ${data.length} bytes]`;
268
+ }
269
+ // ── High-level helper ──────────────────────────────────────────────────────
270
+ /**
271
+ * Resolve the Temporal encoding key for a namespace, logging where it came
272
+ * from (or why it couldn't be found). Prefer the K8s secret (authoritative for
273
+ * the namespace); fall back to an explicit TEMPORAL_ENCODING_KEY env var. The
274
+ * env fallback lets you decrypt a workflow's history OFFLINE — e.g. to
275
+ * reconstruct a conversation, or capture a replay fixture, whose worker can no
276
+ * longer replay it — using the key from a running `mesh dev` worker env when
277
+ * kubectl/cluster access isn't set up.
278
+ *
279
+ * Returns `undefined` when neither source yields a key.
280
+ */
281
+ export function resolveEncodingKey(namespace) {
282
+ const fromK8s = resolveTemporalEncodingKeyFromK8s(namespace);
283
+ const key = fromK8s ?? process.env.TEMPORAL_ENCODING_KEY;
284
+ if (!key) {
285
+ logWarn(`Could not read TEMPORAL_ENCODING_KEY from secret ` +
286
+ `${namespace}/${namespace}-temporal-encoding-key, and TEMPORAL_ENCODING_KEY ` +
287
+ "is not set. Configure kubectl (namespace read " +
288
+ "access), or export TEMPORAL_ENCODING_KEY (e.g. from a `mesh dev` worker env).");
289
+ return undefined;
290
+ }
291
+ logSuccess(fromK8s
292
+ ? `Resolved encoding key from ${namespace}-temporal-encoding-key`
293
+ : "Resolved encoding key from TEMPORAL_ENCODING_KEY env");
294
+ return key;
295
+ }
296
+ /**
297
+ * Resolve the encoding key and build a decrypter for the given namespace.
298
+ * Logs a warning and returns `undefined` when the key can't be read; callers
299
+ * should fall back to printing events without payloads.
300
+ */
301
+ export async function buildDecrypterForNamespace(namespace) {
302
+ const key = resolveEncodingKey(namespace);
303
+ if (!key)
304
+ return undefined;
305
+ return createPayloadDecrypter(key);
306
+ }
307
+ /**
308
+ * Resolve the encoding key and build a RAW (Payload-in/Payload-out) decrypter
309
+ * for the given namespace — used by `capture-history` to decrypt payloads back
310
+ * into replayable proto bytes. Returns `undefined` when the key can't be read;
311
+ * callers decide whether that's fatal.
312
+ */
313
+ export async function buildRawDecrypterForNamespace(namespace) {
314
+ const key = resolveEncodingKey(namespace);
315
+ if (!key)
316
+ return undefined;
317
+ return createRawPayloadDecrypter(key);
318
+ }
319
+ //# sourceMappingURL=temporal-codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temporal-codec.js","sourceRoot":"","sources":["../../../src/utils/temporal-codec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Ownership contract for the tunnel runner (MESH-2407).
3
+ *
4
+ * Three silent-dead-tunnel incidents in ten days (MESH-2169, MESH-2014, the
5
+ * #2991 re-review) shared one enabler: readiness was inferred from "something
6
+ * accepts TCP on the port". That conflates LIVENESS (a listener exists) with
7
+ * OWNERSHIP (the listener is OUR runner, wired to OUR SOCKS upstream). This
8
+ * module is the ownership half of the contract:
9
+ *
10
+ * - The runner that actually binds the forwarder ports writes a MANIFEST
11
+ * (pid, process-group id, a per-run random token, a loopback control port)
12
+ * and answers a one-shot control handshake with that token plus the ports
13
+ * it is listening on — read from its in-process `net.Server`s, so the
14
+ * answer can't be faked by a foreign listener and probing it opens no
15
+ * SOCKS→VPC data connection.
16
+ * - Callers verify ownership (manifest → live pid → control handshake →
17
+ * token/socks-port/port-coverage match) instead of dialing ports. A port
18
+ * that accepts TCP without passing the handshake is a SQUATTER and must be
19
+ * a loud failure, never adopt-and-continue.
20
+ * - Teardown signals process GROUPS recorded here (plus argv-discovered
21
+ * runners), so no kill path can orphan a grandchild with ports still bound.
22
+ */
23
+ import * as net from 'node:net';
24
+ /** Written by the runner (the process that binds the ports) — never by callers. */
25
+ export interface RunnerManifest {
26
+ tenant: string;
27
+ /** Pid of the runner process itself (the port owner), NOT its launcher. */
28
+ pid: number;
29
+ /** Process-group id — all teardown paths signal `-pgid`, never a bare pid. */
30
+ pgid: number;
31
+ /** Per-run random token; the control handshake must echo it. */
32
+ token: string;
33
+ /** Loopback port answering the one-shot ownership handshake. */
34
+ controlPort: number;
35
+ /** SOCKS port the runner's forwarders dial (must match the live daemon's). */
36
+ socksPort: number;
37
+ /** Forwarder ports the runner is responsible for. */
38
+ ports: number[];
39
+ startedAt: string;
40
+ }
41
+ /** What the runner's control endpoint answers with. */
42
+ export interface ControlResponse {
43
+ token: string;
44
+ tenant: string;
45
+ pid: number;
46
+ socksPort: number;
47
+ /** Ports whose in-process `net.Server` is currently listening. */
48
+ listening: number[];
49
+ /** port → error code for forwarders that failed to bind (e.g. EADDRINUSE). */
50
+ bindErrors: Record<string, string>;
51
+ }
52
+ export declare function mintRunnerToken(): string;
53
+ export declare function readRunnerManifest(file: string): RunnerManifest | null;
54
+ export declare function writeRunnerManifest(file: string, manifest: RunnerManifest): void;
55
+ /**
56
+ * Remove the manifest — but only if it is still OURS (`token` matches). A dying
57
+ * runner must not clobber the manifest of a newer runner that already replaced it.
58
+ * Omit `token` for teardown paths that own the whole tenant state.
59
+ */
60
+ export declare function clearRunnerManifest(file: string, token?: string): void;
61
+ /** Process-group id of a pid via `ps` (macOS/BSD); null when undiscoverable. */
62
+ export declare function getProcessGroupId(pid: number): number | null;
63
+ /**
64
+ * Pids of tunnel-runner processes for a tenant, parsed from `ps` output
65
+ * (`pid command` lines). Matches both `__run` and the legacy `__supervise`
66
+ * argv, and skips `exclude` (the calling process, when it IS the runner).
67
+ * Pure for unit tests; `discoverRunnerPids` feeds it live `ps` output.
68
+ */
69
+ export declare function parseRunnerPidsFromPs(psOutput: string, tenant: string, exclude?: number): number[];
70
+ /** Live argv discovery of runner pids for a tenant (empty when `ps` fails). */
71
+ export declare function discoverRunnerPids(tenant: string, exclude?: number): number[];
72
+ /**
73
+ * Start the runner's one-shot control endpoint on a loopback ephemeral port.
74
+ * Each connection gets one JSON line (the live payload) and is closed — no
75
+ * protocol state, nothing routable, and probing it touches no data plane.
76
+ */
77
+ export declare function startControlServer(payload: () => ControlResponse): Promise<{
78
+ server: net.Server;
79
+ port: number;
80
+ }>;
81
+ /** Dial the control endpoint and parse its one-line JSON answer; null on any failure. */
82
+ export declare function queryControl(port: number, timeoutMs?: number): Promise<ControlResponse | null>;
83
+ export interface OwnershipCheck {
84
+ ok: boolean;
85
+ /** Machine-readable failure reason ("" when ok). */
86
+ reason: string;
87
+ /** The control answer, when the handshake got that far. */
88
+ resp?: ControlResponse;
89
+ }
90
+ /**
91
+ * The ownership handshake: manifest → live pid → control endpoint → token,
92
+ * SOCKS port, and port coverage all match. Anything less is NOT ours — the
93
+ * caller must treat an accepting-but-unowned port as a squatter, never reuse it.
94
+ */
95
+ export declare function verifyRunnerOwnership(args: {
96
+ manifest: RunnerManifest | null;
97
+ expectedSocksPort: number;
98
+ expectedPorts: number[];
99
+ isPidAlive?: (pid: number) => boolean;
100
+ query?: (port: number) => Promise<ControlResponse | null>;
101
+ }): Promise<OwnershipCheck>;
102
+ /**
103
+ * Poll an ownership check until it passes or `deadlineMs` of wall-clock elapses;
104
+ * returns the last (failing) check otherwise. The deadline bounds TIME, not
105
+ * rounds — each check can itself cost up to the control-query timeout, so a
106
+ * round-counting loop would multiply the promised deadline several-fold.
107
+ * Retrying also matters for correctness, not just latency: two failure reasons
108
+ * are transient by design (`ports-not-listening:` while the runner's self-heal
109
+ * loop rebinds a forwarder, `no-control-answer` under accept-backlog pressure),
110
+ * and a single-shot sample of a healthy shared runner in one of those windows
111
+ * would tear it down for every concurrent session on the tenant (MESH-2014).
112
+ */
113
+ export declare function pollOwnership(check: () => Promise<OwnershipCheck>, deadlineMs: number): Promise<OwnershipCheck>;
114
+ /** Best-effort `lsof` description of what holds a port ("cmd (pid N)"); null if unknown. */
115
+ export declare function describePortOwner(port: number): string | null;
116
+ export interface SquattedPort {
117
+ port: number;
118
+ owner: string | null;
119
+ }
120
+ /**
121
+ * Of `ports`, the ones something is accepting TCP on. Called AFTER ownership
122
+ * failed / teardown ran, so every hit is a foreign or stale listener.
123
+ */
124
+ export declare function findSquattedPorts(ports: number[], accepts: (port: number) => Promise<boolean>): Promise<SquattedPort[]>;
125
+ /**
126
+ * The loud-failure text for a squatted tunnel port (`mesh dev doctor` style:
127
+ * what is wrong, why we refuse, exactly what to run). Never adopt-and-continue.
128
+ */
129
+ export declare function buildSquatterError(tenant: string, squatted: SquattedPort[], detail?: string): string;
130
+ //# sourceMappingURL=tunnel-ownership.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel-ownership.d.ts","sourceRoot":"","sources":["../../../src/utils/tunnel-ownership.ts"],"names":[],"mappings":"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"}