@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.
- package/LICENSE +13 -0
- package/README.md +33 -359
- package/dist/accounts/account-contracts.d.ts +170 -0
- package/dist/accounts/account-contracts.js +33 -0
- package/dist/agent-capacity/allocation.d.ts +186 -0
- package/dist/agent-capacity/allocation.js +226 -0
- package/dist/agent-capacity/artifact-mutation-receipt.d.ts +49 -0
- package/dist/agent-capacity/artifact-mutation-receipt.js +36 -0
- package/dist/agent-capacity/artifacts.d.ts +107 -0
- package/dist/agent-capacity/artifacts.js +39 -0
- package/dist/agent-capacity/authority/agent-authority-presets.d.ts +13 -0
- package/dist/agent-capacity/authority/agent-authority-presets.js +106 -0
- package/dist/agent-capacity/contracts/capacity/assignments/assignment-records.d.ts +269 -0
- package/dist/agent-capacity/contracts/capacity/assignments/assignment-records.js +10 -0
- package/dist/agent-capacity/contracts/capacity/communication/communication-records.d.ts +101 -0
- package/dist/agent-capacity/contracts/capacity/communication/communication-records.js +9 -0
- package/dist/agent-capacity/contracts/capacity/providers/supply-policy.d.ts +36 -0
- package/dist/agent-capacity/contracts/capacity/providers/supply-policy.js +4 -0
- package/dist/agent-capacity/contracts/capacity/workdays/workday-records.d.ts +188 -0
- package/dist/agent-capacity/contracts/configuration/configuration.d.ts +11 -0
- package/dist/agent-capacity/contracts/configuration/configuration.js +20 -0
- package/dist/agent-capacity/contracts/operations/research-workflow.d.ts +59 -0
- package/dist/agent-capacity/contracts/operations/research-workflow.js +16 -0
- package/dist/agent-capacity/contracts/operations/workflow-promotion.d.ts +24 -0
- package/dist/agent-capacity/contracts/projects/agents/project-agent-class.d.ts +37 -0
- package/dist/agent-capacity/contracts/runtime/runtime-observability.d.ts +335 -0
- package/dist/agent-capacity/contracts/support/agent-atlas.d.ts +185 -0
- package/dist/agent-capacity/contracts/support/agent-atlas.js +47 -0
- package/dist/agent-capacity/contracts/support/agent-lab-monitoring.d.ts +96 -0
- package/dist/agent-capacity/contracts/support/agent-lab-monitoring.js +14 -0
- package/dist/agent-capacity/contracts/support/authority/execution-mode.d.ts +10 -0
- package/dist/agent-capacity/contracts/support/authority/execution-mode.js +17 -0
- package/dist/agent-capacity/contracts/support/decision-work.d.ts +251 -0
- package/dist/agent-capacity/contracts/support/failure-records.d.ts +9 -0
- package/dist/agent-capacity/contracts/support/failure-records.js +0 -0
- package/dist/agent-capacity/contracts/support/financial-records.d.ts +124 -0
- package/dist/agent-capacity/contracts/support/financial-records.js +0 -0
- package/dist/agent-capacity/contracts/support/planning-records.d.ts +121 -0
- package/dist/agent-capacity/contracts/support/planning-records.js +0 -0
- package/dist/agent-capacity/contracts/support/research-citation.d.ts +15 -0
- package/dist/agent-capacity/contracts/support/research-citation.js +0 -0
- package/dist/agent-capacity/contracts/support/research-source-policy.d.ts +8 -0
- package/dist/agent-capacity/contracts/support/research-source-policy.js +0 -0
- package/dist/agent-capacity/contracts/support/time-capacity.d.ts +163 -0
- package/dist/agent-capacity/contracts/support/time-capacity.js +63 -0
- package/dist/agent-capacity/policy/capacity/allocations/allocation-hierarchy.d.ts +29 -0
- package/dist/agent-capacity/policy/capacity/allocations/allocation-hierarchy.js +110 -0
- package/dist/agent-capacity/validation/activity-profile.d.ts +12 -0
- package/dist/agent-capacity/validation/activity-profile.js +264 -0
- package/dist/agent-capacity/validation/agent-definition-schema.d.ts +9140 -0
- package/dist/agent-capacity/validation/agent-definition-schema.js +198 -0
- package/dist/agent-capacity/validation/agent-lab-forensics-schema.d.ts +234 -0
- package/dist/agent-capacity/validation/agent-lab-forensics-schema.js +104 -0
- package/dist/agent-capacity/validation/agent-signal.d.ts +30 -0
- package/dist/agent-capacity/validation/agent-signal.js +31 -0
- package/dist/agent-capacity/validation/allocation.d.ts +12 -0
- package/dist/agent-capacity/validation/allocation.js +115 -0
- package/dist/agent-capacity/validation/assignment-records.d.ts +16 -0
- package/dist/agent-capacity/validation/assignment-records.js +92 -0
- package/dist/agent-capacity/validation/configuration.d.ts +14 -0
- package/dist/agent-capacity/validation/configuration.js +23 -0
- package/dist/agent-capacity/validation/index.d.ts +11 -0
- package/dist/agent-capacity/validation/index.js +11 -0
- package/dist/agent-capacity/validation/proposal-type.d.ts +22 -0
- package/dist/agent-capacity/validation/proposal-type.js +21 -0
- package/dist/agent-capacity/validation/research/citation.d.ts +16 -0
- package/dist/agent-capacity/validation/research/citation.js +47 -0
- package/dist/agent-capacity/validation/research/source-policy.d.ts +11 -0
- package/dist/agent-capacity/validation/research/source-policy.js +26 -0
- package/dist/agent-capacity/validation/research/workflow.d.ts +10 -0
- package/dist/agent-capacity/validation/research/workflow.js +31 -0
- package/dist/agent-capacity/validation/workflow-promotion.d.ts +2 -0
- package/dist/agent-capacity/validation/workflow-promotion.js +34 -0
- package/dist/agent-capacity/workday.d.ts +52 -0
- package/dist/agent-capacity/workday.js +105 -0
- package/dist/ai-appliance/contracts.d.ts +90 -0
- package/dist/ai-appliance/contracts.js +16 -0
- package/dist/ai-appliance/validation.d.ts +4 -0
- package/dist/ai-appliance/validation.js +62 -0
- package/dist/capacity/agents/agent-capacity.d.ts +21 -0
- package/dist/capacity/agents/agent-capacity.js +20 -0
- package/dist/capacity/capacity-core/capacity-pagination.d.ts +18 -0
- package/dist/capacity/capacity-core/capacity-pagination.js +33 -0
- package/dist/capacity/providers/capacity-provider.d.ts +1 -0
- package/dist/capacity/providers/capacity-provider.js +1 -0
- package/dist/capacity-provider/client.d.ts +56 -0
- package/dist/capacity-provider/client.js +163 -0
- package/dist/capacity-provider/contracts/capacity-facts.d.ts +64 -0
- package/dist/capacity-provider/contracts/capacity-facts.js +0 -0
- package/dist/capacity-provider/contracts/governance.d.ts +399 -0
- package/dist/capacity-provider/contracts/governance.js +18 -0
- package/dist/capacity-provider/contracts/index.d.ts +2 -0
- package/dist/capacity-provider/contracts/index.js +2 -0
- package/dist/capacity-provider/index.d.ts +3 -0
- package/dist/capacity-provider/index.js +3 -0
- package/dist/capacity-provider/validation.d.ts +27 -0
- package/dist/capacity-provider/validation.js +184 -0
- package/dist/configuration/secrets-capability.d.ts +4 -0
- package/dist/configuration/secrets-capability.js +4 -0
- package/dist/content/contracts.d.ts +12 -0
- package/dist/content/contracts.js +0 -0
- package/dist/content/validation/agent-operational-content-schemas.d.ts +1351 -0
- package/dist/content/validation/agent-operational-content-schemas.js +146 -0
- package/dist/content/validation/auxiliary-content-schemas.d.ts +1715 -0
- package/dist/content/validation/auxiliary-content-schemas.js +173 -0
- package/dist/content/validation/content-model-schemas.d.ts +21728 -0
- package/dist/content/validation/content-model-schemas.js +271 -0
- package/dist/content/validation/index.d.ts +3 -0
- package/dist/content/validation/index.js +3 -0
- package/dist/content/validation/portable-content-data.d.ts +2101 -0
- package/dist/content/validation/portable-content-data.js +49 -0
- package/dist/entrypoints/clients/control-plane-client.d.ts +112 -0
- package/dist/entrypoints/clients/control-plane-client.js +180 -0
- package/dist/entrypoints/models/field-aliases.d.ts +11 -0
- package/dist/entrypoints/models/model-registry.d.ts +3 -0
- package/dist/entrypoints/models/model-registry.js +3 -0
- package/dist/entrypoints/models/sdk-fields.d.ts +11 -0
- package/dist/entrypoints/models/sdk-types.d.ts +10 -0
- package/dist/entrypoints/models/sdk-types.js +10 -0
- package/dist/feedback/contracts.d.ts +142 -0
- package/dist/feedback/contracts.js +18 -0
- package/dist/feedback/index.d.ts +1 -0
- package/dist/feedback/index.js +1 -0
- package/dist/governance/groups/contracts.d.ts +102 -0
- package/dist/governance/groups/contracts.js +6 -0
- package/dist/graph/context-query-contracts.d.ts +19 -1
- package/dist/graph/context-query-contracts.js +49 -8
- package/dist/knowledge/contracts.d.ts +173 -0
- package/dist/knowledge/contracts.js +16 -0
- package/dist/knowledge/index.d.ts +1 -0
- package/dist/knowledge/index.js +1 -0
- package/dist/model-registry/agent-operational-models.d.ts +4 -0
- package/dist/model-registry/agent-operational-models.js +38 -0
- package/dist/model-registry/build-builtin-model-registry.d.ts +2 -0
- package/dist/model-registry/build-builtin-model-registry.js +426 -0
- package/dist/model-registry/content-root.d.ts +9 -0
- package/dist/model-registry/content-root.js +33 -0
- package/dist/model-registry/discussion-models.d.ts +4 -0
- package/dist/model-registry/discussion-models.js +84 -0
- package/dist/model-registry/group-models.d.ts +2 -0
- package/dist/model-registry/group-models.js +52 -0
- package/dist/model-registry/knowledge-models.d.ts +2 -0
- package/dist/model-registry/knowledge-models.js +89 -0
- package/dist/model-registry/normalize-definition.d.ts +8 -0
- package/dist/model-registry/normalize-definition.js +69 -0
- package/dist/operator-contracts/canonical-command-tree.d.ts +3 -0
- package/dist/operator-contracts/canonical-command-tree.js +81 -0
- package/dist/operator-contracts/command-tree.d.ts +79 -0
- package/dist/operator-contracts/command-tree.js +53 -0
- package/dist/operator-contracts/control-plane-operation.d.ts +80 -0
- package/dist/operator-contracts/control-plane-operation.js +75 -0
- package/dist/operator-contracts/control-plane-operations.d.ts +546 -0
- package/dist/operator-contracts/control-plane-operations.js +352 -0
- package/dist/operator-contracts/index.d.ts +8 -0
- package/dist/operator-contracts/index.js +8 -0
- package/dist/operator-contracts/mcp.d.ts +78 -0
- package/dist/operator-contracts/mcp.js +23 -0
- package/dist/operator-contracts/oauth.d.ts +46 -0
- package/dist/operator-contracts/oauth.js +0 -0
- package/dist/operator-contracts/workday-lifecycle.d.ts +157 -0
- package/dist/operator-contracts/workday-lifecycle.js +65 -0
- package/dist/operator-contracts/workday-profile.d.ts +72 -0
- package/dist/operator-contracts/workday-profile.js +106 -0
- package/dist/projects/projects-core/project-workflow.d.ts +179 -0
- package/dist/projects/projects-core/project-workflow.js +66 -0
- package/dist/sdk-types/configuration/sdk-dispatch-credential-source.d.ts +201 -0
- package/dist/sdk-types/configuration/sdk-dispatch-credential-source.js +0 -0
- package/dist/sdk-types/control-plane/resource-requests.d.ts +124 -0
- package/dist/sdk-types/control-plane/resource-requests.js +0 -0
- package/dist/sdk-types/governance/commons/commons-question-input.d.ts +61 -0
- package/dist/sdk-types/governance/commons/commons-question-input.js +0 -0
- package/dist/sdk-types/support/planning-policy.d.ts +210 -0
- package/dist/sdk-types/support/planning-policy.js +0 -0
- package/dist/sdk-types/support/platform-contracts.d.ts +178 -0
- package/dist/sdk-types/support/platform-contracts.js +15 -0
- package/dist/sdk-types/support/sdk-model-names.d.ts +44 -0
- package/dist/sdk-types/support/sdk-model-names.js +80 -0
- package/dist/sdk-types/support/sdk-search-request.d.ts +182 -0
- package/dist/sdk-types/support/sdk-search-request.js +0 -0
- package/dist/sdk-types/support/task-planning.d.ts +189 -0
- package/dist/sdk-types/support/task-planning.js +0 -0
- package/dist/sdk-types/treedx/graph/sdk-graph-query-request.d.ts +157 -0
- package/dist/sdk-types/treedx/graph/sdk-graph-query-request.js +0 -0
- package/dist/secrets-capability/provider-operation-contracts.d.ts +90 -0
- package/dist/secrets-capability/provider-operation-contracts.js +10 -0
- package/dist/secrets-capability/service-provider-contracts.d.ts +92 -0
- package/dist/secrets-capability/service-provider-contracts.js +183 -0
- package/dist/secrets-capability/service-vault-contracts.d.ts +61 -0
- package/dist/secrets-capability/service-vault-contracts.js +39 -0
- package/dist/secrets-capability/workflow-operation-contracts.d.ts +95 -0
- package/dist/secrets-capability/workflow-operation-contracts.js +0 -0
- package/dist/standards/canonicalize.d.ts +10 -0
- package/dist/standards/canonicalize.js +43 -0
- package/dist/standards/compatibility-attestation.d.ts +23 -0
- package/dist/standards/compatibility-attestation.js +40 -0
- package/dist/standards/composition.d.ts +15 -0
- package/dist/standards/composition.js +14 -0
- package/dist/standards/contract-bundle.d.ts +8 -0
- package/dist/standards/contract-bundle.js +23 -0
- package/dist/standards/contracts.d.ts +39 -0
- package/dist/standards/contracts.js +0 -0
- package/dist/standards/errors.d.ts +6 -0
- package/dist/standards/errors.js +13 -0
- package/dist/standards/index.d.ts +8 -0
- package/dist/standards/index.js +8 -0
- package/dist/standards/mcp/compare.d.ts +2 -0
- package/dist/standards/mcp/compare.js +38 -0
- package/dist/standards/mcp/contracts.d.ts +34 -0
- package/dist/standards/mcp/contracts.js +0 -0
- package/dist/standards/mcp/index.d.ts +3 -0
- package/dist/standards/mcp/index.js +3 -0
- package/dist/standards/mcp/normalize.d.ts +4 -0
- package/dist/standards/mcp/normalize.js +30 -0
- package/dist/standards/openapi/compare.d.ts +2 -0
- package/dist/standards/openapi/compare.js +112 -0
- package/dist/standards/openapi/contracts.d.ts +24 -0
- package/dist/standards/openapi/contracts.js +0 -0
- package/dist/standards/openapi/index.d.ts +3 -0
- package/dist/standards/openapi/index.js +3 -0
- package/dist/standards/openapi/normalize.d.ts +2 -0
- package/dist/standards/openapi/normalize.js +57 -0
- package/dist/standards/package-manifest.d.ts +37 -0
- package/dist/standards/package-manifest.js +89 -0
- package/dist/standards/portfolio-entry.d.ts +12 -0
- package/dist/standards/portfolio-entry.js +11 -0
- package/dist/standards/typescript/compare.d.ts +2 -0
- package/dist/standards/typescript/compare.js +88 -0
- package/dist/standards/typescript/contracts.d.ts +44 -0
- package/dist/standards/typescript/contracts.js +0 -0
- package/dist/standards/typescript/extract.d.ts +10 -0
- package/dist/standards/typescript/extract.js +244 -0
- package/dist/standards/typescript/index.d.ts +3 -0
- package/dist/standards/typescript/index.js +3 -0
- package/dist/treedx/accounts/auth.d.ts +17 -0
- package/dist/treedx/accounts/auth.js +48 -0
- package/dist/treedx/client/accounts/contracts/auth-mode.d.ts +3 -0
- package/dist/treedx/client/accounts/contracts/auth-mode.js +6 -0
- package/dist/treedx/client/build/creation/build-context.d.ts +3 -0
- package/dist/treedx/client/build/creation/build-context.js +7 -0
- package/dist/treedx/client/build/creation/build-snapshot.d.ts +3 -0
- package/dist/treedx/client/build/creation/build-snapshot.js +8 -0
- package/dist/treedx/client/capacity/allocations/contracts/put-capability-grant.d.ts +3 -0
- package/dist/treedx/client/capacity/allocations/contracts/put-capability-grant.js +7 -0
- package/dist/treedx/client/capacity/allocations/queries/list-capability-grants.d.ts +6 -0
- package/dist/treedx/client/capacity/allocations/queries/list-capability-grants.js +10 -0
- package/dist/treedx/client/methods.d.ts +102 -0
- package/dist/treedx/client/methods.js +209 -0
- package/dist/treedx/client/persistence/contracts/restore-storage.d.ts +3 -0
- package/dist/treedx/client/persistence/contracts/restore-storage.js +6 -0
- package/dist/treedx/client/persistence/lifecycle/verify-storage-restore.d.ts +3 -0
- package/dist/treedx/client/persistence/lifecycle/verify-storage-restore.js +6 -0
- package/dist/treedx/client/repositories/creation/register-repository.d.ts +3 -0
- package/dist/treedx/client/repositories/creation/register-repository.js +7 -0
- package/dist/treedx/client/repositories/queries/get-repository.d.ts +3 -0
- package/dist/treedx/client/repositories/queries/get-repository.js +7 -0
- package/dist/treedx/client/repositories/queries/list-repository-paths.d.ts +3 -0
- package/dist/treedx/client/repositories/queries/list-repository-paths.js +7 -0
- package/dist/treedx/client/repositories/queries/list-repository-refs.d.ts +3 -0
- package/dist/treedx/client/repositories/queries/list-repository-refs.js +12 -0
- package/dist/treedx/client/repositories/queries/query-repository.d.ts +3 -0
- package/dist/treedx/client/repositories/queries/query-repository.js +7 -0
- package/dist/treedx/client/repositories/queries/read-repository-file.d.ts +3 -0
- package/dist/treedx/client/repositories/queries/read-repository-file.js +6 -0
- package/dist/treedx/client/repositories/queries/read-repository-files.d.ts +3 -0
- package/dist/treedx/client/repositories/queries/read-repository-files.js +7 -0
- package/dist/treedx/client/repositories/queries/search-repository-files.d.ts +3 -0
- package/dist/treedx/client/repositories/queries/search-repository-files.js +7 -0
- package/dist/treedx/client/support/contracts/treedx/artifacts/contracts/download-artifact.d.ts +3 -0
- package/dist/treedx/client/support/contracts/treedx/artifacts/contracts/download-artifact.js +9 -0
- package/dist/treedx/client/support/contracts/treedx/authorization/contracts/whoami.d.ts +3 -0
- package/dist/treedx/client/support/contracts/treedx/authorization/contracts/whoami.js +6 -0
- package/dist/treedx/client/support/contracts/treedx/graph/contracts/parse-context-dsl.d.ts +3 -0
- package/dist/treedx/client/support/contracts/treedx/graph/contracts/parse-context-dsl.js +7 -0
- package/dist/treedx/client/support/contracts/treedx/health/contracts/deep-health.d.ts +5 -0
- package/dist/treedx/client/support/contracts/treedx/health/contracts/deep-health.js +7 -0
- package/dist/treedx/client/support/contracts/treedx/health/contracts/health.d.ts +3 -0
- package/dist/treedx/client/support/contracts/treedx/health/contracts/health.js +6 -0
- package/dist/treedx/client/support/contracts/treedx/health/contracts/metrics.d.ts +3 -0
- package/dist/treedx/client/support/contracts/treedx/health/contracts/metrics.js +7 -0
- package/dist/treedx/client/support/contracts/treedx/health/contracts/prometheus-metrics.d.ts +2 -0
- package/dist/treedx/client/support/contracts/treedx/health/contracts/prometheus-metrics.js +19 -0
- package/dist/treedx/client/support/contracts/treedx/health/contracts/ready.d.ts +3 -0
- package/dist/treedx/client/support/contracts/treedx/health/contracts/ready.js +7 -0
- package/dist/treedx/client/support/contracts/treedx/health/contracts/status.d.ts +3 -0
- package/dist/treedx/client/support/contracts/treedx/health/contracts/status.js +6 -0
- package/dist/treedx/client/support/contracts/treedx/repositories/contracts/commit.d.ts +3 -0
- package/dist/treedx/client/support/contracts/treedx/repositories/contracts/commit.js +7 -0
- package/dist/treedx/client/support/contracts/treedx/repositories/contracts/diff.d.ts +3 -0
- package/dist/treedx/client/support/contracts/treedx/repositories/contracts/diff.js +6 -0
- package/dist/treedx/client/support/contracts/treedx/repositories/contracts/fetch-remote.d.ts +3 -0
- package/dist/treedx/client/support/contracts/treedx/repositories/contracts/fetch-remote.js +7 -0
- package/dist/treedx/client/support/contracts/treedx/repositories/contracts/push.d.ts +6 -0
- package/dist/treedx/client/support/contracts/treedx/repositories/contracts/push.js +23 -0
- package/dist/treedx/client/support/contracts/treedx/search/contracts/compact-search-index.d.ts +3 -0
- package/dist/treedx/client/support/contracts/treedx/search/contracts/compact-search-index.js +8 -0
- package/dist/treedx/client/support/contracts/treedx/search/contracts/search.d.ts +3 -0
- package/dist/treedx/client/support/contracts/treedx/search/contracts/search.js +7 -0
- package/dist/treedx/client/support/contracts/treedx/storage/contracts/backup-storage.d.ts +3 -0
- package/dist/treedx/client/support/contracts/treedx/storage/contracts/backup-storage.js +8 -0
- package/dist/treedx/client/support/contracts/treedx/storage/contracts/compact-storage.d.ts +3 -0
- package/dist/treedx/client/support/contracts/treedx/storage/contracts/compact-storage.js +8 -0
- package/dist/treedx/client/support/contracts/treedx/transport/contracts/assert-binary-ok.d.ts +2 -0
- package/dist/treedx/client/support/contracts/treedx/transport/contracts/assert-binary-ok.js +15 -0
- package/dist/treedx/client/support/contracts/treedx/transport/contracts/fetch-with-timeout.d.ts +2 -0
- package/dist/treedx/client/support/contracts/treedx/transport/contracts/fetch-with-timeout.js +38 -0
- package/dist/treedx/client/support/contracts/treedx/transport/contracts/headers.d.ts +2 -0
- package/dist/treedx/client/support/contracts/treedx/transport/contracts/headers.js +15 -0
- package/dist/treedx/client/support/contracts/treedx/transport/contracts/parse-json-response.d.ts +2 -0
- package/dist/treedx/client/support/contracts/treedx/transport/contracts/parse-json-response.js +15 -0
- package/dist/treedx/client/support/contracts/treedx/transport/contracts/query.d.ts +2 -0
- package/dist/treedx/client/support/contracts/treedx/transport/contracts/query.js +14 -0
- package/dist/treedx/client/support/contracts/treedx/transport/contracts/repo-id.d.ts +2 -0
- package/dist/treedx/client/support/contracts/treedx/transport/contracts/repo-id.js +14 -0
- package/dist/treedx/client/support/contracts/treedx/transport/contracts/request.d.ts +6 -0
- package/dist/treedx/client/support/contracts/treedx/transport/contracts/request.js +41 -0
- package/dist/treedx/client/support/contracts/treedx/transport/contracts/throw-api-error.d.ts +2 -0
- package/dist/treedx/client/support/contracts/treedx/transport/contracts/throw-api-error.js +14 -0
- package/dist/treedx/client/support/contracts/treedx/workspaces/contracts/exec.d.ts +3 -0
- package/dist/treedx/client/support/contracts/treedx/workspaces/contracts/exec.js +7 -0
- package/dist/treedx/client/support/creation/apply-changeset.d.ts +3 -0
- package/dist/treedx/client/support/creation/apply-changeset.js +10 -0
- package/dist/treedx/client/support/creation/apply-storage-migration.d.ts +3 -0
- package/dist/treedx/client/support/creation/apply-storage-migration.js +7 -0
- package/dist/treedx/client/support/creation/create-migration.d.ts +6 -0
- package/dist/treedx/client/support/creation/create-migration.js +7 -0
- package/dist/treedx/client/support/creation/export-artifact.d.ts +3 -0
- package/dist/treedx/client/support/creation/export-artifact.js +8 -0
- package/dist/treedx/client/support/creation/plan-storage-migration.d.ts +3 -0
- package/dist/treedx/client/support/creation/plan-storage-migration.js +7 -0
- package/dist/treedx/client/support/creation/request-binary.d.ts +6 -0
- package/dist/treedx/client/support/creation/request-binary.js +42 -0
- package/dist/treedx/client/support/creation/write-file.d.ts +3 -0
- package/dist/treedx/client/support/creation/write-file.js +10 -0
- package/dist/treedx/client/support/creation/write-files.d.ts +3 -0
- package/dist/treedx/client/support/creation/write-files.js +12 -0
- package/dist/treedx/client/support/queries/treedx/artifacts/queries/get-artifact.d.ts +3 -0
- package/dist/treedx/client/support/queries/treedx/artifacts/queries/get-artifact.js +7 -0
- package/dist/treedx/client/support/queries/treedx/artifacts/queries/list-artifacts.d.ts +3 -0
- package/dist/treedx/client/support/queries/treedx/artifacts/queries/list-artifacts.js +7 -0
- package/dist/treedx/client/support/queries/treedx/authorization/queries/effective-scope.d.ts +3 -0
- package/dist/treedx/client/support/queries/treedx/authorization/queries/effective-scope.js +9 -0
- package/dist/treedx/client/support/queries/treedx/authorization/queries/list-capabilities.d.ts +4 -0
- package/dist/treedx/client/support/queries/treedx/authorization/queries/list-capabilities.js +6 -0
- package/dist/treedx/client/support/queries/treedx/federation/queries/get-placement.d.ts +3 -0
- package/dist/treedx/client/support/queries/treedx/federation/queries/get-placement.js +7 -0
- package/dist/treedx/client/support/queries/treedx/graph/queries/get-node.d.ts +3 -0
- package/dist/treedx/client/support/queries/treedx/graph/queries/get-node.js +7 -0
- package/dist/treedx/client/support/queries/treedx/graph/queries/get-related.d.ts +3 -0
- package/dist/treedx/client/support/queries/treedx/graph/queries/get-related.js +7 -0
- package/dist/treedx/client/support/queries/treedx/graph/queries/list-nodes.d.ts +3 -0
- package/dist/treedx/client/support/queries/treedx/graph/queries/list-nodes.js +7 -0
- package/dist/treedx/client/support/queries/treedx/repositories/queries/list-tree.d.ts +3 -0
- package/dist/treedx/client/support/queries/treedx/repositories/queries/list-tree.js +10 -0
- package/dist/treedx/client/support/queries/treedx/repositories/queries/read-file.d.ts +3 -0
- package/dist/treedx/client/support/queries/treedx/repositories/queries/read-file.js +9 -0
- package/dist/treedx/client/support/queries/treedx/search/queries/get-search-index-status.d.ts +3 -0
- package/dist/treedx/client/support/queries/treedx/search/queries/get-search-index-status.js +7 -0
- package/dist/treedx/client/support/queries/treedx/storage/queries/get-migration.d.ts +6 -0
- package/dist/treedx/client/support/queries/treedx/storage/queries/get-migration.js +7 -0
- package/dist/treedx/client/support/queries/treedx/storage/queries/get-snapshot.d.ts +6 -0
- package/dist/treedx/client/support/queries/treedx/storage/queries/get-snapshot.js +7 -0
- package/dist/treedx/client/support/queries/treedx/storage/queries/list-storage-migrations.d.ts +6 -0
- package/dist/treedx/client/support/queries/treedx/storage/queries/list-storage-migrations.js +6 -0
- package/dist/treedx/client/support/queries/treedx/transport/queries/list-audit-events.d.ts +15 -0
- package/dist/treedx/client/support/queries/treedx/transport/queries/list-audit-events.js +6 -0
- package/dist/treedx/client/support/queries/treedx/transport/queries/list-repositories.d.ts +3 -0
- package/dist/treedx/client/support/queries/treedx/transport/queries/list-repositories.js +7 -0
- package/dist/treedx/client/support/retirement/cleanup-artifacts.d.ts +3 -0
- package/dist/treedx/client/support/retirement/cleanup-artifacts.js +7 -0
- package/dist/treedx/client/support/retirement/delete-artifact.d.ts +3 -0
- package/dist/treedx/client/support/retirement/delete-artifact.js +7 -0
- package/dist/treedx/client/support/retirement/delete-file.d.ts +3 -0
- package/dist/treedx/client/support/retirement/delete-file.js +10 -0
- package/dist/treedx/client/support/retirement/rollback-storage-migration.d.ts +3 -0
- package/dist/treedx/client/support/retirement/rollback-storage-migration.js +7 -0
- package/dist/treedx/client/support/updates/patch-file.d.ts +3 -0
- package/dist/treedx/client/support/updates/patch-file.js +10 -0
- package/dist/treedx/client/support/updates/refresh-search-index.d.ts +3 -0
- package/dist/treedx/client/support/updates/refresh-search-index.js +8 -0
- package/dist/treedx/client/treedx/blobs/contracts/download-blob.d.ts +3 -0
- package/dist/treedx/client/treedx/blobs/contracts/download-blob.js +6 -0
- package/dist/treedx/client/treedx/blobs/creation/create-blob-upload.d.ts +3 -0
- package/dist/treedx/client/treedx/blobs/creation/create-blob-upload.js +8 -0
- package/dist/treedx/client/treedx/blobs/creation/request-blob-download.d.ts +3 -0
- package/dist/treedx/client/treedx/blobs/creation/request-blob-download.js +27 -0
- package/dist/treedx/client/treedx/blobs/creation/request-blob-upload.d.ts +3 -0
- package/dist/treedx/client/treedx/blobs/creation/request-blob-upload.js +41 -0
- package/dist/treedx/client/treedx/blobs/creation/upload-blob-part.d.ts +3 -0
- package/dist/treedx/client/treedx/blobs/creation/upload-blob-part.js +27 -0
- package/dist/treedx/client/treedx/blobs/creation/upload-blob.d.ts +3 -0
- package/dist/treedx/client/treedx/blobs/creation/upload-blob.js +6 -0
- package/dist/treedx/client/treedx/blobs/creation/write-blob.d.ts +3 -0
- package/dist/treedx/client/treedx/blobs/creation/write-blob.js +8 -0
- package/dist/treedx/client/treedx/blobs/lifecycle/complete-blob-upload.d.ts +3 -0
- package/dist/treedx/client/treedx/blobs/lifecycle/complete-blob-upload.js +8 -0
- package/dist/treedx/client/treedx/blobs/queries/read-blob.d.ts +3 -0
- package/dist/treedx/client/treedx/blobs/queries/read-blob.js +10 -0
- package/dist/treedx/client/treedx/blobs/retirement/abort-blob-upload.d.ts +3 -0
- package/dist/treedx/client/treedx/blobs/retirement/abort-blob-upload.js +7 -0
- package/dist/treedx/client/treedx/blobs/retirement/delete-blob.d.ts +3 -0
- package/dist/treedx/client/treedx/blobs/retirement/delete-blob.js +8 -0
- package/dist/treedx/client/treedx/federation/contracts/federated-query.d.ts +3 -0
- package/dist/treedx/client/treedx/federation/contracts/federated-query.js +7 -0
- package/dist/treedx/client/treedx/federation/creation/plan-federated-query.d.ts +3 -0
- package/dist/treedx/client/treedx/federation/creation/plan-federated-query.js +6 -0
- package/dist/treedx/client/treedx/federation/queries/check-mirror-health.d.ts +3 -0
- package/dist/treedx/client/treedx/federation/queries/check-mirror-health.js +7 -0
- package/dist/treedx/client/treedx/federation/updates/promote-mirror.d.ts +3 -0
- package/dist/treedx/client/treedx/federation/updates/promote-mirror.js +7 -0
- package/dist/treedx/client/treedx/federation/updates/sync-mirror.d.ts +3 -0
- package/dist/treedx/client/treedx/federation/updates/sync-mirror.js +7 -0
- package/dist/treedx/client/treedx/graph/contracts/federated-context.d.ts +3 -0
- package/dist/treedx/client/treedx/graph/contracts/federated-context.js +7 -0
- package/dist/treedx/client/treedx/graph/contracts/federated-graph.d.ts +3 -0
- package/dist/treedx/client/treedx/graph/contracts/federated-graph.js +7 -0
- package/dist/treedx/client/treedx/graph/contracts/graph-search.d.ts +3 -0
- package/dist/treedx/client/treedx/graph/contracts/graph-search.js +8 -0
- package/dist/treedx/client/treedx/graph/queries/get-graph-node.d.ts +3 -0
- package/dist/treedx/client/treedx/graph/queries/get-graph-node.js +10 -0
- package/dist/treedx/client/treedx/graph/queries/get-graph-refresh-job.d.ts +3 -0
- package/dist/treedx/client/treedx/graph/queries/get-graph-refresh-job.js +7 -0
- package/dist/treedx/client/treedx/graph/queries/get-subgraph.d.ts +3 -0
- package/dist/treedx/client/treedx/graph/queries/get-subgraph.js +7 -0
- package/dist/treedx/client/treedx/graph/queries/query-graph.d.ts +3 -0
- package/dist/treedx/client/treedx/graph/queries/query-graph.js +7 -0
- package/dist/treedx/client/treedx/graph/queries/search-graph-entities.d.ts +3 -0
- package/dist/treedx/client/treedx/graph/queries/search-graph-entities.js +6 -0
- package/dist/treedx/client/treedx/graph/queries/search-graph-files.d.ts +3 -0
- package/dist/treedx/client/treedx/graph/queries/search-graph-files.js +6 -0
- package/dist/treedx/client/treedx/graph/queries/search-graph-sections.d.ts +3 -0
- package/dist/treedx/client/treedx/graph/queries/search-graph-sections.js +6 -0
- package/dist/treedx/client/treedx/graph/updates/refresh-graph.d.ts +3 -0
- package/dist/treedx/client/treedx/graph/updates/refresh-graph.js +7 -0
- package/dist/treedx/client/treedx/search/contracts/federated-search.d.ts +3 -0
- package/dist/treedx/client/treedx/search/contracts/federated-search.js +7 -0
- package/dist/treedx/client/treedx/workspaces/creation/create-workspace.d.ts +3 -0
- package/dist/treedx/client/treedx/workspaces/creation/create-workspace.js +7 -0
- package/dist/treedx/client/treedx/workspaces/retirement/abandon-workspace.d.ts +3 -0
- package/dist/treedx/client/treedx/workspaces/retirement/abandon-workspace.js +12 -0
- package/dist/treedx/client/treedx/workspaces/retirement/close-workspace.d.ts +2 -0
- package/dist/treedx/client/treedx/workspaces/retirement/close-workspace.js +6 -0
- package/dist/treedx/generated/openapi-types.d.ts +104 -0
- package/dist/treedx/support/client.d.ts +251 -0
- package/dist/treedx/support/client.js +252 -0
- package/dist/treedx/support/errors.d.ts +13 -0
- package/dist/treedx/types/tree-dx-actor.d.ts +209 -0
- package/dist/treedx/types/tree-dx-actor.js +8 -0
- package/dist/treedx/types/tree-dx-artifact-list-response.d.ts +13 -0
- package/dist/treedx/types/tree-dx-artifact-list-response.js +0 -0
- package/dist/treedx/types/tree-dx-changeset.d.ts +51 -0
- package/dist/treedx/types/tree-dx-changeset.js +6 -0
- package/dist/treedx/types/tree-dx-context-request.d.ts +245 -0
- package/dist/treedx/types/tree-dx-context-request.js +0 -0
- package/dist/treedx/types/tree-dx-exec-result.d.ts +249 -0
- package/dist/treedx/types/tree-dx-exec-result.js +0 -0
- package/dist/treedx/types/tree-dx-list-tree-request.d.ts +222 -0
- package/dist/treedx/types/tree-dx-list-tree-request.js +0 -0
- package/dist/treedx/types/tree-dx-push-request.d.ts +229 -0
- package/dist/treedx/types/tree-dx-push-request.js +0 -0
- package/dist/treedx/types.d.ts +7 -1084
- package/dist/treedx/types.js +7 -8
- package/dist/types/agents/agent-activity-profile.d.ts +267 -0
- package/dist/types/agents/agent-activity-profile.js +0 -0
- package/dist/types/agents/agent-trigger-kinds.d.ts +189 -0
- package/dist/types/agents/agent-trigger-kinds.js +107 -0
- package/dist/types/agents/execution-run-ref.d.ts +136 -0
- package/dist/types/agents/execution-run-ref.js +0 -0
- package/dist/types/agents.d.ts +3 -493
- package/dist/types/agents.js +3 -95
- package/package.json +77 -362
- package/dist/agent-capacity.d.ts +0 -1100
- package/dist/agent-capacity.js +0 -1822
- package/dist/agent-tools.d.ts +0 -37
- package/dist/agent-tools.js +0 -301
- package/dist/api/app.d.ts +0 -8
- package/dist/api/app.js +0 -404
- package/dist/api/auth/d1-database.d.ts +0 -3
- package/dist/api/auth/d1-database.js +0 -20
- package/dist/api/auth/d1-provider.d.ts +0 -85
- package/dist/api/auth/d1-provider.js +0 -95
- package/dist/api/auth/d1-store.d.ts +0 -121
- package/dist/api/auth/d1-store.js +0 -990
- package/dist/api/auth/memory-provider.d.ts +0 -82
- package/dist/api/auth/memory-provider.js +0 -297
- package/dist/api/auth/rbac.d.ts +0 -22
- package/dist/api/auth/rbac.js +0 -162
- package/dist/api/auth/tokens.d.ts +0 -18
- package/dist/api/auth/tokens.js +0 -56
- package/dist/api/config.d.ts +0 -4
- package/dist/api/config.js +0 -149
- package/dist/api/http.d.ts +0 -28
- package/dist/api/http.js +0 -51
- package/dist/api/index.d.ts +0 -10
- package/dist/api/index.js +0 -29
- package/dist/api/operations-routes.d.ts +0 -11
- package/dist/api/operations-routes.js +0 -39
- package/dist/api/operations.d.ts +0 -3
- package/dist/api/operations.js +0 -26
- package/dist/api/providers.d.ts +0 -2
- package/dist/api/providers.js +0 -85
- package/dist/api/railway.d.ts +0 -53
- package/dist/api/railway.js +0 -71
- package/dist/api/sdk-dispatch.d.ts +0 -6
- package/dist/api/sdk-dispatch.js +0 -14
- package/dist/api/sdk-routes.d.ts +0 -11
- package/dist/api/sdk-routes.js +0 -29
- package/dist/api/templates.d.ts +0 -3
- package/dist/api/templates.js +0 -31
- package/dist/api/types.d.ts +0 -238
- package/dist/capacity-provider.d.ts +0 -494
- package/dist/capacity-provider.js +0 -727
- package/dist/capacity.d.ts +0 -483
- package/dist/capacity.js +0 -2331
- package/dist/cli-tools.d.ts +0 -3
- package/dist/cli-tools.js +0 -46
- package/dist/content-operations.d.ts +0 -97
- package/dist/content-operations.js +0 -250
- package/dist/content-store.d.ts +0 -25
- package/dist/content-store.js +0 -269
- package/dist/control-plane-client.d.ts +0 -203
- package/dist/control-plane-client.js +0 -540
- package/dist/control-plane.d.ts +0 -101
- package/dist/control-plane.js +0 -201
- package/dist/copilot.d.ts +0 -18
- package/dist/copilot.js +0 -90
- package/dist/d1-http.d.ts +0 -38
- package/dist/d1-http.js +0 -95
- package/dist/d1-store.d.ts +0 -336
- package/dist/d1-store.js +0 -1431
- package/dist/db/d1.d.ts +0 -246
- package/dist/db/d1.js +0 -8
- package/dist/db/index.d.ts +0 -3
- package/dist/db/index.js +0 -3
- package/dist/db/market-schema.d.ts +0 -83651
- package/dist/db/market-schema.js +0 -3725
- package/dist/db/node-sqlite.d.ts +0 -297
- package/dist/db/node-sqlite.js +0 -133
- package/dist/db/schema.d.ts +0 -483
- package/dist/db/schema.js +0 -29
- package/dist/dispatch.d.ts +0 -4
- package/dist/dispatch.js +0 -174
- package/dist/field-aliases.d.ts +0 -11
- package/dist/fixture-support.d.ts +0 -24
- package/dist/fixture-support.js +0 -385
- package/dist/frontmatter.d.ts +0 -6
- package/dist/frontmatter.js +0 -33
- package/dist/git-runtime.d.ts +0 -16
- package/dist/git-runtime.js +0 -69
- package/dist/governance.d.ts +0 -133
- package/dist/governance.js +0 -285
- package/dist/graph/build.d.ts +0 -19
- package/dist/graph/build.js +0 -949
- package/dist/graph/dsl.d.ts +0 -2
- package/dist/graph/dsl.js +0 -243
- package/dist/graph/query.d.ts +0 -47
- package/dist/graph/query.js +0 -447
- package/dist/graph/ranking.d.ts +0 -3
- package/dist/graph/ranking.js +0 -483
- package/dist/graph/schema.d.ts +0 -142
- package/dist/graph/schema.js +0 -137
- package/dist/graph.d.ts +0 -52
- package/dist/graph.js +0 -133
- package/dist/guarantees/index.d.ts +0 -512
- package/dist/guarantees/index.js +0 -1782
- package/dist/hosting/apps.d.ts +0 -12
- package/dist/hosting/apps.js +0 -107
- package/dist/hosting/builtins.d.ts +0 -25
- package/dist/hosting/builtins.js +0 -685
- package/dist/hosting/contracts.d.ts +0 -190
- package/dist/hosting/graph.d.ts +0 -110
- package/dist/hosting/graph.js +0 -993
- package/dist/hosting/index.d.ts +0 -4
- package/dist/hosting/index.js +0 -4
- package/dist/index.d.ts +0 -88
- package/dist/index.js +0 -757
- package/dist/local-dev/managed-dev.d.ts +0 -85
- package/dist/local-dev/managed-dev.js +0 -431
- package/dist/managed-dependencies.d.ts +0 -91
- package/dist/managed-dependencies.js +0 -1186
- package/dist/market-client.d.ts +0 -831
- package/dist/market-client.js +0 -1219
- package/dist/model-registry.d.ts +0 -8
- package/dist/model-registry.js +0 -674
- package/dist/operations/agent-tools.d.ts +0 -105
- package/dist/operations/agent-tools.js +0 -171
- package/dist/operations/providers/default.d.ts +0 -10
- package/dist/operations/providers/default.js +0 -1245
- package/dist/operations/repository-operations.d.ts +0 -158
- package/dist/operations/repository-operations.js +0 -851
- package/dist/operations/runtime.d.ts +0 -7
- package/dist/operations/runtime.js +0 -61
- package/dist/operations/services/bootstrap-runner.d.ts +0 -39
- package/dist/operations/services/bootstrap-runner.js +0 -191
- package/dist/operations/services/build-warning-policy.d.ts +0 -34
- package/dist/operations/services/build-warning-policy.js +0 -91
- package/dist/operations/services/commit-message-provider.d.ts +0 -65
- package/dist/operations/services/commit-message-provider.js +0 -496
- package/dist/operations/services/config-runtime.d.ts +0 -558
- package/dist/operations/services/config-runtime.js +0 -3494
- package/dist/operations/services/d1-migration.d.ts +0 -6
- package/dist/operations/services/d1-migration.js +0 -120
- package/dist/operations/services/deploy.d.ts +0 -645
- package/dist/operations/services/deploy.js +0 -3826
- package/dist/operations/services/deployment-readiness.d.ts +0 -30
- package/dist/operations/services/deployment-readiness.js +0 -217
- package/dist/operations/services/export-runtime.d.ts +0 -18
- package/dist/operations/services/export-runtime.js +0 -140
- package/dist/operations/services/git-remote-policy.d.ts +0 -9
- package/dist/operations/services/git-remote-policy.js +0 -63
- package/dist/operations/services/git-runner.d.ts +0 -68
- package/dist/operations/services/git-runner.js +0 -500
- package/dist/operations/services/git-workflow.d.ts +0 -255
- package/dist/operations/services/git-workflow.js +0 -845
- package/dist/operations/services/github-actions-verification.d.ts +0 -148
- package/dist/operations/services/github-actions-verification.js +0 -589
- package/dist/operations/services/github-api.d.ts +0 -279
- package/dist/operations/services/github-api.js +0 -936
- package/dist/operations/services/github-automation.d.ts +0 -230
- package/dist/operations/services/github-automation.js +0 -520
- package/dist/operations/services/github-credentials.d.ts +0 -13
- package/dist/operations/services/github-credentials.js +0 -59
- package/dist/operations/services/hosted-service-checks.d.ts +0 -82
- package/dist/operations/services/hosted-service-checks.js +0 -527
- package/dist/operations/services/hosting-audit.d.ts +0 -69
- package/dist/operations/services/hosting-audit.js +0 -638
- package/dist/operations/services/hub-launch.d.ts +0 -182
- package/dist/operations/services/hub-launch.js +0 -309
- package/dist/operations/services/hub-provider-launch.d.ts +0 -160
- package/dist/operations/services/hub-provider-launch.js +0 -1056
- package/dist/operations/services/key-agent.d.ts +0 -137
- package/dist/operations/services/key-agent.js +0 -641
- package/dist/operations/services/live-hosted-service-checks.d.ts +0 -30
- package/dist/operations/services/live-hosted-service-checks.js +0 -611
- package/dist/operations/services/local-cleanup.d.ts +0 -30
- package/dist/operations/services/local-cleanup.js +0 -77
- package/dist/operations/services/local-dev.d.ts +0 -8
- package/dist/operations/services/local-dev.js +0 -97
- package/dist/operations/services/managed-host-security.d.ts +0 -13
- package/dist/operations/services/managed-host-security.js +0 -56
- package/dist/operations/services/managed-repositories.d.ts +0 -37
- package/dist/operations/services/managed-repositories.js +0 -177
- package/dist/operations/services/market-packaging.d.ts +0 -59
- package/dist/operations/services/market-packaging.js +0 -234
- package/dist/operations/services/operations-runner-smoke.d.ts +0 -31
- package/dist/operations/services/operations-runner-smoke.js +0 -212
- package/dist/operations/services/package-adapters.d.ts +0 -184
- package/dist/operations/services/package-adapters.js +0 -912
- package/dist/operations/services/package-artifacts.d.ts +0 -37
- package/dist/operations/services/package-artifacts.js +0 -99
- package/dist/operations/services/package-reference-policy.d.ts +0 -64
- package/dist/operations/services/package-reference-policy.js +0 -364
- package/dist/operations/services/project-host-operations.d.ts +0 -153
- package/dist/operations/services/project-host-operations.js +0 -365
- package/dist/operations/services/project-platform.d.ts +0 -727
- package/dist/operations/services/project-platform.js +0 -1603
- package/dist/operations/services/project-web-monitor.d.ts +0 -15
- package/dist/operations/services/project-web-monitor.js +0 -377
- package/dist/operations/services/railway-api.d.ts +0 -494
- package/dist/operations/services/railway-api.js +0 -1874
- package/dist/operations/services/railway-cli.d.ts +0 -47
- package/dist/operations/services/railway-cli.js +0 -142
- package/dist/operations/services/railway-deploy.d.ts +0 -161
- package/dist/operations/services/railway-deploy.js +0 -1808
- package/dist/operations/services/railway-source-policy.d.ts +0 -25
- package/dist/operations/services/railway-source-policy.js +0 -111
- package/dist/operations/services/release-history.d.ts +0 -59
- package/dist/operations/services/release-history.js +0 -158
- package/dist/operations/services/release-proof-ledger.d.ts +0 -13
- package/dist/operations/services/release-proof-ledger.js +0 -81
- package/dist/operations/services/release-proof-planner.d.ts +0 -48
- package/dist/operations/services/release-proof-planner.js +0 -195
- package/dist/operations/services/release-proof-runner.d.ts +0 -16
- package/dist/operations/services/release-proof-runner.js +0 -169
- package/dist/operations/services/release-proof.d.ts +0 -81
- package/dist/operations/services/release-proof.js +0 -79
- package/dist/operations/services/repository-save-orchestrator.d.ts +0 -193
- package/dist/operations/services/repository-save-orchestrator.js +0 -2110
- package/dist/operations/services/runtime-paths.d.ts +0 -19
- package/dist/operations/services/runtime-paths.js +0 -54
- package/dist/operations/services/runtime-tools.d.ts +0 -35
- package/dist/operations/services/runtime-tools.js +0 -212
- package/dist/operations/services/save-deploy-preflight.d.ts +0 -32
- package/dist/operations/services/save-deploy-preflight.js +0 -82
- package/dist/operations/services/template-host-bindings.d.ts +0 -68
- package/dist/operations/services/template-host-bindings.js +0 -401
- package/dist/operations/services/template-registry.d.ts +0 -110
- package/dist/operations/services/template-registry.js +0 -595
- package/dist/operations/services/template-secret-sync.d.ts +0 -97
- package/dist/operations/services/template-secret-sync.js +0 -292
- package/dist/operations/services/verification-cache.d.ts +0 -25
- package/dist/operations/services/verification-cache.js +0 -71
- package/dist/operations/services/watch-dev.d.ts +0 -21
- package/dist/operations/services/watch-dev.js +0 -282
- package/dist/operations/services/workflow-timing.d.ts +0 -25
- package/dist/operations/services/workflow-timing.js +0 -79
- package/dist/operations/services/workspace-dependency-mode.d.ts +0 -74
- package/dist/operations/services/workspace-dependency-mode.js +0 -478
- package/dist/operations/services/workspace-preflight.d.ts +0 -40
- package/dist/operations/services/workspace-preflight.js +0 -172
- package/dist/operations/services/workspace-save-script.d.ts +0 -26
- package/dist/operations/services/workspace-save-script.js +0 -50
- package/dist/operations/services/workspace-save.d.ts +0 -76
- package/dist/operations/services/workspace-save.js +0 -453
- package/dist/operations/services/workspace-tools.d.ts +0 -17
- package/dist/operations/services/workspace-tools.js +0 -320
- package/dist/operations-registry.d.ts +0 -5
- package/dist/operations-registry.js +0 -98
- package/dist/operations-types.d.ts +0 -75
- package/dist/operations-types.js +0 -17
- package/dist/operations.d.ts +0 -17
- package/dist/operations.js +0 -114
- package/dist/platform/book-export.d.ts +0 -78
- package/dist/platform/book-export.js +0 -451
- package/dist/platform/books-data.d.ts +0 -28
- package/dist/platform/books-data.js +0 -111
- package/dist/platform/config.d.ts +0 -27
- package/dist/platform/config.js +0 -100
- package/dist/platform/content-runtime-source.d.ts +0 -54
- package/dist/platform/content-runtime-source.js +0 -169
- package/dist/platform/contracts.d.ts +0 -361
- package/dist/platform/deploy-config.d.ts +0 -17
- package/dist/platform/deploy-config.js +0 -731
- package/dist/platform/deploy-runtime.d.ts +0 -22
- package/dist/platform/deploy-runtime.js +0 -93
- package/dist/platform/desired-state.d.ts +0 -66
- package/dist/platform/desired-state.js +0 -1071
- package/dist/platform/env.yaml +0 -1126
- package/dist/platform/environment.d.ts +0 -159
- package/dist/platform/environment.js +0 -778
- package/dist/platform/local-content-materialization.d.ts +0 -9
- package/dist/platform/local-content-materialization.js +0 -212
- package/dist/platform/plugin.d.ts +0 -103
- package/dist/platform/plugin.js +0 -6
- package/dist/platform/plugins/constants.d.ts +0 -26
- package/dist/platform/plugins/constants.js +0 -33
- package/dist/platform/plugins/runtime.d.ts +0 -41
- package/dist/platform/plugins/runtime.js +0 -257
- package/dist/platform/plugins.d.ts +0 -6
- package/dist/platform/plugins.js +0 -42
- package/dist/platform/published-content-pipeline.d.ts +0 -84
- package/dist/platform/published-content-pipeline.js +0 -547
- package/dist/platform/published-content.d.ts +0 -224
- package/dist/platform/published-content.js +0 -611
- package/dist/platform/site-config-schema.d.ts +0 -1
- package/dist/platform/site-config-schema.js +0 -4
- package/dist/platform/tenant/runtime-config.d.ts +0 -154
- package/dist/platform/tenant/runtime-config.js +0 -69
- package/dist/platform/tenant-config.d.ts +0 -8
- package/dist/platform/tenant-config.js +0 -207
- package/dist/platform/utils/site-config-schema.d.ts +0 -154
- package/dist/platform/utils/site-config-schema.js +0 -450
- package/dist/platform-operation-store.d.ts +0 -94
- package/dist/platform-operation-store.js +0 -531
- package/dist/platform-operations.d.ts +0 -273
- package/dist/platform-operations.js +0 -440
- package/dist/plugin-default.d.ts +0 -28
- package/dist/plugin-default.js +0 -55
- package/dist/project-import.d.ts +0 -91
- package/dist/project-import.js +0 -257
- package/dist/project-workflow.d.ts +0 -233
- package/dist/project-workflow.js +0 -82
- package/dist/reconcile/bootstrap-systems.d.ts +0 -32
- package/dist/reconcile/bootstrap-systems.js +0 -175
- package/dist/reconcile/builtin-adapters.d.ts +0 -9
- package/dist/reconcile/builtin-adapters.js +0 -5545
- package/dist/reconcile/contracts.d.ts +0 -172
- package/dist/reconcile/desired-state.d.ts +0 -10
- package/dist/reconcile/desired-state.js +0 -322
- package/dist/reconcile/engine.d.ts +0 -118
- package/dist/reconcile/engine.js +0 -645
- package/dist/reconcile/errors.d.ts +0 -5
- package/dist/reconcile/errors.js +0 -13
- package/dist/reconcile/index.d.ts +0 -10
- package/dist/reconcile/index.js +0 -10
- package/dist/reconcile/live-acceptance.d.ts +0 -100
- package/dist/reconcile/live-acceptance.js +0 -2018
- package/dist/reconcile/platform.d.ts +0 -104
- package/dist/reconcile/platform.js +0 -100
- package/dist/reconcile/providers/docker-private.d.ts +0 -54
- package/dist/reconcile/providers/docker-private.js +0 -101
- package/dist/reconcile/providers/github-private.d.ts +0 -69
- package/dist/reconcile/providers/github-private.js +0 -145
- package/dist/reconcile/providers/local-private.d.ts +0 -28
- package/dist/reconcile/providers/local-private.js +0 -75
- package/dist/reconcile/providers/railway-iac.d.ts +0 -220
- package/dist/reconcile/providers/railway-iac.js +0 -621
- package/dist/reconcile/providers/release-private.d.ts +0 -89
- package/dist/reconcile/providers/release-private.js +0 -140
- package/dist/reconcile/registry.d.ts +0 -7
- package/dist/reconcile/registry.js +0 -79
- package/dist/reconcile/state.d.ts +0 -7
- package/dist/reconcile/state.js +0 -270
- package/dist/reconcile/units.d.ts +0 -6
- package/dist/reconcile/units.js +0 -72
- package/dist/remote.d.ts +0 -244
- package/dist/remote.js +0 -284
- package/dist/scenes/artifacts.d.ts +0 -16
- package/dist/scenes/artifacts.js +0 -61
- package/dist/scenes/auth.d.ts +0 -2
- package/dist/scenes/auth.js +0 -28
- package/dist/scenes/base-url.d.ts +0 -12
- package/dist/scenes/base-url.js +0 -123
- package/dist/scenes/builtin-plugins.d.ts +0 -2
- package/dist/scenes/builtin-plugins.js +0 -499
- package/dist/scenes/checkpoints.d.ts +0 -14
- package/dist/scenes/checkpoints.js +0 -33
- package/dist/scenes/device-matrix.d.ts +0 -2
- package/dist/scenes/device-matrix.js +0 -100
- package/dist/scenes/devices.d.ts +0 -11
- package/dist/scenes/devices.js +0 -40
- package/dist/scenes/diagnostics.d.ts +0 -5
- package/dist/scenes/diagnostics.js +0 -22
- package/dist/scenes/diagram-providers.d.ts +0 -2
- package/dist/scenes/diagram-providers.js +0 -181
- package/dist/scenes/diagram-validation.d.ts +0 -22
- package/dist/scenes/diagram-validation.js +0 -74
- package/dist/scenes/environment.d.ts +0 -2
- package/dist/scenes/environment.js +0 -65
- package/dist/scenes/evidence-bundle.d.ts +0 -5
- package/dist/scenes/evidence-bundle.js +0 -42
- package/dist/scenes/evidence-report.d.ts +0 -10
- package/dist/scenes/evidence-report.js +0 -73
- package/dist/scenes/evidence.d.ts +0 -16
- package/dist/scenes/evidence.js +0 -277
- package/dist/scenes/index.d.ts +0 -48
- package/dist/scenes/index.js +0 -312
- package/dist/scenes/inspect.d.ts +0 -9
- package/dist/scenes/inspect.js +0 -64
- package/dist/scenes/loader.d.ts +0 -3
- package/dist/scenes/loader.js +0 -38
- package/dist/scenes/logs.d.ts +0 -2
- package/dist/scenes/logs.js +0 -47
- package/dist/scenes/operations.d.ts +0 -3
- package/dist/scenes/operations.js +0 -128
- package/dist/scenes/phase0.d.ts +0 -9
- package/dist/scenes/phase0.js +0 -637
- package/dist/scenes/planner.d.ts +0 -12
- package/dist/scenes/planner.js +0 -166
- package/dist/scenes/playwright-adapter.d.ts +0 -2
- package/dist/scenes/playwright-adapter.js +0 -63
- package/dist/scenes/plugins.d.ts +0 -5
- package/dist/scenes/plugins.js +0 -115
- package/dist/scenes/progress.d.ts +0 -17
- package/dist/scenes/progress.js +0 -24
- package/dist/scenes/publish-destinations.d.ts +0 -12
- package/dist/scenes/publish-destinations.js +0 -99
- package/dist/scenes/publish-plan-report.d.ts +0 -10
- package/dist/scenes/publish-plan-report.js +0 -70
- package/dist/scenes/publish-plan.d.ts +0 -15
- package/dist/scenes/publish-plan.js +0 -248
- package/dist/scenes/publish-redaction.d.ts +0 -16
- package/dist/scenes/publish-redaction.js +0 -148
- package/dist/scenes/publish-release-record.d.ts +0 -13
- package/dist/scenes/publish-release-record.js +0 -34
- package/dist/scenes/publish-report.d.ts +0 -10
- package/dist/scenes/publish-report.js +0 -67
- package/dist/scenes/publish.d.ts +0 -16
- package/dist/scenes/publish.js +0 -298
- package/dist/scenes/registry.d.ts +0 -12
- package/dist/scenes/registry.js +0 -65
- package/dist/scenes/remotion-adapter.d.ts +0 -3
- package/dist/scenes/remotion-adapter.js +0 -94
- package/dist/scenes/remotion-composition-registry.d.ts +0 -2
- package/dist/scenes/remotion-composition-registry.js +0 -12
- package/dist/scenes/remotion-compositions.d.ts +0 -15
- package/dist/scenes/remotion-compositions.js +0 -464
- package/dist/scenes/remotion-diagrams.d.ts +0 -9
- package/dist/scenes/remotion-diagrams.js +0 -188
- package/dist/scenes/remotion-input.d.ts +0 -13
- package/dist/scenes/remotion-input.js +0 -291
- package/dist/scenes/remotion-visuals.d.ts +0 -29
- package/dist/scenes/remotion-visuals.js +0 -198
- package/dist/scenes/render-media-assets.d.ts +0 -9
- package/dist/scenes/render-media-assets.js +0 -117
- package/dist/scenes/render-report.d.ts +0 -10
- package/dist/scenes/render-report.js +0 -27
- package/dist/scenes/render.d.ts +0 -2
- package/dist/scenes/render.js +0 -218
- package/dist/scenes/reporter.d.ts +0 -3
- package/dist/scenes/reporter.js +0 -101
- package/dist/scenes/resume.d.ts +0 -2
- package/dist/scenes/resume.js +0 -79
- package/dist/scenes/runner.d.ts +0 -2
- package/dist/scenes/runner.js +0 -687
- package/dist/scenes/schema.d.ts +0 -6
- package/dist/scenes/schema.js +0 -1023
- package/dist/scenes/seed.d.ts +0 -2
- package/dist/scenes/seed.js +0 -83
- package/dist/scenes/segments.d.ts +0 -15
- package/dist/scenes/segments.js +0 -79
- package/dist/scenes/selectors.d.ts +0 -3
- package/dist/scenes/selectors.js +0 -21
- package/dist/scenes/timeline.d.ts +0 -11
- package/dist/scenes/timeline.js +0 -26
- package/dist/scenes/timeouts.d.ts +0 -6
- package/dist/scenes/timeouts.js +0 -17
- package/dist/scenes/training-captions.d.ts +0 -14
- package/dist/scenes/training-captions.js +0 -98
- package/dist/scenes/training-report.d.ts +0 -10
- package/dist/scenes/training-report.js +0 -78
- package/dist/scenes/training-transcript.d.ts +0 -24
- package/dist/scenes/training-transcript.js +0 -204
- package/dist/scenes/training.d.ts +0 -10
- package/dist/scenes/training.js +0 -134
- package/dist/scenes/types.d.ts +0 -1900
- package/dist/scenes/types.js +0 -8
- package/dist/scenes/visual-audit-contact-sheets.d.ts +0 -6
- package/dist/scenes/visual-audit-contact-sheets.js +0 -119
- package/dist/scenes/visual-audit-fixtures.d.ts +0 -25
- package/dist/scenes/visual-audit-fixtures.js +0 -247
- package/dist/scenes/visual-audit-report.d.ts +0 -11
- package/dist/scenes/visual-audit-report.js +0 -85
- package/dist/scenes/visual-audit-review.d.ts +0 -23
- package/dist/scenes/visual-audit-review.js +0 -829
- package/dist/scenes/visual-audit-routes.d.ts +0 -13
- package/dist/scenes/visual-audit-routes.js +0 -308
- package/dist/scenes/visual-audit.d.ts +0 -3
- package/dist/scenes/visual-audit.js +0 -596
- package/dist/scripts/aggregate-book.js +0 -16
- package/dist/scripts/assert-release-tag-version.js +0 -23
- package/dist/scripts/build-dist.js +0 -294
- package/dist/scripts/build-tenant-worker.js +0 -36
- package/dist/scripts/check-build-warnings.js +0 -51
- package/dist/scripts/cleanup-markdown.js +0 -377
- package/dist/scripts/cli-test-fixtures.js +0 -44
- package/dist/scripts/config-treeseed.js +0 -131
- package/dist/scripts/deployment-readiness.js +0 -20
- package/dist/scripts/generate-treedx-openapi-types.js +0 -186
- package/dist/scripts/install-managed-dependencies.js +0 -12
- package/dist/scripts/key-agent.js +0 -165
- package/dist/scripts/local-dev.js +0 -129
- package/dist/scripts/migrate-journey-csv-to-guarantees.js +0 -140
- package/dist/scripts/operations-runner-smoke.js +0 -16
- package/dist/scripts/package-tools.js +0 -85
- package/dist/scripts/patch-starlight-content-path.js +0 -173
- package/dist/scripts/prepare.js +0 -10
- package/dist/scripts/publish-package.js +0 -29
- package/dist/scripts/release-verify.js +0 -105
- package/dist/scripts/run-fixture-astro-command.js +0 -18
- package/dist/scripts/scaffold-site.js +0 -66
- package/dist/scripts/sync-template.js +0 -20
- package/dist/scripts/template-catalog.test.js +0 -86
- package/dist/scripts/template-command.js +0 -31
- package/dist/scripts/tenant-astro-command.js +0 -3
- package/dist/scripts/tenant-build.js +0 -48
- package/dist/scripts/tenant-check.js +0 -10
- package/dist/scripts/tenant-d1-migrate-local.js +0 -15
- package/dist/scripts/tenant-deploy.js +0 -220
- package/dist/scripts/tenant-destroy.js +0 -112
- package/dist/scripts/tenant-dev.js +0 -160
- package/dist/scripts/tenant-lint.js +0 -4
- package/dist/scripts/tenant-test.js +0 -4
- package/dist/scripts/tenant-workflow-action.js +0 -101
- package/dist/scripts/test-cloudflare-local.js +0 -209
- package/dist/scripts/test-scaffold.js +0 -300
- package/dist/scripts/test-smoke.js +0 -137
- package/dist/scripts/treeseed-assert-release-tag-version.js +0 -21
- package/dist/scripts/treeseed-build-dist.js +0 -131
- package/dist/scripts/treeseed-publish-package.js +0 -19
- package/dist/scripts/treeseed-release-verify.js +0 -131
- package/dist/scripts/validate-templates.js +0 -6
- package/dist/scripts/verify-driver.js +0 -45
- package/dist/scripts/workflow-commands.test.js +0 -31
- package/dist/scripts/workspace-command-e2e.js +0 -718
- package/dist/scripts/workspace-lint.js +0 -15
- package/dist/scripts/workspace-preflight.js +0 -22
- package/dist/scripts/workspace-publish-changed-packages.js +0 -16
- package/dist/scripts/workspace-release-test.js +0 -104
- package/dist/scripts/workspace-release-verify.js +0 -81
- package/dist/scripts/workspace-save.js +0 -64
- package/dist/scripts/workspace-start-warning.js +0 -3
- package/dist/scripts/workspace-test-unit.js +0 -4
- package/dist/scripts/workspace-test.js +0 -17
- package/dist/sdk-dispatch.d.ts +0 -12
- package/dist/sdk-dispatch.js +0 -126
- package/dist/sdk-fields.d.ts +0 -11
- package/dist/sdk-filters.d.ts +0 -4
- package/dist/sdk-filters.js +0 -74
- package/dist/sdk-types.d.ts +0 -3868
- package/dist/sdk-types.js +0 -542
- package/dist/sdk-version.d.ts +0 -2
- package/dist/sdk-version.js +0 -42
- package/dist/sdk.d.ts +0 -266
- package/dist/sdk.js +0 -825
- package/dist/secrets-capability.d.ts +0 -421
- package/dist/secrets-capability.js +0 -530
- package/dist/seeds/errors.d.ts +0 -5
- package/dist/seeds/errors.js +0 -22
- package/dist/seeds/index.d.ts +0 -20
- package/dist/seeds/index.js +0 -53
- package/dist/seeds/loader.d.ts +0 -8
- package/dist/seeds/loader.js +0 -32
- package/dist/seeds/normalize.d.ts +0 -13
- package/dist/seeds/normalize.js +0 -282
- package/dist/seeds/planner.d.ts +0 -10
- package/dist/seeds/planner.js +0 -149
- package/dist/seeds/schema.d.ts +0 -2
- package/dist/seeds/schema.js +0 -893
- package/dist/seeds/types.d.ts +0 -312
- package/dist/seeds/types.js +0 -12
- package/dist/service-credentials.d.ts +0 -54
- package/dist/service-credentials.js +0 -112
- package/dist/stores/cursor-store.d.ts +0 -10
- package/dist/stores/cursor-store.js +0 -164
- package/dist/stores/envelopes.d.ts +0 -116
- package/dist/stores/envelopes.js +0 -219
- package/dist/stores/helpers.d.ts +0 -12
- package/dist/stores/helpers.js +0 -42
- package/dist/stores/lease-store.d.ts +0 -18
- package/dist/stores/lease-store.js +0 -189
- package/dist/stores/message-store.d.ts +0 -12
- package/dist/stores/message-store.js +0 -273
- package/dist/stores/operational-store.d.ts +0 -55
- package/dist/stores/operational-store.js +0 -861
- package/dist/stores/project-workflow-store.d.ts +0 -56
- package/dist/stores/project-workflow-store.js +0 -482
- package/dist/stores/run-store.d.ts +0 -9
- package/dist/stores/run-store.js +0 -75
- package/dist/stores/subscription-store.d.ts +0 -8
- package/dist/stores/subscription-store.js +0 -73
- package/dist/template-catalog.d.ts +0 -13
- package/dist/template-catalog.js +0 -151
- package/dist/template-launch-requirements.d.ts +0 -118
- package/dist/template-launch-requirements.js +0 -768
- package/dist/template-launch-ui.d.ts +0 -85
- package/dist/template-launch-ui.js +0 -189
- package/dist/timing.d.ts +0 -20
- package/dist/timing.js +0 -73
- package/dist/treedx/adapters.d.ts +0 -6
- package/dist/treedx/adapters.js +0 -36
- package/dist/treedx/client.d.ts +0 -222
- package/dist/treedx/client.js +0 -871
- package/dist/treedx/errors.d.ts +0 -13
- package/dist/treedx/federated-client.d.ts +0 -27
- package/dist/treedx/federated-client.js +0 -158
- package/dist/treedx/graph-adapter.d.ts +0 -33
- package/dist/treedx/graph-adapter.js +0 -156
- package/dist/treedx/index.d.ts +0 -14
- package/dist/treedx/index.js +0 -48
- package/dist/treedx/market-integration.d.ts +0 -27
- package/dist/treedx/market-integration.js +0 -131
- package/dist/treedx/ports.d.ts +0 -166
- package/dist/treedx/ports.js +0 -231
- package/dist/treedx/query-adapter.d.ts +0 -19
- package/dist/treedx/query-adapter.js +0 -62
- package/dist/treedx/registry-client.d.ts +0 -11
- package/dist/treedx/registry-client.js +0 -19
- package/dist/treedx/repository-adapter.d.ts +0 -45
- package/dist/treedx/repository-adapter.js +0 -319
- package/dist/treedx/sdk-integration.d.ts +0 -27
- package/dist/treedx/sdk-integration.js +0 -63
- package/dist/treedx/workspace-adapter.d.ts +0 -27
- package/dist/treedx/workspace-adapter.js +0 -65
- package/dist/treedx-backends.d.ts +0 -220
- package/dist/treedx-backends.js +0 -634
- package/dist/treedx-client.d.ts +0 -89
- package/dist/treedx-client.js +0 -184
- package/dist/treeseed/services/compose.yml +0 -6
- package/dist/treeseed/template-catalog/catalog.fixture.json +0 -707
- package/dist/types/cloudflare.d.ts +0 -54
- package/dist/verification.d.ts +0 -31
- package/dist/verification.js +0 -430
- package/dist/workflow/operations.d.ts +0 -1516
- package/dist/workflow/operations.js +0 -7001
- package/dist/workflow/policy.d.ts +0 -12
- package/dist/workflow/policy.js +0 -70
- package/dist/workflow/runs.d.ts +0 -143
- package/dist/workflow/runs.js +0 -720
- package/dist/workflow/session.d.ts +0 -34
- package/dist/workflow/session.js +0 -160
- package/dist/workflow/worktrees.d.ts +0 -43
- package/dist/workflow/worktrees.js +0 -307
- package/dist/workflow-state.d.ts +0 -250
- package/dist/workflow-state.js +0 -844
- package/dist/workflow-support.d.ts +0 -28
- package/dist/workflow-support.js +0 -390
- package/dist/workflow.d.ts +0 -327
- package/dist/workflow.js +0 -140
- package/drizzle/d1/0000_treeseed_d1.sql +0 -19
- package/drizzle/market/0000_market_control_plane.sql +0 -3223
- package/drizzle/market/0001_capacity_budget_mode_default.sql +0 -4
- package/drizzle/market/0002_user_email_addresses.sql +0 -26
- package/drizzle/market/0003_project_team_slug_unique.sql +0 -4
- package/drizzle/market/0004_treedx_market_integration.sql +0 -99
- package/drizzle/market/0005_agent_capacity_coordination.sql +0 -145
- package/drizzle/market/0006_provider_assignment_lifecycle.sql +0 -9
- package/drizzle/market/0007_agent_architecture_gap_closure.sql +0 -157
- package/drizzle/market/0008_agent_capacity_operational_closure.sql +0 -27
- package/drizzle/market/0009_agent_capacity_runtime_hardening.sql +0 -29
- package/drizzle/market/0010_secrets_capability_persistence.sql +0 -130
- package/drizzle/market/0011_github_app_adapter.sql +0 -47
- package/drizzle/market/0012_workday_test_runs.sql +0 -44
- package/drizzle/market/0013_runtime_task_lifecycle.sql +0 -39
- package/drizzle/market/0014_governance_pipeline.sql +0 -189
- package/drizzle/market/0015_agent_decision_assignment_graphs.sql +0 -60
- package/scripts/verify-driver.ts +0 -51
- package/templates/github/deploy-web.workflow.yml +0 -168
- package/templates/github/hosted-project.workflow.yml +0 -76
- /package/dist/{api/types.js → agent-capacity/contracts/capacity/workdays/workday-records.js} +0 -0
- /package/dist/{hosting/contracts.js → agent-capacity/contracts/operations/workflow-promotion.js} +0 -0
- /package/dist/{platform/contracts.js → agent-capacity/contracts/projects/agents/project-agent-class.js} +0 -0
- /package/dist/{reconcile/contracts.js → agent-capacity/contracts/runtime/runtime-observability.js} +0 -0
- /package/dist/{types/cloudflare.js → agent-capacity/contracts/support/decision-work.js} +0 -0
- /package/dist/{field-aliases.js → entrypoints/models/field-aliases.js} +0 -0
- /package/dist/{sdk-fields.js → entrypoints/models/sdk-fields.js} +0 -0
- /package/dist/{runtime.d.ts → runtime/runtime.d.ts} +0 -0
- /package/dist/{runtime.js → runtime/runtime.js} +0 -0
- /package/dist/treedx/{errors.js → support/errors.js} +0 -0
|
@@ -1,1874 +0,0 @@
|
|
|
1
|
-
import { mkdtempSync, rmSync } from "node:fs";
|
|
2
|
-
import { tmpdir } from "node:os";
|
|
3
|
-
import { resolve } from "node:path";
|
|
4
|
-
import { IacClient } from "railway";
|
|
5
|
-
import { connectRailwayServiceSourceWithCli, runRailwayCliJson } from "./railway-cli.js";
|
|
6
|
-
import { resolveTreeseedRailwayApiToken } from "../../service-credentials.js";
|
|
7
|
-
const DEFAULT_RAILWAY_API_URL = "https://backboard.railway.com/graphql/v2";
|
|
8
|
-
const DEFAULT_RAILWAY_WORKSPACE = "knowledge-coop";
|
|
9
|
-
let railwayReadActive = false;
|
|
10
|
-
const railwayReadWaiters = [];
|
|
11
|
-
let railwayReadCooldownUntil = 0;
|
|
12
|
-
async function acquireRailwayReadSlot() {
|
|
13
|
-
if (railwayReadActive) await new Promise((resolve2) => railwayReadWaiters.push(resolve2));
|
|
14
|
-
railwayReadActive = true;
|
|
15
|
-
const cooldownMs = Math.max(0, railwayReadCooldownUntil - Date.now());
|
|
16
|
-
if (cooldownMs > 0) await new Promise((resolve2) => setTimeout(resolve2, cooldownMs));
|
|
17
|
-
return () => {
|
|
18
|
-
const next = railwayReadWaiters.shift();
|
|
19
|
-
if (next) next();
|
|
20
|
-
else railwayReadActive = false;
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
function extendRailwayReadCooldown(delayMs) {
|
|
24
|
-
railwayReadCooldownUntil = Math.max(railwayReadCooldownUntil, Date.now() + Math.max(0, delayMs));
|
|
25
|
-
}
|
|
26
|
-
function normalizeRailwayEnvironmentName(value) {
|
|
27
|
-
const normalized = typeof value === "string" ? value.trim() : "";
|
|
28
|
-
if (!normalized) {
|
|
29
|
-
return "";
|
|
30
|
-
}
|
|
31
|
-
return normalized === "prod" ? "production" : normalized;
|
|
32
|
-
}
|
|
33
|
-
function createRailwayEnvironmentPatchClient({
|
|
34
|
-
env,
|
|
35
|
-
fetchImpl
|
|
36
|
-
}) {
|
|
37
|
-
const token = resolveRailwayApiToken(env);
|
|
38
|
-
if (!token) {
|
|
39
|
-
throw new Error("Railway API token is required for environment reconciliation.");
|
|
40
|
-
}
|
|
41
|
-
return new IacClient({
|
|
42
|
-
token,
|
|
43
|
-
endpoint: resolveRailwayApiUrl(env),
|
|
44
|
-
fetch: fetchImpl
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
function configuredEnvValue(env, name) {
|
|
48
|
-
const value = env?.[name];
|
|
49
|
-
return typeof value === "string" && value.trim() ? value.trim() : "";
|
|
50
|
-
}
|
|
51
|
-
function isUsableRailwayToken(value) {
|
|
52
|
-
return typeof value === "string" && value.trim().length >= 8;
|
|
53
|
-
}
|
|
54
|
-
function resolveRailwayApiToken(env = process.env) {
|
|
55
|
-
const token = resolveTreeseedRailwayApiToken(env);
|
|
56
|
-
return isUsableRailwayToken(token) ? token : "";
|
|
57
|
-
}
|
|
58
|
-
function resolveRailwayApiUrl(env = process.env) {
|
|
59
|
-
return configuredEnvValue(env, "TREESEED_RAILWAY_API_URL") || DEFAULT_RAILWAY_API_URL;
|
|
60
|
-
}
|
|
61
|
-
function resolveRailwayWorkspace(env = process.env) {
|
|
62
|
-
return configuredEnvValue(env, "TREESEED_RAILWAY_WORKSPACE") || DEFAULT_RAILWAY_WORKSPACE;
|
|
63
|
-
}
|
|
64
|
-
function normalizeRailwayErrorMessage(payload, fallbackStatus) {
|
|
65
|
-
if (payload && typeof payload === "object" && Array.isArray(payload.errors) && payload.errors.length > 0) {
|
|
66
|
-
const first = payload.errors[0];
|
|
67
|
-
if (first && typeof first === "object" && typeof first.message === "string") {
|
|
68
|
-
return first.message;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
return typeof fallbackStatus === "number" ? `Railway API request failed with ${fallbackStatus}.` : "Railway API request failed.";
|
|
72
|
-
}
|
|
73
|
-
function isRetryableRailwayStatus(status) {
|
|
74
|
-
return status === 408 || status === 429 || status >= 500;
|
|
75
|
-
}
|
|
76
|
-
function parseRetryAfterMs(value) {
|
|
77
|
-
if (!value) {
|
|
78
|
-
return null;
|
|
79
|
-
}
|
|
80
|
-
const seconds = Number(value);
|
|
81
|
-
if (Number.isFinite(seconds) && seconds >= 0) {
|
|
82
|
-
return Math.round(seconds * 1e3);
|
|
83
|
-
}
|
|
84
|
-
const absoluteTime = Date.parse(value);
|
|
85
|
-
if (Number.isFinite(absoluteTime)) {
|
|
86
|
-
return Math.max(0, absoluteTime - Date.now());
|
|
87
|
-
}
|
|
88
|
-
return null;
|
|
89
|
-
}
|
|
90
|
-
function markRailwayTransientError(error, options = {}) {
|
|
91
|
-
const tagged = error;
|
|
92
|
-
tagged.treeseedTransient = true;
|
|
93
|
-
if (options.rateLimited) tagged.treeseedRateLimited = true;
|
|
94
|
-
if (typeof options.retryAfterMs === "number" && Number.isFinite(options.retryAfterMs) && options.retryAfterMs >= 0) {
|
|
95
|
-
tagged.treeseedRetryAfterMs = options.retryAfterMs;
|
|
96
|
-
}
|
|
97
|
-
return tagged;
|
|
98
|
-
}
|
|
99
|
-
function isTransientRailwayRequestError(error) {
|
|
100
|
-
if (error && typeof error === "object" && error.treeseedTransient === true) {
|
|
101
|
-
return true;
|
|
102
|
-
}
|
|
103
|
-
const message = error instanceof Error ? error.message : String(error ?? "");
|
|
104
|
-
return /fetch failed|timed out|etimedout|econnreset|enetunreach|temporarily unavailable|aborted|rate limit|too many requests|429/iu.test(message);
|
|
105
|
-
}
|
|
106
|
-
function railwayConnectionLabel(value) {
|
|
107
|
-
return typeof value === "string" && value.trim() ? value.trim() : "";
|
|
108
|
-
}
|
|
109
|
-
function normalizeConnectionNodes(connection, mapper) {
|
|
110
|
-
if (!connection || typeof connection !== "object" || !Array.isArray(connection.edges)) {
|
|
111
|
-
return [];
|
|
112
|
-
}
|
|
113
|
-
return connection.edges.map((edge) => {
|
|
114
|
-
if (!edge || typeof edge !== "object") {
|
|
115
|
-
return null;
|
|
116
|
-
}
|
|
117
|
-
const node = edge.node;
|
|
118
|
-
return node && typeof node === "object" ? mapper(node) : null;
|
|
119
|
-
}).filter(Boolean);
|
|
120
|
-
}
|
|
121
|
-
function normalizeWorkspace(node) {
|
|
122
|
-
const id = railwayConnectionLabel(node.id);
|
|
123
|
-
const name = railwayConnectionLabel(node.name);
|
|
124
|
-
if (!id || !name) {
|
|
125
|
-
return null;
|
|
126
|
-
}
|
|
127
|
-
return { id, name };
|
|
128
|
-
}
|
|
129
|
-
function normalizeEnvironment(node) {
|
|
130
|
-
const id = railwayConnectionLabel(node.id);
|
|
131
|
-
const name = railwayConnectionLabel(node.name);
|
|
132
|
-
if (!id || !name) {
|
|
133
|
-
return null;
|
|
134
|
-
}
|
|
135
|
-
return { id, name };
|
|
136
|
-
}
|
|
137
|
-
function normalizeService(node) {
|
|
138
|
-
const id = railwayConnectionLabel(node.id);
|
|
139
|
-
const name = railwayConnectionLabel(node.name);
|
|
140
|
-
if (!id || !name) {
|
|
141
|
-
return null;
|
|
142
|
-
}
|
|
143
|
-
return { id, name };
|
|
144
|
-
}
|
|
145
|
-
function normalizeProject(node) {
|
|
146
|
-
const id = railwayConnectionLabel(node.id);
|
|
147
|
-
const name = railwayConnectionLabel(node.name);
|
|
148
|
-
if (!id || !name) {
|
|
149
|
-
return null;
|
|
150
|
-
}
|
|
151
|
-
const services = /* @__PURE__ */ new Map();
|
|
152
|
-
for (const service of normalizeConnectionNodes(node.services, normalizeService)) {
|
|
153
|
-
services.set(service.id, service);
|
|
154
|
-
}
|
|
155
|
-
for (const environment of normalizeConnectionNodes(node.environments, (entry) => entry)) {
|
|
156
|
-
for (const instance of normalizeConnectionNodes(environment.serviceInstances, (entry) => entry)) {
|
|
157
|
-
const serviceId = railwayConnectionLabel(instance.serviceId);
|
|
158
|
-
const serviceName = railwayConnectionLabel(instance.serviceName);
|
|
159
|
-
if (serviceId && serviceName) {
|
|
160
|
-
services.set(serviceId, { id: serviceId, name: serviceName });
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
return {
|
|
165
|
-
id,
|
|
166
|
-
name,
|
|
167
|
-
workspaceId: railwayConnectionLabel(node.workspaceId) || null,
|
|
168
|
-
deletedAt: railwayConnectionLabel(node.deletedAt) || null,
|
|
169
|
-
environments: normalizeConnectionNodes(node.environments, normalizeEnvironment),
|
|
170
|
-
services: [...services.values()]
|
|
171
|
-
};
|
|
172
|
-
}
|
|
173
|
-
function normalizeServiceInstanceService(node) {
|
|
174
|
-
const id = railwayConnectionLabel(node.serviceId);
|
|
175
|
-
const name = railwayConnectionLabel(node.serviceName);
|
|
176
|
-
if (!id || !name) {
|
|
177
|
-
return null;
|
|
178
|
-
}
|
|
179
|
-
return { id, name };
|
|
180
|
-
}
|
|
181
|
-
function normalizeVariableMap(value) {
|
|
182
|
-
if (!value) {
|
|
183
|
-
return {};
|
|
184
|
-
}
|
|
185
|
-
if (typeof value === "string") {
|
|
186
|
-
try {
|
|
187
|
-
return normalizeVariableMap(JSON.parse(value));
|
|
188
|
-
} catch {
|
|
189
|
-
return {};
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
if (typeof value !== "object" || Array.isArray(value)) {
|
|
193
|
-
return {};
|
|
194
|
-
}
|
|
195
|
-
return Object.fromEntries(
|
|
196
|
-
Object.entries(value).map(([key, entryValue]) => {
|
|
197
|
-
if (typeof entryValue === "string") {
|
|
198
|
-
return [key, entryValue];
|
|
199
|
-
}
|
|
200
|
-
if (entryValue && typeof entryValue === "object" && typeof entryValue.value === "string") {
|
|
201
|
-
return [key, entryValue.value];
|
|
202
|
-
}
|
|
203
|
-
return [key, null];
|
|
204
|
-
})
|
|
205
|
-
);
|
|
206
|
-
}
|
|
207
|
-
function normalizeRailwayNumber(value) {
|
|
208
|
-
if (typeof value === "number" && Number.isFinite(value)) {
|
|
209
|
-
return value;
|
|
210
|
-
}
|
|
211
|
-
if (typeof value === "string" && value.trim()) {
|
|
212
|
-
const parsed = Number(value);
|
|
213
|
-
return Number.isFinite(parsed) ? parsed : null;
|
|
214
|
-
}
|
|
215
|
-
return null;
|
|
216
|
-
}
|
|
217
|
-
function normalizeRailwayCustomDomainDnsRecord(node) {
|
|
218
|
-
const fqdn = railwayConnectionLabel(node.fqdn);
|
|
219
|
-
if (!fqdn) {
|
|
220
|
-
return null;
|
|
221
|
-
}
|
|
222
|
-
return {
|
|
223
|
-
fqdn,
|
|
224
|
-
hostlabel: railwayConnectionLabel(node.hostlabel),
|
|
225
|
-
recordType: railwayConnectionLabel(node.recordType),
|
|
226
|
-
requiredValue: railwayConnectionLabel(node.requiredValue),
|
|
227
|
-
currentValue: railwayConnectionLabel(node.currentValue),
|
|
228
|
-
status: railwayConnectionLabel(node.status),
|
|
229
|
-
zone: railwayConnectionLabel(node.zone),
|
|
230
|
-
purpose: railwayConnectionLabel(node.purpose)
|
|
231
|
-
};
|
|
232
|
-
}
|
|
233
|
-
function normalizeRailwayCustomDomain(node) {
|
|
234
|
-
const id = railwayConnectionLabel(node.id);
|
|
235
|
-
const domain = railwayConnectionLabel(node.domain);
|
|
236
|
-
if (!id || !domain) {
|
|
237
|
-
return null;
|
|
238
|
-
}
|
|
239
|
-
const status = node.status && typeof node.status === "object" ? node.status : {};
|
|
240
|
-
const dnsRecords = Array.isArray(status.dnsRecords) ? status.dnsRecords.map((entry) => entry && typeof entry === "object" ? normalizeRailwayCustomDomainDnsRecord(entry) : null).filter(Boolean) : [];
|
|
241
|
-
return {
|
|
242
|
-
id,
|
|
243
|
-
domain,
|
|
244
|
-
environmentId: railwayConnectionLabel(node.environmentId),
|
|
245
|
-
serviceId: railwayConnectionLabel(node.serviceId),
|
|
246
|
-
targetPort: typeof node.targetPort === "number" && Number.isFinite(node.targetPort) ? node.targetPort : null,
|
|
247
|
-
verified: status.verified === true,
|
|
248
|
-
certificateStatus: railwayConnectionLabel(status.certificateStatus) || null,
|
|
249
|
-
verificationDnsHost: railwayConnectionLabel(status.verificationDnsHost) || null,
|
|
250
|
-
verificationToken: railwayConnectionLabel(status.verificationToken) || null,
|
|
251
|
-
dnsRecords
|
|
252
|
-
};
|
|
253
|
-
}
|
|
254
|
-
function normalizeRailwayDomain(node, kind = "service") {
|
|
255
|
-
if (!node || typeof node !== "object") {
|
|
256
|
-
return null;
|
|
257
|
-
}
|
|
258
|
-
const record = node;
|
|
259
|
-
const id = railwayConnectionLabel(record.id) || railwayConnectionLabel(record.domain);
|
|
260
|
-
const domain = railwayConnectionLabel(record.domain);
|
|
261
|
-
if (!id || !domain) {
|
|
262
|
-
return null;
|
|
263
|
-
}
|
|
264
|
-
return {
|
|
265
|
-
id,
|
|
266
|
-
domain,
|
|
267
|
-
kind,
|
|
268
|
-
environmentId: railwayConnectionLabel(record.environmentId),
|
|
269
|
-
serviceId: railwayConnectionLabel(record.serviceId),
|
|
270
|
-
targetPort: normalizeRailwayNumber(record.targetPort)
|
|
271
|
-
};
|
|
272
|
-
}
|
|
273
|
-
function normalizeRailwayDomainList(value, kind) {
|
|
274
|
-
if (!Array.isArray(value)) {
|
|
275
|
-
return [];
|
|
276
|
-
}
|
|
277
|
-
return value.map((entry) => normalizeRailwayDomain(entry, kind)).filter(Boolean);
|
|
278
|
-
}
|
|
279
|
-
function normalizeRailwayVolumeInstance(node) {
|
|
280
|
-
const id = railwayConnectionLabel(node.id);
|
|
281
|
-
if (!id) {
|
|
282
|
-
return null;
|
|
283
|
-
}
|
|
284
|
-
const sizeGb = normalizeRailwayNumber(node.sizeGb ?? node.sizeGB ?? node.size_gb ?? node.capacityGb ?? node.capacityGB);
|
|
285
|
-
const usedGb = normalizeRailwayNumber(node.usedGb ?? node.usedGB ?? node.used_gb ?? node.currentUsageGb ?? node.currentUsageGB);
|
|
286
|
-
return {
|
|
287
|
-
id,
|
|
288
|
-
serviceId: railwayConnectionLabel(node.serviceId) || railwayConnectionLabel(node.service?.id) || null,
|
|
289
|
-
environmentId: railwayConnectionLabel(node.environmentId) || railwayConnectionLabel(node.environment?.id) || null,
|
|
290
|
-
mountPath: railwayConnectionLabel(node.mountPath) || railwayConnectionLabel(node.mount_path) || null,
|
|
291
|
-
state: railwayConnectionLabel(node.state) || null,
|
|
292
|
-
isPendingDeletion: node.isPendingDeletion === true || node.pendingDeletion === true,
|
|
293
|
-
deletedAt: railwayConnectionLabel(node.deletedAt) || null,
|
|
294
|
-
sizeGb,
|
|
295
|
-
usedGb
|
|
296
|
-
};
|
|
297
|
-
}
|
|
298
|
-
function isActiveRailwayVolumeInstance(instance) {
|
|
299
|
-
const state = String(instance.state ?? "READY").toUpperCase();
|
|
300
|
-
return !instance.isPendingDeletion && !(typeof instance.deletedAt === "string" && instance.deletedAt.trim()) && state !== "DELETING" && state !== "DELETED";
|
|
301
|
-
}
|
|
302
|
-
function normalizeVolumeInstances(value) {
|
|
303
|
-
const direct = Array.isArray(value) ? value : null;
|
|
304
|
-
if (direct) {
|
|
305
|
-
return direct.map((entry) => entry && typeof entry === "object" ? normalizeRailwayVolumeInstance(entry) : null).filter(Boolean);
|
|
306
|
-
}
|
|
307
|
-
return normalizeConnectionNodes(value, normalizeRailwayVolumeInstance);
|
|
308
|
-
}
|
|
309
|
-
function mergeRailwayVolumeInstances(instances) {
|
|
310
|
-
const byId = /* @__PURE__ */ new Map();
|
|
311
|
-
for (const instance of instances) {
|
|
312
|
-
const existing = byId.get(instance.id);
|
|
313
|
-
byId.set(instance.id, existing ? {
|
|
314
|
-
...existing,
|
|
315
|
-
serviceId: existing.serviceId || instance.serviceId,
|
|
316
|
-
environmentId: existing.environmentId || instance.environmentId,
|
|
317
|
-
mountPath: existing.mountPath || instance.mountPath,
|
|
318
|
-
state: [existing.state, instance.state].find((state) => /^(?:DELETED|DELETING)$/u.test(String(state ?? "").toUpperCase())) ?? existing.state ?? instance.state,
|
|
319
|
-
isPendingDeletion: existing.isPendingDeletion || instance.isPendingDeletion,
|
|
320
|
-
deletedAt: existing.deletedAt || instance.deletedAt,
|
|
321
|
-
sizeGb: existing.sizeGb ?? instance.sizeGb,
|
|
322
|
-
usedGb: existing.usedGb ?? instance.usedGb
|
|
323
|
-
} : instance);
|
|
324
|
-
}
|
|
325
|
-
return [...byId.values()];
|
|
326
|
-
}
|
|
327
|
-
function normalizeRailwayVolume(node) {
|
|
328
|
-
const id = railwayConnectionLabel(node.id);
|
|
329
|
-
if (!id) {
|
|
330
|
-
return null;
|
|
331
|
-
}
|
|
332
|
-
return {
|
|
333
|
-
id,
|
|
334
|
-
name: railwayConnectionLabel(node.name),
|
|
335
|
-
projectId: railwayConnectionLabel(node.projectId) || null,
|
|
336
|
-
instances: mergeRailwayVolumeInstances([
|
|
337
|
-
...normalizeVolumeInstances(node.instances),
|
|
338
|
-
...normalizeVolumeInstances(node.volumeInstances),
|
|
339
|
-
...normalizeVolumeInstances(node.volume_instances)
|
|
340
|
-
])
|
|
341
|
-
};
|
|
342
|
-
}
|
|
343
|
-
function collectRailwayVolumes(value, seen = /* @__PURE__ */ new Set()) {
|
|
344
|
-
const volumes = [];
|
|
345
|
-
const visit = (entry) => {
|
|
346
|
-
if (!entry || typeof entry !== "object") {
|
|
347
|
-
return;
|
|
348
|
-
}
|
|
349
|
-
if (seen.has(entry)) {
|
|
350
|
-
return;
|
|
351
|
-
}
|
|
352
|
-
seen.add(entry);
|
|
353
|
-
if (Array.isArray(entry)) {
|
|
354
|
-
for (const item of entry) {
|
|
355
|
-
visit(item);
|
|
356
|
-
}
|
|
357
|
-
return;
|
|
358
|
-
}
|
|
359
|
-
const record = entry;
|
|
360
|
-
const volume = normalizeRailwayVolume(record);
|
|
361
|
-
if (volume && (record.volumeInstances !== void 0 || record.instances !== void 0 || record.projectId !== void 0 || record.name !== void 0)) {
|
|
362
|
-
volumes.push(volume);
|
|
363
|
-
}
|
|
364
|
-
for (const child of Object.values(record)) {
|
|
365
|
-
visit(child);
|
|
366
|
-
}
|
|
367
|
-
};
|
|
368
|
-
visit(value);
|
|
369
|
-
const byId = /* @__PURE__ */ new Map();
|
|
370
|
-
for (const volume of volumes) {
|
|
371
|
-
const existing = byId.get(volume.id);
|
|
372
|
-
byId.set(volume.id, existing ? {
|
|
373
|
-
...existing,
|
|
374
|
-
name: existing.name || volume.name,
|
|
375
|
-
projectId: existing.projectId || volume.projectId,
|
|
376
|
-
instances: mergeRailwayVolumeInstances([...existing.instances, ...volume.instances])
|
|
377
|
-
} : volume);
|
|
378
|
-
}
|
|
379
|
-
return [...byId.values()];
|
|
380
|
-
}
|
|
381
|
-
function railwayApiTimeoutMs(env, explicitTimeoutMs) {
|
|
382
|
-
if (typeof explicitTimeoutMs === "number" && Number.isFinite(explicitTimeoutMs) && explicitTimeoutMs > 0) {
|
|
383
|
-
return explicitTimeoutMs;
|
|
384
|
-
}
|
|
385
|
-
const configured = Number.parseInt(String(env.TREESEED_RAILWAY_API_TIMEOUT_MS ?? "").trim(), 10);
|
|
386
|
-
return Number.isFinite(configured) && configured > 0 ? Math.min(configured, 15e3) : 15e3;
|
|
387
|
-
}
|
|
388
|
-
function assertRailwayGraphqlReadOnly(document) {
|
|
389
|
-
const operation = document.replace(/^\uFEFF/u, "").replace(/#[^\r\n]*/gu, "").trimStart();
|
|
390
|
-
if (!operation.startsWith("query ") && !operation.startsWith("query\n") && !operation.startsWith("{")) {
|
|
391
|
-
throw new Error("Direct Railway GraphQL is read-only. Use the official Railway SDK/IaC client, or the managed Railway CLI when the public SDK lacks the operation.");
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
async function railwayGraphqlRequest({
|
|
395
|
-
query,
|
|
396
|
-
variables,
|
|
397
|
-
env = process.env,
|
|
398
|
-
apiToken,
|
|
399
|
-
apiUrl,
|
|
400
|
-
fetchImpl = fetch,
|
|
401
|
-
timeoutMs,
|
|
402
|
-
retries = 3
|
|
403
|
-
}) {
|
|
404
|
-
assertRailwayGraphqlReadOnly(query);
|
|
405
|
-
const token = apiToken || resolveRailwayApiToken(env);
|
|
406
|
-
if (!token) {
|
|
407
|
-
throw new Error("Configure TREESEED_RAILWAY_API_TOKEN before invoking Railway APIs.");
|
|
408
|
-
}
|
|
409
|
-
const requestTimeoutMs = railwayApiTimeoutMs(env, timeoutMs);
|
|
410
|
-
if (env.TREESEED_RECONCILE_TRACE === "1") {
|
|
411
|
-
process.stderr.write(`[trsd][railway][api:request] timeoutMs=${requestTimeoutMs} retries=${retries}
|
|
412
|
-
`);
|
|
413
|
-
}
|
|
414
|
-
let attempt = 0;
|
|
415
|
-
for (; ; ) {
|
|
416
|
-
const controller = new AbortController();
|
|
417
|
-
let timer = null;
|
|
418
|
-
let releaseReadSlot = null;
|
|
419
|
-
try {
|
|
420
|
-
releaseReadSlot = await acquireRailwayReadSlot();
|
|
421
|
-
const response = await Promise.race([
|
|
422
|
-
fetchImpl(apiUrl || resolveRailwayApiUrl(env), {
|
|
423
|
-
method: "POST",
|
|
424
|
-
headers: {
|
|
425
|
-
authorization: `Bearer ${token}`,
|
|
426
|
-
"content-type": "application/json"
|
|
427
|
-
},
|
|
428
|
-
body: JSON.stringify({ query, variables }),
|
|
429
|
-
signal: controller.signal
|
|
430
|
-
}).then(async (fetchResponse) => ({
|
|
431
|
-
ok: fetchResponse.ok,
|
|
432
|
-
status: fetchResponse.status,
|
|
433
|
-
payload: await fetchResponse.json().catch(() => ({})),
|
|
434
|
-
retryAfter: fetchResponse.headers.get("retry-after")
|
|
435
|
-
})),
|
|
436
|
-
new Promise((_, reject) => {
|
|
437
|
-
timer = setTimeout(() => {
|
|
438
|
-
controller.abort();
|
|
439
|
-
reject(markRailwayTransientError(new Error(`Railway API request timed out after ${requestTimeoutMs}ms.`)));
|
|
440
|
-
}, requestTimeoutMs);
|
|
441
|
-
})
|
|
442
|
-
]);
|
|
443
|
-
const payload = response.payload;
|
|
444
|
-
if (!response.ok || Array.isArray(payload.errors) && payload.errors.length > 0) {
|
|
445
|
-
const message = normalizeRailwayErrorMessage(payload, response.status);
|
|
446
|
-
const hasGraphqlErrors = Array.isArray(payload.errors) && payload.errors.length > 0;
|
|
447
|
-
const retryAfterMs = parseRetryAfterMs(response.retryAfter);
|
|
448
|
-
const shouldRetry = isRetryableRailwayStatus(response.status) || /rate limit|too many requests/iu.test(message);
|
|
449
|
-
const error = new Error(message);
|
|
450
|
-
if (shouldRetry || hasGraphqlErrors && /rate limit|too many requests/iu.test(message)) {
|
|
451
|
-
const rateLimited = response.status === 429 || /rate limit|too many requests/iu.test(message);
|
|
452
|
-
if (rateLimited) extendRailwayReadCooldown(retryAfterMs ?? 15e3);
|
|
453
|
-
throw markRailwayTransientError(error, { retryAfterMs, rateLimited });
|
|
454
|
-
}
|
|
455
|
-
throw error;
|
|
456
|
-
}
|
|
457
|
-
return payload;
|
|
458
|
-
} catch (error) {
|
|
459
|
-
if (attempt >= retries || !isTransientRailwayRequestError(error)) {
|
|
460
|
-
throw error;
|
|
461
|
-
}
|
|
462
|
-
attempt += 1;
|
|
463
|
-
const retryAfterMs = error && typeof error === "object" && typeof error.treeseedRetryAfterMs === "number" ? Math.max(0, Number(error.treeseedRetryAfterMs)) : null;
|
|
464
|
-
const rateLimited = error && typeof error === "object" && error.treeseedRateLimited === true;
|
|
465
|
-
const backoffMs = retryAfterMs !== null ? Math.min(retryAfterMs, 18e4) : rateLimited ? [15e3, 45e3, 9e4][attempt - 1] ?? 9e4 : Math.min(500 * 2 ** (attempt - 1), 4e3);
|
|
466
|
-
if (rateLimited) process.stderr.write(`[trsd][railway][api:rate-limit] attempt=${attempt + 1} waitMs=${backoffMs}
|
|
467
|
-
`);
|
|
468
|
-
let remainingMs = backoffMs;
|
|
469
|
-
while (remainingMs > 0) {
|
|
470
|
-
const sliceMs = Math.min(15e3, remainingMs);
|
|
471
|
-
await new Promise((resolve2) => setTimeout(resolve2, sliceMs));
|
|
472
|
-
remainingMs -= sliceMs;
|
|
473
|
-
if (rateLimited && remainingMs > 0) {
|
|
474
|
-
process.stderr.write(`[trsd][railway][api:rate-limit] cooldownRemainingMs=${remainingMs}
|
|
475
|
-
`);
|
|
476
|
-
}
|
|
477
|
-
}
|
|
478
|
-
} finally {
|
|
479
|
-
releaseReadSlot?.();
|
|
480
|
-
if (timer) {
|
|
481
|
-
clearTimeout(timer);
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
async function getRailwayAuthProfile({
|
|
487
|
-
env = process.env,
|
|
488
|
-
fetchImpl = fetch
|
|
489
|
-
}) {
|
|
490
|
-
const payload = await railwayGraphqlRequest({
|
|
491
|
-
query: `
|
|
492
|
-
query TreeseedRailwayAuthProfile {
|
|
493
|
-
me {
|
|
494
|
-
id
|
|
495
|
-
name
|
|
496
|
-
email
|
|
497
|
-
workspaces {
|
|
498
|
-
id
|
|
499
|
-
name
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
`.trim(),
|
|
504
|
-
env,
|
|
505
|
-
fetchImpl
|
|
506
|
-
});
|
|
507
|
-
const me = payload.data?.me;
|
|
508
|
-
return {
|
|
509
|
-
id: railwayConnectionLabel(me?.id) || null,
|
|
510
|
-
name: railwayConnectionLabel(me?.name) || null,
|
|
511
|
-
email: railwayConnectionLabel(me?.email) || null,
|
|
512
|
-
workspaces: Array.isArray(me?.workspaces) ? me.workspaces.map((workspace) => workspace && typeof workspace === "object" ? normalizeWorkspace(workspace) : null).filter(Boolean) : []
|
|
513
|
-
};
|
|
514
|
-
}
|
|
515
|
-
async function resolveRailwayWorkspaceContext({
|
|
516
|
-
env = process.env,
|
|
517
|
-
workspace,
|
|
518
|
-
fetchImpl = fetch
|
|
519
|
-
}) {
|
|
520
|
-
const desired = (workspace || resolveRailwayWorkspace(env)).trim();
|
|
521
|
-
const profile = await getRailwayAuthProfile({ env, fetchImpl });
|
|
522
|
-
const match = profile.workspaces.find((candidate) => candidate.id === desired || candidate.name === desired) ?? null;
|
|
523
|
-
if (!match) {
|
|
524
|
-
const available = profile.workspaces.map((candidate) => candidate.name).join(", ") || "(none)";
|
|
525
|
-
throw new Error(`Railway workspace ${desired} is not visible to the current token. Available workspaces: ${available}.`);
|
|
526
|
-
}
|
|
527
|
-
return match;
|
|
528
|
-
}
|
|
529
|
-
async function listRailwayProjects({
|
|
530
|
-
env = process.env,
|
|
531
|
-
workspaceId,
|
|
532
|
-
fetchImpl = fetch
|
|
533
|
-
}) {
|
|
534
|
-
const payload = await railwayGraphqlRequest({
|
|
535
|
-
query: `
|
|
536
|
-
query TreeseedRailwayProjects($workspaceId: String!, $first: Int!) {
|
|
537
|
-
projects(workspaceId: $workspaceId, first: $first) {
|
|
538
|
-
edges {
|
|
539
|
-
node {
|
|
540
|
-
id
|
|
541
|
-
name
|
|
542
|
-
workspaceId
|
|
543
|
-
deletedAt
|
|
544
|
-
environments(first: 50) {
|
|
545
|
-
edges {
|
|
546
|
-
node {
|
|
547
|
-
id
|
|
548
|
-
name
|
|
549
|
-
}
|
|
550
|
-
}
|
|
551
|
-
}
|
|
552
|
-
services(first: 50) {
|
|
553
|
-
edges {
|
|
554
|
-
node {
|
|
555
|
-
id
|
|
556
|
-
name
|
|
557
|
-
}
|
|
558
|
-
}
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
|
-
}
|
|
562
|
-
}
|
|
563
|
-
}
|
|
564
|
-
`.trim(),
|
|
565
|
-
variables: { workspaceId, first: 100 },
|
|
566
|
-
env,
|
|
567
|
-
fetchImpl
|
|
568
|
-
});
|
|
569
|
-
return normalizeConnectionNodes(payload.data?.projects, normalizeProject);
|
|
570
|
-
}
|
|
571
|
-
async function getRailwayProject({
|
|
572
|
-
projectId,
|
|
573
|
-
env = process.env,
|
|
574
|
-
fetchImpl = fetch
|
|
575
|
-
}) {
|
|
576
|
-
const payload = await railwayGraphqlRequest({
|
|
577
|
-
query: `
|
|
578
|
-
query TreeseedRailwayProject($projectId: String!) {
|
|
579
|
-
project(id: $projectId) {
|
|
580
|
-
id
|
|
581
|
-
name
|
|
582
|
-
workspaceId
|
|
583
|
-
deletedAt
|
|
584
|
-
environments(first: 50) {
|
|
585
|
-
edges {
|
|
586
|
-
node {
|
|
587
|
-
id
|
|
588
|
-
name
|
|
589
|
-
}
|
|
590
|
-
}
|
|
591
|
-
}
|
|
592
|
-
services(first: 50) {
|
|
593
|
-
edges {
|
|
594
|
-
node {
|
|
595
|
-
id
|
|
596
|
-
name
|
|
597
|
-
}
|
|
598
|
-
}
|
|
599
|
-
}
|
|
600
|
-
}
|
|
601
|
-
}
|
|
602
|
-
`.trim(),
|
|
603
|
-
variables: { projectId },
|
|
604
|
-
env,
|
|
605
|
-
fetchImpl
|
|
606
|
-
});
|
|
607
|
-
return payload.data?.project ? normalizeProject(payload.data.project) : null;
|
|
608
|
-
}
|
|
609
|
-
async function ensureRailwayProject({
|
|
610
|
-
projectName,
|
|
611
|
-
projectId,
|
|
612
|
-
defaultEnvironmentName = "staging",
|
|
613
|
-
env = process.env,
|
|
614
|
-
workspace,
|
|
615
|
-
fetchImpl = fetch
|
|
616
|
-
}) {
|
|
617
|
-
const workspaceContext = await resolveRailwayWorkspaceContext({ env, workspace, fetchImpl });
|
|
618
|
-
const projects = await listRailwayProjects({ env, workspaceId: workspaceContext.id, fetchImpl });
|
|
619
|
-
const desiredProjectName = railwayConnectionLabel(projectName);
|
|
620
|
-
const desiredProjectId = railwayConnectionLabel(projectId);
|
|
621
|
-
const existing = projects.find(
|
|
622
|
-
(project2) => !project2.deletedAt && (desiredProjectId && project2.id === desiredProjectId || desiredProjectName && project2.name === desiredProjectName)
|
|
623
|
-
) ?? null;
|
|
624
|
-
if (existing) {
|
|
625
|
-
return { workspace: workspaceContext, project: existing, created: false };
|
|
626
|
-
}
|
|
627
|
-
if (!desiredProjectName) {
|
|
628
|
-
throw new Error("Railway project creation requires a project name.");
|
|
629
|
-
}
|
|
630
|
-
void defaultEnvironmentName;
|
|
631
|
-
const tempRoot = mkdtempSync(resolve(tmpdir(), "treeseed-railway-init-"));
|
|
632
|
-
try {
|
|
633
|
-
await runRailwayCliJson({ args: ["init", "--name", desiredProjectName, "--workspace", workspaceContext.id, "--json"], env, cwd: tempRoot });
|
|
634
|
-
} finally {
|
|
635
|
-
rmSync(tempRoot, { recursive: true, force: true });
|
|
636
|
-
}
|
|
637
|
-
const project = (await listRailwayProjects({ env, workspaceId: workspaceContext.id, fetchImpl })).find((entry) => entry.name === desiredProjectName && !entry.deletedAt) ?? null;
|
|
638
|
-
if (!project) {
|
|
639
|
-
throw new Error(`Railway project create did not return a usable project for ${desiredProjectName}.`);
|
|
640
|
-
}
|
|
641
|
-
return { workspace: workspaceContext, project, created: true };
|
|
642
|
-
}
|
|
643
|
-
async function ensureRailwayEnvironment({
|
|
644
|
-
projectId,
|
|
645
|
-
environmentName,
|
|
646
|
-
env = process.env,
|
|
647
|
-
fetchImpl = fetch
|
|
648
|
-
}) {
|
|
649
|
-
const environments = await listRailwayEnvironments({ projectId, env, fetchImpl });
|
|
650
|
-
const existing = environments.find((environment2) => environment2.name === environmentName || environment2.id === environmentName) ?? null;
|
|
651
|
-
if (existing) {
|
|
652
|
-
return { environment: existing, created: false };
|
|
653
|
-
}
|
|
654
|
-
const tempRoot = mkdtempSync(resolve(tmpdir(), "treeseed-railway-environment-"));
|
|
655
|
-
try {
|
|
656
|
-
await runRailwayCliJson({ args: ["link", projectId, "--json"], env, cwd: tempRoot });
|
|
657
|
-
await runRailwayCliJson({ args: ["environment", "new", environmentName, "--json"], env, cwd: tempRoot });
|
|
658
|
-
} finally {
|
|
659
|
-
rmSync(tempRoot, { recursive: true, force: true });
|
|
660
|
-
}
|
|
661
|
-
const environment = (await listRailwayEnvironments({ projectId, env, fetchImpl })).find((entry) => entry.name === environmentName) ?? null;
|
|
662
|
-
if (!environment) {
|
|
663
|
-
throw new Error(`Railway environment create did not return a usable environment for ${environmentName}.`);
|
|
664
|
-
}
|
|
665
|
-
return { environment, created: true };
|
|
666
|
-
}
|
|
667
|
-
async function listRailwayEnvironments({
|
|
668
|
-
projectId,
|
|
669
|
-
env = process.env,
|
|
670
|
-
fetchImpl = fetch
|
|
671
|
-
}) {
|
|
672
|
-
const payload = await railwayGraphqlRequest({
|
|
673
|
-
query: `
|
|
674
|
-
query TreeseedRailwayProjectEnvironments($projectId: String!) {
|
|
675
|
-
project(id: $projectId) {
|
|
676
|
-
id
|
|
677
|
-
environments(first: 50) {
|
|
678
|
-
edges {
|
|
679
|
-
node {
|
|
680
|
-
id
|
|
681
|
-
name
|
|
682
|
-
}
|
|
683
|
-
}
|
|
684
|
-
}
|
|
685
|
-
}
|
|
686
|
-
}
|
|
687
|
-
`.trim(),
|
|
688
|
-
variables: { projectId },
|
|
689
|
-
env,
|
|
690
|
-
fetchImpl
|
|
691
|
-
});
|
|
692
|
-
return normalizeConnectionNodes(payload.data?.project ? payload.data.project.environments : null, normalizeEnvironment);
|
|
693
|
-
}
|
|
694
|
-
async function listRailwayEnvironmentServices({
|
|
695
|
-
environmentId,
|
|
696
|
-
env = process.env,
|
|
697
|
-
fetchImpl = fetch
|
|
698
|
-
}) {
|
|
699
|
-
const payload = await railwayGraphqlRequest({
|
|
700
|
-
query: `
|
|
701
|
-
query TreeseedRailwayEnvironmentServices($environmentId: String!) {
|
|
702
|
-
environment(id: $environmentId) {
|
|
703
|
-
id
|
|
704
|
-
name
|
|
705
|
-
serviceInstances(first: 100) {
|
|
706
|
-
edges {
|
|
707
|
-
node {
|
|
708
|
-
id
|
|
709
|
-
serviceId
|
|
710
|
-
serviceName
|
|
711
|
-
environmentId
|
|
712
|
-
}
|
|
713
|
-
}
|
|
714
|
-
}
|
|
715
|
-
}
|
|
716
|
-
}
|
|
717
|
-
`.trim(),
|
|
718
|
-
variables: { environmentId },
|
|
719
|
-
env,
|
|
720
|
-
fetchImpl
|
|
721
|
-
});
|
|
722
|
-
return normalizeConnectionNodes(
|
|
723
|
-
payload.data?.environment ? payload.data.environment.serviceInstances : null,
|
|
724
|
-
normalizeServiceInstanceService
|
|
725
|
-
);
|
|
726
|
-
}
|
|
727
|
-
async function ensureRailwayService({
|
|
728
|
-
projectId,
|
|
729
|
-
serviceName,
|
|
730
|
-
serviceId,
|
|
731
|
-
environmentId,
|
|
732
|
-
imageRef,
|
|
733
|
-
sourceRepo,
|
|
734
|
-
sourceBranch,
|
|
735
|
-
env = process.env,
|
|
736
|
-
fetchImpl = fetch
|
|
737
|
-
}) {
|
|
738
|
-
const services = await listRailwayServices({ projectId, env, fetchImpl });
|
|
739
|
-
const desiredServiceName = railwayConnectionLabel(serviceName);
|
|
740
|
-
const desiredServiceId = railwayConnectionLabel(serviceId);
|
|
741
|
-
let existing = services.find(
|
|
742
|
-
(service2) => desiredServiceId && service2.id === desiredServiceId || desiredServiceName && service2.name === desiredServiceName
|
|
743
|
-
) ?? null;
|
|
744
|
-
if (!existing && environmentId) {
|
|
745
|
-
const environmentServices = await listRailwayEnvironmentServices({ environmentId, env, fetchImpl }).catch(() => []);
|
|
746
|
-
existing = environmentServices.find(
|
|
747
|
-
(service2) => desiredServiceId && service2.id === desiredServiceId || desiredServiceName && service2.name === desiredServiceName
|
|
748
|
-
) ?? null;
|
|
749
|
-
}
|
|
750
|
-
if (existing) {
|
|
751
|
-
const desiredImageRef = railwayConnectionLabel(imageRef);
|
|
752
|
-
const desiredSourceRepo = railwayConnectionLabel(sourceRepo);
|
|
753
|
-
if (desiredSourceRepo) {
|
|
754
|
-
try {
|
|
755
|
-
await updateRailwayServiceGitSource({
|
|
756
|
-
projectId,
|
|
757
|
-
serviceId: existing.id,
|
|
758
|
-
environmentId,
|
|
759
|
-
sourceRepo: desiredSourceRepo,
|
|
760
|
-
sourceBranch,
|
|
761
|
-
env,
|
|
762
|
-
fetchImpl
|
|
763
|
-
});
|
|
764
|
-
} catch (error) {
|
|
765
|
-
if (!looksLikeRailwayImageSourceUpdateUnsupported(error)) {
|
|
766
|
-
throw error;
|
|
767
|
-
}
|
|
768
|
-
throw new Error(
|
|
769
|
-
`Railway Git source update for existing service ${existing.name} (${existing.id}) is unsupported; refusing to delete and recreate an existing service. Repair the service in place or use a provider-supported source update.`
|
|
770
|
-
);
|
|
771
|
-
}
|
|
772
|
-
return { service: existing, created: false };
|
|
773
|
-
}
|
|
774
|
-
if (desiredImageRef) {
|
|
775
|
-
try {
|
|
776
|
-
await updateRailwayServiceImageSource({
|
|
777
|
-
projectId,
|
|
778
|
-
serviceId: existing.id,
|
|
779
|
-
environmentId,
|
|
780
|
-
imageRef: desiredImageRef,
|
|
781
|
-
env,
|
|
782
|
-
fetchImpl
|
|
783
|
-
});
|
|
784
|
-
} catch (error) {
|
|
785
|
-
if (!looksLikeRailwayImageSourceUpdateUnsupported(error)) {
|
|
786
|
-
throw error;
|
|
787
|
-
}
|
|
788
|
-
throw new Error(
|
|
789
|
-
`Railway image source update for existing service ${existing.name} (${existing.id}) is unsupported; refusing to delete and recreate an existing service. Repair the service in place or use a provider-supported image source update.`
|
|
790
|
-
);
|
|
791
|
-
}
|
|
792
|
-
}
|
|
793
|
-
return { service: existing, created: false };
|
|
794
|
-
}
|
|
795
|
-
if (!desiredServiceName) {
|
|
796
|
-
throw new Error("Railway service creation requires a service name.");
|
|
797
|
-
}
|
|
798
|
-
const service = await createRailwayImageService({
|
|
799
|
-
projectId,
|
|
800
|
-
environmentId,
|
|
801
|
-
serviceName: desiredServiceName,
|
|
802
|
-
imageRef,
|
|
803
|
-
sourceRepo,
|
|
804
|
-
sourceBranch,
|
|
805
|
-
env,
|
|
806
|
-
fetchImpl
|
|
807
|
-
});
|
|
808
|
-
return { service, created: true };
|
|
809
|
-
}
|
|
810
|
-
async function createRailwayImageService({
|
|
811
|
-
projectId,
|
|
812
|
-
serviceName,
|
|
813
|
-
environmentId,
|
|
814
|
-
imageRef,
|
|
815
|
-
sourceRepo,
|
|
816
|
-
sourceBranch,
|
|
817
|
-
env = process.env,
|
|
818
|
-
fetchImpl = fetch
|
|
819
|
-
}) {
|
|
820
|
-
const desiredSourceRepo = railwayConnectionLabel(sourceRepo);
|
|
821
|
-
const desiredImageRef = railwayConnectionLabel(imageRef);
|
|
822
|
-
const targetEnvironmentId = railwayConnectionLabel(environmentId);
|
|
823
|
-
if (!targetEnvironmentId) throw new Error(`Railway service creation requires an environment id for ${serviceName}.`);
|
|
824
|
-
const client = createRailwayEnvironmentPatchClient({ env, fetchImpl });
|
|
825
|
-
await client.stageEnvironmentChanges({
|
|
826
|
-
environmentId: targetEnvironmentId,
|
|
827
|
-
merge: true,
|
|
828
|
-
patch: {
|
|
829
|
-
services: {
|
|
830
|
-
[serviceName]: {
|
|
831
|
-
isCreated: true,
|
|
832
|
-
source: desiredSourceRepo ? { repo: desiredSourceRepo, branch: railwayConnectionLabel(sourceBranch) || null, image: null } : desiredImageRef ? { image: desiredImageRef, repo: null, branch: null } : null
|
|
833
|
-
}
|
|
834
|
-
}
|
|
835
|
-
}
|
|
836
|
-
});
|
|
837
|
-
await client.commitStagedPatch({
|
|
838
|
-
environmentId: targetEnvironmentId,
|
|
839
|
-
message: `Treeseed create service ${serviceName}`,
|
|
840
|
-
skipDeploys: true
|
|
841
|
-
});
|
|
842
|
-
const service = (await listRailwayServices({ projectId, env, fetchImpl })).find((entry) => entry.name === serviceName) ?? null;
|
|
843
|
-
if (!service) {
|
|
844
|
-
throw new Error(`Railway service create did not return a usable service for ${serviceName}.`);
|
|
845
|
-
}
|
|
846
|
-
return service;
|
|
847
|
-
}
|
|
848
|
-
function looksLikeRailwayImageSourceUpdateUnsupported(error) {
|
|
849
|
-
const message = error instanceof Error ? error.message : String(error ?? "");
|
|
850
|
-
return /Problem processing request|source|image|ServiceUpdateInput/iu.test(message);
|
|
851
|
-
}
|
|
852
|
-
async function updateRailwayServiceImageSource({
|
|
853
|
-
projectId,
|
|
854
|
-
serviceId,
|
|
855
|
-
environmentId,
|
|
856
|
-
imageRef,
|
|
857
|
-
env = process.env
|
|
858
|
-
}) {
|
|
859
|
-
const desiredImage = railwayConnectionLabel(imageRef);
|
|
860
|
-
if (!serviceId || !desiredImage) {
|
|
861
|
-
throw new Error("Railway service image source update requires a service id and image reference.");
|
|
862
|
-
}
|
|
863
|
-
const targetEnvironmentId = railwayConnectionLabel(environmentId);
|
|
864
|
-
if (!targetEnvironmentId) throw new Error(`Railway service image source update requires an environment id for ${serviceId}.`);
|
|
865
|
-
await connectRailwayServiceSourceWithCli({
|
|
866
|
-
projectId,
|
|
867
|
-
environmentId: targetEnvironmentId,
|
|
868
|
-
serviceId,
|
|
869
|
-
image: desiredImage,
|
|
870
|
-
env
|
|
871
|
-
});
|
|
872
|
-
return { id: serviceId, name: serviceId };
|
|
873
|
-
}
|
|
874
|
-
async function updateRailwayServiceGitSource({
|
|
875
|
-
projectId,
|
|
876
|
-
serviceId,
|
|
877
|
-
environmentId,
|
|
878
|
-
sourceRepo,
|
|
879
|
-
sourceBranch,
|
|
880
|
-
env = process.env
|
|
881
|
-
}) {
|
|
882
|
-
const desiredRepo = railwayConnectionLabel(sourceRepo);
|
|
883
|
-
if (!serviceId || !desiredRepo) {
|
|
884
|
-
throw new Error("Railway service Git source update requires a service id and repository slug.");
|
|
885
|
-
}
|
|
886
|
-
const targetEnvironmentId = railwayConnectionLabel(environmentId);
|
|
887
|
-
if (!targetEnvironmentId) throw new Error(`Railway service Git source update requires an environment id for ${serviceId}.`);
|
|
888
|
-
await connectRailwayServiceSourceWithCli({
|
|
889
|
-
projectId,
|
|
890
|
-
environmentId: targetEnvironmentId,
|
|
891
|
-
serviceId,
|
|
892
|
-
repo: desiredRepo,
|
|
893
|
-
branch: railwayConnectionLabel(sourceBranch) || null,
|
|
894
|
-
env
|
|
895
|
-
});
|
|
896
|
-
return { id: serviceId, name: serviceId };
|
|
897
|
-
}
|
|
898
|
-
async function ensureRailwayGeneratedServiceDomain({
|
|
899
|
-
projectId,
|
|
900
|
-
environmentId,
|
|
901
|
-
serviceId,
|
|
902
|
-
targetPort,
|
|
903
|
-
env = process.env,
|
|
904
|
-
fetchImpl = fetch
|
|
905
|
-
}) {
|
|
906
|
-
const domains = await listRailwayServiceDomains({ projectId, environmentId, serviceId, env, fetchImpl });
|
|
907
|
-
const existing = domains.find((domain2) => domain2.kind === "service") ?? domains.find((domain2) => domain2.domain.endsWith(".railway.app")) ?? null;
|
|
908
|
-
if (existing) {
|
|
909
|
-
return { domain: existing, created: false };
|
|
910
|
-
}
|
|
911
|
-
await runRailwayCliJson({
|
|
912
|
-
args: [
|
|
913
|
-
"domain",
|
|
914
|
-
"--project",
|
|
915
|
-
projectId,
|
|
916
|
-
"--environment",
|
|
917
|
-
environmentId,
|
|
918
|
-
"--service",
|
|
919
|
-
serviceId,
|
|
920
|
-
...Number.isFinite(Number(targetPort)) ? ["--port", String(Number(targetPort))] : [],
|
|
921
|
-
"--json"
|
|
922
|
-
],
|
|
923
|
-
env
|
|
924
|
-
});
|
|
925
|
-
const domain = (await listRailwayServiceDomains({ projectId, environmentId, serviceId, env, fetchImpl })).find((entry) => entry.kind === "service" || entry.domain.endsWith(".railway.app")) ?? null;
|
|
926
|
-
if (!domain) {
|
|
927
|
-
throw new Error("Railway service domain create did not return a usable domain.");
|
|
928
|
-
}
|
|
929
|
-
return { domain, created: true };
|
|
930
|
-
}
|
|
931
|
-
async function listRailwayServiceDomains({
|
|
932
|
-
projectId,
|
|
933
|
-
environmentId,
|
|
934
|
-
serviceId,
|
|
935
|
-
env = process.env,
|
|
936
|
-
fetchImpl = fetch
|
|
937
|
-
}) {
|
|
938
|
-
const payload = await railwayGraphqlRequest({
|
|
939
|
-
query: `
|
|
940
|
-
query TreeseedRailwayServiceDomains($projectId: String!, $environmentId: String!, $serviceId: String!) {
|
|
941
|
-
domains(projectId: $projectId, environmentId: $environmentId, serviceId: $serviceId) {
|
|
942
|
-
serviceDomains {
|
|
943
|
-
id
|
|
944
|
-
domain
|
|
945
|
-
serviceId
|
|
946
|
-
environmentId
|
|
947
|
-
targetPort
|
|
948
|
-
}
|
|
949
|
-
customDomains {
|
|
950
|
-
id
|
|
951
|
-
domain
|
|
952
|
-
serviceId
|
|
953
|
-
environmentId
|
|
954
|
-
targetPort
|
|
955
|
-
}
|
|
956
|
-
}
|
|
957
|
-
}
|
|
958
|
-
`.trim(),
|
|
959
|
-
variables: { projectId, environmentId, serviceId },
|
|
960
|
-
env,
|
|
961
|
-
fetchImpl
|
|
962
|
-
});
|
|
963
|
-
const domains = payload.data?.domains && typeof payload.data.domains === "object" ? payload.data.domains : {};
|
|
964
|
-
return [
|
|
965
|
-
...normalizeRailwayDomainList(domains.serviceDomains, "service"),
|
|
966
|
-
...normalizeRailwayDomainList(domains.customDomains, "custom")
|
|
967
|
-
];
|
|
968
|
-
}
|
|
969
|
-
async function deployRailwayServiceInstance({
|
|
970
|
-
projectId,
|
|
971
|
-
serviceId,
|
|
972
|
-
environmentId,
|
|
973
|
-
env = process.env,
|
|
974
|
-
fetchImpl = fetch
|
|
975
|
-
}) {
|
|
976
|
-
void fetchImpl;
|
|
977
|
-
const targetProjectId = railwayConnectionLabel(projectId) || configuredEnvValue(env, "TREESEED_RAILWAY_PROJECT_ID");
|
|
978
|
-
if (!targetProjectId) throw new Error(`Railway CLI redeploy requires a project id for service ${serviceId}.`);
|
|
979
|
-
const result = await runRailwayCliJson({
|
|
980
|
-
args: ["service", "redeploy", "--project", targetProjectId, "--environment", environmentId, "--service", serviceId, "--from-source", "--yes", "--json"],
|
|
981
|
-
env
|
|
982
|
-
});
|
|
983
|
-
return { deploymentId: railwayConnectionLabel(result.deploymentId ?? result.id) || null };
|
|
984
|
-
}
|
|
985
|
-
async function updateRailwayServiceName({
|
|
986
|
-
serviceId,
|
|
987
|
-
name,
|
|
988
|
-
env = process.env,
|
|
989
|
-
fetchImpl = fetch
|
|
990
|
-
}) {
|
|
991
|
-
const desiredName = railwayConnectionLabel(name);
|
|
992
|
-
if (!serviceId || !desiredName) {
|
|
993
|
-
throw new Error("Railway service rename requires a service id and name.");
|
|
994
|
-
}
|
|
995
|
-
void env;
|
|
996
|
-
void fetchImpl;
|
|
997
|
-
throw new Error(`Railway service rename ${serviceId} -> ${desiredName} is not exposed by the official SDK or CLI; direct GraphQL mutation is prohibited.`);
|
|
998
|
-
}
|
|
999
|
-
async function ensureRailwayPostgresService({
|
|
1000
|
-
projectId,
|
|
1001
|
-
environmentId,
|
|
1002
|
-
serviceName,
|
|
1003
|
-
env = process.env,
|
|
1004
|
-
fetchImpl = fetch,
|
|
1005
|
-
maxAttempts = 40
|
|
1006
|
-
}) {
|
|
1007
|
-
const desiredServiceName = railwayConnectionLabel(serviceName);
|
|
1008
|
-
if (!desiredServiceName) {
|
|
1009
|
-
throw new Error("Railway Postgres service creation requires a service name.");
|
|
1010
|
-
}
|
|
1011
|
-
const services = await listRailwayServices({ projectId, env, fetchImpl });
|
|
1012
|
-
const existing = services.find((service) => service.name === desiredServiceName || service.id === desiredServiceName) ?? null;
|
|
1013
|
-
if (existing) {
|
|
1014
|
-
const proof = await inspectRailwayPostgresService({ projectId, environmentId, serviceId: existing.id, env, fetchImpl });
|
|
1015
|
-
if (proof.ok) {
|
|
1016
|
-
return { service: existing, created: false, proof };
|
|
1017
|
-
}
|
|
1018
|
-
throw new Error(
|
|
1019
|
-
`Railway Postgres service ${existing.name} (${existing.id}) failed proof; refusing to delete and recreate an existing service. Repair the existing database service in place and rerun reconciliation.`
|
|
1020
|
-
);
|
|
1021
|
-
}
|
|
1022
|
-
const template = await getRailwayTemplateByCode({ code: "postgres", env, fetchImpl });
|
|
1023
|
-
await deployRailwayTemplate({
|
|
1024
|
-
templateId: template.id,
|
|
1025
|
-
serializedConfig: template.serializedConfig,
|
|
1026
|
-
projectId,
|
|
1027
|
-
environmentId,
|
|
1028
|
-
env,
|
|
1029
|
-
fetchImpl
|
|
1030
|
-
});
|
|
1031
|
-
const settled = await waitForRailwayPostgresTemplateService({
|
|
1032
|
-
projectId,
|
|
1033
|
-
environmentId,
|
|
1034
|
-
desiredServiceName,
|
|
1035
|
-
env,
|
|
1036
|
-
fetchImpl,
|
|
1037
|
-
maxAttempts
|
|
1038
|
-
});
|
|
1039
|
-
return { service: settled.service, created: true, proof: settled.proof };
|
|
1040
|
-
}
|
|
1041
|
-
async function getRailwayTemplateByCode({
|
|
1042
|
-
code,
|
|
1043
|
-
env = process.env,
|
|
1044
|
-
fetchImpl = fetch
|
|
1045
|
-
}) {
|
|
1046
|
-
const payload = await railwayGraphqlRequest({
|
|
1047
|
-
query: `
|
|
1048
|
-
query TreeseedRailwayTemplate($code: String!) {
|
|
1049
|
-
template(code: $code) {
|
|
1050
|
-
id
|
|
1051
|
-
code
|
|
1052
|
-
name
|
|
1053
|
-
serializedConfig
|
|
1054
|
-
}
|
|
1055
|
-
}
|
|
1056
|
-
`.trim(),
|
|
1057
|
-
variables: { code },
|
|
1058
|
-
env,
|
|
1059
|
-
fetchImpl,
|
|
1060
|
-
timeoutMs: 15e3,
|
|
1061
|
-
retries: 1
|
|
1062
|
-
});
|
|
1063
|
-
const template = payload.data?.template;
|
|
1064
|
-
const id = railwayConnectionLabel(template?.id);
|
|
1065
|
-
if (!id || !template || typeof template !== "object") {
|
|
1066
|
-
throw new Error(`Railway Postgres template "${code}" was not found through the Railway API.`);
|
|
1067
|
-
}
|
|
1068
|
-
return {
|
|
1069
|
-
id,
|
|
1070
|
-
code: railwayConnectionLabel(template.code) || null,
|
|
1071
|
-
name: railwayConnectionLabel(template.name) || null,
|
|
1072
|
-
serializedConfig: normalizeTemplateSerializedConfig(template.serializedConfig)
|
|
1073
|
-
};
|
|
1074
|
-
}
|
|
1075
|
-
function normalizeTemplateSerializedConfig(value) {
|
|
1076
|
-
if (typeof value === "string") {
|
|
1077
|
-
try {
|
|
1078
|
-
const parsed = JSON.parse(value);
|
|
1079
|
-
return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
|
|
1080
|
-
} catch {
|
|
1081
|
-
return {};
|
|
1082
|
-
}
|
|
1083
|
-
}
|
|
1084
|
-
return value && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
1085
|
-
}
|
|
1086
|
-
async function deployRailwayTemplate({
|
|
1087
|
-
templateId,
|
|
1088
|
-
serializedConfig,
|
|
1089
|
-
projectId,
|
|
1090
|
-
environmentId,
|
|
1091
|
-
env = process.env,
|
|
1092
|
-
fetchImpl = fetch
|
|
1093
|
-
}) {
|
|
1094
|
-
void serializedConfig;
|
|
1095
|
-
void env;
|
|
1096
|
-
void fetchImpl;
|
|
1097
|
-
throw new Error(`Railway template deployment ${templateId} into ${projectId}/${environmentId} is not exposed non-interactively by the official SDK or CLI; direct GraphQL mutation is prohibited.`);
|
|
1098
|
-
}
|
|
1099
|
-
async function waitForRailwayPostgresTemplateService({
|
|
1100
|
-
projectId,
|
|
1101
|
-
environmentId,
|
|
1102
|
-
desiredServiceName,
|
|
1103
|
-
env = process.env,
|
|
1104
|
-
fetchImpl = fetch,
|
|
1105
|
-
maxAttempts = 40
|
|
1106
|
-
}) {
|
|
1107
|
-
let lastProof = null;
|
|
1108
|
-
for (let attempt = 0; attempt < maxAttempts; attempt += 1) {
|
|
1109
|
-
const services = await listRailwayServices({ projectId, env, fetchImpl });
|
|
1110
|
-
for (const service of services) {
|
|
1111
|
-
const proof = await inspectRailwayPostgresService({
|
|
1112
|
-
projectId,
|
|
1113
|
-
environmentId,
|
|
1114
|
-
serviceId: service.id,
|
|
1115
|
-
env,
|
|
1116
|
-
fetchImpl
|
|
1117
|
-
});
|
|
1118
|
-
if (proof.ok) {
|
|
1119
|
-
const renamed = service.name === desiredServiceName ? service : await updateRailwayServiceName({ serviceId: service.id, name: desiredServiceName, env, fetchImpl });
|
|
1120
|
-
return { service: renamed, proof };
|
|
1121
|
-
}
|
|
1122
|
-
lastProof = proof;
|
|
1123
|
-
}
|
|
1124
|
-
await new Promise((resolve2) => setTimeout(resolve2, 3e3));
|
|
1125
|
-
}
|
|
1126
|
-
throw new Error(`Railway Postgres template deployment did not produce a managed PostgreSQL service named ${desiredServiceName}. Last proof: ${lastProof?.message ?? "no candidate service observed"}`);
|
|
1127
|
-
}
|
|
1128
|
-
async function inspectRailwayPostgresService({
|
|
1129
|
-
projectId,
|
|
1130
|
-
environmentId,
|
|
1131
|
-
serviceId,
|
|
1132
|
-
env = process.env,
|
|
1133
|
-
fetchImpl = fetch
|
|
1134
|
-
}) {
|
|
1135
|
-
const variables = await listRailwayVariables({ projectId, environmentId, serviceId, env, fetchImpl }).catch(() => ({}));
|
|
1136
|
-
const hasConnectionVars = typeof variables.DATABASE_URL === "string" && typeof variables.PGHOST === "string" && typeof variables.PGUSER === "string" && typeof variables.PGPASSWORD === "string" && typeof variables.PGDATABASE === "string";
|
|
1137
|
-
const volumes = await listRailwayVolumes({ projectId, env, fetchImpl }).catch(() => []);
|
|
1138
|
-
const volume = volumes.find((candidate) => candidate.instances.some(
|
|
1139
|
-
(instance) => instance.serviceId === serviceId && instance.environmentId === environmentId && instance.mountPath === "/var/lib/postgresql/data"
|
|
1140
|
-
)) ?? null;
|
|
1141
|
-
const deployment = await inspectRailwayServiceDeploymentHealth({ serviceId, environmentId, env, fetchImpl }).catch((error) => ({
|
|
1142
|
-
ok: false,
|
|
1143
|
-
status: null,
|
|
1144
|
-
message: error instanceof Error ? error.message : String(error ?? "Unable to inspect PostgreSQL deployment health.")
|
|
1145
|
-
}));
|
|
1146
|
-
return {
|
|
1147
|
-
ok: hasConnectionVars && Boolean(volume) && deployment.ok,
|
|
1148
|
-
variableKeys: Object.keys(variables).sort(),
|
|
1149
|
-
volumeId: volume?.id ?? null,
|
|
1150
|
-
deploymentStatus: deployment.status,
|
|
1151
|
-
message: hasConnectionVars ? volume ? deployment.ok ? "Railway managed PostgreSQL markers are present and the deployment is healthy." : `Railway managed PostgreSQL markers are present, but deployment health is not ready. ${deployment.message}` : "PostgreSQL connection variables exist, but the managed data volume is missing." : "PostgreSQL connection variables are missing."
|
|
1152
|
-
};
|
|
1153
|
-
}
|
|
1154
|
-
async function inspectRailwayServiceDeploymentHealth({
|
|
1155
|
-
serviceId,
|
|
1156
|
-
environmentId,
|
|
1157
|
-
env = process.env,
|
|
1158
|
-
fetchImpl = fetch
|
|
1159
|
-
}) {
|
|
1160
|
-
const payload = await railwayGraphqlRequest({
|
|
1161
|
-
query: `
|
|
1162
|
-
query TreeseedRailwayServiceDeploymentHealth($serviceId: String!, $environmentId: String!) {
|
|
1163
|
-
serviceInstance(serviceId: $serviceId, environmentId: $environmentId) {
|
|
1164
|
-
latestDeployment {
|
|
1165
|
-
status
|
|
1166
|
-
deploymentStopped
|
|
1167
|
-
meta
|
|
1168
|
-
instances {
|
|
1169
|
-
status
|
|
1170
|
-
}
|
|
1171
|
-
}
|
|
1172
|
-
}
|
|
1173
|
-
}
|
|
1174
|
-
`.trim(),
|
|
1175
|
-
variables: { serviceId, environmentId },
|
|
1176
|
-
env,
|
|
1177
|
-
fetchImpl
|
|
1178
|
-
});
|
|
1179
|
-
const deployment = payload.data?.serviceInstance?.latestDeployment;
|
|
1180
|
-
const status = railwayConnectionLabel(deployment?.status)?.toUpperCase() ?? null;
|
|
1181
|
-
const instanceStatuses = Array.isArray(deployment?.instances) ? deployment.instances.map((instance) => railwayConnectionLabel(instance?.status)?.toUpperCase()).filter(Boolean) : [];
|
|
1182
|
-
const stopped = deployment?.deploymentStopped === true;
|
|
1183
|
-
const ok = status === "SUCCESS" && !stopped && (instanceStatuses.length === 0 || instanceStatuses.some((candidate) => candidate === "RUNNING"));
|
|
1184
|
-
return {
|
|
1185
|
-
ok,
|
|
1186
|
-
status,
|
|
1187
|
-
deploymentStopped: stopped,
|
|
1188
|
-
instanceStatuses,
|
|
1189
|
-
branch: railwayConnectionLabel(deployment?.meta?.branch) || null,
|
|
1190
|
-
repo: railwayConnectionLabel(deployment?.meta?.repo) || null,
|
|
1191
|
-
rootDirectory: railwayConnectionLabel(deployment?.meta?.rootDirectory) || null,
|
|
1192
|
-
commitHash: railwayConnectionLabel(deployment?.meta?.commitHash) || null,
|
|
1193
|
-
image: railwayConnectionLabel(deployment?.meta?.image) || null,
|
|
1194
|
-
requiredMountPath: railwayConnectionLabel(deployment?.meta?.serviceManifest?.deploy?.requiredMountPath) || null,
|
|
1195
|
-
volumeMounts: Array.isArray(deployment?.meta?.volumeMounts) ? deployment.meta.volumeMounts.map((entry) => railwayConnectionLabel(entry)).filter(Boolean) : [],
|
|
1196
|
-
message: ok ? "Deployment is healthy." : `Latest deployment status is ${status ?? "unknown"}${stopped ? " and stopped" : ""}${instanceStatuses.length ? `; instances=${instanceStatuses.join(",")}` : ""}.`
|
|
1197
|
-
};
|
|
1198
|
-
}
|
|
1199
|
-
async function listRailwayServices({
|
|
1200
|
-
projectId,
|
|
1201
|
-
env = process.env,
|
|
1202
|
-
fetchImpl = fetch
|
|
1203
|
-
}) {
|
|
1204
|
-
const payload = await railwayGraphqlRequest({
|
|
1205
|
-
query: `
|
|
1206
|
-
query TreeseedRailwayProjectServices($projectId: String!) {
|
|
1207
|
-
project(id: $projectId) {
|
|
1208
|
-
id
|
|
1209
|
-
services(first: 50) {
|
|
1210
|
-
edges {
|
|
1211
|
-
node {
|
|
1212
|
-
id
|
|
1213
|
-
name
|
|
1214
|
-
}
|
|
1215
|
-
}
|
|
1216
|
-
}
|
|
1217
|
-
}
|
|
1218
|
-
}
|
|
1219
|
-
`.trim(),
|
|
1220
|
-
variables: { projectId },
|
|
1221
|
-
env,
|
|
1222
|
-
fetchImpl
|
|
1223
|
-
});
|
|
1224
|
-
return normalizeConnectionNodes(payload.data?.project ? payload.data.project.services : null, normalizeService);
|
|
1225
|
-
}
|
|
1226
|
-
async function getRailwayServiceInstance({
|
|
1227
|
-
serviceId,
|
|
1228
|
-
environmentId,
|
|
1229
|
-
env = process.env,
|
|
1230
|
-
fetchImpl = fetch
|
|
1231
|
-
}) {
|
|
1232
|
-
const legacySummary = {
|
|
1233
|
-
id: null,
|
|
1234
|
-
buildCommand: null,
|
|
1235
|
-
dockerfilePath: null,
|
|
1236
|
-
railwayConfigFile: null,
|
|
1237
|
-
startCommand: null,
|
|
1238
|
-
cronSchedule: null,
|
|
1239
|
-
rootDirectory: null,
|
|
1240
|
-
healthcheckPath: null,
|
|
1241
|
-
healthcheckTimeoutSeconds: null,
|
|
1242
|
-
healthcheckIntervalSeconds: null,
|
|
1243
|
-
restartPolicy: null,
|
|
1244
|
-
runtimeMode: null,
|
|
1245
|
-
sleepApplication: null,
|
|
1246
|
-
runtimeConfigSupported: false
|
|
1247
|
-
};
|
|
1248
|
-
try {
|
|
1249
|
-
const payload = await railwayGraphqlRequest({
|
|
1250
|
-
query: `
|
|
1251
|
-
query TreeseedRailwayServiceInstance($serviceId: String!, $environmentId: String!) {
|
|
1252
|
-
serviceInstance(serviceId: $serviceId, environmentId: $environmentId) {
|
|
1253
|
-
id
|
|
1254
|
-
buildCommand
|
|
1255
|
-
dockerfilePath
|
|
1256
|
-
railwayConfigFile
|
|
1257
|
-
startCommand
|
|
1258
|
-
cronSchedule
|
|
1259
|
-
rootDirectory
|
|
1260
|
-
healthcheckPath
|
|
1261
|
-
healthcheckTimeout
|
|
1262
|
-
sleepApplication
|
|
1263
|
-
}
|
|
1264
|
-
}
|
|
1265
|
-
`.trim(),
|
|
1266
|
-
variables: { serviceId, environmentId },
|
|
1267
|
-
env,
|
|
1268
|
-
fetchImpl
|
|
1269
|
-
});
|
|
1270
|
-
const instance = payload.data?.serviceInstance;
|
|
1271
|
-
return {
|
|
1272
|
-
id: railwayConnectionLabel(instance?.id) || null,
|
|
1273
|
-
buildCommand: railwayConnectionLabel(instance?.buildCommand) || null,
|
|
1274
|
-
dockerfilePath: railwayConnectionLabel(instance?.dockerfilePath) || null,
|
|
1275
|
-
railwayConfigFile: railwayConnectionLabel(instance?.railwayConfigFile) || null,
|
|
1276
|
-
startCommand: railwayConnectionLabel(instance?.startCommand) || null,
|
|
1277
|
-
cronSchedule: railwayConnectionLabel(instance?.cronSchedule) || null,
|
|
1278
|
-
rootDirectory: railwayConnectionLabel(instance?.rootDirectory) || null,
|
|
1279
|
-
healthcheckPath: railwayConnectionLabel(instance?.healthcheckPath) || null,
|
|
1280
|
-
healthcheckTimeoutSeconds: normalizeRailwayNumber(instance?.healthcheckTimeout),
|
|
1281
|
-
healthcheckIntervalSeconds: null,
|
|
1282
|
-
restartPolicy: null,
|
|
1283
|
-
runtimeMode: instance?.sleepApplication === true ? "serverless" : "replicated",
|
|
1284
|
-
sleepApplication: typeof instance?.sleepApplication === "boolean" ? instance.sleepApplication : null,
|
|
1285
|
-
runtimeConfigSupported: true
|
|
1286
|
-
};
|
|
1287
|
-
} catch (error) {
|
|
1288
|
-
const message = error instanceof Error ? error.message : String(error ?? "");
|
|
1289
|
-
if (/Cannot query field .*healthcheckPath|Cannot query field .*healthcheckTimeout|Cannot query field .*sleepApplication/iu.test(message)) {
|
|
1290
|
-
const payload = await railwayGraphqlRequest({
|
|
1291
|
-
query: `
|
|
1292
|
-
query TreeseedRailwayServiceInstanceLegacy($serviceId: String!, $environmentId: String!) {
|
|
1293
|
-
serviceInstance(serviceId: $serviceId, environmentId: $environmentId) {
|
|
1294
|
-
id
|
|
1295
|
-
buildCommand
|
|
1296
|
-
dockerfilePath
|
|
1297
|
-
railwayConfigFile
|
|
1298
|
-
startCommand
|
|
1299
|
-
cronSchedule
|
|
1300
|
-
rootDirectory
|
|
1301
|
-
}
|
|
1302
|
-
}
|
|
1303
|
-
`.trim(),
|
|
1304
|
-
variables: { serviceId, environmentId },
|
|
1305
|
-
env,
|
|
1306
|
-
fetchImpl
|
|
1307
|
-
});
|
|
1308
|
-
const instance = payload.data?.serviceInstance;
|
|
1309
|
-
return {
|
|
1310
|
-
...legacySummary,
|
|
1311
|
-
id: railwayConnectionLabel(instance?.id) || null,
|
|
1312
|
-
buildCommand: railwayConnectionLabel(instance?.buildCommand) || null,
|
|
1313
|
-
dockerfilePath: railwayConnectionLabel(instance?.dockerfilePath) || null,
|
|
1314
|
-
railwayConfigFile: railwayConnectionLabel(instance?.railwayConfigFile) || null,
|
|
1315
|
-
startCommand: railwayConnectionLabel(instance?.startCommand) || null,
|
|
1316
|
-
cronSchedule: railwayConnectionLabel(instance?.cronSchedule) || null,
|
|
1317
|
-
rootDirectory: railwayConnectionLabel(instance?.rootDirectory) || null
|
|
1318
|
-
};
|
|
1319
|
-
}
|
|
1320
|
-
if (!/ServiceInstance not found/iu.test(message)) {
|
|
1321
|
-
throw error;
|
|
1322
|
-
}
|
|
1323
|
-
return legacySummary;
|
|
1324
|
-
}
|
|
1325
|
-
}
|
|
1326
|
-
async function ensureRailwayServiceInstanceConfiguration({
|
|
1327
|
-
serviceId,
|
|
1328
|
-
environmentId,
|
|
1329
|
-
buildCommand,
|
|
1330
|
-
dockerfilePath,
|
|
1331
|
-
railwayConfigFile,
|
|
1332
|
-
startCommand,
|
|
1333
|
-
cronSchedule,
|
|
1334
|
-
rootDirectory,
|
|
1335
|
-
healthcheckPath,
|
|
1336
|
-
healthcheckTimeoutSeconds,
|
|
1337
|
-
healthcheckIntervalSeconds,
|
|
1338
|
-
restartPolicy,
|
|
1339
|
-
runtimeMode,
|
|
1340
|
-
deploymentRegion,
|
|
1341
|
-
clearSourceConfiguration = false,
|
|
1342
|
-
env = process.env,
|
|
1343
|
-
fetchImpl = fetch,
|
|
1344
|
-
settleAttempts = 60,
|
|
1345
|
-
settleDelayMs = 5e3
|
|
1346
|
-
}) {
|
|
1347
|
-
let current = await getRailwayServiceInstance({ serviceId, environmentId, env, fetchImpl });
|
|
1348
|
-
if (!current.id) {
|
|
1349
|
-
for (let attempt = 0; attempt < settleAttempts && !current.id; attempt += 1) {
|
|
1350
|
-
await new Promise((resolve2) => setTimeout(resolve2, settleDelayMs));
|
|
1351
|
-
current = await getRailwayServiceInstance({ serviceId, environmentId, env, fetchImpl });
|
|
1352
|
-
}
|
|
1353
|
-
}
|
|
1354
|
-
if (!current.id) {
|
|
1355
|
-
return { instance: current, updated: false };
|
|
1356
|
-
}
|
|
1357
|
-
const desiredRuntimeMode = railwayConnectionLabel(runtimeMode) === "service" ? "replicated" : railwayConnectionLabel(runtimeMode) || null;
|
|
1358
|
-
const desiredDeploymentRegion = railwayConnectionLabel(deploymentRegion) || null;
|
|
1359
|
-
const desired = {
|
|
1360
|
-
buildCommand: railwayConnectionLabel(buildCommand) || null,
|
|
1361
|
-
dockerfilePath: railwayConnectionLabel(dockerfilePath) || null,
|
|
1362
|
-
railwayConfigFile: railwayConnectionLabel(railwayConfigFile) || null,
|
|
1363
|
-
startCommand: railwayConnectionLabel(startCommand) || null,
|
|
1364
|
-
cronSchedule: railwayConnectionLabel(cronSchedule) || null,
|
|
1365
|
-
rootDirectory: railwayConnectionLabel(rootDirectory) || null,
|
|
1366
|
-
healthcheckPath: railwayConnectionLabel(healthcheckPath) || null,
|
|
1367
|
-
healthcheckTimeoutSeconds: normalizeRailwayNumber(healthcheckTimeoutSeconds),
|
|
1368
|
-
healthcheckIntervalSeconds: normalizeRailwayNumber(healthcheckIntervalSeconds),
|
|
1369
|
-
restartPolicy: railwayConnectionLabel(restartPolicy) || null,
|
|
1370
|
-
runtimeMode: desiredRuntimeMode,
|
|
1371
|
-
deploymentRegion: desiredDeploymentRegion,
|
|
1372
|
-
sleepApplication: desiredRuntimeMode === "serverless" ? true : desiredRuntimeMode === "replicated" ? false : null
|
|
1373
|
-
};
|
|
1374
|
-
const needsRuntimeConfig = desired.healthcheckPath !== null || desired.healthcheckTimeoutSeconds !== null || desired.runtimeMode !== null || desired.deploymentRegion !== null;
|
|
1375
|
-
if (needsRuntimeConfig && current.runtimeConfigSupported !== true) {
|
|
1376
|
-
throw new Error("Railway service instance runtime settings are unsupported by the current Railway API schema.");
|
|
1377
|
-
}
|
|
1378
|
-
if (desired.healthcheckIntervalSeconds !== null) {
|
|
1379
|
-
throw new Error("Railway service instance healthcheck intervals are unsupported by the current Railway API schema.");
|
|
1380
|
-
}
|
|
1381
|
-
if (desired.restartPolicy !== null) {
|
|
1382
|
-
throw new Error("Railway service instance restart policies are unsupported by the current Railway API schema.");
|
|
1383
|
-
}
|
|
1384
|
-
const drifted = (desired.buildCommand !== null || clearSourceConfiguration) && desired.buildCommand !== current.buildCommand || (desired.dockerfilePath !== null || clearSourceConfiguration) && desired.dockerfilePath !== current.dockerfilePath || (desired.railwayConfigFile !== null || clearSourceConfiguration) && desired.railwayConfigFile !== current.railwayConfigFile || (desired.startCommand !== null || clearSourceConfiguration) && desired.startCommand !== current.startCommand || desired.cronSchedule !== null && desired.cronSchedule !== current.cronSchedule || (desired.rootDirectory !== null || clearSourceConfiguration) && desired.rootDirectory !== current.rootDirectory || desired.healthcheckPath !== null && desired.healthcheckPath !== current.healthcheckPath || desired.healthcheckTimeoutSeconds !== null && desired.healthcheckTimeoutSeconds !== current.healthcheckTimeoutSeconds || desired.runtimeMode !== null && desired.runtimeMode !== current.runtimeMode || desired.deploymentRegion !== null;
|
|
1385
|
-
if (!drifted) {
|
|
1386
|
-
return { instance: current, updated: false };
|
|
1387
|
-
}
|
|
1388
|
-
const client = createRailwayEnvironmentPatchClient({ env, fetchImpl });
|
|
1389
|
-
await client.stageEnvironmentChanges({
|
|
1390
|
-
environmentId,
|
|
1391
|
-
merge: true,
|
|
1392
|
-
patch: {
|
|
1393
|
-
services: {
|
|
1394
|
-
[serviceId]: {
|
|
1395
|
-
build: {
|
|
1396
|
-
...desired.buildCommand !== null || clearSourceConfiguration ? { buildCommand: desired.buildCommand } : {},
|
|
1397
|
-
...desired.dockerfilePath !== null || clearSourceConfiguration ? { dockerfilePath: desired.dockerfilePath } : {}
|
|
1398
|
-
},
|
|
1399
|
-
...desired.railwayConfigFile !== null || clearSourceConfiguration ? { configFile: desired.railwayConfigFile } : {},
|
|
1400
|
-
...desired.rootDirectory !== null || clearSourceConfiguration ? { source: { rootDirectory: desired.rootDirectory } } : {},
|
|
1401
|
-
deploy: {
|
|
1402
|
-
...desired.startCommand !== null || clearSourceConfiguration ? { startCommand: desired.startCommand } : {},
|
|
1403
|
-
...desired.cronSchedule !== null ? { cronSchedule: desired.cronSchedule } : {},
|
|
1404
|
-
...desired.healthcheckPath !== null ? { healthcheckPath: desired.healthcheckPath } : {},
|
|
1405
|
-
...desired.healthcheckTimeoutSeconds !== null ? { healthcheckTimeout: desired.healthcheckTimeoutSeconds } : {},
|
|
1406
|
-
...desired.sleepApplication !== null ? { sleepApplication: desired.sleepApplication } : {},
|
|
1407
|
-
...desired.runtimeMode !== null ? { runtime: desired.runtimeMode } : {},
|
|
1408
|
-
...desired.deploymentRegion !== null ? {
|
|
1409
|
-
region: desired.deploymentRegion,
|
|
1410
|
-
multiRegionConfig: { [desired.deploymentRegion]: { numReplicas: 1 } }
|
|
1411
|
-
} : {}
|
|
1412
|
-
}
|
|
1413
|
-
}
|
|
1414
|
-
}
|
|
1415
|
-
}
|
|
1416
|
-
});
|
|
1417
|
-
await client.commitStagedPatch({
|
|
1418
|
-
environmentId,
|
|
1419
|
-
message: `Treeseed reconcile service configuration ${serviceId}`,
|
|
1420
|
-
skipDeploys: true
|
|
1421
|
-
});
|
|
1422
|
-
let instance = current;
|
|
1423
|
-
for (let attempt = 0; attempt <= settleAttempts; attempt += 1) {
|
|
1424
|
-
instance = await getRailwayServiceInstance({
|
|
1425
|
-
serviceId,
|
|
1426
|
-
environmentId,
|
|
1427
|
-
env,
|
|
1428
|
-
fetchImpl
|
|
1429
|
-
});
|
|
1430
|
-
if (!serviceInstanceDrifted(instance, desired, clearSourceConfiguration) || attempt >= settleAttempts) {
|
|
1431
|
-
break;
|
|
1432
|
-
}
|
|
1433
|
-
await new Promise((resolve2) => setTimeout(resolve2, settleDelayMs));
|
|
1434
|
-
}
|
|
1435
|
-
return {
|
|
1436
|
-
instance: {
|
|
1437
|
-
id: instance.id || current.id,
|
|
1438
|
-
buildCommand: instance.buildCommand,
|
|
1439
|
-
dockerfilePath: instance.dockerfilePath,
|
|
1440
|
-
railwayConfigFile: instance.railwayConfigFile,
|
|
1441
|
-
startCommand: instance.startCommand,
|
|
1442
|
-
cronSchedule: instance.cronSchedule,
|
|
1443
|
-
rootDirectory: instance.rootDirectory,
|
|
1444
|
-
healthcheckPath: instance.healthcheckPath,
|
|
1445
|
-
healthcheckTimeoutSeconds: instance.healthcheckTimeoutSeconds,
|
|
1446
|
-
healthcheckIntervalSeconds: instance.healthcheckIntervalSeconds,
|
|
1447
|
-
restartPolicy: instance.restartPolicy,
|
|
1448
|
-
runtimeMode: instance.runtimeMode,
|
|
1449
|
-
sleepApplication: instance.sleepApplication,
|
|
1450
|
-
runtimeConfigSupported: instance.runtimeConfigSupported
|
|
1451
|
-
},
|
|
1452
|
-
updated: true
|
|
1453
|
-
};
|
|
1454
|
-
}
|
|
1455
|
-
function serviceInstanceDrifted(current, desired, clearSourceConfiguration = false) {
|
|
1456
|
-
return (desired.buildCommand !== null || clearSourceConfiguration) && desired.buildCommand !== current.buildCommand || (desired.dockerfilePath !== null && desired.dockerfilePath !== void 0 || clearSourceConfiguration) && (desired.dockerfilePath ?? null) !== current.dockerfilePath || (desired.railwayConfigFile !== null && desired.railwayConfigFile !== void 0 || clearSourceConfiguration) && (desired.railwayConfigFile ?? null) !== current.railwayConfigFile || (desired.startCommand !== null || clearSourceConfiguration) && desired.startCommand !== current.startCommand || desired.cronSchedule !== null && desired.cronSchedule !== current.cronSchedule || (desired.rootDirectory !== null || clearSourceConfiguration) && desired.rootDirectory !== current.rootDirectory || desired.healthcheckPath !== null && desired.healthcheckPath !== current.healthcheckPath || desired.healthcheckTimeoutSeconds !== null && desired.healthcheckTimeoutSeconds !== current.healthcheckTimeoutSeconds || desired.runtimeMode !== null && desired.runtimeMode !== current.runtimeMode;
|
|
1457
|
-
}
|
|
1458
|
-
async function listRailwayVariables({
|
|
1459
|
-
projectId,
|
|
1460
|
-
environmentId,
|
|
1461
|
-
serviceId,
|
|
1462
|
-
env = process.env,
|
|
1463
|
-
fetchImpl = fetch
|
|
1464
|
-
}) {
|
|
1465
|
-
const payload = await railwayGraphqlRequest({
|
|
1466
|
-
query: `
|
|
1467
|
-
query TreeseedRailwayVariables($projectId: String!, $environmentId: String!, $serviceId: String) {
|
|
1468
|
-
variables(projectId: $projectId, environmentId: $environmentId, serviceId: $serviceId, unrendered: true)
|
|
1469
|
-
}
|
|
1470
|
-
`.trim(),
|
|
1471
|
-
variables: {
|
|
1472
|
-
projectId,
|
|
1473
|
-
environmentId,
|
|
1474
|
-
serviceId: serviceId || null
|
|
1475
|
-
},
|
|
1476
|
-
env,
|
|
1477
|
-
fetchImpl
|
|
1478
|
-
});
|
|
1479
|
-
return normalizeVariableMap(payload.data?.variables);
|
|
1480
|
-
}
|
|
1481
|
-
async function upsertRailwayVariables({
|
|
1482
|
-
projectId,
|
|
1483
|
-
environmentId,
|
|
1484
|
-
serviceId,
|
|
1485
|
-
variables,
|
|
1486
|
-
env = process.env,
|
|
1487
|
-
fetchImpl = fetch
|
|
1488
|
-
}) {
|
|
1489
|
-
if (Object.keys(variables).length === 0) {
|
|
1490
|
-
return;
|
|
1491
|
-
}
|
|
1492
|
-
const client = createRailwayEnvironmentPatchClient({ env, fetchImpl });
|
|
1493
|
-
const applyVariablePatch = async (keys) => {
|
|
1494
|
-
const variablePatch = Object.fromEntries(keys.map((key) => [key, { value: variables[key] }]));
|
|
1495
|
-
await client.stageEnvironmentChanges({
|
|
1496
|
-
environmentId,
|
|
1497
|
-
merge: true,
|
|
1498
|
-
patch: serviceId ? { services: { [serviceId]: { variables: variablePatch } } } : { sharedVariables: variablePatch }
|
|
1499
|
-
});
|
|
1500
|
-
await client.commitStagedPatch({
|
|
1501
|
-
environmentId,
|
|
1502
|
-
message: `Treeseed update ${keys.length} Railway variable${keys.length === 1 ? "" : "s"}`,
|
|
1503
|
-
skipDeploys: true
|
|
1504
|
-
});
|
|
1505
|
-
};
|
|
1506
|
-
await applyVariablePatch(Object.keys(variables));
|
|
1507
|
-
const expectedKeys = Object.keys(variables);
|
|
1508
|
-
const mismatchedKeys = (observed2) => expectedKeys.filter((key) => observed2[key] !== variables[key]);
|
|
1509
|
-
const observed = await listRailwayVariables({ projectId, environmentId, serviceId, env, fetchImpl }).catch(() => ({}));
|
|
1510
|
-
const missingOrMismatched = mismatchedKeys(observed);
|
|
1511
|
-
if (missingOrMismatched.length > 0) await applyVariablePatch(missingOrMismatched);
|
|
1512
|
-
let retried = missingOrMismatched.length > 0 ? await listRailwayVariables({ projectId, environmentId, serviceId, env, fetchImpl }).catch(() => ({})) : observed;
|
|
1513
|
-
let stillMismatched = mismatchedKeys(retried);
|
|
1514
|
-
for (let attempt = 0; stillMismatched.length > 0 && attempt < 12; attempt += 1) {
|
|
1515
|
-
await new Promise((resolve2) => setTimeout(resolve2, 2500));
|
|
1516
|
-
retried = await listRailwayVariables({ projectId, environmentId, serviceId, env, fetchImpl }).catch(() => ({}));
|
|
1517
|
-
stillMismatched = mismatchedKeys(retried);
|
|
1518
|
-
if (stillMismatched.length > 0 && attempt === 5) {
|
|
1519
|
-
await applyVariablePatch(stillMismatched);
|
|
1520
|
-
}
|
|
1521
|
-
}
|
|
1522
|
-
if (stillMismatched.length > 0) {
|
|
1523
|
-
throw new Error(`Railway variable upsert did not persist expected values: ${stillMismatched.join(", ")}.`);
|
|
1524
|
-
}
|
|
1525
|
-
}
|
|
1526
|
-
async function listRailwayVolumes({
|
|
1527
|
-
projectId,
|
|
1528
|
-
env = process.env,
|
|
1529
|
-
fetchImpl = fetch
|
|
1530
|
-
}) {
|
|
1531
|
-
const query = configuredEnvValue(env, "TREESEED_RAILWAY_VOLUME_LIST_QUERY") || `
|
|
1532
|
-
query TreeseedRailwayVolumeList($projectId: String!) {
|
|
1533
|
-
project(id: $projectId) {
|
|
1534
|
-
id
|
|
1535
|
-
volumes {
|
|
1536
|
-
edges {
|
|
1537
|
-
node {
|
|
1538
|
-
id
|
|
1539
|
-
name
|
|
1540
|
-
projectId
|
|
1541
|
-
volumeInstances {
|
|
1542
|
-
edges {
|
|
1543
|
-
node {
|
|
1544
|
-
id
|
|
1545
|
-
serviceId
|
|
1546
|
-
environmentId
|
|
1547
|
-
mountPath
|
|
1548
|
-
state
|
|
1549
|
-
isPendingDeletion
|
|
1550
|
-
deletedAt
|
|
1551
|
-
}
|
|
1552
|
-
}
|
|
1553
|
-
}
|
|
1554
|
-
}
|
|
1555
|
-
}
|
|
1556
|
-
}
|
|
1557
|
-
}
|
|
1558
|
-
}
|
|
1559
|
-
`.trim();
|
|
1560
|
-
const payload = await railwayGraphqlRequest({
|
|
1561
|
-
query,
|
|
1562
|
-
variables: { projectId },
|
|
1563
|
-
env,
|
|
1564
|
-
fetchImpl
|
|
1565
|
-
});
|
|
1566
|
-
return collectRailwayVolumes(payload.data);
|
|
1567
|
-
}
|
|
1568
|
-
async function ensureRailwayServiceVolume({
|
|
1569
|
-
projectId,
|
|
1570
|
-
environmentId,
|
|
1571
|
-
serviceId,
|
|
1572
|
-
name,
|
|
1573
|
-
mountPath,
|
|
1574
|
-
adoptVolumeId,
|
|
1575
|
-
env = process.env,
|
|
1576
|
-
fetchImpl = fetch,
|
|
1577
|
-
settleAttempts = 24,
|
|
1578
|
-
settleDelayMs = 5e3
|
|
1579
|
-
}) {
|
|
1580
|
-
if (!mountPath.startsWith("/")) {
|
|
1581
|
-
throw new Error(`Railway volume mount path must be absolute: ${mountPath}`);
|
|
1582
|
-
}
|
|
1583
|
-
{
|
|
1584
|
-
const observed = await listRailwayVolumes({ projectId, env, fetchImpl });
|
|
1585
|
-
const exact = observed.find(
|
|
1586
|
-
(candidate) => candidate.name === name && candidate.instances.some(
|
|
1587
|
-
(instance) => instance.serviceId === serviceId && instance.environmentId === environmentId && instance.mountPath === mountPath && isActiveRailwayVolumeInstance(instance)
|
|
1588
|
-
)
|
|
1589
|
-
) ?? null;
|
|
1590
|
-
if (exact) {
|
|
1591
|
-
return {
|
|
1592
|
-
volume: exact,
|
|
1593
|
-
instance: exact.instances.find((instance) => instance.serviceId === serviceId && instance.environmentId === environmentId) ?? null,
|
|
1594
|
-
created: false,
|
|
1595
|
-
updated: false
|
|
1596
|
-
};
|
|
1597
|
-
}
|
|
1598
|
-
const requestedAdoption = railwayConnectionLabel(adoptVolumeId);
|
|
1599
|
-
const adoptable = requestedAdoption ? observed.find((candidate) => candidate.id === requestedAdoption) ?? null : observed.find((candidate) => candidate.name === name) ?? findRailwayVolumeForService(observed, serviceId, environmentId) ?? null;
|
|
1600
|
-
if (requestedAdoption && !adoptable) {
|
|
1601
|
-
throw new Error(`Railway volume ${requestedAdoption} cannot be adopted because it was not found; refusing to create an empty replacement volume.`);
|
|
1602
|
-
}
|
|
1603
|
-
const volumeKey = adoptable?.id ?? name;
|
|
1604
|
-
const client = createRailwayEnvironmentPatchClient({ env, fetchImpl });
|
|
1605
|
-
await client.stageEnvironmentChanges({
|
|
1606
|
-
environmentId,
|
|
1607
|
-
merge: true,
|
|
1608
|
-
patch: {
|
|
1609
|
-
volumes: { [volumeKey]: adoptable ? { isDeleted: false } : { isCreated: true } },
|
|
1610
|
-
services: { [serviceId]: { volumeMounts: { [volumeKey]: { mountPath } } } }
|
|
1611
|
-
}
|
|
1612
|
-
});
|
|
1613
|
-
await client.commitStagedPatch({
|
|
1614
|
-
environmentId,
|
|
1615
|
-
message: `Treeseed reconcile volume ${name}`,
|
|
1616
|
-
skipDeploys: true
|
|
1617
|
-
});
|
|
1618
|
-
for (let attempt = 0; attempt <= settleAttempts; attempt += 1) {
|
|
1619
|
-
if (attempt > 0) await new Promise((resolve2) => setTimeout(resolve2, settleDelayMs));
|
|
1620
|
-
const refreshed = await listRailwayVolumes({ projectId, env, fetchImpl });
|
|
1621
|
-
const volume = refreshed.find((candidate) => candidate.id === adoptable?.id || candidate.name === name) ?? null;
|
|
1622
|
-
const instance = volume?.instances.find(
|
|
1623
|
-
(entry) => entry.serviceId === serviceId && entry.environmentId === environmentId && entry.mountPath === mountPath && isActiveRailwayVolumeInstance(entry)
|
|
1624
|
-
) ?? null;
|
|
1625
|
-
if (volume && instance) return { volume, instance, created: !adoptable, updated: Boolean(adoptable) };
|
|
1626
|
-
}
|
|
1627
|
-
throw new Error(`Railway SDK volume reconciliation did not observe ${name} mounted on service ${serviceId} at ${mountPath}.`);
|
|
1628
|
-
}
|
|
1629
|
-
}
|
|
1630
|
-
function findRailwayVolumeForService(volumes, serviceId, environmentId) {
|
|
1631
|
-
return volumes.find(
|
|
1632
|
-
(candidate) => candidate.instances.some(
|
|
1633
|
-
(instance) => instance.serviceId === serviceId && (!environmentId || instance.environmentId === environmentId) && isActiveRailwayVolumeInstance(instance)
|
|
1634
|
-
)
|
|
1635
|
-
) ?? null;
|
|
1636
|
-
}
|
|
1637
|
-
async function listRailwayCustomDomains({
|
|
1638
|
-
projectId,
|
|
1639
|
-
environmentId,
|
|
1640
|
-
serviceId,
|
|
1641
|
-
env = process.env,
|
|
1642
|
-
fetchImpl = fetch
|
|
1643
|
-
}) {
|
|
1644
|
-
const payload = await railwayGraphqlRequest({
|
|
1645
|
-
query: `
|
|
1646
|
-
query TreeseedRailwayCustomDomains($projectId: String!, $environmentId: String!, $serviceId: String!) {
|
|
1647
|
-
domains(projectId: $projectId, environmentId: $environmentId, serviceId: $serviceId) {
|
|
1648
|
-
customDomains {
|
|
1649
|
-
id
|
|
1650
|
-
domain
|
|
1651
|
-
environmentId
|
|
1652
|
-
serviceId
|
|
1653
|
-
targetPort
|
|
1654
|
-
status {
|
|
1655
|
-
verified
|
|
1656
|
-
certificateStatus
|
|
1657
|
-
verificationDnsHost
|
|
1658
|
-
verificationToken
|
|
1659
|
-
dnsRecords {
|
|
1660
|
-
fqdn
|
|
1661
|
-
hostlabel
|
|
1662
|
-
recordType
|
|
1663
|
-
requiredValue
|
|
1664
|
-
currentValue
|
|
1665
|
-
status
|
|
1666
|
-
zone
|
|
1667
|
-
purpose
|
|
1668
|
-
}
|
|
1669
|
-
}
|
|
1670
|
-
}
|
|
1671
|
-
}
|
|
1672
|
-
}
|
|
1673
|
-
`.trim(),
|
|
1674
|
-
variables: {
|
|
1675
|
-
projectId,
|
|
1676
|
-
environmentId,
|
|
1677
|
-
serviceId
|
|
1678
|
-
},
|
|
1679
|
-
env,
|
|
1680
|
-
fetchImpl
|
|
1681
|
-
});
|
|
1682
|
-
return Array.isArray(payload.data?.domains?.customDomains) ? payload.data.domains.customDomains.map((entry) => entry && typeof entry === "object" ? normalizeRailwayCustomDomain(entry) : null).filter(Boolean) : [];
|
|
1683
|
-
}
|
|
1684
|
-
async function ensureRailwayCustomDomain({
|
|
1685
|
-
projectId,
|
|
1686
|
-
environmentId,
|
|
1687
|
-
serviceId,
|
|
1688
|
-
domain,
|
|
1689
|
-
env = process.env,
|
|
1690
|
-
fetchImpl = fetch
|
|
1691
|
-
}) {
|
|
1692
|
-
const normalizedDomain = railwayConnectionLabel(domain);
|
|
1693
|
-
if (!normalizedDomain) {
|
|
1694
|
-
throw new Error("Railway custom domain creation requires a domain.");
|
|
1695
|
-
}
|
|
1696
|
-
const existing = await listRailwayCustomDomains({ projectId, environmentId, serviceId, env, fetchImpl });
|
|
1697
|
-
const matched = existing.find((entry) => entry.domain === normalizedDomain) ?? null;
|
|
1698
|
-
if (matched) {
|
|
1699
|
-
return { domain: matched, created: false };
|
|
1700
|
-
}
|
|
1701
|
-
await runRailwayCliJson({
|
|
1702
|
-
args: ["domain", normalizedDomain, "--project", projectId, "--environment", environmentId, "--service", serviceId, "--json"],
|
|
1703
|
-
env
|
|
1704
|
-
});
|
|
1705
|
-
const created = (await listRailwayCustomDomains({ projectId, environmentId, serviceId, env, fetchImpl })).find((entry) => entry.domain === normalizedDomain) ?? null;
|
|
1706
|
-
if (!created) {
|
|
1707
|
-
throw new Error(`Railway custom domain create did not return a usable domain for ${normalizedDomain}.`);
|
|
1708
|
-
}
|
|
1709
|
-
return { domain: created, created: true };
|
|
1710
|
-
}
|
|
1711
|
-
function looksLikeRailwayMissingResource(error) {
|
|
1712
|
-
const message = error instanceof Error ? error.message : String(error ?? "");
|
|
1713
|
-
return /not found|does not exist|could not find|unknown|invalid .*id/iu.test(message);
|
|
1714
|
-
}
|
|
1715
|
-
function looksLikeRailwayOperationInProgress(error) {
|
|
1716
|
-
const message = error instanceof Error ? error.message : String(error ?? "");
|
|
1717
|
-
return /operation is already in progress/iu.test(message);
|
|
1718
|
-
}
|
|
1719
|
-
async function railwayDeleteMutation({
|
|
1720
|
-
query,
|
|
1721
|
-
variables,
|
|
1722
|
-
env,
|
|
1723
|
-
fetchImpl,
|
|
1724
|
-
missingResult
|
|
1725
|
-
}) {
|
|
1726
|
-
let lastError = null;
|
|
1727
|
-
for (let attempt = 0; attempt < 6; attempt += 1) {
|
|
1728
|
-
try {
|
|
1729
|
-
const payload = await railwayGraphqlRequest({
|
|
1730
|
-
query,
|
|
1731
|
-
variables,
|
|
1732
|
-
env,
|
|
1733
|
-
fetchImpl
|
|
1734
|
-
});
|
|
1735
|
-
const mutationResult = Object.values(payload.data ?? {})[0];
|
|
1736
|
-
if (mutationResult === false || mutationResult == null) {
|
|
1737
|
-
throw new Error("Railway delete mutation returned no successful deletion result.");
|
|
1738
|
-
}
|
|
1739
|
-
return { status: "deleted" };
|
|
1740
|
-
} catch (error) {
|
|
1741
|
-
if (looksLikeRailwayMissingResource(error)) {
|
|
1742
|
-
return missingResult;
|
|
1743
|
-
}
|
|
1744
|
-
if (!looksLikeRailwayOperationInProgress(error) || attempt >= 5) {
|
|
1745
|
-
throw error;
|
|
1746
|
-
}
|
|
1747
|
-
lastError = error;
|
|
1748
|
-
await new Promise((resolve2) => setTimeout(resolve2, 2500 * (attempt + 1)));
|
|
1749
|
-
}
|
|
1750
|
-
}
|
|
1751
|
-
throw lastError instanceof Error ? lastError : new Error(String(lastError ?? "Railway delete mutation did not complete."));
|
|
1752
|
-
}
|
|
1753
|
-
async function deleteRailwayCustomDomain({
|
|
1754
|
-
projectId,
|
|
1755
|
-
environmentId,
|
|
1756
|
-
serviceId,
|
|
1757
|
-
domainId,
|
|
1758
|
-
env = process.env,
|
|
1759
|
-
fetchImpl = fetch
|
|
1760
|
-
}) {
|
|
1761
|
-
if (!railwayConnectionLabel(domainId)) {
|
|
1762
|
-
return { status: "missing", id: domainId };
|
|
1763
|
-
}
|
|
1764
|
-
void fetchImpl;
|
|
1765
|
-
if (!projectId || !environmentId || !serviceId) throw new Error(`Railway CLI domain deletion requires project, environment, and service ids for ${domainId}.`);
|
|
1766
|
-
await runRailwayCliJson({ args: ["domain", "delete", domainId, "--project", projectId, "--environment", environmentId, "--service", serviceId, "--yes", "--json"], env });
|
|
1767
|
-
return { status: "deleted" };
|
|
1768
|
-
}
|
|
1769
|
-
async function deleteRailwayService({
|
|
1770
|
-
projectId,
|
|
1771
|
-
environmentId,
|
|
1772
|
-
serviceId,
|
|
1773
|
-
env = process.env,
|
|
1774
|
-
fetchImpl = fetch
|
|
1775
|
-
}) {
|
|
1776
|
-
if (!railwayConnectionLabel(serviceId)) {
|
|
1777
|
-
return { status: "missing", id: serviceId };
|
|
1778
|
-
}
|
|
1779
|
-
void fetchImpl;
|
|
1780
|
-
if (!projectId || !environmentId) throw new Error(`Railway CLI service deletion requires project and environment ids for ${serviceId}.`);
|
|
1781
|
-
await runRailwayCliJson({ args: ["service", "delete", "--project", projectId, "--environment", environmentId, "--service", serviceId, "--yes", "--json"], env });
|
|
1782
|
-
return { status: "deleted" };
|
|
1783
|
-
}
|
|
1784
|
-
async function deleteRailwayVolume({
|
|
1785
|
-
projectId,
|
|
1786
|
-
environmentId,
|
|
1787
|
-
volumeId,
|
|
1788
|
-
env = process.env,
|
|
1789
|
-
fetchImpl = fetch
|
|
1790
|
-
}) {
|
|
1791
|
-
if (!railwayConnectionLabel(volumeId)) {
|
|
1792
|
-
return { status: "missing", id: volumeId };
|
|
1793
|
-
}
|
|
1794
|
-
void fetchImpl;
|
|
1795
|
-
if (!projectId || !environmentId) throw new Error(`Railway CLI volume deletion requires project and environment ids for ${volumeId}.`);
|
|
1796
|
-
await runRailwayCliJson({ args: ["volume", "--project", projectId, "--environment", environmentId, "delete", "--volume", volumeId, "--yes", "--json"], env });
|
|
1797
|
-
return { status: "deleted" };
|
|
1798
|
-
}
|
|
1799
|
-
function looksLikeRailwayVolumeDeleteShapeUnsupported(error) {
|
|
1800
|
-
const message = error instanceof Error ? error.message : String(error ?? "");
|
|
1801
|
-
return /Unknown argument|Cannot query field|Unknown field|Field .* is not defined|volumeDelete.*argument|Problem processing request/iu.test(message);
|
|
1802
|
-
}
|
|
1803
|
-
async function deleteRailwayEnvironment({
|
|
1804
|
-
projectId,
|
|
1805
|
-
environmentId,
|
|
1806
|
-
env = process.env,
|
|
1807
|
-
fetchImpl = fetch
|
|
1808
|
-
}) {
|
|
1809
|
-
if (!railwayConnectionLabel(environmentId)) {
|
|
1810
|
-
return { status: "missing", id: environmentId };
|
|
1811
|
-
}
|
|
1812
|
-
void fetchImpl;
|
|
1813
|
-
if (!projectId) throw new Error(`Railway CLI environment deletion requires a project id for ${environmentId}.`);
|
|
1814
|
-
const tempRoot = mkdtempSync(resolve(tmpdir(), "treeseed-railway-environment-delete-"));
|
|
1815
|
-
try {
|
|
1816
|
-
await runRailwayCliJson({ args: ["link", projectId, "--json"], env, cwd: tempRoot });
|
|
1817
|
-
await runRailwayCliJson({ args: ["environment", "delete", environmentId, "--yes", "--json"], env, cwd: tempRoot });
|
|
1818
|
-
} finally {
|
|
1819
|
-
rmSync(tempRoot, { recursive: true, force: true });
|
|
1820
|
-
}
|
|
1821
|
-
return { status: "deleted" };
|
|
1822
|
-
}
|
|
1823
|
-
async function deleteRailwayProject({
|
|
1824
|
-
projectId,
|
|
1825
|
-
env = process.env,
|
|
1826
|
-
fetchImpl = fetch
|
|
1827
|
-
}) {
|
|
1828
|
-
if (!railwayConnectionLabel(projectId)) {
|
|
1829
|
-
return { status: "missing", id: projectId };
|
|
1830
|
-
}
|
|
1831
|
-
void fetchImpl;
|
|
1832
|
-
await runRailwayCliJson({ args: ["project", "delete", "--project", projectId, "--yes", "--json"], env });
|
|
1833
|
-
return { status: "deleted" };
|
|
1834
|
-
}
|
|
1835
|
-
export {
|
|
1836
|
-
assertRailwayGraphqlReadOnly,
|
|
1837
|
-
deleteRailwayCustomDomain,
|
|
1838
|
-
deleteRailwayEnvironment,
|
|
1839
|
-
deleteRailwayProject,
|
|
1840
|
-
deleteRailwayService,
|
|
1841
|
-
deleteRailwayVolume,
|
|
1842
|
-
deployRailwayServiceInstance,
|
|
1843
|
-
ensureRailwayCustomDomain,
|
|
1844
|
-
ensureRailwayEnvironment,
|
|
1845
|
-
ensureRailwayGeneratedServiceDomain,
|
|
1846
|
-
ensureRailwayPostgresService,
|
|
1847
|
-
ensureRailwayProject,
|
|
1848
|
-
ensureRailwayService,
|
|
1849
|
-
ensureRailwayServiceInstanceConfiguration,
|
|
1850
|
-
ensureRailwayServiceVolume,
|
|
1851
|
-
getRailwayAuthProfile,
|
|
1852
|
-
getRailwayProject,
|
|
1853
|
-
getRailwayServiceInstance,
|
|
1854
|
-
inspectRailwayServiceDeploymentHealth,
|
|
1855
|
-
isUsableRailwayToken,
|
|
1856
|
-
listRailwayCustomDomains,
|
|
1857
|
-
listRailwayEnvironmentServices,
|
|
1858
|
-
listRailwayEnvironments,
|
|
1859
|
-
listRailwayProjects,
|
|
1860
|
-
listRailwayServiceDomains,
|
|
1861
|
-
listRailwayServices,
|
|
1862
|
-
listRailwayVariables,
|
|
1863
|
-
listRailwayVolumes,
|
|
1864
|
-
normalizeRailwayEnvironmentName,
|
|
1865
|
-
railwayGraphqlRequest,
|
|
1866
|
-
resolveRailwayApiToken,
|
|
1867
|
-
resolveRailwayApiUrl,
|
|
1868
|
-
resolveRailwayWorkspace,
|
|
1869
|
-
resolveRailwayWorkspaceContext,
|
|
1870
|
-
updateRailwayServiceGitSource,
|
|
1871
|
-
updateRailwayServiceImageSource,
|
|
1872
|
-
updateRailwayServiceName,
|
|
1873
|
-
upsertRailwayVariables
|
|
1874
|
-
};
|