@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
@@ -1,6 +1,10 @@
1
1
  import { errorDiagnostic, warningDiagnostic } from "./errors.js";
2
2
  import {
3
- SEED_ENVIRONMENTS
3
+ SEED_CONTENT_PUBLISH_TARGETS,
4
+ SEED_CONTENT_RUNTIME_SOURCES,
5
+ SEED_ENVIRONMENTS,
6
+ SEED_LOCAL_CONTENT_MATERIALIZATIONS,
7
+ SEED_PROJECT_TOPOLOGIES
4
8
  } from "./types.js";
5
9
  const RESOURCE_BUCKETS = [
6
10
  "teams",
@@ -16,6 +20,30 @@ const RESOURCE_BUCKETS = [
16
20
  ];
17
21
  const SUPPORTED_BUCKETS = /* @__PURE__ */ new Set(["teams", "repositoryHosts", "projects", "hubRepositories", "products", "catalogArtifacts", "capacityProviders", "capacityGrants", "workPolicies"]);
18
22
  const ALLOWED_ENVIRONMENTS = new Set(SEED_ENVIRONMENTS);
23
+ const ALLOWED_PROJECT_TOPOLOGIES = new Set(SEED_PROJECT_TOPOLOGIES);
24
+ const ALLOWED_CONTENT_RUNTIME_SOURCES = new Set(SEED_CONTENT_RUNTIME_SOURCES);
25
+ const ALLOWED_LOCAL_CONTENT_MATERIALIZATIONS = new Set(SEED_LOCAL_CONTENT_MATERIALIZATIONS);
26
+ const ALLOWED_CONTENT_PUBLISH_TARGETS = new Set(SEED_CONTENT_PUBLISH_TARGETS);
27
+ const LEGACY_PROVIDER_TASK_SCOPE_PREFIX = "provider:tasks:";
28
+ const ALLOWED_RECIPE_CHANNELS = /* @__PURE__ */ new Set(["cli", "ui", "api", "provider-runtime", "system-check"]);
29
+ const ALLOWED_RECIPE_OPERATIONS = /* @__PURE__ */ new Set([
30
+ "navigate",
31
+ "seed.apply",
32
+ "seed.plan",
33
+ "verify.treedx",
34
+ "capacity-provider.create",
35
+ "capacity.up",
36
+ "capacity.status",
37
+ "capacity.allocate.portfolio",
38
+ "capacity.allocate.project",
39
+ "project.create",
40
+ "provider-runtime.launch",
41
+ "work.start",
42
+ "work.review-decision",
43
+ "knowledge.inspect-artifacts",
44
+ "knowledge.publish",
45
+ "system.health"
46
+ ]);
19
47
  const CREDENTIAL_REF_PATTERN = /^(?:env|secret|provider-session):[A-Za-z0-9_./:-]+$/u;
20
48
  function isRecord(value) {
21
49
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -75,6 +103,15 @@ function objectField(record, field, path, diagnostics) {
75
103
  }
76
104
  return value;
77
105
  }
106
+ function booleanField(record, field, path, diagnostics) {
107
+ const value = record[field];
108
+ if (value === void 0) return void 0;
109
+ if (typeof value !== "boolean") {
110
+ diagnostics.push(errorDiagnostic("seed.invalid_boolean", `Expected ${field} to be a boolean.`, `${path}.${field}`));
111
+ return void 0;
112
+ }
113
+ return value;
114
+ }
78
115
  function stringArrayField(record, field, path, diagnostics) {
79
116
  const value = record[field];
80
117
  if (value === void 0) return void 0;
@@ -84,6 +121,23 @@ function stringArrayField(record, field, path, diagnostics) {
84
121
  }
85
122
  return value.map((entry) => asString(entry)).filter(Boolean);
86
123
  }
124
+ function recordArrayField(record, field, path, diagnostics) {
125
+ const value = record[field];
126
+ if (value === void 0) return [];
127
+ if (!Array.isArray(value)) {
128
+ diagnostics.push(errorDiagnostic("seed.invalid_array", `Expected ${field} to be an array.`, `${path}.${field}`));
129
+ return [];
130
+ }
131
+ const result = [];
132
+ value.forEach((entry, index) => {
133
+ if (!isRecord(entry)) {
134
+ diagnostics.push(errorDiagnostic("seed.invalid_object", `Expected ${field} entry to be an object.`, `${path}.${field}[${index}]`));
135
+ return;
136
+ }
137
+ result.push(entry);
138
+ });
139
+ return result;
140
+ }
87
141
  function keyBase(record, path, diagnostics) {
88
142
  const key = requireString(record, "key", path, diagnostics);
89
143
  const environments = parseEnvironments(record.environments, `${path}.environments`, diagnostics);
@@ -123,11 +177,87 @@ function parseRepository(value, path, diagnostics) {
123
177
  validateRepository(repository, path, diagnostics);
124
178
  return repository;
125
179
  }
180
+ function parseProjectContentPublishTarget(value, path, diagnostics) {
181
+ if (value === void 0) return void 0;
182
+ if (!isRecord(value)) {
183
+ diagnostics.push(errorDiagnostic("seed.invalid_project_architecture", "Expected contentPublishTarget to be an object.", path));
184
+ return void 0;
185
+ }
186
+ const kind = requireString(value, "kind", path, diagnostics);
187
+ if (kind && !ALLOWED_CONTENT_PUBLISH_TARGETS.has(kind)) {
188
+ diagnostics.push(errorDiagnostic("seed.invalid_project_architecture", `Unsupported content publish target: ${kind}.`, `${path}.kind`));
189
+ }
190
+ return {
191
+ kind: ALLOWED_CONTENT_PUBLISH_TARGETS.has(kind) ? kind : "none",
192
+ bucket: asString(value.bucket) || void 0,
193
+ prefix: asString(value.prefix) || void 0,
194
+ manifestPath: asString(value.manifestPath) || void 0,
195
+ metadata: objectField(value, "metadata", path, diagnostics)
196
+ };
197
+ }
198
+ function parseProjectArchitecture(value, path, diagnostics) {
199
+ if (!isRecord(value)) {
200
+ diagnostics.push(errorDiagnostic("seed.missing_project_architecture", "Project resources must declare canonical architecture.", path));
201
+ return null;
202
+ }
203
+ const topology = requireString(value, "topology", path, diagnostics);
204
+ const contentRuntimeSource = requireString(value, "contentRuntimeSource", path, diagnostics);
205
+ const localContentMaterialization = requireString(value, "localContentMaterialization", path, diagnostics);
206
+ if (topology && !ALLOWED_PROJECT_TOPOLOGIES.has(topology)) {
207
+ diagnostics.push(errorDiagnostic("seed.invalid_project_architecture", `Unsupported project topology: ${topology}.`, `${path}.topology`));
208
+ }
209
+ if (contentRuntimeSource && !ALLOWED_CONTENT_RUNTIME_SOURCES.has(contentRuntimeSource)) {
210
+ diagnostics.push(errorDiagnostic("seed.invalid_project_architecture", `Unsupported content runtime source: ${contentRuntimeSource}.`, `${path}.contentRuntimeSource`));
211
+ }
212
+ if (localContentMaterialization && !ALLOWED_LOCAL_CONTENT_MATERIALIZATIONS.has(localContentMaterialization)) {
213
+ diagnostics.push(errorDiagnostic("seed.invalid_project_architecture", `Unsupported local content materialization: ${localContentMaterialization}.`, `${path}.localContentMaterialization`));
214
+ }
215
+ const architecture = {
216
+ topology: ALLOWED_PROJECT_TOPOLOGIES.has(topology) ? topology : "single_repository_site",
217
+ rootPath: asString(value.rootPath) || ".",
218
+ sitePath: requireString(value, "sitePath", path, diagnostics),
219
+ contentPath: asString(value.contentPath) || void 0,
220
+ contentRuntimeSource: ALLOWED_CONTENT_RUNTIME_SOURCES.has(contentRuntimeSource) ? contentRuntimeSource : "r2_published_manifest",
221
+ localContentMaterialization: ALLOWED_LOCAL_CONTENT_MATERIALIZATIONS.has(localContentMaterialization) ? localContentMaterialization : "none",
222
+ contentPublishTarget: parseProjectContentPublishTarget(value.contentPublishTarget, `${path}.contentPublishTarget`, diagnostics),
223
+ requiresLocalContentForCi: booleanField(value, "requiresLocalContentForCi", path, diagnostics),
224
+ requiresLocalContentForDeploy: booleanField(value, "requiresLocalContentForDeploy", path, diagnostics)
225
+ };
226
+ validateProjectArchitecture(architecture, path, diagnostics);
227
+ return architecture;
228
+ }
229
+ function validateProjectArchitecture(architecture, path, diagnostics) {
230
+ if (!architecture.sitePath) return;
231
+ if (architecture.topology === "single_repository_site" && architecture.rootPath === "" && architecture.sitePath === "") {
232
+ diagnostics.push(errorDiagnostic("seed.invalid_project_architecture", "single_repository_site projects must have repository-relative rootPath and sitePath values.", path));
233
+ }
234
+ if (architecture.topology === "split_site_content" && !architecture.contentPath && architecture.contentRuntimeSource === "local_directory") {
235
+ diagnostics.push(errorDiagnostic("seed.invalid_project_architecture", "split_site_content projects using local_directory content must declare contentPath.", `${path}.contentPath`));
236
+ }
237
+ if (!architecture.requiresLocalContentForCi && !architecture.requiresLocalContentForDeploy && architecture.contentRuntimeSource !== "local_directory" && ["managed_clone", "submodule"].includes(architecture.localContentMaterialization)) {
238
+ diagnostics.push(errorDiagnostic(
239
+ "seed.local_content_required_by_default",
240
+ "CI/deploy defaults must not require managed_clone or submodule content unless requiresLocalContentForCi or requiresLocalContentForDeploy is explicit.",
241
+ `${path}.localContentMaterialization`
242
+ ));
243
+ }
244
+ if (architecture.contentPublishTarget?.kind === "cloudflare_r2" && architecture.contentRuntimeSource === "local_directory" && !architecture.contentPath) {
245
+ diagnostics.push(errorDiagnostic("seed.invalid_project_architecture", "Cloudflare R2 content publish targets need a contentPath when runtime source is local_directory.", `${path}.contentPath`));
246
+ }
247
+ }
126
248
  function parseProject(value, path, diagnostics) {
127
249
  if (!isRecord(value)) {
128
250
  diagnostics.push(errorDiagnostic("seed.invalid_resource", "Expected project resource to be an object.", path));
129
251
  return null;
130
252
  }
253
+ const metadata = objectField(value, "metadata", path, diagnostics);
254
+ if (metadata?.repositoryTopology !== void 0 || metadata?.contentRoot !== void 0 || metadata?.sitePath !== void 0 || metadata?.contentPath !== void 0) {
255
+ diagnostics.push(errorDiagnostic(
256
+ "seed.legacy_project_topology_metadata",
257
+ "Project topology must be declared in project.architecture, not metadata.",
258
+ `${path}.metadata`
259
+ ));
260
+ }
131
261
  return {
132
262
  ...keyBase(value, path, diagnostics),
133
263
  team: requireString(value, "team", path, diagnostics),
@@ -136,7 +266,14 @@ function parseProject(value, path, diagnostics) {
136
266
  description: asString(value.description) || void 0,
137
267
  kind: asString(value.kind) || void 0,
138
268
  repository: parseRepository(value.repository, `${path}.repository`, diagnostics),
139
- metadata: objectField(value, "metadata", path, diagnostics)
269
+ architecture: parseProjectArchitecture(value.architecture, `${path}.architecture`, diagnostics) ?? {
270
+ topology: "single_repository_site",
271
+ rootPath: ".",
272
+ sitePath: "",
273
+ contentRuntimeSource: "r2_published_manifest",
274
+ localContentMaterialization: "none"
275
+ },
276
+ metadata
140
277
  };
141
278
  }
142
279
  function parseRepositoryHost(value, path, diagnostics) {
@@ -275,11 +412,22 @@ function parseProviderRegistration(value, path, diagnostics) {
275
412
  if (apiKeyValue.createIfMissing !== void 0 && typeof apiKeyValue.createIfMissing !== "boolean") {
276
413
  diagnostics.push(errorDiagnostic("seed.invalid_boolean", "Expected registration.apiKey.createIfMissing to be a boolean.", `${path}.apiKey.createIfMissing`));
277
414
  }
415
+ const scopes = stringArrayField(apiKeyValue, "scopes", `${path}.apiKey`, diagnostics);
416
+ scopes?.forEach((scope, index) => {
417
+ if (scope.startsWith(LEGACY_PROVIDER_TASK_SCOPE_PREFIX)) {
418
+ diagnostics.push(errorDiagnostic(
419
+ "seed.legacy_provider_task_scope",
420
+ `Legacy provider task scope ${scope} is not supported; use provider assignment scopes instead.`,
421
+ `${path}.apiKey.scopes[${index}]`
422
+ ));
423
+ }
424
+ });
278
425
  return {
279
426
  apiKey: {
280
427
  createIfMissing: typeof apiKeyValue.createIfMissing === "boolean" ? apiKeyValue.createIfMissing : void 0,
281
428
  name: asString(apiKeyValue.name) || void 0,
282
- scopes: stringArrayField(apiKeyValue, "scopes", `${path}.apiKey`, diagnostics),
429
+ plaintextKey: asString(apiKeyValue.plaintextKey) || void 0,
430
+ scopes,
283
431
  expiresAt: asString(apiKeyValue.expiresAt) || void 0
284
432
  }
285
433
  };
@@ -415,6 +563,63 @@ function parseWorkPolicy(value, path, diagnostics) {
415
563
  metadata: objectField(value, "metadata", path, diagnostics)
416
564
  };
417
565
  }
566
+ function parseRecipeCommand(value, path, diagnostics) {
567
+ if (value === void 0) return void 0;
568
+ if (!isRecord(value)) {
569
+ diagnostics.push(errorDiagnostic("seed.invalid_object", "Expected command to be an object.", path));
570
+ return void 0;
571
+ }
572
+ const argv = stringArrayField(value, "argv", path, diagnostics);
573
+ if (argv.length === 0) {
574
+ diagnostics.push(errorDiagnostic("seed.recipe_command_missing_argv", "Recipe command must include argv.", `${path}.argv`));
575
+ }
576
+ return { argv };
577
+ }
578
+ function parseRecipeStep(value, path, diagnostics) {
579
+ if (!isRecord(value)) {
580
+ diagnostics.push(errorDiagnostic("seed.invalid_recipe_step", "Expected operation recipe step to be an object.", path));
581
+ return null;
582
+ }
583
+ const channel = requireString(value, "channel", path, diagnostics);
584
+ if (channel && !ALLOWED_RECIPE_CHANNELS.has(channel)) {
585
+ diagnostics.push(errorDiagnostic("seed.recipe_unknown_channel", `Unsupported operation recipe channel: ${channel}.`, `${path}.channel`));
586
+ }
587
+ const operation = requireString(value, "operation", path, diagnostics);
588
+ if (operation && !ALLOWED_RECIPE_OPERATIONS.has(operation)) {
589
+ diagnostics.push(errorDiagnostic("seed.recipe_unknown_operation", `Unsupported operation recipe operation: ${operation}.`, `${path}.operation`));
590
+ }
591
+ return {
592
+ id: requireString(value, "id", path, diagnostics),
593
+ title: requireString(value, "title", path, diagnostics),
594
+ actor: asString(value.actor) || void 0,
595
+ channel: ALLOWED_RECIPE_CHANNELS.has(channel) ? channel : "system-check",
596
+ operation,
597
+ dependsOn: stringArrayField(value, "dependsOn", path, diagnostics) ?? [],
598
+ uses: stringArrayField(value, "uses", path, diagnostics) ?? [],
599
+ target: asString(value.target) || void 0,
600
+ command: parseRecipeCommand(value.command, `${path}.command`, diagnostics),
601
+ assertions: recordArrayField(value, "assertions", path, diagnostics),
602
+ artifacts: recordArrayField(value, "artifacts", path, diagnostics)
603
+ };
604
+ }
605
+ function parseOperationRecipe(value, path, diagnostics, manifestEnvironments) {
606
+ if (!isRecord(value)) {
607
+ diagnostics.push(errorDiagnostic("seed.invalid_recipe", "Expected operation recipe to be an object.", path));
608
+ return null;
609
+ }
610
+ const environments = parseEnvironments(value.environments, `${path}.environments`, diagnostics) ?? manifestEnvironments;
611
+ const recipe = {
612
+ id: requireString(value, "id", path, diagnostics),
613
+ title: requireString(value, "title", path, diagnostics),
614
+ environments,
615
+ entrypoints: stringArrayField(value, "entrypoints", path, diagnostics) ?? [],
616
+ steps: Array.isArray(value.steps) ? value.steps.map((step, index) => parseRecipeStep(step, `${path}.steps[${index}]`, diagnostics)).filter((step) => Boolean(step)) : []
617
+ };
618
+ if (!Array.isArray(value.steps)) {
619
+ diagnostics.push(errorDiagnostic("seed.invalid_recipe_steps", "Operation recipe steps must be an array.", `${path}.steps`));
620
+ }
621
+ return recipe;
622
+ }
418
623
  function validateRepository(repository, path, diagnostics) {
419
624
  if (!repository.gitUrl) return;
420
625
  if (/^(?:\.{1,2}\/?|packages\/|\/)/u.test(repository.gitUrl) || !/(?:^[a-z][a-z0-9+.-]*:\/\/|^git@)/iu.test(repository.gitUrl)) {
@@ -542,6 +747,85 @@ function validateReferences(manifest, diagnostics) {
542
747
  if (!projectKeys.has(policy.project)) diagnostics.push(errorDiagnostic("seed.invalid_reference", `Unknown project reference: ${policy.project}.`, `resources.workPolicies[${index}].project`));
543
748
  });
544
749
  }
750
+ function allResourceKeys(manifest) {
751
+ return /* @__PURE__ */ new Set([
752
+ ...manifest.resources.teams.map((team) => team.key),
753
+ ...manifest.resources.repositoryHosts.map((host) => host.key),
754
+ ...manifest.resources.projects.map((project) => project.key),
755
+ ...manifest.resources.hubRepositories.map((repository) => repository.key),
756
+ ...manifest.resources.products.map((product) => product.key),
757
+ ...manifest.resources.catalogArtifacts.map((artifact) => artifact.key),
758
+ ...manifest.resources.capacityProviders.flatMap((provider) => [provider.key, ...(provider.lanes ?? []).map((lane) => lane.key)]),
759
+ ...manifest.resources.capacityGrants.map((grant) => grant.key),
760
+ ...manifest.resources.workPolicies.map((policy) => policy.key)
761
+ ]);
762
+ }
763
+ function validateOperationRecipes(manifest, diagnostics) {
764
+ const recipeIds = /* @__PURE__ */ new Map();
765
+ const resourceKeys = allResourceKeys(manifest);
766
+ manifest.operationRecipes.forEach((recipe, recipeIndex) => {
767
+ const recipePath = `operationRecipes[${recipeIndex}]`;
768
+ const existingRecipePath = recipeIds.get(recipe.id);
769
+ if (recipe.id && existingRecipePath) {
770
+ diagnostics.push(errorDiagnostic("seed.recipe_duplicate_id", `Duplicate operation recipe id ${recipe.id}; first seen at ${existingRecipePath}.`, `${recipePath}.id`));
771
+ }
772
+ if (recipe.id) recipeIds.set(recipe.id, `${recipePath}.id`);
773
+ if (recipe.environments.length === 0) {
774
+ diagnostics.push(errorDiagnostic("seed.recipe_missing_environments", "Operation recipe must target at least one environment.", `${recipePath}.environments`));
775
+ }
776
+ for (const environment of recipe.environments) {
777
+ if (!manifest.environments.includes(environment)) {
778
+ diagnostics.push(errorDiagnostic("seed.recipe_environment_not_declared", `Recipe environment ${environment} is not declared in environments.`, `${recipePath}.environments`));
779
+ }
780
+ }
781
+ const steps = /* @__PURE__ */ new Map();
782
+ recipe.steps.forEach((step, stepIndex) => {
783
+ const stepPath = `${recipePath}.steps[${stepIndex}]`;
784
+ const existingStep = steps.get(step.id);
785
+ if (step.id && existingStep) {
786
+ diagnostics.push(errorDiagnostic("seed.recipe_duplicate_step_id", `Duplicate operation recipe step id ${step.id}.`, `${stepPath}.id`));
787
+ }
788
+ if (step.id) steps.set(step.id, step);
789
+ step.uses.forEach((resourceKey, useIndex) => {
790
+ if (!resourceKeys.has(resourceKey)) {
791
+ diagnostics.push(errorDiagnostic("seed.recipe_invalid_resource_reference", `Unknown recipe resource reference: ${resourceKey}.`, `${stepPath}.uses[${useIndex}]`));
792
+ }
793
+ });
794
+ });
795
+ recipe.entrypoints.forEach((entrypoint, entrypointIndex) => {
796
+ if (!steps.has(entrypoint)) {
797
+ diagnostics.push(errorDiagnostic("seed.recipe_invalid_entrypoint", `Unknown recipe entrypoint step: ${entrypoint}.`, `${recipePath}.entrypoints[${entrypointIndex}]`));
798
+ }
799
+ });
800
+ recipe.steps.forEach((step, stepIndex) => {
801
+ step.dependsOn.forEach((dependency, dependencyIndex) => {
802
+ if (!steps.has(dependency)) {
803
+ diagnostics.push(errorDiagnostic("seed.recipe_invalid_dependency", `Unknown recipe dependency step: ${dependency}.`, `${recipePath}.steps[${stepIndex}].dependsOn[${dependencyIndex}]`));
804
+ }
805
+ });
806
+ });
807
+ const visiting = /* @__PURE__ */ new Set();
808
+ const visited = /* @__PURE__ */ new Set();
809
+ const visit = (stepId, chain) => {
810
+ if (visited.has(stepId)) return;
811
+ if (visiting.has(stepId)) {
812
+ diagnostics.push(errorDiagnostic("seed.recipe_cycle", `Recipe dependency cycle detected: ${[...chain, stepId].join(" -> ")}.`, recipePath));
813
+ return;
814
+ }
815
+ const step = steps.get(stepId);
816
+ if (!step) return;
817
+ visiting.add(stepId);
818
+ for (const dependency of step.dependsOn) {
819
+ visit(dependency, [...chain, stepId]);
820
+ }
821
+ visiting.delete(stepId);
822
+ visited.add(stepId);
823
+ };
824
+ for (const step of recipe.steps) {
825
+ visit(step.id, []);
826
+ }
827
+ });
828
+ }
545
829
  function parseSeedManifest(value, diagnostics) {
546
830
  walkForSecrets(value, "", diagnostics);
547
831
  if (!isRecord(value)) {
@@ -590,10 +874,15 @@ function parseSeedManifest(value, diagnostics) {
590
874
  description: asString(value.description) || void 0,
591
875
  defaultEnvironments,
592
876
  environments,
593
- resources
877
+ resources,
878
+ operationRecipes: Array.isArray(value.operationRecipes) ? value.operationRecipes.map((recipe, index) => parseOperationRecipe(recipe, `operationRecipes[${index}]`, diagnostics, environments)).filter((recipe) => Boolean(recipe)) : []
594
879
  };
880
+ if (value.operationRecipes !== void 0 && !Array.isArray(value.operationRecipes)) {
881
+ diagnostics.push(errorDiagnostic("seed.invalid_operation_recipes", "operationRecipes must be an array.", "operationRecipes"));
882
+ }
595
883
  validateResourceKeys(manifest, diagnostics);
596
884
  validateReferences(manifest, diagnostics);
885
+ validateOperationRecipes(manifest, diagnostics);
597
886
  if (diagnostics.length === 0 && manifest.resources.projects.length === 0) {
598
887
  diagnostics.push(warningDiagnostic("seed.empty_projects", "Seed manifest does not define projects.", "resources.projects"));
599
888
  }
@@ -3,6 +3,7 @@ export type SeedEnvironment = typeof SEED_ENVIRONMENTS[number];
3
3
  export type SeedDiagnosticSeverity = 'error' | 'warning';
4
4
  export type SeedPlanActionType = 'create' | 'update' | 'unchanged' | 'skip' | 'delete' | 'error';
5
5
  export type SeedResourceKind = 'team' | 'repositoryHost' | 'project' | 'hubRepository' | 'capacityProvider' | 'capacityLane' | 'capacityGrant' | 'workPolicy' | 'product' | 'catalogArtifact';
6
+ export type SeedOperationRecipeChannel = 'cli' | 'ui' | 'api' | 'provider-runtime' | 'system-check';
6
7
  export type SeedDiagnostic = {
7
8
  severity: SeedDiagnosticSeverity;
8
9
  code: string;
@@ -13,6 +14,32 @@ export type SeedResourceBase = {
13
14
  key: string;
14
15
  environments?: SeedEnvironment[];
15
16
  };
17
+ export declare const SEED_PROJECT_TOPOLOGIES: readonly ["single_repository_site", "split_site_content", "parent_workspace"];
18
+ export declare const SEED_CONTENT_RUNTIME_SOURCES: readonly ["local_directory", "treedx_snapshot", "r2_published_manifest", "r2_preview_overlay"];
19
+ export declare const SEED_LOCAL_CONTENT_MATERIALIZATIONS: readonly ["none", "existing_path", "managed_clone", "submodule"];
20
+ export declare const SEED_CONTENT_PUBLISH_TARGETS: readonly ["none", "cloudflare_r2"];
21
+ export type SeedProjectTopology = typeof SEED_PROJECT_TOPOLOGIES[number];
22
+ export type SeedContentRuntimeSource = typeof SEED_CONTENT_RUNTIME_SOURCES[number];
23
+ export type SeedLocalContentMaterialization = typeof SEED_LOCAL_CONTENT_MATERIALIZATIONS[number];
24
+ export type SeedContentPublishTargetKind = typeof SEED_CONTENT_PUBLISH_TARGETS[number];
25
+ export type SeedProjectContentPublishTarget = {
26
+ kind: SeedContentPublishTargetKind;
27
+ bucket?: string;
28
+ prefix?: string;
29
+ manifestPath?: string;
30
+ metadata?: Record<string, unknown>;
31
+ };
32
+ export type SeedProjectArchitecture = {
33
+ topology: SeedProjectTopology;
34
+ rootPath: string;
35
+ sitePath: string;
36
+ contentPath?: string;
37
+ contentRuntimeSource: SeedContentRuntimeSource;
38
+ localContentMaterialization: SeedLocalContentMaterialization;
39
+ contentPublishTarget?: SeedProjectContentPublishTarget;
40
+ requiresLocalContentForCi?: boolean;
41
+ requiresLocalContentForDeploy?: boolean;
42
+ };
16
43
  export type SeedManifest = {
17
44
  name: string;
18
45
  version: 1;
@@ -20,6 +47,7 @@ export type SeedManifest = {
20
47
  defaultEnvironments?: SeedEnvironment[];
21
48
  environments: SeedEnvironment[];
22
49
  resources: SeedManifestResources;
50
+ operationRecipes: SeedOperationRecipe[];
23
51
  };
24
52
  export type SeedManifestResources = {
25
53
  teams: SeedTeamResource[];
@@ -59,6 +87,7 @@ export type SeedProjectResource = SeedResourceBase & {
59
87
  description?: string;
60
88
  kind?: string;
61
89
  repository: SeedProjectRepository;
90
+ architecture: SeedProjectArchitecture;
62
91
  metadata?: Record<string, unknown>;
63
92
  };
64
93
  export type SeedRepositoryHostResource = SeedResourceBase & {
@@ -133,6 +162,7 @@ export type SeedCapacityLaneResource = SeedResourceBase & {
133
162
  export type SeedCapacityProviderRegistrationApiKey = {
134
163
  createIfMissing?: boolean;
135
164
  name?: string;
165
+ plaintextKey?: string;
136
166
  scopes?: string[];
137
167
  expiresAt?: string;
138
168
  };
@@ -219,6 +249,35 @@ export type SeedWorkPolicyResource = SeedResourceBase & {
219
249
  creditWeights?: unknown[];
220
250
  metadata?: Record<string, unknown>;
221
251
  };
252
+ export type SeedOperationRecipeCommand = {
253
+ argv: string[];
254
+ };
255
+ export type SeedOperationRecipeAssertion = Record<string, unknown>;
256
+ export type SeedOperationRecipeArtifact = Record<string, unknown>;
257
+ export type SeedOperationRecipeStep = {
258
+ id: string;
259
+ title: string;
260
+ actor?: string;
261
+ channel: SeedOperationRecipeChannel;
262
+ operation: string;
263
+ dependsOn: string[];
264
+ uses: string[];
265
+ target?: string;
266
+ command?: SeedOperationRecipeCommand;
267
+ assertions: SeedOperationRecipeAssertion[];
268
+ artifacts: SeedOperationRecipeArtifact[];
269
+ };
270
+ export type SeedOperationRecipe = {
271
+ id: string;
272
+ title: string;
273
+ environments: SeedEnvironment[];
274
+ entrypoints: string[];
275
+ steps: SeedOperationRecipeStep[];
276
+ };
277
+ export type SeedOperationRecipePlan = SeedOperationRecipe & {
278
+ selected: boolean;
279
+ orderedSteps: SeedOperationRecipeStep[];
280
+ };
222
281
  export type NormalizedSeedResource = {
223
282
  kind: SeedResourceKind;
224
283
  key: string;
@@ -247,6 +306,7 @@ export type SeedPlan = {
247
306
  environments: SeedEnvironment[];
248
307
  summary: SeedPlanSummary;
249
308
  actions: SeedPlanAction[];
309
+ recipes: SeedOperationRecipePlan[];
250
310
  diagnostics: SeedDiagnostic[];
251
311
  manifestPath: string;
252
312
  };
@@ -1,4 +1,12 @@
1
1
  const SEED_ENVIRONMENTS = ["local", "staging", "prod"];
2
+ const SEED_PROJECT_TOPOLOGIES = ["single_repository_site", "split_site_content", "parent_workspace"];
3
+ const SEED_CONTENT_RUNTIME_SOURCES = ["local_directory", "treedx_snapshot", "r2_published_manifest", "r2_preview_overlay"];
4
+ const SEED_LOCAL_CONTENT_MATERIALIZATIONS = ["none", "existing_path", "managed_clone", "submodule"];
5
+ const SEED_CONTENT_PUBLISH_TARGETS = ["none", "cloudflare_r2"];
2
6
  export {
3
- SEED_ENVIRONMENTS
7
+ SEED_CONTENT_PUBLISH_TARGETS,
8
+ SEED_CONTENT_RUNTIME_SOURCES,
9
+ SEED_ENVIRONMENTS,
10
+ SEED_LOCAL_CONTENT_MATERIALIZATIONS,
11
+ SEED_PROJECT_TOPOLOGIES
4
12
  };
@@ -0,0 +1,54 @@
1
+ export declare const TREESEED_GITHUB_TOKEN_ENV = "TREESEED_GITHUB_TOKEN";
2
+ export declare const TREESEED_GITHUB_COPILOT_TOKEN_ENV = "TREESEED_GITHUB_COPILOT_TOKEN";
3
+ export declare const TREESEED_CLOUDFLARE_API_TOKEN_ENV = "TREESEED_CLOUDFLARE_API_TOKEN";
4
+ export declare const TREESEED_CLOUDFLARE_ACCOUNT_ID_ENV = "TREESEED_CLOUDFLARE_ACCOUNT_ID";
5
+ export declare const TREESEED_RAILWAY_API_TOKEN_ENV = "TREESEED_RAILWAY_API_TOKEN";
6
+ export declare const TREESEED_RAILWAY_TOKEN_ENV = "TREESEED_RAILWAY_TOKEN";
7
+ export declare const TREESEED_DOCKERHUB_TOKEN_ENV = "TREESEED_DOCKERHUB_TOKEN";
8
+ export declare const TREESEED_DOCKERHUB_USERNAME_ENV = "TREESEED_DOCKERHUB_USERNAME";
9
+ export declare const TREESEED_CODEX_API_KEY_ENV = "TREESEED_CODEX_API_KEY";
10
+ type EnvLike = Record<string, string | undefined>;
11
+ export declare function resolveTreeseedGitHubToken(env?: EnvLike): string;
12
+ export declare function resolveTreeseedGitHubCopilotToken(env?: EnvLike): string;
13
+ export declare function resolveTreeseedCloudflareApiToken(env?: EnvLike): string;
14
+ export declare function resolveTreeseedCloudflareAccountId(env?: EnvLike): string;
15
+ export declare function resolveTreeseedRailwayApiToken(env?: EnvLike): string;
16
+ export declare function resolveTreeseedRailwayProjectToken(env?: EnvLike): string;
17
+ export declare function resolveTreeseedDockerhubToken(env?: EnvLike): string;
18
+ export declare function resolveTreeseedDockerhubUsername(env?: EnvLike): string;
19
+ export declare function resolveTreeseedCodexApiKey(env?: EnvLike): string;
20
+ export declare function withGitHubServiceCredentialEnv<TEnv extends EnvLike>(env: TEnv): TEnv & {
21
+ GH_TOKEN?: string;
22
+ GITHUB_TOKEN?: string;
23
+ };
24
+ export declare function withCloudflareServiceCredentialEnv<TEnv extends EnvLike>(env: TEnv): TEnv & {
25
+ CLOUDFLARE_API_TOKEN?: string;
26
+ CLOUDFLARE_ACCOUNT_ID?: string;
27
+ };
28
+ export declare function withRailwayServiceCredentialEnv<TEnv extends EnvLike>(env: TEnv): TEnv & {
29
+ RAILWAY_API_TOKEN?: string;
30
+ RAILWAY_TOKEN?: string;
31
+ };
32
+ export declare function withDockerhubServiceCredentialEnv<TEnv extends EnvLike>(env: TEnv): TEnv & {
33
+ DOCKERHUB_TOKEN?: string;
34
+ DOCKERHUB_USERNAME?: string;
35
+ };
36
+ export declare function withCodexServiceCredentialEnv<TEnv extends EnvLike>(env: TEnv): TEnv & {
37
+ CODEX_API_KEY?: string;
38
+ };
39
+ export declare function withTreeseedServiceCredentialEnv<TEnv extends EnvLike>(env: TEnv): TEnv & {
40
+ GH_TOKEN?: string;
41
+ GITHUB_TOKEN?: string;
42
+ } & {
43
+ CLOUDFLARE_API_TOKEN?: string;
44
+ CLOUDFLARE_ACCOUNT_ID?: string;
45
+ } & {
46
+ RAILWAY_API_TOKEN?: string;
47
+ RAILWAY_TOKEN?: string;
48
+ } & {
49
+ DOCKERHUB_TOKEN?: string;
50
+ DOCKERHUB_USERNAME?: string;
51
+ } & {
52
+ CODEX_API_KEY?: string;
53
+ };
54
+ export {};
@@ -0,0 +1,112 @@
1
+ const TREESEED_GITHUB_TOKEN_ENV = "TREESEED_GITHUB_TOKEN";
2
+ const TREESEED_GITHUB_COPILOT_TOKEN_ENV = "TREESEED_GITHUB_COPILOT_TOKEN";
3
+ const TREESEED_CLOUDFLARE_API_TOKEN_ENV = "TREESEED_CLOUDFLARE_API_TOKEN";
4
+ const TREESEED_CLOUDFLARE_ACCOUNT_ID_ENV = "TREESEED_CLOUDFLARE_ACCOUNT_ID";
5
+ const TREESEED_RAILWAY_API_TOKEN_ENV = "TREESEED_RAILWAY_API_TOKEN";
6
+ const TREESEED_RAILWAY_TOKEN_ENV = "TREESEED_RAILWAY_TOKEN";
7
+ const TREESEED_DOCKERHUB_TOKEN_ENV = "TREESEED_DOCKERHUB_TOKEN";
8
+ const TREESEED_DOCKERHUB_USERNAME_ENV = "TREESEED_DOCKERHUB_USERNAME";
9
+ const TREESEED_CODEX_API_KEY_ENV = "TREESEED_CODEX_API_KEY";
10
+ function configuredValue(env, key) {
11
+ const value = env?.[key];
12
+ return typeof value === "string" && value.trim() ? value.trim() : "";
13
+ }
14
+ function resolveTreeseedGitHubToken(env = process.env) {
15
+ return configuredValue(env, TREESEED_GITHUB_TOKEN_ENV);
16
+ }
17
+ function resolveTreeseedGitHubCopilotToken(env = process.env) {
18
+ return configuredValue(env, TREESEED_GITHUB_COPILOT_TOKEN_ENV);
19
+ }
20
+ function resolveTreeseedCloudflareApiToken(env = process.env) {
21
+ return configuredValue(env, TREESEED_CLOUDFLARE_API_TOKEN_ENV);
22
+ }
23
+ function resolveTreeseedCloudflareAccountId(env = process.env) {
24
+ return configuredValue(env, TREESEED_CLOUDFLARE_ACCOUNT_ID_ENV);
25
+ }
26
+ function resolveTreeseedRailwayApiToken(env = process.env) {
27
+ return configuredValue(env, TREESEED_RAILWAY_API_TOKEN_ENV);
28
+ }
29
+ function resolveTreeseedRailwayProjectToken(env = process.env) {
30
+ return configuredValue(env, TREESEED_RAILWAY_TOKEN_ENV);
31
+ }
32
+ function resolveTreeseedDockerhubToken(env = process.env) {
33
+ return configuredValue(env, TREESEED_DOCKERHUB_TOKEN_ENV);
34
+ }
35
+ function resolveTreeseedDockerhubUsername(env = process.env) {
36
+ return configuredValue(env, TREESEED_DOCKERHUB_USERNAME_ENV);
37
+ }
38
+ function resolveTreeseedCodexApiKey(env = process.env) {
39
+ return configuredValue(env, TREESEED_CODEX_API_KEY_ENV);
40
+ }
41
+ function withGitHubServiceCredentialEnv(env) {
42
+ const token = resolveTreeseedGitHubToken(env);
43
+ return token ? { ...env, GH_TOKEN: token, GITHUB_TOKEN: token } : { ...env };
44
+ }
45
+ function withCloudflareServiceCredentialEnv(env) {
46
+ const token = resolveTreeseedCloudflareApiToken(env);
47
+ const accountId = resolveTreeseedCloudflareAccountId(env);
48
+ return {
49
+ ...env,
50
+ ...token ? { CLOUDFLARE_API_TOKEN: token } : {},
51
+ ...accountId ? { CLOUDFLARE_ACCOUNT_ID: accountId } : {}
52
+ };
53
+ }
54
+ function withRailwayServiceCredentialEnv(env) {
55
+ const token = resolveTreeseedRailwayApiToken(env);
56
+ const projectToken = resolveTreeseedRailwayProjectToken(env);
57
+ return {
58
+ ...env,
59
+ ...token ? { RAILWAY_API_TOKEN: token } : {},
60
+ ...projectToken ? { RAILWAY_TOKEN: projectToken } : {}
61
+ };
62
+ }
63
+ function withDockerhubServiceCredentialEnv(env) {
64
+ const token = resolveTreeseedDockerhubToken(env);
65
+ const username = resolveTreeseedDockerhubUsername(env);
66
+ return {
67
+ ...env,
68
+ ...token ? { DOCKERHUB_TOKEN: token } : {},
69
+ ...username ? { DOCKERHUB_USERNAME: username } : {}
70
+ };
71
+ }
72
+ function withCodexServiceCredentialEnv(env) {
73
+ const token = resolveTreeseedCodexApiKey(env);
74
+ return token ? { ...env, CODEX_API_KEY: token } : { ...env };
75
+ }
76
+ function withTreeseedServiceCredentialEnv(env) {
77
+ return withCodexServiceCredentialEnv(
78
+ withDockerhubServiceCredentialEnv(
79
+ withRailwayServiceCredentialEnv(
80
+ withCloudflareServiceCredentialEnv(
81
+ withGitHubServiceCredentialEnv(env)
82
+ )
83
+ )
84
+ )
85
+ );
86
+ }
87
+ export {
88
+ TREESEED_CLOUDFLARE_ACCOUNT_ID_ENV,
89
+ TREESEED_CLOUDFLARE_API_TOKEN_ENV,
90
+ TREESEED_CODEX_API_KEY_ENV,
91
+ TREESEED_DOCKERHUB_TOKEN_ENV,
92
+ TREESEED_DOCKERHUB_USERNAME_ENV,
93
+ TREESEED_GITHUB_COPILOT_TOKEN_ENV,
94
+ TREESEED_GITHUB_TOKEN_ENV,
95
+ TREESEED_RAILWAY_API_TOKEN_ENV,
96
+ TREESEED_RAILWAY_TOKEN_ENV,
97
+ resolveTreeseedCloudflareAccountId,
98
+ resolveTreeseedCloudflareApiToken,
99
+ resolveTreeseedCodexApiKey,
100
+ resolveTreeseedDockerhubToken,
101
+ resolveTreeseedDockerhubUsername,
102
+ resolveTreeseedGitHubCopilotToken,
103
+ resolveTreeseedGitHubToken,
104
+ resolveTreeseedRailwayApiToken,
105
+ resolveTreeseedRailwayProjectToken,
106
+ withCloudflareServiceCredentialEnv,
107
+ withCodexServiceCredentialEnv,
108
+ withDockerhubServiceCredentialEnv,
109
+ withGitHubServiceCredentialEnv,
110
+ withRailwayServiceCredentialEnv,
111
+ withTreeseedServiceCredentialEnv
112
+ };
@@ -1,5 +1,5 @@
1
- import type { SdkCursorEntity, SdkCursorRequest, SdkGetCursorRequest, SdkSearchRequest, SdkUpdateRequest } from '../sdk-types.ts';
2
- import { SqliteStoreBase } from './helpers.ts';
1
+ import type { SdkCursorEntity, SdkCursorRequest, SdkGetCursorRequest, SdkSearchRequest, SdkUpdateRequest } from '../sdk-types.js';
2
+ import { SqliteStoreBase } from './helpers.js';
3
3
  export declare class CursorStore extends SqliteStoreBase {
4
4
  private usesEnvelopeTable;
5
5
  getByKey(key: string): Promise<SdkCursorEntity | null>;