@wardby/cli 0.2.1 → 0.3.0
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/.env.example +34 -4
- package/README.md +41 -4
- package/dist/claude-coding-worker/driver.d.ts +6 -1
- package/dist/claude-coding-worker/driver.js +27 -1
- package/dist/claude-coding-worker/main.js +2 -0
- package/dist/claude-coding-worker/tool-socket.d.ts +9 -0
- package/dist/claude-coding-worker/tool-socket.js +26 -0
- package/dist/cli-help.d.ts +1 -1
- package/dist/cli-help.js +13 -4
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +219 -29
- package/dist/coding/collect-exclude.d.ts +25 -0
- package/dist/coding/collect-exclude.js +76 -0
- package/dist/coding/profile.d.ts +67 -22
- package/dist/coding/profile.js +58 -25
- package/dist/coding/protected-path-wording.d.ts +24 -0
- package/dist/coding/protected-path-wording.js +55 -0
- package/dist/coding/protected-paths.d.ts +31 -0
- package/dist/coding/protected-paths.js +48 -0
- package/dist/coding/protocol.d.ts +75 -4
- package/dist/coding/protocol.js +107 -7
- package/dist/coding/registry/adapters.d.ts +2 -0
- package/dist/coding/registry/adapters.js +9 -0
- package/dist/coding/registry/allowlist.d.ts +9 -0
- package/dist/coding/registry/allowlist.js +28 -0
- package/dist/coding/registry/json-scan.d.ts +55 -0
- package/dist/coding/registry/json-scan.js +191 -0
- package/dist/coding/registry/lockfiles.d.ts +6 -0
- package/dist/coding/registry/lockfiles.js +89 -0
- package/dist/coding/registry/npm-lockfile.d.ts +9 -0
- package/dist/coding/registry/npm-lockfile.js +73 -0
- package/dist/coding/registry/npm-plan.d.ts +29 -0
- package/dist/coding/registry/npm-plan.js +289 -0
- package/dist/coding/registry/npm.d.ts +7 -0
- package/dist/coding/registry/npm.js +252 -0
- package/dist/coding/registry/pypi.d.ts +4 -0
- package/dist/coding/registry/pypi.js +210 -0
- package/dist/coding/registry/report.d.ts +37 -0
- package/dist/coding/registry/report.js +31 -0
- package/dist/coding/registry/token.d.ts +4 -0
- package/dist/coding/registry/token.js +7 -0
- package/dist/coding/registry/types.d.ts +286 -0
- package/dist/coding/registry/types.js +19 -0
- package/dist/coding/registry/worker-config.d.ts +14 -0
- package/dist/coding/registry/worker-config.js +31 -0
- package/dist/coding/services/builtins.d.ts +22 -0
- package/dist/coding/services/builtins.js +85 -0
- package/dist/coding/services/catalog.d.ts +443 -0
- package/dist/coding/services/catalog.js +159 -0
- package/dist/coding/services/declaration.d.ts +11 -0
- package/dist/coding/services/declaration.js +114 -0
- package/dist/coding/services/note.d.ts +8 -0
- package/dist/coding/services/note.js +15 -0
- package/dist/coding/services/resolve.d.ts +25 -0
- package/dist/coding/services/resolve.js +50 -0
- package/dist/coding/services/wording.d.ts +25 -0
- package/dist/coding/services/wording.js +70 -0
- package/dist/coding-proxy/main.js +24 -4
- package/dist/coding-worker/artifact.d.ts +6 -0
- package/dist/coding-worker/debug-trace.d.ts +37 -0
- package/dist/coding-worker/debug-trace.js +117 -0
- package/dist/coding-worker/driver.d.ts +13 -1
- package/dist/coding-worker/driver.js +102 -13
- package/dist/coding-worker/errors.js +8 -0
- package/dist/coding-worker/main.js +10 -2
- package/dist/coding-worker/sdk.d.ts +2 -2
- package/dist/coding-worker/sdk.js +7 -2
- package/dist/coding-worker/types.d.ts +3 -0
- package/dist/config/providers.d.ts +41 -0
- package/dist/config/providers.js +66 -0
- package/dist/core/budget-groups.d.ts +108 -5
- package/dist/core/budget-groups.js +125 -19
- package/dist/core/budget-wording.d.ts +22 -0
- package/dist/core/budget-wording.js +55 -0
- package/dist/core/datastores.js +18 -2
- package/dist/core/db.d.ts +5 -1
- package/dist/core/db.js +8 -2
- package/dist/core/dispatch.d.ts +33 -6
- package/dist/core/dispatch.js +260 -43
- package/dist/core/engine-native.js +27 -10
- package/dist/core/grants.d.ts +86 -0
- package/dist/core/grants.js +126 -0
- package/dist/core/host-events.d.ts +49 -0
- package/dist/core/host-events.js +257 -0
- package/dist/core/host-identity-links.d.ts +54 -0
- package/dist/core/host-identity-links.js +189 -0
- package/dist/core/host-status.d.ts +61 -0
- package/dist/core/host-status.js +211 -0
- package/dist/core/in-flight-runs.d.ts +8 -0
- package/dist/core/in-flight-runs.js +56 -0
- package/dist/core/provider-wording.d.ts +12 -0
- package/dist/core/provider-wording.js +44 -0
- package/dist/core/reconciler.d.ts +38 -2
- package/dist/core/reconciler.js +86 -2
- package/dist/core/repo-access.d.ts +99 -0
- package/dist/core/repo-access.js +136 -0
- package/dist/core/review-host-checks.d.ts +11 -0
- package/dist/core/review-host-checks.js +41 -0
- package/dist/core/review-host-tools.d.ts +47 -0
- package/dist/core/review-host-tools.js +347 -0
- package/dist/core/run-heartbeat.d.ts +27 -0
- package/dist/core/run-heartbeat.js +54 -0
- package/dist/core/runner.d.ts +30 -8
- package/dist/core/runner.js +237 -40
- package/dist/core/secrets.d.ts +11 -2
- package/dist/core/secrets.js +25 -6
- package/dist/core/subagent-memory-tools.d.ts +1 -1
- package/dist/core/subagent-memory-tools.js +16 -3
- package/dist/core/tool-admin.d.ts +81 -0
- package/dist/core/tool-admin.js +129 -0
- package/dist/core/tool-names.d.ts +42 -0
- package/dist/core/tool-names.js +64 -0
- package/dist/core/untrusted-content.d.ts +32 -0
- package/dist/core/untrusted-content.js +72 -0
- package/dist/core/webhooks.d.ts +8 -1
- package/dist/core/webhooks.js +23 -2
- package/dist/generated/prisma/browser.d.ts +100 -0
- package/dist/generated/prisma/client.d.ts +100 -0
- package/dist/generated/prisma/commonInputTypes.d.ts +30 -0
- package/dist/generated/prisma/enums.d.ts +6 -0
- package/dist/generated/prisma/enums.js +6 -1
- package/dist/generated/prisma/internal/class.d.ts +143 -0
- package/dist/generated/prisma/internal/class.js +4 -4
- package/dist/generated/prisma/internal/prismaNamespace.d.ts +1746 -577
- package/dist/generated/prisma/internal/prismaNamespace.js +179 -6
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +186 -0
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +179 -6
- package/dist/generated/prisma/models/Agent.d.ts +294 -1
- package/dist/generated/prisma/models/AgentRepository.d.ts +1425 -0
- package/dist/generated/prisma/models/AgentRepository.js +1 -0
- package/dist/generated/prisma/models/AgentTool.d.ts +95 -1
- package/dist/generated/prisma/models/AuthUser.d.ts +56 -1
- package/dist/generated/prisma/models/CodingAgentProfile.d.ts +258 -7
- package/dist/generated/prisma/models/CodingProxySession.d.ts +123 -2
- package/dist/generated/prisma/models/CodingRun.d.ts +1276 -95
- package/dist/generated/prisma/models/CodingService.d.ts +1348 -0
- package/dist/generated/prisma/models/CodingService.js +1 -0
- package/dist/generated/prisma/models/HostEventDelivery.d.ts +946 -0
- package/dist/generated/prisma/models/HostEventDelivery.js +1 -0
- package/dist/generated/prisma/models/HostIdentity.d.ts +1232 -0
- package/dist/generated/prisma/models/HostIdentity.js +1 -0
- package/dist/generated/prisma/models/HostIdentityLinkRequest.d.ts +1473 -0
- package/dist/generated/prisma/models/HostIdentityLinkRequest.js +1 -0
- package/dist/generated/prisma/models/Principal.d.ts +455 -0
- package/dist/generated/prisma/models/RegistryAllowance.d.ts +1148 -0
- package/dist/generated/prisma/models/RegistryAllowance.js +1 -0
- package/dist/generated/prisma/models/RegistryApprovedVersion.d.ts +1219 -0
- package/dist/generated/prisma/models/RegistryApprovedVersion.js +1 -0
- package/dist/generated/prisma/models/RegistryFetch.d.ts +1428 -0
- package/dist/generated/prisma/models/RegistryFetch.js +1 -0
- package/dist/generated/prisma/models/RegistryPlanRefusal.d.ts +1294 -0
- package/dist/generated/prisma/models/RegistryPlanRefusal.js +1 -0
- package/dist/generated/prisma/models/RegistryVersionFact.d.ts +1085 -0
- package/dist/generated/prisma/models/RegistryVersionFact.js +1 -0
- package/dist/generated/prisma/models/ResourceGrant.d.ts +1437 -0
- package/dist/generated/prisma/models/ResourceGrant.js +1 -0
- package/dist/generated/prisma/models/Run.d.ts +389 -1
- package/dist/generated/prisma/models/RunHostCheck.d.ts +1239 -0
- package/dist/generated/prisma/models/RunHostCheck.js +1 -0
- package/dist/generated/prisma/models/RunHostStatus.d.ts +1315 -0
- package/dist/generated/prisma/models/RunHostStatus.js +1 -0
- package/dist/generated/prisma/models/Tool.d.ts +15 -3
- package/dist/generated/prisma/models.d.ts +13 -0
- package/dist/help/build.d.ts +1 -0
- package/dist/help/build.js +9 -0
- package/dist/help/catalog.d.ts +24 -0
- package/dist/help/catalog.js +160 -0
- package/dist/help/cli.d.ts +2 -0
- package/dist/help/cli.js +65 -0
- package/dist/help/runtime.d.ts +3 -0
- package/dist/help/runtime.js +44 -0
- package/dist/help/search.d.ts +9 -0
- package/dist/help/search.js +104 -0
- package/dist/help-index.json +660 -0
- package/dist/import/cli-args.js +3 -2
- package/dist/import/create.d.ts +5 -0
- package/dist/import/create.js +67 -13
- package/dist/import/index.js +19 -9
- package/dist/import/neutral-schema.d.ts +11 -11
- package/dist/mcp/auth/access.d.ts +70 -0
- package/dist/mcp/auth/access.js +58 -0
- package/dist/mcp/auth/grants-cli.d.ts +149 -0
- package/dist/mcp/auth/grants-cli.js +518 -0
- package/dist/mcp/auth/host-account-cli.d.ts +2 -0
- package/dist/mcp/auth/host-account-cli.js +47 -0
- package/dist/mcp/auth/ownership.d.ts +26 -52
- package/dist/mcp/auth/ownership.js +19 -14
- package/dist/mcp/auth/repo-authorization.d.ts +22 -0
- package/dist/mcp/auth/repo-authorization.js +51 -0
- package/dist/mcp/auth/resource-server.d.ts +31 -2
- package/dist/mcp/auth/resource-server.js +84 -3
- package/dist/mcp/auth/self-hosted/browser.js +2 -2
- package/dist/mcp/auth/self-hosted/cli.js +47 -13
- package/dist/mcp/auth/self-hosted/credentials.d.ts +20 -2
- package/dist/mcp/auth/self-hosted/credentials.js +62 -4
- package/dist/mcp/auth/self-hosted/session.d.ts +2 -1
- package/dist/mcp/context.d.ts +27 -1
- package/dist/mcp/errors.d.ts +25 -6
- package/dist/mcp/errors.js +98 -0
- package/dist/mcp/host-events/github-ingress.d.ts +36 -0
- package/dist/mcp/host-events/github-ingress.js +92 -0
- package/dist/mcp/host-events/github-user-callback.d.ts +18 -0
- package/dist/mcp/host-events/github-user-callback.js +50 -0
- package/dist/mcp/index.d.ts +8 -1
- package/dist/mcp/index.js +106 -16
- package/dist/mcp/server.js +27 -9
- package/dist/mcp/tools/agents.js +446 -48
- package/dist/mcp/tools/budget-groups.js +3 -3
- package/dist/mcp/tools/datastore.js +22 -15
- package/dist/mcp/tools/grants.d.ts +2 -0
- package/dist/mcp/tools/grants.js +239 -0
- package/dist/mcp/tools/help.d.ts +5 -0
- package/dist/mcp/tools/help.js +67 -0
- package/dist/mcp/tools/host-accounts.d.ts +2 -0
- package/dist/mcp/tools/host-accounts.js +114 -0
- package/dist/mcp/tools/memory.d.ts +7 -1
- package/dist/mcp/tools/memory.js +5 -5
- package/dist/mcp/tools/repositories.d.ts +2 -0
- package/dist/mcp/tools/repositories.js +181 -0
- package/dist/mcp/tools/runs.d.ts +6 -0
- package/dist/mcp/tools/runs.js +60 -6
- package/dist/mcp/tools/scheduling.js +3 -6
- package/dist/mcp/tools/secrets.js +18 -6
- package/dist/mcp/tools/services.d.ts +2 -0
- package/dist/mcp/tools/services.js +222 -0
- package/dist/mcp/tools/subagents.js +52 -16
- package/dist/mcp/tools/tools.d.ts +41 -0
- package/dist/mcp/tools/tools.js +201 -40
- package/dist/mcp/tools/trigger.js +36 -6
- package/dist/mcp/tools/webhooks.js +15 -4
- package/dist/mcp/transport/streamable-http.d.ts +10 -0
- package/dist/mcp/transport/streamable-http.js +32 -2
- package/dist/providers/auth/delegating.d.ts +19 -0
- package/dist/providers/auth/delegating.js +71 -0
- package/dist/providers/auth/index.d.ts +2 -0
- package/dist/providers/auth/index.js +11 -0
- package/dist/providers/auth/self-hosted.d.ts +2 -1
- package/dist/providers/auth/self-hosted.js +16 -4
- package/dist/providers/auth/types.d.ts +6 -0
- package/dist/providers/coding-proxy/memory-ledger.d.ts +3 -0
- package/dist/providers/coding-proxy/memory-ledger.js +21 -2
- package/dist/providers/coding-proxy/metering.d.ts +4 -0
- package/dist/providers/coding-proxy/metering.js +28 -2
- package/dist/providers/coding-proxy/prisma-ledger.d.ts +17 -0
- package/dist/providers/coding-proxy/prisma-ledger.js +50 -5
- package/dist/providers/coding-proxy/proxy.d.ts +13 -0
- package/dist/providers/coding-proxy/proxy.js +479 -18
- package/dist/providers/coding-proxy/registry/audit.d.ts +131 -0
- package/dist/providers/coding-proxy/registry/audit.js +380 -0
- package/dist/providers/coding-proxy/registry/bounded-fetch.d.ts +16 -0
- package/dist/providers/coding-proxy/registry/bounded-fetch.js +77 -0
- package/dist/providers/coding-proxy/registry/plan.d.ts +58 -0
- package/dist/providers/coding-proxy/registry/plan.js +304 -0
- package/dist/providers/coding-proxy/registry/prisma-store.d.ts +34 -0
- package/dist/providers/coding-proxy/registry/prisma-store.js +151 -0
- package/dist/providers/coding-proxy/registry/service.d.ts +213 -0
- package/dist/providers/coding-proxy/registry/service.js +1137 -0
- package/dist/providers/coding-proxy/registry/store.d.ts +127 -0
- package/dist/providers/coding-proxy/registry/store.js +70 -0
- package/dist/providers/coding-proxy/runtime.d.ts +17 -0
- package/dist/providers/coding-proxy/runtime.js +63 -0
- package/dist/providers/coding-proxy/secure-fetch.js +0 -1
- package/dist/providers/coding-proxy/server.d.ts +11 -0
- package/dist/providers/coding-proxy/server.js +163 -0
- package/dist/providers/coding-proxy/types.d.ts +15 -0
- package/dist/providers/engine/types.d.ts +10 -0
- package/dist/providers/executor/build.d.ts +2 -2
- package/dist/providers/executor/composition.d.ts +3 -0
- package/dist/providers/executor/composition.js +19 -0
- package/dist/providers/executor/container.d.ts +105 -3
- package/dist/providers/executor/container.js +296 -20
- package/dist/providers/executor/dbos.d.ts +2 -3
- package/dist/providers/executor/in-process.d.ts +2 -3
- package/dist/providers/executor/routing.d.ts +7 -0
- package/dist/providers/executor/routing.js +13 -0
- package/dist/providers/executor/types.d.ts +22 -0
- package/dist/providers/jobs/claude-tool-setup.d.ts +23 -0
- package/dist/providers/jobs/claude-tool-setup.js +50 -0
- package/dist/providers/jobs/collect-prune.d.ts +7 -0
- package/dist/providers/jobs/collect-prune.js +27 -0
- package/dist/providers/jobs/docker-isolation.d.ts +48 -3
- package/dist/providers/jobs/docker-isolation.js +213 -22
- package/dist/providers/jobs/docker-services.d.ts +35 -0
- package/dist/providers/jobs/docker-services.js +191 -0
- package/dist/providers/jobs/docker.d.ts +49 -2
- package/dist/providers/jobs/docker.js +279 -32
- package/dist/providers/jobs/fake-kubernetes-api.d.ts +1 -0
- package/dist/providers/jobs/fake-kubernetes-api.js +12 -3
- package/dist/providers/jobs/kubernetes-isolation.d.ts +17 -2
- package/dist/providers/jobs/kubernetes-isolation.js +238 -57
- package/dist/providers/jobs/kubernetes-platform.d.ts +10 -4
- package/dist/providers/jobs/kubernetes-platform.js +11 -5
- package/dist/providers/jobs/kubernetes-preflight.js +3 -0
- package/dist/providers/jobs/kubernetes.d.ts +21 -2
- package/dist/providers/jobs/kubernetes.js +112 -21
- package/dist/providers/jobs/types.d.ts +18 -0
- package/dist/providers/llm/anthropic.js +6 -2
- package/dist/providers/llm/bedrock.js +2 -1
- package/dist/providers/llm/claude-messages.d.ts +5 -1
- package/dist/providers/llm/claude-messages.js +1 -0
- package/dist/providers/llm/claude-provider.d.ts +3 -1
- package/dist/providers/llm/claude-provider.js +5 -1
- package/dist/providers/llm/index.d.ts +1 -1
- package/dist/providers/llm/index.js +1 -1
- package/dist/providers/llm/pricing-anthropic.d.ts +10 -0
- package/dist/providers/llm/pricing-anthropic.js +32 -14
- package/dist/providers/llm/pricing-bedrock-claude.d.ts +8 -0
- package/dist/providers/llm/pricing-bedrock-claude.js +9 -0
- package/dist/providers/llm/routing.d.ts +10 -1
- package/dist/providers/llm/routing.js +18 -0
- package/dist/providers/llm/types.d.ts +12 -0
- package/dist/providers/llm/types.js +8 -1
- package/dist/providers/review-host/diff-lines.d.ts +16 -0
- package/dist/providers/review-host/diff-lines.js +59 -0
- package/dist/providers/review-host/github-events.d.ts +6 -0
- package/dist/providers/review-host/github-events.js +180 -0
- package/dist/providers/review-host/github-user-auth.d.ts +38 -0
- package/dist/providers/review-host/github-user-auth.js +128 -0
- package/dist/providers/review-host/github.d.ts +57 -0
- package/dist/providers/review-host/github.js +567 -0
- package/dist/providers/review-host/index.d.ts +12 -0
- package/dist/providers/review-host/index.js +30 -0
- package/dist/providers/review-host/review-format.d.ts +19 -0
- package/dist/providers/review-host/review-format.js +59 -0
- package/dist/providers/review-host/types.d.ts +284 -0
- package/dist/providers/review-host/types.js +24 -0
- package/dist/providers/vcs/git.d.ts +16 -6
- package/dist/providers/vcs/git.js +77 -13
- package/dist/providers/vcs/github.d.ts +74 -3
- package/dist/providers/vcs/github.js +195 -15
- package/dist/providers/vcs/types.d.ts +42 -4
- package/dist/quickstart/index.js +13 -2
- package/dist/sandbox/fetch-policy.d.ts +20 -2
- package/dist/sandbox/fetch-policy.js +64 -3
- package/dist/sandbox/host-functions.d.ts +9 -1
- package/dist/sandbox/host-functions.js +12 -5
- package/dist/serve.js +1 -1
- package/dist/wardby-bin.js +6 -0
- package/docs/README.md +30 -0
- package/docs/architecture-runtime.md +90 -0
- package/docs/assets/brand/wardby-icon-512.png +0 -0
- package/docs/assets/brand/wardby-icon.svg +16 -0
- package/docs/assets/brand/wardby-mascot-profile-512.png +0 -0
- package/docs/assets/brand/wardby-mascot.png +0 -0
- package/docs/assets/brand/wardby-mascot.svg +5 -0
- package/docs/assets/wardby-workflow.svg +106 -0
- package/docs/code-review-agents.md +481 -0
- package/docs/coding-agent-setup.md +172 -0
- package/docs/coding-packages.md +455 -0
- package/docs/coding-services.md +300 -0
- package/docs/coding-worker-byo-images.md +98 -0
- package/docs/coding-worker-isolation.md +1061 -0
- package/docs/getting-started-gke.md +615 -0
- package/docs/getting-started-identity-provider.md +308 -0
- package/docs/getting-started.md +133 -0
- package/docs/observability.md +53 -0
- package/docs/release-verification.md +66 -0
- package/docs/security-deployment.md +657 -0
- package/help/code-review-agents.md +31 -0
- package/help/coding-packages.md +31 -0
- package/help/coding-services.md +71 -0
- package/help/creating-agents.md +68 -0
- package/help/deploy-gke.md +39 -0
- package/help/deployment-targets.md +39 -0
- package/help/errors/budget-group-exhausted.md +25 -0
- package/help/errors/docker-isolation-unsupported.md +26 -0
- package/help/errors/protected-path.md +45 -0
- package/help/errors/repo-access.md +27 -0
- package/help/errors/service-declaration-invalid.md +27 -0
- package/help/errors/service-declaration-unavailable.md +25 -0
- package/help/errors/service-launcher-unsupported.md +30 -0
- package/help/errors/service-not-allowed.md +27 -0
- package/help/errors/service-unknown.md +23 -0
- package/help/errors/service-unready.md +49 -0
- package/help/getting-started.md +31 -0
- package/help/github.md +30 -0
- package/help/identity-and-access.md +39 -0
- package/help/mcp.md +30 -0
- package/help/native-capabilities.md +30 -0
- package/help/observability.md +41 -0
- package/help/operating-agents.md +30 -0
- package/help/security.md +27 -0
- package/help/troubleshooting/budgets.md +26 -0
- package/help/troubleshooting/coding-workers.md +47 -0
- package/help/troubleshooting/repository-access.md +27 -0
- package/package.json +12 -3
- package/prisma/migrations/20260925010000_coding_collect_exclude/migration.sql +8 -0
- package/prisma/migrations/20260925015000_allowed_egress_default/migration.sql +8 -0
- package/prisma/migrations/20260925020000_coding_package_registry/migration.sql +55 -0
- package/prisma/migrations/20260925030000_tool_name_per_owner/migration.sql +11 -0
- package/prisma/migrations/20260926010000_run_trigger_host_event/migration.sql +7 -0
- package/prisma/migrations/20260926020000_code_review_hosts/migration.sql +53 -0
- package/prisma/migrations/20260926030000_auth_user_roles/migration.sql +9 -0
- package/prisma/migrations/20260926040000_agent_effort/migration.sql +6 -0
- package/prisma/migrations/20260926050000_registry_lockfile_plan/migration.sql +32 -0
- package/prisma/migrations/20260926050000_repo_access_authorization/migration.sql +82 -0
- package/prisma/migrations/20260926060000_registry_plan_refusal/migration.sql +19 -0
- package/prisma/migrations/20260926100000_registry_plan_refusal_published_at/migration.sql +5 -0
- package/prisma/migrations/20260926190000_run_host_status/migration.sql +18 -0
- package/prisma/migrations/20260926210000_run_host_status_at_dispatch/migration.sql +5 -0
- package/prisma/migrations/20260927010000_resource_grants/migration.sql +72 -0
- package/prisma/migrations/20260927020000_proxy_session_budget_exhausted/migration.sql +3 -0
- package/prisma/migrations/20260927030000_coding_debug_trace/migration.sql +4 -0
- package/prisma/migrations/20260927040000_proxy_session_upstream_failure/migration.sql +3 -0
- package/prisma/migrations/20260927050000_coding_run_services/migration.sql +74 -0
- package/prisma/migrations/20260928000000_coding_run_tool_image/migration.sql +5 -0
- package/prisma/schema.prisma +407 -21
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
function postgres(version, digest) {
|
|
2
|
+
return {
|
|
3
|
+
name: "postgres",
|
|
4
|
+
version,
|
|
5
|
+
kind: "sidecar",
|
|
6
|
+
image: `docker.io/library/postgres@${digest}`,
|
|
7
|
+
port: 5432,
|
|
8
|
+
serviceEnv: {
|
|
9
|
+
POSTGRES_USER: "test",
|
|
10
|
+
POSTGRES_PASSWORD: "test",
|
|
11
|
+
POSTGRES_DB: "test",
|
|
12
|
+
PGDATA: "/var/lib/postgresql/data/pgdata",
|
|
13
|
+
},
|
|
14
|
+
testEnv: {
|
|
15
|
+
DATABASE_URL: "postgres://test:test@127.0.0.1:5432/test",
|
|
16
|
+
PGHOST: "127.0.0.1",
|
|
17
|
+
PGPORT: "5432",
|
|
18
|
+
PGUSER: "test",
|
|
19
|
+
PGPASSWORD: "test",
|
|
20
|
+
PGDATABASE: "test",
|
|
21
|
+
},
|
|
22
|
+
readiness: {
|
|
23
|
+
command: ["pg_isready", "-h", "127.0.0.1", "-p", "5432", "-U", "test", "-d", "test"],
|
|
24
|
+
periodSeconds: 2,
|
|
25
|
+
timeoutSeconds: 2,
|
|
26
|
+
failureThreshold: 30,
|
|
27
|
+
},
|
|
28
|
+
resources: { cpuMillicores: 500, memoryMib: 512, diskMib: 1024 },
|
|
29
|
+
dataPath: "/var/lib/postgresql/data",
|
|
30
|
+
writablePaths: ["/var/run/postgresql", "/tmp"],
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export const BUILTIN_CODING_SERVICES = Object.freeze([
|
|
34
|
+
postgres("15", "sha256:724292da1f2e50bdccfc3302ce75bbba7f4a6076701b588cc795fcac65683550"),
|
|
35
|
+
postgres("16", "sha256:1a6ab3f5345eb6dbe04a1349529caabdb0ab09293a09590fad07b2246bfa4b54"),
|
|
36
|
+
postgres("17", "sha256:d74eeac9a635390a49bc21bd49fccd973de707e2a53a76ac49b552b8712ec46f"),
|
|
37
|
+
{
|
|
38
|
+
name: "redis",
|
|
39
|
+
version: "7",
|
|
40
|
+
kind: "sidecar",
|
|
41
|
+
image: "docker.io/library/redis@sha256:c6eabf748fc7a61dbb5a705c78bcf3d6377b1127a97d0ce965c11c44ba46896f",
|
|
42
|
+
port: 6379,
|
|
43
|
+
serviceEnv: {},
|
|
44
|
+
testEnv: { REDIS_URL: "redis://127.0.0.1:6379/0", REDIS_HOST: "127.0.0.1", REDIS_PORT: "6379" },
|
|
45
|
+
readiness: {
|
|
46
|
+
command: ["redis-cli", "-h", "127.0.0.1", "-p", "6379", "ping"],
|
|
47
|
+
periodSeconds: 1,
|
|
48
|
+
timeoutSeconds: 2,
|
|
49
|
+
failureThreshold: 30,
|
|
50
|
+
},
|
|
51
|
+
resources: { cpuMillicores: 250, memoryMib: 256, diskMib: 256 },
|
|
52
|
+
dataPath: "/data",
|
|
53
|
+
writablePaths: [],
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: "mysql",
|
|
57
|
+
version: "8",
|
|
58
|
+
kind: "sidecar",
|
|
59
|
+
image: "docker.io/library/mysql@sha256:0744ee5ef89ce6ccfa13de3e579fe6b9e27f93dd70da9c06d2c908b1b193fb8d",
|
|
60
|
+
port: 3306,
|
|
61
|
+
serviceEnv: {
|
|
62
|
+
MYSQL_ROOT_PASSWORD: "test",
|
|
63
|
+
MYSQL_DATABASE: "test",
|
|
64
|
+
MYSQL_USER: "test",
|
|
65
|
+
MYSQL_PASSWORD: "test",
|
|
66
|
+
},
|
|
67
|
+
testEnv: {
|
|
68
|
+
DATABASE_URL: "mysql://test:test@127.0.0.1:3306/test",
|
|
69
|
+
MYSQL_HOST: "127.0.0.1",
|
|
70
|
+
MYSQL_TCP_PORT: "3306",
|
|
71
|
+
MYSQL_USER: "test",
|
|
72
|
+
MYSQL_PASSWORD: "test",
|
|
73
|
+
MYSQL_DATABASE: "test",
|
|
74
|
+
},
|
|
75
|
+
readiness: {
|
|
76
|
+
command: ["mysqladmin", "ping", "-h", "127.0.0.1", "-P", "3306", "-utest", "-ptest", "--silent"],
|
|
77
|
+
periodSeconds: 2,
|
|
78
|
+
timeoutSeconds: 3,
|
|
79
|
+
failureThreshold: 45,
|
|
80
|
+
},
|
|
81
|
+
resources: { cpuMillicores: 500, memoryMib: 1024, diskMib: 2048 },
|
|
82
|
+
dataPath: "/var/lib/mysql",
|
|
83
|
+
writablePaths: ["/var/run/mysqld", "/tmp"],
|
|
84
|
+
},
|
|
85
|
+
]);
|
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The coding-run service catalog (docs/coding-services.md): what a repository's
|
|
3
|
+
* .wardby/services.yaml may name. An entry is admin-managed, trusted data: a
|
|
4
|
+
* digest-pinned image, the environment it starts with, the variables it hands
|
|
5
|
+
* the agent's shells, how to tell it is ready, and what it may use. Repository
|
|
6
|
+
* content only ever names an entry; it never supplies any of these.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
/** "sidecar": a fresh instance in each run's pod. "external" is reserved for shared services reached through the proxy. */
|
|
10
|
+
export declare const CODING_SERVICE_KINDS: readonly ["sidecar"];
|
|
11
|
+
/** How many service names one agent may be allowed. */
|
|
12
|
+
export declare const MAX_AGENT_SERVICES = 16;
|
|
13
|
+
export declare const MAX_SERVICE_ENV = 32;
|
|
14
|
+
export declare const codingServiceNameSchema: z.ZodString;
|
|
15
|
+
export declare const codingServiceVersionSchema: z.ZodString;
|
|
16
|
+
export declare const CodingServiceReadinessSchema: z.ZodObject<{
|
|
17
|
+
command: z.ZodArray<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, "many">;
|
|
18
|
+
periodSeconds: z.ZodNumber;
|
|
19
|
+
timeoutSeconds: z.ZodNumber;
|
|
20
|
+
failureThreshold: z.ZodNumber;
|
|
21
|
+
}, "strict", z.ZodTypeAny, {
|
|
22
|
+
command: string[];
|
|
23
|
+
periodSeconds: number;
|
|
24
|
+
timeoutSeconds: number;
|
|
25
|
+
failureThreshold: number;
|
|
26
|
+
}, {
|
|
27
|
+
command: string[];
|
|
28
|
+
periodSeconds: number;
|
|
29
|
+
timeoutSeconds: number;
|
|
30
|
+
failureThreshold: number;
|
|
31
|
+
}>;
|
|
32
|
+
export declare const CodingServiceResourcesSchema: z.ZodObject<{
|
|
33
|
+
cpuMillicores: z.ZodNumber;
|
|
34
|
+
memoryMib: z.ZodNumber;
|
|
35
|
+
diskMib: z.ZodNumber;
|
|
36
|
+
}, "strict", z.ZodTypeAny, {
|
|
37
|
+
cpuMillicores: number;
|
|
38
|
+
memoryMib: number;
|
|
39
|
+
diskMib: number;
|
|
40
|
+
}, {
|
|
41
|
+
cpuMillicores: number;
|
|
42
|
+
memoryMib: number;
|
|
43
|
+
diskMib: number;
|
|
44
|
+
}>;
|
|
45
|
+
/** One run's snapshot of an entry: what dispatch stores on CodingRun.services and the launcher reads. */
|
|
46
|
+
export declare const ResolvedCodingServiceSchema: z.ZodEffects<z.ZodObject<{
|
|
47
|
+
name: z.ZodString;
|
|
48
|
+
version: z.ZodString;
|
|
49
|
+
image: z.ZodEffects<z.ZodString, string, string>;
|
|
50
|
+
port: z.ZodNumber;
|
|
51
|
+
serviceEnv: z.ZodDefault<z.ZodEffects<z.ZodRecord<z.ZodString, z.ZodEffects<z.ZodString, string, string>>, Record<string, string>, Record<string, string>>>;
|
|
52
|
+
testEnv: z.ZodDefault<z.ZodEffects<z.ZodRecord<z.ZodString, z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>>, Record<string, string>, Record<string, string>>>;
|
|
53
|
+
readiness: z.ZodObject<{
|
|
54
|
+
command: z.ZodArray<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, "many">;
|
|
55
|
+
periodSeconds: z.ZodNumber;
|
|
56
|
+
timeoutSeconds: z.ZodNumber;
|
|
57
|
+
failureThreshold: z.ZodNumber;
|
|
58
|
+
}, "strict", z.ZodTypeAny, {
|
|
59
|
+
command: string[];
|
|
60
|
+
periodSeconds: number;
|
|
61
|
+
timeoutSeconds: number;
|
|
62
|
+
failureThreshold: number;
|
|
63
|
+
}, {
|
|
64
|
+
command: string[];
|
|
65
|
+
periodSeconds: number;
|
|
66
|
+
timeoutSeconds: number;
|
|
67
|
+
failureThreshold: number;
|
|
68
|
+
}>;
|
|
69
|
+
resources: z.ZodObject<{
|
|
70
|
+
cpuMillicores: z.ZodNumber;
|
|
71
|
+
memoryMib: z.ZodNumber;
|
|
72
|
+
diskMib: z.ZodNumber;
|
|
73
|
+
}, "strict", z.ZodTypeAny, {
|
|
74
|
+
cpuMillicores: number;
|
|
75
|
+
memoryMib: number;
|
|
76
|
+
diskMib: number;
|
|
77
|
+
}, {
|
|
78
|
+
cpuMillicores: number;
|
|
79
|
+
memoryMib: number;
|
|
80
|
+
diskMib: number;
|
|
81
|
+
}>;
|
|
82
|
+
dataPath: z.ZodEffects<z.ZodString, string, string>;
|
|
83
|
+
writablePaths: z.ZodDefault<z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">>;
|
|
84
|
+
}, "strict", z.ZodTypeAny, {
|
|
85
|
+
name: string;
|
|
86
|
+
resources: {
|
|
87
|
+
cpuMillicores: number;
|
|
88
|
+
memoryMib: number;
|
|
89
|
+
diskMib: number;
|
|
90
|
+
};
|
|
91
|
+
version: string;
|
|
92
|
+
testEnv: Record<string, string>;
|
|
93
|
+
image: string;
|
|
94
|
+
port: number;
|
|
95
|
+
serviceEnv: Record<string, string>;
|
|
96
|
+
readiness: {
|
|
97
|
+
command: string[];
|
|
98
|
+
periodSeconds: number;
|
|
99
|
+
timeoutSeconds: number;
|
|
100
|
+
failureThreshold: number;
|
|
101
|
+
};
|
|
102
|
+
dataPath: string;
|
|
103
|
+
writablePaths: string[];
|
|
104
|
+
}, {
|
|
105
|
+
name: string;
|
|
106
|
+
resources: {
|
|
107
|
+
cpuMillicores: number;
|
|
108
|
+
memoryMib: number;
|
|
109
|
+
diskMib: number;
|
|
110
|
+
};
|
|
111
|
+
version: string;
|
|
112
|
+
image: string;
|
|
113
|
+
port: number;
|
|
114
|
+
readiness: {
|
|
115
|
+
command: string[];
|
|
116
|
+
periodSeconds: number;
|
|
117
|
+
timeoutSeconds: number;
|
|
118
|
+
failureThreshold: number;
|
|
119
|
+
};
|
|
120
|
+
dataPath: string;
|
|
121
|
+
testEnv?: Record<string, string> | undefined;
|
|
122
|
+
serviceEnv?: Record<string, string> | undefined;
|
|
123
|
+
writablePaths?: string[] | undefined;
|
|
124
|
+
}>, {
|
|
125
|
+
name: string;
|
|
126
|
+
resources: {
|
|
127
|
+
cpuMillicores: number;
|
|
128
|
+
memoryMib: number;
|
|
129
|
+
diskMib: number;
|
|
130
|
+
};
|
|
131
|
+
version: string;
|
|
132
|
+
testEnv: Record<string, string>;
|
|
133
|
+
image: string;
|
|
134
|
+
port: number;
|
|
135
|
+
serviceEnv: Record<string, string>;
|
|
136
|
+
readiness: {
|
|
137
|
+
command: string[];
|
|
138
|
+
periodSeconds: number;
|
|
139
|
+
timeoutSeconds: number;
|
|
140
|
+
failureThreshold: number;
|
|
141
|
+
};
|
|
142
|
+
dataPath: string;
|
|
143
|
+
writablePaths: string[];
|
|
144
|
+
}, {
|
|
145
|
+
name: string;
|
|
146
|
+
resources: {
|
|
147
|
+
cpuMillicores: number;
|
|
148
|
+
memoryMib: number;
|
|
149
|
+
diskMib: number;
|
|
150
|
+
};
|
|
151
|
+
version: string;
|
|
152
|
+
image: string;
|
|
153
|
+
port: number;
|
|
154
|
+
readiness: {
|
|
155
|
+
command: string[];
|
|
156
|
+
periodSeconds: number;
|
|
157
|
+
timeoutSeconds: number;
|
|
158
|
+
failureThreshold: number;
|
|
159
|
+
};
|
|
160
|
+
dataPath: string;
|
|
161
|
+
testEnv?: Record<string, string> | undefined;
|
|
162
|
+
serviceEnv?: Record<string, string> | undefined;
|
|
163
|
+
writablePaths?: string[] | undefined;
|
|
164
|
+
}>;
|
|
165
|
+
/** A catalog entry, as create_service takes it and the CodingService table holds it. */
|
|
166
|
+
export declare const CodingServiceDefinitionSchema: z.ZodEffects<z.ZodObject<{
|
|
167
|
+
kind: z.ZodDefault<z.ZodEnum<["sidecar"]>>;
|
|
168
|
+
name: z.ZodString;
|
|
169
|
+
version: z.ZodString;
|
|
170
|
+
image: z.ZodEffects<z.ZodString, string, string>;
|
|
171
|
+
port: z.ZodNumber;
|
|
172
|
+
serviceEnv: z.ZodDefault<z.ZodEffects<z.ZodRecord<z.ZodString, z.ZodEffects<z.ZodString, string, string>>, Record<string, string>, Record<string, string>>>;
|
|
173
|
+
testEnv: z.ZodDefault<z.ZodEffects<z.ZodRecord<z.ZodString, z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>>, Record<string, string>, Record<string, string>>>;
|
|
174
|
+
readiness: z.ZodObject<{
|
|
175
|
+
command: z.ZodArray<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, "many">;
|
|
176
|
+
periodSeconds: z.ZodNumber;
|
|
177
|
+
timeoutSeconds: z.ZodNumber;
|
|
178
|
+
failureThreshold: z.ZodNumber;
|
|
179
|
+
}, "strict", z.ZodTypeAny, {
|
|
180
|
+
command: string[];
|
|
181
|
+
periodSeconds: number;
|
|
182
|
+
timeoutSeconds: number;
|
|
183
|
+
failureThreshold: number;
|
|
184
|
+
}, {
|
|
185
|
+
command: string[];
|
|
186
|
+
periodSeconds: number;
|
|
187
|
+
timeoutSeconds: number;
|
|
188
|
+
failureThreshold: number;
|
|
189
|
+
}>;
|
|
190
|
+
resources: z.ZodObject<{
|
|
191
|
+
cpuMillicores: z.ZodNumber;
|
|
192
|
+
memoryMib: z.ZodNumber;
|
|
193
|
+
diskMib: z.ZodNumber;
|
|
194
|
+
}, "strict", z.ZodTypeAny, {
|
|
195
|
+
cpuMillicores: number;
|
|
196
|
+
memoryMib: number;
|
|
197
|
+
diskMib: number;
|
|
198
|
+
}, {
|
|
199
|
+
cpuMillicores: number;
|
|
200
|
+
memoryMib: number;
|
|
201
|
+
diskMib: number;
|
|
202
|
+
}>;
|
|
203
|
+
dataPath: z.ZodEffects<z.ZodString, string, string>;
|
|
204
|
+
writablePaths: z.ZodDefault<z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">>;
|
|
205
|
+
}, "strict", z.ZodTypeAny, {
|
|
206
|
+
name: string;
|
|
207
|
+
resources: {
|
|
208
|
+
cpuMillicores: number;
|
|
209
|
+
memoryMib: number;
|
|
210
|
+
diskMib: number;
|
|
211
|
+
};
|
|
212
|
+
version: string;
|
|
213
|
+
testEnv: Record<string, string>;
|
|
214
|
+
image: string;
|
|
215
|
+
port: number;
|
|
216
|
+
serviceEnv: Record<string, string>;
|
|
217
|
+
readiness: {
|
|
218
|
+
command: string[];
|
|
219
|
+
periodSeconds: number;
|
|
220
|
+
timeoutSeconds: number;
|
|
221
|
+
failureThreshold: number;
|
|
222
|
+
};
|
|
223
|
+
dataPath: string;
|
|
224
|
+
writablePaths: string[];
|
|
225
|
+
kind: "sidecar";
|
|
226
|
+
}, {
|
|
227
|
+
name: string;
|
|
228
|
+
resources: {
|
|
229
|
+
cpuMillicores: number;
|
|
230
|
+
memoryMib: number;
|
|
231
|
+
diskMib: number;
|
|
232
|
+
};
|
|
233
|
+
version: string;
|
|
234
|
+
image: string;
|
|
235
|
+
port: number;
|
|
236
|
+
readiness: {
|
|
237
|
+
command: string[];
|
|
238
|
+
periodSeconds: number;
|
|
239
|
+
timeoutSeconds: number;
|
|
240
|
+
failureThreshold: number;
|
|
241
|
+
};
|
|
242
|
+
dataPath: string;
|
|
243
|
+
testEnv?: Record<string, string> | undefined;
|
|
244
|
+
serviceEnv?: Record<string, string> | undefined;
|
|
245
|
+
writablePaths?: string[] | undefined;
|
|
246
|
+
kind?: "sidecar" | undefined;
|
|
247
|
+
}>, {
|
|
248
|
+
name: string;
|
|
249
|
+
resources: {
|
|
250
|
+
cpuMillicores: number;
|
|
251
|
+
memoryMib: number;
|
|
252
|
+
diskMib: number;
|
|
253
|
+
};
|
|
254
|
+
version: string;
|
|
255
|
+
testEnv: Record<string, string>;
|
|
256
|
+
image: string;
|
|
257
|
+
port: number;
|
|
258
|
+
serviceEnv: Record<string, string>;
|
|
259
|
+
readiness: {
|
|
260
|
+
command: string[];
|
|
261
|
+
periodSeconds: number;
|
|
262
|
+
timeoutSeconds: number;
|
|
263
|
+
failureThreshold: number;
|
|
264
|
+
};
|
|
265
|
+
dataPath: string;
|
|
266
|
+
writablePaths: string[];
|
|
267
|
+
kind: "sidecar";
|
|
268
|
+
}, {
|
|
269
|
+
name: string;
|
|
270
|
+
resources: {
|
|
271
|
+
cpuMillicores: number;
|
|
272
|
+
memoryMib: number;
|
|
273
|
+
diskMib: number;
|
|
274
|
+
};
|
|
275
|
+
version: string;
|
|
276
|
+
image: string;
|
|
277
|
+
port: number;
|
|
278
|
+
readiness: {
|
|
279
|
+
command: string[];
|
|
280
|
+
periodSeconds: number;
|
|
281
|
+
timeoutSeconds: number;
|
|
282
|
+
failureThreshold: number;
|
|
283
|
+
};
|
|
284
|
+
dataPath: string;
|
|
285
|
+
testEnv?: Record<string, string> | undefined;
|
|
286
|
+
serviceEnv?: Record<string, string> | undefined;
|
|
287
|
+
writablePaths?: string[] | undefined;
|
|
288
|
+
kind?: "sidecar" | undefined;
|
|
289
|
+
}>;
|
|
290
|
+
export type ResolvedCodingService = z.output<typeof ResolvedCodingServiceSchema>;
|
|
291
|
+
export type CodingServiceDefinition = z.output<typeof CodingServiceDefinitionSchema>;
|
|
292
|
+
export declare const StoredCodingServicesSchema: z.ZodArray<z.ZodEffects<z.ZodObject<{
|
|
293
|
+
name: z.ZodString;
|
|
294
|
+
version: z.ZodString;
|
|
295
|
+
image: z.ZodEffects<z.ZodString, string, string>;
|
|
296
|
+
port: z.ZodNumber;
|
|
297
|
+
serviceEnv: z.ZodDefault<z.ZodEffects<z.ZodRecord<z.ZodString, z.ZodEffects<z.ZodString, string, string>>, Record<string, string>, Record<string, string>>>;
|
|
298
|
+
testEnv: z.ZodDefault<z.ZodEffects<z.ZodRecord<z.ZodString, z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>>, Record<string, string>, Record<string, string>>>;
|
|
299
|
+
readiness: z.ZodObject<{
|
|
300
|
+
command: z.ZodArray<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>, "many">;
|
|
301
|
+
periodSeconds: z.ZodNumber;
|
|
302
|
+
timeoutSeconds: z.ZodNumber;
|
|
303
|
+
failureThreshold: z.ZodNumber;
|
|
304
|
+
}, "strict", z.ZodTypeAny, {
|
|
305
|
+
command: string[];
|
|
306
|
+
periodSeconds: number;
|
|
307
|
+
timeoutSeconds: number;
|
|
308
|
+
failureThreshold: number;
|
|
309
|
+
}, {
|
|
310
|
+
command: string[];
|
|
311
|
+
periodSeconds: number;
|
|
312
|
+
timeoutSeconds: number;
|
|
313
|
+
failureThreshold: number;
|
|
314
|
+
}>;
|
|
315
|
+
resources: z.ZodObject<{
|
|
316
|
+
cpuMillicores: z.ZodNumber;
|
|
317
|
+
memoryMib: z.ZodNumber;
|
|
318
|
+
diskMib: z.ZodNumber;
|
|
319
|
+
}, "strict", z.ZodTypeAny, {
|
|
320
|
+
cpuMillicores: number;
|
|
321
|
+
memoryMib: number;
|
|
322
|
+
diskMib: number;
|
|
323
|
+
}, {
|
|
324
|
+
cpuMillicores: number;
|
|
325
|
+
memoryMib: number;
|
|
326
|
+
diskMib: number;
|
|
327
|
+
}>;
|
|
328
|
+
dataPath: z.ZodEffects<z.ZodString, string, string>;
|
|
329
|
+
writablePaths: z.ZodDefault<z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">>;
|
|
330
|
+
}, "strict", z.ZodTypeAny, {
|
|
331
|
+
name: string;
|
|
332
|
+
resources: {
|
|
333
|
+
cpuMillicores: number;
|
|
334
|
+
memoryMib: number;
|
|
335
|
+
diskMib: number;
|
|
336
|
+
};
|
|
337
|
+
version: string;
|
|
338
|
+
testEnv: Record<string, string>;
|
|
339
|
+
image: string;
|
|
340
|
+
port: number;
|
|
341
|
+
serviceEnv: Record<string, string>;
|
|
342
|
+
readiness: {
|
|
343
|
+
command: string[];
|
|
344
|
+
periodSeconds: number;
|
|
345
|
+
timeoutSeconds: number;
|
|
346
|
+
failureThreshold: number;
|
|
347
|
+
};
|
|
348
|
+
dataPath: string;
|
|
349
|
+
writablePaths: string[];
|
|
350
|
+
}, {
|
|
351
|
+
name: string;
|
|
352
|
+
resources: {
|
|
353
|
+
cpuMillicores: number;
|
|
354
|
+
memoryMib: number;
|
|
355
|
+
diskMib: number;
|
|
356
|
+
};
|
|
357
|
+
version: string;
|
|
358
|
+
image: string;
|
|
359
|
+
port: number;
|
|
360
|
+
readiness: {
|
|
361
|
+
command: string[];
|
|
362
|
+
periodSeconds: number;
|
|
363
|
+
timeoutSeconds: number;
|
|
364
|
+
failureThreshold: number;
|
|
365
|
+
};
|
|
366
|
+
dataPath: string;
|
|
367
|
+
testEnv?: Record<string, string> | undefined;
|
|
368
|
+
serviceEnv?: Record<string, string> | undefined;
|
|
369
|
+
writablePaths?: string[] | undefined;
|
|
370
|
+
}>, {
|
|
371
|
+
name: string;
|
|
372
|
+
resources: {
|
|
373
|
+
cpuMillicores: number;
|
|
374
|
+
memoryMib: number;
|
|
375
|
+
diskMib: number;
|
|
376
|
+
};
|
|
377
|
+
version: string;
|
|
378
|
+
testEnv: Record<string, string>;
|
|
379
|
+
image: string;
|
|
380
|
+
port: number;
|
|
381
|
+
serviceEnv: Record<string, string>;
|
|
382
|
+
readiness: {
|
|
383
|
+
command: string[];
|
|
384
|
+
periodSeconds: number;
|
|
385
|
+
timeoutSeconds: number;
|
|
386
|
+
failureThreshold: number;
|
|
387
|
+
};
|
|
388
|
+
dataPath: string;
|
|
389
|
+
writablePaths: string[];
|
|
390
|
+
}, {
|
|
391
|
+
name: string;
|
|
392
|
+
resources: {
|
|
393
|
+
cpuMillicores: number;
|
|
394
|
+
memoryMib: number;
|
|
395
|
+
diskMib: number;
|
|
396
|
+
};
|
|
397
|
+
version: string;
|
|
398
|
+
image: string;
|
|
399
|
+
port: number;
|
|
400
|
+
readiness: {
|
|
401
|
+
command: string[];
|
|
402
|
+
periodSeconds: number;
|
|
403
|
+
timeoutSeconds: number;
|
|
404
|
+
failureThreshold: number;
|
|
405
|
+
};
|
|
406
|
+
dataPath: string;
|
|
407
|
+
testEnv?: Record<string, string> | undefined;
|
|
408
|
+
serviceEnv?: Record<string, string> | undefined;
|
|
409
|
+
writablePaths?: string[] | undefined;
|
|
410
|
+
}>, "many">;
|
|
411
|
+
/** The columns of a CodingService row the definition is read from. */
|
|
412
|
+
export interface CodingServiceRow {
|
|
413
|
+
name: string;
|
|
414
|
+
version: string;
|
|
415
|
+
kind: string;
|
|
416
|
+
image: string;
|
|
417
|
+
port: number;
|
|
418
|
+
serviceEnv: unknown;
|
|
419
|
+
testEnv: unknown;
|
|
420
|
+
readiness: unknown;
|
|
421
|
+
resources: unknown;
|
|
422
|
+
dataPath: string;
|
|
423
|
+
writablePaths: unknown;
|
|
424
|
+
}
|
|
425
|
+
/** A row as its definition. Throws when the row was edited out of shape (the operator log keeps the name). */
|
|
426
|
+
export declare function catalogEntryFromRow(row: CodingServiceRow): CodingServiceDefinition;
|
|
427
|
+
/** The per-run snapshot of an entry. */
|
|
428
|
+
export declare function resolvedFromDefinition(definition: CodingServiceDefinition): ResolvedCodingService;
|
|
429
|
+
/** CodingRun.services, parsed; a run from before services existed has []. Throws on anything else. */
|
|
430
|
+
export declare function parseStoredServices(value: unknown): ResolvedCodingService[];
|
|
431
|
+
/** The service names in CodingRun.services, read leniently: for wording only, never for launching. */
|
|
432
|
+
export declare function storedServiceNames(value: unknown): string[];
|
|
433
|
+
/** "postgres 16" for each service in CodingRun.services with a valid name and version, for get_run. */
|
|
434
|
+
export declare function storedServiceLabels(value: unknown): string[];
|
|
435
|
+
/** CodingAgentProfile.services: the catalog names this agent's runs may start (any version the catalog has). */
|
|
436
|
+
export declare const AllowedServiceNamesSchema: z.ZodEffects<z.ZodArray<z.ZodString, "many">, string[], string[]>;
|
|
437
|
+
export declare function parseAllowedServiceNames(value: unknown): string[];
|
|
438
|
+
/** What the worker receives for each service (CodingTaskInput.services): never the image or the service's own environment. */
|
|
439
|
+
export declare function workerServices(services: readonly ResolvedCodingService[]): Array<{
|
|
440
|
+
name: string;
|
|
441
|
+
version: string;
|
|
442
|
+
testEnv: Record<string, string>;
|
|
443
|
+
}>;
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The coding-run service catalog (docs/coding-services.md): what a repository's
|
|
3
|
+
* .wardby/services.yaml may name. An entry is admin-managed, trusted data: a
|
|
4
|
+
* digest-pinned image, the environment it starts with, the variables it hands
|
|
5
|
+
* the agent's shells, how to tell it is ready, and what it may use. Repository
|
|
6
|
+
* content only ever names an entry; it never supplies any of these.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
import { isRepositoryDigest } from "../../providers/jobs/docker-isolation.js";
|
|
10
|
+
import { byteLength, CODING_SERVICE_NAME, CODING_SERVICE_VERSION, CodingServiceTestEnvSchema, INVALID_SINGLE_LINE_CONTROL, MAX_CODING_SERVICES, } from "../protocol.js";
|
|
11
|
+
/** "sidecar": a fresh instance in each run's pod. "external" is reserved for shared services reached through the proxy. */
|
|
12
|
+
export const CODING_SERVICE_KINDS = ["sidecar"];
|
|
13
|
+
/** How many service names one agent may be allowed. */
|
|
14
|
+
export const MAX_AGENT_SERVICES = 16;
|
|
15
|
+
export const MAX_SERVICE_ENV = 32;
|
|
16
|
+
const MAX_WRITABLE_PATHS = 4;
|
|
17
|
+
const MAX_PATH_BYTES = 255;
|
|
18
|
+
const SERVICE_ENV_NAME = /^[A-Za-z_][A-Za-z0-9_]{0,63}$/;
|
|
19
|
+
const ABSOLUTE_PATH = /^\/[A-Za-z0-9._-]+(?:\/[A-Za-z0-9._-]+)*$/;
|
|
20
|
+
const FORBIDDEN_ROOTS = ["/proc", "/sys", "/dev"];
|
|
21
|
+
const singleLine = (max) => z
|
|
22
|
+
.string()
|
|
23
|
+
.refine((value) => byteLength(value) <= max && !INVALID_SINGLE_LINE_CONTROL.test(value), `must be one line of at most ${max} bytes`);
|
|
24
|
+
export const codingServiceNameSchema = z
|
|
25
|
+
.string()
|
|
26
|
+
.regex(CODING_SERVICE_NAME, "must be lowercase letters, digits and hyphens, starting with a letter (at most 40)");
|
|
27
|
+
export const codingServiceVersionSchema = z
|
|
28
|
+
.string()
|
|
29
|
+
.regex(CODING_SERVICE_VERSION, 'must be a short version such as "16" (letters, digits, ".", "_", "-"; at most 20)');
|
|
30
|
+
const serviceEnvSchema = z.record(z.string(), singleLine(1024)).superRefine((env, ctx) => {
|
|
31
|
+
const names = Object.keys(env);
|
|
32
|
+
if (names.length > MAX_SERVICE_ENV) {
|
|
33
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, message: `must have at most ${MAX_SERVICE_ENV} variables` });
|
|
34
|
+
}
|
|
35
|
+
for (const name of names) {
|
|
36
|
+
if (!SERVICE_ENV_NAME.test(name)) {
|
|
37
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, path: [name], message: "must be a variable name" });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
const pathSchema = z
|
|
42
|
+
.string()
|
|
43
|
+
.refine((value) => ABSOLUTE_PATH.test(value) &&
|
|
44
|
+
byteLength(value) <= MAX_PATH_BYTES &&
|
|
45
|
+
!value.split("/").some((part) => part === "." || part === "..") &&
|
|
46
|
+
!FORBIDDEN_ROOTS.some((root) => value === root || value.startsWith(`${root}/`)), "must be an absolute path outside /proc, /sys and /dev, without . or .. components");
|
|
47
|
+
export const CodingServiceReadinessSchema = z
|
|
48
|
+
.object({
|
|
49
|
+
command: z
|
|
50
|
+
.array(singleLine(256).refine((value) => value.length > 0, "must not be empty"))
|
|
51
|
+
.min(1)
|
|
52
|
+
.max(16),
|
|
53
|
+
periodSeconds: z.number().int().min(1).max(60),
|
|
54
|
+
timeoutSeconds: z.number().int().min(1).max(60),
|
|
55
|
+
failureThreshold: z.number().int().min(1).max(120),
|
|
56
|
+
})
|
|
57
|
+
.strict();
|
|
58
|
+
export const CodingServiceResourcesSchema = z
|
|
59
|
+
.object({
|
|
60
|
+
cpuMillicores: z.number().int().min(100).max(4000),
|
|
61
|
+
memoryMib: z.number().int().min(64).max(16_384),
|
|
62
|
+
diskMib: z.number().int().min(64).max(8192),
|
|
63
|
+
})
|
|
64
|
+
.strict();
|
|
65
|
+
const serviceFields = {
|
|
66
|
+
name: codingServiceNameSchema,
|
|
67
|
+
version: codingServiceVersionSchema,
|
|
68
|
+
image: z.string().max(512).refine(isRepositoryDigest, "must be a registry digest (repo@sha256:<64 hex>)"),
|
|
69
|
+
port: z.number().int().min(1).max(65_535),
|
|
70
|
+
serviceEnv: serviceEnvSchema.default({}),
|
|
71
|
+
testEnv: CodingServiceTestEnvSchema.default({}),
|
|
72
|
+
readiness: CodingServiceReadinessSchema,
|
|
73
|
+
resources: CodingServiceResourcesSchema,
|
|
74
|
+
dataPath: pathSchema,
|
|
75
|
+
writablePaths: z.array(pathSchema).max(MAX_WRITABLE_PATHS).default([]),
|
|
76
|
+
};
|
|
77
|
+
/** Every mount is its own emptyDir, so no two may be the same directory or nest. */
|
|
78
|
+
function checkMounts(value, ctx) {
|
|
79
|
+
const paths = [value.dataPath, ...value.writablePaths];
|
|
80
|
+
for (const [index, a] of paths.entries()) {
|
|
81
|
+
for (const b of paths.slice(index + 1)) {
|
|
82
|
+
if (a === b || a.startsWith(`${b}/`) || b.startsWith(`${a}/`)) {
|
|
83
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["writablePaths"], message: `${a} and ${b} overlap` });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/** One run's snapshot of an entry: what dispatch stores on CodingRun.services and the launcher reads. */
|
|
89
|
+
export const ResolvedCodingServiceSchema = z.object(serviceFields).strict().superRefine(checkMounts);
|
|
90
|
+
/** A catalog entry, as create_service takes it and the CodingService table holds it. */
|
|
91
|
+
export const CodingServiceDefinitionSchema = z
|
|
92
|
+
.object({ ...serviceFields, kind: z.enum(CODING_SERVICE_KINDS).default("sidecar") })
|
|
93
|
+
.strict()
|
|
94
|
+
.superRefine(checkMounts);
|
|
95
|
+
export const StoredCodingServicesSchema = z.array(ResolvedCodingServiceSchema).max(MAX_CODING_SERVICES);
|
|
96
|
+
/** A row as its definition. Throws when the row was edited out of shape (the operator log keeps the name). */
|
|
97
|
+
export function catalogEntryFromRow(row) {
|
|
98
|
+
const parsed = CodingServiceDefinitionSchema.safeParse({
|
|
99
|
+
name: row.name,
|
|
100
|
+
version: row.version,
|
|
101
|
+
kind: row.kind,
|
|
102
|
+
image: row.image,
|
|
103
|
+
port: row.port,
|
|
104
|
+
serviceEnv: row.serviceEnv,
|
|
105
|
+
testEnv: row.testEnv,
|
|
106
|
+
readiness: row.readiness,
|
|
107
|
+
resources: row.resources,
|
|
108
|
+
dataPath: row.dataPath,
|
|
109
|
+
writablePaths: row.writablePaths,
|
|
110
|
+
});
|
|
111
|
+
if (!parsed.success)
|
|
112
|
+
throw new Error(`coding_service_catalog_invalid:${row.name} ${row.version}`);
|
|
113
|
+
return parsed.data;
|
|
114
|
+
}
|
|
115
|
+
/** The per-run snapshot of an entry. */
|
|
116
|
+
export function resolvedFromDefinition(definition) {
|
|
117
|
+
const { kind: _kind, ...service } = definition;
|
|
118
|
+
return service;
|
|
119
|
+
}
|
|
120
|
+
/** CodingRun.services, parsed; a run from before services existed has []. Throws on anything else. */
|
|
121
|
+
export function parseStoredServices(value) {
|
|
122
|
+
if (value === null || value === undefined)
|
|
123
|
+
return [];
|
|
124
|
+
return StoredCodingServicesSchema.parse(value);
|
|
125
|
+
}
|
|
126
|
+
function storedEntries(value) {
|
|
127
|
+
if (!Array.isArray(value))
|
|
128
|
+
return [];
|
|
129
|
+
return value.flatMap((entry) => {
|
|
130
|
+
const record = entry && typeof entry === "object" ? entry : undefined;
|
|
131
|
+
return typeof record?.name === "string" && CODING_SERVICE_NAME.test(record.name)
|
|
132
|
+
? [{ name: record.name, version: record.version }]
|
|
133
|
+
: [];
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
/** The service names in CodingRun.services, read leniently: for wording only, never for launching. */
|
|
137
|
+
export function storedServiceNames(value) {
|
|
138
|
+
return storedEntries(value).map((entry) => entry.name);
|
|
139
|
+
}
|
|
140
|
+
/** "postgres 16" for each service in CodingRun.services with a valid name and version, for get_run. */
|
|
141
|
+
export function storedServiceLabels(value) {
|
|
142
|
+
return storedEntries(value).flatMap((entry) => typeof entry.version === "string" && CODING_SERVICE_VERSION.test(entry.version)
|
|
143
|
+
? [`${entry.name} ${entry.version}`]
|
|
144
|
+
: []);
|
|
145
|
+
}
|
|
146
|
+
/** CodingAgentProfile.services: the catalog names this agent's runs may start (any version the catalog has). */
|
|
147
|
+
export const AllowedServiceNamesSchema = z
|
|
148
|
+
.array(codingServiceNameSchema)
|
|
149
|
+
.max(MAX_AGENT_SERVICES)
|
|
150
|
+
.transform((names) => [...new Set(names)]);
|
|
151
|
+
export function parseAllowedServiceNames(value) {
|
|
152
|
+
if (value === null || value === undefined)
|
|
153
|
+
return [];
|
|
154
|
+
return AllowedServiceNamesSchema.parse(value);
|
|
155
|
+
}
|
|
156
|
+
/** What the worker receives for each service (CodingTaskInput.services): never the image or the service's own environment. */
|
|
157
|
+
export function workerServices(services) {
|
|
158
|
+
return services.map(({ name, version, testEnv }) => ({ name, version, testEnv }));
|
|
159
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const SERVICE_DECLARATION_PATH = ".wardby/services.yaml";
|
|
2
|
+
export declare const MAX_SERVICE_DECLARATION_BYTES: number;
|
|
3
|
+
export interface DeclaredService {
|
|
4
|
+
name: string;
|
|
5
|
+
version: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class ServiceDeclarationError extends Error {
|
|
8
|
+
readonly reason: string;
|
|
9
|
+
constructor(reason: string);
|
|
10
|
+
}
|
|
11
|
+
export declare function parseServiceDeclaration(text: string): DeclaredService[];
|