@noodleseed/one 0.23.0 → 0.24.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 (245) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +2 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/author-loop.d.ts +1 -0
  5. package/dist/commands/author-loop.d.ts.map +1 -1
  6. package/dist/commands/author-loop.js +4 -0
  7. package/dist/commands/author-loop.js.map +1 -1
  8. package/dist/commands/catalog-data-core.d.ts.map +1 -1
  9. package/dist/commands/catalog-data-core.js +17 -3
  10. package/dist/commands/catalog-data-core.js.map +1 -1
  11. package/dist/commands/catalog-data-resources.js +2 -2
  12. package/dist/commands/catalog-data-resources.js.map +1 -1
  13. package/dist/commands/catalog-render.d.ts.map +1 -1
  14. package/dist/commands/catalog-render.js +6 -0
  15. package/dist/commands/catalog-render.js.map +1 -1
  16. package/dist/commands/deploy-ops.d.ts.map +1 -1
  17. package/dist/commands/deploy-ops.js +2 -2
  18. package/dist/commands/deploy-ops.js.map +1 -1
  19. package/dist/commands/deploy-status-ops.d.ts +1 -1
  20. package/dist/commands/deploy-status-ops.d.ts.map +1 -1
  21. package/dist/commands/deploy-status-ops.js +8 -4
  22. package/dist/commands/deploy-status-ops.js.map +1 -1
  23. package/dist/commands/devtools.d.ts +11 -0
  24. package/dist/commands/devtools.d.ts.map +1 -0
  25. package/dist/commands/devtools.js +123 -0
  26. package/dist/commands/devtools.js.map +1 -0
  27. package/dist/commands/mcp-apps.d.ts +0 -1
  28. package/dist/commands/mcp-apps.d.ts.map +1 -1
  29. package/dist/commands/mcp-apps.js +71 -122
  30. package/dist/commands/mcp-apps.js.map +1 -1
  31. package/dist/commands/shared.d.ts +6 -0
  32. package/dist/commands/shared.d.ts.map +1 -1
  33. package/dist/commands/shared.js +19 -0
  34. package/dist/commands/shared.js.map +1 -1
  35. package/dist/deploy.d.ts +1 -1
  36. package/dist/deploy.d.ts.map +1 -1
  37. package/dist/deploy.js +5 -1
  38. package/dist/deploy.js.map +1 -1
  39. package/dist/dev.d.ts.map +1 -1
  40. package/dist/dev.js +13 -1
  41. package/dist/dev.js.map +1 -1
  42. package/dist/fire.js +1 -1
  43. package/dist/fire.js.map +1 -1
  44. package/dist/flavor.d.ts +1 -1
  45. package/dist/flavor.d.ts.map +1 -1
  46. package/dist/flavor.js +12 -2
  47. package/dist/flavor.js.map +1 -1
  48. package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js +4 -4
  49. package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js.map +1 -1
  50. package/node_modules/@noodle-borg/agent-kit/dist/skill-content.d.ts.map +1 -1
  51. package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js +66 -4
  52. package/node_modules/@noodle-borg/agent-kit/dist/skill-content.js.map +1 -1
  53. package/node_modules/@noodle-borg/agent-kit/dist/skill-operations-refs.d.ts.map +1 -1
  54. package/node_modules/@noodle-borg/agent-kit/dist/skill-operations-refs.js +8 -3
  55. package/node_modules/@noodle-borg/agent-kit/dist/skill-operations-refs.js.map +1 -1
  56. package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
  57. package/node_modules/@noodle-borg/authoring/dist/connectors.d.ts +18 -1
  58. package/node_modules/@noodle-borg/authoring/dist/connectors.d.ts.map +1 -1
  59. package/node_modules/@noodle-borg/authoring/dist/connectors.js +17 -4
  60. package/node_modules/@noodle-borg/authoring/dist/connectors.js.map +1 -1
  61. package/node_modules/@noodle-borg/authoring/dist/recording.js +24 -5
  62. package/node_modules/@noodle-borg/authoring/dist/recording.js.map +1 -1
  63. package/node_modules/@noodle-borg/authoring/dist/server.js +57 -3
  64. package/node_modules/@noodle-borg/authoring/dist/server.js.map +1 -1
  65. package/node_modules/@noodle-borg/connector-defs/dist/auth-variables.js +1 -1
  66. package/node_modules/@noodle-borg/connector-defs/dist/auth-variables.js.map +1 -1
  67. package/node_modules/@noodle-borg/connector-defs/dist/call-graph.d.ts +14 -0
  68. package/node_modules/@noodle-borg/connector-defs/dist/call-graph.d.ts.map +1 -0
  69. package/node_modules/@noodle-borg/connector-defs/dist/call-graph.js +66 -0
  70. package/node_modules/@noodle-borg/connector-defs/dist/call-graph.js.map +1 -0
  71. package/node_modules/@noodle-borg/connector-defs/dist/compile-auth.d.ts +21 -0
  72. package/node_modules/@noodle-borg/connector-defs/dist/compile-auth.d.ts.map +1 -0
  73. package/node_modules/@noodle-borg/connector-defs/dist/compile-auth.js +102 -0
  74. package/node_modules/@noodle-borg/connector-defs/dist/compile-auth.js.map +1 -0
  75. package/node_modules/@noodle-borg/connector-defs/dist/compile.d.ts +19 -4
  76. package/node_modules/@noodle-borg/connector-defs/dist/compile.d.ts.map +1 -1
  77. package/node_modules/@noodle-borg/connector-defs/dist/compile.js +67 -99
  78. package/node_modules/@noodle-borg/connector-defs/dist/compile.js.map +1 -1
  79. package/node_modules/@noodle-borg/connector-defs/dist/index.d.ts +1 -1
  80. package/node_modules/@noodle-borg/connector-defs/dist/index.d.ts.map +1 -1
  81. package/node_modules/@noodle-borg/connector-defs/dist/index.js.map +1 -1
  82. package/node_modules/@noodle-borg/connector-defs/dist/schema.d.ts +168 -10
  83. package/node_modules/@noodle-borg/connector-defs/dist/schema.d.ts.map +1 -1
  84. package/node_modules/@noodle-borg/connector-defs/dist/schema.js +72 -5
  85. package/node_modules/@noodle-borg/connector-defs/dist/schema.js.map +1 -1
  86. package/node_modules/@noodle-borg/connector-http/dist/http-connector.d.ts +6 -0
  87. package/node_modules/@noodle-borg/connector-http/dist/http-connector.d.ts.map +1 -1
  88. package/node_modules/@noodle-borg/connector-http/dist/http-connector.js +2 -0
  89. package/node_modules/@noodle-borg/connector-http/dist/http-connector.js.map +1 -1
  90. package/node_modules/@noodle-borg/runtime/dist/execute.d.ts.map +1 -1
  91. package/node_modules/@noodle-borg/runtime/dist/execute.js +87 -62
  92. package/node_modules/@noodle-borg/runtime/dist/execute.js.map +1 -1
  93. package/node_modules/@noodle-borg/runtime/dist/result.d.ts +1 -1
  94. package/node_modules/@noodle-borg/runtime/dist/result.d.ts.map +1 -1
  95. package/node_modules/@noodle-borg/service/dist/credential-broker.d.ts.map +1 -1
  96. package/node_modules/@noodle-borg/service/dist/credential-broker.js +113 -11
  97. package/node_modules/@noodle-borg/service/dist/credential-broker.js.map +1 -1
  98. package/node_modules/@noodle-borg/service/dist/github/app-client.d.ts +28 -5
  99. package/node_modules/@noodle-borg/service/dist/github/app-client.d.ts.map +1 -1
  100. package/node_modules/@noodle-borg/service/dist/github/app-client.js +116 -7
  101. package/node_modules/@noodle-borg/service/dist/github/app-client.js.map +1 -1
  102. package/node_modules/@noodle-borg/service/dist/github/builder-auth.d.ts +12 -0
  103. package/node_modules/@noodle-borg/service/dist/github/builder-auth.d.ts.map +1 -0
  104. package/node_modules/@noodle-borg/service/dist/github/builder-auth.js +15 -0
  105. package/node_modules/@noodle-borg/service/dist/github/builder-auth.js.map +1 -0
  106. package/node_modules/@noodle-borg/service/dist/github/builder-main.d.ts +3 -0
  107. package/node_modules/@noodle-borg/service/dist/github/builder-main.d.ts.map +1 -0
  108. package/node_modules/@noodle-borg/service/dist/github/builder-main.js +9 -0
  109. package/node_modules/@noodle-borg/service/dist/github/builder-main.js.map +1 -0
  110. package/node_modules/@noodle-borg/service/dist/github/builder-runner.d.ts +21 -0
  111. package/node_modules/@noodle-borg/service/dist/github/builder-runner.d.ts.map +1 -0
  112. package/node_modules/@noodle-borg/service/dist/github/builder-runner.js +192 -0
  113. package/node_modules/@noodle-borg/service/dist/github/builder-runner.js.map +1 -0
  114. package/node_modules/@noodle-borg/service/dist/github/cloud-run-job-executor.d.ts +45 -0
  115. package/node_modules/@noodle-borg/service/dist/github/cloud-run-job-executor.d.ts.map +1 -0
  116. package/node_modules/@noodle-borg/service/dist/github/cloud-run-job-executor.js +60 -0
  117. package/node_modules/@noodle-borg/service/dist/github/cloud-run-job-executor.js.map +1 -0
  118. package/node_modules/@noodle-borg/service/dist/github/deploy-pipeline.d.ts +64 -0
  119. package/node_modules/@noodle-borg/service/dist/github/deploy-pipeline.d.ts.map +1 -0
  120. package/node_modules/@noodle-borg/service/dist/github/deploy-pipeline.js +121 -0
  121. package/node_modules/@noodle-borg/service/dist/github/deploy-pipeline.js.map +1 -0
  122. package/node_modules/@noodle-borg/service/dist/github/deploy-run-executor.d.ts +33 -0
  123. package/node_modules/@noodle-borg/service/dist/github/deploy-run-executor.d.ts.map +1 -0
  124. package/node_modules/@noodle-borg/service/dist/github/deploy-run-executor.js +14 -0
  125. package/node_modules/@noodle-borg/service/dist/github/deploy-run-executor.js.map +1 -0
  126. package/node_modules/@noodle-borg/service/dist/github/deploy-run-reconciler.d.ts +36 -0
  127. package/node_modules/@noodle-borg/service/dist/github/deploy-run-reconciler.d.ts.map +1 -0
  128. package/node_modules/@noodle-borg/service/dist/github/deploy-run-reconciler.js +107 -0
  129. package/node_modules/@noodle-borg/service/dist/github/deploy-run-reconciler.js.map +1 -0
  130. package/node_modules/@noodle-borg/service/dist/github/fast-lane-classifier.d.ts +38 -0
  131. package/node_modules/@noodle-borg/service/dist/github/fast-lane-classifier.d.ts.map +1 -0
  132. package/node_modules/@noodle-borg/service/dist/github/fast-lane-classifier.js +60 -0
  133. package/node_modules/@noodle-borg/service/dist/github/fast-lane-classifier.js.map +1 -0
  134. package/node_modules/@noodle-borg/service/dist/github/local-compile.d.ts +24 -0
  135. package/node_modules/@noodle-borg/service/dist/github/local-compile.d.ts.map +1 -0
  136. package/node_modules/@noodle-borg/service/dist/github/local-compile.js +98 -0
  137. package/node_modules/@noodle-borg/service/dist/github/local-compile.js.map +1 -0
  138. package/node_modules/@noodle-borg/service/dist/github/local-process-executor.d.ts +39 -0
  139. package/node_modules/@noodle-borg/service/dist/github/local-process-executor.d.ts.map +1 -0
  140. package/node_modules/@noodle-borg/service/dist/github/local-process-executor.js +67 -0
  141. package/node_modules/@noodle-borg/service/dist/github/local-process-executor.js.map +1 -0
  142. package/node_modules/@noodle-borg/service/dist/github/run-access-mode.d.ts +18 -0
  143. package/node_modules/@noodle-borg/service/dist/github/run-access-mode.d.ts.map +1 -0
  144. package/node_modules/@noodle-borg/service/dist/github/run-access-mode.js +32 -0
  145. package/node_modules/@noodle-borg/service/dist/github/run-access-mode.js.map +1 -0
  146. package/node_modules/@noodle-borg/service/dist/github/run-token.d.ts +41 -0
  147. package/node_modules/@noodle-borg/service/dist/github/run-token.d.ts.map +1 -0
  148. package/node_modules/@noodle-borg/service/dist/github/run-token.js +59 -0
  149. package/node_modules/@noodle-borg/service/dist/github/run-token.js.map +1 -0
  150. package/node_modules/@noodle-borg/service/dist/http-util.d.ts +7 -1
  151. package/node_modules/@noodle-borg/service/dist/http-util.d.ts.map +1 -1
  152. package/node_modules/@noodle-borg/service/dist/http-util.js +14 -0
  153. package/node_modules/@noodle-borg/service/dist/http-util.js.map +1 -1
  154. package/node_modules/@noodle-borg/service/dist/index.d.ts +13 -2
  155. package/node_modules/@noodle-borg/service/dist/index.d.ts.map +1 -1
  156. package/node_modules/@noodle-borg/service/dist/index.js +12 -1
  157. package/node_modules/@noodle-borg/service/dist/index.js.map +1 -1
  158. package/node_modules/@noodle-borg/service/dist/main.js +72 -0
  159. package/node_modules/@noodle-borg/service/dist/main.js.map +1 -1
  160. package/node_modules/@noodle-borg/service/dist/options.d.ts +26 -3
  161. package/node_modules/@noodle-borg/service/dist/options.d.ts.map +1 -1
  162. package/node_modules/@noodle-borg/service/dist/registry-helpers.d.ts +12 -0
  163. package/node_modules/@noodle-borg/service/dist/registry-helpers.d.ts.map +1 -1
  164. package/node_modules/@noodle-borg/service/dist/registry-helpers.js +3 -0
  165. package/node_modules/@noodle-borg/service/dist/registry-helpers.js.map +1 -1
  166. package/node_modules/@noodle-borg/service/dist/registry-types.d.ts +7 -0
  167. package/node_modules/@noodle-borg/service/dist/registry-types.d.ts.map +1 -1
  168. package/node_modules/@noodle-borg/service/dist/registry.d.ts +7 -29
  169. package/node_modules/@noodle-borg/service/dist/registry.d.ts.map +1 -1
  170. package/node_modules/@noodle-borg/service/dist/registry.js +62 -57
  171. package/node_modules/@noodle-borg/service/dist/registry.js.map +1 -1
  172. package/node_modules/@noodle-borg/service/dist/routes/asset-control-plane.d.ts +3 -2
  173. package/node_modules/@noodle-borg/service/dist/routes/asset-control-plane.d.ts.map +1 -1
  174. package/node_modules/@noodle-borg/service/dist/routes/asset-control-plane.js +36 -8
  175. package/node_modules/@noodle-borg/service/dist/routes/asset-control-plane.js.map +1 -1
  176. package/node_modules/@noodle-borg/service/dist/routes/control-plane.d.ts +3 -2
  177. package/node_modules/@noodle-borg/service/dist/routes/control-plane.d.ts.map +1 -1
  178. package/node_modules/@noodle-borg/service/dist/routes/control-plane.js +100 -12
  179. package/node_modules/@noodle-borg/service/dist/routes/control-plane.js.map +1 -1
  180. package/node_modules/@noodle-borg/service/dist/routes/github-dispatch.d.ts +7 -0
  181. package/node_modules/@noodle-borg/service/dist/routes/github-dispatch.d.ts.map +1 -1
  182. package/node_modules/@noodle-borg/service/dist/routes/github-dispatch.js +36 -1
  183. package/node_modules/@noodle-borg/service/dist/routes/github-dispatch.js.map +1 -1
  184. package/node_modules/@noodle-borg/service/dist/routes/github-run-claim.d.ts +13 -0
  185. package/node_modules/@noodle-borg/service/dist/routes/github-run-claim.d.ts.map +1 -0
  186. package/node_modules/@noodle-borg/service/dist/routes/github-run-claim.js +84 -0
  187. package/node_modules/@noodle-borg/service/dist/routes/github-run-claim.js.map +1 -0
  188. package/node_modules/@noodle-borg/service/dist/routes/github-run-status.d.ts +5 -0
  189. package/node_modules/@noodle-borg/service/dist/routes/github-run-status.d.ts.map +1 -0
  190. package/node_modules/@noodle-borg/service/dist/routes/github-run-status.js +73 -0
  191. package/node_modules/@noodle-borg/service/dist/routes/github-run-status.js.map +1 -0
  192. package/node_modules/@noodle-borg/service/dist/routes/github-webhook.d.ts +23 -1
  193. package/node_modules/@noodle-borg/service/dist/routes/github-webhook.d.ts.map +1 -1
  194. package/node_modules/@noodle-borg/service/dist/routes/github-webhook.js +41 -0
  195. package/node_modules/@noodle-borg/service/dist/routes/github-webhook.js.map +1 -1
  196. package/node_modules/@noodle-borg/service/dist/routes/paths.d.ts +4 -0
  197. package/node_modules/@noodle-borg/service/dist/routes/paths.d.ts.map +1 -1
  198. package/node_modules/@noodle-borg/service/dist/routes/paths.js +10 -0
  199. package/node_modules/@noodle-borg/service/dist/routes/paths.js.map +1 -1
  200. package/node_modules/@noodle-borg/service/dist/routes/run-deploy-auth.d.ts +85 -0
  201. package/node_modules/@noodle-borg/service/dist/routes/run-deploy-auth.d.ts.map +1 -0
  202. package/node_modules/@noodle-borg/service/dist/routes/run-deploy-auth.js +90 -0
  203. package/node_modules/@noodle-borg/service/dist/routes/run-deploy-auth.js.map +1 -0
  204. package/node_modules/@noodle-borg/service/dist/serve.d.ts.map +1 -1
  205. package/node_modules/@noodle-borg/service/dist/serve.js +31 -0
  206. package/node_modules/@noodle-borg/service/dist/serve.js.map +1 -1
  207. package/node_modules/@noodle-borg/service/dist/service.d.ts.map +1 -1
  208. package/node_modules/@noodle-borg/service/dist/service.js +8 -13
  209. package/node_modules/@noodle-borg/service/dist/service.js.map +1 -1
  210. package/node_modules/@noodle-borg/service/dist/store/github-connections-json-file.d.ts +1 -0
  211. package/node_modules/@noodle-borg/service/dist/store/github-connections-json-file.d.ts.map +1 -1
  212. package/node_modules/@noodle-borg/service/dist/store/github-connections-json-file.js +5 -0
  213. package/node_modules/@noodle-borg/service/dist/store/github-connections-json-file.js.map +1 -1
  214. package/node_modules/@noodle-borg/service/dist/store/github-connections.d.ts +1 -0
  215. package/node_modules/@noodle-borg/service/dist/store/github-connections.d.ts.map +1 -1
  216. package/node_modules/@noodle-borg/service/dist/store/github-connections.js +5 -0
  217. package/node_modules/@noodle-borg/service/dist/store/github-connections.js.map +1 -1
  218. package/node_modules/@noodle-borg/service/dist/store/github-deploy-run-contract.d.ts +120 -0
  219. package/node_modules/@noodle-borg/service/dist/store/github-deploy-run-contract.d.ts.map +1 -0
  220. package/node_modules/@noodle-borg/service/dist/store/github-deploy-run-contract.js +6 -0
  221. package/node_modules/@noodle-borg/service/dist/store/github-deploy-run-contract.js.map +1 -0
  222. package/node_modules/@noodle-borg/service/dist/store/github-runs-json-file.d.ts +6 -1
  223. package/node_modules/@noodle-borg/service/dist/store/github-runs-json-file.d.ts.map +1 -1
  224. package/node_modules/@noodle-borg/service/dist/store/github-runs-json-file.js +18 -1
  225. package/node_modules/@noodle-borg/service/dist/store/github-runs-json-file.js.map +1 -1
  226. package/node_modules/@noodle-borg/service/dist/store/github-runs.d.ts +22 -1
  227. package/node_modules/@noodle-borg/service/dist/store/github-runs.d.ts.map +1 -1
  228. package/node_modules/@noodle-borg/service/dist/store/github-runs.js +39 -2
  229. package/node_modules/@noodle-borg/service/dist/store/github-runs.js.map +1 -1
  230. package/node_modules/@noodle-borg/service/dist/store/postgres-github-runs.d.ts +13 -1
  231. package/node_modules/@noodle-borg/service/dist/store/postgres-github-runs.d.ts.map +1 -1
  232. package/node_modules/@noodle-borg/service/dist/store/postgres-github-runs.js +115 -1
  233. package/node_modules/@noodle-borg/service/dist/store/postgres-github-runs.js.map +1 -1
  234. package/node_modules/@noodle-borg/service/dist/store/postgres-github.d.ts +1 -0
  235. package/node_modules/@noodle-borg/service/dist/store/postgres-github.d.ts.map +1 -1
  236. package/node_modules/@noodle-borg/service/dist/store/postgres-github.js +6 -0
  237. package/node_modules/@noodle-borg/service/dist/store/postgres-github.js.map +1 -1
  238. package/node_modules/@noodle-borg/service/dist/store/postgres.d.ts +15 -1
  239. package/node_modules/@noodle-borg/service/dist/store/postgres.d.ts.map +1 -1
  240. package/node_modules/@noodle-borg/service/dist/store/postgres.js +22 -2
  241. package/node_modules/@noodle-borg/service/dist/store/postgres.js.map +1 -1
  242. package/node_modules/@noodle-borg/service/dist/store.d.ts +22 -99
  243. package/node_modules/@noodle-borg/service/dist/store.d.ts.map +1 -1
  244. package/node_modules/@noodle-borg/service/dist/store.js.map +1 -1
  245. package/package.json +2 -2
