@treeseed/sdk 0.10.28 → 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 (509) hide show
  1. package/README.md +213 -7
  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 +118 -59
  27. package/dist/capacity-provider.js +235 -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 +3 -2
  36. package/dist/control-plane.js +38 -13
  37. package/dist/copilot.d.ts +3 -0
  38. package/dist/copilot.js +16 -1
  39. package/dist/d1-http.d.ts +1 -1
  40. package/dist/d1-store.d.ts +32 -57
  41. package/dist/d1-store.js +115 -318
  42. package/dist/db/d1.d.ts +1 -232
  43. package/dist/db/index.d.ts +3 -3
  44. package/dist/db/market-schema.d.ts +50900 -11018
  45. package/dist/db/market-schema.js +2313 -467
  46. package/dist/db/node-sqlite.d.ts +1 -232
  47. package/dist/db/node-sqlite.js +7 -2
  48. package/dist/db/schema.d.ts +0 -462
  49. package/dist/db/schema.js +2 -22
  50. package/dist/dispatch.d.ts +1 -1
  51. package/dist/dispatch.js +0 -11
  52. package/dist/fixture-support.js +52 -4
  53. package/dist/governance.d.ts +133 -0
  54. package/dist/governance.js +285 -0
  55. package/dist/graph/build.d.ts +2 -2
  56. package/dist/graph/context-query-contracts.d.ts +1 -1
  57. package/dist/graph/dsl.d.ts +1 -1
  58. package/dist/graph/query.d.ts +4 -4
  59. package/dist/graph/ranking.d.ts +1 -1
  60. package/dist/graph/schema.d.ts +1 -1
  61. package/dist/graph.d.ts +11 -11
  62. package/dist/guarantees/index.d.ts +425 -0
  63. package/dist/guarantees/index.js +1146 -0
  64. package/dist/hosting/apps.d.ts +12 -0
  65. package/dist/hosting/apps.js +107 -0
  66. package/dist/hosting/builtins.d.ts +25 -0
  67. package/dist/hosting/builtins.js +602 -0
  68. package/dist/hosting/contracts.d.ts +208 -0
  69. package/dist/hosting/contracts.js +0 -0
  70. package/dist/hosting/graph.d.ts +195 -0
  71. package/dist/hosting/graph.js +1092 -0
  72. package/dist/hosting/index.d.ts +4 -0
  73. package/dist/hosting/index.js +4 -0
  74. package/dist/index.d.ts +88 -67
  75. package/dist/index.js +142 -14
  76. package/dist/local-dev/managed-dev.d.ts +85 -0
  77. package/dist/local-dev/managed-dev.js +368 -0
  78. package/dist/managed-dependencies.d.ts +9 -0
  79. package/dist/managed-dependencies.js +10 -9
  80. package/dist/market-client.d.ts +327 -9
  81. package/dist/market-client.js +464 -20
  82. package/dist/model-registry.d.ts +1 -1
  83. package/dist/model-registry.js +19 -19
  84. package/dist/operations/agent-tools.d.ts +2 -11
  85. package/dist/operations/agent-tools.js +2 -14
  86. package/dist/operations/providers/default.d.ts +1 -1
  87. package/dist/operations/providers/default.js +20 -37
  88. package/dist/operations/repository-operations.d.ts +26 -2
  89. package/dist/operations/repository-operations.js +159 -1
  90. package/dist/operations/runtime.d.ts +3 -3
  91. package/dist/operations/services/bootstrap-runner.d.ts +4 -2
  92. package/dist/operations/services/bootstrap-runner.js +22 -2
  93. package/dist/operations/services/build-warning-policy.d.ts +34 -0
  94. package/dist/operations/services/build-warning-policy.js +81 -82
  95. package/dist/operations/services/commit-message-provider.js +4 -4
  96. package/dist/operations/services/config-runtime.d.ts +83 -24
  97. package/dist/operations/services/config-runtime.js +449 -130
  98. package/dist/operations/services/deploy.d.ts +106 -624
  99. package/dist/operations/services/deploy.js +746 -263
  100. package/dist/operations/services/deployment-readiness.d.ts +30 -0
  101. package/dist/operations/services/deployment-readiness.js +206 -0
  102. package/dist/operations/services/git-remote-policy.js +12 -4
  103. package/dist/operations/services/git-runner.d.ts +66 -0
  104. package/dist/operations/services/git-runner.js +479 -0
  105. package/dist/operations/services/git-workflow.d.ts +45 -6
  106. package/dist/operations/services/git-workflow.js +251 -23
  107. package/dist/operations/services/github-actions-verification.d.ts +4 -1
  108. package/dist/operations/services/github-actions-verification.js +12 -3
  109. package/dist/operations/services/github-api.js +22 -6
  110. package/dist/operations/services/github-automation.d.ts +4 -4
  111. package/dist/operations/services/github-automation.js +19 -21
  112. package/dist/operations/services/github-credentials.d.ts +13 -0
  113. package/dist/operations/services/github-credentials.js +59 -0
  114. package/dist/operations/services/hosted-service-checks.d.ts +81 -0
  115. package/dist/operations/services/hosted-service-checks.js +478 -0
  116. package/dist/operations/services/hosting-audit.d.ts +2 -2
  117. package/dist/operations/services/hosting-audit.js +7 -7
  118. package/dist/operations/services/hub-launch.d.ts +1 -1
  119. package/dist/operations/services/hub-provider-launch.d.ts +5 -5
  120. package/dist/operations/services/hub-provider-launch.js +22 -17
  121. package/dist/operations/services/live-hosted-service-checks.d.ts +26 -0
  122. package/dist/operations/services/live-hosted-service-checks.js +463 -0
  123. package/dist/operations/services/local-dev.js +0 -1
  124. package/dist/operations/services/managed-host-security.d.ts +1 -1
  125. package/dist/operations/services/managed-host-security.js +1 -1
  126. package/dist/operations/services/managed-repositories.d.ts +37 -0
  127. package/dist/operations/services/managed-repositories.js +177 -0
  128. package/dist/operations/services/operations-runner-smoke.d.ts +31 -0
  129. package/dist/operations/services/operations-runner-smoke.js +198 -0
  130. package/dist/operations/services/package-adapters.d.ts +170 -0
  131. package/dist/operations/services/package-adapters.js +859 -0
  132. package/dist/operations/services/package-reference-policy.d.ts +13 -88
  133. package/dist/operations/services/package-reference-policy.js +96 -215
  134. package/dist/operations/services/project-host-operations.d.ts +4 -4
  135. package/dist/operations/services/project-platform.d.ts +57 -173
  136. package/dist/operations/services/project-platform.js +80 -111
  137. package/dist/operations/services/project-web-monitor.d.ts +2 -2
  138. package/dist/operations/services/project-web-monitor.js +122 -5
  139. package/dist/operations/services/railway-api.d.ts +117 -5
  140. package/dist/operations/services/railway-api.js +915 -93
  141. package/dist/operations/services/railway-deploy.d.ts +30 -112
  142. package/dist/operations/services/railway-deploy.js +521 -961
  143. package/dist/operations/services/release-history.js +3 -4
  144. package/dist/operations/services/release-proof-ledger.d.ts +13 -0
  145. package/dist/operations/services/release-proof-ledger.js +81 -0
  146. package/dist/operations/services/release-proof-planner.d.ts +48 -0
  147. package/dist/operations/services/release-proof-planner.js +195 -0
  148. package/dist/operations/services/release-proof-runner.d.ts +16 -0
  149. package/dist/operations/services/release-proof-runner.js +169 -0
  150. package/dist/operations/services/release-proof.d.ts +81 -0
  151. package/dist/operations/services/release-proof.js +79 -0
  152. package/dist/operations/services/repository-save-orchestrator.d.ts +8 -7
  153. package/dist/operations/services/repository-save-orchestrator.js +604 -212
  154. package/dist/operations/services/runtime-paths.d.ts +1 -3
  155. package/dist/operations/services/runtime-paths.js +0 -4
  156. package/dist/operations/services/runtime-tools.d.ts +1 -191
  157. package/dist/operations/services/runtime-tools.js +4 -443
  158. package/dist/operations/services/save-deploy-preflight.js +9 -1
  159. package/dist/operations/services/template-host-bindings.d.ts +2 -2
  160. package/dist/operations/services/template-host-bindings.js +3 -2
  161. package/dist/operations/services/template-registry.d.ts +6 -6
  162. package/dist/operations/services/template-registry.js +33 -14
  163. package/dist/operations/services/template-secret-sync.d.ts +3 -3
  164. package/dist/operations/services/verification-cache.d.ts +25 -0
  165. package/dist/operations/services/verification-cache.js +71 -0
  166. package/dist/operations/services/workflow-timing.d.ts +25 -0
  167. package/dist/operations/services/workflow-timing.js +79 -0
  168. package/dist/operations/services/workspace-dependency-mode.js +50 -5
  169. package/dist/operations/services/workspace-preflight.js +8 -8
  170. package/dist/operations/services/workspace-save-script.d.ts +4 -4
  171. package/dist/operations/services/workspace-save.d.ts +1 -0
  172. package/dist/operations/services/workspace-save.js +42 -19
  173. package/dist/operations/services/workspace-tools.js +42 -7
  174. package/dist/operations-registry.d.ts +1 -1
  175. package/dist/operations-registry.js +5 -6
  176. package/dist/operations-types.d.ts +1 -1
  177. package/dist/operations.d.ts +17 -11
  178. package/dist/operations.js +57 -3
  179. package/dist/platform/book-export.js +2 -0
  180. package/dist/platform/books-data.d.ts +1 -1
  181. package/dist/platform/config.d.ts +27 -0
  182. package/dist/platform/config.js +100 -0
  183. package/dist/platform/content-runtime-source.d.ts +54 -0
  184. package/dist/platform/content-runtime-source.js +169 -0
  185. package/dist/platform/contracts.d.ts +38 -2
  186. package/dist/platform/deploy-config.d.ts +1 -1
  187. package/dist/platform/deploy-config.js +80 -9
  188. package/dist/platform/deploy-runtime.d.ts +1 -1
  189. package/dist/platform/desired-state.d.ts +63 -0
  190. package/dist/platform/desired-state.js +1021 -0
  191. package/dist/platform/env.yaml +568 -45
  192. package/dist/platform/environment.d.ts +3 -2
  193. package/dist/platform/environment.js +122 -21
  194. package/dist/platform/local-content-materialization.d.ts +9 -0
  195. package/dist/platform/local-content-materialization.js +212 -0
  196. package/dist/platform/plugin.d.ts +13 -4
  197. package/dist/platform/plugins/runtime.d.ts +3 -3
  198. package/dist/platform/plugins/runtime.js +62 -1
  199. package/dist/platform/plugins.d.ts +6 -6
  200. package/dist/platform/published-content-pipeline.d.ts +3 -3
  201. package/dist/platform/published-content-pipeline.js +5 -1
  202. package/dist/platform/published-content.d.ts +4 -3
  203. package/dist/platform/site-config-schema.d.ts +1 -0
  204. package/dist/platform/site-config-schema.js +4 -1
  205. package/dist/platform/tenant/runtime-config.d.ts +152 -2
  206. package/dist/platform/tenant-config.d.ts +1 -1
  207. package/dist/platform/utils/site-config-schema.d.ts +154 -0
  208. package/dist/platform/utils/site-config-schema.js +400 -461
  209. package/dist/platform-operation-store.d.ts +1 -1
  210. package/dist/platform-operation-store.js +2 -2
  211. package/dist/platform-operations.js +1 -1
  212. package/dist/plugin-default.d.ts +1 -1
  213. package/dist/plugin-default.js +27 -12
  214. package/dist/project-import.d.ts +91 -0
  215. package/dist/project-import.js +257 -0
  216. package/dist/project-workflow.d.ts +1 -1
  217. package/dist/reconcile/bootstrap-systems.d.ts +2 -2
  218. package/dist/reconcile/bootstrap-systems.js +5 -5
  219. package/dist/reconcile/builtin-adapters.d.ts +7 -1
  220. package/dist/reconcile/builtin-adapters.js +3190 -429
  221. package/dist/reconcile/contracts.d.ts +23 -6
  222. package/dist/reconcile/desired-state.d.ts +2 -192
  223. package/dist/reconcile/desired-state.js +29 -38
  224. package/dist/reconcile/engine.d.ts +61 -395
  225. package/dist/reconcile/engine.js +229 -44
  226. package/dist/reconcile/index.d.ts +10 -8
  227. package/dist/reconcile/index.js +2 -0
  228. package/dist/reconcile/live-acceptance.d.ts +100 -0
  229. package/dist/reconcile/live-acceptance.js +2027 -0
  230. package/dist/reconcile/platform.d.ts +104 -0
  231. package/dist/reconcile/platform.js +100 -0
  232. package/dist/reconcile/providers/docker-private.d.ts +54 -0
  233. package/dist/reconcile/providers/docker-private.js +101 -0
  234. package/dist/reconcile/providers/github-private.d.ts +65 -0
  235. package/dist/reconcile/providers/github-private.js +119 -0
  236. package/dist/reconcile/providers/local-private.d.ts +28 -0
  237. package/dist/reconcile/providers/local-private.js +75 -0
  238. package/dist/reconcile/providers/railway-iac.d.ts +66 -0
  239. package/dist/reconcile/providers/railway-iac.js +275 -0
  240. package/dist/reconcile/providers/release-private.d.ts +92 -0
  241. package/dist/reconcile/providers/release-private.js +152 -0
  242. package/dist/reconcile/registry.d.ts +2 -2
  243. package/dist/reconcile/registry.js +16 -1
  244. package/dist/reconcile/state.d.ts +1 -1
  245. package/dist/reconcile/state.js +7 -44
  246. package/dist/reconcile/units.d.ts +1 -1
  247. package/dist/reconcile/units.js +9 -3
  248. package/dist/remote.d.ts +6 -6
  249. package/dist/scenes/artifacts.d.ts +16 -0
  250. package/dist/scenes/artifacts.js +61 -0
  251. package/dist/scenes/auth.d.ts +2 -0
  252. package/dist/scenes/auth.js +28 -0
  253. package/dist/scenes/base-url.d.ts +12 -0
  254. package/dist/scenes/base-url.js +123 -0
  255. package/dist/scenes/builtin-plugins.d.ts +2 -0
  256. package/dist/scenes/builtin-plugins.js +447 -0
  257. package/dist/scenes/checkpoints.d.ts +14 -0
  258. package/dist/scenes/checkpoints.js +33 -0
  259. package/dist/scenes/device-matrix.d.ts +2 -0
  260. package/dist/scenes/device-matrix.js +97 -0
  261. package/dist/scenes/devices.d.ts +11 -0
  262. package/dist/scenes/devices.js +22 -0
  263. package/dist/scenes/diagnostics.d.ts +5 -0
  264. package/dist/scenes/diagnostics.js +22 -0
  265. package/dist/scenes/diagram-providers.d.ts +2 -0
  266. package/dist/scenes/diagram-providers.js +181 -0
  267. package/dist/scenes/diagram-validation.d.ts +22 -0
  268. package/dist/scenes/diagram-validation.js +74 -0
  269. package/dist/scenes/environment.d.ts +2 -0
  270. package/dist/scenes/environment.js +65 -0
  271. package/dist/scenes/evidence-bundle.d.ts +5 -0
  272. package/dist/scenes/evidence-bundle.js +42 -0
  273. package/dist/scenes/evidence-report.d.ts +10 -0
  274. package/dist/scenes/evidence-report.js +73 -0
  275. package/dist/scenes/evidence.d.ts +16 -0
  276. package/dist/scenes/evidence.js +277 -0
  277. package/dist/scenes/index.d.ts +48 -0
  278. package/dist/scenes/index.js +312 -0
  279. package/dist/scenes/inspect.d.ts +9 -0
  280. package/dist/scenes/inspect.js +64 -0
  281. package/dist/scenes/loader.d.ts +3 -0
  282. package/dist/scenes/loader.js +38 -0
  283. package/dist/scenes/logs.d.ts +2 -0
  284. package/dist/scenes/logs.js +47 -0
  285. package/dist/scenes/operations.d.ts +3 -0
  286. package/dist/scenes/operations.js +128 -0
  287. package/dist/scenes/phase0.d.ts +9 -0
  288. package/dist/scenes/phase0.js +637 -0
  289. package/dist/scenes/planner.d.ts +12 -0
  290. package/dist/scenes/planner.js +166 -0
  291. package/dist/scenes/playwright-adapter.d.ts +2 -0
  292. package/dist/scenes/playwright-adapter.js +63 -0
  293. package/dist/scenes/plugins.d.ts +5 -0
  294. package/dist/scenes/plugins.js +115 -0
  295. package/dist/scenes/progress.d.ts +17 -0
  296. package/dist/scenes/progress.js +24 -0
  297. package/dist/scenes/publish-destinations.d.ts +12 -0
  298. package/dist/scenes/publish-destinations.js +99 -0
  299. package/dist/scenes/publish-plan-report.d.ts +10 -0
  300. package/dist/scenes/publish-plan-report.js +70 -0
  301. package/dist/scenes/publish-plan.d.ts +15 -0
  302. package/dist/scenes/publish-plan.js +248 -0
  303. package/dist/scenes/publish-redaction.d.ts +16 -0
  304. package/dist/scenes/publish-redaction.js +148 -0
  305. package/dist/scenes/publish-release-record.d.ts +13 -0
  306. package/dist/scenes/publish-release-record.js +34 -0
  307. package/dist/scenes/publish-report.d.ts +10 -0
  308. package/dist/scenes/publish-report.js +67 -0
  309. package/dist/scenes/publish.d.ts +16 -0
  310. package/dist/scenes/publish.js +298 -0
  311. package/dist/scenes/registry.d.ts +12 -0
  312. package/dist/scenes/registry.js +65 -0
  313. package/dist/scenes/remotion-adapter.d.ts +3 -0
  314. package/dist/scenes/remotion-adapter.js +94 -0
  315. package/dist/scenes/remotion-composition-registry.d.ts +2 -0
  316. package/dist/scenes/remotion-composition-registry.js +12 -0
  317. package/dist/scenes/remotion-compositions.d.ts +15 -0
  318. package/dist/scenes/remotion-compositions.js +464 -0
  319. package/dist/scenes/remotion-diagrams.d.ts +9 -0
  320. package/dist/scenes/remotion-diagrams.js +188 -0
  321. package/dist/scenes/remotion-input.d.ts +13 -0
  322. package/dist/scenes/remotion-input.js +291 -0
  323. package/dist/scenes/remotion-visuals.d.ts +29 -0
  324. package/dist/scenes/remotion-visuals.js +198 -0
  325. package/dist/scenes/render-media-assets.d.ts +9 -0
  326. package/dist/scenes/render-media-assets.js +117 -0
  327. package/dist/scenes/render-report.d.ts +10 -0
  328. package/dist/scenes/render-report.js +27 -0
  329. package/dist/scenes/render.d.ts +2 -0
  330. package/dist/scenes/render.js +218 -0
  331. package/dist/scenes/reporter.d.ts +3 -0
  332. package/dist/scenes/reporter.js +101 -0
  333. package/dist/scenes/resume.d.ts +2 -0
  334. package/dist/scenes/resume.js +79 -0
  335. package/dist/scenes/runner.d.ts +2 -0
  336. package/dist/scenes/runner.js +674 -0
  337. package/dist/scenes/schema.d.ts +6 -0
  338. package/dist/scenes/schema.js +994 -0
  339. package/dist/scenes/seed.d.ts +2 -0
  340. package/dist/scenes/seed.js +83 -0
  341. package/dist/scenes/segments.d.ts +15 -0
  342. package/dist/scenes/segments.js +79 -0
  343. package/dist/scenes/selectors.d.ts +3 -0
  344. package/dist/scenes/selectors.js +21 -0
  345. package/dist/scenes/timeline.d.ts +11 -0
  346. package/dist/scenes/timeline.js +26 -0
  347. package/dist/scenes/timeouts.d.ts +6 -0
  348. package/dist/scenes/timeouts.js +17 -0
  349. package/dist/scenes/training-captions.d.ts +14 -0
  350. package/dist/scenes/training-captions.js +98 -0
  351. package/dist/scenes/training-report.d.ts +10 -0
  352. package/dist/scenes/training-report.js +78 -0
  353. package/dist/scenes/training-transcript.d.ts +24 -0
  354. package/dist/scenes/training-transcript.js +204 -0
  355. package/dist/scenes/training.d.ts +10 -0
  356. package/dist/scenes/training.js +134 -0
  357. package/dist/scenes/types.d.ts +1872 -0
  358. package/dist/scenes/types.js +8 -0
  359. package/dist/scenes/visual-audit-contact-sheets.d.ts +6 -0
  360. package/dist/scenes/visual-audit-contact-sheets.js +119 -0
  361. package/dist/scenes/visual-audit-fixtures.d.ts +25 -0
  362. package/dist/scenes/visual-audit-fixtures.js +210 -0
  363. package/dist/scenes/visual-audit-report.d.ts +11 -0
  364. package/dist/scenes/visual-audit-report.js +85 -0
  365. package/dist/scenes/visual-audit-review.d.ts +23 -0
  366. package/dist/scenes/visual-audit-review.js +829 -0
  367. package/dist/scenes/visual-audit-routes.d.ts +13 -0
  368. package/dist/scenes/visual-audit-routes.js +308 -0
  369. package/dist/scenes/visual-audit.d.ts +3 -0
  370. package/dist/scenes/visual-audit.js +596 -0
  371. package/dist/scripts/build-dist.js +154 -40
  372. package/dist/scripts/check-build-warnings.js +42 -53
  373. package/dist/scripts/cleanup-markdown.js +1 -1
  374. package/dist/scripts/cli-test-fixtures.js +24 -28
  375. package/dist/scripts/deployment-readiness.js +20 -0
  376. package/dist/scripts/generate-treedx-openapi-types.js +186 -0
  377. package/dist/scripts/migrate-journey-csv-to-guarantees.js +140 -0
  378. package/dist/scripts/operations-runner-smoke.js +16 -0
  379. package/dist/scripts/package-tools.js +12 -1
  380. package/dist/scripts/prepare.js +3 -7
  381. package/dist/scripts/release-verify.js +6 -6
  382. package/dist/scripts/run-fixture-astro-command.js +1 -1
  383. package/dist/scripts/template-catalog.test.js +68 -82
  384. package/dist/scripts/tenant-dev.js +0 -10
  385. package/dist/scripts/tenant-workflow-action.js +10 -1
  386. package/dist/scripts/test-cloudflare-local.js +1 -1
  387. package/dist/scripts/test-scaffold.js +0 -1
  388. package/dist/scripts/test-smoke.js +3 -3
  389. package/dist/scripts/treeseed-build-dist.js +4 -7
  390. package/dist/scripts/treeseed-release-verify.js +1 -1
  391. package/dist/scripts/verify-driver.js +30 -21
  392. package/dist/scripts/workflow-commands.test.js +18 -27
  393. package/dist/scripts/workspace-command-e2e.js +1 -1
  394. package/dist/scripts/workspace-lint.js +6 -0
  395. package/dist/scripts/workspace-release-test.js +90 -1
  396. package/dist/scripts/workspace-test.js +6 -0
  397. package/dist/sdk-dispatch.d.ts +1 -1
  398. package/dist/sdk-dispatch.js +0 -16
  399. package/dist/sdk-fields.d.ts +1 -1
  400. package/dist/sdk-filters.d.ts +1 -1
  401. package/dist/sdk-types.d.ts +1352 -116
  402. package/dist/sdk-types.js +413 -2
  403. package/dist/sdk.d.ts +106 -100
  404. package/dist/sdk.js +211 -51
  405. package/dist/secrets-capability.d.ts +421 -0
  406. package/dist/secrets-capability.js +530 -0
  407. package/dist/seeds/normalize.js +1 -0
  408. package/dist/seeds/planner.js +38 -0
  409. package/dist/seeds/schema.js +293 -4
  410. package/dist/seeds/types.d.ts +60 -0
  411. package/dist/seeds/types.js +9 -1
  412. package/dist/service-credentials.d.ts +54 -0
  413. package/dist/service-credentials.js +112 -0
  414. package/dist/stores/cursor-store.d.ts +2 -2
  415. package/dist/stores/envelopes.d.ts +1 -1
  416. package/dist/stores/helpers.d.ts +1 -1
  417. package/dist/stores/lease-store.d.ts +2 -2
  418. package/dist/stores/message-store.d.ts +2 -2
  419. package/dist/stores/operational-store.d.ts +3 -26
  420. package/dist/stores/operational-store.js +0 -225
  421. package/dist/stores/project-workflow-store.d.ts +2 -2
  422. package/dist/stores/run-store.d.ts +2 -3
  423. package/dist/stores/run-store.js +0 -98
  424. package/dist/stores/subscription-store.d.ts +2 -3
  425. package/dist/stores/subscription-store.js +0 -100
  426. package/dist/template-catalog.d.ts +1 -1
  427. package/dist/template-launch-requirements.d.ts +2 -2
  428. package/dist/template-launch-requirements.js +9 -0
  429. package/dist/template-launch-ui.d.ts +2 -2
  430. package/dist/treedx/adapters.d.ts +6 -0
  431. package/dist/treedx/adapters.js +36 -0
  432. package/dist/treedx/client.d.ts +222 -0
  433. package/dist/treedx/client.js +871 -0
  434. package/dist/treedx/errors.d.ts +13 -0
  435. package/dist/treedx/errors.js +17 -0
  436. package/dist/treedx/federated-client.d.ts +27 -0
  437. package/dist/treedx/federated-client.js +158 -0
  438. package/dist/treedx/generated/openapi-types.d.ts +3558 -0
  439. package/dist/treedx/generated/openapi-types.js +0 -0
  440. package/dist/treedx/graph-adapter.d.ts +33 -0
  441. package/dist/treedx/graph-adapter.js +156 -0
  442. package/dist/treedx/index.d.ts +14 -0
  443. package/dist/treedx/index.js +48 -0
  444. package/dist/treedx/market-integration.d.ts +27 -0
  445. package/dist/treedx/market-integration.js +131 -0
  446. package/dist/treedx/ports.d.ts +166 -0
  447. package/dist/treedx/ports.js +231 -0
  448. package/dist/treedx/query-adapter.d.ts +19 -0
  449. package/dist/treedx/query-adapter.js +62 -0
  450. package/dist/treedx/registry-client.d.ts +11 -0
  451. package/dist/treedx/registry-client.js +19 -0
  452. package/dist/treedx/repository-adapter.d.ts +45 -0
  453. package/dist/treedx/repository-adapter.js +319 -0
  454. package/dist/treedx/sdk-integration.d.ts +27 -0
  455. package/dist/treedx/sdk-integration.js +63 -0
  456. package/dist/treedx/types.d.ts +1084 -0
  457. package/dist/treedx/types.js +8 -0
  458. package/dist/treedx/workspace-adapter.d.ts +27 -0
  459. package/dist/treedx/workspace-adapter.js +65 -0
  460. package/dist/treedx-backends.d.ts +220 -0
  461. package/dist/treedx-backends.js +634 -0
  462. package/dist/treedx-client.d.ts +89 -0
  463. package/dist/treedx-client.js +184 -0
  464. package/dist/treeseed/services/compose.yml +2 -3
  465. package/dist/treeseed/template-catalog/catalog.fixture.json +27 -27
  466. package/dist/types/agents.d.ts +256 -0
  467. package/dist/types/agents.js +42 -1
  468. package/dist/verification.d.ts +1 -0
  469. package/dist/verification.js +143 -14
  470. package/dist/workflow/operations.d.ts +580 -523
  471. package/dist/workflow/operations.js +2084 -1279
  472. package/dist/workflow/policy.js +19 -7
  473. package/dist/workflow/runs.d.ts +9 -3
  474. package/dist/workflow/runs.js +66 -26
  475. package/dist/workflow/session.d.ts +4 -1
  476. package/dist/workflow/session.js +50 -10
  477. package/dist/workflow/worktrees.d.ts +6 -2
  478. package/dist/workflow/worktrees.js +98 -15
  479. package/dist/workflow-state.d.ts +17 -4
  480. package/dist/workflow-state.js +68 -41
  481. package/dist/workflow-support.d.ts +26 -17
  482. package/dist/workflow-support.js +84 -24
  483. package/dist/workflow.d.ts +51 -16
  484. package/dist/workflow.js +19 -7
  485. package/drizzle/d1/0000_treeseed_d1.sql +0 -18
  486. package/drizzle/market/0000_market_control_plane.sql +1793 -1499
  487. package/drizzle/market/0004_treedx_market_integration.sql +99 -0
  488. package/drizzle/market/0005_agent_capacity_coordination.sql +145 -0
  489. package/drizzle/market/0006_provider_assignment_lifecycle.sql +9 -0
  490. package/drizzle/market/0007_agent_architecture_gap_closure.sql +157 -0
  491. package/drizzle/market/0008_agent_capacity_operational_closure.sql +27 -0
  492. package/drizzle/market/0009_agent_capacity_runtime_hardening.sql +29 -0
  493. package/drizzle/market/0010_secrets_capability_persistence.sql +130 -0
  494. package/drizzle/market/0011_github_app_adapter.sql +47 -0
  495. package/drizzle/market/0012_workday_test_runs.sql +44 -0
  496. package/drizzle/market/0013_runtime_task_lifecycle.sql +39 -0
  497. package/drizzle/market/0014_governance_pipeline.sql +189 -0
  498. package/package.json +106 -18
  499. package/scripts/{verify-driver.mjs → verify-driver.ts} +19 -4
  500. package/templates/github/deploy-web.workflow.yml +49 -12
  501. package/dist/operations/services/mailpit-runtime.d.ts +0 -20
  502. package/dist/operations/services/mailpit-runtime.js +0 -67
  503. package/dist/operations/services/release-candidate.d.ts +0 -41
  504. package/dist/operations/services/release-candidate.js +0 -616
  505. package/dist/scripts/ensure-mailpit.js +0 -48
  506. package/dist/scripts/logs-mailpit.js +0 -2
  507. package/dist/scripts/run-ts.js +0 -45
  508. package/dist/scripts/stop-mailpit.js +0 -5
  509. package/dist/scripts/treeseed-run-ts.js +0 -45
