@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,8 @@
1
+ const TREESEED_SCENE_SCHEMA_VERSION = "treeseed.scene/v1";
2
+ const TREESEED_SCENE_ENVIRONMENTS = ["local", "staging", "prod"];
3
+ const TREESEED_SCENE_BROWSERS = ["chromium", "firefox", "webkit"];
4
+ export {
5
+ TREESEED_SCENE_BROWSERS,
6
+ TREESEED_SCENE_ENVIRONMENTS,
7
+ TREESEED_SCENE_SCHEMA_VERSION
8
+ };
@@ -0,0 +1,6 @@
1
+ import type { TreeseedSceneVisualAuditManifest, TreeseedSceneVisualAuditPaths, TreeseedSceneVisualAuditReview } from './types.js';
2
+ export declare function writeTreeseedSceneVisualAuditContactSheets(input: {
3
+ manifest: TreeseedSceneVisualAuditManifest;
4
+ review: TreeseedSceneVisualAuditReview;
5
+ paths: TreeseedSceneVisualAuditPaths;
6
+ }): void;
@@ -0,0 +1,119 @@
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { relative } from "node:path";
3
+ function esc(value) {
4
+ return String(value ?? "").replace(/&/gu, "&amp;").replace(/</gu, "&lt;").replace(/>/gu, "&gt;").replace(/"/gu, "&quot;");
5
+ }
6
+ function slug(value) {
7
+ return value === "/" ? "root" : value.replace(/^\/+|\/+$/gu, "").replace(/[^a-z0-9]+/giu, "-").toLowerCase() || "root";
8
+ }
9
+ function rel(from, path) {
10
+ return path ? relative(from, path) : "";
11
+ }
12
+ function styles() {
13
+ return `<style>
14
+ body{margin:0;background:#0f172a;color:#e2e8f0;font:14px/1.45 ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}
15
+ a{color:#38bdf8}
16
+ header{position:sticky;top:0;background:#111827f2;border-bottom:1px solid #334155;padding:16px 22px;z-index:2}
17
+ h1{margin:0 0 8px;font-size:22px} h2{margin:28px 22px 12px;font-size:18px}
18
+ .meta{color:#cbd5e1}.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px;padding:0 22px 24px}
19
+ .card{background:#1e293b;border:1px solid #334155;border-radius:8px;overflow:hidden;box-shadow:0 12px 30px #0004}
20
+ .shot{display:block;background:#020617;aspect-ratio:16/10;overflow:hidden}.shot img{width:100%;height:100%;object-fit:contain;display:block}
21
+ .body{padding:12px}.path{font-weight:700;color:#f8fafc}.sub{color:#cbd5e1;font-size:12px;margin-top:4px}.badges{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px}
22
+ .badge{font-size:11px;border-radius:999px;padding:3px 8px;background:#334155;color:#e2e8f0}.blocking,.high{background:#7f1d1d;color:#fecaca}.medium{background:#78350f;color:#fde68a}.low{background:#164e63;color:#bae6fd}.info{background:#365314;color:#d9f99d}
23
+ .finding{font-size:12px;margin-top:8px;color:#f8fafc}.empty{padding:22px;color:#cbd5e1}
24
+ .action{font-size:12px;margin-top:8px;color:#cbd5e1}.rank{background:#0f766e;color:#ccfbf1}.owner{background:#312e81;color:#ddd6fe}
25
+ nav{display:flex;gap:10px;flex-wrap:wrap;margin-top:8px}
26
+ nav a{border:1px solid #334155;border-radius:999px;padding:4px 10px;text-decoration:none;color:#e2e8f0}
27
+ </style>`;
28
+ }
29
+ function renderPage(input) {
30
+ const reviewRoot = input.paths.reviewRoot;
31
+ const findingsByCapture = /* @__PURE__ */ new Map();
32
+ for (const finding of input.findings) {
33
+ const list = findingsByCapture.get(finding.captureId) ?? [];
34
+ list.push(finding);
35
+ findingsByCapture.set(finding.captureId, list);
36
+ }
37
+ const nav = [
38
+ `<a href="index.html">All</a>`,
39
+ `<a href="flagged.html">Flagged</a>`,
40
+ ...input.allRoots.map((root) => `<a href="${slug(root)}.html">${esc(root)}</a>`)
41
+ ].join("");
42
+ const cards = input.captures.map((capture) => {
43
+ const list = findingsByCapture.get(capture.id) ?? [];
44
+ const image = capture.screenshotPath ? rel(reviewRoot, capture.screenshotPath) : "";
45
+ const badges = list.slice(0, 5).map((finding) => `<span class="badge ${esc(finding.severity)}">${esc(finding.severity)} ${esc(finding.code.replace(/^visual\./u, ""))}</span>`).join("");
46
+ const findingText = list[0] ? `<div class="finding">${esc(list[0].message)}</div>` : "";
47
+ return `<article class="card">
48
+ ${image ? `<a class="shot" href="${esc(image)}"><img src="${esc(image)}" alt="${esc(capture.path)} ${esc(capture.role)} ${esc(capture.device)}"></a>` : '<div class="shot empty">No screenshot</div>'}
49
+ <div class="body">
50
+ <div class="path">${esc(capture.path)}</div>
51
+ <div class="sub">${esc(capture.role)} / ${esc(capture.device)} / ${esc(capture.status)} / ${esc(capture.finalUrl ?? capture.url)}</div>
52
+ ${badges ? `<div class="badges">${badges}</div>` : ""}
53
+ ${findingText}
54
+ </div>
55
+ </article>`;
56
+ }).join("\n");
57
+ return `<!doctype html>
58
+ <html lang="en">
59
+ <head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>${esc(input.title)}</title>${styles()}</head>
60
+ <body>
61
+ <header>
62
+ <h1>${esc(input.title)}</h1>
63
+ <div class="meta">Scene ${esc(input.manifest.sceneId)} / audit ${esc(input.manifest.auditId)} / captures ${input.captures.length} / findings ${input.findings.length}</div>
64
+ <nav>${nav}</nav>
65
+ </header>
66
+ ${cards ? `<main class="grid">${cards}</main>` : '<main class="empty">No captures in this sheet.</main>'}
67
+ </body>
68
+ </html>
69
+ `;
70
+ }
71
+ function renderRootCausePage(input) {
72
+ const reviewRoot = input.paths.reviewRoot;
73
+ const nav = `<a href="index.html">All</a><a href="flagged.html">Flagged</a><a href="root-causes.html">Root causes</a>`;
74
+ const cards = input.rootCauses.map((entry) => {
75
+ const image = entry.exampleScreenshotPath ? rel(reviewRoot, entry.exampleScreenshotPath) : "";
76
+ return `<article class="card" id="${esc(entry.id)}">
77
+ ${image ? `<a class="shot" href="${esc(image)}"><img src="${esc(image)}" alt="${esc(entry.title)}"></a>` : '<div class="shot empty">No screenshot</div>'}
78
+ <div class="body">
79
+ <div class="path">#${esc(entry.priorityRank)} ${esc(entry.title)}</div>
80
+ <div class="sub">${esc(entry.suspectedOwner)} / ${esc(entry.severity)} / score ${esc(entry.priorityScore)} / count ${esc(entry.count)}</div>
81
+ <div class="badges"><span class="badge rank">rank ${esc(entry.priorityRank)}</span><span class="badge owner">${esc(entry.suspectedOwner)}</span><span class="badge ${esc(entry.severity)}">${esc(entry.severity)}</span></div>
82
+ <div class="finding">${esc(entry.paths.slice(0, 8).join(", "))}</div>
83
+ <div class="action">${esc(entry.recommendedAction)}</div>
84
+ </div>
85
+ </article>`;
86
+ }).join("\n");
87
+ return `<!doctype html>
88
+ <html lang="en">
89
+ <head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Visual Audit Root Causes</title>${styles()}</head>
90
+ <body>
91
+ <header>
92
+ <h1>Visual Audit Root Causes</h1>
93
+ <div class="meta">Scene ${esc(input.manifest.sceneId)} / audit ${esc(input.manifest.auditId)} / root causes ${input.rootCauses.length}</div>
94
+ <nav>${nav}</nav>
95
+ </header>
96
+ ${cards ? `<main class="grid">${cards}</main>` : '<main class="empty">No root causes.</main>'}
97
+ </body>
98
+ </html>
99
+ `;
100
+ }
101
+ function writeTreeseedSceneVisualAuditContactSheets(input) {
102
+ if (!input.paths.reviewRoot) return;
103
+ const root = `${input.paths.reviewRoot}/contact-sheets`;
104
+ mkdirSync(root, { recursive: true });
105
+ const roots = [...new Set(input.manifest.routes.map((route) => route.pathRoot))].sort();
106
+ const write = (name, title, captures, findings = input.review.findings) => {
107
+ writeFileSync(`${root}/${name}.html`, renderPage({ title, manifest: input.manifest, paths: input.paths, captures, findings, allRoots: roots }), "utf8");
108
+ };
109
+ write("index", "Visual Audit Contact Sheets", input.manifest.captures);
110
+ const flaggedIds = new Set(input.review.findings.map((finding) => finding.captureId));
111
+ write("flagged", "Flagged Visual Audit Captures", input.manifest.captures.filter((capture) => flaggedIds.has(capture.id)));
112
+ writeFileSync(`${root}/root-causes.html`, renderRootCausePage({ manifest: input.manifest, paths: input.paths, rootCauses: input.review.rootCauses }), "utf8");
113
+ for (const pathRoot of roots) {
114
+ write(slug(pathRoot), `Visual Audit ${pathRoot}`, input.manifest.captures.filter((capture) => capture.pathRoot === pathRoot));
115
+ }
116
+ }
117
+ export {
118
+ writeTreeseedSceneVisualAuditContactSheets
119
+ };
@@ -0,0 +1,25 @@
1
+ import type { TreeseedSceneDiagnostic, TreeseedSceneVisualAuditRole } from './types.js';
2
+ export declare const TREESEED_VISUAL_AUDIT_PASSWORD = "TreeSeedVisualAudit!2026";
3
+ export declare const TREESEED_VISUAL_AUDIT_USERS: Record<string, {
4
+ email: string;
5
+ password: string;
6
+ label: string;
7
+ }>;
8
+ export declare function treeseedSceneVisualAuditUserForRole(role: TreeseedSceneVisualAuditRole): {
9
+ email: string;
10
+ password: string;
11
+ label: string;
12
+ };
13
+ export declare function validateTreeseedSceneVisualAuditRoles(roles: TreeseedSceneVisualAuditRole[]): TreeseedSceneDiagnostic[];
14
+ export declare function ensureTreeseedSceneVisualAuditRoleFixtures(input: {
15
+ baseUrl: string;
16
+ roles: TreeseedSceneVisualAuditRole[];
17
+ projectRoot?: string;
18
+ environment?: string;
19
+ }): Promise<TreeseedSceneDiagnostic[]>;
20
+ export declare function signInTreeseedSceneVisualAuditRole(input: {
21
+ page: any;
22
+ baseUrl: string;
23
+ apiBaseUrl?: string | null;
24
+ role: TreeseedSceneVisualAuditRole;
25
+ }): Promise<TreeseedSceneDiagnostic[]>;
@@ -0,0 +1,210 @@
1
+ import { sceneErrorDiagnostic, sceneWarningDiagnostic } from "./diagnostics.js";
2
+ import { MarketClient, MarketClientError } from "../market-client.js";
3
+ import { resolveTreeseedMachineEnvironmentValues } from "../operations/services/config-runtime.js";
4
+ const TREESEED_VISUAL_AUDIT_PASSWORD = "TreeSeedVisualAudit!2026";
5
+ const TREESEED_VISUAL_AUDIT_USERS = {
6
+ owner: { email: "visual.owner@treeseed.io", password: TREESEED_VISUAL_AUDIT_PASSWORD, label: "Visual Audit Owner" },
7
+ admin: { email: "visual.admin@treeseed.io", password: TREESEED_VISUAL_AUDIT_PASSWORD, label: "Visual Audit Admin" },
8
+ member: { email: "visual.member@treeseed.io", password: TREESEED_VISUAL_AUDIT_PASSWORD, label: "Visual Audit Member" }
9
+ };
10
+ function treeseedSceneVisualAuditUserForRole(role) {
11
+ return TREESEED_VISUAL_AUDIT_USERS[role] ?? null;
12
+ }
13
+ function validateTreeseedSceneVisualAuditRoles(roles) {
14
+ const diagnostics = [];
15
+ for (const role of roles) {
16
+ if (role === "anonymous") continue;
17
+ if (!treeseedSceneVisualAuditUserForRole(role)) {
18
+ diagnostics.push(sceneWarningDiagnostic("scene.visual_audit_role_unknown", `Visual audit role "${role}" has no built-in fixture login. Routes for this role will be skipped unless a future fixture provider supplies it.`, "roles"));
19
+ }
20
+ }
21
+ return diagnostics;
22
+ }
23
+ function usernameForRole(role) {
24
+ return `visual-${role}`;
25
+ }
26
+ function clientFor(baseUrl, accessToken) {
27
+ return new MarketClient({
28
+ profile: {
29
+ id: "visual-audit-local",
30
+ label: "Visual audit local",
31
+ baseUrl,
32
+ kind: "specialized"
33
+ },
34
+ accessToken: accessToken ?? void 0,
35
+ userAgent: "treeseed-scene-visual-audit"
36
+ });
37
+ }
38
+ function isAuthFailure(error) {
39
+ if (error instanceof MarketClientError) return error.status === 400 || error.status === 401 || error.status === 403 || error.status === 409;
40
+ return false;
41
+ }
42
+ function configuredValue(input, name) {
43
+ const envValue = process.env[name];
44
+ if (typeof envValue === "string" && envValue.trim()) return envValue.trim();
45
+ if (!input?.projectRoot || !input.environment) return null;
46
+ try {
47
+ const values = resolveTreeseedMachineEnvironmentValues(input.projectRoot, input.environment);
48
+ const value = values?.[name];
49
+ return typeof value === "string" && value.trim() ? value.trim() : null;
50
+ } catch {
51
+ return null;
52
+ }
53
+ }
54
+ function serviceHeaders(input) {
55
+ return {
56
+ "content-type": "application/json",
57
+ "x-treeseed-service-id": configuredValue(input, "TREESEED_API_WEB_SERVICE_ID") ?? configuredValue(input, "TREESEED_WEB_SERVICE_ID") ?? "web",
58
+ "x-treeseed-service-secret": configuredValue(input, "TREESEED_API_WEB_SERVICE_SECRET") ?? configuredValue(input, "TREESEED_WEB_SERVICE_SECRET") ?? "treeseed-web-service-dev-secret"
59
+ };
60
+ }
61
+ function seedActorsForRoles(roles) {
62
+ const actors = {};
63
+ for (const role of roles) {
64
+ const user = treeseedSceneVisualAuditUserForRole(role);
65
+ if (!user) continue;
66
+ actors[role] = {
67
+ email: user.email,
68
+ username: usernameForRole(role),
69
+ displayName: user.label,
70
+ siteRoles: role === "admin" ? ["member"] : ["member"],
71
+ teamRole: role === "owner" ? "team_owner" : role === "admin" ? "project_lead" : "contributor"
72
+ };
73
+ }
74
+ return actors;
75
+ }
76
+ async function seedVisualAuditFixtures(input) {
77
+ const actors = seedActorsForRoles(input.roles);
78
+ if (Object.keys(actors).length === 0) return [];
79
+ try {
80
+ const response = await fetch(new URL("/v1/acceptance/seed", input.baseUrl).toString(), {
81
+ method: "POST",
82
+ headers: serviceHeaders(input),
83
+ body: JSON.stringify({
84
+ namespace: "visual-audit",
85
+ password: TREESEED_VISUAL_AUDIT_PASSWORD,
86
+ actors
87
+ })
88
+ });
89
+ const text = await response.text();
90
+ if (!response.ok) {
91
+ return [sceneWarningDiagnostic(
92
+ "scene.visual_audit_fixture_unavailable",
93
+ `Visual audit API fixture seed failed with HTTP ${response.status}: ${text.slice(0, 500)}`,
94
+ "roles"
95
+ )];
96
+ }
97
+ return [];
98
+ } catch (error) {
99
+ return [sceneWarningDiagnostic(
100
+ "scene.visual_audit_fixture_unavailable",
101
+ `Visual audit API fixture seed failed against ${input.baseUrl}: ${error instanceof Error ? error.message : String(error ?? "local fixture API is unavailable")}.`,
102
+ "roles"
103
+ )];
104
+ }
105
+ }
106
+ async function ensureTreeseedSceneVisualAuditRoleFixtures(input) {
107
+ const diagnostics = [];
108
+ const roles = [...new Set(input.roles)].filter((role) => role !== "anonymous");
109
+ diagnostics.push(...await seedVisualAuditFixtures({
110
+ baseUrl: input.baseUrl,
111
+ roles,
112
+ projectRoot: input.projectRoot,
113
+ environment: input.environment
114
+ }));
115
+ for (const role of roles) {
116
+ const user = treeseedSceneVisualAuditUserForRole(role);
117
+ if (!user) continue;
118
+ const client = clientFor(input.baseUrl);
119
+ try {
120
+ await client.webSignIn({ login: user.email, password: user.password });
121
+ continue;
122
+ } catch (error) {
123
+ if (!isAuthFailure(error)) {
124
+ diagnostics.push(sceneWarningDiagnostic(
125
+ "scene.visual_audit_fixture_unavailable",
126
+ `Visual audit fixture setup for ${role} failed against ${input.baseUrl}: ${error instanceof Error ? error.message : String(error ?? "local fixture API is unavailable")}. Authenticated screenshots require the local API and database to be healthy.`,
127
+ "roles"
128
+ ));
129
+ continue;
130
+ }
131
+ }
132
+ try {
133
+ const [firstName = "Visual", lastName = String(role)] = user.label.split(/\s+/u);
134
+ const signup = await client.webSignUp({
135
+ email: user.email,
136
+ username: usernameForRole(role),
137
+ password: user.password,
138
+ firstName,
139
+ lastName,
140
+ name: user.label
141
+ });
142
+ const payload = signup.payload;
143
+ if (payload.confirmationToken) {
144
+ await client.confirmWebEmail({ token: payload.confirmationToken });
145
+ } else if (payload.confirmationRequired) {
146
+ diagnostics.push(sceneWarningDiagnostic("scene.visual_audit_fixture_unavailable", `Visual audit fixture user ${user.email} requires email confirmation, but the local API did not return a confirmation token.`, "roles"));
147
+ }
148
+ } catch (error) {
149
+ try {
150
+ await client.webSignIn({ login: user.email, password: user.password });
151
+ } catch {
152
+ diagnostics.push(sceneWarningDiagnostic(
153
+ "scene.visual_audit_fixture_unavailable",
154
+ `Visual audit fixture setup for ${role} failed against ${input.baseUrl}: ${error instanceof Error ? error.message : String(error ?? "local fixture API is unavailable")}. Authenticated screenshots require the local API and database to be healthy.`,
155
+ "roles"
156
+ ));
157
+ }
158
+ }
159
+ }
160
+ return diagnostics;
161
+ }
162
+ async function signInTreeseedSceneVisualAuditRole(input) {
163
+ const user = treeseedSceneVisualAuditUserForRole(input.role);
164
+ if (!user) {
165
+ return [sceneErrorDiagnostic("scene.visual_audit_role_unknown", `Visual audit role "${input.role}" has no fixture login.`, "role")];
166
+ }
167
+ const apiBaseUrl = input.apiBaseUrl?.trim() || input.baseUrl;
168
+ try {
169
+ const session = await clientFor(apiBaseUrl).webSignIn({ login: user.email, password: user.password });
170
+ const accessToken = session.payload.accessToken;
171
+ if (accessToken) {
172
+ const webUrl = new URL(input.baseUrl);
173
+ await input.page.context().addCookies([{
174
+ name: "ts_market_api_access",
175
+ value: accessToken,
176
+ domain: webUrl.hostname,
177
+ path: "/",
178
+ httpOnly: true,
179
+ secure: webUrl.protocol === "https:",
180
+ sameSite: "Lax",
181
+ expires: Math.floor(Date.now() / 1e3) + Number(session.payload.expiresInSeconds ?? 900)
182
+ }]);
183
+ await input.page.goto(new URL("/app/", input.baseUrl).toString(), { waitUntil: "networkidle", timeout: 2e4 });
184
+ if (!/\/auth\/sign-in/u.test(input.page.url())) return [];
185
+ }
186
+ } catch {
187
+ }
188
+ try {
189
+ await input.page.goto(new URL("/auth/sign-in", input.baseUrl).toString(), { waitUntil: "networkidle", timeout: 2e4 });
190
+ await input.page.locator('input[name="login"], input[name="email"], input[name="emailOrUsername"], input[name="username"]').first().fill(user.email, { timeout: 5e3 });
191
+ await input.page.locator('input[name="password"]').first().fill(user.password, { timeout: 5e3 });
192
+ await input.page.getByRole("button", { name: /sign in/i }).click({ timeout: 5e3 });
193
+ await input.page.waitForLoadState("networkidle", { timeout: 5e3 }).catch(() => void 0);
194
+ const url = input.page.url();
195
+ if (/\/auth\/sign-in/u.test(url)) {
196
+ return [sceneWarningDiagnostic("scene.visual_audit_role_login_failed", `Visual audit login for ${input.role} did not leave the sign-in page. Ensure deterministic fixture user ${user.email} exists.`, "roles")];
197
+ }
198
+ return [];
199
+ } catch (error) {
200
+ return [sceneWarningDiagnostic("scene.visual_audit_role_login_failed", error instanceof Error ? error.message : String(error ?? `Visual audit login for ${input.role} failed.`), "roles")];
201
+ }
202
+ }
203
+ export {
204
+ TREESEED_VISUAL_AUDIT_PASSWORD,
205
+ TREESEED_VISUAL_AUDIT_USERS,
206
+ ensureTreeseedSceneVisualAuditRoleFixtures,
207
+ signInTreeseedSceneVisualAuditRole,
208
+ treeseedSceneVisualAuditUserForRole,
209
+ validateTreeseedSceneVisualAuditRoles
210
+ };
@@ -0,0 +1,11 @@
1
+ import type { TreeseedSceneVisualAuditManifest, TreeseedSceneVisualAuditPaths, TreeseedSceneVisualAuditReview } from './types.js';
2
+ export declare function formatTreeseedSceneVisualAuditMarkdown(input: {
3
+ manifest: TreeseedSceneVisualAuditManifest;
4
+ paths: TreeseedSceneVisualAuditPaths;
5
+ review?: TreeseedSceneVisualAuditReview | null;
6
+ }): string;
7
+ export declare function writeTreeseedSceneVisualAuditReport(input: {
8
+ manifest: TreeseedSceneVisualAuditManifest;
9
+ paths: TreeseedSceneVisualAuditPaths;
10
+ review?: TreeseedSceneVisualAuditReview | null;
11
+ }): void;
@@ -0,0 +1,85 @@
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { relative } from "node:path";
3
+ function md(value) {
4
+ return String(value ?? "").replace(/\|/gu, "\\|").replace(/\n/gu, " ");
5
+ }
6
+ function rel(root, path) {
7
+ return path ? relative(root, path) : "";
8
+ }
9
+ function firstDiagnostic(capture) {
10
+ return capture.diagnostics[0] ?? null;
11
+ }
12
+ function formatTreeseedSceneVisualAuditMarkdown(input) {
13
+ const { manifest, paths } = input;
14
+ const failed = manifest.captures.filter((capture) => capture.status === "failed");
15
+ const skipped = manifest.captures.filter((capture) => capture.status === "skipped");
16
+ const captured = manifest.captures.filter((capture) => capture.status === "captured");
17
+ const roots = [...new Set(manifest.routes.map((route) => route.pathRoot))].sort();
18
+ const lines = [
19
+ "# TreeSeed Scene Visual Audit",
20
+ "",
21
+ `Scene: ${manifest.sceneId ?? "(unknown)"}`,
22
+ `Audit: ${manifest.auditId}`,
23
+ `Base URL: ${manifest.baseUrl ?? "(unresolved)"}`,
24
+ `Generated: ${manifest.generatedAt}`,
25
+ "",
26
+ "## Summary",
27
+ "",
28
+ `- Roles: ${manifest.roles.join(", ") || "(none)"}`,
29
+ `- Devices: ${manifest.devices.join(", ") || "(none)"}`,
30
+ `- Routes: ${manifest.routes.length}`,
31
+ `- Captures: ${captured.length}`,
32
+ `- Failed: ${failed.length}`,
33
+ `- Skipped: ${skipped.length}`,
34
+ `- Review findings: ${input.review?.summary.findingCount ?? 0}`,
35
+ `- Root causes: ${input.review?.summary.rootCauseCount ?? 0}`,
36
+ `- Incidents: ${input.review?.summary.incidentCount ?? 0}`,
37
+ `- Raw client errors: ${input.review?.summary.clientErrorCount ?? 0}`,
38
+ ""
39
+ ];
40
+ if (input.review && paths.reviewRoot) {
41
+ lines.push("## Review", "");
42
+ lines.push(`- Agent brief: [review/agent-brief.md](${md(rel(paths.auditRoot, paths.reviewAgentBriefPath))})`);
43
+ lines.push(`- Issue index: [review/issue-index.json](${md(rel(paths.auditRoot, `${paths.reviewRoot}/issue-index.json`))})`);
44
+ lines.push(`- Top priority: [review/query/top-priority.json](${md(rel(paths.auditRoot, `${paths.reviewRoot}/query/top-priority.json`))})`);
45
+ lines.push(`- Root causes: [review/root-causes.json](${md(rel(paths.auditRoot, `${paths.reviewRoot}/root-causes.json`))})`);
46
+ lines.push(`- Incidents: [review/incidents.json](${md(rel(paths.auditRoot, `${paths.reviewRoot}/incidents.json`))})`);
47
+ lines.push(`- Findings JSON: [review/findings.json](${md(rel(paths.auditRoot, paths.reviewFindingsPath))})`);
48
+ lines.push(`- Contact sheets: [review/contact-sheets/index.html](${md(rel(paths.auditRoot, `${paths.reviewRoot}/contact-sheets/index.html`))})`);
49
+ lines.push(`- Flagged contact sheet: [review/contact-sheets/flagged.html](${md(rel(paths.auditRoot, `${paths.reviewRoot}/contact-sheets/flagged.html`))})`);
50
+ lines.push(`- Root-cause contact sheet: [review/contact-sheets/root-causes.html](${md(rel(paths.auditRoot, `${paths.reviewRoot}/contact-sheets/root-causes.html`))})`);
51
+ lines.push("");
52
+ }
53
+ lines.push("## By Path Root", "");
54
+ for (const root of roots) {
55
+ lines.push(`### ${root}`, "");
56
+ lines.push("| Role | Device | Path | Status | Screenshot |");
57
+ lines.push("| --- | --- | --- | --- | --- |");
58
+ const captures = manifest.captures.filter((capture) => capture.pathRoot === root).sort((a, b) => `${a.role}:${a.device}:${a.path}`.localeCompare(`${b.role}:${b.device}:${b.path}`));
59
+ for (const capture of captures) {
60
+ const screenshot = capture.screenshotPath ? `[view](${md(rel(paths.auditRoot, capture.screenshotPath))})` : "";
61
+ lines.push(`| ${md(capture.role)} | ${md(capture.device)} | ${md(capture.path)} | ${md(capture.status)} | ${screenshot} |`);
62
+ }
63
+ lines.push("");
64
+ }
65
+ lines.push("## Failures", "");
66
+ lines.push("| Role | Device | Path | Code | Message |");
67
+ lines.push("| --- | --- | --- | --- | --- |");
68
+ for (const capture of [...failed, ...skipped]) {
69
+ const diagnostic = firstDiagnostic(capture);
70
+ lines.push(`| ${md(capture.role)} | ${md(capture.device)} | ${md(capture.path)} | ${md(diagnostic?.code ?? capture.status)} | ${md(diagnostic?.message ?? capture.status)} |`);
71
+ }
72
+ lines.push("");
73
+ return `${lines.join("\n")}
74
+ `;
75
+ }
76
+ function writeTreeseedSceneVisualAuditReport(input) {
77
+ mkdirSync(input.paths.auditRoot, { recursive: true });
78
+ writeFileSync(input.paths.manifestPath, `${JSON.stringify(input.manifest, null, 2)}
79
+ `, "utf8");
80
+ writeFileSync(input.paths.reportPath, formatTreeseedSceneVisualAuditMarkdown(input), "utf8");
81
+ }
82
+ export {
83
+ formatTreeseedSceneVisualAuditMarkdown,
84
+ writeTreeseedSceneVisualAuditReport
85
+ };
@@ -0,0 +1,23 @@
1
+ import type { TreeseedSceneVisualAuditClientError, TreeseedSceneVisualAuditManifest, TreeseedSceneVisualAuditPaths, TreeseedSceneVisualAuditReview, TreeseedSceneVisualAuditReviewDetail } from './types.js';
2
+ export declare function isTreeseedSceneVisualAuditIgnoredClientError(error: Pick<TreeseedSceneVisualAuditClientError, 'url' | 'message'>): boolean;
3
+ export declare function buildTreeseedSceneVisualAuditReview(input: {
4
+ manifest: TreeseedSceneVisualAuditManifest;
5
+ paths: TreeseedSceneVisualAuditPaths;
6
+ detail?: TreeseedSceneVisualAuditReviewDetail;
7
+ maxFindings?: number;
8
+ }): TreeseedSceneVisualAuditReview;
9
+ export declare function formatTreeseedSceneVisualAuditFindingsMarkdown(input: {
10
+ manifest: TreeseedSceneVisualAuditManifest;
11
+ review: TreeseedSceneVisualAuditReview;
12
+ paths: TreeseedSceneVisualAuditPaths;
13
+ }): string;
14
+ export declare function formatTreeseedSceneVisualAuditAgentBrief(input: {
15
+ manifest: TreeseedSceneVisualAuditManifest;
16
+ review: TreeseedSceneVisualAuditReview;
17
+ paths: TreeseedSceneVisualAuditPaths;
18
+ }): string;
19
+ export declare function writeTreeseedSceneVisualAuditReview(input: {
20
+ manifest: TreeseedSceneVisualAuditManifest;
21
+ review: TreeseedSceneVisualAuditReview;
22
+ paths: TreeseedSceneVisualAuditPaths;
23
+ }): void;