@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
package/dist/coding/protocol.js
CHANGED
|
@@ -3,14 +3,28 @@ import { isAbsolute, resolve } from "node:path";
|
|
|
3
3
|
export const CODING_PROTOCOL_VERSION = 1;
|
|
4
4
|
/** The code host every coding run's repository and pull request live on (see pullRequestUrlSchema); the one place to change when another is added. */
|
|
5
5
|
export const CODING_CODE_PROVIDER = "github";
|
|
6
|
-
|
|
6
|
+
/** result.json and the agent output file: room for a full summary and test list, JSON-escaped. */
|
|
7
|
+
export const MAX_CODING_ARTIFACT_BYTES = 256 * 1024;
|
|
8
|
+
/** The worker input artifact (input.json): larger than results because it can carry Claude Code repo context. */
|
|
9
|
+
export const MAX_CODING_INPUT_BYTES = 512 * 1024;
|
|
10
|
+
/** Bounds on CodingTaskInput.claudeContext, enforced by the builder (src/coding/claude-context.ts) and this schema. */
|
|
11
|
+
export const CLAUDE_CONTEXT_LIMITS = { maxFiles: 200, maxFileBytes: 64 * 1024, maxTotalBytes: 256 * 1024 };
|
|
7
12
|
export const MAX_CODING_TASK_BYTES = 16 * 1024;
|
|
8
13
|
/** Room reserved at the end of a composed task for lines the executor appends (e.g. the base commit). */
|
|
9
14
|
export const CODING_TASK_TRAILER_RESERVE_BYTES = 256;
|
|
10
|
-
|
|
15
|
+
/**
|
|
16
|
+
* A coding run's summary (the agent's final message, posted as the PR body):
|
|
17
|
+
* longer text is cut at a line boundary with SUMMARY_TRUNCATED_MARKER rather
|
|
18
|
+
* than failing the run.
|
|
19
|
+
*/
|
|
20
|
+
export const MAX_CODING_SUMMARY_BYTES = 64 * 1024;
|
|
21
|
+
export const SUMMARY_TRUNCATED_MARKER = "\n\n[summary truncated]";
|
|
11
22
|
export const MAX_CODING_TESTS = 64;
|
|
12
23
|
export const MAX_CODING_TEST_COMMAND_BYTES = 2 * 1024;
|
|
13
24
|
export const MAX_TAG_BYTES = 32;
|
|
25
|
+
/** The workspace volume bounds every launcher enforces (docker-isolation.ts, kubernetes-isolation.ts). */
|
|
26
|
+
export const MIN_CODING_DISK_MB = 64;
|
|
27
|
+
export const MAX_CODING_DISK_MB = 32_768;
|
|
14
28
|
/**
|
|
15
29
|
* Coding-run services (docs/coding-services.md): the catalog name and version
|
|
16
30
|
* grammar, shared by the repository's .wardby/services.yaml, the catalog, and
|
|
@@ -42,6 +56,42 @@ export const INVALID_SINGLE_LINE_CONTROL = /[\u0000-\u001F\u007F]/;
|
|
|
42
56
|
export function byteLength(value) {
|
|
43
57
|
return Buffer.byteLength(value, "utf8");
|
|
44
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* `text` unchanged when `measure(text) <= max`; otherwise its longest prefix
|
|
61
|
+
* that fits with `marker` appended, cut back to the last line break when one
|
|
62
|
+
* is in the second half, and never inside a surrogate pair.
|
|
63
|
+
*/
|
|
64
|
+
export function truncateText(text, max, measure = byteLength, marker = SUMMARY_TRUNCATED_MARKER) {
|
|
65
|
+
if (measure(text) <= max)
|
|
66
|
+
return text;
|
|
67
|
+
const room = max - measure(marker);
|
|
68
|
+
if (room <= 0)
|
|
69
|
+
return marker.trim();
|
|
70
|
+
let low = 0;
|
|
71
|
+
let high = text.length;
|
|
72
|
+
while (low < high) {
|
|
73
|
+
const mid = (low + high + 1) >> 1;
|
|
74
|
+
if (measure(text.slice(0, mid)) <= room)
|
|
75
|
+
low = mid;
|
|
76
|
+
else
|
|
77
|
+
high = mid - 1;
|
|
78
|
+
}
|
|
79
|
+
let cut = text.slice(0, low);
|
|
80
|
+
if (/[\uD800-\uDBFF]$/.test(cut))
|
|
81
|
+
cut = cut.slice(0, -1);
|
|
82
|
+
const lineBreak = cut.lastIndexOf("\n");
|
|
83
|
+
if (lineBreak > cut.length / 2)
|
|
84
|
+
cut = cut.slice(0, lineBreak);
|
|
85
|
+
return `${cut.trimEnd()}${marker}`;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* A summary field: over-long text is redacted, then truncated (truncateText),
|
|
89
|
+
* then checked like any bounded text. Redacting first keeps a credential that
|
|
90
|
+
* straddles the cut from leaving its front half in the output.
|
|
91
|
+
*/
|
|
92
|
+
function summaryText() {
|
|
93
|
+
return z.preprocess((value) => typeof value === "string" ? truncateText(redactTokenShapedValues(value), MAX_CODING_SUMMARY_BYTES) : value, boundedText(MAX_CODING_SUMMARY_BYTES));
|
|
94
|
+
}
|
|
45
95
|
function boundedText(maxBytes, singleLine = false) {
|
|
46
96
|
const invalidControl = singleLine ? INVALID_SINGLE_LINE_CONTROL : INVALID_MULTILINE_CONTROL;
|
|
47
97
|
return z
|
|
@@ -83,6 +133,9 @@ const RESERVED_SERVICE_ENV_PREFIXES = [
|
|
|
83
133
|
"ANTHROPIC_",
|
|
84
134
|
"PIP_",
|
|
85
135
|
"NPM_CONFIG_",
|
|
136
|
+
"YARN_",
|
|
137
|
+
"PNPM_",
|
|
138
|
+
"COREPACK_",
|
|
86
139
|
"UV_",
|
|
87
140
|
"GIT_",
|
|
88
141
|
];
|
|
@@ -321,8 +374,68 @@ const testResultSchema = z
|
|
|
321
374
|
export const MAX_CODING_TURNS = 1000;
|
|
322
375
|
/** The Claude Code worker's turn limit when the agent sets none; the run's budget and timeout are the real limits. */
|
|
323
376
|
export const DEFAULT_CLAUDE_MAX_TURNS = 200;
|
|
377
|
+
/**
|
|
378
|
+
* The most output tokens per model reply on a Claude Code run when the agent sets
|
|
379
|
+
* none (CodingAgentProfile.maxOutputTokens); thinking counts toward it. The coding
|
|
380
|
+
* proxy reserves maxOutputTokens x the model's output price per request against
|
|
381
|
+
* the run budget, so higher values need a larger budget.
|
|
382
|
+
*/
|
|
383
|
+
export const DEFAULT_CLAUDE_MAX_OUTPUT_TOKENS = 32_000;
|
|
384
|
+
/** Bounds on CodingAgentProfile.maxOutputTokens (Claude Code runs). */
|
|
385
|
+
export const MIN_CLAUDE_MAX_OUTPUT_TOKENS = 1024;
|
|
386
|
+
export const MAX_CLAUDE_MAX_OUTPUT_TOKENS = 128_000;
|
|
324
387
|
/** Longest line a debug-traced worker writes to its log (src/coding-worker/debug-trace.ts). */
|
|
325
388
|
export const MAX_DEBUG_TRACE_LINE_BYTES = 16 * 1024;
|
|
389
|
+
/** A traced run's total trace output when the agent sets no cap (CodingAgentProfile.debugTraceMaxMb), in MiB. */
|
|
390
|
+
export const DEFAULT_DEBUG_TRACE_MAX_MB = 2;
|
|
391
|
+
/** Upper bound on CodingAgentProfile.debugTraceMaxMb. */
|
|
392
|
+
export const MAX_DEBUG_TRACE_MAX_MB = 64;
|
|
393
|
+
/** C0 and C1 control characters, which have no place in a context file path. */
|
|
394
|
+
const CONTROL_CHARACTER = /[\u0000-\u001f\u007f-\u009f]/;
|
|
395
|
+
/**
|
|
396
|
+
* A repo-relative POSIX path with no empty, ".", or ".." segment, no backslash, no control
|
|
397
|
+
* character, and nothing under .git.
|
|
398
|
+
*/
|
|
399
|
+
export function isSafeContextPath(path) {
|
|
400
|
+
if (path.length === 0 || path.length > 512 || path.startsWith("/") || path.includes("\\"))
|
|
401
|
+
return false;
|
|
402
|
+
if (CONTROL_CHARACTER.test(path))
|
|
403
|
+
return false;
|
|
404
|
+
const segments = path.split("/");
|
|
405
|
+
if (segments.some((segment) => segment === "" || segment === "." || segment === ".."))
|
|
406
|
+
return false;
|
|
407
|
+
return segments[0] !== ".git";
|
|
408
|
+
}
|
|
409
|
+
const ALLOWED_CONTEXT_FILES = new Set(["CLAUDE.md", ".claude/CLAUDE.md", "AGENTS.md"]);
|
|
410
|
+
const CONTEXT_SKILL_PATH = /^\.claude\/skills\/[^/]+\/SKILL\.md$/;
|
|
411
|
+
/**
|
|
412
|
+
* Whether a Claude Code context file may be shipped to (and written by) the worker: a safe path
|
|
413
|
+
* that is CLAUDE.md, .claude/CLAUDE.md, AGENTS.md, a .claude/skills/<name>/SKILL.md, or any other
|
|
414
|
+
* Markdown file outside every .claude directory that is not a CLAUDE.local.md. This keeps
|
|
415
|
+
* repository settings, hooks, MCP configuration, agents, commands, and personal memory out of
|
|
416
|
+
* Claude Code's native loading. Not part of the input schema: a refused file is dropped, and never
|
|
417
|
+
* fails the run.
|
|
418
|
+
*/
|
|
419
|
+
export function isAllowedContextPath(path) {
|
|
420
|
+
if (!isSafeContextPath(path))
|
|
421
|
+
return false;
|
|
422
|
+
if (ALLOWED_CONTEXT_FILES.has(path) || CONTEXT_SKILL_PATH.test(path))
|
|
423
|
+
return true;
|
|
424
|
+
const segments = path.toLowerCase().split("/");
|
|
425
|
+
if (!path.endsWith(".md"))
|
|
426
|
+
return false;
|
|
427
|
+
if (segments.includes(".claude"))
|
|
428
|
+
return false;
|
|
429
|
+
return segments[segments.length - 1] !== "claude.local.md";
|
|
430
|
+
}
|
|
431
|
+
export const ClaudeContextFileSchema = z
|
|
432
|
+
.object({
|
|
433
|
+
path: z.string().refine(isSafeContextPath, "must be a safe repo-relative path"),
|
|
434
|
+
content: z
|
|
435
|
+
.string()
|
|
436
|
+
.refine((value) => Buffer.byteLength(value) <= CLAUDE_CONTEXT_LIMITS.maxFileBytes, "file too large"),
|
|
437
|
+
})
|
|
438
|
+
.strict();
|
|
326
439
|
export const CodingTaskInputSchema = z
|
|
327
440
|
.object({
|
|
328
441
|
schemaVersion: z.literal(CODING_PROTOCOL_VERSION),
|
|
@@ -350,12 +463,44 @@ export const CodingTaskInputSchema = z
|
|
|
350
463
|
* untraced run is unchanged for workers that predate it.
|
|
351
464
|
*/
|
|
352
465
|
debugTrace: z.boolean().optional(),
|
|
466
|
+
/**
|
|
467
|
+
* Dependency cache (CodingAgentProfile.dependencyCache, fixed on the run at
|
|
468
|
+
* dispatch). The control plane writes the key only when true, so an input
|
|
469
|
+
* for any other run is unchanged for workers that predate it (their strict
|
|
470
|
+
* schema would refuse the key).
|
|
471
|
+
*/
|
|
472
|
+
dependencyCache: z.literal(true).optional(),
|
|
473
|
+
/**
|
|
474
|
+
* Session resume (CodingAgentProfile.sessionResume, fixed on the run at dispatch): the worker keeps
|
|
475
|
+
* Claude Code's session and writes a sanitised transcript next to its result. Written only when
|
|
476
|
+
* true, so other runs' input is unchanged for workers that predate it.
|
|
477
|
+
*/
|
|
478
|
+
sessionResume: z.literal(true).optional(),
|
|
479
|
+
/**
|
|
480
|
+
* The run's workspace volume size in MiB (the job's limits.diskMb), so the dependency cache can
|
|
481
|
+
* stay inside it: on Kubernetes the emptyDir sizeLimit is invisible to statfs. Written only with
|
|
482
|
+
* dependencyCache, so every other input is unchanged for workers that predate it.
|
|
483
|
+
*/
|
|
484
|
+
diskMb: z.number().int().min(MIN_CODING_DISK_MB).max(MAX_CODING_DISK_MB).optional(),
|
|
485
|
+
/**
|
|
486
|
+
* Cap on a traced run's total trace output, in MiB (CodingRun.debugTraceMaxMb).
|
|
487
|
+
* Written only on a traced run whose agent sets one; absent means the
|
|
488
|
+
* worker default (DEFAULT_DEBUG_TRACE_MAX_MB).
|
|
489
|
+
*/
|
|
490
|
+
debugTraceMaxMb: z.number().int().min(1).max(MAX_DEBUG_TRACE_MAX_MB).optional(),
|
|
353
491
|
/**
|
|
354
492
|
* Claude Code turn limit (CodingAgentProfile.maxTurns, fixed on the run at
|
|
355
493
|
* dispatch). Absent means the worker default; written only when the agent
|
|
356
494
|
* sets one, so other runs' input is unchanged for workers that predate it.
|
|
357
495
|
*/
|
|
358
496
|
maxTurns: z.number().int().min(1).max(MAX_CODING_TURNS).optional(),
|
|
497
|
+
/**
|
|
498
|
+
* Claude Code output tokens per model reply (CodingAgentProfile.maxOutputTokens,
|
|
499
|
+
* fixed on the run at dispatch). Absent means the worker default
|
|
500
|
+
* (DEFAULT_CLAUDE_MAX_OUTPUT_TOKENS); written only when the agent sets one, so
|
|
501
|
+
* other runs' input is unchanged for workers that predate it.
|
|
502
|
+
*/
|
|
503
|
+
maxOutputTokens: z.number().int().min(MIN_CLAUDE_MAX_OUTPUT_TOKENS).max(MAX_CLAUDE_MAX_OUTPUT_TOKENS).optional(),
|
|
359
504
|
/**
|
|
360
505
|
* Coding-run services started next to this run (docs/coding-services.md):
|
|
361
506
|
* each one's catalog name and version, and the variables the agent's shells
|
|
@@ -364,6 +509,27 @@ export const CodingTaskInputSchema = z
|
|
|
364
509
|
* predate it.
|
|
365
510
|
*/
|
|
366
511
|
services: z.array(workerServiceSchema).min(1).max(MAX_CODING_SERVICES).optional(),
|
|
512
|
+
/**
|
|
513
|
+
* Load the repository's agent skills (CodingAgentProfile.repoSkills, fixed on the run at
|
|
514
|
+
* dispatch). Absent means true; the control plane writes the key only when false, so other
|
|
515
|
+
* runs' input is unchanged for workers that predate it.
|
|
516
|
+
*/
|
|
517
|
+
repoSkills: z.boolean().optional(),
|
|
518
|
+
/**
|
|
519
|
+
* Claude Code runs (CodingAgentProfile.claudeBareMode, fixed on the run at dispatch): false
|
|
520
|
+
* turns off Claude Code's bare mode so it loads claudeContext natively. Absent means true;
|
|
521
|
+
* written only when false.
|
|
522
|
+
*/
|
|
523
|
+
claudeBareMode: z.boolean().optional(),
|
|
524
|
+
/**
|
|
525
|
+
* Claude Code runs: the repository's CLAUDE.md, its @imports, and (when repoSkills) each
|
|
526
|
+
* .claude/skills/<name>/SKILL.md, read by the control plane from the prepared workspace.
|
|
527
|
+
* Absent when there is nothing to load.
|
|
528
|
+
*/
|
|
529
|
+
claudeContext: z
|
|
530
|
+
.object({ files: z.array(ClaudeContextFileSchema).min(1).max(CLAUDE_CONTEXT_LIMITS.maxFiles) })
|
|
531
|
+
.strict()
|
|
532
|
+
.optional(),
|
|
367
533
|
})
|
|
368
534
|
.strict()
|
|
369
535
|
.superRefine((value, ctx) => {
|
|
@@ -375,27 +541,161 @@ export const CodingTaskInputSchema = z
|
|
|
375
541
|
message: "must match wardby/run-<runId> (or wardby/run-<continuationOf.runId>)",
|
|
376
542
|
});
|
|
377
543
|
}
|
|
544
|
+
if (value.diskMb !== undefined && value.dependencyCache !== true) {
|
|
545
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["diskMb"], message: "only with dependencyCache" });
|
|
546
|
+
}
|
|
378
547
|
const names = (value.services ?? []).map((service) => service.name);
|
|
379
548
|
if (new Set(names).size !== names.length) {
|
|
380
549
|
ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["services"], message: "must name each service once" });
|
|
381
550
|
}
|
|
551
|
+
const contextFiles = value.claudeContext?.files ?? [];
|
|
552
|
+
const paths = contextFiles.map((file) => file.path);
|
|
553
|
+
if (new Set(paths).size !== paths.length) {
|
|
554
|
+
ctx.addIssue({
|
|
555
|
+
code: z.ZodIssueCode.custom,
|
|
556
|
+
path: ["claudeContext", "files"],
|
|
557
|
+
message: "must name each path once",
|
|
558
|
+
});
|
|
559
|
+
}
|
|
560
|
+
const total = contextFiles.reduce((sum, file) => sum + Buffer.byteLength(file.content), 0);
|
|
561
|
+
if (total > CLAUDE_CONTEXT_LIMITS.maxTotalBytes) {
|
|
562
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["claudeContext", "files"], message: "context too large" });
|
|
563
|
+
}
|
|
382
564
|
});
|
|
383
|
-
|
|
384
|
-
.object({
|
|
565
|
+
const agentOutputFields = {
|
|
385
566
|
schemaVersion: z.literal(CODING_PROTOCOL_VERSION),
|
|
386
567
|
runId: runIdSchema,
|
|
387
568
|
outcome: z.enum(["changes_ready", "no_changes", "budget_exhausted"]),
|
|
388
|
-
summary:
|
|
569
|
+
summary: summaryText(),
|
|
389
570
|
tests: z.array(testResultSchema).max(MAX_CODING_TESTS),
|
|
390
571
|
// Model-written, so normalized rather than rejected; see normalizeCodingTag.
|
|
391
572
|
tag: z.preprocess(normalizeCodingTag, tagSchema),
|
|
573
|
+
};
|
|
574
|
+
function redactAgentOutput(value) {
|
|
575
|
+
return {
|
|
576
|
+
...value,
|
|
577
|
+
summary: redactTokenShapedValues(value.summary),
|
|
578
|
+
tests: value.tests.map((test) => ({ ...test, command: redactTokenShapedValues(test.command) })),
|
|
579
|
+
...(value.tag !== undefined ? { tag: redactTokenShapedValues(value.tag) } : {}),
|
|
580
|
+
};
|
|
581
|
+
}
|
|
582
|
+
/** What the model returns. Strict: it can never carry a worker-written field such as dependencyCache. */
|
|
583
|
+
export const CodingAgentOutputSchema = z.object(agentOutputFields).strict().transform(redactAgentOutput);
|
|
584
|
+
// ------------------------------------------------------------ dependency cache report
|
|
585
|
+
/**
|
|
586
|
+
* The run's dependency cache (src/coding-worker/dependency-cache.mjs), as the worker reports it in
|
|
587
|
+
* result.json and the control plane stores it (CodingRun.dependencyCacheResult, get_run). Worker-
|
|
588
|
+
* written, never model-written: the model's output schema above refuses the key. Only stable codes,
|
|
589
|
+
* repository folder names and bounded numbers; never npm output.
|
|
590
|
+
*/
|
|
591
|
+
export const MAX_DEPENDENCY_CACHE_PROJECTS = 4;
|
|
592
|
+
export const DEPENDENCY_CACHE_OUTCOMES = ["hit", "nearest", "cold", "skipped", "refused"];
|
|
593
|
+
export const DEPENDENCY_CACHE_REBUILD_OUTCOMES = ["ok", "failed", "timeout", "skipped", "unsealed"];
|
|
594
|
+
const DEPENDENCY_CACHE_CODE = /^[a-z][a-z0-9_]{0,63}$/;
|
|
595
|
+
/** "." or up to three folder segments: the proxy's project-path rule (dependency-cache/key.ts). */
|
|
596
|
+
export const DEPENDENCY_CACHE_PATH = /^(?:\.|[A-Za-z0-9_@+-][A-Za-z0-9._@+-]{0,99}(?:\/[A-Za-z0-9_@+-][A-Za-z0-9._@+-]{0,99}){0,2})$/;
|
|
597
|
+
const MAX_DEPENDENCY_CACHE_NUMBER = Number.MAX_SAFE_INTEGER;
|
|
598
|
+
const dependencyCacheCount = z.number().int().min(0).max(MAX_DEPENDENCY_CACHE_NUMBER);
|
|
599
|
+
const dependencyCacheProjectSchema = z
|
|
600
|
+
.object({
|
|
601
|
+
path: z
|
|
602
|
+
.string()
|
|
603
|
+
.regex(DEPENDENCY_CACHE_PATH)
|
|
604
|
+
.refine((path) => !path.split("/").includes("node_modules")),
|
|
605
|
+
result: z.enum(DEPENDENCY_CACHE_OUTCOMES),
|
|
606
|
+
key: z
|
|
607
|
+
.string()
|
|
608
|
+
.regex(/^[a-z0-9]{1,64}$/)
|
|
609
|
+
.optional(),
|
|
610
|
+
sizeBytes: dependencyCacheCount.optional(),
|
|
611
|
+
restoreMs: dependencyCacheCount.optional(),
|
|
612
|
+
installMs: dependencyCacheCount.optional(),
|
|
613
|
+
reason: z.string().regex(DEPENDENCY_CACHE_CODE).optional(),
|
|
614
|
+
rebuild: z.enum(DEPENDENCY_CACHE_REBUILD_OUTCOMES).optional(),
|
|
615
|
+
})
|
|
616
|
+
.strict();
|
|
617
|
+
export const DependencyCacheReportSchema = z
|
|
618
|
+
.object({
|
|
619
|
+
projects: z.array(dependencyCacheProjectSchema).max(MAX_DEPENDENCY_CACHE_PROJECTS),
|
|
620
|
+
/** Projects left out of `projects` (over the cap, or not reportable). */
|
|
621
|
+
omitted: z.number().int().min(1).max(MAX_DEPENDENCY_CACHE_NUMBER).optional(),
|
|
622
|
+
/** Set when no project could be reported at all: a stable code (timeout, internal_error, worker_error, ...). */
|
|
623
|
+
reason: z.string().regex(DEPENDENCY_CACHE_CODE).optional(),
|
|
624
|
+
})
|
|
625
|
+
.strict();
|
|
626
|
+
const INSTALLED_OUTCOMES = new Set(["hit", "nearest", "cold"]);
|
|
627
|
+
const RESTORED_OUTCOMES = new Set(["hit", "nearest"]);
|
|
628
|
+
const MAX_RAW_DEPENDENCY_CACHE_PROJECTS = 1024;
|
|
629
|
+
/**
|
|
630
|
+
* Bounds whatever the module (or a tool runner over its socket) returned into a report: projects
|
|
631
|
+
* that don't fit the schema are dropped and counted in `omitted`; past the cap, installed and
|
|
632
|
+
* refused projects are kept ahead of skipped ones, in their original order. A value that isn't a
|
|
633
|
+
* report at all becomes `{ projects: [], reason: "report_invalid" }`. Never throws.
|
|
634
|
+
*/
|
|
635
|
+
export function sanitizeDependencyCacheReport(value) {
|
|
636
|
+
const invalid = () => ({ projects: [], reason: "report_invalid" });
|
|
637
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
638
|
+
return invalid();
|
|
639
|
+
const raw = value;
|
|
640
|
+
if (!Array.isArray(raw.projects) || raw.projects.length > MAX_RAW_DEPENDENCY_CACHE_PROJECTS)
|
|
641
|
+
return invalid();
|
|
642
|
+
if (Object.keys(raw).some((key) => key !== "projects" && key !== "reason" && key !== "omitted"))
|
|
643
|
+
return invalid();
|
|
644
|
+
const valid = [];
|
|
645
|
+
for (const project of raw.projects) {
|
|
646
|
+
const parsed = dependencyCacheProjectSchema.safeParse(project);
|
|
647
|
+
if (parsed.success)
|
|
648
|
+
valid.push(parsed.data);
|
|
649
|
+
}
|
|
650
|
+
const kept = valid
|
|
651
|
+
.map((project, index) => ({ project, index, rank: project.result === "skipped" ? 1 : 0 }))
|
|
652
|
+
.sort((a, b) => a.rank - b.rank || a.index - b.index)
|
|
653
|
+
.slice(0, MAX_DEPENDENCY_CACHE_PROJECTS)
|
|
654
|
+
.sort((a, b) => a.index - b.index)
|
|
655
|
+
.map((entry) => entry.project);
|
|
656
|
+
const earlier = typeof raw.omitted === "number" && Number.isSafeInteger(raw.omitted) && raw.omitted > 0;
|
|
657
|
+
const omitted = Math.min(MAX_DEPENDENCY_CACHE_NUMBER, raw.projects.length - kept.length + (earlier ? raw.omitted : 0));
|
|
658
|
+
const reason = typeof raw.reason === "string" && DEPENDENCY_CACHE_CODE.test(raw.reason) ? raw.reason : undefined;
|
|
659
|
+
return {
|
|
660
|
+
projects: kept,
|
|
661
|
+
...(omitted > 0 ? { omitted } : {}),
|
|
662
|
+
...(reason ? { reason } : {}),
|
|
663
|
+
};
|
|
664
|
+
}
|
|
665
|
+
/** Folders the dependency cache installed (hit, nearest or cold), "." for the repository root. */
|
|
666
|
+
export function installedDependencyFolders(report) {
|
|
667
|
+
return (report?.projects ?? []).filter((project) => INSTALLED_OUTCOMES.has(project.result)).map((p) => p.path);
|
|
668
|
+
}
|
|
669
|
+
/** Folders whose node_modules came from a cached snapshot (hit or nearest): the PR body's line. */
|
|
670
|
+
export function restoredDependencyFolders(report) {
|
|
671
|
+
return (report?.projects ?? []).filter((project) => RESTORED_OUTCOMES.has(project.result)).map((p) => p.path);
|
|
672
|
+
}
|
|
673
|
+
/** The one line both workers add to the agent's prompt when dependencies were installed; else undefined. */
|
|
674
|
+
export function dependencyCacheTaskNote(report) {
|
|
675
|
+
const folders = installedDependencyFolders(report);
|
|
676
|
+
if (folders.length === 0)
|
|
677
|
+
return undefined;
|
|
678
|
+
const named = folders.map((path) => (path === "." ? "the repo root" : path)).join(", ");
|
|
679
|
+
return `Dependencies are pre-installed from the committed lockfile in: ${named}. Don't run \`npm ci\` there; add packages with a single install command.`;
|
|
680
|
+
}
|
|
681
|
+
/**
|
|
682
|
+
* What a worker writes to result.json and the control plane reads back: the model's output plus
|
|
683
|
+
* worker-written fields. `dependencyCache` is written only on a run whose input asked for it, so an
|
|
684
|
+
* older control plane never sees the key; a malformed one is bounded (sanitizeDependencyCacheReport)
|
|
685
|
+
* rather than failing the run.
|
|
686
|
+
*/
|
|
687
|
+
export const CodingWorkerOutputSchema = z
|
|
688
|
+
.object({
|
|
689
|
+
...agentOutputFields,
|
|
690
|
+
dependencyCache: z
|
|
691
|
+
.unknown()
|
|
692
|
+
.optional()
|
|
693
|
+
.transform((value) => (value === undefined ? undefined : sanitizeDependencyCacheReport(value))),
|
|
392
694
|
})
|
|
393
695
|
.strict()
|
|
394
|
-
.transform((value) => ({
|
|
395
|
-
...value,
|
|
396
|
-
|
|
397
|
-
tests: value.tests.map((test) => ({ ...test, command: redactTokenShapedValues(test.command) })),
|
|
398
|
-
...(value.tag !== undefined ? { tag: redactTokenShapedValues(value.tag) } : {}),
|
|
696
|
+
.transform(({ dependencyCache, ...value }) => ({
|
|
697
|
+
...redactAgentOutput(value),
|
|
698
|
+
...(dependencyCache !== undefined ? { dependencyCache } : {}),
|
|
399
699
|
}));
|
|
400
700
|
const pullRequestUrlSchema = z
|
|
401
701
|
.string()
|
|
@@ -429,7 +729,7 @@ export const CodingRunResultSchema = z
|
|
|
429
729
|
.optional(),
|
|
430
730
|
pullRequestUrl: pullRequestUrlSchema.optional(),
|
|
431
731
|
pullRequestNumber: z.number().int().positive().max(Number.MAX_SAFE_INTEGER).optional(),
|
|
432
|
-
summary:
|
|
732
|
+
summary: summaryText(),
|
|
433
733
|
tests: z.array(testResultSchema).max(MAX_CODING_TESTS),
|
|
434
734
|
usage: usageSchema,
|
|
435
735
|
tag: tagSchema,
|
|
@@ -486,7 +786,10 @@ export function publicCodingRunResult(value) {
|
|
|
486
786
|
*/
|
|
487
787
|
const PEM_PRIVATE_KEY = /-----BEGIN (?:[A-Z ]{1,32} )?PRIVATE KEY-----[\s\S]{0,6144}?-----END (?:[A-Z ]{1,32} )?PRIVATE KEY-----/g;
|
|
488
788
|
const TOKEN_PATTERNS = [
|
|
489
|
-
|
|
789
|
+
// Not after a letter or digit: "task-…", "risk-…" and "disk-…" words are
|
|
790
|
+
// not keys, and redacting them garbled run output and failed knowledge
|
|
791
|
+
// checks on file names such as "mcp-task-cancellation-stamp.md".
|
|
792
|
+
/(?<![A-Za-z0-9])sk-(?:ant-)?[A-Za-z0-9_-]{16,}/gi,
|
|
490
793
|
/github_pat_[A-Za-z0-9_]{20,}/g,
|
|
491
794
|
/gh[pousr]_[A-Za-z0-9]{20,}/g,
|
|
492
795
|
/AKIA[0-9A-Z]{16}/g,
|
|
@@ -562,8 +865,8 @@ export function redactTokenShapedValues(value) {
|
|
|
562
865
|
export function redactAndTruncate(value, limit) {
|
|
563
866
|
return redactTokenShapedValues(value.slice(0, limit + MAX_REDACTED_SPAN)).slice(0, limit);
|
|
564
867
|
}
|
|
565
|
-
function parseJsonWithoutDuplicateKeys(text) {
|
|
566
|
-
if (byteLength(text) >
|
|
868
|
+
function parseJsonWithoutDuplicateKeys(text, maxBytes = MAX_CODING_ARTIFACT_BYTES) {
|
|
869
|
+
if (byteLength(text) > maxBytes)
|
|
567
870
|
throw new Error("coding_artifact_size_limit");
|
|
568
871
|
let offset = 0;
|
|
569
872
|
const whitespace = () => {
|
|
@@ -659,11 +962,15 @@ function parseJsonWithoutDuplicateKeys(text) {
|
|
|
659
962
|
}
|
|
660
963
|
}
|
|
661
964
|
export function parseCodingTaskInputJson(text) {
|
|
662
|
-
return CodingTaskInputSchema.parse(parseJsonWithoutDuplicateKeys(text));
|
|
965
|
+
return CodingTaskInputSchema.parse(parseJsonWithoutDuplicateKeys(text, MAX_CODING_INPUT_BYTES));
|
|
663
966
|
}
|
|
664
967
|
export function parseCodingAgentOutputJson(text) {
|
|
665
968
|
return CodingAgentOutputSchema.parse(parseJsonWithoutDuplicateKeys(text));
|
|
666
969
|
}
|
|
970
|
+
/** The control plane's read of a worker's result.json (see CodingWorkerOutputSchema). */
|
|
971
|
+
export function parseCodingWorkerOutputJson(text) {
|
|
972
|
+
return CodingWorkerOutputSchema.parse(parseJsonWithoutDuplicateKeys(text));
|
|
973
|
+
}
|
|
667
974
|
export function parseCodingRunResultJson(text) {
|
|
668
975
|
return CodingRunResultSchema.parse(parseJsonWithoutDuplicateKeys(text));
|
|
669
976
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { redactExactSecretValues } from "../core/secret-spans.js";
|
|
2
|
+
import { redactTokenShapedValues } from "./protocol.js";
|
|
3
|
+
export const REDACTED = "[REDACTED]";
|
|
4
|
+
/** Shapes protocol.ts's list does not cover, or covers only at longer lengths. */
|
|
5
|
+
const EXTRA_TOKEN_PATTERNS = [/rrp_[A-Za-z0-9_-]{8,}/g, /rrg_[A-Za-z0-9_-]{8,}/g, /\bBearer\s+[^\s"',;]+/gi];
|
|
6
|
+
/** Redacts the given exact secrets, then every token-shaped value. */
|
|
7
|
+
export function redactSecrets(text, secrets = []) {
|
|
8
|
+
// The shared span-union redactor; any non-empty value counts here, as it always has.
|
|
9
|
+
let redacted = redactExactSecretValues(text, secrets, { marker: REDACTED, minLength: 1 });
|
|
10
|
+
redacted = redactTokenShapedValues(redacted);
|
|
11
|
+
return EXTRA_TOKEN_PATTERNS.reduce((value, pattern) => value.replace(pattern, REDACTED), redacted);
|
|
12
|
+
}
|
|
@@ -1,9 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The per-agent package allowlist and policy model: parsing raw allowlist
|
|
3
|
+
* strings (via each ecosystem's adapter) into `AllowlistEntry` values, and
|
|
4
|
+
* matching a normalized package name against them.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from "zod";
|
|
1
7
|
import type { AllowlistEntry, RegistryAdapter } from "./types.js";
|
|
2
8
|
export type PackageAllowlist = Readonly<Record<string, readonly string[]>>;
|
|
3
9
|
export interface PackagePolicy {
|
|
4
10
|
minReleaseAgeDays: number;
|
|
11
|
+
/** Advisory ids (GHSA-…, CVE-…) whose installs this agent may proceed with; malware (MAL-…) is never acceptable. */
|
|
12
|
+
acceptedAdvisories: readonly string[];
|
|
5
13
|
}
|
|
6
14
|
export declare const DEFAULT_MIN_RELEASE_AGE_DAYS = 3;
|
|
15
|
+
export declare const ACCEPTED_ADVISORY_ID: RegExp;
|
|
16
|
+
export declare const MAX_ACCEPTED_ADVISORIES = 32;
|
|
17
|
+
/** The one definition of the acceptedAdvisories field, shared by the policy and the coding profile. */
|
|
18
|
+
export declare const acceptedAdvisoriesSchema: z.ZodArray<z.ZodPipe<z.ZodString, z.ZodString>>;
|
|
7
19
|
export declare function resolvePolicy(value: unknown): PackagePolicy;
|
|
8
20
|
export declare function parseAllowlist(allowlist: PackageAllowlist, adapters: ReadonlyMap<string, RegistryAdapter>): Map<string, AllowlistEntry[]>;
|
|
9
21
|
export declare function matchRoot(entries: readonly AllowlistEntry[], normalizedName: string): AllowlistEntry | undefined;
|
|
@@ -5,8 +5,21 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { z } from "zod";
|
|
7
7
|
export const DEFAULT_MIN_RELEASE_AGE_DAYS = 3;
|
|
8
|
+
export const ACCEPTED_ADVISORY_ID = /^[A-Z][A-Z0-9]*-[A-Za-z0-9-]{3,64}$/;
|
|
9
|
+
export const MAX_ACCEPTED_ADVISORIES = 32;
|
|
10
|
+
/** The one definition of the acceptedAdvisories field, shared by the policy and the coding profile. */
|
|
11
|
+
export const acceptedAdvisoriesSchema = z
|
|
12
|
+
.array(z
|
|
13
|
+
.string()
|
|
14
|
+
.refine((id) => !id.startsWith("MAL-"), "acceptedAdvisories: malware advisories (MAL-…) can never be accepted.")
|
|
15
|
+
.pipe(z.string().regex(ACCEPTED_ADVISORY_ID, "must look like GHSA-xxxx-xxxx-xxxx or CVE-2026-12345")))
|
|
16
|
+
.max(MAX_ACCEPTED_ADVISORIES)
|
|
17
|
+
.refine((ids) => new Set(ids).size === ids.length, "must not contain duplicates");
|
|
8
18
|
const PolicySchema = z
|
|
9
|
-
.object({
|
|
19
|
+
.object({
|
|
20
|
+
minReleaseAgeDays: z.number().int().min(0).max(30).default(DEFAULT_MIN_RELEASE_AGE_DAYS),
|
|
21
|
+
acceptedAdvisories: acceptedAdvisoriesSchema.default([]),
|
|
22
|
+
})
|
|
10
23
|
.strict();
|
|
11
24
|
export function resolvePolicy(value) {
|
|
12
25
|
return PolicySchema.parse(value ?? {});
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
export declare const PACKAGE_AUDIT_MODES: readonly ["audit", "full"];
|
|
2
|
+
export type PackageAuditMode = (typeof PACKAGE_AUDIT_MODES)[number];
|
|
3
|
+
/** The window `packageAuditMode` opens when `packageAuditMinutes` is omitted: 24 hours. */
|
|
4
|
+
export declare const DEFAULT_PACKAGE_AUDIT_MINUTES: number;
|
|
5
|
+
/** The longest window one update may open: 7 days. */
|
|
6
|
+
export declare const MAX_PACKAGE_AUDIT_MINUTES: number;
|
|
7
|
+
/**
|
|
8
|
+
* How an audited package reached the run: named by the project or a lockfile
|
|
9
|
+
* project (`top-level`), declared by an audited package (`transitive`),
|
|
10
|
+
* fetched with no metadata or plan to prove a parent (`unknown`), or on the
|
|
11
|
+
* allowlist graph and recorded only for advisories served past (`allowed`).
|
|
12
|
+
*/
|
|
13
|
+
export type AuditRelation = "top-level" | "transitive" | "unknown" | "allowed";
|
|
14
|
+
export interface AuditAdvisory {
|
|
15
|
+
id: string;
|
|
16
|
+
severity: string;
|
|
17
|
+
summary: string;
|
|
18
|
+
}
|
|
19
|
+
/** Why one request or plan approval was audited; `advisories` only for full-mode waivers. */
|
|
20
|
+
export interface PackageAuditVerdict {
|
|
21
|
+
relation: AuditRelation;
|
|
22
|
+
/** The top-level audited package that pulled it in (transitive only). */
|
|
23
|
+
via?: string;
|
|
24
|
+
advisories?: AuditAdvisory[];
|
|
25
|
+
}
|
|
26
|
+
/** A RegistryAuditRecord row as read back (advisories is untrusted JSON). */
|
|
27
|
+
export interface PackageAuditRow {
|
|
28
|
+
ecosystem: string;
|
|
29
|
+
name: string;
|
|
30
|
+
version: string;
|
|
31
|
+
relation: string;
|
|
32
|
+
via: string | null;
|
|
33
|
+
sizeBytes: number | null;
|
|
34
|
+
advisories: unknown;
|
|
35
|
+
}
|
|
36
|
+
/** One audited package version as get_run, the PR body and the status comment show it. */
|
|
37
|
+
export interface PackageAuditEntry {
|
|
38
|
+
ecosystem: string;
|
|
39
|
+
name: string;
|
|
40
|
+
version: string;
|
|
41
|
+
size: number | null;
|
|
42
|
+
relation: AuditRelation;
|
|
43
|
+
via?: string;
|
|
44
|
+
advisories?: AuditAdvisory[];
|
|
45
|
+
}
|
|
46
|
+
export declare class PackageAuditPatchError extends Error {
|
|
47
|
+
}
|
|
48
|
+
export declare function isPackageAuditMode(value: unknown): value is PackageAuditMode;
|
|
49
|
+
/** Whether a stored mode is in force: set, and its window has not ended. */
|
|
50
|
+
export declare function isPackageAuditActive(mode: string | null | undefined, until: Date | null | undefined, now: Date): mode is PackageAuditMode;
|
|
51
|
+
/** The get_agent / update_agent warning while a mode is in force. */
|
|
52
|
+
export declare function packageAuditActiveWarning(mode: PackageAuditMode, until: Date): string;
|
|
53
|
+
/**
|
|
54
|
+
* update_agent's packageAuditMode / packageAuditMinutes semantics: a mode
|
|
55
|
+
* opens a window of the given minutes (24 hours by default), minutes alone
|
|
56
|
+
* re-arm the stored mode, and null clears both. Returns undefined when the
|
|
57
|
+
* patch names neither field; throws PackageAuditPatchError for a 400.
|
|
58
|
+
*/
|
|
59
|
+
export declare function resolvePackageAuditPatch(stored: {
|
|
60
|
+
mode: PackageAuditMode | null;
|
|
61
|
+
}, patch: {
|
|
62
|
+
packageAuditMode?: PackageAuditMode | null;
|
|
63
|
+
packageAuditMinutes?: number;
|
|
64
|
+
}, now: Date): {
|
|
65
|
+
mode: PackageAuditMode | null;
|
|
66
|
+
until: Date | null;
|
|
67
|
+
} | undefined;
|
|
68
|
+
export declare const MAX_AUDIT_SUMMARY_CHARS = 200;
|
|
69
|
+
/** An advisory summary (OSV free text) as plain, single-line, bounded text. */
|
|
70
|
+
export declare function sanitizeAuditSummary(value: unknown): string;
|
|
71
|
+
/** Untrusted advisory JSON reduced to well-formed, non-malware entries (at most 16, distinct ids). */
|
|
72
|
+
export declare function sanitizeAuditAdvisories(value: unknown): AuditAdvisory[];
|
|
73
|
+
/** A stored verdict (RegistryApprovedVersion.audit, untrusted JSON) read back; null when absent or malformed. */
|
|
74
|
+
export declare function parsePackageAuditVerdict(value: unknown): PackageAuditVerdict | null;
|
|
75
|
+
export interface PackageAuditSummary {
|
|
76
|
+
entries: PackageAuditEntry[];
|
|
77
|
+
/** Names to add to the allowlist: top-level, per ecosystem, first-seen order. */
|
|
78
|
+
toApprove: {
|
|
79
|
+
ecosystem: string;
|
|
80
|
+
name: string;
|
|
81
|
+
dependencies: number;
|
|
82
|
+
}[];
|
|
83
|
+
/** Names recorded only with relation `unknown` (a direct download, or after a plan fallback): they
|
|
84
|
+
* may be dependencies of allowlisted packages, so they are listed apart and approved only by name. */
|
|
85
|
+
unknown: {
|
|
86
|
+
ecosystem: string;
|
|
87
|
+
name: string;
|
|
88
|
+
dependencies: number;
|
|
89
|
+
}[];
|
|
90
|
+
advisoryRows: {
|
|
91
|
+
ecosystem: string;
|
|
92
|
+
name: string;
|
|
93
|
+
version: string;
|
|
94
|
+
advisory: AuditAdvisory;
|
|
95
|
+
}[];
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* A run's (or a PR's runs') audit rows deduplicated on ecosystem + name +
|
|
99
|
+
* version (advisories unioned) and ordered top-level, unknown, transitive,
|
|
100
|
+
* allowed. An unrecognised relation reads as `unknown`, so it is listed to
|
|
101
|
+
* approve rather than hidden.
|
|
102
|
+
*/
|
|
103
|
+
export declare function summarizePackageAudit(rows: readonly PackageAuditRow[]): PackageAuditSummary;
|
|
104
|
+
/** How a name recorded with relation `unknown` is labelled wherever it is listed. */
|
|
105
|
+
export declare const UNKNOWN_RELATION_LABEL = "Relation unknown \u2014 may be a dependency; approve only if needed directly";
|
|
106
|
+
/**
|
|
107
|
+
* The package audit block for a PR body (`format: "pr"`, a `[!CAUTION]`
|
|
108
|
+
* banner plus the names to approve and, in full mode, the advisories served
|
|
109
|
+
* past), a status comment (`format: "status"`, short), or Slack mrkdwn
|
|
110
|
+
* (`slack`, already escaped). Control-plane text only: names, versions and
|
|
111
|
+
* ids pass through codeSpan.
|
|
112
|
+
*/
|
|
113
|
+
export declare function packageAuditWording(mode: PackageAuditMode, summary: PackageAuditSummary, opts?: {
|
|
114
|
+
slack?: boolean;
|
|
115
|
+
format?: "pr" | "status";
|
|
116
|
+
}): string;
|
|
117
|
+
/** What a short audit notice needs (a status comment, a Slack message): a bounded, count-only digest.
|
|
118
|
+
* A type alias, not an interface, so it stays assignable to a stored JSON payload. */
|
|
119
|
+
export type PackageAuditDigest = {
|
|
120
|
+
/** Names to approve, at most 10. */
|
|
121
|
+
toApprove: {
|
|
122
|
+
ecosystem: string;
|
|
123
|
+
name: string;
|
|
124
|
+
}[];
|
|
125
|
+
/** Names to approve beyond those listed. */
|
|
126
|
+
moreToApprove: number;
|
|
127
|
+
/** Names with relation `unknown`, at most 10, listed apart (see PackageAuditSummary.unknown). */
|
|
128
|
+
unknown: {
|
|
129
|
+
ecosystem: string;
|
|
130
|
+
name: string;
|
|
131
|
+
}[];
|
|
132
|
+
moreUnknown: number;
|
|
133
|
+
/** Dependencies of audited packages, recorded transitive. */
|
|
134
|
+
transitive: number;
|
|
135
|
+
/** Advisories full mode served past (0 in audit mode). */
|
|
136
|
+
advisories: number;
|
|
137
|
+
};
|
|
138
|
+
export declare function packageAuditDigest(mode: PackageAuditMode, summary: PackageAuditSummary): PackageAuditDigest;
|
|
139
|
+
/** The short audit notice as GitHub/Jira Markdown or, with `slack`, Slack mrkdwn (already escaped). */
|
|
140
|
+
export declare function packageAuditStatusText(mode: PackageAuditMode, digest: PackageAuditDigest, slack: boolean): string;
|
|
141
|
+
/** A run's (or a pull request's runs') package audit: the mode and what it recorded. */
|
|
142
|
+
export interface PackageAuditReport {
|
|
143
|
+
mode: PackageAuditMode;
|
|
144
|
+
entries: readonly PackageAuditEntry[];
|
|
145
|
+
}
|
|
146
|
+
/** Entries back as rows, so several runs' entries summarize (dedup, order) like one run's. */
|
|
147
|
+
export declare function packageAuditRows(entries: readonly PackageAuditEntry[]): PackageAuditRow[];
|
|
148
|
+
/**
|
|
149
|
+
* Several runs' audit reports as one (a pull request's runs): entries merged
|
|
150
|
+
* on ecosystem + name + version with advisories unioned, and the strongest
|
|
151
|
+
* mode seen (`full` over `audit`). Undefined when no run had the mode.
|
|
152
|
+
*/
|
|
153
|
+
export declare function mergePackageAuditReports(reports: readonly (PackageAuditReport | undefined)[]): PackageAuditReport | undefined;
|