@treeseed/sdk 0.11.0 → 0.12.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (473) hide show
  1. package/README.md +9 -4
  2. package/dist/agent-capacity.d.ts +916 -0
  3. package/dist/agent-capacity.js +1600 -0
  4. package/dist/agent-tools.d.ts +37 -0
  5. package/dist/agent-tools.js +301 -0
  6. package/dist/api/app.d.ts +1 -1
  7. package/dist/api/auth/d1-database.d.ts +2 -2
  8. package/dist/api/auth/d1-provider.d.ts +4 -4
  9. package/dist/api/auth/d1-store.d.ts +2 -2
  10. package/dist/api/auth/memory-provider.d.ts +1 -1
  11. package/dist/api/auth/tokens.d.ts +1 -1
  12. package/dist/api/config.d.ts +3 -1
  13. package/dist/api/config.js +34 -10
  14. package/dist/api/http.d.ts +2 -2
  15. package/dist/api/index.d.ts +10 -10
  16. package/dist/api/index.js +4 -2
  17. package/dist/api/operations-routes.d.ts +3 -3
  18. package/dist/api/operations.d.ts +1 -1
  19. package/dist/api/providers.d.ts +1 -1
  20. package/dist/api/providers.js +21 -4
  21. package/dist/api/railway.d.ts +3 -2
  22. package/dist/api/sdk-dispatch.d.ts +4 -4
  23. package/dist/api/sdk-routes.d.ts +2 -2
  24. package/dist/api/templates.d.ts +2 -2
  25. package/dist/api/types.d.ts +3 -2
  26. package/dist/capacity-provider.d.ts +117 -60
  27. package/dist/capacity-provider.js +215 -43
  28. package/dist/capacity.d.ts +2 -2
  29. package/dist/cli-tools.d.ts +1 -1
  30. package/dist/content-operations.d.ts +97 -0
  31. package/dist/content-operations.js +250 -0
  32. package/dist/content-store.d.ts +4 -4
  33. package/dist/control-plane-client.d.ts +13 -18
  34. package/dist/control-plane-client.js +8 -86
  35. package/dist/control-plane.d.ts +2 -2
  36. package/dist/copilot.d.ts +3 -0
  37. package/dist/copilot.js +16 -1
  38. package/dist/d1-http.d.ts +1 -1
  39. package/dist/d1-store.d.ts +32 -57
  40. package/dist/d1-store.js +115 -318
  41. package/dist/db/d1.d.ts +1 -232
  42. package/dist/db/index.d.ts +3 -3
  43. package/dist/db/market-schema.d.ts +49037 -11843
  44. package/dist/db/market-schema.js +1788 -50
  45. package/dist/db/node-sqlite.d.ts +1 -232
  46. package/dist/db/schema.d.ts +0 -462
  47. package/dist/db/schema.js +2 -22
  48. package/dist/dispatch.d.ts +1 -1
  49. package/dist/dispatch.js +0 -11
  50. package/dist/fixture-support.js +52 -4
  51. package/dist/governance.d.ts +133 -0
  52. package/dist/governance.js +285 -0
  53. package/dist/graph/build.d.ts +2 -2
  54. package/dist/graph/context-query-contracts.d.ts +1 -1
  55. package/dist/graph/dsl.d.ts +1 -1
  56. package/dist/graph/query.d.ts +4 -4
  57. package/dist/graph/ranking.d.ts +1 -1
  58. package/dist/graph/schema.d.ts +1 -1
  59. package/dist/graph.d.ts +11 -11
  60. package/dist/guarantees/index.d.ts +425 -0
  61. package/dist/guarantees/index.js +1146 -0
  62. package/dist/hosting/apps.d.ts +1 -1
  63. package/dist/hosting/builtins.d.ts +1 -1
  64. package/dist/hosting/builtins.js +9 -198
  65. package/dist/hosting/contracts.d.ts +3 -2
  66. package/dist/hosting/graph.d.ts +24 -21
  67. package/dist/hosting/graph.js +280 -294
  68. package/dist/hosting/index.d.ts +4 -4
  69. package/dist/index.d.ts +88 -74
  70. package/dist/index.js +81 -10
  71. package/dist/local-dev/managed-dev.d.ts +85 -0
  72. package/dist/local-dev/managed-dev.js +368 -0
  73. package/dist/managed-dependencies.d.ts +9 -0
  74. package/dist/managed-dependencies.js +10 -8
  75. package/dist/market-client.d.ts +265 -7
  76. package/dist/market-client.js +381 -9
  77. package/dist/model-registry.d.ts +1 -1
  78. package/dist/model-registry.js +19 -19
  79. package/dist/operations/agent-tools.d.ts +2 -11
  80. package/dist/operations/agent-tools.js +2 -14
  81. package/dist/operations/providers/default.d.ts +1 -1
  82. package/dist/operations/providers/default.js +20 -37
  83. package/dist/operations/repository-operations.d.ts +26 -2
  84. package/dist/operations/repository-operations.js +159 -1
  85. package/dist/operations/runtime.d.ts +3 -3
  86. package/dist/operations/services/bootstrap-runner.d.ts +1 -1
  87. package/dist/operations/services/build-warning-policy.d.ts +34 -0
  88. package/dist/operations/services/build-warning-policy.js +81 -82
  89. package/dist/operations/services/commit-message-provider.js +4 -4
  90. package/dist/operations/services/config-runtime.d.ts +73 -19
  91. package/dist/operations/services/config-runtime.js +276 -100
  92. package/dist/operations/services/deploy.d.ts +41 -622
  93. package/dist/operations/services/deploy.js +181 -213
  94. package/dist/operations/services/deployment-readiness.d.ts +1 -1
  95. package/dist/operations/services/deployment-readiness.js +38 -7
  96. package/dist/operations/services/git-remote-policy.js +12 -4
  97. package/dist/operations/services/git-runner.d.ts +66 -0
  98. package/dist/operations/services/git-runner.js +479 -0
  99. package/dist/operations/services/git-workflow.d.ts +43 -5
  100. package/dist/operations/services/git-workflow.js +242 -20
  101. package/dist/operations/services/github-actions-verification.d.ts +3 -1
  102. package/dist/operations/services/github-actions-verification.js +11 -3
  103. package/dist/operations/services/github-api.js +21 -5
  104. package/dist/operations/services/github-automation.d.ts +3 -3
  105. package/dist/operations/services/github-automation.js +15 -18
  106. package/dist/operations/services/github-credentials.js +2 -1
  107. package/dist/operations/services/hosted-service-checks.d.ts +19 -1
  108. package/dist/operations/services/hosted-service-checks.js +162 -11
  109. package/dist/operations/services/hosting-audit.d.ts +2 -2
  110. package/dist/operations/services/hosting-audit.js +7 -7
  111. package/dist/operations/services/hub-launch.d.ts +1 -1
  112. package/dist/operations/services/hub-provider-launch.d.ts +5 -5
  113. package/dist/operations/services/hub-provider-launch.js +19 -14
  114. package/dist/operations/services/live-hosted-service-checks.d.ts +2 -1
  115. package/dist/operations/services/live-hosted-service-checks.js +193 -80
  116. package/dist/operations/services/local-dev.js +0 -1
  117. package/dist/operations/services/managed-host-security.d.ts +1 -1
  118. package/dist/operations/services/managed-repositories.d.ts +37 -0
  119. package/dist/operations/services/managed-repositories.js +177 -0
  120. package/dist/operations/services/operations-runner-smoke.d.ts +3 -2
  121. package/dist/operations/services/operations-runner-smoke.js +22 -4
  122. package/dist/operations/services/package-adapters.d.ts +77 -2
  123. package/dist/operations/services/package-adapters.js +629 -56
  124. package/dist/operations/services/package-reference-policy.d.ts +12 -88
  125. package/dist/operations/services/package-reference-policy.js +81 -213
  126. package/dist/operations/services/project-host-operations.d.ts +4 -4
  127. package/dist/operations/services/project-platform.d.ts +19 -193
  128. package/dist/operations/services/project-platform.js +31 -103
  129. package/dist/operations/services/project-web-monitor.d.ts +2 -2
  130. package/dist/operations/services/project-web-monitor.js +97 -2
  131. package/dist/operations/services/railway-api.d.ts +36 -7
  132. package/dist/operations/services/railway-api.js +331 -100
  133. package/dist/operations/services/railway-deploy.d.ts +7 -95
  134. package/dist/operations/services/railway-deploy.js +334 -742
  135. package/dist/operations/services/release-history.js +3 -4
  136. package/dist/operations/services/release-proof-ledger.d.ts +13 -0
  137. package/dist/operations/services/release-proof-ledger.js +81 -0
  138. package/dist/operations/services/release-proof-planner.d.ts +48 -0
  139. package/dist/operations/services/release-proof-planner.js +195 -0
  140. package/dist/operations/services/release-proof-runner.d.ts +16 -0
  141. package/dist/operations/services/release-proof-runner.js +169 -0
  142. package/dist/operations/services/release-proof.d.ts +81 -0
  143. package/dist/operations/services/release-proof.js +79 -0
  144. package/dist/operations/services/repository-save-orchestrator.d.ts +6 -7
  145. package/dist/operations/services/repository-save-orchestrator.js +353 -174
  146. package/dist/operations/services/runtime-paths.d.ts +1 -3
  147. package/dist/operations/services/runtime-paths.js +0 -4
  148. package/dist/operations/services/runtime-tools.d.ts +1 -192
  149. package/dist/operations/services/runtime-tools.js +4 -444
  150. package/dist/operations/services/save-deploy-preflight.js +9 -1
  151. package/dist/operations/services/template-host-bindings.d.ts +2 -2
  152. package/dist/operations/services/template-host-bindings.js +3 -2
  153. package/dist/operations/services/template-registry.d.ts +6 -6
  154. package/dist/operations/services/template-registry.js +33 -14
  155. package/dist/operations/services/template-secret-sync.d.ts +3 -3
  156. package/dist/operations/services/workflow-timing.d.ts +25 -0
  157. package/dist/operations/services/workflow-timing.js +79 -0
  158. package/dist/operations/services/workspace-dependency-mode.js +41 -4
  159. package/dist/operations/services/workspace-preflight.js +8 -8
  160. package/dist/operations/services/workspace-save-script.d.ts +4 -4
  161. package/dist/operations/services/workspace-save.d.ts +1 -0
  162. package/dist/operations/services/workspace-save.js +41 -18
  163. package/dist/operations/services/workspace-tools.js +40 -6
  164. package/dist/operations-registry.d.ts +1 -1
  165. package/dist/operations-registry.js +5 -6
  166. package/dist/operations-types.d.ts +1 -1
  167. package/dist/operations.d.ts +17 -11
  168. package/dist/operations.js +57 -3
  169. package/dist/platform/book-export.js +2 -0
  170. package/dist/platform/books-data.d.ts +1 -1
  171. package/dist/platform/config.d.ts +27 -0
  172. package/dist/platform/config.js +100 -0
  173. package/dist/platform/content-runtime-source.d.ts +54 -0
  174. package/dist/platform/content-runtime-source.js +169 -0
  175. package/dist/platform/contracts.d.ts +6 -1
  176. package/dist/platform/deploy-config.d.ts +1 -1
  177. package/dist/platform/deploy-config.js +7 -1
  178. package/dist/platform/deploy-runtime.d.ts +1 -1
  179. package/dist/platform/desired-state.d.ts +66 -0
  180. package/dist/platform/desired-state.js +1052 -0
  181. package/dist/platform/env.yaml +414 -19
  182. package/dist/platform/environment.d.ts +2 -2
  183. package/dist/platform/environment.js +54 -22
  184. package/dist/platform/local-content-materialization.d.ts +9 -0
  185. package/dist/platform/local-content-materialization.js +212 -0
  186. package/dist/platform/plugin.d.ts +5 -5
  187. package/dist/platform/plugins/runtime.d.ts +3 -3
  188. package/dist/platform/plugins/runtime.js +62 -1
  189. package/dist/platform/plugins.d.ts +6 -6
  190. package/dist/platform/published-content-pipeline.d.ts +3 -3
  191. package/dist/platform/published-content-pipeline.js +5 -1
  192. package/dist/platform/published-content.d.ts +4 -3
  193. package/dist/platform/site-config-schema.d.ts +1 -0
  194. package/dist/platform/site-config-schema.js +4 -1
  195. package/dist/platform/tenant/runtime-config.d.ts +152 -2
  196. package/dist/platform/tenant-config.d.ts +1 -1
  197. package/dist/platform/utils/site-config-schema.d.ts +154 -0
  198. package/dist/platform/utils/site-config-schema.js +400 -461
  199. package/dist/platform-operation-store.d.ts +1 -1
  200. package/dist/plugin-default.d.ts +1 -1
  201. package/dist/plugin-default.js +27 -12
  202. package/dist/project-import.d.ts +91 -0
  203. package/dist/project-import.js +257 -0
  204. package/dist/project-workflow.d.ts +1 -1
  205. package/dist/reconcile/bootstrap-systems.d.ts +2 -2
  206. package/dist/reconcile/bootstrap-systems.js +3 -3
  207. package/dist/reconcile/builtin-adapters.d.ts +7 -1
  208. package/dist/reconcile/builtin-adapters.js +2924 -346
  209. package/dist/reconcile/contracts.d.ts +15 -2
  210. package/dist/reconcile/desired-state.d.ts +2 -193
  211. package/dist/reconcile/desired-state.js +24 -33
  212. package/dist/reconcile/engine.d.ts +60 -397
  213. package/dist/reconcile/engine.js +182 -18
  214. package/dist/reconcile/index.d.ts +10 -10
  215. package/dist/reconcile/live-acceptance.d.ts +22 -1
  216. package/dist/reconcile/live-acceptance.js +456 -44
  217. package/dist/reconcile/providers/docker-private.d.ts +54 -0
  218. package/dist/reconcile/providers/docker-private.js +101 -0
  219. package/dist/reconcile/providers/github-private.d.ts +65 -0
  220. package/dist/reconcile/providers/github-private.js +119 -0
  221. package/dist/reconcile/providers/local-private.d.ts +28 -0
  222. package/dist/reconcile/providers/local-private.js +75 -0
  223. package/dist/reconcile/providers/railway-iac.d.ts +66 -0
  224. package/dist/reconcile/providers/railway-iac.js +275 -0
  225. package/dist/reconcile/providers/release-private.d.ts +92 -0
  226. package/dist/reconcile/providers/release-private.js +152 -0
  227. package/dist/reconcile/registry.d.ts +2 -2
  228. package/dist/reconcile/registry.js +16 -1
  229. package/dist/reconcile/state.d.ts +1 -1
  230. package/dist/reconcile/state.js +3 -40
  231. package/dist/reconcile/units.d.ts +1 -1
  232. package/dist/reconcile/units.js +7 -1
  233. package/dist/remote.d.ts +6 -6
  234. package/dist/scenes/artifacts.d.ts +16 -0
  235. package/dist/scenes/artifacts.js +61 -0
  236. package/dist/scenes/auth.d.ts +2 -0
  237. package/dist/scenes/auth.js +28 -0
  238. package/dist/scenes/base-url.d.ts +12 -0
  239. package/dist/scenes/base-url.js +123 -0
  240. package/dist/scenes/builtin-plugins.d.ts +2 -0
  241. package/dist/scenes/builtin-plugins.js +447 -0
  242. package/dist/scenes/checkpoints.d.ts +14 -0
  243. package/dist/scenes/checkpoints.js +33 -0
  244. package/dist/scenes/device-matrix.d.ts +2 -0
  245. package/dist/scenes/device-matrix.js +97 -0
  246. package/dist/scenes/devices.d.ts +11 -0
  247. package/dist/scenes/devices.js +22 -0
  248. package/dist/scenes/diagnostics.d.ts +5 -0
  249. package/dist/scenes/diagnostics.js +22 -0
  250. package/dist/scenes/diagram-providers.d.ts +2 -0
  251. package/dist/scenes/diagram-providers.js +181 -0
  252. package/dist/scenes/diagram-validation.d.ts +22 -0
  253. package/dist/scenes/diagram-validation.js +74 -0
  254. package/dist/scenes/environment.d.ts +2 -0
  255. package/dist/scenes/environment.js +65 -0
  256. package/dist/scenes/evidence-bundle.d.ts +5 -0
  257. package/dist/scenes/evidence-bundle.js +42 -0
  258. package/dist/scenes/evidence-report.d.ts +10 -0
  259. package/dist/scenes/evidence-report.js +73 -0
  260. package/dist/scenes/evidence.d.ts +16 -0
  261. package/dist/scenes/evidence.js +277 -0
  262. package/dist/scenes/index.d.ts +48 -0
  263. package/dist/scenes/index.js +312 -0
  264. package/dist/scenes/inspect.d.ts +9 -0
  265. package/dist/scenes/inspect.js +64 -0
  266. package/dist/scenes/loader.d.ts +3 -0
  267. package/dist/scenes/loader.js +38 -0
  268. package/dist/scenes/logs.d.ts +2 -0
  269. package/dist/scenes/logs.js +47 -0
  270. package/dist/scenes/operations.d.ts +3 -0
  271. package/dist/scenes/operations.js +128 -0
  272. package/dist/scenes/phase0.d.ts +9 -0
  273. package/dist/scenes/phase0.js +637 -0
  274. package/dist/scenes/planner.d.ts +12 -0
  275. package/dist/scenes/planner.js +166 -0
  276. package/dist/scenes/playwright-adapter.d.ts +2 -0
  277. package/dist/scenes/playwright-adapter.js +63 -0
  278. package/dist/scenes/plugins.d.ts +5 -0
  279. package/dist/scenes/plugins.js +115 -0
  280. package/dist/scenes/progress.d.ts +17 -0
  281. package/dist/scenes/progress.js +24 -0
  282. package/dist/scenes/publish-destinations.d.ts +12 -0
  283. package/dist/scenes/publish-destinations.js +99 -0
  284. package/dist/scenes/publish-plan-report.d.ts +10 -0
  285. package/dist/scenes/publish-plan-report.js +70 -0
  286. package/dist/scenes/publish-plan.d.ts +15 -0
  287. package/dist/scenes/publish-plan.js +248 -0
  288. package/dist/scenes/publish-redaction.d.ts +16 -0
  289. package/dist/scenes/publish-redaction.js +148 -0
  290. package/dist/scenes/publish-release-record.d.ts +13 -0
  291. package/dist/scenes/publish-release-record.js +34 -0
  292. package/dist/scenes/publish-report.d.ts +10 -0
  293. package/dist/scenes/publish-report.js +67 -0
  294. package/dist/scenes/publish.d.ts +16 -0
  295. package/dist/scenes/publish.js +298 -0
  296. package/dist/scenes/registry.d.ts +12 -0
  297. package/dist/scenes/registry.js +65 -0
  298. package/dist/scenes/remotion-adapter.d.ts +3 -0
  299. package/dist/scenes/remotion-adapter.js +94 -0
  300. package/dist/scenes/remotion-composition-registry.d.ts +2 -0
  301. package/dist/scenes/remotion-composition-registry.js +12 -0
  302. package/dist/scenes/remotion-compositions.d.ts +15 -0
  303. package/dist/scenes/remotion-compositions.js +464 -0
  304. package/dist/scenes/remotion-diagrams.d.ts +9 -0
  305. package/dist/scenes/remotion-diagrams.js +188 -0
  306. package/dist/scenes/remotion-input.d.ts +13 -0
  307. package/dist/scenes/remotion-input.js +291 -0
  308. package/dist/scenes/remotion-visuals.d.ts +29 -0
  309. package/dist/scenes/remotion-visuals.js +198 -0
  310. package/dist/scenes/render-media-assets.d.ts +9 -0
  311. package/dist/scenes/render-media-assets.js +117 -0
  312. package/dist/scenes/render-report.d.ts +10 -0
  313. package/dist/scenes/render-report.js +27 -0
  314. package/dist/scenes/render.d.ts +2 -0
  315. package/dist/scenes/render.js +218 -0
  316. package/dist/scenes/reporter.d.ts +3 -0
  317. package/dist/scenes/reporter.js +101 -0
  318. package/dist/scenes/resume.d.ts +2 -0
  319. package/dist/scenes/resume.js +79 -0
  320. package/dist/scenes/runner.d.ts +2 -0
  321. package/dist/scenes/runner.js +674 -0
  322. package/dist/scenes/schema.d.ts +6 -0
  323. package/dist/scenes/schema.js +994 -0
  324. package/dist/scenes/seed.d.ts +2 -0
  325. package/dist/scenes/seed.js +83 -0
  326. package/dist/scenes/segments.d.ts +15 -0
  327. package/dist/scenes/segments.js +79 -0
  328. package/dist/scenes/selectors.d.ts +3 -0
  329. package/dist/scenes/selectors.js +21 -0
  330. package/dist/scenes/timeline.d.ts +11 -0
  331. package/dist/scenes/timeline.js +26 -0
  332. package/dist/scenes/timeouts.d.ts +6 -0
  333. package/dist/scenes/timeouts.js +17 -0
  334. package/dist/scenes/training-captions.d.ts +14 -0
  335. package/dist/scenes/training-captions.js +98 -0
  336. package/dist/scenes/training-report.d.ts +10 -0
  337. package/dist/scenes/training-report.js +78 -0
  338. package/dist/scenes/training-transcript.d.ts +24 -0
  339. package/dist/scenes/training-transcript.js +204 -0
  340. package/dist/scenes/training.d.ts +10 -0
  341. package/dist/scenes/training.js +134 -0
  342. package/dist/scenes/types.d.ts +1872 -0
  343. package/dist/scenes/types.js +8 -0
  344. package/dist/scenes/visual-audit-contact-sheets.d.ts +6 -0
  345. package/dist/scenes/visual-audit-contact-sheets.js +119 -0
  346. package/dist/scenes/visual-audit-fixtures.d.ts +25 -0
  347. package/dist/scenes/visual-audit-fixtures.js +210 -0
  348. package/dist/scenes/visual-audit-report.d.ts +11 -0
  349. package/dist/scenes/visual-audit-report.js +85 -0
  350. package/dist/scenes/visual-audit-review.d.ts +23 -0
  351. package/dist/scenes/visual-audit-review.js +829 -0
  352. package/dist/scenes/visual-audit-routes.d.ts +13 -0
  353. package/dist/scenes/visual-audit-routes.js +308 -0
  354. package/dist/scenes/visual-audit.d.ts +3 -0
  355. package/dist/scenes/visual-audit.js +596 -0
  356. package/dist/scripts/build-dist.js +154 -40
  357. package/dist/scripts/check-build-warnings.js +42 -53
  358. package/dist/scripts/cleanup-markdown.js +1 -1
  359. package/dist/scripts/cli-test-fixtures.js +24 -28
  360. package/dist/scripts/migrate-journey-csv-to-guarantees.js +140 -0
  361. package/dist/scripts/package-tools.js +12 -1
  362. package/dist/scripts/prepare.js +3 -7
  363. package/dist/scripts/release-verify.js +2 -5
  364. package/dist/scripts/run-fixture-astro-command.js +1 -1
  365. package/dist/scripts/template-catalog.test.js +68 -82
  366. package/dist/scripts/tenant-dev.js +0 -10
  367. package/dist/scripts/test-cloudflare-local.js +1 -1
  368. package/dist/scripts/test-scaffold.js +0 -1
  369. package/dist/scripts/test-smoke.js +3 -3
  370. package/dist/scripts/treeseed-build-dist.js +4 -7
  371. package/dist/scripts/treeseed-release-verify.js +1 -1
  372. package/dist/scripts/verify-driver.js +30 -21
  373. package/dist/scripts/workflow-commands.test.js +18 -27
  374. package/dist/scripts/workspace-command-e2e.js +1 -1
  375. package/dist/scripts/workspace-lint.js +6 -0
  376. package/dist/scripts/workspace-release-test.js +90 -1
  377. package/dist/scripts/workspace-test.js +6 -0
  378. package/dist/sdk-dispatch.d.ts +1 -1
  379. package/dist/sdk-dispatch.js +0 -16
  380. package/dist/sdk-fields.d.ts +1 -1
  381. package/dist/sdk-filters.d.ts +1 -1
  382. package/dist/sdk-types.d.ts +1184 -113
  383. package/dist/sdk-types.js +393 -0
  384. package/dist/sdk.d.ts +74 -79
  385. package/dist/sdk.js +27 -36
  386. package/dist/secrets-capability.d.ts +421 -0
  387. package/dist/secrets-capability.js +530 -0
  388. package/dist/seeds/normalize.js +1 -0
  389. package/dist/seeds/planner.js +38 -0
  390. package/dist/seeds/schema.js +293 -4
  391. package/dist/seeds/types.d.ts +60 -0
  392. package/dist/seeds/types.js +9 -1
  393. package/dist/service-credentials.d.ts +54 -0
  394. package/dist/service-credentials.js +112 -0
  395. package/dist/stores/cursor-store.d.ts +2 -2
  396. package/dist/stores/envelopes.d.ts +1 -1
  397. package/dist/stores/helpers.d.ts +1 -1
  398. package/dist/stores/lease-store.d.ts +2 -2
  399. package/dist/stores/message-store.d.ts +2 -2
  400. package/dist/stores/operational-store.d.ts +3 -26
  401. package/dist/stores/operational-store.js +0 -225
  402. package/dist/stores/project-workflow-store.d.ts +2 -2
  403. package/dist/stores/run-store.d.ts +2 -3
  404. package/dist/stores/run-store.js +0 -98
  405. package/dist/stores/subscription-store.d.ts +2 -3
  406. package/dist/stores/subscription-store.js +0 -100
  407. package/dist/template-catalog.d.ts +1 -1
  408. package/dist/template-launch-requirements.d.ts +2 -2
  409. package/dist/template-launch-ui.d.ts +2 -2
  410. package/dist/treedx/adapters.d.ts +6 -6
  411. package/dist/treedx/client.d.ts +1 -1
  412. package/dist/treedx/errors.d.ts +1 -1
  413. package/dist/treedx/federated-client.d.ts +3 -3
  414. package/dist/treedx/graph-adapter.d.ts +2 -2
  415. package/dist/treedx/index.d.ts +14 -14
  416. package/dist/treedx/market-integration.d.ts +1 -1
  417. package/dist/treedx/ports.d.ts +30 -30
  418. package/dist/treedx/query-adapter.d.ts +3 -3
  419. package/dist/treedx/registry-client.d.ts +2 -2
  420. package/dist/treedx/repository-adapter.d.ts +4 -4
  421. package/dist/treedx/repository-adapter.js +14 -3
  422. package/dist/treedx/sdk-integration.d.ts +3 -3
  423. package/dist/treedx/types.d.ts +2 -2
  424. package/dist/treedx/workspace-adapter.d.ts +2 -2
  425. package/dist/treedx-backends.d.ts +13 -11
  426. package/dist/treedx-backends.js +52 -50
  427. package/dist/treedx-client.d.ts +3 -0
  428. package/dist/treedx-client.js +10 -1
  429. package/dist/treeseed/services/compose.yml +2 -3
  430. package/dist/treeseed/template-catalog/catalog.fixture.json +4 -4
  431. package/dist/types/agents.d.ts +256 -0
  432. package/dist/types/agents.js +42 -1
  433. package/dist/verification.d.ts +1 -0
  434. package/dist/verification.js +143 -14
  435. package/dist/workflow/operations.d.ts +510 -559
  436. package/dist/workflow/operations.js +1891 -1342
  437. package/dist/workflow/policy.js +19 -7
  438. package/dist/workflow/runs.d.ts +9 -3
  439. package/dist/workflow/runs.js +66 -26
  440. package/dist/workflow/session.d.ts +4 -1
  441. package/dist/workflow/session.js +50 -10
  442. package/dist/workflow/worktrees.d.ts +6 -2
  443. package/dist/workflow/worktrees.js +98 -15
  444. package/dist/workflow-state.d.ts +5 -5
  445. package/dist/workflow-state.js +27 -17
  446. package/dist/workflow-support.d.ts +26 -25
  447. package/dist/workflow-support.js +27 -31
  448. package/dist/workflow.d.ts +46 -16
  449. package/dist/workflow.js +19 -7
  450. package/drizzle/d1/0000_treeseed_d1.sql +0 -18
  451. package/drizzle/market/0000_market_control_plane.sql +1793 -1499
  452. package/drizzle/market/0005_agent_capacity_coordination.sql +145 -0
  453. package/drizzle/market/0006_provider_assignment_lifecycle.sql +9 -0
  454. package/drizzle/market/0007_agent_architecture_gap_closure.sql +157 -0
  455. package/drizzle/market/0008_agent_capacity_operational_closure.sql +27 -0
  456. package/drizzle/market/0009_agent_capacity_runtime_hardening.sql +29 -0
  457. package/drizzle/market/0010_secrets_capability_persistence.sql +130 -0
  458. package/drizzle/market/0011_github_app_adapter.sql +47 -0
  459. package/drizzle/market/0012_workday_test_runs.sql +44 -0
  460. package/drizzle/market/0013_runtime_task_lifecycle.sql +39 -0
  461. package/drizzle/market/0014_governance_pipeline.sql +189 -0
  462. package/package.json +75 -18
  463. package/scripts/{verify-driver.mjs → verify-driver.ts} +19 -4
  464. package/templates/github/deploy-web.workflow.yml +12 -8
  465. package/dist/operations/services/mailpit-runtime.d.ts +0 -20
  466. package/dist/operations/services/mailpit-runtime.js +0 -67
  467. package/dist/operations/services/release-candidate.d.ts +0 -60
  468. package/dist/operations/services/release-candidate.js +0 -953
  469. package/dist/scripts/ensure-mailpit.js +0 -48
  470. package/dist/scripts/logs-mailpit.js +0 -2
  471. package/dist/scripts/run-ts.js +0 -45
  472. package/dist/scripts/stop-mailpit.js +0 -5
  473. package/dist/scripts/treeseed-run-ts.js +0 -45
