@wardby/cli 0.5.3 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +33 -0
- package/README.md +25 -14
- package/deploy/local/docker-compose.quickstart-coding.yml +13 -0
- package/dist/claude-coding-worker/context.d.ts +22 -0
- package/dist/claude-coding-worker/context.js +92 -0
- package/dist/claude-coding-worker/driver.d.ts +27 -3
- package/dist/claude-coding-worker/driver.js +161 -20
- package/dist/claude-coding-worker/main.js +34 -6
- package/dist/claude-coding-worker/sdk.js +25 -5
- package/dist/claude-coding-worker/tool-socket.d.ts +27 -0
- package/dist/claude-coding-worker/tool-socket.js +111 -0
- package/dist/claude-coding-worker/transcript.d.ts +18 -0
- package/dist/claude-coding-worker/transcript.js +77 -0
- package/dist/cli-help.d.ts +1 -1
- package/dist/cli-help.js +6 -2
- package/dist/cli-native-mode.d.ts +9 -0
- package/dist/cli-native-mode.js +20 -0
- package/dist/cli.d.ts +3 -1
- package/dist/cli.js +161 -11
- package/dist/coding/claude-context.d.ts +45 -0
- package/dist/coding/claude-context.js +434 -0
- package/dist/coding/continuation-wording.d.ts +35 -0
- package/dist/coding/continuation-wording.js +73 -0
- package/dist/coding/linked-issue-note.d.ts +23 -0
- package/dist/coding/linked-issue-note.js +47 -0
- package/dist/coding/merge-wording.d.ts +28 -0
- package/dist/coding/merge-wording.js +78 -0
- package/dist/coding/pr-description-note.d.ts +9 -0
- package/dist/coding/pr-description-note.js +32 -0
- package/dist/coding/profile.d.ts +50 -118
- package/dist/coding/profile.js +51 -4
- package/dist/coding/protected-path-wording.d.ts +8 -0
- package/dist/coding/protected-path-wording.js +1 -1
- package/dist/coding/protocol.d.ts +292 -270
- package/dist/coding/protocol.js +322 -15
- package/dist/coding/redact.d.ts +3 -0
- package/dist/coding/redact.js +12 -0
- package/dist/coding/registry/allowlist.d.ts +12 -0
- package/dist/coding/registry/allowlist.js +14 -1
- package/dist/coding/registry/audit-mode.d.ts +153 -0
- package/dist/coding/registry/audit-mode.js +304 -0
- package/dist/coding/registry/lockfile-shared.d.ts +36 -0
- package/dist/coding/registry/lockfile-shared.js +128 -0
- package/dist/coding/registry/lockfiles.js +1 -1
- package/dist/coding/registry/npm-lockfile-formats.d.ts +11 -0
- package/dist/coding/registry/npm-lockfile-formats.js +41 -0
- package/dist/coding/registry/npm-lockfile.d.ts +8 -4
- package/dist/coding/registry/npm-lockfile.js +4 -6
- package/dist/coding/registry/npm.js +78 -8
- package/dist/coding/registry/pnpm-lockfile.d.ts +17 -0
- package/dist/coding/registry/pnpm-lockfile.js +189 -0
- package/dist/coding/registry/pypi-plan.d.ts +50 -0
- package/dist/coding/registry/pypi-plan.js +406 -0
- package/dist/coding/registry/pypi-requirements.d.ts +58 -0
- package/dist/coding/registry/pypi-requirements.js +155 -0
- package/dist/coding/registry/pypi.d.ts +3 -27
- package/dist/coding/registry/pypi.js +40 -154
- package/dist/coding/registry/refusal-hints.d.ts +20 -0
- package/dist/coding/registry/refusal-hints.js +61 -0
- package/dist/coding/registry/refusal-wording.d.ts +11 -0
- package/dist/coding/registry/refusal-wording.js +56 -0
- package/dist/coding/registry/report.d.ts +70 -8
- package/dist/coding/registry/report.js +112 -5
- package/dist/coding/registry/types.d.ts +58 -8
- package/dist/coding/registry/yarn-lockfile.d.ts +30 -0
- package/dist/coding/registry/yarn-lockfile.js +367 -0
- package/dist/coding/services/catalog.d.ts +37 -351
- package/dist/coding/transcript/claude-code.d.ts +13 -0
- package/dist/coding/transcript/claude-code.js +273 -0
- package/dist/coding/transcript/download-protocol.d.ts +30 -0
- package/dist/coding/transcript/download-protocol.js +18 -0
- package/dist/coding/transcript/format.d.ts +20 -0
- package/dist/coding/transcript/format.js +32 -0
- package/dist/coding/transcript/recorder.d.ts +51 -0
- package/dist/coding/transcript/recorder.js +225 -0
- package/dist/coding/transcript/resume/checkout.d.ts +31 -0
- package/dist/coding/transcript/resume/checkout.js +203 -0
- package/dist/coding/transcript/resume/command.d.ts +17 -0
- package/dist/coding/transcript/resume/command.js +176 -0
- package/dist/coding/transcript/resume/download.d.ts +20 -0
- package/dist/coding/transcript/resume/download.js +153 -0
- package/dist/coding/transcript/resume/launch.d.ts +38 -0
- package/dist/coding/transcript/resume/launch.js +128 -0
- package/dist/coding/transcript/resume/session-file.d.ts +13 -0
- package/dist/coding/transcript/resume/session-file.js +79 -0
- package/dist/coding/transcript/resume/stand-in.d.ts +11 -0
- package/dist/coding/transcript/resume/stand-in.js +49 -0
- package/dist/coding-worker/artifact.d.ts +16 -3
- package/dist/coding-worker/artifact.js +5 -3
- package/dist/coding-worker/debug-trace.d.ts +6 -5
- package/dist/coding-worker/debug-trace.js +13 -18
- package/dist/coding-worker/dependency-cache.d.mts +229 -0
- package/dist/coding-worker/dependency-cache.mjs +2123 -0
- package/dist/coding-worker/driver.d.ts +4 -3
- package/dist/coding-worker/driver.js +118 -38
- package/dist/coding-worker/errors.d.ts +1 -0
- package/dist/coding-worker/errors.js +32 -0
- package/dist/coding-worker/sdk.d.ts +6 -0
- package/dist/coding-worker/sdk.js +1 -0
- package/dist/coding-worker/skills.d.ts +23 -0
- package/dist/coding-worker/skills.js +117 -0
- package/dist/coding-worker/task-note.d.ts +11 -0
- package/dist/coding-worker/task-note.js +13 -0
- package/dist/coding-worker/types.d.ts +13 -0
- package/dist/config/dependency-cache.d.ts +23 -0
- package/dist/config/dependency-cache.js +32 -0
- package/dist/config/github-allowed-accounts.d.ts +15 -0
- package/dist/config/github-allowed-accounts.js +36 -0
- package/dist/config/low-power.d.ts +12 -0
- package/dist/config/low-power.js +18 -0
- package/dist/config/mobile.d.ts +12 -0
- package/dist/config/mobile.js +18 -0
- package/dist/config/providers.d.ts +65 -3
- package/dist/config/providers.js +147 -11
- package/dist/config/test-simulators.d.ts +82 -0
- package/dist/config/test-simulators.js +305 -0
- package/dist/core/async-context.d.ts +2 -0
- package/dist/core/async-context.js +12 -0
- package/dist/core/budget-events.d.ts +108 -0
- package/dist/core/budget-events.js +346 -0
- package/dist/core/budget-groups.d.ts +50 -1
- package/dist/core/budget-groups.js +236 -27
- package/dist/core/budget-stopped-head.d.ts +46 -0
- package/dist/core/budget-stopped-head.js +81 -0
- package/dist/core/budget-topup.d.ts +51 -0
- package/dist/core/budget-topup.js +156 -0
- package/dist/core/budget-wording.d.ts +16 -2
- package/dist/core/budget-wording.js +40 -2
- package/dist/core/coding-queue.d.ts +2 -1
- package/dist/core/coding-queue.js +7 -0
- package/dist/core/cron.d.ts +19 -1
- package/dist/core/cron.js +17 -0
- package/dist/core/datastores.js +1 -1
- package/dist/core/db.d.ts +16 -6
- package/dist/core/db.js +12 -10
- package/dist/core/deferred-coding.d.ts +14 -0
- package/dist/core/deferred-coding.js +62 -0
- package/dist/core/delegation-child.d.ts +25 -0
- package/dist/core/delegation-child.js +37 -0
- package/dist/core/dispatch.d.ts +53 -0
- package/dist/core/dispatch.js +167 -57
- package/dist/core/engine-native.js +10 -6
- package/dist/core/error-code.d.ts +38 -0
- package/dist/core/error-code.js +168 -0
- package/dist/core/grants.d.ts +19 -6
- package/dist/core/grants.js +55 -6
- package/dist/core/host-events.d.ts +67 -5
- package/dist/core/host-events.js +571 -37
- package/dist/core/host-status.d.ts +85 -3
- package/dist/core/host-status.js +298 -20
- package/dist/core/issue-bridge.d.ts +50 -6
- package/dist/core/issue-bridge.js +151 -20
- package/dist/core/issue-events.d.ts +1 -1
- package/dist/core/issue-events.js +16 -11
- package/dist/core/issue-status.d.ts +1 -1
- package/dist/core/issue-status.js +68 -29
- package/dist/core/logger.d.ts +5 -0
- package/dist/core/logger.js +14 -1
- package/dist/core/lost-run-children.d.ts +6 -0
- package/dist/core/lost-run-children.js +32 -0
- package/dist/core/mark-ready.d.ts +34 -0
- package/dist/core/mark-ready.js +152 -0
- package/dist/core/markdown-code.d.ts +8 -0
- package/dist/core/markdown-code.js +107 -0
- package/dist/core/memory-tools.js +7 -0
- package/dist/core/merge-order-check.d.ts +130 -0
- package/dist/core/merge-order-check.js +343 -0
- package/dist/core/notification-dispatcher.d.ts +70 -0
- package/dist/core/notification-dispatcher.js +368 -0
- package/dist/core/notification-templates.d.ts +19 -0
- package/dist/core/notification-templates.js +139 -0
- package/dist/core/notifications.d.ts +10 -0
- package/dist/core/notifications.js +38 -0
- package/dist/core/pg-auth.d.ts +22 -0
- package/dist/core/pg-auth.js +152 -0
- package/dist/core/power-composition.d.ts +16 -0
- package/dist/core/power-composition.js +37 -0
- package/dist/core/power-idle.d.ts +14 -0
- package/dist/core/power-idle.js +30 -0
- package/dist/core/power.d.ts +71 -0
- package/dist/core/power.js +202 -0
- package/dist/core/pull-request-state-sync.js +2 -2
- package/dist/core/reconciler.d.ts +8 -5
- package/dist/core/reconciler.js +37 -6
- package/dist/core/related-pull-requests.d.ts +59 -7
- package/dist/core/related-pull-requests.js +140 -25
- package/dist/core/reply-parts.d.ts +21 -0
- package/dist/core/reply-parts.js +73 -0
- package/dist/core/repo-access.d.ts +15 -0
- package/dist/core/repo-access.js +66 -0
- package/dist/core/review-fix.d.ts +38 -1
- package/dist/core/review-fix.js +209 -7
- package/dist/core/review-host-checks.d.ts +1 -1
- package/dist/core/review-host-tools.d.ts +23 -0
- package/dist/core/review-host-tools.js +156 -14
- package/dist/core/review-reads.d.ts +55 -0
- package/dist/core/review-reads.js +233 -0
- package/dist/core/run-status.d.ts +12 -0
- package/dist/core/run-status.js +12 -0
- package/dist/core/runner.d.ts +384 -5
- package/dist/core/runner.js +1244 -372
- package/dist/core/schedule-start.d.ts +12 -0
- package/dist/core/schedule-start.js +14 -0
- package/dist/core/secret-broker-config.d.ts +39 -0
- package/dist/core/secret-broker-config.js +112 -0
- package/dist/core/secret-guard.d.ts +46 -0
- package/dist/core/secret-guard.js +104 -0
- package/dist/core/secret-guarded-stores.d.ts +12 -0
- package/dist/core/secret-guarded-stores.js +41 -0
- package/dist/core/secret-spans.d.ts +50 -0
- package/dist/core/secret-spans.js +94 -0
- package/dist/core/secrets.d.ts +39 -4
- package/dist/core/secrets.js +148 -40
- package/dist/core/stop-run.d.ts +46 -0
- package/dist/core/stop-run.js +61 -0
- package/dist/core/workflow-event-recorder.d.ts +14 -0
- package/dist/core/workflow-event-recorder.js +120 -0
- package/dist/core/workflow-events.d.ts +94 -0
- package/dist/core/workflow-events.js +48 -0
- package/dist/core/workflow-run-events.d.ts +18 -0
- package/dist/core/workflow-run-events.js +75 -0
- package/dist/core/zod-json-schema.d.ts +4 -0
- package/dist/core/zod-json-schema.js +39 -0
- package/dist/core/zod3-window.d.ts +35 -0
- package/dist/core/zod3-window.js +124 -0
- package/dist/generated/prisma/browser.d.ts +92 -3
- package/dist/generated/prisma/client.d.ts +92 -3
- package/dist/generated/prisma/commonInputTypes.d.ts +364 -54
- package/dist/generated/prisma/enums.d.ts +37 -0
- package/dist/generated/prisma/enums.js +31 -0
- package/dist/generated/prisma/internal/class.d.ts +132 -0
- package/dist/generated/prisma/internal/class.js +4 -4
- package/dist/generated/prisma/internal/prismaNamespace.d.ts +1332 -142
- package/dist/generated/prisma/internal/prismaNamespace.js +227 -5
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +234 -0
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +227 -5
- package/dist/generated/prisma/models/Agent.d.ts +464 -7
- package/dist/generated/prisma/models/AgentRepository.d.ts +42 -1
- package/dist/generated/prisma/models/CodingAgentProfile.d.ts +301 -1
- package/dist/generated/prisma/models/CodingProxyRequest.d.ts +207 -3
- package/dist/generated/prisma/models/CodingProxySession.d.ts +114 -1
- package/dist/generated/prisma/models/CodingRun.d.ts +1841 -1
- package/dist/generated/prisma/models/DeferredReview.d.ts +78 -1
- package/dist/generated/prisma/models/DependencySnapshot.d.ts +1668 -0
- package/dist/generated/prisma/models/DependencySnapshot.js +1 -0
- package/dist/generated/prisma/models/IssuePullRequest.d.ts +6 -2
- package/dist/generated/prisma/models/LocalReview.d.ts +40 -1
- package/dist/generated/prisma/models/NativeGatewayCall.d.ts +1713 -0
- package/dist/generated/prisma/models/NativeGatewayCall.js +1 -0
- package/dist/generated/prisma/models/NativeGatewaySession.d.ts +1551 -0
- package/dist/generated/prisma/models/NativeGatewaySession.js +1 -0
- package/dist/generated/prisma/models/NativeWarmWorker.d.ts +1296 -0
- package/dist/generated/prisma/models/NativeWarmWorker.js +1 -0
- package/dist/generated/prisma/models/NotificationChannel.d.ts +1543 -0
- package/dist/generated/prisma/models/NotificationChannel.js +1 -0
- package/dist/generated/prisma/models/NotificationDelivery.d.ts +1502 -0
- package/dist/generated/prisma/models/NotificationDelivery.js +1 -0
- package/dist/generated/prisma/models/NotificationThread.d.ts +1090 -0
- package/dist/generated/prisma/models/NotificationThread.js +1 -0
- package/dist/generated/prisma/models/RegistryAllowance.d.ts +41 -1
- package/dist/generated/prisma/models/RegistryApprovedVersion.d.ts +75 -1
- package/dist/generated/prisma/models/RegistryAuditRecord.d.ts +1364 -0
- package/dist/generated/prisma/models/RegistryAuditRecord.js +1 -0
- package/dist/generated/prisma/models/Run.d.ts +1619 -58
- package/dist/generated/prisma/models/RunBudgetEvent.d.ts +1211 -0
- package/dist/generated/prisma/models/RunBudgetEvent.js +1 -0
- package/dist/generated/prisma/models/RunHostCheck.d.ts +36 -1
- package/dist/generated/prisma/models/RunTranscript.d.ts +1339 -0
- package/dist/generated/prisma/models/RunTranscript.js +1 -0
- package/dist/generated/prisma/models/Secret.d.ts +37 -1
- package/dist/generated/prisma/models/SecretBrokerChange.d.ts +1101 -0
- package/dist/generated/prisma/models/SecretBrokerChange.js +1 -0
- package/dist/generated/prisma/models/WorkflowEvent.d.ts +1422 -0
- package/dist/generated/prisma/models/WorkflowEvent.js +1 -0
- package/dist/generated/prisma/models.d.ts +12 -0
- package/dist/help/build.js +4 -2
- package/dist/help/catalog.d.ts +1 -1
- package/dist/help/catalog.js +31 -6
- package/dist/help-index.json +2584 -146
- package/dist/import/create.js +49 -3
- package/dist/import/neutral-schema.d.ts +50 -277
- package/dist/import/neutral-schema.js +7 -4
- package/dist/knowledge/check.d.ts +1 -1
- package/dist/knowledge/cli.d.ts +11 -1
- package/dist/knowledge/cli.js +37 -4
- package/dist/knowledge/concept.d.ts +3 -19
- package/dist/knowledge/location.d.ts +31 -0
- package/dist/knowledge/location.js +78 -0
- package/dist/mcp/auth/access.d.ts +11 -2
- package/dist/mcp/auth/access.js +15 -1
- package/dist/mcp/auth/ownership.d.ts +7 -7
- package/dist/mcp/auth/repo-authorization.js +14 -0
- package/dist/mcp/auth/resource-server.d.ts +2 -1
- package/dist/mcp/auth/resource-server.js +7 -2
- package/dist/mcp/auth/self-hosted/browser.d.ts +1 -1
- package/dist/mcp/auth/self-hosted/browser.js +19 -6
- package/dist/mcp/auth/self-hosted/credentials.d.ts +3 -3
- package/dist/mcp/auth/self-hosted/session.d.ts +2 -2
- package/dist/mcp/context.d.ts +6 -0
- package/dist/mcp/host-events/github-ingress.d.ts +25 -1
- package/dist/mcp/host-events/github-ingress.js +70 -1
- package/dist/mcp/index.d.ts +19 -0
- package/dist/mcp/index.js +117 -20
- package/dist/mcp/server.d.ts +13 -0
- package/dist/mcp/server.js +33 -14
- package/dist/mcp/tools/agents.d.ts +4 -0
- package/dist/mcp/tools/agents.js +277 -24
- package/dist/mcp/tools/datastore.js +17 -8
- package/dist/mcp/tools/grants.js +9 -3
- package/dist/mcp/tools/memory.js +11 -1
- package/dist/mcp/tools/notification-channels.d.ts +2 -0
- package/dist/mcp/tools/notification-channels.js +293 -0
- package/dist/mcp/tools/packages.d.ts +2 -0
- package/dist/mcp/tools/packages.js +195 -0
- package/dist/mcp/tools/power.d.ts +2 -0
- package/dist/mcp/tools/power.js +77 -0
- package/dist/mcp/tools/repositories.js +18 -5
- package/dist/mcp/tools/run-access.d.ts +16 -0
- package/dist/mcp/tools/run-access.js +25 -0
- package/dist/mcp/tools/run-transcript-download.d.ts +30 -0
- package/dist/mcp/tools/run-transcript-download.js +129 -0
- package/dist/mcp/tools/run-transcript.d.ts +19 -0
- package/dist/mcp/tools/run-transcript.js +70 -0
- package/dist/mcp/tools/runs.d.ts +0 -6
- package/dist/mcp/tools/runs.js +41 -14
- package/dist/mcp/tools/scheduling.js +3 -1
- package/dist/mcp/tools/secret-broker-compat.d.ts +12 -0
- package/dist/mcp/tools/secret-broker-compat.js +23 -0
- package/dist/mcp/tools/secret-elicitation-form.d.ts +22 -2
- package/dist/mcp/tools/secret-elicitation-form.js +205 -10
- package/dist/mcp/tools/secret-elicitation-server.d.ts +6 -0
- package/dist/mcp/tools/secret-elicitation-server.js +10 -54
- package/dist/mcp/tools/secret-elicitation.d.ts +38 -3
- package/dist/mcp/tools/secret-elicitation.js +110 -12
- package/dist/mcp/tools/secrets.js +186 -9
- package/dist/mcp/tools/stop-run.d.ts +2 -0
- package/dist/mcp/tools/stop-run.js +82 -0
- package/dist/mcp/tools/subagents.js +2 -2
- package/dist/mcp/tools/tools.d.ts +2 -2
- package/dist/mcp/tools/tools.js +47 -11
- package/dist/mcp/transport/stdio-link-host.d.ts +20 -0
- package/dist/mcp/transport/stdio-link-host.js +67 -0
- package/dist/mcp/transport/streamable-http.d.ts +13 -0
- package/dist/mcp/transport/streamable-http.js +41 -1
- package/dist/native-worker/composition.d.ts +23 -0
- package/dist/native-worker/composition.js +77 -0
- package/dist/native-worker/docker-isolation.d.ts +65 -0
- package/dist/native-worker/docker-isolation.js +183 -0
- package/dist/native-worker/docker-launcher.d.ts +110 -0
- package/dist/native-worker/docker-launcher.js +297 -0
- package/dist/native-worker/gateway-server.d.ts +77 -0
- package/dist/native-worker/gateway-server.js +412 -0
- package/dist/native-worker/gateway.d.ts +70 -0
- package/dist/native-worker/gateway.js +263 -0
- package/dist/native-worker/http-server.d.ts +24 -0
- package/dist/native-worker/http-server.js +113 -0
- package/dist/native-worker/http-transport.d.ts +17 -0
- package/dist/native-worker/http-transport.js +88 -0
- package/dist/native-worker/kubernetes-isolation.d.ts +90 -0
- package/dist/native-worker/kubernetes-isolation.js +218 -0
- package/dist/native-worker/kubernetes-launcher.d.ts +106 -0
- package/dist/native-worker/kubernetes-launcher.js +375 -0
- package/dist/native-worker/launch.d.ts +62 -0
- package/dist/native-worker/launch.js +49 -0
- package/dist/native-worker/ledger.d.ts +125 -0
- package/dist/native-worker/ledger.js +245 -0
- package/dist/native-worker/loopback.d.ts +12 -0
- package/dist/native-worker/loopback.js +44 -0
- package/dist/native-worker/main.d.ts +8 -0
- package/dist/native-worker/main.js +85 -0
- package/dist/native-worker/protocol.d.ts +296 -0
- package/dist/native-worker/protocol.js +246 -0
- package/dist/native-worker/sandbox-executor.d.ts +83 -0
- package/dist/native-worker/sandbox-executor.js +284 -0
- package/dist/native-worker/stderr-redaction.d.ts +77 -0
- package/dist/native-worker/stderr-redaction.js +237 -0
- package/dist/native-worker/stdio.d.ts +29 -0
- package/dist/native-worker/stdio.js +189 -0
- package/dist/native-worker/warm-delivery.d.ts +16 -0
- package/dist/native-worker/warm-delivery.js +33 -0
- package/dist/native-worker/warm-pool-ledger.d.ts +39 -0
- package/dist/native-worker/warm-pool-ledger.js +73 -0
- package/dist/native-worker/warm-pool.d.ts +107 -0
- package/dist/native-worker/warm-pool.js +283 -0
- package/dist/native-worker/worker.d.ts +17 -0
- package/dist/native-worker/worker.js +141 -0
- package/dist/observability/metrics.js +6 -1
- package/dist/providers/auth/authorization-server.d.ts +3 -0
- package/dist/providers/auth/index.js +2 -0
- package/dist/providers/auth/self-hosted.d.ts +14 -2
- package/dist/providers/auth/self-hosted.js +54 -4
- package/dist/providers/chat/fake.d.ts +46 -0
- package/dist/providers/chat/fake.js +39 -0
- package/dist/providers/chat/index.d.ts +4 -0
- package/dist/providers/chat/index.js +8 -0
- package/dist/providers/chat/slack.d.ts +37 -0
- package/dist/providers/chat/slack.js +105 -0
- package/dist/providers/chat/types.d.ts +42 -0
- package/dist/providers/chat/types.js +19 -0
- package/dist/providers/coding-proxy/dependency-cache/eviction.d.ts +29 -0
- package/dist/providers/coding-proxy/dependency-cache/eviction.js +87 -0
- package/dist/providers/coding-proxy/dependency-cache/key.d.ts +33 -0
- package/dist/providers/coding-proxy/dependency-cache/key.js +86 -0
- package/dist/providers/coding-proxy/dependency-cache/model-request-seal.d.ts +18 -0
- package/dist/providers/coding-proxy/dependency-cache/model-request-seal.js +40 -0
- package/dist/providers/coding-proxy/dependency-cache/prisma-store.d.ts +25 -0
- package/dist/providers/coding-proxy/dependency-cache/prisma-store.js +131 -0
- package/dist/providers/coding-proxy/dependency-cache/service.d.ts +70 -0
- package/dist/providers/coding-proxy/dependency-cache/service.js +409 -0
- package/dist/providers/coding-proxy/dependency-cache/store.d.ts +85 -0
- package/dist/providers/coding-proxy/dependency-cache/store.js +95 -0
- package/dist/providers/coding-proxy/hold.d.ts +32 -0
- package/dist/providers/coding-proxy/hold.js +86 -0
- package/dist/providers/coding-proxy/interrupted.d.ts +70 -0
- package/dist/providers/coding-proxy/interrupted.js +104 -0
- package/dist/providers/coding-proxy/memory-ledger.d.ts +15 -2
- package/dist/providers/coding-proxy/memory-ledger.js +84 -8
- package/dist/providers/coding-proxy/metering.d.ts +16 -0
- package/dist/providers/coding-proxy/metering.js +27 -4
- package/dist/providers/coding-proxy/prisma-ledger.d.ts +15 -2
- package/dist/providers/coding-proxy/prisma-ledger.js +179 -67
- package/dist/providers/coding-proxy/proxy.d.ts +14 -1
- package/dist/providers/coding-proxy/proxy.js +166 -14
- package/dist/providers/coding-proxy/registry/audit.d.ts +53 -10
- package/dist/providers/coding-proxy/registry/audit.js +94 -17
- package/dist/providers/coding-proxy/registry/lockfile-parse-worker.d.ts +36 -0
- package/dist/providers/coding-proxy/registry/lockfile-parse-worker.js +67 -0
- package/dist/providers/coding-proxy/registry/lockfile-parse.d.ts +16 -0
- package/dist/providers/coding-proxy/registry/lockfile-parse.js +110 -0
- package/dist/providers/coding-proxy/registry/plan.d.ts +9 -0
- package/dist/providers/coding-proxy/registry/plan.js +201 -48
- package/dist/providers/coding-proxy/registry/prisma-store.d.ts +11 -5
- package/dist/providers/coding-proxy/registry/prisma-store.js +120 -17
- package/dist/providers/coding-proxy/registry/service.d.ts +97 -16
- package/dist/providers/coding-proxy/registry/service.js +579 -112
- package/dist/providers/coding-proxy/registry/store.d.ts +84 -9
- package/dist/providers/coding-proxy/registry/store.js +54 -1
- package/dist/providers/coding-proxy/runtime.d.ts +4 -0
- package/dist/providers/coding-proxy/runtime.js +78 -16
- package/dist/providers/coding-proxy/server.d.ts +6 -1
- package/dist/providers/coding-proxy/server.js +45 -1
- package/dist/providers/coding-proxy/types.d.ts +65 -1
- package/dist/providers/datastore/types.d.ts +5 -0
- package/dist/providers/engine/types.d.ts +36 -2
- package/dist/providers/engine/types.js +39 -0
- package/dist/providers/executor/composition.d.ts +31 -1
- package/dist/providers/executor/composition.js +81 -8
- package/dist/providers/executor/container.d.ts +385 -9
- package/dist/providers/executor/container.js +1234 -99
- package/dist/providers/executor/dbos-status.d.ts +31 -0
- package/dist/providers/executor/dbos-status.js +64 -0
- package/dist/providers/executor/dbos.d.ts +91 -0
- package/dist/providers/executor/dbos.js +319 -26
- package/dist/providers/executor/deferred.d.ts +44 -0
- package/dist/providers/executor/deferred.js +100 -0
- package/dist/providers/executor/in-process.d.ts +9 -1
- package/dist/providers/executor/in-process.js +14 -4
- package/dist/providers/executor/linked-issue-reader.d.ts +16 -0
- package/dist/providers/executor/linked-issue-reader.js +30 -0
- package/dist/providers/executor/routing.d.ts +39 -10
- package/dist/providers/executor/routing.js +77 -32
- package/dist/providers/executor/types.d.ts +25 -0
- package/dist/providers/index.d.ts +2 -1
- package/dist/providers/issue-tracker/types.d.ts +17 -0
- package/dist/providers/issue-tracker/types.js +39 -1
- package/dist/providers/jobs/claude-tool-setup.d.ts +4 -0
- package/dist/providers/jobs/claude-tool-setup.js +5 -2
- package/dist/providers/jobs/docker-isolation.d.ts +8 -0
- package/dist/providers/jobs/docker-isolation.js +17 -0
- package/dist/providers/jobs/docker.d.ts +1 -0
- package/dist/providers/jobs/docker.js +29 -4
- package/dist/providers/jobs/fake-kubernetes-api.d.ts +23 -2
- package/dist/providers/jobs/fake-kubernetes-api.js +45 -1
- package/dist/providers/jobs/kubernetes-api.d.ts +25 -1
- package/dist/providers/jobs/kubernetes-api.js +17 -0
- package/dist/providers/jobs/kubernetes-client.d.ts +10 -1
- package/dist/providers/jobs/kubernetes-client.js +61 -3
- package/dist/providers/jobs/kubernetes-dry-run-fixture.d.ts +6 -1
- package/dist/providers/jobs/kubernetes-dry-run-fixture.js +6 -3
- package/dist/providers/jobs/kubernetes-isolation.d.ts +5 -1
- package/dist/providers/jobs/kubernetes-isolation.js +23 -1
- package/dist/providers/jobs/kubernetes-platform.d.ts +4 -1
- package/dist/providers/jobs/kubernetes-platform.js +38 -1
- package/dist/providers/jobs/kubernetes-preflight.d.ts +2 -1
- package/dist/providers/jobs/kubernetes-preflight.js +4 -2
- package/dist/providers/jobs/kubernetes.d.ts +42 -2
- package/dist/providers/jobs/kubernetes.js +178 -19
- package/dist/providers/jobs/metadata-probes.d.ts +11 -0
- package/dist/providers/jobs/metadata-probes.js +13 -0
- package/dist/providers/jobs/types.d.ts +42 -0
- package/dist/providers/jobs/types.js +13 -1
- package/dist/providers/llm/anthropic.js +5 -1
- package/dist/providers/llm/bedrock.d.ts +0 -12
- package/dist/providers/llm/bedrock.js +4 -0
- package/dist/providers/llm/claude-messages.d.ts +3 -1
- package/dist/providers/llm/claude-messages.js +4 -1
- package/dist/providers/llm/claude-provider.d.ts +2 -2
- package/dist/providers/llm/claude-provider.js +2 -2
- package/dist/providers/llm/openai.d.ts +2 -2
- package/dist/providers/llm/openai.js +6 -2
- package/dist/providers/llm/routing.d.ts +2 -2
- package/dist/providers/llm/routing.js +2 -2
- package/dist/providers/llm/types.d.ts +12 -2
- package/dist/providers/review-host/github-events.d.ts +9 -1
- package/dist/providers/review-host/github-events.js +34 -12
- package/dist/providers/review-host/github.d.ts +39 -2
- package/dist/providers/review-host/github.js +274 -29
- package/dist/providers/review-host/local.d.ts +8 -4
- package/dist/providers/review-host/local.js +49 -31
- package/dist/providers/review-host/patch-pages.d.ts +41 -0
- package/dist/providers/review-host/patch-pages.js +176 -0
- package/dist/providers/review-host/review-format.d.ts +19 -1
- package/dist/providers/review-host/review-format.js +38 -7
- package/dist/providers/review-host/types.d.ts +157 -2
- package/dist/providers/review-host/types.js +8 -0
- package/dist/providers/storage/gcs.d.ts +63 -0
- package/dist/providers/storage/gcs.js +69 -0
- package/dist/providers/storage/index.d.ts +15 -0
- package/dist/providers/storage/index.js +14 -0
- package/dist/providers/storage/local.d.ts +24 -0
- package/dist/providers/storage/local.js +92 -0
- package/dist/providers/storage/meter.d.ts +14 -0
- package/dist/providers/storage/meter.js +34 -0
- package/dist/providers/storage/s3.d.ts +41 -0
- package/dist/providers/storage/s3.js +107 -0
- package/dist/providers/storage/types.d.ts +37 -3
- package/dist/providers/storage/types.js +21 -4
- package/dist/providers/vcs/git.d.ts +33 -2
- package/dist/providers/vcs/git.js +324 -22
- package/dist/providers/vcs/github-remote.d.ts +26 -3
- package/dist/providers/vcs/github-remote.js +124 -14
- package/dist/providers/vcs/github.d.ts +246 -12
- package/dist/providers/vcs/github.js +521 -61
- package/dist/providers/vcs/index.js +8 -1
- package/dist/providers/vcs/pr-description.d.ts +127 -0
- package/dist/providers/vcs/pr-description.js +270 -0
- package/dist/providers/vcs/remote.d.ts +33 -1
- package/dist/providers/vcs/routing.d.ts +4 -2
- package/dist/providers/vcs/routing.js +6 -0
- package/dist/providers/vcs/types.d.ts +80 -3
- package/dist/quickstart/coding-seed.d.ts +21 -3
- package/dist/quickstart/coding-seed.js +283 -3
- package/dist/quickstart/images.d.ts +2 -0
- package/dist/quickstart/images.js +7 -1
- package/dist/quickstart/reviewer-prompt.d.ts +1 -1
- package/dist/quickstart/reviewer-prompt.js +6 -6
- package/dist/quickstart-images.json +1 -1
- package/dist/sandbox/brokered-fetch.d.ts +23 -0
- package/dist/sandbox/brokered-fetch.js +37 -0
- package/dist/sandbox/generated/zod.bundle.js +62 -1
- package/dist/sandbox/generated/zod3.bundle.js +5 -0
- package/dist/sandbox/host-functions.d.ts +35 -0
- package/dist/sandbox/host-functions.js +150 -91
- package/dist/sandbox/prelude.js +7 -1
- package/dist/sandbox/run-in-sandbox.d.ts +19 -0
- package/dist/sandbox/run-in-sandbox.js +28 -10
- package/dist/sandbox/safe-fetch.d.ts +2 -0
- package/dist/sandbox/safe-fetch.js +3 -1
- package/dist/sandbox/secret-broker-sigv4.d.ts +2 -0
- package/dist/sandbox/secret-broker-sigv4.js +49 -0
- package/dist/sandbox/secret-broker.d.ts +34 -0
- package/dist/sandbox/secret-broker.js +161 -0
- package/dist/sandbox/tool-capabilities.d.ts +10 -30
- package/dist/sandbox/user-tool.d.ts +14 -0
- package/dist/sandbox/user-tool.js +32 -0
- package/dist/sandbox/zod-params.d.ts +37 -5
- package/dist/sandbox/zod-params.js +181 -26
- package/dist/serve.js +25 -0
- package/dist/viewer/api-schema.d.ts +372 -2454
- package/dist/viewer/api-schema.js +29 -0
- package/dist/viewer/build-schemas.js +10 -3
- package/dist/viewer/event-bus.d.ts +6 -0
- package/dist/viewer/event-bus.js +16 -7
- package/dist/viewer/graph.d.ts +5 -2
- package/dist/viewer/graph.js +7 -2
- package/dist/viewer/http.d.ts +0 -1
- package/dist/viewer/http.js +2 -2
- package/dist/viewer/infra.js +25 -2
- package/dist/viewer/limits.d.ts +4 -0
- package/dist/viewer/limits.js +4 -0
- package/dist/viewer/openapi.d.ts +15 -0
- package/dist/viewer/openapi.js +170 -0
- package/dist/wardby-bin.js +10 -0
- package/docs/README.md +7 -0
- package/docs/agent-recipes.md +114 -27
- package/docs/architecture-runtime.md +16 -1
- package/docs/code-review-agents.md +689 -45
- package/docs/coding-agent-setup.md +602 -12
- package/docs/coding-packages.md +1037 -92
- package/docs/coding-services.md +30 -13
- package/docs/coding-worker-byo-images.md +218 -6
- package/docs/coding-worker-isolation.md +173 -44
- package/docs/getting-started-gke.md +332 -129
- package/docs/getting-started-identity-provider.md +31 -11
- package/docs/getting-started.md +14 -4
- package/docs/jira-agents.md +22 -9
- package/docs/knowledge/blob-not-found-semantics.md +41 -0
- package/docs/knowledge/bounded-file-descriptor.md +52 -0
- package/docs/knowledge/delegation-admission-slots.md +52 -0
- package/docs/knowledge/http-dispatcher-bootstrap.md +61 -0
- package/docs/knowledge/import-rename-target.md +52 -0
- package/docs/knowledge/index.md +57 -0
- package/docs/knowledge/log.md +9 -0
- package/docs/knowledge/mcp-cancelled-task-precedence.md +41 -0
- package/docs/knowledge/mcp-http-prompt-discovery.md +41 -0
- package/docs/knowledge/mcp-schema-module-boundary.md +41 -0
- package/docs/knowledge/nullable-tool-uniqueness.md +52 -0
- package/docs/knowledge/overview-cli.md +74 -0
- package/docs/knowledge/overview-coding-proxy.md +72 -0
- package/docs/knowledge/overview-coding.md +72 -0
- package/docs/knowledge/overview-config.md +60 -0
- package/docs/knowledge/overview-core.md +72 -0
- package/docs/knowledge/overview-deploy.md +83 -0
- package/docs/knowledge/overview-mcp.md +61 -0
- package/docs/knowledge/overview-prisma.md +72 -0
- package/docs/knowledge/overview-providers.md +89 -0
- package/docs/knowledge/overview-sandbox.md +83 -0
- package/docs/knowledge/overview-surfaces.md +83 -0
- package/docs/knowledge/private-datastore-shared-boundary.md +54 -0
- package/docs/knowledge/proxy-settlement-projections.md +41 -0
- package/docs/knowledge/run-pricing-first-writer.md +43 -0
- package/docs/knowledge/schedule-claim-transaction.md +41 -0
- package/docs/knowledge/secret-entry-replica-contract.md +52 -0
- package/docs/knowledge/terminal-run-first-writer.md +41 -0
- package/docs/knowledge/transactional-agent-authorization.md +52 -0
- package/docs/knowledge/viewer-notify-write-isolation.md +30 -0
- package/docs/knowledge/warm-input-publication.md +30 -0
- package/docs/knowledge/workspace-staging-failure.md +54 -0
- package/docs/knowledge.md +54 -14
- package/docs/native-sandbox.md +731 -0
- package/docs/observability.md +4 -0
- package/docs/release-verification.md +9 -0
- package/docs/security-deployment.md +146 -14
- package/docs/slack-notifications.md +268 -0
- package/docs/tool-secrets.md +284 -0
- package/docs/viewer-api.md +46 -5
- package/docs/viewer-api.openapi.yml +1404 -0
- package/help/admin-viewer.md +29 -3
- package/help/agent-recipes.md +27 -0
- package/help/architecture-agent.md +11 -6
- package/help/brokered-secrets.md +79 -0
- package/help/build-claude-code-image.md +131 -0
- package/help/build-worker-image.md +6 -7
- package/help/builder-agent.md +19 -6
- package/help/code-review-agents.md +243 -10
- package/help/coding-packages.md +156 -6
- package/help/cost-attribution.md +9 -5
- package/help/creating-agents.md +14 -1
- package/help/dependency-cache.md +143 -0
- package/help/deploy-gke.md +23 -9
- package/help/deployment-targets.md +25 -14
- package/help/errors/budget-exhausted.md +187 -0
- package/help/errors/budget-group-exhausted.md +5 -1
- package/help/errors/coding-provider-not-configured.md +2 -2
- package/help/errors/coding-stream-quota-exceeded.md +33 -0
- package/help/errors/coding-workspace-disk-exceeds-limit.md +39 -0
- package/help/errors/continuation-closed.md +9 -12
- package/help/errors/database-auth-invalid.md +28 -0
- package/help/errors/delegation-conflict.md +24 -0
- package/help/errors/file-list-truncated.md +45 -0
- package/help/errors/full-read-required.md +49 -0
- package/help/errors/github-account-not-allowed.md +29 -0
- package/help/errors/graph-incomplete.md +43 -0
- package/help/errors/graph-limit.md +43 -0
- package/help/errors/low-power-disabled.md +29 -0
- package/help/errors/low-power-scale-forbidden.md +35 -0
- package/help/errors/low-power-wake-timeout.md +30 -0
- package/help/errors/merge-conflict.md +49 -0
- package/help/errors/mobile-disabled.md +31 -0
- package/help/errors/native-sandbox-capacity.md +22 -0
- package/help/errors/native-sandbox-deadline-exceeded.md +19 -0
- package/help/errors/native-sandbox-docker-failed.md +20 -0
- package/help/errors/native-sandbox-gateway-error.md +20 -0
- package/help/errors/native-sandbox-gateway-unavailable.md +21 -0
- package/help/errors/native-sandbox-image-not-pinned.md +19 -0
- package/help/errors/native-sandbox-isolation-mismatch.md +20 -0
- package/help/errors/native-sandbox-launch-abandoned.md +21 -0
- package/help/errors/native-sandbox-network-unenforced.md +22 -0
- package/help/errors/native-sandbox-requires-catalog.md +31 -0
- package/help/errors/native-sandbox-unavailable.md +19 -0
- package/help/errors/native-sandbox-warm-delivery-failed.md +21 -0
- package/help/errors/native-sandbox-worker-exited.md +21 -0
- package/help/errors/native-sandbox-worker-lost.md +20 -0
- package/help/errors/native-sandbox-worker-unready.md +22 -0
- package/help/errors/package-not-allowed-pending.md +52 -0
- package/help/errors/package-not-allowed.md +51 -0
- package/help/errors/package-refusals.md +43 -0
- package/help/errors/patch-cursor-malformed.md +31 -0
- package/help/errors/run-lost.md +39 -0
- package/help/errors/run-transcript-download.md +44 -0
- package/help/errors/secret-broker-body-invalid.md +26 -0
- package/help/errors/secret-broker-changed.md +20 -0
- package/help/errors/secret-broker-config-invalid.md +30 -0
- package/help/errors/secret-broker-conflict.md +27 -0
- package/help/errors/secret-broker-destination-denied.md +28 -0
- package/help/errors/secret-broker-value-invalid.md +28 -0
- package/help/errors/secret-brokered.md +24 -0
- package/help/errors/secret-in-value.md +69 -0
- package/help/errors/secret-not-brokered.md +25 -0
- package/help/errors/slack-auth-failed.md +48 -0
- package/help/errors/slack-channel-unreachable.md +39 -0
- package/help/errors/slack-not-configured.md +33 -0
- package/help/errors/target-merge.md +40 -0
- package/help/fix-merge-conflicts.md +73 -0
- package/help/getting-started.md +4 -5
- package/help/github-app-setup.md +132 -0
- package/help/github.md +40 -1
- package/help/identity-and-access.md +7 -1
- package/help/jira.md +23 -6
- package/help/knowledge.md +16 -7
- package/help/local-repositories.md +3 -4
- package/help/low-power-mode.md +131 -0
- package/help/merge-order-check.md +122 -0
- package/help/mobile-app.md +54 -0
- package/help/native-capabilities.md +29 -1
- package/help/native-sandbox.md +150 -0
- package/help/observability.md +8 -0
- package/help/operating-agents.md +5 -0
- package/help/package-audit-mode.md +91 -0
- package/help/related-pull-requests.md +80 -16
- package/help/repo-instructions-and-skills.md +91 -0
- package/help/resume-runs-locally.md +131 -0
- package/help/review-fix-rounds.md +43 -1
- package/help/sharing-agents.md +59 -0
- package/help/slack-notifications.md +76 -0
- package/help/status-comments.md +31 -0
- package/help/stop-run.md +58 -0
- package/help/troubleshooting/budgets.md +28 -0
- package/help/troubleshooting/coding-workers.md +99 -7
- package/package.json +27 -13
- package/prisma/migrations/20261009000003_native_execution_mode/migration.sql +12 -0
- package/prisma/migrations/20261009000004_native_gateway_ledger/migration.sql +65 -0
- package/prisma/migrations/20261009000005_native_gateway_call_child_agent/migration.sql +5 -0
- package/prisma/migrations/20261009000006_run_deferred_start_stop/migration.sql +14 -0
- package/prisma/migrations/20261009000007_native_gateway_network_ready/migration.sql +5 -0
- package/prisma/migrations/20261010000001_workflow_notifications/migration.sql +99 -0
- package/prisma/migrations/20261011000001_native_gateway_session_status_index/migration.sql +2 -0
- package/prisma/migrations/20261012000001_native_warm_worker/migration.sql +32 -0
- package/prisma/migrations/20261013000001_coding_run_merge_order/migration.sql +2 -0
- package/prisma/migrations/20261013000001_secret_broker/migration.sql +17 -0
- package/prisma/migrations/20261013000002_deferred_review_request/migration.sql +4 -0
- package/prisma/migrations/20261014000000_repo_skills/migration.sql +15 -0
- package/prisma/migrations/20261015000001_coding_run_merge_order_index/migration.sql +2 -0
- package/prisma/migrations/20261015000002_no_change_rereview/migration.sql +2 -0
- package/prisma/migrations/20261016000000_registry_approved_accepted_advisories/migration.sql +3 -0
- package/prisma/migrations/20261016000001_mark_ready_when_passing/migration.sql +3 -0
- package/prisma/migrations/20261017000000_debug_trace_max_mb/migration.sql +4 -0
- package/prisma/migrations/20261018000000_dependency_cache/migration.sql +53 -0
- package/prisma/migrations/20261019000000_claude_max_output_tokens/migration.sql +5 -0
- package/prisma/migrations/20261021000000_pr_description_hash/migration.sql +4 -0
- package/prisma/migrations/20261022000000_dependency_snapshot_validation_metadata/migration.sql +4 -0
- package/prisma/migrations/20261023000000_package_audit_mode/migration.sql +27 -0
- package/prisma/migrations/20261024000000_budget_events/migration.sql +26 -0
- package/prisma/migrations/20261025000000_cache_aware_holds/migration.sql +9 -0
- package/prisma/migrations/20261026000000_budget_overrun/migration.sql +4 -0
- package/prisma/migrations/20261027000000_coding_run_request/migration.sql +1 -0
- package/prisma/migrations/20261028000000_native_gateway_review_reads/migration.sql +6 -0
- package/prisma/migrations/20261029000000_lead_survives_deploy/migration.sql +6 -0
- package/prisma/migrations/20261030000000_local_review_covered_sha/migration.sql +2 -0
- package/prisma/migrations/20261031000000_coding_run_budget_limit/migration.sql +9 -0
- package/prisma/migrations/20261101000000_run_transcripts/migration.sql +22 -0
- package/prisma/schema.prisma +631 -146
- package/dist/sandbox/generated/zod-to-json-schema.bundle.js +0 -5
|
@@ -7,12 +7,13 @@
|
|
|
7
7
|
* exhaustion, or non-serializable return all fail *that call* cleanly
|
|
8
8
|
* instead of crashing the run or the host process.
|
|
9
9
|
*/
|
|
10
|
-
import {
|
|
10
|
+
import { createPrivilegedHost, installSandboxApi } from "./host-functions.js";
|
|
11
11
|
import { SANDBOX_PRELUDE } from "./prelude.js";
|
|
12
12
|
import { evalToJson, NON_SERIALIZABLE_MARKER } from "./eval-core.js";
|
|
13
13
|
import { boundedJson, boundedString } from "./bounded-json.js";
|
|
14
14
|
import { BRIDGE_INPUT_BYTES } from "./limits.js";
|
|
15
|
-
|
|
15
|
+
/** Evaluates one tool body in a fresh QuickJS context against the given privileged host. */
|
|
16
|
+
export async function runToolCode(invocation) {
|
|
16
17
|
let params;
|
|
17
18
|
try {
|
|
18
19
|
boundedString(invocation.code, BRIDGE_INPUT_BYTES);
|
|
@@ -39,15 +40,32 @@ export async function runInSandbox(invocation) {
|
|
|
39
40
|
}
|
|
40
41
|
})()`;
|
|
41
42
|
return evalToJson(code, invocation.limits, (context, runtime, signal) => {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
datastore: invocation.datastore,
|
|
45
|
-
sharedDatastore: invocation.sharedDatastore,
|
|
46
|
-
logTag: invocation.toolName,
|
|
47
|
-
secrets: invocation.secrets,
|
|
48
|
-
logger: invocation.logger,
|
|
49
|
-
allowedFetchHosts: invocation.allowedFetchHosts,
|
|
43
|
+
installSandboxApi(context, runtime, {
|
|
44
|
+
privileged: invocation.privileged(signal),
|
|
50
45
|
signal,
|
|
46
|
+
parserPool: invocation.parserPool,
|
|
51
47
|
});
|
|
52
48
|
});
|
|
53
49
|
}
|
|
50
|
+
/** The in-process privileged host for a sandbox invocation. */
|
|
51
|
+
export function privilegedHostFor(invocation, signal) {
|
|
52
|
+
return createPrivilegedHost({
|
|
53
|
+
agentId: invocation.agentId,
|
|
54
|
+
datastore: invocation.datastore,
|
|
55
|
+
sharedDatastore: invocation.sharedDatastore,
|
|
56
|
+
logTag: invocation.toolName,
|
|
57
|
+
secrets: invocation.secrets,
|
|
58
|
+
logger: invocation.logger,
|
|
59
|
+
allowedFetchHosts: invocation.allowedFetchHosts,
|
|
60
|
+
fetchImpl: invocation.fetchImpl,
|
|
61
|
+
signal,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
export async function runInSandbox(invocation) {
|
|
65
|
+
return runToolCode({
|
|
66
|
+
code: invocation.code,
|
|
67
|
+
params: invocation.params,
|
|
68
|
+
limits: invocation.limits,
|
|
69
|
+
privileged: (signal) => privilegedHostFor(invocation, signal),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
@@ -12,6 +12,8 @@ export declare function requestPinned(destination: Destination, init: SafeFetchI
|
|
|
12
12
|
export interface SafeFetchOptions extends FetchPolicyOptions {
|
|
13
13
|
signal?: AbortSignal;
|
|
14
14
|
connect?: typeof requestPinned;
|
|
15
|
+
/** False: a 3xx is returned to the caller as-is (brokered requests re-check every hop themselves). */
|
|
16
|
+
followRedirects?: boolean;
|
|
15
17
|
}
|
|
16
18
|
export declare function safeFetch(input: string, init?: SafeFetchInit, options?: SafeFetchOptions): Promise<{
|
|
17
19
|
ok: boolean;
|
|
@@ -60,7 +60,9 @@ export async function safeFetch(input, init = {}, options = {}) {
|
|
|
60
60
|
signal.throwIfAborted();
|
|
61
61
|
response = await (options.connect ?? requestPinned)(destination, { method, headers, body }, signal);
|
|
62
62
|
const status = response.statusCode ?? 0;
|
|
63
|
-
if (
|
|
63
|
+
if (options.followRedirects !== false &&
|
|
64
|
+
[301, 302, 303, 307, 308].includes(status) &&
|
|
65
|
+
response.headers.location) {
|
|
64
66
|
response.destroy();
|
|
65
67
|
if (hop >= MAX_REDIRECTS)
|
|
66
68
|
throw new Error("fetch_redirect_limit");
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/** AWS SigV4 for a brokered secret, using AWS's own signer. The tool never sees the keys. */
|
|
2
|
+
import { SignatureV4 } from "@smithy/signature-v4";
|
|
3
|
+
import { Sha256 } from "@aws-crypto/sha256-js";
|
|
4
|
+
import { parseSigV4Value } from "../core/secret-broker-config.js";
|
|
5
|
+
const SIGNER_HEADERS = ["authorization", "x-amz-date", "x-amz-security-token", "x-amz-content-sha256"];
|
|
6
|
+
/** Group query params by key so repeated keys survive (Object.fromEntries would drop them). */
|
|
7
|
+
function queryOf(url) {
|
|
8
|
+
const query = {};
|
|
9
|
+
for (const key of new Set(url.searchParams.keys())) {
|
|
10
|
+
const all = url.searchParams.getAll(key);
|
|
11
|
+
query[key] = all.length === 1 ? all[0] : all;
|
|
12
|
+
}
|
|
13
|
+
return query;
|
|
14
|
+
}
|
|
15
|
+
export async function signSigV4(request, secret, now = new Date()) {
|
|
16
|
+
if (secret.broker.placement.kind !== "aws-sigv4") {
|
|
17
|
+
throw new Error("signSigV4 needs an aws-sigv4 secret");
|
|
18
|
+
}
|
|
19
|
+
const headers = Object.fromEntries(Object.entries(request.headers).map(([k, v]) => [k.toLowerCase(), v]));
|
|
20
|
+
for (const h of SIGNER_HEADERS) {
|
|
21
|
+
if (h in headers) {
|
|
22
|
+
throw new Error(`secret_broker_conflict: header "${h}" is set by the SigV4 signer for "${secret.name}"`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// safeFetch replaces accept-encoding after signing; a signed one would no longer match.
|
|
26
|
+
delete headers["accept-encoding"];
|
|
27
|
+
const { region, service } = secret.broker.placement;
|
|
28
|
+
const signer = new SignatureV4({
|
|
29
|
+
credentials: parseSigV4Value(secret.value),
|
|
30
|
+
region,
|
|
31
|
+
service,
|
|
32
|
+
sha256: Sha256,
|
|
33
|
+
applyChecksum: service === "s3",
|
|
34
|
+
uriEscapePath: service !== "s3",
|
|
35
|
+
});
|
|
36
|
+
const url = new URL(request.url);
|
|
37
|
+
const signed = await signer.sign({
|
|
38
|
+
method: request.method,
|
|
39
|
+
protocol: url.protocol,
|
|
40
|
+
hostname: url.hostname,
|
|
41
|
+
path: url.pathname,
|
|
42
|
+
query: queryOf(url),
|
|
43
|
+
headers: { ...headers, host: url.host },
|
|
44
|
+
body: request.body,
|
|
45
|
+
}, { signingDate: now });
|
|
46
|
+
const out = Object.fromEntries(Object.entries(signed.headers).map(([k, v]) => [k.toLowerCase(), String(v)]));
|
|
47
|
+
delete out.host; // safeFetch forbids setting Host; Node sets the same value from the URL.
|
|
48
|
+
return { ...request, headers: out };
|
|
49
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brokered secrets at request time: check the destination, place each value where its
|
|
3
|
+
* owner said, and scrub values from the response. Pure — the privileged host
|
|
4
|
+
* (host-functions.ts) does the I/O. SigV4 signing is in secret-broker-sigv4.ts.
|
|
5
|
+
*/
|
|
6
|
+
import { type SecretBrokerConfig } from "../core/secret-broker-config.js";
|
|
7
|
+
export interface BrokeredSecret {
|
|
8
|
+
name: string;
|
|
9
|
+
value: string;
|
|
10
|
+
broker: SecretBrokerConfig;
|
|
11
|
+
}
|
|
12
|
+
export interface BrokerRequest {
|
|
13
|
+
url: string;
|
|
14
|
+
method: string;
|
|
15
|
+
headers: Record<string, string>;
|
|
16
|
+
body?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function checkBrokerDestination(url: string, secrets: readonly BrokeredSecret[]): void;
|
|
19
|
+
export declare function applyBrokerPlacements(request: BrokerRequest, secrets: readonly BrokeredSecret[]): BrokerRequest;
|
|
20
|
+
export declare function brokerScrubValues(secrets: readonly BrokeredSecret[]): string[];
|
|
21
|
+
/**
|
|
22
|
+
* The strings console output must not show for one secret the tool may use: its value and, for a
|
|
23
|
+
* brokered SigV4 secret, the secret key and session token alone. A value that won't parse adds nothing.
|
|
24
|
+
*/
|
|
25
|
+
export declare function consoleRedactionValues(entry: {
|
|
26
|
+
value: string;
|
|
27
|
+
broker: SecretBrokerConfig | null;
|
|
28
|
+
}): string[];
|
|
29
|
+
export declare function scrubBrokeredResponse<T extends {
|
|
30
|
+
headers: Record<string, string>;
|
|
31
|
+
bodyBase64: string;
|
|
32
|
+
url: string;
|
|
33
|
+
statusText?: string;
|
|
34
|
+
}>(response: T, values: readonly string[]): T;
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brokered secrets at request time: check the destination, place each value where its
|
|
3
|
+
* owner said, and scrub values from the response. Pure — the privileged host
|
|
4
|
+
* (host-functions.ts) does the I/O. SigV4 signing is in secret-broker-sigv4.ts.
|
|
5
|
+
*/
|
|
6
|
+
import { parseSigV4Value } from "../core/secret-broker-config.js";
|
|
7
|
+
import { redactExactSecretValues } from "../core/secret-spans.js";
|
|
8
|
+
const REDACTED = "[REDACTED]";
|
|
9
|
+
function deny(reason) {
|
|
10
|
+
throw new Error(`secret_broker_destination_denied: ${reason}`);
|
|
11
|
+
}
|
|
12
|
+
function conflict(reason) {
|
|
13
|
+
throw new Error(`secret_broker_conflict: ${reason}`);
|
|
14
|
+
}
|
|
15
|
+
export function checkBrokerDestination(url, secrets) {
|
|
16
|
+
let parsed;
|
|
17
|
+
try {
|
|
18
|
+
parsed = new URL(url);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
deny("invalid URL");
|
|
22
|
+
}
|
|
23
|
+
if (parsed.protocol !== "https:")
|
|
24
|
+
deny("brokered secrets are only sent over https");
|
|
25
|
+
if (parsed.port !== "")
|
|
26
|
+
deny("brokered secrets are only sent to the default https port");
|
|
27
|
+
const host = parsed.hostname.toLowerCase();
|
|
28
|
+
for (const s of secrets) {
|
|
29
|
+
if (!s.broker.hosts.includes(host))
|
|
30
|
+
deny(`"${s.name}" may not be sent to ${host}`);
|
|
31
|
+
const prefixes = s.broker.pathPrefixes ?? [];
|
|
32
|
+
if (prefixes.length && !prefixes.some((p) => parsed.pathname.startsWith(p))) {
|
|
33
|
+
deny(`"${s.name}" may not be sent to path ${parsed.pathname}`);
|
|
34
|
+
}
|
|
35
|
+
// An encoded slash or backslash may be decoded upstream into a separator, escaping the prefix.
|
|
36
|
+
if (prefixes.length && /%2f|%5c/i.test(parsed.pathname)) {
|
|
37
|
+
deny(`"${s.name}" may not be sent to a path with an encoded separator`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function contentType(headers) {
|
|
42
|
+
return (headers["content-type"] ?? "").split(";")[0].trim().toLowerCase();
|
|
43
|
+
}
|
|
44
|
+
export function applyBrokerPlacements(request, secrets) {
|
|
45
|
+
const headers = Object.fromEntries(Object.entries(request.headers).map(([k, v]) => [k.toLowerCase(), v]));
|
|
46
|
+
const url = new URL(request.url);
|
|
47
|
+
let body = request.body;
|
|
48
|
+
const placed = new Set();
|
|
49
|
+
for (const s of secrets) {
|
|
50
|
+
const p = s.broker.placement;
|
|
51
|
+
if (p.kind === "header") {
|
|
52
|
+
const key = p.name.toLowerCase();
|
|
53
|
+
if (key in headers || placed.has(`h:${key}`))
|
|
54
|
+
conflict(`header "${p.name}" is set by the broker for "${s.name}"`);
|
|
55
|
+
// A replacer function, not a string: "$$", "$&", "$'" in a value are literal, not patterns.
|
|
56
|
+
headers[key] = p.format.replace("{value}", () => s.value);
|
|
57
|
+
placed.add(`h:${key}`);
|
|
58
|
+
}
|
|
59
|
+
else if (p.kind === "query") {
|
|
60
|
+
if (url.searchParams.has(p.name) || placed.has(`q:${p.name}`))
|
|
61
|
+
conflict(`query parameter "${p.name}" is set by the broker for "${s.name}"`);
|
|
62
|
+
url.searchParams.append(p.name, s.value);
|
|
63
|
+
placed.add(`q:${p.name}`);
|
|
64
|
+
}
|
|
65
|
+
else if (p.kind === "body") {
|
|
66
|
+
if (placed.has(`b:${p.field}`))
|
|
67
|
+
conflict(`body field "${p.field}" is set by the broker for "${s.name}"`);
|
|
68
|
+
body = placeBodyField(headers, body, p.field, s);
|
|
69
|
+
placed.add(`b:${p.field}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return { ...request, url: url.href, headers, body };
|
|
73
|
+
}
|
|
74
|
+
function placeBodyField(headers, body, field, s) {
|
|
75
|
+
const type = contentType(headers);
|
|
76
|
+
if (body === undefined)
|
|
77
|
+
throw new Error(`secret_broker_body_invalid: "${s.name}" is placed in the body, but the request has none`);
|
|
78
|
+
if (type === "application/json" || type.endsWith("+json")) {
|
|
79
|
+
let json;
|
|
80
|
+
try {
|
|
81
|
+
json = JSON.parse(body);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
throw new Error("secret_broker_body_invalid: the body is not valid JSON");
|
|
85
|
+
}
|
|
86
|
+
if (json === null || typeof json !== "object" || Array.isArray(json)) {
|
|
87
|
+
throw new Error("secret_broker_body_invalid: a brokered JSON body must be an object");
|
|
88
|
+
}
|
|
89
|
+
if (Object.hasOwn(json, field))
|
|
90
|
+
conflict(`body field "${field}" is set by the broker for "${s.name}"`);
|
|
91
|
+
return JSON.stringify({ ...json, [field]: s.value });
|
|
92
|
+
}
|
|
93
|
+
if (type === "application/x-www-form-urlencoded") {
|
|
94
|
+
const form = new URLSearchParams(body);
|
|
95
|
+
if (form.has(field))
|
|
96
|
+
conflict(`body field "${field}" is set by the broker for "${s.name}"`);
|
|
97
|
+
form.append(field, s.value);
|
|
98
|
+
return form.toString();
|
|
99
|
+
}
|
|
100
|
+
throw new Error("secret_broker_body_invalid: body placement needs a JSON-object or form-encoded body");
|
|
101
|
+
}
|
|
102
|
+
export function brokerScrubValues(secrets) {
|
|
103
|
+
return secrets.flatMap((s) => {
|
|
104
|
+
if (s.broker.placement.kind !== "aws-sigv4")
|
|
105
|
+
return [s.value];
|
|
106
|
+
const creds = parseSigV4Value(s.value);
|
|
107
|
+
return [creds.secretAccessKey, ...(creds.sessionToken ? [creds.sessionToken] : [])];
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The strings console output must not show for one secret the tool may use: its value and, for a
|
|
112
|
+
* brokered SigV4 secret, the secret key and session token alone. A value that won't parse adds nothing.
|
|
113
|
+
*/
|
|
114
|
+
export function consoleRedactionValues(entry) {
|
|
115
|
+
if (!entry.broker)
|
|
116
|
+
return [entry.value];
|
|
117
|
+
try {
|
|
118
|
+
return [entry.value, ...brokerScrubValues([{ name: "", value: entry.value, broker: entry.broker }])].filter((v, i, all) => all.indexOf(v) === i);
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return [entry.value];
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function encodedForms(value) {
|
|
125
|
+
const buf = Buffer.from(value, "utf8");
|
|
126
|
+
// Query placement goes through URLSearchParams, which encodes ~ ! ' ( ) differently and space as "+",
|
|
127
|
+
// so both percent-encodings are scrubbed, each also in lowercase-hex form (a response may echo either).
|
|
128
|
+
const percent = [encodeURIComponent(value), new URLSearchParams({ k: value }).toString().slice("k=".length)];
|
|
129
|
+
const lowerHex = percent.map((f) => f.replace(/%[0-9A-F]{2}/g, (m) => m.toLowerCase()));
|
|
130
|
+
return [
|
|
131
|
+
...new Set([
|
|
132
|
+
value,
|
|
133
|
+
buf.toString("base64"),
|
|
134
|
+
buf.toString("base64").replace(/=+$/, ""),
|
|
135
|
+
buf.toString("base64url"),
|
|
136
|
+
...percent,
|
|
137
|
+
...lowerHex,
|
|
138
|
+
]),
|
|
139
|
+
]
|
|
140
|
+
.filter((form) => form.length >= 6)
|
|
141
|
+
.sort((a, b) => b.length - a.length);
|
|
142
|
+
}
|
|
143
|
+
/** The shared span-union redactor, with this site's marker (every form is already six or more characters). */
|
|
144
|
+
function scrubText(text, forms) {
|
|
145
|
+
return redactExactSecretValues(text, forms, { marker: REDACTED });
|
|
146
|
+
}
|
|
147
|
+
export function scrubBrokeredResponse(response, values) {
|
|
148
|
+
// Longest first across every value: a value that prefixes another must not split the longer one.
|
|
149
|
+
const forms = [...new Set(values.flatMap(encodedForms))].sort((a, b) => b.length - a.length);
|
|
150
|
+
const body = Buffer.from(response.bodyBase64, "base64").toString("latin1");
|
|
151
|
+
// latin1 is byte-preserving, so scrubbing never corrupts non-UTF-8 bodies; every encoded form is ASCII,
|
|
152
|
+
// and a UTF-8 plaintext's bytes appear verbatim in latin1 as the latin1 decode of its UTF-8 bytes.
|
|
153
|
+
const latinForms = forms.map((f) => Buffer.from(f, "utf8").toString("latin1"));
|
|
154
|
+
return {
|
|
155
|
+
...response,
|
|
156
|
+
url: scrubText(response.url, forms),
|
|
157
|
+
...(response.statusText === undefined ? {} : { statusText: scrubText(response.statusText, forms) }),
|
|
158
|
+
headers: Object.fromEntries(Object.entries(response.headers).map(([k, v]) => [k, scrubText(v, forms)])),
|
|
159
|
+
bodyBase64: Buffer.from(scrubText(body, latinForms), "latin1").toString("base64"),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
@@ -15,38 +15,18 @@ export declare const MAX_ALLOWED_SHARED_DATASTORES = 16;
|
|
|
15
15
|
export declare const FETCH_WILDCARD = "*";
|
|
16
16
|
/** Full capability set — used when creating a brand-new attachment (unset fields default to deny-all). */
|
|
17
17
|
export declare const ToolCapabilitiesSchema: z.ZodObject<{
|
|
18
|
-
allowedSecrets: z.ZodDefault<z.
|
|
19
|
-
allowedDatastorePrefixes: z.ZodDefault<z.
|
|
20
|
-
allowedHosts: z.ZodDefault<z.
|
|
21
|
-
allowedSharedDatastorePrefixes: z.ZodDefault<z.
|
|
22
|
-
},
|
|
23
|
-
allowedSecrets: string[];
|
|
24
|
-
allowedDatastorePrefixes: string[];
|
|
25
|
-
allowedHosts: string[];
|
|
26
|
-
allowedSharedDatastorePrefixes: Record<string, string[]>;
|
|
27
|
-
}, {
|
|
28
|
-
allowedSecrets?: string[] | undefined;
|
|
29
|
-
allowedDatastorePrefixes?: string[] | undefined;
|
|
30
|
-
allowedHosts?: string[] | undefined;
|
|
31
|
-
allowedSharedDatastorePrefixes?: Record<string, string[]> | undefined;
|
|
32
|
-
}>;
|
|
18
|
+
allowedSecrets: z.ZodDefault<z.ZodPipe<z.ZodArray<z.ZodString>, z.ZodTransform<string[], string[]>>>;
|
|
19
|
+
allowedDatastorePrefixes: z.ZodDefault<z.ZodPipe<z.ZodArray<z.ZodString>, z.ZodTransform<string[], string[]>>>;
|
|
20
|
+
allowedHosts: z.ZodDefault<z.ZodPipe<z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>, z.ZodTransform<string[], string[]>>>;
|
|
21
|
+
allowedSharedDatastorePrefixes: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
|
|
22
|
+
}, z.core.$strict>;
|
|
33
23
|
/** Partial capability set — used when re-declaring capabilities on an attachment that already exists; an omitted field leaves that field untouched. */
|
|
34
24
|
export declare const ToolCapabilitiesPatchSchema: z.ZodObject<{
|
|
35
|
-
allowedSecrets: z.ZodOptional<z.
|
|
36
|
-
allowedDatastorePrefixes: z.ZodOptional<z.
|
|
37
|
-
allowedHosts: z.ZodOptional<z.
|
|
38
|
-
allowedSharedDatastorePrefixes: z.ZodOptional<z.
|
|
39
|
-
},
|
|
40
|
-
allowedSecrets?: string[] | undefined;
|
|
41
|
-
allowedDatastorePrefixes?: string[] | undefined;
|
|
42
|
-
allowedHosts?: string[] | undefined;
|
|
43
|
-
allowedSharedDatastorePrefixes?: Record<string, string[]> | undefined;
|
|
44
|
-
}, {
|
|
45
|
-
allowedSecrets?: string[] | undefined;
|
|
46
|
-
allowedDatastorePrefixes?: string[] | undefined;
|
|
47
|
-
allowedHosts?: string[] | undefined;
|
|
48
|
-
allowedSharedDatastorePrefixes?: Record<string, string[]> | undefined;
|
|
49
|
-
}>;
|
|
25
|
+
allowedSecrets: z.ZodOptional<z.ZodPipe<z.ZodArray<z.ZodString>, z.ZodTransform<string[], string[]>>>;
|
|
26
|
+
allowedDatastorePrefixes: z.ZodOptional<z.ZodPipe<z.ZodArray<z.ZodString>, z.ZodTransform<string[], string[]>>>;
|
|
27
|
+
allowedHosts: z.ZodOptional<z.ZodPipe<z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>, z.ZodTransform<string[], string[]>>>;
|
|
28
|
+
allowedSharedDatastorePrefixes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
|
|
29
|
+
}, z.core.$strict>;
|
|
50
30
|
export type ToolCapabilities = z.infer<typeof ToolCapabilitiesSchema>;
|
|
51
31
|
export type ToolCapabilitiesPatch = z.infer<typeof ToolCapabilitiesPatchSchema>;
|
|
52
32
|
/**
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One user-tool call, end to end: parse the model's arguments, validate them
|
|
3
|
+
* against the tool's Zod schema (in its own sandbox), run the body, and format
|
|
4
|
+
* the result string fed back to the model. Never throws — every failure is a
|
|
5
|
+
* JSON error result. Worker-safe: it touches no database or provider, only the
|
|
6
|
+
* privileged host it is given, so the native sandbox worker runs it as is.
|
|
7
|
+
*/
|
|
8
|
+
import type { PrivilegedHost } from "./host-functions.js";
|
|
9
|
+
import type { SandboxLimits } from "./eval-core.js";
|
|
10
|
+
export interface UserToolDefinition {
|
|
11
|
+
code: string;
|
|
12
|
+
paramsZod: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function runUserToolCall(tool: UserToolDefinition, argsJson: string, privileged: (signal: AbortSignal) => PrivilegedHost, limits?: Partial<SandboxLimits>): Promise<string>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One user-tool call, end to end: parse the model's arguments, validate them
|
|
3
|
+
* against the tool's Zod schema (in its own sandbox), run the body, and format
|
|
4
|
+
* the result string fed back to the model. Never throws — every failure is a
|
|
5
|
+
* JSON error result. Worker-safe: it touches no database or provider, only the
|
|
6
|
+
* privileged host it is given, so the native sandbox worker runs it as is.
|
|
7
|
+
*/
|
|
8
|
+
import { runToolCode } from "./run-in-sandbox.js";
|
|
9
|
+
import { validateParams } from "./zod-params.js";
|
|
10
|
+
export async function runUserToolCall(tool, argsJson, privileged, limits) {
|
|
11
|
+
let parsedArgs;
|
|
12
|
+
try {
|
|
13
|
+
// Some providers stream no JSON delta at all for a zero-parameter
|
|
14
|
+
// tool call, yielding an empty argsJson rather than "{}".
|
|
15
|
+
parsedArgs = JSON.parse(argsJson || "{}");
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
return JSON.stringify({
|
|
19
|
+
error: "invalid_arguments_json",
|
|
20
|
+
message: err instanceof Error ? err.message : String(err),
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
const validation = await validateParams(tool.paramsZod, parsedArgs);
|
|
24
|
+
if (!validation.ok) {
|
|
25
|
+
return JSON.stringify({ error: "validation_failed", message: validation.errorMessage });
|
|
26
|
+
}
|
|
27
|
+
const result = await runToolCode({ code: tool.code, params: validation.value, limits, privileged });
|
|
28
|
+
if (!result.ok) {
|
|
29
|
+
return JSON.stringify({ error: result.errorKind, message: result.errorMessage });
|
|
30
|
+
}
|
|
31
|
+
return JSON.stringify(result.value);
|
|
32
|
+
}
|
|
@@ -5,18 +5,50 @@
|
|
|
5
5
|
* eval (pure computation, no host I/O — `installExtras` is a no-op):
|
|
6
6
|
*
|
|
7
7
|
* - `deriveJsonSchema`: registration-time. Compiles the schema and derives
|
|
8
|
-
* its JSON Schema
|
|
9
|
-
*
|
|
10
|
-
* not at call time.
|
|
8
|
+
* its JSON Schema — what's sent to the model as the tool's `parameters`.
|
|
9
|
+
* A malformed schema fails here, not at call time.
|
|
11
10
|
* - `validateParams`: call-time. Compiles the same schema (again, inside
|
|
12
11
|
* the sandbox) and parses the model-supplied arguments against it.
|
|
13
12
|
* Zod's own validation error (a real thrown `ZodError`, whose `.message`
|
|
14
13
|
* is already a readable issue list) becomes the sandbox failure the
|
|
15
14
|
* engine feeds back to the model as a tool-result error — not a run
|
|
16
15
|
* failure.
|
|
16
|
+
*
|
|
17
|
+
* Zod 3 compatibility window (this release only): wardby itself runs Zod 4,
|
|
18
|
+
* but a custom tool's paramsZod is still compiled with Zod 4's built-in Zod 3
|
|
19
|
+
* API (`zod/v3`) first, so a schema written for Zod 3 keeps working exactly as
|
|
20
|
+
* before, and its JSON Schema comes from zod-to-json-schema (the converter it
|
|
21
|
+
* was derived with before). Source Zod 3 can't compile (a schema written for
|
|
22
|
+
* Zod 4, such as one using `z.email()`) falls back to Zod 4, whose JSON Schema
|
|
23
|
+
* is `z.toJSONSchema` rewritten in zod-to-json-schema's spelling
|
|
24
|
+
* (core/zod-json-schema.ts). `zod4Compatibility` finds the schemas the next
|
|
25
|
+
* release, which compiles with Zod 4 only, would break; zod3-window.ts warns
|
|
26
|
+
* about them. To close the window: set PARAMS_ZOD_APIS to ["v4"], and drop the
|
|
27
|
+
* Zod 3 bundle (scripts/build-sandbox-vendor.mjs) and the window's warnings.
|
|
17
28
|
*/
|
|
18
29
|
import { type SandboxResult } from "./eval-core.js";
|
|
30
|
+
/** A Zod API a tool's paramsZod can compile against. */
|
|
31
|
+
export type ZodApi = "v3" | "v4";
|
|
32
|
+
/** The APIs a tool's paramsZod is compiled with, in order: the first that compiles it is used. */
|
|
33
|
+
export declare const PARAMS_ZOD_APIS: readonly ZodApi[];
|
|
19
34
|
/** Registration-time: compiles the schema source and derives its JSON Schema. */
|
|
20
|
-
export declare function deriveJsonSchema(paramsZodSource: string): Promise<SandboxResult>;
|
|
35
|
+
export declare function deriveJsonSchema(paramsZodSource: string, apis?: readonly ZodApi[]): Promise<SandboxResult>;
|
|
21
36
|
/** Call-time: compiles the schema source and validates the model-supplied args against it. */
|
|
22
|
-
export declare function validateParams(paramsZodSource: string, rawArgs: unknown): Promise<SandboxResult>;
|
|
37
|
+
export declare function validateParams(paramsZodSource: string, rawArgs: unknown, apis?: readonly ZodApi[]): Promise<SandboxResult>;
|
|
38
|
+
export type Zod4Compatibility = {
|
|
39
|
+
compatible: true;
|
|
40
|
+
}
|
|
41
|
+
/** `removed` lists the removed Zod 3 API it uses (fixed labels); empty when it fails some other way. */
|
|
42
|
+
| {
|
|
43
|
+
compatible: false;
|
|
44
|
+
removed: string[];
|
|
45
|
+
}
|
|
46
|
+
/** The probe hit a sandbox limit, or the source compiles under neither API: nothing to report. */
|
|
47
|
+
| {
|
|
48
|
+
compatible: "unknown";
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Whether the source compiles with Zod 4 alone, as it must from the next
|
|
52
|
+
* release on. Only meaningful for source the current release accepts.
|
|
53
|
+
*/
|
|
54
|
+
export declare function zod4Compatibility(paramsZodSource: string): Promise<Zod4Compatibility>;
|