@treeseed/sdk 0.12.62 → 0.13.0-rc.10

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 (1108) hide show
  1. package/LICENSE +13 -0
  2. package/README.md +33 -359
  3. package/dist/accounts/account-contracts.d.ts +170 -0
  4. package/dist/accounts/account-contracts.js +33 -0
  5. package/dist/agent-capacity/allocation.d.ts +186 -0
  6. package/dist/agent-capacity/allocation.js +226 -0
  7. package/dist/agent-capacity/artifact-mutation-receipt.d.ts +49 -0
  8. package/dist/agent-capacity/artifact-mutation-receipt.js +36 -0
  9. package/dist/agent-capacity/artifacts.d.ts +107 -0
  10. package/dist/agent-capacity/artifacts.js +39 -0
  11. package/dist/agent-capacity/authority/agent-authority-presets.d.ts +13 -0
  12. package/dist/agent-capacity/authority/agent-authority-presets.js +106 -0
  13. package/dist/agent-capacity/contracts/capacity/assignments/assignment-records.d.ts +269 -0
  14. package/dist/agent-capacity/contracts/capacity/assignments/assignment-records.js +10 -0
  15. package/dist/agent-capacity/contracts/capacity/communication/communication-records.d.ts +101 -0
  16. package/dist/agent-capacity/contracts/capacity/communication/communication-records.js +9 -0
  17. package/dist/agent-capacity/contracts/capacity/providers/supply-policy.d.ts +36 -0
  18. package/dist/agent-capacity/contracts/capacity/providers/supply-policy.js +4 -0
  19. package/dist/agent-capacity/contracts/capacity/workdays/workday-records.d.ts +188 -0
  20. package/dist/agent-capacity/contracts/configuration/configuration.d.ts +11 -0
  21. package/dist/agent-capacity/contracts/configuration/configuration.js +20 -0
  22. package/dist/agent-capacity/contracts/operations/research-workflow.d.ts +59 -0
  23. package/dist/agent-capacity/contracts/operations/research-workflow.js +16 -0
  24. package/dist/agent-capacity/contracts/operations/workflow-promotion.d.ts +24 -0
  25. package/dist/agent-capacity/contracts/projects/agents/project-agent-class.d.ts +37 -0
  26. package/dist/agent-capacity/contracts/runtime/runtime-observability.d.ts +335 -0
  27. package/dist/agent-capacity/contracts/support/agent-atlas.d.ts +185 -0
  28. package/dist/agent-capacity/contracts/support/agent-atlas.js +47 -0
  29. package/dist/agent-capacity/contracts/support/agent-lab-monitoring.d.ts +96 -0
  30. package/dist/agent-capacity/contracts/support/agent-lab-monitoring.js +14 -0
  31. package/dist/agent-capacity/contracts/support/authority/execution-mode.d.ts +10 -0
  32. package/dist/agent-capacity/contracts/support/authority/execution-mode.js +17 -0
  33. package/dist/agent-capacity/contracts/support/decision-work.d.ts +251 -0
  34. package/dist/agent-capacity/contracts/support/failure-records.d.ts +9 -0
  35. package/dist/agent-capacity/contracts/support/failure-records.js +0 -0
  36. package/dist/agent-capacity/contracts/support/financial-records.d.ts +124 -0
  37. package/dist/agent-capacity/contracts/support/financial-records.js +0 -0
  38. package/dist/agent-capacity/contracts/support/planning-records.d.ts +121 -0
  39. package/dist/agent-capacity/contracts/support/planning-records.js +0 -0
  40. package/dist/agent-capacity/contracts/support/research-citation.d.ts +15 -0
  41. package/dist/agent-capacity/contracts/support/research-citation.js +0 -0
  42. package/dist/agent-capacity/contracts/support/research-source-policy.d.ts +8 -0
  43. package/dist/agent-capacity/contracts/support/research-source-policy.js +0 -0
  44. package/dist/agent-capacity/contracts/support/time-capacity.d.ts +163 -0
  45. package/dist/agent-capacity/contracts/support/time-capacity.js +63 -0
  46. package/dist/agent-capacity/policy/capacity/allocations/allocation-hierarchy.d.ts +29 -0
  47. package/dist/agent-capacity/policy/capacity/allocations/allocation-hierarchy.js +110 -0
  48. package/dist/agent-capacity/validation/activity-profile.d.ts +12 -0
  49. package/dist/agent-capacity/validation/activity-profile.js +264 -0
  50. package/dist/agent-capacity/validation/agent-definition-schema.d.ts +9140 -0
  51. package/dist/agent-capacity/validation/agent-definition-schema.js +198 -0
  52. package/dist/agent-capacity/validation/agent-lab-forensics-schema.d.ts +234 -0
  53. package/dist/agent-capacity/validation/agent-lab-forensics-schema.js +104 -0
  54. package/dist/agent-capacity/validation/agent-signal.d.ts +30 -0
  55. package/dist/agent-capacity/validation/agent-signal.js +31 -0
  56. package/dist/agent-capacity/validation/allocation.d.ts +12 -0
  57. package/dist/agent-capacity/validation/allocation.js +115 -0
  58. package/dist/agent-capacity/validation/assignment-records.d.ts +16 -0
  59. package/dist/agent-capacity/validation/assignment-records.js +92 -0
  60. package/dist/agent-capacity/validation/configuration.d.ts +14 -0
  61. package/dist/agent-capacity/validation/configuration.js +23 -0
  62. package/dist/agent-capacity/validation/index.d.ts +11 -0
  63. package/dist/agent-capacity/validation/index.js +11 -0
  64. package/dist/agent-capacity/validation/proposal-type.d.ts +22 -0
  65. package/dist/agent-capacity/validation/proposal-type.js +21 -0
  66. package/dist/agent-capacity/validation/research/citation.d.ts +16 -0
  67. package/dist/agent-capacity/validation/research/citation.js +47 -0
  68. package/dist/agent-capacity/validation/research/source-policy.d.ts +11 -0
  69. package/dist/agent-capacity/validation/research/source-policy.js +26 -0
  70. package/dist/agent-capacity/validation/research/workflow.d.ts +10 -0
  71. package/dist/agent-capacity/validation/research/workflow.js +31 -0
  72. package/dist/agent-capacity/validation/workflow-promotion.d.ts +2 -0
  73. package/dist/agent-capacity/validation/workflow-promotion.js +34 -0
  74. package/dist/agent-capacity/workday.d.ts +52 -0
  75. package/dist/agent-capacity/workday.js +105 -0
  76. package/dist/ai-appliance/contracts.d.ts +90 -0
  77. package/dist/ai-appliance/contracts.js +16 -0
  78. package/dist/ai-appliance/validation.d.ts +4 -0
  79. package/dist/ai-appliance/validation.js +62 -0
  80. package/dist/capacity/agents/agent-capacity.d.ts +21 -0
  81. package/dist/capacity/agents/agent-capacity.js +20 -0
  82. package/dist/capacity/capacity-core/capacity-pagination.d.ts +18 -0
  83. package/dist/capacity/capacity-core/capacity-pagination.js +33 -0
  84. package/dist/capacity/providers/capacity-provider.d.ts +1 -0
  85. package/dist/capacity/providers/capacity-provider.js +1 -0
  86. package/dist/capacity-provider/client.d.ts +56 -0
  87. package/dist/capacity-provider/client.js +163 -0
  88. package/dist/capacity-provider/contracts/capacity-facts.d.ts +64 -0
  89. package/dist/capacity-provider/contracts/capacity-facts.js +0 -0
  90. package/dist/capacity-provider/contracts/governance.d.ts +399 -0
  91. package/dist/capacity-provider/contracts/governance.js +18 -0
  92. package/dist/capacity-provider/contracts/index.d.ts +2 -0
  93. package/dist/capacity-provider/contracts/index.js +2 -0
  94. package/dist/capacity-provider/index.d.ts +3 -0
  95. package/dist/capacity-provider/index.js +3 -0
  96. package/dist/capacity-provider/validation.d.ts +27 -0
  97. package/dist/capacity-provider/validation.js +184 -0
  98. package/dist/configuration/secrets-capability.d.ts +4 -0
  99. package/dist/configuration/secrets-capability.js +4 -0
  100. package/dist/content/contracts.d.ts +12 -0
  101. package/dist/content/contracts.js +0 -0
  102. package/dist/content/validation/agent-operational-content-schemas.d.ts +1351 -0
  103. package/dist/content/validation/agent-operational-content-schemas.js +146 -0
  104. package/dist/content/validation/auxiliary-content-schemas.d.ts +1715 -0
  105. package/dist/content/validation/auxiliary-content-schemas.js +173 -0
  106. package/dist/content/validation/content-model-schemas.d.ts +21728 -0
  107. package/dist/content/validation/content-model-schemas.js +271 -0
  108. package/dist/content/validation/index.d.ts +3 -0
  109. package/dist/content/validation/index.js +3 -0
  110. package/dist/content/validation/portable-content-data.d.ts +2101 -0
  111. package/dist/content/validation/portable-content-data.js +49 -0
  112. package/dist/entrypoints/clients/control-plane-client.d.ts +112 -0
  113. package/dist/entrypoints/clients/control-plane-client.js +180 -0
  114. package/dist/entrypoints/models/field-aliases.d.ts +11 -0
  115. package/dist/entrypoints/models/model-registry.d.ts +3 -0
  116. package/dist/entrypoints/models/model-registry.js +3 -0
  117. package/dist/entrypoints/models/sdk-fields.d.ts +11 -0
  118. package/dist/entrypoints/models/sdk-types.d.ts +10 -0
  119. package/dist/entrypoints/models/sdk-types.js +10 -0
  120. package/dist/feedback/contracts.d.ts +142 -0
  121. package/dist/feedback/contracts.js +18 -0
  122. package/dist/feedback/index.d.ts +1 -0
  123. package/dist/feedback/index.js +1 -0
  124. package/dist/governance/groups/contracts.d.ts +102 -0
  125. package/dist/governance/groups/contracts.js +6 -0
  126. package/dist/graph/context-query-contracts.d.ts +19 -1
  127. package/dist/graph/context-query-contracts.js +49 -8
  128. package/dist/knowledge/contracts.d.ts +173 -0
  129. package/dist/knowledge/contracts.js +16 -0
  130. package/dist/knowledge/index.d.ts +1 -0
  131. package/dist/knowledge/index.js +1 -0
  132. package/dist/model-registry/agent-operational-models.d.ts +4 -0
  133. package/dist/model-registry/agent-operational-models.js +38 -0
  134. package/dist/model-registry/build-builtin-model-registry.d.ts +2 -0
  135. package/dist/model-registry/build-builtin-model-registry.js +426 -0
  136. package/dist/model-registry/content-root.d.ts +9 -0
  137. package/dist/model-registry/content-root.js +33 -0
  138. package/dist/model-registry/discussion-models.d.ts +4 -0
  139. package/dist/model-registry/discussion-models.js +84 -0
  140. package/dist/model-registry/group-models.d.ts +2 -0
  141. package/dist/model-registry/group-models.js +52 -0
  142. package/dist/model-registry/knowledge-models.d.ts +2 -0
  143. package/dist/model-registry/knowledge-models.js +89 -0
  144. package/dist/model-registry/normalize-definition.d.ts +8 -0
  145. package/dist/model-registry/normalize-definition.js +69 -0
  146. package/dist/operator-contracts/canonical-command-tree.d.ts +3 -0
  147. package/dist/operator-contracts/canonical-command-tree.js +81 -0
  148. package/dist/operator-contracts/command-tree.d.ts +79 -0
  149. package/dist/operator-contracts/command-tree.js +53 -0
  150. package/dist/operator-contracts/control-plane-operation.d.ts +80 -0
  151. package/dist/operator-contracts/control-plane-operation.js +75 -0
  152. package/dist/operator-contracts/control-plane-operations.d.ts +546 -0
  153. package/dist/operator-contracts/control-plane-operations.js +352 -0
  154. package/dist/operator-contracts/index.d.ts +8 -0
  155. package/dist/operator-contracts/index.js +8 -0
  156. package/dist/operator-contracts/mcp.d.ts +78 -0
  157. package/dist/operator-contracts/mcp.js +23 -0
  158. package/dist/operator-contracts/oauth.d.ts +46 -0
  159. package/dist/operator-contracts/oauth.js +0 -0
  160. package/dist/operator-contracts/workday-lifecycle.d.ts +157 -0
  161. package/dist/operator-contracts/workday-lifecycle.js +65 -0
  162. package/dist/operator-contracts/workday-profile.d.ts +72 -0
  163. package/dist/operator-contracts/workday-profile.js +106 -0
  164. package/dist/projects/projects-core/project-workflow.d.ts +179 -0
  165. package/dist/projects/projects-core/project-workflow.js +66 -0
  166. package/dist/sdk-types/configuration/sdk-dispatch-credential-source.d.ts +201 -0
  167. package/dist/sdk-types/configuration/sdk-dispatch-credential-source.js +0 -0
  168. package/dist/sdk-types/control-plane/resource-requests.d.ts +124 -0
  169. package/dist/sdk-types/control-plane/resource-requests.js +0 -0
  170. package/dist/sdk-types/governance/commons/commons-question-input.d.ts +61 -0
  171. package/dist/sdk-types/governance/commons/commons-question-input.js +0 -0
  172. package/dist/sdk-types/support/planning-policy.d.ts +210 -0
  173. package/dist/sdk-types/support/planning-policy.js +0 -0
  174. package/dist/sdk-types/support/platform-contracts.d.ts +178 -0
  175. package/dist/sdk-types/support/platform-contracts.js +15 -0
  176. package/dist/sdk-types/support/sdk-model-names.d.ts +44 -0
  177. package/dist/sdk-types/support/sdk-model-names.js +80 -0
  178. package/dist/sdk-types/support/sdk-search-request.d.ts +182 -0
  179. package/dist/sdk-types/support/sdk-search-request.js +0 -0
  180. package/dist/sdk-types/support/task-planning.d.ts +189 -0
  181. package/dist/sdk-types/support/task-planning.js +0 -0
  182. package/dist/sdk-types/treedx/graph/sdk-graph-query-request.d.ts +157 -0
  183. package/dist/sdk-types/treedx/graph/sdk-graph-query-request.js +0 -0
  184. package/dist/secrets-capability/provider-operation-contracts.d.ts +90 -0
  185. package/dist/secrets-capability/provider-operation-contracts.js +10 -0
  186. package/dist/secrets-capability/service-provider-contracts.d.ts +92 -0
  187. package/dist/secrets-capability/service-provider-contracts.js +183 -0
  188. package/dist/secrets-capability/service-vault-contracts.d.ts +61 -0
  189. package/dist/secrets-capability/service-vault-contracts.js +39 -0
  190. package/dist/secrets-capability/workflow-operation-contracts.d.ts +95 -0
  191. package/dist/secrets-capability/workflow-operation-contracts.js +0 -0
  192. package/dist/standards/canonicalize.d.ts +10 -0
  193. package/dist/standards/canonicalize.js +43 -0
  194. package/dist/standards/compatibility-attestation.d.ts +23 -0
  195. package/dist/standards/compatibility-attestation.js +40 -0
  196. package/dist/standards/composition.d.ts +15 -0
  197. package/dist/standards/composition.js +14 -0
  198. package/dist/standards/contract-bundle.d.ts +8 -0
  199. package/dist/standards/contract-bundle.js +23 -0
  200. package/dist/standards/contracts.d.ts +39 -0
  201. package/dist/standards/contracts.js +0 -0
  202. package/dist/standards/errors.d.ts +6 -0
  203. package/dist/standards/errors.js +13 -0
  204. package/dist/standards/index.d.ts +8 -0
  205. package/dist/standards/index.js +8 -0
  206. package/dist/standards/mcp/compare.d.ts +2 -0
  207. package/dist/standards/mcp/compare.js +38 -0
  208. package/dist/standards/mcp/contracts.d.ts +34 -0
  209. package/dist/standards/mcp/contracts.js +0 -0
  210. package/dist/standards/mcp/index.d.ts +3 -0
  211. package/dist/standards/mcp/index.js +3 -0
  212. package/dist/standards/mcp/normalize.d.ts +4 -0
  213. package/dist/standards/mcp/normalize.js +30 -0
  214. package/dist/standards/openapi/compare.d.ts +2 -0
  215. package/dist/standards/openapi/compare.js +112 -0
  216. package/dist/standards/openapi/contracts.d.ts +24 -0
  217. package/dist/standards/openapi/contracts.js +0 -0
  218. package/dist/standards/openapi/index.d.ts +3 -0
  219. package/dist/standards/openapi/index.js +3 -0
  220. package/dist/standards/openapi/normalize.d.ts +2 -0
  221. package/dist/standards/openapi/normalize.js +57 -0
  222. package/dist/standards/package-manifest.d.ts +37 -0
  223. package/dist/standards/package-manifest.js +89 -0
  224. package/dist/standards/portfolio-entry.d.ts +12 -0
  225. package/dist/standards/portfolio-entry.js +11 -0
  226. package/dist/standards/typescript/compare.d.ts +2 -0
  227. package/dist/standards/typescript/compare.js +88 -0
  228. package/dist/standards/typescript/contracts.d.ts +44 -0
  229. package/dist/standards/typescript/contracts.js +0 -0
  230. package/dist/standards/typescript/extract.d.ts +10 -0
  231. package/dist/standards/typescript/extract.js +244 -0
  232. package/dist/standards/typescript/index.d.ts +3 -0
  233. package/dist/standards/typescript/index.js +3 -0
  234. package/dist/treedx/accounts/auth.d.ts +17 -0
  235. package/dist/treedx/accounts/auth.js +48 -0
  236. package/dist/treedx/client/accounts/contracts/auth-mode.d.ts +3 -0
  237. package/dist/treedx/client/accounts/contracts/auth-mode.js +6 -0
  238. package/dist/treedx/client/build/creation/build-context.d.ts +3 -0
  239. package/dist/treedx/client/build/creation/build-context.js +7 -0
  240. package/dist/treedx/client/build/creation/build-snapshot.d.ts +3 -0
  241. package/dist/treedx/client/build/creation/build-snapshot.js +8 -0
  242. package/dist/treedx/client/capacity/allocations/contracts/put-capability-grant.d.ts +3 -0
  243. package/dist/treedx/client/capacity/allocations/contracts/put-capability-grant.js +7 -0
  244. package/dist/treedx/client/capacity/allocations/queries/list-capability-grants.d.ts +6 -0
  245. package/dist/treedx/client/capacity/allocations/queries/list-capability-grants.js +10 -0
  246. package/dist/treedx/client/methods.d.ts +102 -0
  247. package/dist/treedx/client/methods.js +209 -0
  248. package/dist/treedx/client/persistence/contracts/restore-storage.d.ts +3 -0
  249. package/dist/treedx/client/persistence/contracts/restore-storage.js +6 -0
  250. package/dist/treedx/client/persistence/lifecycle/verify-storage-restore.d.ts +3 -0
  251. package/dist/treedx/client/persistence/lifecycle/verify-storage-restore.js +6 -0
  252. package/dist/treedx/client/repositories/creation/register-repository.d.ts +3 -0
  253. package/dist/treedx/client/repositories/creation/register-repository.js +7 -0
  254. package/dist/treedx/client/repositories/queries/get-repository.d.ts +3 -0
  255. package/dist/treedx/client/repositories/queries/get-repository.js +7 -0
  256. package/dist/treedx/client/repositories/queries/list-repository-paths.d.ts +3 -0
  257. package/dist/treedx/client/repositories/queries/list-repository-paths.js +7 -0
  258. package/dist/treedx/client/repositories/queries/list-repository-refs.d.ts +3 -0
  259. package/dist/treedx/client/repositories/queries/list-repository-refs.js +12 -0
  260. package/dist/treedx/client/repositories/queries/query-repository.d.ts +3 -0
  261. package/dist/treedx/client/repositories/queries/query-repository.js +7 -0
  262. package/dist/treedx/client/repositories/queries/read-repository-file.d.ts +3 -0
  263. package/dist/treedx/client/repositories/queries/read-repository-file.js +6 -0
  264. package/dist/treedx/client/repositories/queries/read-repository-files.d.ts +3 -0
  265. package/dist/treedx/client/repositories/queries/read-repository-files.js +7 -0
  266. package/dist/treedx/client/repositories/queries/search-repository-files.d.ts +3 -0
  267. package/dist/treedx/client/repositories/queries/search-repository-files.js +7 -0
  268. package/dist/treedx/client/support/contracts/treedx/artifacts/contracts/download-artifact.d.ts +3 -0
  269. package/dist/treedx/client/support/contracts/treedx/artifacts/contracts/download-artifact.js +9 -0
  270. package/dist/treedx/client/support/contracts/treedx/authorization/contracts/whoami.d.ts +3 -0
  271. package/dist/treedx/client/support/contracts/treedx/authorization/contracts/whoami.js +6 -0
  272. package/dist/treedx/client/support/contracts/treedx/graph/contracts/parse-context-dsl.d.ts +3 -0
  273. package/dist/treedx/client/support/contracts/treedx/graph/contracts/parse-context-dsl.js +7 -0
  274. package/dist/treedx/client/support/contracts/treedx/health/contracts/deep-health.d.ts +5 -0
  275. package/dist/treedx/client/support/contracts/treedx/health/contracts/deep-health.js +7 -0
  276. package/dist/treedx/client/support/contracts/treedx/health/contracts/health.d.ts +3 -0
  277. package/dist/treedx/client/support/contracts/treedx/health/contracts/health.js +6 -0
  278. package/dist/treedx/client/support/contracts/treedx/health/contracts/metrics.d.ts +3 -0
  279. package/dist/treedx/client/support/contracts/treedx/health/contracts/metrics.js +7 -0
  280. package/dist/treedx/client/support/contracts/treedx/health/contracts/prometheus-metrics.d.ts +2 -0
  281. package/dist/treedx/client/support/contracts/treedx/health/contracts/prometheus-metrics.js +19 -0
  282. package/dist/treedx/client/support/contracts/treedx/health/contracts/ready.d.ts +3 -0
  283. package/dist/treedx/client/support/contracts/treedx/health/contracts/ready.js +7 -0
  284. package/dist/treedx/client/support/contracts/treedx/health/contracts/status.d.ts +3 -0
  285. package/dist/treedx/client/support/contracts/treedx/health/contracts/status.js +6 -0
  286. package/dist/treedx/client/support/contracts/treedx/repositories/contracts/commit.d.ts +3 -0
  287. package/dist/treedx/client/support/contracts/treedx/repositories/contracts/commit.js +7 -0
  288. package/dist/treedx/client/support/contracts/treedx/repositories/contracts/diff.d.ts +3 -0
  289. package/dist/treedx/client/support/contracts/treedx/repositories/contracts/diff.js +6 -0
  290. package/dist/treedx/client/support/contracts/treedx/repositories/contracts/fetch-remote.d.ts +3 -0
  291. package/dist/treedx/client/support/contracts/treedx/repositories/contracts/fetch-remote.js +7 -0
  292. package/dist/treedx/client/support/contracts/treedx/repositories/contracts/push.d.ts +6 -0
  293. package/dist/treedx/client/support/contracts/treedx/repositories/contracts/push.js +23 -0
  294. package/dist/treedx/client/support/contracts/treedx/search/contracts/compact-search-index.d.ts +3 -0
  295. package/dist/treedx/client/support/contracts/treedx/search/contracts/compact-search-index.js +8 -0
  296. package/dist/treedx/client/support/contracts/treedx/search/contracts/search.d.ts +3 -0
  297. package/dist/treedx/client/support/contracts/treedx/search/contracts/search.js +7 -0
  298. package/dist/treedx/client/support/contracts/treedx/storage/contracts/backup-storage.d.ts +3 -0
  299. package/dist/treedx/client/support/contracts/treedx/storage/contracts/backup-storage.js +8 -0
  300. package/dist/treedx/client/support/contracts/treedx/storage/contracts/compact-storage.d.ts +3 -0
  301. package/dist/treedx/client/support/contracts/treedx/storage/contracts/compact-storage.js +8 -0
  302. package/dist/treedx/client/support/contracts/treedx/transport/contracts/assert-binary-ok.d.ts +2 -0
  303. package/dist/treedx/client/support/contracts/treedx/transport/contracts/assert-binary-ok.js +15 -0
  304. package/dist/treedx/client/support/contracts/treedx/transport/contracts/fetch-with-timeout.d.ts +2 -0
  305. package/dist/treedx/client/support/contracts/treedx/transport/contracts/fetch-with-timeout.js +38 -0
  306. package/dist/treedx/client/support/contracts/treedx/transport/contracts/headers.d.ts +2 -0
  307. package/dist/treedx/client/support/contracts/treedx/transport/contracts/headers.js +15 -0
  308. package/dist/treedx/client/support/contracts/treedx/transport/contracts/parse-json-response.d.ts +2 -0
  309. package/dist/treedx/client/support/contracts/treedx/transport/contracts/parse-json-response.js +15 -0
  310. package/dist/treedx/client/support/contracts/treedx/transport/contracts/query.d.ts +2 -0
  311. package/dist/treedx/client/support/contracts/treedx/transport/contracts/query.js +14 -0
  312. package/dist/treedx/client/support/contracts/treedx/transport/contracts/repo-id.d.ts +2 -0
  313. package/dist/treedx/client/support/contracts/treedx/transport/contracts/repo-id.js +14 -0
  314. package/dist/treedx/client/support/contracts/treedx/transport/contracts/request.d.ts +6 -0
  315. package/dist/treedx/client/support/contracts/treedx/transport/contracts/request.js +41 -0
  316. package/dist/treedx/client/support/contracts/treedx/transport/contracts/throw-api-error.d.ts +2 -0
  317. package/dist/treedx/client/support/contracts/treedx/transport/contracts/throw-api-error.js +14 -0
  318. package/dist/treedx/client/support/contracts/treedx/workspaces/contracts/exec.d.ts +3 -0
  319. package/dist/treedx/client/support/contracts/treedx/workspaces/contracts/exec.js +7 -0
  320. package/dist/treedx/client/support/creation/apply-changeset.d.ts +3 -0
  321. package/dist/treedx/client/support/creation/apply-changeset.js +10 -0
  322. package/dist/treedx/client/support/creation/apply-storage-migration.d.ts +3 -0
  323. package/dist/treedx/client/support/creation/apply-storage-migration.js +7 -0
  324. package/dist/treedx/client/support/creation/create-migration.d.ts +6 -0
  325. package/dist/treedx/client/support/creation/create-migration.js +7 -0
  326. package/dist/treedx/client/support/creation/export-artifact.d.ts +3 -0
  327. package/dist/treedx/client/support/creation/export-artifact.js +8 -0
  328. package/dist/treedx/client/support/creation/plan-storage-migration.d.ts +3 -0
  329. package/dist/treedx/client/support/creation/plan-storage-migration.js +7 -0
  330. package/dist/treedx/client/support/creation/request-binary.d.ts +6 -0
  331. package/dist/treedx/client/support/creation/request-binary.js +42 -0
  332. package/dist/treedx/client/support/creation/write-file.d.ts +3 -0
  333. package/dist/treedx/client/support/creation/write-file.js +10 -0
  334. package/dist/treedx/client/support/creation/write-files.d.ts +3 -0
  335. package/dist/treedx/client/support/creation/write-files.js +12 -0
  336. package/dist/treedx/client/support/queries/treedx/artifacts/queries/get-artifact.d.ts +3 -0
  337. package/dist/treedx/client/support/queries/treedx/artifacts/queries/get-artifact.js +7 -0
  338. package/dist/treedx/client/support/queries/treedx/artifacts/queries/list-artifacts.d.ts +3 -0
  339. package/dist/treedx/client/support/queries/treedx/artifacts/queries/list-artifacts.js +7 -0
  340. package/dist/treedx/client/support/queries/treedx/authorization/queries/effective-scope.d.ts +3 -0
  341. package/dist/treedx/client/support/queries/treedx/authorization/queries/effective-scope.js +9 -0
  342. package/dist/treedx/client/support/queries/treedx/authorization/queries/list-capabilities.d.ts +4 -0
  343. package/dist/treedx/client/support/queries/treedx/authorization/queries/list-capabilities.js +6 -0
  344. package/dist/treedx/client/support/queries/treedx/federation/queries/get-placement.d.ts +3 -0
  345. package/dist/treedx/client/support/queries/treedx/federation/queries/get-placement.js +7 -0
  346. package/dist/treedx/client/support/queries/treedx/graph/queries/get-node.d.ts +3 -0
  347. package/dist/treedx/client/support/queries/treedx/graph/queries/get-node.js +7 -0
  348. package/dist/treedx/client/support/queries/treedx/graph/queries/get-related.d.ts +3 -0
  349. package/dist/treedx/client/support/queries/treedx/graph/queries/get-related.js +7 -0
  350. package/dist/treedx/client/support/queries/treedx/graph/queries/list-nodes.d.ts +3 -0
  351. package/dist/treedx/client/support/queries/treedx/graph/queries/list-nodes.js +7 -0
  352. package/dist/treedx/client/support/queries/treedx/repositories/queries/list-tree.d.ts +3 -0
  353. package/dist/treedx/client/support/queries/treedx/repositories/queries/list-tree.js +10 -0
  354. package/dist/treedx/client/support/queries/treedx/repositories/queries/read-file.d.ts +3 -0
  355. package/dist/treedx/client/support/queries/treedx/repositories/queries/read-file.js +9 -0
  356. package/dist/treedx/client/support/queries/treedx/search/queries/get-search-index-status.d.ts +3 -0
  357. package/dist/treedx/client/support/queries/treedx/search/queries/get-search-index-status.js +7 -0
  358. package/dist/treedx/client/support/queries/treedx/storage/queries/get-migration.d.ts +6 -0
  359. package/dist/treedx/client/support/queries/treedx/storage/queries/get-migration.js +7 -0
  360. package/dist/treedx/client/support/queries/treedx/storage/queries/get-snapshot.d.ts +6 -0
  361. package/dist/treedx/client/support/queries/treedx/storage/queries/get-snapshot.js +7 -0
  362. package/dist/treedx/client/support/queries/treedx/storage/queries/list-storage-migrations.d.ts +6 -0
  363. package/dist/treedx/client/support/queries/treedx/storage/queries/list-storage-migrations.js +6 -0
  364. package/dist/treedx/client/support/queries/treedx/transport/queries/list-audit-events.d.ts +15 -0
  365. package/dist/treedx/client/support/queries/treedx/transport/queries/list-audit-events.js +6 -0
  366. package/dist/treedx/client/support/queries/treedx/transport/queries/list-repositories.d.ts +3 -0
  367. package/dist/treedx/client/support/queries/treedx/transport/queries/list-repositories.js +7 -0
  368. package/dist/treedx/client/support/retirement/cleanup-artifacts.d.ts +3 -0
  369. package/dist/treedx/client/support/retirement/cleanup-artifacts.js +7 -0
  370. package/dist/treedx/client/support/retirement/delete-artifact.d.ts +3 -0
  371. package/dist/treedx/client/support/retirement/delete-artifact.js +7 -0
  372. package/dist/treedx/client/support/retirement/delete-file.d.ts +3 -0
  373. package/dist/treedx/client/support/retirement/delete-file.js +10 -0
  374. package/dist/treedx/client/support/retirement/rollback-storage-migration.d.ts +3 -0
  375. package/dist/treedx/client/support/retirement/rollback-storage-migration.js +7 -0
  376. package/dist/treedx/client/support/updates/patch-file.d.ts +3 -0
  377. package/dist/treedx/client/support/updates/patch-file.js +10 -0
  378. package/dist/treedx/client/support/updates/refresh-search-index.d.ts +3 -0
  379. package/dist/treedx/client/support/updates/refresh-search-index.js +8 -0
  380. package/dist/treedx/client/treedx/blobs/contracts/download-blob.d.ts +3 -0
  381. package/dist/treedx/client/treedx/blobs/contracts/download-blob.js +6 -0
  382. package/dist/treedx/client/treedx/blobs/creation/create-blob-upload.d.ts +3 -0
  383. package/dist/treedx/client/treedx/blobs/creation/create-blob-upload.js +8 -0
  384. package/dist/treedx/client/treedx/blobs/creation/request-blob-download.d.ts +3 -0
  385. package/dist/treedx/client/treedx/blobs/creation/request-blob-download.js +27 -0
  386. package/dist/treedx/client/treedx/blobs/creation/request-blob-upload.d.ts +3 -0
  387. package/dist/treedx/client/treedx/blobs/creation/request-blob-upload.js +41 -0
  388. package/dist/treedx/client/treedx/blobs/creation/upload-blob-part.d.ts +3 -0
  389. package/dist/treedx/client/treedx/blobs/creation/upload-blob-part.js +27 -0
  390. package/dist/treedx/client/treedx/blobs/creation/upload-blob.d.ts +3 -0
  391. package/dist/treedx/client/treedx/blobs/creation/upload-blob.js +6 -0
  392. package/dist/treedx/client/treedx/blobs/creation/write-blob.d.ts +3 -0
  393. package/dist/treedx/client/treedx/blobs/creation/write-blob.js +8 -0
  394. package/dist/treedx/client/treedx/blobs/lifecycle/complete-blob-upload.d.ts +3 -0
  395. package/dist/treedx/client/treedx/blobs/lifecycle/complete-blob-upload.js +8 -0
  396. package/dist/treedx/client/treedx/blobs/queries/read-blob.d.ts +3 -0
  397. package/dist/treedx/client/treedx/blobs/queries/read-blob.js +10 -0
  398. package/dist/treedx/client/treedx/blobs/retirement/abort-blob-upload.d.ts +3 -0
  399. package/dist/treedx/client/treedx/blobs/retirement/abort-blob-upload.js +7 -0
  400. package/dist/treedx/client/treedx/blobs/retirement/delete-blob.d.ts +3 -0
  401. package/dist/treedx/client/treedx/blobs/retirement/delete-blob.js +8 -0
  402. package/dist/treedx/client/treedx/federation/contracts/federated-query.d.ts +3 -0
  403. package/dist/treedx/client/treedx/federation/contracts/federated-query.js +7 -0
  404. package/dist/treedx/client/treedx/federation/creation/plan-federated-query.d.ts +3 -0
  405. package/dist/treedx/client/treedx/federation/creation/plan-federated-query.js +6 -0
  406. package/dist/treedx/client/treedx/federation/queries/check-mirror-health.d.ts +3 -0
  407. package/dist/treedx/client/treedx/federation/queries/check-mirror-health.js +7 -0
  408. package/dist/treedx/client/treedx/federation/updates/promote-mirror.d.ts +3 -0
  409. package/dist/treedx/client/treedx/federation/updates/promote-mirror.js +7 -0
  410. package/dist/treedx/client/treedx/federation/updates/sync-mirror.d.ts +3 -0
  411. package/dist/treedx/client/treedx/federation/updates/sync-mirror.js +7 -0
  412. package/dist/treedx/client/treedx/graph/contracts/federated-context.d.ts +3 -0
  413. package/dist/treedx/client/treedx/graph/contracts/federated-context.js +7 -0
  414. package/dist/treedx/client/treedx/graph/contracts/federated-graph.d.ts +3 -0
  415. package/dist/treedx/client/treedx/graph/contracts/federated-graph.js +7 -0
  416. package/dist/treedx/client/treedx/graph/contracts/graph-search.d.ts +3 -0
  417. package/dist/treedx/client/treedx/graph/contracts/graph-search.js +8 -0
  418. package/dist/treedx/client/treedx/graph/queries/get-graph-node.d.ts +3 -0
  419. package/dist/treedx/client/treedx/graph/queries/get-graph-node.js +10 -0
  420. package/dist/treedx/client/treedx/graph/queries/get-graph-refresh-job.d.ts +3 -0
  421. package/dist/treedx/client/treedx/graph/queries/get-graph-refresh-job.js +7 -0
  422. package/dist/treedx/client/treedx/graph/queries/get-subgraph.d.ts +3 -0
  423. package/dist/treedx/client/treedx/graph/queries/get-subgraph.js +7 -0
  424. package/dist/treedx/client/treedx/graph/queries/query-graph.d.ts +3 -0
  425. package/dist/treedx/client/treedx/graph/queries/query-graph.js +7 -0
  426. package/dist/treedx/client/treedx/graph/queries/search-graph-entities.d.ts +3 -0
  427. package/dist/treedx/client/treedx/graph/queries/search-graph-entities.js +6 -0
  428. package/dist/treedx/client/treedx/graph/queries/search-graph-files.d.ts +3 -0
  429. package/dist/treedx/client/treedx/graph/queries/search-graph-files.js +6 -0
  430. package/dist/treedx/client/treedx/graph/queries/search-graph-sections.d.ts +3 -0
  431. package/dist/treedx/client/treedx/graph/queries/search-graph-sections.js +6 -0
  432. package/dist/treedx/client/treedx/graph/updates/refresh-graph.d.ts +3 -0
  433. package/dist/treedx/client/treedx/graph/updates/refresh-graph.js +7 -0
  434. package/dist/treedx/client/treedx/search/contracts/federated-search.d.ts +3 -0
  435. package/dist/treedx/client/treedx/search/contracts/federated-search.js +7 -0
  436. package/dist/treedx/client/treedx/workspaces/creation/create-workspace.d.ts +3 -0
  437. package/dist/treedx/client/treedx/workspaces/creation/create-workspace.js +7 -0
  438. package/dist/treedx/client/treedx/workspaces/retirement/abandon-workspace.d.ts +3 -0
  439. package/dist/treedx/client/treedx/workspaces/retirement/abandon-workspace.js +12 -0
  440. package/dist/treedx/client/treedx/workspaces/retirement/close-workspace.d.ts +2 -0
  441. package/dist/treedx/client/treedx/workspaces/retirement/close-workspace.js +6 -0
  442. package/dist/treedx/generated/openapi-types.d.ts +104 -0
  443. package/dist/treedx/support/client.d.ts +251 -0
  444. package/dist/treedx/support/client.js +252 -0
  445. package/dist/treedx/support/errors.d.ts +13 -0
  446. package/dist/treedx/types/tree-dx-actor.d.ts +209 -0
  447. package/dist/treedx/types/tree-dx-actor.js +8 -0
  448. package/dist/treedx/types/tree-dx-artifact-list-response.d.ts +13 -0
  449. package/dist/treedx/types/tree-dx-artifact-list-response.js +0 -0
  450. package/dist/treedx/types/tree-dx-changeset.d.ts +51 -0
  451. package/dist/treedx/types/tree-dx-changeset.js +6 -0
  452. package/dist/treedx/types/tree-dx-context-request.d.ts +245 -0
  453. package/dist/treedx/types/tree-dx-context-request.js +0 -0
  454. package/dist/treedx/types/tree-dx-exec-result.d.ts +249 -0
  455. package/dist/treedx/types/tree-dx-exec-result.js +0 -0
  456. package/dist/treedx/types/tree-dx-list-tree-request.d.ts +222 -0
  457. package/dist/treedx/types/tree-dx-list-tree-request.js +0 -0
  458. package/dist/treedx/types/tree-dx-push-request.d.ts +229 -0
  459. package/dist/treedx/types/tree-dx-push-request.js +0 -0
  460. package/dist/treedx/types.d.ts +7 -1084
  461. package/dist/treedx/types.js +7 -8
  462. package/dist/types/agents/agent-activity-profile.d.ts +267 -0
  463. package/dist/types/agents/agent-activity-profile.js +0 -0
  464. package/dist/types/agents/agent-trigger-kinds.d.ts +189 -0
  465. package/dist/types/agents/agent-trigger-kinds.js +107 -0
  466. package/dist/types/agents/execution-run-ref.d.ts +136 -0
  467. package/dist/types/agents/execution-run-ref.js +0 -0
  468. package/dist/types/agents.d.ts +3 -493
  469. package/dist/types/agents.js +3 -95
  470. package/package.json +77 -362
  471. package/dist/agent-capacity.d.ts +0 -1100
  472. package/dist/agent-capacity.js +0 -1822
  473. package/dist/agent-tools.d.ts +0 -37
  474. package/dist/agent-tools.js +0 -301
  475. package/dist/api/app.d.ts +0 -8
  476. package/dist/api/app.js +0 -404
  477. package/dist/api/auth/d1-database.d.ts +0 -3
  478. package/dist/api/auth/d1-database.js +0 -20
  479. package/dist/api/auth/d1-provider.d.ts +0 -85
  480. package/dist/api/auth/d1-provider.js +0 -95
  481. package/dist/api/auth/d1-store.d.ts +0 -121
  482. package/dist/api/auth/d1-store.js +0 -990
  483. package/dist/api/auth/memory-provider.d.ts +0 -82
  484. package/dist/api/auth/memory-provider.js +0 -297
  485. package/dist/api/auth/rbac.d.ts +0 -22
  486. package/dist/api/auth/rbac.js +0 -162
  487. package/dist/api/auth/tokens.d.ts +0 -18
  488. package/dist/api/auth/tokens.js +0 -56
  489. package/dist/api/config.d.ts +0 -4
  490. package/dist/api/config.js +0 -149
  491. package/dist/api/http.d.ts +0 -28
  492. package/dist/api/http.js +0 -51
  493. package/dist/api/index.d.ts +0 -10
  494. package/dist/api/index.js +0 -29
  495. package/dist/api/operations-routes.d.ts +0 -11
  496. package/dist/api/operations-routes.js +0 -39
  497. package/dist/api/operations.d.ts +0 -3
  498. package/dist/api/operations.js +0 -26
  499. package/dist/api/providers.d.ts +0 -2
  500. package/dist/api/providers.js +0 -85
  501. package/dist/api/railway.d.ts +0 -53
  502. package/dist/api/railway.js +0 -71
  503. package/dist/api/sdk-dispatch.d.ts +0 -6
  504. package/dist/api/sdk-dispatch.js +0 -14
  505. package/dist/api/sdk-routes.d.ts +0 -11
  506. package/dist/api/sdk-routes.js +0 -29
  507. package/dist/api/templates.d.ts +0 -3
  508. package/dist/api/templates.js +0 -31
  509. package/dist/api/types.d.ts +0 -238
  510. package/dist/capacity-provider.d.ts +0 -494
  511. package/dist/capacity-provider.js +0 -727
  512. package/dist/capacity.d.ts +0 -483
  513. package/dist/capacity.js +0 -2331
  514. package/dist/cli-tools.d.ts +0 -3
  515. package/dist/cli-tools.js +0 -46
  516. package/dist/content-operations.d.ts +0 -97
  517. package/dist/content-operations.js +0 -250
  518. package/dist/content-store.d.ts +0 -25
  519. package/dist/content-store.js +0 -269
  520. package/dist/control-plane-client.d.ts +0 -203
  521. package/dist/control-plane-client.js +0 -540
  522. package/dist/control-plane.d.ts +0 -101
  523. package/dist/control-plane.js +0 -201
  524. package/dist/copilot.d.ts +0 -18
  525. package/dist/copilot.js +0 -90
  526. package/dist/d1-http.d.ts +0 -38
  527. package/dist/d1-http.js +0 -95
  528. package/dist/d1-store.d.ts +0 -336
  529. package/dist/d1-store.js +0 -1431
  530. package/dist/db/d1.d.ts +0 -246
  531. package/dist/db/d1.js +0 -8
  532. package/dist/db/index.d.ts +0 -3
  533. package/dist/db/index.js +0 -3
  534. package/dist/db/market-schema.d.ts +0 -83651
  535. package/dist/db/market-schema.js +0 -3725
  536. package/dist/db/node-sqlite.d.ts +0 -297
  537. package/dist/db/node-sqlite.js +0 -133
  538. package/dist/db/schema.d.ts +0 -483
  539. package/dist/db/schema.js +0 -29
  540. package/dist/dispatch.d.ts +0 -4
  541. package/dist/dispatch.js +0 -174
  542. package/dist/field-aliases.d.ts +0 -11
  543. package/dist/fixture-support.d.ts +0 -24
  544. package/dist/fixture-support.js +0 -385
  545. package/dist/frontmatter.d.ts +0 -6
  546. package/dist/frontmatter.js +0 -33
  547. package/dist/git-runtime.d.ts +0 -16
  548. package/dist/git-runtime.js +0 -69
  549. package/dist/governance.d.ts +0 -133
  550. package/dist/governance.js +0 -285
  551. package/dist/graph/build.d.ts +0 -19
  552. package/dist/graph/build.js +0 -949
  553. package/dist/graph/dsl.d.ts +0 -2
  554. package/dist/graph/dsl.js +0 -243
  555. package/dist/graph/query.d.ts +0 -47
  556. package/dist/graph/query.js +0 -447
  557. package/dist/graph/ranking.d.ts +0 -3
  558. package/dist/graph/ranking.js +0 -483
  559. package/dist/graph/schema.d.ts +0 -142
  560. package/dist/graph/schema.js +0 -137
  561. package/dist/graph.d.ts +0 -52
  562. package/dist/graph.js +0 -133
  563. package/dist/guarantees/index.d.ts +0 -512
  564. package/dist/guarantees/index.js +0 -1782
  565. package/dist/hosting/apps.d.ts +0 -12
  566. package/dist/hosting/apps.js +0 -107
  567. package/dist/hosting/builtins.d.ts +0 -25
  568. package/dist/hosting/builtins.js +0 -685
  569. package/dist/hosting/contracts.d.ts +0 -190
  570. package/dist/hosting/graph.d.ts +0 -110
  571. package/dist/hosting/graph.js +0 -993
  572. package/dist/hosting/index.d.ts +0 -4
  573. package/dist/hosting/index.js +0 -4
  574. package/dist/index.d.ts +0 -88
  575. package/dist/index.js +0 -757
  576. package/dist/local-dev/managed-dev.d.ts +0 -85
  577. package/dist/local-dev/managed-dev.js +0 -431
  578. package/dist/managed-dependencies.d.ts +0 -91
  579. package/dist/managed-dependencies.js +0 -1186
  580. package/dist/market-client.d.ts +0 -831
  581. package/dist/market-client.js +0 -1219
  582. package/dist/model-registry.d.ts +0 -8
  583. package/dist/model-registry.js +0 -674
  584. package/dist/operations/agent-tools.d.ts +0 -105
  585. package/dist/operations/agent-tools.js +0 -171
  586. package/dist/operations/providers/default.d.ts +0 -10
  587. package/dist/operations/providers/default.js +0 -1245
  588. package/dist/operations/repository-operations.d.ts +0 -158
  589. package/dist/operations/repository-operations.js +0 -851
  590. package/dist/operations/runtime.d.ts +0 -7
  591. package/dist/operations/runtime.js +0 -61
  592. package/dist/operations/services/bootstrap-runner.d.ts +0 -39
  593. package/dist/operations/services/bootstrap-runner.js +0 -191
  594. package/dist/operations/services/build-warning-policy.d.ts +0 -34
  595. package/dist/operations/services/build-warning-policy.js +0 -91
  596. package/dist/operations/services/commit-message-provider.d.ts +0 -65
  597. package/dist/operations/services/commit-message-provider.js +0 -496
  598. package/dist/operations/services/config-runtime.d.ts +0 -558
  599. package/dist/operations/services/config-runtime.js +0 -3494
  600. package/dist/operations/services/d1-migration.d.ts +0 -6
  601. package/dist/operations/services/d1-migration.js +0 -120
  602. package/dist/operations/services/deploy.d.ts +0 -645
  603. package/dist/operations/services/deploy.js +0 -3826
  604. package/dist/operations/services/deployment-readiness.d.ts +0 -30
  605. package/dist/operations/services/deployment-readiness.js +0 -217
  606. package/dist/operations/services/export-runtime.d.ts +0 -18
  607. package/dist/operations/services/export-runtime.js +0 -140
  608. package/dist/operations/services/git-remote-policy.d.ts +0 -9
  609. package/dist/operations/services/git-remote-policy.js +0 -63
  610. package/dist/operations/services/git-runner.d.ts +0 -68
  611. package/dist/operations/services/git-runner.js +0 -500
  612. package/dist/operations/services/git-workflow.d.ts +0 -255
  613. package/dist/operations/services/git-workflow.js +0 -845
  614. package/dist/operations/services/github-actions-verification.d.ts +0 -148
  615. package/dist/operations/services/github-actions-verification.js +0 -589
  616. package/dist/operations/services/github-api.d.ts +0 -279
  617. package/dist/operations/services/github-api.js +0 -936
  618. package/dist/operations/services/github-automation.d.ts +0 -230
  619. package/dist/operations/services/github-automation.js +0 -520
  620. package/dist/operations/services/github-credentials.d.ts +0 -13
  621. package/dist/operations/services/github-credentials.js +0 -59
  622. package/dist/operations/services/hosted-service-checks.d.ts +0 -82
  623. package/dist/operations/services/hosted-service-checks.js +0 -527
  624. package/dist/operations/services/hosting-audit.d.ts +0 -69
  625. package/dist/operations/services/hosting-audit.js +0 -638
  626. package/dist/operations/services/hub-launch.d.ts +0 -182
  627. package/dist/operations/services/hub-launch.js +0 -309
  628. package/dist/operations/services/hub-provider-launch.d.ts +0 -160
  629. package/dist/operations/services/hub-provider-launch.js +0 -1056
  630. package/dist/operations/services/key-agent.d.ts +0 -137
  631. package/dist/operations/services/key-agent.js +0 -641
  632. package/dist/operations/services/live-hosted-service-checks.d.ts +0 -30
  633. package/dist/operations/services/live-hosted-service-checks.js +0 -611
  634. package/dist/operations/services/local-cleanup.d.ts +0 -30
  635. package/dist/operations/services/local-cleanup.js +0 -77
  636. package/dist/operations/services/local-dev.d.ts +0 -8
  637. package/dist/operations/services/local-dev.js +0 -97
  638. package/dist/operations/services/managed-host-security.d.ts +0 -13
  639. package/dist/operations/services/managed-host-security.js +0 -56
  640. package/dist/operations/services/managed-repositories.d.ts +0 -37
  641. package/dist/operations/services/managed-repositories.js +0 -177
  642. package/dist/operations/services/market-packaging.d.ts +0 -59
  643. package/dist/operations/services/market-packaging.js +0 -234
  644. package/dist/operations/services/operations-runner-smoke.d.ts +0 -31
  645. package/dist/operations/services/operations-runner-smoke.js +0 -212
  646. package/dist/operations/services/package-adapters.d.ts +0 -184
  647. package/dist/operations/services/package-adapters.js +0 -912
  648. package/dist/operations/services/package-artifacts.d.ts +0 -37
  649. package/dist/operations/services/package-artifacts.js +0 -99
  650. package/dist/operations/services/package-reference-policy.d.ts +0 -64
  651. package/dist/operations/services/package-reference-policy.js +0 -364
  652. package/dist/operations/services/project-host-operations.d.ts +0 -153
  653. package/dist/operations/services/project-host-operations.js +0 -365
  654. package/dist/operations/services/project-platform.d.ts +0 -727
  655. package/dist/operations/services/project-platform.js +0 -1603
  656. package/dist/operations/services/project-web-monitor.d.ts +0 -15
  657. package/dist/operations/services/project-web-monitor.js +0 -377
  658. package/dist/operations/services/railway-api.d.ts +0 -494
  659. package/dist/operations/services/railway-api.js +0 -1874
  660. package/dist/operations/services/railway-cli.d.ts +0 -47
  661. package/dist/operations/services/railway-cli.js +0 -142
  662. package/dist/operations/services/railway-deploy.d.ts +0 -161
  663. package/dist/operations/services/railway-deploy.js +0 -1808
  664. package/dist/operations/services/railway-source-policy.d.ts +0 -25
  665. package/dist/operations/services/railway-source-policy.js +0 -111
  666. package/dist/operations/services/release-history.d.ts +0 -59
  667. package/dist/operations/services/release-history.js +0 -158
  668. package/dist/operations/services/release-proof-ledger.d.ts +0 -13
  669. package/dist/operations/services/release-proof-ledger.js +0 -81
  670. package/dist/operations/services/release-proof-planner.d.ts +0 -48
  671. package/dist/operations/services/release-proof-planner.js +0 -195
  672. package/dist/operations/services/release-proof-runner.d.ts +0 -16
  673. package/dist/operations/services/release-proof-runner.js +0 -169
  674. package/dist/operations/services/release-proof.d.ts +0 -81
  675. package/dist/operations/services/release-proof.js +0 -79
  676. package/dist/operations/services/repository-save-orchestrator.d.ts +0 -193
  677. package/dist/operations/services/repository-save-orchestrator.js +0 -2110
  678. package/dist/operations/services/runtime-paths.d.ts +0 -19
  679. package/dist/operations/services/runtime-paths.js +0 -54
  680. package/dist/operations/services/runtime-tools.d.ts +0 -35
  681. package/dist/operations/services/runtime-tools.js +0 -212
  682. package/dist/operations/services/save-deploy-preflight.d.ts +0 -32
  683. package/dist/operations/services/save-deploy-preflight.js +0 -82
  684. package/dist/operations/services/template-host-bindings.d.ts +0 -68
  685. package/dist/operations/services/template-host-bindings.js +0 -401
  686. package/dist/operations/services/template-registry.d.ts +0 -110
  687. package/dist/operations/services/template-registry.js +0 -595
  688. package/dist/operations/services/template-secret-sync.d.ts +0 -97
  689. package/dist/operations/services/template-secret-sync.js +0 -292
  690. package/dist/operations/services/verification-cache.d.ts +0 -25
  691. package/dist/operations/services/verification-cache.js +0 -71
  692. package/dist/operations/services/watch-dev.d.ts +0 -21
  693. package/dist/operations/services/watch-dev.js +0 -282
  694. package/dist/operations/services/workflow-timing.d.ts +0 -25
  695. package/dist/operations/services/workflow-timing.js +0 -79
  696. package/dist/operations/services/workspace-dependency-mode.d.ts +0 -74
  697. package/dist/operations/services/workspace-dependency-mode.js +0 -478
  698. package/dist/operations/services/workspace-preflight.d.ts +0 -40
  699. package/dist/operations/services/workspace-preflight.js +0 -172
  700. package/dist/operations/services/workspace-save-script.d.ts +0 -26
  701. package/dist/operations/services/workspace-save-script.js +0 -50
  702. package/dist/operations/services/workspace-save.d.ts +0 -76
  703. package/dist/operations/services/workspace-save.js +0 -453
  704. package/dist/operations/services/workspace-tools.d.ts +0 -17
  705. package/dist/operations/services/workspace-tools.js +0 -320
  706. package/dist/operations-registry.d.ts +0 -5
  707. package/dist/operations-registry.js +0 -98
  708. package/dist/operations-types.d.ts +0 -75
  709. package/dist/operations-types.js +0 -17
  710. package/dist/operations.d.ts +0 -17
  711. package/dist/operations.js +0 -114
  712. package/dist/platform/book-export.d.ts +0 -78
  713. package/dist/platform/book-export.js +0 -451
  714. package/dist/platform/books-data.d.ts +0 -28
  715. package/dist/platform/books-data.js +0 -111
  716. package/dist/platform/config.d.ts +0 -27
  717. package/dist/platform/config.js +0 -100
  718. package/dist/platform/content-runtime-source.d.ts +0 -54
  719. package/dist/platform/content-runtime-source.js +0 -169
  720. package/dist/platform/contracts.d.ts +0 -361
  721. package/dist/platform/deploy-config.d.ts +0 -17
  722. package/dist/platform/deploy-config.js +0 -731
  723. package/dist/platform/deploy-runtime.d.ts +0 -22
  724. package/dist/platform/deploy-runtime.js +0 -93
  725. package/dist/platform/desired-state.d.ts +0 -66
  726. package/dist/platform/desired-state.js +0 -1071
  727. package/dist/platform/env.yaml +0 -1126
  728. package/dist/platform/environment.d.ts +0 -159
  729. package/dist/platform/environment.js +0 -778
  730. package/dist/platform/local-content-materialization.d.ts +0 -9
  731. package/dist/platform/local-content-materialization.js +0 -212
  732. package/dist/platform/plugin.d.ts +0 -103
  733. package/dist/platform/plugin.js +0 -6
  734. package/dist/platform/plugins/constants.d.ts +0 -26
  735. package/dist/platform/plugins/constants.js +0 -33
  736. package/dist/platform/plugins/runtime.d.ts +0 -41
  737. package/dist/platform/plugins/runtime.js +0 -257
  738. package/dist/platform/plugins.d.ts +0 -6
  739. package/dist/platform/plugins.js +0 -42
  740. package/dist/platform/published-content-pipeline.d.ts +0 -84
  741. package/dist/platform/published-content-pipeline.js +0 -547
  742. package/dist/platform/published-content.d.ts +0 -224
  743. package/dist/platform/published-content.js +0 -611
  744. package/dist/platform/site-config-schema.d.ts +0 -1
  745. package/dist/platform/site-config-schema.js +0 -4
  746. package/dist/platform/tenant/runtime-config.d.ts +0 -154
  747. package/dist/platform/tenant/runtime-config.js +0 -69
  748. package/dist/platform/tenant-config.d.ts +0 -8
  749. package/dist/platform/tenant-config.js +0 -207
  750. package/dist/platform/utils/site-config-schema.d.ts +0 -154
  751. package/dist/platform/utils/site-config-schema.js +0 -450
  752. package/dist/platform-operation-store.d.ts +0 -94
  753. package/dist/platform-operation-store.js +0 -531
  754. package/dist/platform-operations.d.ts +0 -273
  755. package/dist/platform-operations.js +0 -440
  756. package/dist/plugin-default.d.ts +0 -28
  757. package/dist/plugin-default.js +0 -55
  758. package/dist/project-import.d.ts +0 -91
  759. package/dist/project-import.js +0 -257
  760. package/dist/project-workflow.d.ts +0 -233
  761. package/dist/project-workflow.js +0 -82
  762. package/dist/reconcile/bootstrap-systems.d.ts +0 -32
  763. package/dist/reconcile/bootstrap-systems.js +0 -175
  764. package/dist/reconcile/builtin-adapters.d.ts +0 -9
  765. package/dist/reconcile/builtin-adapters.js +0 -5545
  766. package/dist/reconcile/contracts.d.ts +0 -172
  767. package/dist/reconcile/desired-state.d.ts +0 -10
  768. package/dist/reconcile/desired-state.js +0 -322
  769. package/dist/reconcile/engine.d.ts +0 -118
  770. package/dist/reconcile/engine.js +0 -645
  771. package/dist/reconcile/errors.d.ts +0 -5
  772. package/dist/reconcile/errors.js +0 -13
  773. package/dist/reconcile/index.d.ts +0 -10
  774. package/dist/reconcile/index.js +0 -10
  775. package/dist/reconcile/live-acceptance.d.ts +0 -100
  776. package/dist/reconcile/live-acceptance.js +0 -2018
  777. package/dist/reconcile/platform.d.ts +0 -104
  778. package/dist/reconcile/platform.js +0 -100
  779. package/dist/reconcile/providers/docker-private.d.ts +0 -54
  780. package/dist/reconcile/providers/docker-private.js +0 -101
  781. package/dist/reconcile/providers/github-private.d.ts +0 -69
  782. package/dist/reconcile/providers/github-private.js +0 -145
  783. package/dist/reconcile/providers/local-private.d.ts +0 -28
  784. package/dist/reconcile/providers/local-private.js +0 -75
  785. package/dist/reconcile/providers/railway-iac.d.ts +0 -220
  786. package/dist/reconcile/providers/railway-iac.js +0 -621
  787. package/dist/reconcile/providers/release-private.d.ts +0 -89
  788. package/dist/reconcile/providers/release-private.js +0 -140
  789. package/dist/reconcile/registry.d.ts +0 -7
  790. package/dist/reconcile/registry.js +0 -79
  791. package/dist/reconcile/state.d.ts +0 -7
  792. package/dist/reconcile/state.js +0 -270
  793. package/dist/reconcile/units.d.ts +0 -6
  794. package/dist/reconcile/units.js +0 -72
  795. package/dist/remote.d.ts +0 -244
  796. package/dist/remote.js +0 -284
  797. package/dist/scenes/artifacts.d.ts +0 -16
  798. package/dist/scenes/artifacts.js +0 -61
  799. package/dist/scenes/auth.d.ts +0 -2
  800. package/dist/scenes/auth.js +0 -28
  801. package/dist/scenes/base-url.d.ts +0 -12
  802. package/dist/scenes/base-url.js +0 -123
  803. package/dist/scenes/builtin-plugins.d.ts +0 -2
  804. package/dist/scenes/builtin-plugins.js +0 -499
  805. package/dist/scenes/checkpoints.d.ts +0 -14
  806. package/dist/scenes/checkpoints.js +0 -33
  807. package/dist/scenes/device-matrix.d.ts +0 -2
  808. package/dist/scenes/device-matrix.js +0 -100
  809. package/dist/scenes/devices.d.ts +0 -11
  810. package/dist/scenes/devices.js +0 -40
  811. package/dist/scenes/diagnostics.d.ts +0 -5
  812. package/dist/scenes/diagnostics.js +0 -22
  813. package/dist/scenes/diagram-providers.d.ts +0 -2
  814. package/dist/scenes/diagram-providers.js +0 -181
  815. package/dist/scenes/diagram-validation.d.ts +0 -22
  816. package/dist/scenes/diagram-validation.js +0 -74
  817. package/dist/scenes/environment.d.ts +0 -2
  818. package/dist/scenes/environment.js +0 -65
  819. package/dist/scenes/evidence-bundle.d.ts +0 -5
  820. package/dist/scenes/evidence-bundle.js +0 -42
  821. package/dist/scenes/evidence-report.d.ts +0 -10
  822. package/dist/scenes/evidence-report.js +0 -73
  823. package/dist/scenes/evidence.d.ts +0 -16
  824. package/dist/scenes/evidence.js +0 -277
  825. package/dist/scenes/index.d.ts +0 -48
  826. package/dist/scenes/index.js +0 -312
  827. package/dist/scenes/inspect.d.ts +0 -9
  828. package/dist/scenes/inspect.js +0 -64
  829. package/dist/scenes/loader.d.ts +0 -3
  830. package/dist/scenes/loader.js +0 -38
  831. package/dist/scenes/logs.d.ts +0 -2
  832. package/dist/scenes/logs.js +0 -47
  833. package/dist/scenes/operations.d.ts +0 -3
  834. package/dist/scenes/operations.js +0 -128
  835. package/dist/scenes/phase0.d.ts +0 -9
  836. package/dist/scenes/phase0.js +0 -637
  837. package/dist/scenes/planner.d.ts +0 -12
  838. package/dist/scenes/planner.js +0 -166
  839. package/dist/scenes/playwright-adapter.d.ts +0 -2
  840. package/dist/scenes/playwright-adapter.js +0 -63
  841. package/dist/scenes/plugins.d.ts +0 -5
  842. package/dist/scenes/plugins.js +0 -115
  843. package/dist/scenes/progress.d.ts +0 -17
  844. package/dist/scenes/progress.js +0 -24
  845. package/dist/scenes/publish-destinations.d.ts +0 -12
  846. package/dist/scenes/publish-destinations.js +0 -99
  847. package/dist/scenes/publish-plan-report.d.ts +0 -10
  848. package/dist/scenes/publish-plan-report.js +0 -70
  849. package/dist/scenes/publish-plan.d.ts +0 -15
  850. package/dist/scenes/publish-plan.js +0 -248
  851. package/dist/scenes/publish-redaction.d.ts +0 -16
  852. package/dist/scenes/publish-redaction.js +0 -148
  853. package/dist/scenes/publish-release-record.d.ts +0 -13
  854. package/dist/scenes/publish-release-record.js +0 -34
  855. package/dist/scenes/publish-report.d.ts +0 -10
  856. package/dist/scenes/publish-report.js +0 -67
  857. package/dist/scenes/publish.d.ts +0 -16
  858. package/dist/scenes/publish.js +0 -298
  859. package/dist/scenes/registry.d.ts +0 -12
  860. package/dist/scenes/registry.js +0 -65
  861. package/dist/scenes/remotion-adapter.d.ts +0 -3
  862. package/dist/scenes/remotion-adapter.js +0 -94
  863. package/dist/scenes/remotion-composition-registry.d.ts +0 -2
  864. package/dist/scenes/remotion-composition-registry.js +0 -12
  865. package/dist/scenes/remotion-compositions.d.ts +0 -15
  866. package/dist/scenes/remotion-compositions.js +0 -464
  867. package/dist/scenes/remotion-diagrams.d.ts +0 -9
  868. package/dist/scenes/remotion-diagrams.js +0 -188
  869. package/dist/scenes/remotion-input.d.ts +0 -13
  870. package/dist/scenes/remotion-input.js +0 -291
  871. package/dist/scenes/remotion-visuals.d.ts +0 -29
  872. package/dist/scenes/remotion-visuals.js +0 -198
  873. package/dist/scenes/render-media-assets.d.ts +0 -9
  874. package/dist/scenes/render-media-assets.js +0 -117
  875. package/dist/scenes/render-report.d.ts +0 -10
  876. package/dist/scenes/render-report.js +0 -27
  877. package/dist/scenes/render.d.ts +0 -2
  878. package/dist/scenes/render.js +0 -218
  879. package/dist/scenes/reporter.d.ts +0 -3
  880. package/dist/scenes/reporter.js +0 -101
  881. package/dist/scenes/resume.d.ts +0 -2
  882. package/dist/scenes/resume.js +0 -79
  883. package/dist/scenes/runner.d.ts +0 -2
  884. package/dist/scenes/runner.js +0 -687
  885. package/dist/scenes/schema.d.ts +0 -6
  886. package/dist/scenes/schema.js +0 -1023
  887. package/dist/scenes/seed.d.ts +0 -2
  888. package/dist/scenes/seed.js +0 -83
  889. package/dist/scenes/segments.d.ts +0 -15
  890. package/dist/scenes/segments.js +0 -79
  891. package/dist/scenes/selectors.d.ts +0 -3
  892. package/dist/scenes/selectors.js +0 -21
  893. package/dist/scenes/timeline.d.ts +0 -11
  894. package/dist/scenes/timeline.js +0 -26
  895. package/dist/scenes/timeouts.d.ts +0 -6
  896. package/dist/scenes/timeouts.js +0 -17
  897. package/dist/scenes/training-captions.d.ts +0 -14
  898. package/dist/scenes/training-captions.js +0 -98
  899. package/dist/scenes/training-report.d.ts +0 -10
  900. package/dist/scenes/training-report.js +0 -78
  901. package/dist/scenes/training-transcript.d.ts +0 -24
  902. package/dist/scenes/training-transcript.js +0 -204
  903. package/dist/scenes/training.d.ts +0 -10
  904. package/dist/scenes/training.js +0 -134
  905. package/dist/scenes/types.d.ts +0 -1900
  906. package/dist/scenes/types.js +0 -8
  907. package/dist/scenes/visual-audit-contact-sheets.d.ts +0 -6
  908. package/dist/scenes/visual-audit-contact-sheets.js +0 -119
  909. package/dist/scenes/visual-audit-fixtures.d.ts +0 -25
  910. package/dist/scenes/visual-audit-fixtures.js +0 -247
  911. package/dist/scenes/visual-audit-report.d.ts +0 -11
  912. package/dist/scenes/visual-audit-report.js +0 -85
  913. package/dist/scenes/visual-audit-review.d.ts +0 -23
  914. package/dist/scenes/visual-audit-review.js +0 -829
  915. package/dist/scenes/visual-audit-routes.d.ts +0 -13
  916. package/dist/scenes/visual-audit-routes.js +0 -308
  917. package/dist/scenes/visual-audit.d.ts +0 -3
  918. package/dist/scenes/visual-audit.js +0 -596
  919. package/dist/scripts/aggregate-book.js +0 -16
  920. package/dist/scripts/assert-release-tag-version.js +0 -23
  921. package/dist/scripts/build-dist.js +0 -294
  922. package/dist/scripts/build-tenant-worker.js +0 -36
  923. package/dist/scripts/check-build-warnings.js +0 -51
  924. package/dist/scripts/cleanup-markdown.js +0 -377
  925. package/dist/scripts/cli-test-fixtures.js +0 -44
  926. package/dist/scripts/config-treeseed.js +0 -131
  927. package/dist/scripts/deployment-readiness.js +0 -20
  928. package/dist/scripts/generate-treedx-openapi-types.js +0 -186
  929. package/dist/scripts/install-managed-dependencies.js +0 -12
  930. package/dist/scripts/key-agent.js +0 -165
  931. package/dist/scripts/local-dev.js +0 -129
  932. package/dist/scripts/migrate-journey-csv-to-guarantees.js +0 -140
  933. package/dist/scripts/operations-runner-smoke.js +0 -16
  934. package/dist/scripts/package-tools.js +0 -85
  935. package/dist/scripts/patch-starlight-content-path.js +0 -173
  936. package/dist/scripts/prepare.js +0 -10
  937. package/dist/scripts/publish-package.js +0 -29
  938. package/dist/scripts/release-verify.js +0 -105
  939. package/dist/scripts/run-fixture-astro-command.js +0 -18
  940. package/dist/scripts/scaffold-site.js +0 -66
  941. package/dist/scripts/sync-template.js +0 -20
  942. package/dist/scripts/template-catalog.test.js +0 -86
  943. package/dist/scripts/template-command.js +0 -31
  944. package/dist/scripts/tenant-astro-command.js +0 -3
  945. package/dist/scripts/tenant-build.js +0 -48
  946. package/dist/scripts/tenant-check.js +0 -10
  947. package/dist/scripts/tenant-d1-migrate-local.js +0 -15
  948. package/dist/scripts/tenant-deploy.js +0 -220
  949. package/dist/scripts/tenant-destroy.js +0 -112
  950. package/dist/scripts/tenant-dev.js +0 -160
  951. package/dist/scripts/tenant-lint.js +0 -4
  952. package/dist/scripts/tenant-test.js +0 -4
  953. package/dist/scripts/tenant-workflow-action.js +0 -101
  954. package/dist/scripts/test-cloudflare-local.js +0 -209
  955. package/dist/scripts/test-scaffold.js +0 -300
  956. package/dist/scripts/test-smoke.js +0 -137
  957. package/dist/scripts/treeseed-assert-release-tag-version.js +0 -21
  958. package/dist/scripts/treeseed-build-dist.js +0 -131
  959. package/dist/scripts/treeseed-publish-package.js +0 -19
  960. package/dist/scripts/treeseed-release-verify.js +0 -131
  961. package/dist/scripts/validate-templates.js +0 -6
  962. package/dist/scripts/verify-driver.js +0 -45
  963. package/dist/scripts/workflow-commands.test.js +0 -31
  964. package/dist/scripts/workspace-command-e2e.js +0 -718
  965. package/dist/scripts/workspace-lint.js +0 -15
  966. package/dist/scripts/workspace-preflight.js +0 -22
  967. package/dist/scripts/workspace-publish-changed-packages.js +0 -16
  968. package/dist/scripts/workspace-release-test.js +0 -104
  969. package/dist/scripts/workspace-release-verify.js +0 -81
  970. package/dist/scripts/workspace-save.js +0 -64
  971. package/dist/scripts/workspace-start-warning.js +0 -3
  972. package/dist/scripts/workspace-test-unit.js +0 -4
  973. package/dist/scripts/workspace-test.js +0 -17
  974. package/dist/sdk-dispatch.d.ts +0 -12
  975. package/dist/sdk-dispatch.js +0 -126
  976. package/dist/sdk-fields.d.ts +0 -11
  977. package/dist/sdk-filters.d.ts +0 -4
  978. package/dist/sdk-filters.js +0 -74
  979. package/dist/sdk-types.d.ts +0 -3868
  980. package/dist/sdk-types.js +0 -542
  981. package/dist/sdk-version.d.ts +0 -2
  982. package/dist/sdk-version.js +0 -42
  983. package/dist/sdk.d.ts +0 -266
  984. package/dist/sdk.js +0 -825
  985. package/dist/secrets-capability.d.ts +0 -421
  986. package/dist/secrets-capability.js +0 -530
  987. package/dist/seeds/errors.d.ts +0 -5
  988. package/dist/seeds/errors.js +0 -22
  989. package/dist/seeds/index.d.ts +0 -20
  990. package/dist/seeds/index.js +0 -53
  991. package/dist/seeds/loader.d.ts +0 -8
  992. package/dist/seeds/loader.js +0 -32
  993. package/dist/seeds/normalize.d.ts +0 -13
  994. package/dist/seeds/normalize.js +0 -282
  995. package/dist/seeds/planner.d.ts +0 -10
  996. package/dist/seeds/planner.js +0 -149
  997. package/dist/seeds/schema.d.ts +0 -2
  998. package/dist/seeds/schema.js +0 -893
  999. package/dist/seeds/types.d.ts +0 -312
  1000. package/dist/seeds/types.js +0 -12
  1001. package/dist/service-credentials.d.ts +0 -54
  1002. package/dist/service-credentials.js +0 -112
  1003. package/dist/stores/cursor-store.d.ts +0 -10
  1004. package/dist/stores/cursor-store.js +0 -164
  1005. package/dist/stores/envelopes.d.ts +0 -116
  1006. package/dist/stores/envelopes.js +0 -219
  1007. package/dist/stores/helpers.d.ts +0 -12
  1008. package/dist/stores/helpers.js +0 -42
  1009. package/dist/stores/lease-store.d.ts +0 -18
  1010. package/dist/stores/lease-store.js +0 -189
  1011. package/dist/stores/message-store.d.ts +0 -12
  1012. package/dist/stores/message-store.js +0 -273
  1013. package/dist/stores/operational-store.d.ts +0 -55
  1014. package/dist/stores/operational-store.js +0 -861
  1015. package/dist/stores/project-workflow-store.d.ts +0 -56
  1016. package/dist/stores/project-workflow-store.js +0 -482
  1017. package/dist/stores/run-store.d.ts +0 -9
  1018. package/dist/stores/run-store.js +0 -75
  1019. package/dist/stores/subscription-store.d.ts +0 -8
  1020. package/dist/stores/subscription-store.js +0 -73
  1021. package/dist/template-catalog.d.ts +0 -13
  1022. package/dist/template-catalog.js +0 -151
  1023. package/dist/template-launch-requirements.d.ts +0 -118
  1024. package/dist/template-launch-requirements.js +0 -768
  1025. package/dist/template-launch-ui.d.ts +0 -85
  1026. package/dist/template-launch-ui.js +0 -189
  1027. package/dist/timing.d.ts +0 -20
  1028. package/dist/timing.js +0 -73
  1029. package/dist/treedx/adapters.d.ts +0 -6
  1030. package/dist/treedx/adapters.js +0 -36
  1031. package/dist/treedx/client.d.ts +0 -222
  1032. package/dist/treedx/client.js +0 -871
  1033. package/dist/treedx/errors.d.ts +0 -13
  1034. package/dist/treedx/federated-client.d.ts +0 -27
  1035. package/dist/treedx/federated-client.js +0 -158
  1036. package/dist/treedx/graph-adapter.d.ts +0 -33
  1037. package/dist/treedx/graph-adapter.js +0 -156
  1038. package/dist/treedx/index.d.ts +0 -14
  1039. package/dist/treedx/index.js +0 -48
  1040. package/dist/treedx/market-integration.d.ts +0 -27
  1041. package/dist/treedx/market-integration.js +0 -131
  1042. package/dist/treedx/ports.d.ts +0 -166
  1043. package/dist/treedx/ports.js +0 -231
  1044. package/dist/treedx/query-adapter.d.ts +0 -19
  1045. package/dist/treedx/query-adapter.js +0 -62
  1046. package/dist/treedx/registry-client.d.ts +0 -11
  1047. package/dist/treedx/registry-client.js +0 -19
  1048. package/dist/treedx/repository-adapter.d.ts +0 -45
  1049. package/dist/treedx/repository-adapter.js +0 -319
  1050. package/dist/treedx/sdk-integration.d.ts +0 -27
  1051. package/dist/treedx/sdk-integration.js +0 -63
  1052. package/dist/treedx/workspace-adapter.d.ts +0 -27
  1053. package/dist/treedx/workspace-adapter.js +0 -65
  1054. package/dist/treedx-backends.d.ts +0 -220
  1055. package/dist/treedx-backends.js +0 -634
  1056. package/dist/treedx-client.d.ts +0 -89
  1057. package/dist/treedx-client.js +0 -184
  1058. package/dist/treeseed/services/compose.yml +0 -6
  1059. package/dist/treeseed/template-catalog/catalog.fixture.json +0 -707
  1060. package/dist/types/cloudflare.d.ts +0 -54
  1061. package/dist/verification.d.ts +0 -31
  1062. package/dist/verification.js +0 -430
  1063. package/dist/workflow/operations.d.ts +0 -1516
  1064. package/dist/workflow/operations.js +0 -7001
  1065. package/dist/workflow/policy.d.ts +0 -12
  1066. package/dist/workflow/policy.js +0 -70
  1067. package/dist/workflow/runs.d.ts +0 -143
  1068. package/dist/workflow/runs.js +0 -720
  1069. package/dist/workflow/session.d.ts +0 -34
  1070. package/dist/workflow/session.js +0 -160
  1071. package/dist/workflow/worktrees.d.ts +0 -43
  1072. package/dist/workflow/worktrees.js +0 -307
  1073. package/dist/workflow-state.d.ts +0 -250
  1074. package/dist/workflow-state.js +0 -844
  1075. package/dist/workflow-support.d.ts +0 -28
  1076. package/dist/workflow-support.js +0 -390
  1077. package/dist/workflow.d.ts +0 -327
  1078. package/dist/workflow.js +0 -140
  1079. package/drizzle/d1/0000_treeseed_d1.sql +0 -19
  1080. package/drizzle/market/0000_market_control_plane.sql +0 -3223
  1081. package/drizzle/market/0001_capacity_budget_mode_default.sql +0 -4
  1082. package/drizzle/market/0002_user_email_addresses.sql +0 -26
  1083. package/drizzle/market/0003_project_team_slug_unique.sql +0 -4
  1084. package/drizzle/market/0004_treedx_market_integration.sql +0 -99
  1085. package/drizzle/market/0005_agent_capacity_coordination.sql +0 -145
  1086. package/drizzle/market/0006_provider_assignment_lifecycle.sql +0 -9
  1087. package/drizzle/market/0007_agent_architecture_gap_closure.sql +0 -157
  1088. package/drizzle/market/0008_agent_capacity_operational_closure.sql +0 -27
  1089. package/drizzle/market/0009_agent_capacity_runtime_hardening.sql +0 -29
  1090. package/drizzle/market/0010_secrets_capability_persistence.sql +0 -130
  1091. package/drizzle/market/0011_github_app_adapter.sql +0 -47
  1092. package/drizzle/market/0012_workday_test_runs.sql +0 -44
  1093. package/drizzle/market/0013_runtime_task_lifecycle.sql +0 -39
  1094. package/drizzle/market/0014_governance_pipeline.sql +0 -189
  1095. package/drizzle/market/0015_agent_decision_assignment_graphs.sql +0 -60
  1096. package/scripts/verify-driver.ts +0 -51
  1097. package/templates/github/deploy-web.workflow.yml +0 -168
  1098. package/templates/github/hosted-project.workflow.yml +0 -76
  1099. /package/dist/{api/types.js → agent-capacity/contracts/capacity/workdays/workday-records.js} +0 -0
  1100. /package/dist/{hosting/contracts.js → agent-capacity/contracts/operations/workflow-promotion.js} +0 -0
  1101. /package/dist/{platform/contracts.js → agent-capacity/contracts/projects/agents/project-agent-class.js} +0 -0
  1102. /package/dist/{reconcile/contracts.js → agent-capacity/contracts/runtime/runtime-observability.js} +0 -0
  1103. /package/dist/{types/cloudflare.js → agent-capacity/contracts/support/decision-work.js} +0 -0
  1104. /package/dist/{field-aliases.js → entrypoints/models/field-aliases.js} +0 -0
  1105. /package/dist/{sdk-fields.js → entrypoints/models/sdk-fields.js} +0 -0
  1106. /package/dist/{runtime.d.ts → runtime/runtime.d.ts} +0 -0
  1107. /package/dist/{runtime.js → runtime/runtime.js} +0 -0
  1108. /package/dist/treedx/{errors.js → support/errors.js} +0 -0
