@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
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Launches, watches, stops, and removes native sandbox workers on the local
|
|
3
|
+
* Docker engine (docs/native-sandbox.md), from the isolation plan in
|
|
4
|
+
* docker-isolation.ts. Every operation is idempotent and keyed by the run id,
|
|
5
|
+
* so the executor can retry, a second launch attaches instead of starting
|
|
6
|
+
* twice, and a restarted server re-finds a running worker by name.
|
|
7
|
+
*/
|
|
8
|
+
import { spawn } from "node:child_process";
|
|
9
|
+
import { createHash } from "node:crypto";
|
|
10
|
+
import { logger } from "../core/logger.js";
|
|
11
|
+
import { maskSpans, mergeSpans, secretSpans, withEscapedForms } from "../core/secret-spans.js";
|
|
12
|
+
import { buildGatewayConnectArgs, buildGatewayDisconnectArgs, buildNativeNetworkCreateArgs, buildNativeWarmNetworkCreateArgs, buildNativeWarmWorkerRunArgs, buildNativeWorkerRunArgs, gatewayConnectArgs, gatewayDisconnectArgs, nativeIsolationNames, nativeWarmIsolationNames, NATIVE_WARM_LABEL_FILTER, NATIVE_WARM_TOKEN_LABEL, NATIVE_WORKER_LABEL_FILTER, } from "./docker-isolation.js";
|
|
13
|
+
import { warmDeliveryCommand } from "./warm-delivery.js";
|
|
14
|
+
import { NATIVE_SANDBOX_WARM_DELIVERY_FAILED } from "./warm-pool.js";
|
|
15
|
+
const launcherLog = logger.child({ module: "native-docker-launcher" });
|
|
16
|
+
/**
|
|
17
|
+
* Bounded, so a noisy worker cannot flood the log. The worker holds no long-lived credentials (only
|
|
18
|
+
* its run's gateway capability), and it redacts the secret values it received (every `secrets.get`
|
|
19
|
+
* result, and the capability) from everything it writes to stderr, its failure line and logger lines
|
|
20
|
+
* included (stderr-redaction.ts), with the console bridge's redactor and its minimum length. The
|
|
21
|
+
* worker is untrusted, so the launcher masks the tail again itself (workerTailFields).
|
|
22
|
+
*/
|
|
23
|
+
export const WORKER_STDERR_TAIL_CHARS = 2000;
|
|
24
|
+
/** How long a failed worker's diagnostic (its log read and its secret values read) may take in all. */
|
|
25
|
+
export const WORKER_TAIL_TIMEOUT_MS = 10_000;
|
|
26
|
+
/** `promise`, or a rejection once `ms` pass first. */
|
|
27
|
+
export function withTimeout(promise, ms) {
|
|
28
|
+
let timer;
|
|
29
|
+
const timeout = new Promise((_, reject) => {
|
|
30
|
+
timer = setTimeout(() => reject(new Error("worker_diagnostic_timeout")), Math.max(0, ms));
|
|
31
|
+
});
|
|
32
|
+
return Promise.race([promise, timeout]).finally(() => clearTimeout(timer));
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* A failed worker's output tail as log fields: `stderrTail`, masked by exact value through the
|
|
36
|
+
* shared redactor against every secret value delivered to that worker (its gateway capability,
|
|
37
|
+
* from its input, and each value its tools may read, from `secretValues`, with their JSON-escaped
|
|
38
|
+
* forms). When those values are not given, cannot be read, or are not read within `timeoutMs`, no
|
|
39
|
+
* tail: `stderrTailOmitted: "secrets_unavailable"` (fail closed). No fields when the output is empty.
|
|
40
|
+
*
|
|
41
|
+
* `cut`: `output` is a slice of a longer output (a log read bounded by lines or bytes), so it may
|
|
42
|
+
* begin (`start`) or end (`end`) inside a value, which no exact match finds; as many characters as
|
|
43
|
+
* the longest value less one are masked at each cut end too.
|
|
44
|
+
*/
|
|
45
|
+
export async function workerTailFields(output, input, secretValues, cut = {}, timeoutMs = WORKER_TAIL_TIMEOUT_MS) {
|
|
46
|
+
if (!output.trim())
|
|
47
|
+
return {};
|
|
48
|
+
let delivered;
|
|
49
|
+
try {
|
|
50
|
+
if (!secretValues)
|
|
51
|
+
return { stderrTailOmitted: "secrets_unavailable" };
|
|
52
|
+
delivered = await withTimeout(secretValues(), timeoutMs);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return { stderrTailOmitted: "secrets_unavailable" };
|
|
56
|
+
}
|
|
57
|
+
const values = withEscapedForms([...(input.gateway ? [input.gateway.capability] : []), ...delivered]);
|
|
58
|
+
const spans = secretSpans(output, values);
|
|
59
|
+
const longest = Math.max(0, ...values.map((value) => value.length));
|
|
60
|
+
if (longest > 1) {
|
|
61
|
+
if (cut.start)
|
|
62
|
+
spans.push([0, Math.min(output.length, longest - 1)]);
|
|
63
|
+
if (cut.end)
|
|
64
|
+
spans.push([Math.max(0, output.length - (longest - 1)), output.length]);
|
|
65
|
+
}
|
|
66
|
+
// Masked whole, then cut: a cut can then split only a marker or plain text, never a value.
|
|
67
|
+
const stderrTail = maskSpans(output, mergeSpans(spans)).trim().slice(-WORKER_STDERR_TAIL_CHARS);
|
|
68
|
+
return stderrTail ? { stderrTail } : {};
|
|
69
|
+
}
|
|
70
|
+
export function processDockerCli(binary = "docker") {
|
|
71
|
+
return {
|
|
72
|
+
run(args, options = {}) {
|
|
73
|
+
return new Promise((resolve) => {
|
|
74
|
+
const child = spawn(binary, args, { stdio: ["pipe", "pipe", "pipe"] });
|
|
75
|
+
let stdout = "";
|
|
76
|
+
let stderr = "";
|
|
77
|
+
const timer = options.timeoutMs ? setTimeout(() => child.kill("SIGKILL"), options.timeoutMs) : undefined;
|
|
78
|
+
// One decoder per stream, so a multi-byte character split across chunks still decodes (and a
|
|
79
|
+
// secret holding it still matches the redactor exactly).
|
|
80
|
+
child.stdout.setEncoding("utf8");
|
|
81
|
+
child.stderr.setEncoding("utf8");
|
|
82
|
+
child.stdout.on("data", (chunk) => (stdout += chunk));
|
|
83
|
+
child.stderr.on("data", (chunk) => (stderr += chunk));
|
|
84
|
+
child.on("error", (err) => resolve({ code: null, stdout, stderr: err.message }));
|
|
85
|
+
child.on("close", (code) => {
|
|
86
|
+
if (timer)
|
|
87
|
+
clearTimeout(timer);
|
|
88
|
+
resolve({ code, stdout, stderr });
|
|
89
|
+
});
|
|
90
|
+
child.stdin.on("error", () => { });
|
|
91
|
+
child.stdin.end(options.input ?? "");
|
|
92
|
+
});
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
export class DockerNativeWorkerLauncher {
|
|
97
|
+
options;
|
|
98
|
+
docker;
|
|
99
|
+
constructor(options) {
|
|
100
|
+
this.options = options;
|
|
101
|
+
this.docker = options.docker ?? processDockerCli();
|
|
102
|
+
}
|
|
103
|
+
async must(args, what, tolerate) {
|
|
104
|
+
const result = await this.docker.run(args);
|
|
105
|
+
if (result.code !== 0 && !(tolerate && tolerate.test(result.stderr))) {
|
|
106
|
+
throw new Error(`native_sandbox_docker_failed: ${what}: ${result.stderr.trim().slice(0, 500)}`);
|
|
107
|
+
}
|
|
108
|
+
return result;
|
|
109
|
+
}
|
|
110
|
+
/** The image must be present and pinned; a digest is pulled once, a local id must already exist. */
|
|
111
|
+
async ensureImage() {
|
|
112
|
+
const present = await this.docker.run(["image", "inspect", "--format", "{{.Id}}", this.options.image]);
|
|
113
|
+
if (present.code === 0)
|
|
114
|
+
return;
|
|
115
|
+
await this.must(["image", "pull", "--quiet", this.options.image], "pull the worker image");
|
|
116
|
+
}
|
|
117
|
+
async launch(input, launchOptions = {}) {
|
|
118
|
+
const runId = input.runId;
|
|
119
|
+
const names = nativeIsolationNames(runId);
|
|
120
|
+
const existing = await this.inspect(runId);
|
|
121
|
+
if (existing.state === "missing") {
|
|
122
|
+
await this.ensureImage();
|
|
123
|
+
await this.must(buildNativeNetworkCreateArgs(runId), "create the run network", /already exists/);
|
|
124
|
+
await this.must(buildGatewayConnectArgs(runId, this.options.gatewayContainer), "join the gateway to the run network", /already exists|is already connected/);
|
|
125
|
+
const args = buildNativeWorkerRunArgs({ runId, image: this.options.image, limits: this.options.limits });
|
|
126
|
+
// Attached so the input (capability included) goes in on stdin; the exit is read with
|
|
127
|
+
// `docker wait`, which a restarted server can call again.
|
|
128
|
+
void this.docker.run(args, { input: `${JSON.stringify(input)}\n` }).then(async (result) => {
|
|
129
|
+
if (result.code !== 0 && result.code !== null && !/Conflict/.test(result.stderr)) {
|
|
130
|
+
const tail = await workerTailFields(result.stderr, input, launchOptions.secretValues);
|
|
131
|
+
launcherLog.warn({ container: names.worker, code: result.code, ...tail }, "native worker exited non-zero");
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
launcherLog.info({ container: names.worker }, "native worker already exists: attaching, not relaunching");
|
|
137
|
+
}
|
|
138
|
+
return this.handle(runId);
|
|
139
|
+
}
|
|
140
|
+
/** Waits for (and reports) the worker's exit; usable after a server restart. */
|
|
141
|
+
handle(runId) {
|
|
142
|
+
return this.handleByName(nativeIsolationNames(runId).worker);
|
|
143
|
+
}
|
|
144
|
+
handleByName(name) {
|
|
145
|
+
const exited = (async () => {
|
|
146
|
+
// `docker run` may not have created the container yet: wait for it to exist (bounded).
|
|
147
|
+
for (let attempt = 0; attempt < 50; attempt += 1) {
|
|
148
|
+
const waited = await this.docker.run(["container", "wait", name]);
|
|
149
|
+
if (waited.code === 0) {
|
|
150
|
+
const code = Number(waited.stdout.trim());
|
|
151
|
+
return Number.isInteger(code) ? code : null;
|
|
152
|
+
}
|
|
153
|
+
if (!/No such container/i.test(waited.stderr))
|
|
154
|
+
return null;
|
|
155
|
+
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
156
|
+
}
|
|
157
|
+
return null;
|
|
158
|
+
})();
|
|
159
|
+
return { exited, kill: () => void this.docker.run(["container", "kill", name]) };
|
|
160
|
+
}
|
|
161
|
+
async inspect(runId) {
|
|
162
|
+
return this.inspectByName(nativeIsolationNames(runId).worker);
|
|
163
|
+
}
|
|
164
|
+
async inspectByName(name) {
|
|
165
|
+
const result = await this.docker.run([
|
|
166
|
+
"container",
|
|
167
|
+
"inspect",
|
|
168
|
+
"--format",
|
|
169
|
+
"{{.State.Status}} {{.State.ExitCode}}",
|
|
170
|
+
name,
|
|
171
|
+
]);
|
|
172
|
+
if (result.code !== 0)
|
|
173
|
+
return { state: "missing" };
|
|
174
|
+
const [status, exitCode] = result.stdout.trim().split(" ");
|
|
175
|
+
if (status === "running" || status === "created" || status === "restarting")
|
|
176
|
+
return { state: "running" };
|
|
177
|
+
return { state: "exited", exitCode: Number(exitCode) };
|
|
178
|
+
}
|
|
179
|
+
async kill(runId) {
|
|
180
|
+
await this.docker.run(["container", "kill", nativeIsolationNames(runId).worker]);
|
|
181
|
+
}
|
|
182
|
+
/** Removes the worker, its network, and the gateway's membership of it. Idempotent. */
|
|
183
|
+
async remove(runId) {
|
|
184
|
+
const names = nativeIsolationNames(runId);
|
|
185
|
+
await this.docker.run(["container", "rm", "--force", names.worker]);
|
|
186
|
+
await this.docker.run(buildGatewayDisconnectArgs(runId, this.options.gatewayContainer));
|
|
187
|
+
await this.docker.run(["network", "rm", names.network]);
|
|
188
|
+
}
|
|
189
|
+
/** Removes a worker found by the janitor, by its container name (its network shares the name's token). */
|
|
190
|
+
async removeByWorkerName(workerName) {
|
|
191
|
+
const token = /^wardby-native-([0-9a-f]{20})$/.exec(workerName)?.[1];
|
|
192
|
+
if (!token)
|
|
193
|
+
return;
|
|
194
|
+
await this.docker.run(["container", "rm", "--force", workerName]);
|
|
195
|
+
await this.docker.run(["network", "disconnect", "--force", `wardby-nnet-${token}`, this.options.gatewayContainer]);
|
|
196
|
+
await this.docker.run(["network", "rm", `wardby-nnet-${token}`]);
|
|
197
|
+
}
|
|
198
|
+
/** Every native worker container this engine holds, with its run-hash label (for the janitor). */
|
|
199
|
+
async listWorkers() {
|
|
200
|
+
const result = await this.docker.run([
|
|
201
|
+
"container",
|
|
202
|
+
"ls",
|
|
203
|
+
"--all",
|
|
204
|
+
"--filter",
|
|
205
|
+
`label=${NATIVE_WORKER_LABEL_FILTER}`,
|
|
206
|
+
"--format",
|
|
207
|
+
'{{.Names}} {{.Label "io.wardby.run-sha256"}}',
|
|
208
|
+
]);
|
|
209
|
+
if (result.code !== 0)
|
|
210
|
+
return [];
|
|
211
|
+
return result.stdout
|
|
212
|
+
.split("\n")
|
|
213
|
+
.map((line) => line.trim().split(" "))
|
|
214
|
+
.filter(([name, runHash]) => name && runHash)
|
|
215
|
+
.map(([name, runHash]) => ({ name, runHash }));
|
|
216
|
+
}
|
|
217
|
+
// --- Warm pool workers (native sandbox phase 6) ---
|
|
218
|
+
warmSpecHash(waitMs) {
|
|
219
|
+
const { image, limits, gatewayContainer } = this.options;
|
|
220
|
+
return createHash("sha256")
|
|
221
|
+
.update(JSON.stringify({ launcher: "docker", image, limits, gatewayContainer, waitMs }))
|
|
222
|
+
.digest("hex");
|
|
223
|
+
}
|
|
224
|
+
/** Its network is internal from creation, so a running container is already isolated: claimable. */
|
|
225
|
+
async startWarm(token, waitMs) {
|
|
226
|
+
const names = nativeWarmIsolationNames(token);
|
|
227
|
+
try {
|
|
228
|
+
await this.ensureImage();
|
|
229
|
+
await this.must(buildNativeWarmNetworkCreateArgs(token), "create the warm worker network", /already exists/);
|
|
230
|
+
await this.must(gatewayConnectArgs(names.network, this.options.gatewayContainer), "join the gateway to the warm worker network", /already exists|is already connected/);
|
|
231
|
+
await this.must(buildNativeWarmWorkerRunArgs({ token, image: this.options.image, limits: this.options.limits, waitMs }), "start the warm worker");
|
|
232
|
+
}
|
|
233
|
+
catch (err) {
|
|
234
|
+
await this.removeWarm(token).catch(() => { });
|
|
235
|
+
throw err;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/** Still running, and attached to its own network and nothing else. */
|
|
239
|
+
async reattestWarm(token) {
|
|
240
|
+
const names = nativeWarmIsolationNames(token);
|
|
241
|
+
const result = await this.docker.run([
|
|
242
|
+
"container",
|
|
243
|
+
"inspect",
|
|
244
|
+
"--format",
|
|
245
|
+
"{{.State.Status}} {{json .NetworkSettings.Networks}}",
|
|
246
|
+
names.worker,
|
|
247
|
+
]);
|
|
248
|
+
if (result.code !== 0)
|
|
249
|
+
return false;
|
|
250
|
+
const [status, ...rest] = result.stdout.trim().split(" ");
|
|
251
|
+
try {
|
|
252
|
+
const networks = Object.keys(JSON.parse(rest.join(" ")));
|
|
253
|
+
return status === "running" && networks.length === 1 && networks[0] === names.network;
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
async deliver(token, input) {
|
|
260
|
+
const result = await this.docker.run(["container", "exec", "-i", nativeWarmIsolationNames(token).worker, ...warmDeliveryCommand()], { input: `${JSON.stringify(input)}\n`, timeoutMs: 20_000 });
|
|
261
|
+
if (result.code !== 0) {
|
|
262
|
+
throw new Error(`${NATIVE_SANDBOX_WARM_DELIVERY_FAILED}: delivering the run's input exited ${result.code ?? "?"}.`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
warmHandle(token) {
|
|
266
|
+
return this.handleByName(nativeWarmIsolationNames(token).worker);
|
|
267
|
+
}
|
|
268
|
+
inspectWarm(token) {
|
|
269
|
+
return this.inspectByName(nativeWarmIsolationNames(token).worker);
|
|
270
|
+
}
|
|
271
|
+
async killWarm(token) {
|
|
272
|
+
await this.docker.run(["container", "kill", nativeWarmIsolationNames(token).worker]);
|
|
273
|
+
}
|
|
274
|
+
async removeWarm(token) {
|
|
275
|
+
const names = nativeWarmIsolationNames(token);
|
|
276
|
+
await this.docker.run(["container", "rm", "--force", names.worker]);
|
|
277
|
+
await this.docker.run(gatewayDisconnectArgs(names.network, this.options.gatewayContainer));
|
|
278
|
+
await this.docker.run(["network", "rm", names.network]);
|
|
279
|
+
}
|
|
280
|
+
async listWarm() {
|
|
281
|
+
const result = await this.docker.run([
|
|
282
|
+
"container",
|
|
283
|
+
"ls",
|
|
284
|
+
"--all",
|
|
285
|
+
"--filter",
|
|
286
|
+
`label=${NATIVE_WARM_LABEL_FILTER}`,
|
|
287
|
+
"--format",
|
|
288
|
+
`{{.Label "${NATIVE_WARM_TOKEN_LABEL}"}}`,
|
|
289
|
+
]);
|
|
290
|
+
if (result.code !== 0)
|
|
291
|
+
return [];
|
|
292
|
+
return result.stdout
|
|
293
|
+
.split("\n")
|
|
294
|
+
.map((line) => line.trim())
|
|
295
|
+
.filter((token) => /^[0-9a-f]{20}$/.test(token));
|
|
296
|
+
}
|
|
297
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The native sandbox gateway over HTTP (native sandbox phase 3): stateless per
|
|
3
|
+
* request. Each request is authenticated by the hash of its bearer capability,
|
|
4
|
+
* rebuilt from its run's gateway session (the snapshot pinned at launch), the
|
|
5
|
+
* run row, and the call ledger, and served by the same trusted code the
|
|
6
|
+
* in-process path uses — so any control-plane replica can serve any call, and a
|
|
7
|
+
* replica restart is only a retry for the worker.
|
|
8
|
+
*
|
|
9
|
+
* Authority stays here: a model call reserves its worst case against the
|
|
10
|
+
* session budget before the provider is called and settles at the provider's
|
|
11
|
+
* reported usage; the worker's own usage numbers are never read.
|
|
12
|
+
*/
|
|
13
|
+
import { createNativeRunTools, durableDelegate, type NativeRunFinishContext, type NativeRunProviders, type RunnerDb, type SandboxSessionSnapshot } from "../core/runner.js";
|
|
14
|
+
import { ReviewReadLedger } from "../core/review-reads.js";
|
|
15
|
+
import type { LlmProvider, LlmStreamEvent } from "../providers/llm/types.js";
|
|
16
|
+
import { PrismaGatewayLedger, type GatewaySessionRecord } from "./ledger.js";
|
|
17
|
+
import { type GatewayParams } from "./protocol.js";
|
|
18
|
+
/** Output tokens reserved for a model call that names no maxTokens (as the coding proxy does). */
|
|
19
|
+
export declare const GATEWAY_DEFAULT_RESERVE_OUTPUT_TOKENS = 4096;
|
|
20
|
+
/** The most output tokens one call may reserve for. */
|
|
21
|
+
export declare const GATEWAY_MAX_RESERVE_OUTPUT_TOKENS = 128000;
|
|
22
|
+
/** A replayable result is kept only up to this size; a larger one cannot be replayed on retry. */
|
|
23
|
+
export declare const GATEWAY_MAX_REPLAY_BYTES: number;
|
|
24
|
+
export interface GatewayServerDeps {
|
|
25
|
+
db: RunnerDb & ConstructorParameters<typeof PrismaGatewayLedger>[0];
|
|
26
|
+
providers: NativeRunProviders;
|
|
27
|
+
/** Delegation long-poll window; tests shorten it. */
|
|
28
|
+
pollWindowMs?: number;
|
|
29
|
+
}
|
|
30
|
+
/** What a request gets back: one JSON value, or a stream of model events. */
|
|
31
|
+
export type GatewayResponse = {
|
|
32
|
+
kind: "json";
|
|
33
|
+
status: number;
|
|
34
|
+
body: unknown;
|
|
35
|
+
} | {
|
|
36
|
+
kind: "stream";
|
|
37
|
+
status: 200;
|
|
38
|
+
events: AsyncIterable<LlmStreamEvent>;
|
|
39
|
+
};
|
|
40
|
+
/** Serves one gateway request. Never throws: every failure is a response. */
|
|
41
|
+
export declare function serveGatewayRequest(deps: GatewayServerDeps, authorization: string | undefined, body: unknown): Promise<GatewayResponse>;
|
|
42
|
+
/**
|
|
43
|
+
* Every secret value the rebuilt run can read (each user tool's readable or brokered values), and
|
|
44
|
+
* the request's own capability: what a cause code is checked against before it leaves the gateway.
|
|
45
|
+
*/
|
|
46
|
+
export declare function runSecretValues(ctx: Pick<RebuiltRun, "snapshot" | "tools">, capability: string): () => Promise<string[]>;
|
|
47
|
+
/**
|
|
48
|
+
* A failure as its response. Only a checked cause code leaves the gateway (workerGatewayError),
|
|
49
|
+
* never the rest of an unexpected error's message; the server's own log line is redacted by the
|
|
50
|
+
* same values.
|
|
51
|
+
*/
|
|
52
|
+
export declare function failureResponse(err: unknown, secretValues: (() => Promise<string[]>) | undefined): Promise<GatewayResponse>;
|
|
53
|
+
/** A model stream whose failure reaches the worker as the same checked error a JSON response carries. */
|
|
54
|
+
export declare function checkedEvents(events: AsyncIterable<LlmStreamEvent>, secretValues: (() => Promise<string[]>) | undefined): AsyncIterable<LlmStreamEvent>;
|
|
55
|
+
interface RebuiltRun {
|
|
56
|
+
session: GatewaySessionRecord;
|
|
57
|
+
snapshot: SandboxSessionSnapshot;
|
|
58
|
+
llm: LlmProvider;
|
|
59
|
+
tools: ReturnType<typeof createNativeRunTools>;
|
|
60
|
+
/** The run's review reads, restored from the session; saved back after each read (see builtin). */
|
|
61
|
+
reviewReads: ReviewReadLedger;
|
|
62
|
+
finishContext: NativeRunFinishContext;
|
|
63
|
+
delegation: Omit<Parameters<typeof durableDelegate>[0], "ledger" | "sessionId">;
|
|
64
|
+
}
|
|
65
|
+
/** Exported for its unit test; the HTTP handler is its only production caller. */
|
|
66
|
+
export declare function streamModel(ctx: RebuiltRun, ledger: PrismaGatewayLedger, callId: string, params: GatewayParams<"llm.stream">): AsyncIterable<LlmStreamEvent>;
|
|
67
|
+
/**
|
|
68
|
+
* Logged (at warn) in place of a user tool's console line when that tool's redaction list cannot
|
|
69
|
+
* be read: without the complete list the line cannot be shown to be free of its secret values, so
|
|
70
|
+
* none of it is logged. The tool's call still succeeds, as a console write does in-process.
|
|
71
|
+
*/
|
|
72
|
+
export declare const CONSOLE_WITHHELD_MESSAGE = "sandbox tool console line withheld: the tool's secret values could not be read";
|
|
73
|
+
/** Serves one privileged bridge call for a worker (exported for tests). */
|
|
74
|
+
export declare function hostCall(ctx: RebuiltRun, ledger: PrismaGatewayLedger, callId: string, params: GatewayParams<"host.call">): Promise<unknown>;
|
|
75
|
+
/** The worker's terminal call: the run's one terminal write (masked by finishNativeRun), then the session ends. */
|
|
76
|
+
export declare function finish(ctx: RebuiltRun, ledger: PrismaGatewayLedger, callId: string, params: GatewayParams<"finish">): Promise<null>;
|
|
77
|
+
export {};
|