@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/mcp/tools/agents.js
CHANGED
|
@@ -8,28 +8,44 @@
|
|
|
8
8
|
import { Prisma } from "#prisma";
|
|
9
9
|
import { z } from "zod";
|
|
10
10
|
import { CodingProfilePatchSchema, CodingProfileSchema } from "../../coding/profile.js";
|
|
11
|
-
import { DEFAULT_CLAUDE_MAX_TURNS, MAX_CODING_TURNS, isLocalRepository } from "../../coding/protocol.js";
|
|
11
|
+
import { DEFAULT_CLAUDE_MAX_OUTPUT_TOKENS, DEFAULT_CLAUDE_MAX_TURNS, MAX_CLAUDE_MAX_OUTPUT_TOKENS, MIN_CLAUDE_MAX_OUTPUT_TOKENS, DEFAULT_DEBUG_TRACE_MAX_MB, MAX_CODING_TURNS, MAX_DEBUG_TRACE_MAX_MB, isLocalRepository, } from "../../coding/protocol.js";
|
|
12
|
+
import { loadBlobStoreConfig, loadContainerExecutorConfig } from "../../config/providers.js";
|
|
12
13
|
import { codingProviderSupportsModel } from "../../coding/provider.js";
|
|
14
|
+
import { ACCEPTED_ADVISORY_ID, MAX_ACCEPTED_ADVISORIES } from "../../coding/registry/allowlist.js";
|
|
15
|
+
import { DEFAULT_PACKAGE_AUDIT_MINUTES, isPackageAuditActive, isPackageAuditMode, MAX_PACKAGE_AUDIT_MINUTES, PACKAGE_AUDIT_MODES, PackageAuditPatchError, packageAuditActiveWarning, resolvePackageAuditPatch, } from "../../coding/registry/audit-mode.js";
|
|
13
16
|
import { assertAgentModelAvailable } from "../../core/run-pricing.js";
|
|
14
17
|
import { ModelUnavailableError } from "../../providers/llm/catalog-types.js";
|
|
15
18
|
import { currentModelCatalog } from "../../providers/llm/catalog-store.js";
|
|
16
19
|
import { validateCronExpression } from "../../core/cron.js";
|
|
20
|
+
import { scheduleStartFields } from "../../core/schedule-start.js";
|
|
17
21
|
import { modelSupportedEfforts } from "../../providers/llm/routing.js";
|
|
18
22
|
import { PROJECT_KEY } from "../../providers/issue-tracker/types.js";
|
|
19
23
|
import { LLM_EFFORT_LEVELS, isLlmEffort } from "../../providers/llm/types.js";
|
|
20
24
|
import { requireReadableBudgetGroup } from "../auth/ownership.js";
|
|
21
25
|
import { agentAccessResolver, agentNotFound, assertAgentAccess, readableAgentsWhere, requireAgentAccess, } from "../auth/access.js";
|
|
22
|
-
import { EVERYONE_KEY, atLeast, canDelegate, deleteGrantsFor, effectiveAccess } from "../../core/grants.js";
|
|
26
|
+
import { EVERYONE_KEY, atLeast, canDelegate, deleteGrantsFor, effectiveAccess, isPublicWritable, } from "../../core/grants.js";
|
|
23
27
|
import { projectTool } from "./tools.js";
|
|
28
|
+
import { withZod3ToolWarnings } from "../../core/zod3-window.js";
|
|
24
29
|
import { requireAnyScope, requireScope } from "../auth/resource-server.js";
|
|
25
30
|
import { logger } from "../../core/logger.js";
|
|
26
31
|
import { authorizeRepositoryForSet, canonicalLocalRepository, } from "../auth/repo-authorization.js";
|
|
27
32
|
import { McpError } from "../errors.js";
|
|
28
33
|
import { textResult } from "./text-result.js";
|
|
34
|
+
function validateWorkspaceDiskMb(workspaceDiskMb) {
|
|
35
|
+
if (workspaceDiskMb == null)
|
|
36
|
+
return;
|
|
37
|
+
const { maxDiskMb } = loadContainerExecutorConfig();
|
|
38
|
+
if (workspaceDiskMb > maxDiskMb) {
|
|
39
|
+
throw new McpError(400, `workspaceDiskMb (${workspaceDiskMb} MiB) exceeds the deployment cap (${maxDiskMb} MiB). Raise CODING_MAX_DISK_MB to allow this size.`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
29
42
|
// workerImageRef is the BYO-arbitrary-image escape hatch (see
|
|
30
|
-
// resolveCodingWorkerImage in container.ts)
|
|
31
|
-
//
|
|
32
|
-
//
|
|
43
|
+
// resolveCodingWorkerImage/resolveCodingToolImage in container.ts). For a Codex agent it
|
|
44
|
+
// replaces the one container that runs the whole agent; for a Claude Code agent it replaces
|
|
45
|
+
// only the tool-runner container that runs the agent's commands, never the agent container
|
|
46
|
+
// (which always stays the deployment's standard Claude Code image). Either way, setting or
|
|
47
|
+
// changing it requires a step-up beyond agents:write, the same pattern make_owner below uses
|
|
48
|
+
// for its own sensitive, ownership-bypassing mutation.
|
|
33
49
|
function requireWorkerImageRefScope(ctx) {
|
|
34
50
|
requireScope(ctx, ctx.canonicalUri, "agents:admin");
|
|
35
51
|
}
|
|
@@ -54,12 +70,63 @@ const MAX_DELEGATIONS_PER_RUN = 20;
|
|
|
54
70
|
const PARALLEL_DELEGATIONS_DESCRIPTION = "Native agents with sub-agents: when true, the delegate_to_* calls the agent makes in one model turn run at the same time " +
|
|
55
71
|
"instead of one after another (other tool calls still run in order). The run tree still shares one budget, so later " +
|
|
56
72
|
"sub-agents get what earlier ones leave. Coding sub-agents still queue for CODING_MAX_CONCURRENT slots. Default false.";
|
|
73
|
+
/** Operator-facing spellings of Agent.nativeExecutionMode (the Prisma enum is `control_plane` | `sandbox`). */
|
|
74
|
+
const NATIVE_EXECUTION_MODES = ["control-plane", "sandbox"];
|
|
75
|
+
const toStoredMode = (mode) => mode === "sandbox" ? "sandbox" : "control_plane";
|
|
76
|
+
/** An agent row as returned to operators: the mode in its hyphenated spelling, null for coding agents. */
|
|
77
|
+
function withOperatorMode(agent) {
|
|
78
|
+
return {
|
|
79
|
+
...agent,
|
|
80
|
+
nativeExecutionMode: agent.kind !== "native" ? null : agent.nativeExecutionMode === "sandbox" ? "sandbox" : "control-plane",
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/** The warning create_agent / update_agent return (not a refusal): wardby can't tell how old a custom image is. */
|
|
84
|
+
export const DEPENDENCY_CACHE_IMAGE_WARNING = "dependencyCache is on and this agent runs its own worker image (workerImageRef): rebuild that image FROM the wardby release that includes the dependency cache before its next run, or the run fails at input (worker_input_failed). See the dependency-cache help article.";
|
|
85
|
+
export const SESSION_RESUME_IMAGE_WARNING = "sessionResume is on and this agent runs its own worker image (workerImageRef): rebuild that image FROM the wardby release that includes session resume before its next run, or the run fails at input (worker_input_failed).";
|
|
86
|
+
export const SESSION_RESUME_NO_STORE_WARNING = "sessionResume is on but this server has no blob store (BLOB_STORE), so transcripts are not kept. See the resume-runs-locally help article.";
|
|
87
|
+
/** For a warning only: a half-set BLOB_STORE (which throws) counts as none, and never fails the tool call. */
|
|
88
|
+
function blobStoreConfigured() {
|
|
89
|
+
try {
|
|
90
|
+
return loadBlobStoreConfig(process.env) !== undefined;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/** Non-blocking warnings about an agent's coding profile as stored. */
|
|
97
|
+
function profileWarnings(profile, now) {
|
|
98
|
+
const warnings = profile?.dependencyCache && profile.workerImageRef ? [DEPENDENCY_CACHE_IMAGE_WARNING] : [];
|
|
99
|
+
if (profile?.sessionResume && profile.workerImageRef)
|
|
100
|
+
warnings.push(SESSION_RESUME_IMAGE_WARNING);
|
|
101
|
+
if (profile?.sessionResume && !blobStoreConfigured())
|
|
102
|
+
warnings.push(SESSION_RESUME_NO_STORE_WARNING);
|
|
103
|
+
if (profile && isPackageAuditActive(profile.packageAuditMode, profile.packageAuditUntil, now))
|
|
104
|
+
warnings.push(packageAuditActiveWarning(profile.packageAuditMode, profile.packageAuditUntil));
|
|
105
|
+
return warnings;
|
|
106
|
+
}
|
|
107
|
+
/** An agent as returned to operators: profile warnings, and whether package audit mode is in force now. */
|
|
108
|
+
function withProfileWarnings(agent) {
|
|
109
|
+
const now = new Date();
|
|
110
|
+
const profile = agent.codingProfile;
|
|
111
|
+
const shown = profile
|
|
112
|
+
? {
|
|
113
|
+
...agent,
|
|
114
|
+
codingProfile: {
|
|
115
|
+
...profile,
|
|
116
|
+
packageAuditActive: isPackageAuditActive(profile.packageAuditMode, profile.packageAuditUntil, now),
|
|
117
|
+
},
|
|
118
|
+
}
|
|
119
|
+
: agent;
|
|
120
|
+
const warnings = profileWarnings(profile, now);
|
|
121
|
+
return warnings.length ? { ...shown, warnings } : shown;
|
|
122
|
+
}
|
|
57
123
|
const agentFields = {
|
|
58
124
|
name: z.string().trim().min(1).max(MAX_AGENT_NAME_CHARS),
|
|
59
125
|
systemPrompt: z.string().min(1).max(MAX_SYSTEM_PROMPT_CHARS),
|
|
60
126
|
model: z.string().trim().min(1).max(MAX_MODEL_CHARS),
|
|
61
127
|
budgetUsd: z.number().finite().positive().max(MAX_BUDGET_USD),
|
|
62
128
|
maxTurns: z.number().int().min(1).max(100),
|
|
129
|
+
allowedOverrunPercent: z.number().int().min(0).max(100),
|
|
63
130
|
maxDelegationsPerRun: z.number().int().min(1).max(MAX_DELEGATIONS_PER_RUN),
|
|
64
131
|
parallelDelegations: z.boolean(),
|
|
65
132
|
schedule: z.string().trim().min(1).max(256),
|
|
@@ -69,6 +136,7 @@ const agentFields = {
|
|
|
69
136
|
budgetGroupId: z.string().min(1).max(128),
|
|
70
137
|
memoryEnabled: z.boolean(),
|
|
71
138
|
effort: z.enum(LLM_EFFORT_LEVELS),
|
|
139
|
+
nativeExecutionMode: z.enum(NATIVE_EXECUTION_MODES),
|
|
72
140
|
defectProjectKey: z.string().regex(PROJECT_KEY, "must be an upper-case Jira project key"),
|
|
73
141
|
defectIssueType: z.string().trim().min(1).max(100),
|
|
74
142
|
};
|
|
@@ -93,6 +161,7 @@ const CreateAgentSchema = z
|
|
|
93
161
|
model: agentFields.model,
|
|
94
162
|
budgetUsd: agentFields.budgetUsd,
|
|
95
163
|
maxTurns: agentFields.maxTurns.optional(),
|
|
164
|
+
allowedOverrunPercent: agentFields.allowedOverrunPercent.optional(),
|
|
96
165
|
maxDelegationsPerRun: agentFields.maxDelegationsPerRun.optional(),
|
|
97
166
|
parallelDelegations: agentFields.parallelDelegations.optional(),
|
|
98
167
|
schedule: agentFields.schedule.optional(),
|
|
@@ -102,6 +171,7 @@ const CreateAgentSchema = z
|
|
|
102
171
|
budgetGroupId: agentFields.budgetGroupId.optional(),
|
|
103
172
|
memoryEnabled: agentFields.memoryEnabled.default(false),
|
|
104
173
|
effort: agentFields.effort.optional(),
|
|
174
|
+
nativeExecutionMode: agentFields.nativeExecutionMode.optional(),
|
|
105
175
|
defectProjectKey: agentFields.defectProjectKey.optional(),
|
|
106
176
|
defectIssueType: agentFields.defectIssueType.optional(),
|
|
107
177
|
codingProfile: CodingProfileSchema.optional(),
|
|
@@ -149,6 +219,7 @@ const UpdateAgentSchema = z
|
|
|
149
219
|
model: agentFields.model.optional(),
|
|
150
220
|
budgetUsd: agentFields.budgetUsd.optional(),
|
|
151
221
|
maxTurns: agentFields.maxTurns.optional(),
|
|
222
|
+
allowedOverrunPercent: agentFields.allowedOverrunPercent.optional(),
|
|
152
223
|
maxDelegationsPerRun: agentFields.maxDelegationsPerRun.optional(),
|
|
153
224
|
parallelDelegations: agentFields.parallelDelegations.optional(),
|
|
154
225
|
schedule: agentFields.schedule.nullable().optional(),
|
|
@@ -158,11 +229,18 @@ const UpdateAgentSchema = z
|
|
|
158
229
|
budgetGroupId: agentFields.budgetGroupId.nullable().optional(),
|
|
159
230
|
memoryEnabled: agentFields.memoryEnabled.optional(),
|
|
160
231
|
effort: agentFields.effort.nullable().optional(),
|
|
232
|
+
nativeExecutionMode: agentFields.nativeExecutionMode.optional(),
|
|
161
233
|
defectProjectKey: agentFields.defectProjectKey.nullable().optional(),
|
|
162
234
|
defectIssueType: agentFields.defectIssueType.nullable().optional(),
|
|
163
235
|
codingProfile: CodingProfilePatchSchema.extend({
|
|
164
236
|
/** Not a stored profile field: sets CodingAgentProfile.debugTraceUntil = now + minutes (null clears). */
|
|
165
237
|
debugTraceMinutes: z.number().int().min(1).max(MAX_DEBUG_TRACE_MINUTES).nullable().optional(),
|
|
238
|
+
/** Admin-only like debugTraceMinutes: CodingAgentProfile.debugTraceMaxMb (null = the default). */
|
|
239
|
+
debugTraceMaxMb: z.number().int().min(1).max(MAX_DEBUG_TRACE_MAX_MB).nullable().optional(),
|
|
240
|
+
/** Not stored as given: sets CodingAgentProfile.packageAuditMode and packageAuditUntil (null clears both). */
|
|
241
|
+
packageAuditMode: z.enum(PACKAGE_AUDIT_MODES).nullable().optional(),
|
|
242
|
+
/** Not a stored field: the audit window, in minutes from now (default 24 hours). */
|
|
243
|
+
packageAuditMinutes: z.number().int().min(1).max(MAX_PACKAGE_AUDIT_MINUTES).optional(),
|
|
166
244
|
}).optional(),
|
|
167
245
|
repositoryAdminOverride: z.boolean().optional(),
|
|
168
246
|
})
|
|
@@ -210,7 +288,10 @@ const profileJsonSchema = {
|
|
|
210
288
|
collectExclude: { type: "array", maxItems: 64, items: { type: "string" } },
|
|
211
289
|
toolchain: { type: "string", enum: ["node", "node-python"] },
|
|
212
290
|
toolchainVersion: { type: ["string", "null"] },
|
|
213
|
-
workerImageRef: {
|
|
291
|
+
workerImageRef: {
|
|
292
|
+
type: ["string", "null"],
|
|
293
|
+
description: "A digest-pinned custom image that this agent's commands run in, for your own languages and tools. Codex: build it FROM the coding-worker driver image; it runs the whole agent. Claude Code: build it FROM this release's wardby-claude-tool-runner image; it runs the agent's commands, while Claude Code itself stays on the standard image. Needs agents:admin. Null uses the toolchain's standard image.",
|
|
294
|
+
},
|
|
214
295
|
workspaceDiskMb: {
|
|
215
296
|
type: ["integer", "null"],
|
|
216
297
|
minimum: 64,
|
|
@@ -223,6 +304,28 @@ const profileJsonSchema = {
|
|
|
223
304
|
maximum: MAX_CODING_TURNS,
|
|
224
305
|
description: `Claude Code runs only: the most agent turns (model calls) a run may take before it stops with coding_turn_limit. Null uses the worker default (${DEFAULT_CLAUDE_MAX_TURNS}). The run's budget and timeout still apply. Codex runs have no turn limit.`,
|
|
225
306
|
},
|
|
307
|
+
maxOutputTokens: {
|
|
308
|
+
type: ["integer", "null"],
|
|
309
|
+
minimum: MIN_CLAUDE_MAX_OUTPUT_TOKENS,
|
|
310
|
+
maximum: MAX_CLAUDE_MAX_OUTPUT_TOKENS,
|
|
311
|
+
description: `Claude Code runs only: the most output tokens per model reply (default ${DEFAULT_CLAUDE_MAX_OUTPUT_TOKENS}, up to ${MAX_CLAUDE_MAX_OUTPUT_TOKENS}). The coding proxy reserves this × the model's output price per request against the run budget, so higher values need a larger budgetUsd. Refused on a Codex agent. Null uses the default.`,
|
|
312
|
+
},
|
|
313
|
+
repoSkills: {
|
|
314
|
+
type: "boolean",
|
|
315
|
+
description: "Load the repository's agent skills into runs (Codex: .agents/skills and .codex/skills; Claude Code: .claude/skills). Default true. Repository instructions (AGENTS.md for Codex, CLAUDE.md for Claude Code) load either way.",
|
|
316
|
+
},
|
|
317
|
+
claudeBareMode: {
|
|
318
|
+
type: "boolean",
|
|
319
|
+
description: "Claude Code runs only. Default true: Claude Code runs in bare mode and wardby adds the repository's CLAUDE.md and its skill list to the system prompt; the model reads a skill's SKILL.md with run_command. False: bare mode is off and Claude Code loads CLAUDE.md and skills itself (native Skill tool). Repository settings, hooks, and MCP config are never loaded either way.",
|
|
320
|
+
},
|
|
321
|
+
dependencyCache: {
|
|
322
|
+
type: "boolean",
|
|
323
|
+
description: "Restore npm node_modules from a snapshot the proxy re-approves; needs package approval (packages:approve or agents:admin). Default false. The worker images must be a release that includes the cache; with a workerImageRef the result carries a warning to rebuild that image from it.",
|
|
324
|
+
},
|
|
325
|
+
sessionResume: {
|
|
326
|
+
type: "boolean",
|
|
327
|
+
description: "Claude Code runs only. Keep each run's session transcript (redacted) on the server so the session can later be continued in a local Claude Code CLI. Once transcripts are served, anyone who can read a run can read everything its agent saw. Needs a blob store (BLOB_STORE) on the server. Default false.",
|
|
328
|
+
},
|
|
226
329
|
packageAllowlist: {
|
|
227
330
|
type: "object",
|
|
228
331
|
description: "Approved top-level packages per ecosystem (npm, pypi). A PyPI entry may name extras, e.g. psycopg[binary]. Needs packages:approve or agents:admin.",
|
|
@@ -230,7 +333,16 @@ const profileJsonSchema = {
|
|
|
230
333
|
},
|
|
231
334
|
packagePolicy: {
|
|
232
335
|
type: "object",
|
|
233
|
-
|
|
336
|
+
description: "minReleaseAgeDays: days a release must have been public before it can be installed (0-30, default 3). acceptedAdvisories: advisory ids (GHSA-…, CVE-…) this agent's runs may install despite; malware never; every waiver is reported in the PR. Needs packages:approve or agents:admin.",
|
|
337
|
+
properties: {
|
|
338
|
+
minReleaseAgeDays: { type: "integer", minimum: 0, maximum: 30 },
|
|
339
|
+
acceptedAdvisories: {
|
|
340
|
+
type: "array",
|
|
341
|
+
maxItems: MAX_ACCEPTED_ADVISORIES,
|
|
342
|
+
uniqueItems: true,
|
|
343
|
+
items: { type: "string", pattern: ACCEPTED_ADVISORY_ID.source },
|
|
344
|
+
},
|
|
345
|
+
},
|
|
234
346
|
additionalProperties: false,
|
|
235
347
|
},
|
|
236
348
|
services: {
|
|
@@ -285,6 +397,23 @@ function validateEffort(kind, model, effort) {
|
|
|
285
397
|
: "It accepts no effort setting; leave effort unset (or null)."));
|
|
286
398
|
}
|
|
287
399
|
}
|
|
400
|
+
const NATIVE_SANDBOX_MODE_DESCRIPTION = "Where a native agent's runs execute: control-plane (default, in the server process) or sandbox (an isolated container; needs the server's native sandbox configured).";
|
|
401
|
+
/**
|
|
402
|
+
* The mode only applies to native agents, and `sandbox` only works where the
|
|
403
|
+
* server composed a native sandbox executor; refuse it otherwise rather than
|
|
404
|
+
* store a mode whose every run would fail closed.
|
|
405
|
+
*/
|
|
406
|
+
function validateNativeExecutionMode(ctx, kind, mode) {
|
|
407
|
+
if (mode == null)
|
|
408
|
+
return;
|
|
409
|
+
if (kind !== "native") {
|
|
410
|
+
throw new McpError(400, "nativeExecutionMode is only valid for native agents; coding agents do not use it.");
|
|
411
|
+
}
|
|
412
|
+
if (mode === "sandbox" && ctx.providers.executor.supportsNativeSandbox?.() !== true) {
|
|
413
|
+
throw new McpError(400, "native_sandbox_unavailable: this server has no native sandbox configured (set NATIVE_SANDBOX_LAUNCHER), " +
|
|
414
|
+
'so an agent cannot use nativeExecutionMode "sandbox".');
|
|
415
|
+
}
|
|
416
|
+
}
|
|
288
417
|
/**
|
|
289
418
|
* A model being set (create, or update with `model`) must be runnable here:
|
|
290
419
|
* in the catalog and enabled; for a native agent, its provider must also be
|
|
@@ -319,9 +448,14 @@ function storedProfile(profile) {
|
|
|
319
448
|
workerImageRef: profile.workerImageRef,
|
|
320
449
|
workspaceDiskMb: profile.workspaceDiskMb,
|
|
321
450
|
maxTurns: profile.maxTurns,
|
|
451
|
+
maxOutputTokens: profile.maxOutputTokens,
|
|
322
452
|
packageAllowlist: profile.packageAllowlist,
|
|
323
453
|
packagePolicy: profile.packagePolicy,
|
|
324
454
|
services: profile.services,
|
|
455
|
+
repoSkills: profile.repoSkills,
|
|
456
|
+
claudeBareMode: profile.claudeBareMode,
|
|
457
|
+
dependencyCache: profile.dependencyCache,
|
|
458
|
+
sessionResume: profile.sessionResume,
|
|
325
459
|
});
|
|
326
460
|
}
|
|
327
461
|
/** A service name an agent is allowed must exist in the catalog (any version); typos fail here, not at a run. */
|
|
@@ -347,6 +481,12 @@ export function registerAgentTools(mcp) {
|
|
|
347
481
|
model: { type: "string" },
|
|
348
482
|
budgetUsd: { type: "number" },
|
|
349
483
|
maxTurns: { type: "integer" },
|
|
484
|
+
allowedOverrunPercent: {
|
|
485
|
+
type: "integer",
|
|
486
|
+
minimum: 0,
|
|
487
|
+
maximum: 100,
|
|
488
|
+
description: "Percent above budgetUsd a run may spend before it is stopped. On a coding agent it raises each of its runs' limit; on a lead agent that delegates, it raises its run tree's ceiling for coding sub-agents. Native runs' own model calls are not affected. Budget group caps still apply. 0 = stop at budgetUsd.",
|
|
489
|
+
},
|
|
350
490
|
maxDelegationsPerRun: {
|
|
351
491
|
type: "integer",
|
|
352
492
|
minimum: 1,
|
|
@@ -366,6 +506,11 @@ export function registerAgentTools(mcp) {
|
|
|
366
506
|
enum: [...LLM_EFFORT_LEVELS],
|
|
367
507
|
description: "Reasoning effort for native agents. Unset uses the provider default.",
|
|
368
508
|
},
|
|
509
|
+
nativeExecutionMode: {
|
|
510
|
+
type: "string",
|
|
511
|
+
enum: [...NATIVE_EXECUTION_MODES],
|
|
512
|
+
description: NATIVE_SANDBOX_MODE_DESCRIPTION,
|
|
513
|
+
},
|
|
369
514
|
defectProjectKey: { type: "string", pattern: PROJECT_KEY.source, description: DEFECT_DESCRIPTION },
|
|
370
515
|
defectIssueType: { type: "string", minLength: 1, maxLength: 100, description: DEFECT_DESCRIPTION },
|
|
371
516
|
codingProfile: { ...profileJsonSchema, required: ["repository"] },
|
|
@@ -380,17 +525,24 @@ export function registerAgentTools(mcp) {
|
|
|
380
525
|
const packages = args.codingProfile;
|
|
381
526
|
if (packages &&
|
|
382
527
|
(Object.keys(packages.packageAllowlist ?? {}).length > 0 ||
|
|
383
|
-
Object.keys(packages.packagePolicy ?? {}).length > 0
|
|
528
|
+
Object.keys(packages.packagePolicy ?? {}).length > 0 ||
|
|
529
|
+
packages.dependencyCache === true))
|
|
384
530
|
requirePackageApproval(ctx);
|
|
385
531
|
validateSchedule(args.schedule, args.timezone ?? "UTC");
|
|
386
532
|
requireModelAvailable(ctx, args.model, args.kind);
|
|
387
533
|
validateEffort(args.kind, args.model, args.effort);
|
|
534
|
+
validateNativeExecutionMode(ctx, args.kind, args.nativeExecutionMode);
|
|
535
|
+
validateWorkspaceDiskMb(args.codingProfile?.workspaceDiskMb);
|
|
388
536
|
if (args.codingProfile)
|
|
389
537
|
await requireCatalogServiceNames(ctx.db, args.codingProfile.services);
|
|
390
538
|
if (args.budgetGroupId) {
|
|
391
539
|
await requireReadableBudgetGroup(ctx.db, args.budgetGroupId, ctx.principal.id);
|
|
392
540
|
}
|
|
393
|
-
const { codingProfile, repositoryAdminOverride, ...
|
|
541
|
+
const { codingProfile, repositoryAdminOverride, nativeExecutionMode, ...agentFieldsData } = args;
|
|
542
|
+
const agentData = {
|
|
543
|
+
...agentFieldsData,
|
|
544
|
+
...(nativeExecutionMode ? { nativeExecutionMode: toStoredMode(nativeExecutionMode) } : {}),
|
|
545
|
+
};
|
|
394
546
|
if (repositoryAdminOverride === true && !codingProfile) {
|
|
395
547
|
throw new McpError(400, "repositoryAdminOverride only applies with a codingProfile repository.");
|
|
396
548
|
}
|
|
@@ -407,6 +559,11 @@ export function registerAgentTools(mcp) {
|
|
|
407
559
|
const agent = await ctx.db.agent.create({
|
|
408
560
|
data: {
|
|
409
561
|
...agentData,
|
|
562
|
+
...(await scheduleStartFields(ctx.db, null, {
|
|
563
|
+
schedule: agentData.schedule ?? null,
|
|
564
|
+
timezone: agentData.timezone ?? "UTC",
|
|
565
|
+
scheduleEnabled: agentData.scheduleEnabled ?? true,
|
|
566
|
+
})),
|
|
410
567
|
ownerId: ctx.principal.id,
|
|
411
568
|
...(codingProfile && authorization
|
|
412
569
|
? { codingProfile: { create: { ...codingProfile, ...profileStamp(authorization) } } }
|
|
@@ -414,7 +571,7 @@ export function registerAgentTools(mcp) {
|
|
|
414
571
|
},
|
|
415
572
|
include: { codingProfile: true },
|
|
416
573
|
});
|
|
417
|
-
return textResult(agent);
|
|
574
|
+
return textResult(withProfileWarnings(withOperatorMode(agent)));
|
|
418
575
|
},
|
|
419
576
|
});
|
|
420
577
|
mcp.registerTool({
|
|
@@ -430,6 +587,12 @@ export function registerAgentTools(mcp) {
|
|
|
430
587
|
model: { type: "string" },
|
|
431
588
|
budgetUsd: { type: "number" },
|
|
432
589
|
maxTurns: { type: "integer" },
|
|
590
|
+
allowedOverrunPercent: {
|
|
591
|
+
type: "integer",
|
|
592
|
+
minimum: 0,
|
|
593
|
+
maximum: 100,
|
|
594
|
+
description: "Percent above budgetUsd a run may spend before it is stopped. On a coding agent it raises each of its runs' limit; on a lead agent that delegates, it raises its run tree's ceiling for coding sub-agents. Native runs' own model calls are not affected. Budget group caps still apply. 0 = stop at budgetUsd.",
|
|
595
|
+
},
|
|
433
596
|
maxDelegationsPerRun: {
|
|
434
597
|
type: "integer",
|
|
435
598
|
minimum: 1,
|
|
@@ -449,6 +612,11 @@ export function registerAgentTools(mcp) {
|
|
|
449
612
|
enum: [...LLM_EFFORT_LEVELS, null],
|
|
450
613
|
description: "Reasoning effort for native agents. Null clears it back to the provider default.",
|
|
451
614
|
},
|
|
615
|
+
nativeExecutionMode: {
|
|
616
|
+
type: "string",
|
|
617
|
+
enum: [...NATIVE_EXECUTION_MODES],
|
|
618
|
+
description: NATIVE_SANDBOX_MODE_DESCRIPTION,
|
|
619
|
+
},
|
|
452
620
|
defectProjectKey: {
|
|
453
621
|
type: ["string", "null"],
|
|
454
622
|
pattern: PROJECT_KEY.source,
|
|
@@ -470,6 +638,27 @@ export function registerAgentTools(mcp) {
|
|
|
470
638
|
maximum: MAX_DEBUG_TRACE_MINUTES,
|
|
471
639
|
description: "Admins only (agents:admin): trace every coding run of this agent for this many minutes from now; the worker writes its full stream trace, which can include prompts and repository content, to the run pod's log. Null turns it off.",
|
|
472
640
|
},
|
|
641
|
+
debugTraceMaxMb: {
|
|
642
|
+
type: ["integer", "null"],
|
|
643
|
+
minimum: 1,
|
|
644
|
+
maximum: MAX_DEBUG_TRACE_MAX_MB,
|
|
645
|
+
description: `Admins only (agents:admin): cap on one traced run's trace output, in MiB (default ${DEFAULT_DEBUG_TRACE_MAX_MB}); the trace stops with a limit_reached line once it is reached. Null restores the default.`,
|
|
646
|
+
},
|
|
647
|
+
packageAuditMode: {
|
|
648
|
+
type: ["string", "null"],
|
|
649
|
+
enum: [...PACKAGE_AUDIT_MODES, null],
|
|
650
|
+
description: "Package audit mode, for a limited time (packageAuditMinutes). Needs packages:approve or agents:admin, and only the agent's owner may set it. " +
|
|
651
|
+
'"audit": the registry installs packages outside this agent\'s allowlist instead of refusing them, and records each one; ' +
|
|
652
|
+
'"full": also installs versions withheld only by high or critical advisories. Malware is refused and the release-age limit enforced in every mode. ' +
|
|
653
|
+
"This weakens the supply-chain guard while it is on: use it to find out which packages a task needs, then add them to packageAllowlist. " +
|
|
654
|
+
"Fixed per run when the run is dispatched. Null turns it off.",
|
|
655
|
+
},
|
|
656
|
+
packageAuditMinutes: {
|
|
657
|
+
type: "integer",
|
|
658
|
+
minimum: 1,
|
|
659
|
+
maximum: MAX_PACKAGE_AUDIT_MINUTES,
|
|
660
|
+
description: `How long package audit mode stays on, in minutes from now (default ${DEFAULT_PACKAGE_AUDIT_MINUTES}, at most ${MAX_PACKAGE_AUDIT_MINUTES}: 7 days). Given alone, it re-arms the stored mode. Needs packages:approve or agents:admin.`,
|
|
661
|
+
},
|
|
473
662
|
},
|
|
474
663
|
},
|
|
475
664
|
repositoryAdminOverride: REPOSITORY_ADMIN_OVERRIDE,
|
|
@@ -481,9 +670,18 @@ export function registerAgentTools(mcp) {
|
|
|
481
670
|
if (args.codingProfile?.workerImageRef !== undefined)
|
|
482
671
|
requireWorkerImageRefScope(ctx);
|
|
483
672
|
const debugTraceMinutes = args.codingProfile?.debugTraceMinutes;
|
|
484
|
-
|
|
673
|
+
const debugTraceMaxMb = args.codingProfile?.debugTraceMaxMb;
|
|
674
|
+
if (debugTraceMinutes !== undefined || debugTraceMaxMb !== undefined)
|
|
485
675
|
requireDebugTraceScope(ctx);
|
|
486
|
-
|
|
676
|
+
const auditPatch = {
|
|
677
|
+
packageAuditMode: args.codingProfile?.packageAuditMode,
|
|
678
|
+
packageAuditMinutes: args.codingProfile?.packageAuditMinutes,
|
|
679
|
+
};
|
|
680
|
+
if (args.codingProfile?.packageAllowlist !== undefined ||
|
|
681
|
+
args.codingProfile?.packagePolicy !== undefined ||
|
|
682
|
+
args.codingProfile?.dependencyCache !== undefined ||
|
|
683
|
+
auditPatch.packageAuditMode !== undefined ||
|
|
684
|
+
auditPatch.packageAuditMinutes !== undefined)
|
|
487
685
|
requirePackageApproval(ctx);
|
|
488
686
|
// Repository authorization calls GitHub, so it runs before (outside) the
|
|
489
687
|
// serializable transaction, on a pre-read; the transaction then verifies
|
|
@@ -554,6 +752,7 @@ export function registerAgentTools(mcp) {
|
|
|
554
752
|
: debugTraceMinutes === null
|
|
555
753
|
? null
|
|
556
754
|
: new Date(Date.now() + debugTraceMinutes * 60_000);
|
|
755
|
+
let auditSet;
|
|
557
756
|
const agent = await ctx.db.$transaction(async (tx) => {
|
|
558
757
|
const existing = await tx.agent.findUnique({ where: { id: args.id }, include: { codingProfile: true } });
|
|
559
758
|
if (!existing)
|
|
@@ -575,6 +774,12 @@ export function registerAgentTools(mcp) {
|
|
|
575
774
|
await requireReadableBudgetGroup(tx, args.budgetGroupId, ctx.principal.id);
|
|
576
775
|
}
|
|
577
776
|
const nextKind = args.kind ?? existing.kind;
|
|
777
|
+
// A coding repository is an owner binding (agentOwnerBindings): an
|
|
778
|
+
// agent everyone can write never gets one, as attach_* refuse theirs.
|
|
779
|
+
if (((nextKind === "coding" && existing.kind !== "coding") || repositoryChanges(existing)) &&
|
|
780
|
+
(await isPublicWritable(tx, existing.id))) {
|
|
781
|
+
throw new McpError(409, `Agent "${args.id}" is writable by everyone, so it can't become a coding agent or get a repository; revoke or lower the everyone grant first.`);
|
|
782
|
+
}
|
|
578
783
|
if (nextKind === "native" && args.codingProfile) {
|
|
579
784
|
throw new McpError(400, "A coding profile is only valid for coding agents.");
|
|
580
785
|
}
|
|
@@ -585,6 +790,12 @@ export function registerAgentTools(mcp) {
|
|
|
585
790
|
if (args.model !== undefined || args.effort !== undefined || nextKind !== existing.kind) {
|
|
586
791
|
validateEffort(nextKind, args.model ?? existing.model, args.effort !== undefined ? args.effort : existing.effort);
|
|
587
792
|
}
|
|
793
|
+
if (args.nativeExecutionMode !== undefined) {
|
|
794
|
+
validateNativeExecutionMode(ctx, nextKind, args.nativeExecutionMode);
|
|
795
|
+
}
|
|
796
|
+
else if (nextKind === "coding" && existing.nativeExecutionMode === "sandbox") {
|
|
797
|
+
throw new McpError(400, 'nativeExecutionMode is only valid for native agents; set nativeExecutionMode to "control-plane" before changing this agent to coding.');
|
|
798
|
+
}
|
|
588
799
|
let nextProfile = null;
|
|
589
800
|
if (nextKind === "coding") {
|
|
590
801
|
const attachedTools = await tx.agentTool.count({ where: { agentId: args.id } });
|
|
@@ -592,11 +803,14 @@ export function registerAgentTools(mcp) {
|
|
|
592
803
|
throw new McpError(400, "Detach all native sandbox tools before changing an agent to coding.");
|
|
593
804
|
}
|
|
594
805
|
const currentProfile = existing.codingProfile ? storedProfile(existing.codingProfile) : undefined;
|
|
595
|
-
const { debugTraceMinutes: _minutes, ...profilePatch } = args.codingProfile ?? {};
|
|
806
|
+
const { debugTraceMinutes: _minutes, debugTraceMaxMb: _maxMb, packageAuditMode: _auditMode, packageAuditMinutes: _auditMinutes, ...profilePatch } = args.codingProfile ?? {};
|
|
596
807
|
const profileResult = CodingProfileSchema.safeParse({ ...currentProfile, ...profilePatch });
|
|
597
808
|
if (!profileResult.success)
|
|
598
809
|
throw invalidArguments("coding profile", profileResult.error);
|
|
599
810
|
nextProfile = profileResult.data;
|
|
811
|
+
if (typeof args.codingProfile?.workspaceDiskMb === "number" || nextKind !== existing.kind) {
|
|
812
|
+
validateWorkspaceDiskMb(nextProfile.workspaceDiskMb);
|
|
813
|
+
}
|
|
600
814
|
if (args.codingProfile?.services !== undefined)
|
|
601
815
|
await requireCatalogServiceNames(tx, nextProfile.services);
|
|
602
816
|
const nextModel = args.model ?? existing.model;
|
|
@@ -607,6 +821,19 @@ export function registerAgentTools(mcp) {
|
|
|
607
821
|
throw new McpError(400, `Model "${nextModel}" is not supported by coding provider "${nextProfile.provider}".`);
|
|
608
822
|
}
|
|
609
823
|
}
|
|
824
|
+
// Package audit mode: resolved against the stored mode inside the
|
|
825
|
+
// transaction, so minutes alone re-arm what is stored now.
|
|
826
|
+
let audit;
|
|
827
|
+
try {
|
|
828
|
+
const storedMode = existing.codingProfile?.packageAuditMode;
|
|
829
|
+
audit = resolvePackageAuditPatch({ mode: isPackageAuditMode(storedMode) ? storedMode : null }, auditPatch, new Date());
|
|
830
|
+
}
|
|
831
|
+
catch (error) {
|
|
832
|
+
if (error instanceof PackageAuditPatchError)
|
|
833
|
+
throw new McpError(400, error.message);
|
|
834
|
+
throw error;
|
|
835
|
+
}
|
|
836
|
+
auditSet = audit;
|
|
610
837
|
const nextSchedule = args.schedule !== undefined ? args.schedule : existing.schedule;
|
|
611
838
|
const nextTimezone = args.timezone ?? existing.timezone;
|
|
612
839
|
const nextScheduleEnabled = args.scheduleEnabled ?? existing.scheduleEnabled;
|
|
@@ -614,9 +841,17 @@ export function registerAgentTools(mcp) {
|
|
|
614
841
|
if (nextKind === "coding" && nextSchedule && nextScheduleEnabled && !nextProfile?.defaultTask) {
|
|
615
842
|
throw new McpError(400, "A default task is required for an enabled coding-agent schedule.");
|
|
616
843
|
}
|
|
617
|
-
const { id, codingProfile: _profilePatch, repositoryAdminOverride: _override, ...
|
|
844
|
+
const { id, codingProfile: _profilePatch, repositoryAdminOverride: _override, nativeExecutionMode: modeArg, ...fieldUpdates } = args;
|
|
845
|
+
const updates = {
|
|
846
|
+
...fieldUpdates,
|
|
847
|
+
...(modeArg ? { nativeExecutionMode: toStoredMode(modeArg) } : {}),
|
|
848
|
+
};
|
|
618
849
|
const stamp = authorization ? profileStamp(authorization) : {};
|
|
619
|
-
const trace =
|
|
850
|
+
const trace = {
|
|
851
|
+
...(debugTraceUntil === undefined ? {} : { debugTraceUntil }),
|
|
852
|
+
...(debugTraceMaxMb === undefined ? {} : { debugTraceMaxMb }),
|
|
853
|
+
...(audit === undefined ? {} : { packageAuditMode: audit.mode, packageAuditUntil: audit.until }),
|
|
854
|
+
};
|
|
620
855
|
const profileMutation = nextKind === "native"
|
|
621
856
|
? existing.codingProfile
|
|
622
857
|
? { delete: true }
|
|
@@ -624,34 +859,51 @@ export function registerAgentTools(mcp) {
|
|
|
624
859
|
: existing.codingProfile
|
|
625
860
|
? { update: { ...nextProfile, ...stamp, ...trace } }
|
|
626
861
|
: { create: { ...nextProfile, ...stamp, ...trace } };
|
|
862
|
+
const scheduleStart = await scheduleStartFields(tx, existing, {
|
|
863
|
+
schedule: nextSchedule,
|
|
864
|
+
timezone: nextTimezone,
|
|
865
|
+
scheduleEnabled: nextScheduleEnabled,
|
|
866
|
+
});
|
|
627
867
|
return tx.agent.update({
|
|
628
868
|
where: { id },
|
|
629
869
|
data: {
|
|
630
870
|
...updates,
|
|
871
|
+
...scheduleStart,
|
|
631
872
|
...(profileMutation ? { codingProfile: profileMutation } : {}),
|
|
632
873
|
},
|
|
633
874
|
include: { codingProfile: true },
|
|
634
875
|
});
|
|
635
876
|
}, { isolationLevel: Prisma.TransactionIsolationLevel.Serializable });
|
|
636
|
-
if (debugTraceUntil !== undefined) {
|
|
877
|
+
if (debugTraceUntil !== undefined || debugTraceMaxMb !== undefined) {
|
|
637
878
|
agentsLog.info({
|
|
638
879
|
event: "coding.debug_trace.set",
|
|
639
880
|
agentId: agent.id,
|
|
640
|
-
until: debugTraceUntil?.toISOString() ?? null,
|
|
881
|
+
...(debugTraceUntil !== undefined ? { until: debugTraceUntil?.toISOString() ?? null } : {}),
|
|
882
|
+
...(debugTraceMaxMb !== undefined ? { maxMb: debugTraceMaxMb } : {}),
|
|
641
883
|
by: ctx.principal.id,
|
|
642
884
|
}, "coding debug trace set");
|
|
643
885
|
}
|
|
644
|
-
|
|
886
|
+
if (auditSet !== undefined) {
|
|
887
|
+
agentsLog.info({
|
|
888
|
+
event: "coding.package_audit.set",
|
|
889
|
+
agentId: agent.id,
|
|
890
|
+
mode: auditSet.mode,
|
|
891
|
+
until: auditSet.until?.toISOString() ?? null,
|
|
892
|
+
by: ctx.principal.id,
|
|
893
|
+
}, "coding package audit mode set");
|
|
894
|
+
}
|
|
895
|
+
return textResult(withProfileWarnings(withOperatorMode(agent)));
|
|
645
896
|
},
|
|
646
897
|
});
|
|
647
898
|
mcp.registerTool({
|
|
648
899
|
name: "list_agents",
|
|
649
900
|
scope: "agents:read",
|
|
901
|
+
description: "Lists the agents you can see. Each row has an `access` field, your level on that agent: owner > write > execute > read. When showing the agents as a table, include `access` as a column.",
|
|
650
902
|
inputSchema: { type: "object", properties: {}, additionalProperties: false },
|
|
651
903
|
handler: async (_args, ctx) => {
|
|
652
904
|
const [where, accessOf] = await Promise.all([readableAgentsWhere(ctx), agentAccessResolver(ctx)]);
|
|
653
905
|
const agents = await ctx.db.agent.findMany({ where, include: { codingProfile: true } });
|
|
654
|
-
return textResult(agents.map((agent) => ({ ...agent, access: accessOf(agent) })));
|
|
906
|
+
return textResult(agents.map((agent) => ({ ...withOperatorMode(agent), access: accessOf(agent) })));
|
|
655
907
|
},
|
|
656
908
|
});
|
|
657
909
|
mcp.registerTool({
|
|
@@ -671,12 +923,13 @@ export function registerAgentTools(mcp) {
|
|
|
671
923
|
// A7: a tool's code and schema are its owner's, whoever can read the
|
|
672
924
|
// agent (the agent's owner included). Capabilities stay visible: config.
|
|
673
925
|
return textResult({
|
|
674
|
-
...agent,
|
|
926
|
+
...withProfileWarnings(withOperatorMode(agent)),
|
|
675
927
|
access,
|
|
676
|
-
|
|
928
|
+
// Zod 3 window: the caller's own tools carry their warnings (see core/zod3-window.ts).
|
|
929
|
+
tools: await Promise.all(agent.tools.map(async (attachment) => ({
|
|
677
930
|
...attachment,
|
|
678
|
-
tool: projectTool(attachment.tool, ctx.principal.id),
|
|
679
|
-
})),
|
|
931
|
+
tool: await withZod3ToolWarnings(projectTool(attachment.tool, ctx.principal.id)),
|
|
932
|
+
}))),
|
|
680
933
|
});
|
|
681
934
|
},
|
|
682
935
|
});
|
|
@@ -870,7 +1123,7 @@ export function registerAgentTools(mcp) {
|
|
|
870
1123
|
}
|
|
871
1124
|
}
|
|
872
1125
|
return {
|
|
873
|
-
...updated,
|
|
1126
|
+
...withOperatorMode(updated),
|
|
874
1127
|
repositoryApprovalsRevoked: revoked,
|
|
875
1128
|
bindingsRemoved,
|
|
876
1129
|
toolCapabilitiesSuspended,
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { Prisma } from "#prisma";
|
|
2
2
|
import { requireOwnedDatastore, canRead, assertCanMutate } from "../auth/ownership.js";
|
|
3
|
-
import { requireAgentAccess, requireBindingOwner } from "../auth/access.js";
|
|
3
|
+
import { requireAgentAccess, requireBindable, requireBindingOwner } from "../auth/access.js";
|
|
4
4
|
import { createDatastore, listDatastores, deleteDatastore, attachDatastore, detachDatastore, buildSharedDatastoreAccessor, } from "../../core/datastores.js";
|
|
5
5
|
import { McpError } from "../errors.js";
|
|
6
6
|
import { textResult } from "./text-result.js";
|
|
7
|
+
import { SecretInValueError, SecretCheckUnavailableError } from "../../core/secret-guard.js";
|
|
7
8
|
/**
|
|
8
9
|
* A `boundName` names an *attachment* (agentId, boundName) -> Datastore.
|
|
9
10
|
* Agent data (the private store and bound stores) is owner-only (resource-
|
|
@@ -99,7 +100,7 @@ export function registerDatastoreTools(mcp) {
|
|
|
99
100
|
// read it: strictly the agent owner's own datastore on the owner's
|
|
100
101
|
// own agent (A2/S2-2). Not even the stdio operator crosses owners.
|
|
101
102
|
const { agent } = await requireAgentAccess(ctx, args.agentId, "read");
|
|
102
|
-
|
|
103
|
+
await requireBindable(ctx, agent);
|
|
103
104
|
const datastore = await requireOwnedDatastore(ctx.db, args.datastoreId, ctx.principal.id);
|
|
104
105
|
if (datastore.ownerId !== agent.ownerId) {
|
|
105
106
|
throw new McpError(403, "Only a datastore owned by the agent's owner can be attached to it.");
|
|
@@ -191,14 +192,22 @@ export function registerDatastoreTools(mcp) {
|
|
|
191
192
|
},
|
|
192
193
|
handler: async (args, ctx) => {
|
|
193
194
|
await requireAgentAccess(ctx, args.agentId, "owner");
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
195
|
+
try {
|
|
196
|
+
if (args.boundName) {
|
|
197
|
+
await requireMutableSharedDatastore(ctx.db, args.agentId, args.boundName, ctx.principal.id);
|
|
198
|
+
const accessor = buildSharedDatastoreAccessor(args.agentId, ctx.providers.datastore, ctx.db);
|
|
199
|
+
await accessor.set(args.boundName, args.key, args.value, { pii: args.pii });
|
|
200
|
+
return textResult({ ok: true });
|
|
201
|
+
}
|
|
202
|
+
await ctx.providers.datastore.set(args.agentId, args.key, args.value, { pii: args.pii });
|
|
198
203
|
return textResult({ ok: true });
|
|
199
204
|
}
|
|
200
|
-
|
|
201
|
-
|
|
205
|
+
catch (err) {
|
|
206
|
+
if (err instanceof SecretInValueError || err instanceof SecretCheckUnavailableError) {
|
|
207
|
+
throw new McpError(400, err.message);
|
|
208
|
+
}
|
|
209
|
+
throw err;
|
|
210
|
+
}
|
|
202
211
|
},
|
|
203
212
|
});
|
|
204
213
|
mcp.registerTool({
|