@@ -0,0 +1,596 @@
1
+ import { mkdirSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { randomUUID } from "node:crypto";
4
+ import { readTreeseedDevInstance } from "../local-dev/managed-dev.js";
5
+ import { resolveTreeseedSceneBaseUrl } from "./base-url.js";
6
+ import { sceneErrorDiagnostic, sceneWarningDiagnostic } from "./diagnostics.js";
7
+ import { resolveTreeseedSceneDeviceProfile } from "./devices.js";
8
+ import { prepareTreeseedSceneEnvironment } from "./environment.js";
9
+ import { validateTreeseedScene } from "./planner.js";
10
+ import { writeTreeseedSceneVisualAuditReport } from "./visual-audit-report.js";
11
+ import {
12
+ buildTreeseedSceneVisualAuditReview,
13
+ isTreeseedSceneVisualAuditIgnoredClientError,
14
+ writeTreeseedSceneVisualAuditReview
15
+ } from "./visual-audit-review.js";
16
+ import {
17
+ discoverTreeseedSceneVisualAuditRoutes,
18
+ treeseedSceneVisualAuditRouteFilename
19
+ } from "./visual-audit-routes.js";
20
+ import {
21
+ ensureTreeseedSceneVisualAuditRoleFixtures,
22
+ signInTreeseedSceneVisualAuditRole,
23
+ validateTreeseedSceneVisualAuditRoles
24
+ } from "./visual-audit-fixtures.js";
25
+ function splitDiagnostics(diagnostics, severity) {
26
+ return diagnostics.filter((entry) => entry.severity === severity);
27
+ }
28
+ function compactTimestamp(value) {
29
+ return value ?? (/* @__PURE__ */ new Date()).toISOString().replace(/[-:]/gu, "").replace(/\.\d{3}Z$/u, "Z");
30
+ }
31
+ function auditId(timestamp) {
32
+ return `${timestamp.toLowerCase().replace(/[^a-z0-9]/gu, "").slice(0, 12)}-${randomUUID().slice(0, 8)}`;
33
+ }
34
+ function pathRootFolder(pathRoot) {
35
+ return pathRoot === "/" ? "root" : pathRoot.replace(/^\/+|\/+$/gu, "").replace(/[^a-z0-9]+/giu, "-").toLowerCase() || "root";
36
+ }
37
+ function pathsFor(input) {
38
+ const auditRoot = join(input.projectRoot, ".treeseed", "scenes", "visual-audits", input.sceneId, `${input.timestamp}-${input.auditId}`);
39
+ return {
40
+ auditRoot,
41
+ manifestPath: join(auditRoot, "manifest.json"),
42
+ reportPath: join(auditRoot, "report.md"),
43
+ screenshotsRoot: join(auditRoot, "screenshots"),
44
+ reviewRoot: join(auditRoot, "review"),
45
+ reviewSummaryPath: join(auditRoot, "review", "summary.json"),
46
+ reviewFindingsPath: join(auditRoot, "review", "findings.json"),
47
+ reviewAgentBriefPath: join(auditRoot, "review", "agent-brief.md")
48
+ };
49
+ }
50
+ function httpHealthBaseUrl(instance) {
51
+ const healthUrl = instance?.health?.find((entry) => entry.kind === "http" && typeof entry.url === "string")?.url;
52
+ if (!healthUrl) return null;
53
+ try {
54
+ const url = new URL(healthUrl);
55
+ if (url.hostname === "0.0.0.0") url.hostname = "127.0.0.1";
56
+ return url.origin;
57
+ } catch {
58
+ return healthUrl.replace(/\/healthz?$/u, "").replace(/\/+$/u, "");
59
+ }
60
+ }
61
+ function resolveVisualAuditApiBaseUrl(input) {
62
+ if (input.environment !== "local") return input.webBaseUrl;
63
+ const apiInstance = readTreeseedDevInstance({ cwd: input.projectRoot, surface: "api" });
64
+ const managedApi = httpHealthBaseUrl(apiInstance);
65
+ if (managedApi) return managedApi;
66
+ const envApi = process.env.TREESEED_API_BASE_URL?.trim() || process.env.TREESEED_MARKET_API_BASE_URL?.trim();
67
+ if (envApi) return envApi.replace(/\/+$/u, "");
68
+ return input.webBaseUrl;
69
+ }
70
+ function screenshotPath(input) {
71
+ const root = input.fullPage ? join(input.paths.auditRoot, "full-page") : input.paths.screenshotsRoot;
72
+ return join(root, input.role, input.device, pathRootFolder(input.pathRoot), treeseedSceneVisualAuditRouteFilename(input.path));
73
+ }
74
+ async function loadPlaywright() {
75
+ try {
76
+ return await import("playwright");
77
+ } catch (error) {
78
+ const diagnostic = sceneErrorDiagnostic("scene.playwright_unavailable", error instanceof Error ? error.message : String(error ?? "Playwright is unavailable."), "visualAudit");
79
+ throw Object.assign(new Error(diagnostic.message), { diagnostic });
80
+ }
81
+ }
82
+ function captureId(role, device, routeId) {
83
+ return `${role}-${device}-${routeId}`.replace(/[^a-z0-9._-]+/giu, "-").toLowerCase();
84
+ }
85
+ function clientErrorId(captureIdValue, index) {
86
+ return `${captureIdValue}-client-${String(index).padStart(3, "0")}`;
87
+ }
88
+ async function collectDomSummary(page) {
89
+ return await page.evaluate(() => {
90
+ const visible = (element) => {
91
+ const rect = element.getBoundingClientRect();
92
+ const style = window.getComputedStyle(element);
93
+ return rect.width > 0 && rect.height > 0 && style.visibility !== "hidden" && style.display !== "none";
94
+ };
95
+ const text = (value) => (value ?? "").replace(/\s+/gu, " ").trim();
96
+ const selectorHint = (element) => {
97
+ const id = element.getAttribute("id");
98
+ if (id) return `#${id}`;
99
+ const scene = element.getAttribute("data-scene");
100
+ if (scene) return `[data-scene="${scene}"]`;
101
+ const testId = element.getAttribute("data-testid");
102
+ if (testId) return `[data-testid="${testId}"]`;
103
+ const className = typeof element.className === "string" ? element.className.split(/\s+/u).filter(Boolean).slice(0, 3).join(".") : "";
104
+ return className ? `${element.tagName.toLowerCase()}.${className}` : element.tagName.toLowerCase();
105
+ };
106
+ const hasTreeSeedClass = (element) => typeof element.className === "string" && /\b(ts-|astro-|starlight)/u.test(element.className);
107
+ const links = [...document.querySelectorAll("a")].filter(visible);
108
+ const buttons = [...document.querySelectorAll('button,[role="button"],input[type="button"],input[type="submit"]')].filter(visible);
109
+ const inputs = [...document.querySelectorAll("input,textarea,select")].filter(visible);
110
+ const forms = [...document.querySelectorAll("form")].filter(visible);
111
+ const defaultStyledLinks = links.filter((entry) => !hasTreeSeedClass(entry) && !entry.closest(".prose,[data-prose],article")).map((entry) => {
112
+ const style = window.getComputedStyle(entry);
113
+ const color = style.color;
114
+ const decoration = style.textDecorationLine;
115
+ const looksBlue = /rgb\(\s*(0|20|30|37|59|29),\s*(0|80|100|102|130|78),\s*(150|190|200|238|255)/u.test(color);
116
+ return { entry, style, looksDefault: decoration.includes("underline") || looksBlue };
117
+ }).filter((entry) => entry.looksDefault).slice(0, 12).map(({ entry }) => ({ text: text(entry.textContent).slice(0, 80), href: entry.getAttribute("href"), selectorHint: selectorHint(entry) }));
118
+ const defaultStyledButtons = buttons.filter((entry) => !hasTreeSeedClass(entry)).slice(0, 12).map((entry) => ({ text: text(entry.value || entry.textContent).slice(0, 80), selectorHint: selectorHint(entry) }));
119
+ const visibleText = text(document.body?.innerText ?? "");
120
+ const errorTexts = visibleText.split(/(?<=[.!?])\s+|\n+/u).map((entry) => text(entry)).filter((entry) => /error|exception|stack trace|not found|failed to load|something went wrong|cannot read|undefined|internal server error|vite|astro error|hydration|client error/iu.test(entry)).slice(0, 20);
121
+ const seededEntityTexts = ["Visual Audit Team", "visual-audit", "Visual Audit Project", "visual-audit-project"].filter((entry) => visibleText.includes(entry));
122
+ const headings = [...document.querySelectorAll("h1,h2,h3")].filter(visible).map((entry) => text(entry.textContent)).filter(Boolean).slice(0, 20);
123
+ return {
124
+ title: text(document.title) || null,
125
+ h1: headings[0] ?? null,
126
+ headings,
127
+ visibleTextSample: visibleText.slice(0, 1e3),
128
+ bodyTextLength: visibleText.length,
129
+ visibleLinkCount: links.length,
130
+ visibleButtonCount: buttons.length,
131
+ visibleInputCount: inputs.length,
132
+ visibleFormCount: forms.length,
133
+ appShellDetected: !!document.querySelector('.ts-app-shell,[data-scene^="app."],.ts-team-selector'),
134
+ authShellDetected: !!document.querySelector('.ts-auth-shell,[data-scene^="auth."]'),
135
+ publicShellDetected: !!document.querySelector(".ts-public-shell,.ts-site-shell,.sl-container"),
136
+ horizontalOverflow: document.documentElement.scrollWidth > window.innerWidth + 4,
137
+ scrollWidth: document.documentElement.scrollWidth,
138
+ scrollHeight: document.documentElement.scrollHeight,
139
+ viewportWidth: window.innerWidth,
140
+ viewportHeight: window.innerHeight,
141
+ defaultStyledLinks,
142
+ defaultStyledButtons,
143
+ visibleErrorTexts: errorTexts,
144
+ seededEntityTexts
145
+ };
146
+ });
147
+ }
148
+ function hasTransientVisualAuditServerError(input) {
149
+ if (input.httpStatus && input.httpStatus >= 500) return true;
150
+ const visibleErrors = input.dom?.visibleErrorTexts?.join(" ") ?? "";
151
+ if (/Cannot find module|Astro detected an unhandled rejection|Internal Server Error|AstroError|Vite Error|starlight\/routes\/ssr/iu.test(visibleErrors)) return true;
152
+ return input.clientErrors.some((entry) => entry.kind === "http-error" && (entry.status ?? 0) >= 500) || input.clientErrors.some((entry) => /Cannot find module|Astro detected an unhandled rejection|Internal Server Error|AstroError|Vite Error|starlight\/routes\/ssr/iu.test(entry.message));
153
+ }
154
+ function pathFromUrl(value) {
155
+ if (!value) return null;
156
+ try {
157
+ return new URL(value).pathname.replace(/\/+$/u, "") || "/";
158
+ } catch {
159
+ return null;
160
+ }
161
+ }
162
+ function expectedStatusMatches(expected, actual) {
163
+ if (actual == null || expected == null) return false;
164
+ return Array.isArray(expected) ? expected.includes(actual) : expected === actual;
165
+ }
166
+ function captureLooksHealthy(input) {
167
+ const routePath = pathFromUrl(input.url);
168
+ const finalPath = pathFromUrl(input.finalUrl);
169
+ if (routePath !== finalPath) return false;
170
+ if (input.httpStatus != null && input.httpStatus >= 400) return false;
171
+ return (input.dom?.visibleErrorTexts?.length ?? 0) === 0;
172
+ }
173
+ async function captureRoute(input) {
174
+ const started = Date.now();
175
+ const url = new URL(input.route.path, input.baseUrl).toString();
176
+ const capturedAt = (/* @__PURE__ */ new Date()).toISOString();
177
+ const diagnostics = [];
178
+ const captureIdValue = captureId(input.role, input.device, input.route.id);
179
+ const clientErrors = [];
180
+ const pushClientError = (entry) => {
181
+ if (isTreeseedSceneVisualAuditIgnoredClientError(entry)) return;
182
+ clientErrors.push({
183
+ ...entry,
184
+ id: clientErrorId(captureIdValue, clientErrors.length + 1),
185
+ captureId: captureIdValue,
186
+ timestamp: entry.timestamp ?? (/* @__PURE__ */ new Date()).toISOString()
187
+ });
188
+ };
189
+ const consoleHandler = (message) => {
190
+ const type = message.type();
191
+ if (type !== "error" && type !== "warning") return;
192
+ pushClientError({ kind: "console", severity: type === "error" ? "error" : "warning", message: message.text(), url: message.location?.().url ?? null });
193
+ };
194
+ const pageErrorHandler = (error) => {
195
+ pushClientError({ kind: "pageerror", severity: "error", message: error.message, url });
196
+ };
197
+ const requestFailedHandler = (request) => {
198
+ const requestUrl = request.url();
199
+ const message = request.failure()?.errorText ?? "Request failed.";
200
+ if (/ERR_ABORTED/iu.test(message) && pathFromUrl(requestUrl) !== pathFromUrl(url)) return;
201
+ pushClientError({ kind: "requestfailed", severity: "error", message, url: requestUrl, method: request.method() });
202
+ };
203
+ const responseHandler = (response) => {
204
+ const status = response.status();
205
+ if (status >= 500) pushClientError({ kind: "http-error", severity: "error", message: `HTTP ${status} ${response.url()}`, url: response.url(), method: response.request().method(), status });
206
+ };
207
+ let httpStatus = null;
208
+ let finalUrl = null;
209
+ let screenshot = null;
210
+ let fullPageScreenshot = null;
211
+ let dom = null;
212
+ try {
213
+ input.page.on("console", consoleHandler);
214
+ input.page.on("pageerror", pageErrorHandler);
215
+ input.page.on("requestfailed", requestFailedHandler);
216
+ input.page.on("response", responseHandler);
217
+ const attemptStartIndex = clientErrors.length;
218
+ const navigate = async () => {
219
+ const response = await input.page.goto(url, { waitUntil: "networkidle", timeout: 25e3 });
220
+ httpStatus = response?.status() ?? null;
221
+ finalUrl = input.page.url();
222
+ await input.page.waitForTimeout(350);
223
+ dom = await collectDomSummary(input.page).catch(() => null);
224
+ };
225
+ let lastAttemptError = null;
226
+ for (let attempt = 0; attempt < 4; attempt += 1) {
227
+ try {
228
+ if (attempt > 0) {
229
+ await input.page.goto("about:blank", { waitUntil: "load", timeout: 5e3 }).catch(() => void 0);
230
+ await input.page.waitForTimeout([750, 1500, 2500][attempt - 1] ?? 2500);
231
+ }
232
+ await navigate();
233
+ if (!hasTransientVisualAuditServerError({ httpStatus, dom, clientErrors: clientErrors.slice(attemptStartIndex) }) || captureLooksHealthy({ url, finalUrl, httpStatus, dom })) {
234
+ clientErrors.splice(attemptStartIndex);
235
+ lastAttemptError = null;
236
+ break;
237
+ }
238
+ } catch (error) {
239
+ lastAttemptError = error;
240
+ }
241
+ }
242
+ if (lastAttemptError) throw lastAttemptError;
243
+ screenshot = screenshotPath({ paths: input.paths, role: input.role, device: input.device, pathRoot: input.route.pathRoot, path: input.route.path });
244
+ mkdirSync(dirname(screenshot), { recursive: true });
245
+ await input.page.screenshot({ path: screenshot, fullPage: false });
246
+ if (input.includeFullPage) {
247
+ fullPageScreenshot = screenshotPath({ paths: input.paths, role: input.role, device: input.device, pathRoot: input.route.pathRoot, path: input.route.path, fullPage: true });
248
+ mkdirSync(dirname(fullPageScreenshot), { recursive: true });
249
+ await input.page.screenshot({ path: fullPageScreenshot, fullPage: true });
250
+ }
251
+ if (captureLooksHealthy({ url, finalUrl, httpStatus, dom })) {
252
+ const routePath = pathFromUrl(url);
253
+ for (let index = clientErrors.length - 1; index >= 0; index -= 1) {
254
+ const entry = clientErrors[index];
255
+ const entryPath = pathFromUrl(entry.url);
256
+ if (entryPath !== routePath) continue;
257
+ if (entry.kind === "http-error" && (entry.status ?? 0) >= 500 || /Failed to load resource.*500|server responded with a status of 500|ERR_ABORTED/iu.test(entry.message)) {
258
+ clientErrors.splice(index, 1);
259
+ }
260
+ }
261
+ }
262
+ if (expectedStatusMatches(input.route.expectedStatus, httpStatus)) {
263
+ const routePath = pathFromUrl(url);
264
+ for (let index = clientErrors.length - 1; index >= 0; index -= 1) {
265
+ const entry = clientErrors[index];
266
+ const entryPath = pathFromUrl(entry.url);
267
+ if (entryPath === routePath && (entry.status === httpStatus || entry.message.includes(` ${httpStatus} `))) {
268
+ clientErrors.splice(index, 1);
269
+ }
270
+ }
271
+ } else if (httpStatus && httpStatus >= 400) {
272
+ diagnostics.push(sceneWarningDiagnostic("scene.visual_audit_capture_http_status", `Route returned HTTP ${httpStatus}.`, input.route.path));
273
+ }
274
+ return {
275
+ id: captureIdValue,
276
+ routeId: input.route.id,
277
+ path: input.route.path,
278
+ pathRoot: input.route.pathRoot,
279
+ role: input.role,
280
+ device: input.device,
281
+ url,
282
+ status: "captured",
283
+ httpStatus,
284
+ finalUrl,
285
+ screenshotPath: screenshot,
286
+ fullPageScreenshotPath: fullPageScreenshot,
287
+ capturedAt,
288
+ durationMs: Date.now() - started,
289
+ dom,
290
+ clientErrors,
291
+ diagnostics
292
+ };
293
+ } catch (error) {
294
+ diagnostics.push(sceneErrorDiagnostic("scene.visual_audit_capture_failed", error instanceof Error ? error.message : String(error ?? "Visual audit capture failed."), input.route.path));
295
+ return {
296
+ id: captureIdValue,
297
+ routeId: input.route.id,
298
+ path: input.route.path,
299
+ pathRoot: input.route.pathRoot,
300
+ role: input.role,
301
+ device: input.device,
302
+ url,
303
+ status: "failed",
304
+ httpStatus,
305
+ finalUrl,
306
+ screenshotPath: screenshot,
307
+ fullPageScreenshotPath: fullPageScreenshot,
308
+ capturedAt,
309
+ durationMs: Date.now() - started,
310
+ dom,
311
+ clientErrors,
312
+ diagnostics
313
+ };
314
+ } finally {
315
+ input.page.removeListener?.("console", consoleHandler);
316
+ input.page.removeListener?.("pageerror", pageErrorHandler);
317
+ input.page.removeListener?.("requestfailed", requestFailedHandler);
318
+ input.page.removeListener?.("response", responseHandler);
319
+ }
320
+ }
321
+ function skipCapture(input) {
322
+ return {
323
+ id: captureId(input.role, input.device, input.route.id),
324
+ routeId: input.route.id,
325
+ path: input.route.path,
326
+ pathRoot: input.route.pathRoot,
327
+ role: input.role,
328
+ device: input.device,
329
+ url: new URL(input.route.path, input.baseUrl).toString(),
330
+ status: "skipped",
331
+ httpStatus: null,
332
+ finalUrl: null,
333
+ screenshotPath: null,
334
+ fullPageScreenshotPath: null,
335
+ capturedAt: (/* @__PURE__ */ new Date()).toISOString(),
336
+ durationMs: 0,
337
+ dom: null,
338
+ clientErrors: [],
339
+ diagnostics: [input.diagnostic]
340
+ };
341
+ }
342
+ function browserContextOptions(profile) {
343
+ return {
344
+ viewport: profile.viewport,
345
+ screen: profile.viewport,
346
+ deviceScaleFactor: profile.deviceScaleFactor ?? 1,
347
+ isMobile: profile.isMobile ?? false,
348
+ hasTouch: profile.hasTouch ?? false,
349
+ ...profile.userAgent ? { userAgent: profile.userAgent } : {}
350
+ };
351
+ }
352
+ function visualAuditPreflightRoutes() {
353
+ return ["/", "/auth/register", "/agents", "/questions", "/app"];
354
+ }
355
+ async function runVisualAuditPreflight(baseUrl) {
356
+ const diagnostics = [];
357
+ const unhealthy = [];
358
+ for (const path of visualAuditPreflightRoutes()) {
359
+ try {
360
+ const response = await fetch(new URL(path, baseUrl), { redirect: "follow" });
361
+ const text = await response.text().catch(() => "");
362
+ const sample = text.replace(/<[^>]*>/gu, " ").replace(/\s+/gu, " ").trim().slice(0, 320);
363
+ if (response.status >= 500 || /Cannot find module|Astro detected an unhandled rejection|Internal Server Error|AstroError|Vite Error/iu.test(sample)) {
364
+ unhealthy.push(`${path} status=${response.status} ${sample}`);
365
+ }
366
+ } catch (error) {
367
+ unhealthy.push(`${path} ${error instanceof Error ? error.message : String(error ?? "request failed")}`);
368
+ }
369
+ }
370
+ if (unhealthy.length > 0) {
371
+ diagnostics.push(sceneErrorDiagnostic(
372
+ "scene.visual_audit_environment_unhealthy",
373
+ `Visual audit preflight found local dev route failures. Restart with \`trsd dev start --web-runtime local --force --json\` or use \`trsd scene visual-audit --fresh-dev\`. Examples: ${unhealthy.slice(0, 3).join(" | ")}`,
374
+ "visualAudit.preflight"
375
+ ));
376
+ }
377
+ return diagnostics;
378
+ }
379
+ async function runTreeseedSceneVisualAudit(input) {
380
+ const validation = validateTreeseedScene({ projectRoot: input.projectRoot, scene: input.scene });
381
+ const environment = input.environment ?? "local";
382
+ if (!validation.ok || !validation.scene) {
383
+ return {
384
+ ok: false,
385
+ phase: 11,
386
+ sceneId: validation.scene?.id ?? null,
387
+ auditId: null,
388
+ scenePath: validation.scenePath,
389
+ baseUrl: null,
390
+ roles: input.roles ?? [],
391
+ devices: input.devices ?? [],
392
+ routeCount: 0,
393
+ captureCount: 0,
394
+ failedCount: 0,
395
+ skippedCount: 0,
396
+ auditRoot: null,
397
+ paths: null,
398
+ manifest: null,
399
+ review: null,
400
+ reviewFindingCount: 0,
401
+ rootCauseCount: 0,
402
+ incidentCount: 0,
403
+ clientErrorCount: 0,
404
+ diagnostics: validation.diagnostics,
405
+ warnings: splitDiagnostics(validation.diagnostics, "warning"),
406
+ blockers: splitDiagnostics(validation.diagnostics, "error")
407
+ };
408
+ }
409
+ const scene = validation.scene;
410
+ const roles = input.roles?.length ? input.roles : scene.visualAudit.roles;
411
+ const requestedDevices = input.devices?.length ? input.devices : scene.devices.profiles.map((profile) => profile.id);
412
+ const diagnostics = [...validateTreeseedSceneVisualAuditRoles(roles)];
413
+ const profiles = [];
414
+ for (const device of requestedDevices) {
415
+ const resolved = resolveTreeseedSceneDeviceProfile({ scene, device });
416
+ diagnostics.push(...resolved.diagnostics);
417
+ if (resolved.profile) profiles.push(resolved.profile);
418
+ }
419
+ const environmentReport = await prepareTreeseedSceneEnvironment({ projectRoot: input.projectRoot, scene, environment, env: process.env });
420
+ diagnostics.push(...environmentReport.diagnostics);
421
+ const baseUrlReport = resolveTreeseedSceneBaseUrl({ projectRoot: input.projectRoot, scene, environment, environmentReport });
422
+ diagnostics.push(...baseUrlReport.diagnostics);
423
+ const discovered = discoverTreeseedSceneVisualAuditRoutes({
424
+ projectRoot: input.projectRoot,
425
+ scene,
426
+ pathRoots: input.pathRoots,
427
+ pathGlobs: input.pathGlobs,
428
+ excludePathGlobs: input.excludePathGlobs
429
+ });
430
+ diagnostics.push(...discovered.diagnostics);
431
+ if (discovered.routes.length === 0) diagnostics.push(sceneErrorDiagnostic("scene.visual_audit_no_routes", "No user-facing routes were discovered for visual audit.", "visualAudit"));
432
+ const blockers = splitDiagnostics(diagnostics, "error");
433
+ if (blockers.length > 0 || !baseUrlReport.baseUrl) {
434
+ return {
435
+ ok: false,
436
+ phase: 11,
437
+ sceneId: scene.id,
438
+ auditId: null,
439
+ scenePath: validation.scenePath,
440
+ baseUrl: baseUrlReport.baseUrl,
441
+ roles,
442
+ devices: requestedDevices,
443
+ routeCount: discovered.routes.length,
444
+ captureCount: 0,
445
+ failedCount: 0,
446
+ skippedCount: 0,
447
+ auditRoot: null,
448
+ paths: null,
449
+ manifest: null,
450
+ review: null,
451
+ reviewFindingCount: 0,
452
+ rootCauseCount: 0,
453
+ incidentCount: 0,
454
+ clientErrorCount: 0,
455
+ diagnostics,
456
+ warnings: splitDiagnostics(diagnostics, "warning"),
457
+ blockers
458
+ };
459
+ }
460
+ if (environment === "local" && input.preflight !== false) {
461
+ diagnostics.push(...await runVisualAuditPreflight(baseUrlReport.baseUrl));
462
+ const preflightBlockers = splitDiagnostics(diagnostics, "error");
463
+ if (preflightBlockers.length > 0) {
464
+ return {
465
+ ok: false,
466
+ phase: 11,
467
+ sceneId: scene.id,
468
+ auditId: null,
469
+ scenePath: validation.scenePath,
470
+ baseUrl: baseUrlReport.baseUrl,
471
+ roles,
472
+ devices: requestedDevices,
473
+ routeCount: discovered.routes.length,
474
+ captureCount: 0,
475
+ failedCount: 0,
476
+ skippedCount: 0,
477
+ auditRoot: null,
478
+ paths: null,
479
+ manifest: null,
480
+ review: null,
481
+ reviewFindingCount: 0,
482
+ rootCauseCount: 0,
483
+ incidentCount: 0,
484
+ clientErrorCount: 0,
485
+ diagnostics,
486
+ warnings: splitDiagnostics(diagnostics, "warning"),
487
+ blockers: preflightBlockers
488
+ };
489
+ }
490
+ }
491
+ const apiBaseUrl = resolveVisualAuditApiBaseUrl({ projectRoot: input.projectRoot, environment, webBaseUrl: baseUrlReport.baseUrl });
492
+ if (environment === "local" && roles.some((role) => role !== "anonymous")) {
493
+ diagnostics.push(...await ensureTreeseedSceneVisualAuditRoleFixtures({ baseUrl: apiBaseUrl, roles }));
494
+ }
495
+ const timestamp = compactTimestamp(input.timestamp);
496
+ const id = auditId(timestamp);
497
+ const paths = pathsFor({ projectRoot: input.projectRoot, sceneId: scene.id, timestamp, auditId: id });
498
+ mkdirSync(paths.screenshotsRoot, { recursive: true });
499
+ const captures = [];
500
+ const playwright = await loadPlaywright();
501
+ const browser = await playwright.chromium.launch();
502
+ try {
503
+ for (const role of roles) {
504
+ const roleRequiresLogin = role !== "anonymous";
505
+ for (const profile of profiles) {
506
+ const context = await browser.newContext(browserContextOptions(profile));
507
+ const page = await context.newPage();
508
+ let roleDiagnostics = [];
509
+ if (roleRequiresLogin) {
510
+ if (environment !== "local") {
511
+ roleDiagnostics = [sceneErrorDiagnostic("scene.visual_audit_fixture_unavailable", "Authenticated visual audit fixture sessions are local-only in this implementation.", "roles")];
512
+ } else {
513
+ roleDiagnostics = await signInTreeseedSceneVisualAuditRole({ page, baseUrl: baseUrlReport.baseUrl, apiBaseUrl, role });
514
+ }
515
+ diagnostics.push(...roleDiagnostics);
516
+ }
517
+ for (const route of discovered.routes) {
518
+ if (!route.roles.includes(role)) continue;
519
+ if (roleDiagnostics.length > 0) {
520
+ captures.push(skipCapture({ role, device: profile.id, route, baseUrl: baseUrlReport.baseUrl, diagnostic: roleDiagnostics[0] }));
521
+ continue;
522
+ }
523
+ captures.push(await captureRoute({
524
+ page,
525
+ baseUrl: baseUrlReport.baseUrl,
526
+ paths,
527
+ role,
528
+ device: profile.id,
529
+ route,
530
+ includeFullPage: input.includeFullPage ?? scene.visualAudit.includeFullPage
531
+ }));
532
+ }
533
+ await context.close().catch(() => void 0);
534
+ }
535
+ }
536
+ } finally {
537
+ await browser.close().catch(() => void 0);
538
+ }
539
+ const manifest = {
540
+ schemaVersion: "treeseed.scene.visual-audit/v1",
541
+ phase: 11,
542
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
543
+ sceneId: scene.id,
544
+ auditId: id,
545
+ baseUrl: baseUrlReport.baseUrl,
546
+ roles,
547
+ devices: profiles.map((profile) => profile.id),
548
+ routes: discovered.routes,
549
+ captures,
550
+ diagnostics
551
+ };
552
+ const reviewEnabled = input.review ?? scene.visualAudit.review.enabled;
553
+ const review = reviewEnabled ? buildTreeseedSceneVisualAuditReview({
554
+ manifest,
555
+ paths,
556
+ detail: input.reviewDetail ?? scene.visualAudit.review.detail,
557
+ maxFindings: input.maxFindings ?? scene.visualAudit.review.maxFindings
558
+ }) : null;
559
+ writeTreeseedSceneVisualAuditReport({ manifest, paths, review });
560
+ if (review) writeTreeseedSceneVisualAuditReview({ manifest, review, paths });
561
+ const failedCount = captures.filter((capture) => capture.status === "failed").length;
562
+ const skippedCount = captures.filter((capture) => capture.status === "skipped").length;
563
+ const captureCount = captures.filter((capture) => capture.status === "captured").length;
564
+ const writeDiagnostics = diagnostics;
565
+ const ok = captureCount > 0;
566
+ return {
567
+ ok,
568
+ phase: 11,
569
+ sceneId: scene.id,
570
+ auditId: id,
571
+ scenePath: validation.scenePath,
572
+ baseUrl: baseUrlReport.baseUrl,
573
+ roles,
574
+ devices: profiles.map((profile) => profile.id),
575
+ routeCount: discovered.routes.length,
576
+ captureCount,
577
+ failedCount,
578
+ skippedCount,
579
+ auditRoot: paths.auditRoot,
580
+ paths,
581
+ manifest,
582
+ review,
583
+ reviewFindingCount: review?.summary.findingCount ?? 0,
584
+ rootCauseCount: review?.summary.rootCauseCount ?? 0,
585
+ incidentCount: review?.summary.incidentCount ?? 0,
586
+ clientErrorCount: review?.summary.clientErrorCount ?? 0,
587
+ diagnostics: writeDiagnostics,
588
+ warnings: splitDiagnostics(writeDiagnostics, "warning"),
589
+ blockers: splitDiagnostics(writeDiagnostics, "error")
590
+ };
591
+ }
592
+ import { discoverTreeseedSceneVisualAuditRoutes as discoverTreeseedSceneVisualAuditRoutes2 } from "./visual-audit-routes.js";
593
+ export {
594
+ discoverTreeseedSceneVisualAuditRoutes2 as discoverTreeseedSceneVisualAuditRoutes,
595
+ runTreeseedSceneVisualAudit
596
+ };