@wardby/cli 0.2.0 → 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 +183 -71
- package/dist/claude-coding-worker/driver.d.ts +7 -1
- package/dist/claude-coding-worker/driver.js +31 -2
- package/dist/claude-coding-worker/main.js +5 -2
- 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 +99 -3
- package/dist/coding/protocol.js +155 -4
- 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 +18 -0
- package/dist/coding-worker/artifact.js +48 -6
- 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 +14 -1
- package/dist/coding-worker/driver.js +106 -14
- package/dist/coding-worker/errors.d.ts +7 -0
- package/dist/coding-worker/errors.js +26 -0
- package/dist/coding-worker/main.js +13 -4
- 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 +109 -6
- 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/coding-queue.d.ts +1 -1
- package/dist/core/datastores.d.ts +1 -1
- package/dist/core/datastores.js +18 -2
- package/dist/core/db.d.ts +40 -2
- package/dist/core/db.js +75 -2
- package/dist/core/dispatch.d.ts +49 -7
- package/dist/core/dispatch.js +290 -45
- 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/http-runtime.js +3 -4
- package/dist/core/in-flight-runs.d.ts +8 -0
- package/dist/core/in-flight-runs.js +56 -0
- package/dist/core/lease.d.ts +1 -1
- package/dist/core/private-directory.d.ts +20 -0
- package/dist/core/private-directory.js +36 -0
- package/dist/core/provider-wording.d.ts +12 -0
- package/dist/core/provider-wording.js +44 -0
- package/dist/core/reconciler.d.ts +39 -3
- 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 +31 -9
- package/dist/core/runner.js +237 -40
- package/dist/core/scheduler.d.ts +1 -1
- package/dist/core/secrets.d.ts +12 -3
- package/dist/core/secrets.js +25 -6
- package/dist/core/subagent-memory-tools.d.ts +2 -2
- 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 +9 -2
- package/dist/core/webhooks.js +23 -2
- package/dist/generated/prisma/browser.d.ts +328 -0
- package/dist/generated/prisma/browser.js +17 -0
- package/dist/generated/prisma/client.d.ts +347 -0
- package/dist/generated/prisma/client.js +34 -0
- package/dist/generated/prisma/commonInputTypes.d.ts +839 -0
- package/dist/generated/prisma/commonInputTypes.js +10 -0
- package/dist/generated/prisma/enums.d.ts +59 -0
- package/dist/generated/prisma/enums.js +59 -0
- package/dist/generated/prisma/internal/class.d.ts +605 -0
- package/dist/generated/prisma/internal/class.js +49 -0
- package/dist/generated/prisma/internal/prismaNamespace.d.ts +4494 -0
- package/dist/generated/prisma/internal/prismaNamespace.js +628 -0
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +635 -0
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +599 -0
- package/dist/generated/prisma/models/Agent.d.ts +3560 -0
- package/dist/generated/prisma/models/Agent.js +1 -0
- package/dist/generated/prisma/models/AgentDatastore.d.ts +1210 -0
- package/dist/generated/prisma/models/AgentDatastore.js +1 -0
- package/dist/generated/prisma/models/AgentMemory.d.ts +986 -0
- package/dist/generated/prisma/models/AgentMemory.js +1 -0
- package/dist/generated/prisma/models/AgentRepository.d.ts +1425 -0
- package/dist/generated/prisma/models/AgentRepository.js +1 -0
- package/dist/generated/prisma/models/AgentSecret.d.ts +1212 -0
- package/dist/generated/prisma/models/AgentSecret.js +1 -0
- package/dist/generated/prisma/models/AgentSubAgent.d.ts +1217 -0
- package/dist/generated/prisma/models/AgentSubAgent.js +1 -0
- package/dist/generated/prisma/models/AgentTool.d.ts +1403 -0
- package/dist/generated/prisma/models/AgentTool.js +1 -0
- package/dist/generated/prisma/models/AuthFormChallenge.d.ts +1298 -0
- package/dist/generated/prisma/models/AuthFormChallenge.js +1 -0
- package/dist/generated/prisma/models/AuthLoginKey.d.ts +1245 -0
- package/dist/generated/prisma/models/AuthLoginKey.js +1 -0
- package/dist/generated/prisma/models/AuthRateLimit.d.ts +979 -0
- package/dist/generated/prisma/models/AuthRateLimit.js +1 -0
- package/dist/generated/prisma/models/AuthSession.d.ts +1376 -0
- package/dist/generated/prisma/models/AuthSession.js +1 -0
- package/dist/generated/prisma/models/AuthUser.d.ts +1700 -0
- package/dist/generated/prisma/models/AuthUser.js +1 -0
- package/dist/generated/prisma/models/BudgetGroup.d.ts +1548 -0
- package/dist/generated/prisma/models/BudgetGroup.js +1 -0
- package/dist/generated/prisma/models/CodingAgentProfile.d.ts +1681 -0
- package/dist/generated/prisma/models/CodingAgentProfile.js +1 -0
- package/dist/generated/prisma/models/CodingProxyRequest.d.ts +1749 -0
- package/dist/generated/prisma/models/CodingProxyRequest.js +1 -0
- package/dist/generated/prisma/models/CodingProxySession.d.ts +1626 -0
- package/dist/generated/prisma/models/CodingProxySession.js +1 -0
- package/dist/generated/prisma/models/CodingRun.d.ts +3583 -0
- package/dist/generated/prisma/models/CodingRun.js +1 -0
- package/dist/generated/prisma/models/CodingService.d.ts +1348 -0
- package/dist/generated/prisma/models/CodingService.js +1 -0
- package/dist/generated/prisma/models/Datastore.d.ts +1434 -0
- package/dist/generated/prisma/models/Datastore.js +1 -0
- package/dist/generated/prisma/models/DatastoreEntry.d.ts +1314 -0
- package/dist/generated/prisma/models/DatastoreEntry.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/OAuthAuthorizationCode.d.ts +1526 -0
- package/dist/generated/prisma/models/OAuthAuthorizationCode.js +1 -0
- package/dist/generated/prisma/models/OAuthAuthorizationRequest.d.ts +1350 -0
- package/dist/generated/prisma/models/OAuthAuthorizationRequest.js +1 -0
- package/dist/generated/prisma/models/OAuthClient.d.ts +1289 -0
- package/dist/generated/prisma/models/OAuthClient.js +1 -0
- package/dist/generated/prisma/models/OAuthFamily.d.ts +1540 -0
- package/dist/generated/prisma/models/OAuthFamily.js +1 -0
- package/dist/generated/prisma/models/OAuthGrant.d.ts +1280 -0
- package/dist/generated/prisma/models/OAuthGrant.js +1 -0
- package/dist/generated/prisma/models/Principal.d.ts +2245 -0
- package/dist/generated/prisma/models/Principal.js +1 -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 +2669 -0
- package/dist/generated/prisma/models/Run.js +1 -0
- 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/SchedulerLease.d.ts +970 -0
- package/dist/generated/prisma/models/SchedulerLease.js +1 -0
- package/dist/generated/prisma/models/Secret.d.ts +1399 -0
- package/dist/generated/prisma/models/Secret.js +1 -0
- package/dist/generated/prisma/models/SecretElicitationOutcome.d.ts +973 -0
- package/dist/generated/prisma/models/SecretElicitationOutcome.js +1 -0
- package/dist/generated/prisma/models/Task.d.ts +1176 -0
- package/dist/generated/prisma/models/Task.js +1 -0
- package/dist/generated/prisma/models/Tool.d.ts +1490 -0
- package/dist/generated/prisma/models/Tool.js +1 -0
- package/dist/generated/prisma/models/Webhook.d.ts +1386 -0
- package/dist/generated/prisma/models/Webhook.js +1 -0
- package/dist/generated/prisma/models.d.ts +45 -0
- package/dist/generated/prisma/models.js +1 -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 +6 -1
- package/dist/import/create.js +68 -14
- package/dist/import/index.d.ts +1 -1
- 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 +37 -63
- package/dist/mcp/auth/ownership.js +19 -14
- package/dist/mcp/auth/principal.d.ts +1 -1
- 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 +32 -3
- package/dist/mcp/auth/resource-server.js +84 -3
- package/dist/mcp/auth/self-hosted/browser.js +22 -8
- package/dist/mcp/auth/self-hosted/cli.d.ts +1 -1
- package/dist/mcp/auth/self-hosted/cli.js +47 -13
- package/dist/mcp/auth/self-hosted/credentials.d.ts +21 -3
- package/dist/mcp/auth/self-hosted/credentials.js +62 -4
- package/dist/mcp/auth/self-hosted/rate-limit.d.ts +1 -1
- package/dist/mcp/auth/self-hosted/session.d.ts +3 -2
- package/dist/mcp/context.d.ts +28 -2
- 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.d.ts +1 -1
- package/dist/mcp/server.js +27 -9
- package/dist/mcp/shared/page-style.d.ts +16 -0
- package/dist/mcp/shared/page-style.js +129 -0
- package/dist/mcp/tasks/manager.d.ts +1 -1
- package/dist/mcp/tools/agents.js +447 -49
- package/dist/mcp/tools/budget-groups.js +3 -3
- package/dist/mcp/tools/datastore.js +23 -16
- 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 +4 -7
- package/dist/mcp/tools/secret-elicitation-form.d.ts +1 -1
- package/dist/mcp/tools/secret-elicitation-form.js +10 -28
- package/dist/mcp/tools/secret-elicitation.d.ts +1 -1
- 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 +53 -17
- package/dist/mcp/tools/tools.d.ts +41 -0
- package/dist/mcp/tools/tools.js +202 -41
- package/dist/mcp/tools/trigger.js +36 -6
- package/dist/mcp/tools/webhooks.js +15 -4
- package/dist/mcp/transport/streamable-http.d.ts +11 -1
- package/dist/mcp/transport/streamable-http.js +32 -2
- package/dist/mcp/unattended-schedules.d.ts +1 -1
- package/dist/mcp/webhooks/ingress.d.ts +1 -1
- package/dist/providers/auth/delegating.d.ts +19 -0
- package/dist/providers/auth/delegating.js +71 -0
- package/dist/providers/auth/index.d.ts +3 -1
- package/dist/providers/auth/index.js +11 -0
- package/dist/providers/auth/self-hosted.d.ts +4 -3
- 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 +18 -1
- 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 +18 -1
- 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/datastore/postgres.d.ts +1 -1
- package/dist/providers/engine/types.d.ts +10 -0
- package/dist/providers/executor/build.d.ts +3 -3
- package/dist/providers/executor/composition.d.ts +4 -1
- package/dist/providers/executor/composition.js +19 -0
- package/dist/providers/executor/container.d.ts +106 -4
- package/dist/providers/executor/container.js +305 -22
- package/dist/providers/executor/dbos.d.ts +3 -4
- 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 +60 -2
- package/dist/providers/jobs/docker.js +313 -50
- 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 +117 -31
- package/dist/providers/jobs/types.d.ts +20 -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/memory/postgres.d.ts +1 -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 +79 -14
- 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 +34 -32
- package/dist/quickstart/migrate.d.ts +23 -0
- package/dist/quickstart/migrate.js +125 -0
- 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 +30 -11
- package/prisma/migrate.config.mjs +20 -0
- 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 +417 -23
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type ResolvedCodingService } from "../../coding/services/catalog.js";
|
|
2
|
+
import { type DockerContainerInspection } from "./docker-isolation.js";
|
|
3
|
+
import type { JobSpec } from "./types.js";
|
|
4
|
+
/** Every Docker run container is PID-bounded; the catalog has no PID field. */
|
|
5
|
+
export declare const SERVICE_PIDS_LIMIT = 512;
|
|
6
|
+
/** /dev/shm for a service (PostgreSQL's dynamic shared memory): the Kubernetes default size. */
|
|
7
|
+
export declare const SERVICE_SHM_MIB = 64;
|
|
8
|
+
export interface DockerServiceContainer {
|
|
9
|
+
service: ResolvedCodingService;
|
|
10
|
+
container: string;
|
|
11
|
+
createArgs: string[];
|
|
12
|
+
}
|
|
13
|
+
export declare function dockerServiceContainerName(runId: string, serviceName: string): string;
|
|
14
|
+
/** The container names of a spec's services, for stop and cleanup: names only, never launch input. */
|
|
15
|
+
export declare function dockerServiceContainerNames(spec: JobSpec): string[];
|
|
16
|
+
/**
|
|
17
|
+
* Re-validated here, not trusted from dispatch, as the Kubernetes launcher does. Returns the
|
|
18
|
+
* schema's parsed output (defaults such as `serviceEnv`/`writablePaths` filled in), never the raw
|
|
19
|
+
* spec, so a caller never has to guard against a missing default field, and any shape the schema
|
|
20
|
+
* rejects throws the isolation error rather than surfacing as a TypeError further down.
|
|
21
|
+
*/
|
|
22
|
+
export declare function validateDockerServices(spec: JobSpec): ResolvedCodingService[];
|
|
23
|
+
/** Its data path at its disk size, then SERVICE_SCRATCH_MIB for each writable path: the Kubernetes sizes. */
|
|
24
|
+
export declare function serviceTmpfsOptions(service: ResolvedCodingService): Record<string, string>;
|
|
25
|
+
/** tmpfs pages count against the container's memory cgroup: catalog memory, its disk, and /dev/shm. */
|
|
26
|
+
export declare function serviceMemoryMib(service: ResolvedCodingService): number;
|
|
27
|
+
export declare function buildServiceCreateArgs(spec: JobSpec, service: ResolvedCodingService): string[];
|
|
28
|
+
export declare function buildDockerServicePlan(spec: JobSpec): DockerServiceContainer[];
|
|
29
|
+
/**
|
|
30
|
+
* Before a service starts: exactly the controls buildServiceCreateArgs asked for. No mounts at all,
|
|
31
|
+
* so an image VOLUME outside the entry's dataPath/writablePaths (an anonymous, unbounded host
|
|
32
|
+
* volume) fails here rather than run. Re-validates the spec and requires `service` to be one of its
|
|
33
|
+
* validated entries (by name and version), rather than trusting the caller's pairing of the two.
|
|
34
|
+
*/
|
|
35
|
+
export declare function assertServiceContainerInspection(container: DockerContainerInspection, spec: JobSpec, service: ResolvedCodingService, networkKeeperId?: string): void;
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coding-run services on the Docker launcher (docs/coding-services.md): one hardened container per
|
|
3
|
+
* resolved catalog entry, in the run's network keeper's namespace, so it answers on 127.0.0.1
|
|
4
|
+
* exactly like a Kubernetes sidecar. Pure builders and attestation only: DockerJobLauncher runs
|
|
5
|
+
* and checks them. The image and environment come from the admin-managed catalog snapshot on the
|
|
6
|
+
* spec, never from repository content, and are re-validated here rather than trusted from dispatch.
|
|
7
|
+
*/
|
|
8
|
+
import { CODING_SERVICE_NAME } from "../../coding/protocol.js";
|
|
9
|
+
import { StoredCodingServicesSchema } from "../../coding/services/catalog.js";
|
|
10
|
+
import { CODING_WORKER_GID, CODING_WORKER_UID, DOCKER_ISOLATION_ERROR, hasIsolationLabels, isolationLabelArgs, isolationNames, isolationToken, } from "./docker-isolation.js";
|
|
11
|
+
import { SERVICE_SCRATCH_MIB, serviceEphemeralStorageMib } from "./kubernetes-isolation.js";
|
|
12
|
+
/** Every Docker run container is PID-bounded; the catalog has no PID field. */
|
|
13
|
+
export const SERVICE_PIDS_LIMIT = 512;
|
|
14
|
+
/** /dev/shm for a service (PostgreSQL's dynamic shared memory): the Kubernetes default size. */
|
|
15
|
+
export const SERVICE_SHM_MIB = 64;
|
|
16
|
+
function isolationError() {
|
|
17
|
+
return new Error(DOCKER_ISOLATION_ERROR);
|
|
18
|
+
}
|
|
19
|
+
export function dockerServiceContainerName(runId, serviceName) {
|
|
20
|
+
if (!CODING_SERVICE_NAME.test(serviceName))
|
|
21
|
+
throw isolationError();
|
|
22
|
+
return `wardby-svc-${isolationToken(runId)}-${serviceName}`;
|
|
23
|
+
}
|
|
24
|
+
/** The container names of a spec's services, for stop and cleanup: names only, never launch input. */
|
|
25
|
+
export function dockerServiceContainerNames(spec) {
|
|
26
|
+
return (spec.services ?? [])
|
|
27
|
+
.filter((service) => CODING_SERVICE_NAME.test(service.name))
|
|
28
|
+
.map((service) => dockerServiceContainerName(spec.runId, service.name));
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Re-validated here, not trusted from dispatch, as the Kubernetes launcher does. Returns the
|
|
32
|
+
* schema's parsed output (defaults such as `serviceEnv`/`writablePaths` filled in), never the raw
|
|
33
|
+
* spec, so a caller never has to guard against a missing default field, and any shape the schema
|
|
34
|
+
* rejects throws the isolation error rather than surfacing as a TypeError further down.
|
|
35
|
+
*/
|
|
36
|
+
export function validateDockerServices(spec) {
|
|
37
|
+
if (spec.services === undefined)
|
|
38
|
+
return [];
|
|
39
|
+
const names = spec.services.map((service) => service.name);
|
|
40
|
+
if (spec.services.length === 0 || new Set(names).size !== names.length) {
|
|
41
|
+
throw isolationError();
|
|
42
|
+
}
|
|
43
|
+
const parsed = StoredCodingServicesSchema.safeParse(spec.services);
|
|
44
|
+
if (!parsed.success)
|
|
45
|
+
throw isolationError();
|
|
46
|
+
return parsed.data;
|
|
47
|
+
}
|
|
48
|
+
/** Its data path at its disk size, then SERVICE_SCRATCH_MIB for each writable path: the Kubernetes sizes. */
|
|
49
|
+
export function serviceTmpfsOptions(service) {
|
|
50
|
+
const mounts = [
|
|
51
|
+
{ path: service.dataPath, sizeMib: service.resources.diskMib },
|
|
52
|
+
...service.writablePaths.map((path) => ({ path, sizeMib: SERVICE_SCRATCH_MIB })),
|
|
53
|
+
];
|
|
54
|
+
return Object.fromEntries(mounts.map(({ path, sizeMib }) => [
|
|
55
|
+
path,
|
|
56
|
+
`rw,nosuid,nodev,size=${sizeMib}m,uid=${CODING_WORKER_UID},gid=${CODING_WORKER_GID},mode=0700`,
|
|
57
|
+
]));
|
|
58
|
+
}
|
|
59
|
+
/** tmpfs pages count against the container's memory cgroup: catalog memory, its disk, and /dev/shm. */
|
|
60
|
+
export function serviceMemoryMib(service) {
|
|
61
|
+
return service.resources.memoryMib + serviceEphemeralStorageMib(service) + SERVICE_SHM_MIB;
|
|
62
|
+
}
|
|
63
|
+
export function buildServiceCreateArgs(spec, service) {
|
|
64
|
+
const names = isolationNames(spec.runId);
|
|
65
|
+
const memoryMib = serviceMemoryMib(service);
|
|
66
|
+
const env = Object.entries(service.serviceEnv)
|
|
67
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
68
|
+
.flatMap(([name, value]) => ["--env", `${name}=${value}`]);
|
|
69
|
+
return [
|
|
70
|
+
"container",
|
|
71
|
+
"create",
|
|
72
|
+
"--name",
|
|
73
|
+
dockerServiceContainerName(spec.runId, service.name),
|
|
74
|
+
"--pull",
|
|
75
|
+
"never",
|
|
76
|
+
"--user",
|
|
77
|
+
`${CODING_WORKER_UID}:${CODING_WORKER_GID}`,
|
|
78
|
+
"--network",
|
|
79
|
+
`container:${names.networkKeeperContainer}`,
|
|
80
|
+
"--read-only",
|
|
81
|
+
"--cap-drop",
|
|
82
|
+
"ALL",
|
|
83
|
+
"--security-opt",
|
|
84
|
+
"no-new-privileges=true",
|
|
85
|
+
"--security-opt",
|
|
86
|
+
"seccomp=builtin",
|
|
87
|
+
"--cgroupns",
|
|
88
|
+
"private",
|
|
89
|
+
"--ipc",
|
|
90
|
+
"private",
|
|
91
|
+
"--shm-size",
|
|
92
|
+
`${SERVICE_SHM_MIB}m`,
|
|
93
|
+
"--cpus",
|
|
94
|
+
String(service.resources.cpuMillicores / 1000),
|
|
95
|
+
"--memory",
|
|
96
|
+
`${memoryMib}m`,
|
|
97
|
+
"--memory-swap",
|
|
98
|
+
`${memoryMib}m`,
|
|
99
|
+
"--memory-swappiness",
|
|
100
|
+
"0",
|
|
101
|
+
"--pids-limit",
|
|
102
|
+
String(SERVICE_PIDS_LIMIT),
|
|
103
|
+
...Object.entries(serviceTmpfsOptions(service)).flatMap(([path, options]) => ["--tmpfs", `${path}:${options}`]),
|
|
104
|
+
...env,
|
|
105
|
+
"--restart",
|
|
106
|
+
"no",
|
|
107
|
+
"--log-driver",
|
|
108
|
+
"local",
|
|
109
|
+
"--log-opt",
|
|
110
|
+
"max-size=1m",
|
|
111
|
+
"--log-opt",
|
|
112
|
+
"max-file=2",
|
|
113
|
+
...isolationLabelArgs(spec.runId),
|
|
114
|
+
service.image,
|
|
115
|
+
];
|
|
116
|
+
}
|
|
117
|
+
export function buildDockerServicePlan(spec) {
|
|
118
|
+
return validateDockerServices(spec).map((service) => ({
|
|
119
|
+
service,
|
|
120
|
+
container: dockerServiceContainerName(spec.runId, service.name),
|
|
121
|
+
createArgs: buildServiceCreateArgs(spec, service),
|
|
122
|
+
}));
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Before a service starts: exactly the controls buildServiceCreateArgs asked for. No mounts at all,
|
|
126
|
+
* so an image VOLUME outside the entry's dataPath/writablePaths (an anonymous, unbounded host
|
|
127
|
+
* volume) fails here rather than run. Re-validates the spec and requires `service` to be one of its
|
|
128
|
+
* validated entries (by name and version), rather than trusting the caller's pairing of the two.
|
|
129
|
+
*/
|
|
130
|
+
export function assertServiceContainerInspection(container, spec, service, networkKeeperId) {
|
|
131
|
+
const validated = validateDockerServices(spec);
|
|
132
|
+
if (!validated.some((entry) => entry.name === service.name && entry.version === service.version)) {
|
|
133
|
+
throw isolationError();
|
|
134
|
+
}
|
|
135
|
+
const names = isolationNames(spec.runId);
|
|
136
|
+
const host = container.HostConfig;
|
|
137
|
+
const security = host?.SecurityOpt ?? [];
|
|
138
|
+
const env = container.Config?.Env ?? [];
|
|
139
|
+
const memory = serviceMemoryMib(service) * 1024 * 1024;
|
|
140
|
+
const networkModes = [
|
|
141
|
+
`container:${names.networkKeeperContainer}`,
|
|
142
|
+
...(networkKeeperId ? [`container:${networkKeeperId}`] : []),
|
|
143
|
+
];
|
|
144
|
+
const expectedTmpfs = serviceTmpfsOptions(service);
|
|
145
|
+
const actualTmpfs = host?.Tmpfs ?? {};
|
|
146
|
+
if (container.Config?.User !== `${CODING_WORKER_UID}:${CODING_WORKER_GID}` ||
|
|
147
|
+
container.Config.Image !== service.image ||
|
|
148
|
+
!hasIsolationLabels(container.Config.Labels, spec.runId) ||
|
|
149
|
+
host?.ReadonlyRootfs !== true ||
|
|
150
|
+
host.Privileged !== false ||
|
|
151
|
+
(host.Binds?.length ?? 0) !== 0 ||
|
|
152
|
+
(host.CapAdd?.length ?? 0) !== 0 ||
|
|
153
|
+
!host.CapDrop?.includes("ALL") ||
|
|
154
|
+
host.CgroupnsMode !== "private" ||
|
|
155
|
+
host.IpcMode !== "private" ||
|
|
156
|
+
host.ShmSize !== SERVICE_SHM_MIB * 1024 * 1024 ||
|
|
157
|
+
host.Memory !== memory ||
|
|
158
|
+
host.MemorySwap !== memory ||
|
|
159
|
+
// cgroup v2 hosts may report this as null after accepting the explicit
|
|
160
|
+
// no-swappiness request; MemorySwap still attests that swap is disabled.
|
|
161
|
+
(host.MemorySwappiness !== 0 && host.MemorySwappiness !== null) ||
|
|
162
|
+
host.PidsLimit !== SERVICE_PIDS_LIMIT ||
|
|
163
|
+
host.NanoCpus !== service.resources.cpuMillicores * 1_000_000 ||
|
|
164
|
+
!networkModes.includes(host.NetworkMode ?? "") ||
|
|
165
|
+
host.PidMode !== "" ||
|
|
166
|
+
host.RestartPolicy?.Name !== "no" ||
|
|
167
|
+
host.LogConfig?.Type !== "local" ||
|
|
168
|
+
host.LogConfig.Config?.["max-size"] !== "1m" ||
|
|
169
|
+
host.LogConfig.Config?.["max-file"] !== "2" ||
|
|
170
|
+
!security.includes("no-new-privileges=true") ||
|
|
171
|
+
!security.includes("seccomp=builtin") ||
|
|
172
|
+
(host.Devices?.length ?? 0) !== 0 ||
|
|
173
|
+
(host.DeviceRequests?.length ?? 0) !== 0 ||
|
|
174
|
+
(host.Dns?.length ?? 0) !== 0 ||
|
|
175
|
+
(host.DnsOptions?.length ?? 0) !== 0 ||
|
|
176
|
+
(host.DnsSearch?.length ?? 0) !== 0 ||
|
|
177
|
+
(host.ExtraHosts?.length ?? 0) !== 0 ||
|
|
178
|
+
(host.GroupAdd?.length ?? 0) !== 0 ||
|
|
179
|
+
Object.keys(host.PortBindings ?? {}).length !== 0 ||
|
|
180
|
+
host.PublishAllPorts !== false ||
|
|
181
|
+
(host.Mounts?.length ?? 0) !== 0 ||
|
|
182
|
+
(container.Mounts?.length ?? 0) !== 0 ||
|
|
183
|
+
Object.keys(container.NetworkSettings?.Networks ?? {}).length !== 0 ||
|
|
184
|
+
Object.keys(container.NetworkSettings?.Ports ?? {}).length !== 0 ||
|
|
185
|
+
Object.keys(actualTmpfs).length !== Object.keys(expectedTmpfs).length ||
|
|
186
|
+
Object.entries(expectedTmpfs).some(([path, options]) => actualTmpfs[path] !== options) ||
|
|
187
|
+
env.some((value) => value.startsWith("WARDBY_")) ||
|
|
188
|
+
Object.entries(service.serviceEnv).some(([name, value]) => !env.includes(`${name}=${value}`))) {
|
|
189
|
+
throw isolationError();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
@@ -1,8 +1,30 @@
|
|
|
1
|
+
import { type CollectExclusions } from "../../coding/collect-exclude.js";
|
|
2
|
+
import type { CodingProvider } from "../../coding/provider.js";
|
|
1
3
|
import type { JobHandle, JobResult, JobSpec, JobStatus, WorkspaceJobLauncher } from "./types.js";
|
|
4
|
+
/** How long one service image pull may take before the run fails as service_unready. */
|
|
5
|
+
export declare const SERVICE_IMAGE_PULL_TIMEOUT_MS = 300000;
|
|
6
|
+
/**
|
|
7
|
+
* The default bound on a run's whole service start-up (every service's create, start, inspection and
|
|
8
|
+
* readiness probing; image pulls excluded), matching the Kubernetes launcher's pod-start bound.
|
|
9
|
+
*/
|
|
10
|
+
export declare const DEFAULT_SERVICE_READY_TIMEOUT_MS = 120000;
|
|
2
11
|
export declare const SAFE_WORKER_DIAGNOSTIC: RegExp;
|
|
12
|
+
export interface WorkerDiagnostic {
|
|
13
|
+
diagnostic: string;
|
|
14
|
+
diagnosticIssues?: string[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Worker output is untrusted: recognizes only the fixed `{"error": code}` line,
|
|
18
|
+
* plus an optional `issues` list whose every entry must pass the shared pattern.
|
|
19
|
+
* A list with any entry that does not is dropped whole rather than filtered, so
|
|
20
|
+
* a malformed worker cannot smuggle a partial value through.
|
|
21
|
+
*/
|
|
22
|
+
export declare function parseWorkerDiagnosticLine(line: string): WorkerDiagnostic | undefined;
|
|
3
23
|
export interface DockerCommandOptions {
|
|
4
24
|
env?: Record<string, string>;
|
|
5
25
|
maxOutputBytes?: number;
|
|
26
|
+
/** Kill the Docker client and fail after this long (service readiness probes and image pulls). */
|
|
27
|
+
timeoutMs?: number;
|
|
6
28
|
}
|
|
7
29
|
export interface DockerCommandResult {
|
|
8
30
|
stdout: string;
|
|
@@ -47,7 +69,7 @@ export declare class NodeDockerCommandRunner implements DockerCommandRunner {
|
|
|
47
69
|
export interface DockerArtifactTransfer {
|
|
48
70
|
seedDirectory(sourceDirectory: string, container: string, destination: string): Promise<void>;
|
|
49
71
|
seedInput(sourceFile: string, container: string): Promise<void>;
|
|
50
|
-
materializeDirectory(container: string, source: string, destination: string, maxBytes: number): Promise<void>;
|
|
72
|
+
materializeDirectory(container: string, source: string, destination: string, maxBytes: number, exclusions: CollectExclusions): Promise<void>;
|
|
51
73
|
}
|
|
52
74
|
export declare function dockerTransferEnvironment(path: string): NodeJS.ProcessEnv;
|
|
53
75
|
/** Streams tar archives into the unprivileged keeper; no host bind mounts are used. */
|
|
@@ -57,7 +79,7 @@ export declare class NodeDockerArtifactTransfer implements DockerArtifactTransfe
|
|
|
57
79
|
constructor(dockerBinary?: string, path?: string);
|
|
58
80
|
seedDirectory(sourceDirectory: string, container: string, destination: string): Promise<void>;
|
|
59
81
|
seedInput(sourceFile: string, container: string): Promise<void>;
|
|
60
|
-
materializeDirectory(container: string, source: string, destination: string, maxBytes: number): Promise<void>;
|
|
82
|
+
materializeDirectory(container: string, source: string, destination: string, maxBytes: number, exclusions: CollectExclusions): Promise<void>;
|
|
61
83
|
}
|
|
62
84
|
export declare function validateMaterializedWorkspace(root: string, maxBytes: number): Promise<void>;
|
|
63
85
|
export interface DockerJobLauncherOptions {
|
|
@@ -70,6 +92,13 @@ export interface DockerJobLauncherOptions {
|
|
|
70
92
|
docker?: DockerCommandRunner;
|
|
71
93
|
transfer?: DockerArtifactTransfer;
|
|
72
94
|
now?: () => number;
|
|
95
|
+
/** Waits between service readiness probes; tests replace it. */
|
|
96
|
+
sleep?: (milliseconds: number) => Promise<void>;
|
|
97
|
+
/**
|
|
98
|
+
* The bound on a run's whole service start-up, image pulls excluded (default
|
|
99
|
+
* DEFAULT_SERVICE_READY_TIMEOUT_MS). Start-up never runs past the run's own deadline either.
|
|
100
|
+
*/
|
|
101
|
+
serviceReadyTimeoutMs?: number;
|
|
73
102
|
/** Optional observer invoked after provisioning fails but before resources are cleaned up. */
|
|
74
103
|
onProvisionFailure?: (context: {
|
|
75
104
|
runId: string;
|
|
@@ -83,10 +112,14 @@ export declare class DockerJobLauncher implements WorkspaceJobLauncher {
|
|
|
83
112
|
private readonly docker;
|
|
84
113
|
private readonly transfer;
|
|
85
114
|
private readonly now;
|
|
115
|
+
private readonly sleep;
|
|
116
|
+
private readonly serviceReadyTimeoutMs;
|
|
86
117
|
private readonly locks;
|
|
87
118
|
private readonly timers;
|
|
88
119
|
private readonly ready;
|
|
89
120
|
constructor(options: DockerJobLauncherOptions);
|
|
121
|
+
/** Starts JobSpec.services (a network keeper plus one hardened container per service) for Codex and Claude Code runs. */
|
|
122
|
+
supportsServicesFor(provider: CodingProvider): boolean;
|
|
90
123
|
launch(spec: JobSpec): Promise<JobHandle>;
|
|
91
124
|
status(handle: JobHandle): Promise<JobStatus>;
|
|
92
125
|
collect(handle: JobHandle): Promise<JobResult>;
|
|
@@ -96,8 +129,31 @@ export declare class DockerJobLauncher implements WorkspaceJobLauncher {
|
|
|
96
129
|
private initialize;
|
|
97
130
|
private launchLocked;
|
|
98
131
|
private provision;
|
|
132
|
+
/**
|
|
133
|
+
* A run with services (docs/coding-services.md). The network keeper joins the run's internal
|
|
134
|
+
* network and owns the namespace; each service joins it and must pass its catalog readiness
|
|
135
|
+
* command before the next one starts, as Kubernetes starts native sidecars. The whole start-up is
|
|
136
|
+
* bounded (ServiceStartBudget): running out fails as coding_service_unready for the service being
|
|
137
|
+
* waited on. Returns the keeper's container ID, which Docker may report as the services' and
|
|
138
|
+
* worker's network mode.
|
|
139
|
+
*/
|
|
140
|
+
private startServices;
|
|
141
|
+
/**
|
|
142
|
+
* A local copy of the digest-pinned image is used as is; otherwise it is pulled, bounded by its
|
|
143
|
+
* own limit and the run's deadline. Pull time does not count toward the start-up budget.
|
|
144
|
+
*/
|
|
145
|
+
private ensureServiceImage;
|
|
146
|
+
/**
|
|
147
|
+
* The catalog readiness command, like a Kubernetes startup probe: every periodSeconds, each
|
|
148
|
+
* attempt bounded by timeoutSeconds, failing after failureThreshold consecutive failures. A
|
|
149
|
+
* service that exited or vanished fails at once, and so does one still unready when the start-up
|
|
150
|
+
* budget runs out (each probe and wait is clipped to what is left of it). Probe output is never
|
|
151
|
+
* logged or kept, so these errors carry no cause.
|
|
152
|
+
*/
|
|
153
|
+
private waitForServiceReady;
|
|
99
154
|
private refresh;
|
|
100
155
|
private stopRecord;
|
|
156
|
+
private stopContainer;
|
|
101
157
|
private sweepExpired;
|
|
102
158
|
private cleanupResources;
|
|
103
159
|
private removeContainerIfAttested;
|
|
@@ -107,6 +163,8 @@ export declare class DockerJobLauncher implements WorkspaceJobLauncher {
|
|
|
107
163
|
private readResultArtifact;
|
|
108
164
|
private readWorkerFailureDiagnostic;
|
|
109
165
|
private keeperName;
|
|
166
|
+
/** For a run with services: the attested network keeper's ID, which the worker's network mode may name. */
|
|
167
|
+
private attestedNetworkKeeperId;
|
|
110
168
|
private assertHost;
|
|
111
169
|
private createAndAssert;
|
|
112
170
|
private waitForStorage;
|