@wardby/cli 0.5.3 → 0.7.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 +33 -0
- package/README.md +25 -14
- package/deploy/local/docker-compose.quickstart-coding.yml +13 -0
- package/dist/claude-coding-worker/context.d.ts +22 -0
- package/dist/claude-coding-worker/context.js +92 -0
- package/dist/claude-coding-worker/driver.d.ts +27 -3
- package/dist/claude-coding-worker/driver.js +161 -20
- package/dist/claude-coding-worker/main.js +34 -6
- package/dist/claude-coding-worker/sdk.js +25 -5
- package/dist/claude-coding-worker/tool-socket.d.ts +27 -0
- package/dist/claude-coding-worker/tool-socket.js +111 -0
- package/dist/claude-coding-worker/transcript.d.ts +18 -0
- package/dist/claude-coding-worker/transcript.js +77 -0
- package/dist/cli-help.d.ts +1 -1
- package/dist/cli-help.js +6 -2
- package/dist/cli-native-mode.d.ts +9 -0
- package/dist/cli-native-mode.js +20 -0
- package/dist/cli.d.ts +3 -1
- package/dist/cli.js +161 -11
- package/dist/coding/claude-context.d.ts +45 -0
- package/dist/coding/claude-context.js +434 -0
- package/dist/coding/continuation-wording.d.ts +35 -0
- package/dist/coding/continuation-wording.js +73 -0
- package/dist/coding/linked-issue-note.d.ts +23 -0
- package/dist/coding/linked-issue-note.js +47 -0
- package/dist/coding/merge-wording.d.ts +28 -0
- package/dist/coding/merge-wording.js +78 -0
- package/dist/coding/pr-description-note.d.ts +9 -0
- package/dist/coding/pr-description-note.js +32 -0
- package/dist/coding/profile.d.ts +50 -118
- package/dist/coding/profile.js +51 -4
- package/dist/coding/protected-path-wording.d.ts +8 -0
- package/dist/coding/protected-path-wording.js +1 -1
- package/dist/coding/protocol.d.ts +292 -270
- package/dist/coding/protocol.js +322 -15
- package/dist/coding/redact.d.ts +3 -0
- package/dist/coding/redact.js +12 -0
- package/dist/coding/registry/allowlist.d.ts +12 -0
- package/dist/coding/registry/allowlist.js +14 -1
- package/dist/coding/registry/audit-mode.d.ts +153 -0
- package/dist/coding/registry/audit-mode.js +304 -0
- package/dist/coding/registry/lockfile-shared.d.ts +36 -0
- package/dist/coding/registry/lockfile-shared.js +128 -0
- package/dist/coding/registry/lockfiles.js +1 -1
- package/dist/coding/registry/npm-lockfile-formats.d.ts +11 -0
- package/dist/coding/registry/npm-lockfile-formats.js +41 -0
- package/dist/coding/registry/npm-lockfile.d.ts +8 -4
- package/dist/coding/registry/npm-lockfile.js +4 -6
- package/dist/coding/registry/npm.js +78 -8
- package/dist/coding/registry/pnpm-lockfile.d.ts +17 -0
- package/dist/coding/registry/pnpm-lockfile.js +189 -0
- package/dist/coding/registry/pypi-plan.d.ts +50 -0
- package/dist/coding/registry/pypi-plan.js +406 -0
- package/dist/coding/registry/pypi-requirements.d.ts +58 -0
- package/dist/coding/registry/pypi-requirements.js +155 -0
- package/dist/coding/registry/pypi.d.ts +3 -27
- package/dist/coding/registry/pypi.js +40 -154
- package/dist/coding/registry/refusal-hints.d.ts +20 -0
- package/dist/coding/registry/refusal-hints.js +61 -0
- package/dist/coding/registry/refusal-wording.d.ts +11 -0
- package/dist/coding/registry/refusal-wording.js +56 -0
- package/dist/coding/registry/report.d.ts +70 -8
- package/dist/coding/registry/report.js +112 -5
- package/dist/coding/registry/types.d.ts +58 -8
- package/dist/coding/registry/yarn-lockfile.d.ts +30 -0
- package/dist/coding/registry/yarn-lockfile.js +367 -0
- package/dist/coding/services/catalog.d.ts +37 -351
- package/dist/coding/transcript/claude-code.d.ts +13 -0
- package/dist/coding/transcript/claude-code.js +273 -0
- package/dist/coding/transcript/download-protocol.d.ts +30 -0
- package/dist/coding/transcript/download-protocol.js +18 -0
- package/dist/coding/transcript/format.d.ts +20 -0
- package/dist/coding/transcript/format.js +32 -0
- package/dist/coding/transcript/recorder.d.ts +51 -0
- package/dist/coding/transcript/recorder.js +225 -0
- package/dist/coding/transcript/resume/checkout.d.ts +31 -0
- package/dist/coding/transcript/resume/checkout.js +203 -0
- package/dist/coding/transcript/resume/command.d.ts +17 -0
- package/dist/coding/transcript/resume/command.js +176 -0
- package/dist/coding/transcript/resume/download.d.ts +20 -0
- package/dist/coding/transcript/resume/download.js +153 -0
- package/dist/coding/transcript/resume/launch.d.ts +38 -0
- package/dist/coding/transcript/resume/launch.js +128 -0
- package/dist/coding/transcript/resume/session-file.d.ts +13 -0
- package/dist/coding/transcript/resume/session-file.js +79 -0
- package/dist/coding/transcript/resume/stand-in.d.ts +11 -0
- package/dist/coding/transcript/resume/stand-in.js +49 -0
- package/dist/coding-worker/artifact.d.ts +16 -3
- package/dist/coding-worker/artifact.js +5 -3
- package/dist/coding-worker/debug-trace.d.ts +6 -5
- package/dist/coding-worker/debug-trace.js +13 -18
- package/dist/coding-worker/dependency-cache.d.mts +229 -0
- package/dist/coding-worker/dependency-cache.mjs +2123 -0
- package/dist/coding-worker/driver.d.ts +4 -3
- package/dist/coding-worker/driver.js +118 -38
- package/dist/coding-worker/errors.d.ts +1 -0
- package/dist/coding-worker/errors.js +32 -0
- package/dist/coding-worker/sdk.d.ts +6 -0
- package/dist/coding-worker/sdk.js +1 -0
- package/dist/coding-worker/skills.d.ts +23 -0
- package/dist/coding-worker/skills.js +117 -0
- package/dist/coding-worker/task-note.d.ts +11 -0
- package/dist/coding-worker/task-note.js +13 -0
- package/dist/coding-worker/types.d.ts +13 -0
- package/dist/config/dependency-cache.d.ts +23 -0
- package/dist/config/dependency-cache.js +32 -0
- package/dist/config/github-allowed-accounts.d.ts +15 -0
- package/dist/config/github-allowed-accounts.js +36 -0
- package/dist/config/low-power.d.ts +12 -0
- package/dist/config/low-power.js +18 -0
- package/dist/config/mobile.d.ts +12 -0
- package/dist/config/mobile.js +18 -0
- package/dist/config/providers.d.ts +65 -3
- package/dist/config/providers.js +147 -11
- package/dist/config/test-simulators.d.ts +82 -0
- package/dist/config/test-simulators.js +305 -0
- package/dist/core/async-context.d.ts +2 -0
- package/dist/core/async-context.js +12 -0
- package/dist/core/budget-events.d.ts +108 -0
- package/dist/core/budget-events.js +346 -0
- package/dist/core/budget-groups.d.ts +50 -1
- package/dist/core/budget-groups.js +236 -27
- package/dist/core/budget-stopped-head.d.ts +46 -0
- package/dist/core/budget-stopped-head.js +81 -0
- package/dist/core/budget-topup.d.ts +51 -0
- package/dist/core/budget-topup.js +156 -0
- package/dist/core/budget-wording.d.ts +16 -2
- package/dist/core/budget-wording.js +40 -2
- package/dist/core/coding-queue.d.ts +2 -1
- package/dist/core/coding-queue.js +7 -0
- package/dist/core/cron.d.ts +19 -1
- package/dist/core/cron.js +17 -0
- package/dist/core/datastores.js +1 -1
- package/dist/core/db.d.ts +16 -6
- package/dist/core/db.js +12 -10
- package/dist/core/deferred-coding.d.ts +14 -0
- package/dist/core/deferred-coding.js +62 -0
- package/dist/core/delegation-child.d.ts +25 -0
- package/dist/core/delegation-child.js +37 -0
- package/dist/core/dispatch.d.ts +53 -0
- package/dist/core/dispatch.js +167 -57
- package/dist/core/engine-native.js +10 -6
- package/dist/core/error-code.d.ts +38 -0
- package/dist/core/error-code.js +168 -0
- package/dist/core/grants.d.ts +19 -6
- package/dist/core/grants.js +55 -6
- package/dist/core/host-events.d.ts +67 -5
- package/dist/core/host-events.js +571 -37
- package/dist/core/host-status.d.ts +85 -3
- package/dist/core/host-status.js +298 -20
- package/dist/core/issue-bridge.d.ts +50 -6
- package/dist/core/issue-bridge.js +151 -20
- package/dist/core/issue-events.d.ts +1 -1
- package/dist/core/issue-events.js +16 -11
- package/dist/core/issue-status.d.ts +1 -1
- package/dist/core/issue-status.js +68 -29
- package/dist/core/logger.d.ts +5 -0
- package/dist/core/logger.js +14 -1
- package/dist/core/lost-run-children.d.ts +6 -0
- package/dist/core/lost-run-children.js +32 -0
- package/dist/core/mark-ready.d.ts +34 -0
- package/dist/core/mark-ready.js +152 -0
- package/dist/core/markdown-code.d.ts +8 -0
- package/dist/core/markdown-code.js +107 -0
- package/dist/core/memory-tools.js +7 -0
- package/dist/core/merge-order-check.d.ts +130 -0
- package/dist/core/merge-order-check.js +343 -0
- package/dist/core/notification-dispatcher.d.ts +70 -0
- package/dist/core/notification-dispatcher.js +368 -0
- package/dist/core/notification-templates.d.ts +19 -0
- package/dist/core/notification-templates.js +139 -0
- package/dist/core/notifications.d.ts +10 -0
- package/dist/core/notifications.js +38 -0
- package/dist/core/pg-auth.d.ts +22 -0
- package/dist/core/pg-auth.js +152 -0
- package/dist/core/power-composition.d.ts +16 -0
- package/dist/core/power-composition.js +37 -0
- package/dist/core/power-idle.d.ts +14 -0
- package/dist/core/power-idle.js +30 -0
- package/dist/core/power.d.ts +71 -0
- package/dist/core/power.js +202 -0
- package/dist/core/pull-request-state-sync.js +2 -2
- package/dist/core/reconciler.d.ts +8 -5
- package/dist/core/reconciler.js +37 -6
- package/dist/core/related-pull-requests.d.ts +59 -7
- package/dist/core/related-pull-requests.js +140 -25
- package/dist/core/reply-parts.d.ts +21 -0
- package/dist/core/reply-parts.js +73 -0
- package/dist/core/repo-access.d.ts +15 -0
- package/dist/core/repo-access.js +66 -0
- package/dist/core/review-fix.d.ts +38 -1
- package/dist/core/review-fix.js +209 -7
- package/dist/core/review-host-checks.d.ts +1 -1
- package/dist/core/review-host-tools.d.ts +23 -0
- package/dist/core/review-host-tools.js +156 -14
- package/dist/core/review-reads.d.ts +55 -0
- package/dist/core/review-reads.js +233 -0
- package/dist/core/run-status.d.ts +12 -0
- package/dist/core/run-status.js +12 -0
- package/dist/core/runner.d.ts +384 -5
- package/dist/core/runner.js +1244 -372
- package/dist/core/schedule-start.d.ts +12 -0
- package/dist/core/schedule-start.js +14 -0
- package/dist/core/secret-broker-config.d.ts +39 -0
- package/dist/core/secret-broker-config.js +112 -0
- package/dist/core/secret-guard.d.ts +46 -0
- package/dist/core/secret-guard.js +104 -0
- package/dist/core/secret-guarded-stores.d.ts +12 -0
- package/dist/core/secret-guarded-stores.js +41 -0
- package/dist/core/secret-spans.d.ts +50 -0
- package/dist/core/secret-spans.js +94 -0
- package/dist/core/secrets.d.ts +39 -4
- package/dist/core/secrets.js +148 -40
- package/dist/core/stop-run.d.ts +46 -0
- package/dist/core/stop-run.js +61 -0
- package/dist/core/workflow-event-recorder.d.ts +14 -0
- package/dist/core/workflow-event-recorder.js +120 -0
- package/dist/core/workflow-events.d.ts +94 -0
- package/dist/core/workflow-events.js +48 -0
- package/dist/core/workflow-run-events.d.ts +18 -0
- package/dist/core/workflow-run-events.js +75 -0
- package/dist/core/zod-json-schema.d.ts +4 -0
- package/dist/core/zod-json-schema.js +39 -0
- package/dist/core/zod3-window.d.ts +35 -0
- package/dist/core/zod3-window.js +124 -0
- package/dist/generated/prisma/browser.d.ts +92 -3
- package/dist/generated/prisma/client.d.ts +92 -3
- package/dist/generated/prisma/commonInputTypes.d.ts +364 -54
- package/dist/generated/prisma/enums.d.ts +37 -0
- package/dist/generated/prisma/enums.js +31 -0
- package/dist/generated/prisma/internal/class.d.ts +132 -0
- package/dist/generated/prisma/internal/class.js +4 -4
- package/dist/generated/prisma/internal/prismaNamespace.d.ts +1332 -142
- package/dist/generated/prisma/internal/prismaNamespace.js +227 -5
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +234 -0
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +227 -5
- package/dist/generated/prisma/models/Agent.d.ts +464 -7
- package/dist/generated/prisma/models/AgentRepository.d.ts +42 -1
- package/dist/generated/prisma/models/CodingAgentProfile.d.ts +301 -1
- package/dist/generated/prisma/models/CodingProxyRequest.d.ts +207 -3
- package/dist/generated/prisma/models/CodingProxySession.d.ts +114 -1
- package/dist/generated/prisma/models/CodingRun.d.ts +1841 -1
- package/dist/generated/prisma/models/DeferredReview.d.ts +78 -1
- package/dist/generated/prisma/models/DependencySnapshot.d.ts +1668 -0
- package/dist/generated/prisma/models/DependencySnapshot.js +1 -0
- package/dist/generated/prisma/models/IssuePullRequest.d.ts +6 -2
- package/dist/generated/prisma/models/LocalReview.d.ts +40 -1
- package/dist/generated/prisma/models/NativeGatewayCall.d.ts +1713 -0
- package/dist/generated/prisma/models/NativeGatewayCall.js +1 -0
- package/dist/generated/prisma/models/NativeGatewaySession.d.ts +1551 -0
- package/dist/generated/prisma/models/NativeGatewaySession.js +1 -0
- package/dist/generated/prisma/models/NativeWarmWorker.d.ts +1296 -0
- package/dist/generated/prisma/models/NativeWarmWorker.js +1 -0
- package/dist/generated/prisma/models/NotificationChannel.d.ts +1543 -0
- package/dist/generated/prisma/models/NotificationChannel.js +1 -0
- package/dist/generated/prisma/models/NotificationDelivery.d.ts +1502 -0
- package/dist/generated/prisma/models/NotificationDelivery.js +1 -0
- package/dist/generated/prisma/models/NotificationThread.d.ts +1090 -0
- package/dist/generated/prisma/models/NotificationThread.js +1 -0
- package/dist/generated/prisma/models/RegistryAllowance.d.ts +41 -1
- package/dist/generated/prisma/models/RegistryApprovedVersion.d.ts +75 -1
- package/dist/generated/prisma/models/RegistryAuditRecord.d.ts +1364 -0
- package/dist/generated/prisma/models/RegistryAuditRecord.js +1 -0
- package/dist/generated/prisma/models/Run.d.ts +1619 -58
- package/dist/generated/prisma/models/RunBudgetEvent.d.ts +1211 -0
- package/dist/generated/prisma/models/RunBudgetEvent.js +1 -0
- package/dist/generated/prisma/models/RunHostCheck.d.ts +36 -1
- package/dist/generated/prisma/models/RunTranscript.d.ts +1339 -0
- package/dist/generated/prisma/models/RunTranscript.js +1 -0
- package/dist/generated/prisma/models/Secret.d.ts +37 -1
- package/dist/generated/prisma/models/SecretBrokerChange.d.ts +1101 -0
- package/dist/generated/prisma/models/SecretBrokerChange.js +1 -0
- package/dist/generated/prisma/models/WorkflowEvent.d.ts +1422 -0
- package/dist/generated/prisma/models/WorkflowEvent.js +1 -0
- package/dist/generated/prisma/models.d.ts +12 -0
- package/dist/help/build.js +4 -2
- package/dist/help/catalog.d.ts +1 -1
- package/dist/help/catalog.js +31 -6
- package/dist/help-index.json +2584 -146
- package/dist/import/create.js +49 -3
- package/dist/import/neutral-schema.d.ts +50 -277
- package/dist/import/neutral-schema.js +7 -4
- package/dist/knowledge/check.d.ts +1 -1
- package/dist/knowledge/cli.d.ts +11 -1
- package/dist/knowledge/cli.js +37 -4
- package/dist/knowledge/concept.d.ts +3 -19
- package/dist/knowledge/location.d.ts +31 -0
- package/dist/knowledge/location.js +78 -0
- package/dist/mcp/auth/access.d.ts +11 -2
- package/dist/mcp/auth/access.js +15 -1
- package/dist/mcp/auth/ownership.d.ts +7 -7
- package/dist/mcp/auth/repo-authorization.js +14 -0
- package/dist/mcp/auth/resource-server.d.ts +2 -1
- package/dist/mcp/auth/resource-server.js +7 -2
- package/dist/mcp/auth/self-hosted/browser.d.ts +1 -1
- package/dist/mcp/auth/self-hosted/browser.js +19 -6
- package/dist/mcp/auth/self-hosted/credentials.d.ts +3 -3
- package/dist/mcp/auth/self-hosted/session.d.ts +2 -2
- package/dist/mcp/context.d.ts +6 -0
- package/dist/mcp/host-events/github-ingress.d.ts +25 -1
- package/dist/mcp/host-events/github-ingress.js +70 -1
- package/dist/mcp/index.d.ts +19 -0
- package/dist/mcp/index.js +117 -20
- package/dist/mcp/server.d.ts +13 -0
- package/dist/mcp/server.js +33 -14
- package/dist/mcp/tools/agents.d.ts +4 -0
- package/dist/mcp/tools/agents.js +277 -24
- package/dist/mcp/tools/datastore.js +17 -8
- package/dist/mcp/tools/grants.js +9 -3
- package/dist/mcp/tools/memory.js +11 -1
- package/dist/mcp/tools/notification-channels.d.ts +2 -0
- package/dist/mcp/tools/notification-channels.js +293 -0
- package/dist/mcp/tools/packages.d.ts +2 -0
- package/dist/mcp/tools/packages.js +195 -0
- package/dist/mcp/tools/power.d.ts +2 -0
- package/dist/mcp/tools/power.js +77 -0
- package/dist/mcp/tools/repositories.js +18 -5
- package/dist/mcp/tools/run-access.d.ts +16 -0
- package/dist/mcp/tools/run-access.js +25 -0
- package/dist/mcp/tools/run-transcript-download.d.ts +30 -0
- package/dist/mcp/tools/run-transcript-download.js +129 -0
- package/dist/mcp/tools/run-transcript.d.ts +19 -0
- package/dist/mcp/tools/run-transcript.js +70 -0
- package/dist/mcp/tools/runs.d.ts +0 -6
- package/dist/mcp/tools/runs.js +41 -14
- package/dist/mcp/tools/scheduling.js +3 -1
- package/dist/mcp/tools/secret-broker-compat.d.ts +12 -0
- package/dist/mcp/tools/secret-broker-compat.js +23 -0
- package/dist/mcp/tools/secret-elicitation-form.d.ts +22 -2
- package/dist/mcp/tools/secret-elicitation-form.js +205 -10
- package/dist/mcp/tools/secret-elicitation-server.d.ts +6 -0
- package/dist/mcp/tools/secret-elicitation-server.js +10 -54
- package/dist/mcp/tools/secret-elicitation.d.ts +38 -3
- package/dist/mcp/tools/secret-elicitation.js +110 -12
- package/dist/mcp/tools/secrets.js +186 -9
- package/dist/mcp/tools/stop-run.d.ts +2 -0
- package/dist/mcp/tools/stop-run.js +82 -0
- package/dist/mcp/tools/subagents.js +2 -2
- package/dist/mcp/tools/tools.d.ts +2 -2
- package/dist/mcp/tools/tools.js +47 -11
- package/dist/mcp/transport/stdio-link-host.d.ts +20 -0
- package/dist/mcp/transport/stdio-link-host.js +67 -0
- package/dist/mcp/transport/streamable-http.d.ts +13 -0
- package/dist/mcp/transport/streamable-http.js +41 -1
- package/dist/native-worker/composition.d.ts +23 -0
- package/dist/native-worker/composition.js +77 -0
- package/dist/native-worker/docker-isolation.d.ts +65 -0
- package/dist/native-worker/docker-isolation.js +183 -0
- package/dist/native-worker/docker-launcher.d.ts +110 -0
- package/dist/native-worker/docker-launcher.js +297 -0
- package/dist/native-worker/gateway-server.d.ts +77 -0
- package/dist/native-worker/gateway-server.js +412 -0
- package/dist/native-worker/gateway.d.ts +70 -0
- package/dist/native-worker/gateway.js +263 -0
- package/dist/native-worker/http-server.d.ts +24 -0
- package/dist/native-worker/http-server.js +113 -0
- package/dist/native-worker/http-transport.d.ts +17 -0
- package/dist/native-worker/http-transport.js +88 -0
- package/dist/native-worker/kubernetes-isolation.d.ts +90 -0
- package/dist/native-worker/kubernetes-isolation.js +218 -0
- package/dist/native-worker/kubernetes-launcher.d.ts +106 -0
- package/dist/native-worker/kubernetes-launcher.js +375 -0
- package/dist/native-worker/launch.d.ts +62 -0
- package/dist/native-worker/launch.js +49 -0
- package/dist/native-worker/ledger.d.ts +125 -0
- package/dist/native-worker/ledger.js +245 -0
- package/dist/native-worker/loopback.d.ts +12 -0
- package/dist/native-worker/loopback.js +44 -0
- package/dist/native-worker/main.d.ts +8 -0
- package/dist/native-worker/main.js +85 -0
- package/dist/native-worker/protocol.d.ts +296 -0
- package/dist/native-worker/protocol.js +246 -0
- package/dist/native-worker/sandbox-executor.d.ts +83 -0
- package/dist/native-worker/sandbox-executor.js +284 -0
- package/dist/native-worker/stderr-redaction.d.ts +77 -0
- package/dist/native-worker/stderr-redaction.js +237 -0
- package/dist/native-worker/stdio.d.ts +29 -0
- package/dist/native-worker/stdio.js +189 -0
- package/dist/native-worker/warm-delivery.d.ts +16 -0
- package/dist/native-worker/warm-delivery.js +33 -0
- package/dist/native-worker/warm-pool-ledger.d.ts +39 -0
- package/dist/native-worker/warm-pool-ledger.js +73 -0
- package/dist/native-worker/warm-pool.d.ts +107 -0
- package/dist/native-worker/warm-pool.js +283 -0
- package/dist/native-worker/worker.d.ts +17 -0
- package/dist/native-worker/worker.js +141 -0
- package/dist/observability/metrics.js +6 -1
- package/dist/providers/auth/authorization-server.d.ts +3 -0
- package/dist/providers/auth/index.js +2 -0
- package/dist/providers/auth/self-hosted.d.ts +14 -2
- package/dist/providers/auth/self-hosted.js +54 -4
- package/dist/providers/chat/fake.d.ts +46 -0
- package/dist/providers/chat/fake.js +39 -0
- package/dist/providers/chat/index.d.ts +4 -0
- package/dist/providers/chat/index.js +8 -0
- package/dist/providers/chat/slack.d.ts +37 -0
- package/dist/providers/chat/slack.js +105 -0
- package/dist/providers/chat/types.d.ts +42 -0
- package/dist/providers/chat/types.js +19 -0
- package/dist/providers/coding-proxy/dependency-cache/eviction.d.ts +29 -0
- package/dist/providers/coding-proxy/dependency-cache/eviction.js +87 -0
- package/dist/providers/coding-proxy/dependency-cache/key.d.ts +33 -0
- package/dist/providers/coding-proxy/dependency-cache/key.js +86 -0
- package/dist/providers/coding-proxy/dependency-cache/model-request-seal.d.ts +18 -0
- package/dist/providers/coding-proxy/dependency-cache/model-request-seal.js +40 -0
- package/dist/providers/coding-proxy/dependency-cache/prisma-store.d.ts +25 -0
- package/dist/providers/coding-proxy/dependency-cache/prisma-store.js +131 -0
- package/dist/providers/coding-proxy/dependency-cache/service.d.ts +70 -0
- package/dist/providers/coding-proxy/dependency-cache/service.js +409 -0
- package/dist/providers/coding-proxy/dependency-cache/store.d.ts +85 -0
- package/dist/providers/coding-proxy/dependency-cache/store.js +95 -0
- package/dist/providers/coding-proxy/hold.d.ts +32 -0
- package/dist/providers/coding-proxy/hold.js +86 -0
- package/dist/providers/coding-proxy/interrupted.d.ts +70 -0
- package/dist/providers/coding-proxy/interrupted.js +104 -0
- package/dist/providers/coding-proxy/memory-ledger.d.ts +15 -2
- package/dist/providers/coding-proxy/memory-ledger.js +84 -8
- package/dist/providers/coding-proxy/metering.d.ts +16 -0
- package/dist/providers/coding-proxy/metering.js +27 -4
- package/dist/providers/coding-proxy/prisma-ledger.d.ts +15 -2
- package/dist/providers/coding-proxy/prisma-ledger.js +179 -67
- package/dist/providers/coding-proxy/proxy.d.ts +14 -1
- package/dist/providers/coding-proxy/proxy.js +166 -14
- package/dist/providers/coding-proxy/registry/audit.d.ts +53 -10
- package/dist/providers/coding-proxy/registry/audit.js +94 -17
- package/dist/providers/coding-proxy/registry/lockfile-parse-worker.d.ts +36 -0
- package/dist/providers/coding-proxy/registry/lockfile-parse-worker.js +67 -0
- package/dist/providers/coding-proxy/registry/lockfile-parse.d.ts +16 -0
- package/dist/providers/coding-proxy/registry/lockfile-parse.js +110 -0
- package/dist/providers/coding-proxy/registry/plan.d.ts +9 -0
- package/dist/providers/coding-proxy/registry/plan.js +201 -48
- package/dist/providers/coding-proxy/registry/prisma-store.d.ts +11 -5
- package/dist/providers/coding-proxy/registry/prisma-store.js +120 -17
- package/dist/providers/coding-proxy/registry/service.d.ts +97 -16
- package/dist/providers/coding-proxy/registry/service.js +579 -112
- package/dist/providers/coding-proxy/registry/store.d.ts +84 -9
- package/dist/providers/coding-proxy/registry/store.js +54 -1
- package/dist/providers/coding-proxy/runtime.d.ts +4 -0
- package/dist/providers/coding-proxy/runtime.js +78 -16
- package/dist/providers/coding-proxy/server.d.ts +6 -1
- package/dist/providers/coding-proxy/server.js +45 -1
- package/dist/providers/coding-proxy/types.d.ts +65 -1
- package/dist/providers/datastore/types.d.ts +5 -0
- package/dist/providers/engine/types.d.ts +36 -2
- package/dist/providers/engine/types.js +39 -0
- package/dist/providers/executor/composition.d.ts +31 -1
- package/dist/providers/executor/composition.js +81 -8
- package/dist/providers/executor/container.d.ts +385 -9
- package/dist/providers/executor/container.js +1234 -99
- package/dist/providers/executor/dbos-status.d.ts +31 -0
- package/dist/providers/executor/dbos-status.js +64 -0
- package/dist/providers/executor/dbos.d.ts +91 -0
- package/dist/providers/executor/dbos.js +319 -26
- package/dist/providers/executor/deferred.d.ts +44 -0
- package/dist/providers/executor/deferred.js +100 -0
- package/dist/providers/executor/in-process.d.ts +9 -1
- package/dist/providers/executor/in-process.js +14 -4
- package/dist/providers/executor/linked-issue-reader.d.ts +16 -0
- package/dist/providers/executor/linked-issue-reader.js +30 -0
- package/dist/providers/executor/routing.d.ts +39 -10
- package/dist/providers/executor/routing.js +77 -32
- package/dist/providers/executor/types.d.ts +25 -0
- package/dist/providers/index.d.ts +2 -1
- package/dist/providers/issue-tracker/types.d.ts +17 -0
- package/dist/providers/issue-tracker/types.js +39 -1
- package/dist/providers/jobs/claude-tool-setup.d.ts +4 -0
- package/dist/providers/jobs/claude-tool-setup.js +5 -2
- package/dist/providers/jobs/docker-isolation.d.ts +8 -0
- package/dist/providers/jobs/docker-isolation.js +17 -0
- package/dist/providers/jobs/docker.d.ts +1 -0
- package/dist/providers/jobs/docker.js +29 -4
- package/dist/providers/jobs/fake-kubernetes-api.d.ts +23 -2
- package/dist/providers/jobs/fake-kubernetes-api.js +45 -1
- package/dist/providers/jobs/kubernetes-api.d.ts +25 -1
- package/dist/providers/jobs/kubernetes-api.js +17 -0
- package/dist/providers/jobs/kubernetes-client.d.ts +10 -1
- package/dist/providers/jobs/kubernetes-client.js +61 -3
- package/dist/providers/jobs/kubernetes-dry-run-fixture.d.ts +6 -1
- package/dist/providers/jobs/kubernetes-dry-run-fixture.js +6 -3
- package/dist/providers/jobs/kubernetes-isolation.d.ts +5 -1
- package/dist/providers/jobs/kubernetes-isolation.js +23 -1
- package/dist/providers/jobs/kubernetes-platform.d.ts +4 -1
- package/dist/providers/jobs/kubernetes-platform.js +38 -1
- package/dist/providers/jobs/kubernetes-preflight.d.ts +2 -1
- package/dist/providers/jobs/kubernetes-preflight.js +4 -2
- package/dist/providers/jobs/kubernetes.d.ts +42 -2
- package/dist/providers/jobs/kubernetes.js +178 -19
- package/dist/providers/jobs/metadata-probes.d.ts +11 -0
- package/dist/providers/jobs/metadata-probes.js +13 -0
- package/dist/providers/jobs/types.d.ts +42 -0
- package/dist/providers/jobs/types.js +13 -1
- package/dist/providers/llm/anthropic.js +5 -1
- package/dist/providers/llm/bedrock.d.ts +0 -12
- package/dist/providers/llm/bedrock.js +4 -0
- package/dist/providers/llm/claude-messages.d.ts +3 -1
- package/dist/providers/llm/claude-messages.js +4 -1
- package/dist/providers/llm/claude-provider.d.ts +2 -2
- package/dist/providers/llm/claude-provider.js +2 -2
- package/dist/providers/llm/openai.d.ts +2 -2
- package/dist/providers/llm/openai.js +6 -2
- package/dist/providers/llm/routing.d.ts +2 -2
- package/dist/providers/llm/routing.js +2 -2
- package/dist/providers/llm/types.d.ts +12 -2
- package/dist/providers/review-host/github-events.d.ts +9 -1
- package/dist/providers/review-host/github-events.js +34 -12
- package/dist/providers/review-host/github.d.ts +39 -2
- package/dist/providers/review-host/github.js +274 -29
- package/dist/providers/review-host/local.d.ts +8 -4
- package/dist/providers/review-host/local.js +49 -31
- package/dist/providers/review-host/patch-pages.d.ts +41 -0
- package/dist/providers/review-host/patch-pages.js +176 -0
- package/dist/providers/review-host/review-format.d.ts +19 -1
- package/dist/providers/review-host/review-format.js +38 -7
- package/dist/providers/review-host/types.d.ts +157 -2
- package/dist/providers/review-host/types.js +8 -0
- package/dist/providers/storage/gcs.d.ts +63 -0
- package/dist/providers/storage/gcs.js +69 -0
- package/dist/providers/storage/index.d.ts +15 -0
- package/dist/providers/storage/index.js +14 -0
- package/dist/providers/storage/local.d.ts +24 -0
- package/dist/providers/storage/local.js +92 -0
- package/dist/providers/storage/meter.d.ts +14 -0
- package/dist/providers/storage/meter.js +34 -0
- package/dist/providers/storage/s3.d.ts +41 -0
- package/dist/providers/storage/s3.js +107 -0
- package/dist/providers/storage/types.d.ts +37 -3
- package/dist/providers/storage/types.js +21 -4
- package/dist/providers/vcs/git.d.ts +33 -2
- package/dist/providers/vcs/git.js +324 -22
- package/dist/providers/vcs/github-remote.d.ts +26 -3
- package/dist/providers/vcs/github-remote.js +124 -14
- package/dist/providers/vcs/github.d.ts +246 -12
- package/dist/providers/vcs/github.js +521 -61
- package/dist/providers/vcs/index.js +8 -1
- package/dist/providers/vcs/pr-description.d.ts +127 -0
- package/dist/providers/vcs/pr-description.js +270 -0
- package/dist/providers/vcs/remote.d.ts +33 -1
- package/dist/providers/vcs/routing.d.ts +4 -2
- package/dist/providers/vcs/routing.js +6 -0
- package/dist/providers/vcs/types.d.ts +80 -3
- package/dist/quickstart/coding-seed.d.ts +21 -3
- package/dist/quickstart/coding-seed.js +283 -3
- package/dist/quickstart/images.d.ts +2 -0
- package/dist/quickstart/images.js +7 -1
- package/dist/quickstart/reviewer-prompt.d.ts +1 -1
- package/dist/quickstart/reviewer-prompt.js +6 -6
- package/dist/quickstart-images.json +1 -1
- package/dist/sandbox/brokered-fetch.d.ts +23 -0
- package/dist/sandbox/brokered-fetch.js +37 -0
- package/dist/sandbox/generated/zod.bundle.js +62 -1
- package/dist/sandbox/generated/zod3.bundle.js +5 -0
- package/dist/sandbox/host-functions.d.ts +35 -0
- package/dist/sandbox/host-functions.js +150 -91
- package/dist/sandbox/prelude.js +7 -1
- package/dist/sandbox/run-in-sandbox.d.ts +19 -0
- package/dist/sandbox/run-in-sandbox.js +28 -10
- package/dist/sandbox/safe-fetch.d.ts +2 -0
- package/dist/sandbox/safe-fetch.js +3 -1
- package/dist/sandbox/secret-broker-sigv4.d.ts +2 -0
- package/dist/sandbox/secret-broker-sigv4.js +49 -0
- package/dist/sandbox/secret-broker.d.ts +34 -0
- package/dist/sandbox/secret-broker.js +161 -0
- package/dist/sandbox/tool-capabilities.d.ts +10 -30
- package/dist/sandbox/user-tool.d.ts +14 -0
- package/dist/sandbox/user-tool.js +32 -0
- package/dist/sandbox/zod-params.d.ts +37 -5
- package/dist/sandbox/zod-params.js +181 -26
- package/dist/serve.js +25 -0
- package/dist/viewer/api-schema.d.ts +372 -2454
- package/dist/viewer/api-schema.js +29 -0
- package/dist/viewer/build-schemas.js +10 -3
- package/dist/viewer/event-bus.d.ts +6 -0
- package/dist/viewer/event-bus.js +16 -7
- package/dist/viewer/graph.d.ts +5 -2
- package/dist/viewer/graph.js +7 -2
- package/dist/viewer/http.d.ts +0 -1
- package/dist/viewer/http.js +2 -2
- package/dist/viewer/infra.js +25 -2
- package/dist/viewer/limits.d.ts +4 -0
- package/dist/viewer/limits.js +4 -0
- package/dist/viewer/openapi.d.ts +15 -0
- package/dist/viewer/openapi.js +170 -0
- package/dist/wardby-bin.js +10 -0
- package/docs/README.md +7 -0
- package/docs/agent-recipes.md +114 -27
- package/docs/architecture-runtime.md +16 -1
- package/docs/code-review-agents.md +689 -45
- package/docs/coding-agent-setup.md +602 -12
- package/docs/coding-packages.md +1037 -92
- package/docs/coding-services.md +30 -13
- package/docs/coding-worker-byo-images.md +218 -6
- package/docs/coding-worker-isolation.md +173 -44
- package/docs/getting-started-gke.md +332 -129
- package/docs/getting-started-identity-provider.md +31 -11
- package/docs/getting-started.md +14 -4
- package/docs/jira-agents.md +22 -9
- package/docs/knowledge/blob-not-found-semantics.md +41 -0
- package/docs/knowledge/bounded-file-descriptor.md +52 -0
- package/docs/knowledge/delegation-admission-slots.md +52 -0
- package/docs/knowledge/http-dispatcher-bootstrap.md +61 -0
- package/docs/knowledge/import-rename-target.md +52 -0
- package/docs/knowledge/index.md +57 -0
- package/docs/knowledge/log.md +9 -0
- package/docs/knowledge/mcp-cancelled-task-precedence.md +41 -0
- package/docs/knowledge/mcp-http-prompt-discovery.md +41 -0
- package/docs/knowledge/mcp-schema-module-boundary.md +41 -0
- package/docs/knowledge/nullable-tool-uniqueness.md +52 -0
- package/docs/knowledge/overview-cli.md +74 -0
- package/docs/knowledge/overview-coding-proxy.md +72 -0
- package/docs/knowledge/overview-coding.md +72 -0
- package/docs/knowledge/overview-config.md +60 -0
- package/docs/knowledge/overview-core.md +72 -0
- package/docs/knowledge/overview-deploy.md +83 -0
- package/docs/knowledge/overview-mcp.md +61 -0
- package/docs/knowledge/overview-prisma.md +72 -0
- package/docs/knowledge/overview-providers.md +89 -0
- package/docs/knowledge/overview-sandbox.md +83 -0
- package/docs/knowledge/overview-surfaces.md +83 -0
- package/docs/knowledge/private-datastore-shared-boundary.md +54 -0
- package/docs/knowledge/proxy-settlement-projections.md +41 -0
- package/docs/knowledge/run-pricing-first-writer.md +43 -0
- package/docs/knowledge/schedule-claim-transaction.md +41 -0
- package/docs/knowledge/secret-entry-replica-contract.md +52 -0
- package/docs/knowledge/terminal-run-first-writer.md +41 -0
- package/docs/knowledge/transactional-agent-authorization.md +52 -0
- package/docs/knowledge/viewer-notify-write-isolation.md +30 -0
- package/docs/knowledge/warm-input-publication.md +30 -0
- package/docs/knowledge/workspace-staging-failure.md +54 -0
- package/docs/knowledge.md +54 -14
- package/docs/native-sandbox.md +731 -0
- package/docs/observability.md +4 -0
- package/docs/release-verification.md +9 -0
- package/docs/security-deployment.md +146 -14
- package/docs/slack-notifications.md +268 -0
- package/docs/tool-secrets.md +284 -0
- package/docs/viewer-api.md +46 -5
- package/docs/viewer-api.openapi.yml +1404 -0
- package/help/admin-viewer.md +29 -3
- package/help/agent-recipes.md +27 -0
- package/help/architecture-agent.md +11 -6
- package/help/brokered-secrets.md +79 -0
- package/help/build-claude-code-image.md +131 -0
- package/help/build-worker-image.md +6 -7
- package/help/builder-agent.md +19 -6
- package/help/code-review-agents.md +243 -10
- package/help/coding-packages.md +156 -6
- package/help/cost-attribution.md +9 -5
- package/help/creating-agents.md +14 -1
- package/help/dependency-cache.md +143 -0
- package/help/deploy-gke.md +23 -9
- package/help/deployment-targets.md +25 -14
- package/help/errors/budget-exhausted.md +187 -0
- package/help/errors/budget-group-exhausted.md +5 -1
- package/help/errors/coding-provider-not-configured.md +2 -2
- package/help/errors/coding-stream-quota-exceeded.md +33 -0
- package/help/errors/coding-workspace-disk-exceeds-limit.md +39 -0
- package/help/errors/continuation-closed.md +9 -12
- package/help/errors/database-auth-invalid.md +28 -0
- package/help/errors/delegation-conflict.md +24 -0
- package/help/errors/file-list-truncated.md +45 -0
- package/help/errors/full-read-required.md +49 -0
- package/help/errors/github-account-not-allowed.md +29 -0
- package/help/errors/graph-incomplete.md +43 -0
- package/help/errors/graph-limit.md +43 -0
- package/help/errors/low-power-disabled.md +29 -0
- package/help/errors/low-power-scale-forbidden.md +35 -0
- package/help/errors/low-power-wake-timeout.md +30 -0
- package/help/errors/merge-conflict.md +49 -0
- package/help/errors/mobile-disabled.md +31 -0
- package/help/errors/native-sandbox-capacity.md +22 -0
- package/help/errors/native-sandbox-deadline-exceeded.md +19 -0
- package/help/errors/native-sandbox-docker-failed.md +20 -0
- package/help/errors/native-sandbox-gateway-error.md +20 -0
- package/help/errors/native-sandbox-gateway-unavailable.md +21 -0
- package/help/errors/native-sandbox-image-not-pinned.md +19 -0
- package/help/errors/native-sandbox-isolation-mismatch.md +20 -0
- package/help/errors/native-sandbox-launch-abandoned.md +21 -0
- package/help/errors/native-sandbox-network-unenforced.md +22 -0
- package/help/errors/native-sandbox-requires-catalog.md +31 -0
- package/help/errors/native-sandbox-unavailable.md +19 -0
- package/help/errors/native-sandbox-warm-delivery-failed.md +21 -0
- package/help/errors/native-sandbox-worker-exited.md +21 -0
- package/help/errors/native-sandbox-worker-lost.md +20 -0
- package/help/errors/native-sandbox-worker-unready.md +22 -0
- package/help/errors/package-not-allowed-pending.md +52 -0
- package/help/errors/package-not-allowed.md +51 -0
- package/help/errors/package-refusals.md +43 -0
- package/help/errors/patch-cursor-malformed.md +31 -0
- package/help/errors/run-lost.md +39 -0
- package/help/errors/run-transcript-download.md +44 -0
- package/help/errors/secret-broker-body-invalid.md +26 -0
- package/help/errors/secret-broker-changed.md +20 -0
- package/help/errors/secret-broker-config-invalid.md +30 -0
- package/help/errors/secret-broker-conflict.md +27 -0
- package/help/errors/secret-broker-destination-denied.md +28 -0
- package/help/errors/secret-broker-value-invalid.md +28 -0
- package/help/errors/secret-brokered.md +24 -0
- package/help/errors/secret-in-value.md +69 -0
- package/help/errors/secret-not-brokered.md +25 -0
- package/help/errors/slack-auth-failed.md +48 -0
- package/help/errors/slack-channel-unreachable.md +39 -0
- package/help/errors/slack-not-configured.md +33 -0
- package/help/errors/target-merge.md +40 -0
- package/help/fix-merge-conflicts.md +73 -0
- package/help/getting-started.md +4 -5
- package/help/github-app-setup.md +132 -0
- package/help/github.md +40 -1
- package/help/identity-and-access.md +7 -1
- package/help/jira.md +23 -6
- package/help/knowledge.md +16 -7
- package/help/local-repositories.md +3 -4
- package/help/low-power-mode.md +131 -0
- package/help/merge-order-check.md +122 -0
- package/help/mobile-app.md +54 -0
- package/help/native-capabilities.md +29 -1
- package/help/native-sandbox.md +150 -0
- package/help/observability.md +8 -0
- package/help/operating-agents.md +5 -0
- package/help/package-audit-mode.md +91 -0
- package/help/related-pull-requests.md +80 -16
- package/help/repo-instructions-and-skills.md +91 -0
- package/help/resume-runs-locally.md +131 -0
- package/help/review-fix-rounds.md +43 -1
- package/help/sharing-agents.md +59 -0
- package/help/slack-notifications.md +76 -0
- package/help/status-comments.md +31 -0
- package/help/stop-run.md +58 -0
- package/help/troubleshooting/budgets.md +28 -0
- package/help/troubleshooting/coding-workers.md +99 -7
- package/package.json +27 -13
- package/prisma/migrations/20261009000003_native_execution_mode/migration.sql +12 -0
- package/prisma/migrations/20261009000004_native_gateway_ledger/migration.sql +65 -0
- package/prisma/migrations/20261009000005_native_gateway_call_child_agent/migration.sql +5 -0
- package/prisma/migrations/20261009000006_run_deferred_start_stop/migration.sql +14 -0
- package/prisma/migrations/20261009000007_native_gateway_network_ready/migration.sql +5 -0
- package/prisma/migrations/20261010000001_workflow_notifications/migration.sql +99 -0
- package/prisma/migrations/20261011000001_native_gateway_session_status_index/migration.sql +2 -0
- package/prisma/migrations/20261012000001_native_warm_worker/migration.sql +32 -0
- package/prisma/migrations/20261013000001_coding_run_merge_order/migration.sql +2 -0
- package/prisma/migrations/20261013000001_secret_broker/migration.sql +17 -0
- package/prisma/migrations/20261013000002_deferred_review_request/migration.sql +4 -0
- package/prisma/migrations/20261014000000_repo_skills/migration.sql +15 -0
- package/prisma/migrations/20261015000001_coding_run_merge_order_index/migration.sql +2 -0
- package/prisma/migrations/20261015000002_no_change_rereview/migration.sql +2 -0
- package/prisma/migrations/20261016000000_registry_approved_accepted_advisories/migration.sql +3 -0
- package/prisma/migrations/20261016000001_mark_ready_when_passing/migration.sql +3 -0
- package/prisma/migrations/20261017000000_debug_trace_max_mb/migration.sql +4 -0
- package/prisma/migrations/20261018000000_dependency_cache/migration.sql +53 -0
- package/prisma/migrations/20261019000000_claude_max_output_tokens/migration.sql +5 -0
- package/prisma/migrations/20261021000000_pr_description_hash/migration.sql +4 -0
- package/prisma/migrations/20261022000000_dependency_snapshot_validation_metadata/migration.sql +4 -0
- package/prisma/migrations/20261023000000_package_audit_mode/migration.sql +27 -0
- package/prisma/migrations/20261024000000_budget_events/migration.sql +26 -0
- package/prisma/migrations/20261025000000_cache_aware_holds/migration.sql +9 -0
- package/prisma/migrations/20261026000000_budget_overrun/migration.sql +4 -0
- package/prisma/migrations/20261027000000_coding_run_request/migration.sql +1 -0
- package/prisma/migrations/20261028000000_native_gateway_review_reads/migration.sql +6 -0
- package/prisma/migrations/20261029000000_lead_survives_deploy/migration.sql +6 -0
- package/prisma/migrations/20261030000000_local_review_covered_sha/migration.sql +2 -0
- package/prisma/migrations/20261031000000_coding_run_budget_limit/migration.sql +9 -0
- package/prisma/migrations/20261101000000_run_transcripts/migration.sql +22 -0
- package/prisma/schema.prisma +631 -146
- package/dist/sandbox/generated/zod-to-json-schema.bundle.js +0 -5
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/** A tracker read for a continuation's task must not hold up its launch. */
|
|
2
|
+
const TRACKER_READ_TIMEOUT_MS = 10_000;
|
|
3
|
+
/**
|
|
4
|
+
* The executor's readLinkedIssue: a GitHub issue through the review host's
|
|
5
|
+
* issue read (the App's installation token for the run's repository), a Jira
|
|
6
|
+
* issue through the configured tracker. Null when the number is a pull
|
|
7
|
+
* request, the issue is missing, or no host or tracker is configured.
|
|
8
|
+
*/
|
|
9
|
+
export function linkedIssueReader(deps) {
|
|
10
|
+
return async (ref) => {
|
|
11
|
+
if (ref.provider === "github") {
|
|
12
|
+
const host = deps.hosts.github;
|
|
13
|
+
if (!host?.readIssue)
|
|
14
|
+
return null;
|
|
15
|
+
// Title and body only: the task carries the ticket, not its discussion.
|
|
16
|
+
const result = await host.readIssue(ref.repository, ref.number, { comments: false });
|
|
17
|
+
return result.kind === "issue" ? { title: result.title, body: result.body } : null;
|
|
18
|
+
}
|
|
19
|
+
const tracker = deps.issueTrackers.jira;
|
|
20
|
+
if (!tracker)
|
|
21
|
+
return null;
|
|
22
|
+
const view = await tracker.getIssue(ref.key, {
|
|
23
|
+
maxComments: 0,
|
|
24
|
+
agentMarker: "",
|
|
25
|
+
timeoutMs: TRACKER_READ_TIMEOUT_MS,
|
|
26
|
+
retryOn429: false,
|
|
27
|
+
});
|
|
28
|
+
return { title: view.summary, body: view.description };
|
|
29
|
+
};
|
|
30
|
+
}
|
|
@@ -1,25 +1,51 @@
|
|
|
1
|
-
import type { CodingImageSelector, Executor, ExecutionRecoveryResult, PersistedExecutionHandle } from "./types.js";
|
|
2
1
|
import type { CodingProvider } from "../../coding/provider.js";
|
|
2
|
+
import type { CodingImageSelector, Executor, ExecutionRecoveryResult, PersistedExecutionHandle } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Which executor owns a run: a coding run, a native run in the control plane
|
|
5
|
+
* (in-process or DBOS), or a native run in an isolated sandbox worker. Read
|
|
6
|
+
* from the run's own row (agent kind plus Run.nativeExecutionMode), never from
|
|
7
|
+
* the agent's current setting, so a setting change reaches only later runs.
|
|
8
|
+
*/
|
|
9
|
+
export type ExecutionTarget = "native" | "native-sandbox" | "coding";
|
|
3
10
|
export interface ExecutionKindResolver {
|
|
4
|
-
kindForRun(runId: string): Promise<
|
|
11
|
+
kindForRun(runId: string): Promise<ExecutionTarget | null>;
|
|
5
12
|
}
|
|
6
|
-
/**
|
|
13
|
+
/**
|
|
14
|
+
* Keeps native execution unchanged while routing coding runs to isolation and
|
|
15
|
+
* sandbox-mode native runs to the native sandbox executor.
|
|
16
|
+
*
|
|
17
|
+
* With no sandbox executor composed in, a sandbox run goes to the native
|
|
18
|
+
* executor, whose runner refuses to execute it (executeRun fails it before
|
|
19
|
+
* any spend, closing its host check and status comments): fail closed through
|
|
20
|
+
* the one path that already finishes a run properly, never a silent run in
|
|
21
|
+
* the control plane.
|
|
22
|
+
*/
|
|
7
23
|
export declare class RoutingExecutor implements Executor {
|
|
8
24
|
private readonly resolver;
|
|
9
25
|
private readonly native;
|
|
10
26
|
private readonly coding;
|
|
11
|
-
|
|
27
|
+
private readonly sandbox?;
|
|
28
|
+
constructor(resolver: ExecutionKindResolver, native: Executor, coding: Executor, sandbox?: Executor | undefined);
|
|
29
|
+
private route;
|
|
12
30
|
start(runId: string): Promise<void>;
|
|
13
31
|
stop(runId: string, reason?: string): Promise<void>;
|
|
14
32
|
/**
|
|
15
|
-
* Recovery is routed by the run's
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* handle backend would need this class to know every
|
|
33
|
+
* Recovery is routed by the run's target, exactly like start/stop: a native
|
|
34
|
+
* run's handle belongs to the native executor (e.g. a DBOS workflow handle),
|
|
35
|
+
* a sandbox run's to the sandbox executor, a coding run's to the container
|
|
36
|
+
* executor. Routing by handle backend would need this class to know every
|
|
37
|
+
* backend name.
|
|
19
38
|
*/
|
|
20
39
|
recover(handle: PersistedExecutionHandle): Promise<ExecutionRecoveryResult>;
|
|
21
|
-
/**
|
|
40
|
+
/** Only coding runs wait in the coding queue, so only the coding executor is asked. */
|
|
41
|
+
cleanupQueueTimeout(runId: string): Promise<void>;
|
|
42
|
+
/** Each distinct executor once, in a fixed order: native, coding, sandbox. */
|
|
43
|
+
private distinct;
|
|
44
|
+
/** Lifecycle fans out to every distinct executor; each hook is optional on the seam. */
|
|
22
45
|
launch(): Promise<void>;
|
|
46
|
+
/** Fans out like `launch`. */
|
|
47
|
+
warmUp(): Promise<void>;
|
|
48
|
+
/** Reverse of `launch`. */
|
|
23
49
|
close(): Promise<void>;
|
|
24
50
|
resolveCodingWorkerImage(selector: CodingImageSelector): string;
|
|
25
51
|
resolveCodingToolImage(selector: CodingImageSelector): string | null;
|
|
@@ -33,6 +59,7 @@ export declare class RoutingExecutor implements Executor {
|
|
|
33
59
|
path: string;
|
|
34
60
|
maxBytes: number;
|
|
35
61
|
}): Promise<string | null>;
|
|
62
|
+
supportsNativeSandbox(): boolean;
|
|
36
63
|
supportsCodingServices(provider: CodingProvider): boolean;
|
|
37
64
|
}
|
|
38
65
|
export declare class PrismaExecutionKindResolver implements ExecutionKindResolver {
|
|
@@ -44,6 +71,7 @@ export declare class PrismaExecutionKindResolver implements ExecutionKindResolve
|
|
|
44
71
|
id: string;
|
|
45
72
|
};
|
|
46
73
|
select: {
|
|
74
|
+
nativeExecutionMode: true;
|
|
47
75
|
agent: {
|
|
48
76
|
select: {
|
|
49
77
|
kind: true;
|
|
@@ -51,11 +79,12 @@ export declare class PrismaExecutionKindResolver implements ExecutionKindResolve
|
|
|
51
79
|
};
|
|
52
80
|
};
|
|
53
81
|
}): Promise<{
|
|
82
|
+
nativeExecutionMode: string | null;
|
|
54
83
|
agent: {
|
|
55
84
|
kind: string;
|
|
56
85
|
};
|
|
57
86
|
} | null>;
|
|
58
87
|
};
|
|
59
88
|
});
|
|
60
|
-
kindForRun(runId: string): Promise<
|
|
89
|
+
kindForRun(runId: string): Promise<ExecutionTarget | null>;
|
|
61
90
|
}
|
|
@@ -1,53 +1,90 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* Keeps native execution unchanged while routing coding runs to isolation and
|
|
3
|
+
* sandbox-mode native runs to the native sandbox executor.
|
|
4
|
+
*
|
|
5
|
+
* With no sandbox executor composed in, a sandbox run goes to the native
|
|
6
|
+
* executor, whose runner refuses to execute it (executeRun fails it before
|
|
7
|
+
* any spend, closing its host check and status comments): fail closed through
|
|
8
|
+
* the one path that already finishes a run properly, never a silent run in
|
|
9
|
+
* the control plane.
|
|
10
|
+
*/
|
|
2
11
|
export class RoutingExecutor {
|
|
3
12
|
resolver;
|
|
4
13
|
native;
|
|
5
14
|
coding;
|
|
6
|
-
|
|
15
|
+
sandbox;
|
|
16
|
+
constructor(resolver, native, coding, sandbox) {
|
|
7
17
|
this.resolver = resolver;
|
|
8
18
|
this.native = native;
|
|
9
19
|
this.coding = coding;
|
|
20
|
+
this.sandbox = sandbox;
|
|
21
|
+
}
|
|
22
|
+
async route(runId) {
|
|
23
|
+
const target = await this.resolver.kindForRun(runId);
|
|
24
|
+
if (target === "native")
|
|
25
|
+
return { target, executor: this.native };
|
|
26
|
+
if (target === "native-sandbox")
|
|
27
|
+
return { target, executor: this.sandbox ?? this.native };
|
|
28
|
+
if (target === "coding")
|
|
29
|
+
return { target, executor: this.coding };
|
|
30
|
+
return null;
|
|
10
31
|
}
|
|
11
32
|
async start(runId) {
|
|
12
|
-
const
|
|
13
|
-
if (
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
return this.coding.start(runId);
|
|
17
|
-
throw new Error("executor_run_not_found");
|
|
33
|
+
const routed = await this.route(runId);
|
|
34
|
+
if (!routed)
|
|
35
|
+
throw new Error("executor_run_not_found");
|
|
36
|
+
return routed.executor.start(runId);
|
|
18
37
|
}
|
|
19
38
|
async stop(runId, reason) {
|
|
20
|
-
const
|
|
21
|
-
if (
|
|
22
|
-
return
|
|
23
|
-
if (kind === "coding")
|
|
24
|
-
return this.coding.stop(runId, reason);
|
|
39
|
+
const routed = await this.route(runId);
|
|
40
|
+
if (routed)
|
|
41
|
+
return routed.executor.stop(runId, reason);
|
|
25
42
|
}
|
|
26
43
|
/**
|
|
27
|
-
* Recovery is routed by the run's
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* handle backend would need this class to know every
|
|
44
|
+
* Recovery is routed by the run's target, exactly like start/stop: a native
|
|
45
|
+
* run's handle belongs to the native executor (e.g. a DBOS workflow handle),
|
|
46
|
+
* a sandbox run's to the sandbox executor, a coding run's to the container
|
|
47
|
+
* executor. Routing by handle backend would need this class to know every
|
|
48
|
+
* backend name.
|
|
31
49
|
*/
|
|
32
50
|
async recover(handle) {
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
51
|
+
const routed = await this.route(handle.runId);
|
|
52
|
+
const target = routed?.target ?? "coding";
|
|
53
|
+
const executor = routed?.executor ?? this.coding;
|
|
54
|
+
if (!executor.recover) {
|
|
55
|
+
const reason = target === "native"
|
|
56
|
+
? "native_recovery_unavailable"
|
|
57
|
+
: target === "native-sandbox" && this.sandbox
|
|
58
|
+
? "native_sandbox_recovery_unavailable"
|
|
59
|
+
: target === "native-sandbox"
|
|
60
|
+
? "native_recovery_unavailable"
|
|
61
|
+
: "coding_recovery_unavailable";
|
|
62
|
+
return { state: "lost", reason };
|
|
38
63
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
64
|
+
return executor.recover(handle);
|
|
65
|
+
}
|
|
66
|
+
/** Only coding runs wait in the coding queue, so only the coding executor is asked. */
|
|
67
|
+
async cleanupQueueTimeout(runId) {
|
|
68
|
+
await this.coding.cleanupQueueTimeout?.(runId);
|
|
69
|
+
}
|
|
70
|
+
/** Each distinct executor once, in a fixed order: native, coding, sandbox. */
|
|
71
|
+
distinct() {
|
|
72
|
+
return [this.native, this.coding, this.sandbox].filter((executor, index, all) => executor !== undefined && all.indexOf(executor) === index);
|
|
42
73
|
}
|
|
43
|
-
/** Lifecycle fans out to
|
|
74
|
+
/** Lifecycle fans out to every distinct executor; each hook is optional on the seam. */
|
|
44
75
|
async launch() {
|
|
45
|
-
|
|
46
|
-
|
|
76
|
+
for (const executor of this.distinct())
|
|
77
|
+
await executor.launch?.();
|
|
47
78
|
}
|
|
79
|
+
/** Fans out like `launch`. */
|
|
80
|
+
async warmUp() {
|
|
81
|
+
for (const executor of this.distinct())
|
|
82
|
+
await executor.warmUp?.();
|
|
83
|
+
}
|
|
84
|
+
/** Reverse of `launch`. */
|
|
48
85
|
async close() {
|
|
49
|
-
|
|
50
|
-
|
|
86
|
+
for (const executor of this.distinct().reverse())
|
|
87
|
+
await executor.close?.();
|
|
51
88
|
}
|
|
52
89
|
resolveCodingWorkerImage(selector) {
|
|
53
90
|
if (!this.coding.resolveCodingWorkerImage)
|
|
@@ -69,6 +106,9 @@ export class RoutingExecutor {
|
|
|
69
106
|
return null;
|
|
70
107
|
return this.coding.readCodingRepositoryFile(input);
|
|
71
108
|
}
|
|
109
|
+
supportsNativeSandbox() {
|
|
110
|
+
return this.sandbox !== undefined;
|
|
111
|
+
}
|
|
72
112
|
supportsCodingServices(provider) {
|
|
73
113
|
return this.coding.supportsCodingServices?.(provider) === true;
|
|
74
114
|
}
|
|
@@ -81,8 +121,13 @@ export class PrismaExecutionKindResolver {
|
|
|
81
121
|
async kindForRun(runId) {
|
|
82
122
|
const run = await this.db.run.findUnique({
|
|
83
123
|
where: { id: runId },
|
|
84
|
-
select: { agent: { select: { kind: true } } },
|
|
124
|
+
select: { nativeExecutionMode: true, agent: { select: { kind: true } } },
|
|
85
125
|
});
|
|
86
|
-
|
|
126
|
+
if (run?.agent.kind === "coding")
|
|
127
|
+
return "coding";
|
|
128
|
+
if (run?.agent.kind !== "native")
|
|
129
|
+
return null;
|
|
130
|
+
// Null = a run from before the snapshot existed: the control plane, as it always ran.
|
|
131
|
+
return run.nativeExecutionMode === "sandbox" ? "native-sandbox" : "native";
|
|
87
132
|
}
|
|
88
133
|
}
|
|
@@ -35,6 +35,14 @@ export interface Executor {
|
|
|
35
35
|
* terminal Run persistence completed. Recovery must never relaunch a job.
|
|
36
36
|
*/
|
|
37
37
|
recover?: (handle: PersistedExecutionHandle) => Promise<ExecutionRecoveryResult>;
|
|
38
|
+
/**
|
|
39
|
+
* Called by drainCodingQueue for each queued coding run it failed with coding_queue_timeout, after
|
|
40
|
+
* that write: releases what an earlier attempt of the run left (a launch the backend refused for
|
|
41
|
+
* capacity), such as a continuation's in-progress host signal and its input artifact. Best effort;
|
|
42
|
+
* a throw is logged by the caller. Optional: an executor that never leaves a queued run anything
|
|
43
|
+
* to release omits it.
|
|
44
|
+
*/
|
|
45
|
+
cleanupQueueTimeout?: (runId: string) => Promise<void>;
|
|
38
46
|
/**
|
|
39
47
|
* Optional one-time startup. A durable backend connects and re-drives the
|
|
40
48
|
* workflows it owned before the last restart. Composition roots call it
|
|
@@ -43,6 +51,13 @@ export interface Executor {
|
|
|
43
51
|
launch?: () => Promise<void>;
|
|
44
52
|
/** Optional graceful shutdown counterpart to `launch`. */
|
|
45
53
|
close?: () => Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Fire-and-forget start-up warm-up, called only from a long-running server process's own
|
|
56
|
+
* start-up (`wardby serve`, the MCP server, `wardby scheduler`) — never from a one-shot CLI
|
|
57
|
+
* command. Delegates to the coding job launcher's own `warmUp` (e.g. Kubernetes's memoized
|
|
58
|
+
* cluster preflight); never throws.
|
|
59
|
+
*/
|
|
60
|
+
warmUp?: () => Promise<void>;
|
|
46
61
|
/**
|
|
47
62
|
* Resolves a coding agent's profile selection to an immutable worker
|
|
48
63
|
* image digest, once, at dispatch time (src/core/dispatch.ts) — never
|
|
@@ -85,5 +100,15 @@ export interface Executor {
|
|
|
85
100
|
* says so (Kubernetes and Docker, for Codex and Claude Code).
|
|
86
101
|
*/
|
|
87
102
|
supportsCodingServices?(provider: CodingProvider): boolean;
|
|
103
|
+
/**
|
|
104
|
+
* Whether this executor can run sandbox-mode native runs (a native sandbox executor is composed
|
|
105
|
+
* in). MCP refuses to set an agent to sandbox mode where it cannot (docs/native-sandbox.md).
|
|
106
|
+
*/
|
|
107
|
+
supportsNativeSandbox?(): boolean;
|
|
108
|
+
/**
|
|
109
|
+
* true: this executor cannot resolve coding inputs; dispatch records the coding run unresolved
|
|
110
|
+
* and the process that starts it resolves them (resolveDeferredCodingRun).
|
|
111
|
+
*/
|
|
112
|
+
defersCodingResolution?: boolean;
|
|
88
113
|
}
|
|
89
114
|
import type { CodingProvider } from "../../coding/provider.js";
|
|
@@ -34,7 +34,8 @@ export interface ProviderRegistry {
|
|
|
34
34
|
llm: LlmProvider;
|
|
35
35
|
secrets: SecretCipher;
|
|
36
36
|
auth: AuthProvider;
|
|
37
|
-
|
|
37
|
+
/** Absent unless BLOB_STORE is configured. */
|
|
38
|
+
storage?: BlobStore;
|
|
38
39
|
executor: Executor;
|
|
39
40
|
datastore: Datastore;
|
|
40
41
|
memory: AgentMemoryStore;
|
|
@@ -264,6 +264,23 @@ export interface IssueEvent {
|
|
|
264
264
|
}
|
|
265
265
|
/** Shared by the ingress and the tools: a Jira issue key, e.g. PROJ-123. */
|
|
266
266
|
export declare const ISSUE_KEY: RegExp;
|
|
267
|
+
/** A GitHub issue's recorded key (githubIssueKey): "<owner>/<repo>#<number>", the repository normalised to lowercase. */
|
|
268
|
+
export declare const GITHUB_ISSUE_KEY: RegExp;
|
|
269
|
+
/** The product name of each system an issue can be recorded from (CodingRun / IssuePullRequest issueProvider). */
|
|
270
|
+
export declare const ISSUE_SOURCE_NAMES: Readonly<Record<string, string>>;
|
|
271
|
+
/**
|
|
272
|
+
* A recorded issue (CodingRun / IssuePullRequest issueProvider + issueKey) as
|
|
273
|
+
* people see it: the key re-validated for its provider, the system's name and
|
|
274
|
+
* the issue's page. A GitHub issue's page comes from its key; a tracker
|
|
275
|
+
* issue's from `trackerUrl` (the tracker's issueUrl), dropped when it throws
|
|
276
|
+
* or is not https. Undefined for an unknown provider or a malformed key.
|
|
277
|
+
*/
|
|
278
|
+
export declare function issueReference(provider: string, key: string, trackerUrl?: (key: string) => string | undefined): {
|
|
279
|
+
key: string;
|
|
280
|
+
url?: string;
|
|
281
|
+
trackerName: string;
|
|
282
|
+
} | undefined;
|
|
267
283
|
/** A Jira project key. */
|
|
268
284
|
export declare const PROJECT_KEY: RegExp;
|
|
285
|
+
/** An issue key's project: a Jira key's project key ("PROJ-123" → "PROJ"); a GitHub issue key's repository ("owner/repo#5" → "owner/repo"). */
|
|
269
286
|
export declare const projectOf: (issueKey: string) => string;
|
|
@@ -11,6 +11,44 @@ export class IssueTrackerError extends Error {
|
|
|
11
11
|
}
|
|
12
12
|
/** Shared by the ingress and the tools: a Jira issue key, e.g. PROJ-123. */
|
|
13
13
|
export const ISSUE_KEY = /^[A-Z][A-Z0-9_]{0,254}-[1-9]\d{0,9}$/;
|
|
14
|
+
/** A GitHub issue's recorded key (githubIssueKey): "<owner>/<repo>#<number>", the repository normalised to lowercase. */
|
|
15
|
+
export const GITHUB_ISSUE_KEY = /^[a-z0-9](?:[a-z0-9-]{0,37}[a-z0-9])?\/[a-z0-9._-]{1,100}#[1-9]\d{0,9}$/;
|
|
16
|
+
/** The product name of each system an issue can be recorded from (CodingRun / IssuePullRequest issueProvider). */
|
|
17
|
+
export const ISSUE_SOURCE_NAMES = { ...ISSUE_TRACKER_NAMES, github: "GitHub" };
|
|
18
|
+
/**
|
|
19
|
+
* A recorded issue (CodingRun / IssuePullRequest issueProvider + issueKey) as
|
|
20
|
+
* people see it: the key re-validated for its provider, the system's name and
|
|
21
|
+
* the issue's page. A GitHub issue's page comes from its key; a tracker
|
|
22
|
+
* issue's from `trackerUrl` (the tracker's issueUrl), dropped when it throws
|
|
23
|
+
* or is not https. Undefined for an unknown provider or a malformed key.
|
|
24
|
+
*/
|
|
25
|
+
export function issueReference(provider, key, trackerUrl) {
|
|
26
|
+
let url;
|
|
27
|
+
if (provider === "github") {
|
|
28
|
+
if (!GITHUB_ISSUE_KEY.test(key))
|
|
29
|
+
return undefined;
|
|
30
|
+
const hash = key.lastIndexOf("#");
|
|
31
|
+
url = `https://github.com/${key.slice(0, hash)}/issues/${key.slice(hash + 1)}`;
|
|
32
|
+
}
|
|
33
|
+
else if (provider === "jira") {
|
|
34
|
+
if (!ISSUE_KEY.test(key))
|
|
35
|
+
return undefined;
|
|
36
|
+
try {
|
|
37
|
+
url = trackerUrl?.(key);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
url = undefined;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
return { key, ...(url?.startsWith("https://") ? { url } : {}), trackerName: ISSUE_SOURCE_NAMES[provider] };
|
|
47
|
+
}
|
|
14
48
|
/** A Jira project key. */
|
|
15
49
|
export const PROJECT_KEY = /^[A-Z][A-Z0-9_]{0,254}$/;
|
|
16
|
-
|
|
50
|
+
/** An issue key's project: a Jira key's project key ("PROJ-123" → "PROJ"); a GitHub issue key's repository ("owner/repo#5" → "owner/repo"). */
|
|
51
|
+
export const projectOf = (issueKey) => {
|
|
52
|
+
const hash = issueKey.lastIndexOf("#");
|
|
53
|
+
return issueKey.slice(0, hash >= 0 ? hash : issueKey.lastIndexOf("-"));
|
|
54
|
+
};
|
|
@@ -19,5 +19,9 @@ export interface ClaudeToolSetup {
|
|
|
19
19
|
content: string;
|
|
20
20
|
mode: number;
|
|
21
21
|
}[];
|
|
22
|
+
/** Present only when the run's dependency cache is on, so older tool runners see an unchanged setup. */
|
|
23
|
+
dependencyCache?: true;
|
|
24
|
+
/** With dependencyCache only: the workspace volume size (limits.diskMb) the cache must stay inside. */
|
|
25
|
+
diskMb?: number;
|
|
22
26
|
}
|
|
23
27
|
export declare function claudeToolSetup(spec: JobSpec, capability: string): string;
|
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
* What Claude Code's tool runner (the credential-free container that runs commands in the
|
|
3
3
|
* repository) needs from the trusted launcher: the package-registry settings every Codex shell
|
|
4
4
|
* gets, built from the run's registry-only token (deriveRegistryToken, never the capability), and
|
|
5
|
-
* the run's service test variables
|
|
6
|
-
*
|
|
5
|
+
* the run's service test variables, and whether the run's dependency cache is on. Delivered as the
|
|
6
|
+
* WARDBY_TOOL_SETUP environment variable (CLAUDE_TOOL_SETUP_ENV, docker-isolation.ts; a test keeps it
|
|
7
|
+
* equal to the tool runner's TOOL_SETUP_ENV): a Kubernetes Secret key, or `docker create --env NAME`
|
|
8
|
+
* with the value in the CLI's own environment.
|
|
7
9
|
*/
|
|
8
10
|
import { serviceEnvironment } from "../../coding-worker/driver.js";
|
|
9
11
|
import { registryWorkerSetup } from "../../coding/registry/worker-config.js";
|
|
@@ -35,6 +37,7 @@ export function claudeToolSetup(spec, capability) {
|
|
|
35
37
|
// Same precedence as the Codex driver: the registry's own settings win over a service's.
|
|
36
38
|
env: { ...serviceEnvironment(spec.services), ...registry.env },
|
|
37
39
|
files: registry.files,
|
|
40
|
+
...(spec.dependencyCache ? { dependencyCache: true, diskMb: spec.limits.diskMb } : {}),
|
|
38
41
|
};
|
|
39
42
|
const raw = JSON.stringify(setup);
|
|
40
43
|
const limits = CLAUDE_TOOL_SETUP_LIMITS;
|
|
@@ -25,6 +25,14 @@ export declare const CLAUDE_TOOL_SETUP_ENV = "WARDBY_TOOL_SETUP";
|
|
|
25
25
|
export declare const CODING_PROXY_DENY_PORT = 8788;
|
|
26
26
|
export declare const DOCKER_ISOLATION_ERROR = "docker_isolation_unsupported";
|
|
27
27
|
export declare const WORKER_STOP_GRACE_SECONDS = 10;
|
|
28
|
+
/** The Claude worker's SDK config dir (claude-coding-worker/driver.ts CLAUDE_CONFIG_DIR). */
|
|
29
|
+
export declare const CLAUDE_CONFIG_PATH = "/tmp/claude-config";
|
|
30
|
+
/**
|
|
31
|
+
* Its own memory-backed scratch on a session-resume run: room for a session file up to the largest the
|
|
32
|
+
* control plane reads (coding/protocol.ts MAX_RAW_TRANSCRIPT_BYTES, 64 MiB) plus the SDK's small config
|
|
33
|
+
* files. Past it the SDK's writes there fail with ENOSPC, as /tmp's would; /tmp itself keeps its room.
|
|
34
|
+
*/
|
|
35
|
+
export declare const CLAUDE_CONFIG_SCRATCH_MIB = 80;
|
|
28
36
|
export declare const WORKER_PATHS: {
|
|
29
37
|
readonly workspace: "/workspace";
|
|
30
38
|
readonly git: "/workspace/.git";
|
|
@@ -28,6 +28,14 @@ export const CLAUDE_TOOL_SETUP_ENV = "WARDBY_TOOL_SETUP";
|
|
|
28
28
|
export const CODING_PROXY_DENY_PORT = 8788;
|
|
29
29
|
export const DOCKER_ISOLATION_ERROR = "docker_isolation_unsupported";
|
|
30
30
|
export const WORKER_STOP_GRACE_SECONDS = 10;
|
|
31
|
+
/** The Claude worker's SDK config dir (claude-coding-worker/driver.ts CLAUDE_CONFIG_DIR). */
|
|
32
|
+
export const CLAUDE_CONFIG_PATH = "/tmp/claude-config";
|
|
33
|
+
/**
|
|
34
|
+
* Its own memory-backed scratch on a session-resume run: room for a session file up to the largest the
|
|
35
|
+
* control plane reads (coding/protocol.ts MAX_RAW_TRANSCRIPT_BYTES, 64 MiB) plus the SDK's small config
|
|
36
|
+
* files. Past it the SDK's writes there fail with ENOSPC, as /tmp's would; /tmp itself keeps its room.
|
|
37
|
+
*/
|
|
38
|
+
export const CLAUDE_CONFIG_SCRATCH_MIB = 80;
|
|
31
39
|
export const WORKER_PATHS = {
|
|
32
40
|
workspace: "/workspace",
|
|
33
41
|
git: "/workspace/.git",
|
|
@@ -90,6 +98,9 @@ function validateSpec(spec) {
|
|
|
90
98
|
else if (spec.toolImage !== undefined) {
|
|
91
99
|
throw isolationError();
|
|
92
100
|
}
|
|
101
|
+
if (spec.sessionResume !== undefined && (spec.sessionResume !== true || spec.provider !== "claude-code")) {
|
|
102
|
+
throw isolationError();
|
|
103
|
+
}
|
|
93
104
|
if (spec.services !== undefined) {
|
|
94
105
|
// docker-services.ts re-validates every entry against the catalog schema. Both providers' shells
|
|
95
106
|
// share the network keeper's namespace: Codex's worker, and Claude Code's tool runner.
|
|
@@ -432,6 +443,12 @@ export function buildClaudeAgentCreateArgs(spec, proxyPort = CODING_PROXY_PORT)
|
|
|
432
443
|
`/tmp:rw,noexec,nosuid,nodev,size=${scratchMb}m,mode=1777`,
|
|
433
444
|
"--tmpfs",
|
|
434
445
|
`/home/wardby:rw,noexec,nosuid,nodev,size=${scratchMb}m,uid=${CODING_WORKER_UID},gid=${CODING_WORKER_GID},mode=0700`,
|
|
446
|
+
...(spec.sessionResume
|
|
447
|
+
? [
|
|
448
|
+
"--tmpfs",
|
|
449
|
+
`${CLAUDE_CONFIG_PATH}:rw,noexec,nosuid,nodev,size=${CLAUDE_CONFIG_SCRATCH_MIB}m,uid=${CODING_WORKER_UID},gid=${CODING_WORKER_GID},mode=0700`,
|
|
450
|
+
]
|
|
451
|
+
: []),
|
|
435
452
|
"--mount",
|
|
436
453
|
`type=volume,src=${names.storageVolume},dst=${WORKER_PATHS.input},volume-subpath=input,volume-nocopy,readonly`,
|
|
437
454
|
"--mount",
|
|
@@ -164,6 +164,7 @@ export declare class DockerJobLauncher implements WorkspaceJobLauncher {
|
|
|
164
164
|
private removeNetworkIfAttested;
|
|
165
165
|
private removeVolumeIfAttested;
|
|
166
166
|
private seedRun;
|
|
167
|
+
readTranscript(handle: JobHandle, maxBytes: number): Promise<string | undefined>;
|
|
167
168
|
private readResultArtifact;
|
|
168
169
|
private readWorkerFailureDiagnostic;
|
|
169
170
|
private keeperName;
|
|
@@ -7,7 +7,7 @@ import { dirname, isAbsolute, join, resolve, sep } from "node:path";
|
|
|
7
7
|
import { logger } from "../../core/logger.js";
|
|
8
8
|
import { ensurePrivateDirectory } from "../../core/private-directory.js";
|
|
9
9
|
import { readBoundedRegularFile } from "../../coding-worker/artifact.js";
|
|
10
|
-
import {
|
|
10
|
+
import { parseCodingWorkerOutputJson, redactAndTruncate, MAX_CODING_ARTIFACT_BYTES, MAX_CODING_INPUT_BYTES, MAX_CODING_OUTPUT_ISSUES, SAFE_CODING_OUTPUT_ISSUE, } from "../../coding/protocol.js";
|
|
11
11
|
import { assertDockerHostSupportsIsolation, assertClaudeAgentContainerInspection, assertClaudeToolRunnerContainerInspection, assertIsolationNetworkInspection, assertKeeperContainerInspection, assertNetworkKeeperContainerInspection, assertProxyContainerInspection, assertStorageVolumeInspection, assertWorkerContainerInspection, buildDockerIsolationPlan, CLAUDE_TOOL_SETUP_ENV, dockerSupportsServicesFor, } from "./docker-isolation.js";
|
|
12
12
|
import { serviceUnreadyError } from "../../coding/services/wording.js";
|
|
13
13
|
import { assertServiceContainerInspection, buildDockerServicePlan, dockerServiceContainerNames, } from "./docker-services.js";
|
|
@@ -272,7 +272,7 @@ export class NodeDockerArtifactTransfer {
|
|
|
272
272
|
}
|
|
273
273
|
async seedInput(sourceFile, container) {
|
|
274
274
|
const metadata = await lstat(sourceFile);
|
|
275
|
-
if (!metadata.isFile() || metadata.isSymbolicLink() || metadata.size >
|
|
275
|
+
if (!metadata.isFile() || metadata.isSymbolicLink() || metadata.size > MAX_CODING_INPUT_BYTES) {
|
|
276
276
|
throw new Error("docker_input_artifact_invalid");
|
|
277
277
|
}
|
|
278
278
|
const docker = new NodeDockerCommandRunner({
|
|
@@ -1067,13 +1067,38 @@ export class DockerJobLauncher {
|
|
|
1067
1067
|
await this.transfer.seedDirectory(resolve(runRoot, "git"), keeper, "/run/wardby/storage/git");
|
|
1068
1068
|
await this.transfer.seedInput(record.spec.inputArtifact, keeper);
|
|
1069
1069
|
}
|
|
1070
|
+
async readTranscript(handle, maxBytes) {
|
|
1071
|
+
await this.ready;
|
|
1072
|
+
const record = await this.findRecord(handle);
|
|
1073
|
+
if (!record)
|
|
1074
|
+
return undefined;
|
|
1075
|
+
const staging = await mkdtemp(join(this.stateRoot, ".wardby-transcript-"));
|
|
1076
|
+
const target = join(staging, "session.jsonl");
|
|
1077
|
+
try {
|
|
1078
|
+
try {
|
|
1079
|
+
await this.run([
|
|
1080
|
+
"container",
|
|
1081
|
+
"cp",
|
|
1082
|
+
`${this.keeperName(record)}:/run/wardby/storage/output/session.jsonl`,
|
|
1083
|
+
target,
|
|
1084
|
+
]);
|
|
1085
|
+
}
|
|
1086
|
+
catch {
|
|
1087
|
+
return undefined;
|
|
1088
|
+
}
|
|
1089
|
+
return await readBoundedRegularFile(target, maxBytes, "transcript_too_large");
|
|
1090
|
+
}
|
|
1091
|
+
finally {
|
|
1092
|
+
await rm(staging, { recursive: true, force: true });
|
|
1093
|
+
}
|
|
1094
|
+
}
|
|
1070
1095
|
async readResultArtifact(record) {
|
|
1071
1096
|
const staging = await mkdtemp(join(this.stateRoot, ".wardby-result-"));
|
|
1072
1097
|
const target = join(staging, "result.json");
|
|
1073
1098
|
try {
|
|
1074
1099
|
await this.run(["container", "cp", `${this.keeperName(record)}:/run/wardby/storage/output/result.json`, target]);
|
|
1075
1100
|
const raw = await readBoundedRegularFile(target, MAX_CODING_ARTIFACT_BYTES, "docker_result_artifact_invalid");
|
|
1076
|
-
const output =
|
|
1101
|
+
const output = parseCodingWorkerOutputJson(raw);
|
|
1077
1102
|
if (output.runId !== record.runId)
|
|
1078
1103
|
throw new Error("docker_result_run_mismatch");
|
|
1079
1104
|
return JSON.stringify(output);
|
|
@@ -1174,7 +1199,7 @@ export class DockerJobLauncher {
|
|
|
1174
1199
|
}
|
|
1175
1200
|
async validateInputArtifact(path) {
|
|
1176
1201
|
const metadata = await lstat(path);
|
|
1177
|
-
if (!metadata.isFile() || metadata.isSymbolicLink() || metadata.size >
|
|
1202
|
+
if (!metadata.isFile() || metadata.isSymbolicLink() || metadata.size > MAX_CODING_INPUT_BYTES) {
|
|
1178
1203
|
throw new Error("docker_input_artifact_invalid");
|
|
1179
1204
|
}
|
|
1180
1205
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { V1ConfigMap, V1Endpoints, V1NetworkPolicy, V1Pod, V1ResourceQuota, V1Secret, V1Service } from "@kubernetes/client-node";
|
|
1
|
+
import type { V1ConfigMap, V1Deployment, V1Endpoints, V1NetworkPolicy, V1Pod, V1ResourceQuota, V1Secret, V1Service } from "@kubernetes/client-node";
|
|
2
2
|
import type { Readable, Writable } from "node:stream";
|
|
3
3
|
import { type KubernetesApi, type KubernetesExecOptions } from "./kubernetes-api.js";
|
|
4
4
|
export interface FakeExecCall {
|
|
@@ -10,7 +10,7 @@ export interface FakeExecCall {
|
|
|
10
10
|
stdout?: Writable;
|
|
11
11
|
timeoutMs: number;
|
|
12
12
|
}
|
|
13
|
-
type Kind = "configmap" | "secret" | "pod" | "networkpolicy" | "service" | "endpoints" | "resourcequota";
|
|
13
|
+
type Kind = "configmap" | "secret" | "pod" | "networkpolicy" | "service" | "endpoints" | "resourcequota" | "deployment";
|
|
14
14
|
type Obj = {
|
|
15
15
|
metadata?: {
|
|
16
16
|
name?: string;
|
|
@@ -31,6 +31,19 @@ export declare class FakeKubernetesApi implements KubernetesApi {
|
|
|
31
31
|
onExec: (call: FakeExecCall) => Promise<number>;
|
|
32
32
|
/** The admission chain a dry-run create runs through. Default: echo the pod back unchanged. */
|
|
33
33
|
onDryRunCreatePod: (namespace: string, body: V1Pod) => Promise<V1Pod>;
|
|
34
|
+
/** Runs at the start of every pod create; tests throw KubernetesQuotaExceededError (or anything) from it. */
|
|
35
|
+
onCreatePod: (namespace: string, body: V1Pod) => Promise<void>;
|
|
36
|
+
readonly deploymentPatches: Array<{
|
|
37
|
+
name: string;
|
|
38
|
+
replicas?: number;
|
|
39
|
+
annotations?: Record<string, string>;
|
|
40
|
+
}>;
|
|
41
|
+
/** Deployment names whose patch throws KubernetesForbiddenError. */
|
|
42
|
+
forbidden: Set<string>;
|
|
43
|
+
/** "deployment/<name>" or "endpoints/<name>" keys whose read throws KubernetesForbiddenError. */
|
|
44
|
+
forbiddenReads: Set<string>;
|
|
45
|
+
/** "verb/resource/name" keys canI answers false for. */
|
|
46
|
+
accessDenied: Set<string>;
|
|
34
47
|
logs: Map<string, string>;
|
|
35
48
|
/** What readApiServerVersion reports; tests that care about provenance set it. */
|
|
36
49
|
apiServerVersion: string;
|
|
@@ -85,6 +98,8 @@ export declare class FakeKubernetesApi implements KubernetesApi {
|
|
|
85
98
|
*/
|
|
86
99
|
dryRunCreatePod(namespace: string, body: V1Pod): Promise<V1Pod>;
|
|
87
100
|
readPod(namespace: string, name: string): Promise<V1Pod | undefined>;
|
|
101
|
+
/** Matches `key=value[,key=value]` selectors against stored pods' labels. */
|
|
102
|
+
listPods(namespace: string, labelSelector: string): Promise<V1Pod[]>;
|
|
88
103
|
deletePod(namespace: string, name: string, gracePeriodSeconds: number): Promise<void>;
|
|
89
104
|
createNetworkPolicy(namespace: string, body: V1NetworkPolicy): Promise<V1NetworkPolicy>;
|
|
90
105
|
readNetworkPolicy(namespace: string, name: string): Promise<V1NetworkPolicy | undefined>;
|
|
@@ -92,6 +107,12 @@ export declare class FakeKubernetesApi implements KubernetesApi {
|
|
|
92
107
|
readService(namespace: string, name: string): Promise<V1Service | undefined>;
|
|
93
108
|
readEndpoints(namespace: string, name: string): Promise<V1Endpoints | undefined>;
|
|
94
109
|
readResourceQuota(namespace: string, name: string): Promise<V1ResourceQuota | undefined>;
|
|
110
|
+
readDeployment(namespace: string, name: string): Promise<V1Deployment | undefined>;
|
|
111
|
+
patchDeployment(namespace: string, name: string, patch: {
|
|
112
|
+
replicas?: number;
|
|
113
|
+
annotations?: Record<string, string>;
|
|
114
|
+
}): Promise<void>;
|
|
115
|
+
canI(_namespace: string, verb: string, _group: string, resource: string, name: string): Promise<boolean>;
|
|
95
116
|
readApiServerVersion(): Promise<string>;
|
|
96
117
|
readNamespace(name: string): Promise<boolean>;
|
|
97
118
|
exec(namespace: string, pod: string, container: string, command: string[], options: KubernetesExecOptions): Promise<number>;
|