@wardby/cli 0.6.0 → 0.8.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 +5 -5
- package/README.md +6 -1
- package/deploy/local/docker-compose.quickstart-coding.yml +19 -0
- package/dist/claude-coding-worker/driver.d.ts +33 -3
- package/dist/claude-coding-worker/driver.js +151 -21
- package/dist/claude-coding-worker/main.js +38 -6
- package/dist/claude-coding-worker/sdk.js +29 -2
- 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/claude-plugin/command.d.ts +61 -0
- package/dist/claude-plugin/command.js +376 -0
- package/dist/cli-help.d.ts +1 -1
- package/dist/cli-help.js +3 -1
- package/dist/cli.js +71 -13
- package/dist/coding/code-host.d.ts +16 -0
- package/dist/coding/code-host.js +60 -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/mcp-token.d.ts +12 -0
- package/dist/coding/mcp-token.js +26 -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 +46 -126
- package/dist/coding/profile.js +45 -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 +264 -346
- package/dist/coding/protocol.js +237 -12
- package/dist/coding/redact.d.ts +3 -0
- package/dist/coding/redact.js +17 -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 +52 -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 +8 -3
- package/dist/coding-worker/artifact.js +3 -1
- package/dist/coding-worker/debug-trace.d.ts +9 -6
- package/dist/coding-worker/debug-trace.js +16 -19
- 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 +124 -39
- package/dist/coding-worker/errors.d.ts +1 -0
- package/dist/coding-worker/errors.js +32 -0
- package/dist/coding-worker/main.js +5 -1
- package/dist/coding-worker/mcp-config.d.ts +27 -0
- package/dist/coding-worker/mcp-config.js +32 -0
- package/dist/coding-worker/sdk.d.ts +36 -0
- package/dist/coding-worker/sdk.js +28 -1
- 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 +15 -0
- package/dist/config/dependency-cache.d.ts +23 -0
- package/dist/config/dependency-cache.js +32 -0
- package/dist/config/mcp-call-limit.d.ts +8 -0
- package/dist/config/mcp-call-limit.js +18 -0
- package/dist/config/mcp-servers.d.ts +8 -0
- package/dist/config/mcp-servers.js +12 -0
- package/dist/config/providers.d.ts +12 -3
- package/dist/config/providers.js +55 -5
- package/dist/config/test-simulators.d.ts +92 -0
- package/dist/config/test-simulators.js +333 -0
- package/dist/config/tool-timeout.d.ts +1 -0
- package/dist/config/tool-timeout.js +18 -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-mcp.d.ts +36 -0
- package/dist/core/coding-mcp.js +253 -0
- package/dist/core/coding-queue.d.ts +2 -1
- package/dist/core/coding-queue.js +7 -0
- package/dist/core/coding-repository.d.ts +46 -0
- package/dist/core/coding-repository.js +92 -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/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/delegation-slots.d.ts +27 -0
- package/dist/core/delegation-slots.js +44 -0
- package/dist/core/dispatch.d.ts +48 -2
- package/dist/core/dispatch.js +166 -66
- package/dist/core/engine-native.js +1 -1
- package/dist/core/error-code.d.ts +38 -0
- package/dist/core/error-code.js +169 -0
- package/dist/core/grants.d.ts +46 -8
- package/dist/core/grants.js +99 -8
- package/dist/core/host-events.d.ts +18 -2
- package/dist/core/host-events.js +291 -27
- package/dist/core/host-status.d.ts +85 -3
- package/dist/core/host-status.js +300 -22
- package/dist/core/issue-bridge.d.ts +50 -6
- package/dist/core/issue-bridge.js +124 -33
- package/dist/core/issue-events.d.ts +1 -1
- package/dist/core/issue-events.js +4 -10
- package/dist/core/issue-status.d.ts +1 -1
- package/dist/core/issue-status.js +58 -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/mcp-client/client.d.ts +47 -0
- package/dist/core/mcp-client/client.js +141 -0
- package/dist/core/mcp-client/jsonrpc.d.ts +15 -0
- package/dist/core/mcp-client/jsonrpc.js +54 -0
- package/dist/core/mcp-client/results.d.ts +13 -0
- package/dist/core/mcp-client/results.js +42 -0
- package/dist/core/mcp-servers.d.ts +90 -0
- package/dist/core/mcp-servers.js +230 -0
- package/dist/core/mcp-tools.d.ts +108 -0
- package/dist/core/mcp-tools.js +287 -0
- package/dist/core/memory-tools.js +7 -0
- package/dist/core/merge-order-check.d.ts +2 -1
- package/dist/core/merge-order-check.js +44 -18
- package/dist/core/notification-dispatcher.js +2 -1
- package/dist/core/notification-templates.d.ts +1 -7
- package/dist/core/notification-templates.js +36 -2
- package/dist/core/pull-request-state-sync.js +2 -2
- package/dist/core/reconciler.d.ts +4 -3
- package/dist/core/reconciler.js +8 -1
- package/dist/core/related-pull-requests.d.ts +11 -3
- package/dist/core/related-pull-requests.js +49 -20
- package/dist/core/reply-parts.d.ts +21 -0
- package/dist/core/reply-parts.js +73 -0
- package/dist/core/review-fix.d.ts +1 -1
- package/dist/core/review-fix.js +4 -3
- package/dist/core/review-host-checks.d.ts +1 -1
- package/dist/core/review-host-tools.d.ts +3 -0
- package/dist/core/review-host-tools.js +102 -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 +145 -49
- package/dist/core/runner.js +719 -216
- 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 +12 -74
- package/dist/core/secret-broker-config.js +1 -1
- package/dist/core/secret-guard.d.ts +49 -0
- package/dist/core/secret-guard.js +119 -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 +11 -1
- package/dist/core/secrets.js +27 -1
- package/dist/core/serializable-retry.d.ts +18 -0
- package/dist/core/serializable-retry.js +43 -0
- package/dist/core/stop-run.d.ts +46 -0
- package/dist/core/stop-run.js +61 -0
- package/dist/core/tool-admin.d.ts +5 -1
- package/dist/core/tool-admin.js +7 -2
- package/dist/core/tool-names.d.ts +13 -0
- package/dist/core/tool-names.js +20 -0
- package/dist/core/webhooks.d.ts +4 -0
- package/dist/core/webhooks.js +68 -49
- package/dist/core/workflow-events.d.ts +14 -2
- package/dist/core/workflow-events.js +4 -0
- package/dist/core/workflow-run-events.d.ts +5 -3
- package/dist/core/workflow-run-events.js +45 -9
- 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 +65 -3
- package/dist/generated/prisma/client.d.ts +65 -3
- package/dist/generated/prisma/commonInputTypes.d.ts +266 -106
- package/dist/generated/prisma/enums.d.ts +10 -0
- package/dist/generated/prisma/enums.js +8 -0
- package/dist/generated/prisma/internal/class.d.ts +110 -0
- package/dist/generated/prisma/internal/class.js +4 -4
- package/dist/generated/prisma/internal/prismaNamespace.d.ts +957 -9
- package/dist/generated/prisma/internal/prismaNamespace.js +166 -2
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +174 -0
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +166 -2
- package/dist/generated/prisma/models/Agent.d.ts +377 -8
- package/dist/generated/prisma/models/AgentMcpServer.d.ts +1412 -0
- package/dist/generated/prisma/models/AgentMcpServer.js +1 -0
- package/dist/generated/prisma/models/AgentRepository.d.ts +81 -1
- package/dist/generated/prisma/models/AuthUser.d.ts +1 -1
- package/dist/generated/prisma/models/CodingAgentProfile.d.ts +228 -7
- package/dist/generated/prisma/models/CodingProxyRequest.d.ts +207 -3
- package/dist/generated/prisma/models/CodingProxySession.d.ts +232 -2
- package/dist/generated/prisma/models/CodingRun.d.ts +1712 -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/HostProvider.d.ts +2176 -0
- package/dist/generated/prisma/models/HostProvider.js +1 -0
- package/dist/generated/prisma/models/HostProviderCredential.d.ts +1285 -0
- package/dist/generated/prisma/models/HostProviderCredential.js +1 -0
- package/dist/generated/prisma/models/HostProviderOperation.d.ts +1470 -0
- package/dist/generated/prisma/models/HostProviderOperation.js +1 -0
- package/dist/generated/prisma/models/HostProviderTrustedAccount.d.ts +1145 -0
- package/dist/generated/prisma/models/HostProviderTrustedAccount.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/McpServer.d.ts +1500 -0
- package/dist/generated/prisma/models/McpServer.js +1 -0
- package/dist/generated/prisma/models/NativeGatewayCall.d.ts +77 -1
- package/dist/generated/prisma/models/NativeGatewaySession.d.ts +35 -1
- package/dist/generated/prisma/models/Principal.d.ts +167 -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/ResourceGrant.d.ts +1 -1
- package/dist/generated/prisma/models/Run.d.ts +738 -2
- package/dist/generated/prisma/models/RunBudgetEvent.d.ts +1211 -0
- package/dist/generated/prisma/models/RunBudgetEvent.js +1 -0
- 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 +387 -0
- package/dist/generated/prisma/models/Tool.d.ts +223 -1
- package/dist/generated/prisma/models.d.ts +10 -0
- package/dist/help/search.js +12 -3
- package/dist/help-index.json +2033 -110
- package/dist/import/create.js +48 -4
- package/dist/import/neutral-schema.d.ts +51 -281
- 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 +10 -2
- package/dist/mcp/auth/access.js +15 -1
- package/dist/mcp/auth/grants-cli.d.ts +6 -4
- package/dist/mcp/auth/grants-cli.js +42 -3
- package/dist/mcp/auth/ownership.d.ts +7 -7
- package/dist/mcp/auth/resource-server.d.ts +3 -1
- package/dist/mcp/auth/resource-server.js +17 -2
- 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 +3 -0
- package/dist/mcp/host-events/github-ingress.d.ts +2 -0
- package/dist/mcp/host-events/github-ingress.js +2 -1
- package/dist/mcp/index.d.ts +6 -0
- package/dist/mcp/index.js +69 -10
- 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 +295 -28
- package/dist/mcp/tools/datastore.js +17 -8
- package/dist/mcp/tools/grants.js +73 -29
- package/dist/mcp/tools/host-providers.d.ts +2 -0
- package/dist/mcp/tools/host-providers.js +215 -0
- package/dist/mcp/tools/mcp-servers.d.ts +26 -0
- package/dist/mcp/tools/mcp-servers.js +481 -0
- package/dist/mcp/tools/memory.js +11 -1
- package/dist/mcp/tools/notification-channels.js +2 -2
- package/dist/mcp/tools/packages.d.ts +2 -0
- package/dist/mcp/tools/packages.js +195 -0
- package/dist/mcp/tools/repositories.js +65 -12
- 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.js +209 -27
- package/dist/mcp/tools/scheduling.js +3 -1
- package/dist/mcp/tools/secret-elicitation-form.js +5 -0
- package/dist/mcp/tools/secret-elicitation-server.d.ts +6 -0
- package/dist/mcp/tools/secret-elicitation-server.js +10 -61
- package/dist/mcp/tools/secret-elicitation.d.ts +2 -0
- package/dist/mcp/tools/secret-elicitation.js +25 -2
- package/dist/mcp/tools/secrets.js +40 -6
- 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 +7 -5
- package/dist/mcp/tools/tools.js +64 -16
- package/dist/mcp/tools/trigger.js +28 -6
- package/dist/mcp/transport/http-limits.d.ts +2 -0
- package/dist/mcp/transport/http-limits.js +6 -2
- 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/mcp/webhooks/ingress.js +10 -0
- package/dist/native-worker/docker-launcher.d.ts +38 -2
- package/dist/native-worker/docker-launcher.js +65 -5
- package/dist/native-worker/gateway-server.d.ts +55 -3
- package/dist/native-worker/gateway-server.js +152 -34
- package/dist/native-worker/gateway.d.ts +29 -1
- package/dist/native-worker/gateway.js +74 -4
- package/dist/native-worker/http-server.d.ts +7 -1
- package/dist/native-worker/http-server.js +62 -7
- package/dist/native-worker/http-transport.js +1 -1
- package/dist/native-worker/kubernetes-launcher.d.ts +7 -3
- package/dist/native-worker/kubernetes-launcher.js +43 -3
- package/dist/native-worker/launch.d.ts +18 -1
- package/dist/native-worker/launch.js +6 -1
- package/dist/native-worker/ledger.d.ts +24 -4
- package/dist/native-worker/ledger.js +62 -8
- package/dist/native-worker/loopback.js +3 -8
- package/dist/native-worker/main.d.ts +2 -1
- package/dist/native-worker/main.js +14 -3
- package/dist/native-worker/protocol.d.ts +130 -577
- package/dist/native-worker/protocol.js +51 -2
- package/dist/native-worker/sandbox-executor.d.ts +17 -2
- package/dist/native-worker/sandbox-executor.js +78 -4
- 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 +1 -1
- package/dist/native-worker/stdio.js +6 -5
- package/dist/native-worker/warm-pool.d.ts +2 -2
- package/dist/native-worker/warm-pool.js +4 -4
- package/dist/native-worker/worker.js +28 -2
- package/dist/observability/metrics.js +6 -1
- package/dist/providers/auth/self-hosted.d.ts +1 -1
- package/dist/providers/coding-proxy/capability-hash.d.ts +2 -0
- package/dist/providers/coding-proxy/capability-hash.js +5 -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/mcp-route.d.ts +34 -0
- package/dist/providers/coding-proxy/mcp-route.js +166 -0
- package/dist/providers/coding-proxy/memory-ledger.d.ts +17 -2
- package/dist/providers/coding-proxy/memory-ledger.js +99 -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 +16 -2
- package/dist/providers/coding-proxy/prisma-ledger.js +209 -69
- package/dist/providers/coding-proxy/proxy.d.ts +21 -2
- package/dist/providers/coding-proxy/proxy.js +300 -48
- 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 +10 -0
- package/dist/providers/coding-proxy/runtime.js +109 -16
- package/dist/providers/coding-proxy/server.d.ts +9 -1
- package/dist/providers/coding-proxy/server.js +55 -1
- package/dist/providers/coding-proxy/types.d.ts +78 -1
- package/dist/providers/datastore/types.d.ts +5 -0
- package/dist/providers/engine/types.d.ts +17 -2
- package/dist/providers/engine/types.js +17 -0
- package/dist/providers/executor/composition.d.ts +10 -3
- package/dist/providers/executor/composition.js +52 -7
- package/dist/providers/executor/container.d.ts +394 -9
- package/dist/providers/executor/container.js +1210 -96
- 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 +50 -1
- package/dist/providers/executor/dbos.js +207 -20
- package/dist/providers/executor/deferred.d.ts +12 -24
- package/dist/providers/executor/deferred.js +10 -29
- 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 +2 -0
- package/dist/providers/executor/routing.js +4 -0
- package/dist/providers/executor/types.d.ts +13 -0
- package/dist/providers/host-tools/invoke.d.ts +37 -0
- package/dist/providers/host-tools/invoke.js +117 -0
- package/dist/providers/host-tools/operations.d.ts +65 -0
- package/dist/providers/host-tools/operations.js +149 -0
- package/dist/providers/host-tools/registry.d.ts +79 -0
- package/dist/providers/host-tools/registry.js +362 -0
- package/dist/providers/host-tools/request-guard.d.ts +17 -0
- package/dist/providers/host-tools/request-guard.js +99 -0
- package/dist/providers/host-tools/self-test.d.ts +64 -0
- package/dist/providers/host-tools/self-test.js +142 -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 +10 -2
- package/dist/providers/jobs/docker-isolation.js +47 -8
- package/dist/providers/jobs/docker.d.ts +9 -0
- package/dist/providers/jobs/docker.js +60 -11
- package/dist/providers/jobs/fake-kubernetes-api.d.ts +2 -0
- package/dist/providers/jobs/fake-kubernetes-api.js +3 -0
- package/dist/providers/jobs/kubernetes-api.d.ts +8 -0
- package/dist/providers/jobs/kubernetes-api.js +10 -0
- package/dist/providers/jobs/kubernetes-client.js +10 -1
- package/dist/providers/jobs/kubernetes-isolation.d.ts +5 -1
- package/dist/providers/jobs/kubernetes-isolation.js +32 -3
- package/dist/providers/jobs/kubernetes.d.ts +11 -1
- package/dist/providers/jobs/kubernetes.js +111 -17
- package/dist/providers/jobs/types.d.ts +39 -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 +29 -2
- package/dist/providers/review-host/github.js +224 -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 +140 -6
- package/dist/providers/review-host/types.js +9 -1
- 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 +39 -4
- package/dist/providers/vcs/git.js +339 -26
- 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 +183 -44
- package/dist/providers/vcs/github.js +455 -56
- package/dist/providers/vcs/index.d.ts +1 -1
- package/dist/providers/vcs/index.js +9 -2
- 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 +37 -1
- package/dist/providers/vcs/remote.js +7 -1
- package/dist/providers/vcs/routing.d.ts +16 -8
- package/dist/providers/vcs/routing.js +27 -6
- package/dist/providers/vcs/types.d.ts +150 -5
- package/dist/quickstart/coding-seed.d.ts +14 -3
- package/dist/quickstart/coding-seed.js +213 -4
- package/dist/quickstart/index.d.ts +5 -0
- package/dist/quickstart/index.js +21 -0
- 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/eval-core.d.ts +12 -2
- package/dist/sandbox/eval-core.js +20 -4
- 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 +5 -0
- package/dist/sandbox/host-functions.js +13 -13
- package/dist/sandbox/limits.d.ts +4 -1
- package/dist/sandbox/limits.js +4 -1
- package/dist/sandbox/run-in-sandbox.d.ts +6 -0
- package/dist/sandbox/run-in-sandbox.js +14 -2
- package/dist/sandbox/safe-fetch.d.ts +2 -0
- package/dist/sandbox/safe-fetch.js +1 -1
- package/dist/sandbox/secret-broker.d.ts +1 -0
- package/dist/sandbox/secret-broker.js +4 -5
- package/dist/sandbox/tool-capabilities.d.ts +10 -30
- package/dist/sandbox/tool-timeout.d.ts +32 -0
- package/dist/sandbox/tool-timeout.js +52 -0
- package/dist/sandbox/user-tool.d.ts +8 -1
- package/dist/sandbox/user-tool.js +9 -3
- package/dist/sandbox/zod-params.d.ts +37 -5
- package/dist/sandbox/zod-params.js +181 -26
- package/dist/serve.js +8 -1
- package/dist/viewer/api-schema.d.ts +349 -2627
- package/dist/viewer/api-schema.js +7 -0
- package/dist/viewer/build-schemas.js +6 -2
- package/dist/viewer/graph.js +2 -1
- package/dist/viewer/openapi.js +2 -4
- package/dist/wardby-bin.js +15 -0
- package/docs/README.md +11 -1
- package/docs/agent-recipes.md +95 -24
- package/docs/architecture-runtime.md +1 -1
- package/docs/claude-code-plugin.md +164 -0
- package/docs/code-review-agents.md +557 -41
- package/docs/coding-agent-setup.md +566 -8
- package/docs/coding-packages.md +1033 -90
- package/docs/coding-services.md +27 -12
- package/docs/coding-worker-byo-images.md +24 -2
- package/docs/coding-worker-isolation.md +183 -37
- package/docs/debugging-agent-runs.md +242 -0
- package/docs/getting-started-gke.md +129 -141
- package/docs/getting-started-identity-provider.md +53 -38
- package/docs/getting-started.md +17 -0
- package/docs/host-providers.md +294 -0
- package/docs/jira-agents.md +17 -8
- 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/mcp-servers.md +254 -0
- package/docs/native-sandbox.md +143 -31
- package/docs/observability.md +4 -0
- package/docs/security-deployment.md +139 -29
- package/docs/slack-notifications.md +35 -19
- package/docs/tool-secrets.md +45 -10
- package/docs/viewer-api.md +6 -0
- package/docs/viewer-api.openapi.yml +1 -1
- package/help/admin-viewer.md +28 -2
- package/help/agent-recipes.md +33 -2
- package/help/architecture-agent.md +11 -6
- package/help/brokered-secrets.md +3 -0
- package/help/build-claude-code-image.md +1 -1
- package/help/build-worker-image.md +3 -1
- package/help/builder-agent.md +19 -6
- package/help/claude-code-run-pane.md +40 -0
- package/help/code-review-agents.md +177 -6
- 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 +15 -8
- package/help/errors/budget-exhausted.md +187 -0
- package/help/errors/budget-group-exhausted.md +5 -1
- package/help/errors/coding-mcp-pins-unavailable.md +35 -0
- 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 +1 -1
- 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 +4 -0
- package/help/errors/graph-incomplete.md +43 -0
- package/help/errors/graph-limit.md +43 -0
- package/help/errors/host-provider-error.md +40 -0
- package/help/errors/host-tool-failed.md +36 -0
- package/help/errors/mcp-call-limit.md +22 -0
- package/help/errors/mcp-call-timeout.md +22 -0
- package/help/errors/mcp-server-auth-failed.md +22 -0
- package/help/errors/mcp-server-credentials-unavailable.md +45 -0
- package/help/errors/mcp-server-error.md +28 -0
- package/help/errors/mcp-server-unreachable.md +22 -0
- package/help/errors/mcp-servers-off.md +21 -0
- package/help/errors/mcp-tool-not-allowed.md +26 -0
- package/help/errors/mcp-tool-removed.md +22 -0
- package/help/errors/mcp-unavailable.md +25 -0
- package/help/errors/merge-conflict.md +49 -0
- package/help/errors/native-sandbox-capacity.md +1 -1
- package/help/errors/native-sandbox-deadline-exceeded.md +1 -1
- package/help/errors/native-sandbox-docker-failed.md +1 -1
- package/help/errors/native-sandbox-gateway-error.md +20 -0
- package/help/errors/native-sandbox-gateway-unavailable.md +1 -1
- package/help/errors/native-sandbox-image-not-pinned.md +1 -1
- package/help/errors/native-sandbox-isolation-mismatch.md +1 -1
- package/help/errors/native-sandbox-launch-abandoned.md +21 -0
- package/help/errors/native-sandbox-network-unenforced.md +1 -1
- package/help/errors/native-sandbox-requires-catalog.md +1 -1
- package/help/errors/native-sandbox-unavailable.md +1 -1
- package/help/errors/native-sandbox-warm-delivery-failed.md +1 -1
- package/help/errors/native-sandbox-worker-exited.md +4 -3
- package/help/errors/native-sandbox-worker-lost.md +1 -1
- package/help/errors/native-sandbox-worker-unready.md +1 -1
- 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/repository-not-listed.md +36 -0
- package/help/errors/repository-required.md +36 -0
- package/help/errors/run-lost.md +39 -0
- package/help/errors/run-transcript-download.md +44 -0
- package/help/errors/secret-in-value.md +69 -0
- package/help/errors/target-merge.md +40 -0
- package/help/errors/tool-timeout.md +38 -0
- package/help/fix-merge-conflicts.md +73 -0
- package/help/github-app-setup.md +132 -0
- package/help/github.md +22 -0
- package/help/host-providers.md +40 -0
- package/help/identity-and-access.md +6 -1
- package/help/jira.md +23 -6
- package/help/knowledge.md +16 -7
- package/help/local-repositories.md +1 -1
- package/help/low-power-mode.md +7 -1
- package/help/mcp-servers.md +73 -0
- package/help/mcp.md +7 -2
- package/help/merge-order-check.md +5 -0
- package/help/native-capabilities.md +55 -1
- package/help/native-sandbox.md +16 -2
- package/help/operating-agents.md +21 -0
- package/help/package-audit-mode.md +91 -0
- package/help/related-pull-requests.md +17 -10
- package/help/repo-instructions-and-skills.md +3 -1
- package/help/resume-runs-locally.md +134 -0
- package/help/review-fix-rounds.md +33 -1
- package/help/sharing-agents.md +59 -0
- package/help/slack-notifications.md +19 -5
- 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 +86 -7
- package/help/troubleshooting/debugging-agent-runs.md +29 -0
- package/package.json +18 -10
- 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/migrations/20261102000000_host_providers/migration.sql +56 -0
- package/prisma/migrations/20261104000000_coding_agent_repository_list/migration.sql +5 -0
- package/prisma/migrations/20261106000000_tool_timeout/migration.sql +4 -0
- package/prisma/migrations/20261107000000_mcp_servers/migration.sql +33 -0
- package/prisma/migrations/20261108000000_coding_mcp/migration.sql +5 -0
- package/prisma/migrations/20261109000000_task_run_index/migration.sql +3 -0
- package/prisma/schema.prisma +468 -109
- package/scripts/git-askpass.sh +1 -1
- package/dist/sandbox/generated/zod-to-json-schema.bundle.js +0 -5
package/dist/mcp/tools/agents.js
CHANGED
|
@@ -7,25 +7,42 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { Prisma } from "#prisma";
|
|
9
9
|
import { z } from "zod";
|
|
10
|
+
import { codeProviderOf } from "../../coding/code-host.js";
|
|
10
11
|
import { CodingProfilePatchSchema, CodingProfileSchema } from "../../coding/profile.js";
|
|
11
|
-
import { DEFAULT_CLAUDE_MAX_TURNS, MAX_CODING_TURNS, isLocalRepository } from "../../coding/protocol.js";
|
|
12
|
+
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";
|
|
13
|
+
import { loadBlobStoreConfig, loadContainerExecutorConfig } from "../../config/providers.js";
|
|
12
14
|
import { codingProviderSupportsModel } from "../../coding/provider.js";
|
|
15
|
+
import { ACCEPTED_ADVISORY_ID, MAX_ACCEPTED_ADVISORIES } from "../../coding/registry/allowlist.js";
|
|
16
|
+
import { DEFAULT_PACKAGE_AUDIT_MINUTES, isPackageAuditActive, isPackageAuditMode, MAX_PACKAGE_AUDIT_MINUTES, PACKAGE_AUDIT_MODES, PackageAuditPatchError, packageAuditActiveWarning, resolvePackageAuditPatch, } from "../../coding/registry/audit-mode.js";
|
|
13
17
|
import { assertAgentModelAvailable } from "../../core/run-pricing.js";
|
|
14
18
|
import { ModelUnavailableError } from "../../providers/llm/catalog-types.js";
|
|
15
19
|
import { currentModelCatalog } from "../../providers/llm/catalog-store.js";
|
|
16
20
|
import { validateCronExpression } from "../../core/cron.js";
|
|
21
|
+
import { scheduleStartFields } from "../../core/schedule-start.js";
|
|
22
|
+
import { preferIndexScans, withSerializableRetry } from "../../core/serializable-retry.js";
|
|
17
23
|
import { modelSupportedEfforts } from "../../providers/llm/routing.js";
|
|
24
|
+
import { agentMcpServerViews, codexUnavailableMcpTools, codexWriteToolsWarning } from "./mcp-servers.js";
|
|
25
|
+
import { isCodexCoding } from "../../core/mcp-tools.js";
|
|
18
26
|
import { PROJECT_KEY } from "../../providers/issue-tracker/types.js";
|
|
19
27
|
import { LLM_EFFORT_LEVELS, isLlmEffort } from "../../providers/llm/types.js";
|
|
20
28
|
import { requireReadableBudgetGroup } from "../auth/ownership.js";
|
|
21
29
|
import { agentAccessResolver, agentNotFound, assertAgentAccess, readableAgentsWhere, requireAgentAccess, } from "../auth/access.js";
|
|
22
|
-
import { EVERYONE_KEY, atLeast, canDelegate, deleteGrantsFor, effectiveAccess } from "../../core/grants.js";
|
|
30
|
+
import { EVERYONE_KEY, atLeast, canDelegate, deleteGrantsFor, effectiveAccess, isPublicWritable, filterUnusableMcpServers, } from "../../core/grants.js";
|
|
23
31
|
import { projectTool } from "./tools.js";
|
|
32
|
+
import { withZod3ToolWarnings } from "../../core/zod3-window.js";
|
|
24
33
|
import { requireAnyScope, requireScope } from "../auth/resource-server.js";
|
|
25
34
|
import { logger } from "../../core/logger.js";
|
|
26
35
|
import { authorizeRepositoryForSet, canonicalLocalRepository, } from "../auth/repo-authorization.js";
|
|
27
36
|
import { McpError } from "../errors.js";
|
|
28
37
|
import { textResult } from "./text-result.js";
|
|
38
|
+
function validateWorkspaceDiskMb(workspaceDiskMb) {
|
|
39
|
+
if (workspaceDiskMb == null)
|
|
40
|
+
return;
|
|
41
|
+
const { maxDiskMb } = loadContainerExecutorConfig();
|
|
42
|
+
if (workspaceDiskMb > maxDiskMb) {
|
|
43
|
+
throw new McpError(400, `workspaceDiskMb (${workspaceDiskMb} MiB) exceeds the deployment cap (${maxDiskMb} MiB). Raise CODING_MAX_DISK_MB to allow this size.`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
29
46
|
// workerImageRef is the BYO-arbitrary-image escape hatch (see
|
|
30
47
|
// resolveCodingWorkerImage/resolveCodingToolImage in container.ts). For a Codex agent it
|
|
31
48
|
// replaces the one container that runs the whole agent; for a Claude Code agent it replaces
|
|
@@ -67,12 +84,53 @@ function withOperatorMode(agent) {
|
|
|
67
84
|
nativeExecutionMode: agent.kind !== "native" ? null : agent.nativeExecutionMode === "sandbox" ? "sandbox" : "control-plane",
|
|
68
85
|
};
|
|
69
86
|
}
|
|
87
|
+
/** The warning create_agent / update_agent return (not a refusal): wardby can't tell how old a custom image is. */
|
|
88
|
+
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.";
|
|
89
|
+
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).";
|
|
90
|
+
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.";
|
|
91
|
+
/** For a warning only: a half-set BLOB_STORE (which throws) counts as none, and never fails the tool call. */
|
|
92
|
+
function blobStoreConfigured() {
|
|
93
|
+
try {
|
|
94
|
+
return loadBlobStoreConfig(process.env) !== undefined;
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/** Non-blocking warnings about an agent's coding profile as stored. */
|
|
101
|
+
function profileWarnings(profile, now) {
|
|
102
|
+
const warnings = profile?.dependencyCache && profile.workerImageRef ? [DEPENDENCY_CACHE_IMAGE_WARNING] : [];
|
|
103
|
+
if (profile?.sessionResume && profile.workerImageRef)
|
|
104
|
+
warnings.push(SESSION_RESUME_IMAGE_WARNING);
|
|
105
|
+
if (profile?.sessionResume && !blobStoreConfigured())
|
|
106
|
+
warnings.push(SESSION_RESUME_NO_STORE_WARNING);
|
|
107
|
+
if (profile && isPackageAuditActive(profile.packageAuditMode, profile.packageAuditUntil, now))
|
|
108
|
+
warnings.push(packageAuditActiveWarning(profile.packageAuditMode, profile.packageAuditUntil));
|
|
109
|
+
return warnings;
|
|
110
|
+
}
|
|
111
|
+
/** An agent as returned to operators: profile warnings, and whether package audit mode is in force now. */
|
|
112
|
+
function withProfileWarnings(agent) {
|
|
113
|
+
const now = new Date();
|
|
114
|
+
const profile = agent.codingProfile;
|
|
115
|
+
const shown = profile
|
|
116
|
+
? {
|
|
117
|
+
...agent,
|
|
118
|
+
codingProfile: {
|
|
119
|
+
...profile,
|
|
120
|
+
packageAuditActive: isPackageAuditActive(profile.packageAuditMode, profile.packageAuditUntil, now),
|
|
121
|
+
},
|
|
122
|
+
}
|
|
123
|
+
: agent;
|
|
124
|
+
const warnings = profileWarnings(profile, now);
|
|
125
|
+
return warnings.length ? { ...shown, warnings } : shown;
|
|
126
|
+
}
|
|
70
127
|
const agentFields = {
|
|
71
128
|
name: z.string().trim().min(1).max(MAX_AGENT_NAME_CHARS),
|
|
72
129
|
systemPrompt: z.string().min(1).max(MAX_SYSTEM_PROMPT_CHARS),
|
|
73
130
|
model: z.string().trim().min(1).max(MAX_MODEL_CHARS),
|
|
74
131
|
budgetUsd: z.number().finite().positive().max(MAX_BUDGET_USD),
|
|
75
132
|
maxTurns: z.number().int().min(1).max(100),
|
|
133
|
+
allowedOverrunPercent: z.number().int().min(0).max(100),
|
|
76
134
|
maxDelegationsPerRun: z.number().int().min(1).max(MAX_DELEGATIONS_PER_RUN),
|
|
77
135
|
parallelDelegations: z.boolean(),
|
|
78
136
|
schedule: z.string().trim().min(1).max(256),
|
|
@@ -107,6 +165,7 @@ const CreateAgentSchema = z
|
|
|
107
165
|
model: agentFields.model,
|
|
108
166
|
budgetUsd: agentFields.budgetUsd,
|
|
109
167
|
maxTurns: agentFields.maxTurns.optional(),
|
|
168
|
+
allowedOverrunPercent: agentFields.allowedOverrunPercent.optional(),
|
|
110
169
|
maxDelegationsPerRun: agentFields.maxDelegationsPerRun.optional(),
|
|
111
170
|
parallelDelegations: agentFields.parallelDelegations.optional(),
|
|
112
171
|
schedule: agentFields.schedule.optional(),
|
|
@@ -164,6 +223,7 @@ const UpdateAgentSchema = z
|
|
|
164
223
|
model: agentFields.model.optional(),
|
|
165
224
|
budgetUsd: agentFields.budgetUsd.optional(),
|
|
166
225
|
maxTurns: agentFields.maxTurns.optional(),
|
|
226
|
+
allowedOverrunPercent: agentFields.allowedOverrunPercent.optional(),
|
|
167
227
|
maxDelegationsPerRun: agentFields.maxDelegationsPerRun.optional(),
|
|
168
228
|
parallelDelegations: agentFields.parallelDelegations.optional(),
|
|
169
229
|
schedule: agentFields.schedule.nullable().optional(),
|
|
@@ -179,6 +239,12 @@ const UpdateAgentSchema = z
|
|
|
179
239
|
codingProfile: CodingProfilePatchSchema.extend({
|
|
180
240
|
/** Not a stored profile field: sets CodingAgentProfile.debugTraceUntil = now + minutes (null clears). */
|
|
181
241
|
debugTraceMinutes: z.number().int().min(1).max(MAX_DEBUG_TRACE_MINUTES).nullable().optional(),
|
|
242
|
+
/** Admin-only like debugTraceMinutes: CodingAgentProfile.debugTraceMaxMb (null = the default). */
|
|
243
|
+
debugTraceMaxMb: z.number().int().min(1).max(MAX_DEBUG_TRACE_MAX_MB).nullable().optional(),
|
|
244
|
+
/** Not stored as given: sets CodingAgentProfile.packageAuditMode and packageAuditUntil (null clears both). */
|
|
245
|
+
packageAuditMode: z.enum(PACKAGE_AUDIT_MODES).nullable().optional(),
|
|
246
|
+
/** Not a stored field: the audit window, in minutes from now (default 24 hours). */
|
|
247
|
+
packageAuditMinutes: z.number().int().min(1).max(MAX_PACKAGE_AUDIT_MINUTES).optional(),
|
|
182
248
|
}).optional(),
|
|
183
249
|
repositoryAdminOverride: z.boolean().optional(),
|
|
184
250
|
})
|
|
@@ -242,6 +308,12 @@ const profileJsonSchema = {
|
|
|
242
308
|
maximum: MAX_CODING_TURNS,
|
|
243
309
|
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.`,
|
|
244
310
|
},
|
|
311
|
+
maxOutputTokens: {
|
|
312
|
+
type: ["integer", "null"],
|
|
313
|
+
minimum: MIN_CLAUDE_MAX_OUTPUT_TOKENS,
|
|
314
|
+
maximum: MAX_CLAUDE_MAX_OUTPUT_TOKENS,
|
|
315
|
+
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.`,
|
|
316
|
+
},
|
|
245
317
|
repoSkills: {
|
|
246
318
|
type: "boolean",
|
|
247
319
|
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.",
|
|
@@ -250,6 +322,14 @@ const profileJsonSchema = {
|
|
|
250
322
|
type: "boolean",
|
|
251
323
|
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.",
|
|
252
324
|
},
|
|
325
|
+
dependencyCache: {
|
|
326
|
+
type: "boolean",
|
|
327
|
+
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.",
|
|
328
|
+
},
|
|
329
|
+
sessionResume: {
|
|
330
|
+
type: "boolean",
|
|
331
|
+
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.",
|
|
332
|
+
},
|
|
253
333
|
packageAllowlist: {
|
|
254
334
|
type: "object",
|
|
255
335
|
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.",
|
|
@@ -257,7 +337,16 @@ const profileJsonSchema = {
|
|
|
257
337
|
},
|
|
258
338
|
packagePolicy: {
|
|
259
339
|
type: "object",
|
|
260
|
-
|
|
340
|
+
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.",
|
|
341
|
+
properties: {
|
|
342
|
+
minReleaseAgeDays: { type: "integer", minimum: 0, maximum: 30 },
|
|
343
|
+
acceptedAdvisories: {
|
|
344
|
+
type: "array",
|
|
345
|
+
maxItems: MAX_ACCEPTED_ADVISORIES,
|
|
346
|
+
uniqueItems: true,
|
|
347
|
+
items: { type: "string", pattern: ACCEPTED_ADVISORY_ID.source },
|
|
348
|
+
},
|
|
349
|
+
},
|
|
261
350
|
additionalProperties: false,
|
|
262
351
|
},
|
|
263
352
|
services: {
|
|
@@ -363,11 +452,14 @@ function storedProfile(profile) {
|
|
|
363
452
|
workerImageRef: profile.workerImageRef,
|
|
364
453
|
workspaceDiskMb: profile.workspaceDiskMb,
|
|
365
454
|
maxTurns: profile.maxTurns,
|
|
455
|
+
maxOutputTokens: profile.maxOutputTokens,
|
|
366
456
|
packageAllowlist: profile.packageAllowlist,
|
|
367
457
|
packagePolicy: profile.packagePolicy,
|
|
368
458
|
services: profile.services,
|
|
369
459
|
repoSkills: profile.repoSkills,
|
|
370
460
|
claudeBareMode: profile.claudeBareMode,
|
|
461
|
+
dependencyCache: profile.dependencyCache,
|
|
462
|
+
sessionResume: profile.sessionResume,
|
|
371
463
|
});
|
|
372
464
|
}
|
|
373
465
|
/** A service name an agent is allowed must exist in the catalog (any version); typos fail here, not at a run. */
|
|
@@ -393,11 +485,17 @@ export function registerAgentTools(mcp) {
|
|
|
393
485
|
model: { type: "string" },
|
|
394
486
|
budgetUsd: { type: "number" },
|
|
395
487
|
maxTurns: { type: "integer" },
|
|
488
|
+
allowedOverrunPercent: {
|
|
489
|
+
type: "integer",
|
|
490
|
+
minimum: 0,
|
|
491
|
+
maximum: 100,
|
|
492
|
+
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.",
|
|
493
|
+
},
|
|
396
494
|
maxDelegationsPerRun: {
|
|
397
495
|
type: "integer",
|
|
398
496
|
minimum: 1,
|
|
399
497
|
maximum: MAX_DELEGATIONS_PER_RUN,
|
|
400
|
-
description: "Native agents with sub-agents: how many delegate_to_* calls one run may make,
|
|
498
|
+
description: "Native agents with sub-agents: how many delegate_to_* calls one run may make, to each sub-agent and repository at most once " +
|
|
401
499
|
"(one after another, or together with parallelDelegations). Default 1: route to exactly one.",
|
|
402
500
|
},
|
|
403
501
|
parallelDelegations: { type: "boolean", description: PARALLEL_DELEGATIONS_DESCRIPTION },
|
|
@@ -431,12 +529,14 @@ export function registerAgentTools(mcp) {
|
|
|
431
529
|
const packages = args.codingProfile;
|
|
432
530
|
if (packages &&
|
|
433
531
|
(Object.keys(packages.packageAllowlist ?? {}).length > 0 ||
|
|
434
|
-
Object.keys(packages.packagePolicy ?? {}).length > 0
|
|
532
|
+
Object.keys(packages.packagePolicy ?? {}).length > 0 ||
|
|
533
|
+
packages.dependencyCache === true))
|
|
435
534
|
requirePackageApproval(ctx);
|
|
436
535
|
validateSchedule(args.schedule, args.timezone ?? "UTC");
|
|
437
536
|
requireModelAvailable(ctx, args.model, args.kind);
|
|
438
537
|
validateEffort(args.kind, args.model, args.effort);
|
|
439
538
|
validateNativeExecutionMode(ctx, args.kind, args.nativeExecutionMode);
|
|
539
|
+
validateWorkspaceDiskMb(args.codingProfile?.workspaceDiskMb);
|
|
440
540
|
if (args.codingProfile)
|
|
441
541
|
await requireCatalogServiceNames(ctx.db, args.codingProfile.services);
|
|
442
542
|
if (args.budgetGroupId) {
|
|
@@ -454,7 +554,7 @@ export function registerAgentTools(mcp) {
|
|
|
454
554
|
const authorization = codingProfile
|
|
455
555
|
? await authorizeRepositoryForSet(ctx, {
|
|
456
556
|
ownerId: ctx.principal.id,
|
|
457
|
-
provider:
|
|
557
|
+
provider: codeProviderOf(codingProfile.repository),
|
|
458
558
|
repository: codingProfile.repository,
|
|
459
559
|
kind: "coding",
|
|
460
560
|
adminOverride: repositoryAdminOverride === true,
|
|
@@ -463,6 +563,11 @@ export function registerAgentTools(mcp) {
|
|
|
463
563
|
const agent = await ctx.db.agent.create({
|
|
464
564
|
data: {
|
|
465
565
|
...agentData,
|
|
566
|
+
...(await scheduleStartFields(ctx.db, null, {
|
|
567
|
+
schedule: agentData.schedule ?? null,
|
|
568
|
+
timezone: agentData.timezone ?? "UTC",
|
|
569
|
+
scheduleEnabled: agentData.scheduleEnabled ?? true,
|
|
570
|
+
})),
|
|
466
571
|
ownerId: ctx.principal.id,
|
|
467
572
|
...(codingProfile && authorization
|
|
468
573
|
? { codingProfile: { create: { ...codingProfile, ...profileStamp(authorization) } } }
|
|
@@ -470,7 +575,7 @@ export function registerAgentTools(mcp) {
|
|
|
470
575
|
},
|
|
471
576
|
include: { codingProfile: true },
|
|
472
577
|
});
|
|
473
|
-
return textResult(withOperatorMode(agent));
|
|
578
|
+
return textResult(withProfileWarnings(withOperatorMode(agent)));
|
|
474
579
|
},
|
|
475
580
|
});
|
|
476
581
|
mcp.registerTool({
|
|
@@ -486,11 +591,17 @@ export function registerAgentTools(mcp) {
|
|
|
486
591
|
model: { type: "string" },
|
|
487
592
|
budgetUsd: { type: "number" },
|
|
488
593
|
maxTurns: { type: "integer" },
|
|
594
|
+
allowedOverrunPercent: {
|
|
595
|
+
type: "integer",
|
|
596
|
+
minimum: 0,
|
|
597
|
+
maximum: 100,
|
|
598
|
+
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.",
|
|
599
|
+
},
|
|
489
600
|
maxDelegationsPerRun: {
|
|
490
601
|
type: "integer",
|
|
491
602
|
minimum: 1,
|
|
492
603
|
maximum: MAX_DELEGATIONS_PER_RUN,
|
|
493
|
-
description: "Native agents with sub-agents: how many delegate_to_* calls one run may make,
|
|
604
|
+
description: "Native agents with sub-agents: how many delegate_to_* calls one run may make, to each sub-agent and repository at most once " +
|
|
494
605
|
"(one after another, or together with parallelDelegations). Default 1: route to exactly one.",
|
|
495
606
|
},
|
|
496
607
|
parallelDelegations: { type: "boolean", description: PARALLEL_DELEGATIONS_DESCRIPTION },
|
|
@@ -531,6 +642,27 @@ export function registerAgentTools(mcp) {
|
|
|
531
642
|
maximum: MAX_DEBUG_TRACE_MINUTES,
|
|
532
643
|
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.",
|
|
533
644
|
},
|
|
645
|
+
debugTraceMaxMb: {
|
|
646
|
+
type: ["integer", "null"],
|
|
647
|
+
minimum: 1,
|
|
648
|
+
maximum: MAX_DEBUG_TRACE_MAX_MB,
|
|
649
|
+
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.`,
|
|
650
|
+
},
|
|
651
|
+
packageAuditMode: {
|
|
652
|
+
type: ["string", "null"],
|
|
653
|
+
enum: [...PACKAGE_AUDIT_MODES, null],
|
|
654
|
+
description: "Package audit mode, for a limited time (packageAuditMinutes). Needs packages:approve or agents:admin, and only the agent's owner may set it. " +
|
|
655
|
+
'"audit": the registry installs packages outside this agent\'s allowlist instead of refusing them, and records each one; ' +
|
|
656
|
+
'"full": also installs versions withheld only by high or critical advisories. Malware is refused and the release-age limit enforced in every mode. ' +
|
|
657
|
+
"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. " +
|
|
658
|
+
"Fixed per run when the run is dispatched. Null turns it off.",
|
|
659
|
+
},
|
|
660
|
+
packageAuditMinutes: {
|
|
661
|
+
type: "integer",
|
|
662
|
+
minimum: 1,
|
|
663
|
+
maximum: MAX_PACKAGE_AUDIT_MINUTES,
|
|
664
|
+
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.`,
|
|
665
|
+
},
|
|
534
666
|
},
|
|
535
667
|
},
|
|
536
668
|
repositoryAdminOverride: REPOSITORY_ADMIN_OVERRIDE,
|
|
@@ -542,9 +674,18 @@ export function registerAgentTools(mcp) {
|
|
|
542
674
|
if (args.codingProfile?.workerImageRef !== undefined)
|
|
543
675
|
requireWorkerImageRefScope(ctx);
|
|
544
676
|
const debugTraceMinutes = args.codingProfile?.debugTraceMinutes;
|
|
545
|
-
|
|
677
|
+
const debugTraceMaxMb = args.codingProfile?.debugTraceMaxMb;
|
|
678
|
+
if (debugTraceMinutes !== undefined || debugTraceMaxMb !== undefined)
|
|
546
679
|
requireDebugTraceScope(ctx);
|
|
547
|
-
|
|
680
|
+
const auditPatch = {
|
|
681
|
+
packageAuditMode: args.codingProfile?.packageAuditMode,
|
|
682
|
+
packageAuditMinutes: args.codingProfile?.packageAuditMinutes,
|
|
683
|
+
};
|
|
684
|
+
if (args.codingProfile?.packageAllowlist !== undefined ||
|
|
685
|
+
args.codingProfile?.packagePolicy !== undefined ||
|
|
686
|
+
args.codingProfile?.dependencyCache !== undefined ||
|
|
687
|
+
auditPatch.packageAuditMode !== undefined ||
|
|
688
|
+
auditPatch.packageAuditMinutes !== undefined)
|
|
548
689
|
requirePackageApproval(ctx);
|
|
549
690
|
// Repository authorization calls GitHub, so it runs before (outside) the
|
|
550
691
|
// serializable transaction, on a pre-read; the transaction then verifies
|
|
@@ -601,7 +742,7 @@ export function registerAgentTools(mcp) {
|
|
|
601
742
|
const authorization = plannedRepository !== null && repositoryChanges(before)
|
|
602
743
|
? await authorizeRepositoryForSet(ctx, {
|
|
603
744
|
ownerId: before.ownerId,
|
|
604
|
-
provider:
|
|
745
|
+
provider: codeProviderOf(plannedRepository),
|
|
605
746
|
repository: plannedRepository,
|
|
606
747
|
kind: "coding",
|
|
607
748
|
adminOverride: args.repositoryAdminOverride === true,
|
|
@@ -615,6 +756,7 @@ export function registerAgentTools(mcp) {
|
|
|
615
756
|
: debugTraceMinutes === null
|
|
616
757
|
? null
|
|
617
758
|
: new Date(Date.now() + debugTraceMinutes * 60_000);
|
|
759
|
+
let auditSet;
|
|
618
760
|
const agent = await ctx.db.$transaction(async (tx) => {
|
|
619
761
|
const existing = await tx.agent.findUnique({ where: { id: args.id }, include: { codingProfile: true } });
|
|
620
762
|
if (!existing)
|
|
@@ -636,6 +778,23 @@ export function registerAgentTools(mcp) {
|
|
|
636
778
|
await requireReadableBudgetGroup(tx, args.budgetGroupId, ctx.principal.id);
|
|
637
779
|
}
|
|
638
780
|
const nextKind = args.kind ?? existing.kind;
|
|
781
|
+
if (nextKind !== existing.kind) {
|
|
782
|
+
// A write link without triggers is a coding agent's extra repository
|
|
783
|
+
// and a native agent's plain write access; changing kind would
|
|
784
|
+
// silently reinterpret it.
|
|
785
|
+
const reinterpreted = await tx.agentRepository.count({
|
|
786
|
+
where: { agentId: args.id, access: "write", triggers: { isEmpty: true } },
|
|
787
|
+
});
|
|
788
|
+
if (reinterpreted > 0) {
|
|
789
|
+
throw new McpError(400, `Agent "${args.id}" has write repository links without triggers, which mean different things on native and coding agents; unlink them before changing its kind.`);
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
// A coding repository is an owner binding (agentOwnerBindings): an
|
|
793
|
+
// agent everyone can write never gets one, as attach_* refuse theirs.
|
|
794
|
+
if (((nextKind === "coding" && existing.kind !== "coding") || repositoryChanges(existing)) &&
|
|
795
|
+
(await isPublicWritable(tx, existing.id))) {
|
|
796
|
+
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.`);
|
|
797
|
+
}
|
|
639
798
|
if (nextKind === "native" && args.codingProfile) {
|
|
640
799
|
throw new McpError(400, "A coding profile is only valid for coding agents.");
|
|
641
800
|
}
|
|
@@ -659,11 +818,14 @@ export function registerAgentTools(mcp) {
|
|
|
659
818
|
throw new McpError(400, "Detach all native sandbox tools before changing an agent to coding.");
|
|
660
819
|
}
|
|
661
820
|
const currentProfile = existing.codingProfile ? storedProfile(existing.codingProfile) : undefined;
|
|
662
|
-
const { debugTraceMinutes: _minutes, ...profilePatch } = args.codingProfile ?? {};
|
|
821
|
+
const { debugTraceMinutes: _minutes, debugTraceMaxMb: _maxMb, packageAuditMode: _auditMode, packageAuditMinutes: _auditMinutes, ...profilePatch } = args.codingProfile ?? {};
|
|
663
822
|
const profileResult = CodingProfileSchema.safeParse({ ...currentProfile, ...profilePatch });
|
|
664
823
|
if (!profileResult.success)
|
|
665
824
|
throw invalidArguments("coding profile", profileResult.error);
|
|
666
825
|
nextProfile = profileResult.data;
|
|
826
|
+
if (typeof args.codingProfile?.workspaceDiskMb === "number" || nextKind !== existing.kind) {
|
|
827
|
+
validateWorkspaceDiskMb(nextProfile.workspaceDiskMb);
|
|
828
|
+
}
|
|
667
829
|
if (args.codingProfile?.services !== undefined)
|
|
668
830
|
await requireCatalogServiceNames(tx, nextProfile.services);
|
|
669
831
|
const nextModel = args.model ?? existing.model;
|
|
@@ -674,6 +836,19 @@ export function registerAgentTools(mcp) {
|
|
|
674
836
|
throw new McpError(400, `Model "${nextModel}" is not supported by coding provider "${nextProfile.provider}".`);
|
|
675
837
|
}
|
|
676
838
|
}
|
|
839
|
+
// Package audit mode: resolved against the stored mode inside the
|
|
840
|
+
// transaction, so minutes alone re-arm what is stored now.
|
|
841
|
+
let audit;
|
|
842
|
+
try {
|
|
843
|
+
const storedMode = existing.codingProfile?.packageAuditMode;
|
|
844
|
+
audit = resolvePackageAuditPatch({ mode: isPackageAuditMode(storedMode) ? storedMode : null }, auditPatch, new Date());
|
|
845
|
+
}
|
|
846
|
+
catch (error) {
|
|
847
|
+
if (error instanceof PackageAuditPatchError)
|
|
848
|
+
throw new McpError(400, error.message);
|
|
849
|
+
throw error;
|
|
850
|
+
}
|
|
851
|
+
auditSet = audit;
|
|
677
852
|
const nextSchedule = args.schedule !== undefined ? args.schedule : existing.schedule;
|
|
678
853
|
const nextTimezone = args.timezone ?? existing.timezone;
|
|
679
854
|
const nextScheduleEnabled = args.scheduleEnabled ?? existing.scheduleEnabled;
|
|
@@ -687,7 +862,11 @@ export function registerAgentTools(mcp) {
|
|
|
687
862
|
...(modeArg ? { nativeExecutionMode: toStoredMode(modeArg) } : {}),
|
|
688
863
|
};
|
|
689
864
|
const stamp = authorization ? profileStamp(authorization) : {};
|
|
690
|
-
const trace =
|
|
865
|
+
const trace = {
|
|
866
|
+
...(debugTraceUntil === undefined ? {} : { debugTraceUntil }),
|
|
867
|
+
...(debugTraceMaxMb === undefined ? {} : { debugTraceMaxMb }),
|
|
868
|
+
...(audit === undefined ? {} : { packageAuditMode: audit.mode, packageAuditUntil: audit.until }),
|
|
869
|
+
};
|
|
691
870
|
const profileMutation = nextKind === "native"
|
|
692
871
|
? existing.codingProfile
|
|
693
872
|
? { delete: true }
|
|
@@ -695,32 +874,91 @@ export function registerAgentTools(mcp) {
|
|
|
695
874
|
: existing.codingProfile
|
|
696
875
|
? { update: { ...nextProfile, ...stamp, ...trace } }
|
|
697
876
|
: { create: { ...nextProfile, ...stamp, ...trace } };
|
|
877
|
+
const scheduleStart = await scheduleStartFields(tx, existing, {
|
|
878
|
+
schedule: nextSchedule,
|
|
879
|
+
timezone: nextTimezone,
|
|
880
|
+
scheduleEnabled: nextScheduleEnabled,
|
|
881
|
+
});
|
|
698
882
|
return tx.agent.update({
|
|
699
883
|
where: { id },
|
|
700
884
|
data: {
|
|
701
885
|
...updates,
|
|
886
|
+
...scheduleStart,
|
|
702
887
|
...(profileMutation ? { codingProfile: profileMutation } : {}),
|
|
703
888
|
},
|
|
704
889
|
include: { codingProfile: true },
|
|
705
890
|
});
|
|
706
891
|
}, { isolationLevel: Prisma.TransactionIsolationLevel.Serializable });
|
|
707
|
-
if (debugTraceUntil !== undefined) {
|
|
892
|
+
if (debugTraceUntil !== undefined || debugTraceMaxMb !== undefined) {
|
|
708
893
|
agentsLog.info({
|
|
709
894
|
event: "coding.debug_trace.set",
|
|
710
895
|
agentId: agent.id,
|
|
711
|
-
until: debugTraceUntil?.toISOString() ?? null,
|
|
896
|
+
...(debugTraceUntil !== undefined ? { until: debugTraceUntil?.toISOString() ?? null } : {}),
|
|
897
|
+
...(debugTraceMaxMb !== undefined ? { maxMb: debugTraceMaxMb } : {}),
|
|
712
898
|
by: ctx.principal.id,
|
|
713
899
|
}, "coding debug trace set");
|
|
714
900
|
}
|
|
715
|
-
|
|
901
|
+
if (auditSet !== undefined) {
|
|
902
|
+
agentsLog.info({
|
|
903
|
+
event: "coding.package_audit.set",
|
|
904
|
+
agentId: agent.id,
|
|
905
|
+
mode: auditSet.mode,
|
|
906
|
+
until: auditSet.until?.toISOString() ?? null,
|
|
907
|
+
by: ctx.principal.id,
|
|
908
|
+
}, "coding package audit mode set");
|
|
909
|
+
}
|
|
910
|
+
const shown = withProfileWarnings(withOperatorMode(agent));
|
|
911
|
+
// Becoming Codex (a provider switch, or a native agent becoming coding) leaves out every attached
|
|
912
|
+
// MCP tool the server doesn't mark read-only: say which, so the owner isn't surprised by a run.
|
|
913
|
+
const wasCodex = before.kind === "coding" && isCodexCoding(before.codingProfile?.provider);
|
|
914
|
+
if (agent.kind === "coding" && isCodexCoding(agent.codingProfile?.provider) && !wasCodex) {
|
|
915
|
+
const writers = await codexUnavailableMcpTools(ctx.db, agent.id);
|
|
916
|
+
if (writers.length > 0) {
|
|
917
|
+
return textResult({ ...shown, warnings: [...(shown.warnings ?? []), codexWriteToolsWarning(writers)] });
|
|
918
|
+
}
|
|
919
|
+
}
|
|
920
|
+
return textResult(shown);
|
|
716
921
|
},
|
|
717
922
|
});
|
|
718
923
|
mcp.registerTool({
|
|
719
924
|
name: "list_agents",
|
|
720
925
|
scope: "agents:read",
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
926
|
+
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. " +
|
|
927
|
+
"summary: true returns only id, name, kind, model, codingProvider, budgetUsd, ownerId and access per agent, for listings that don't need the full configuration. " +
|
|
928
|
+
"all: true lists every agent in the deployment (admins only, admin:view); an agent you have no grant on shows access `none`.",
|
|
929
|
+
inputSchema: {
|
|
930
|
+
type: "object",
|
|
931
|
+
properties: { summary: { type: "boolean" }, all: { type: "boolean" } },
|
|
932
|
+
additionalProperties: false,
|
|
933
|
+
},
|
|
934
|
+
handler: async (args, ctx) => {
|
|
935
|
+
if (args.all === true && !ctx.operator)
|
|
936
|
+
requireScope(ctx, ctx.canonicalUri, "admin:view");
|
|
937
|
+
const [where, accessOf] = await Promise.all([
|
|
938
|
+
args.all === true ? Promise.resolve({}) : readableAgentsWhere(ctx),
|
|
939
|
+
agentAccessResolver(ctx),
|
|
940
|
+
]);
|
|
941
|
+
if (args.summary === true) {
|
|
942
|
+
const agents = await ctx.db.agent.findMany({
|
|
943
|
+
where,
|
|
944
|
+
select: {
|
|
945
|
+
id: true,
|
|
946
|
+
name: true,
|
|
947
|
+
kind: true,
|
|
948
|
+
model: true,
|
|
949
|
+
budgetUsd: true,
|
|
950
|
+
ownerId: true,
|
|
951
|
+
codingProfile: { select: { provider: true } },
|
|
952
|
+
},
|
|
953
|
+
orderBy: { name: "asc" },
|
|
954
|
+
});
|
|
955
|
+
return textResult(agents.map(({ codingProfile, budgetUsd, ...agent }) => ({
|
|
956
|
+
...agent,
|
|
957
|
+
codingProvider: codingProfile?.provider ?? null,
|
|
958
|
+
budgetUsd: Number(budgetUsd),
|
|
959
|
+
access: accessOf(agent),
|
|
960
|
+
})));
|
|
961
|
+
}
|
|
724
962
|
const agents = await ctx.db.agent.findMany({ where, include: { codingProfile: true } });
|
|
725
963
|
return textResult(agents.map((agent) => ({ ...withOperatorMode(agent), access: accessOf(agent) })));
|
|
726
964
|
},
|
|
@@ -742,12 +980,14 @@ export function registerAgentTools(mcp) {
|
|
|
742
980
|
// A7: a tool's code and schema are its owner's, whoever can read the
|
|
743
981
|
// agent (the agent's owner included). Capabilities stay visible: config.
|
|
744
982
|
return textResult({
|
|
745
|
-
...withOperatorMode(agent),
|
|
983
|
+
...withProfileWarnings(withOperatorMode(agent)),
|
|
746
984
|
access,
|
|
747
|
-
|
|
985
|
+
mcpServers: await agentMcpServerViews(ctx.db, agent.id),
|
|
986
|
+
// Zod 3 window: the caller's own tools carry their warnings (see core/zod3-window.ts).
|
|
987
|
+
tools: await Promise.all(agent.tools.map(async (attachment) => ({
|
|
748
988
|
...attachment,
|
|
749
|
-
tool: projectTool(attachment.tool, ctx.principal.id),
|
|
750
|
-
})),
|
|
989
|
+
tool: await withZod3ToolWarnings(projectTool(attachment.tool, ctx.principal.id)),
|
|
990
|
+
}))),
|
|
751
991
|
});
|
|
752
992
|
},
|
|
753
993
|
});
|
|
@@ -792,7 +1032,7 @@ export function registerAgentTools(mcp) {
|
|
|
792
1032
|
mcp.registerTool({
|
|
793
1033
|
name: "make_owner",
|
|
794
1034
|
scope: "agents:admin",
|
|
795
|
-
description: "Admins: gives an agent a new owner (an existing principal id). Secret and
|
|
1035
|
+
description: "Admins: gives an agent a new owner (an existing principal id). Secret, datastore and MCP server bindings the new owner doesn't own are removed; tool capabilities the new owner never granted are suspended until they re-run attach_tool; sub-agent edges the new owner can't delegate are removed; between two owners every grant on the agent is reset (adopting an owner-less agent keeps them). Returns what changed.",
|
|
796
1036
|
inputSchema: {
|
|
797
1037
|
type: "object",
|
|
798
1038
|
additionalProperties: false,
|
|
@@ -814,7 +1054,9 @@ export function registerAgentTools(mcp) {
|
|
|
814
1054
|
const principal = await ctx.db.principal.findUnique({ where: { id: newOwner } });
|
|
815
1055
|
if (!principal)
|
|
816
1056
|
throw new McpError(400, `Principal "${newOwner}" not found.`);
|
|
817
|
-
|
|
1057
|
+
// Bounded retry: a concurrent grant or attach on the same rows aborts one side (Serializable).
|
|
1058
|
+
const result = await withSerializableRetry(() => ctx.db.$transaction(async (tx) => {
|
|
1059
|
+
await preferIndexScans(tx);
|
|
818
1060
|
const agent = await tx.agent.findUnique({ where: { id: args.agentId }, include: { codingProfile: true } });
|
|
819
1061
|
if (!agent)
|
|
820
1062
|
throw agentNotFound(args.agentId);
|
|
@@ -833,7 +1075,10 @@ export function registerAgentTools(mcp) {
|
|
|
833
1075
|
where: { agentId: agent.id, authorizedVia: approved },
|
|
834
1076
|
orderBy: { repository: "asc" },
|
|
835
1077
|
});
|
|
836
|
-
await tx.agentRepository.updateMany({
|
|
1078
|
+
await tx.agentRepository.updateMany({
|
|
1079
|
+
where: { agentId: agent.id, authorizedVia: approved },
|
|
1080
|
+
data: reset,
|
|
1081
|
+
});
|
|
837
1082
|
revoked.push(...links.map((l) => l.repository));
|
|
838
1083
|
const profile = await tx.codingAgentProfile.updateMany({
|
|
839
1084
|
where: { agentId: agent.id, repositoryAuthorizedVia: approved },
|
|
@@ -890,9 +1135,31 @@ export function registerAgentTools(mcp) {
|
|
|
890
1135
|
where: { agentId: agent.id, datastoreId: { in: foreignDatastores.map((b) => b.datastoreId) } },
|
|
891
1136
|
});
|
|
892
1137
|
}
|
|
1138
|
+
// MCP server attachments: the server's brokered secrets act for its
|
|
1139
|
+
// owner, so a server the new owner neither owns nor holds use on is detached.
|
|
1140
|
+
const mcpServers = await tx.agentMcpServer.findMany({
|
|
1141
|
+
where: { agentId: agent.id },
|
|
1142
|
+
include: { server: { select: { id: true, name: true, ownerId: true } } },
|
|
1143
|
+
orderBy: { serverId: "asc" },
|
|
1144
|
+
});
|
|
1145
|
+
const foreignMcpServers = await filterUnusableMcpServers(tx, () => newOwner, mcpServers);
|
|
1146
|
+
if (foreignMcpServers.length > 0) {
|
|
1147
|
+
await tx.agentMcpServer.deleteMany({
|
|
1148
|
+
where: { agentId: agent.id, serverId: { in: foreignMcpServers.map((b) => b.serverId) } },
|
|
1149
|
+
});
|
|
1150
|
+
}
|
|
893
1151
|
const bindingsRemoved = [
|
|
894
1152
|
...foreignSecrets.map((b) => ({ kind: "secret", boundName: b.boundName, resourceId: b.secretId })),
|
|
895
|
-
...foreignDatastores.map((b) => ({
|
|
1153
|
+
...foreignDatastores.map((b) => ({
|
|
1154
|
+
kind: "datastore",
|
|
1155
|
+
boundName: b.boundName,
|
|
1156
|
+
resourceId: b.datastoreId,
|
|
1157
|
+
})),
|
|
1158
|
+
...foreignMcpServers.map((b) => ({
|
|
1159
|
+
kind: "mcp_server",
|
|
1160
|
+
boundName: b.server.name,
|
|
1161
|
+
resourceId: b.serverId,
|
|
1162
|
+
})),
|
|
896
1163
|
];
|
|
897
1164
|
// Tool capabilities: rows aren't rewritten; the runner ignores any
|
|
898
1165
|
// the new owner never stamped (capabilitiesGrantedById).
|
|
@@ -950,7 +1217,7 @@ export function registerAgentTools(mcp) {
|
|
|
950
1217
|
everyoneGrant,
|
|
951
1218
|
webhooksInactive,
|
|
952
1219
|
};
|
|
953
|
-
}, { isolationLevel: Prisma.TransactionIsolationLevel.Serializable });
|
|
1220
|
+
}, { isolationLevel: Prisma.TransactionIsolationLevel.Serializable }));
|
|
954
1221
|
return textResult(result);
|
|
955
1222
|
},
|
|
956
1223
|
});
|
|
@@ -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({
|