@@ -0,0 +1,192 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import { join, resolve } from 'node:path';
5
+ import { GoogleAuth } from 'google-auth-library';
6
+ import { runDeployPipeline } from './deploy-pipeline.js';
7
+ import { createLocalCompile } from './local-compile.js';
8
+ const SAFE_ENV_KEYS = new Set(['PATH', 'HOME', 'TMPDIR', 'npm_config_cache', 'NPM_CONFIG_CACHE']);
9
+ export function sanitizeBuilderChildEnv(env) {
10
+ const clean = {
11
+ CI: '1',
12
+ NOODLE_DISABLE_UPDATE_CHECK: '1',
13
+ };
14
+ for (const key of SAFE_ENV_KEYS) {
15
+ const value = env[key];
16
+ if (value !== undefined && value.length > 0)
17
+ clean[key] = value;
18
+ }
19
+ return clean;
20
+ }
21
+ export async function runCloudRunBuilder(options = {}) {
22
+ const env = options.env ?? process.env;
23
+ const stdout = options.stdout ?? process.stdout;
24
+ const stderr = options.stderr ?? process.stderr;
25
+ if (env.NOODLE_BUILDER_SELF_TEST === '1') {
26
+ stdout.write('builder self-test ok\n');
27
+ return;
28
+ }
29
+ const runId = requiredEnv(env, 'NOODLE_GHD_RUN_ID');
30
+ const serviceBaseUrl = trimTrailingSlash(requiredEnv(env, 'NOODLE_GHD_SERVICE_BASE_URL'));
31
+ const claim = await claimBuilderRun({
32
+ runId,
33
+ serviceBaseUrl,
34
+ audience: env.NOODLE_GHD_ID_TOKEN_AUDIENCE ?? serviceBaseUrl,
35
+ httpFetch: options.httpFetch ?? fetch,
36
+ });
37
+ const workDir = await mkdtemp(join(tmpdir(), 'noodle-ghd-builder-'));
38
+ try {
39
+ const sourceDir = await fetchSource({
40
+ claim,
41
+ workDir,
42
+ httpFetch: options.httpFetch ?? fetch,
43
+ spawnProcess: options.spawnProcess ?? spawn,
44
+ });
45
+ const localCompile = createLocalCompile({
46
+ exportManifest: createCliManifestExporter({
47
+ env,
48
+ spawnProcess: options.spawnProcess ?? spawn,
49
+ stderr,
50
+ }),
51
+ });
52
+ await runDeployPipeline({
53
+ run: claim.run,
54
+ runToken: claim.runToken,
55
+ serviceBaseUrl,
56
+ compile: () => localCompile(sourceDir),
57
+ httpFetch: options.httpFetch ?? fetch,
58
+ });
59
+ }
60
+ finally {
61
+ await rm(workDir, { recursive: true, force: true }).catch(() => undefined);
62
+ }
63
+ }
64
+ async function claimBuilderRun(input) {
65
+ const claimUrl = `${input.serviceBaseUrl}/v1/github/runs/${encodeURIComponent(input.runId)}/claim`;
66
+ if (input.serviceBaseUrl.startsWith('http://127.0.0.1') ||
67
+ input.serviceBaseUrl.startsWith('http://localhost')) {
68
+ const res = await input.httpFetch(claimUrl, { method: 'POST' });
69
+ return parseClaimResponse(res);
70
+ }
71
+ const auth = new GoogleAuth();
72
+ const client = await auth.getIdTokenClient(input.audience);
73
+ const res = await client.request({ url: claimUrl, method: 'POST' });
74
+ return parseClaimBody(res.data);
75
+ }
76
+ async function parseClaimResponse(res) {
77
+ const body = await res.json().catch(() => undefined);
78
+ if (!res.ok)
79
+ throw new Error(`builder claim failed (HTTP ${res.status})`);
80
+ return parseClaimBody(body);
81
+ }
82
+ function parseClaimBody(body) {
83
+ const data = asRecord(body)?.data;
84
+ const record = asRecord(data);
85
+ const runRecord = asRecord(record?.run);
86
+ if (record === undefined ||
87
+ typeof record.runToken !== 'string' ||
88
+ runRecord === undefined ||
89
+ typeof record.repoFullName !== 'string' ||
90
+ typeof record.commitSha !== 'string' ||
91
+ typeof record.githubInstallationToken !== 'string') {
92
+ throw new Error('builder claim response was malformed');
93
+ }
94
+ return {
95
+ runToken: record.runToken,
96
+ run: runRecord,
97
+ repoFullName: record.repoFullName,
98
+ ...(typeof record.repoRoot === 'string' && record.repoRoot.length > 0
99
+ ? { repoRoot: record.repoRoot }
100
+ : {}),
101
+ commitSha: record.commitSha,
102
+ githubInstallationToken: record.githubInstallationToken,
103
+ ...(typeof record.githubInstallationTokenExpiresAt === 'string'
104
+ ? { githubInstallationTokenExpiresAt: record.githubInstallationTokenExpiresAt }
105
+ : {}),
106
+ };
107
+ }
108
+ async function fetchSource(input) {
109
+ const archiveUrl = `https://api.github.com/repos/${input.claim.repoFullName}/tarball/${input.claim.commitSha}`;
110
+ const res = await input.httpFetch(archiveUrl, {
111
+ headers: {
112
+ accept: 'application/vnd.github+json',
113
+ authorization: `Bearer ${input.claim.githubInstallationToken}`,
114
+ 'user-agent': 'noodle-seed-builder',
115
+ 'x-github-api-version': '2022-11-28',
116
+ },
117
+ });
118
+ if (!res.ok)
119
+ throw new Error(`source fetch failed (HTTP ${res.status})`);
120
+ const archive = join(input.workDir, 'source.tar.gz');
121
+ await writeFile(archive, new Uint8Array(await res.arrayBuffer()));
122
+ const checkout = join(input.workDir, 'repo');
123
+ await mkdir(checkout, { recursive: true });
124
+ await runProcess(input.spawnProcess, 'tar', ['-xzf', archive, '--strip-components=1', '-C', checkout], { env: {} });
125
+ return input.claim.repoRoot !== undefined ? resolve(checkout, input.claim.repoRoot) : checkout;
126
+ }
127
+ function createCliManifestExporter(input) {
128
+ const cliBin = input.env.NOODLE_BUILDER_CLI_BIN ?? '/app/cli/dist/bin.js';
129
+ return async ({ entrypoint }) => {
130
+ const dir = await mkdtemp(join(tmpdir(), 'noodle-ghd-export-'));
131
+ const manifestPath = join(dir, 'manifest.json');
132
+ const connectorsPath = join(dir, 'connectors.json');
133
+ try {
134
+ const result = await runProcess(input.spawnProcess, process.execPath, [
135
+ cliBin,
136
+ 'export',
137
+ 'manifest',
138
+ entrypoint,
139
+ '--output',
140
+ manifestPath,
141
+ '--connectors-output',
142
+ connectorsPath,
143
+ ], { env: sanitizeBuilderChildEnv(input.env) });
144
+ if (result.stderr.length > 0)
145
+ input.stderr.write(result.stderr);
146
+ const manifest = await readFile(manifestPath, 'utf8');
147
+ const connectors = await readFile(connectorsPath, 'utf8').catch(() => undefined);
148
+ return {
149
+ manifest,
150
+ ...(connectors !== undefined && connectors.trim() !== '' ? { connectors } : {}),
151
+ };
152
+ }
153
+ finally {
154
+ await rm(dir, { recursive: true, force: true }).catch(() => undefined);
155
+ }
156
+ };
157
+ }
158
+ async function runProcess(spawnProcess, command, args, options) {
159
+ return new Promise((resolvePromise, reject) => {
160
+ const child = spawnProcess(command, [...args], {
161
+ ...options,
162
+ stdio: ['ignore', 'pipe', 'pipe'],
163
+ });
164
+ const stdout = [];
165
+ const stderr = [];
166
+ child.stdout?.on('data', (chunk) => stdout.push(Buffer.from(chunk)));
167
+ child.stderr?.on('data', (chunk) => stderr.push(Buffer.from(chunk)));
168
+ child.on('error', reject);
169
+ child.on('close', (code) => {
170
+ const out = Buffer.concat(stdout).toString('utf8');
171
+ const err = Buffer.concat(stderr).toString('utf8');
172
+ if (code === 0)
173
+ return resolvePromise({ stdout: out, stderr: err });
174
+ reject(new Error(`${command} exited ${code ?? 'without a status'}${err ? `: ${err}` : ''}`));
175
+ });
176
+ });
177
+ }
178
+ function requiredEnv(env, name) {
179
+ const value = env[name];
180
+ if (value === undefined || value.trim() === '')
181
+ throw new Error(`${name} is required`);
182
+ return value;
183
+ }
184
+ function trimTrailingSlash(value) {
185
+ return value.replace(/\/+$/, '');
186
+ }
187
+ function asRecord(value) {
188
+ return typeof value === 'object' && value !== null
189
+ ? value
190
+ : undefined;
191
+ }
192
+ //# sourceMappingURL=builder-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder-runner.js","sourceRoot":"","sources":["../../src/github/builder-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { DeployRunDispatchInput, DeployRunExecutor } from './deploy-run-executor.js';
2
+ export interface CloudRunJobsRunRequest {
3
+ readonly name: string;
4
+ readonly body: {
5
+ readonly overrides: {
6
+ readonly containerOverrides: readonly [
7
+ {
8
+ readonly env: readonly {
9
+ readonly name: string;
10
+ readonly value: string;
11
+ }[];
12
+ }
13
+ ];
14
+ readonly taskCount: number;
15
+ readonly timeout: string;
16
+ };
17
+ };
18
+ }
19
+ export interface CloudRunJobsRunClient {
20
+ runJob(request: CloudRunJobsRunRequest): Promise<void>;
21
+ }
22
+ export interface CloudRunJobExecutorOptions {
23
+ readonly project: string;
24
+ readonly region: string;
25
+ readonly job: string;
26
+ readonly environment: string;
27
+ readonly taskTimeoutSeconds?: number;
28
+ readonly client?: CloudRunJobsRunClient;
29
+ }
30
+ /**
31
+ * Production GHD-C3 executor: launches exactly one Cloud Run Job execution for a deploy run.
32
+ * It passes only routing metadata through execution overrides. The builder claims all sensitive
33
+ * credentials from the service after startup, authenticated as its runtime service account.
34
+ */
35
+ export declare class CloudRunJobExecutor implements DeployRunExecutor {
36
+ #private;
37
+ constructor(options: CloudRunJobExecutorOptions);
38
+ dispatch(input: DeployRunDispatchInput): Promise<void>;
39
+ }
40
+ export declare function cloudRunJobName(options: {
41
+ readonly project: string;
42
+ readonly region: string;
43
+ readonly job: string;
44
+ }): string;
45
+ //# sourceMappingURL=cloud-run-job-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-run-job-executor.d.ts","sourceRoot":"","sources":["../../src/github/cloud-run-job-executor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE1F,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,SAAS,EAAE;YAClB,QAAQ,CAAC,kBAAkB,EAAE,SAAS;gBACpC;oBACE,QAAQ,CAAC,GAAG,EAAE,SAAS;wBAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;wBAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;qBAAE,EAAE,CAAC;iBAC5E;aACF,CAAC;YACF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;YAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;SAC1B,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,qBAAqB,CAAC;CACzC;AAED;;;;GAIG;AACH,qBAAa,mBAAoB,YAAW,iBAAiB;;gBAM/C,OAAO,EAAE,0BAA0B;IAOzC,QAAQ,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;CAuB7D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB,GAAG,MAAM,CAET"}
@@ -0,0 +1,60 @@
1
+ import { GoogleAuth } from 'google-auth-library';
2
+ /**
3
+ * Production GHD-C3 executor: launches exactly one Cloud Run Job execution for a deploy run.
4
+ * It passes only routing metadata through execution overrides. The builder claims all sensitive
5
+ * credentials from the service after startup, authenticated as its runtime service account.
6
+ */
7
+ export class CloudRunJobExecutor {
8
+ #name;
9
+ #environment;
10
+ #taskTimeoutSeconds;
11
+ #client;
12
+ constructor(options) {
13
+ this.#name = cloudRunJobName(options);
14
+ this.#environment = options.environment;
15
+ this.#taskTimeoutSeconds = options.taskTimeoutSeconds ?? 180;
16
+ this.#client = options.client ?? new GoogleCloudRunJobsRunClient();
17
+ }
18
+ async dispatch(input) {
19
+ const body = {
20
+ overrides: {
21
+ containerOverrides: [
22
+ {
23
+ env: [
24
+ { name: 'NOODLE_GHD_RUN_ID', value: input.run.runId },
25
+ { name: 'NOODLE_GHD_SERVICE_BASE_URL', value: input.serviceBaseUrl },
26
+ { name: 'NOODLE_GHD_ENVIRONMENT', value: this.#environment },
27
+ ],
28
+ },
29
+ ],
30
+ taskCount: 1,
31
+ timeout: `${this.#taskTimeoutSeconds}s`,
32
+ },
33
+ };
34
+ try {
35
+ await this.#client.runJob({ name: this.#name, body });
36
+ }
37
+ catch {
38
+ // Fire-and-forget contract: dispatch launch failures must not make webhook delivery fail.
39
+ // The sweeper/reconciler owns retry/failover behavior.
40
+ }
41
+ }
42
+ }
43
+ export function cloudRunJobName(options) {
44
+ return `projects/${options.project}/locations/${options.region}/jobs/${options.job}`;
45
+ }
46
+ class GoogleCloudRunJobsRunClient {
47
+ #auth = new GoogleAuth({
48
+ scopes: ['https://www.googleapis.com/auth/cloud-platform'],
49
+ });
50
+ async runJob(request) {
51
+ const client = await this.#auth.getClient();
52
+ const url = `https://run.googleapis.com/v2/${request.name}:run`;
53
+ await client.request({
54
+ url,
55
+ method: 'POST',
56
+ data: request.body,
57
+ });
58
+ }
59
+ }
60
+ //# sourceMappingURL=cloud-run-job-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-run-job-executor.js","sourceRoot":"","sources":["../../src/github/cloud-run-job-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AA+BjD;;;;GAIG;AACH,MAAM,OAAO,mBAAmB;IACrB,KAAK,CAAS;IACd,YAAY,CAAS;IACrB,mBAAmB,CAAS;IAC5B,OAAO,CAAwB;IAExC,YAAY,OAAmC;QAC7C,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;QACxC,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,IAAI,GAAG,CAAC;QAC7D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,2BAA2B,EAAE,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAA6B;QAC1C,MAAM,IAAI,GAAmC;YAC3C,SAAS,EAAE;gBACT,kBAAkB,EAAE;oBAClB;wBACE,GAAG,EAAE;4BACH,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE;4BACrD,EAAE,IAAI,EAAE,6BAA6B,EAAE,KAAK,EAAE,KAAK,CAAC,cAAc,EAAE;4BACpE,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE;yBAC7D;qBACF;iBACF;gBACD,SAAS,EAAE,CAAC;gBACZ,OAAO,EAAE,GAAG,IAAI,CAAC,mBAAmB,GAAG;aACxC;SACF,CAAC;QACF,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,0FAA0F;YAC1F,uDAAuD;QACzD,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,eAAe,CAAC,OAI/B;IACC,OAAO,YAAY,OAAO,CAAC,OAAO,cAAc,OAAO,CAAC,MAAM,SAAS,OAAO,CAAC,GAAG,EAAE,CAAC;AACvF,CAAC;AAED,MAAM,2BAA2B;IACtB,KAAK,GAAG,IAAI,UAAU,CAAC;QAC9B,MAAM,EAAE,CAAC,gDAAgD,CAAC;KAC3D,CAAC,CAAC;IAEH,KAAK,CAAC,MAAM,CAAC,OAA+B;QAC1C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,iCAAiC,OAAO,CAAC,IAAI,MAAM,CAAC;QAChE,MAAM,MAAM,CAAC,OAAO,CAAC;YACnB,GAAG;YACH,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,64 @@
1
+ import type { PreparedPackagedAsset } from '@noodle-borg/compiler';
2
+ import type { DeployRunRecord } from '../store.js';
3
+ /**
4
+ * The environment-agnostic untrusted-compile → trusted-deploy pipeline (GHD-3, ADR 0132 Decision 6).
5
+ * Every executor — LocalProcess (C2), CloudRunJob (C3), the E2E harness — shares THIS orchestration;
6
+ * only the injected `compile` (how source becomes a manifest) and `httpFetch` (the wire) differ.
7
+ *
8
+ * The trust split is structural: `compile` runs untrusted source and is NEVER handed the run token or
9
+ * any privileged credential — it only reads files and returns data. Only after it succeeds does the
10
+ * pipeline use the run-scoped token to preflight/upload assets and POST the deploy.
11
+ *
12
+ * Debuggability is the organizing principle (the founder directive): the pipeline walks the run
13
+ * `building → deploying → deployed`, and EVERY failure path reports `failed` with a pre-redacted
14
+ * `errorSummary` that names the stage, the reason, and (via the route's own message) the fix — the
15
+ * exact text `noodle github runs <id>` surfaces. Status reporting is best-effort: a dropped status
16
+ * report is observability loss, never a reason to fail a deploy that otherwise succeeded.
17
+ */
18
+ /**
19
+ * One asset the worker must upload: its preflight metadata plus the bytes to PUT. `prepared` is the
20
+ * wire shape (no `absolutePath` — that stays in the sandbox; only the compile step reads bytes from it).
21
+ */
22
+ export interface PipelineAsset {
23
+ readonly prepared: Omit<PreparedPackagedAsset, 'absolutePath'>;
24
+ readonly bytes: Uint8Array;
25
+ }
26
+ /** What the untrusted compile stage produces — everything the trusted deploy needs, nothing more. */
27
+ export interface CompiledDeployInput {
28
+ readonly manifest: string;
29
+ readonly connectors?: string;
30
+ readonly serverVersion?: string;
31
+ /** Declared access mode from committed `noodle.json`; the deploy route resolves inherit → declared. */
32
+ readonly declaredAccessMode?: string;
33
+ readonly assets?: readonly PipelineAsset[];
34
+ }
35
+ export type CompileStageResult = {
36
+ readonly ok: true;
37
+ readonly input: CompiledDeployInput;
38
+ } | {
39
+ readonly ok: false;
40
+ readonly errorSummary: string;
41
+ };
42
+ export type DeployStage = 'compile' | 'preflight' | 'upload' | 'deploy';
43
+ export type DeployPipelineOutcome = {
44
+ readonly status: 'deployed';
45
+ readonly deploymentId: string;
46
+ } | {
47
+ readonly status: 'superseded';
48
+ } | {
49
+ readonly status: 'failed';
50
+ readonly stage: DeployStage;
51
+ readonly errorSummary: string;
52
+ };
53
+ export interface DeployPipelineDeps {
54
+ readonly run: DeployRunRecord;
55
+ /** Run-scoped credential for the status + preflight + deploy calls (never handed to `compile`). */
56
+ readonly runToken: string;
57
+ readonly serviceBaseUrl: string;
58
+ /** Untrusted compile — reads source, returns data; MUST NOT receive the run token. */
59
+ readonly compile: (run: DeployRunRecord) => Promise<CompileStageResult>;
60
+ /** Injected so tests use a fake and executors use global `fetch`. */
61
+ readonly httpFetch: typeof fetch;
62
+ }
63
+ export declare function runDeployPipeline(deps: DeployPipelineDeps): Promise<DeployPipelineOutcome>;
64
+ //# sourceMappingURL=deploy-pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-pipeline.d.ts","sourceRoot":"","sources":["../../src/github/deploy-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACxF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD;;;;;;;;;;;;;;GAcG;AAEH;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,qBAAqB,EAAE,cAAc,CAAC,CAAC;IAC/D,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B;AAED,qGAAqG;AACrG,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,uGAAuG;IACvG,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;CAC5C;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE,GAC1D;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAExE,MAAM,MAAM,qBAAqB,GAC7B;IAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GACjC;IAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9F,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC;IAC9B,mGAAmG;IACnG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,sFAAsF;IACtF,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACxE,qEAAqE;IACrE,QAAQ,CAAC,SAAS,EAAE,OAAO,KAAK,CAAC;CAClC;AA0BD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA0HhG"}
@@ -0,0 +1,121 @@
1
+ const trimTrailingSlash = (url) => url.replace(/\/+$/, '');
2
+ /** Build a redacted one-line summary from a route's own (secret-free) `{ error, code }` body. */
3
+ async function summarizeHttpFailure(stage, res) {
4
+ let code;
5
+ let message;
6
+ try {
7
+ const body = (await res.json());
8
+ if (typeof body.code === 'string')
9
+ code = body.code;
10
+ if (typeof body.error === 'string')
11
+ message = body.error;
12
+ }
13
+ catch {
14
+ // A non-JSON error body carries no structured reason; the status code still localizes the failure.
15
+ }
16
+ return {
17
+ summary: `${stage} failed (HTTP ${res.status}${code !== undefined ? `, ${code}` : ''})${message !== undefined ? `: ${message}` : ''}`,
18
+ ...(code !== undefined ? { code } : {}),
19
+ };
20
+ }
21
+ export async function runDeployPipeline(deps) {
22
+ const { run, runToken, compile, httpFetch } = deps;
23
+ const baseUrl = trimTrailingSlash(deps.serviceBaseUrl);
24
+ const statusUrl = `${baseUrl}/v1/github/runs/${encodeURIComponent(run.runId)}/status`;
25
+ const tenantBase = `${baseUrl}/v1/orgs/${encodeURIComponent(run.orgSlug)}/apps/${encodeURIComponent(run.appSlug)}/envs/${encodeURIComponent(run.envName)}`;
26
+ const report = async (to, patch) => {
27
+ try {
28
+ await httpFetch(statusUrl, {
29
+ method: 'POST',
30
+ headers: { 'content-type': 'application/json', authorization: `Bearer ${runToken}` },
31
+ body: JSON.stringify({ to, ...patch }),
32
+ });
33
+ }
34
+ catch {
35
+ // Best-effort: a failed status report is observability loss, not a deploy failure.
36
+ }
37
+ };
38
+ const fail = async (stage, errorSummary) => {
39
+ await report('failed', { errorSummary });
40
+ return { status: 'failed', stage, errorSummary };
41
+ };
42
+ let stage = 'compile';
43
+ try {
44
+ await report('building');
45
+ const compiled = await compile(run);
46
+ if (!compiled.ok)
47
+ return await fail('compile', compiled.errorSummary);
48
+ await report('deploying');
49
+ let hostedAssets;
50
+ const assets = compiled.input.assets ?? [];
51
+ if (assets.length > 0) {
52
+ stage = 'preflight';
53
+ const preflightRes = await httpFetch(`${tenantBase}/assets/preflight`, {
54
+ method: 'POST',
55
+ headers: { 'content-type': 'application/json', 'x-noodle-run-token': runToken },
56
+ body: JSON.stringify({ assets: assets.map((asset) => asset.prepared) }),
57
+ });
58
+ if (!preflightRes.ok) {
59
+ const failure = await summarizeHttpFailure('asset preflight', preflightRes);
60
+ return await fail('preflight', failure.summary);
61
+ }
62
+ const plan = (await preflightRes.json());
63
+ stage = 'upload';
64
+ for (const upload of plan.uploads ?? []) {
65
+ const asset = assets.find((candidate) => candidate.prepared.logicalId === upload.logicalId);
66
+ if (asset === undefined) {
67
+ return await fail('upload', `upload: preflight planned an unknown asset "${upload.logicalId}"`);
68
+ }
69
+ const putRes = await httpFetch(upload.uploadUrl, {
70
+ method: upload.method,
71
+ headers: upload.headers,
72
+ body: asset.bytes,
73
+ });
74
+ if (!putRes.ok) {
75
+ return await fail('upload', `upload: asset "${upload.logicalId}" PUT failed (HTTP ${putRes.status})`);
76
+ }
77
+ }
78
+ hostedAssets = plan.assets;
79
+ }
80
+ stage = 'deploy';
81
+ const deployRes = await httpFetch(`${tenantBase}/deploy`, {
82
+ method: 'POST',
83
+ headers: { 'content-type': 'application/json', 'x-noodle-run-token': runToken },
84
+ body: JSON.stringify({
85
+ manifest: compiled.input.manifest,
86
+ ...(compiled.input.connectors !== undefined
87
+ ? { connectors: compiled.input.connectors }
88
+ : {}),
89
+ ...(compiled.input.serverVersion !== undefined
90
+ ? { serverVersion: compiled.input.serverVersion }
91
+ : {}),
92
+ ...(compiled.input.declaredAccessMode !== undefined
93
+ ? { accessMode: compiled.input.declaredAccessMode }
94
+ : {}),
95
+ ...(hostedAssets !== undefined ? { hostedAssets } : {}),
96
+ }),
97
+ });
98
+ if (!deployRes.ok) {
99
+ const failure = await summarizeHttpFailure('deploy', deployRes);
100
+ if (failure.code === 'run_superseded') {
101
+ await report('superseded');
102
+ return { status: 'superseded' };
103
+ }
104
+ return await fail('deploy', failure.summary);
105
+ }
106
+ const deployed = (await deployRes.json());
107
+ if (typeof deployed.deploymentId !== 'string') {
108
+ return await fail('deploy', 'deploy: service returned no deploymentId');
109
+ }
110
+ await report('deployed', { deploymentId: deployed.deploymentId });
111
+ return { status: 'deployed', deploymentId: deployed.deploymentId };
112
+ }
113
+ catch (error) {
114
+ // An unexpected throw (network fault, etc.) still lands the run in `failed` with a redacted,
115
+ // stage-tagged summary — never a silent hang. Only the error's name is included; never a message
116
+ // that could carry a URL, token, or body.
117
+ const name = error instanceof Error ? error.name : 'Error';
118
+ return await fail(stage, `${stage}: unexpected error (${name})`);
119
+ }
120
+ }
121
+ //# sourceMappingURL=deploy-pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-pipeline.js","sourceRoot":"","sources":["../../src/github/deploy-pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { DeployRunRecord } from '../store.js';
2
+ /**
3
+ * The isolation seam for GHD-3 (ADR 0132 Decision 6). The dispatcher hands an accepted, non-blocked
4
+ * run to an executor; the executor runs the untrusted-compile → trusted-deploy pipeline somewhere
5
+ * isolated and reports progress back through `POST /v1/github/runs/{runId}/status` using the
6
+ * `runToken`. The executor is the ONLY thing that varies by environment:
7
+ *
8
+ * - `CloudRunJobExecutor` (C3, production) — triggers one Cloud Run Job execution per run.
9
+ * - `LocalProcessExecutor` (C2, dev/self-host/E2E) — runs the pipeline as a local child process.
10
+ * - {@link FakeDeployRunExecutor} (tests) — records dispatches, runs nothing.
11
+ *
12
+ * `dispatch` is fire-and-forget from the caller's view (the webhook must answer GitHub immediately);
13
+ * it resolves once the execution is *launched*, not *finished*. It must never throw into the request
14
+ * path — an executor that can't launch records the failure out-of-band and the sweeper retries.
15
+ */
16
+ export interface DeployRunDispatchInput {
17
+ readonly run: DeployRunRecord;
18
+ /** Run-scoped credential the executor uses to report status + deploy (never the sandbox's). */
19
+ readonly runToken: string;
20
+ /** Base URL the executor calls back to (the status/deploy routes). */
21
+ readonly serviceBaseUrl: string;
22
+ }
23
+ export interface DeployRunExecutor {
24
+ dispatch(input: DeployRunDispatchInput): Promise<void>;
25
+ }
26
+ /** Test double: captures every dispatch, launches nothing. */
27
+ export declare class FakeDeployRunExecutor implements DeployRunExecutor {
28
+ #private;
29
+ readonly dispatches: DeployRunDispatchInput[];
30
+ constructor(onDispatch?: (input: DeployRunDispatchInput) => void | Promise<void>);
31
+ dispatch(input: DeployRunDispatchInput): Promise<void>;
32
+ }
33
+ //# sourceMappingURL=deploy-run-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-run-executor.d.ts","sourceRoot":"","sources":["../../src/github/deploy-run-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC;IAC9B,+FAA+F;IAC/F,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,sEAAsE;IACtE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AAED,8DAA8D;AAC9D,qBAAa,qBAAsB,YAAW,iBAAiB;;IAC7D,QAAQ,CAAC,UAAU,EAAE,sBAAsB,EAAE,CAAM;gBAIvC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1E,QAAQ,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;CAI7D"}
@@ -0,0 +1,14 @@
1
+ /** Test double: captures every dispatch, launches nothing. */
2
+ export class FakeDeployRunExecutor {
3
+ dispatches = [];
4
+ /** Optional hook so a test can assert the token/base or simulate a launch failure. */
5
+ #onDispatch;
6
+ constructor(onDispatch) {
7
+ this.#onDispatch = onDispatch;
8
+ }
9
+ async dispatch(input) {
10
+ this.dispatches.push(input);
11
+ await this.#onDispatch?.(input);
12
+ }
13
+ }
14
+ //# sourceMappingURL=deploy-run-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-run-executor.js","sourceRoot":"","sources":["../../src/github/deploy-run-executor.ts"],"names":[],"mappings":"AA4BA,8DAA8D;AAC9D,MAAM,OAAO,qBAAqB;IACvB,UAAU,GAA6B,EAAE,CAAC;IACnD,sFAAsF;IAC7E,WAAW,CAAwE;IAE5F,YAAY,UAAoE;QAC9E,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAA6B;QAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,36 @@
1
+ import { type Logger } from '@noodle-borg/transport-http';
2
+ import type { GithubConnectionStore, GithubDeployRunStore } from '../store.js';
3
+ import type { DeployRunExecutor } from './deploy-run-executor.js';
4
+ export declare const GITHUB_RUN_RECONCILE_INTERVAL_MS = 60000;
5
+ export declare const GITHUB_RUN_TIMEOUT_MS = 180000;
6
+ export declare const GITHUB_RUN_QUEUED_REDISPATCH_GRACE_MS = 30000;
7
+ export interface GithubDeployRunReconcilerOptions {
8
+ readonly runStore: GithubDeployRunStore;
9
+ readonly connectionStore: GithubConnectionStore;
10
+ readonly executor: DeployRunExecutor;
11
+ readonly webhookSecret: string;
12
+ readonly serviceBaseUrl: string;
13
+ readonly clock?: () => Date;
14
+ readonly logger?: Logger;
15
+ readonly intervalMs?: number;
16
+ readonly runTimeoutMs?: number;
17
+ readonly queuedRedispatchGraceMs?: number;
18
+ readonly limitPerConnection?: number;
19
+ }
20
+ export interface GithubDeployRunReconcileResult {
21
+ readonly connections: number;
22
+ readonly inspected: number;
23
+ readonly dispatched: number;
24
+ readonly failed: number;
25
+ }
26
+ /**
27
+ * Idempotent GitHub deploy-run reconciler. Webhook dispatch is intentionally fire-and-forget; this
28
+ * loop is the recovery path for missed Cloud Run Job launches and abandoned in-flight runs.
29
+ */
30
+ export declare class GithubDeployRunReconciler {
31
+ #private;
32
+ constructor(options: GithubDeployRunReconcilerOptions);
33
+ maybeSweep(): void;
34
+ sweepNow(): Promise<GithubDeployRunReconcileResult>;
35
+ }
36
+ //# sourceMappingURL=deploy-run-reconciler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-run-reconciler.d.ts","sourceRoot":"","sources":["../../src/github/deploy-run-reconciler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAc,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAmB,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAChG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAIlE,eAAO,MAAM,gCAAgC,QAAS,CAAC;AACvD,eAAO,MAAM,qBAAqB,SAAU,CAAC;AAC7C,eAAO,MAAM,qCAAqC,QAAS,CAAC;AAE5D,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,eAAe,EAAE,qBAAqB,CAAC;IAChD,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,qBAAa,yBAAyB;;gBAexB,OAAO,EAAE,gCAAgC;IAerD,UAAU,IAAI,IAAI;IAcZ,QAAQ,IAAI,OAAO,CAAC,8BAA8B,CAAC;CA6D1D"}