@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,447 @@
1
+ import { resolveTreeseedSceneBaseUrl } from "./base-url.js";
2
+ import { prepareTreeseedSceneEnvironment } from "./environment.js";
3
+ import { resolveTreeseedSceneAuth } from "./auth.js";
4
+ import { planOrApplyTreeseedSceneSeed } from "./seed.js";
5
+ import { sceneErrorDiagnostic } from "./diagnostics.js";
6
+ import { createBuiltInTreeseedSceneDiagramProvider } from "./diagram-providers.js";
7
+ import { buildTreeseedSceneNarrationEntries } from "./training-transcript.js";
8
+ function duration(start, end) {
9
+ return Math.max(0, end.getTime() - start.getTime());
10
+ }
11
+ function mailpitApiUrl(mailpitUrl, pathname) {
12
+ const url = new URL(pathname, mailpitUrl.endsWith("/") ? mailpitUrl : `${mailpitUrl}/`);
13
+ return url.toString();
14
+ }
15
+ function stringValue(value) {
16
+ return typeof value === "string" ? value : "";
17
+ }
18
+ function mailpitMessageId(value) {
19
+ if (!value || typeof value !== "object") return "";
20
+ const record = value;
21
+ return stringValue(record.ID) || stringValue(record.Id) || stringValue(record.id);
22
+ }
23
+ function mailpitMessageSubject(value) {
24
+ if (!value || typeof value !== "object") return "";
25
+ const record = value;
26
+ return stringValue(record.Subject) || stringValue(record.subject);
27
+ }
28
+ function mailpitMessageRecipients(value) {
29
+ if (!value || typeof value !== "object") return [];
30
+ const record = value;
31
+ const recipients = record.To ?? record.to ?? record.Recipients ?? record.recipients;
32
+ if (!Array.isArray(recipients)) return [];
33
+ return recipients.map((recipient) => {
34
+ if (typeof recipient === "string") return recipient;
35
+ if (!recipient || typeof recipient !== "object") return "";
36
+ const entry = recipient;
37
+ return stringValue(entry.Address) || stringValue(entry.address) || stringValue(entry.Email) || stringValue(entry.email);
38
+ }).filter(Boolean);
39
+ }
40
+ function mailpitMessages(value) {
41
+ if (!value || typeof value !== "object") return [];
42
+ const record = value;
43
+ const messages = record.messages ?? record.Messages;
44
+ return Array.isArray(messages) ? messages : [];
45
+ }
46
+ function mailpitMessageBody(value) {
47
+ if (!value || typeof value !== "object") return "";
48
+ const record = value;
49
+ const html = stringValue(record.HTML) || stringValue(record.Html) || stringValue(record.html);
50
+ const text = stringValue(record.Text) || stringValue(record.text);
51
+ return `${html}
52
+ ${text}`.replace(/&/gu, "&");
53
+ }
54
+ function extractConfirmationUrl(body) {
55
+ const absolute = body.match(/https?:\/\/[^"' <>\n]+(?:\/auth\/confirm-email\?[^"' <>\n]+|\/team-invites\/[^"' <>\n]+\/accept)/u)?.[0];
56
+ if (absolute) return absolute;
57
+ const relative = body.match(/(?:\/auth\/confirm-email\?[^"' <>\n]+|\/team-invites\/[^"' <>\n]+\/accept)/u)?.[0];
58
+ return relative ?? null;
59
+ }
60
+ async function assertionReport(kind, action, selector) {
61
+ const startedAt = /* @__PURE__ */ new Date();
62
+ try {
63
+ await action();
64
+ const finishedAt = /* @__PURE__ */ new Date();
65
+ return { kind, status: "passed", startedAt: startedAt.toISOString(), finishedAt: finishedAt.toISOString(), durationMs: duration(startedAt, finishedAt), ...selector ? { selector } : {} };
66
+ } catch (error) {
67
+ const finishedAt = /* @__PURE__ */ new Date();
68
+ const diagnostic = error && typeof error === "object" && "code" in error ? error : sceneErrorDiagnostic("scene.assertion_failed", error instanceof Error ? error.message : String(error ?? "Assertion failed."));
69
+ return { kind, status: "failed", startedAt: startedAt.toISOString(), finishedAt: finishedAt.toISOString(), durationMs: duration(startedAt, finishedAt), message: diagnostic.message, error: diagnostic, ...selector ? { selector } : {} };
70
+ }
71
+ }
72
+ function createBuiltInTreeseedScenePlugins() {
73
+ return [
74
+ {
75
+ id: "treeseed.scene.browser-actions",
76
+ version: "1.0.0",
77
+ phase: 4,
78
+ status: "available",
79
+ summary: "Browser actions for Playwright-backed scene execution.",
80
+ actions: {
81
+ goto: {
82
+ id: "goto",
83
+ phase: 2,
84
+ status: "available",
85
+ summary: "Navigate to a route or absolute URL.",
86
+ async run({ action, context }) {
87
+ if (!("goto" in action)) return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.invalid_action", "Expected goto action.", "workflow.action.goto")] };
88
+ await context.session.page.goto(context.resolveUrl(action.goto));
89
+ return { ok: true, diagnostics: [] };
90
+ }
91
+ },
92
+ click: {
93
+ id: "click",
94
+ phase: 2,
95
+ status: "available",
96
+ summary: "Click a semantic selector.",
97
+ async run({ action, context }) {
98
+ if (!("click" in action)) return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.invalid_action", "Expected click action.", "workflow.action.click")] };
99
+ const locator = context.resolveSelector(action.click);
100
+ await locator.waitFor({ state: "visible", timeout: 1e4 });
101
+ await locator.click();
102
+ return { ok: true, diagnostics: [] };
103
+ }
104
+ },
105
+ fill: {
106
+ id: "fill",
107
+ phase: 2,
108
+ status: "available",
109
+ summary: "Fill a semantic selector with a value.",
110
+ async run({ action, context }) {
111
+ if (!("fill" in action)) return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.invalid_action", "Expected fill action.", "workflow.action.fill")] };
112
+ const locator = context.resolveSelector(action.fill);
113
+ await locator.waitFor({ state: "visible", timeout: 1e4 });
114
+ await locator.fill(action.fill.value);
115
+ return { ok: true, diagnostics: [] };
116
+ }
117
+ },
118
+ select: {
119
+ id: "select",
120
+ phase: 2,
121
+ status: "available",
122
+ summary: "Select an option in a dropdown control.",
123
+ async run({ action, context }) {
124
+ if (!("select" in action)) return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.invalid_action", "Expected select action.", "workflow.action.select")] };
125
+ const locator = context.resolveSelector(action.select);
126
+ await locator.waitFor({ state: "visible", timeout: 1e4 });
127
+ if (!locator.selectOption) return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.unsupported_runtime_action", "The active browser adapter does not support select actions.", "workflow.action.select")] };
128
+ await locator.selectOption(action.select.value ?? { label: action.select.label ?? "" });
129
+ return { ok: true, diagnostics: [] };
130
+ }
131
+ },
132
+ keyboard: {
133
+ id: "keyboard",
134
+ phase: 2,
135
+ status: "available",
136
+ summary: "Send keyboard input.",
137
+ async run({ action, context }) {
138
+ if (!("keyboard" in action)) return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.invalid_action", "Expected keyboard action.", "workflow.action.keyboard")] };
139
+ await context.session.page.keyboard.press(action.keyboard);
140
+ return { ok: true, diagnostics: [] };
141
+ }
142
+ },
143
+ apiRequest: {
144
+ id: "apiRequest",
145
+ phase: 4,
146
+ status: "deferred",
147
+ summary: "API request actions are reserved for the plugin-contract extension point.",
148
+ async run() {
149
+ return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.unsupported_runtime_action", 'Action "apiRequest" is deferred until an API action plugin is available.', "workflow.action.apiRequest")] };
150
+ }
151
+ },
152
+ pause: {
153
+ id: "pause",
154
+ phase: 5,
155
+ status: "available",
156
+ summary: "Pause execution for live demos and long workflow orchestration.",
157
+ async run({ action, step, context }) {
158
+ if (!("pause" in action)) return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.invalid_action", "Expected pause action.", `workflow.${step.id}.action.pause`)] };
159
+ context.timeline.push("pause.waiting", { mode: action.pause.mode, prompt: action.pause.prompt ?? null }, step.id);
160
+ context.progress?.push("pause.waiting", { mode: action.pause.mode, prompt: action.pause.prompt ?? null }, { stepId: step.id });
161
+ if (action.pause.mode === "timed") {
162
+ await context.sleep((action.pause.durationSeconds ?? 0) * 1e3);
163
+ context.timeline.push("pause.resumed", { mode: "timed" }, step.id);
164
+ context.progress?.push("pause.resumed", { mode: "timed" }, { stepId: step.id });
165
+ return { ok: true, diagnostics: [] };
166
+ }
167
+ if (!context.interactive || !context.pauseController) {
168
+ return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.manual_pause_requires_tty", "Manual pause steps require an interactive terminal.", `workflow.${step.id}.action.pause`)] };
169
+ }
170
+ const result = await context.pauseController({
171
+ sceneId: context.scene.id,
172
+ stepId: step.id,
173
+ title: step.title,
174
+ prompt: action.pause.prompt
175
+ });
176
+ if (result.ok) {
177
+ context.timeline.push("pause.resumed", { mode: "manual" }, step.id);
178
+ context.progress?.push("pause.resumed", { mode: "manual" }, { stepId: step.id });
179
+ }
180
+ return result;
181
+ }
182
+ },
183
+ mailpitConfirmLatest: {
184
+ id: "mailpitConfirmLatest",
185
+ phase: 11,
186
+ status: "available",
187
+ summary: "Confirm the latest local Mailpit email by navigating the browser to its confirmation link.",
188
+ async run({ action, step, context }) {
189
+ if (!("mailpitConfirmLatest" in action)) return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.invalid_action", "Expected mailpitConfirmLatest action.", `workflow.${step.id}.action.mailpitConfirmLatest`)] };
190
+ const { mailpitUrl, email, subjectIncludes, displayInboxSeconds, displayMessageSeconds } = action.mailpitConfirmLatest;
191
+ try {
192
+ const listResponse = await fetch(mailpitApiUrl(mailpitUrl, "/api/v1/messages"));
193
+ if (!listResponse.ok) {
194
+ return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.mailpit_unavailable", `Mailpit message list returned HTTP ${listResponse.status}.`, `workflow.${step.id}.action.mailpitConfirmLatest`)] };
195
+ }
196
+ const list = await listResponse.json();
197
+ const target = mailpitMessages(list).find((message2) => {
198
+ const recipients = mailpitMessageRecipients(message2);
199
+ const subject = mailpitMessageSubject(message2);
200
+ return recipients.some((recipient) => recipient.toLowerCase() === email.toLowerCase()) && (!subjectIncludes || subject.toLowerCase().includes(subjectIncludes.toLowerCase()));
201
+ });
202
+ const id = mailpitMessageId(target);
203
+ if (!id) {
204
+ return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.mailpit_message_not_found", `No Mailpit message found for ${email}.`, `workflow.${step.id}.action.mailpitConfirmLatest.email`)] };
205
+ }
206
+ const messageResponse = await fetch(mailpitApiUrl(mailpitUrl, `/api/v1/message/${encodeURIComponent(id)}`));
207
+ if (!messageResponse.ok) {
208
+ return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.mailpit_unavailable", `Mailpit message ${id} returned HTTP ${messageResponse.status}.`, `workflow.${step.id}.action.mailpitConfirmLatest`)] };
209
+ }
210
+ const message = await messageResponse.json();
211
+ const confirmationUrl = extractConfirmationUrl(mailpitMessageBody(message));
212
+ if (!confirmationUrl) {
213
+ return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.mailpit_confirm_link_not_found", `No confirmation link was found in Mailpit message ${id}.`, `workflow.${step.id}.action.mailpitConfirmLatest`)] };
214
+ }
215
+ const resolvedUrl = confirmationUrl.startsWith("/") ? context.resolveUrl(confirmationUrl) : confirmationUrl;
216
+ const mailpitBase = mailpitUrl.endsWith("/") ? mailpitUrl : `${mailpitUrl}/`;
217
+ if (displayInboxSeconds && displayInboxSeconds > 0) {
218
+ const search = new URL("search", mailpitBase);
219
+ search.searchParams.set("query", `to:${email}`);
220
+ context.timeline.push("mailpit.inbox.open", { messageId: id, email, url: search.toString() }, step.id);
221
+ context.progress?.push("mailpit.inbox.open", { messageId: id, email }, { stepId: step.id });
222
+ await context.session.page.goto(search.toString());
223
+ await context.sleep(displayInboxSeconds * 1e3);
224
+ }
225
+ if (displayMessageSeconds && displayMessageSeconds > 0) {
226
+ const view = new URL(`view/${encodeURIComponent(id)}`, mailpitBase);
227
+ context.timeline.push("mailpit.message.open", { messageId: id, email, url: view.toString() }, step.id);
228
+ context.progress?.push("mailpit.message.open", { messageId: id, email }, { stepId: step.id });
229
+ await context.session.page.goto(view.toString());
230
+ await context.sleep(displayMessageSeconds * 1e3);
231
+ }
232
+ context.timeline.push("mailpit.confirm.open", { messageId: id, email, url: resolvedUrl }, step.id);
233
+ await context.session.page.goto(resolvedUrl);
234
+ return { ok: true, diagnostics: [] };
235
+ } catch (error) {
236
+ return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.mailpit_unavailable", error instanceof Error ? error.message : String(error ?? "Mailpit confirmation failed."), `workflow.${step.id}.action.mailpitConfirmLatest`)] };
237
+ }
238
+ }
239
+ }
240
+ }
241
+ },
242
+ {
243
+ id: "treeseed.scene.operation-actions",
244
+ version: "1.0.0",
245
+ phase: 4,
246
+ status: "available",
247
+ summary: "Operation wait actions for backend workflow proof.",
248
+ actions: {
249
+ waitForOperation: {
250
+ id: "waitForOperation",
251
+ phase: 3,
252
+ status: "available",
253
+ summary: "Wait for a linked or explicit Treeseed platform operation.",
254
+ async run({ action, step, context }) {
255
+ if (!("waitForOperation" in action)) return { ok: false, diagnostics: [sceneErrorDiagnostic("scene.invalid_action", "Expected waitForOperation action.", `workflow.${step.id}.action.waitForOperation`)] };
256
+ context.timeline.push("operation.poll.start", { spec: action.waitForOperation }, step.id);
257
+ const report = await context.operationWaiter({
258
+ projectRoot: context.projectRoot,
259
+ scene: context.scene,
260
+ environment: context.environment,
261
+ baseUrl: context.baseUrl,
262
+ spec: action.waitForOperation,
263
+ linkedOperationIds: context.linkedOperationIds,
264
+ onUpdate: async (update) => {
265
+ context.timeline.push("operation.poll.tick", { operationId: update.operationId, status: update.finalStatus }, step.id);
266
+ }
267
+ });
268
+ context.timeline.push("operation.poll.end", { ok: report.ok, operationId: report.operationId, status: report.finalStatus }, step.id);
269
+ context.operationReports.push(report);
270
+ if (report.operationId && !context.linkedOperationIds.includes(report.operationId)) context.linkedOperationIds.push(report.operationId);
271
+ return { ok: report.ok, operationReport: report, diagnostics: report.diagnostics };
272
+ }
273
+ }
274
+ }
275
+ },
276
+ {
277
+ id: "treeseed.scene.browser-assertions",
278
+ version: "1.0.0",
279
+ phase: 4,
280
+ status: "available",
281
+ summary: "Browser assertions for Playwright-backed scene execution.",
282
+ assertions: {
283
+ visible: {
284
+ id: "visible",
285
+ phase: 2,
286
+ status: "available",
287
+ summary: "Expect selectors to be visible.",
288
+ async run({ value, step, context }) {
289
+ const selectors = Array.isArray(value) ? value : [];
290
+ const results = [];
291
+ for (const selector of selectors) {
292
+ results.push(await assertionReport("visible", async () => {
293
+ const locator = context.resolveSelector(selector);
294
+ await locator.waitFor({ state: "visible", timeout: 1e4 });
295
+ if (!await locator.isVisible()) throw sceneErrorDiagnostic("scene.selector_not_found", "Expected selector to be visible.", `workflow.${step.id}.expect.visible`);
296
+ }, selector));
297
+ }
298
+ return results.find((result) => result.status === "failed") ?? results[0] ?? await assertionReport("visible", async () => void 0);
299
+ }
300
+ },
301
+ text: {
302
+ id: "text",
303
+ phase: 2,
304
+ status: "available",
305
+ summary: "Expect text to appear.",
306
+ async run({ value, step, context }) {
307
+ const text = String(value ?? "");
308
+ const selector = { text };
309
+ return assertionReport("text", async () => {
310
+ const textLocator = context.session.page.getByText(text);
311
+ const locator = textLocator.first ? textLocator.first() : textLocator;
312
+ await locator.waitFor({ state: "visible", timeout: 1e4 });
313
+ if (!await locator.isVisible()) throw sceneErrorDiagnostic("scene.text_not_found", `Expected text to be visible: ${text}.`, `workflow.${step.id}.expect.text`);
314
+ }, selector);
315
+ }
316
+ },
317
+ urlIncludes: {
318
+ id: "urlIncludes",
319
+ phase: 2,
320
+ status: "available",
321
+ summary: "Expect the URL to include a fragment.",
322
+ async run({ value, step, context }) {
323
+ const expected = String(value ?? "");
324
+ return assertionReport("urlIncludes", async () => {
325
+ const timeoutMs = 1e4;
326
+ const deadline = Date.now() + timeoutMs;
327
+ let current = context.session.page.url();
328
+ while (!current.includes(expected) && Date.now() < deadline) {
329
+ await context.sleep(250);
330
+ current = context.session.page.url();
331
+ }
332
+ if (!current.includes(expected)) {
333
+ throw sceneErrorDiagnostic("scene.url_mismatch", `Expected URL to include "${expected}", got "${current}".`, `workflow.${step.id}.expect.urlIncludes`);
334
+ }
335
+ });
336
+ }
337
+ }
338
+ }
339
+ },
340
+ {
341
+ id: "treeseed.scene.operation-assertions",
342
+ version: "1.0.0",
343
+ phase: 4,
344
+ status: "available",
345
+ summary: "Operation assertions for backend workflow proof.",
346
+ assertions: {
347
+ operation: {
348
+ id: "operation",
349
+ phase: 3,
350
+ status: "available",
351
+ summary: "Expect a Treeseed platform operation to reach an accepted status.",
352
+ async run({ value, step, context }) {
353
+ return assertionReport("operation", async () => {
354
+ context.timeline.push("operation.poll.start", { spec: value }, step.id);
355
+ const report = await context.operationWaiter({
356
+ projectRoot: context.projectRoot,
357
+ scene: context.scene,
358
+ environment: context.environment,
359
+ baseUrl: context.baseUrl,
360
+ spec: value,
361
+ linkedOperationIds: context.linkedOperationIds,
362
+ onUpdate: async (update) => {
363
+ context.timeline.push("operation.poll.tick", { operationId: update.operationId, status: update.finalStatus }, step.id);
364
+ }
365
+ });
366
+ context.timeline.push("operation.poll.end", { ok: report.ok, operationId: report.operationId, status: report.finalStatus }, step.id);
367
+ context.operationReports.push(report);
368
+ if (report.operationId && !context.linkedOperationIds.includes(report.operationId)) context.linkedOperationIds.push(report.operationId);
369
+ if (!report.ok) throw report.diagnostics[0] ?? sceneErrorDiagnostic("scene.operation_failed", "Operation assertion failed.", `workflow.${step.id}.expect.operation`);
370
+ });
371
+ }
372
+ }
373
+ }
374
+ },
375
+ {
376
+ id: "treeseed.scene.environment",
377
+ version: "1.0.0",
378
+ phase: 4,
379
+ status: "available",
380
+ summary: "Treeseed environment preparation, auth, seed, and base URL integration.",
381
+ environment: {
382
+ prepare: prepareTreeseedSceneEnvironment,
383
+ resolveAuth: resolveTreeseedSceneAuth,
384
+ prepareSeed: planOrApplyTreeseedSceneSeed,
385
+ resolveBaseUrl: resolveTreeseedSceneBaseUrl
386
+ }
387
+ },
388
+ {
389
+ id: "treeseed.scene.capture.playwright",
390
+ version: "1.0.0",
391
+ phase: 4,
392
+ status: "available",
393
+ summary: "Built-in Playwright capture providers exposed through the plugin registry.",
394
+ captures: Object.fromEntries(["playwright-trace", "playwright-video", "playwright-screenshots", "playwright-console", "playwright-network", "operation-id-detection"].map((id) => [id, { id, phase: 4, status: "available", summary: `Built-in capture provider: ${id}.` }]))
395
+ },
396
+ {
397
+ id: "treeseed.scene.artifacts.default",
398
+ version: "1.0.0",
399
+ phase: 4,
400
+ status: "available",
401
+ summary: "Default scene artifact writers exposed through the plugin registry.",
402
+ artifacts: Object.fromEntries(["json-run", "json-timeline", "json-plan", "json-normalized-scene", "markdown-report", "setup-json", "managed-dev-logs"].map((id) => [id, { id, phase: 4, status: "available", summary: `Built-in artifact writer: ${id}.` }]))
403
+ },
404
+ {
405
+ id: "treeseed.scene.renderer.remotion",
406
+ version: "1.0.0",
407
+ phase: 6,
408
+ status: "available",
409
+ summary: "Render scene timelines and browser artifacts through Remotion.",
410
+ renderers: {
411
+ remotion: { id: "remotion", phase: 6, status: "available", summary: "Render demo, training, chapter, and failure-review videos from scene run artifacts." }
412
+ }
413
+ },
414
+ {
415
+ id: "treeseed.scene.diagrams.remotion",
416
+ version: "1.0.0",
417
+ phase: 7,
418
+ status: "available",
419
+ summary: "Built-in typed Remotion diagram providers for scene videos.",
420
+ diagrams: {
421
+ "treeseed-remotion-diagrams": createBuiltInTreeseedSceneDiagramProvider()
422
+ }
423
+ },
424
+ {
425
+ id: "treeseed.scene.training.deterministic",
426
+ version: "1.0.0",
427
+ phase: 8,
428
+ status: "available",
429
+ summary: "Deterministic captions, transcripts, narration scripts, glossary, and chapter clip manifests.",
430
+ narration: {
431
+ "deterministic-narration": {
432
+ id: "deterministic-narration",
433
+ phase: 8,
434
+ status: "available",
435
+ summary: "Generate deterministic scene narration scripts from transcript entries.",
436
+ generate({ scene, run, transcript, style }) {
437
+ return buildTreeseedSceneNarrationEntries({ scene, run, transcript, style });
438
+ }
439
+ }
440
+ },
441
+ artifacts: Object.fromEntries(["training-json", "training-markdown", "training-captions", "training-chapter-clips"].map((id) => [id, { id, phase: 8, status: "available", summary: `Built-in training artifact writer: ${id}.` }]))
442
+ }
443
+ ];
444
+ }
445
+ export {
446
+ createBuiltInTreeseedScenePlugins
447
+ };
@@ -0,0 +1,14 @@
1
+ import type { TreeseedSceneArtifactPathPlan, TreeseedSceneCheckpoint } from './types.js';
2
+ export declare function createTreeseedSceneCheckpoint(input: {
3
+ paths: TreeseedSceneArtifactPathPlan;
4
+ sceneId: string;
5
+ runId: string;
6
+ stepId: string;
7
+ chapterId: string;
8
+ segmentId: string;
9
+ completedStepIds: string[];
10
+ nextStepId: string | null;
11
+ checkpointId?: string;
12
+ resumable: boolean;
13
+ }): TreeseedSceneCheckpoint;
14
+ export declare function writeTreeseedSceneCheckpoint(checkpoint: TreeseedSceneCheckpoint): void;
@@ -0,0 +1,33 @@
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ function createTreeseedSceneCheckpoint(input) {
4
+ const id = input.checkpointId ?? input.stepId;
5
+ const checkpointPath = join(input.paths.checkpointsRoot, `${id}.json`);
6
+ return {
7
+ id,
8
+ sceneId: input.sceneId,
9
+ runId: input.runId,
10
+ stepId: input.stepId,
11
+ chapterId: input.chapterId,
12
+ segmentId: input.segmentId,
13
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
14
+ resumable: input.resumable,
15
+ completedStepIds: [...input.completedStepIds],
16
+ nextStepId: input.nextStepId,
17
+ artifactPaths: {
18
+ checkpointPath,
19
+ runRoot: input.paths.runRoot,
20
+ timelinePath: input.paths.timelinePath,
21
+ reportPath: input.paths.markdownReportPath
22
+ }
23
+ };
24
+ }
25
+ function writeTreeseedSceneCheckpoint(checkpoint) {
26
+ mkdirSync(dirname(checkpoint.artifactPaths.checkpointPath), { recursive: true });
27
+ writeFileSync(checkpoint.artifactPaths.checkpointPath, `${JSON.stringify(checkpoint, null, 2)}
28
+ `, "utf8");
29
+ }
30
+ export {
31
+ createTreeseedSceneCheckpoint,
32
+ writeTreeseedSceneCheckpoint
33
+ };
@@ -0,0 +1,2 @@
1
+ import type { TreeseedSceneDeviceMatrixOptions, TreeseedSceneDeviceMatrixReport } from './types.js';
2
+ export declare function runTreeseedSceneDeviceMatrix(input: TreeseedSceneDeviceMatrixOptions): Promise<TreeseedSceneDeviceMatrixReport>;
@@ -0,0 +1,97 @@
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { listTreeseedSceneDeviceProfiles, resolveTreeseedSceneDeviceProfile } from "./devices.js";
4
+ import { validateTreeseedScene } from "./planner.js";
5
+ import { runTreeseedScene } from "./runner.js";
6
+ function splitDiagnostics(diagnostics, severity) {
7
+ return diagnostics.filter((entry) => entry.severity === severity);
8
+ }
9
+ function timestampId(value) {
10
+ return value ?? (/* @__PURE__ */ new Date()).toISOString().replace(/[-:]/gu, "").replace(/\.\d{3}Z$/u, "Z");
11
+ }
12
+ async function runTreeseedSceneDeviceMatrix(input) {
13
+ const validation = validateTreeseedScene({ projectRoot: input.projectRoot, scene: input.scene });
14
+ if (!validation.ok || !validation.scene) {
15
+ return {
16
+ ok: false,
17
+ phase: 11,
18
+ sceneId: validation.scene?.id ?? null,
19
+ matrixId: null,
20
+ scenePath: validation.scenePath,
21
+ devices: input.devices ?? [],
22
+ runReports: [],
23
+ matrixRoot: null,
24
+ matrixPath: null,
25
+ diagnostics: validation.diagnostics,
26
+ warnings: splitDiagnostics(validation.diagnostics, "warning"),
27
+ blockers: splitDiagnostics(validation.diagnostics, "error")
28
+ };
29
+ }
30
+ const scene = validation.scene;
31
+ const requested = input.devices?.length ? input.devices : listTreeseedSceneDeviceProfiles(scene).map((profile) => profile.id);
32
+ const diagnostics = [];
33
+ const profiles = [];
34
+ for (const device of requested) {
35
+ const resolved = resolveTreeseedSceneDeviceProfile({ scene, device });
36
+ diagnostics.push(...resolved.diagnostics);
37
+ if (resolved.profile) profiles.push(resolved.profile.id);
38
+ }
39
+ if (diagnostics.some((entry) => entry.severity === "error")) {
40
+ return {
41
+ ok: false,
42
+ phase: 11,
43
+ sceneId: scene.id,
44
+ matrixId: null,
45
+ scenePath: validation.scenePath,
46
+ devices: requested,
47
+ runReports: [],
48
+ matrixRoot: null,
49
+ matrixPath: null,
50
+ diagnostics,
51
+ warnings: splitDiagnostics(diagnostics, "warning"),
52
+ blockers: splitDiagnostics(diagnostics, "error")
53
+ };
54
+ }
55
+ const matrixId = timestampId(input.timestamp).toLowerCase();
56
+ const matrixRoot = join(input.projectRoot, ".treeseed", "scenes", "matrix", scene.id, `${timestampId(input.timestamp)}-${matrixId}`);
57
+ const matrixPath = join(matrixRoot, "matrix.json");
58
+ mkdirSync(matrixRoot, { recursive: true });
59
+ const runReports = [];
60
+ for (const device of profiles) {
61
+ const runReport = await runTreeseedScene({
62
+ projectRoot: input.projectRoot,
63
+ scene: input.scene,
64
+ environment: input.environment,
65
+ device,
66
+ record: input.record,
67
+ mode: input.mode,
68
+ timestamp: input.timestamp,
69
+ runId: `${matrixId}-${device}`,
70
+ browserAdapter: input.browserAdapter
71
+ });
72
+ runReports.push(runReport);
73
+ }
74
+ const ok = runReports.every((report2) => report2.ok);
75
+ const runDiagnostics = runReports.flatMap((entry) => entry.diagnostics ?? []);
76
+ const allDiagnostics = [...diagnostics, ...runDiagnostics];
77
+ const report = {
78
+ ok,
79
+ phase: 11,
80
+ sceneId: scene.id,
81
+ matrixId,
82
+ scenePath: validation.scenePath,
83
+ devices: profiles,
84
+ runReports,
85
+ matrixRoot,
86
+ matrixPath,
87
+ diagnostics: allDiagnostics,
88
+ warnings: splitDiagnostics(allDiagnostics, "warning"),
89
+ blockers: splitDiagnostics(allDiagnostics, "error")
90
+ };
91
+ writeFileSync(matrixPath, `${JSON.stringify(report, null, 2)}
92
+ `, "utf8");
93
+ return report;
94
+ }
95
+ export {
96
+ runTreeseedSceneDeviceMatrix
97
+ };
@@ -0,0 +1,11 @@
1
+ import { defaultTreeseedSceneDeviceConfig } from './schema.js';
2
+ import type { TreeseedSceneDeviceProfile, TreeseedSceneDiagnostic, TreeseedSceneManifest } from './types.js';
3
+ export { defaultTreeseedSceneDeviceConfig };
4
+ export declare function listTreeseedSceneDeviceProfiles(scene: TreeseedSceneManifest): TreeseedSceneDeviceProfile[];
5
+ export declare function resolveTreeseedSceneDeviceProfile(input: {
6
+ scene: TreeseedSceneManifest;
7
+ device?: string;
8
+ }): {
9
+ profile: TreeseedSceneDeviceProfile | null;
10
+ diagnostics: TreeseedSceneDiagnostic[];
11
+ };
@@ -0,0 +1,22 @@
1
+ import { sceneErrorDiagnostic } from "./diagnostics.js";
2
+ import { defaultTreeseedSceneDeviceConfig } from "./schema.js";
3
+ function listTreeseedSceneDeviceProfiles(scene) {
4
+ return scene.devices?.profiles?.length ? scene.devices.profiles : defaultTreeseedSceneDeviceConfig().profiles;
5
+ }
6
+ function resolveTreeseedSceneDeviceProfile(input) {
7
+ const profiles = listTreeseedSceneDeviceProfiles(input.scene);
8
+ const selected = input.device ?? input.scene.devices?.defaultProfile ?? "desktop";
9
+ const profile = profiles.find((entry) => entry.id === selected) ?? null;
10
+ if (!profile) {
11
+ return {
12
+ profile: null,
13
+ diagnostics: [sceneErrorDiagnostic("scene.device_unknown", `Unknown scene device profile: ${selected}.`, "device")]
14
+ };
15
+ }
16
+ return { profile, diagnostics: [] };
17
+ }
18
+ export {
19
+ defaultTreeseedSceneDeviceConfig,
20
+ listTreeseedSceneDeviceProfiles,
21
+ resolveTreeseedSceneDeviceProfile
22
+ };
@@ -0,0 +1,5 @@
1
+ import type { TreeseedSceneDiagnostic } from './types.js';
2
+ export declare function sceneErrorDiagnostic(code: string, message: string, path?: string): TreeseedSceneDiagnostic;
3
+ export declare function sceneWarningDiagnostic(code: string, message: string, path?: string): TreeseedSceneDiagnostic;
4
+ export declare function hasTreeseedSceneErrors(diagnostics: TreeseedSceneDiagnostic[]): boolean;
5
+ export declare function formatTreeseedSceneDiagnostics(diagnostics: TreeseedSceneDiagnostic[]): string[];
@@ -0,0 +1,22 @@
1
+ function sceneErrorDiagnostic(code, message, path) {
2
+ return { severity: "error", code, message, path };
3
+ }
4
+ function sceneWarningDiagnostic(code, message, path) {
5
+ return { severity: "warning", code, message, path };
6
+ }
7
+ function hasTreeseedSceneErrors(diagnostics) {
8
+ return diagnostics.some((diagnostic) => diagnostic.severity === "error");
9
+ }
10
+ function formatTreeseedSceneDiagnostics(diagnostics) {
11
+ return diagnostics.map((diagnostic) => {
12
+ const prefix = diagnostic.severity === "error" ? "ERROR" : "WARN";
13
+ const location = diagnostic.path ? ` ${diagnostic.path}` : "";
14
+ return `${prefix} ${diagnostic.code}${location}: ${diagnostic.message}`;
15
+ });
16
+ }
17
+ export {
18
+ formatTreeseedSceneDiagnostics,
19
+ hasTreeseedSceneErrors,
20
+ sceneErrorDiagnostic,
21
+ sceneWarningDiagnostic
22
+ };
@@ -0,0 +1,2 @@
1
+ import type { TreeseedSceneDiagramProvider } from './types.js';
2
+ export declare function createBuiltInTreeseedSceneDiagramProvider(): TreeseedSceneDiagramProvider;