@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
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
# Remote MCP servers for native and coding agents
|
|
2
|
+
|
|
3
|
+
A native, Claude Code or Codex agent can call the tools of a remote MCP server. You register the
|
|
4
|
+
server once (its HTTPS URL plus your brokered secrets), Wardby saves the
|
|
5
|
+
server's tool list, and you attach an allowlisted subset of those tools to
|
|
6
|
+
an agent. A native agent sees each tool as `<server name>__<tool name>`; coding agents see
|
|
7
|
+
them as described in [Coding agents](#coding-agents).
|
|
8
|
+
|
|
9
|
+
`WARDBY_MCP_SERVERS` decides who may register servers: `owners` (the
|
|
10
|
+
default, anyone), `admins` (registering, updating and refreshing need
|
|
11
|
+
`hosts:admin`) or `off` (every tool below is refused except
|
|
12
|
+
`detach_mcp_server` and `delete_mcp_server`, so cleanup stays possible, and
|
|
13
|
+
attached servers' tools are left out of runs).
|
|
14
|
+
|
|
15
|
+
The tools below need the `tools:write` scope to change servers and
|
|
16
|
+
attachments and `agents:read` to list and get them.
|
|
17
|
+
|
|
18
|
+
## Tools
|
|
19
|
+
|
|
20
|
+
| Tool | Who | What it does |
|
|
21
|
+
| --------------------- | --------------------- | ------------------------------------------------------------------------------------------------------------------ |
|
|
22
|
+
| `register_mcp_server` | anyone (see mode) | Registers a server from `name`, `url` (e.g. `https://mcp.example.com/mcp`) and `secretNames`; saves its tool list. |
|
|
23
|
+
| `update_mcp_server` | the server's owner | Changes the URL or secret names, saves a fresh tool list and returns what changed. |
|
|
24
|
+
| `refresh_mcp_server` | the server's owner | Saves a fresh tool list straight away; returns added, removed and changed tools and the agents left missing tools. |
|
|
25
|
+
| `list_mcp_servers` | anyone | Your servers and those shared with you: id, name, host, tool count, saved-at, `yours`. |
|
|
26
|
+
| `get_mcp_server` | owner, or `read`+ | One server with its full saved tool list (secret names and URL only for the owner). |
|
|
27
|
+
| `delete_mcp_server` | the server's owner | Deletes a server and detaches it from every agent. Works when the mode is `off`. |
|
|
28
|
+
| `attach_mcp_server` | agent's owner; `use`+ | Lets a native or coding agent call the named tools (`allowedTools`, exact names) with an optional `callTimeoutMs`. |
|
|
29
|
+
| `detach_mcp_server` | the agent's owner | Removes a server's tools from an agent. Works when the mode is `off`. |
|
|
30
|
+
|
|
31
|
+
`get_agent` shows each attached server under `mcpServers`: the server's `serverId`
|
|
32
|
+
and name, the allowed tools, `callTimeoutMs`, the exposed tool names and any allowed tools the server no
|
|
33
|
+
longer lists (`missingTools`). Anyone with read access on the agent sees this.
|
|
34
|
+
It never includes URLs, secret names or values, or saved tool lists.
|
|
35
|
+
|
|
36
|
+
## Create a secret for the server
|
|
37
|
+
|
|
38
|
+
Servers are authenticated with [brokered secrets](tool-secrets.md): Wardby adds
|
|
39
|
+
the value to every request to the server's host and nobody, including the
|
|
40
|
+
model, can read it back. Create the secret, then set its broker config with
|
|
41
|
+
`set_secret_broker` so it is limited to the server's host. For a bearer token:
|
|
42
|
+
|
|
43
|
+
```json
|
|
44
|
+
{
|
|
45
|
+
"hosts": ["mcp.example.com"],
|
|
46
|
+
"placement": { "kind": "header", "name": "Authorization", "format": "Bearer {value}" }
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
A server that wants two headers needs two secrets, each with its own
|
|
51
|
+
placement (for example `X-Api-Key` with `format: "{value}"`, and
|
|
52
|
+
`X-Workspace` the same way); name both in `secretNames` (at most 8 names, each up to 1024 characters). The URL itself can't
|
|
53
|
+
carry credentials: a username, password or fragment is refused.
|
|
54
|
+
|
|
55
|
+
## Register, read the tool list, attach
|
|
56
|
+
|
|
57
|
+
1. `register_mcp_server` with `name` (1-32 characters: lower-case letters,
|
|
58
|
+
digits, `_` or `-`), `url` (`https://mcp.example.com/mcp`: HTTPS only,
|
|
59
|
+
default port) and `secretNames`. Wardby calls the server's `tools/list`
|
|
60
|
+
and saves the result. A secret that is missing, not brokered, or not
|
|
61
|
+
brokered to the URL's host is refused.
|
|
62
|
+
2. `get_mcp_server` shows the saved tools: name, description, input schema and
|
|
63
|
+
the server's annotations.
|
|
64
|
+
3. `attach_mcp_server` with the agent, the server and `allowedTools`: exact
|
|
65
|
+
tool names from the saved list, at least one, no wildcards. Attaching
|
|
66
|
+
replaces the agent's earlier allowlist and time limit for that server.
|
|
67
|
+
Native, Claude Code and Codex agents can attach a server (see [Coding agents](#coding-agents)).
|
|
68
|
+
|
|
69
|
+
The agent sees each tool as `<server name>__<tool name>`, with any character
|
|
70
|
+
outside letters, digits, `_` and `-` changed to `_`; the result must be at
|
|
71
|
+
most 64 characters. The description starts with `From MCP server <server name>: `.
|
|
72
|
+
Attaching is refused if the name clashes with another tool on the agent
|
|
73
|
+
(attached, another MCP tool, or a built-in name).
|
|
74
|
+
|
|
75
|
+
## Coding agents
|
|
76
|
+
|
|
77
|
+
A Claude Code or Codex agent can use attached servers too. Attach them the same way, with
|
|
78
|
+
`attach_mcp_server`. The tools reach the run like this:
|
|
79
|
+
|
|
80
|
+
1. The worker calls the coding proxy's `/mcp` route with a per-run MCP token (`rmt_…`, in the
|
|
81
|
+
worker's `WARDBY_MCP_TOKEN`). Workers still reach only the proxy.
|
|
82
|
+
2. The proxy forwards the request to the native gateway's `/coding-mcp` route. The proxy never sees
|
|
83
|
+
a server's URL or secrets. The gateway checks the token again, checks the live attachment and
|
|
84
|
+
runs the call, and removes secret values from the result before it leaves.
|
|
85
|
+
|
|
86
|
+
The token belongs to one run: it works only on `/mcp`, only while the run is active and before its
|
|
87
|
+
deadline, and only its hash is stored.
|
|
88
|
+
|
|
89
|
+
- **Claude Code agents** see each tool as `mcp__wardby_mcp__<server name>__<tool name>` and may use
|
|
90
|
+
any allowed tool. The 64-character limit on `<server name>__<tool name>` is the same as for
|
|
91
|
+
native agents; the prefix adds no other limit.
|
|
92
|
+
- **Codex agents may use only tools the server marks `readOnlyHint: true`.** Wardby enforces this
|
|
93
|
+
when you attach (an allowlist with another tool is refused), when a run loads its tools (a tool
|
|
94
|
+
whose saved annotations no longer say read-only, for example after `refresh_mcp_server`, is left
|
|
95
|
+
out) and on every call. The reason is that repository code running in a Codex run can read the
|
|
96
|
+
run's MCP token, so only tools that don't change anything are safe to give it. `readOnlyHint` is
|
|
97
|
+
the server's own claim, which Wardby can't verify. The allowlist stays your control: allow only
|
|
98
|
+
tools you trust to be read-only.
|
|
99
|
+
|
|
100
|
+
A run follows the provider it was started with, even if the agent's provider changes before the
|
|
101
|
+
run launches. A coding agent with no coding profile is treated as Codex when you attach.
|
|
102
|
+
|
|
103
|
+
- **Switching an agent to Codex.** When `update_agent` makes an agent a Codex agent (changing
|
|
104
|
+
`codingProfile.provider` to `codex`, or making a native agent a coding agent, which uses Codex by
|
|
105
|
+
default) and some of its attached tools aren't marked read-only, the change still goes ahead and
|
|
106
|
+
the result's `warnings` names those tools: "These MCP tools aren't read-only and won't be
|
|
107
|
+
available to Codex runs: …". They stay attached but Codex runs don't get them. Detach them, or
|
|
108
|
+
re-attach the server with only read-only tools, to remove the warning's cause.
|
|
109
|
+
- **Call limit.** A run may make `WARDBY_MCP_MAX_CALLS_PER_RUN` calls (default `100`). Every call
|
|
110
|
+
counts, whatever its outcome. Past the limit a call returns
|
|
111
|
+
[`mcp_call_limit`](../help/errors/mcp-call-limit.md); the run goes on.
|
|
112
|
+
- **Proxy setting.** The coding proxy needs `WARDBY_MCP_GATEWAY_URL`, the native gateway's base URL
|
|
113
|
+
(the kind and GKE manifests set it). Without it `/mcp` answers `503` with
|
|
114
|
+
[`mcp_unavailable`](../help/errors/mcp-unavailable.md) and coding agents get no MCP tools. See
|
|
115
|
+
[Remote MCP servers](security-deployment.md#remote-mcp-servers) for the variables.
|
|
116
|
+
- **Worker images.** MCP for coding agents needs this release's Claude worker image and a new Codex
|
|
117
|
+
driver image. An older image ignores the token and the agent gets no MCP tools; the run does not
|
|
118
|
+
fail. Update the images together with the server.
|
|
119
|
+
- **Repository configuration.** A repository's own MCP configuration (such as `.mcp.json`) is still
|
|
120
|
+
never loaded; the attached servers are the only MCP tools a coding run has.
|
|
121
|
+
- **Codex models that use tool search** load MCP tools on demand: Codex sends a client-side
|
|
122
|
+
`tool_search` tool and adds the matching MCP tools to the conversation when the model searches.
|
|
123
|
+
This needs this release's coding proxy; an older proxy refuses those models' requests with
|
|
124
|
+
`openai_tool_not_allowed:tool_search`, MCP or not.
|
|
125
|
+
|
|
126
|
+
Time limits and the other rules in this guide apply to coding agents too. See
|
|
127
|
+
[Coding worker isolation](coding-worker-isolation.md#remote-mcp-tools) for the security notes.
|
|
128
|
+
|
|
129
|
+
## Time limits
|
|
130
|
+
|
|
131
|
+
Each call has `callTimeoutMs` (default `30000`, set on `attach_mcp_server`).
|
|
132
|
+
It must be at least `1000` and can't exceed `WARDBY_TOOL_MAX_TIMEOUT_MS`; a call runs with the lower of
|
|
133
|
+
the two, and never past the run's own deadline. `stop_run` aborts a call in
|
|
134
|
+
flight. A call that runs out of time returns `mcp_call_timeout` to the model
|
|
135
|
+
and the run goes on.
|
|
136
|
+
|
|
137
|
+
A coding agent's calls have one more limit: the coding proxy gives up on a forwarded call after 5
|
|
138
|
+
minutes, whatever `WARDBY_TOOL_MAX_TIMEOUT_MS` and `callTimeoutMs` say. The call then fails with
|
|
139
|
+
[`mcp_unavailable`](../help/errors/mcp-unavailable.md) (`502`), the gateway stops the call, and it
|
|
140
|
+
still counts against the run's call limit. A run that has been stopped or cancelled can't start new
|
|
141
|
+
calls: its token is refused with `401`.
|
|
142
|
+
|
|
143
|
+
## Refreshing and changes
|
|
144
|
+
|
|
145
|
+
`refresh_mcp_server` (and `update_mcp_server`) fetch the tool list again and
|
|
146
|
+
apply it at once. The reply lists tools added, removed and changed
|
|
147
|
+
(description or schema). A removed tool that an agent allows is dropped from
|
|
148
|
+
that agent's runs and shows under `missingTools` in `get_agent`; nothing
|
|
149
|
+
needs re-attaching if the server brings it back and you refresh again. A
|
|
150
|
+
tool the server newly adds is not available to any agent until you attach it.
|
|
151
|
+
|
|
152
|
+
## What a call does
|
|
153
|
+
|
|
154
|
+
Each call opens its own session: `initialize`, `notifications/initialized`,
|
|
155
|
+
`tools/call`, then a `DELETE` to end it. Because every call gets a fresh
|
|
156
|
+
session, a server that keeps state between calls in one session won't see
|
|
157
|
+
that state on the next call. Wardby checks on every call that the tool is
|
|
158
|
+
still attached and still in the saved list, and that the agent's owner still
|
|
159
|
+
owns the server or holds `use` on it; the call uses the server's current URL
|
|
160
|
+
and secrets. Arguments that aren't a JSON object return `invalid_arguments`
|
|
161
|
+
without calling the server. Text returned to the model is cut at 100,000
|
|
162
|
+
characters, with a note.
|
|
163
|
+
|
|
164
|
+
Wardby answers none of a server's own requests (sampling, elicitation,
|
|
165
|
+
roots). Notifications in a reply are ignored. A reply that carries only a
|
|
166
|
+
request from the server, and no answer to Wardby's request, fails the call
|
|
167
|
+
with `mcp_server_error`.
|
|
168
|
+
|
|
169
|
+
One log line per call records the run id, agent id, server id, tool,
|
|
170
|
+
outcome, duration and result size, never the arguments, the response or the
|
|
171
|
+
URL. Secret values are removed from results, errors and logs.
|
|
172
|
+
|
|
173
|
+
## Not supported
|
|
174
|
+
|
|
175
|
+
stdio servers, OAuth to a server (use a header secret), MCP resources,
|
|
176
|
+
prompts and sampling.
|
|
177
|
+
|
|
178
|
+
## Trust
|
|
179
|
+
|
|
180
|
+
A server's results are untrusted input to the model, like any tool result. The
|
|
181
|
+
allowlist is the control: attach only the tools an agent needs. A server's
|
|
182
|
+
annotations (read-only, destructive and so on) are hints from the server, not
|
|
183
|
+
something Wardby can verify. The one place Wardby acts on a hint is Codex coding
|
|
184
|
+
agents, which may use only tools marked `readOnlyHint: true` (see
|
|
185
|
+
[Coding agents](#coding-agents)).
|
|
186
|
+
|
|
187
|
+
## Sharing a server
|
|
188
|
+
|
|
189
|
+
Share a server you own with `grant_access` (`resourceType: "mcp_server"`, a
|
|
190
|
+
principal or `everyone`, level `read`, `use` or `write`; `everyone` is capped
|
|
191
|
+
at `use`). `read` lets the grantee see the server and its tool list; `use`
|
|
192
|
+
also lets them attach it to their own agents. The server's tools then run with
|
|
193
|
+
your brokered secrets, so grant `use` only to people you trust with them.
|
|
194
|
+
`write` allows nothing beyond `use`: only the owner updates, refreshes,
|
|
195
|
+
deletes or re-grants a server.
|
|
196
|
+
|
|
197
|
+
Sharing uses `grant_access` and `revoke_access`, which need the
|
|
198
|
+
`agents:write` scope; registering and attaching need `tools:write`.
|
|
199
|
+
|
|
200
|
+
An agent may use a server only while its owner owns the server or holds `use`
|
|
201
|
+
(or `write`) on it. `revoke_access`, and `grant_access` lowering a grant to
|
|
202
|
+
`read` (for a principal, or `everyone` from `use` to `read`), detach the
|
|
203
|
+
server at once from every agent whose owner can no longer use it; the reply
|
|
204
|
+
counts them under `attachmentsRemoved`. Your own agents, and agents whose
|
|
205
|
+
owner still holds `use` through another grant, keep it. Runs already going
|
|
206
|
+
lose the tools on their next call, which returns `mcp_tool_not_allowed`.
|
|
207
|
+
|
|
208
|
+
`delete_mcp_server` removes the server's tools from every agent attached to
|
|
209
|
+
it, including other owners' agents that use it through a grant, and removes
|
|
210
|
+
its grants.
|
|
211
|
+
|
|
212
|
+
When the server's secrets can't be loaded (a secret was deleted, or its
|
|
213
|
+
broker config no longer lists the server's host), the owner's own agents get
|
|
214
|
+
an `mcp_server_error` that names the secret. An agent using the server through
|
|
215
|
+
a grant gets only "The MCP server's credentials can't be used; ask its owner
|
|
216
|
+
to check it.", never the owner's secret names.
|
|
217
|
+
|
|
218
|
+
When a secret exists but the Wardby process making the call can't decrypt its
|
|
219
|
+
stored value, the call returns `mcp_server_credentials_unavailable`, and
|
|
220
|
+
`register_mcp_server`, `update_mcp_server` and `refresh_mcp_server` fail with
|
|
221
|
+
it as an HTTP 500 error. Every process that decrypts secrets (control plane,
|
|
222
|
+
scheduler, native gateway) must use the same `SECRET_APP_KEY`; if the key
|
|
223
|
+
changed, set the secret again. The owner's agents get that advice; an agent
|
|
224
|
+
using the server through a grant gets the generic message above. Each failure
|
|
225
|
+
also writes one operator `warn` log line with
|
|
226
|
+
`reason: "mcp_secret_decrypt_failed"`, the server and the secret name.
|
|
227
|
+
|
|
228
|
+
An attachment acts with the server owner's secrets. When `make_owner` gives an
|
|
229
|
+
agent a new owner, servers the new owner neither owns nor holds `use` on are
|
|
230
|
+
detached and listed under `bindingsRemoved` with `kind: "mcp_server"`.
|
|
231
|
+
`wardby grants adopt-public` and `wardby grants prune-bindings` remove them the
|
|
232
|
+
same way. An agent that holds an MCP server can't be made writable by
|
|
233
|
+
everyone.
|
|
234
|
+
|
|
235
|
+
## Troubleshooting
|
|
236
|
+
|
|
237
|
+
A failed call returns `{"error": "<code>", "message": "..."}` to the model;
|
|
238
|
+
the run goes on.
|
|
239
|
+
|
|
240
|
+
| Code | Meaning |
|
|
241
|
+
| -------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
|
|
242
|
+
| [`mcp_servers_off`](../help/errors/mcp-servers-off.md) | `WARDBY_MCP_SERVERS=off`. |
|
|
243
|
+
| [`mcp_server_unreachable`](../help/errors/mcp-server-unreachable.md) | Wardby couldn't connect to the server. |
|
|
244
|
+
| [`mcp_server_auth_failed`](../help/errors/mcp-server-auth-failed.md) | The server answered 401 or 403. |
|
|
245
|
+
| [`mcp_server_credentials_unavailable`](../help/errors/mcp-server-credentials-unavailable.md) | A secret can't be decrypted: check every process's `SECRET_APP_KEY`. |
|
|
246
|
+
| [`mcp_server_error`](../help/errors/mcp-server-error.md) | Another HTTP error, a malformed reply, or the tool reported an error. |
|
|
247
|
+
| [`mcp_tool_not_allowed`](../help/errors/mcp-tool-not-allowed.md) | Detached, off the allowlist, or the owner lost `use` on the server. |
|
|
248
|
+
| [`mcp_tool_removed`](../help/errors/mcp-tool-removed.md) | The server no longer lists the tool. |
|
|
249
|
+
| [`mcp_call_timeout`](../help/errors/mcp-call-timeout.md) | The call hit its time limit or the run was stopped. |
|
|
250
|
+
| [`mcp_call_limit`](../help/errors/mcp-call-limit.md) | A coding run made more calls than `WARDBY_MCP_MAX_CALLS_PER_RUN`. |
|
|
251
|
+
| [`mcp_unavailable`](../help/errors/mcp-unavailable.md) | The coding proxy has no gateway to forward MCP calls to. |
|
|
252
|
+
|
|
253
|
+
See also [Secrets and tools](tool-secrets.md) and
|
|
254
|
+
[Remote MCP servers](security-deployment.md#remote-mcp-servers).
|
package/docs/native-sandbox.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Native sandbox
|
|
2
2
|
|
|
3
|
-
> **Requires Wardby 0.
|
|
3
|
+
> **Requires Wardby 0.6.0 or later.**
|
|
4
4
|
|
|
5
5
|
By default a native agent runs inside the Wardby server process: its turn loop
|
|
6
6
|
and any user tool code you attach execute next to the database connection, the
|
|
@@ -78,6 +78,13 @@ container to it under the alias `wardby-native-gateway`, and starts the worker
|
|
|
78
78
|
on it. When the run ends the worker, the network, and the gateway's membership
|
|
79
79
|
of it are removed.
|
|
80
80
|
|
|
81
|
+
The gateway also serves coding agents' remote MCP tools: the coding proxy
|
|
82
|
+
forwards a coding run's `/mcp` requests to the gateway's HTTP port, on the
|
|
83
|
+
`/coding-mcp` route, where the run's MCP token is checked again. Set
|
|
84
|
+
`WARDBY_MCP_GATEWAY_URL` on the coding proxy to the gateway's base URL
|
|
85
|
+
([details](security-deployment.md#remote-mcp-servers)). The proxy holds no
|
|
86
|
+
gateway credentials, and each route authenticates separately.
|
|
87
|
+
|
|
81
88
|
The gateway is stateless: all state is in Postgres. You can restart it while
|
|
82
89
|
runs are in flight; workers retry their calls. It must not be given the Docker
|
|
83
90
|
socket, because workers can reach it.
|
|
@@ -131,17 +138,15 @@ The gateway is the same Wardby build as the server, started with the
|
|
|
131
138
|
`native-gateway` command. It needs the server's database, LLM, secrets, and
|
|
132
139
|
integration settings, and **no Docker access**.
|
|
133
140
|
|
|
134
|
-
| Gateway variable
|
|
135
|
-
|
|
|
136
|
-
| `NATIVE_GATEWAY_LISTEN`
|
|
137
|
-
| `DATABASE_URL`
|
|
138
|
-
| LLM provider keys
|
|
139
|
-
| `SECRET_APP_KEY`
|
|
140
|
-
| Integration settings
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
coding image settings as the server (for example `CODING_WORKER_IMAGE`); the
|
|
144
|
-
gateway only resolves them, it never starts coding workers.
|
|
141
|
+
| Gateway variable | Purpose |
|
|
142
|
+
| ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
143
|
+
| `NATIVE_GATEWAY_LISTEN` | `host:port` to listen on. Default `0.0.0.0:8790`. |
|
|
144
|
+
| `DATABASE_URL` | The same database the server uses. With `DATABASE_AUTH=rds-iam` the gateway also needs `DATABASE_AUTH`, `AWS_REGION` (or `DATABASE_AWS_REGION`) and the CA bundle file named by `sslrootcert` ([details](security-deployment.md#database-authentication)). |
|
|
145
|
+
| LLM provider keys | The same provider settings as the server (for example `OPENAI_API_KEY`). |
|
|
146
|
+
| `SECRET_APP_KEY` | Same value as the server, so tools can read their bound secrets or send brokered ones ([details](tool-secrets.md)). |
|
|
147
|
+
| Integration settings | The same repository-host and issue-tracker settings as the server. |
|
|
148
|
+
| `WARDBY_TOOL_MAX_TIMEOUT_MS` | Same value as the server, if you set it: the longest time limit a tool may use ([details](security-deployment.md#tool-time-limits)). |
|
|
149
|
+
| `WARDBY_MCP_MAX_CALLS_PER_RUN` | Same value as the server, if you set it: the most remote MCP tool calls one coding run may make (default `100`; [details](security-deployment.md#remote-mcp-servers)). |
|
|
145
150
|
|
|
146
151
|
For local development, the repository ships a compose overlay
|
|
147
152
|
(`deploy/local/docker-compose.native-sandbox.yml`) that runs the gateway next to
|
|
@@ -249,7 +254,7 @@ same Wardby image as the server. Requirements:
|
|
|
249
254
|
- **Environment:** the server's `DATABASE_URL`, `SECRET_APP_KEY` (so tools can
|
|
250
255
|
read their bound secrets or send brokered ones; see
|
|
251
256
|
[tool-secrets.md](tool-secrets.md)), the LLM provider keys, and any integration or
|
|
252
|
-
|
|
257
|
+
other settings the server has (see the gateway table in the Docker
|
|
253
258
|
setup above). Also `NATIVE_GATEWAY_LISTEN` (default `0.0.0.0:8790`) and
|
|
254
259
|
`NATIVE_GATEWAY_DENY_PORT` (default `8791`). Keep these in a Secret.
|
|
255
260
|
- **No Kubernetes access:** `automountServiceAccountToken: false` and no Role
|
|
@@ -287,13 +292,16 @@ namespace that allows:
|
|
|
287
292
|
| ----------------------------------- | --------------------------------- |
|
|
288
293
|
| `pods` | `create`, `get`, `delete`, `list` |
|
|
289
294
|
| `pods/exec` | `create`, `get` |
|
|
295
|
+
| `pods/log` | `get` |
|
|
290
296
|
| `secrets` | `create`, `delete` |
|
|
291
297
|
| `networking.k8s.io/networkpolicies` | `create`, `get`, `delete` |
|
|
292
298
|
| `services` | `get` |
|
|
293
299
|
|
|
294
300
|
`list` on pods lets the startup sweep find leftover worker pods by label;
|
|
295
|
-
`pods/exec` is how the server proves isolation from inside the pod; `
|
|
296
|
-
is read
|
|
301
|
+
`pods/exec` is how the server proves isolation from inside the pod; `pods/log`
|
|
302
|
+
is read only when a worker exits non-zero, for the redacted tail it logs (without
|
|
303
|
+
it the server logs the exit with no tail); `services` is read once to find the
|
|
304
|
+
gateway's ClusterIP. Coding runs on Kubernetes use a
|
|
297
305
|
largely overlapping Role (`deploy/kind-coding/manifests/base/launcher-role.yaml`).
|
|
298
306
|
|
|
299
307
|
### 4. Configure the server
|
|
@@ -382,6 +390,22 @@ sandboxing runtime: with this platform the server refuses to start unless
|
|
|
382
390
|
two minutes to come up, so raise `NATIVE_SANDBOX_READY_TIMEOUT_MS` (for example
|
|
383
391
|
to `600000`).
|
|
384
392
|
|
|
393
|
+
A run's worker launch (in low-power mode, the gateway wake first, then the pod
|
|
394
|
+
start and the isolation probe) can take several minutes on cold nodes. The
|
|
395
|
+
control plane keeps the run's heartbeat fresh for the whole launch, so the run
|
|
396
|
+
shows as running and the reconciler does not reap it as orphaned. The launch
|
|
397
|
+
is bounded by its own limits instead: the gateway wake
|
|
398
|
+
([`low_power_wake_timeout`](../help/errors/low-power-wake-timeout.md)),
|
|
399
|
+
`NATIVE_SANDBOX_READY_TIMEOUT_MS`
|
|
400
|
+
([`native_sandbox_worker_unready`](../help/errors/native-sandbox-worker-unready.md))
|
|
401
|
+
and the isolation probe
|
|
402
|
+
([`native_sandbox_network_unenforced`](../help/errors/native-sandbox-network-unenforced.md)).
|
|
403
|
+
If the run is stopped during the launch, no worker pod is created
|
|
404
|
+
([`native_sandbox_launch_abandoned`](../help/errors/native-sandbox-launch-abandoned.md)).
|
|
405
|
+
If the control-plane process running the launch exits partway, the run is
|
|
406
|
+
reported [`native_sandbox_worker_lost`](../help/errors/native-sandbox-worker-lost.md)
|
|
407
|
+
and is not relaunched.
|
|
408
|
+
|
|
385
409
|
### Capacity
|
|
386
410
|
|
|
387
411
|
`NATIVE_SANDBOX_MAX_CONCURRENT` caps how many sandbox runs may be active at
|
|
@@ -534,6 +558,30 @@ set on the gateway, not the server.
|
|
|
534
558
|
- A sandbox run has a maximum lifetime of 60 minutes. Past it the worker is
|
|
535
559
|
stopped and the run fails with `native_sandbox_deadline_exceeded`.
|
|
536
560
|
- The agent's own turn and budget limits still apply as for any native agent.
|
|
561
|
+
- Each tool call has the tool's own time limit (`timeoutMs`, default 10
|
|
562
|
+
seconds, capped by `WARDBY_TOOL_MAX_TIMEOUT_MS`). The worker enforces it; the
|
|
563
|
+
gateway gives each host call the limit plus 20 seconds, never past the run's
|
|
564
|
+
deadline. Update the worker image with the server: an older image refuses a
|
|
565
|
+
run whose agent has a tool with `timeoutMs`
|
|
566
|
+
([details](security-deployment.md#tool-time-limits)).
|
|
567
|
+
|
|
568
|
+
## Stopping a run
|
|
569
|
+
|
|
570
|
+
`stop_run` (or cancelling the MCP task that started the run) stops a sandboxed
|
|
571
|
+
run whether it is still waiting for a worker or already running:
|
|
572
|
+
|
|
573
|
+
1. The run is recorded `cancelled` with the caller's reason, unless it already
|
|
574
|
+
finished (the first terminal state wins; a finished run is not changed).
|
|
575
|
+
2. Its gateway session ends. The worker's next call (a model turn, a tool, or
|
|
576
|
+
its result) is refused, and the worker exits on its own. A tool's host call
|
|
577
|
+
still running on the gateway is aborted within a few seconds.
|
|
578
|
+
3. A worker still running 5 seconds later is killed. Either way the worker is
|
|
579
|
+
then removed; a worker claimed from the warm pool is discarded with its pool
|
|
580
|
+
row and never returned to the pool.
|
|
581
|
+
4. Sub-agent runs it delegated that are still open are stopped too.
|
|
582
|
+
|
|
583
|
+
A run stopped before its worker started never starts one. See
|
|
584
|
+
[Stop or cancel a run](../help/stop-run.md).
|
|
537
585
|
|
|
538
586
|
## Sub-agents
|
|
539
587
|
|
|
@@ -548,6 +596,32 @@ A child runs in its own configured mode (a `control-plane` child runs in the
|
|
|
548
596
|
server, a `sandbox` child in its own worker). Cancelling a parent run stops its
|
|
549
597
|
open children.
|
|
550
598
|
|
|
599
|
+
A coding agent (Codex or Claude Code) can be a child too. The gateway only
|
|
600
|
+
records the delegation. When the server's scheduler leader starts the child, the
|
|
601
|
+
server resolves its worker image (and the Claude Code tool-runner image), reads
|
|
602
|
+
`.wardby/services.yaml` and resolves its services, reads the knowledge bundle
|
|
603
|
+
index, and composes the final task. The gateway therefore needs no `CODING_*`
|
|
604
|
+
settings, and a gateway that sets them can drop them.
|
|
605
|
+
|
|
606
|
+
A problem with those, such as a `workerImageRef` that is not pinned by digest,
|
|
607
|
+
a toolchain with no image, an invalid or unavailable services declaration, an
|
|
608
|
+
unknown service, or a launcher that cannot run services, shows as the child run
|
|
609
|
+
ending `failed` or `refused` when it starts, with the same error code as at
|
|
610
|
+
dispatch. The parent's `delegate_to_*` call receives the child's result: for a
|
|
611
|
+
failed child `status: "failed"` with the `errorCode`, for a refused child the
|
|
612
|
+
refusal sentence. The full error is on the child run (see it with `get_run`). For agents not
|
|
613
|
+
in sandbox mode these errors still appear at dispatch. If creating a sub-agent
|
|
614
|
+
run fails unexpectedly during a sandboxed run's delegation, the delegating agent
|
|
615
|
+
receives a tool result `{"error":"dispatch_failed","message":"The sub-agent run
|
|
616
|
+
could not be created (<code>)."}` instead of the run failing.
|
|
617
|
+
|
|
618
|
+
**Upgrading:** upgrade `wardby serve` and `wardby scheduler` before or together
|
|
619
|
+
with the gateway. An older server starts such a child without resolving it: a Codex child
|
|
620
|
+
then runs on the deployment's default Codex image (ignoring its toolchain and
|
|
621
|
+
`workerImageRef`) and without its standing instructions, services, or knowledge
|
|
622
|
+
note, and a Claude Code child fails to start with
|
|
623
|
+
`coding_provider_not_configured:claude-code`.
|
|
624
|
+
|
|
551
625
|
## Budget behavior
|
|
552
626
|
|
|
553
627
|
The gateway is the budget authority for sandboxed runs. Before each model call
|
|
@@ -555,28 +629,48 @@ it reserves that call's worst-case cost against the run's budget (and any
|
|
|
555
629
|
budget group), calls the provider, then settles at the actual usage. A call the
|
|
556
630
|
remaining budget cannot cover is refused and the run ends `budget_exhausted`
|
|
557
631
|
instead of overspending. The worker cannot raise or bypass its budget because it
|
|
558
|
-
never talks to the provider directly.
|
|
632
|
+
never talks to the provider directly. A call that breaks off before its final
|
|
633
|
+
usage is settled at an estimate (never more than its reservation) and
|
|
634
|
+
included in the run's cost. The estimate is the call's input plus the output
|
|
635
|
+
streamed so far (text and tool calls), counted high. If the provider's response
|
|
636
|
+
had started but no output had arrived yet (for example while the model was
|
|
637
|
+
thinking or reasoning), the run's median completed reply is used, or no output
|
|
638
|
+
if there is none yet. A call that failed before the provider's response started is released,
|
|
639
|
+
because nothing was generated.
|
|
559
640
|
|
|
560
641
|
## Failure modes
|
|
561
642
|
|
|
562
|
-
| Error code | Meaning
|
|
563
|
-
| ---------------------------------------------------------------------------------------------- |
|
|
564
|
-
| [`native_sandbox_unavailable`](../help/errors/native-sandbox-unavailable.md) | Agent is in `sandbox` mode but the server has no native sandbox. Fails before any spend.
|
|
565
|
-
| [`native_sandbox_worker_exited`](../help/errors/native-sandbox-worker-exited.md) | The worker ended without producing a result.
|
|
566
|
-
| [`native_sandbox_deadline_exceeded`](../help/errors/native-sandbox-deadline-exceeded.md) | The run passed its 60-minute maximum; the worker was stopped.
|
|
567
|
-
| [`native_sandbox_worker_lost`](../help/errors/native-sandbox-worker-lost.md) | The worker container or pod disappeared (for example its host or node restarted). It is never relaunched.
|
|
568
|
-
| [`native_sandbox_image_not_pinned`](../help/errors/native-sandbox-image-not-pinned.md) | `NATIVE_SANDBOX_WORKER_IMAGE` is a mutable tag.
|
|
569
|
-
| [`native_sandbox_docker_failed`](../help/errors/native-sandbox-docker-failed.md) | A Docker command (pull, network create, connect, run) failed.
|
|
570
|
-
| [`native_sandbox_network_unenforced`](../help/errors/native-sandbox-network-unenforced.md) | Kubernetes: the pod's egress isolation could not be proven in time; the pod was removed.
|
|
571
|
-
| [`native_sandbox_isolation_mismatch`](../help/errors/native-sandbox-isolation-mismatch.md) | Kubernetes: the stored pod or NetworkPolicy differs from what Wardby built (an admission change).
|
|
572
|
-
| [`native_sandbox_gateway_unavailable`](../help/errors/native-sandbox-gateway-unavailable.md) | Kubernetes: the gateway Service is missing or has no ClusterIP.
|
|
573
|
-
| [`native_sandbox_worker_unready`](../help/errors/native-sandbox-worker-unready.md) | Kubernetes: the worker pod did not reach Running in time.
|
|
574
|
-
| [`native_sandbox_capacity`](../help/errors/native-sandbox-capacity.md) | `NATIVE_SANDBOX_MAX_CONCURRENT` runs are already active, or the namespace ResourceQuota is full. Not queued.
|
|
575
|
-
| [`native_sandbox_warm_delivery_failed`](../help/errors/native-sandbox-warm-delivery-failed.md) | A claimed warm worker could not receive the run's input and could not be confirmed stopped within 30 seconds.
|
|
576
|
-
| [`native_sandbox_requires_catalog`](../help/errors/native-sandbox-requires-catalog.md) | No model catalog entry was recorded for the run: the process running it does not use the catalog-backed model router.
|
|
643
|
+
| Error code | Meaning | What to do |
|
|
644
|
+
| ---------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
645
|
+
| [`native_sandbox_unavailable`](../help/errors/native-sandbox-unavailable.md) | Agent is in `sandbox` mode but the server has no native sandbox. Fails before any spend. | Configure the sandbox (steps above) or set the agent back to `control-plane`. |
|
|
646
|
+
| [`native_sandbox_worker_exited`](../help/errors/native-sandbox-worker-exited.md) | The worker ended without producing a result. | Check the tool code and the worker's memory and PID limits; run again. |
|
|
647
|
+
| [`native_sandbox_deadline_exceeded`](../help/errors/native-sandbox-deadline-exceeded.md) | The run passed its 60-minute maximum; the worker was stopped. | Split the work into smaller runs or sub-agents. |
|
|
648
|
+
| [`native_sandbox_worker_lost`](../help/errors/native-sandbox-worker-lost.md) | The worker container or pod disappeared (for example its host or node restarted). It is never relaunched. | Trigger the run again; check the Docker host or node stability. |
|
|
649
|
+
| [`native_sandbox_image_not_pinned`](../help/errors/native-sandbox-image-not-pinned.md) | `NATIVE_SANDBOX_WORKER_IMAGE` is a mutable tag. | Use a `repo@sha256:...` digest or a local image id. |
|
|
650
|
+
| [`native_sandbox_docker_failed`](../help/errors/native-sandbox-docker-failed.md) | A Docker command (pull, network create, connect, run) failed. | Read the message, then check the Docker daemon, image availability, and gateway name. |
|
|
651
|
+
| [`native_sandbox_network_unenforced`](../help/errors/native-sandbox-network-unenforced.md) | Kubernetes: the pod's egress isolation could not be proven in time; the pod was removed. | Check that the CNI enforces NetworkPolicy and the gateway Service exposes 8790 and 8791. |
|
|
652
|
+
| [`native_sandbox_isolation_mismatch`](../help/errors/native-sandbox-isolation-mismatch.md) | Kubernetes: the stored pod or NetworkPolicy differs from what Wardby built (an admission change). | Exempt the run namespace's native-run pods from mutating policies. |
|
|
653
|
+
| [`native_sandbox_gateway_unavailable`](../help/errors/native-sandbox-gateway-unavailable.md) | Kubernetes: the gateway Service is missing or has no ClusterIP. | Create the Service (ClusterIP, not headless) or fix `NATIVE_GATEWAY_SERVICE`. |
|
|
654
|
+
| [`native_sandbox_worker_unready`](../help/errors/native-sandbox-worker-unready.md) | Kubernetes: the worker pod did not reach Running in time. | Check image pull, quotas, and scheduling with `kubectl describe pod`. |
|
|
655
|
+
| [`native_sandbox_capacity`](../help/errors/native-sandbox-capacity.md) | `NATIVE_SANDBOX_MAX_CONCURRENT` runs are already active, or the namespace ResourceQuota is full. Not queued. | Wait and retry, or raise the cap together with the ResourceQuota. |
|
|
656
|
+
| [`native_sandbox_warm_delivery_failed`](../help/errors/native-sandbox-warm-delivery-failed.md) | A claimed warm worker could not receive the run's input and could not be confirmed stopped within 30 seconds. | Trigger the run again; check the node or Docker host and pod exec access. |
|
|
657
|
+
| [`native_sandbox_requires_catalog`](../help/errors/native-sandbox-requires-catalog.md) | No model catalog entry was recorded for the run: the process running it does not use the catalog-backed model router. | Run it on a standard `wardby serve`/`scheduler`/`mcp` process, or keep the agent on `control-plane`. |
|
|
658
|
+
| [`native_sandbox_gateway_error`](../help/errors/native-sandbox-gateway-error.md) | The worker's call to the gateway failed with an error the run could not continue from (`native_sandbox_gateway_error: <code>: <message>`; for `internal`, only `native_sandbox_gateway_error: internal: <cause code>`, never the message; the cause code is one of wardby's declared codes and never one that matches a secret value the run can read). | Read the code and message; for `internal` (`internal: <cause code>` when the gateway named one), read the gateway's logs. Trigger the run again. |
|
|
577
659
|
|
|
578
660
|
A run's error appears in its `error` field in `get_run` and `list_runs`.
|
|
579
661
|
|
|
662
|
+
For the gateway's `internal` code, the run's error carries a `causeCode` only
|
|
663
|
+
when the failing error's message led with one of wardby's own declared codes,
|
|
664
|
+
the gateway could read the run's secret values, and that code does not match
|
|
665
|
+
any of them; it is shown as `native_sandbox_gateway_error: internal: <causeCode>`.
|
|
666
|
+
Otherwise the error is just `native_sandbox_gateway_error: internal`. The
|
|
667
|
+
gateway's own log line (`native gateway request failed`) carries the error with
|
|
668
|
+
its message and stack, the run's secret values replaced by `[REDACTED]`, so the
|
|
669
|
+
message itself starts with the code; it has no separate `causeCode` field. Only
|
|
670
|
+
when the gateway could not read the run's secret values does the line carry just
|
|
671
|
+
the error's name (`errName`) and a `causeCode` field, with no message.
|
|
672
|
+
See [Native sandbox gateway error](../help/errors/native-sandbox-gateway-error.md).
|
|
673
|
+
|
|
580
674
|
## Roll back
|
|
581
675
|
|
|
582
676
|
Set the agent back to `control-plane` with `update_agent` or
|
|
@@ -622,11 +716,29 @@ skipped unless its script sets its flag:
|
|
|
622
716
|
the Service must list ports 8790 and 8791 and have ready endpoints.
|
|
623
717
|
- **Check a run.** Call `get_run` for the run's status and error code, then use
|
|
624
718
|
the matching error article from `search_help` or `get_help_article`.
|
|
719
|
+
- **A worker exited non-zero.** The server logs `native worker exited non-zero`
|
|
720
|
+
with the exit code and `stderrTail`, the last 2,000 characters of the worker's
|
|
721
|
+
output. Before logging it, the server masks the run's gateway capability and
|
|
722
|
+
every secret value the agent's tools can read as `[REDACTED]`. Encoded forms
|
|
723
|
+
of a value (URL-encoded, base64) are not matched. Instead of a tail, the line
|
|
724
|
+
may carry `stderrTailOmitted`: `secrets_unavailable` means one of those
|
|
725
|
+
secrets could not be read within 10 seconds, so the tail could not be
|
|
726
|
+
redacted; `log_read_failed` (Kubernetes) means the worker pod's log could not
|
|
727
|
+
be read within 10 seconds. Either way the run's failure is still recorded. On
|
|
728
|
+
Kubernetes the tail comes from the last 100 lines of the worker pod's log (the
|
|
729
|
+
launcher needs `get` on `pods/log`). That read may begin partway through a
|
|
730
|
+
line (the kubelet splits very long lines, and logs rotate), so its first few
|
|
731
|
+
dozen characters are always masked, more when an attached secret is long.
|
|
625
732
|
- **Workers cannot reach the gateway.** Confirm `NATIVE_GATEWAY_CONTAINER`
|
|
626
733
|
matches the running container's name exactly and that the gateway listens on
|
|
627
734
|
the port in `NATIVE_GATEWAY_URL` (default 8790).
|
|
628
735
|
- **Sub-agents never start.** Confirm `wardby serve` or `wardby scheduler` is
|
|
629
736
|
running; the scheduler leader starts them.
|
|
737
|
+
- **A tool's console output is missing.** If the gateway logs
|
|
738
|
+
`sandbox tool console line withheld: the tool's secret values could not be read`,
|
|
739
|
+
reading one of the tool's attached secrets failed. Without every value it
|
|
740
|
+
cannot redact the line, so it logs none of it. The tool call itself still
|
|
741
|
+
succeeds. Check the secret store and the tool's attached secrets.
|
|
630
742
|
- **Tool code fails inside the sandbox.** The worker has no network except the
|
|
631
743
|
gateway and a read-only filesystem apart from `/tmp`; tools must use the
|
|
632
744
|
provided fetch, datastore, and secret functions.
|
package/docs/observability.md
CHANGED
|
@@ -49,5 +49,9 @@ the coding-proxy coverage, so verify required signals before production use.
|
|
|
49
49
|
- Alert on request failures, budget cutoffs, cleanup failures, stalled runs,
|
|
50
50
|
and sustained latency or memory growth.
|
|
51
51
|
- Confirm alerts reach an owned channel and rehearse one response path.
|
|
52
|
+
- Watch the logs for package audit mode: the control plane logs
|
|
53
|
+
`coding.package_audit.set` when an owner turns it on, off or extends it, and
|
|
54
|
+
the coding proxy logs `registry.audited` for each package it installs
|
|
55
|
+
because of it (see [Package audit mode](coding-packages.md#package-audit-mode)).
|
|
52
56
|
- Treat telemetry as operational evidence, not as a replacement for Wardby's
|
|
53
57
|
accounting database.
|