@@ -1,2018 +0,0 @@
1
- import { execFileSync } from "node:child_process";
2
- import { createServer } from "node:net";
3
- import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
4
- import { readFileSync } from "node:fs";
5
- import { performance } from "node:perf_hooks";
6
- import { join, resolve } from "node:path";
7
- import {
8
- createTreeseedCanonicalReconcileReport
9
- } from "./platform.js";
10
- import { runTreeseedGit } from "../operations/services/git-runner.js";
11
- import {
12
- deleteRailwayProject,
13
- ensureRailwayEnvironment,
14
- ensureRailwayCustomDomain,
15
- ensureRailwayGeneratedServiceDomain,
16
- ensureRailwayPostgresService,
17
- ensureRailwayProject,
18
- ensureRailwayService,
19
- ensureRailwayServiceVolume,
20
- listRailwayEnvironments,
21
- listRailwayProjects,
22
- listRailwayServices,
23
- listRailwayVariables,
24
- listRailwayVolumes,
25
- resolveRailwayWorkspaceContext,
26
- upsertRailwayVariables
27
- } from "../operations/services/railway-api.js";
28
- import { resolveGitHubCredentialForRepository } from "../operations/services/github-credentials.js";
29
- import { MarketClient } from "../market-client.js";
30
- import { MarketProviderClient } from "../capacity-provider.js";
31
- const PROVIDER_CAPABILITIES = {
32
- railway: ["project", "environment", "service", "image-service", "postgres", "volume", "domain", "variables", "deployment-health", "capacity-provider-runtime-assignment-proof"],
33
- cloudflare: ["pages", "worker", "d1", "r2", "kv", "queue", "dns", "turnstile", "secrets", "cache-rules"],
34
- github: ["environment", "secret", "variable", "workflow-dispatch", "workflow-observation", "repository-scoped-token"],
35
- local: ["process", "port", "local-db", "local-runner", "docker-compose-capacity-provider", "capacity-provider-assignment-proof"]
36
- };
37
- function isCapacityRuntimeProofCapability(capability) {
38
- return capability === "capacity-provider-assignment-proof" || capability === "capacity-provider-runtime-assignment-proof";
39
- }
40
- function scenarioResourceKind(provider, capability) {
41
- if (provider === "railway") return capability === "volume" ? "railway-volume" : "railway-service";
42
- if (provider === "cloudflare") return "cloudflare-resource";
43
- if (provider === "github") {
44
- if (capability === "environment") return "github-environment";
45
- if (capability === "secret") return "github-secret-binding";
46
- if (capability === "variable") return "github-secret-binding";
47
- return "package-workflow";
48
- }
49
- if (isCapacityRuntimeProofCapability(capability)) return "capacity-provider";
50
- if (capability === "docker-compose-capacity-provider") return "local-docker-compose";
51
- if (capability === "process") return "local-process";
52
- if (capability === "local-runner") return "capacity-provider";
53
- return "local-process";
54
- }
55
- function scenarioResourceProvider(provider, capability) {
56
- if (provider === "cloudflare") return "cloudflare";
57
- if (provider === "github") return "github";
58
- if (provider === "local") return "local";
59
- return "railway";
60
- }
61
- function liveAcceptanceDesiredResource(input) {
62
- const id = `live-acceptance:${input.environment}:${input.provider}:${input.capability}:${input.runId}`;
63
- const kind = scenarioResourceKind(input.provider, input.capability);
64
- return {
65
- id,
66
- kind,
67
- provider: scenarioResourceProvider(input.provider, input.capability),
68
- environment: input.environment,
69
- packageId: null,
70
- serviceId: input.capability,
71
- logicalName: input.capability,
72
- spec: {
73
- liveAcceptance: true,
74
- provider: input.provider,
75
- capability: input.capability,
76
- runId: input.runId,
77
- prefix: providerPrefix(input.environment, input.provider, input.runId),
78
- tenantRoot: input.tenantRoot
79
- },
80
- dependencies: [],
81
- source: { type: "package-adapter", id }
82
- };
83
- }
84
- function compileTreeseedLiveAcceptanceScenarios(input) {
85
- const providers = input.provider === "all" ? ["railway", "cloudflare", "github", "local"] : [input.provider];
86
- return providers.flatMap((provider) => PROVIDER_CAPABILITIES[provider].map((capability) => {
87
- const probeOnly = input.mode === "smoke" || provider === "github" && ["workflow-observation", "repository-scoped-token"].includes(capability) || provider === "cloudflare" && capability === "cache-rules" || isCapacityRuntimeProofCapability(capability);
88
- const desiredResources = probeOnly ? [] : [liveAcceptanceDesiredResource({
89
- tenantRoot: input.tenantRoot,
90
- environment: input.environment,
91
- provider,
92
- capability,
93
- runId: input.runId
94
- })];
95
- const selector = {
96
- environment: input.environment,
97
- host: [provider],
98
- resourceKind: desiredResources.map((resource) => resource.kind),
99
- serviceType: [capability]
100
- };
101
- return {
102
- id: `live-acceptance:${input.environment}:${provider}:${capability}:${input.runId}`,
103
- provider,
104
- capability,
105
- desiredResources,
106
- selector,
107
- expectedActions: input.mode === "cleanup" ? ["delete", "noop"] : probeOnly ? ["noop"] : ["create", "update", "replace", "reattach", "noop"],
108
- cleanupSelector: selector,
109
- required: true,
110
- probeOnly,
111
- cleanupRequired: input.mode !== "smoke" && !probeOnly
112
- };
113
- }));
114
- }
115
- function configuredValue(env, keys) {
116
- for (const key of keys) {
117
- const value = env[key];
118
- if (typeof value === "string" && value.trim()) return value.trim();
119
- }
120
- return "";
121
- }
122
- function capacityAcceptanceConfig(env, environment) {
123
- const local = environment === "local";
124
- const apiUrl = configuredValue(env, [
125
- "TREESEED_CAPACITY_ACCEPTANCE_API_URL",
126
- "TREESEED_MARKET_URL",
127
- "TREESEED_MANAGEMENT_API_URL",
128
- "TREESEED_API_BASE_URL"
129
- ]) || (local ? "http://127.0.0.1:3000" : "");
130
- const adminToken = configuredValue(env, ["TREESEED_CAPACITY_ACCEPTANCE_ADMIN_TOKEN"]) || (local ? "tsk_local_treeseed_acceptance_admin" : "");
131
- const teamId = configuredValue(env, ["TREESEED_CAPACITY_ACCEPTANCE_TEAM_ID"]) || (local ? "d8a613c2-bbdb-4474-9c96-31e985beafd4" : "");
132
- const projectId = configuredValue(env, ["TREESEED_CAPACITY_ACCEPTANCE_PROJECT_ID"]) || (local ? "90764af2-5a13-42b9-a2fa-fb3af5882323" : "");
133
- const providerId = configuredValue(env, ["TREESEED_CAPACITY_ACCEPTANCE_PROVIDER_ID", "TREESEED_CAPACITY_PROVIDER_ID"]) || (local ? "ff48ce97-6959-46b5-be9f-9b7062161fe3" : "");
134
- const agentClassId = configuredValue(env, ["TREESEED_CAPACITY_ACCEPTANCE_AGENT_CLASS_ID"]) || (local ? "planning" : "");
135
- const providerApiKey = configuredValue(env, ["TREESEED_CAPACITY_PROVIDER_API_KEY"]) || (local ? "tsp_local_treeseed_demo_capacity_provider" : "");
136
- const missing = [
137
- ["TREESEED_CAPACITY_ACCEPTANCE_API_URL or TREESEED_MARKET_URL", apiUrl],
138
- ["TREESEED_CAPACITY_ACCEPTANCE_ADMIN_TOKEN", adminToken],
139
- ["TREESEED_CAPACITY_ACCEPTANCE_TEAM_ID", teamId],
140
- ["TREESEED_CAPACITY_ACCEPTANCE_PROJECT_ID", projectId],
141
- ["TREESEED_CAPACITY_ACCEPTANCE_PROVIDER_ID or TREESEED_CAPACITY_PROVIDER_ID", providerId],
142
- ["TREESEED_CAPACITY_ACCEPTANCE_AGENT_CLASS_ID", agentClassId],
143
- ["TREESEED_CAPACITY_PROVIDER_API_KEY", providerApiKey]
144
- ].filter(([, value]) => !value).map(([key]) => String(key));
145
- return {
146
- apiUrl,
147
- adminToken,
148
- teamId,
149
- projectId,
150
- providerId,
151
- agentClassId,
152
- providerApiKey,
153
- missing
154
- };
155
- }
156
- function capacityGrantForAcceptance(grants, config, environment) {
157
- return grants.map((entry) => entry && typeof entry === "object" ? entry : null).find(
158
- (grant) => grant && grant.id && grant.capacityProviderId === config.providerId && grant.projectId === config.projectId && (grant.teamId === config.teamId || !grant.teamId) && (grant.state === "active" || !grant.state) && (grant.environment === environment || !grant.environment)
159
- ) ?? null;
160
- }
161
- async function createTreeDxProxyAuditEvidence(input) {
162
- const response = await input.fetchImpl(
163
- `${input.apiUrl.replace(/\/$/u, "")}/v1/dx/projects/${encodeURIComponent(input.projectId)}/repos/${encodeURIComponent(`capacity-proof-${input.runId}`)}/files/read`,
164
- {
165
- method: "POST",
166
- headers: {
167
- accept: "application/json",
168
- authorization: `Bearer ${input.providerApiKey}`,
169
- "content-type": "application/json",
170
- "x-treeseed-assignment-id": input.assignmentId
171
- },
172
- body: JSON.stringify({
173
- paths: [`src/content/agent-platform-proof/${input.runId}.mdx`],
174
- ref: "HEAD"
175
- })
176
- }
177
- );
178
- if (response.status !== 403) {
179
- const text = await response.text().catch(() => "");
180
- throw new Error(`Capacity acceptance TreeDX proxy audit probe expected 403 but received ${response.status}${text ? `: ${text}` : ""}.`);
181
- }
182
- }
183
- async function runCapacityProviderAssignmentProof(input) {
184
- const config = capacityAcceptanceConfig(input.env, input.environment);
185
- if (config.missing.length > 0) {
186
- throw new Error(`Missing capacity acceptance configuration: ${config.missing.join(", ")}.`);
187
- }
188
- const runnerId = `${input.prefix}-runner`;
189
- const assignmentId = `${input.prefix}-assignment`;
190
- const mode = configuredValue(input.env, ["TREESEED_CAPACITY_ACCEPTANCE_MODE"]) || "planning";
191
- const metadata = {
192
- liveAcceptance: true,
193
- runId: input.runId,
194
- prefix: input.prefix,
195
- provider: input.provider,
196
- capability: input.provider === "railway" ? "capacity-provider-runtime-assignment-proof" : "capacity-provider-assignment-proof",
197
- priority: 1e6
198
- };
199
- const adminClient = new MarketClient({
200
- profile: {
201
- id: "capacity-acceptance",
202
- label: "Capacity Acceptance",
203
- baseUrl: config.apiUrl,
204
- kind: "specialized",
205
- teamId: config.teamId
206
- },
207
- accessToken: config.adminToken,
208
- fetchImpl: input.fetchImpl,
209
- userAgent: `treeseed-live-acceptance/${input.runId}`
210
- });
211
- const providerClient = new MarketProviderClient({
212
- marketUrl: config.apiUrl,
213
- marketId: input.environment,
214
- apiKey: config.providerApiKey,
215
- fetchImpl: input.fetchImpl,
216
- userAgent: `treeseed-live-acceptance/${input.runId}`
217
- });
218
- const existingClasses = await adminClient.projectAgentClasses(config.projectId).catch(() => ({ payload: [] }));
219
- const hasAgentClass = Array.isArray(existingClasses.payload) && existingClasses.payload.some((entry) => {
220
- const record = entry && typeof entry === "object" ? entry : {};
221
- return record.id === config.agentClassId || record.slug === config.agentClassId;
222
- });
223
- if (!hasAgentClass) {
224
- await adminClient.createProjectAgentClass(config.projectId, {
225
- id: config.agentClassId,
226
- slug: config.agentClassId,
227
- name: "Planning",
228
- status: "active",
229
- allowedModes: ["planning"],
230
- requiredCapabilities: ["agent_mode_run"],
231
- metadata
232
- });
233
- }
234
- const grants = await adminClient.capacityGrants(config.teamId).catch(() => ({ payload: [] }));
235
- const acceptanceGrant = capacityGrantForAcceptance(Array.isArray(grants.payload) ? grants.payload : [], config, input.environment);
236
- if (!acceptanceGrant) {
237
- throw new Error(`Capacity acceptance did not find an active checked-in grant for project ${config.projectId} and provider ${config.providerId}.`);
238
- }
239
- const reservation = await adminClient.createCapacityReservation(config.projectId, {
240
- id: `${input.prefix}-reservation`,
241
- capacityProviderId: config.providerId,
242
- laneId: typeof acceptanceGrant.laneId === "string" && acceptanceGrant.laneId ? acceptanceGrant.laneId : `${config.providerId}:agent-capacity`,
243
- reservedCredits: 1,
244
- nativeUnit: "request",
245
- reservedNativeAmount: 1,
246
- mode,
247
- metadata
248
- });
249
- const reservationId = String(reservation.payload?.id ?? "");
250
- if (!reservationId) throw new Error("Capacity acceptance reservation creation did not return an id.");
251
- const checkIn = await providerClient.checkIn({
252
- id: `${input.prefix}-session`,
253
- environment: input.environment,
254
- status: "open",
255
- capabilities: ["repo_read", "agent_mode_run", "usage_report"],
256
- grants: [{
257
- grantId: String(acceptanceGrant.id),
258
- projectId: config.projectId,
259
- teamId: config.teamId,
260
- grantScope: typeof acceptanceGrant.grantScope === "string" ? acceptanceGrant.grantScope : "project"
261
- }],
262
- nativeLimits: { wallMinutes: { session: 30 } },
263
- runnerPressure: { activeRunners: 0, maxConcurrentRunners: 1 },
264
- constraints: { liveAcceptance: true, outboundOnly: true },
265
- metadata
266
- });
267
- const sessionId = String(checkIn.payload.id ?? "");
268
- if (!sessionId) throw new Error("Capacity acceptance check-in did not return a session id.");
269
- await adminClient.createProviderAssignment(config.teamId, {
270
- id: assignmentId,
271
- projectId: config.projectId,
272
- capacityProviderId: config.providerId,
273
- providerSessionId: sessionId,
274
- projectAgentClassId: config.agentClassId,
275
- reservationId,
276
- mode,
277
- capacityEnvelope: {
278
- teamId: config.teamId,
279
- projectId: config.projectId,
280
- providerId: config.providerId,
281
- laneId: typeof acceptanceGrant.laneId === "string" && acceptanceGrant.laneId ? acceptanceGrant.laneId : `${config.providerId}:agent-capacity`,
282
- reservationId,
283
- mode,
284
- limits: { wallMinutes: 5 },
285
- metadata
286
- },
287
- decisionInput: {
288
- kind: "capacity_acceptance_diagnostic",
289
- runId: input.runId,
290
- mode,
291
- instructions: "Execute the isolated capacity acceptance diagnostic without widening project or provider scope."
292
- },
293
- workspaceContext: {
294
- liveAcceptance: true,
295
- runId: input.runId
296
- },
297
- metadata
298
- });
299
- let leased = null;
300
- for (let attempt = 0; attempt < 10; attempt += 1) {
301
- leased = await providerClient.nextAssignment({
302
- sessionId,
303
- runnerId,
304
- leaseSeconds: 120,
305
- metadata
306
- });
307
- const leasedId = leased.payload?.id ? String(leased.payload.id) : "";
308
- if (!leasedId) throw new Error("Capacity acceptance did not lease an assignment.");
309
- if (leasedId === assignmentId) break;
310
- const leasedMetadata = leased.payload?.metadata && typeof leased.payload.metadata === "object" ? leased.payload.metadata : {};
311
- if (leasedMetadata.liveAcceptance !== true) {
312
- throw new Error(`Capacity acceptance leased ${leasedId} instead of diagnostic assignment ${assignmentId}.`);
313
- }
314
- const staleLeaseToken = leased.leaseToken ?? leased.payload.leaseToken ?? null;
315
- if (!staleLeaseToken) throw new Error(`Capacity acceptance leased stale diagnostic ${leasedId} without a lease token.`);
316
- await providerClient.completeAssignment(leasedId, {
317
- runnerId,
318
- leaseToken: staleLeaseToken,
319
- output: { summary: "Retired stale capacity acceptance diagnostic.", runId: input.runId },
320
- summary: { runId: input.runId, retiredAssignmentId: leasedId },
321
- metadata: {
322
- ...metadata,
323
- retiredStaleAcceptanceAssignment: true,
324
- retiredAssignmentId: leasedId
325
- }
326
- });
327
- leased = null;
328
- }
329
- if (!leased?.payload?.id) throw new Error("Capacity acceptance did not lease an assignment.");
330
- if (leased.payload.id !== assignmentId) {
331
- throw new Error(`Capacity acceptance leased stale diagnostics but did not reach diagnostic assignment ${assignmentId}.`);
332
- }
333
- const leaseToken = leased.leaseToken ?? leased.payload.leaseToken ?? null;
334
- if (!leaseToken) throw new Error("Capacity acceptance lease did not include a lease token.");
335
- await createTreeDxProxyAuditEvidence({
336
- fetchImpl: input.fetchImpl,
337
- apiUrl: config.apiUrl,
338
- providerApiKey: config.providerApiKey,
339
- projectId: config.projectId,
340
- assignmentId,
341
- runId: input.runId
342
- });
343
- const modeRun = await providerClient.createAssignmentModeRun(assignmentId, {
344
- status: "succeeded",
345
- selectedInput: { kind: "capacity_acceptance_diagnostic", runId: input.runId, mode },
346
- outputs: { summary: "Capacity acceptance diagnostic completed.", runId: input.runId },
347
- usageActual: {
348
- actualCredits: 0,
349
- nativeUsage: { nativeUnit: "request", amount: 1, source: "capacity_acceptance" },
350
- metadata
351
- },
352
- traceRefs: { liveAcceptanceRunId: input.runId },
353
- metadata
354
- });
355
- const modeRunId = String(modeRun.payload.id ?? "");
356
- if (!modeRunId) throw new Error("Capacity acceptance mode-run creation did not return an id.");
357
- const completed = await providerClient.completeAssignment(assignmentId, {
358
- runnerId,
359
- leaseToken,
360
- modeRunId,
361
- actualCredits: 0.25,
362
- nativeUsage: { nativeUnit: "request", amount: 1, source: "capacity_acceptance" },
363
- output: { summary: "Capacity acceptance diagnostic completed.", runId: input.runId },
364
- summary: { runId: input.runId, modeRunId },
365
- metadata
366
- });
367
- const finalStatus = String(completed.payload?.status ?? "");
368
- if (finalStatus !== "completed") {
369
- throw new Error(`Capacity acceptance assignment finished with status "${finalStatus || "unknown"}".`);
370
- }
371
- const modeRuns = await adminClient.projectAgentModeRuns(config.projectId, { assignmentId });
372
- const modeRunCount = Array.isArray(modeRuns.payload) ? modeRuns.payload.length : 0;
373
- if (!modeRunCount) throw new Error("Capacity acceptance mode-run was not visible through project mode-run inspection.");
374
- return {
375
- sessionId,
376
- assignmentId,
377
- modeRunId,
378
- finalStatus,
379
- mode,
380
- runnerId,
381
- modeRunCount
382
- };
383
- }
384
- function shortRunId(now = /* @__PURE__ */ new Date()) {
385
- return now.toISOString().replace(/[^0-9]/gu, "").slice(0, 14);
386
- }
387
- function providerPrefix(environment, provider, runId) {
388
- if (provider === "railway") return `trsd-rail-${runId}`.toLowerCase();
389
- return `trsd-live-${environment}-${provider}-${runId}`.toLowerCase();
390
- }
391
- function providerPrefixRoot(environment, provider) {
392
- if (provider === "railway") return "trsd-rail-";
393
- return `trsd-live-${environment}-${provider}-`.toLowerCase();
394
- }
395
- function emitProgress(onProgress, event) {
396
- if (!onProgress) return;
397
- onProgress({
398
- ...event,
399
- message: event.message ?? [
400
- event.provider,
401
- event.capability,
402
- event.phase
403
- ].filter(Boolean).join(":")
404
- });
405
- }
406
- function sleep(ms) {
407
- return new Promise((resolve2) => setTimeout(resolve2, ms));
408
- }
409
- async function waitForLiveObservation(description, observe, isReady, options = {}) {
410
- const attempts = Math.max(1, options.attempts ?? 8);
411
- const intervalMs = Math.max(0, options.intervalMs ?? 750);
412
- let lastValue;
413
- let lastError;
414
- for (let attempt = 1; attempt <= attempts; attempt += 1) {
415
- try {
416
- lastValue = await observe();
417
- if (isReady(lastValue)) return lastValue;
418
- } catch (error) {
419
- lastError = error;
420
- }
421
- if (attempt < attempts) await sleep(intervalMs);
422
- }
423
- if (lastError) {
424
- throw new Error(`${description} was not observed live: ${lastError instanceof Error ? lastError.message : String(lastError)}`);
425
- }
426
- throw new Error(`${description} was not observed live after ${attempts} attempt(s).`);
427
- }
428
- function parseGitHubRepository(value) {
429
- const raw = value.trim().replace(/^https?:\/\/github\.com\//iu, "").replace(/^git@github\.com:/iu, "").replace(/^ssh:\/\/git@github\.com\//iu, "").replace(/\.git$/iu, "").replace(/^\/+|\/+$/gu, "");
430
- const [owner, repo, ...extra] = raw.split("/").filter(Boolean);
431
- if (!owner || !repo || extra.length > 0) {
432
- throw new Error(`Invalid GitHub repository "${value}". Expected owner/name.`);
433
- }
434
- return `${owner}/${repo}`;
435
- }
436
- function resolveCurrentGitHubRepository(cwd, env) {
437
- const configured = configuredValue(env, ["TREESEED_REPOSITORY", "GITHUB_REPOSITORY"]);
438
- if (configured) return parseGitHubRepository(configured);
439
- const remote = runTreeseedGit(["config", "--get", "remote.origin.url"], {
440
- cwd,
441
- mode: "read"
442
- }).stdout.trim();
443
- return parseGitHubRepository(remote);
444
- }
445
- function domainFromWorkspace(cwd) {
446
- try {
447
- const manifest = readFileSync(join(cwd, "treeseed.site.yaml"), "utf8");
448
- const match = /^siteUrl:\s*(\S+)/gmu.exec(manifest);
449
- if (!match?.[1]) return "";
450
- const url = new URL(match[1]);
451
- return url.hostname.replace(/^www\./iu, "");
452
- } catch {
453
- return "";
454
- }
455
- }
456
- function resolveLiveTestDomain(cwd, env) {
457
- return configuredValue(env, ["TREESEED_LIVE_TEST_DOMAIN"]) || configuredValue(env, ["TREESEED_DOMAIN"]) || domainFromWorkspace(cwd);
458
- }
459
- async function resolveCloudflareZoneId(domain, env, fetchImpl) {
460
- const configured = configuredValue(env, ["TREESEED_LIVE_TEST_CLOUDFLARE_ZONE_ID", "CLOUDFLARE_ZONE_ID"]);
461
- if (configured) return configured;
462
- const zones = await cloudflareRequest("/zones?per_page=100", env, fetchImpl).catch(() => []);
463
- if (!Array.isArray(zones)) return "";
464
- const candidates = zones.map((entry) => entry && typeof entry === "object" ? entry : null).filter(Boolean);
465
- const matched = candidates.find((entry) => typeof entry.name === "string" && (domain === entry.name || domain.endsWith(`.${entry.name}`)));
466
- return typeof matched?.id === "string" ? matched.id : "";
467
- }
468
- function scenario({
469
- provider,
470
- mode,
471
- prefix,
472
- capability,
473
- ok,
474
- phase,
475
- action,
476
- reason,
477
- locators = {},
478
- createdResources = [],
479
- updatedResources = [],
480
- replacedResources = [],
481
- destroyedResources = [],
482
- retainedResources = [],
483
- issues = [],
484
- startedAt,
485
- completedAt,
486
- durationMs
487
- }) {
488
- const completed = completedAt ?? (/* @__PURE__ */ new Date()).toISOString();
489
- const started = startedAt ?? completed;
490
- return {
491
- id: `live-test:${provider}:${capability}`,
492
- provider,
493
- capability,
494
- mode,
495
- ok,
496
- phase,
497
- action,
498
- reason,
499
- startedAt: started,
500
- completedAt: completed,
501
- durationMs: typeof durationMs === "number" ? Math.max(1, Math.ceil(durationMs)) : Math.max(1, Date.parse(completed) - Date.parse(started)),
502
- locators,
503
- createdResources,
504
- updatedResources,
505
- replacedResources,
506
- destroyedResources,
507
- retainedResources,
508
- issues
509
- };
510
- }
511
- function node(provider, environment, type, id, state = {}) {
512
- return {
513
- id,
514
- provider,
515
- type,
516
- owner: "reconcile-live-test",
517
- environment,
518
- state
519
- };
520
- }
521
- function redactProviderState(value) {
522
- if (Array.isArray(value)) return value.map((entry) => redactProviderState(entry));
523
- if (value && typeof value === "object") {
524
- const redacted = {};
525
- for (const [key, entry] of Object.entries(value)) {
526
- redacted[key] = /secret|token|password|private|key/iu.test(key) ? "[redacted]" : redactProviderState(entry);
527
- }
528
- return redacted;
529
- }
530
- return value;
531
- }
532
- function providerNode(provider, environment, type, id, state = {}) {
533
- return node(provider, environment, type, id, redactProviderState(state));
534
- }
535
- function blocking(provider, type, reason) {
536
- return {
537
- id: `live-test:${provider}:${type}:blocked`,
538
- resourceId: `live-test:${provider}:${type}`,
539
- severity: "blocking",
540
- reason,
541
- provider,
542
- type
543
- };
544
- }
545
- async function measuredScenario(input, fn) {
546
- const started = /* @__PURE__ */ new Date();
547
- const startedMs = performance.now();
548
- emitProgress(input.onProgress, {
549
- provider: input.provider,
550
- mode: input.mode,
551
- environment: input.environment,
552
- runId: input.runId,
553
- resourcePrefix: input.prefix,
554
- capability: input.capability,
555
- phase: input.phase === "verify" ? "verify" : input.phase === "cleanup" ? "cleanup" : input.phase === "destroy" ? "destroy" : "create",
556
- message: input.startMessage ?? `${input.provider}:${input.capability}: ${input.phase} started`
557
- });
558
- try {
559
- const value = await fn();
560
- const completed = /* @__PURE__ */ new Date();
561
- const durationMs = Math.max(1, Math.ceil(performance.now() - startedMs));
562
- const resourcesFor = (resources) => typeof resources === "function" ? resources(value) : resources ?? [];
563
- emitProgress(input.onProgress, {
564
- provider: input.provider,
565
- mode: input.mode,
566
- environment: input.environment,
567
- runId: input.runId,
568
- resourcePrefix: input.prefix,
569
- capability: input.capability,
570
- phase: "complete",
571
- elapsedMs: durationMs,
572
- message: `${input.provider}:${input.capability}: ok in ${durationMs}ms`
573
- });
574
- return scenario({
575
- provider: input.provider,
576
- mode: input.mode,
577
- prefix: input.prefix,
578
- capability: input.capability,
579
- ok: true,
580
- phase: input.phase,
581
- action: input.action,
582
- reason: typeof input.successReason === "function" ? input.successReason(value) : input.successReason,
583
- locators: input.locators,
584
- createdResources: resourcesFor(input.createdResources),
585
- updatedResources: resourcesFor(input.updatedResources),
586
- replacedResources: resourcesFor(input.replacedResources),
587
- destroyedResources: resourcesFor(input.destroyedResources),
588
- retainedResources: resourcesFor(input.retainedResources),
589
- startedAt: started.toISOString(),
590
- completedAt: completed.toISOString(),
591
- durationMs
592
- });
593
- } catch (error) {
594
- const completed = /* @__PURE__ */ new Date();
595
- const durationMs = Math.max(1, Math.ceil(performance.now() - startedMs));
596
- const reason = error instanceof Error ? error.message : String(error);
597
- emitProgress(input.onProgress, {
598
- provider: input.provider,
599
- mode: input.mode,
600
- environment: input.environment,
601
- runId: input.runId,
602
- resourcePrefix: input.prefix,
603
- capability: input.capability,
604
- phase: "blocked",
605
- elapsedMs: durationMs,
606
- message: `${input.provider}:${input.capability}: blocked after ${durationMs}ms - ${reason}`
607
- });
608
- return scenario({
609
- provider: input.provider,
610
- mode: input.mode,
611
- prefix: input.prefix,
612
- capability: input.capability,
613
- ok: false,
614
- phase: "blocked",
615
- action: "blocked",
616
- reason,
617
- locators: input.locators,
618
- startedAt: started.toISOString(),
619
- completedAt: completed.toISOString(),
620
- durationMs
621
- });
622
- }
623
- }
624
- function reportForProvider({
625
- provider,
626
- mode,
627
- runId,
628
- prefix,
629
- environment,
630
- results,
631
- cleanupDrift = []
632
- }) {
633
- const capabilities = PROVIDER_CAPABILITIES[provider];
634
- const desiredGraph = capabilities.map((capability) => ({
635
- id: `live-test:${provider}:${capability}`,
636
- provider,
637
- type: capability,
638
- owner: "reconcile-live-test",
639
- environment,
640
- spec: { prefix, isolated: true, mode }
641
- }));
642
- const resultByCapability = new Map(results.map((result) => [result.capability, result]));
643
- const blockedDrift = [
644
- ...desiredGraph.filter((entry) => !resultByCapability.get(String(entry.type))?.ok).map((entry) => blocking(provider, String(entry.type), resultByCapability.get(String(entry.type))?.reason ?? "Live scenario did not run.")),
645
- ...cleanupDrift
646
- ];
647
- const actions = desiredGraph.map((entry) => {
648
- const result = resultByCapability.get(String(entry.type));
649
- return {
650
- id: `${entry.id}:${result?.action ?? "blocked"}`,
651
- kind: result?.ok ? result.action : "blocked",
652
- resourceId: entry.id,
653
- reason: result?.reason ?? "Live scenario did not run.",
654
- provider,
655
- type: entry.type
656
- };
657
- });
658
- const postconditions = desiredGraph.map((entry) => {
659
- const result = resultByCapability.get(String(entry.type));
660
- return {
661
- id: `${entry.id}:postcondition`,
662
- resourceId: entry.id,
663
- description: `${mode} live reconciliation postconditions pass for ${provider}:${entry.type}.`,
664
- source: provider === "local" ? "local" : "api",
665
- required: true,
666
- ok: Boolean(result?.ok),
667
- issues: result?.ok ? [] : [result?.reason ?? "Live scenario did not run."],
668
- observed: result?.locators ?? {}
669
- };
670
- });
671
- const createdResources = results.flatMap((result) => result.createdResources);
672
- const updatedResources = results.flatMap((result) => result.updatedResources);
673
- const replacedResources = results.flatMap((result) => result.replacedResources);
674
- const destroyedResources = results.flatMap((result) => result.destroyedResources);
675
- const retainedResources = results.flatMap((result) => result.retainedResources);
676
- const report = createTreeseedCanonicalReconcileReport({
677
- desiredGraph,
678
- observedGraph: desiredGraph.filter((entry) => resultByCapability.has(String(entry.type))).map((entry) => ({
679
- ...entry,
680
- state: {
681
- verified: Boolean(resultByCapability.get(String(entry.type))?.ok),
682
- locators: resultByCapability.get(String(entry.type))?.locators ?? {}
683
- }
684
- })),
685
- diff: blockedDrift,
686
- actions,
687
- postconditions,
688
- blockedDrift,
689
- retainedResources,
690
- destroyedResources,
691
- liveVerification: {
692
- ok: blockedDrift.length === 0,
693
- source: `reconcile-live-test:${mode}`,
694
- checkedAt: (/* @__PURE__ */ new Date()).toISOString(),
695
- issues: blockedDrift.map((entry) => entry.reason)
696
- }
697
- });
698
- return {
699
- provider,
700
- mode,
701
- runId,
702
- resourcePrefix: prefix,
703
- scenarioResults: results,
704
- coverage: {
705
- total: capabilities.length,
706
- passed: results.filter((result) => result.ok).length,
707
- failed: capabilities.length - results.filter((result) => result.ok).length,
708
- capabilities
709
- },
710
- createdResources,
711
- updatedResources,
712
- replacedResources,
713
- destroyedResources,
714
- retainedResources,
715
- cleanupDrift,
716
- report,
717
- ok: report.ok
718
- };
719
- }
720
- async function cloudflareRequestPayload(path, env, fetchImpl, init = {}) {
721
- const token = configuredValue(env, ["TREESEED_CLOUDFLARE_API_TOKEN"]);
722
- if (!token) throw new Error("Missing TREESEED_CLOUDFLARE_API_TOKEN.");
723
- const response = await fetchImpl(`https://api.cloudflare.com/client/v4${path}`, {
724
- ...init,
725
- headers: {
726
- Accept: "application/json",
727
- ...init.body ? { "Content-Type": "application/json" } : {},
728
- Authorization: `Bearer ${token}`,
729
- ...init.headers ?? {}
730
- }
731
- });
732
- const payload = await response.json().catch(() => ({}));
733
- if (!response.ok || payload.success === false) {
734
- const errors = Array.isArray(payload.errors) ? payload.errors.map((entry) => entry.message).filter(Boolean).join("; ") : "";
735
- throw new Error(`${response.status} ${response.statusText}${errors ? `: ${errors}` : ""}`);
736
- }
737
- return payload;
738
- }
739
- async function cloudflareRequest(path, env, fetchImpl, init = {}) {
740
- const payload = await cloudflareRequestPayload(path, env, fetchImpl, init);
741
- return payload.result;
742
- }
743
- function isTransientCloudflareError(error) {
744
- const message = error instanceof Error ? error.message : String(error);
745
- return /\b(500|502|503|504|520|521|522|523|524)\b|internal server error|unknown error occurred|temporar(?:y|ily)|timeout|rate limit/iu.test(message);
746
- }
747
- async function withCloudflareTransientRetry(operation, options = {}) {
748
- const attempts = Math.max(1, options.attempts ?? 4);
749
- const delayMs = Math.max(0, options.delayMs ?? 1500);
750
- let lastError;
751
- for (let attempt = 1; attempt <= attempts; attempt += 1) {
752
- try {
753
- return await operation();
754
- } catch (error) {
755
- lastError = error;
756
- if (!isTransientCloudflareError(error) || attempt >= attempts) break;
757
- await sleep(delayMs * attempt);
758
- }
759
- }
760
- throw lastError instanceof Error ? lastError : new Error(String(lastError));
761
- }
762
- async function cloudflareRawRequest(path, env, fetchImpl, init = {}) {
763
- const token = configuredValue(env, ["TREESEED_CLOUDFLARE_API_TOKEN"]);
764
- if (!token) throw new Error("Missing TREESEED_CLOUDFLARE_API_TOKEN.");
765
- const response = await fetchImpl(`https://api.cloudflare.com/client/v4${path}`, {
766
- ...init,
767
- headers: {
768
- Accept: "*/*",
769
- Authorization: `Bearer ${token}`,
770
- ...init.headers ?? {}
771
- }
772
- });
773
- const body = await response.text().catch(() => "");
774
- if (!response.ok) {
775
- throw new Error(`${response.status} ${response.statusText}${body ? `: ${body.slice(0, 300)}` : ""}`);
776
- }
777
- return body;
778
- }
779
- async function githubRequest(path, token, fetchImpl, init = {}) {
780
- const response = await fetchImpl(`https://api.github.com${path}`, {
781
- ...init,
782
- headers: {
783
- Accept: "application/vnd.github+json",
784
- ...init.body ? { "Content-Type": "application/json" } : {},
785
- Authorization: `Bearer ${token}`,
786
- "X-GitHub-Api-Version": "2022-11-28",
787
- ...init.headers ?? {}
788
- }
789
- });
790
- const payload = await response.json().catch(() => ({}));
791
- if (!response.ok) {
792
- throw new Error(`${response.status} ${response.statusText}${payload.message ? `: ${payload.message}` : ""}`);
793
- }
794
- return payload;
795
- }
796
- async function runSmokeProvider({
797
- provider,
798
- environment,
799
- prefix,
800
- mode,
801
- cwd,
802
- env,
803
- fetchImpl
804
- }) {
805
- if (provider === "railway") {
806
- if (!configuredValue(env, ["TREESEED_RAILWAY_API_TOKEN"])) {
807
- return PROVIDER_CAPABILITIES.railway.map((capability) => scenario({
808
- provider,
809
- mode,
810
- prefix,
811
- capability,
812
- ok: false,
813
- phase: "blocked",
814
- action: "blocked",
815
- reason: "Missing TREESEED_RAILWAY_API_TOKEN for Railway live reconciliation tests."
816
- }));
817
- }
818
- try {
819
- const workspace = await resolveRailwayWorkspaceContext({ env, fetchImpl });
820
- const projects = await listRailwayProjects({ workspaceId: workspace.id, env, fetchImpl });
821
- const apiProject = projects.find((project) => project.name === "treeseed-api") ?? projects[0] ?? null;
822
- const environments = apiProject ? await listRailwayEnvironments({ projectId: apiProject.id, env, fetchImpl }) : [];
823
- const selectedEnvironment = environments.find((candidate) => candidate.name === environment) ?? environments.find((candidate) => candidate.name === (environment === "prod" ? "production" : "staging")) ?? environments[0] ?? null;
824
- const services = apiProject ? await listRailwayServices({ projectId: apiProject.id, env, fetchImpl }) : [];
825
- const variables = apiProject && selectedEnvironment ? await listRailwayVariables({ projectId: apiProject.id, environmentId: selectedEnvironment.id, env, fetchImpl }).catch(() => ({})) : {};
826
- const volumes = apiProject ? await listRailwayVolumes({ projectId: apiProject.id, env, fetchImpl }).catch(() => []) : [];
827
- const serviceNames = services.map((service) => service.name);
828
- const base = {
829
- workspaceId: workspace.id,
830
- projectId: apiProject?.id ?? null,
831
- environmentId: selectedEnvironment?.id ?? null
832
- };
833
- return [
834
- scenario({ provider, mode, prefix, capability: "project", ok: projects.length > 0, phase: "smoke", action: "noop", reason: projects.length ? "Railway projects are observable." : "No Railway projects are visible.", locators: base }),
835
- scenario({ provider, mode, prefix, capability: "environment", ok: Boolean(selectedEnvironment), phase: "smoke", action: "noop", reason: selectedEnvironment ? "Railway environments are observable." : "No Railway environment is visible.", locators: base }),
836
- scenario({ provider, mode, prefix, capability: "service", ok: services.length > 0, phase: "smoke", action: "noop", reason: services.length ? "Railway services are observable." : "No Railway services are visible.", locators: base }),
837
- scenario({ provider, mode, prefix, capability: "image-service", ok: serviceNames.some((name) => /api|runner|treedx/iu.test(name)), phase: "smoke", action: "noop", reason: "Railway image service observation completed.", locators: base }),
838
- scenario({ provider, mode, prefix, capability: "postgres", ok: serviceNames.some((name) => /postgres/iu.test(name)), phase: "smoke", action: "noop", reason: "Railway PostgreSQL observation completed.", locators: base }),
839
- scenario({ provider, mode, prefix, capability: "volume", ok: volumes.length > 0, phase: "smoke", action: "noop", reason: "Railway volume observation completed.", locators: base }),
840
- scenario({ provider, mode, prefix, capability: "domain", ok: true, phase: "smoke", action: "noop", reason: "Railway domain API uses authenticated provider surface.", locators: base }),
841
- scenario({ provider, mode, prefix, capability: "variables", ok: Boolean(selectedEnvironment), phase: "smoke", action: "noop", reason: `Railway variables API observed ${Object.keys(variables).length} variables.`, locators: base }),
842
- scenario({ provider, mode, prefix, capability: "deployment-health", ok: services.length > 0, phase: "smoke", action: "noop", reason: "Railway deployment-health inspection has observable services.", locators: base }),
843
- scenario({ provider, mode, prefix, capability: "capacity-provider-runtime-assignment-proof", ok: true, phase: "smoke", action: "noop", reason: "Railway capacity runtime proof is available through explicit acceptance mode.", locators: base })
844
- ];
845
- } catch (error) {
846
- const reason = error instanceof Error ? error.message : String(error);
847
- return PROVIDER_CAPABILITIES.railway.map((capability) => scenario({ provider, mode, prefix, capability, ok: false, phase: "blocked", action: "blocked", reason }));
848
- }
849
- }
850
- if (provider === "cloudflare") {
851
- const accountId = configuredValue(env, ["TREESEED_CLOUDFLARE_ACCOUNT_ID"]);
852
- if (!configuredValue(env, ["TREESEED_CLOUDFLARE_API_TOKEN"]) || !accountId) {
853
- return PROVIDER_CAPABILITIES.cloudflare.map((capability) => scenario({
854
- provider,
855
- mode,
856
- prefix,
857
- capability,
858
- ok: false,
859
- phase: "blocked",
860
- action: "blocked",
861
- reason: "Missing TREESEED_CLOUDFLARE_API_TOKEN or TREESEED_CLOUDFLARE_ACCOUNT_ID for Cloudflare live reconciliation tests."
862
- }));
863
- }
864
- const checks = [
865
- ["pages", `/accounts/${accountId}/pages/projects?per_page=1`],
866
- ["worker", `/accounts/${accountId}/workers/services?per_page=1`],
867
- ["d1", `/accounts/${accountId}/d1/database?per_page=1`],
868
- ["r2", `/accounts/${accountId}/r2/buckets?per_page=1`],
869
- ["kv", `/accounts/${accountId}/storage/kv/namespaces?per_page=1`],
870
- ["queue", `/accounts/${accountId}/queues?per_page=1`],
871
- ["dns", "/zones?per_page=1"],
872
- ["turnstile", `/accounts/${accountId}/challenges/widgets?per_page=1`],
873
- ["secrets", `/accounts/${accountId}/workers/services?per_page=1`],
874
- ["cache-rules", "/zones?per_page=1"]
875
- ];
876
- return Promise.all(checks.map(async ([capability, path]) => {
877
- try {
878
- await cloudflareRequest(path, env, fetchImpl);
879
- return scenario({ provider, mode, prefix, capability, ok: true, phase: "smoke", action: "noop", reason: "Cloudflare API surface is reachable.", locators: { accountId } });
880
- } catch (error) {
881
- return scenario({ provider, mode, prefix, capability, ok: false, phase: "blocked", action: "blocked", reason: error instanceof Error ? error.message : String(error), locators: { accountId } });
882
- }
883
- }));
884
- }
885
- if (provider === "github") {
886
- let repository = "";
887
- try {
888
- repository = resolveCurrentGitHubRepository(cwd, env);
889
- const credential = resolveGitHubCredentialForRepository(repository, { values: env, env });
890
- if (!credential.token) {
891
- throw new Error(`Missing GitHub credential for ${repository}; expected ${credential.envName} or TREESEED_GITHUB_TOKEN fallback.`);
892
- }
893
- const [owner, repo] = credential.repository.split("/");
894
- const checks = [
895
- ["environment", `/repos/${owner}/${repo}/environments?per_page=1`],
896
- ["secret", `/repos/${owner}/${repo}/actions/secrets?per_page=1`],
897
- ["variable", `/repos/${owner}/${repo}/actions/variables?per_page=1`],
898
- ["workflow-dispatch", `/repos/${owner}/${repo}/actions/workflows?per_page=1`],
899
- ["workflow-observation", `/repos/${owner}/${repo}/actions/runs?per_page=1`]
900
- ];
901
- const results = await Promise.all(checks.map(async ([capability, path]) => {
902
- try {
903
- await githubRequest(path, credential.token ?? "", fetchImpl);
904
- return scenario({ provider, mode, prefix, capability, ok: true, phase: "smoke", action: "noop", reason: "GitHub API surface is reachable.", locators: { repository: credential.repository, credentialKey: credential.envName } });
905
- } catch (error) {
906
- return scenario({ provider, mode, prefix, capability, ok: false, phase: "blocked", action: "blocked", reason: error instanceof Error ? error.message : String(error), locators: { repository: credential.repository, credentialKey: credential.envName } });
907
- }
908
- }));
909
- results.push(scenario({ provider, mode, prefix, capability: "repository-scoped-token", ok: true, phase: "smoke", action: "noop", reason: credential.fallbackUsed ? "GitHub credential resolved through fallback." : "GitHub credential resolved through repository-scoped key.", locators: { repository: credential.repository, credentialKey: credential.envName } }));
910
- return results;
911
- } catch (error) {
912
- const reason = error instanceof Error ? error.message : String(error);
913
- return PROVIDER_CAPABILITIES.github.map((capability) => scenario({ provider, mode, prefix, capability, ok: false, phase: "blocked", action: "blocked", reason, locators: { repository } }));
914
- }
915
- }
916
- return PROVIDER_CAPABILITIES.local.map((capability) => scenario({
917
- provider,
918
- mode,
919
- prefix,
920
- capability,
921
- ok: true,
922
- phase: "smoke",
923
- action: "noop",
924
- reason: "Local reconciliation live-test capability is available in-process."
925
- }));
926
- }
927
- async function requireAcceptanceConfig(provider, cwd, env, fetchImpl) {
928
- const missing = [];
929
- if (provider === "railway") {
930
- if (!configuredValue(env, ["TREESEED_RAILWAY_API_TOKEN"])) missing.push("TREESEED_RAILWAY_API_TOKEN");
931
- if (!resolveLiveTestDomain(cwd, env)) missing.push("TREESEED_LIVE_TEST_DOMAIN or treeseed.site.yaml siteUrl");
932
- missing.push(...capacityAcceptanceConfig(env).missing);
933
- }
934
- if (provider === "cloudflare") {
935
- if (!configuredValue(env, ["TREESEED_CLOUDFLARE_API_TOKEN"])) missing.push("TREESEED_CLOUDFLARE_API_TOKEN");
936
- if (!configuredValue(env, ["TREESEED_CLOUDFLARE_ACCOUNT_ID"])) missing.push("TREESEED_CLOUDFLARE_ACCOUNT_ID");
937
- const domain = resolveLiveTestDomain(cwd, env);
938
- if (!domain) {
939
- missing.push("TREESEED_LIVE_TEST_DOMAIN or treeseed.site.yaml siteUrl");
940
- } else if (configuredValue(env, ["TREESEED_CLOUDFLARE_API_TOKEN"]) && !await resolveCloudflareZoneId(domain, env, fetchImpl)) {
941
- missing.push("TREESEED_LIVE_TEST_CLOUDFLARE_ZONE_ID or visible Cloudflare zone for live-test domain");
942
- }
943
- }
944
- if (provider === "github") {
945
- if (!configuredValue(env, ["TREESEED_GITHUB_TOKEN"])) {
946
- try {
947
- const repository = configuredValue(env, ["TREESEED_REPOSITORY", "GITHUB_REPOSITORY"]);
948
- const credential = repository ? resolveGitHubCredentialForRepository(repository, { values: env, env }) : null;
949
- if (!credential?.token) missing.push("TREESEED_GITHUB_TOKEN or repository-scoped TREESEED_GITHUB_TOKEN_*");
950
- } catch {
951
- missing.push("TREESEED_GITHUB_TOKEN or repository-scoped TREESEED_GITHUB_TOKEN_*");
952
- }
953
- }
954
- }
955
- return missing;
956
- }
957
- async function cleanupRailwayPrefixedProjects(environment, env, fetchImpl) {
958
- const prefixRoot = providerPrefixRoot(environment, "railway");
959
- const workspace = await resolveRailwayWorkspaceContext({ env, fetchImpl });
960
- const projects = await listRailwayProjects({ workspaceId: workspace.id, env, fetchImpl });
961
- const prefixed = projects.filter((project) => !project.deletedAt && project.name.startsWith(prefixRoot));
962
- const destroyed = [];
963
- for (const project of prefixed) {
964
- await deleteRailwayProject({ projectId: project.id, env, fetchImpl });
965
- destroyed.push(node("railway", environment, "project", project.name, { id: project.id, deleted: true }));
966
- }
967
- const refreshed = await listRailwayProjects({ workspaceId: workspace.id, env, fetchImpl });
968
- const remaining = refreshed.filter((project) => !project.deletedAt && project.name.startsWith(prefixRoot));
969
- return { workspace, destroyed, remaining };
970
- }
971
- async function runRailwayCleanup(environment, prefix, mode, env, fetchImpl) {
972
- try {
973
- const cleanup = await cleanupRailwayPrefixedProjects(environment, env, fetchImpl);
974
- const results = PROVIDER_CAPABILITIES.railway.map((capability) => scenario({
975
- provider: "railway",
976
- mode,
977
- prefix,
978
- capability,
979
- ok: cleanup.remaining.length === 0,
980
- phase: "cleanup",
981
- action: cleanup.destroyed.length > 0 ? "delete" : "noop",
982
- reason: cleanup.remaining.length === 0 ? `Railway cleanup removed ${cleanup.destroyed.length} prefixed test project(s).` : `Railway cleanup left ${cleanup.remaining.length} prefixed test project(s).`,
983
- destroyedResources: cleanup.destroyed,
984
- issues: cleanup.remaining.map((project) => `Remaining project ${project.name} (${project.id})`)
985
- }));
986
- const cleanupDrift = cleanup.remaining.map((project) => blocking("railway", "project", `Railway live-test project ${project.name} (${project.id}) remained after cleanup.`));
987
- return { results, cleanupDrift };
988
- } catch (error) {
989
- const reason = error instanceof Error ? error.message : String(error);
990
- return {
991
- results: PROVIDER_CAPABILITIES.railway.map((capability) => scenario({ provider: "railway", mode, prefix, capability, ok: false, phase: "blocked", action: "blocked", reason })),
992
- cleanupDrift: [blocking("railway", "project", reason)]
993
- };
994
- }
995
- }
996
- async function runRailwayAcceptance(cwd, environment, runId, prefix, env, fetchImpl, onProgress) {
997
- const mode = "acceptance";
998
- const missing = await requireAcceptanceConfig("railway", cwd, env, fetchImpl);
999
- if (missing.length > 0) {
1000
- return {
1001
- results: PROVIDER_CAPABILITIES.railway.map((capability) => scenario({
1002
- provider: "railway",
1003
- mode,
1004
- prefix,
1005
- capability,
1006
- ok: false,
1007
- phase: "blocked",
1008
- action: "blocked",
1009
- reason: `Missing Railway acceptance configuration: ${missing.join(", ")}.`
1010
- })),
1011
- cleanupDrift: []
1012
- };
1013
- }
1014
- const cleanupBefore = await cleanupRailwayPrefixedProjects(environment, env, fetchImpl);
1015
- if (cleanupBefore.remaining.length > 0) {
1016
- return {
1017
- results: PROVIDER_CAPABILITIES.railway.map((capability) => scenario({
1018
- provider: "railway",
1019
- mode,
1020
- prefix,
1021
- capability,
1022
- ok: false,
1023
- phase: "blocked",
1024
- action: "blocked",
1025
- reason: `Railway acceptance refused to create a project because ${cleanupBefore.remaining.length} prefixed project(s) remain after cleanup.`
1026
- })),
1027
- cleanupDrift: cleanupBefore.remaining.map((project) => blocking("railway", "project", `Prefixed Railway project ${project.name} (${project.id}) remained before acceptance.`))
1028
- };
1029
- }
1030
- const domainRoot = resolveLiveTestDomain(cwd, env);
1031
- const projectName = prefix;
1032
- const envName = "staging";
1033
- const serviceName = `${prefix}-web`;
1034
- const statefulName = `${prefix}-s01`;
1035
- const volumeName = `${statefulName}-volume`;
1036
- const postgresName = `${prefix}-pg`;
1037
- const customDomain = `${prefix}.${domainRoot}`.replace(/_/gu, "-");
1038
- const results = [];
1039
- const cleanupDrift = [];
1040
- let projectId = "";
1041
- try {
1042
- const project = await ensureRailwayProject({ projectName, defaultEnvironmentName: envName, env, fetchImpl });
1043
- projectId = project.project.id;
1044
- results.push(await measuredScenario({
1045
- provider: "railway",
1046
- mode,
1047
- environment,
1048
- runId,
1049
- prefix,
1050
- capability: "project",
1051
- phase: "create",
1052
- action: project.created ? "create" : "adopt",
1053
- startMessage: "railway:project: create/adopt started",
1054
- successReason: "Railway acceptance created exactly one test project for all Railway scenarios and observed it by id.",
1055
- locators: { projectId },
1056
- createdResources: [providerNode("railway", environment, "project", projectName, { id: projectId })],
1057
- onProgress
1058
- }, async () => waitForLiveObservation(
1059
- `Railway project ${projectName}`,
1060
- () => listRailwayProjects({ env, fetchImpl }).catch(() => [project.project]),
1061
- (projects) => projects.some((candidate) => candidate.id === projectId)
1062
- )));
1063
- const environmentResult = await ensureRailwayEnvironment({ projectId, environmentName: envName, env, fetchImpl });
1064
- const environmentId = environmentResult.environment.id;
1065
- results.push(await measuredScenario({
1066
- provider: "railway",
1067
- mode,
1068
- environment,
1069
- runId,
1070
- prefix,
1071
- capability: "environment",
1072
- phase: "create",
1073
- action: environmentResult.created ? "create" : "adopt",
1074
- startMessage: "railway:environment: create/adopt started",
1075
- successReason: "Railway acceptance created the project-scoped test environment and observed it live.",
1076
- locators: { projectId, environmentId },
1077
- createdResources: [providerNode("railway", environment, "environment", envName, { id: environmentId })],
1078
- onProgress
1079
- }, async () => waitForLiveObservation(
1080
- `Railway environment ${envName}`,
1081
- () => listRailwayEnvironments({ projectId, env, fetchImpl }),
1082
- (environments) => environments.some((candidate) => candidate.id === environmentId)
1083
- )));
1084
- const service = await ensureRailwayService({
1085
- projectId,
1086
- environmentId,
1087
- serviceName,
1088
- imageRef: configuredValue(env, ["TREESEED_LIVE_TEST_RAILWAY_IMAGE"]) || "nginxdemos/hello:latest",
1089
- env,
1090
- fetchImpl
1091
- });
1092
- const serviceId = service.service.id;
1093
- const stateful = await ensureRailwayService({
1094
- projectId,
1095
- environmentId,
1096
- serviceName: statefulName,
1097
- imageRef: configuredValue(env, ["TREESEED_LIVE_TEST_RAILWAY_STATEFUL_IMAGE"]) || "nginxdemos/hello:latest",
1098
- env,
1099
- fetchImpl
1100
- });
1101
- const statefulId = stateful.service.id;
1102
- results.push(await measuredScenario({
1103
- provider: "railway",
1104
- mode,
1105
- environment,
1106
- runId,
1107
- prefix,
1108
- capability: "service",
1109
- phase: "create",
1110
- action: service.created || stateful.created ? "create" : "adopt",
1111
- startMessage: "railway:service: create/adopt started",
1112
- successReason: "Railway acceptance created image and stateful services inside the single test project and observed both live.",
1113
- locators: { projectId, environmentId, serviceId, statefulId },
1114
- createdResources: [
1115
- providerNode("railway", environment, "service", serviceName, { id: serviceId }),
1116
- providerNode("railway", environment, "service", statefulName, { id: statefulId })
1117
- ],
1118
- onProgress
1119
- }, async () => waitForLiveObservation(
1120
- `Railway services ${serviceName}, ${statefulName}`,
1121
- () => listRailwayServices({ projectId, env, fetchImpl }),
1122
- (services) => services.some((candidate) => candidate.id === serviceId) && services.some((candidate) => candidate.id === statefulId)
1123
- )));
1124
- await upsertRailwayVariables({
1125
- projectId,
1126
- environmentId,
1127
- serviceId,
1128
- variables: {
1129
- TREESEED_LIVE_TEST_RUN_ID: runId,
1130
- TREESEED_LIVE_TEST_PHASE: "created"
1131
- },
1132
- env,
1133
- fetchImpl
1134
- });
1135
- await upsertRailwayVariables({
1136
- projectId,
1137
- environmentId,
1138
- serviceId,
1139
- variables: {
1140
- TREESEED_LIVE_TEST_PHASE: "updated"
1141
- },
1142
- env,
1143
- fetchImpl
1144
- });
1145
- results.push(await measuredScenario({
1146
- provider: "railway",
1147
- mode,
1148
- environment,
1149
- runId,
1150
- prefix,
1151
- capability: "variables",
1152
- phase: "update",
1153
- action: "update",
1154
- startMessage: "railway:variables: read-back started",
1155
- successReason: "Railway acceptance created, updated, and observed service variables.",
1156
- locators: { projectId, environmentId, serviceId },
1157
- updatedResources: (value) => [providerNode("railway", environment, "variables", `${serviceName}:variables`, { keys: Object.keys(value).sort() })],
1158
- onProgress
1159
- }, async () => waitForLiveObservation(
1160
- "Railway updated service variables",
1161
- () => listRailwayVariables({ projectId, environmentId, serviceId, env, fetchImpl }),
1162
- (variables) => variables.TREESEED_LIVE_TEST_PHASE === "updated"
1163
- )));
1164
- const volume = await ensureRailwayServiceVolume({
1165
- projectId,
1166
- environmentId,
1167
- serviceId: statefulId,
1168
- name: volumeName,
1169
- mountPath: "/data",
1170
- env,
1171
- fetchImpl,
1172
- settleAttempts: 6,
1173
- settleDelayMs: 2500
1174
- });
1175
- results.push(await measuredScenario({
1176
- provider: "railway",
1177
- mode,
1178
- environment,
1179
- runId,
1180
- prefix,
1181
- capability: "volume",
1182
- phase: volume.created ? "create" : "replace",
1183
- action: volume.created ? "create" : "reattach",
1184
- startMessage: "railway:volume: live read-back started",
1185
- successReason: "Railway acceptance attached/reconciled a stateful service volume and observed it live.",
1186
- locators: { projectId, environmentId, serviceId: statefulId, volumeId: volume.volume.id },
1187
- createdResources: [providerNode("railway", environment, "volume", volumeName, { id: volume.volume.id, mountPath: "/data" })],
1188
- onProgress
1189
- }, async () => waitForLiveObservation(
1190
- `Railway volume ${volumeName}`,
1191
- () => listRailwayVolumes({ projectId, env, fetchImpl }),
1192
- (volumes) => volumes.some((candidate) => candidate.id === volume.volume.id || candidate.name === volumeName)
1193
- )));
1194
- const postgres = await ensureRailwayPostgresService({ projectId, environmentId, serviceName: postgresName, env, fetchImpl, maxAttempts: 80 });
1195
- results.push(await measuredScenario({
1196
- provider: "railway",
1197
- mode,
1198
- environment,
1199
- runId,
1200
- prefix,
1201
- capability: "postgres",
1202
- phase: "create",
1203
- action: postgres.created ? "create" : "adopt",
1204
- startMessage: "railway:postgres: live read-back started",
1205
- successReason: postgres.proof.message,
1206
- locators: { projectId, environmentId, serviceId: postgres.service.id },
1207
- createdResources: [providerNode("railway", environment, "postgres", postgresName, { id: postgres.service.id, proof: postgres.proof })],
1208
- onProgress
1209
- }, async () => {
1210
- if (!postgres.proof.ok) throw new Error(postgres.proof.message);
1211
- return waitForLiveObservation(
1212
- `Railway Postgres service ${postgresName}`,
1213
- () => listRailwayServices({ projectId, env, fetchImpl }),
1214
- (services) => services.some((candidate) => candidate.id === postgres.service.id)
1215
- );
1216
- }));
1217
- const generatedDomain = await ensureRailwayGeneratedServiceDomain({ projectId, environmentId, serviceId, targetPort: 80, env, fetchImpl });
1218
- let customDomainCreated = false;
1219
- try {
1220
- await ensureRailwayCustomDomain({ projectId, environmentId, serviceId, domain: customDomain, env, fetchImpl });
1221
- customDomainCreated = true;
1222
- } catch {
1223
- customDomainCreated = false;
1224
- }
1225
- results.push(await measuredScenario({
1226
- provider: "railway",
1227
- mode,
1228
- environment,
1229
- runId,
1230
- prefix,
1231
- capability: "domain",
1232
- phase: "create",
1233
- action: "create",
1234
- startMessage: "railway:domain: live read-back started",
1235
- successReason: customDomainCreated ? "Railway acceptance created generated and custom domain resources." : "Railway acceptance created a generated domain but custom domain creation did not converge.",
1236
- locators: { projectId, environmentId, serviceId, generatedDomain: generatedDomain.domain.domain, customDomain },
1237
- createdResources: [providerNode("railway", environment, "domain", generatedDomain.domain.domain, { id: generatedDomain.domain.id })],
1238
- onProgress
1239
- }, async () => {
1240
- if (!generatedDomain.domain.domain || !customDomainCreated) throw new Error("Railway generated/custom domain postconditions did not converge.");
1241
- return generatedDomain;
1242
- }));
1243
- results.push(await measuredScenario({
1244
- provider: "railway",
1245
- mode,
1246
- environment,
1247
- runId,
1248
- prefix,
1249
- capability: "image-service",
1250
- phase: "verify",
1251
- action: "noop",
1252
- startMessage: "railway:image-service: verifying image-backed service",
1253
- successReason: "Railway acceptance verified image service creation through the project-scoped service API.",
1254
- locators: { projectId, environmentId, serviceId },
1255
- onProgress
1256
- }, async () => waitForLiveObservation(
1257
- `Railway image service ${serviceName}`,
1258
- () => listRailwayServices({ projectId, env, fetchImpl }),
1259
- (services) => services.some((candidate) => candidate.id === serviceId)
1260
- )));
1261
- results.push(await measuredScenario({
1262
- provider: "railway",
1263
- mode,
1264
- environment,
1265
- runId,
1266
- prefix,
1267
- capability: "deployment-health",
1268
- phase: "verify",
1269
- action: "noop",
1270
- startMessage: "railway:deployment-health: verifying deployment observation",
1271
- successReason: "Railway acceptance observed image services after deployment submission; app-specific deep HTTP health remains enforced by hosting verify/apply.",
1272
- locators: { projectId, environmentId, serviceId },
1273
- onProgress
1274
- }, async () => waitForLiveObservation(
1275
- `Railway deployment service ${serviceName}`,
1276
- () => listRailwayServices({ projectId, env, fetchImpl }),
1277
- (services) => services.some((candidate) => candidate.id === serviceId)
1278
- )));
1279
- results.push(await measuredScenario({
1280
- provider: "railway",
1281
- mode,
1282
- environment,
1283
- runId,
1284
- prefix,
1285
- capability: "capacity-provider-runtime-assignment-proof",
1286
- phase: "verify",
1287
- action: "noop",
1288
- startMessage: "railway:capacity-provider-runtime-assignment-proof: running assignment lifecycle proof",
1289
- successReason: "Railway capacity acceptance created a diagnostic assignment, leased it through the provider protocol, emitted mode-run telemetry, and completed it.",
1290
- locators: { projectId, environmentId },
1291
- retainedResources: (value) => {
1292
- const proof = value;
1293
- return [providerNode("railway", environment, "capacity-runtime-proof", proof.assignmentId, {
1294
- sessionId: proof.sessionId,
1295
- modeRunId: proof.modeRunId,
1296
- finalStatus: proof.finalStatus,
1297
- mode: proof.mode,
1298
- modeRunCount: proof.modeRunCount
1299
- })];
1300
- },
1301
- onProgress
1302
- }, async () => runCapacityProviderAssignmentProof({ provider: "railway", environment, runId, prefix, env, fetchImpl })));
1303
- } catch (error) {
1304
- const reason = error instanceof Error ? error.message : String(error);
1305
- for (const capability of PROVIDER_CAPABILITIES.railway) {
1306
- if (!results.some((result) => result.capability === capability)) {
1307
- results.push(scenario({ provider: "railway", mode, prefix, capability, ok: false, phase: "blocked", action: "blocked", reason, locators: { projectId: projectId || null } }));
1308
- }
1309
- }
1310
- } finally {
1311
- if (projectId) {
1312
- await deleteRailwayProject({ projectId, env, fetchImpl }).catch((error) => {
1313
- cleanupDrift.push(blocking("railway", "project", `Railway acceptance cleanup failed for project ${projectId}: ${error instanceof Error ? error.message : String(error)}`));
1314
- });
1315
- }
1316
- const cleanupAfter = await cleanupRailwayPrefixedProjects(environment, env, fetchImpl).catch((error) => {
1317
- cleanupDrift.push(blocking("railway", "project", `Railway acceptance final cleanup scan failed: ${error instanceof Error ? error.message : String(error)}`));
1318
- return null;
1319
- });
1320
- if (cleanupAfter) {
1321
- cleanupDrift.push(...cleanupAfter.remaining.map((project) => blocking("railway", "project", `Railway live-test project ${project.name} (${project.id}) remained after acceptance cleanup.`)));
1322
- if (cleanupAfter.destroyed.length > 0) {
1323
- for (const result of results) {
1324
- result.destroyedResources.push(...cleanupAfter.destroyed);
1325
- }
1326
- }
1327
- }
1328
- }
1329
- return { results, cleanupDrift };
1330
- }
1331
- function cloudflareName(value) {
1332
- if (value && typeof value === "object") {
1333
- const record = value;
1334
- for (const key of ["name", "title", "queue_name"]) {
1335
- const candidate = record[key];
1336
- if (typeof candidate === "string" && candidate.trim()) return candidate.trim();
1337
- }
1338
- }
1339
- return "";
1340
- }
1341
- function cloudflareId(value) {
1342
- if (value && typeof value === "object") {
1343
- const record = value;
1344
- for (const key of ["id", "uuid", "queue_id"]) {
1345
- const candidate = record[key];
1346
- if (typeof candidate === "string" && candidate.trim()) return candidate.trim();
1347
- }
1348
- }
1349
- return "";
1350
- }
1351
- function cloudflareListItems(value, keys = []) {
1352
- if (Array.isArray(value)) return value;
1353
- if (!value || typeof value !== "object") return [];
1354
- const record = value;
1355
- for (const key of [...keys, "items", "buckets", "databases", "queues", "widgets", "namespaces"]) {
1356
- const candidate = record[key];
1357
- if (Array.isArray(candidate)) return candidate;
1358
- }
1359
- return [];
1360
- }
1361
- async function runCloudflareCleanup(cwd, environment, prefix, mode, env, fetchImpl) {
1362
- const accountId = configuredValue(env, ["TREESEED_CLOUDFLARE_ACCOUNT_ID"]);
1363
- const domain = resolveLiveTestDomain(cwd, env);
1364
- const zoneId = domain ? await resolveCloudflareZoneId(domain, env, fetchImpl) : configuredValue(env, ["TREESEED_LIVE_TEST_CLOUDFLARE_ZONE_ID", "CLOUDFLARE_ZONE_ID"]);
1365
- const destroyed = [];
1366
- const cleanupDrift = [];
1367
- const prefixRoot = mode === "cleanup" ? providerPrefixRoot(environment, "cloudflare") : prefix;
1368
- const attempt = async (type, id, fn) => {
1369
- try {
1370
- await fn();
1371
- destroyed.push(node("cloudflare", environment, type, id, { deleted: true }));
1372
- } catch (error) {
1373
- cleanupDrift.push(blocking("cloudflare", type, `Cloudflare cleanup failed for ${id}: ${error instanceof Error ? error.message : String(error)}`));
1374
- }
1375
- };
1376
- const list = async (type, path, keys = []) => {
1377
- try {
1378
- return cloudflareListItems(await cloudflareRequest(path, env, fetchImpl), keys);
1379
- } catch (error) {
1380
- cleanupDrift.push(blocking("cloudflare", type, `Cloudflare cleanup could not inspect ${path}: ${error instanceof Error ? error.message : String(error)}`));
1381
- return [];
1382
- }
1383
- };
1384
- const listPaginated = async (type, path, keys = [], perPage = 10) => {
1385
- const items = [];
1386
- let totalPages = 1;
1387
- for (let page = 1; page <= totalPages; page += 1) {
1388
- const separator = path.includes("?") ? "&" : "?";
1389
- const pagePath = `${path}${separator}page=${page}&per_page=${perPage}`;
1390
- try {
1391
- const payload = await cloudflareRequestPayload(pagePath, env, fetchImpl);
1392
- items.push(...cloudflareListItems(payload.result, keys));
1393
- const reportedTotalPages = payload.result_info?.total_pages;
1394
- if (typeof reportedTotalPages === "number" && Number.isFinite(reportedTotalPages) && reportedTotalPages > totalPages) {
1395
- totalPages = Math.min(Math.ceil(reportedTotalPages), 100);
1396
- }
1397
- } catch (error) {
1398
- cleanupDrift.push(blocking("cloudflare", type, `Cloudflare cleanup could not inspect ${pagePath}: ${error instanceof Error ? error.message : String(error)}`));
1399
- break;
1400
- }
1401
- }
1402
- return items;
1403
- };
1404
- if (!configuredValue(env, ["TREESEED_CLOUDFLARE_API_TOKEN"]) || !accountId) {
1405
- cleanupDrift.push(blocking("cloudflare", "account", "Cloudflare cleanup requires TREESEED_CLOUDFLARE_API_TOKEN and TREESEED_CLOUDFLARE_ACCOUNT_ID."));
1406
- }
1407
- if (accountId && configuredValue(env, ["TREESEED_CLOUDFLARE_API_TOKEN"])) {
1408
- if (mode === "acceptance") {
1409
- await attempt("worker", prefix, () => cloudflareRequest(`/accounts/${accountId}/workers/scripts/${prefix}`, env, fetchImpl, { method: "DELETE" }).catch((error) => {
1410
- const message = error instanceof Error ? error.message : String(error);
1411
- if (/404|not found/iu.test(message)) return null;
1412
- throw error;
1413
- }));
1414
- }
1415
- for (const worker of await list("worker", `/accounts/${accountId}/workers/services?per_page=100`)) {
1416
- const name = cloudflareName(worker);
1417
- if (name.startsWith(prefixRoot)) await attempt("worker", name, () => cloudflareRequest(`/accounts/${accountId}/workers/scripts/${name}`, env, fetchImpl, { method: "DELETE" }));
1418
- }
1419
- for (const project of await listPaginated("pages", `/accounts/${accountId}/pages/projects`)) {
1420
- const name = cloudflareName(project);
1421
- if (name.startsWith(prefixRoot)) await attempt("pages", name, () => cloudflareRequest(`/accounts/${accountId}/pages/projects/${name}`, env, fetchImpl, { method: "DELETE" }));
1422
- }
1423
- for (const bucket of await list("r2", `/accounts/${accountId}/r2/buckets?per_page=100`, ["buckets"])) {
1424
- const name = cloudflareName(bucket);
1425
- if (name.startsWith(prefixRoot)) await attempt("r2", name, () => cloudflareRequest(`/accounts/${accountId}/r2/buckets/${name}`, env, fetchImpl, { method: "DELETE" }));
1426
- }
1427
- for (const namespace of await list("kv", `/accounts/${accountId}/storage/kv/namespaces?per_page=100`)) {
1428
- const name = cloudflareName(namespace);
1429
- const id = cloudflareId(namespace);
1430
- if (name.startsWith(prefixRoot) && id) await attempt("kv", id, () => cloudflareRequest(`/accounts/${accountId}/storage/kv/namespaces/${id}`, env, fetchImpl, { method: "DELETE" }));
1431
- }
1432
- for (const database of await list("d1", `/accounts/${accountId}/d1/database?per_page=100`)) {
1433
- const name = cloudflareName(database);
1434
- const id = cloudflareId(database);
1435
- if (name.startsWith(prefixRoot) && id) await attempt("d1", id, () => cloudflareRequest(`/accounts/${accountId}/d1/database/${id}`, env, fetchImpl, { method: "DELETE" }));
1436
- }
1437
- for (const queue of await list("queue", `/accounts/${accountId}/queues?per_page=100`, ["queues"])) {
1438
- const name = cloudflareName(queue);
1439
- const id = cloudflareId(queue);
1440
- if (name.startsWith(prefixRoot) && id) await attempt("queue", id, () => cloudflareRequest(`/accounts/${accountId}/queues/${id}`, env, fetchImpl, { method: "DELETE" }));
1441
- }
1442
- for (const widget of await list("turnstile", `/accounts/${accountId}/challenges/widgets?per_page=100`)) {
1443
- const name = cloudflareName(widget);
1444
- const id = cloudflareId(widget);
1445
- if (name.startsWith(prefixRoot) && id) await attempt("turnstile", id, () => cloudflareRequest(`/accounts/${accountId}/challenges/widgets/${id}`, env, fetchImpl, { method: "DELETE" }));
1446
- }
1447
- }
1448
- if (zoneId && configuredValue(env, ["TREESEED_CLOUDFLARE_API_TOKEN"])) {
1449
- for (const record of await list("dns", `/zones/${zoneId}/dns_records?per_page=100`)) {
1450
- const name = cloudflareName(record);
1451
- const id = cloudflareId(record);
1452
- if (name.startsWith(prefixRoot) && id) await attempt("dns", id, () => cloudflareRequest(`/zones/${zoneId}/dns_records/${id}`, env, fetchImpl, { method: "DELETE" }));
1453
- }
1454
- }
1455
- const results = PROVIDER_CAPABILITIES.cloudflare.map((capability) => scenario({
1456
- provider: "cloudflare",
1457
- mode,
1458
- prefix,
1459
- capability,
1460
- ok: cleanupDrift.length === 0,
1461
- phase: "cleanup",
1462
- action: destroyed.some((resource) => resource.type === capability) ? "delete" : "noop",
1463
- reason: cleanupDrift.length === 0 ? `Cloudflare cleanup removed ${destroyed.filter((resource) => resource.type === capability).length} ${capability} resource(s).` : "Cloudflare cleanup left blocking drift.",
1464
- destroyedResources: destroyed.filter((resource) => resource.type === capability)
1465
- }));
1466
- return { results, cleanupDrift };
1467
- }
1468
- async function runCloudflareAcceptance(cwd, environment, runId, prefix, env, fetchImpl, onProgress) {
1469
- const mode = "acceptance";
1470
- const missing = await requireAcceptanceConfig("cloudflare", cwd, env, fetchImpl);
1471
- if (missing.length > 0) {
1472
- return {
1473
- results: PROVIDER_CAPABILITIES.cloudflare.map((capability) => scenario({ provider: "cloudflare", mode, prefix, capability, ok: false, phase: "blocked", action: "blocked", reason: `Missing Cloudflare acceptance configuration: ${missing.join(", ")}.` })),
1474
- cleanupDrift: []
1475
- };
1476
- }
1477
- emitProgress(onProgress, { provider: "cloudflare", mode, environment, runId, resourcePrefix: prefix, phase: "cleanup", message: `cloudflare: removing old live-test resources for ${prefix}` });
1478
- await runCloudflareCleanup(cwd, environment, prefix, mode, env, fetchImpl);
1479
- const accountId = configuredValue(env, ["TREESEED_CLOUDFLARE_ACCOUNT_ID"]);
1480
- const domain = resolveLiveTestDomain(cwd, env);
1481
- const zoneId = await resolveCloudflareZoneId(domain, env, fetchImpl);
1482
- const results = [];
1483
- const created = [];
1484
- const attempt = async (capability, type, create, verify) => {
1485
- const started = /* @__PURE__ */ new Date();
1486
- const startedMs = performance.now();
1487
- emitProgress(onProgress, { provider: "cloudflare", mode, environment, runId, resourcePrefix: prefix, capability, phase: "create", message: `cloudflare:${capability}: create/update started` });
1488
- try {
1489
- const result = await create();
1490
- emitProgress(onProgress, { provider: "cloudflare", mode, environment, runId, resourcePrefix: prefix, capability, phase: "verify", message: `cloudflare:${capability}: waiting for live observation` });
1491
- const observed = await verify(result);
1492
- const completed = /* @__PURE__ */ new Date();
1493
- const createdNode = providerNode("cloudflare", environment, type, `${prefix}:${type}`, { result, observed });
1494
- created.push(createdNode);
1495
- const durationMs = Math.max(1, Math.ceil(performance.now() - startedMs));
1496
- results.push(scenario({
1497
- provider: "cloudflare",
1498
- mode,
1499
- prefix,
1500
- capability,
1501
- ok: true,
1502
- phase: capability === "cache-rules" ? "verify" : "create",
1503
- action: capability === "cache-rules" ? "noop" : "create",
1504
- reason: capability === "cache-rules" ? "Cloudflare acceptance observed cache-rules API access." : `Cloudflare acceptance created ${capability} and verified it with a live read-back.`,
1505
- locators: { accountId, zoneId },
1506
- createdResources: capability === "cache-rules" ? [] : [createdNode],
1507
- startedAt: started.toISOString(),
1508
- completedAt: completed.toISOString(),
1509
- durationMs
1510
- }));
1511
- emitProgress(onProgress, { provider: "cloudflare", mode, environment, runId, resourcePrefix: prefix, capability, phase: "complete", elapsedMs: durationMs, message: `cloudflare:${capability}: ok in ${durationMs}ms` });
1512
- } catch (error) {
1513
- const completed = /* @__PURE__ */ new Date();
1514
- const durationMs = Math.max(1, Math.ceil(performance.now() - startedMs));
1515
- const reason = error instanceof Error ? error.message : String(error);
1516
- const providerLimited = capability === "cache-rules" && /403|forbidden|authentication/iu.test(reason);
1517
- results.push(scenario({
1518
- provider: "cloudflare",
1519
- mode,
1520
- prefix,
1521
- capability,
1522
- ok: false,
1523
- phase: "blocked",
1524
- action: "blocked",
1525
- reason: providerLimited ? `${reason}. Cloudflare cache-rules acceptance requires Cloudflare token permissions: target zone Cache Settings Write and Zone Read, plus account Account Rulesets Write and Account Rule Lists Write. Cloudflare API docs may call these Cache Rules and Account Filter Lists.` : reason,
1526
- locators: { accountId, zoneId },
1527
- startedAt: started.toISOString(),
1528
- completedAt: completed.toISOString(),
1529
- durationMs
1530
- }));
1531
- emitProgress(onProgress, { provider: "cloudflare", mode, environment, runId, resourcePrefix: prefix, capability, phase: "blocked", elapsedMs: durationMs, message: `cloudflare:${capability}: blocked after ${durationMs}ms - ${providerLimited ? "missing cache-rules permissions" : reason}` });
1532
- }
1533
- };
1534
- await attempt("worker", "worker", () => cloudflareRequest(`/accounts/${accountId}/workers/scripts/${prefix}`, env, fetchImpl, {
1535
- method: "PUT",
1536
- headers: { "Content-Type": "application/javascript" },
1537
- body: 'addEventListener("fetch", event => event.respondWith(new Response("treeseed-live-test-worker")));'
1538
- }), () => waitForLiveObservation(
1539
- `Cloudflare worker ${prefix}`,
1540
- () => cloudflareRawRequest(`/accounts/${accountId}/workers/scripts/${prefix}`, env, fetchImpl),
1541
- (value) => typeof value === "string" && value.includes("treeseed-live-test-worker")
1542
- ));
1543
- await attempt("pages", "pages", () => withCloudflareTransientRetry(() => cloudflareRequest(`/accounts/${accountId}/pages/projects`, env, fetchImpl, {
1544
- method: "POST",
1545
- body: JSON.stringify({ name: prefix, production_branch: "main" })
1546
- })), () => waitForLiveObservation(
1547
- `Cloudflare Pages project ${prefix}`,
1548
- () => cloudflareRequest(`/accounts/${accountId}/pages/projects/${prefix}`, env, fetchImpl),
1549
- (value) => Boolean(value && typeof value === "object")
1550
- ));
1551
- await attempt("kv", "kv", () => cloudflareRequest(`/accounts/${accountId}/storage/kv/namespaces`, env, fetchImpl, {
1552
- method: "POST",
1553
- body: JSON.stringify({ title: prefix })
1554
- }), () => waitForLiveObservation(
1555
- `Cloudflare KV namespace ${prefix}`,
1556
- () => cloudflareRequest(`/accounts/${accountId}/storage/kv/namespaces?per_page=100`, env, fetchImpl),
1557
- (value) => Array.isArray(value) && value.some((entry) => cloudflareName(entry) === prefix)
1558
- ));
1559
- await attempt("r2", "r2", () => cloudflareRequest(`/accounts/${accountId}/r2/buckets/${prefix}`, env, fetchImpl, { method: "PUT" }), () => waitForLiveObservation(
1560
- `Cloudflare R2 bucket ${prefix}`,
1561
- () => cloudflareRequest(`/accounts/${accountId}/r2/buckets/${prefix}`, env, fetchImpl),
1562
- (value) => Boolean(value && typeof value === "object")
1563
- ));
1564
- await attempt("d1", "d1", () => cloudflareRequest(`/accounts/${accountId}/d1/database`, env, fetchImpl, {
1565
- method: "POST",
1566
- body: JSON.stringify({ name: prefix })
1567
- }), (createdResult) => {
1568
- const id = cloudflareId(createdResult);
1569
- return waitForLiveObservation(
1570
- `Cloudflare D1 database ${prefix}`,
1571
- () => id ? cloudflareRequest(`/accounts/${accountId}/d1/database/${id}`, env, fetchImpl) : cloudflareRequest(`/accounts/${accountId}/d1/database?per_page=100`, env, fetchImpl),
1572
- (value) => Boolean(value && typeof value === "object") || Array.isArray(value) && value.some((entry) => cloudflareName(entry) === prefix)
1573
- );
1574
- });
1575
- await attempt("queue", "queue", () => cloudflareRequest(`/accounts/${accountId}/queues`, env, fetchImpl, {
1576
- method: "POST",
1577
- body: JSON.stringify({ queue_name: prefix })
1578
- }), () => waitForLiveObservation(
1579
- `Cloudflare Queue ${prefix}`,
1580
- () => cloudflareRequest(`/accounts/${accountId}/queues?per_page=100`, env, fetchImpl),
1581
- (value) => Array.isArray(value) && value.some((entry) => cloudflareName(entry) === prefix)
1582
- ));
1583
- await attempt("turnstile", "turnstile", () => cloudflareRequest(`/accounts/${accountId}/challenges/widgets`, env, fetchImpl, {
1584
- method: "POST",
1585
- body: JSON.stringify({ name: prefix, domains: [`${prefix}.${domain}`], mode: "managed" })
1586
- }), () => waitForLiveObservation(
1587
- `Cloudflare Turnstile widget ${prefix}`,
1588
- () => cloudflareRequest(`/accounts/${accountId}/challenges/widgets?per_page=100`, env, fetchImpl),
1589
- (value) => Array.isArray(value) && value.some((entry) => cloudflareName(entry) === prefix)
1590
- ));
1591
- await attempt("dns", "dns", () => cloudflareRequest(`/zones/${zoneId}/dns_records`, env, fetchImpl, {
1592
- method: "POST",
1593
- body: JSON.stringify({ type: "TXT", name: `${prefix}.${domain}`, content: "treeseed-live-test", ttl: 60 })
1594
- }), (createdResult) => {
1595
- const id = cloudflareId(createdResult);
1596
- return waitForLiveObservation(
1597
- `Cloudflare DNS record ${prefix}.${domain}`,
1598
- () => id ? cloudflareRequest(`/zones/${zoneId}/dns_records/${id}`, env, fetchImpl) : cloudflareRequest(`/zones/${zoneId}/dns_records?name=${encodeURIComponent(`${prefix}.${domain}`)}`, env, fetchImpl),
1599
- (value) => Boolean(value && typeof value === "object") || Array.isArray(value) && value.some((entry) => cloudflareName(entry) === `${prefix}.${domain}`)
1600
- );
1601
- });
1602
- await attempt("secrets", "secrets", () => cloudflareRequest(`/accounts/${accountId}/workers/scripts/${prefix}/secrets`, env, fetchImpl, {
1603
- method: "PUT",
1604
- body: JSON.stringify({ name: "TREESEED_LIVE_TEST_SECRET", text: "redacted-test-value", type: "secret_text" })
1605
- }), () => waitForLiveObservation(
1606
- `Cloudflare Worker secret for ${prefix}`,
1607
- () => cloudflareRequest(`/accounts/${accountId}/workers/scripts/${prefix}/settings`, env, fetchImpl),
1608
- (value) => Boolean(value && typeof value === "object")
1609
- ));
1610
- await attempt("cache-rules", "cache-rules", () => cloudflareRequest(`/zones/${zoneId}/rulesets`, env, fetchImpl, {
1611
- method: "GET"
1612
- }), (createdResult) => Promise.resolve(createdResult));
1613
- emitProgress(onProgress, { provider: "cloudflare", mode, environment, runId, resourcePrefix: prefix, phase: "destroy", message: `cloudflare: cleaning created resources for ${prefix}` });
1614
- const cleanup = await runCloudflareCleanup(cwd, environment, prefix, mode, env, fetchImpl);
1615
- return { results, cleanupDrift: cleanup.cleanupDrift };
1616
- }
1617
- async function runGitHubCleanup(cwd, environment, prefix, mode, env, fetchImpl) {
1618
- const repository = resolveCurrentGitHubRepository(cwd, env);
1619
- const credential = resolveGitHubCredentialForRepository(repository, { values: env, env });
1620
- const cleanupDrift = [];
1621
- const destroyed = [];
1622
- const prefixRoot = mode === "cleanup" ? providerPrefixRoot(environment, "github") : prefix;
1623
- if (!credential.token) {
1624
- cleanupDrift.push(blocking("github", "repository-scoped-token", `Missing GitHub credential for ${repository}.`));
1625
- } else {
1626
- const [owner, repo] = credential.repository.split("/");
1627
- const variables = await githubRequest(`/repos/${owner}/${repo}/actions/variables?per_page=100`, credential.token, fetchImpl).catch(() => ({ variables: [] }));
1628
- for (const variable of variables.variables ?? []) {
1629
- const name = variable.name ?? "";
1630
- if (!name.startsWith(`TREESEED_LIVE_TEST_${prefixRoot.toUpperCase().replace(/[^A-Z0-9]/gu, "_")}`)) continue;
1631
- try {
1632
- await githubRequest(`/repos/${owner}/${repo}/actions/variables/${name}`, credential.token, fetchImpl, { method: "DELETE" });
1633
- destroyed.push(node("github", environment, "variable", name, { deleted: true }));
1634
- } catch (error) {
1635
- const message = error instanceof Error ? error.message : String(error);
1636
- if (!/404|Not Found/iu.test(message)) cleanupDrift.push(blocking("github", "variable", message));
1637
- }
1638
- }
1639
- const environments = await githubRequest(`/repos/${owner}/${repo}/environments?per_page=100`, credential.token, fetchImpl).catch(() => ({ environments: [] }));
1640
- for (const candidate of environments.environments ?? []) {
1641
- const name = candidate.name ?? "";
1642
- if (!name.startsWith(prefixRoot)) continue;
1643
- try {
1644
- await githubRequest(`/repos/${owner}/${repo}/environments/${name}`, credential.token, fetchImpl, { method: "DELETE" });
1645
- destroyed.push(node("github", environment, "environment", name, { deleted: true }));
1646
- } catch (error) {
1647
- const message = error instanceof Error ? error.message : String(error);
1648
- if (!/404|Not Found/iu.test(message)) cleanupDrift.push(blocking("github", "environment", message));
1649
- }
1650
- }
1651
- }
1652
- const results = PROVIDER_CAPABILITIES.github.map((capability) => scenario({ provider: "github", mode, prefix, capability, ok: cleanupDrift.length === 0, phase: "cleanup", action: destroyed.length ? "delete" : "noop", reason: cleanupDrift.length === 0 ? "GitHub cleanup completed." : "GitHub cleanup left blocking drift.", destroyedResources: destroyed }));
1653
- return { results, cleanupDrift };
1654
- }
1655
- async function runGitHubAcceptance(cwd, environment, runId, prefix, env, fetchImpl, onProgress) {
1656
- const mode = "acceptance";
1657
- let repository = "";
1658
- try {
1659
- repository = resolveCurrentGitHubRepository(cwd, env);
1660
- const credential = resolveGitHubCredentialForRepository(repository, { values: env, env });
1661
- if (!credential.token) throw new Error(`Missing GitHub credential for ${repository}; expected ${credential.envName} or TREESEED_GITHUB_TOKEN fallback.`);
1662
- const [owner, repo] = credential.repository.split("/");
1663
- const environmentName = prefix;
1664
- const variableName = `TREESEED_LIVE_TEST_${prefix.toUpperCase().replace(/[^A-Z0-9]/gu, "_")}`;
1665
- await runGitHubCleanup(cwd, environment, prefix, mode, env, fetchImpl);
1666
- const results = [];
1667
- results.push(await measuredScenario({
1668
- provider: "github",
1669
- mode,
1670
- environment,
1671
- runId,
1672
- prefix,
1673
- capability: "environment",
1674
- phase: "create",
1675
- action: "create",
1676
- startMessage: "github:environment: create/update started",
1677
- successReason: "GitHub acceptance created a test environment and observed it live.",
1678
- locators: { repository: credential.repository, environment: environmentName },
1679
- onProgress
1680
- }, async () => {
1681
- await githubRequest(`/repos/${owner}/${repo}/environments/${environmentName}`, credential.token, fetchImpl, { method: "PUT", body: JSON.stringify({}) });
1682
- return waitForLiveObservation(
1683
- `GitHub environment ${environmentName}`,
1684
- () => githubRequest(`/repos/${owner}/${repo}/environments?per_page=100`, credential.token ?? "", fetchImpl),
1685
- (value) => Array.isArray(value.environments) && (value.environments ?? []).some((candidate) => candidate.name === environmentName)
1686
- );
1687
- }));
1688
- results.push(await measuredScenario({
1689
- provider: "github",
1690
- mode,
1691
- environment,
1692
- runId,
1693
- prefix,
1694
- capability: "variable",
1695
- phase: "update",
1696
- action: "update",
1697
- startMessage: "github:variable: create/update started",
1698
- successReason: "GitHub acceptance created, updated, and observed a repository variable.",
1699
- locators: { repository: credential.repository, variable: variableName },
1700
- onProgress
1701
- }, async () => {
1702
- await githubRequest(`/repos/${owner}/${repo}/actions/variables`, credential.token, fetchImpl, { method: "POST", body: JSON.stringify({ name: variableName, value: "created" }) }).catch(async (error) => {
1703
- if (/already_exists|already exists|409/iu.test(error instanceof Error ? error.message : String(error))) {
1704
- await githubRequest(`/repos/${owner}/${repo}/actions/variables/${variableName}`, credential.token ?? "", fetchImpl, { method: "PATCH", body: JSON.stringify({ name: variableName, value: "created" }) });
1705
- return;
1706
- }
1707
- throw error;
1708
- });
1709
- await githubRequest(`/repos/${owner}/${repo}/actions/variables/${variableName}`, credential.token, fetchImpl, { method: "PATCH", body: JSON.stringify({ name: variableName, value: "updated" }) });
1710
- return waitForLiveObservation(
1711
- `GitHub variable ${variableName}`,
1712
- () => githubRequest(`/repos/${owner}/${repo}/actions/variables/${variableName}`, credential.token ?? "", fetchImpl),
1713
- (value) => value.name === variableName && value.value === "updated"
1714
- );
1715
- }));
1716
- results.push(await measuredScenario({
1717
- provider: "github",
1718
- mode,
1719
- environment,
1720
- runId,
1721
- prefix,
1722
- capability: "secret",
1723
- phase: "verify",
1724
- action: "noop",
1725
- startMessage: "github:secret: verifying public-key secret API access",
1726
- successReason: "GitHub acceptance observed repository public-key access for Actions secret encryption.",
1727
- locators: { repository: credential.repository },
1728
- onProgress
1729
- }, async () => githubRequest(`/repos/${owner}/${repo}/actions/secrets/public-key`, credential.token, fetchImpl)));
1730
- results.push(await measuredScenario({
1731
- provider: "github",
1732
- mode,
1733
- environment,
1734
- runId,
1735
- prefix,
1736
- capability: "workflow-dispatch",
1737
- phase: "verify",
1738
- action: "noop",
1739
- startMessage: "github:workflow-dispatch: verifying dispatchable workflow metadata",
1740
- successReason: "GitHub acceptance observed workflow metadata for dispatch routing.",
1741
- locators: { repository: credential.repository },
1742
- onProgress
1743
- }, async () => {
1744
- const workflows = await githubRequest(`/repos/${owner}/${repo}/actions/workflows?per_page=100`, credential.token, fetchImpl);
1745
- const workflow = workflows.workflows?.find((candidate) => candidate.state === "active") ?? workflows.workflows?.[0] ?? null;
1746
- if (!workflow) throw new Error("No workflow is available for dispatch observation.");
1747
- return workflow;
1748
- }));
1749
- results.push(await measuredScenario({
1750
- provider: "github",
1751
- mode,
1752
- environment,
1753
- runId,
1754
- prefix,
1755
- capability: "workflow-observation",
1756
- phase: "verify",
1757
- action: "noop",
1758
- startMessage: "github:workflow-observation: reading workflow runs",
1759
- successReason: "GitHub acceptance observed workflow runs.",
1760
- locators: { repository: credential.repository },
1761
- onProgress
1762
- }, async () => githubRequest(`/repos/${owner}/${repo}/actions/runs?per_page=1`, credential.token, fetchImpl)));
1763
- results.push(await measuredScenario({
1764
- provider: "github",
1765
- mode,
1766
- environment,
1767
- runId,
1768
- prefix,
1769
- capability: "repository-scoped-token",
1770
- phase: "verify",
1771
- action: "noop",
1772
- startMessage: "github:repository-scoped-token: resolving credential",
1773
- successReason: credential.fallbackUsed ? "GitHub acceptance resolved fallback credential." : "GitHub acceptance resolved repository-scoped credential.",
1774
- locators: { repository: credential.repository, credentialKey: credential.envName },
1775
- onProgress
1776
- }, async () => credential));
1777
- const cleanup = await runGitHubCleanup(cwd, environment, prefix, mode, env, fetchImpl);
1778
- return { results, cleanupDrift: cleanup.cleanupDrift };
1779
- } catch (error) {
1780
- const reason = error instanceof Error ? error.message : String(error);
1781
- return {
1782
- results: PROVIDER_CAPABILITIES.github.map((capability) => scenario({ provider: "github", mode, prefix, capability, ok: false, phase: "blocked", action: "blocked", reason, locators: { repository } })),
1783
- cleanupDrift: []
1784
- };
1785
- }
1786
- }
1787
- async function listenOnEphemeralPort(server) {
1788
- return new Promise((resolve2, reject) => {
1789
- server.once("error", reject);
1790
- server.listen(0, "127.0.0.1", () => {
1791
- const address = server.address();
1792
- if (address && typeof address === "object") resolve2(address.port);
1793
- else reject(new Error("Local server did not expose an address."));
1794
- });
1795
- });
1796
- }
1797
- async function closeServer(server) {
1798
- return new Promise((resolve2, reject) => {
1799
- server.close((error) => error ? reject(error) : resolve2());
1800
- });
1801
- }
1802
- async function runLocalAcceptance(environment, prefix, mode, runId, env, fetchImpl, onProgress) {
1803
- const created = [];
1804
- const destroyed = [];
1805
- const tempBase = resolve(process.cwd(), ".treeseed", "tmp", "live-acceptance");
1806
- await mkdir(tempBase, { recursive: true });
1807
- const dir = await mkdtemp(join(tempBase, `${prefix}-`));
1808
- const results = [];
1809
- let server = null;
1810
- try {
1811
- results.push(await measuredScenario({
1812
- provider: "local",
1813
- mode,
1814
- environment,
1815
- runId,
1816
- prefix,
1817
- capability: "local-db",
1818
- phase: "create",
1819
- action: "create",
1820
- startMessage: "local:local-db: creating isolated state",
1821
- successReason: "Local acceptance created, wrote, read, and removed isolated local state.",
1822
- createdResources: [node("local", environment, "local-db", dir, { path: dir })],
1823
- onProgress
1824
- }, async () => {
1825
- const file = join(dir, "state.json");
1826
- await writeFile(file, JSON.stringify({ ok: true, runId }), "utf8");
1827
- const parsed = JSON.parse(readFileSync(file, "utf8"));
1828
- if (parsed.ok !== true || parsed.runId !== runId) throw new Error("Local state read-back did not match the written payload.");
1829
- created.push(node("local", environment, "local-db", dir, { path: dir }));
1830
- return parsed;
1831
- }));
1832
- server = createServer((socket) => {
1833
- socket.end("treeseed-live-test-local\n");
1834
- });
1835
- results.push(await measuredScenario({
1836
- provider: "local",
1837
- mode,
1838
- environment,
1839
- runId,
1840
- prefix,
1841
- capability: "port",
1842
- phase: "create",
1843
- action: "create",
1844
- startMessage: "local:port: binding ephemeral port",
1845
- successReason: "Local acceptance bound and observed an ephemeral loopback port.",
1846
- onProgress
1847
- }, async () => {
1848
- const port = await listenOnEphemeralPort(server);
1849
- if (!port) throw new Error("No local port was allocated.");
1850
- return { port };
1851
- }));
1852
- results.push(await measuredScenario({
1853
- provider: "local",
1854
- mode,
1855
- environment,
1856
- runId,
1857
- prefix,
1858
- capability: "process",
1859
- phase: "verify",
1860
- action: "noop",
1861
- startMessage: "local:process: verifying current process",
1862
- successReason: "Local acceptance observed the current Node process as a supervised-process stand-in.",
1863
- locators: { pid: String(process.pid) },
1864
- onProgress
1865
- }, async () => {
1866
- if (!process.pid) throw new Error("Current process id is unavailable.");
1867
- return { pid: process.pid };
1868
- }));
1869
- results.push(await measuredScenario({
1870
- provider: "local",
1871
- mode,
1872
- environment,
1873
- runId,
1874
- prefix,
1875
- capability: "local-runner",
1876
- phase: "verify",
1877
- action: "noop",
1878
- startMessage: "local:local-runner: verifying runner probe",
1879
- successReason: "Local acceptance verified the local runner probe contract.",
1880
- onProgress
1881
- }, async () => ({ runnerProbe: true, runId })));
1882
- results.push(await measuredScenario({
1883
- provider: "local",
1884
- mode,
1885
- environment,
1886
- runId,
1887
- prefix,
1888
- capability: "docker-compose-capacity-provider",
1889
- phase: "verify",
1890
- action: "noop",
1891
- startMessage: "local:docker-compose-capacity-provider: checking Docker availability",
1892
- successReason: (value) => value.available ? "Local acceptance observed Docker for the Docker Compose capacity-provider probe." : "Local acceptance checked Docker Compose capacity-provider probe availability; Docker is not installed or not reachable in this shell.",
1893
- onProgress
1894
- }, async () => {
1895
- try {
1896
- const docker = execFileSync("docker", ["--version"], { encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] }).trim();
1897
- return { docker, available: true };
1898
- } catch (error) {
1899
- return { docker: error instanceof Error ? error.message : String(error), available: false };
1900
- }
1901
- }));
1902
- results.push(await measuredScenario({
1903
- provider: "local",
1904
- mode,
1905
- environment,
1906
- runId,
1907
- prefix,
1908
- capability: "capacity-provider-assignment-proof",
1909
- phase: "verify",
1910
- action: "noop",
1911
- startMessage: "local:capacity-provider-assignment-proof: running assignment lifecycle proof",
1912
- successReason: "Local capacity acceptance created a diagnostic assignment, leased it through the provider protocol, emitted mode-run telemetry, and completed it.",
1913
- retainedResources: (value) => {
1914
- const proof = value;
1915
- return [providerNode("local", environment, "capacity-runtime-proof", proof.assignmentId, {
1916
- sessionId: proof.sessionId,
1917
- modeRunId: proof.modeRunId,
1918
- finalStatus: proof.finalStatus,
1919
- mode: proof.mode,
1920
- modeRunCount: proof.modeRunCount
1921
- })];
1922
- },
1923
- onProgress
1924
- }, async () => runCapacityProviderAssignmentProof({ provider: "local", environment, runId, prefix, env, fetchImpl })));
1925
- } catch (error) {
1926
- const reason = error instanceof Error ? error.message : String(error);
1927
- for (const capability of PROVIDER_CAPABILITIES.local) {
1928
- if (!results.some((result) => result.capability === capability)) {
1929
- results.push(scenario({ provider: "local", mode, prefix, capability, ok: false, phase: "blocked", action: "blocked", reason }));
1930
- }
1931
- }
1932
- } finally {
1933
- if (server) await closeServer(server).catch(() => void 0);
1934
- await rm(dir, { recursive: true, force: true });
1935
- destroyed.push(node("local", environment, "local-db", dir, { deleted: true }));
1936
- }
1937
- return { results, cleanupDrift: [], destroyedResources: destroyed };
1938
- }
1939
- async function runProvider({
1940
- provider,
1941
- mode,
1942
- environment,
1943
- runId,
1944
- cwd,
1945
- env,
1946
- fetchImpl,
1947
- onProgress
1948
- }) {
1949
- const prefix = providerPrefix(environment, provider, runId);
1950
- const started = Date.now();
1951
- emitProgress(onProgress, { provider, mode, environment, runId, resourcePrefix: prefix, phase: "start", message: `${provider}: ${mode} live reconciliation started` });
1952
- if (mode === "smoke") {
1953
- const results2 = await runSmokeProvider({ provider, environment, prefix, mode, cwd, env, fetchImpl });
1954
- const report2 = reportForProvider({ provider, mode, runId, prefix, environment, results: results2 });
1955
- emitProgress(onProgress, { provider, mode, environment, runId, resourcePrefix: prefix, phase: report2.ok ? "complete" : "blocked", elapsedMs: Date.now() - started, message: `${provider}: ${report2.ok ? "passed" : "blocked"} in ${Date.now() - started}ms` });
1956
- return report2;
1957
- }
1958
- if (provider === "railway") {
1959
- const { results: results2, cleanupDrift: cleanupDrift2 } = mode === "cleanup" ? await runRailwayCleanup(environment, prefix, mode, env, fetchImpl) : await runRailwayAcceptance(cwd, environment, runId, prefix, env, fetchImpl, onProgress);
1960
- const report2 = reportForProvider({ provider, mode, runId, prefix, environment, results: results2, cleanupDrift: cleanupDrift2 });
1961
- emitProgress(onProgress, { provider, mode, environment, runId, resourcePrefix: prefix, phase: report2.ok ? "complete" : "blocked", elapsedMs: Date.now() - started, message: `${provider}: ${report2.ok ? "passed" : "blocked"} in ${Date.now() - started}ms` });
1962
- return report2;
1963
- }
1964
- if (provider === "cloudflare") {
1965
- const { results: results2, cleanupDrift: cleanupDrift2 } = mode === "cleanup" ? await runCloudflareCleanup(cwd, environment, prefix, mode, env, fetchImpl) : await runCloudflareAcceptance(cwd, environment, runId, prefix, env, fetchImpl, onProgress);
1966
- const report2 = reportForProvider({ provider, mode, runId, prefix, environment, results: results2, cleanupDrift: cleanupDrift2 });
1967
- emitProgress(onProgress, { provider, mode, environment, runId, resourcePrefix: prefix, phase: report2.ok ? "complete" : "blocked", elapsedMs: Date.now() - started, message: `${provider}: ${report2.ok ? "passed" : "blocked"} in ${Date.now() - started}ms` });
1968
- return report2;
1969
- }
1970
- if (provider === "github") {
1971
- const { results: results2, cleanupDrift: cleanupDrift2 } = mode === "cleanup" ? await runGitHubCleanup(cwd, environment, prefix, mode, env, fetchImpl) : await runGitHubAcceptance(cwd, environment, runId, prefix, env, fetchImpl, onProgress);
1972
- const report2 = reportForProvider({ provider, mode, runId, prefix, environment, results: results2, cleanupDrift: cleanupDrift2 });
1973
- emitProgress(onProgress, { provider, mode, environment, runId, resourcePrefix: prefix, phase: report2.ok ? "complete" : "blocked", elapsedMs: Date.now() - started, message: `${provider}: ${report2.ok ? "passed" : "blocked"} in ${Date.now() - started}ms` });
1974
- return report2;
1975
- }
1976
- const { results, cleanupDrift } = await runLocalAcceptance(environment, prefix, mode, runId, env, fetchImpl, onProgress);
1977
- const report = reportForProvider({ provider, mode, runId, prefix, environment, results, cleanupDrift });
1978
- emitProgress(onProgress, { provider, mode, environment, runId, resourcePrefix: prefix, phase: report.ok ? "complete" : "blocked", elapsedMs: Date.now() - started, message: `${provider}: ${report.ok ? "passed" : "blocked"} in ${Date.now() - started}ms` });
1979
- return report;
1980
- }
1981
- function treeseedLiveReconcileProviderCapabilities(provider) {
1982
- return [...PROVIDER_CAPABILITIES[provider]];
1983
- }
1984
- function treeseedLiveReconcileResourcePrefix(environment, provider, runId) {
1985
- return providerPrefix(environment, provider, runId);
1986
- }
1987
- async function runTreeseedLiveReconcileTests(options) {
1988
- const mode = options.mode ?? "smoke";
1989
- const runId = options.runId ?? shortRunId(options.now);
1990
- const env = options.env ?? process.env;
1991
- const fetchImpl = options.fetchImpl ?? fetch;
1992
- const providers = [...new Set(options.providers)];
1993
- const reports = await Promise.all(providers.map((provider) => runProvider({
1994
- provider,
1995
- mode,
1996
- environment: options.environment,
1997
- runId,
1998
- cwd: options.cwd,
1999
- env,
2000
- fetchImpl,
2001
- onProgress: options.onProgress
2002
- })));
2003
- return {
2004
- command: "reconcile test-live",
2005
- mode,
2006
- environment: options.environment,
2007
- runId,
2008
- resourcePrefix: `trsd-live-${options.environment}`,
2009
- providers: reports,
2010
- ok: reports.every((report) => report.ok)
2011
- };
2012
- }
2013
- export {
2014
- compileTreeseedLiveAcceptanceScenarios,
2015
- runTreeseedLiveReconcileTests,
2016
- treeseedLiveReconcileProviderCapabilities,
2017
- treeseedLiveReconcileResourcePrefix
2018
- };