@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
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a repository's knowledge bundle lives (docs/knowledge.md, "Where the
|
|
3
|
+
* bundle lives"): the folder `.wardby/knowledge.yaml` names, else
|
|
4
|
+
* DEFAULT_KNOWLEDGE_BUNDLE_PATH. A missing, unreadable, or invalid file never
|
|
5
|
+
* fails anything: it degrades to the default, with a warning when the file
|
|
6
|
+
* exists but cannot be used.
|
|
7
|
+
*/
|
|
8
|
+
export declare const KNOWLEDGE_CONFIG_PATH = ".wardby/knowledge.yaml";
|
|
9
|
+
export declare const KNOWLEDGE_CONFIG_MAX_BYTES: number;
|
|
10
|
+
export interface KnowledgeLocation {
|
|
11
|
+
bundlePath: string;
|
|
12
|
+
/** Set when `.wardby/knowledge.yaml` exists but was ignored, saying why. */
|
|
13
|
+
warning?: string;
|
|
14
|
+
}
|
|
15
|
+
export type KnowledgeConfigParse = {
|
|
16
|
+
ok: true;
|
|
17
|
+
bundlePath: string;
|
|
18
|
+
} | {
|
|
19
|
+
ok: false;
|
|
20
|
+
error: string;
|
|
21
|
+
};
|
|
22
|
+
/** `path: <repo-relative folder>`, the file's only key. */
|
|
23
|
+
export declare function parseKnowledgeConfig(text: string): KnowledgeConfigParse;
|
|
24
|
+
/** A repo-relative POSIX folder, without `./` or trailing slashes, outside `.wardby/` and `.git/`. */
|
|
25
|
+
export declare function normalizeBundlePath(raw: string): KnowledgeConfigParse;
|
|
26
|
+
/**
|
|
27
|
+
* The bundle location, given a reader for `.wardby/knowledge.yaml` that
|
|
28
|
+
* returns null when the file does not exist. A reader that throws, like an
|
|
29
|
+
* invalid file, yields the default with a warning.
|
|
30
|
+
*/
|
|
31
|
+
export declare function resolveKnowledgeLocation(readConfig: () => Promise<string | null | undefined>): Promise<KnowledgeLocation>;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { parse as parseYaml } from "yaml";
|
|
2
|
+
import { DEFAULT_KNOWLEDGE_BUNDLE_PATH } from "./concept.js";
|
|
3
|
+
/**
|
|
4
|
+
* Where a repository's knowledge bundle lives (docs/knowledge.md, "Where the
|
|
5
|
+
* bundle lives"): the folder `.wardby/knowledge.yaml` names, else
|
|
6
|
+
* DEFAULT_KNOWLEDGE_BUNDLE_PATH. A missing, unreadable, or invalid file never
|
|
7
|
+
* fails anything: it degrades to the default, with a warning when the file
|
|
8
|
+
* exists but cannot be used.
|
|
9
|
+
*/
|
|
10
|
+
export const KNOWLEDGE_CONFIG_PATH = ".wardby/knowledge.yaml";
|
|
11
|
+
export const KNOWLEDGE_CONFIG_MAX_BYTES = 4 * 1024;
|
|
12
|
+
const MAX_BUNDLE_PATH_LENGTH = 200;
|
|
13
|
+
/** `path: <repo-relative folder>`, the file's only key. */
|
|
14
|
+
export function parseKnowledgeConfig(text) {
|
|
15
|
+
let doc;
|
|
16
|
+
try {
|
|
17
|
+
doc = parseYaml(text);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return { ok: false, error: "it is not valid YAML" };
|
|
21
|
+
}
|
|
22
|
+
if (typeof doc !== "object" || doc === null || Array.isArray(doc))
|
|
23
|
+
return { ok: false, error: "it must be a mapping with a `path` key" };
|
|
24
|
+
const keys = Object.keys(doc);
|
|
25
|
+
const unknown = keys.filter((k) => k !== "path");
|
|
26
|
+
if (unknown.length > 0)
|
|
27
|
+
return { ok: false, error: `unknown key ${unknown.map((k) => `\`${k}\``).join(", ")}` };
|
|
28
|
+
const { path } = doc;
|
|
29
|
+
if (typeof path !== "string")
|
|
30
|
+
return { ok: false, error: "`path` must be a string" };
|
|
31
|
+
return normalizeBundlePath(path);
|
|
32
|
+
}
|
|
33
|
+
/** A repo-relative POSIX folder, without `./` or trailing slashes, outside `.wardby/` and `.git/`. */
|
|
34
|
+
export function normalizeBundlePath(raw) {
|
|
35
|
+
let path = raw.trim();
|
|
36
|
+
while (path.startsWith("./"))
|
|
37
|
+
path = path.slice(2);
|
|
38
|
+
path = path.replace(/\/+$/, "");
|
|
39
|
+
if (path === "" || path === ".")
|
|
40
|
+
return { ok: false, error: "`path` must name a folder inside the repository" };
|
|
41
|
+
if (path.length > MAX_BUNDLE_PATH_LENGTH)
|
|
42
|
+
return { ok: false, error: `\`path\` must be at most ${MAX_BUNDLE_PATH_LENGTH} characters` };
|
|
43
|
+
// eslint-disable-next-line no-control-regex
|
|
44
|
+
if (/[\u0000-\u001f\u007f\\]/.test(path))
|
|
45
|
+
return { ok: false, error: "`path` must be a plain POSIX path" };
|
|
46
|
+
if (path.startsWith("/"))
|
|
47
|
+
return { ok: false, error: "`path` must be relative to the repository root" };
|
|
48
|
+
const segments = path.split("/");
|
|
49
|
+
if (segments.some((s) => s === "" || s === "." || s === ".."))
|
|
50
|
+
return { ok: false, error: "`path` must not contain empty, `.` or `..` segments" };
|
|
51
|
+
if (segments[0] === ".wardby" || segments[0] === ".git")
|
|
52
|
+
return { ok: false, error: "`path` must not be inside `.wardby/` or `.git/`" };
|
|
53
|
+
return { ok: true, bundlePath: path };
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* The bundle location, given a reader for `.wardby/knowledge.yaml` that
|
|
57
|
+
* returns null when the file does not exist. A reader that throws, like an
|
|
58
|
+
* invalid file, yields the default with a warning.
|
|
59
|
+
*/
|
|
60
|
+
export async function resolveKnowledgeLocation(readConfig) {
|
|
61
|
+
let text;
|
|
62
|
+
try {
|
|
63
|
+
text = await readConfig();
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
67
|
+
return { bundlePath: DEFAULT_KNOWLEDGE_BUNDLE_PATH, warning: ignoredWarning(`it could not be read (${reason})`) };
|
|
68
|
+
}
|
|
69
|
+
if (text === null || text === undefined)
|
|
70
|
+
return { bundlePath: DEFAULT_KNOWLEDGE_BUNDLE_PATH };
|
|
71
|
+
const parsed = parseKnowledgeConfig(text);
|
|
72
|
+
if (!parsed.ok)
|
|
73
|
+
return { bundlePath: DEFAULT_KNOWLEDGE_BUNDLE_PATH, warning: ignoredWarning(parsed.error) };
|
|
74
|
+
return { bundlePath: parsed.bundlePath };
|
|
75
|
+
}
|
|
76
|
+
function ignoredWarning(reason) {
|
|
77
|
+
return `${KNOWLEDGE_CONFIG_PATH} was ignored because ${reason}; using ${DEFAULT_KNOWLEDGE_BUNDLE_PATH}/.`;
|
|
78
|
+
}
|
|
@@ -38,16 +38,17 @@ export declare function assertAgentAccess<A extends AgentRef>(ctx: McpRequestCon
|
|
|
38
38
|
export declare function requireAgentAccess(ctx: McpRequestContext, id: string, required: AgentLevel | "owner", db?: Pick<PrismaClient, "agent" | "resourceGrant">): Promise<{
|
|
39
39
|
agent: {
|
|
40
40
|
name: string;
|
|
41
|
+
updatedAt: Date;
|
|
41
42
|
model: string;
|
|
42
43
|
budgetUsd: import("@prisma/client-runtime-utils").Decimal;
|
|
43
44
|
maxTurns: number;
|
|
44
|
-
createdAt: Date;
|
|
45
|
-
updatedAt: Date;
|
|
46
45
|
kind: import("#prisma").AgentKind;
|
|
46
|
+
createdAt: Date;
|
|
47
47
|
id: string;
|
|
48
48
|
ownerId: string | null;
|
|
49
49
|
nativeExecutionMode: import("#prisma").NativeExecutionMode;
|
|
50
50
|
systemPrompt: string;
|
|
51
|
+
allowedOverrunPercent: number;
|
|
51
52
|
schedule: string | null;
|
|
52
53
|
timezone: string;
|
|
53
54
|
scheduleEnabled: boolean;
|
|
@@ -68,6 +69,13 @@ export declare function requireAgentAccess(ctx: McpRequestContext, id: string, r
|
|
|
68
69
|
* it can adopt the agent first (make_owner / grants adopt-public).
|
|
69
70
|
*/
|
|
70
71
|
export declare function requireBindingOwner(ctx: McpRequestContext, agent: AgentRef): void;
|
|
72
|
+
/**
|
|
73
|
+
* requireBindingOwner, plus: nothing owner-held may be bound to an agent
|
|
74
|
+
* everyone can write (anyone could then rewrite it to use the binding).
|
|
75
|
+
*/
|
|
76
|
+
export declare function requireBindable(ctx: McpRequestContext, agent: AgentRef, db?: GrantDb): Promise<void>;
|
|
77
|
+
/** The public-write half of requireBindable, for paths that skip the owner check (an admin's adminOverride). */
|
|
78
|
+
export declare function requireNotPublicWritable(agent: AgentRef, db: GrantDb): Promise<void>;
|
|
71
79
|
/** Prisma where for agent listings: own rows plus rows granted >= read; the operator sees all. */
|
|
72
80
|
export declare function readableAgentsWhere(ctx: McpRequestContext, db?: GrantDb): Promise<Prisma.AgentWhereInput>;
|
|
73
81
|
/** One grant lookup for a whole listing: returns agent -> the caller's access. */
|
package/dist/mcp/auth/access.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { atLeast, effectiveAccess, grantedAccessMap, grantedIds } from "../../core/grants.js";
|
|
1
|
+
import { atLeast, effectiveAccess, grantedAccessMap, grantedIds, isPublicWritable, } from "../../core/grants.js";
|
|
2
2
|
import { McpError } from "../errors.js";
|
|
3
3
|
export function agentNotFound(id) {
|
|
4
4
|
return new McpError(404, `Agent "${id}" not found.`);
|
|
@@ -42,6 +42,20 @@ export function requireBindingOwner(ctx, agent) {
|
|
|
42
42
|
throw new McpError(403, `Only the owner of agent "${agent.id}" can change its bindings.`);
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* requireBindingOwner, plus: nothing owner-held may be bound to an agent
|
|
47
|
+
* everyone can write (anyone could then rewrite it to use the binding).
|
|
48
|
+
*/
|
|
49
|
+
export async function requireBindable(ctx, agent, db = ctx.db) {
|
|
50
|
+
requireBindingOwner(ctx, agent);
|
|
51
|
+
await requireNotPublicWritable(agent, db);
|
|
52
|
+
}
|
|
53
|
+
/** The public-write half of requireBindable, for paths that skip the owner check (an admin's adminOverride). */
|
|
54
|
+
export async function requireNotPublicWritable(agent, db) {
|
|
55
|
+
if (await isPublicWritable(db, agent.id)) {
|
|
56
|
+
throw new McpError(409, `Agent "${agent.id}" is writable by everyone, so nothing can be bound to it; revoke or lower the everyone grant first.`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
45
59
|
/** Prisma where for agent listings: own rows plus rows granted >= read; the operator sees all. */
|
|
46
60
|
export async function readableAgentsWhere(ctx, db = ctx.db) {
|
|
47
61
|
if (ctx.operator)
|
|
@@ -26,8 +26,8 @@ export declare function visibleToPrincipal(principalId: string): {
|
|
|
26
26
|
};
|
|
27
27
|
export declare function requireOwnedBudgetGroup(db: PrismaClient, id: string, principalId: string): Promise<{
|
|
28
28
|
name: string;
|
|
29
|
-
createdAt: Date;
|
|
30
29
|
updatedAt: Date;
|
|
30
|
+
createdAt: Date;
|
|
31
31
|
id: string;
|
|
32
32
|
ownerId: string | null;
|
|
33
33
|
dailyBudgetUsd: import("@prisma/client-runtime-utils").Decimal | null;
|
|
@@ -37,8 +37,8 @@ export declare function requireOwnedBudgetGroup(db: PrismaClient, id: string, pr
|
|
|
37
37
|
}>;
|
|
38
38
|
export declare function requireReadableBudgetGroup(db: Pick<PrismaClient, "budgetGroup">, id: string, principalId: string): Promise<{
|
|
39
39
|
name: string;
|
|
40
|
-
createdAt: Date;
|
|
41
40
|
updatedAt: Date;
|
|
41
|
+
createdAt: Date;
|
|
42
42
|
id: string;
|
|
43
43
|
ownerId: string | null;
|
|
44
44
|
dailyBudgetUsd: import("@prisma/client-runtime-utils").Decimal | null;
|
|
@@ -50,8 +50,8 @@ export declare function requireOwnedSecret(db: PrismaClient, id: string, princip
|
|
|
50
50
|
export declare function requireOwnedWebhook(db: PrismaClient, id: string, principalId: string): Promise<void>;
|
|
51
51
|
export declare function requireOwnedDatastore(db: PrismaClient, id: string, principalId: string): Promise<{
|
|
52
52
|
name: string;
|
|
53
|
-
createdAt: Date;
|
|
54
53
|
updatedAt: Date;
|
|
54
|
+
createdAt: Date;
|
|
55
55
|
id: string;
|
|
56
56
|
ownerId: string | null;
|
|
57
57
|
}>;
|
|
@@ -72,14 +72,14 @@ export declare function assertStrictlyOwnedTool(tool: Tool | null, id: string, p
|
|
|
72
72
|
* triggered them. No canRead/null=public path exists here on purpose.
|
|
73
73
|
*/
|
|
74
74
|
export declare function requireOwnedTask(db: PrismaClient, taskId: string, principalId: string): Promise<{
|
|
75
|
+
updatedAt: Date;
|
|
75
76
|
error: import("@prisma/client/runtime/client").JsonValue | null;
|
|
76
|
-
status: import("#prisma").TaskStatus;
|
|
77
77
|
runId: string | null;
|
|
78
|
-
createdAt: Date;
|
|
79
|
-
updatedAt: Date;
|
|
80
|
-
kind: import("#prisma").TaskKind;
|
|
81
78
|
result: import("@prisma/client/runtime/client").JsonValue | null;
|
|
79
|
+
kind: import("#prisma").TaskKind;
|
|
80
|
+
createdAt: Date;
|
|
82
81
|
id: string;
|
|
82
|
+
status: import("#prisma").TaskStatus;
|
|
83
83
|
principalId: string | null;
|
|
84
84
|
inputRequests: import("@prisma/client/runtime/client").JsonValue | null;
|
|
85
85
|
inputResponses: import("@prisma/client/runtime/client").JsonValue | null;
|
|
@@ -23,10 +23,10 @@ export declare function lockUser(tx: AuthDb, id: string): Promise<{
|
|
|
23
23
|
subject: string;
|
|
24
24
|
};
|
|
25
25
|
} & {
|
|
26
|
-
status: string;
|
|
27
|
-
createdAt: Date;
|
|
28
26
|
updatedAt: Date;
|
|
27
|
+
createdAt: Date;
|
|
29
28
|
id: string;
|
|
29
|
+
status: string;
|
|
30
30
|
roles: string[];
|
|
31
31
|
displayName: string | null;
|
|
32
32
|
principalId: string;
|
|
@@ -58,11 +58,11 @@ export declare class IdentityService {
|
|
|
58
58
|
}>;
|
|
59
59
|
revokeKey(keyId: string): Promise<void>;
|
|
60
60
|
listUsers(): Prisma.PrismaPromise<{
|
|
61
|
+
id: string;
|
|
61
62
|
status: string;
|
|
62
63
|
principal: {
|
|
63
64
|
subject: string;
|
|
64
65
|
};
|
|
65
|
-
id: string;
|
|
66
66
|
roles: string[];
|
|
67
67
|
displayName: string | null;
|
|
68
68
|
}[]>;
|
|
@@ -16,10 +16,10 @@ export declare class Sessions {
|
|
|
16
16
|
subject: string;
|
|
17
17
|
};
|
|
18
18
|
} & {
|
|
19
|
-
status: string;
|
|
20
|
-
createdAt: Date;
|
|
21
19
|
updatedAt: Date;
|
|
20
|
+
createdAt: Date;
|
|
22
21
|
id: string;
|
|
22
|
+
status: string;
|
|
23
23
|
roles: string[];
|
|
24
24
|
displayName: string | null;
|
|
25
25
|
principalId: string;
|
|
@@ -33,6 +33,8 @@ export interface GitHubIngressDeps {
|
|
|
33
33
|
}>;
|
|
34
34
|
/** Accounts served in addition to the App's owner (WARDBY_GITHUB_ALLOWED_ACCOUNTS). */
|
|
35
35
|
allowedAccounts: () => ReadonlySet<string>;
|
|
36
|
+
/** False = no reply explaining why a mention started nothing (WARDBY_MENTION_EXPLANATIONS). */
|
|
37
|
+
mentionExplanations?: boolean;
|
|
36
38
|
/** Removes the App from an installation on an account that isn't served; absent = ignore only. */
|
|
37
39
|
uninstallInstallation?: (installationId: number) => Promise<void>;
|
|
38
40
|
now?: () => Date;
|
|
@@ -99,7 +99,7 @@ export async function handleGitHubEventIngress(req, deps) {
|
|
|
99
99
|
: {}),
|
|
100
100
|
};
|
|
101
101
|
}
|
|
102
|
-
const event = normalizeGitHubEvent(eventName, payload, app);
|
|
102
|
+
const event = normalizeGitHubEvent(eventName, payload, app, (dropped) => log.info({ ...dropped, deliveryId }, "mention ignored: its author did not pass the pre-filter"));
|
|
103
103
|
// An event we don't act on must never claim the delivery id: recording it
|
|
104
104
|
// here would let a later, real delivery of the same id (GitHub does reuse
|
|
105
105
|
// ids across distinct redeliveries of what it considers the same event)
|
|
@@ -130,6 +130,7 @@ export async function handleGitHubEventIngress(req, deps) {
|
|
|
130
130
|
repoAccess: deps.repoAccess,
|
|
131
131
|
...(deps.issueTrackers ? { issueTrackers: deps.issueTrackers } : {}),
|
|
132
132
|
mentionHandle: app.slug,
|
|
133
|
+
...(deps.mentionExplanations === false ? { mentionExplanations: false } : {}),
|
|
133
134
|
});
|
|
134
135
|
log.info({ event: event.kind, repository: event.repository, deliveryId, runIds: routed.runIds }, "host event routed");
|
|
135
136
|
return {
|
package/dist/mcp/index.d.ts
CHANGED
|
@@ -12,6 +12,12 @@ export declare function localOperatorContext(principal: Principal, providers: Mc
|
|
|
12
12
|
export declare function registerAllTools(mcp: WardbyMcpServer, opts: {
|
|
13
13
|
secretElicitationUrl: SecretElicitationUrlBuilder;
|
|
14
14
|
secretElicitationProtocol: boolean;
|
|
15
|
+
/** Builds a get_run_transcript download URL for a minted token; absent = transcripts are not served. */
|
|
16
|
+
runTranscriptUrl?: (token: string) => Promise<string>;
|
|
17
|
+
/** Whether a blob store is configured to serve run transcripts from. */
|
|
18
|
+
blobStoreConfigured?: boolean;
|
|
19
|
+
/** Which host serves those links (default http). */
|
|
20
|
+
runTranscriptAudience?: "stdio" | "http";
|
|
15
21
|
/** Rebuilds the process's installed model CatalogStore after set_model/disable_model/reset_model. */
|
|
16
22
|
refreshModelCatalog?: () => Promise<void>;
|
|
17
23
|
}): void;
|
package/dist/mcp/index.js
CHANGED
|
@@ -13,8 +13,11 @@
|
|
|
13
13
|
* missing `AUTH_JWKS_URI`/`AUTH_SIGNING_KEY` a deployment running stdio-only
|
|
14
14
|
* never needed to set.
|
|
15
15
|
*/
|
|
16
|
-
import {
|
|
16
|
+
import { startupTestSimulators } from "../config/test-simulators.js";
|
|
17
|
+
import { loadProviderConfig, loadMcpConfig, loadShutdownDrainSeconds, loadAuthConfig, loadGitHubEventConfig, loadJiraConfig, loadGitHubVcsConfig, loadBlobStoreConfig, } from "../config/providers.js";
|
|
17
18
|
import { prisma } from "../core/db.js";
|
|
19
|
+
import { guardDatastore, guardAgentMemory } from "../core/secret-guarded-stores.js";
|
|
20
|
+
import { createDbSecretWriteGuard } from "../core/secret-guard.js";
|
|
18
21
|
import { waitForInFlightRuns } from "../core/in-flight-runs.js";
|
|
19
22
|
import { NativeEngine } from "../core/engine-native.js";
|
|
20
23
|
import { resolveLlmRegistrations, RoutingLlmProvider } from "../providers/llm/index.js";
|
|
@@ -35,6 +38,7 @@ import { loadGitHubAllowedAccounts } from "../config/github-allowed-accounts.js"
|
|
|
35
38
|
import { buildMcpServer } from "./server.js";
|
|
36
39
|
import { buildPower } from "../core/power-composition.js";
|
|
37
40
|
import { countUnattendedSchedules, unattendedSchedulesWarning } from "./unattended-schedules.js";
|
|
41
|
+
import { logZod3ToolWarnings } from "../core/zod3-window.js";
|
|
38
42
|
import { runStdioServer } from "./transport/stdio.js";
|
|
39
43
|
import { startHttpServer } from "./transport/streamable-http.js";
|
|
40
44
|
import { resolvePrincipal } from "./auth/principal.js";
|
|
@@ -53,6 +57,7 @@ import { registerTriggerTool } from "./tools/trigger.js";
|
|
|
53
57
|
import { registerToolAuthoringTools } from "./tools/tools.js";
|
|
54
58
|
import { registerSchedulingTools } from "./tools/scheduling.js";
|
|
55
59
|
import { registerRunTools } from "./tools/runs.js";
|
|
60
|
+
import { registerStopRunTool } from "./tools/stop-run.js";
|
|
56
61
|
import { registerCostReportTools } from "./tools/cost-report.js";
|
|
57
62
|
import { registerDatastoreTools } from "./tools/datastore.js";
|
|
58
63
|
import { registerSubAgentTools } from "./tools/subagents.js";
|
|
@@ -62,9 +67,14 @@ import { registerIssueProjectTools } from "./tools/issue-projects.js";
|
|
|
62
67
|
import { registerNotificationChannelTools } from "./tools/notification-channels.js";
|
|
63
68
|
import { registerHostAccountTools } from "./tools/host-accounts.js";
|
|
64
69
|
import { registerMemoryTools } from "./tools/memory.js";
|
|
70
|
+
import { registerPackageTools } from "./tools/packages.js";
|
|
65
71
|
import { registerSecretsTools } from "./tools/secrets.js";
|
|
66
72
|
import { registerWebhookTools } from "./tools/webhooks.js";
|
|
67
|
-
import {
|
|
73
|
+
import { STDIO_SECRET_PATH, secretFormRoute } from "./tools/secret-elicitation-server.js";
|
|
74
|
+
import { createStdioLinkHost } from "./transport/stdio-link-host.js";
|
|
75
|
+
import { registerRunTranscriptTool } from "./tools/run-transcript.js";
|
|
76
|
+
import { handleRunTranscriptDownload, RUN_TRANSCRIPT_DOWNLOAD_PATH } from "./tools/run-transcript-download.js";
|
|
77
|
+
import { createBlobStore } from "../providers/storage/index.js";
|
|
68
78
|
import { SECRET_ELICITATION_PATH } from "./tools/secret-elicitation-form.js";
|
|
69
79
|
import { installWorkflowEventRecorder } from "../core/notifications.js";
|
|
70
80
|
import { logger } from "../core/logger.js";
|
|
@@ -118,6 +128,13 @@ export function registerAllTools(mcp, opts) {
|
|
|
118
128
|
registerToolAuthoringTools(mcp);
|
|
119
129
|
registerSchedulingTools(mcp);
|
|
120
130
|
registerRunTools(mcp);
|
|
131
|
+
const runTranscriptUrl = opts.runTranscriptUrl;
|
|
132
|
+
registerRunTranscriptTool(mcp, {
|
|
133
|
+
downloadUrl: runTranscriptUrl ?? (() => Promise.reject(new Error("run transcripts are not served here"))),
|
|
134
|
+
blobStoreConfigured: runTranscriptUrl !== undefined && opts.blobStoreConfigured === true,
|
|
135
|
+
audience: opts.runTranscriptAudience ?? "http",
|
|
136
|
+
});
|
|
137
|
+
registerStopRunTool(mcp);
|
|
121
138
|
registerCostReportTools(mcp);
|
|
122
139
|
registerDatastoreTools(mcp);
|
|
123
140
|
registerSubAgentTools(mcp);
|
|
@@ -127,6 +144,7 @@ export function registerAllTools(mcp, opts) {
|
|
|
127
144
|
registerNotificationChannelTools(mcp);
|
|
128
145
|
registerHostAccountTools(mcp);
|
|
129
146
|
registerMemoryTools(mcp);
|
|
147
|
+
registerPackageTools(mcp);
|
|
130
148
|
registerSecretsTools(mcp, {
|
|
131
149
|
buildElicitationUrl: opts.secretElicitationUrl,
|
|
132
150
|
protocolElicitation: opts.secretElicitationProtocol,
|
|
@@ -143,8 +161,9 @@ export function buildMcpProviders() {
|
|
|
143
161
|
const llm = new RoutingLlmProvider(llmResult.registrations);
|
|
144
162
|
const engine = new NativeEngine();
|
|
145
163
|
const secrets = buildSecretCipher(providerConfig);
|
|
146
|
-
const
|
|
147
|
-
const
|
|
164
|
+
const secretGuard = createDbSecretWriteGuard(prisma, secrets);
|
|
165
|
+
const datastore = guardDatastore(new PostgresDatastore(prisma, secrets), secretGuard);
|
|
166
|
+
const memory = guardAgentMemory(new PostgresAgentMemory(prisma), secretGuard);
|
|
148
167
|
const reviewHosts = buildReviewHosts(process.env, prisma);
|
|
149
168
|
const issueTrackers = buildIssueTrackers();
|
|
150
169
|
const hostUserAuthorizers = buildHostUserAuthorizers();
|
|
@@ -183,6 +202,7 @@ export function buildMcpProviders() {
|
|
|
183
202
|
providerConfig,
|
|
184
203
|
repoAccess,
|
|
185
204
|
power,
|
|
205
|
+
secretCipher: secrets,
|
|
186
206
|
// Sandbox-mode native runs (docs/native-sandbox.md); undefined when NATIVE_SANDBOX_LAUNCHER is unset.
|
|
187
207
|
nativeSandbox: buildNativeSandboxExecutor({ db: prisma, providers: nativeProviders, power }),
|
|
188
208
|
});
|
|
@@ -233,6 +253,8 @@ export function warmUpExecutor(executor) {
|
|
|
233
253
|
/** The real CLI entry point: `wardby mcp`. Reads config from the environment, starts stdio or HTTP per MCP_TRANSPORT. */
|
|
234
254
|
export async function startMcp(options = {}) {
|
|
235
255
|
const mcpConfig = loadMcpConfig();
|
|
256
|
+
// WARDBY_TEST_SIMULATORS (test only): refuses to start beside production configuration.
|
|
257
|
+
startupTestSimulators("server");
|
|
236
258
|
// Parsed up front so a malformed value fails at startup, not at shutdown.
|
|
237
259
|
const drainSeconds = loadShutdownDrainSeconds();
|
|
238
260
|
// Parsed now so a malformed list stops startup instead of failing every event.
|
|
@@ -251,15 +273,32 @@ export async function startMcp(options = {}) {
|
|
|
251
273
|
warmUpExecutor(providers.executor);
|
|
252
274
|
if (!options.schedulerAttached)
|
|
253
275
|
await warnIfNothingWillFireSchedules();
|
|
276
|
+
// Zod 3 compatibility window: one warning per custom tool the next release breaks. In the background.
|
|
277
|
+
void logZod3ToolWarnings(prisma, mcpLog);
|
|
278
|
+
// Run transcripts (get_run_transcript) are served from the blob store they were stored in.
|
|
279
|
+
const blobStoreConfig = loadBlobStoreConfig();
|
|
280
|
+
const blobs = blobStoreConfig ? createBlobStore(blobStoreConfig) : undefined;
|
|
254
281
|
if (mcpConfig.transport === "stdio") {
|
|
255
282
|
const mcp = buildMcpServer({ providers, db: prisma, config: { canonicalUri: STDIO_PLACEHOLDER_URI } });
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
283
|
+
// One loopback server for every signed link a stdio tool hands out.
|
|
284
|
+
const linkHost = createStdioLinkHost({
|
|
285
|
+
[STDIO_SECRET_PATH]: secretFormRoute({
|
|
286
|
+
verify: (token) => mcp.verifyRequestState(token),
|
|
287
|
+
secrets: providers.secrets,
|
|
288
|
+
db: prisma,
|
|
289
|
+
}),
|
|
290
|
+
[RUN_TRANSCRIPT_DOWNLOAD_PATH]: (req, res, token) => handleRunTranscriptDownload(req.method, token, res, {
|
|
291
|
+
verify: (t) => mcp.verifyRequestState(t),
|
|
292
|
+
audience: "stdio",
|
|
293
|
+
db: prisma,
|
|
294
|
+
blobs,
|
|
295
|
+
}),
|
|
260
296
|
});
|
|
261
297
|
registerAllTools(mcp, {
|
|
262
|
-
secretElicitationUrl: (token) =>
|
|
298
|
+
secretElicitationUrl: (token) => linkHost.urlFor(STDIO_SECRET_PATH, token),
|
|
299
|
+
runTranscriptUrl: (token) => linkHost.urlFor(RUN_TRANSCRIPT_DOWNLOAD_PATH, token),
|
|
300
|
+
runTranscriptAudience: "stdio",
|
|
301
|
+
blobStoreConfigured: blobs !== undefined,
|
|
263
302
|
secretElicitationProtocol: mcpConfig.secretElicitationProtocol,
|
|
264
303
|
refreshModelCatalog: () => modelCatalog.refreshNow(),
|
|
265
304
|
});
|
|
@@ -291,10 +330,17 @@ export async function startMcp(options = {}) {
|
|
|
291
330
|
const authProviderKind = providerConfig.auth === "self-hosted" ? "self-hosted" : "delegating";
|
|
292
331
|
const authProvider = buildAuthProvider(providerConfig.auth, authConfig, prisma);
|
|
293
332
|
const selfHosted = authProviderKind === "self-hosted" ? authProvider : undefined;
|
|
294
|
-
const mcp = buildMcpServer({
|
|
333
|
+
const mcp = buildMcpServer({
|
|
334
|
+
providers,
|
|
335
|
+
db: prisma,
|
|
336
|
+
config: { canonicalUri: mcpConfig.canonicalUri },
|
|
337
|
+
deriveRequestStateKey: true,
|
|
338
|
+
});
|
|
295
339
|
const httpOrigin = canonicalUrl(mcpConfig.canonicalUri).origin;
|
|
296
340
|
registerAllTools(mcp, {
|
|
297
341
|
secretElicitationUrl: (token) => Promise.resolve(`${httpOrigin}${SECRET_ELICITATION_PATH}?t=${encodeURIComponent(token)}`),
|
|
342
|
+
runTranscriptUrl: (token) => Promise.resolve(`${httpOrigin}${RUN_TRANSCRIPT_DOWNLOAD_PATH}?t=${encodeURIComponent(token)}`),
|
|
343
|
+
blobStoreConfigured: blobs !== undefined,
|
|
298
344
|
secretElicitationProtocol: mcpConfig.secretElicitationProtocol,
|
|
299
345
|
refreshModelCatalog: () => modelCatalog.refreshNow(),
|
|
300
346
|
});
|
|
@@ -319,6 +365,7 @@ export async function startMcp(options = {}) {
|
|
|
319
365
|
webhookSecret: eventConfig.webhookSecret,
|
|
320
366
|
appIdentity: (opts) => githubApp.appIdentity(opts),
|
|
321
367
|
allowedAccounts: () => allowedAccounts,
|
|
368
|
+
mentionExplanations: eventConfig.mentionExplanations,
|
|
322
369
|
uninstallInstallation: (id) => githubApp.deleteInstallation(id),
|
|
323
370
|
},
|
|
324
371
|
}
|
|
@@ -385,6 +432,7 @@ export async function startMcp(options = {}) {
|
|
|
385
432
|
hostEvents,
|
|
386
433
|
hostUserAuth,
|
|
387
434
|
viewer,
|
|
435
|
+
blobs,
|
|
388
436
|
});
|
|
389
437
|
const cleanupTimer = selfHosted
|
|
390
438
|
? setInterval(() => {
|
package/dist/mcp/server.d.ts
CHANGED
|
@@ -25,6 +25,14 @@
|
|
|
25
25
|
import { type McpServerFactory, type InputRequiredResult } from "@modelcontextprotocol/server";
|
|
26
26
|
import type { PrismaClient } from "#prisma";
|
|
27
27
|
import type { McpRequestContext, McpProviders } from "./context.js";
|
|
28
|
+
/**
|
|
29
|
+
* Most array elements plus object members one `tools/call` may carry
|
|
30
|
+
* (GHSA-46jr-4wx8-v453). Validating an argument tree costs memory per node, so
|
|
31
|
+
* without a bound one request inside the 1 MiB body limit could hold a very
|
|
32
|
+
* large tree. The largest legitimate input is a datastore value, itself capped
|
|
33
|
+
* at 1 MiB; 100,000 nodes leaves ample room for any realistic value.
|
|
34
|
+
*/
|
|
35
|
+
export declare const MAX_TOOL_INPUT_ELEMENTS = 100000;
|
|
28
36
|
export interface ToolSpec<Args = Record<string, unknown>> {
|
|
29
37
|
name: string;
|
|
30
38
|
description?: string;
|
|
@@ -58,6 +66,11 @@ export interface BuildMcpServerOptions {
|
|
|
58
66
|
config: McpServerConfig;
|
|
59
67
|
/** Testability hook for REQUEST_STATE_KEY — defaults to process.env, matching buildSecretCipher's convention. */
|
|
60
68
|
env?: NodeJS.ProcessEnv;
|
|
69
|
+
/**
|
|
70
|
+
* HTTP transport: with REQUEST_STATE_KEY unset, derive the requestState key from SECRET_APP_KEY so
|
|
71
|
+
* every instance sharing that key verifies every other instance's tokens. stdio leaves it off.
|
|
72
|
+
*/
|
|
73
|
+
deriveRequestStateKey?: boolean;
|
|
61
74
|
}
|
|
62
75
|
export interface DiscoverResultLike {
|
|
63
76
|
capabilities: {
|
package/dist/mcp/server.js
CHANGED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
* whole connection.
|
|
24
24
|
*/
|
|
25
25
|
import { McpServer, fromJsonSchema, createRequestStateCodec, CLIENT_CAPABILITIES_META_KEY, } from "@modelcontextprotocol/server";
|
|
26
|
-
import { randomBytes } from "node:crypto";
|
|
26
|
+
import { hkdfSync, randomBytes } from "node:crypto";
|
|
27
27
|
import { readFileSync } from "node:fs";
|
|
28
28
|
import { requireScope } from "./auth/resource-server.js";
|
|
29
29
|
import { McpError, mapPrismaError } from "./errors.js";
|
|
@@ -33,17 +33,35 @@ import { grantedIds } from "../core/grants.js";
|
|
|
33
33
|
import { logger } from "../core/logger.js";
|
|
34
34
|
/** The package version, reported in MCP server info (package.json sits two levels up from src/mcp and dist/mcp). */
|
|
35
35
|
const SERVER_VERSION = JSON.parse(readFileSync(new URL("../../package.json", import.meta.url), "utf8")).version;
|
|
36
|
+
/**
|
|
37
|
+
* Most array elements plus object members one `tools/call` may carry
|
|
38
|
+
* (GHSA-46jr-4wx8-v453). Validating an argument tree costs memory per node, so
|
|
39
|
+
* without a bound one request inside the 1 MiB body limit could hold a very
|
|
40
|
+
* large tree. The largest legitimate input is a datastore value, itself capped
|
|
41
|
+
* at 1 MiB; 100,000 nodes leaves ample room for any realistic value.
|
|
42
|
+
*/
|
|
43
|
+
export const MAX_TOOL_INPUT_ELEMENTS = 100_000;
|
|
36
44
|
const REQUEST_STATE_KEY_BYTES = 32;
|
|
45
|
+
/** HKDF info for the requestState key derived from SECRET_APP_KEY; never reused for another key. */
|
|
46
|
+
const REQUEST_STATE_KEY_INFO = "wardby/mcp/request-state/http/v1";
|
|
37
47
|
/**
|
|
38
48
|
* REQUEST_STATE_KEY (hex, 32 bytes) shares the requestState HMAC key across
|
|
39
|
-
* instances — see the requestStateCodec construction below. Unset
|
|
40
|
-
*
|
|
41
|
-
*
|
|
49
|
+
* instances — see the requestStateCodec construction below. Unset, the HTTP
|
|
50
|
+
* transport derives it from SECRET_APP_KEY (HKDF-SHA256, a label of its own),
|
|
51
|
+
* which every instance of one deployment already shares, so a multi-instance
|
|
52
|
+
* deployment needs no extra setting; the derived key reveals nothing about
|
|
53
|
+
* SECRET_APP_KEY. Without either, or on stdio, it is a fresh random key per
|
|
54
|
+
* process, which is correct when nothing outside that process verifies its
|
|
55
|
+
* tokens (and keeps stdio tokens from verifying on the HTTP server).
|
|
42
56
|
*/
|
|
43
|
-
function loadRequestStateKey(env) {
|
|
57
|
+
function loadRequestStateKey(env, derive) {
|
|
44
58
|
const hex = env.REQUEST_STATE_KEY;
|
|
45
|
-
if (!hex)
|
|
46
|
-
|
|
59
|
+
if (!hex) {
|
|
60
|
+
const appKey = derive && env.SECRET_APP_KEY ? Buffer.from(env.SECRET_APP_KEY, "hex") : undefined;
|
|
61
|
+
if (appKey?.length !== REQUEST_STATE_KEY_BYTES)
|
|
62
|
+
return randomBytes(REQUEST_STATE_KEY_BYTES);
|
|
63
|
+
return new Uint8Array(hkdfSync("sha256", appKey, Buffer.alloc(0), REQUEST_STATE_KEY_INFO, REQUEST_STATE_KEY_BYTES));
|
|
64
|
+
}
|
|
47
65
|
const key = Buffer.from(hex, "hex");
|
|
48
66
|
if (key.length !== REQUEST_STATE_KEY_BYTES) {
|
|
49
67
|
throw new Error(`REQUEST_STATE_KEY must be ${REQUEST_STATE_KEY_BYTES} bytes of hex (${REQUEST_STATE_KEY_BYTES * 2} hex chars); got ${key.length} bytes.`);
|
|
@@ -76,16 +94,16 @@ export function buildMcpServer(opts) {
|
|
|
76
94
|
// against the codec's implementation) — safe to call verifyRequestState()
|
|
77
95
|
// from outside a real MCP request (the secret-elicitation browser form).
|
|
78
96
|
//
|
|
79
|
-
// REQUEST_STATE_KEY,
|
|
80
|
-
// on another — required for the
|
|
81
|
-
// browser-form POST, polling retry)
|
|
97
|
+
// REQUEST_STATE_KEY (or, over HTTP, the key derived from SECRET_APP_KEY)
|
|
98
|
+
// lets a token minted by one process verify on another — required for the
|
|
99
|
+
// secret-elicitation round trip (mint, browser-form POST, polling retry)
|
|
100
|
+
// and the run-transcript download to work under a multi-instance HTTP
|
|
82
101
|
// deployment, where those three legs can land on three different
|
|
83
102
|
// processes (see secret-elicitation.ts's matching Postgres-backed outcome
|
|
84
|
-
// store). stdio
|
|
85
|
-
//
|
|
86
|
-
// outside this same running server ever needs to verify a token it minted.
|
|
103
|
+
// store). stdio needs no configuration: a fresh random key per process is
|
|
104
|
+
// fine, since nothing outside that running server verifies its tokens.
|
|
87
105
|
const requestStateCodec = createRequestStateCodec({
|
|
88
|
-
key: loadRequestStateKey(opts.env ?? process.env),
|
|
106
|
+
key: loadRequestStateKey(opts.env ?? process.env, opts.deriveRequestStateKey ?? false),
|
|
89
107
|
ttlSeconds: 600,
|
|
90
108
|
});
|
|
91
109
|
function mcpReqOf(sdkCtx) {
|
|
@@ -125,6 +143,7 @@ export function buildMcpServer(opts) {
|
|
|
125
143
|
const mcpServer = new McpServer({ name: "wardby", version: SERVER_VERSION }, {
|
|
126
144
|
requestState: { verify: (state, ctx) => requestStateCodec.verify(state, ctx) },
|
|
127
145
|
instructions: SERVER_INSTRUCTIONS,
|
|
146
|
+
maxToolInputElements: MAX_TOOL_INPUT_ELEMENTS,
|
|
128
147
|
});
|
|
129
148
|
mcpServer.server.registerCapabilities({ extensions: { [TASKS_EXTENSION_ID]: {} } });
|
|
130
149
|
for (const spec of specs) {
|
|
@@ -1,2 +1,6 @@
|
|
|
1
1
|
import type { WardbyMcpServer } from "../server.js";
|
|
2
|
+
/** The warning create_agent / update_agent return (not a refusal): wardby can't tell how old a custom image is. */
|
|
3
|
+
export declare 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.";
|
|
4
|
+
export declare 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).";
|
|
5
|
+
export declare 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.";
|
|
2
6
|
export declare function registerAgentTools(mcp: WardbyMcpServer): void;
|