@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,602 @@
1
+ import { existsSync } from "node:fs";
2
+ import { dirname, resolve } from "node:path";
3
+ import { resolveTreeseedLaunchEnvironment } from "../operations/services/config-runtime.js";
4
+ import { cloudflareApiRequest, resolveCloudflareZoneIdForHost, resolveConfiguredCloudflareAccountId, runWrangler } from "../operations/services/deploy.js";
5
+ const ALL_ENVIRONMENTS = ["local", "staging", "prod"];
6
+ const PROVIDER_ENVIRONMENTS = ["staging", "prod"];
7
+ function capabilities(ids, environments = ALL_ENVIRONMENTS) {
8
+ return ids.map((id) => ({ id, environments }));
9
+ }
10
+ function syntheticStatus(input) {
11
+ return {
12
+ status: "pending",
13
+ locators: {
14
+ hostId: input.unit.host.id,
15
+ projectGroupId: input.unit.projectGroup?.id ?? null
16
+ },
17
+ state: {
18
+ unitId: input.unit.id,
19
+ serviceType: input.unit.serviceType.id,
20
+ placement: input.unit.placement,
21
+ dryRun: input.dryRun === true
22
+ },
23
+ warnings: []
24
+ };
25
+ }
26
+ function defaultPlan(input) {
27
+ return {
28
+ unitId: input.unit.id,
29
+ action: input.observed.status === "ready" ? "noop" : "create",
30
+ reasons: input.observed.status === "ready" ? ["unit already ready"] : ["unit is not yet recorded as ready by the hosting graph"],
31
+ before: input.observed.state,
32
+ after: sanitizedUnitConfig(input.unit),
33
+ warnings: []
34
+ };
35
+ }
36
+ function defaultVerify(input) {
37
+ const hostCapabilities = new Set(input.unit.host.capabilities.filter((capability) => capability.environments.includes(input.environment)).map((capability) => capability.id));
38
+ const missing = input.unit.requiredCapabilities.filter((capability) => !hostCapabilities.has(capability));
39
+ return {
40
+ unitId: input.unit.id,
41
+ status: missing.length === 0 ? input.observed.status : "blocked",
42
+ verified: missing.length === 0,
43
+ checks: [
44
+ {
45
+ key: "host-capabilities",
46
+ label: "Host supports required capabilities",
47
+ ok: missing.length === 0,
48
+ expected: input.unit.requiredCapabilities,
49
+ observed: [...hostCapabilities],
50
+ issues: missing.map((capability) => `Missing host capability: ${capability}`)
51
+ },
52
+ {
53
+ key: "secrets-redacted",
54
+ label: "Secrets are represented by references only",
55
+ ok: !JSON.stringify(input.unit.config).match(/(token|secret|password|key)\s*[:=]\s*[^",}]+/iu),
56
+ expected: "secretRefs",
57
+ observed: input.unit.secretRefs,
58
+ issues: []
59
+ }
60
+ ],
61
+ warnings: []
62
+ };
63
+ }
64
+ function createSyntheticHostAdapter(id, label, capabilityIds, environments = ALL_ENVIRONMENTS) {
65
+ return {
66
+ id,
67
+ label,
68
+ capabilities: capabilities(capabilityIds, environments),
69
+ refresh: syntheticStatus,
70
+ diff: defaultPlan,
71
+ apply(input) {
72
+ return {
73
+ ...syntheticStatus(input),
74
+ status: input.dryRun ? "pending" : "ready",
75
+ state: {
76
+ ...syntheticStatus(input).state,
77
+ applied: input.dryRun !== true
78
+ }
79
+ };
80
+ },
81
+ verify: defaultVerify,
82
+ status: syntheticStatus
83
+ };
84
+ }
85
+ function unitConfig(input) {
86
+ return input.unit.config && typeof input.unit.config === "object" ? input.unit.config : {};
87
+ }
88
+ function cloudflarePagesConfig(input) {
89
+ return unitConfig(input).cloudflare?.pages && typeof unitConfig(input).cloudflare.pages === "object" ? unitConfig(input).cloudflare.pages : {};
90
+ }
91
+ function cloudflarePagesProjectName(input) {
92
+ const pages = cloudflarePagesConfig(input);
93
+ return typeof pages.projectName === "string" && pages.projectName.trim() ? pages.projectName.trim() : null;
94
+ }
95
+ function cloudflarePagesBranchName(input) {
96
+ const pages = cloudflarePagesConfig(input);
97
+ const key = input.environment === "prod" ? "productionBranch" : "stagingBranch";
98
+ const fallback = input.environment === "prod" ? "main" : "staging";
99
+ return typeof pages[key] === "string" && pages[key].trim() ? pages[key].trim() : fallback;
100
+ }
101
+ function cloudflarePagesBuildOutputDir(input) {
102
+ const pages = cloudflarePagesConfig(input);
103
+ return typeof pages.buildOutputDir === "string" && pages.buildOutputDir.trim() ? pages.buildOutputDir.trim() : "dist";
104
+ }
105
+ function cloudflarePagesBuildCommand(input) {
106
+ const pages = cloudflarePagesConfig(input);
107
+ return typeof pages.buildCommand === "string" && pages.buildCommand.trim() ? pages.buildCommand.trim() : null;
108
+ }
109
+ function cloudflarePagesConfigRoot(input) {
110
+ let current = resolve(input.graph.tenantRoot);
111
+ while (true) {
112
+ if (existsSync(resolve(current, ".treeseed", "config", "machine.yaml"))) {
113
+ return current;
114
+ }
115
+ const parent = dirname(current);
116
+ if (parent === current) {
117
+ return resolve(input.graph.tenantRoot);
118
+ }
119
+ current = parent;
120
+ }
121
+ }
122
+ function cloudflarePagesEnv(input) {
123
+ const configRoot = cloudflarePagesConfigRoot(input);
124
+ const resolvedValues = input.environment === "local" ? {} : resolveTreeseedLaunchEnvironment({
125
+ tenantRoot: configRoot,
126
+ scope: input.environment
127
+ });
128
+ const accountId = [
129
+ process.env.TREESEED_CLOUDFLARE_ACCOUNT_ID,
130
+ resolvedValues.CLOUDFLARE_ACCOUNT_ID,
131
+ resolveConfiguredCloudflareAccountId(input.graph.deployConfig)
132
+ ].find((value) => typeof value === "string" && value.trim().length > 0)?.trim() ?? "";
133
+ const token = [
134
+ process.env.TREESEED_CLOUDFLARE_API_TOKEN,
135
+ resolvedValues.CLOUDFLARE_API_TOKEN
136
+ ].find((value) => typeof value === "string" && value.trim().length > 0)?.trim() ?? "";
137
+ return {
138
+ ...resolvedValues,
139
+ CLOUDFLARE_ACCOUNT_ID: accountId,
140
+ CLOUDFLARE_API_TOKEN: token
141
+ };
142
+ }
143
+ function cloudflarePagesDomain(input) {
144
+ const config = unitConfig(input);
145
+ return typeof config.domain === "string" && config.domain.trim() ? config.domain.trim() : null;
146
+ }
147
+ function cloudflarePagesDeploymentUrl(projectName, branchName, environment) {
148
+ return environment === "prod" ? `https://${projectName}.pages.dev` : `https://${branchName}.${projectName}.pages.dev`;
149
+ }
150
+ function cloudflarePagesDnsTarget(projectName, branchName, environment) {
151
+ return environment === "prod" ? `${projectName}.pages.dev` : `${branchName}.${projectName}.pages.dev`;
152
+ }
153
+ function cloudflarePagesDomainName(domain) {
154
+ return typeof domain?.name === "string" ? domain.name : typeof domain?.domain === "string" ? domain.domain : typeof domain?.hostname === "string" ? domain.hostname : "";
155
+ }
156
+ function listCloudflarePagesDomains(input, projectName) {
157
+ const env = cloudflarePagesEnv(input);
158
+ const accountId = String(env.CLOUDFLARE_ACCOUNT_ID ?? "").trim();
159
+ const token = String(env.CLOUDFLARE_API_TOKEN ?? "").trim();
160
+ if (!projectName || !accountId || !token) return [];
161
+ const domains = [];
162
+ let page = 1;
163
+ let totalPages = 1;
164
+ while (page <= totalPages && page <= 50) {
165
+ const payload = cloudflareApiRequest(
166
+ `/accounts/${encodeURIComponent(accountId)}/pages/projects/${encodeURIComponent(projectName)}/domains?per_page=25&page=${page}`,
167
+ { env, allowFailure: true }
168
+ );
169
+ if (payload?.success === false) break;
170
+ if (Array.isArray(payload?.result)) domains.push(...payload.result);
171
+ const reportedTotal = Number(payload?.result_info?.total_pages);
172
+ totalPages = Number.isFinite(reportedTotal) && reportedTotal > 0 ? reportedTotal : page;
173
+ page += 1;
174
+ }
175
+ return domains;
176
+ }
177
+ function findCloudflarePagesDomain(input, projectName, domain) {
178
+ if (!domain) return null;
179
+ const env = cloudflarePagesEnv(input);
180
+ const accountId = String(env.CLOUDFLARE_ACCOUNT_ID ?? "").trim();
181
+ const token = String(env.CLOUDFLARE_API_TOKEN ?? "").trim();
182
+ if (accountId && token) {
183
+ const direct = cloudflareApiRequest(
184
+ `/accounts/${encodeURIComponent(accountId)}/pages/projects/${encodeURIComponent(projectName)}/domains/${encodeURIComponent(domain)}`,
185
+ { env, allowFailure: true }
186
+ )?.result ?? null;
187
+ if (cloudflarePagesDomainName(direct) === domain) return direct;
188
+ }
189
+ return listCloudflarePagesDomains(input, projectName).find((entry) => cloudflarePagesDomainName(entry) === domain) ?? null;
190
+ }
191
+ function cloudflareDnsRecordName(record) {
192
+ return typeof record?.name === "string" ? record.name : "";
193
+ }
194
+ function listCloudflareDnsRecords(input, recordName) {
195
+ const env = cloudflarePagesEnv(input);
196
+ const zoneId = recordName ? resolveCloudflareZoneIdForHost(input.graph.deployConfig, recordName, env) : null;
197
+ if (!zoneId || !recordName) return { zoneId, records: [] };
198
+ const payload = cloudflareApiRequest(
199
+ `/zones/${encodeURIComponent(zoneId)}/dns_records?name=${encodeURIComponent(recordName)}&per_page=100`,
200
+ { env, allowFailure: true }
201
+ );
202
+ return {
203
+ zoneId,
204
+ records: Array.isArray(payload?.result) ? payload.result : []
205
+ };
206
+ }
207
+ function observeCloudflarePagesProject(input, projectName) {
208
+ const env = cloudflarePagesEnv(input);
209
+ const accountId = String(env.CLOUDFLARE_ACCOUNT_ID ?? "").trim();
210
+ const token = String(env.CLOUDFLARE_API_TOKEN ?? "").trim();
211
+ if (!accountId || !token) return null;
212
+ return cloudflareApiRequest(
213
+ `/accounts/${encodeURIComponent(accountId)}/pages/projects/${encodeURIComponent(projectName)}`,
214
+ { env, allowFailure: true }
215
+ )?.result ?? null;
216
+ }
217
+ function observeCloudflarePagesDomain(input, projectName, domain) {
218
+ return findCloudflarePagesDomain(input, projectName, domain);
219
+ }
220
+ function observeCloudflarePagesDeployment(input, projectName, branchName) {
221
+ const result = runWrangler(["pages", "deployment", "list", "--project-name", projectName, "--json"], {
222
+ cwd: input.graph.tenantRoot,
223
+ capture: true,
224
+ allowFailure: true,
225
+ env: cloudflarePagesEnv(input)
226
+ });
227
+ if (result.status !== 0) return null;
228
+ try {
229
+ const deployments = JSON.parse(result.stdout || "[]");
230
+ return (Array.isArray(deployments) ? deployments : []).find((entry) => entry?.Branch === branchName || entry?.branch === branchName) ?? null;
231
+ } catch {
232
+ return null;
233
+ }
234
+ }
235
+ function observeCloudflarePagesDns(input, projectName, branchName, domain) {
236
+ if (!domain) return null;
237
+ const expectedContent = cloudflarePagesDnsTarget(projectName, branchName, input.environment);
238
+ const { zoneId, records } = listCloudflareDnsRecords(input, domain);
239
+ const record = records.find(
240
+ (entry) => cloudflareDnsRecordName(entry) === domain && String(entry?.type ?? "").toUpperCase() === "CNAME" && entry?.content === expectedContent
241
+ ) ?? null;
242
+ return record ? { ...record, zoneId } : null;
243
+ }
244
+ function createCloudflareHostAdapter() {
245
+ const base = createSyntheticHostAdapter("cloudflare", "Cloudflare", [
246
+ "web-site",
247
+ "object-store",
248
+ "database",
249
+ "dns",
250
+ "domain",
251
+ "secret",
252
+ "variable",
253
+ "deployment",
254
+ "health"
255
+ ], PROVIDER_ENVIRONMENTS);
256
+ const isPagesSite = (input) => input.unit.serviceType.id === "web-site";
257
+ return {
258
+ ...base,
259
+ refresh(input) {
260
+ if (!isPagesSite(input)) return base.refresh(input);
261
+ const projectName = cloudflarePagesProjectName(input);
262
+ const project = projectName ? observeCloudflarePagesProject(input, projectName) : null;
263
+ const domain = cloudflarePagesDomain(input);
264
+ const branchName = cloudflarePagesBranchName(input);
265
+ const observedDomain = projectName ? observeCloudflarePagesDomain(input, projectName, domain) : null;
266
+ const observedDns = projectName ? observeCloudflarePagesDns(input, projectName, branchName, domain) : null;
267
+ const observedDeployment = projectName ? observeCloudflarePagesDeployment(input, projectName, branchName) : null;
268
+ const domainReady = !domain || Boolean(observedDomain && observedDns);
269
+ const deploymentReady = Boolean(observedDeployment);
270
+ return {
271
+ status: projectName && project?.name === projectName && domainReady && deploymentReady ? "ready" : projectName ? "pending" : "blocked",
272
+ locators: {
273
+ hostId: input.unit.host.id,
274
+ projectGroupId: input.unit.projectGroup?.id ?? null,
275
+ projectName,
276
+ domain,
277
+ pagesDevUrl: projectName ? cloudflarePagesDeploymentUrl(projectName, branchName, input.environment) : null
278
+ },
279
+ state: {
280
+ unitId: input.unit.id,
281
+ serviceType: input.unit.serviceType.id,
282
+ placement: input.unit.placement,
283
+ projectName,
284
+ branchName,
285
+ observedProjectName: project?.name ?? null,
286
+ observedDomain: cloudflarePagesDomainName(observedDomain),
287
+ observedDnsRecord: observedDns ? {
288
+ name: observedDns.name ?? null,
289
+ type: observedDns.type ?? null,
290
+ content: observedDns.content ?? null,
291
+ proxied: observedDns.proxied ?? null
292
+ } : null,
293
+ observedDeployment: observedDeployment ? {
294
+ id: observedDeployment.Id ?? observedDeployment.id ?? null,
295
+ branch: observedDeployment.Branch ?? observedDeployment.branch ?? null,
296
+ deployment: observedDeployment.Deployment ?? observedDeployment.url ?? null
297
+ } : null,
298
+ buildOutputDir: cloudflarePagesBuildOutputDir(input),
299
+ buildCommand: cloudflarePagesBuildCommand(input)
300
+ },
301
+ warnings: projectName ? [] : ["Cloudflare Pages projectName is missing."]
302
+ };
303
+ },
304
+ apply(input) {
305
+ if (!isPagesSite(input)) return base.apply(input);
306
+ return {
307
+ ...syntheticStatus(input),
308
+ status: "blocked",
309
+ warnings: [
310
+ "Cloudflare Pages mutation is reconciler-owned. Use trsd hosting apply or trsd reconcile apply so the Cloudflare reconcile adapter performs apply, refresh, verify, and persist."
311
+ ]
312
+ };
313
+ },
314
+ verify(input) {
315
+ if (!isPagesSite(input)) return base.verify(input);
316
+ if (input.dryRun) return base.verify(input);
317
+ const projectName = cloudflarePagesProjectName(input);
318
+ const branchName = projectName ? cloudflarePagesBranchName(input) : null;
319
+ const domain = cloudflarePagesDomain(input);
320
+ const observed = input.observed;
321
+ const observedState = observed.state && typeof observed.state === "object" ? observed.state : {};
322
+ const observedProjectName = observedState.observedProjectName ?? observedState.projectName ?? null;
323
+ const observedDomain = observedState.observedDomain ?? null;
324
+ const observedDnsRecord = observedState.observedDnsRecord ?? null;
325
+ const observedDeployment = observedState.observedDeployment ?? null;
326
+ const checks = [
327
+ {
328
+ key: "pages-project.exists",
329
+ label: "Cloudflare Pages project exists",
330
+ ok: Boolean(projectName && observedProjectName === projectName),
331
+ expected: projectName,
332
+ observed: observedProjectName,
333
+ issues: projectName && observedProjectName === projectName ? [] : [`Cloudflare Pages project ${projectName ?? "(unset)"} was not observed.`]
334
+ },
335
+ {
336
+ key: "pages-deployment.exists",
337
+ label: "Cloudflare Pages branch deployment exists",
338
+ ok: Boolean(observedDeployment),
339
+ expected: branchName,
340
+ observed: observedDeployment,
341
+ issues: observedDeployment ? [] : [`Cloudflare Pages project ${projectName ?? "(unset)"} has no deployment for branch ${branchName ?? "(unset)"}.`]
342
+ },
343
+ {
344
+ key: "pages-domain.exists",
345
+ label: "Cloudflare Pages custom domain is attached",
346
+ ok: !domain || observedDomain === domain,
347
+ expected: domain,
348
+ observed: observedDomain,
349
+ issues: !domain || observedDomain === domain ? [] : [`Cloudflare Pages custom domain ${domain} is not attached to project ${projectName ?? "(unset)"}.`]
350
+ },
351
+ {
352
+ key: "pages-dns.exists",
353
+ label: "Cloudflare DNS record points to the Pages branch",
354
+ ok: !domain || Boolean(observedDnsRecord),
355
+ expected: domain && projectName && branchName ? {
356
+ name: domain,
357
+ type: "CNAME",
358
+ content: cloudflarePagesDnsTarget(projectName, branchName, input.environment),
359
+ proxied: true
360
+ } : null,
361
+ observed: observedDnsRecord,
362
+ issues: !domain || observedDnsRecord ? [] : [`Cloudflare DNS record ${domain} -> ${projectName && branchName ? cloudflarePagesDnsTarget(projectName, branchName, input.environment) : "(unset)"} is missing.`]
363
+ }
364
+ ];
365
+ return {
366
+ unitId: input.unit.id,
367
+ status: checks.every((check) => check.ok) ? "ready" : "pending",
368
+ verified: checks.every((check) => check.ok),
369
+ checks,
370
+ warnings: []
371
+ };
372
+ },
373
+ status(input) {
374
+ return isPagesSite(input) ? this.refresh(input) : base.status(input);
375
+ }
376
+ };
377
+ }
378
+ function createDefaultHostAdapters() {
379
+ return {
380
+ railway: createSyntheticHostAdapter("railway", "Railway", [
381
+ "project",
382
+ "environment",
383
+ "container",
384
+ "volume",
385
+ "database",
386
+ "domain",
387
+ "secret",
388
+ "variable",
389
+ "deployment",
390
+ "scheduled-job",
391
+ "health",
392
+ "logs"
393
+ ], PROVIDER_ENVIRONMENTS),
394
+ cloudflare: createCloudflareHostAdapter(),
395
+ github: createSyntheticHostAdapter("github", "GitHub", [
396
+ "source-repository",
397
+ "workflow",
398
+ "secret",
399
+ "variable",
400
+ "health"
401
+ ], PROVIDER_ENVIRONMENTS),
402
+ smtp: createSyntheticHostAdapter("smtp", "SMTP", [
403
+ "email-relay",
404
+ "secret",
405
+ "health"
406
+ ], ALL_ENVIRONMENTS),
407
+ "local-process": createSyntheticHostAdapter("local-process", "Local process", [
408
+ "process",
409
+ "web-site",
410
+ "container",
411
+ "variable",
412
+ "deployment",
413
+ "health",
414
+ "logs",
415
+ "port",
416
+ "hot-reload"
417
+ ], ["local"]),
418
+ "local-docker": createSyntheticHostAdapter("local-docker", "Local Docker", [
419
+ "container",
420
+ "volume",
421
+ "database",
422
+ "object-store",
423
+ "secret",
424
+ "variable",
425
+ "deployment",
426
+ "health",
427
+ "logs"
428
+ ], ["local"])
429
+ };
430
+ }
431
+ function serviceType(id, label, placement, requiredCapabilities, defaultHostByEnvironment, composes = []) {
432
+ return {
433
+ id,
434
+ label,
435
+ placement,
436
+ requiredCapabilities,
437
+ defaultHostByEnvironment,
438
+ composes,
439
+ describe(unit) {
440
+ return `${label} on ${unit.host.label}`;
441
+ }
442
+ };
443
+ }
444
+ function createDefaultServiceTypeAdapters() {
445
+ return {
446
+ "web-site": serviceType("web-site", "Web site", "web", ["web-site", "deployment", "health"], {
447
+ local: "local-process",
448
+ staging: "cloudflare",
449
+ prod: "cloudflare"
450
+ }),
451
+ "container-api": serviceType("container-api", "Container API", "api", ["container", "variable", "deployment", "health"], {
452
+ local: "local-process",
453
+ staging: "railway",
454
+ prod: "railway"
455
+ }),
456
+ "stateful-container": serviceType("stateful-container", "Stateful container", "operations", ["container", "volume", "variable", "deployment", "health"], {
457
+ local: "local-docker",
458
+ staging: "railway",
459
+ prod: "railway"
460
+ }),
461
+ "runner-pool": serviceType("runner-pool", "Runner pool", "runner-capacity", ["container", "volume", "variable", "deployment", "health"], {
462
+ local: "local-docker",
463
+ staging: "railway",
464
+ prod: "railway"
465
+ }),
466
+ "scheduled-job": serviceType("scheduled-job", "Scheduled job", "operations", ["scheduled-job", "variable", "deployment", "health"], {
467
+ local: "local-process",
468
+ staging: "railway",
469
+ prod: "railway"
470
+ }),
471
+ "relational-database": serviceType("relational-database", "Relational database", "database", ["database", "secret", "health"], {
472
+ local: "local-docker",
473
+ staging: "railway",
474
+ prod: "railway"
475
+ }),
476
+ "object-store": serviceType("object-store", "Object store", "content-storage", ["object-store", "health"], {
477
+ local: "local-docker",
478
+ staging: "cloudflare",
479
+ prod: "cloudflare"
480
+ }),
481
+ "source-repository": serviceType("source-repository", "Source repository", "repository", ["source-repository", "health"], {
482
+ local: "local-process",
483
+ staging: "github",
484
+ prod: "github"
485
+ }),
486
+ "email-relay": serviceType("email-relay", "Email relay", "email", ["email-relay", "secret", "health"], {
487
+ local: "smtp",
488
+ staging: "smtp",
489
+ prod: "smtp"
490
+ }),
491
+ "knowledge-library": serviceType("knowledge-library", "Knowledge library", "knowledge-library", [], {
492
+ local: "local-docker",
493
+ staging: "railway",
494
+ prod: "railway"
495
+ }, ["treedx-federation"]),
496
+ "treedx-node": serviceType("treedx-node", "TreeDX node", "knowledge-library", ["container", "volume", "variable", "deployment", "health"], {
497
+ local: "local-docker",
498
+ staging: "railway",
499
+ prod: "railway"
500
+ }, ["stateful-container"]),
501
+ "treedx-federation": serviceType("treedx-federation", "TreeDX federation", "knowledge-library", [], {
502
+ local: "local-docker",
503
+ staging: "railway",
504
+ prod: "railway"
505
+ }, ["treedx-node"]),
506
+ "treeseed-control-plane": serviceType("treeseed-control-plane", "Treeseed control plane", "operations", [], {
507
+ local: "local-process",
508
+ staging: "railway",
509
+ prod: "railway"
510
+ }, ["container-api", "runner-pool", "relational-database"]),
511
+ "capacity-provider": serviceType("capacity-provider", "Capacity provider", "runner-capacity", [], {
512
+ local: "local-docker",
513
+ staging: "railway",
514
+ prod: "railway"
515
+ }, ["runner-pool"])
516
+ };
517
+ }
518
+ function createDefaultHostingProfiles() {
519
+ return [
520
+ {
521
+ id: "treeseed-managed-public-team",
522
+ label: "TreeSeed managed public team",
523
+ description: "Public teams use the shared public TreeDX federation and managed web/content defaults.",
524
+ services: [],
525
+ metadata: { publicRead: true, managed: true }
526
+ },
527
+ {
528
+ id: "treeseed-managed-private-team",
529
+ label: "TreeSeed managed private team",
530
+ description: "Private teams receive dedicated managed infrastructure for privacy-bearing data.",
531
+ services: [],
532
+ metadata: { publicRead: false, managed: true }
533
+ },
534
+ {
535
+ id: "customer-self-hosted",
536
+ label: "Customer self-hosted",
537
+ description: "Customer-owned hosts satisfy the same service capabilities.",
538
+ services: [],
539
+ metadata: { managed: false }
540
+ },
541
+ {
542
+ id: "local-development",
543
+ label: "Local development",
544
+ description: "Hot-reload local processes for code services and local Docker for stateful services.",
545
+ services: [],
546
+ metadata: { local: true, hotReload: true }
547
+ },
548
+ {
549
+ id: "production-like-local",
550
+ label: "Production-like local",
551
+ description: "Local containers model provider-backed runtime behavior without mutating hosted resources.",
552
+ services: [],
553
+ metadata: { local: true, productionLike: true }
554
+ }
555
+ ];
556
+ }
557
+ function sanitizedUnitConfig(unit) {
558
+ return {
559
+ id: unit.id,
560
+ label: unit.label,
561
+ serviceType: unit.serviceType.id,
562
+ placement: unit.placement,
563
+ hostId: unit.host.id,
564
+ environment: unit.environment,
565
+ projectGroupId: unit.projectGroup?.id ?? null,
566
+ requiredCapabilities: unit.requiredCapabilities,
567
+ secretRefs: unit.secretRefs,
568
+ variableRefs: unit.variableRefs,
569
+ application: unit.application ? {
570
+ id: unit.application.id,
571
+ relativeRoot: unit.application.relativeRoot,
572
+ roles: unit.application.roles
573
+ } : null,
574
+ config: redactSensitiveConfig(unit.config),
575
+ metadata: redactSensitiveConfig(unit.metadata)
576
+ };
577
+ }
578
+ function redactSensitiveConfig(value) {
579
+ if (Array.isArray(value)) return value.map((entry) => redactSensitiveConfig(entry));
580
+ if (!value || typeof value !== "object") return value;
581
+ return Object.fromEntries(Object.entries(value).map(([key, entry]) => {
582
+ if (/(secret|token|password|privateKey|apiKey|credential)/iu.test(key)) {
583
+ return [key, "[redacted]"];
584
+ }
585
+ return [key, redactSensitiveConfig(entry)];
586
+ }));
587
+ }
588
+ function summarizePlacementStatus(statuses) {
589
+ if (statuses.includes("blocked")) return "blocked";
590
+ if (statuses.includes("degraded")) return "degraded";
591
+ if (statuses.includes("pending")) return "pending";
592
+ if (statuses.includes("ready")) return "ready";
593
+ return "unknown";
594
+ }
595
+ export {
596
+ createDefaultHostAdapters,
597
+ createDefaultHostingProfiles,
598
+ createDefaultServiceTypeAdapters,
599
+ redactSensitiveConfig,
600
+ sanitizedUnitConfig,
601
+ summarizePlacementStatus
602
+ };