@wardby/cli 0.6.0 → 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/deploy/local/docker-compose.quickstart-coding.yml +13 -0
- package/dist/claude-coding-worker/driver.d.ts +21 -3
- package/dist/claude-coding-worker/driver.js +125 -17
- package/dist/claude-coding-worker/main.js +34 -6
- package/dist/claude-coding-worker/sdk.js +12 -1
- 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 +1 -0
- package/dist/cli.js +24 -10
- 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 +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 +235 -12
- 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 +8 -3
- package/dist/coding-worker/artifact.js +3 -1
- 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 +116 -38
- package/dist/coding-worker/errors.d.ts +1 -0
- package/dist/coding-worker/errors.js +32 -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 +11 -0
- package/dist/config/dependency-cache.d.ts +23 -0
- package/dist/config/dependency-cache.js +32 -0
- package/dist/config/providers.d.ts +12 -3
- package/dist/config/providers.js +55 -5
- 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/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 +42 -0
- package/dist/core/dispatch.js +131 -56
- package/dist/core/engine-native.js +1 -1
- 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 +18 -2
- package/dist/core/host-events.js +284 -24
- 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 +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 +54 -26
- 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 +2 -1
- package/dist/core/merge-order-check.js +8 -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 +27 -14
- 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 +2 -1
- 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 +99 -13
- 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 +80 -34
- package/dist/core/runner.js +439 -144
- 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 +10 -74
- 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/stop-run.d.ts +46 -0
- package/dist/core/stop-run.js +61 -0
- 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 +43 -8
- 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 +34 -3
- package/dist/generated/prisma/client.d.ts +34 -3
- package/dist/generated/prisma/commonInputTypes.d.ts +220 -60
- 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 +44 -0
- package/dist/generated/prisma/internal/class.js +4 -4
- package/dist/generated/prisma/internal/prismaNamespace.d.ts +428 -9
- package/dist/generated/prisma/internal/prismaNamespace.js +92 -1
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +95 -0
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +92 -1
- package/dist/generated/prisma/models/Agent.d.ts +106 -8
- package/dist/generated/prisma/models/AgentRepository.d.ts +42 -1
- package/dist/generated/prisma/models/CodingAgentProfile.d.ts +229 -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 +1637 -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 +39 -1
- package/dist/generated/prisma/models/NativeGatewaySession.d.ts +35 -1
- 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 +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.d.ts +4 -0
- package/dist/help-index.json +1320 -69
- package/dist/import/create.js +32 -3
- package/dist/import/neutral-schema.d.ts +50 -281
- package/dist/import/neutral-schema.js +5 -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/ownership.d.ts +7 -7
- 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/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 +58 -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 +198 -16
- 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.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 +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.js +34 -12
- 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/secrets.js +2 -2
- 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 +1 -1
- package/dist/mcp/tools/tools.js +25 -9
- 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/docker-launcher.d.ts +38 -2
- package/dist/native-worker/docker-launcher.js +65 -5
- package/dist/native-worker/gateway-server.d.ts +41 -3
- package/dist/native-worker/gateway-server.js +124 -27
- package/dist/native-worker/gateway.d.ts +27 -1
- package/dist/native-worker/gateway.js +70 -4
- package/dist/native-worker/http-server.d.ts +3 -1
- package/dist/native-worker/http-server.js +11 -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 +18 -2
- package/dist/native-worker/ledger.js +57 -4
- 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 +129 -577
- package/dist/native-worker/protocol.js +47 -1
- 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/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 +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 +47 -7
- package/dist/providers/executor/container.d.ts +361 -8
- package/dist/providers/executor/container.js +1136 -91
- 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/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 +27 -2
- 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 +2 -0
- package/dist/providers/jobs/kubernetes-isolation.js +17 -1
- package/dist/providers/jobs/kubernetes.d.ts +6 -1
- package/dist/providers/jobs/kubernetes.js +105 -16
- package/dist/providers/jobs/types.d.ts +33 -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 +134 -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 +214 -6
- package/dist/providers/vcs/github.js +447 -45
- 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 +14 -3
- package/dist/quickstart/coding-seed.js +213 -4
- 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/generated/zod.bundle.js +62 -1
- package/dist/sandbox/generated/zod3.bundle.js +5 -0
- package/dist/sandbox/host-functions.d.ts +1 -0
- package/dist/sandbox/host-functions.js +6 -11
- package/dist/sandbox/secret-broker.js +3 -4
- package/dist/sandbox/tool-capabilities.d.ts +10 -30
- 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/openapi.js +2 -4
- package/dist/wardby-bin.js +10 -0
- package/docs/agent-recipes.md +58 -20
- package/docs/code-review-agents.md +551 -41
- package/docs/coding-agent-setup.md +489 -7
- package/docs/coding-packages.md +1033 -90
- package/docs/coding-services.md +27 -12
- package/docs/coding-worker-byo-images.md +20 -0
- package/docs/coding-worker-isolation.md +105 -30
- package/docs/getting-started-gke.md +124 -137
- package/docs/getting-started-identity-provider.md +10 -1
- package/docs/getting-started.md +9 -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/native-sandbox.md +119 -23
- package/docs/observability.md +4 -0
- package/docs/security-deployment.md +33 -2
- package/docs/slack-notifications.md +35 -19
- package/docs/tool-secrets.md +42 -10
- package/docs/viewer-api.openapi.yml +1 -1
- package/help/admin-viewer.md +24 -2
- package/help/architecture-agent.md +11 -6
- package/help/build-worker-image.md +3 -1
- package/help/builder-agent.md +19 -6
- 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-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/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/merge-conflict.md +49 -0
- package/help/errors/native-sandbox-gateway-error.md +20 -0
- package/help/errors/native-sandbox-launch-abandoned.md +21 -0
- package/help/errors/native-sandbox-worker-exited.md +3 -2
- 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-in-value.md +69 -0
- package/help/errors/target-merge.md +40 -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/identity-and-access.md +2 -0
- 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/merge-order-check.md +5 -0
- package/help/native-capabilities.md +29 -1
- package/help/native-sandbox.md +15 -1
- package/help/operating-agents.md +5 -0
- package/help/package-audit-mode.md +91 -0
- package/help/related-pull-requests.md +10 -7
- package/help/resume-runs-locally.md +131 -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 +78 -7
- package/package.json +17 -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/schema.prisma +311 -97
- package/dist/sandbox/generated/zod-to-json-schema.bundle.js +0 -5
package/dist/mcp/tools/agents.js
CHANGED
|
@@ -8,24 +8,37 @@
|
|
|
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
43
|
// resolveCodingWorkerImage/resolveCodingToolImage in container.ts). For a Codex agent it
|
|
31
44
|
// replaces the one container that runs the whole agent; for a Claude Code agent it replaces
|
|
@@ -67,12 +80,53 @@ function withOperatorMode(agent) {
|
|
|
67
80
|
nativeExecutionMode: agent.kind !== "native" ? null : agent.nativeExecutionMode === "sandbox" ? "sandbox" : "control-plane",
|
|
68
81
|
};
|
|
69
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
|
+
}
|
|
70
123
|
const agentFields = {
|
|
71
124
|
name: z.string().trim().min(1).max(MAX_AGENT_NAME_CHARS),
|
|
72
125
|
systemPrompt: z.string().min(1).max(MAX_SYSTEM_PROMPT_CHARS),
|
|
73
126
|
model: z.string().trim().min(1).max(MAX_MODEL_CHARS),
|
|
74
127
|
budgetUsd: z.number().finite().positive().max(MAX_BUDGET_USD),
|
|
75
128
|
maxTurns: z.number().int().min(1).max(100),
|
|
129
|
+
allowedOverrunPercent: z.number().int().min(0).max(100),
|
|
76
130
|
maxDelegationsPerRun: z.number().int().min(1).max(MAX_DELEGATIONS_PER_RUN),
|
|
77
131
|
parallelDelegations: z.boolean(),
|
|
78
132
|
schedule: z.string().trim().min(1).max(256),
|
|
@@ -107,6 +161,7 @@ const CreateAgentSchema = z
|
|
|
107
161
|
model: agentFields.model,
|
|
108
162
|
budgetUsd: agentFields.budgetUsd,
|
|
109
163
|
maxTurns: agentFields.maxTurns.optional(),
|
|
164
|
+
allowedOverrunPercent: agentFields.allowedOverrunPercent.optional(),
|
|
110
165
|
maxDelegationsPerRun: agentFields.maxDelegationsPerRun.optional(),
|
|
111
166
|
parallelDelegations: agentFields.parallelDelegations.optional(),
|
|
112
167
|
schedule: agentFields.schedule.optional(),
|
|
@@ -164,6 +219,7 @@ const UpdateAgentSchema = z
|
|
|
164
219
|
model: agentFields.model.optional(),
|
|
165
220
|
budgetUsd: agentFields.budgetUsd.optional(),
|
|
166
221
|
maxTurns: agentFields.maxTurns.optional(),
|
|
222
|
+
allowedOverrunPercent: agentFields.allowedOverrunPercent.optional(),
|
|
167
223
|
maxDelegationsPerRun: agentFields.maxDelegationsPerRun.optional(),
|
|
168
224
|
parallelDelegations: agentFields.parallelDelegations.optional(),
|
|
169
225
|
schedule: agentFields.schedule.nullable().optional(),
|
|
@@ -179,6 +235,12 @@ const UpdateAgentSchema = z
|
|
|
179
235
|
codingProfile: CodingProfilePatchSchema.extend({
|
|
180
236
|
/** Not a stored profile field: sets CodingAgentProfile.debugTraceUntil = now + minutes (null clears). */
|
|
181
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(),
|
|
182
244
|
}).optional(),
|
|
183
245
|
repositoryAdminOverride: z.boolean().optional(),
|
|
184
246
|
})
|
|
@@ -242,6 +304,12 @@ const profileJsonSchema = {
|
|
|
242
304
|
maximum: MAX_CODING_TURNS,
|
|
243
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.`,
|
|
244
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
|
+
},
|
|
245
313
|
repoSkills: {
|
|
246
314
|
type: "boolean",
|
|
247
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.",
|
|
@@ -250,6 +318,14 @@ const profileJsonSchema = {
|
|
|
250
318
|
type: "boolean",
|
|
251
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.",
|
|
252
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
|
+
},
|
|
253
329
|
packageAllowlist: {
|
|
254
330
|
type: "object",
|
|
255
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.",
|
|
@@ -257,7 +333,16 @@ const profileJsonSchema = {
|
|
|
257
333
|
},
|
|
258
334
|
packagePolicy: {
|
|
259
335
|
type: "object",
|
|
260
|
-
|
|
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
|
+
},
|
|
261
346
|
additionalProperties: false,
|
|
262
347
|
},
|
|
263
348
|
services: {
|
|
@@ -363,11 +448,14 @@ function storedProfile(profile) {
|
|
|
363
448
|
workerImageRef: profile.workerImageRef,
|
|
364
449
|
workspaceDiskMb: profile.workspaceDiskMb,
|
|
365
450
|
maxTurns: profile.maxTurns,
|
|
451
|
+
maxOutputTokens: profile.maxOutputTokens,
|
|
366
452
|
packageAllowlist: profile.packageAllowlist,
|
|
367
453
|
packagePolicy: profile.packagePolicy,
|
|
368
454
|
services: profile.services,
|
|
369
455
|
repoSkills: profile.repoSkills,
|
|
370
456
|
claudeBareMode: profile.claudeBareMode,
|
|
457
|
+
dependencyCache: profile.dependencyCache,
|
|
458
|
+
sessionResume: profile.sessionResume,
|
|
371
459
|
});
|
|
372
460
|
}
|
|
373
461
|
/** A service name an agent is allowed must exist in the catalog (any version); typos fail here, not at a run. */
|
|
@@ -393,6 +481,12 @@ export function registerAgentTools(mcp) {
|
|
|
393
481
|
model: { type: "string" },
|
|
394
482
|
budgetUsd: { type: "number" },
|
|
395
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
|
+
},
|
|
396
490
|
maxDelegationsPerRun: {
|
|
397
491
|
type: "integer",
|
|
398
492
|
minimum: 1,
|
|
@@ -431,12 +525,14 @@ export function registerAgentTools(mcp) {
|
|
|
431
525
|
const packages = args.codingProfile;
|
|
432
526
|
if (packages &&
|
|
433
527
|
(Object.keys(packages.packageAllowlist ?? {}).length > 0 ||
|
|
434
|
-
Object.keys(packages.packagePolicy ?? {}).length > 0
|
|
528
|
+
Object.keys(packages.packagePolicy ?? {}).length > 0 ||
|
|
529
|
+
packages.dependencyCache === true))
|
|
435
530
|
requirePackageApproval(ctx);
|
|
436
531
|
validateSchedule(args.schedule, args.timezone ?? "UTC");
|
|
437
532
|
requireModelAvailable(ctx, args.model, args.kind);
|
|
438
533
|
validateEffort(args.kind, args.model, args.effort);
|
|
439
534
|
validateNativeExecutionMode(ctx, args.kind, args.nativeExecutionMode);
|
|
535
|
+
validateWorkspaceDiskMb(args.codingProfile?.workspaceDiskMb);
|
|
440
536
|
if (args.codingProfile)
|
|
441
537
|
await requireCatalogServiceNames(ctx.db, args.codingProfile.services);
|
|
442
538
|
if (args.budgetGroupId) {
|
|
@@ -463,6 +559,11 @@ export function registerAgentTools(mcp) {
|
|
|
463
559
|
const agent = await ctx.db.agent.create({
|
|
464
560
|
data: {
|
|
465
561
|
...agentData,
|
|
562
|
+
...(await scheduleStartFields(ctx.db, null, {
|
|
563
|
+
schedule: agentData.schedule ?? null,
|
|
564
|
+
timezone: agentData.timezone ?? "UTC",
|
|
565
|
+
scheduleEnabled: agentData.scheduleEnabled ?? true,
|
|
566
|
+
})),
|
|
466
567
|
ownerId: ctx.principal.id,
|
|
467
568
|
...(codingProfile && authorization
|
|
468
569
|
? { codingProfile: { create: { ...codingProfile, ...profileStamp(authorization) } } }
|
|
@@ -470,7 +571,7 @@ export function registerAgentTools(mcp) {
|
|
|
470
571
|
},
|
|
471
572
|
include: { codingProfile: true },
|
|
472
573
|
});
|
|
473
|
-
return textResult(withOperatorMode(agent));
|
|
574
|
+
return textResult(withProfileWarnings(withOperatorMode(agent)));
|
|
474
575
|
},
|
|
475
576
|
});
|
|
476
577
|
mcp.registerTool({
|
|
@@ -486,6 +587,12 @@ export function registerAgentTools(mcp) {
|
|
|
486
587
|
model: { type: "string" },
|
|
487
588
|
budgetUsd: { type: "number" },
|
|
488
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
|
+
},
|
|
489
596
|
maxDelegationsPerRun: {
|
|
490
597
|
type: "integer",
|
|
491
598
|
minimum: 1,
|
|
@@ -531,6 +638,27 @@ export function registerAgentTools(mcp) {
|
|
|
531
638
|
maximum: MAX_DEBUG_TRACE_MINUTES,
|
|
532
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.",
|
|
533
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
|
+
},
|
|
534
662
|
},
|
|
535
663
|
},
|
|
536
664
|
repositoryAdminOverride: REPOSITORY_ADMIN_OVERRIDE,
|
|
@@ -542,9 +670,18 @@ export function registerAgentTools(mcp) {
|
|
|
542
670
|
if (args.codingProfile?.workerImageRef !== undefined)
|
|
543
671
|
requireWorkerImageRefScope(ctx);
|
|
544
672
|
const debugTraceMinutes = args.codingProfile?.debugTraceMinutes;
|
|
545
|
-
|
|
673
|
+
const debugTraceMaxMb = args.codingProfile?.debugTraceMaxMb;
|
|
674
|
+
if (debugTraceMinutes !== undefined || debugTraceMaxMb !== undefined)
|
|
546
675
|
requireDebugTraceScope(ctx);
|
|
547
|
-
|
|
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)
|
|
548
685
|
requirePackageApproval(ctx);
|
|
549
686
|
// Repository authorization calls GitHub, so it runs before (outside) the
|
|
550
687
|
// serializable transaction, on a pre-read; the transaction then verifies
|
|
@@ -615,6 +752,7 @@ export function registerAgentTools(mcp) {
|
|
|
615
752
|
: debugTraceMinutes === null
|
|
616
753
|
? null
|
|
617
754
|
: new Date(Date.now() + debugTraceMinutes * 60_000);
|
|
755
|
+
let auditSet;
|
|
618
756
|
const agent = await ctx.db.$transaction(async (tx) => {
|
|
619
757
|
const existing = await tx.agent.findUnique({ where: { id: args.id }, include: { codingProfile: true } });
|
|
620
758
|
if (!existing)
|
|
@@ -636,6 +774,12 @@ export function registerAgentTools(mcp) {
|
|
|
636
774
|
await requireReadableBudgetGroup(tx, args.budgetGroupId, ctx.principal.id);
|
|
637
775
|
}
|
|
638
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
|
+
}
|
|
639
783
|
if (nextKind === "native" && args.codingProfile) {
|
|
640
784
|
throw new McpError(400, "A coding profile is only valid for coding agents.");
|
|
641
785
|
}
|
|
@@ -659,11 +803,14 @@ export function registerAgentTools(mcp) {
|
|
|
659
803
|
throw new McpError(400, "Detach all native sandbox tools before changing an agent to coding.");
|
|
660
804
|
}
|
|
661
805
|
const currentProfile = existing.codingProfile ? storedProfile(existing.codingProfile) : undefined;
|
|
662
|
-
const { debugTraceMinutes: _minutes, ...profilePatch } = args.codingProfile ?? {};
|
|
806
|
+
const { debugTraceMinutes: _minutes, debugTraceMaxMb: _maxMb, packageAuditMode: _auditMode, packageAuditMinutes: _auditMinutes, ...profilePatch } = args.codingProfile ?? {};
|
|
663
807
|
const profileResult = CodingProfileSchema.safeParse({ ...currentProfile, ...profilePatch });
|
|
664
808
|
if (!profileResult.success)
|
|
665
809
|
throw invalidArguments("coding profile", profileResult.error);
|
|
666
810
|
nextProfile = profileResult.data;
|
|
811
|
+
if (typeof args.codingProfile?.workspaceDiskMb === "number" || nextKind !== existing.kind) {
|
|
812
|
+
validateWorkspaceDiskMb(nextProfile.workspaceDiskMb);
|
|
813
|
+
}
|
|
667
814
|
if (args.codingProfile?.services !== undefined)
|
|
668
815
|
await requireCatalogServiceNames(tx, nextProfile.services);
|
|
669
816
|
const nextModel = args.model ?? existing.model;
|
|
@@ -674,6 +821,19 @@ export function registerAgentTools(mcp) {
|
|
|
674
821
|
throw new McpError(400, `Model "${nextModel}" is not supported by coding provider "${nextProfile.provider}".`);
|
|
675
822
|
}
|
|
676
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;
|
|
677
837
|
const nextSchedule = args.schedule !== undefined ? args.schedule : existing.schedule;
|
|
678
838
|
const nextTimezone = args.timezone ?? existing.timezone;
|
|
679
839
|
const nextScheduleEnabled = args.scheduleEnabled ?? existing.scheduleEnabled;
|
|
@@ -687,7 +847,11 @@ export function registerAgentTools(mcp) {
|
|
|
687
847
|
...(modeArg ? { nativeExecutionMode: toStoredMode(modeArg) } : {}),
|
|
688
848
|
};
|
|
689
849
|
const stamp = authorization ? profileStamp(authorization) : {};
|
|
690
|
-
const trace =
|
|
850
|
+
const trace = {
|
|
851
|
+
...(debugTraceUntil === undefined ? {} : { debugTraceUntil }),
|
|
852
|
+
...(debugTraceMaxMb === undefined ? {} : { debugTraceMaxMb }),
|
|
853
|
+
...(audit === undefined ? {} : { packageAuditMode: audit.mode, packageAuditUntil: audit.until }),
|
|
854
|
+
};
|
|
691
855
|
const profileMutation = nextKind === "native"
|
|
692
856
|
? existing.codingProfile
|
|
693
857
|
? { delete: true }
|
|
@@ -695,29 +859,46 @@ export function registerAgentTools(mcp) {
|
|
|
695
859
|
: existing.codingProfile
|
|
696
860
|
? { update: { ...nextProfile, ...stamp, ...trace } }
|
|
697
861
|
: { create: { ...nextProfile, ...stamp, ...trace } };
|
|
862
|
+
const scheduleStart = await scheduleStartFields(tx, existing, {
|
|
863
|
+
schedule: nextSchedule,
|
|
864
|
+
timezone: nextTimezone,
|
|
865
|
+
scheduleEnabled: nextScheduleEnabled,
|
|
866
|
+
});
|
|
698
867
|
return tx.agent.update({
|
|
699
868
|
where: { id },
|
|
700
869
|
data: {
|
|
701
870
|
...updates,
|
|
871
|
+
...scheduleStart,
|
|
702
872
|
...(profileMutation ? { codingProfile: profileMutation } : {}),
|
|
703
873
|
},
|
|
704
874
|
include: { codingProfile: true },
|
|
705
875
|
});
|
|
706
876
|
}, { isolationLevel: Prisma.TransactionIsolationLevel.Serializable });
|
|
707
|
-
if (debugTraceUntil !== undefined) {
|
|
877
|
+
if (debugTraceUntil !== undefined || debugTraceMaxMb !== undefined) {
|
|
708
878
|
agentsLog.info({
|
|
709
879
|
event: "coding.debug_trace.set",
|
|
710
880
|
agentId: agent.id,
|
|
711
|
-
until: debugTraceUntil?.toISOString() ?? null,
|
|
881
|
+
...(debugTraceUntil !== undefined ? { until: debugTraceUntil?.toISOString() ?? null } : {}),
|
|
882
|
+
...(debugTraceMaxMb !== undefined ? { maxMb: debugTraceMaxMb } : {}),
|
|
712
883
|
by: ctx.principal.id,
|
|
713
884
|
}, "coding debug trace set");
|
|
714
885
|
}
|
|
715
|
-
|
|
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)));
|
|
716
896
|
},
|
|
717
897
|
});
|
|
718
898
|
mcp.registerTool({
|
|
719
899
|
name: "list_agents",
|
|
720
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.",
|
|
721
902
|
inputSchema: { type: "object", properties: {}, additionalProperties: false },
|
|
722
903
|
handler: async (_args, ctx) => {
|
|
723
904
|
const [where, accessOf] = await Promise.all([readableAgentsWhere(ctx), agentAccessResolver(ctx)]);
|
|
@@ -742,12 +923,13 @@ export function registerAgentTools(mcp) {
|
|
|
742
923
|
// A7: a tool's code and schema are its owner's, whoever can read the
|
|
743
924
|
// agent (the agent's owner included). Capabilities stay visible: config.
|
|
744
925
|
return textResult({
|
|
745
|
-
...withOperatorMode(agent),
|
|
926
|
+
...withProfileWarnings(withOperatorMode(agent)),
|
|
746
927
|
access,
|
|
747
|
-
|
|
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) => ({
|
|
748
930
|
...attachment,
|
|
749
|
-
tool: projectTool(attachment.tool, ctx.principal.id),
|
|
750
|
-
})),
|
|
931
|
+
tool: await withZod3ToolWarnings(projectTool(attachment.tool, ctx.principal.id)),
|
|
932
|
+
}))),
|
|
751
933
|
});
|
|
752
934
|
},
|
|
753
935
|
});
|
|
@@ -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({
|
package/dist/mcp/tools/grants.js
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import { z } from "zod";
|
|
14
14
|
import { Prisma } from "#prisma";
|
|
15
|
-
import { EVERYONE_KEY, EVERYONE_MAX, LEVELS, SHAREABLE_TYPES, accessRank, atLeast, isLevel, isResourceType, principalGranteeKey, } from "../../core/grants.js";
|
|
15
|
+
import { EVERYONE_KEY, EVERYONE_MAX, LEVELS, agentOwnerBindings, SHAREABLE_TYPES, accessRank, atLeast, isLevel, isResourceType, principalGranteeKey, } from "../../core/grants.js";
|
|
16
16
|
import { agentNotFound, assertAgentAccess, agentAccess } from "../auth/access.js";
|
|
17
17
|
import { permissionsOf } from "../auth/resource-server.js";
|
|
18
18
|
import { McpError } from "../errors.js";
|
|
@@ -107,7 +107,7 @@ export function registerGrantTools(mcp) {
|
|
|
107
107
|
"Owner-only whatever the level: the coding profile (task, base ref, protected paths, task-override opt-in, image, packages, limits), kind, budget group, sub-agents, secret/datastore/repository bindings, tool capabilities, memory and datastore contents, grants, delete. " +
|
|
108
108
|
"Consequences: execute lets them run your agent with your tools, secrets, datastores and repository, and every run shares the agent's memory; they supply no task text unless it's a coding agent with allowWebhookTaskOverride. " +
|
|
109
109
|
"Write lets them rewrite what those runs do: the prompt can make a run use everything the agent can already reach (the capabilities you granted, its memory, its linked repositories), and on a coding agent the prompt is part of every coding task, so write directs work done with your GitHub access. " +
|
|
110
|
-
"Granting again replaces the level. Everyone
|
|
110
|
+
"Granting again replaces the level. Everyone may get write only on a native agent with no secrets, datastores, repositories, sub-agents or tool capabilities. The grantee must have signed in once.",
|
|
111
111
|
inputSchema: {
|
|
112
112
|
type: "object",
|
|
113
113
|
additionalProperties: false,
|
|
@@ -131,7 +131,13 @@ export function registerGrantTools(mcp) {
|
|
|
131
131
|
throw new McpError(400, "The owner already has full access; a grant to yourself or the owner changes nothing.");
|
|
132
132
|
}
|
|
133
133
|
if (!principal && accessRank(type, args.level) > accessRank(type, EVERYONE_MAX[type])) {
|
|
134
|
-
throw new McpError(400, `An everyone grant can be at most ${EVERYONE_MAX[type]}
|
|
134
|
+
throw new McpError(400, `An everyone grant can be at most ${EVERYONE_MAX[type]}.`);
|
|
135
|
+
}
|
|
136
|
+
if (!principal && atLeast(type, args.level, "write")) {
|
|
137
|
+
const bindings = await agentOwnerBindings(tx, resource.id);
|
|
138
|
+
if (bindings.length) {
|
|
139
|
+
throw new McpError(409, `Agent "${resource.id}" holds ${bindings.join(", ")}: write for everyone would let anyone rewrite an agent that uses them. Detach them first, or grant everyone execute.`);
|
|
140
|
+
}
|
|
135
141
|
}
|
|
136
142
|
const granteeKey = principal ? principalGranteeKey(principal.id) : EVERYONE_KEY;
|
|
137
143
|
const grant = await tx.resourceGrant.upsert({
|
package/dist/mcp/tools/memory.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { requireAgentAccess } from "../auth/access.js";
|
|
2
2
|
import { textResult } from "./text-result.js";
|
|
3
|
+
import { SecretInValueError, SecretCheckUnavailableError } from "../../core/secret-guard.js";
|
|
4
|
+
import { McpError } from "../errors.js";
|
|
3
5
|
export function registerMemoryTools(mcp) {
|
|
4
6
|
mcp.registerTool({
|
|
5
7
|
name: "get_agent_memory",
|
|
@@ -39,7 +41,15 @@ export function registerMemoryTools(mcp) {
|
|
|
39
41
|
},
|
|
40
42
|
handler: async (args, ctx) => {
|
|
41
43
|
await requireAgentAccess(ctx, args.agentId, "owner");
|
|
42
|
-
|
|
44
|
+
try {
|
|
45
|
+
await ctx.providers.memory.set(args.agentId, args.key, args.content);
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
if (err instanceof SecretInValueError || err instanceof SecretCheckUnavailableError) {
|
|
49
|
+
throw new McpError(400, err.message);
|
|
50
|
+
}
|
|
51
|
+
throw err;
|
|
52
|
+
}
|
|
43
53
|
return textResult({ ok: true });
|
|
44
54
|
},
|
|
45
55
|
});
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* for the whole deployment, no per-user OAuth), so link/unlink/test need
|
|
11
11
|
* agents:admin with the admin role, and the approver is stamped on the
|
|
12
12
|
* link. Exactly one of projectKey/agentId is the link's subject (enforced
|
|
13
|
-
* again by a DB CHECK constraint); `events` narrows which of the
|
|
13
|
+
* again by a DB CHECK constraint); `events` narrows which of the
|
|
14
14
|
* workflow event kinds post to it (empty/omitted = all); private Slack
|
|
15
15
|
* channels always need /invite @<app> before the bot can see or post to
|
|
16
16
|
* them. See docs/private/2026-10-08-slack-workflow-notifications-design.md §8.
|
|
@@ -52,7 +52,7 @@ export function registerNotificationChannelTools(mcp) {
|
|
|
52
52
|
"matches events for issues in that project; an agent link matches events for that agent's runs. " +
|
|
53
53
|
"channel is the Slack channel id (C… for public, G… for private), never a #name — find it in the channel's " +
|
|
54
54
|
"details in Slack. Private channels always need /invite @<app> before the bot can see or post to them. " +
|
|
55
|
-
"events narrows which of the
|
|
55
|
+
"events narrows which of the workflow event kinds post to this link; empty or omitted means all. " +
|
|
56
56
|
"includeCost appends the run's spend line to messages. Re-linking the same channel + subject replaces events and " +
|
|
57
57
|
"includeCost and clears any previously recorded delivery error — always send the full desired state.",
|
|
58
58
|
inputSchema: {
|