@wardby/cli 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/deploy/local/docker-compose.quickstart-coding.yml +13 -0
- package/dist/claude-coding-worker/driver.d.ts +21 -3
- package/dist/claude-coding-worker/driver.js +125 -17
- package/dist/claude-coding-worker/main.js +34 -6
- package/dist/claude-coding-worker/sdk.js +12 -1
- package/dist/claude-coding-worker/tool-socket.d.ts +27 -0
- package/dist/claude-coding-worker/tool-socket.js +111 -0
- package/dist/claude-coding-worker/transcript.d.ts +18 -0
- package/dist/claude-coding-worker/transcript.js +77 -0
- package/dist/cli-help.d.ts +1 -1
- package/dist/cli-help.js +1 -0
- package/dist/cli.js +24 -10
- package/dist/coding/continuation-wording.d.ts +35 -0
- package/dist/coding/continuation-wording.js +73 -0
- package/dist/coding/linked-issue-note.d.ts +23 -0
- package/dist/coding/linked-issue-note.js +47 -0
- package/dist/coding/merge-wording.d.ts +28 -0
- package/dist/coding/merge-wording.js +78 -0
- package/dist/coding/pr-description-note.d.ts +9 -0
- package/dist/coding/pr-description-note.js +32 -0
- package/dist/coding/profile.d.ts +46 -126
- package/dist/coding/profile.js +45 -4
- package/dist/coding/protected-path-wording.d.ts +8 -0
- package/dist/coding/protected-path-wording.js +1 -1
- package/dist/coding/protocol.d.ts +264 -346
- package/dist/coding/protocol.js +235 -12
- package/dist/coding/redact.d.ts +3 -0
- package/dist/coding/redact.js +12 -0
- package/dist/coding/registry/allowlist.d.ts +12 -0
- package/dist/coding/registry/allowlist.js +14 -1
- package/dist/coding/registry/audit-mode.d.ts +153 -0
- package/dist/coding/registry/audit-mode.js +304 -0
- package/dist/coding/registry/lockfile-shared.d.ts +36 -0
- package/dist/coding/registry/lockfile-shared.js +128 -0
- package/dist/coding/registry/lockfiles.js +1 -1
- package/dist/coding/registry/npm-lockfile-formats.d.ts +11 -0
- package/dist/coding/registry/npm-lockfile-formats.js +41 -0
- package/dist/coding/registry/npm-lockfile.d.ts +8 -4
- package/dist/coding/registry/npm-lockfile.js +4 -6
- package/dist/coding/registry/npm.js +78 -8
- package/dist/coding/registry/pnpm-lockfile.d.ts +17 -0
- package/dist/coding/registry/pnpm-lockfile.js +189 -0
- package/dist/coding/registry/pypi-plan.d.ts +50 -0
- package/dist/coding/registry/pypi-plan.js +406 -0
- package/dist/coding/registry/pypi-requirements.d.ts +58 -0
- package/dist/coding/registry/pypi-requirements.js +155 -0
- package/dist/coding/registry/pypi.d.ts +3 -27
- package/dist/coding/registry/pypi.js +40 -154
- package/dist/coding/registry/refusal-hints.d.ts +20 -0
- package/dist/coding/registry/refusal-hints.js +61 -0
- package/dist/coding/registry/refusal-wording.d.ts +11 -0
- package/dist/coding/registry/refusal-wording.js +56 -0
- package/dist/coding/registry/report.d.ts +70 -8
- package/dist/coding/registry/report.js +112 -5
- package/dist/coding/registry/types.d.ts +58 -8
- package/dist/coding/registry/yarn-lockfile.d.ts +30 -0
- package/dist/coding/registry/yarn-lockfile.js +367 -0
- package/dist/coding/services/catalog.d.ts +37 -351
- package/dist/coding/transcript/claude-code.d.ts +13 -0
- package/dist/coding/transcript/claude-code.js +273 -0
- package/dist/coding/transcript/download-protocol.d.ts +30 -0
- package/dist/coding/transcript/download-protocol.js +18 -0
- package/dist/coding/transcript/format.d.ts +20 -0
- package/dist/coding/transcript/format.js +32 -0
- package/dist/coding/transcript/recorder.d.ts +51 -0
- package/dist/coding/transcript/recorder.js +225 -0
- package/dist/coding/transcript/resume/checkout.d.ts +31 -0
- package/dist/coding/transcript/resume/checkout.js +203 -0
- package/dist/coding/transcript/resume/command.d.ts +17 -0
- package/dist/coding/transcript/resume/command.js +176 -0
- package/dist/coding/transcript/resume/download.d.ts +20 -0
- package/dist/coding/transcript/resume/download.js +153 -0
- package/dist/coding/transcript/resume/launch.d.ts +38 -0
- package/dist/coding/transcript/resume/launch.js +128 -0
- package/dist/coding/transcript/resume/session-file.d.ts +13 -0
- package/dist/coding/transcript/resume/session-file.js +79 -0
- package/dist/coding/transcript/resume/stand-in.d.ts +11 -0
- package/dist/coding/transcript/resume/stand-in.js +49 -0
- package/dist/coding-worker/artifact.d.ts +8 -3
- package/dist/coding-worker/artifact.js +3 -1
- package/dist/coding-worker/debug-trace.d.ts +6 -5
- package/dist/coding-worker/debug-trace.js +13 -18
- package/dist/coding-worker/dependency-cache.d.mts +229 -0
- package/dist/coding-worker/dependency-cache.mjs +2123 -0
- package/dist/coding-worker/driver.d.ts +4 -3
- package/dist/coding-worker/driver.js +116 -38
- package/dist/coding-worker/errors.d.ts +1 -0
- package/dist/coding-worker/errors.js +32 -0
- package/dist/coding-worker/task-note.d.ts +11 -0
- package/dist/coding-worker/task-note.js +13 -0
- package/dist/coding-worker/types.d.ts +11 -0
- package/dist/config/dependency-cache.d.ts +23 -0
- package/dist/config/dependency-cache.js +32 -0
- package/dist/config/providers.d.ts +12 -3
- package/dist/config/providers.js +55 -5
- package/dist/config/test-simulators.d.ts +82 -0
- package/dist/config/test-simulators.js +305 -0
- package/dist/core/async-context.d.ts +2 -0
- package/dist/core/async-context.js +12 -0
- package/dist/core/budget-events.d.ts +108 -0
- package/dist/core/budget-events.js +346 -0
- package/dist/core/budget-groups.d.ts +50 -1
- package/dist/core/budget-groups.js +236 -27
- package/dist/core/budget-stopped-head.d.ts +46 -0
- package/dist/core/budget-stopped-head.js +81 -0
- package/dist/core/budget-topup.d.ts +51 -0
- package/dist/core/budget-topup.js +156 -0
- package/dist/core/budget-wording.d.ts +16 -2
- package/dist/core/budget-wording.js +40 -2
- package/dist/core/coding-queue.d.ts +2 -1
- package/dist/core/coding-queue.js +7 -0
- package/dist/core/cron.d.ts +19 -1
- package/dist/core/cron.js +17 -0
- package/dist/core/datastores.js +1 -1
- package/dist/core/deferred-coding.d.ts +14 -0
- package/dist/core/deferred-coding.js +62 -0
- package/dist/core/delegation-child.d.ts +25 -0
- package/dist/core/delegation-child.js +37 -0
- package/dist/core/dispatch.d.ts +42 -0
- package/dist/core/dispatch.js +131 -56
- package/dist/core/engine-native.js +1 -1
- package/dist/core/error-code.d.ts +38 -0
- package/dist/core/error-code.js +168 -0
- package/dist/core/grants.d.ts +19 -6
- package/dist/core/grants.js +55 -6
- package/dist/core/host-events.d.ts +18 -2
- package/dist/core/host-events.js +284 -24
- package/dist/core/host-status.d.ts +85 -3
- package/dist/core/host-status.js +298 -20
- package/dist/core/issue-bridge.d.ts +50 -6
- package/dist/core/issue-bridge.js +124 -33
- package/dist/core/issue-events.d.ts +1 -1
- package/dist/core/issue-events.js +4 -10
- package/dist/core/issue-status.d.ts +1 -1
- package/dist/core/issue-status.js +54 -26
- package/dist/core/logger.d.ts +5 -0
- package/dist/core/logger.js +14 -1
- package/dist/core/lost-run-children.d.ts +6 -0
- package/dist/core/lost-run-children.js +32 -0
- package/dist/core/mark-ready.d.ts +34 -0
- package/dist/core/mark-ready.js +152 -0
- package/dist/core/markdown-code.d.ts +8 -0
- package/dist/core/markdown-code.js +107 -0
- package/dist/core/memory-tools.js +7 -0
- package/dist/core/merge-order-check.d.ts +2 -1
- package/dist/core/merge-order-check.js +8 -1
- package/dist/core/notification-templates.d.ts +1 -7
- package/dist/core/notification-templates.js +36 -2
- package/dist/core/pull-request-state-sync.js +2 -2
- package/dist/core/reconciler.d.ts +4 -3
- package/dist/core/reconciler.js +8 -1
- package/dist/core/related-pull-requests.d.ts +11 -3
- package/dist/core/related-pull-requests.js +27 -14
- package/dist/core/reply-parts.d.ts +21 -0
- package/dist/core/reply-parts.js +73 -0
- package/dist/core/review-fix.d.ts +1 -1
- package/dist/core/review-fix.js +2 -1
- package/dist/core/review-host-checks.d.ts +1 -1
- package/dist/core/review-host-tools.d.ts +3 -0
- package/dist/core/review-host-tools.js +99 -13
- package/dist/core/review-reads.d.ts +55 -0
- package/dist/core/review-reads.js +233 -0
- package/dist/core/run-status.d.ts +12 -0
- package/dist/core/run-status.js +12 -0
- package/dist/core/runner.d.ts +80 -34
- package/dist/core/runner.js +439 -144
- package/dist/core/schedule-start.d.ts +12 -0
- package/dist/core/schedule-start.js +14 -0
- package/dist/core/secret-broker-config.d.ts +10 -74
- package/dist/core/secret-guard.d.ts +46 -0
- package/dist/core/secret-guard.js +104 -0
- package/dist/core/secret-guarded-stores.d.ts +12 -0
- package/dist/core/secret-guarded-stores.js +41 -0
- package/dist/core/secret-spans.d.ts +50 -0
- package/dist/core/secret-spans.js +94 -0
- package/dist/core/stop-run.d.ts +46 -0
- package/dist/core/stop-run.js +61 -0
- package/dist/core/workflow-events.d.ts +14 -2
- package/dist/core/workflow-events.js +4 -0
- package/dist/core/workflow-run-events.d.ts +5 -3
- package/dist/core/workflow-run-events.js +43 -8
- package/dist/core/zod-json-schema.d.ts +4 -0
- package/dist/core/zod-json-schema.js +39 -0
- package/dist/core/zod3-window.d.ts +35 -0
- package/dist/core/zod3-window.js +124 -0
- package/dist/generated/prisma/browser.d.ts +34 -3
- package/dist/generated/prisma/client.d.ts +34 -3
- package/dist/generated/prisma/commonInputTypes.d.ts +220 -60
- package/dist/generated/prisma/enums.d.ts +10 -0
- package/dist/generated/prisma/enums.js +8 -0
- package/dist/generated/prisma/internal/class.d.ts +44 -0
- package/dist/generated/prisma/internal/class.js +4 -4
- package/dist/generated/prisma/internal/prismaNamespace.d.ts +428 -9
- package/dist/generated/prisma/internal/prismaNamespace.js +92 -1
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +95 -0
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +92 -1
- package/dist/generated/prisma/models/Agent.d.ts +106 -8
- package/dist/generated/prisma/models/AgentRepository.d.ts +42 -1
- package/dist/generated/prisma/models/CodingAgentProfile.d.ts +229 -1
- package/dist/generated/prisma/models/CodingProxyRequest.d.ts +207 -3
- package/dist/generated/prisma/models/CodingProxySession.d.ts +114 -1
- package/dist/generated/prisma/models/CodingRun.d.ts +1637 -1
- package/dist/generated/prisma/models/DependencySnapshot.d.ts +1668 -0
- package/dist/generated/prisma/models/DependencySnapshot.js +1 -0
- package/dist/generated/prisma/models/IssuePullRequest.d.ts +6 -2
- package/dist/generated/prisma/models/LocalReview.d.ts +40 -1
- package/dist/generated/prisma/models/NativeGatewayCall.d.ts +39 -1
- package/dist/generated/prisma/models/NativeGatewaySession.d.ts +35 -1
- package/dist/generated/prisma/models/RegistryAllowance.d.ts +41 -1
- package/dist/generated/prisma/models/RegistryApprovedVersion.d.ts +75 -1
- package/dist/generated/prisma/models/RegistryAuditRecord.d.ts +1364 -0
- package/dist/generated/prisma/models/RegistryAuditRecord.js +1 -0
- package/dist/generated/prisma/models/Run.d.ts +738 -2
- package/dist/generated/prisma/models/RunBudgetEvent.d.ts +1211 -0
- package/dist/generated/prisma/models/RunBudgetEvent.js +1 -0
- package/dist/generated/prisma/models/RunTranscript.d.ts +1339 -0
- package/dist/generated/prisma/models/RunTranscript.js +1 -0
- package/dist/generated/prisma/models.d.ts +4 -0
- package/dist/help-index.json +1320 -69
- package/dist/import/create.js +32 -3
- package/dist/import/neutral-schema.d.ts +50 -281
- package/dist/import/neutral-schema.js +5 -4
- package/dist/knowledge/check.d.ts +1 -1
- package/dist/knowledge/cli.d.ts +11 -1
- package/dist/knowledge/cli.js +37 -4
- package/dist/knowledge/concept.d.ts +3 -19
- package/dist/knowledge/location.d.ts +31 -0
- package/dist/knowledge/location.js +78 -0
- package/dist/mcp/auth/access.d.ts +10 -2
- package/dist/mcp/auth/access.js +15 -1
- package/dist/mcp/auth/ownership.d.ts +7 -7
- package/dist/mcp/auth/self-hosted/credentials.d.ts +3 -3
- package/dist/mcp/auth/self-hosted/session.d.ts +2 -2
- package/dist/mcp/host-events/github-ingress.d.ts +2 -0
- package/dist/mcp/host-events/github-ingress.js +2 -1
- package/dist/mcp/index.d.ts +6 -0
- package/dist/mcp/index.js +58 -10
- package/dist/mcp/server.d.ts +13 -0
- package/dist/mcp/server.js +33 -14
- package/dist/mcp/tools/agents.d.ts +4 -0
- package/dist/mcp/tools/agents.js +198 -16
- package/dist/mcp/tools/datastore.js +17 -8
- package/dist/mcp/tools/grants.js +9 -3
- package/dist/mcp/tools/memory.js +11 -1
- package/dist/mcp/tools/notification-channels.js +2 -2
- package/dist/mcp/tools/packages.d.ts +2 -0
- package/dist/mcp/tools/packages.js +195 -0
- package/dist/mcp/tools/repositories.js +18 -5
- package/dist/mcp/tools/run-access.d.ts +16 -0
- package/dist/mcp/tools/run-access.js +25 -0
- package/dist/mcp/tools/run-transcript-download.d.ts +30 -0
- package/dist/mcp/tools/run-transcript-download.js +129 -0
- package/dist/mcp/tools/run-transcript.d.ts +19 -0
- package/dist/mcp/tools/run-transcript.js +70 -0
- package/dist/mcp/tools/runs.js +34 -12
- package/dist/mcp/tools/scheduling.js +3 -1
- package/dist/mcp/tools/secret-elicitation-form.js +5 -0
- package/dist/mcp/tools/secret-elicitation-server.d.ts +6 -0
- package/dist/mcp/tools/secret-elicitation-server.js +10 -61
- package/dist/mcp/tools/secrets.js +2 -2
- package/dist/mcp/tools/stop-run.d.ts +2 -0
- package/dist/mcp/tools/stop-run.js +82 -0
- package/dist/mcp/tools/subagents.js +2 -2
- package/dist/mcp/tools/tools.d.ts +1 -1
- package/dist/mcp/tools/tools.js +25 -9
- package/dist/mcp/transport/stdio-link-host.d.ts +20 -0
- package/dist/mcp/transport/stdio-link-host.js +67 -0
- package/dist/mcp/transport/streamable-http.d.ts +13 -0
- package/dist/mcp/transport/streamable-http.js +41 -1
- package/dist/native-worker/docker-launcher.d.ts +38 -2
- package/dist/native-worker/docker-launcher.js +65 -5
- package/dist/native-worker/gateway-server.d.ts +41 -3
- package/dist/native-worker/gateway-server.js +124 -27
- package/dist/native-worker/gateway.d.ts +27 -1
- package/dist/native-worker/gateway.js +70 -4
- package/dist/native-worker/http-server.d.ts +3 -1
- package/dist/native-worker/http-server.js +11 -7
- package/dist/native-worker/http-transport.js +1 -1
- package/dist/native-worker/kubernetes-launcher.d.ts +7 -3
- package/dist/native-worker/kubernetes-launcher.js +43 -3
- package/dist/native-worker/launch.d.ts +18 -1
- package/dist/native-worker/launch.js +6 -1
- package/dist/native-worker/ledger.d.ts +18 -2
- package/dist/native-worker/ledger.js +57 -4
- package/dist/native-worker/loopback.js +3 -8
- package/dist/native-worker/main.d.ts +2 -1
- package/dist/native-worker/main.js +14 -3
- package/dist/native-worker/protocol.d.ts +129 -577
- package/dist/native-worker/protocol.js +47 -1
- package/dist/native-worker/sandbox-executor.d.ts +17 -2
- package/dist/native-worker/sandbox-executor.js +78 -4
- package/dist/native-worker/stderr-redaction.d.ts +77 -0
- package/dist/native-worker/stderr-redaction.js +237 -0
- package/dist/native-worker/stdio.d.ts +1 -1
- package/dist/native-worker/stdio.js +6 -5
- package/dist/native-worker/warm-pool.d.ts +2 -2
- package/dist/native-worker/warm-pool.js +4 -4
- package/dist/native-worker/worker.js +28 -2
- package/dist/observability/metrics.js +6 -1
- package/dist/providers/auth/self-hosted.d.ts +1 -1
- package/dist/providers/coding-proxy/dependency-cache/eviction.d.ts +29 -0
- package/dist/providers/coding-proxy/dependency-cache/eviction.js +87 -0
- package/dist/providers/coding-proxy/dependency-cache/key.d.ts +33 -0
- package/dist/providers/coding-proxy/dependency-cache/key.js +86 -0
- package/dist/providers/coding-proxy/dependency-cache/model-request-seal.d.ts +18 -0
- package/dist/providers/coding-proxy/dependency-cache/model-request-seal.js +40 -0
- package/dist/providers/coding-proxy/dependency-cache/prisma-store.d.ts +25 -0
- package/dist/providers/coding-proxy/dependency-cache/prisma-store.js +131 -0
- package/dist/providers/coding-proxy/dependency-cache/service.d.ts +70 -0
- package/dist/providers/coding-proxy/dependency-cache/service.js +409 -0
- package/dist/providers/coding-proxy/dependency-cache/store.d.ts +85 -0
- package/dist/providers/coding-proxy/dependency-cache/store.js +95 -0
- package/dist/providers/coding-proxy/hold.d.ts +32 -0
- package/dist/providers/coding-proxy/hold.js +86 -0
- package/dist/providers/coding-proxy/interrupted.d.ts +70 -0
- package/dist/providers/coding-proxy/interrupted.js +104 -0
- package/dist/providers/coding-proxy/memory-ledger.d.ts +15 -2
- package/dist/providers/coding-proxy/memory-ledger.js +84 -8
- package/dist/providers/coding-proxy/metering.d.ts +16 -0
- package/dist/providers/coding-proxy/metering.js +27 -4
- package/dist/providers/coding-proxy/prisma-ledger.d.ts +15 -2
- package/dist/providers/coding-proxy/prisma-ledger.js +179 -67
- package/dist/providers/coding-proxy/proxy.d.ts +14 -1
- package/dist/providers/coding-proxy/proxy.js +166 -14
- package/dist/providers/coding-proxy/registry/audit.d.ts +53 -10
- package/dist/providers/coding-proxy/registry/audit.js +94 -17
- package/dist/providers/coding-proxy/registry/lockfile-parse-worker.d.ts +36 -0
- package/dist/providers/coding-proxy/registry/lockfile-parse-worker.js +67 -0
- package/dist/providers/coding-proxy/registry/lockfile-parse.d.ts +16 -0
- package/dist/providers/coding-proxy/registry/lockfile-parse.js +110 -0
- package/dist/providers/coding-proxy/registry/plan.d.ts +9 -0
- package/dist/providers/coding-proxy/registry/plan.js +201 -48
- package/dist/providers/coding-proxy/registry/prisma-store.d.ts +11 -5
- package/dist/providers/coding-proxy/registry/prisma-store.js +120 -17
- package/dist/providers/coding-proxy/registry/service.d.ts +97 -16
- package/dist/providers/coding-proxy/registry/service.js +579 -112
- package/dist/providers/coding-proxy/registry/store.d.ts +84 -9
- package/dist/providers/coding-proxy/registry/store.js +54 -1
- package/dist/providers/coding-proxy/runtime.d.ts +4 -0
- package/dist/providers/coding-proxy/runtime.js +78 -16
- package/dist/providers/coding-proxy/server.d.ts +6 -1
- package/dist/providers/coding-proxy/server.js +45 -1
- package/dist/providers/coding-proxy/types.d.ts +65 -1
- package/dist/providers/datastore/types.d.ts +5 -0
- package/dist/providers/engine/types.d.ts +17 -2
- package/dist/providers/engine/types.js +17 -0
- package/dist/providers/executor/composition.d.ts +10 -3
- package/dist/providers/executor/composition.js +47 -7
- package/dist/providers/executor/container.d.ts +361 -8
- package/dist/providers/executor/container.js +1136 -91
- package/dist/providers/executor/dbos-status.d.ts +31 -0
- package/dist/providers/executor/dbos-status.js +64 -0
- package/dist/providers/executor/dbos.d.ts +50 -1
- package/dist/providers/executor/dbos.js +207 -20
- package/dist/providers/executor/deferred.d.ts +12 -24
- package/dist/providers/executor/deferred.js +10 -29
- package/dist/providers/executor/in-process.d.ts +9 -1
- package/dist/providers/executor/in-process.js +14 -4
- package/dist/providers/executor/linked-issue-reader.d.ts +16 -0
- package/dist/providers/executor/linked-issue-reader.js +30 -0
- package/dist/providers/executor/routing.d.ts +2 -0
- package/dist/providers/executor/routing.js +4 -0
- package/dist/providers/executor/types.d.ts +13 -0
- package/dist/providers/index.d.ts +2 -1
- package/dist/providers/issue-tracker/types.d.ts +17 -0
- package/dist/providers/issue-tracker/types.js +39 -1
- package/dist/providers/jobs/claude-tool-setup.d.ts +4 -0
- package/dist/providers/jobs/claude-tool-setup.js +5 -2
- package/dist/providers/jobs/docker-isolation.d.ts +8 -0
- package/dist/providers/jobs/docker-isolation.js +17 -0
- package/dist/providers/jobs/docker.d.ts +1 -0
- package/dist/providers/jobs/docker.js +27 -2
- package/dist/providers/jobs/fake-kubernetes-api.d.ts +2 -0
- package/dist/providers/jobs/fake-kubernetes-api.js +3 -0
- package/dist/providers/jobs/kubernetes-api.d.ts +8 -0
- package/dist/providers/jobs/kubernetes-api.js +10 -0
- package/dist/providers/jobs/kubernetes-client.js +10 -1
- package/dist/providers/jobs/kubernetes-isolation.d.ts +2 -0
- package/dist/providers/jobs/kubernetes-isolation.js +17 -1
- package/dist/providers/jobs/kubernetes.d.ts +6 -1
- package/dist/providers/jobs/kubernetes.js +105 -16
- package/dist/providers/jobs/types.d.ts +33 -0
- package/dist/providers/jobs/types.js +13 -1
- package/dist/providers/llm/anthropic.js +5 -1
- package/dist/providers/llm/bedrock.d.ts +0 -12
- package/dist/providers/llm/bedrock.js +4 -0
- package/dist/providers/llm/claude-messages.d.ts +3 -1
- package/dist/providers/llm/claude-messages.js +4 -1
- package/dist/providers/llm/claude-provider.d.ts +2 -2
- package/dist/providers/llm/claude-provider.js +2 -2
- package/dist/providers/llm/openai.d.ts +2 -2
- package/dist/providers/llm/openai.js +6 -2
- package/dist/providers/llm/routing.d.ts +2 -2
- package/dist/providers/llm/routing.js +2 -2
- package/dist/providers/llm/types.d.ts +12 -2
- package/dist/providers/review-host/github-events.d.ts +9 -1
- package/dist/providers/review-host/github-events.js +34 -12
- package/dist/providers/review-host/github.d.ts +29 -2
- package/dist/providers/review-host/github.js +224 -29
- package/dist/providers/review-host/local.d.ts +8 -4
- package/dist/providers/review-host/local.js +49 -31
- package/dist/providers/review-host/patch-pages.d.ts +41 -0
- package/dist/providers/review-host/patch-pages.js +176 -0
- package/dist/providers/review-host/review-format.d.ts +19 -1
- package/dist/providers/review-host/review-format.js +38 -7
- package/dist/providers/review-host/types.d.ts +134 -2
- package/dist/providers/review-host/types.js +8 -0
- package/dist/providers/storage/gcs.d.ts +63 -0
- package/dist/providers/storage/gcs.js +69 -0
- package/dist/providers/storage/index.d.ts +15 -0
- package/dist/providers/storage/index.js +14 -0
- package/dist/providers/storage/local.d.ts +24 -0
- package/dist/providers/storage/local.js +92 -0
- package/dist/providers/storage/meter.d.ts +14 -0
- package/dist/providers/storage/meter.js +34 -0
- package/dist/providers/storage/s3.d.ts +41 -0
- package/dist/providers/storage/s3.js +107 -0
- package/dist/providers/storage/types.d.ts +37 -3
- package/dist/providers/storage/types.js +21 -4
- package/dist/providers/vcs/git.d.ts +33 -2
- package/dist/providers/vcs/git.js +324 -22
- package/dist/providers/vcs/github-remote.d.ts +26 -3
- package/dist/providers/vcs/github-remote.js +124 -14
- package/dist/providers/vcs/github.d.ts +214 -6
- package/dist/providers/vcs/github.js +447 -45
- package/dist/providers/vcs/index.js +8 -1
- package/dist/providers/vcs/pr-description.d.ts +127 -0
- package/dist/providers/vcs/pr-description.js +270 -0
- package/dist/providers/vcs/remote.d.ts +33 -1
- package/dist/providers/vcs/routing.d.ts +4 -2
- package/dist/providers/vcs/routing.js +6 -0
- package/dist/providers/vcs/types.d.ts +80 -3
- package/dist/quickstart/coding-seed.d.ts +14 -3
- package/dist/quickstart/coding-seed.js +213 -4
- package/dist/quickstart/reviewer-prompt.d.ts +1 -1
- package/dist/quickstart/reviewer-prompt.js +6 -6
- package/dist/quickstart-images.json +1 -1
- package/dist/sandbox/generated/zod.bundle.js +62 -1
- package/dist/sandbox/generated/zod3.bundle.js +5 -0
- package/dist/sandbox/host-functions.d.ts +1 -0
- package/dist/sandbox/host-functions.js +6 -11
- package/dist/sandbox/secret-broker.js +3 -4
- package/dist/sandbox/tool-capabilities.d.ts +10 -30
- package/dist/sandbox/zod-params.d.ts +37 -5
- package/dist/sandbox/zod-params.js +181 -26
- package/dist/serve.js +8 -1
- package/dist/viewer/api-schema.d.ts +349 -2627
- package/dist/viewer/api-schema.js +7 -0
- package/dist/viewer/build-schemas.js +6 -2
- package/dist/viewer/openapi.js +2 -4
- package/dist/wardby-bin.js +10 -0
- package/docs/agent-recipes.md +58 -20
- package/docs/code-review-agents.md +551 -41
- package/docs/coding-agent-setup.md +489 -7
- package/docs/coding-packages.md +1033 -90
- package/docs/coding-services.md +27 -12
- package/docs/coding-worker-byo-images.md +20 -0
- package/docs/coding-worker-isolation.md +105 -30
- package/docs/getting-started-gke.md +124 -137
- package/docs/getting-started-identity-provider.md +10 -1
- package/docs/getting-started.md +9 -0
- package/docs/jira-agents.md +17 -8
- package/docs/knowledge/blob-not-found-semantics.md +41 -0
- package/docs/knowledge/bounded-file-descriptor.md +52 -0
- package/docs/knowledge/delegation-admission-slots.md +52 -0
- package/docs/knowledge/http-dispatcher-bootstrap.md +61 -0
- package/docs/knowledge/import-rename-target.md +52 -0
- package/docs/knowledge/index.md +57 -0
- package/docs/knowledge/log.md +9 -0
- package/docs/knowledge/mcp-cancelled-task-precedence.md +41 -0
- package/docs/knowledge/mcp-http-prompt-discovery.md +41 -0
- package/docs/knowledge/mcp-schema-module-boundary.md +41 -0
- package/docs/knowledge/nullable-tool-uniqueness.md +52 -0
- package/docs/knowledge/overview-cli.md +74 -0
- package/docs/knowledge/overview-coding-proxy.md +72 -0
- package/docs/knowledge/overview-coding.md +72 -0
- package/docs/knowledge/overview-config.md +60 -0
- package/docs/knowledge/overview-core.md +72 -0
- package/docs/knowledge/overview-deploy.md +83 -0
- package/docs/knowledge/overview-mcp.md +61 -0
- package/docs/knowledge/overview-prisma.md +72 -0
- package/docs/knowledge/overview-providers.md +89 -0
- package/docs/knowledge/overview-sandbox.md +83 -0
- package/docs/knowledge/overview-surfaces.md +83 -0
- package/docs/knowledge/private-datastore-shared-boundary.md +54 -0
- package/docs/knowledge/proxy-settlement-projections.md +41 -0
- package/docs/knowledge/run-pricing-first-writer.md +43 -0
- package/docs/knowledge/schedule-claim-transaction.md +41 -0
- package/docs/knowledge/secret-entry-replica-contract.md +52 -0
- package/docs/knowledge/terminal-run-first-writer.md +41 -0
- package/docs/knowledge/transactional-agent-authorization.md +52 -0
- package/docs/knowledge/viewer-notify-write-isolation.md +30 -0
- package/docs/knowledge/warm-input-publication.md +30 -0
- package/docs/knowledge/workspace-staging-failure.md +54 -0
- package/docs/knowledge.md +54 -14
- package/docs/native-sandbox.md +119 -23
- package/docs/observability.md +4 -0
- package/docs/security-deployment.md +33 -2
- package/docs/slack-notifications.md +35 -19
- package/docs/tool-secrets.md +42 -10
- package/docs/viewer-api.openapi.yml +1 -1
- package/help/admin-viewer.md +24 -2
- package/help/architecture-agent.md +11 -6
- package/help/build-worker-image.md +3 -1
- package/help/builder-agent.md +19 -6
- package/help/code-review-agents.md +177 -6
- package/help/coding-packages.md +156 -6
- package/help/cost-attribution.md +9 -5
- package/help/creating-agents.md +14 -1
- package/help/dependency-cache.md +143 -0
- package/help/deploy-gke.md +15 -8
- package/help/errors/budget-exhausted.md +187 -0
- package/help/errors/budget-group-exhausted.md +5 -1
- package/help/errors/coding-stream-quota-exceeded.md +33 -0
- package/help/errors/coding-workspace-disk-exceeds-limit.md +39 -0
- package/help/errors/continuation-closed.md +9 -12
- package/help/errors/delegation-conflict.md +24 -0
- package/help/errors/file-list-truncated.md +45 -0
- package/help/errors/full-read-required.md +49 -0
- package/help/errors/github-account-not-allowed.md +4 -0
- package/help/errors/graph-incomplete.md +43 -0
- package/help/errors/graph-limit.md +43 -0
- package/help/errors/merge-conflict.md +49 -0
- package/help/errors/native-sandbox-gateway-error.md +20 -0
- package/help/errors/native-sandbox-launch-abandoned.md +21 -0
- package/help/errors/native-sandbox-worker-exited.md +3 -2
- package/help/errors/package-not-allowed-pending.md +52 -0
- package/help/errors/package-not-allowed.md +51 -0
- package/help/errors/package-refusals.md +43 -0
- package/help/errors/patch-cursor-malformed.md +31 -0
- package/help/errors/run-lost.md +39 -0
- package/help/errors/run-transcript-download.md +44 -0
- package/help/errors/secret-in-value.md +69 -0
- package/help/errors/target-merge.md +40 -0
- package/help/fix-merge-conflicts.md +73 -0
- package/help/github-app-setup.md +132 -0
- package/help/github.md +22 -0
- package/help/identity-and-access.md +2 -0
- package/help/jira.md +23 -6
- package/help/knowledge.md +16 -7
- package/help/local-repositories.md +1 -1
- package/help/low-power-mode.md +7 -1
- package/help/merge-order-check.md +5 -0
- package/help/native-capabilities.md +29 -1
- package/help/native-sandbox.md +15 -1
- package/help/operating-agents.md +5 -0
- package/help/package-audit-mode.md +91 -0
- package/help/related-pull-requests.md +10 -7
- package/help/resume-runs-locally.md +131 -0
- package/help/review-fix-rounds.md +33 -1
- package/help/sharing-agents.md +59 -0
- package/help/slack-notifications.md +19 -5
- package/help/status-comments.md +31 -0
- package/help/stop-run.md +58 -0
- package/help/troubleshooting/budgets.md +28 -0
- package/help/troubleshooting/coding-workers.md +78 -7
- package/package.json +17 -10
- package/prisma/migrations/20261016000000_registry_approved_accepted_advisories/migration.sql +3 -0
- package/prisma/migrations/20261016000001_mark_ready_when_passing/migration.sql +3 -0
- package/prisma/migrations/20261017000000_debug_trace_max_mb/migration.sql +4 -0
- package/prisma/migrations/20261018000000_dependency_cache/migration.sql +53 -0
- package/prisma/migrations/20261019000000_claude_max_output_tokens/migration.sql +5 -0
- package/prisma/migrations/20261021000000_pr_description_hash/migration.sql +4 -0
- package/prisma/migrations/20261022000000_dependency_snapshot_validation_metadata/migration.sql +4 -0
- package/prisma/migrations/20261023000000_package_audit_mode/migration.sql +27 -0
- package/prisma/migrations/20261024000000_budget_events/migration.sql +26 -0
- package/prisma/migrations/20261025000000_cache_aware_holds/migration.sql +9 -0
- package/prisma/migrations/20261026000000_budget_overrun/migration.sql +4 -0
- package/prisma/migrations/20261027000000_coding_run_request/migration.sql +1 -0
- package/prisma/migrations/20261028000000_native_gateway_review_reads/migration.sql +6 -0
- package/prisma/migrations/20261029000000_lead_survives_deploy/migration.sql +6 -0
- package/prisma/migrations/20261030000000_local_review_covered_sha/migration.sql +2 -0
- package/prisma/migrations/20261031000000_coding_run_budget_limit/migration.sql +9 -0
- package/prisma/migrations/20261101000000_run_transcripts/migration.sql +22 -0
- package/prisma/schema.prisma +311 -97
- package/dist/sandbox/generated/zod-to-json-schema.bundle.js +0 -5
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Starts Claude Code on the imported session:
|
|
3
|
+
*
|
|
4
|
+
* claude --resume <session file> --mcp-config <stand-in config>
|
|
5
|
+
* [--system-prompt-snapshot off] --append-system-prompt <move note>
|
|
6
|
+
*
|
|
7
|
+
* in the checkout. The MCP config starts the stand-in `wardby_tools` server
|
|
8
|
+
* (stand-in.ts) from this same wardby install, so the run's tool calls
|
|
9
|
+
* render and a call to run_command explains the move.
|
|
10
|
+
*
|
|
11
|
+
* System prompt flags on resume (Claude Code CLI reference, "System prompt
|
|
12
|
+
* flags in resumed conversations"): from v2.1.265 Claude Code records the
|
|
13
|
+
* system prompt on a conversation's first request and reuses it after
|
|
14
|
+
* --resume, so new flag text would apply only after compaction.
|
|
15
|
+
* `--system-prompt-snapshot off` (v2.1.257 and later) rebuilds the prompt on
|
|
16
|
+
* every request, so the note applies. Older versions did not record it
|
|
17
|
+
* while a system prompt flag was passed, so the note applies without it.
|
|
18
|
+
* When the version cannot be read, the flag is included (every current
|
|
19
|
+
* release has it) and the output says to remove it for a version before
|
|
20
|
+
* 2.1.257.
|
|
21
|
+
*/
|
|
22
|
+
import { execFile, spawn } from "node:child_process";
|
|
23
|
+
import { constants } from "node:fs";
|
|
24
|
+
import { open, rename } from "node:fs/promises";
|
|
25
|
+
import { join } from "node:path";
|
|
26
|
+
import { fileURLToPath } from "node:url";
|
|
27
|
+
import { randomBytes } from "node:crypto";
|
|
28
|
+
import { promisify } from "node:util";
|
|
29
|
+
import { STAND_IN_SERVER_NAME } from "./stand-in.js";
|
|
30
|
+
const execFileAsync = promisify(execFile);
|
|
31
|
+
/** Where the run's commands ran in the worker (run_command's workspace, claude-tool-runner/main.mjs). */
|
|
32
|
+
export const WORKER_WORKSPACE = "/workspace";
|
|
33
|
+
/** First Claude Code version with --system-prompt-snapshot. */
|
|
34
|
+
const SNAPSHOT_FLAG_SINCE = [2, 1, 257];
|
|
35
|
+
/** This install's wardby entry point, for the MCP config to start the stand-in with. */
|
|
36
|
+
export function wardbyBinPath() {
|
|
37
|
+
// src/coding/transcript/resume/ and dist/coding/transcript/resume/ are both four levels below the package root.
|
|
38
|
+
return fileURLToPath(new URL("../../../../bin/wardby.js", import.meta.url));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* `runChanges`: true when the checkout is at the run's branch, false when it fell back to the base
|
|
42
|
+
* commit, undefined for --here (the importer did not choose what is checked out).
|
|
43
|
+
*/
|
|
44
|
+
export function moveNote(opts) {
|
|
45
|
+
const changes = opts.runChanges === true
|
|
46
|
+
? "This checkout already contains the run's changes: do not redo them. "
|
|
47
|
+
: opts.runChanges === false
|
|
48
|
+
? "This checkout is at the run's base commit: the run's changes are not in it. "
|
|
49
|
+
: "";
|
|
50
|
+
return (`This conversation was moved from wardby run ${opts.runId} to the user's machine. ` +
|
|
51
|
+
`The worker path ${opts.from} is now ${opts.checkout} (checked out at ${opts.ref}). ` +
|
|
52
|
+
changes +
|
|
53
|
+
`The run_command tool only worked inside the worker and is gone: use your local tools (Bash, Read, Edit) in ${opts.checkout}.`);
|
|
54
|
+
}
|
|
55
|
+
export function mcpConfig(opts) {
|
|
56
|
+
return {
|
|
57
|
+
mcpServers: {
|
|
58
|
+
[STAND_IN_SERVER_NAME]: {
|
|
59
|
+
type: "stdio",
|
|
60
|
+
command: opts.node ?? process.execPath,
|
|
61
|
+
args: [opts.bin ?? wardbyBinPath(), "resume-tools", "--checkout", opts.checkout, "--from", opts.from],
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/** Writes the MCP config next to the session file (mode 0600, atomically). */
|
|
67
|
+
export async function writeMcpConfig(dir, config) {
|
|
68
|
+
const path = join(dir, "mcp-config.json");
|
|
69
|
+
const temp = join(dir, `.mcp-config.${randomBytes(6).toString("hex")}.tmp`);
|
|
70
|
+
const handle = await open(temp, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL, 0o600);
|
|
71
|
+
try {
|
|
72
|
+
await handle.writeFile(`${JSON.stringify(config, null, 2)}\n`);
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
await handle.close();
|
|
76
|
+
}
|
|
77
|
+
await rename(temp, path);
|
|
78
|
+
return path;
|
|
79
|
+
}
|
|
80
|
+
export function parseClaudeVersion(output) {
|
|
81
|
+
const match = /(\d+)\.(\d+)\.(\d+)/.exec(output);
|
|
82
|
+
return match ? [Number(match[1]), Number(match[2]), Number(match[3])] : undefined;
|
|
83
|
+
}
|
|
84
|
+
function atLeast(version, min) {
|
|
85
|
+
for (let i = 0; i < 3; i++)
|
|
86
|
+
if (version[i] !== min[i])
|
|
87
|
+
return version[i] > min[i];
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
/** `claude --version`, or undefined when claude is not on PATH. */
|
|
91
|
+
export async function claudeVersion() {
|
|
92
|
+
try {
|
|
93
|
+
const { stdout } = await execFileAsync("claude", ["--version"], { timeout: 15_000 });
|
|
94
|
+
return stdout.trim();
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export const UNKNOWN_VERSION_NOTE = "Could not read the Claude Code version: the command includes --system-prompt-snapshot off (Claude Code 2.1.257 or later); remove that flag for an older version.";
|
|
101
|
+
export function claudeArgs(opts) {
|
|
102
|
+
// Unknown version (claude missing or unparseable): include it, as every current release supports it.
|
|
103
|
+
const snapshot = !opts.version || atLeast(opts.version, SNAPSHOT_FLAG_SINCE) ? ["--system-prompt-snapshot", "off"] : [];
|
|
104
|
+
return [
|
|
105
|
+
"--resume",
|
|
106
|
+
opts.sessionFile,
|
|
107
|
+
"--mcp-config",
|
|
108
|
+
opts.mcpConfigPath,
|
|
109
|
+
...snapshot,
|
|
110
|
+
"--append-system-prompt",
|
|
111
|
+
opts.note,
|
|
112
|
+
];
|
|
113
|
+
}
|
|
114
|
+
/** POSIX shell quoting, for printing a command the user can paste. */
|
|
115
|
+
export function shellQuote(arg) {
|
|
116
|
+
return /^[A-Za-z0-9_@%+=:,./-]+$/.test(arg) ? arg : `'${arg.replace(/'/g, `'\\''`)}'`;
|
|
117
|
+
}
|
|
118
|
+
export function printableCommand(cwd, args) {
|
|
119
|
+
return `cd ${shellQuote(cwd)} && claude ${args.map(shellQuote).join(" ")}`;
|
|
120
|
+
}
|
|
121
|
+
/** Runs claude in the checkout with this terminal; resolves with its exit code. */
|
|
122
|
+
export function launchClaude(cwd, args) {
|
|
123
|
+
return new Promise((resolve, reject) => {
|
|
124
|
+
const child = spawn("claude", args, { cwd, stdio: "inherit" });
|
|
125
|
+
child.once("error", reject);
|
|
126
|
+
child.once("exit", (code, signal) => resolve(code ?? (signal ? 1 : 0)));
|
|
127
|
+
});
|
|
128
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type DownloadedTranscript } from "./download.js";
|
|
2
|
+
export declare function defaultSessionsRoot(): string;
|
|
3
|
+
export interface SessionFile {
|
|
4
|
+
path: string;
|
|
5
|
+
/** The directory that holds the session file and the MCP config. */
|
|
6
|
+
dir: string;
|
|
7
|
+
/** "written": new; "same": identical file already there; "continued": a local continuation kept; "replaced": --force. */
|
|
8
|
+
outcome: "written" | "same" | "continued" | "replaced";
|
|
9
|
+
}
|
|
10
|
+
export declare function writeSessionFile(transcript: DownloadedTranscript, opts?: {
|
|
11
|
+
root?: string;
|
|
12
|
+
force?: boolean;
|
|
13
|
+
}): Promise<SessionFile>;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Writes a downloaded transcript where `claude --resume <file>` can load it:
|
|
3
|
+
* `<root>/<runId>/<sessionId>.jsonl` (root: ~/.wardby/sessions), the body
|
|
4
|
+
* without wardby's header line, mode 0600, atomically (temp file + rename).
|
|
5
|
+
* Never writes into a Claude Code config directory, and never replaces a
|
|
6
|
+
* different file unless asked to.
|
|
7
|
+
*/
|
|
8
|
+
import { randomBytes } from "node:crypto";
|
|
9
|
+
import { constants } from "node:fs";
|
|
10
|
+
import { mkdir, open, readFile, rename, rm } from "node:fs/promises";
|
|
11
|
+
import { homedir } from "node:os";
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
import { promisify } from "node:util";
|
|
14
|
+
import { gunzip } from "node:zlib";
|
|
15
|
+
import { parseTranscriptFile } from "../format.js";
|
|
16
|
+
import { ResumeError } from "./download.js";
|
|
17
|
+
const gunzipAsync = promisify(gunzip);
|
|
18
|
+
const SESSION_ID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
19
|
+
const RUN_ID = /^[a-z0-9]{8,64}$/i;
|
|
20
|
+
const MAX_BODY_BYTES = 64 * 1024 * 1024;
|
|
21
|
+
export function defaultSessionsRoot() {
|
|
22
|
+
return join(homedir(), ".wardby", "sessions");
|
|
23
|
+
}
|
|
24
|
+
export async function writeSessionFile(transcript, opts = {}) {
|
|
25
|
+
const { meta } = transcript;
|
|
26
|
+
// Re-checked here: these name a path.
|
|
27
|
+
if (!RUN_ID.test(meta.runId) || !SESSION_ID.test(meta.sessionId)) {
|
|
28
|
+
throw new ResumeError("The server's response has invalid run details.");
|
|
29
|
+
}
|
|
30
|
+
let text;
|
|
31
|
+
try {
|
|
32
|
+
const raw = await gunzipAsync(transcript.gzip, { maxOutputLength: MAX_BODY_BYTES + 1024 * 1024 });
|
|
33
|
+
text = raw.toString("utf8");
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
throw new ResumeError("The downloaded transcript could not be decompressed.");
|
|
37
|
+
}
|
|
38
|
+
const file = parseTranscriptFile(text);
|
|
39
|
+
if (!file || file.header.sessionId !== meta.sessionId || file.header.status !== "ok" || !file.body) {
|
|
40
|
+
throw new ResumeError("The downloaded transcript is not one wardby resume can load.");
|
|
41
|
+
}
|
|
42
|
+
const body = Buffer.from(file.body, "utf8");
|
|
43
|
+
const dir = join(opts.root ?? defaultSessionsRoot(), meta.runId);
|
|
44
|
+
const path = join(dir, `${meta.sessionId}.jsonl`);
|
|
45
|
+
await mkdir(dir, { recursive: true, mode: 0o700 });
|
|
46
|
+
let existing;
|
|
47
|
+
try {
|
|
48
|
+
existing = await readFile(path);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
if (error.code !== "ENOENT")
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
if (existing) {
|
|
55
|
+
if (existing.equals(body))
|
|
56
|
+
return { path, dir, outcome: "same" };
|
|
57
|
+
// Claude Code appends the continued conversation to the file it resumed.
|
|
58
|
+
if (!opts.force && existing.byteLength > body.byteLength && existing.subarray(0, body.byteLength).equals(body)) {
|
|
59
|
+
return { path, dir, outcome: "continued" };
|
|
60
|
+
}
|
|
61
|
+
if (!opts.force) {
|
|
62
|
+
throw new ResumeError(`A different session file already exists at ${path}. Nothing was changed. Pass --force to replace it with the downloaded transcript.`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const temp = join(dir, `.${meta.sessionId}.${randomBytes(6).toString("hex")}.tmp`);
|
|
66
|
+
const handle = await open(temp, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL, 0o600);
|
|
67
|
+
try {
|
|
68
|
+
await handle.writeFile(body);
|
|
69
|
+
await handle.sync();
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
await handle.close();
|
|
73
|
+
await rm(temp, { force: true });
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
76
|
+
await handle.close();
|
|
77
|
+
await rename(temp, path);
|
|
78
|
+
return { path, dir, outcome: existing ? "replaced" : "written" };
|
|
79
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type McpServerFactory } from "@modelcontextprotocol/server";
|
|
2
|
+
export declare const STAND_IN_SERVER_NAME = "wardby_tools";
|
|
3
|
+
export interface StandInOptions {
|
|
4
|
+
/** The local checkout the session continues in. */
|
|
5
|
+
checkout: string;
|
|
6
|
+
/** The worker path the run's commands ran in. */
|
|
7
|
+
from: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function movedMessage(opts: StandInOptions): string;
|
|
10
|
+
export declare function standInFactory(opts: StandInOptions): McpServerFactory;
|
|
11
|
+
export declare function resumeToolsCommand(argv: string[]): Promise<void>;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The stand-in for a run's worker tool, started by `wardby resume` through
|
|
3
|
+
* the MCP config it writes: a stdio MCP server named `wardby_tools` that
|
|
4
|
+
* offers `run_command` with the worker's input schema, so a resumed session
|
|
5
|
+
* renders the run's calls. It runs nothing: every call answers with an error
|
|
6
|
+
* telling the model the session moved and to use its local tools.
|
|
7
|
+
*
|
|
8
|
+
* wardby resume-tools --checkout <dir> --from <podPath> (hidden; started by Claude Code)
|
|
9
|
+
*/
|
|
10
|
+
import { parseArgs } from "node:util";
|
|
11
|
+
import { McpServer, fromJsonSchema } from "@modelcontextprotocol/server";
|
|
12
|
+
import { serveStdio, StdioServerTransport } from "@modelcontextprotocol/server/stdio";
|
|
13
|
+
export const STAND_IN_SERVER_NAME = "wardby_tools";
|
|
14
|
+
export function movedMessage(opts) {
|
|
15
|
+
return (`This session moved from a wardby worker. ${opts.from} is now ${opts.checkout}. ` +
|
|
16
|
+
`run_command only ran inside the worker; use your local tools (Bash, Read, Edit) in ${opts.checkout}.`);
|
|
17
|
+
}
|
|
18
|
+
/** The worker's run_command input schema (claude-tool-runner/main.mjs), so recorded calls still match it. */
|
|
19
|
+
const RUN_COMMAND_SCHEMA = {
|
|
20
|
+
type: "object",
|
|
21
|
+
properties: {
|
|
22
|
+
command: { type: "string", minLength: 1 },
|
|
23
|
+
timeout_ms: { type: "integer" },
|
|
24
|
+
},
|
|
25
|
+
required: ["command"],
|
|
26
|
+
};
|
|
27
|
+
export function standInFactory(opts) {
|
|
28
|
+
return () => {
|
|
29
|
+
const server = new McpServer({ name: STAND_IN_SERVER_NAME, version: "1.0.0" });
|
|
30
|
+
server.registerTool("run_command", {
|
|
31
|
+
description: "Ran shell commands inside the wardby worker during the run. Not available locally: it runs nothing. Use your own tools.",
|
|
32
|
+
inputSchema: fromJsonSchema(RUN_COMMAND_SCHEMA),
|
|
33
|
+
}, () => ({ isError: true, content: [{ type: "text", text: movedMessage(opts) }] }));
|
|
34
|
+
return server;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export async function resumeToolsCommand(argv) {
|
|
38
|
+
const { values } = parseArgs({
|
|
39
|
+
args: argv,
|
|
40
|
+
options: { checkout: { type: "string" }, from: { type: "string" } },
|
|
41
|
+
strict: true,
|
|
42
|
+
});
|
|
43
|
+
if (!values.checkout || !values.from)
|
|
44
|
+
throw new Error("usage: wardby resume-tools --checkout <dir> --from <path>");
|
|
45
|
+
// Serves until Claude Code closes its end of stdin.
|
|
46
|
+
serveStdio(standInFactory({ checkout: values.checkout, from: values.from }), {
|
|
47
|
+
transport: new StdioServerTransport(),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type CodingWorkerOutput } from "../coding/protocol.js";
|
|
2
2
|
/**
|
|
3
3
|
* Reads a regular file of at most `maxBytes`, refusing symlinks and anything
|
|
4
4
|
* that is not a regular file.
|
|
@@ -12,9 +12,9 @@ import { type CodingAgentOutput } from "../coding/protocol.js";
|
|
|
12
12
|
*/
|
|
13
13
|
export declare function readBoundedRegularFile(path: string, maxBytes: number, errorCode: string): Promise<string>;
|
|
14
14
|
export declare function readCodingInput(path: string): Promise<{
|
|
15
|
-
repository: string;
|
|
16
15
|
schemaVersion: 1;
|
|
17
16
|
runId: string;
|
|
17
|
+
repository: string;
|
|
18
18
|
baseRef: string;
|
|
19
19
|
headRef: string;
|
|
20
20
|
task: string;
|
|
@@ -25,7 +25,12 @@ export declare function readCodingInput(path: string): Promise<{
|
|
|
25
25
|
runId: string;
|
|
26
26
|
} | undefined;
|
|
27
27
|
debugTrace?: boolean | undefined;
|
|
28
|
+
dependencyCache?: true | undefined;
|
|
29
|
+
sessionResume?: true | undefined;
|
|
30
|
+
diskMb?: number | undefined;
|
|
31
|
+
debugTraceMaxMb?: number | undefined;
|
|
28
32
|
maxTurns?: number | undefined;
|
|
33
|
+
maxOutputTokens?: number | undefined;
|
|
29
34
|
services?: {
|
|
30
35
|
name: string;
|
|
31
36
|
version: string;
|
|
@@ -40,4 +45,4 @@ export declare function readCodingInput(path: string): Promise<{
|
|
|
40
45
|
}[];
|
|
41
46
|
} | undefined;
|
|
42
47
|
}>;
|
|
43
|
-
export declare function writeCodingOutputAtomic(path: string, output:
|
|
48
|
+
export declare function writeCodingOutputAtomic(path: string, output: CodingWorkerOutput): Promise<void>;
|
|
@@ -16,7 +16,9 @@ import { MAX_CODING_ARTIFACT_BYTES, MAX_CODING_INPUT_BYTES, parseCodingTaskInput
|
|
|
16
16
|
export async function readBoundedRegularFile(path, maxBytes, errorCode) {
|
|
17
17
|
let file;
|
|
18
18
|
try {
|
|
19
|
-
|
|
19
|
+
// The mode only applies to a created file, and this open never creates one; an owner-only mode
|
|
20
|
+
// states that, so CodeQL's temporary-file rule doesn't read the open as a world-readable create.
|
|
21
|
+
file = await open(path, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0) | (constants.O_NONBLOCK ?? 0), 0o600);
|
|
20
22
|
}
|
|
21
23
|
catch (error) {
|
|
22
24
|
// ELOOP: the path is a symlink.
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { MAX_DEBUG_TRACE_LINE_BYTES } from "../coding/protocol.js";
|
|
2
|
+
import { redactSecrets } from "../coding/redact.js";
|
|
2
3
|
/**
|
|
3
4
|
* Admin-requested debug trace (CodingTaskInput.debugTrace). When a run is
|
|
4
|
-
* traced, the worker writes every
|
|
5
|
-
* stream failure to its own stdout, one JSON line each, so an operator can read
|
|
5
|
+
* traced, the worker writes every agent stream event (Codex events, Claude Agent
|
|
6
|
+
* SDK messages) and the full text of any stream failure to its own stdout, one JSON line each, so an operator can read
|
|
6
7
|
* why a run failed from the run pod's log. Nothing here reaches the control
|
|
7
8
|
* plane: the launchers only ever parse `{"error": "<code>"}` lines, and a trace
|
|
8
9
|
* line's single top-level key is `debugTrace`.
|
|
@@ -11,10 +12,9 @@ import { MAX_DEBUG_TRACE_LINE_BYTES } from "../coding/protocol.js";
|
|
|
11
12
|
* values are redacted. Lines and the per-run total are capped so a runaway
|
|
12
13
|
* stream cannot flood the log.
|
|
13
14
|
*/
|
|
14
|
-
export { MAX_DEBUG_TRACE_LINE_BYTES };
|
|
15
|
+
export { MAX_DEBUG_TRACE_LINE_BYTES, redactSecrets };
|
|
16
|
+
/** The per-run total when the input sets no cap (CodingTaskInput.debugTraceMaxMb). */
|
|
15
17
|
export declare const MAX_DEBUG_TRACE_TOTAL_BYTES: number;
|
|
16
|
-
/** Redacts the given exact secrets, then every token-shaped value. */
|
|
17
|
-
export declare function redactSecrets(text: string, secrets?: readonly string[]): string;
|
|
18
18
|
/** An error as plain data: name, message, stack, code, and its cause chain. */
|
|
19
19
|
export declare function describeError(error: unknown, depth?: number): unknown;
|
|
20
20
|
export interface DebugTracer {
|
|
@@ -34,4 +34,5 @@ export declare function createDebugTracer(options: DebugTracerOptions): DebugTra
|
|
|
34
34
|
export declare function workerDebugTracer(input: {
|
|
35
35
|
runId: string;
|
|
36
36
|
debugTrace?: boolean;
|
|
37
|
+
debugTraceMaxMb?: number;
|
|
37
38
|
}, capability: string, write: (line: string) => void): DebugTracer | undefined;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { MAX_DEBUG_TRACE_LINE_BYTES, MAX_REDACTED_SPAN
|
|
1
|
+
import { DEFAULT_DEBUG_TRACE_MAX_MB, MAX_DEBUG_TRACE_LINE_BYTES, MAX_REDACTED_SPAN } from "../coding/protocol.js";
|
|
2
|
+
import { redactSecrets } from "../coding/redact.js";
|
|
2
3
|
import { deriveRegistryToken } from "../coding/registry/token.js";
|
|
3
4
|
/**
|
|
4
5
|
* Admin-requested debug trace (CodingTaskInput.debugTrace). When a run is
|
|
5
|
-
* traced, the worker writes every
|
|
6
|
-
* stream failure to its own stdout, one JSON line each, so an operator can read
|
|
6
|
+
* traced, the worker writes every agent stream event (Codex events, Claude Agent
|
|
7
|
+
* SDK messages) and the full text of any stream failure to its own stdout, one JSON line each, so an operator can read
|
|
7
8
|
* why a run failed from the run pod's log. Nothing here reaches the control
|
|
8
9
|
* plane: the launchers only ever parse `{"error": "<code>"}` lines, and a trace
|
|
9
10
|
* line's single top-level key is `debugTrace`.
|
|
@@ -12,23 +13,12 @@ import { deriveRegistryToken } from "../coding/registry/token.js";
|
|
|
12
13
|
* values are redacted. Lines and the per-run total are capped so a runaway
|
|
13
14
|
* stream cannot flood the log.
|
|
14
15
|
*/
|
|
15
|
-
export { MAX_DEBUG_TRACE_LINE_BYTES };
|
|
16
|
-
|
|
16
|
+
export { MAX_DEBUG_TRACE_LINE_BYTES, redactSecrets };
|
|
17
|
+
/** The per-run total when the input sets no cap (CodingTaskInput.debugTraceMaxMb). */
|
|
18
|
+
export const MAX_DEBUG_TRACE_TOTAL_BYTES = DEFAULT_DEBUG_TRACE_MAX_MB * 1024 * 1024;
|
|
17
19
|
const MAX_DEPTH = 32;
|
|
18
20
|
const MAX_CAUSE_DEPTH = 8;
|
|
19
21
|
const MAX_ENTRIES = 1000;
|
|
20
|
-
const REDACTED = "[REDACTED]";
|
|
21
|
-
/** Shapes protocol.ts's list does not cover, or covers only at longer lengths. */
|
|
22
|
-
const EXTRA_TOKEN_PATTERNS = [/rrp_[A-Za-z0-9_-]{8,}/g, /rrg_[A-Za-z0-9_-]{8,}/g, /\bBearer\s+[^\s"',;]+/gi];
|
|
23
|
-
/** Redacts the given exact secrets, then every token-shaped value. */
|
|
24
|
-
export function redactSecrets(text, secrets = []) {
|
|
25
|
-
let redacted = text;
|
|
26
|
-
for (const secret of secrets)
|
|
27
|
-
if (secret)
|
|
28
|
-
redacted = redacted.split(secret).join(REDACTED);
|
|
29
|
-
redacted = redactTokenShapedValues(redacted);
|
|
30
|
-
return EXTRA_TOKEN_PATTERNS.reduce((value, pattern) => value.replace(pattern, REDACTED), redacted);
|
|
31
|
-
}
|
|
32
22
|
/** An error as plain data: name, message, stack, code, and its cause chain. */
|
|
33
23
|
export function describeError(error, depth = 0) {
|
|
34
24
|
if (!(error instanceof Error))
|
|
@@ -113,5 +103,10 @@ export function createDebugTracer(options) {
|
|
|
113
103
|
export function workerDebugTracer(input, capability, write) {
|
|
114
104
|
if (input.debugTrace !== true)
|
|
115
105
|
return undefined;
|
|
116
|
-
return createDebugTracer({
|
|
106
|
+
return createDebugTracer({
|
|
107
|
+
runId: input.runId,
|
|
108
|
+
secrets: [capability, deriveRegistryToken(capability)],
|
|
109
|
+
write,
|
|
110
|
+
...(input.debugTraceMaxMb ? { maxTotalBytes: input.debugTraceMaxMb * 1024 * 1024 } : {}),
|
|
111
|
+
});
|
|
117
112
|
}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
// Types for dependency-cache.mjs, so the driver and the tool runner's TypeScript callers can import it.
|
|
2
|
+
|
|
3
|
+
export type PrepareOutcome = "hit" | "nearest" | "cold" | "skipped" | "refused";
|
|
4
|
+
|
|
5
|
+
export interface PrepareResult {
|
|
6
|
+
readonly result: PrepareOutcome;
|
|
7
|
+
/** The proxy's opaque snapshot key for this run's lockfile (hit, nearest, cold). */
|
|
8
|
+
readonly key?: string;
|
|
9
|
+
/** Archive bytes downloaded (hit) or uploaded (nearest, cold). */
|
|
10
|
+
readonly sizeBytes?: number;
|
|
11
|
+
readonly restoreMs?: number;
|
|
12
|
+
readonly installMs?: number;
|
|
13
|
+
/** A stable code, never raw output: why it was skipped or refused, or why a cold tree was not snapshotted. */
|
|
14
|
+
readonly reason?: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** `npm rebuild` after the seal (hit, nearest and cold only): `skipped` when the lockfile lists no install
|
|
18
|
+
* script under node_modules/; `unsealed` when the proxy did not confirm the seal, so no third-party
|
|
19
|
+
* script ran while the upload window might still be open. */
|
|
20
|
+
export type RebuildOutcome = "ok" | "failed" | "timeout" | "skipped" | "unsealed";
|
|
21
|
+
|
|
22
|
+
export interface ProjectResult extends PrepareResult {
|
|
23
|
+
/** The project folder relative to the workspace: "." for the root, else e.g. "app" or "web/client". */
|
|
24
|
+
readonly path: string;
|
|
25
|
+
readonly rebuild?: RebuildOutcome;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** One entry per discovered project, root first then by path. A repo with no
|
|
29
|
+
* lockfile has one entry: `{ path: ".", result: "skipped", reason: "no_lockfile" }`.
|
|
30
|
+
* Skipped up front: `workspace_member`, `too_many_projects`. */
|
|
31
|
+
export interface PrepareDependenciesResult {
|
|
32
|
+
readonly projects: readonly ProjectResult[];
|
|
33
|
+
/** Set (with `projects: []`) only when the projects could not be planned at all: `internal_error` or `timeout`. */
|
|
34
|
+
readonly reason?: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface DependencyCacheTimeouts {
|
|
38
|
+
/** Each small proxy call (lookup, seal): 120 s. */
|
|
39
|
+
readonly httpMs: number;
|
|
40
|
+
/** The lockfile plan request (a cold proxy checks every package first): 10 min, still bounded by `totalMs`. */
|
|
41
|
+
readonly planMs: number;
|
|
42
|
+
/** Pause before sending a plan again after the proxy's 503 `wardby_plan_incomplete` (it resumes where it stopped). */
|
|
43
|
+
readonly planRetryPauseMs: number;
|
|
44
|
+
readonly transferMs: number;
|
|
45
|
+
readonly transferMsPerMiB: number;
|
|
46
|
+
readonly installMs: number;
|
|
47
|
+
/** Packing a snapshot: 5 min, plus `tarMsPerMiB` (0.5 s) per MiB of the installed tree; never past the upload deadline. */
|
|
48
|
+
readonly tarMs: number;
|
|
49
|
+
readonly tarMsPerMiB: number;
|
|
50
|
+
readonly totalMs: number;
|
|
51
|
+
readonly killGraceMs: number;
|
|
52
|
+
readonly settleMs: number;
|
|
53
|
+
/** Each `npm rebuild` after the seal. */
|
|
54
|
+
readonly rebuildMs: number;
|
|
55
|
+
/** The proxy's upload window (WARDBY_DEPENDENCY_CACHE_UPLOAD_SECONDS), measured from this module's start;
|
|
56
|
+
* a snapshot is not uploaded once less than `uploadMarginMs` of it is left (`upload_window_passed`,
|
|
57
|
+
* log only). Independent of `totalMs`: past the window a run still restores and installs, it only
|
|
58
|
+
* stops uploading. A lookup's `uploadExpiresInMs`, if a proxy reports one, wins when sooner. */
|
|
59
|
+
readonly uploadWindowMs: number;
|
|
60
|
+
readonly uploadMarginMs: number;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export type DependencyCacheLog = (event: string, fields: Record<string, unknown>) => void;
|
|
64
|
+
|
|
65
|
+
export interface DependencyCacheEvent {
|
|
66
|
+
readonly event: string;
|
|
67
|
+
readonly [field: string]: unknown;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export declare const DEFAULT_TIMEOUTS: Readonly<DependencyCacheTimeouts>;
|
|
71
|
+
export declare const DEFAULT_BUDGET_MB: number;
|
|
72
|
+
export declare const MAX_ARCHIVE_ENTRIES: number;
|
|
73
|
+
export declare const MAX_PROJECTS: number;
|
|
74
|
+
/** The least room a cold install needs when this project's tree size is unknown (`budget_too_small` below it). */
|
|
75
|
+
export declare const MIN_INSTALL_BUDGET_BYTES: number;
|
|
76
|
+
/** Plan requests one project may send (retries of an incomplete plan included). */
|
|
77
|
+
export declare const MAX_PLAN_ATTEMPTS: number;
|
|
78
|
+
/** Plan requests the cache sends in one run, leaving the rest of REGISTRY_PLAN_MAX_PER_RUN to the agent's npm. */
|
|
79
|
+
export declare const MAX_PLAN_REQUESTS_PER_RUN: number;
|
|
80
|
+
|
|
81
|
+
export interface PrepareDependenciesOptions {
|
|
82
|
+
readonly workspace: string;
|
|
83
|
+
/** Required: the agent-equivalent shell env (registry settings: npm_config_registry, npm_config_userconfig,
|
|
84
|
+
* WARDBY_NPM_PLAN_REGISTRY, PATH), never the driver's secrets. `npm rebuild` gets only PATH, HOME, LANG,
|
|
85
|
+
* TMPDIR and npm_config_* / NPM_CONFIG_* / WARDBY_NPM_* from it. */
|
|
86
|
+
readonly env: Readonly<Record<string, string | undefined>>;
|
|
87
|
+
/** The proxy origin; defaults to the one npm_config_registry / WARDBY_NPM_PLAN_REGISTRY names. */
|
|
88
|
+
readonly proxyUrl?: string;
|
|
89
|
+
/** The registry token; defaults to the npmrc's _authToken for that registry. */
|
|
90
|
+
readonly token?: string;
|
|
91
|
+
readonly npmPath?: string;
|
|
92
|
+
readonly log?: DependencyCacheLog;
|
|
93
|
+
/** Workspace disk budget in bytes; defaults to CODING_DISK_MB, else DEFAULT_BUDGET_MB. */
|
|
94
|
+
readonly budgetBytes?: number;
|
|
95
|
+
/** What the workspace used when `budgetBytes` was measured (dependencyCacheBudget's `usedBytes`); the
|
|
96
|
+
* snapshot step re-measures and counts the growth from it. Measured at the start when omitted. */
|
|
97
|
+
readonly usedBytes?: number;
|
|
98
|
+
/** Tests only: the cold-install floor; defaults to MIN_INSTALL_BUDGET_BYTES. */
|
|
99
|
+
readonly minInstallBytes?: number;
|
|
100
|
+
readonly timeouts?: Partial<DependencyCacheTimeouts>;
|
|
101
|
+
/** The run's cancellation: aborting it ends the work like the deadline (the module still seals and settles). */
|
|
102
|
+
readonly signal?: AbortSignal;
|
|
103
|
+
/** Tests only: hooks into the flow. */
|
|
104
|
+
readonly testHooks?: DependencyCacheTestHooks;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export interface DependencyCacheTestHooks {
|
|
108
|
+
readonly beforeRename?: () => Promise<void>;
|
|
109
|
+
readonly beforeDiscovery?: () => Promise<void>;
|
|
110
|
+
/** After npm's `_cacache` was found and checked, before it is moved. */
|
|
111
|
+
readonly beforeNpmCacheMove?: () => Promise<void>;
|
|
112
|
+
/** After npm's `_cacache` was moved to the module's own temp, before it is removed. */
|
|
113
|
+
readonly beforeNpmCacheRemove?: () => Promise<void>;
|
|
114
|
+
/** After a restore's extraction, before its symlinks are verified (the temp folder it wrote). */
|
|
115
|
+
readonly beforeVerifyLinks?: (temp: string) => Promise<void>;
|
|
116
|
+
/** After an archive that outgrew the budget was stopped and removed. */
|
|
117
|
+
readonly afterArchiveAborted?: (archive: string) => Promise<void>;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export declare const DEADLINE_SHARE: number;
|
|
121
|
+
|
|
122
|
+
/** How long packing a snapshot may take for a tree of `treeBytes`: `tarMs` plus `tarMsPerMiB` per MiB,
|
|
123
|
+
* cut to what is left before `uploadDeadline` (`limit: "upload_window"`). */
|
|
124
|
+
export declare function archiveLimit(
|
|
125
|
+
timeouts: Pick<DependencyCacheTimeouts, "tarMs" | "tarMsPerMiB">,
|
|
126
|
+
treeBytes: number,
|
|
127
|
+
uploadDeadline: number | undefined,
|
|
128
|
+
now?: number,
|
|
129
|
+
): { limit: "pack" | "upload_window"; limitMs: number };
|
|
130
|
+
/** min(DEFAULT_TIMEOUTS.totalMs, DEADLINE_SHARE × time left before `deadlineAt`), ≥ 0; the default without a usable deadline. */
|
|
131
|
+
export declare function dependencyCacheTimeLimit(deadlineAt: string | Date | number | undefined, now?: number): number;
|
|
132
|
+
|
|
133
|
+
export declare const MIN_BUDGET_BYTES: number;
|
|
134
|
+
export declare const BUDGET_MEASURE_TIMEOUT_MS: number;
|
|
135
|
+
|
|
136
|
+
export interface DependencyCacheBudgetOptions {
|
|
137
|
+
readonly workspace: string;
|
|
138
|
+
/** The run's workspace volume size in MiB (CodingTaskInput.diskMb / the tool setup's diskMb). */
|
|
139
|
+
readonly diskMb: number | undefined;
|
|
140
|
+
readonly signal?: AbortSignal;
|
|
141
|
+
readonly timeoutMs?: number;
|
|
142
|
+
readonly maxEntries?: number;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export type DependencyCacheBudget =
|
|
146
|
+
| { readonly budgetBytes: number; readonly usedBytes: number; readonly reason?: undefined }
|
|
147
|
+
| {
|
|
148
|
+
readonly reason: "budget_unknown" | "budget_too_small";
|
|
149
|
+
readonly usedBytes?: number;
|
|
150
|
+
readonly budgetBytes?: undefined;
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
/** diskMb MiB − the workspace's current usage − max(64 MiB, 5%); a skip reason when unknown or too small. Never throws. */
|
|
154
|
+
export declare function dependencyCacheBudget(options: DependencyCacheBudgetOptions): Promise<DependencyCacheBudget>;
|
|
155
|
+
|
|
156
|
+
export interface SealUploadWindowOptions {
|
|
157
|
+
/** The same agent-equivalent env `prepareDependencies` takes (registry settings and the npmrc). */
|
|
158
|
+
readonly env: Readonly<Record<string, string | undefined>>;
|
|
159
|
+
readonly proxyUrl?: string;
|
|
160
|
+
readonly token?: string;
|
|
161
|
+
/** Defaults to DEFAULT_TIMEOUTS.httpMs. */
|
|
162
|
+
readonly timeoutMs?: number;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/** POST /cache/npm/seal on its own (idempotent on the proxy). `status` 0: no registry, or no answer. Never throws. */
|
|
166
|
+
export declare function sealUploadWindow(
|
|
167
|
+
options: SealUploadWindowOptions,
|
|
168
|
+
): Promise<{ readonly status: number; readonly confirmed: boolean }>;
|
|
169
|
+
|
|
170
|
+
export declare function prepareDependencies(options: PrepareDependenciesOptions): Promise<PrepareDependenciesResult>;
|
|
171
|
+
|
|
172
|
+
/** Project folders with a committed package-lock.json, root first then by path (no cap applied). */
|
|
173
|
+
export declare function discoverProjects(workspace: string, signal?: AbortSignal): Promise<string[]>;
|
|
174
|
+
|
|
175
|
+
export interface PrepareProjectOptions {
|
|
176
|
+
readonly workspace: string;
|
|
177
|
+
readonly projectPath?: string;
|
|
178
|
+
readonly env: Readonly<Record<string, string | undefined>>;
|
|
179
|
+
readonly npmPath: string;
|
|
180
|
+
readonly log: DependencyCacheLog;
|
|
181
|
+
readonly auth: { readonly base: string; readonly token: string } | undefined;
|
|
182
|
+
/** Shared across projects: decremented by what each restore unpacks. */
|
|
183
|
+
/** Shared across projects: decremented by what each restore unpacks and each install writes, and re-measured
|
|
184
|
+
* before each snapshot from `limit` (the starting budget) and `baseUsed` (the workspace's usage then). */
|
|
185
|
+
readonly budget: { remaining: number; limit?: number; baseUsed?: number };
|
|
186
|
+
readonly timeouts: DependencyCacheTimeouts;
|
|
187
|
+
readonly signal: AbortSignal;
|
|
188
|
+
/** `sealed` is set before the seal is sent (no upload starts after it);
|
|
189
|
+
* `closed` once the caller stops waiting (no workspace change after it). */
|
|
190
|
+
readonly session: {
|
|
191
|
+
sealed: boolean;
|
|
192
|
+
closed: boolean;
|
|
193
|
+
children: Set<number>;
|
|
194
|
+
temps?: Set<string>;
|
|
195
|
+
/** Plan requests sent so far in this run (at most MAX_PLAN_REQUESTS_PER_RUN). */
|
|
196
|
+
planRequests?: number;
|
|
197
|
+
};
|
|
198
|
+
readonly testHooks?: DependencyCacheTestHooks;
|
|
199
|
+
/** Filled from the committed lockfile before anything runs: whether `npm rebuild` is needed. */
|
|
200
|
+
readonly facts?: { needsRebuild?: boolean };
|
|
201
|
+
/** Epoch ms after which no snapshot upload starts. */
|
|
202
|
+
readonly uploadDeadline?: number;
|
|
203
|
+
/** Tests only: the cold-install floor; defaults to MIN_INSTALL_BUDGET_BYTES. */
|
|
204
|
+
readonly minInstallBytes?: number;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export declare function prepareProject(options: PrepareProjectOptions): Promise<PrepareResult>;
|
|
208
|
+
|
|
209
|
+
export declare function scanArchive(
|
|
210
|
+
file: string,
|
|
211
|
+
options: { budgetBytes: number; maxEntries?: number; signal?: AbortSignal },
|
|
212
|
+
): Promise<{ entries: number; unpackedBytes: number }>;
|
|
213
|
+
|
|
214
|
+
export declare function extractArchive(
|
|
215
|
+
file: string,
|
|
216
|
+
destination: string,
|
|
217
|
+
options: { budgetBytes: number; maxEntries?: number; signal?: AbortSignal },
|
|
218
|
+
): Promise<{ links: string[] }>;
|
|
219
|
+
|
|
220
|
+
export declare function verifyLinks(root: string, links: readonly string[], signal?: AbortSignal): Promise<void>;
|
|
221
|
+
|
|
222
|
+
export declare function checkConsistency(
|
|
223
|
+
projectRoot: string,
|
|
224
|
+
lockfile: { packages: Record<string, unknown> },
|
|
225
|
+
signal?: AbortSignal,
|
|
226
|
+
): Promise<{ ok: true } | { ok: false; detail: string }>;
|
|
227
|
+
|
|
228
|
+
export declare function readRegularFile(path: string, maxBytes: number): Promise<Buffer>;
|
|
229
|
+
export declare function readRegularFile(path: string, maxBytes: number, encoding: BufferEncoding): Promise<string>;
|