@treeseed/sdk 0.11.0 → 0.12.5

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 +629 -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 +66 -0
  180. package/dist/platform/desired-state.js +1052 -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,4 +1,5 @@
1
- import { loadCliDeployConfig } from "./runtime-tools.js";
1
+ import { loadTreeseedPlatformConfig } from "../../platform/config.js";
2
+ import { resolveTreeseedLaunchEnvironment } from "./config-runtime.js";
2
3
  import {
3
4
  getRailwayServiceInstance,
4
5
  inspectRailwayServiceDeploymentHealth,
@@ -15,9 +16,17 @@ import { discoverTreeseedApplications } from "../../hosting/apps.js";
15
16
  import {
16
17
  collectTreeseedHostedServiceChecks
17
18
  } from "./hosted-service-checks.js";
19
+ const DEFAULT_RETRY_ATTEMPTS = 3;
20
+ const DEFAULT_RETRY_INTERVAL_MS = 1500;
21
+ const DEFAULT_RAILWAY_DEPLOYMENT_SETTLE_ATTEMPTS = 60;
22
+ const DEFAULT_RAILWAY_DEPLOYMENT_SETTLE_INTERVAL_MS = 5e3;
18
23
  function sleep(ms) {
19
24
  return new Promise((resolve) => setTimeout(resolve, ms));
20
25
  }
26
+ function liveCheckErrorMessage(error, fallback) {
27
+ const message = error instanceof Error ? error.message : String(error ?? "");
28
+ return message.trim() || fallback;
29
+ }
21
30
  function normalizeBaseUrl(value) {
22
31
  return typeof value === "string" && value.trim() ? value.trim().replace(/\/+$/u, "") : null;
23
32
  }
@@ -36,8 +45,8 @@ function pagesBranchName(config, target) {
36
45
  return typeof pages[key] === "string" && pages[key].trim() ? pages[key].trim() : fallback;
37
46
  }
38
47
  async function observeHttp(url, options) {
39
- const attempts = Math.max(1, Math.floor(options.retry?.attempts ?? 3));
40
- const intervalMs = Math.max(0, Math.floor(options.retry?.intervalMs ?? 1500));
48
+ const attempts = Math.max(1, Math.floor(options.retry?.attempts ?? DEFAULT_RETRY_ATTEMPTS));
49
+ const intervalMs = Math.max(0, Math.floor(options.retry?.intervalMs ?? DEFAULT_RETRY_INTERVAL_MS));
41
50
  const timeoutMs = Math.max(1e3, Math.floor(options.timeoutMs ?? 1e4));
42
51
  let lastError = "";
43
52
  for (let attempt = 0; attempt < attempts; attempt += 1) {
@@ -60,8 +69,8 @@ async function observeHttp(url, options) {
60
69
  return { ok: false, error: lastError || "HTTP request failed." };
61
70
  }
62
71
  async function inspectRailwayServiceDeploymentHealthWithRetry(input) {
63
- const attempts = Math.max(1, Math.floor(input.options.retry?.attempts ?? 3));
64
- const intervalMs = Math.max(0, Math.floor(input.options.retry?.intervalMs ?? 1500));
72
+ const attempts = Math.max(1, Math.floor(input.options.retry?.attempts ?? DEFAULT_RAILWAY_DEPLOYMENT_SETTLE_ATTEMPTS));
73
+ const intervalMs = Math.max(0, Math.floor(input.options.retry?.intervalMs ?? DEFAULT_RAILWAY_DEPLOYMENT_SETTLE_INTERVAL_MS));
65
74
  let lastDeployment = null;
66
75
  let lastError = null;
67
76
  for (let attempt = 0; attempt < attempts; attempt += 1) {
@@ -92,26 +101,57 @@ function findByName(items, nameOrId) {
92
101
  function indexedName(baseName, index) {
93
102
  return `${baseName.replace(/-\d+$/u, "")}-${String(Math.max(1, index)).padStart(2, "0")}`;
94
103
  }
104
+ function isActiveRailwayVolumeInstance(instance) {
105
+ const state = String(instance.state ?? "READY").toUpperCase();
106
+ return instance.isPendingDeletion !== true && !(typeof instance.deletedAt === "string" && instance.deletedAt.trim()) && state !== "DELETING" && state !== "DELETED";
107
+ }
95
108
  function activeRailwayVolumeInstances(volume) {
96
109
  const instances = Array.isArray(volume.instances) ? volume.instances : [];
97
- return instances.filter((instance) => {
98
- const state = String(instance.state ?? "READY").toUpperCase();
99
- return state !== "DELETING" && state !== "DELETED";
100
- });
110
+ return instances.filter(isActiveRailwayVolumeInstance);
101
111
  }
102
112
  function railwayVolumeInstanceStates(volume) {
103
- const states = (Array.isArray(volume.instances) ? volume.instances : []).map((instance) => String(instance.state ?? "READY").trim().toUpperCase()).filter(Boolean);
113
+ const states = (Array.isArray(volume.instances) ? volume.instances : []).map((instance) => {
114
+ const state = String(instance.state ?? "READY").trim().toUpperCase();
115
+ return `${state}${instance.isPendingDeletion === true ? ":PENDING_DELETION" : ""}${instance.deletedAt ? `:DELETED_AT=${instance.deletedAt}` : ""}`;
116
+ }).filter(Boolean);
104
117
  return states.length > 0 ? [...new Set(states)].join(",") : "none";
105
118
  }
119
+ function isRetainedDetachedRailwayVolume(value) {
120
+ return String(value ?? "").trim().startsWith("retained-");
121
+ }
122
+ function selectedServiceKeySet(options) {
123
+ return new Set((options.serviceKeys ?? []).map((key) => key.trim()).filter(Boolean));
124
+ }
125
+ function serviceIsSelected(selected, serviceKey) {
126
+ return selected.size === 0 || selected.has(serviceKey);
127
+ }
128
+ function resolveLiveProviderEnv(options) {
129
+ let launchValues = {};
130
+ try {
131
+ launchValues = resolveTreeseedLaunchEnvironment({
132
+ tenantRoot: options.tenantRoot,
133
+ scope: options.target,
134
+ baseEnv: { ...process.env, ...options.env ?? {} }
135
+ });
136
+ } catch {
137
+ launchValues = {};
138
+ }
139
+ return {
140
+ ...process.env,
141
+ ...launchValues,
142
+ ...options.env ?? {}
143
+ };
144
+ }
106
145
  async function collectRailwayObservations(options) {
107
146
  const observed = {};
108
147
  const issues = [];
109
148
  const inspectedVolumeScopes = /* @__PURE__ */ new Set();
110
149
  const inspectedRunnerScopes = /* @__PURE__ */ new Set();
150
+ const selectedServiceKeys = selectedServiceKeySet(options);
111
151
  try {
112
152
  const workspace = await resolveRailwayWorkspaceContext({ env: options.env, fetchImpl: options.fetchImpl });
113
153
  const projects = await listRailwayProjects({ workspaceId: workspace.id, env: options.env, fetchImpl: options.fetchImpl });
114
- const configuredServices = configuredRailwayServices(options.tenantRoot, options.target).filter((entry) => !options.appId || entry.application?.id === options.appId);
154
+ const configuredServices = configuredRailwayServices(options.tenantRoot, options.target).filter((entry) => !options.appId || entry.application?.id === options.appId).filter((entry) => serviceIsSelected(selectedServiceKeys, entry.key));
115
155
  for (const service of configuredServices) {
116
156
  const project = service.projectId ? findByName(projects, service.projectId) : findByName(projects, service.projectName);
117
157
  if (!project?.id) {
@@ -128,12 +168,15 @@ async function collectRailwayObservations(options) {
128
168
  if (!inspectedVolumeScopes.has(volumeScope)) {
129
169
  inspectedVolumeScopes.add(volumeScope);
130
170
  const volumes2 = await listRailwayVolumes({ projectId: project.id, env: options.env, fetchImpl: options.fetchImpl }).catch(() => []);
131
- for (const volume2 of volumes2) {
132
- const detachedPostgresInstances = activeRailwayVolumeInstances(volume2).filter(
171
+ for (const volume of volumes2) {
172
+ if (isRetainedDetachedRailwayVolume(volume.name)) {
173
+ continue;
174
+ }
175
+ const detachedPostgresInstances = activeRailwayVolumeInstances(volume).filter(
133
176
  (instance2) => instance2.environmentId === environment.id && instance2.mountPath === "/var/lib/postgresql/data" && !instance2.serviceId
134
177
  );
135
178
  if (detachedPostgresInstances.length > 0) {
136
- issues.push(`${volume2.name ?? volume2.id}: detached PostgreSQL volume remains in Railway project ${project.name} (states=${railwayVolumeInstanceStates(volume2)}).`);
179
+ issues.push(`${volume.name ?? volume.id}: detached PostgreSQL volume remains in Railway project ${project.name} (states=${railwayVolumeInstanceStates(volume)}).`);
137
180
  }
138
181
  }
139
182
  }
@@ -167,81 +210,123 @@ async function collectRailwayObservations(options) {
167
210
  listRailwayVariables({ projectId: project.id, environmentId: environment.id, serviceId: railwayService.id, env: options.env, fetchImpl: options.fetchImpl }).catch(() => ({})),
168
211
  listRailwayVolumes({ projectId: project.id, env: options.env, fetchImpl: options.fetchImpl }).catch(() => [])
169
212
  ]);
170
- const volume = Array.isArray(volumes) ? volumes.flatMap((entry) => Array.isArray(entry.instances) ? entry.instances : Array.isArray(entry.volumeInstances) ? entry.volumeInstances : []).find((entry) => entry?.serviceId === railwayService.id && entry?.environmentId === environment.id) : null;
213
+ const mountedVolume = Array.isArray(volumes) ? volumes.find((entry) => {
214
+ const instances = Array.isArray(entry.instances) ? entry.instances : Array.isArray(entry.volumeInstances) ? entry.volumeInstances : [];
215
+ return instances.some(
216
+ (instance2) => instance2?.serviceId === railwayService.id && instance2?.environmentId === environment.id && (!service.volumeMountPath || instance2?.mountPath === service.volumeMountPath) && isActiveRailwayVolumeInstance(instance2)
217
+ );
218
+ }) ?? null : null;
219
+ const volumeInstance = mountedVolume ? (Array.isArray(mountedVolume.instances) ? mountedVolume.instances : Array.isArray(mountedVolume.volumeInstances) ? mountedVolume.volumeInstances : []).find(
220
+ (instance2) => instance2?.serviceId === railwayService.id && instance2?.environmentId === environment.id && (!service.volumeMountPath || instance2?.mountPath === service.volumeMountPath) && isActiveRailwayVolumeInstance(instance2)
221
+ ) ?? null : null;
171
222
  const variableKeys = Object.keys(variables ?? {});
223
+ const deployment = await inspectRailwayServiceDeploymentHealthWithRetry({
224
+ serviceId: railwayService.id,
225
+ environmentId: environment.id,
226
+ options
227
+ }).catch((error) => ({
228
+ ok: false,
229
+ status: null,
230
+ message: error instanceof Error ? error.message : String(error ?? "Unable to inspect Railway deployment health.")
231
+ }));
232
+ if (!deployment.ok) {
233
+ issues.push(`${service.serviceName}: latest Railway deployment is not healthy. ${deployment.message}`);
234
+ }
235
+ if (service.volumeMountPath && !volumeInstance) {
236
+ issues.push(`${service.serviceName}: Railway volume is not mounted at ${service.volumeMountPath}.`);
237
+ }
172
238
  observed[service.serviceName] = {
173
239
  projectName: project.name,
174
240
  environmentName: environment.name,
175
241
  serviceName: railwayService.name,
242
+ serviceId: railwayService.id,
176
243
  rootDirectory: instance.rootDirectory,
177
244
  buildCommand: instance.buildCommand,
245
+ dockerfilePath: instance.dockerfilePath,
178
246
  startCommand: instance.startCommand,
179
247
  healthcheckPath: instance.healthcheckPath,
180
248
  healthcheckTimeoutSeconds: instance.healthcheckTimeoutSeconds,
181
249
  runtimeMode: service.runtimeMode ?? instance.runtimeMode,
182
- volumeMountPath: volume?.mountPath ?? null,
250
+ deploymentStatus: deployment.status,
251
+ deploymentHealthy: deployment.ok,
252
+ deploymentBranch: deployment.branch ?? null,
253
+ deploymentRepo: deployment.repo ?? null,
254
+ deploymentRootDirectory: deployment.rootDirectory ?? null,
255
+ deploymentCommitHash: deployment.commitHash ?? null,
256
+ deploymentRequiredMountPath: deployment.requiredMountPath ?? null,
257
+ deploymentVolumeMounts: deployment.volumeMounts ?? [],
258
+ volumeName: mountedVolume?.name ?? null,
259
+ volumeId: mountedVolume?.id ?? null,
260
+ volumeMountPath: volumeInstance?.mountPath ?? null,
261
+ volumeServiceId: volumeInstance?.serviceId ?? null,
262
+ volumeEnvironmentId: volumeInstance?.environmentId ?? null,
263
+ volumeState: volumeInstance?.state ?? null,
264
+ volumePendingDeletion: volumeInstance?.isPendingDeletion ?? null,
265
+ volumeDeletedAt: volumeInstance?.deletedAt ?? null,
183
266
  variables: variableKeys,
184
267
  secrets: variableKeys,
185
268
  health: "unknown"
186
269
  };
187
270
  }
188
- const deployConfig = loadCliDeployConfig(options.tenantRoot);
189
- const appConfigs = [
190
- ...!options.appId || options.appId === "web" ? [deployConfig] : [],
191
- ...discoverTreeseedApplications(options.tenantRoot).filter((application) => application.id === "api" && (!options.appId || options.appId === "api")).map((application) => application.config)
192
- ];
193
- for (const config of appConfigs) {
194
- const nodePool = config.publicTreeDxFederation?.railway?.nodePool;
195
- if (!nodePool && config.hosting?.kind !== "treeseed_control_plane") continue;
196
- const bootstrapCount = Math.max(1, Number.parseInt(String(nodePool?.bootstrapCount ?? 1), 10) || 1);
197
- const projectName = config.slug ?? "treeseed-api";
198
- const environmentName = normalizeRailwayEnvironmentName(options.target) || options.target;
199
- const project = findByName(projects, projectName);
200
- if (!project?.id) {
201
- issues.push(`public-treedx: Railway project ${projectName} was not found.`);
202
- continue;
203
- }
204
- const environments = await listRailwayEnvironments({ projectId: project.id, env: options.env, fetchImpl: options.fetchImpl });
205
- const environment = findByName(environments, environmentName);
206
- if (!environment?.id) {
207
- issues.push(`public-treedx: Railway environment ${environmentName} was not found.`);
208
- continue;
209
- }
210
- const [services, volumes] = await Promise.all([
211
- listRailwayServices({ projectId: project.id, env: options.env, fetchImpl: options.fetchImpl }),
212
- listRailwayVolumes({ projectId: project.id, env: options.env, fetchImpl: options.fetchImpl }).catch(() => [])
213
- ]);
214
- for (let index = 1; index <= bootstrapCount; index += 1) {
215
- const serviceName = indexedName("public-treedx-node", index);
216
- const volumeName = `${serviceName}-volume`;
217
- const configuredNode = Array.isArray(config.services) ? config.services.find((service2) => service2?.id === serviceName || service2?.name === serviceName) : null;
218
- const volumeMountPath = typeof configuredNode?.volumeMountPath === "string" && configuredNode.volumeMountPath.trim() ? configuredNode.volumeMountPath.trim() : "/data";
219
- const service = findByName(services, serviceName);
220
- if (!service?.id) {
221
- issues.push(`${serviceName}: public TreeDX Railway service was not found.`);
271
+ if (selectedServiceKeys.size === 0) {
272
+ const deployConfig = loadTreeseedPlatformConfig({ tenantRoot: options.tenantRoot, environment: options.target, env: process.env }).deployConfig;
273
+ const appConfigs = [
274
+ ...!options.appId || options.appId === "web" ? [deployConfig] : [],
275
+ ...discoverTreeseedApplications(options.tenantRoot).filter((application) => application.id === "api" && (!options.appId || options.appId === "api")).map((application) => application.config)
276
+ ];
277
+ for (const config of appConfigs) {
278
+ const nodePool = config.publicTreeDxFederation?.railway?.nodePool;
279
+ if (!nodePool && config.hosting?.kind !== "treeseed_control_plane") continue;
280
+ const bootstrapCount = Math.max(1, Number.parseInt(String(nodePool?.bootstrapCount ?? 1), 10) || 1);
281
+ const projectName = config.slug ?? "treeseed-api";
282
+ const environmentName = normalizeRailwayEnvironmentName(options.target) || options.target;
283
+ const project = findByName(projects, projectName);
284
+ if (!project?.id) {
285
+ issues.push(`public-treedx: Railway project ${projectName} was not found.`);
222
286
  continue;
223
287
  }
224
- const deployment = await inspectRailwayServiceDeploymentHealthWithRetry({
225
- serviceId: service.id,
226
- environmentId: environment.id,
227
- options
228
- }).catch((error) => ({
229
- ok: false,
230
- status: null,
231
- message: error instanceof Error ? error.message : String(error ?? "Unable to inspect TreeDX deployment health.")
232
- }));
233
- if (!deployment.ok) {
234
- issues.push(`${serviceName}: public TreeDX latest deployment is not healthy. ${deployment.message}`);
235
- }
236
- const variables = await listRailwayVariables({ projectId: project.id, environmentId: environment.id, serviceId: service.id, env: options.env, fetchImpl: options.fetchImpl }).catch(() => ({}));
237
- if (variables.TREEDX_FEDERATION_MODE !== "connected_library") {
238
- issues.push(`${serviceName}: TREEDX_FEDERATION_MODE is not connected_library.`);
288
+ const environments = await listRailwayEnvironments({ projectId: project.id, env: options.env, fetchImpl: options.fetchImpl });
289
+ const environment = findByName(environments, environmentName);
290
+ if (!environment?.id) {
291
+ issues.push(`public-treedx: Railway environment ${environmentName} was not found.`);
292
+ continue;
239
293
  }
240
- const mountedVolume = volumes.find((volume) => volume.name === volumeName && volume.instances.some(
241
- (instance) => instance.serviceId === service.id && instance.environmentId === environment.id && instance.mountPath === volumeMountPath
242
- ));
243
- if (!mountedVolume) {
244
- issues.push(`${serviceName}: public TreeDX volume ${volumeName} is not mounted at ${volumeMountPath}.`);
294
+ const [services, volumes] = await Promise.all([
295
+ listRailwayServices({ projectId: project.id, env: options.env, fetchImpl: options.fetchImpl }),
296
+ listRailwayVolumes({ projectId: project.id, env: options.env, fetchImpl: options.fetchImpl }).catch(() => [])
297
+ ]);
298
+ for (let index = 1; index <= bootstrapCount; index += 1) {
299
+ const serviceName = indexedName("public-treedx-node", index);
300
+ const volumeName = `${serviceName}-volume`;
301
+ const configuredNode = Array.isArray(config.services) ? config.services.find((service2) => service2?.id === serviceName || service2?.name === serviceName) : null;
302
+ const volumeMountPath = typeof configuredNode?.volumeMountPath === "string" && configuredNode.volumeMountPath.trim() ? configuredNode.volumeMountPath.trim() : "/data";
303
+ const service = findByName(services, serviceName);
304
+ if (!service?.id) {
305
+ issues.push(`${serviceName}: public TreeDX Railway service was not found.`);
306
+ continue;
307
+ }
308
+ const deployment = await inspectRailwayServiceDeploymentHealthWithRetry({
309
+ serviceId: service.id,
310
+ environmentId: environment.id,
311
+ options
312
+ }).catch((error) => ({
313
+ ok: false,
314
+ status: null,
315
+ message: error instanceof Error ? error.message : String(error ?? "Unable to inspect TreeDX deployment health.")
316
+ }));
317
+ if (!deployment.ok) {
318
+ issues.push(`${serviceName}: public TreeDX latest deployment is not healthy. ${deployment.message}`);
319
+ }
320
+ const variables = await listRailwayVariables({ projectId: project.id, environmentId: environment.id, serviceId: service.id, env: options.env, fetchImpl: options.fetchImpl }).catch(() => ({}));
321
+ if (variables.TREEDX_FEDERATION_MODE !== "connected_library") {
322
+ issues.push(`${serviceName}: TREEDX_FEDERATION_MODE is not connected_library.`);
323
+ }
324
+ const mountedVolume = volumes.find((volume) => volume.name === volumeName && volume.instances.some(
325
+ (instance) => instance.serviceId === service.id && instance.environmentId === environment.id && instance.mountPath === volumeMountPath && isActiveRailwayVolumeInstance(instance)
326
+ ));
327
+ if (!mountedVolume) {
328
+ issues.push(`${serviceName}: public TreeDX volume ${volumeName} is not mounted at ${volumeMountPath}.`);
329
+ }
245
330
  }
246
331
  }
247
332
  }
@@ -250,14 +335,15 @@ async function collectRailwayObservations(options) {
250
335
  return {
251
336
  observed,
252
337
  status: "failed",
253
- issues: [...issues, error instanceof Error ? error.message : String(error)]
338
+ issues: [...issues, liveCheckErrorMessage(error, "Railway live observation failed without provider details.")].filter((issue) => issue.trim())
254
339
  };
255
340
  }
256
341
  }
257
342
  async function collectHttpObservations(options) {
258
- const deployConfig = loadCliDeployConfig(options.tenantRoot);
343
+ const deployConfig = loadTreeseedPlatformConfig({ tenantRoot: options.tenantRoot, environment: options.target, env: process.env }).deployConfig;
259
344
  const urls = /* @__PURE__ */ new Set();
260
345
  const fallbacks = /* @__PURE__ */ new Map();
346
+ const selectedServiceKeys = selectedServiceKeySet(options);
261
347
  const selectedApplication = options.appId ? discoverTreeseedApplications(options.tenantRoot).find((application) => application.id === options.appId || application.relativeRoot === options.appId) : null;
262
348
  if (!options.appId || options.appId === "web" || selectedApplication?.roles.includes("web")) {
263
349
  const webConfig = selectedWebConfig(deployConfig, selectedApplication);
@@ -276,7 +362,7 @@ async function collectHttpObservations(options) {
276
362
  }
277
363
  }
278
364
  }
279
- for (const service of configuredRailwayServices(options.tenantRoot, options.target).filter((entry) => !options.appId || entry.application?.id === options.appId)) {
365
+ for (const service of configuredRailwayServices(options.tenantRoot, options.target).filter((entry) => !options.appId || entry.application?.id === options.appId).filter((entry) => serviceIsSelected(selectedServiceKeys, entry.key))) {
280
366
  const serviceConfig = deployConfig.services?.[service.key];
281
367
  const domain = service.publicBaseUrl ?? serviceConfig?.environments?.[options.target]?.baseUrl ?? serviceConfig?.environments?.[options.target]?.domain ?? (service.key === "api" ? deployConfig.surfaces?.api?.environments?.[options.target]?.domain : null);
282
368
  const baseUrl = urlForDomain(domain);
@@ -323,25 +409,52 @@ function strictenReport(report, options) {
323
409
  return { ...report, checks, summary };
324
410
  }
325
411
  async function collectTreeseedLiveHostedServiceChecks(options) {
412
+ const effectiveOptions = {
413
+ ...options,
414
+ env: resolveLiveProviderEnv(options)
415
+ };
326
416
  const requireLiveRailway = options.requireLiveRailway ?? options.strict === true;
327
417
  const requireLiveHttp = options.requireLiveHttp ?? options.strict === true;
328
- const railway = requireLiveRailway ? await collectRailwayObservations(options) : { observed: {}, status: "skipped", issues: [] };
329
- const httpChecks = requireLiveHttp ? await collectHttpObservations(options) : {};
418
+ const railway = requireLiveRailway ? await collectRailwayObservations(effectiveOptions) : { observed: {}, status: "skipped", issues: [] };
419
+ const httpChecks = requireLiveHttp ? await collectHttpObservations(effectiveOptions) : {};
330
420
  const report = collectTreeseedHostedServiceChecks({
331
- tenantRoot: options.tenantRoot,
332
- target: options.target,
333
- appId: options.appId,
421
+ tenantRoot: effectiveOptions.tenantRoot,
422
+ target: effectiveOptions.target,
423
+ appId: effectiveOptions.appId,
424
+ serviceKeys: effectiveOptions.serviceKeys,
334
425
  observedRailwayServices: railway.observed,
335
426
  httpChecks
336
427
  });
428
+ const railwayIssues = railway.issues.map((issue) => issue.trim()).filter(Boolean);
429
+ const providerIssueChecks = railwayIssues.map((issue, index) => ({
430
+ id: `railway:live-issue:${index + 1}`,
431
+ provider: "railway",
432
+ serviceType: "unknown",
433
+ target: options.target,
434
+ description: "Railway live provider verification issue.",
435
+ expected: { ok: true },
436
+ observed: { issue },
437
+ status: "failed",
438
+ issues: [issue]
439
+ }));
440
+ const reportWithLiveIssues = providerIssueChecks.length > 0 ? {
441
+ ...report,
442
+ checks: [...report.checks, ...providerIssueChecks],
443
+ summary: {
444
+ passed: report.checks.filter((entry) => entry.status === "passed").length,
445
+ failed: report.checks.filter((entry) => entry.status === "failed").length + providerIssueChecks.length,
446
+ skipped: report.checks.filter((entry) => entry.status === "skipped").length,
447
+ warning: report.checks.filter((entry) => entry.status === "warning").length
448
+ }
449
+ } : report;
337
450
  const httpStatus = requireLiveHttp ? Object.values(httpChecks).some((entry) => entry.ok === true || entry.status) ? "observed" : "failed" : "skipped";
338
451
  return strictenReport({
339
- ...report,
452
+ ...reportWithLiveIssues,
340
453
  live: true,
341
454
  liveObservation: {
342
455
  railway: railway.status,
343
456
  http: httpStatus,
344
- issues: railway.issues
457
+ issues: railwayIssues
345
458
  }
346
459
  }, options);
347
460
  }
@@ -53,7 +53,6 @@ function prepareCloudflareLocalRuntime({ envOverrides = {}, persistTo, outDir }
53
53
  };
54
54
  runNodeScript("./scripts/patch-starlight-content-path.js");
55
55
  runNodeScript("./scripts/aggregate-book.js");
56
- runNodeScript("./scripts/ensure-mailpit.js");
57
56
  runLocalD1Migration(persistTo);
58
57
  const astroArgs = ["astro", "build", "--root", fixtureRoot];
59
58
  if (outDir) {
@@ -1,4 +1,4 @@
1
- import type { TreeseedDeployConfig } from '../../platform/contracts.ts';
1
+ import type { TreeseedDeployConfig } from '../../platform/contracts.js';
2
2
  export declare const MANAGED_HOST_DIRECT_CI_OPT_IN_ENV = "TREESEED_ALLOW_MANAGED_HOST_DIRECT_CI_SECRETS";
3
3
  export declare function allowsManagedHostDirectCiSecrets(env?: Record<string, string | undefined>): boolean;
4
4
  export declare function isTreeseedManagedHostedProject(deployConfig: Pick<TreeseedDeployConfig, 'hosting' | 'hub' | 'runtime'> | null | undefined): boolean;
@@ -0,0 +1,37 @@
1
+ export type TreeseedManagedRepositoryKind = 'root' | 'package' | 'template' | 'fixture' | 'project';
2
+ export type TreeseedTemplateRepositoryManifest = {
3
+ id: string;
4
+ name: string;
5
+ category: string;
6
+ repository: string | null;
7
+ version: string | null;
8
+ versionSource: string;
9
+ manifestPath: string | null;
10
+ verify: {
11
+ fast: string | null;
12
+ local: string | null;
13
+ release: string | null;
14
+ };
15
+ release: {
16
+ tagPrefix: string;
17
+ recordPath: string;
18
+ };
19
+ };
20
+ export type TreeseedManagedRepository = {
21
+ id: string;
22
+ name: string;
23
+ kind: TreeseedManagedRepositoryKind;
24
+ dir: string;
25
+ relativeDir: string;
26
+ branchName: string | null;
27
+ dirty: boolean;
28
+ detached: boolean;
29
+ hasOriginRemote: boolean;
30
+ remoteUrl: string | null;
31
+ templateManifest: TreeseedTemplateRepositoryManifest | null;
32
+ };
33
+ export declare function parseGitmodulesPaths(root: string): string[];
34
+ export declare function readTreeseedTemplateRepositoryManifest(repoDir: string): TreeseedTemplateRepositoryManifest | null;
35
+ export declare function discoverTreeseedManagedRepositories(root: string): TreeseedManagedRepository[];
36
+ export declare function checkedOutManagedWorkflowRepos(root: string): TreeseedManagedRepository[];
37
+ export declare function checkedOutTemplateRepositories(root: string): TreeseedManagedRepository[];
@@ -0,0 +1,177 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { basename, relative, resolve } from "node:path";
3
+ import { parse as parseYaml } from "yaml";
4
+ import { currentBranch, gitStatusPorcelain, originRemoteUrl, repoRoot } from "./workspace-save.js";
5
+ import { hasCompleteTreeseedPackageCheckout, sortWorkspacePackages, workspacePackages } from "./workspace-tools.js";
6
+ import { discoverTreeseedPackageAdapters } from "./package-adapters.js";
7
+ function readJsonFile(filePath) {
8
+ try {
9
+ return JSON.parse(readFileSync(filePath, "utf8"));
10
+ } catch {
11
+ return null;
12
+ }
13
+ }
14
+ function readStructuredFile(filePath) {
15
+ try {
16
+ const source = readFileSync(filePath, "utf8");
17
+ return filePath.endsWith(".yaml") || filePath.endsWith(".yml") ? parseYaml(source) : JSON.parse(source);
18
+ } catch {
19
+ return null;
20
+ }
21
+ }
22
+ function stringValue(value) {
23
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
24
+ }
25
+ function parseGitmodulesPaths(root) {
26
+ const gitmodulesPath = resolve(root, ".gitmodules");
27
+ if (!existsSync(gitmodulesPath)) return [];
28
+ const source = readFileSync(gitmodulesPath, "utf8");
29
+ return [...source.matchAll(/^\s*path\s*=\s*(.+?)\s*$/gmu)].map((match) => match[1].replaceAll("\\", "/").trim()).filter(Boolean);
30
+ }
31
+ function isIndependentGitRepo(repoDir) {
32
+ try {
33
+ return resolve(repoRoot(repoDir)) === resolve(repoDir);
34
+ } catch {
35
+ return false;
36
+ }
37
+ }
38
+ function branchName(repoDir) {
39
+ return currentBranch(repoDir) || null;
40
+ }
41
+ function hasOriginRemote(repoDir) {
42
+ try {
43
+ originRemoteUrl(repoDir);
44
+ return true;
45
+ } catch {
46
+ return false;
47
+ }
48
+ }
49
+ function remoteUrl(repoDir) {
50
+ try {
51
+ return originRemoteUrl(repoDir);
52
+ } catch {
53
+ return null;
54
+ }
55
+ }
56
+ function templateManifestPath(repoDir) {
57
+ for (const name of ["treeseed.template.yaml", "treeseed.template.yml", "treeseed.template.json"]) {
58
+ const candidate = resolve(repoDir, name);
59
+ if (existsSync(candidate)) return candidate;
60
+ }
61
+ return null;
62
+ }
63
+ function defaultTemplateConfigPath(repoDir) {
64
+ const candidate = resolve(repoDir, "template.config.json");
65
+ return existsSync(candidate) ? candidate : null;
66
+ }
67
+ function templateVersion(repoDir, manifest, config) {
68
+ const versionSource = stringValue(manifest?.versionSource) ?? "template.config.json";
69
+ const configured = stringValue(manifest?.version) ?? stringValue(config?.templateVersion);
70
+ if (configured) return { version: configured, versionSource };
71
+ const sourcePath = resolve(repoDir, versionSource);
72
+ const source = readJsonFile(sourcePath);
73
+ return {
74
+ version: stringValue(source?.templateVersion) ?? stringValue(source?.version),
75
+ versionSource
76
+ };
77
+ }
78
+ function readTreeseedTemplateRepositoryManifest(repoDir) {
79
+ const manifestPath = templateManifestPath(repoDir);
80
+ const configPath = defaultTemplateConfigPath(repoDir);
81
+ const manifest = manifestPath ? readStructuredFile(manifestPath) : null;
82
+ const config = configPath ? readStructuredFile(configPath) : null;
83
+ if (!manifest && !config) return null;
84
+ const id = stringValue(manifest?.id) ?? stringValue(config?.id) ?? basename(repoDir);
85
+ const release = manifest?.release && typeof manifest.release === "object" && !Array.isArray(manifest.release) ? manifest.release : {};
86
+ const verify = manifest?.verify && typeof manifest.verify === "object" && !Array.isArray(manifest.verify) ? manifest.verify : {};
87
+ const version = templateVersion(repoDir, manifest, config);
88
+ return {
89
+ id,
90
+ name: stringValue(manifest?.name) ?? stringValue(config?.displayName) ?? id,
91
+ category: stringValue(manifest?.category) ?? stringValue(config?.category) ?? "starter",
92
+ repository: stringValue(manifest?.repository) ?? remoteUrl(repoDir),
93
+ version: version.version,
94
+ versionSource: version.versionSource,
95
+ manifestPath: manifestPath ?? configPath,
96
+ verify: {
97
+ fast: stringValue(verify.fast),
98
+ local: stringValue(verify.local) ?? stringValue(config?.testing?.buildCommand),
99
+ release: stringValue(verify.release) ?? stringValue(verify.local) ?? stringValue(config?.testing?.buildCommand)
100
+ },
101
+ release: {
102
+ tagPrefix: stringValue(release.tagPrefix) ?? "template/",
103
+ recordPath: stringValue(release.recordPath) ?? `.treeseed/templates/${id}/latest-release.json`
104
+ }
105
+ };
106
+ }
107
+ function classifyManagedRepo(root, relativeDir, repoDir) {
108
+ if (relativeDir === ".") return "root";
109
+ if (/^starters\/[^/]+$/u.test(relativeDir) || readTreeseedTemplateRepositoryManifest(repoDir)) return "template";
110
+ if (/(^|\/)\.fixtures\/treeseed-fixtures$/u.test(relativeDir)) return "fixture";
111
+ if (/^packages\/[^/]+$/u.test(relativeDir)) return "package";
112
+ return "project";
113
+ }
114
+ function addRecursiveSubmodules(root, relativeDir, repoDir, repos) {
115
+ for (const submodulePath of parseGitmodulesPaths(repoDir)) {
116
+ const childDir = resolve(repoDir, submodulePath);
117
+ const childRelativeDir = relative(root, childDir).replaceAll("\\", "/") || ".";
118
+ if (!existsSync(childDir) || !isIndependentGitRepo(childDir)) continue;
119
+ if (!repos.has(childRelativeDir)) {
120
+ repos.set(childRelativeDir, childDir);
121
+ }
122
+ addRecursiveSubmodules(root, childRelativeDir, childDir, repos);
123
+ }
124
+ }
125
+ function discoverTreeseedManagedRepositories(root) {
126
+ const gitRoot = repoRoot(root);
127
+ const repos = /* @__PURE__ */ new Map();
128
+ repos.set(".", gitRoot);
129
+ if (hasCompleteTreeseedPackageCheckout(root)) {
130
+ for (const pkg of workspacePackages(root).filter((pkg2) => pkg2.name?.startsWith("@treeseed/"))) {
131
+ if (existsSync(resolve(pkg.dir, ".git")) && isIndependentGitRepo(pkg.dir)) {
132
+ repos.set(pkg.relativeDir, pkg.dir);
133
+ }
134
+ }
135
+ }
136
+ for (const adapter of discoverTreeseedPackageAdapters(root)) {
137
+ if (existsSync(resolve(adapter.dir, ".git")) && isIndependentGitRepo(adapter.dir)) {
138
+ repos.set(adapter.relativeDir, adapter.dir);
139
+ }
140
+ }
141
+ addRecursiveSubmodules(root, ".", gitRoot, repos);
142
+ return [...repos.entries()].map(([relativeDir, dir]) => {
143
+ const kind = classifyManagedRepo(root, relativeDir, dir);
144
+ const templateManifest = kind === "template" ? readTreeseedTemplateRepositoryManifest(dir) : null;
145
+ const name = kind === "root" ? "@treeseed/market" : kind === "template" ? `template:${templateManifest?.id ?? basename(dir)}` : kind === "fixture" ? `fixture:${relativeDir}` : readJsonFile(resolve(dir, "package.json"))?.name ?? basename(dir);
146
+ const branch = branchName(dir);
147
+ return {
148
+ id: relativeDir,
149
+ name,
150
+ kind,
151
+ dir,
152
+ relativeDir,
153
+ branchName: branch,
154
+ dirty: gitStatusPorcelain(dir).length > 0,
155
+ detached: branch == null,
156
+ hasOriginRemote: hasOriginRemote(dir),
157
+ remoteUrl: remoteUrl(dir),
158
+ templateManifest
159
+ };
160
+ }).sort((left, right) => sortWorkspacePackages([
161
+ { name: left.name, dir: left.dir, relativeDir: left.relativeDir, packageJson: {} },
162
+ { name: right.name, dir: right.dir, relativeDir: right.relativeDir, packageJson: {} }
163
+ ])[0]?.name === left.name ? -1 : 1);
164
+ }
165
+ function checkedOutManagedWorkflowRepos(root) {
166
+ return discoverTreeseedManagedRepositories(root).filter((repo) => repo.kind !== "root");
167
+ }
168
+ function checkedOutTemplateRepositories(root) {
169
+ return discoverTreeseedManagedRepositories(root).filter((repo) => repo.kind === "template" && repo.templateManifest);
170
+ }
171
+ export {
172
+ checkedOutManagedWorkflowRepos,
173
+ checkedOutTemplateRepositories,
174
+ discoverTreeseedManagedRepositories,
175
+ parseGitmodulesPaths,
176
+ readTreeseedTemplateRepositoryManifest
177
+ };
@@ -1,5 +1,6 @@
1
+ export type TreeseedOperationsRunnerSmokeEnvironment = 'local' | 'staging' | 'prod';
1
2
  export interface TreeseedOperationsRunnerSmokeReport {
2
- environment: 'staging' | 'prod';
3
+ environment: TreeseedOperationsRunnerSmokeEnvironment;
3
4
  ok: boolean;
4
5
  baseUrl: string;
5
6
  operationId?: string;
@@ -18,7 +19,7 @@ export interface TreeseedOperationsRunnerSmokeReport {
18
19
  }
19
20
  export interface TreeseedOperationsRunnerSmokeOptions {
20
21
  tenantRoot: string;
21
- environment: 'staging' | 'prod';
22
+ environment: TreeseedOperationsRunnerSmokeEnvironment;
22
23
  baseUrl?: string | null;
23
24
  serviceId?: string | null;
24
25
  serviceSecret?: string | null;