@treeseed/sdk 0.11.0 → 0.12.4

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 (473) hide show
  1. package/README.md +9 -4
  2. package/dist/agent-capacity.d.ts +916 -0
  3. package/dist/agent-capacity.js +1600 -0
  4. package/dist/agent-tools.d.ts +37 -0
  5. package/dist/agent-tools.js +301 -0
  6. package/dist/api/app.d.ts +1 -1
  7. package/dist/api/auth/d1-database.d.ts +2 -2
  8. package/dist/api/auth/d1-provider.d.ts +4 -4
  9. package/dist/api/auth/d1-store.d.ts +2 -2
  10. package/dist/api/auth/memory-provider.d.ts +1 -1
  11. package/dist/api/auth/tokens.d.ts +1 -1
  12. package/dist/api/config.d.ts +3 -1
  13. package/dist/api/config.js +34 -10
  14. package/dist/api/http.d.ts +2 -2
  15. package/dist/api/index.d.ts +10 -10
  16. package/dist/api/index.js +4 -2
  17. package/dist/api/operations-routes.d.ts +3 -3
  18. package/dist/api/operations.d.ts +1 -1
  19. package/dist/api/providers.d.ts +1 -1
  20. package/dist/api/providers.js +21 -4
  21. package/dist/api/railway.d.ts +3 -2
  22. package/dist/api/sdk-dispatch.d.ts +4 -4
  23. package/dist/api/sdk-routes.d.ts +2 -2
  24. package/dist/api/templates.d.ts +2 -2
  25. package/dist/api/types.d.ts +3 -2
  26. package/dist/capacity-provider.d.ts +117 -60
  27. package/dist/capacity-provider.js +215 -43
  28. package/dist/capacity.d.ts +2 -2
  29. package/dist/cli-tools.d.ts +1 -1
  30. package/dist/content-operations.d.ts +97 -0
  31. package/dist/content-operations.js +250 -0
  32. package/dist/content-store.d.ts +4 -4
  33. package/dist/control-plane-client.d.ts +13 -18
  34. package/dist/control-plane-client.js +8 -86
  35. package/dist/control-plane.d.ts +2 -2
  36. package/dist/copilot.d.ts +3 -0
  37. package/dist/copilot.js +16 -1
  38. package/dist/d1-http.d.ts +1 -1
  39. package/dist/d1-store.d.ts +32 -57
  40. package/dist/d1-store.js +115 -318
  41. package/dist/db/d1.d.ts +1 -232
  42. package/dist/db/index.d.ts +3 -3
  43. package/dist/db/market-schema.d.ts +49037 -11843
  44. package/dist/db/market-schema.js +1788 -50
  45. package/dist/db/node-sqlite.d.ts +1 -232
  46. package/dist/db/schema.d.ts +0 -462
  47. package/dist/db/schema.js +2 -22
  48. package/dist/dispatch.d.ts +1 -1
  49. package/dist/dispatch.js +0 -11
  50. package/dist/fixture-support.js +52 -4
  51. package/dist/governance.d.ts +133 -0
  52. package/dist/governance.js +285 -0
  53. package/dist/graph/build.d.ts +2 -2
  54. package/dist/graph/context-query-contracts.d.ts +1 -1
  55. package/dist/graph/dsl.d.ts +1 -1
  56. package/dist/graph/query.d.ts +4 -4
  57. package/dist/graph/ranking.d.ts +1 -1
  58. package/dist/graph/schema.d.ts +1 -1
  59. package/dist/graph.d.ts +11 -11
  60. package/dist/guarantees/index.d.ts +425 -0
  61. package/dist/guarantees/index.js +1146 -0
  62. package/dist/hosting/apps.d.ts +1 -1
  63. package/dist/hosting/builtins.d.ts +1 -1
  64. package/dist/hosting/builtins.js +9 -198
  65. package/dist/hosting/contracts.d.ts +3 -2
  66. package/dist/hosting/graph.d.ts +24 -21
  67. package/dist/hosting/graph.js +280 -294
  68. package/dist/hosting/index.d.ts +4 -4
  69. package/dist/index.d.ts +88 -74
  70. package/dist/index.js +81 -10
  71. package/dist/local-dev/managed-dev.d.ts +85 -0
  72. package/dist/local-dev/managed-dev.js +368 -0
  73. package/dist/managed-dependencies.d.ts +9 -0
  74. package/dist/managed-dependencies.js +10 -8
  75. package/dist/market-client.d.ts +265 -7
  76. package/dist/market-client.js +381 -9
  77. package/dist/model-registry.d.ts +1 -1
  78. package/dist/model-registry.js +19 -19
  79. package/dist/operations/agent-tools.d.ts +2 -11
  80. package/dist/operations/agent-tools.js +2 -14
  81. package/dist/operations/providers/default.d.ts +1 -1
  82. package/dist/operations/providers/default.js +20 -37
  83. package/dist/operations/repository-operations.d.ts +26 -2
  84. package/dist/operations/repository-operations.js +159 -1
  85. package/dist/operations/runtime.d.ts +3 -3
  86. package/dist/operations/services/bootstrap-runner.d.ts +1 -1
  87. package/dist/operations/services/build-warning-policy.d.ts +34 -0
  88. package/dist/operations/services/build-warning-policy.js +81 -82
  89. package/dist/operations/services/commit-message-provider.js +4 -4
  90. package/dist/operations/services/config-runtime.d.ts +73 -19
  91. package/dist/operations/services/config-runtime.js +276 -100
  92. package/dist/operations/services/deploy.d.ts +41 -622
  93. package/dist/operations/services/deploy.js +181 -213
  94. package/dist/operations/services/deployment-readiness.d.ts +1 -1
  95. package/dist/operations/services/deployment-readiness.js +38 -7
  96. package/dist/operations/services/git-remote-policy.js +12 -4
  97. package/dist/operations/services/git-runner.d.ts +66 -0
  98. package/dist/operations/services/git-runner.js +479 -0
  99. package/dist/operations/services/git-workflow.d.ts +43 -5
  100. package/dist/operations/services/git-workflow.js +242 -20
  101. package/dist/operations/services/github-actions-verification.d.ts +3 -1
  102. package/dist/operations/services/github-actions-verification.js +11 -3
  103. package/dist/operations/services/github-api.js +21 -5
  104. package/dist/operations/services/github-automation.d.ts +3 -3
  105. package/dist/operations/services/github-automation.js +15 -18
  106. package/dist/operations/services/github-credentials.js +2 -1
  107. package/dist/operations/services/hosted-service-checks.d.ts +19 -1
  108. package/dist/operations/services/hosted-service-checks.js +162 -11
  109. package/dist/operations/services/hosting-audit.d.ts +2 -2
  110. package/dist/operations/services/hosting-audit.js +7 -7
  111. package/dist/operations/services/hub-launch.d.ts +1 -1
  112. package/dist/operations/services/hub-provider-launch.d.ts +5 -5
  113. package/dist/operations/services/hub-provider-launch.js +19 -14
  114. package/dist/operations/services/live-hosted-service-checks.d.ts +2 -1
  115. package/dist/operations/services/live-hosted-service-checks.js +193 -80
  116. package/dist/operations/services/local-dev.js +0 -1
  117. package/dist/operations/services/managed-host-security.d.ts +1 -1
  118. package/dist/operations/services/managed-repositories.d.ts +37 -0
  119. package/dist/operations/services/managed-repositories.js +177 -0
  120. package/dist/operations/services/operations-runner-smoke.d.ts +3 -2
  121. package/dist/operations/services/operations-runner-smoke.js +22 -4
  122. package/dist/operations/services/package-adapters.d.ts +77 -2
  123. package/dist/operations/services/package-adapters.js +627 -56
  124. package/dist/operations/services/package-reference-policy.d.ts +12 -88
  125. package/dist/operations/services/package-reference-policy.js +81 -213
  126. package/dist/operations/services/project-host-operations.d.ts +4 -4
  127. package/dist/operations/services/project-platform.d.ts +19 -193
  128. package/dist/operations/services/project-platform.js +31 -103
  129. package/dist/operations/services/project-web-monitor.d.ts +2 -2
  130. package/dist/operations/services/project-web-monitor.js +97 -2
  131. package/dist/operations/services/railway-api.d.ts +36 -7
  132. package/dist/operations/services/railway-api.js +331 -100
  133. package/dist/operations/services/railway-deploy.d.ts +7 -95
  134. package/dist/operations/services/railway-deploy.js +334 -742
  135. package/dist/operations/services/release-history.js +3 -4
  136. package/dist/operations/services/release-proof-ledger.d.ts +13 -0
  137. package/dist/operations/services/release-proof-ledger.js +81 -0
  138. package/dist/operations/services/release-proof-planner.d.ts +48 -0
  139. package/dist/operations/services/release-proof-planner.js +195 -0
  140. package/dist/operations/services/release-proof-runner.d.ts +16 -0
  141. package/dist/operations/services/release-proof-runner.js +169 -0
  142. package/dist/operations/services/release-proof.d.ts +81 -0
  143. package/dist/operations/services/release-proof.js +79 -0
  144. package/dist/operations/services/repository-save-orchestrator.d.ts +6 -7
  145. package/dist/operations/services/repository-save-orchestrator.js +353 -174
  146. package/dist/operations/services/runtime-paths.d.ts +1 -3
  147. package/dist/operations/services/runtime-paths.js +0 -4
  148. package/dist/operations/services/runtime-tools.d.ts +1 -192
  149. package/dist/operations/services/runtime-tools.js +4 -444
  150. package/dist/operations/services/save-deploy-preflight.js +9 -1
  151. package/dist/operations/services/template-host-bindings.d.ts +2 -2
  152. package/dist/operations/services/template-host-bindings.js +3 -2
  153. package/dist/operations/services/template-registry.d.ts +6 -6
  154. package/dist/operations/services/template-registry.js +33 -14
  155. package/dist/operations/services/template-secret-sync.d.ts +3 -3
  156. package/dist/operations/services/workflow-timing.d.ts +25 -0
  157. package/dist/operations/services/workflow-timing.js +79 -0
  158. package/dist/operations/services/workspace-dependency-mode.js +41 -4
  159. package/dist/operations/services/workspace-preflight.js +8 -8
  160. package/dist/operations/services/workspace-save-script.d.ts +4 -4
  161. package/dist/operations/services/workspace-save.d.ts +1 -0
  162. package/dist/operations/services/workspace-save.js +41 -18
  163. package/dist/operations/services/workspace-tools.js +40 -6
  164. package/dist/operations-registry.d.ts +1 -1
  165. package/dist/operations-registry.js +5 -6
  166. package/dist/operations-types.d.ts +1 -1
  167. package/dist/operations.d.ts +17 -11
  168. package/dist/operations.js +57 -3
  169. package/dist/platform/book-export.js +2 -0
  170. package/dist/platform/books-data.d.ts +1 -1
  171. package/dist/platform/config.d.ts +27 -0
  172. package/dist/platform/config.js +100 -0
  173. package/dist/platform/content-runtime-source.d.ts +54 -0
  174. package/dist/platform/content-runtime-source.js +169 -0
  175. package/dist/platform/contracts.d.ts +6 -1
  176. package/dist/platform/deploy-config.d.ts +1 -1
  177. package/dist/platform/deploy-config.js +7 -1
  178. package/dist/platform/deploy-runtime.d.ts +1 -1
  179. package/dist/platform/desired-state.d.ts +63 -0
  180. package/dist/platform/desired-state.js +1021 -0
  181. package/dist/platform/env.yaml +414 -19
  182. package/dist/platform/environment.d.ts +2 -2
  183. package/dist/platform/environment.js +54 -22
  184. package/dist/platform/local-content-materialization.d.ts +9 -0
  185. package/dist/platform/local-content-materialization.js +212 -0
  186. package/dist/platform/plugin.d.ts +5 -5
  187. package/dist/platform/plugins/runtime.d.ts +3 -3
  188. package/dist/platform/plugins/runtime.js +62 -1
  189. package/dist/platform/plugins.d.ts +6 -6
  190. package/dist/platform/published-content-pipeline.d.ts +3 -3
  191. package/dist/platform/published-content-pipeline.js +5 -1
  192. package/dist/platform/published-content.d.ts +4 -3
  193. package/dist/platform/site-config-schema.d.ts +1 -0
  194. package/dist/platform/site-config-schema.js +4 -1
  195. package/dist/platform/tenant/runtime-config.d.ts +152 -2
  196. package/dist/platform/tenant-config.d.ts +1 -1
  197. package/dist/platform/utils/site-config-schema.d.ts +154 -0
  198. package/dist/platform/utils/site-config-schema.js +400 -461
  199. package/dist/platform-operation-store.d.ts +1 -1
  200. package/dist/plugin-default.d.ts +1 -1
  201. package/dist/plugin-default.js +27 -12
  202. package/dist/project-import.d.ts +91 -0
  203. package/dist/project-import.js +257 -0
  204. package/dist/project-workflow.d.ts +1 -1
  205. package/dist/reconcile/bootstrap-systems.d.ts +2 -2
  206. package/dist/reconcile/bootstrap-systems.js +3 -3
  207. package/dist/reconcile/builtin-adapters.d.ts +7 -1
  208. package/dist/reconcile/builtin-adapters.js +2924 -346
  209. package/dist/reconcile/contracts.d.ts +15 -2
  210. package/dist/reconcile/desired-state.d.ts +2 -193
  211. package/dist/reconcile/desired-state.js +24 -33
  212. package/dist/reconcile/engine.d.ts +60 -397
  213. package/dist/reconcile/engine.js +182 -18
  214. package/dist/reconcile/index.d.ts +10 -10
  215. package/dist/reconcile/live-acceptance.d.ts +22 -1
  216. package/dist/reconcile/live-acceptance.js +456 -44
  217. package/dist/reconcile/providers/docker-private.d.ts +54 -0
  218. package/dist/reconcile/providers/docker-private.js +101 -0
  219. package/dist/reconcile/providers/github-private.d.ts +65 -0
  220. package/dist/reconcile/providers/github-private.js +119 -0
  221. package/dist/reconcile/providers/local-private.d.ts +28 -0
  222. package/dist/reconcile/providers/local-private.js +75 -0
  223. package/dist/reconcile/providers/railway-iac.d.ts +66 -0
  224. package/dist/reconcile/providers/railway-iac.js +275 -0
  225. package/dist/reconcile/providers/release-private.d.ts +92 -0
  226. package/dist/reconcile/providers/release-private.js +152 -0
  227. package/dist/reconcile/registry.d.ts +2 -2
  228. package/dist/reconcile/registry.js +16 -1
  229. package/dist/reconcile/state.d.ts +1 -1
  230. package/dist/reconcile/state.js +3 -40
  231. package/dist/reconcile/units.d.ts +1 -1
  232. package/dist/reconcile/units.js +7 -1
  233. package/dist/remote.d.ts +6 -6
  234. package/dist/scenes/artifacts.d.ts +16 -0
  235. package/dist/scenes/artifacts.js +61 -0
  236. package/dist/scenes/auth.d.ts +2 -0
  237. package/dist/scenes/auth.js +28 -0
  238. package/dist/scenes/base-url.d.ts +12 -0
  239. package/dist/scenes/base-url.js +123 -0
  240. package/dist/scenes/builtin-plugins.d.ts +2 -0
  241. package/dist/scenes/builtin-plugins.js +447 -0
  242. package/dist/scenes/checkpoints.d.ts +14 -0
  243. package/dist/scenes/checkpoints.js +33 -0
  244. package/dist/scenes/device-matrix.d.ts +2 -0
  245. package/dist/scenes/device-matrix.js +97 -0
  246. package/dist/scenes/devices.d.ts +11 -0
  247. package/dist/scenes/devices.js +22 -0
  248. package/dist/scenes/diagnostics.d.ts +5 -0
  249. package/dist/scenes/diagnostics.js +22 -0
  250. package/dist/scenes/diagram-providers.d.ts +2 -0
  251. package/dist/scenes/diagram-providers.js +181 -0
  252. package/dist/scenes/diagram-validation.d.ts +22 -0
  253. package/dist/scenes/diagram-validation.js +74 -0
  254. package/dist/scenes/environment.d.ts +2 -0
  255. package/dist/scenes/environment.js +65 -0
  256. package/dist/scenes/evidence-bundle.d.ts +5 -0
  257. package/dist/scenes/evidence-bundle.js +42 -0
  258. package/dist/scenes/evidence-report.d.ts +10 -0
  259. package/dist/scenes/evidence-report.js +73 -0
  260. package/dist/scenes/evidence.d.ts +16 -0
  261. package/dist/scenes/evidence.js +277 -0
  262. package/dist/scenes/index.d.ts +48 -0
  263. package/dist/scenes/index.js +312 -0
  264. package/dist/scenes/inspect.d.ts +9 -0
  265. package/dist/scenes/inspect.js +64 -0
  266. package/dist/scenes/loader.d.ts +3 -0
  267. package/dist/scenes/loader.js +38 -0
  268. package/dist/scenes/logs.d.ts +2 -0
  269. package/dist/scenes/logs.js +47 -0
  270. package/dist/scenes/operations.d.ts +3 -0
  271. package/dist/scenes/operations.js +128 -0
  272. package/dist/scenes/phase0.d.ts +9 -0
  273. package/dist/scenes/phase0.js +637 -0
  274. package/dist/scenes/planner.d.ts +12 -0
  275. package/dist/scenes/planner.js +166 -0
  276. package/dist/scenes/playwright-adapter.d.ts +2 -0
  277. package/dist/scenes/playwright-adapter.js +63 -0
  278. package/dist/scenes/plugins.d.ts +5 -0
  279. package/dist/scenes/plugins.js +115 -0
  280. package/dist/scenes/progress.d.ts +17 -0
  281. package/dist/scenes/progress.js +24 -0
  282. package/dist/scenes/publish-destinations.d.ts +12 -0
  283. package/dist/scenes/publish-destinations.js +99 -0
  284. package/dist/scenes/publish-plan-report.d.ts +10 -0
  285. package/dist/scenes/publish-plan-report.js +70 -0
  286. package/dist/scenes/publish-plan.d.ts +15 -0
  287. package/dist/scenes/publish-plan.js +248 -0
  288. package/dist/scenes/publish-redaction.d.ts +16 -0
  289. package/dist/scenes/publish-redaction.js +148 -0
  290. package/dist/scenes/publish-release-record.d.ts +13 -0
  291. package/dist/scenes/publish-release-record.js +34 -0
  292. package/dist/scenes/publish-report.d.ts +10 -0
  293. package/dist/scenes/publish-report.js +67 -0
  294. package/dist/scenes/publish.d.ts +16 -0
  295. package/dist/scenes/publish.js +298 -0
  296. package/dist/scenes/registry.d.ts +12 -0
  297. package/dist/scenes/registry.js +65 -0
  298. package/dist/scenes/remotion-adapter.d.ts +3 -0
  299. package/dist/scenes/remotion-adapter.js +94 -0
  300. package/dist/scenes/remotion-composition-registry.d.ts +2 -0
  301. package/dist/scenes/remotion-composition-registry.js +12 -0
  302. package/dist/scenes/remotion-compositions.d.ts +15 -0
  303. package/dist/scenes/remotion-compositions.js +464 -0
  304. package/dist/scenes/remotion-diagrams.d.ts +9 -0
  305. package/dist/scenes/remotion-diagrams.js +188 -0
  306. package/dist/scenes/remotion-input.d.ts +13 -0
  307. package/dist/scenes/remotion-input.js +291 -0
  308. package/dist/scenes/remotion-visuals.d.ts +29 -0
  309. package/dist/scenes/remotion-visuals.js +198 -0
  310. package/dist/scenes/render-media-assets.d.ts +9 -0
  311. package/dist/scenes/render-media-assets.js +117 -0
  312. package/dist/scenes/render-report.d.ts +10 -0
  313. package/dist/scenes/render-report.js +27 -0
  314. package/dist/scenes/render.d.ts +2 -0
  315. package/dist/scenes/render.js +218 -0
  316. package/dist/scenes/reporter.d.ts +3 -0
  317. package/dist/scenes/reporter.js +101 -0
  318. package/dist/scenes/resume.d.ts +2 -0
  319. package/dist/scenes/resume.js +79 -0
  320. package/dist/scenes/runner.d.ts +2 -0
  321. package/dist/scenes/runner.js +674 -0
  322. package/dist/scenes/schema.d.ts +6 -0
  323. package/dist/scenes/schema.js +994 -0
  324. package/dist/scenes/seed.d.ts +2 -0
  325. package/dist/scenes/seed.js +83 -0
  326. package/dist/scenes/segments.d.ts +15 -0
  327. package/dist/scenes/segments.js +79 -0
  328. package/dist/scenes/selectors.d.ts +3 -0
  329. package/dist/scenes/selectors.js +21 -0
  330. package/dist/scenes/timeline.d.ts +11 -0
  331. package/dist/scenes/timeline.js +26 -0
  332. package/dist/scenes/timeouts.d.ts +6 -0
  333. package/dist/scenes/timeouts.js +17 -0
  334. package/dist/scenes/training-captions.d.ts +14 -0
  335. package/dist/scenes/training-captions.js +98 -0
  336. package/dist/scenes/training-report.d.ts +10 -0
  337. package/dist/scenes/training-report.js +78 -0
  338. package/dist/scenes/training-transcript.d.ts +24 -0
  339. package/dist/scenes/training-transcript.js +204 -0
  340. package/dist/scenes/training.d.ts +10 -0
  341. package/dist/scenes/training.js +134 -0
  342. package/dist/scenes/types.d.ts +1872 -0
  343. package/dist/scenes/types.js +8 -0
  344. package/dist/scenes/visual-audit-contact-sheets.d.ts +6 -0
  345. package/dist/scenes/visual-audit-contact-sheets.js +119 -0
  346. package/dist/scenes/visual-audit-fixtures.d.ts +25 -0
  347. package/dist/scenes/visual-audit-fixtures.js +210 -0
  348. package/dist/scenes/visual-audit-report.d.ts +11 -0
  349. package/dist/scenes/visual-audit-report.js +85 -0
  350. package/dist/scenes/visual-audit-review.d.ts +23 -0
  351. package/dist/scenes/visual-audit-review.js +829 -0
  352. package/dist/scenes/visual-audit-routes.d.ts +13 -0
  353. package/dist/scenes/visual-audit-routes.js +308 -0
  354. package/dist/scenes/visual-audit.d.ts +3 -0
  355. package/dist/scenes/visual-audit.js +596 -0
  356. package/dist/scripts/build-dist.js +154 -40
  357. package/dist/scripts/check-build-warnings.js +42 -53
  358. package/dist/scripts/cleanup-markdown.js +1 -1
  359. package/dist/scripts/cli-test-fixtures.js +24 -28
  360. package/dist/scripts/migrate-journey-csv-to-guarantees.js +140 -0
  361. package/dist/scripts/package-tools.js +12 -1
  362. package/dist/scripts/prepare.js +3 -7
  363. package/dist/scripts/release-verify.js +2 -5
  364. package/dist/scripts/run-fixture-astro-command.js +1 -1
  365. package/dist/scripts/template-catalog.test.js +68 -82
  366. package/dist/scripts/tenant-dev.js +0 -10
  367. package/dist/scripts/test-cloudflare-local.js +1 -1
  368. package/dist/scripts/test-scaffold.js +0 -1
  369. package/dist/scripts/test-smoke.js +3 -3
  370. package/dist/scripts/treeseed-build-dist.js +4 -7
  371. package/dist/scripts/treeseed-release-verify.js +1 -1
  372. package/dist/scripts/verify-driver.js +30 -21
  373. package/dist/scripts/workflow-commands.test.js +18 -27
  374. package/dist/scripts/workspace-command-e2e.js +1 -1
  375. package/dist/scripts/workspace-lint.js +6 -0
  376. package/dist/scripts/workspace-release-test.js +90 -1
  377. package/dist/scripts/workspace-test.js +6 -0
  378. package/dist/sdk-dispatch.d.ts +1 -1
  379. package/dist/sdk-dispatch.js +0 -16
  380. package/dist/sdk-fields.d.ts +1 -1
  381. package/dist/sdk-filters.d.ts +1 -1
  382. package/dist/sdk-types.d.ts +1184 -113
  383. package/dist/sdk-types.js +393 -0
  384. package/dist/sdk.d.ts +74 -79
  385. package/dist/sdk.js +27 -36
  386. package/dist/secrets-capability.d.ts +421 -0
  387. package/dist/secrets-capability.js +530 -0
  388. package/dist/seeds/normalize.js +1 -0
  389. package/dist/seeds/planner.js +38 -0
  390. package/dist/seeds/schema.js +293 -4
  391. package/dist/seeds/types.d.ts +60 -0
  392. package/dist/seeds/types.js +9 -1
  393. package/dist/service-credentials.d.ts +54 -0
  394. package/dist/service-credentials.js +112 -0
  395. package/dist/stores/cursor-store.d.ts +2 -2
  396. package/dist/stores/envelopes.d.ts +1 -1
  397. package/dist/stores/helpers.d.ts +1 -1
  398. package/dist/stores/lease-store.d.ts +2 -2
  399. package/dist/stores/message-store.d.ts +2 -2
  400. package/dist/stores/operational-store.d.ts +3 -26
  401. package/dist/stores/operational-store.js +0 -225
  402. package/dist/stores/project-workflow-store.d.ts +2 -2
  403. package/dist/stores/run-store.d.ts +2 -3
  404. package/dist/stores/run-store.js +0 -98
  405. package/dist/stores/subscription-store.d.ts +2 -3
  406. package/dist/stores/subscription-store.js +0 -100
  407. package/dist/template-catalog.d.ts +1 -1
  408. package/dist/template-launch-requirements.d.ts +2 -2
  409. package/dist/template-launch-ui.d.ts +2 -2
  410. package/dist/treedx/adapters.d.ts +6 -6
  411. package/dist/treedx/client.d.ts +1 -1
  412. package/dist/treedx/errors.d.ts +1 -1
  413. package/dist/treedx/federated-client.d.ts +3 -3
  414. package/dist/treedx/graph-adapter.d.ts +2 -2
  415. package/dist/treedx/index.d.ts +14 -14
  416. package/dist/treedx/market-integration.d.ts +1 -1
  417. package/dist/treedx/ports.d.ts +30 -30
  418. package/dist/treedx/query-adapter.d.ts +3 -3
  419. package/dist/treedx/registry-client.d.ts +2 -2
  420. package/dist/treedx/repository-adapter.d.ts +4 -4
  421. package/dist/treedx/repository-adapter.js +14 -3
  422. package/dist/treedx/sdk-integration.d.ts +3 -3
  423. package/dist/treedx/types.d.ts +2 -2
  424. package/dist/treedx/workspace-adapter.d.ts +2 -2
  425. package/dist/treedx-backends.d.ts +13 -11
  426. package/dist/treedx-backends.js +52 -50
  427. package/dist/treedx-client.d.ts +3 -0
  428. package/dist/treedx-client.js +10 -1
  429. package/dist/treeseed/services/compose.yml +2 -3
  430. package/dist/treeseed/template-catalog/catalog.fixture.json +4 -4
  431. package/dist/types/agents.d.ts +256 -0
  432. package/dist/types/agents.js +42 -1
  433. package/dist/verification.d.ts +1 -0
  434. package/dist/verification.js +143 -14
  435. package/dist/workflow/operations.d.ts +510 -559
  436. package/dist/workflow/operations.js +1891 -1342
  437. package/dist/workflow/policy.js +19 -7
  438. package/dist/workflow/runs.d.ts +9 -3
  439. package/dist/workflow/runs.js +66 -26
  440. package/dist/workflow/session.d.ts +4 -1
  441. package/dist/workflow/session.js +50 -10
  442. package/dist/workflow/worktrees.d.ts +6 -2
  443. package/dist/workflow/worktrees.js +98 -15
  444. package/dist/workflow-state.d.ts +5 -5
  445. package/dist/workflow-state.js +27 -17
  446. package/dist/workflow-support.d.ts +26 -25
  447. package/dist/workflow-support.js +27 -31
  448. package/dist/workflow.d.ts +46 -16
  449. package/dist/workflow.js +19 -7
  450. package/drizzle/d1/0000_treeseed_d1.sql +0 -18
  451. package/drizzle/market/0000_market_control_plane.sql +1793 -1499
  452. package/drizzle/market/0005_agent_capacity_coordination.sql +145 -0
  453. package/drizzle/market/0006_provider_assignment_lifecycle.sql +9 -0
  454. package/drizzle/market/0007_agent_architecture_gap_closure.sql +157 -0
  455. package/drizzle/market/0008_agent_capacity_operational_closure.sql +27 -0
  456. package/drizzle/market/0009_agent_capacity_runtime_hardening.sql +29 -0
  457. package/drizzle/market/0010_secrets_capability_persistence.sql +130 -0
  458. package/drizzle/market/0011_github_app_adapter.sql +47 -0
  459. package/drizzle/market/0012_workday_test_runs.sql +44 -0
  460. package/drizzle/market/0013_runtime_task_lifecycle.sql +39 -0
  461. package/drizzle/market/0014_governance_pipeline.sql +189 -0
  462. package/package.json +75 -18
  463. package/scripts/{verify-driver.mjs → verify-driver.ts} +19 -4
  464. package/templates/github/deploy-web.workflow.yml +12 -8
  465. package/dist/operations/services/mailpit-runtime.d.ts +0 -20
  466. package/dist/operations/services/mailpit-runtime.js +0 -67
  467. package/dist/operations/services/release-candidate.d.ts +0 -60
  468. package/dist/operations/services/release-candidate.js +0 -953
  469. package/dist/scripts/ensure-mailpit.js +0 -48
  470. package/dist/scripts/logs-mailpit.js +0 -2
  471. package/dist/scripts/run-ts.js +0 -45
  472. package/dist/scripts/stop-mailpit.js +0 -5
  473. package/dist/scripts/treeseed-run-ts.js +0 -45