@@ -0,0 +1,463 @@
1
+ import { loadTreeseedPlatformConfig } from "../../platform/config.js";
2
+ import { resolveTreeseedLaunchEnvironment } from "./config-runtime.js";
3
+ import {
4
+ getRailwayServiceInstance,
5
+ inspectRailwayServiceDeploymentHealth,
6
+ listRailwayEnvironments,
7
+ listRailwayProjects,
8
+ listRailwayServices,
9
+ listRailwayVariables,
10
+ listRailwayVolumes,
11
+ normalizeRailwayEnvironmentName,
12
+ resolveRailwayWorkspaceContext
13
+ } from "./railway-api.js";
14
+ import { configuredRailwayServices, findStaleTreeseedOperationsRunnerResources } from "./railway-deploy.js";
15
+ import { discoverTreeseedApplications } from "../../hosting/apps.js";
16
+ import {
17
+ collectTreeseedHostedServiceChecks
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;
23
+ function sleep(ms) {
24
+ return new Promise((resolve) => setTimeout(resolve, ms));
25
+ }
26
+ function liveCheckErrorMessage(error, fallback) {
27
+ const message = error instanceof Error ? error.message : String(error ?? "");
28
+ return message.trim() || fallback;
29
+ }
30
+ function normalizeBaseUrl(value) {
31
+ return typeof value === "string" && value.trim() ? value.trim().replace(/\/+$/u, "") : null;
32
+ }
33
+ function urlForDomain(value) {
34
+ const normalized = normalizeBaseUrl(value);
35
+ if (!normalized) return null;
36
+ return /^https?:\/\//iu.test(normalized) ? normalized : `https://${normalized}`;
37
+ }
38
+ function selectedWebConfig(deployConfig, selectedApplication) {
39
+ return selectedApplication?.roles.includes("web") ? selectedApplication.config : deployConfig;
40
+ }
41
+ function pagesBranchName(config, target) {
42
+ const pages = config.cloudflare?.pages && typeof config.cloudflare.pages === "object" ? config.cloudflare.pages : {};
43
+ const key = target === "prod" ? "productionBranch" : "stagingBranch";
44
+ const fallback = target === "prod" ? "main" : "staging";
45
+ return typeof pages[key] === "string" && pages[key].trim() ? pages[key].trim() : fallback;
46
+ }
47
+ async function observeHttp(url, options) {
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));
50
+ const timeoutMs = Math.max(1e3, Math.floor(options.timeoutMs ?? 1e4));
51
+ let lastError = "";
52
+ for (let attempt = 0; attempt < attempts; attempt += 1) {
53
+ const controller = new AbortController();
54
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
55
+ try {
56
+ const response = await (options.fetchImpl ?? fetch)(url, {
57
+ method: "GET",
58
+ headers: { accept: "application/json, text/plain, */*" },
59
+ signal: controller.signal
60
+ });
61
+ clearTimeout(timeout);
62
+ return { status: response.status, ok: response.ok };
63
+ } catch (error) {
64
+ clearTimeout(timeout);
65
+ lastError = error instanceof Error ? error.message : String(error);
66
+ if (attempt + 1 < attempts) await sleep(intervalMs);
67
+ }
68
+ }
69
+ return { ok: false, error: lastError || "HTTP request failed." };
70
+ }
71
+ async function inspectRailwayServiceDeploymentHealthWithRetry(input) {
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));
74
+ let lastDeployment = null;
75
+ let lastError = null;
76
+ for (let attempt = 0; attempt < attempts; attempt += 1) {
77
+ try {
78
+ const deployment = await inspectRailwayServiceDeploymentHealth({
79
+ serviceId: input.serviceId,
80
+ environmentId: input.environmentId,
81
+ env: input.options.env,
82
+ fetchImpl: input.options.fetchImpl
83
+ });
84
+ lastDeployment = deployment;
85
+ if (deployment.ok) return deployment;
86
+ } catch (error) {
87
+ lastError = error;
88
+ }
89
+ if (attempt + 1 < attempts) await sleep(intervalMs);
90
+ }
91
+ return lastDeployment ?? {
92
+ ok: false,
93
+ status: null,
94
+ message: lastError instanceof Error ? lastError.message : String(lastError ?? "Unable to inspect deployment health.")
95
+ };
96
+ }
97
+ function findByName(items, nameOrId) {
98
+ if (!nameOrId) return null;
99
+ return items.find((item) => item.name === nameOrId || item.id === nameOrId) ?? null;
100
+ }
101
+ function indexedName(baseName, index) {
102
+ return `${baseName.replace(/-\d+$/u, "")}-${String(Math.max(1, index)).padStart(2, "0")}`;
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
+ }
108
+ function activeRailwayVolumeInstances(volume) {
109
+ const instances = Array.isArray(volume.instances) ? volume.instances : [];
110
+ return instances.filter(isActiveRailwayVolumeInstance);
111
+ }
112
+ function railwayVolumeInstanceStates(volume) {
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);
117
+ return states.length > 0 ? [...new Set(states)].join(",") : "none";
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
+ }
145
+ async function collectRailwayObservations(options) {
146
+ const observed = {};
147
+ const issues = [];
148
+ const inspectedVolumeScopes = /* @__PURE__ */ new Set();
149
+ const inspectedRunnerScopes = /* @__PURE__ */ new Set();
150
+ const selectedServiceKeys = selectedServiceKeySet(options);
151
+ try {
152
+ const workspace = await resolveRailwayWorkspaceContext({ env: options.env, fetchImpl: options.fetchImpl });
153
+ const projects = await listRailwayProjects({ workspaceId: workspace.id, env: options.env, fetchImpl: options.fetchImpl });
154
+ const configuredServices = configuredRailwayServices(options.tenantRoot, options.target).filter((entry) => !options.appId || entry.application?.id === options.appId).filter((entry) => serviceIsSelected(selectedServiceKeys, entry.key));
155
+ for (const service of configuredServices) {
156
+ const project = service.projectId ? findByName(projects, service.projectId) : findByName(projects, service.projectName);
157
+ if (!project?.id) {
158
+ issues.push(`${service.serviceName}: Railway project ${service.projectName} was not found.`);
159
+ continue;
160
+ }
161
+ const environments = await listRailwayEnvironments({ projectId: project.id, env: options.env, fetchImpl: options.fetchImpl });
162
+ const environment = findByName(environments, service.railwayEnvironment);
163
+ if (!environment?.id) {
164
+ issues.push(`${service.serviceName}: Railway environment ${service.railwayEnvironment} was not found.`);
165
+ continue;
166
+ }
167
+ const volumeScope = `${project.id}:${environment.id}`;
168
+ if (!inspectedVolumeScopes.has(volumeScope)) {
169
+ inspectedVolumeScopes.add(volumeScope);
170
+ const volumes2 = await listRailwayVolumes({ projectId: project.id, env: options.env, fetchImpl: options.fetchImpl }).catch(() => []);
171
+ for (const volume of volumes2) {
172
+ if (isRetainedDetachedRailwayVolume(volume.name)) {
173
+ continue;
174
+ }
175
+ const detachedPostgresInstances = activeRailwayVolumeInstances(volume).filter(
176
+ (instance2) => instance2.environmentId === environment.id && instance2.mountPath === "/var/lib/postgresql/data" && !instance2.serviceId
177
+ );
178
+ if (detachedPostgresInstances.length > 0) {
179
+ issues.push(`${volume.name ?? volume.id}: detached PostgreSQL volume remains in Railway project ${project.name} (states=${railwayVolumeInstanceStates(volume)}).`);
180
+ }
181
+ }
182
+ }
183
+ const services = await listRailwayServices({ projectId: project.id, env: options.env, fetchImpl: options.fetchImpl });
184
+ const runnerScope = `${project.id}:${environment.id}`;
185
+ if (service.key === "operationsRunner" && !inspectedRunnerScopes.has(runnerScope)) {
186
+ inspectedRunnerScopes.add(runnerScope);
187
+ const desiredRunnerNames = new Set(configuredServices.filter((entry) => entry.key === "operationsRunner").filter((entry) => entry.projectId ? entry.projectId === project.id : entry.projectName === project.name).filter((entry) => normalizeRailwayEnvironmentName(entry.railwayEnvironment) === normalizeRailwayEnvironmentName(environment.name)).map((entry) => entry.serviceName).filter(Boolean));
188
+ const desiredRunnerServiceIds = new Set(services.filter((entry) => desiredRunnerNames.has(entry.name)).map((entry) => entry.id));
189
+ for (const staleService of findStaleTreeseedOperationsRunnerResources(services, desiredRunnerNames)) {
190
+ issues.push(`${staleService.name}: stale operations runner Railway service remains in project ${project.name}.`);
191
+ }
192
+ const volumes2 = await listRailwayVolumes({ projectId: project.id, env: options.env, fetchImpl: options.fetchImpl }).catch(() => []);
193
+ const desiredRunnerVolumeNames = new Set([...desiredRunnerNames].map((name) => `${name}-volume`));
194
+ for (const staleVolume of findStaleTreeseedOperationsRunnerResources(volumes2, desiredRunnerVolumeNames)) {
195
+ const activeInstances = activeRailwayVolumeInstances(staleVolume);
196
+ const relevant = staleVolume.instances.length === 0 || activeInstances.length > 0;
197
+ const attachedToDesiredRunner = activeInstances.some((instance2) => desiredRunnerServiceIds.has(instance2.serviceId ?? ""));
198
+ if (relevant && !attachedToDesiredRunner) {
199
+ issues.push(`${staleVolume.name ?? staleVolume.id}: stale operations runner Railway volume remains in project ${project.name} (states=${railwayVolumeInstanceStates(staleVolume)}).`);
200
+ }
201
+ }
202
+ }
203
+ const railwayService = service.serviceId ? findByName(services, service.serviceId) : findByName(services, service.serviceName);
204
+ if (!railwayService?.id) {
205
+ issues.push(`${service.serviceName}: Railway service was not found.`);
206
+ continue;
207
+ }
208
+ const [instance, variables, volumes] = await Promise.all([
209
+ getRailwayServiceInstance({ serviceId: railwayService.id, environmentId: environment.id, env: options.env, fetchImpl: options.fetchImpl }),
210
+ listRailwayVariables({ projectId: project.id, environmentId: environment.id, serviceId: railwayService.id, env: options.env, fetchImpl: options.fetchImpl }).catch(() => ({})),
211
+ listRailwayVolumes({ projectId: project.id, env: options.env, fetchImpl: options.fetchImpl }).catch(() => [])
212
+ ]);
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;
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
+ }
238
+ observed[service.serviceName] = {
239
+ projectName: project.name,
240
+ environmentName: environment.name,
241
+ serviceName: railwayService.name,
242
+ serviceId: railwayService.id,
243
+ rootDirectory: instance.rootDirectory,
244
+ buildCommand: instance.buildCommand,
245
+ dockerfilePath: instance.dockerfilePath,
246
+ startCommand: instance.startCommand,
247
+ healthcheckPath: instance.healthcheckPath,
248
+ healthcheckTimeoutSeconds: instance.healthcheckTimeoutSeconds,
249
+ runtimeMode: service.runtimeMode ?? instance.runtimeMode,
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,
266
+ variables: variableKeys,
267
+ secrets: variableKeys,
268
+ health: "unknown"
269
+ };
270
+ }
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.`);
286
+ continue;
287
+ }
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;
293
+ }
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
+ }
330
+ }
331
+ }
332
+ }
333
+ return { observed, status: "observed", issues };
334
+ } catch (error) {
335
+ return {
336
+ observed,
337
+ status: "failed",
338
+ issues: [...issues, liveCheckErrorMessage(error, "Railway live observation failed without provider details.")].filter((issue) => issue.trim())
339
+ };
340
+ }
341
+ }
342
+ async function collectHttpObservations(options) {
343
+ const deployConfig = loadTreeseedPlatformConfig({ tenantRoot: options.tenantRoot, environment: options.target, env: process.env }).deployConfig;
344
+ const urls = /* @__PURE__ */ new Set();
345
+ const fallbacks = /* @__PURE__ */ new Map();
346
+ const selectedServiceKeys = selectedServiceKeySet(options);
347
+ const selectedApplication = options.appId ? discoverTreeseedApplications(options.tenantRoot).find((application) => application.id === options.appId || application.relativeRoot === options.appId) : null;
348
+ if (!options.appId || options.appId === "web" || selectedApplication?.roles.includes("web")) {
349
+ const webConfig = selectedWebConfig(deployConfig, selectedApplication);
350
+ const webDomain = webConfig.surfaces?.web?.environments?.[options.target]?.domain ?? webConfig.surfaces?.web?.publicBaseUrl ?? webConfig.siteUrl;
351
+ const webUrl = urlForDomain(webDomain);
352
+ if (webUrl) {
353
+ urls.add(webUrl);
354
+ if (!options.appId || options.appId === "web" || selectedApplication?.roles.includes("api")) {
355
+ urls.add(`${webUrl}/v1/healthz`);
356
+ }
357
+ const pagesProjectName = webConfig.cloudflare?.pages?.projectName;
358
+ if (pagesProjectName) {
359
+ const branchName = pagesBranchName(webConfig, options.target);
360
+ const pagesUrl = options.target === "prod" ? `https://${pagesProjectName}.pages.dev` : `https://${branchName}.${pagesProjectName}.pages.dev`;
361
+ fallbacks.set(webUrl, pagesUrl);
362
+ }
363
+ }
364
+ }
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))) {
366
+ const serviceConfig = deployConfig.services?.[service.key];
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);
368
+ const baseUrl = urlForDomain(domain);
369
+ if (!baseUrl) continue;
370
+ urls.add(`${baseUrl}${service.healthcheckPath ?? "/healthz"}`);
371
+ if (service.key === "api") urls.add(`${baseUrl}/healthz/deep`);
372
+ }
373
+ const entries = await Promise.all([...urls].map(async (url) => {
374
+ const observed = await observeHttp(url, options);
375
+ const fallbackUrl = fallbacks.get(url);
376
+ if (observed.ok !== true && !observed.status && fallbackUrl) {
377
+ const fallback = await observeHttp(fallbackUrl, options);
378
+ return [url, {
379
+ ...observed,
380
+ fallbackUrl,
381
+ fallbackStatus: fallback.status,
382
+ fallbackOk: fallback.ok,
383
+ fallbackError: fallback.error
384
+ }];
385
+ }
386
+ return [url, observed];
387
+ }));
388
+ return Object.fromEntries(entries);
389
+ }
390
+ function strictenReport(report, options) {
391
+ if (!options.strict) return report;
392
+ const checks = report.checks.map((check) => {
393
+ if (check.status !== "skipped") return check;
394
+ const providerRequired = options.requireLiveRailway && check.provider === "railway" || options.requireLiveHttp && check.provider === "http";
395
+ if (!providerRequired) return check;
396
+ return {
397
+ ...check,
398
+ status: "failed",
399
+ issues: check.issues.length > 0 ? check.issues : ["Required live observation was not available."],
400
+ remediation: check.remediation ?? "Run provider configuration bootstrap or verify provider credentials, then rerun with --live."
401
+ };
402
+ });
403
+ const summary = {
404
+ passed: checks.filter((entry) => entry.status === "passed").length,
405
+ failed: checks.filter((entry) => entry.status === "failed").length,
406
+ skipped: checks.filter((entry) => entry.status === "skipped").length,
407
+ warning: checks.filter((entry) => entry.status === "warning").length
408
+ };
409
+ return { ...report, checks, summary };
410
+ }
411
+ async function collectTreeseedLiveHostedServiceChecks(options) {
412
+ const effectiveOptions = {
413
+ ...options,
414
+ env: resolveLiveProviderEnv(options)
415
+ };
416
+ const requireLiveRailway = options.requireLiveRailway ?? options.strict === true;
417
+ const requireLiveHttp = options.requireLiveHttp ?? options.strict === true;
418
+ const railway = requireLiveRailway ? await collectRailwayObservations(effectiveOptions) : { observed: {}, status: "skipped", issues: [] };
419
+ const httpChecks = requireLiveHttp ? await collectHttpObservations(effectiveOptions) : {};
420
+ const report = collectTreeseedHostedServiceChecks({
421
+ tenantRoot: effectiveOptions.tenantRoot,
422
+ target: effectiveOptions.target,
423
+ appId: effectiveOptions.appId,
424
+ serviceKeys: effectiveOptions.serviceKeys,
425
+ observedRailwayServices: railway.observed,
426
+ httpChecks
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;
450
+ const httpStatus = requireLiveHttp ? Object.values(httpChecks).some((entry) => entry.ok === true || entry.status) ? "observed" : "failed" : "skipped";
451
+ return strictenReport({
452
+ ...reportWithLiveIssues,
453
+ live: true,
454
+ liveObservation: {
455
+ railway: railway.status,
456
+ http: httpStatus,
457
+ issues: railwayIssues
458
+ }
459
+ }, options);
460
+ }
461
+ export {
462
+ collectTreeseedLiveHostedServiceChecks
463
+ };
@@ -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;
@@ -5,7 +5,7 @@ const SAFE_MANAGED_HOST_CI_VARIABLES = /* @__PURE__ */ new Set([
5
5
  "TREESEED_HOSTING_KIND",
6
6
  "TREESEED_HOSTING_REGISTRATION",
7
7
  "TREESEED_HOSTING_TEAM_ID",
8
- "TREESEED_MARKET_API_BASE_URL",
8
+ "TREESEED_API_BASE_URL",
9
9
  "TREESEED_PROJECT_ID"
10
10
  ]);
11
11
  const SAFE_MANAGED_HOST_CI_SECRETS = /* @__PURE__ */ new Set([
@@ -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[];