@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,18 @@
|
|
|
1
|
+
const DEFAULT_IDLE_MINUTES = 30;
|
|
2
|
+
export function loadLowPowerConfig(env = process.env) {
|
|
3
|
+
const flag = env.WARDBY_LOW_POWER?.trim();
|
|
4
|
+
if (flag !== undefined && flag !== "" && flag !== "0" && flag !== "1") {
|
|
5
|
+
throw new Error("WARDBY_LOW_POWER must be 0 or 1.");
|
|
6
|
+
}
|
|
7
|
+
// LOW_POWER_IDLE_MINUTES only matters with the mode on; off, it is ignored entirely.
|
|
8
|
+
if (flag !== "1")
|
|
9
|
+
return { enabled: false, idleMinutes: DEFAULT_IDLE_MINUTES };
|
|
10
|
+
const raw = env.LOW_POWER_IDLE_MINUTES?.trim();
|
|
11
|
+
if (!raw)
|
|
12
|
+
return { enabled: true, idleMinutes: DEFAULT_IDLE_MINUTES };
|
|
13
|
+
const idleMinutes = /^\d+$/.test(raw) ? Number(raw) : NaN;
|
|
14
|
+
if (!(idleMinutes >= 5 && idleMinutes <= 1440)) {
|
|
15
|
+
throw new Error("LOW_POWER_IDLE_MINUTES must be an integer from 5 to 1440.");
|
|
16
|
+
}
|
|
17
|
+
return { enabled: true, idleMinutes };
|
|
18
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mobile app access (WARDBY_MOBILE_ENABLED, off by default). S1: the app's
|
|
3
|
+
* private-use OAuth redirect (RFC 8252 §7.1); later: push notifications.
|
|
4
|
+
*/
|
|
5
|
+
export declare const DEFAULT_MOBILE_REDIRECT_URI = "com.wardby.mobile:/oauth";
|
|
6
|
+
export declare const MOBILE_DISABLED = "mobile_disabled";
|
|
7
|
+
export interface MobileConfig {
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
/** The one redirect URI mobile sign-in may use; matched exactly. */
|
|
10
|
+
redirectUri: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function loadMobileConfig(env?: NodeJS.ProcessEnv): MobileConfig;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mobile app access (WARDBY_MOBILE_ENABLED, off by default). S1: the app's
|
|
3
|
+
* private-use OAuth redirect (RFC 8252 §7.1); later: push notifications.
|
|
4
|
+
*/
|
|
5
|
+
export const DEFAULT_MOBILE_REDIRECT_URI = "com.wardby.mobile:/oauth";
|
|
6
|
+
export const MOBILE_DISABLED = "mobile_disabled";
|
|
7
|
+
/** A reverse-domain scheme (at least one dot), ":/", then a path — no host, query, or fragment. */
|
|
8
|
+
const PRIVATE_USE_REDIRECT = /^[a-z][a-z0-9+-]*(\.[a-z0-9+-]+)+:\/(?!\/)[A-Za-z0-9/_-]*$/;
|
|
9
|
+
export function loadMobileConfig(env = process.env) {
|
|
10
|
+
const raw = env.WARDBY_MOBILE_ENABLED?.trim().toLowerCase() ?? "";
|
|
11
|
+
if (raw !== "" && raw !== "true" && raw !== "false")
|
|
12
|
+
throw new Error("WARDBY_MOBILE_ENABLED must be true or false.");
|
|
13
|
+
const redirectUri = env.WARDBY_MOBILE_REDIRECT_URI?.trim() || DEFAULT_MOBILE_REDIRECT_URI;
|
|
14
|
+
if (!PRIVATE_USE_REDIRECT.test(redirectUri)) {
|
|
15
|
+
throw new Error("WARDBY_MOBILE_REDIRECT_URI must be a private-use redirect such as com.example.app:/oauth.");
|
|
16
|
+
}
|
|
17
|
+
return { enabled: raw === "true", redirectUri };
|
|
18
|
+
}
|
|
@@ -7,11 +7,13 @@
|
|
|
7
7
|
* adapters) is added once the adapters exist.
|
|
8
8
|
*/
|
|
9
9
|
import { type KubernetesPlatform } from "../providers/jobs/kubernetes-platform.js";
|
|
10
|
+
import type { BlobStoreConfig } from "../providers/storage/index.js";
|
|
11
|
+
import { type MobileConfig } from "./mobile.js";
|
|
10
12
|
export type JobLauncherKind = "local" | "docker" | "kubernetes";
|
|
11
13
|
export type EmailProviderKind = "smtp" | "ses";
|
|
12
14
|
export type SecretCipherKind = "app-key" | "kms";
|
|
13
15
|
export type AuthProviderKind = "delegating" | "self-hosted";
|
|
14
|
-
export type BlobStoreKind = "local" | "s3";
|
|
16
|
+
export type BlobStoreKind = "local" | "gcs" | "s3";
|
|
15
17
|
export type ExecutorKind = "in-process" | "dbos";
|
|
16
18
|
export type DatastoreKind = "postgres";
|
|
17
19
|
export type EngineKind = "native" | "langgraph";
|
|
@@ -21,12 +23,15 @@ export interface ProviderConfig {
|
|
|
21
23
|
email: EmailProviderKind;
|
|
22
24
|
secrets: SecretCipherKind;
|
|
23
25
|
auth: AuthProviderKind;
|
|
24
|
-
|
|
26
|
+
/** Unset BLOB_STORE means no blob store is configured. */
|
|
27
|
+
storage: BlobStoreKind | undefined;
|
|
25
28
|
executor: ExecutorKind;
|
|
26
29
|
datastore: DatastoreKind;
|
|
27
30
|
engine: EngineKind;
|
|
28
31
|
vcs: VcsProviderKind;
|
|
29
32
|
}
|
|
33
|
+
/** Blob store settings from the environment; undefined when BLOB_STORE is unset (no blob store). */
|
|
34
|
+
export declare function loadBlobStoreConfig(env?: NodeJS.ProcessEnv): BlobStoreConfig | undefined;
|
|
30
35
|
/** Read provider selection from environment variables, defaulting to portable. */
|
|
31
36
|
export declare function loadProviderConfig(env?: NodeJS.ProcessEnv): ProviderConfig;
|
|
32
37
|
export interface GitHubVcsConfig {
|
|
@@ -40,9 +45,14 @@ export interface GitHubVcsConfig {
|
|
|
40
45
|
/** Trusted roots for `local:` repositories (LOCAL_REPO_ROOTS, path-delimiter separated); unset = local repositories disabled. */
|
|
41
46
|
export { loadLocalRepoRoots } from "../coding/local-repo.js";
|
|
42
47
|
export declare function loadGitHubVcsConfig(env?: NodeJS.ProcessEnv): GitHubVcsConfig;
|
|
43
|
-
/**
|
|
48
|
+
/**
|
|
49
|
+
* GitHub App webhook settings for the code-review host ingress; unset = ingress disabled.
|
|
50
|
+
* `mentionExplanations` (WARDBY_MENTION_EXPLANATIONS, default true): false = a mention that
|
|
51
|
+
* starts nothing gets no reply saying why.
|
|
52
|
+
*/
|
|
44
53
|
export declare function loadGitHubEventConfig(env?: NodeJS.ProcessEnv): {
|
|
45
54
|
webhookSecret?: string;
|
|
55
|
+
mentionExplanations: boolean;
|
|
46
56
|
};
|
|
47
57
|
/**
|
|
48
58
|
* The GitHub App's OAuth client credentials, for linking a principal's GitHub
|
|
@@ -79,6 +89,13 @@ export interface JiraConfig {
|
|
|
79
89
|
* are rejected.
|
|
80
90
|
*/
|
|
81
91
|
export declare function loadJiraConfig(env?: NodeJS.ProcessEnv): JiraConfig | null;
|
|
92
|
+
export interface SlackConfig {
|
|
93
|
+
botToken: string;
|
|
94
|
+
apiBaseUrl: string;
|
|
95
|
+
customize: boolean;
|
|
96
|
+
}
|
|
97
|
+
/** Slack workflow notifications; null when WARDBY_SLACK_BOT_TOKEN is unset (and no other Slack variable is). */
|
|
98
|
+
export declare function loadSlackConfig(env?: NodeJS.ProcessEnv): SlackConfig | null;
|
|
82
99
|
export interface ContainerExecutorConfig {
|
|
83
100
|
workerImage?: string;
|
|
84
101
|
claudeWorkerImage?: string;
|
|
@@ -122,6 +139,49 @@ export interface CodingConcurrencyConfig {
|
|
|
122
139
|
* before closing the executor (SHUTDOWN_DRAIN_SECONDS, default 600; 0 = do
|
|
123
140
|
* not wait). Keep the platform's termination grace period above this.
|
|
124
141
|
*/
|
|
142
|
+
/** The native sandbox (docs/native-sandbox.md): where sandbox-mode native runs execute. */
|
|
143
|
+
interface NativeSandboxCommonConfig {
|
|
144
|
+
workerImage: string;
|
|
145
|
+
/** What a worker dials; undefined = the launcher's default (Docker: the gateway alias; Kubernetes: the Service's ClusterIP). */
|
|
146
|
+
gatewayUrl?: string;
|
|
147
|
+
cpus: number;
|
|
148
|
+
memoryMb: number;
|
|
149
|
+
/** Docker only: Kubernetes has no per-pod process limit (it is a node-level kubelet setting). */
|
|
150
|
+
pids: number;
|
|
151
|
+
/** NATIVE_SANDBOX_MAX_CONCURRENT: at most this many sandbox runs at once (unset = no cap). */
|
|
152
|
+
maxConcurrent?: number;
|
|
153
|
+
/** NATIVE_SANDBOX_WARM_POOL_SIZE: idle, isolated workers kept ready for runs to claim (0 = no pool). */
|
|
154
|
+
warmPoolSize: number;
|
|
155
|
+
/** NATIVE_SANDBOX_WARM_MAX_AGE_MS: an idle worker older than this is replaced, never claimed. */
|
|
156
|
+
warmMaxAgeMs: number;
|
|
157
|
+
}
|
|
158
|
+
export interface DockerNativeSandboxConfig extends NativeSandboxCommonConfig {
|
|
159
|
+
launcher: "docker";
|
|
160
|
+
/** The container running `wardby native-gateway`, joined to each run's network. */
|
|
161
|
+
gatewayContainer: string;
|
|
162
|
+
}
|
|
163
|
+
export interface KubernetesNativeSandboxConfig extends NativeSandboxCommonConfig {
|
|
164
|
+
launcher: "kubernetes";
|
|
165
|
+
/** Where run pods (and the native gateway) live. */
|
|
166
|
+
namespace: string;
|
|
167
|
+
context?: string;
|
|
168
|
+
/** The native gateway's Service in that namespace. */
|
|
169
|
+
gatewayService: string;
|
|
170
|
+
runtimeClassName?: string;
|
|
171
|
+
/** KUBERNETES_PLATFORM: worker pods are conformed to its admission rules. */
|
|
172
|
+
platform: KubernetesPlatform;
|
|
173
|
+
/** NATIVE_SANDBOX_PRIORITY_CLASS, else KUBERNETES_RUN_PRIORITY_CLASS. */
|
|
174
|
+
priorityClassName?: string;
|
|
175
|
+
/** How long a worker pod may take to start running (NATIVE_SANDBOX_READY_TIMEOUT_MS). */
|
|
176
|
+
readyTimeoutMs?: number;
|
|
177
|
+
/** How long its isolation may take to prove from inside (NATIVE_SANDBOX_ENFORCEMENT_TIMEOUT_MS). */
|
|
178
|
+
enforcementTimeoutMs?: number;
|
|
179
|
+
}
|
|
180
|
+
/** The native gateway Service (and Deployment) name when NATIVE_GATEWAY_SERVICE is unset. */
|
|
181
|
+
export declare const DEFAULT_NATIVE_GATEWAY_SERVICE = "wardby-native-gateway";
|
|
182
|
+
export type NativeSandboxConfig = DockerNativeSandboxConfig | KubernetesNativeSandboxConfig;
|
|
183
|
+
/** Undefined when NATIVE_SANDBOX_LAUNCHER is unset (sandbox-mode runs then fail closed). Throws on a bad configuration. */
|
|
184
|
+
export declare function loadNativeSandboxConfig(env?: NodeJS.ProcessEnv): NativeSandboxConfig | undefined;
|
|
125
185
|
export declare function loadShutdownDrainSeconds(env?: NodeJS.ProcessEnv): number;
|
|
126
186
|
export declare function loadCodingConcurrencyConfig(env?: NodeJS.ProcessEnv): CodingConcurrencyConfig;
|
|
127
187
|
/** JOB_LAUNCHER=kubernetes: where coding-run pods go, how they reach the in-cluster proxy, and which platform's admission rules apply. */
|
|
@@ -200,6 +260,8 @@ export interface AuthConfig {
|
|
|
200
260
|
signingKey?: string;
|
|
201
261
|
credentialHashKey?: string;
|
|
202
262
|
maxClients?: number;
|
|
263
|
+
/** Self-hosted mode: mobile sign-in (WARDBY_MOBILE_ENABLED, WARDBY_MOBILE_REDIRECT_URI). */
|
|
264
|
+
mobile: MobileConfig;
|
|
203
265
|
}
|
|
204
266
|
/** Read auth-adapter config (issuer/JWKS/audience/signing key) from the environment. */
|
|
205
267
|
export declare function loadAuthConfig(env?: NodeJS.ProcessEnv): AuthConfig;
|
package/dist/config/providers.js
CHANGED
|
@@ -6,7 +6,45 @@
|
|
|
6
6
|
* code change. The `assembleProviders` factory (which constructs the concrete
|
|
7
7
|
* adapters) is added once the adapters exist.
|
|
8
8
|
*/
|
|
9
|
-
import { KUBERNETES_PLATFORMS } from "../providers/jobs/kubernetes-platform.js";
|
|
9
|
+
import { GVISOR_RUNTIME_CLASS, KUBERNETES_PLATFORMS, platformProfile, } from "../providers/jobs/kubernetes-platform.js";
|
|
10
|
+
import { loadMobileConfig } from "./mobile.js";
|
|
11
|
+
import { testSimulatorBase } from "./test-simulators.js";
|
|
12
|
+
const BLOB_STORE_KINDS = ["local", "gcs", "s3"];
|
|
13
|
+
function loadBlobStoreKind(env) {
|
|
14
|
+
const value = env.BLOB_STORE?.trim();
|
|
15
|
+
if (value === undefined || value === "")
|
|
16
|
+
return undefined;
|
|
17
|
+
if (!BLOB_STORE_KINDS.includes(value)) {
|
|
18
|
+
throw new Error(`BLOB_STORE must be one of ${BLOB_STORE_KINDS.join(", ")} (got "${value}").`);
|
|
19
|
+
}
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
/** Blob store settings from the environment; undefined when BLOB_STORE is unset (no blob store). */
|
|
23
|
+
export function loadBlobStoreConfig(env = process.env) {
|
|
24
|
+
const kind = loadBlobStoreKind(env);
|
|
25
|
+
if (kind === undefined)
|
|
26
|
+
return undefined;
|
|
27
|
+
if (kind === "local") {
|
|
28
|
+
const localDir = env.BLOB_STORE_LOCAL_DIR?.trim();
|
|
29
|
+
if (!localDir)
|
|
30
|
+
throw new Error("BLOB_STORE_LOCAL_DIR is required when BLOB_STORE=local.");
|
|
31
|
+
return { kind, localDir };
|
|
32
|
+
}
|
|
33
|
+
if (kind === "gcs") {
|
|
34
|
+
const bucket = env.BLOB_STORE_GCS_BUCKET?.trim();
|
|
35
|
+
if (!bucket)
|
|
36
|
+
throw new Error("BLOB_STORE_GCS_BUCKET is required when BLOB_STORE=gcs.");
|
|
37
|
+
return { kind, bucket };
|
|
38
|
+
}
|
|
39
|
+
const bucket = env.BLOB_STORE_S3_BUCKET?.trim();
|
|
40
|
+
if (!bucket)
|
|
41
|
+
throw new Error("BLOB_STORE_S3_BUCKET is required when BLOB_STORE=s3.");
|
|
42
|
+
const region = env.BLOB_STORE_S3_REGION?.trim();
|
|
43
|
+
if (!region)
|
|
44
|
+
throw new Error("BLOB_STORE_S3_REGION is required when BLOB_STORE=s3.");
|
|
45
|
+
const endpoint = env.BLOB_STORE_S3_ENDPOINT?.trim();
|
|
46
|
+
return { kind, bucket, region, ...(endpoint ? { endpoint } : {}) };
|
|
47
|
+
}
|
|
10
48
|
/** Read provider selection from environment variables, defaulting to portable. */
|
|
11
49
|
export function loadProviderConfig(env = process.env) {
|
|
12
50
|
return {
|
|
@@ -14,7 +52,7 @@ export function loadProviderConfig(env = process.env) {
|
|
|
14
52
|
email: env.EMAIL_PROVIDER ?? "smtp",
|
|
15
53
|
secrets: env.SECRET_CIPHER ?? "app-key",
|
|
16
54
|
auth: env.AUTH_PROVIDER ?? "delegating",
|
|
17
|
-
storage: env
|
|
55
|
+
storage: loadBlobStoreKind(env),
|
|
18
56
|
executor: env.EXECUTOR ?? "in-process",
|
|
19
57
|
datastore: env.DATASTORE ?? "postgres",
|
|
20
58
|
engine: env.ENGINE ?? "native",
|
|
@@ -41,13 +79,21 @@ export function loadGitHubVcsConfig(env = process.env) {
|
|
|
41
79
|
maxDiffBytes: optionalPositiveInteger(env.VCS_MAX_DIFF_BYTES, "VCS_MAX_DIFF_BYTES"),
|
|
42
80
|
};
|
|
43
81
|
}
|
|
44
|
-
/**
|
|
82
|
+
/**
|
|
83
|
+
* GitHub App webhook settings for the code-review host ingress; unset = ingress disabled.
|
|
84
|
+
* `mentionExplanations` (WARDBY_MENTION_EXPLANATIONS, default true): false = a mention that
|
|
85
|
+
* starts nothing gets no reply saying why.
|
|
86
|
+
*/
|
|
45
87
|
export function loadGitHubEventConfig(env = process.env) {
|
|
46
88
|
const secret = env.GITHUB_APP_WEBHOOK_SECRET?.trim();
|
|
47
89
|
if (secret !== undefined && secret !== "" && secret.length < 20) {
|
|
48
90
|
throw new Error("GITHUB_APP_WEBHOOK_SECRET must be at least 20 characters.");
|
|
49
91
|
}
|
|
50
|
-
|
|
92
|
+
const explanations = env.WARDBY_MENTION_EXPLANATIONS?.trim() ?? "";
|
|
93
|
+
if (explanations !== "" && explanations !== "true" && explanations !== "false") {
|
|
94
|
+
throw new Error("WARDBY_MENTION_EXPLANATIONS must be true or false.");
|
|
95
|
+
}
|
|
96
|
+
return { webhookSecret: secret || undefined, mentionExplanations: explanations !== "false" };
|
|
51
97
|
}
|
|
52
98
|
/**
|
|
53
99
|
* The GitHub App's OAuth client credentials, for linking a principal's GitHub
|
|
@@ -113,8 +159,11 @@ export function loadJiraConfig(env = process.env) {
|
|
|
113
159
|
siteParsed.password) {
|
|
114
160
|
throw new Error("WARDBY_JIRA_SITE_URL must be a bare https origin such as https://your-site.atlassian.net.");
|
|
115
161
|
}
|
|
116
|
-
|
|
117
|
-
|
|
162
|
+
// WARDBY_TEST_SIMULATORS (test only): the simulator stands in for the gateway; it refuses
|
|
163
|
+
// to start over plain http while Jira is configured, so Jira stays https-only.
|
|
164
|
+
const simulatorJira = testSimulatorBase("jira", env);
|
|
165
|
+
const apiBaseUrl = simulatorJira ?? httpsOrigin(base, "WARDBY_JIRA_API_BASE_URL");
|
|
166
|
+
if (!simulatorJira && !JIRA_GATEWAY.test(apiBaseUrl)) {
|
|
118
167
|
throw new Error("WARDBY_JIRA_API_BASE_URL must be https://api.atlassian.com/ex/jira/<cloudId>, the only base a service " +
|
|
119
168
|
"account's API token works against.");
|
|
120
169
|
}
|
|
@@ -137,6 +186,32 @@ export function loadJiraConfig(env = process.env) {
|
|
|
137
186
|
...(epicLinkField ? { epicLinkField } : {}),
|
|
138
187
|
};
|
|
139
188
|
}
|
|
189
|
+
/** Slack workflow notifications; null when WARDBY_SLACK_BOT_TOKEN is unset (and no other Slack variable is). */
|
|
190
|
+
export function loadSlackConfig(env = process.env) {
|
|
191
|
+
const token = env.WARDBY_SLACK_BOT_TOKEN?.trim();
|
|
192
|
+
const base = env.WARDBY_SLACK_API_BASE_URL?.trim();
|
|
193
|
+
const customizeRaw = env.WARDBY_SLACK_CUSTOMIZE?.trim().toLowerCase();
|
|
194
|
+
if (!token) {
|
|
195
|
+
if (base || customizeRaw)
|
|
196
|
+
throw new Error("WARDBY_SLACK_API_BASE_URL/WARDBY_SLACK_CUSTOMIZE need WARDBY_SLACK_BOT_TOKEN.");
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
if (!token.startsWith("xoxb-"))
|
|
200
|
+
throw new Error("WARDBY_SLACK_BOT_TOKEN must be a bot token (xoxb-…).");
|
|
201
|
+
let apiBaseUrl = "https://slack.com/api";
|
|
202
|
+
if (base) {
|
|
203
|
+
const url = new URL(base);
|
|
204
|
+
if (url.protocol !== "https:")
|
|
205
|
+
throw new Error("WARDBY_SLACK_API_BASE_URL must be an https URL.");
|
|
206
|
+
apiBaseUrl = base.replace(/\/+$/, "");
|
|
207
|
+
}
|
|
208
|
+
if (customizeRaw && customizeRaw !== "true" && customizeRaw !== "false") {
|
|
209
|
+
throw new Error("WARDBY_SLACK_CUSTOMIZE must be true or false.");
|
|
210
|
+
}
|
|
211
|
+
// WARDBY_TEST_SIMULATORS (test only): the simulator's Slack Web API, whatever the override says.
|
|
212
|
+
apiBaseUrl = testSimulatorBase("slack", env) ?? apiBaseUrl;
|
|
213
|
+
return { botToken: token, apiBaseUrl, customize: customizeRaw === "true" };
|
|
214
|
+
}
|
|
140
215
|
function optionalPositiveNumber(value, name, fallback) {
|
|
141
216
|
if (value === undefined)
|
|
142
217
|
return fallback;
|
|
@@ -195,11 +270,67 @@ export function loadContainerExecutorConfig(env = process.env) {
|
|
|
195
270
|
additionalWorkerImages,
|
|
196
271
|
};
|
|
197
272
|
}
|
|
198
|
-
/**
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
273
|
+
/** The native gateway Service (and Deployment) name when NATIVE_GATEWAY_SERVICE is unset. */
|
|
274
|
+
export const DEFAULT_NATIVE_GATEWAY_SERVICE = "wardby-native-gateway";
|
|
275
|
+
/** Undefined when NATIVE_SANDBOX_LAUNCHER is unset (sandbox-mode runs then fail closed). Throws on a bad configuration. */
|
|
276
|
+
export function loadNativeSandboxConfig(env = process.env) {
|
|
277
|
+
const launcher = env.NATIVE_SANDBOX_LAUNCHER?.trim();
|
|
278
|
+
if (!launcher)
|
|
279
|
+
return undefined;
|
|
280
|
+
if (launcher !== "docker" && launcher !== "kubernetes") {
|
|
281
|
+
throw new Error(`NATIVE_SANDBOX_LAUNCHER must be "docker" or "kubernetes" (got "${launcher}").`);
|
|
282
|
+
}
|
|
283
|
+
const workerImage = imageVariable(env.NATIVE_SANDBOX_WORKER_IMAGE);
|
|
284
|
+
if (!workerImage)
|
|
285
|
+
throw new Error(`NATIVE_SANDBOX_WORKER_IMAGE is required when NATIVE_SANDBOX_LAUNCHER=${launcher}.`);
|
|
286
|
+
const gatewayUrl = env.NATIVE_GATEWAY_URL?.trim();
|
|
287
|
+
if (gatewayUrl && !/^https?:\/\/[^\s]+$/.test(gatewayUrl)) {
|
|
288
|
+
throw new Error(`NATIVE_GATEWAY_URL must be an http(s) URL (got "${gatewayUrl}").`);
|
|
289
|
+
}
|
|
290
|
+
const common = {
|
|
291
|
+
workerImage,
|
|
292
|
+
...(gatewayUrl ? { gatewayUrl } : {}),
|
|
293
|
+
cpus: optionalPositiveNumber(env.NATIVE_SANDBOX_CPUS, "NATIVE_SANDBOX_CPUS", 1),
|
|
294
|
+
memoryMb: optionalPositiveInteger(env.NATIVE_SANDBOX_MEMORY_MB, "NATIVE_SANDBOX_MEMORY_MB") ?? 512,
|
|
295
|
+
pids: optionalPositiveInteger(env.NATIVE_SANDBOX_PIDS, "NATIVE_SANDBOX_PIDS") ?? 128,
|
|
296
|
+
...optionalField("maxConcurrent", optionalPositiveInteger(env.NATIVE_SANDBOX_MAX_CONCURRENT, "NATIVE_SANDBOX_MAX_CONCURRENT")),
|
|
297
|
+
warmPoolSize: optionalBoundedInteger(env.NATIVE_SANDBOX_WARM_POOL_SIZE?.trim() || undefined, "NATIVE_SANDBOX_WARM_POOL_SIZE", 0, 50) ?? 0,
|
|
298
|
+
warmMaxAgeMs: optionalBoundedInteger(env.NATIVE_SANDBOX_WARM_MAX_AGE_MS?.trim() || undefined, "NATIVE_SANDBOX_WARM_MAX_AGE_MS", 60_000, 21_600_000) ?? 1_800_000,
|
|
299
|
+
};
|
|
300
|
+
if (launcher === "kubernetes") {
|
|
301
|
+
// A cluster pulls by registry digest; a local image id means nothing to it.
|
|
302
|
+
if (!/@sha256:[0-9a-f]{64}$/.test(workerImage)) {
|
|
303
|
+
throw new Error("NATIVE_SANDBOX_WORKER_IMAGE must be a registry digest (repo@sha256:...) when NATIVE_SANDBOX_LAUNCHER=kubernetes.");
|
|
304
|
+
}
|
|
305
|
+
const namespace = env.NATIVE_SANDBOX_NAMESPACE?.trim() || env.KUBERNETES_NAMESPACE?.trim() || "wardby-coding";
|
|
306
|
+
const runtimeClassName = env.NATIVE_SANDBOX_RUNTIME_CLASS?.trim() || env.KUBERNETES_RUNTIME_CLASS?.trim() || undefined;
|
|
307
|
+
const context = env.KUBERNETES_CONTEXT?.trim() || undefined;
|
|
308
|
+
// The platform and run priority class are the coding launcher's settings, validated the same way.
|
|
309
|
+
const cluster = loadKubernetesJobConfig({
|
|
310
|
+
KUBERNETES_PLATFORM: env.KUBERNETES_PLATFORM,
|
|
311
|
+
KUBERNETES_RUN_PRIORITY_CLASS: env.NATIVE_SANDBOX_PRIORITY_CLASS?.trim() || env.KUBERNETES_RUN_PRIORITY_CLASS,
|
|
312
|
+
});
|
|
313
|
+
if (platformProfile(cluster.platform).requiresGvisor && runtimeClassName !== GVISOR_RUNTIME_CLASS) {
|
|
314
|
+
throw new Error(`KUBERNETES_PLATFORM=${cluster.platform} runs native workers only under gVisor: set NATIVE_SANDBOX_RUNTIME_CLASS (or KUBERNETES_RUNTIME_CLASS) to ${GVISOR_RUNTIME_CLASS} (found ${runtimeClassName ?? "unset"}).`);
|
|
315
|
+
}
|
|
316
|
+
return {
|
|
317
|
+
launcher,
|
|
318
|
+
...common,
|
|
319
|
+
namespace,
|
|
320
|
+
gatewayService: env.NATIVE_GATEWAY_SERVICE?.trim() || DEFAULT_NATIVE_GATEWAY_SERVICE,
|
|
321
|
+
platform: cluster.platform,
|
|
322
|
+
...(context ? { context } : {}),
|
|
323
|
+
...(runtimeClassName ? { runtimeClassName } : {}),
|
|
324
|
+
...optionalField("priorityClassName", cluster.priorityClassName),
|
|
325
|
+
...optionalField("readyTimeoutMs", optionalBoundedInteger(env.NATIVE_SANDBOX_READY_TIMEOUT_MS, "NATIVE_SANDBOX_READY_TIMEOUT_MS", 1_000, 1_800_000)),
|
|
326
|
+
...optionalField("enforcementTimeoutMs", optionalBoundedInteger(env.NATIVE_SANDBOX_ENFORCEMENT_TIMEOUT_MS, "NATIVE_SANDBOX_ENFORCEMENT_TIMEOUT_MS", 1_000, 600_000)),
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
const gatewayContainer = env.NATIVE_GATEWAY_CONTAINER?.trim();
|
|
330
|
+
if (!gatewayContainer)
|
|
331
|
+
throw new Error("NATIVE_GATEWAY_CONTAINER is required when NATIVE_SANDBOX_LAUNCHER=docker.");
|
|
332
|
+
return { launcher, ...common, gatewayContainer };
|
|
333
|
+
}
|
|
203
334
|
export function loadShutdownDrainSeconds(env = process.env) {
|
|
204
335
|
const value = env.SHUTDOWN_DRAIN_SECONDS?.trim();
|
|
205
336
|
if (!value)
|
|
@@ -293,6 +424,7 @@ export function loadAuthConfig(env = process.env) {
|
|
|
293
424
|
signingKey: env.AUTH_SIGNING_KEY,
|
|
294
425
|
credentialHashKey: env.AUTH_CREDENTIAL_HASH_KEY,
|
|
295
426
|
maxClients: env.AUTH_MAX_CLIENTS ? Number(env.AUTH_MAX_CLIENTS) : undefined,
|
|
427
|
+
mobile: loadMobileConfig(env),
|
|
296
428
|
};
|
|
297
429
|
}
|
|
298
430
|
/** Read secret-cipher config (the app-key master key) from the environment. */
|
|
@@ -309,3 +441,7 @@ export function loadDbosConfig(env = process.env) {
|
|
|
309
441
|
executorId: env.DBOS_EXECUTOR_ID ?? crypto.randomUUID(),
|
|
310
442
|
};
|
|
311
443
|
}
|
|
444
|
+
/** `{ [key]: value }` when value is set, else nothing: for spreading optional fields under exactOptionalPropertyTypes. */
|
|
445
|
+
function optionalField(key, value) {
|
|
446
|
+
return (value === undefined ? {} : { [key]: value });
|
|
447
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/** SHA-256 (hex) of the SPKI DER of the simulator's test GitHub App key (tools/wardby-sim/fixtures). */
|
|
2
|
+
export declare const SIMULATOR_GITHUB_APP_KEY_FINGERPRINT = "dac6c80f55da011bbd2ed5868c61972f778853069f125946964e093e51a7d141";
|
|
3
|
+
/** Where each simulated service is mounted under WARDBY_SIM_BASE_URL. */
|
|
4
|
+
export declare const SIMULATOR_PREFIXES: {
|
|
5
|
+
readonly "github-api": "/github/api";
|
|
6
|
+
readonly "github-git": "/github/git";
|
|
7
|
+
readonly slack: "/slack/api";
|
|
8
|
+
readonly jira: "/jira";
|
|
9
|
+
readonly npm: "/npm";
|
|
10
|
+
readonly pypi: "/pypi";
|
|
11
|
+
readonly "pypi-files": "/pypi-files";
|
|
12
|
+
readonly osv: "/osv";
|
|
13
|
+
/** The scripted model (tools/wardby-sim/src/model): /model/anthropic and /model/openai. */
|
|
14
|
+
readonly model: "/model";
|
|
15
|
+
};
|
|
16
|
+
export type SimulatedService = keyof typeof SIMULATOR_PREFIXES;
|
|
17
|
+
/** The real upstream host each registry simulator stands in for. */
|
|
18
|
+
export declare const SIMULATED_REGISTRY_HOSTS: Readonly<Record<string, SimulatedService>>;
|
|
19
|
+
export type TestSimulatorsRefusal = "partial" | "flag_value" | "release_image" | "base_url_invalid" | "base_url_credentials" | "base_url_form" | "base_host_not_local" | "node_env_production" | "github_app_key_not_simulator" | "github_oauth_not_simulator" | "slack_token_not_simulator" | "jira_token_not_simulator" | "jira_needs_https" | "public_hostname" | "model_mock_conflict" | "ca_file_invalid" | "bedrock_not_simulated";
|
|
20
|
+
export declare class TestSimulatorsRefused extends Error {
|
|
21
|
+
readonly reason: TestSimulatorsRefusal;
|
|
22
|
+
constructor(reason: TestSimulatorsRefusal);
|
|
23
|
+
}
|
|
24
|
+
export interface TestSimulators {
|
|
25
|
+
/**
|
|
26
|
+
* WARDBY_SIM_CA_FILE: the simulator's throwaway CA (deploy/kind-coding/sim-ca.sh), trusted by the
|
|
27
|
+
* git commands wardby runs (GIT_SSL_CAINFO) so its https-only git can reach the simulator's
|
|
28
|
+
* git server. Node itself trusts it through NODE_EXTRA_CA_CERTS, set by the test harness.
|
|
29
|
+
*/
|
|
30
|
+
caFile?: string;
|
|
31
|
+
/** The simulator's origin, without a trailing slash ("http://wardby-sim.wardby-sim.svc:8080"). */
|
|
32
|
+
origin: string;
|
|
33
|
+
/** The host, for the startup warning (never carries credentials: those are refused). */
|
|
34
|
+
host: string;
|
|
35
|
+
base(service: SimulatedService): string;
|
|
36
|
+
}
|
|
37
|
+
/** Loopback or cluster-local: the only hosts the simulator may live on. */
|
|
38
|
+
export declare function isLocalSimulatorHost(hostname: string): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* The simulators, or null when the switch is off. Throws TestSimulatorsRefused on any
|
|
41
|
+
* refusal; with the switch off nothing here reads or changes any other setting.
|
|
42
|
+
*/
|
|
43
|
+
export declare function loadTestSimulators(env?: NodeJS.ProcessEnv): TestSimulators | null;
|
|
44
|
+
/** Extra environment for the git commands wardby runs: the simulator's CA, under the switch only. */
|
|
45
|
+
export declare function simulatorGitEnvironment(env?: NodeJS.ProcessEnv): Record<string, string>;
|
|
46
|
+
/** The simulator's base for one service, or null when the switch is off (throws on a refusal). */
|
|
47
|
+
export declare function testSimulatorBase(service: SimulatedService, env?: NodeJS.ProcessEnv): string | null;
|
|
48
|
+
/**
|
|
49
|
+
* The registry upstream fetch under the switch: each real registry host (npm, PyPI, its file
|
|
50
|
+
* host, OSV) is rewritten to its simulator, with the same request; every other host is
|
|
51
|
+
* refused like the pinned fetch refuses it (`blocked`). Only https upstream URLs are taken,
|
|
52
|
+
* as the pinned fetch takes them.
|
|
53
|
+
*/
|
|
54
|
+
export declare function createSimulatorRegistryFetch(simulators: TestSimulators, blocked: () => Error, fetchImpl?: typeof globalThis.fetch): typeof globalThis.fetch;
|
|
55
|
+
/**
|
|
56
|
+
* Process start-up: refuses (throws) on any refusal, and with the switch on logs one loud
|
|
57
|
+
* warning naming the simulator's host only.
|
|
58
|
+
*/
|
|
59
|
+
export declare function startupTestSimulators(component: string, env?: NodeJS.ProcessEnv): TestSimulators | null;
|
|
60
|
+
/** A placeholder the provider SDKs require; createCredentialFreeFetch drops it before sending. */
|
|
61
|
+
export declare const SIMULATOR_PLACEHOLDER_API_KEY = "sim-placeholder-not-a-credential";
|
|
62
|
+
/**
|
|
63
|
+
* A fetch to the simulator only: drops every header that can carry a credential, and refuses
|
|
64
|
+
* any URL outside the simulator's origin (`blocked`).
|
|
65
|
+
*/
|
|
66
|
+
export declare function createCredentialFreeFetch(simulators: TestSimulators, blocked: () => Error, fetchImpl?: typeof globalThis.fetch): typeof globalThis.fetch;
|
|
67
|
+
/**
|
|
68
|
+
* The coding proxy's model upstream under the switch: the OpenAI Responses and Anthropic
|
|
69
|
+
* Messages endpoints go to the scripted model, with no credential; every other URL is refused.
|
|
70
|
+
*/
|
|
71
|
+
export declare function createSimulatorModelFetch(simulators: TestSimulators, blocked: () => Error, fetchImpl?: typeof globalThis.fetch): typeof globalThis.fetch;
|
|
72
|
+
/**
|
|
73
|
+
* Client options for a native provider SDK under the switch (null when off): the scripted
|
|
74
|
+
* model's base for that provider, a placeholder key, and the credential-free fetch.
|
|
75
|
+
*/
|
|
76
|
+
export declare function simulatorModelClientOptions(provider: "anthropic" | "openai", env?: NodeJS.ProcessEnv): {
|
|
77
|
+
baseURL: string;
|
|
78
|
+
apiKey: string;
|
|
79
|
+
fetch: typeof globalThis.fetch;
|
|
80
|
+
} | null;
|
|
81
|
+
/** Bedrock signs with AWS credentials and cannot be pointed at the simulator: refused under the switch. */
|
|
82
|
+
export declare function refuseBedrockUnderTestSimulators(env?: NodeJS.ProcessEnv): void;
|