@@ -1,12 +1,57 @@
1
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { isAbsolute, resolve } from "node:path";
1
3
  import { run, workspaceRoot } from "./workspace-tools.js";
2
- import { currentBranch, gitStatusPorcelain, repoRoot } from "./workspace-save.js";
4
+ import { collectMergeConflictReport, currentBranch, formatMergeConflictReport, gitStatusPorcelain, repoRoot } from "./workspace-save.js";
3
5
  import { ensureSshPushUrlForOrigin } from "./git-remote-policy.js";
6
+ import { runTreeseedGit } from "./git-runner.js";
4
7
  import { createTreeseedManagedToolEnv, resolveTreeseedToolBinary } from "../../managed-dependencies.js";
5
8
  const STAGING_BRANCH = "staging";
6
9
  const PRODUCTION_BRANCH = "main";
7
10
  const RESERVED_BRANCHES = /* @__PURE__ */ new Set([STAGING_BRANCH, PRODUCTION_BRANCH]);
11
+ function gitMode(args) {
12
+ const command = args[0] ?? "";
13
+ return (/* @__PURE__ */ new Set([
14
+ "add",
15
+ "checkout",
16
+ "commit",
17
+ "merge",
18
+ "pull",
19
+ "push",
20
+ "rebase",
21
+ "reset",
22
+ "restore",
23
+ "switch",
24
+ "tag",
25
+ "update-index",
26
+ "worktree"
27
+ ])).has(command) ? "mutate" : "read";
28
+ }
8
29
  function runGit(args, { cwd, capture = false } = {}) {
9
- return run("git", args, { cwd, capture });
30
+ const result = runTreeseedGit(args, {
31
+ cwd: cwd ?? workspaceRoot(),
32
+ mode: gitMode(args),
33
+ allowFailure: false
34
+ });
35
+ return capture ? result.stdout : result.stdout;
36
+ }
37
+ function runGitAllowFailure(args, { cwd }) {
38
+ return runTreeseedGit(args, {
39
+ cwd,
40
+ mode: gitMode(args),
41
+ allowFailure: true
42
+ });
43
+ }
44
+ function abortInProgressMerge(repoDir) {
45
+ const mergeHead = runGitAllowFailure(["rev-parse", "--git-path", "MERGE_HEAD"], { cwd: repoDir }).stdout.trim();
46
+ const mergeHeadPath = mergeHead && (isAbsolute(mergeHead) ? mergeHead : resolve(repoDir, mergeHead));
47
+ if (!mergeHeadPath || !existsSync(mergeHeadPath) && conflictedFiles(repoDir).length === 0) {
48
+ return false;
49
+ }
50
+ const abort = runGitAllowFailure(["merge", "--abort"], { cwd: repoDir });
51
+ if (abort.status === 0) {
52
+ return true;
53
+ }
54
+ return runGitAllowFailure(["reset", "--merge"], { cwd: repoDir }).status === 0;
10
55
  }
11
56
  function ensureWritableOrigin(repoDir) {
12
57
  try {
@@ -26,6 +71,62 @@ function repoHasStagedChanges(repoDir) {
26
71
  function conflictedFiles(repoDir) {
27
72
  return runGit(["diff", "--name-only", "--diff-filter=U"], { cwd: repoDir, capture: true }).split("\n").map((line) => line.trim()).filter(Boolean);
28
73
  }
74
+ function isGeneratedPackageMetadataFile(filePath) {
75
+ return filePath === "package.json" || filePath === "package-lock.json";
76
+ }
77
+ function isPackagePointerConflict(repoDir, filePath) {
78
+ if (!/^packages\/[^/]+$/u.test(filePath)) {
79
+ return false;
80
+ }
81
+ const stagedEntries = runGit(["ls-files", "-u", "--", filePath], { cwd: repoDir, capture: true }).split("\n").map((line) => line.trim()).filter(Boolean);
82
+ return stagedEntries.length > 0 && stagedEntries.every((line) => line.startsWith("160000 "));
83
+ }
84
+ function releaseSideConflictSha(repoDir, filePath) {
85
+ const stagedEntries = runGit(["ls-files", "-u", "--", filePath], { cwd: repoDir, capture: true }).split("\n").map((line) => line.trim()).filter(Boolean);
86
+ for (const entry of stagedEntries) {
87
+ const match = /^(\d+)\s+([0-9a-f]{40})\s+3\t(.+)$/u.exec(entry);
88
+ if (match && match[1] === "160000" && match[3] === filePath) {
89
+ return match[2];
90
+ }
91
+ }
92
+ return null;
93
+ }
94
+ function materializeReleaseSideFile(repoDir, filePath) {
95
+ const content = runGit(["show", `:3:${filePath}`], { cwd: repoDir, capture: true });
96
+ writeFileSync(resolve(repoDir, filePath), content);
97
+ runGit(["add", "--", filePath], { cwd: repoDir });
98
+ }
99
+ function stageReleaseSidePackagePointer(repoDir, filePath) {
100
+ const sha = releaseSideConflictSha(repoDir, filePath);
101
+ if (!sha) {
102
+ throw new Error(`Unable to resolve release-side package pointer for ${filePath}.`);
103
+ }
104
+ runGit(["update-index", "--cacheinfo", "160000", sha, filePath], { cwd: repoDir });
105
+ }
106
+ function isReleaseSideOnlyTextConflict(repoDir, filePath) {
107
+ if (isGeneratedPackageMetadataFile(filePath) || isPackagePointerConflict(repoDir, filePath)) {
108
+ return false;
109
+ }
110
+ const content = readFileSync(resolve(repoDir, filePath), "utf8");
111
+ const conflictBlocks = content.match(/<<<<<<< [\s\S]*?>>>>>>> .+/gu) ?? [];
112
+ if (conflictBlocks.length === 0) {
113
+ return false;
114
+ }
115
+ return conflictBlocks.every((block) => {
116
+ const middle = block.indexOf("=======");
117
+ if (middle === -1) {
118
+ return false;
119
+ }
120
+ const ours = block.slice(block.indexOf("\n") + 1, middle).trim();
121
+ return ours.length === 0;
122
+ });
123
+ }
124
+ function isReleaseSidePreferredWorkflowConflict(filePath) {
125
+ return [
126
+ "src/operations/services/git-workflow.ts",
127
+ "src/workflow/operations.ts"
128
+ ].includes(filePath);
129
+ }
29
130
  function resolveGeneratedPackageMetadataConflicts(repoDir) {
30
131
  const files = conflictedFiles(repoDir);
31
132
  if (files.length === 0) {
@@ -37,8 +138,8 @@ function resolveGeneratedPackageMetadataConflicts(repoDir) {
37
138
  allConflictsWereGeneratedMetadata: false
38
139
  };
39
140
  }
40
- const generatedMetadataFiles = /* @__PURE__ */ new Set(["package.json", "package-lock.json"]);
41
- if (files.some((file) => !generatedMetadataFiles.has(file))) {
141
+ const allConflictsWereGeneratedMetadata = files.every((file) => isGeneratedPackageMetadataFile(file) || isPackagePointerConflict(repoDir, file) || isReleaseSideOnlyTextConflict(repoDir, file) || isReleaseSidePreferredWorkflowConflict(file));
142
+ if (!allConflictsWereGeneratedMetadata) {
42
143
  return {
43
144
  resolved: false,
44
145
  repoDir,
@@ -47,14 +148,27 @@ function resolveGeneratedPackageMetadataConflicts(repoDir) {
47
148
  allConflictsWereGeneratedMetadata: false
48
149
  };
49
150
  }
50
- runGit(["checkout", "--theirs", "--", ...files], { cwd: repoDir });
51
- runGit(["add", "--", ...files], { cwd: repoDir });
151
+ for (const file of files) {
152
+ if (isGeneratedPackageMetadataFile(file)) {
153
+ materializeReleaseSideFile(repoDir, file);
154
+ continue;
155
+ }
156
+ if (isReleaseSideOnlyTextConflict(repoDir, file)) {
157
+ materializeReleaseSideFile(repoDir, file);
158
+ continue;
159
+ }
160
+ if (isReleaseSidePreferredWorkflowConflict(file)) {
161
+ materializeReleaseSideFile(repoDir, file);
162
+ continue;
163
+ }
164
+ stageReleaseSidePackagePointer(repoDir, file);
165
+ }
52
166
  return {
53
167
  resolved: true,
54
168
  repoDir,
55
169
  targetBranch: STAGING_BRANCH,
56
170
  reconciledFiles: files,
57
- allConflictsWereGeneratedMetadata: true
171
+ allConflictsWereGeneratedMetadata
58
172
  };
59
173
  }
60
174
  function headCommit(repoDir, ref = "HEAD") {
@@ -164,6 +278,93 @@ function remoteBranchExists(repoDir, branchName) {
164
278
  function fetchOrigin(repoDir) {
165
279
  runGit(["fetch", "origin"], { cwd: repoDir, capture: true });
166
280
  }
281
+ function remoteHeadCommit(repoDir, branchName) {
282
+ fetchOrigin(repoDir);
283
+ return runGit(["rev-parse", `origin/${branchName}`], { cwd: repoDir, capture: true }).trim();
284
+ }
285
+ function pushCommitToBranch(repoDir, commitSha, branchName, { forceWithLease = false } = {}) {
286
+ ensureWritableOrigin(repoDir);
287
+ const args = forceWithLease ? ["push", "--force-with-lease", "origin", `${commitSha}:refs/heads/${branchName}`] : ["push", "origin", `${commitSha}:refs/heads/${branchName}`];
288
+ runGit(args, { cwd: repoDir });
289
+ }
290
+ function mergeBranchDownIntoFeature(repoDir, input) {
291
+ const sourceBranch = input.sourceBranch ?? STAGING_BRANCH;
292
+ assertCleanWorktree(repoDir);
293
+ fetchOrigin(repoDir);
294
+ if (!branchExists(repoDir, input.featureBranch)) {
295
+ if (!remoteBranchExists(repoDir, input.featureBranch)) {
296
+ throw new Error(`Feature branch "${input.featureBranch}" does not exist locally or on origin.`);
297
+ }
298
+ runGit(["branch", input.featureBranch, `origin/${input.featureBranch}`], { cwd: repoDir });
299
+ }
300
+ checkoutBranch(repoDir, input.featureBranch);
301
+ const beforeHead = headCommit(repoDir);
302
+ const sourceHead = remoteBranchExists(repoDir, sourceBranch) ? remoteHeadCommit(repoDir, sourceBranch) : null;
303
+ if (!sourceHead) {
304
+ throw new Error(`Source branch "${sourceBranch}" does not exist on origin.`);
305
+ }
306
+ let generatedMetadataReconciliation = null;
307
+ try {
308
+ runGit(["merge", "--no-ff", `origin/${sourceBranch}`, "-m", input.message], { cwd: repoDir, capture: true });
309
+ } catch (error) {
310
+ const reconciliation = input.allowGeneratedMetadataAutoResolution === false ? { resolved: false } : resolveGeneratedPackageMetadataConflicts(repoDir);
311
+ if (!reconciliation.resolved) {
312
+ const report = collectMergeConflictReport(repoDir);
313
+ const conflictError = new Error(formatMergeConflictReport(report, repoDir, sourceBranch));
314
+ Object.assign(conflictError, {
315
+ cause: error,
316
+ mergeConflictReport: report,
317
+ code: "conflict_resolution_required"
318
+ });
319
+ throw conflictError;
320
+ }
321
+ generatedMetadataReconciliation = reconciliation;
322
+ if (repoHasStagedChanges(repoDir)) {
323
+ runGit(["commit", "-m", input.message], { cwd: repoDir });
324
+ }
325
+ }
326
+ const afterHead = headCommit(repoDir);
327
+ const merged = beforeHead !== afterHead;
328
+ if (merged) {
329
+ pushBranch(repoDir, input.featureBranch);
330
+ }
331
+ return {
332
+ repoDir,
333
+ featureBranch: input.featureBranch,
334
+ sourceBranch,
335
+ beforeHead,
336
+ sourceHead,
337
+ afterHead,
338
+ merged,
339
+ pushed: merged,
340
+ generatedMetadataReconciliation
341
+ };
342
+ }
343
+ function promoteCommitToBranchWithExpectedHead(repoDir, input) {
344
+ const targetBranch = input.targetBranch ?? STAGING_BRANCH;
345
+ fetchOrigin(repoDir);
346
+ const actualBefore = remoteBranchExists(repoDir, targetBranch) ? remoteHeadCommit(repoDir, targetBranch) : null;
347
+ if (actualBefore !== input.expectedBefore) {
348
+ throw new Error(`Refusing to promote ${targetBranch}; origin/${targetBranch} moved from ${input.expectedBefore ?? "(missing)"} to ${actualBefore ?? "(missing)"}.`);
349
+ }
350
+ ensureWritableOrigin(repoDir);
351
+ const lease = actualBefore ? `--force-with-lease=refs/heads/${targetBranch}:${actualBefore}` : "--force-with-lease";
352
+ runGit(["push", lease, "origin", `${input.commitSha}:refs/heads/${targetBranch}`], { cwd: repoDir });
353
+ fetchOrigin(repoDir);
354
+ const verifiedHead = remoteHeadCommit(repoDir, targetBranch);
355
+ if (verifiedHead !== input.commitSha) {
356
+ throw new Error(`Promotion verification failed for ${targetBranch}; expected ${input.commitSha}, observed ${verifiedHead}.`);
357
+ }
358
+ return {
359
+ repoDir,
360
+ targetBranch,
361
+ expectedBefore: input.expectedBefore,
362
+ actualBefore,
363
+ commitSha: input.commitSha,
364
+ pushed: true,
365
+ verified: true
366
+ };
367
+ }
167
368
  function ensureLocalBranchTracking(repoDir, branchName) {
168
369
  if (branchExists(repoDir, branchName)) {
169
370
  return;
@@ -273,6 +474,27 @@ function pushBranch(repoDir, branchName, { setUpstream = false } = {}) {
273
474
  const args = setUpstream ? ["push", "-u", "origin", branchName] : ["push", "origin", branchName];
274
475
  runGit(args, { cwd: repoDir });
275
476
  }
477
+ function taskTagSlug(branchName) {
478
+ return String(branchName ?? "").normalize("NFKD").replace(/[\u0300-\u036f]/gu, "").replace(/[^a-z0-9._-]+/giu, "-").toLowerCase().replace(/-+/gu, "-").replace(/^-|-$/gu, "") || "task";
479
+ }
480
+ function createDeprecatedTaskTag(repoDir, branchName, reason = "") {
481
+ const head = headCommit(repoDir, branchName);
482
+ const tagName = `deprecated/${taskTagSlug(branchName)}/${head.slice(0, 12)}`;
483
+ const message = [
484
+ `Deprecated task branch ${branchName}`,
485
+ String(reason ?? "").trim()
486
+ ].filter(Boolean).join("\n\n");
487
+ runGit(["tag", "-a", tagName, head, "-m", message], { cwd: repoDir });
488
+ ensureWritableOrigin(repoDir);
489
+ runGit(["push", "origin", tagName], { cwd: repoDir });
490
+ return {
491
+ repoDir,
492
+ branchName,
493
+ tagName,
494
+ head,
495
+ pushed: true
496
+ };
497
+ }
276
498
  function ensureRemoteBranchFromBase(repoDir, branchName, { baseBranch = PRODUCTION_BRANCH } = {}) {
277
499
  fetchOrigin(repoDir);
278
500
  if (remoteBranchExists(repoDir, branchName)) {
@@ -331,7 +553,15 @@ function squashMergeBranchIntoStaging(cwd, featureBranch, message, { pushTarget
331
553
  } catch (error) {
332
554
  const reconciliation = resolveGeneratedPackageMetadataConflicts(repoDir);
333
555
  if (!reconciliation.resolved) {
334
- throw error;
556
+ const report = collectMergeConflictReport(repoDir);
557
+ const mergeAborted = abortInProgressMerge(repoDir);
558
+ const conflictError = new Error(formatMergeConflictReport(report, repoDir, STAGING_BRANCH));
559
+ Object.assign(conflictError, {
560
+ cause: error,
561
+ mergeAborted,
562
+ mergeConflictReport: report
563
+ });
564
+ throw conflictError;
335
565
  }
336
566
  if (reportGeneratedMetadataReconciliation) {
337
567
  console.log(`Resolving generated package metadata reconciliation for ${reconciliation.reconciledFiles.join(", ")}.`);
@@ -407,18 +637,6 @@ function listTaskBranches(repoDir) {
407
637
  };
408
638
  });
409
639
  }
410
- function taskTagSlug(branchName) {
411
- return String(branchName).trim().replaceAll("\\", "/").replace(/[^A-Za-z0-9._/-]+/g, "-").replace(/\/+/g, "-").replace(/^-+|-+$/g, "") || "task";
412
- }
413
- function createDeprecatedTaskTag(repoDir, branchName, message) {
414
- const head = runGit(["rev-parse", branchName], { cwd: repoDir, capture: true }).trim();
415
- const shortSha = head.slice(0, 12);
416
- const tagName = `deprecated/${taskTagSlug(branchName)}/${shortSha}`;
417
- runGit(["tag", "-a", tagName, head, "-m", message], { cwd: repoDir });
418
- ensureWritableOrigin(repoDir);
419
- runGit(["push", "origin", tagName], { cwd: repoDir, capture: true });
420
- return { tagName, head };
421
- }
422
640
  function waitForStagingAutomation(repoDir) {
423
641
  if (process.env.TREESEED_STAGE_WAIT_MODE === "skip") {
424
642
  return { status: "skipped", reason: "disabled" };
@@ -506,14 +724,18 @@ export {
506
724
  inspectDetachedHeadRepair,
507
725
  isTaskBranch,
508
726
  listTaskBranches,
727
+ mergeBranchDownIntoFeature,
509
728
  mergeBranchIntoTarget,
510
729
  mergeCurrentBranchIntoStaging,
511
730
  mergeStagingIntoMain,
512
731
  prepareReleaseBranches,
732
+ promoteCommitToBranchWithExpectedHead,
513
733
  pushBranch,
734
+ pushCommitToBranch,
514
735
  pushHeadToBranch,
515
736
  reattachDetachedHeadIfSafe,
516
737
  remoteBranchExists,
738
+ remoteHeadCommit,
517
739
  squashMergeBranchIntoStaging,
518
740
  syncBranchWithOrigin,
519
741
  taskTagSlug,
@@ -1,4 +1,4 @@
1
- import { type GitHubApiClient, type GitHubWorkflowProgressEvent } from './github-api.ts';
1
+ import { type GitHubApiClient, type GitHubWorkflowProgressEvent } from './github-api.js';
2
2
  export type GitHubActionsWorkflowState = 'success' | 'failure' | 'pending' | 'missing' | 'not_pushed' | 'error';
3
3
  export type GitHubActionsVerificationTarget = {
4
4
  name: string;
@@ -8,6 +8,7 @@ export type GitHubActionsVerificationTarget = {
8
8
  headSha: string | null;
9
9
  workflows: string[];
10
10
  kind?: 'root' | 'package';
11
+ missingIsFailure?: boolean;
11
12
  };
12
13
  export type GitHubActionsWorkflowGate = {
13
14
  name: string;
@@ -68,6 +69,7 @@ export type GitHubActionsRepositoryInspection = {
68
69
  state: GitHubActionsWorkflowState;
69
70
  message: string | null;
70
71
  workflows: GitHubActionsWorkflowRunInspection[];
72
+ missingIsFailure: boolean;
71
73
  };
72
74
  export type GitHubActionsVerificationFailure = {
73
75
  type: 'repository' | 'workflow' | 'job';
@@ -278,6 +278,9 @@ function collectFailures(repositories) {
278
278
  failures.push(...workflow.failedJobs.map((job) => jobFailure(repo, workflow, job)));
279
279
  continue;
280
280
  }
281
+ if (workflow.state === "missing" && !repo.missingIsFailure) {
282
+ continue;
283
+ }
281
284
  if (workflow.state === "failure" || workflow.state === "missing" || workflow.state === "error") {
282
285
  failures.push(workflowFailure(repo, workflow));
283
286
  }
@@ -312,9 +315,11 @@ async function inspectTarget(client, target, options) {
312
315
  remoteSynced: false,
313
316
  state: "error",
314
317
  message: "Repository, branch, or head SHA is unavailable.",
315
- workflows: []
318
+ workflows: [],
319
+ missingIsFailure: target.missingIsFailure ?? true
316
320
  };
317
321
  }
322
+ const missingIsFailure = target.missingIsFailure ?? true;
318
323
  try {
319
324
  const remoteHeadSha = await resolveRemoteBranchHead(client, target.repository, target.branch);
320
325
  if (remoteHeadSha !== target.headSha) {
@@ -329,6 +334,7 @@ async function inspectTarget(client, target, options) {
329
334
  remoteSynced: false,
330
335
  state: "not_pushed",
331
336
  message: `Local HEAD ${target.headSha.slice(0, 12)} does not match origin/${target.branch} ${remoteHeadSha.slice(0, 12)}.`,
337
+ missingIsFailure,
332
338
  workflows: target.workflows.map((workflow) => ({
333
339
  workflow,
334
340
  state: "not_pushed",
@@ -359,7 +365,8 @@ async function inspectTarget(client, target, options) {
359
365
  remoteSynced: true,
360
366
  state: aggregateWorkflowState(workflows.map((workflow) => workflow.state)),
361
367
  message: null,
362
- workflows
368
+ workflows,
369
+ missingIsFailure
363
370
  };
364
371
  } catch (error) {
365
372
  return {
@@ -373,7 +380,8 @@ async function inspectTarget(client, target, options) {
373
380
  remoteSynced: false,
374
381
  state: "error",
375
382
  message: error instanceof Error ? error.message : String(error),
376
- workflows: []
383
+ workflows: [],
384
+ missingIsFailure
377
385
  };
378
386
  }
379
387
  }
@@ -3,6 +3,7 @@ import { spawnSync } from "node:child_process";
3
3
  import { createRequire } from "node:module";
4
4
  import { Octokit } from "octokit";
5
5
  import { createTreeseedManagedToolEnv, resolveTreeseedToolBinary } from "../../managed-dependencies.js";
6
+ import { resolveTreeseedGitHubToken } from "../../service-credentials.js";
6
7
  const require2 = createRequire(import.meta.url);
7
8
  const sodium = require2("libsodium-wrappers");
8
9
  const DEFAULT_GITHUB_API_TIMEOUT_MS = 6e4;
@@ -15,7 +16,7 @@ function configuredEnvValue(env, key) {
15
16
  return typeof value === "string" && value.trim() ? value.trim() : "";
16
17
  }
17
18
  function resolveGitHubApiToken(env = process.env) {
18
- return configuredEnvValue(env, "GH_TOKEN") || configuredEnvValue(env, "GITHUB_TOKEN");
19
+ return resolveTreeseedGitHubToken(env);
19
20
  }
20
21
  function parseGitHubRepositorySlug(value) {
21
22
  const normalized = String(value ?? "").trim().replace(/\.git$/u, "");
@@ -108,7 +109,7 @@ function createGitHubApiClient({
108
109
  } = {}) {
109
110
  const token = resolveGitHubApiToken(env);
110
111
  if (!token) {
111
- throw new Error("Configure GH_TOKEN before using Treeseed GitHub automation.");
112
+ throw new Error("Configure TREESEED_GITHUB_TOKEN before using Treeseed GitHub automation.");
112
113
  }
113
114
  return new Octokit({
114
115
  auth: token,
@@ -466,7 +467,7 @@ function upsertGitHubRepositoryVariableWithGhCli(repository, name, value, {
466
467
  } = {}) {
467
468
  const token = resolveGitHubApiToken(env);
468
469
  if (!token) {
469
- throw new Error("Configure GH_TOKEN before using Treeseed GitHub automation.");
470
+ throw new Error("Configure TREESEED_GITHUB_TOKEN before using Treeseed GitHub automation.");
470
471
  }
471
472
  const { owner, name: repo } = typeof repository === "string" ? parseGitHubRepositorySlug(repository) : repository;
472
473
  const ghEnv = {
@@ -742,6 +743,8 @@ async function waitForGitHubWorkflowRunCompletion(repository, {
742
743
  const startedAt = Date.now();
743
744
  let dispatchedMissingRun = false;
744
745
  let lastProgress = null;
746
+ let monitorErrorStartedAt = null;
747
+ let lastMonitorError = null;
745
748
  const emitProgress = (type, run = null, jobs = []) => {
746
749
  const completedJobs = jobs.filter((job) => job.status === "completed");
747
750
  const failedJobs = jobs.filter((job) => job.conclusion && job.conclusion !== "success" && job.conclusion !== "skipped");
@@ -773,6 +776,8 @@ async function waitForGitHubWorkflowRunCompletion(repository, {
773
776
  workflow_id: workflow,
774
777
  per_page: 20
775
778
  });
779
+ monitorErrorStartedAt = null;
780
+ lastMonitorError = null;
776
781
  const match = listed.data.workflow_runs.map((run) => normalizeWorkflowRun(run)).find((run) => (!headSha || run.headSha === headSha) && (!branch || run.headBranch === branch));
777
782
  if (!match?.id) {
778
783
  emitProgress("waiting");
@@ -802,6 +807,8 @@ async function waitForGitHubWorkflowRunCompletion(repository, {
802
807
  repo: name,
803
808
  run_id: match.id
804
809
  });
810
+ monitorErrorStartedAt = null;
811
+ lastMonitorError = null;
805
812
  const normalized = normalizeWorkflowRun(current.data);
806
813
  const progressJobs = await listWorkflowJobsForProgress(client, owner, name, match.id);
807
814
  if (normalized.status === "completed") {
@@ -826,11 +833,20 @@ async function waitForGitHubWorkflowRunCompletion(repository, {
826
833
  await sleep(pollSeconds * 1e3);
827
834
  }
828
835
  } catch (error) {
829
- throw normalizeGitHubApiError(error, `Unable to monitor GitHub workflow ${workflow} in ${owner}/${name}`);
836
+ const normalizedError = normalizeGitHubApiError(error, `Unable to monitor GitHub workflow ${workflow} in ${owner}/${name}`);
837
+ lastMonitorError = normalizedError;
838
+ monitorErrorStartedAt ??= Date.now();
839
+ const toleratedMonitorErrorSeconds = Math.max(pollSeconds * 2, 120);
840
+ if (Date.now() - monitorErrorStartedAt < toleratedMonitorErrorSeconds * 1e3) {
841
+ await sleep(pollSeconds * 1e3);
842
+ continue;
843
+ }
844
+ throw normalizedError;
830
845
  }
831
846
  }
832
847
  const lastState = lastProgress ? ` Last known state: run ${lastProgress.runId ?? "(not created)"} ${lastProgress.status ?? "waiting"}${lastProgress.conclusion ? `/${lastProgress.conclusion}` : ""}${lastProgress.url ? ` ${lastProgress.url}` : ""}.` : "";
833
- throw new Error(`Timed out waiting for GitHub workflow ${workflow} in ${owner}/${name}.${lastState}`);
848
+ const monitorErrorState = lastMonitorError ? ` Last monitor error: ${lastMonitorError.message}` : "";
849
+ throw new Error(`Timed out waiting for GitHub workflow ${workflow} in ${owner}/${name}.${lastState}${monitorErrorState}`);
834
850
  }
835
851
  async function ensureGitHubBranchFromBase(repository, branch, {
836
852
  baseBranch = "main",
@@ -61,7 +61,7 @@ export declare function ensureGitHubBootstrapRepository(tenantRoot: string, { va
61
61
  }>;
62
62
  export declare function createGitHubRepository(input: any, { env }?: {
63
63
  env?: NodeJS.ProcessEnv | undefined;
64
- }): Promise<import("./github-api.ts").GitHubRepositorySummary>;
64
+ }): Promise<import("./github-api.js").GitHubRepositorySummary>;
65
65
  export declare function initializeGitHubRepositoryWorkingTree(cwd: any, repository: any, { defaultBranch, createStaging, commitMessage, remoteName, push, forcePush, }?: {
66
66
  defaultBranch?: string | undefined;
67
67
  createStaging?: boolean | undefined;
@@ -225,6 +225,6 @@ export declare function waitForGitHubWorkflowCompletion(tenantRoot: any, { repos
225
225
  updatedAt: string | null;
226
226
  conclusion: string | null;
227
227
  url: string | null;
228
- jobs: import("./github-api.ts").GitHubWorkflowJobSummary[];
229
- failedJobs: import("./github-api.ts").GitHubWorkflowJobSummary[];
228
+ jobs: import("./github-api.js").GitHubWorkflowJobSummary[];
229
+ failedJobs: import("./github-api.js").GitHubWorkflowJobSummary[];
230
230
  }>;
@@ -1,6 +1,6 @@
1
1
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
2
  import { dirname, relative, resolve } from "node:path";
3
- import { spawnSync } from "node:child_process";
3
+ import { runTreeseedGit } from "./git-runner.js";
4
4
  import { resolveTreeseedEnvironmentRegistry } from "../../platform/environment.js";
5
5
  import { packageRoot, loadCliDeployConfig } from "./runtime-tools.js";
6
6
  import {
@@ -18,6 +18,7 @@ import {
18
18
  upsertGitHubRepositoryVariable,
19
19
  waitForGitHubWorkflowRunCompletion
20
20
  } from "./github-api.js";
21
+ import { resolveTreeseedGitHubToken } from "../../service-credentials.js";
21
22
  function envOrNull(key) {
22
23
  const value = process.env[key];
23
24
  return typeof value === "string" && value.length > 0 ? value : null;
@@ -43,19 +44,24 @@ function parseGitHubRepositoryFromRemote(remoteUrl) {
43
44
  return null;
44
45
  }
45
46
  function runGit(args, { cwd, allowFailure = false, capture = true } = {}) {
46
- const result = spawnSync("git", args, {
47
+ const mutating = /^(add|commit|checkout|switch|merge|tag|push|fetch|worktree|submodule|reset|clean|restore|branch)$/u.test(args[0] ?? "");
48
+ const result = runTreeseedGit(args, {
47
49
  cwd,
48
- stdio: capture ? "pipe" : "inherit",
49
- encoding: "utf8"
50
+ mode: mutating ? "mutate" : "read",
51
+ allowFailure
50
52
  });
53
+ if (!capture && result.stdout.trim()) process.stdout.write(result.stdout);
54
+ if (!capture && result.stderr.trim()) process.stderr.write(result.stderr);
51
55
  if (result.status !== 0 && !allowFailure) {
52
56
  if (args[0] === "push" && !args.includes("--force")) {
53
57
  const retryArgs = ["push", "--force", ...args.slice(1)];
54
- const retry = spawnSync("git", retryArgs, {
58
+ const retry = runTreeseedGit(retryArgs, {
55
59
  cwd,
56
- stdio: capture ? "pipe" : "inherit",
57
- encoding: "utf8"
60
+ mode: "mutate",
61
+ allowFailure: true
58
62
  });
63
+ if (!capture && retry.stdout.trim()) process.stdout.write(retry.stdout);
64
+ if (!capture && retry.stderr.trim()) process.stderr.write(retry.stderr);
59
65
  if (retry.status === 0) return retry;
60
66
  const retryDetail = retry.stderr?.trim() || retry.stdout?.trim();
61
67
  throw new Error(`git ${retryArgs.join(" ")} failed${retryDetail ? `: ${retryDetail}` : ""}`);
@@ -65,14 +71,6 @@ function runGit(args, { cwd, allowFailure = false, capture = true } = {}) {
65
71
  }
66
72
  return result;
67
73
  }
68
- function sleepSeconds(seconds) {
69
- if (!Number.isFinite(seconds) || seconds <= 0) {
70
- return;
71
- }
72
- spawnSync("sleep", [String(seconds)], {
73
- stdio: "ignore"
74
- });
75
- }
76
74
  function resolveGitHubRemoteUrls(owner, name) {
77
75
  const normalizedOwner = slugifySegment(owner, "owner");
78
76
  const normalizedName = slugifySegment(name, "repo");
@@ -185,8 +183,7 @@ async function ensureGitHubBootstrapRepository(tenantRoot, {
185
183
  onProgress?.(`[local][github][repo] Preparing ${slug} from ${target.source}...`);
186
184
  const client = createGitHubApiClient({
187
185
  env: {
188
- GH_TOKEN: configuredValue(values, "GH_TOKEN") || configuredValue(values, "GITHUB_TOKEN"),
189
- GITHUB_TOKEN: configuredValue(values, "GH_TOKEN") || configuredValue(values, "GITHUB_TOKEN")
186
+ TREESEED_GITHUB_TOKEN: resolveTreeseedGitHubToken(values)
190
187
  }
191
188
  });
192
189
  const existing = await maybeGetGitHubRepository({ owner: target.owner, name: target.name }, { client });
@@ -295,7 +292,7 @@ function renderTenantWorkflowActionCommand() {
295
292
  'if [[ -n "${TREESEED_WORKFLOW_PROJECT:-}" ]]; then EXTRA_ARGS+=(--project-id "${TREESEED_WORKFLOW_PROJECT}"); fi',
296
293
  'if [[ -n "${TREESEED_WORKFLOW_PREVIEW_ID:-}" ]]; then EXTRA_ARGS+=(--preview-id "${TREESEED_WORKFLOW_PREVIEW_ID}"); fi',
297
294
  "if test -f ./packages/sdk/scripts/tenant-workflow-action.ts; then",
298
- ' node ./packages/sdk/scripts/run-ts.mjs ./packages/sdk/scripts/tenant-workflow-action.ts --action "${TREESEED_WORKFLOW_ACTION}" --environment "${TREESEED_WORKFLOW_ENVIRONMENT}" "${EXTRA_ARGS[@]}"',
295
+ ' tsx ./packages/sdk/scripts/tenant-workflow-action.ts --action "${TREESEED_WORKFLOW_ACTION}" --environment "${TREESEED_WORKFLOW_ENVIRONMENT}" "${EXTRA_ARGS[@]}"',
299
296
  "elif test -f ./node_modules/@treeseed/sdk/dist/scripts/tenant-workflow-action.js; then",
300
297
  ' node ./node_modules/@treeseed/sdk/dist/scripts/tenant-workflow-action.js --action "${TREESEED_WORKFLOW_ACTION}" --environment "${TREESEED_WORKFLOW_ENVIRONMENT}" "${EXTRA_ARGS[@]}"',
301
298
  "else",
@@ -1,3 +1,4 @@
1
+ import { resolveTreeseedGitHubToken } from "../../service-credentials.js";
1
2
  function cleanRepositorySlug(repository) {
2
3
  const raw = String(repository ?? "").trim().replace(/^https?:\/\/github\.com\//iu, "").replace(/^git@github\.com:/iu, "").replace(/^ssh:\/\/git@github\.com\//iu, "").replace(/\.git$/iu, "").replace(/^\/+|\/+$/gu, "");
3
4
  const [owner, repo, ...extra] = raw.split("/").filter(Boolean);
@@ -32,7 +33,7 @@ function resolveGitHubCredentialForRepository(repository, {
32
33
  token: repositoryToken
33
34
  };
34
35
  }
35
- const fallbackToken = configuredValue(values, "GH_TOKEN") || configuredValue(values, "GITHUB_TOKEN") || configuredValue(env, "GH_TOKEN") || configuredValue(env, "GITHUB_TOKEN");
36
+ const fallbackToken = resolveTreeseedGitHubToken(values ?? {}) || resolveTreeseedGitHubToken(env);
36
37
  if (fallbackToken) {
37
38
  return {
38
39
  repository: normalizedRepository,
@@ -1,7 +1,7 @@
1
1
  export type TreeseedHostedServiceCheckStatus = 'passed' | 'failed' | 'skipped' | 'warning';
2
2
  export type TreeseedHostedServiceTarget = 'local' | 'staging' | 'prod';
3
3
  export type TreeseedHostedServiceProvider = 'cloudflare' | 'railway' | 'http' | 'dns' | 'github';
4
- export type TreeseedHostedServiceType = 'web' | 'api' | 'operationsRunner' | 'treeseedDatabase' | 'customDomain' | 'dnsRecord' | 'githubWorkflow' | 'unknown';
4
+ export type TreeseedHostedServiceType = 'web' | 'api' | 'operationsRunner' | 'capacityProviderManager' | 'capacityProviderRunner' | 'treeseedDatabase' | 'customDomain' | 'dnsRecord' | 'githubWorkflow' | 'unknown';
5
5
  export interface TreeseedHostedServiceCheck {
6
6
  id: string;
7
7
  provider: TreeseedHostedServiceProvider;
@@ -31,13 +31,30 @@ export interface TreeseedObservedRailwayServiceState {
31
31
  projectName?: string | null;
32
32
  environmentName?: string | null;
33
33
  serviceName?: string | null;
34
+ serviceId?: string | null;
34
35
  rootDirectory?: string | null;
35
36
  buildCommand?: string | null;
37
+ dockerfilePath?: string | null;
36
38
  startCommand?: string | null;
37
39
  healthcheckPath?: string | null;
38
40
  healthcheckTimeoutSeconds?: number | null;
39
41
  runtimeMode?: string | null;
42
+ deploymentStatus?: string | null;
43
+ deploymentHealthy?: boolean | null;
44
+ deploymentBranch?: string | null;
45
+ deploymentRepo?: string | null;
46
+ deploymentRootDirectory?: string | null;
47
+ deploymentCommitHash?: string | null;
48
+ deploymentRequiredMountPath?: string | null;
49
+ deploymentVolumeMounts?: string[];
50
+ volumeName?: string | null;
51
+ volumeId?: string | null;
40
52
  volumeMountPath?: string | null;
53
+ volumeServiceId?: string | null;
54
+ volumeEnvironmentId?: string | null;
55
+ volumeState?: string | null;
56
+ volumePendingDeletion?: boolean | null;
57
+ volumeDeletedAt?: string | null;
41
58
  variables?: Record<string, unknown> | string[];
42
59
  secrets?: Record<string, unknown> | string[];
43
60
  health?: 'ready' | 'failed' | 'unknown' | string | null;
@@ -46,6 +63,7 @@ export interface TreeseedHostedServiceCheckOptions {
46
63
  tenantRoot: string;
47
64
  target?: TreeseedHostedServiceTarget;
48
65
  appId?: string;
66
+ serviceKeys?: string[];
49
67
  now?: Date;
50
68
  valuesOverlay?: Record<string, string | undefined>;
51
69
  observedRailwayServices?: Record<string, TreeseedObservedRailwayServiceState | undefined>;