@wardby/cli 0.6.0 → 0.8.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 +5 -5
- package/README.md +6 -1
- package/deploy/local/docker-compose.quickstart-coding.yml +19 -0
- package/dist/claude-coding-worker/driver.d.ts +33 -3
- package/dist/claude-coding-worker/driver.js +151 -21
- package/dist/claude-coding-worker/main.js +38 -6
- package/dist/claude-coding-worker/sdk.js +29 -2
- 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/claude-plugin/command.d.ts +61 -0
- package/dist/claude-plugin/command.js +376 -0
- package/dist/cli-help.d.ts +1 -1
- package/dist/cli-help.js +3 -1
- package/dist/cli.js +71 -13
- package/dist/coding/code-host.d.ts +16 -0
- package/dist/coding/code-host.js +60 -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/mcp-token.d.ts +12 -0
- package/dist/coding/mcp-token.js +26 -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 +237 -12
- package/dist/coding/redact.d.ts +3 -0
- package/dist/coding/redact.js +17 -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 +52 -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 +9 -6
- package/dist/coding-worker/debug-trace.js +16 -19
- 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 +124 -39
- package/dist/coding-worker/errors.d.ts +1 -0
- package/dist/coding-worker/errors.js +32 -0
- package/dist/coding-worker/main.js +5 -1
- package/dist/coding-worker/mcp-config.d.ts +27 -0
- package/dist/coding-worker/mcp-config.js +32 -0
- package/dist/coding-worker/sdk.d.ts +36 -0
- package/dist/coding-worker/sdk.js +28 -1
- 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 +15 -0
- package/dist/config/dependency-cache.d.ts +23 -0
- package/dist/config/dependency-cache.js +32 -0
- package/dist/config/mcp-call-limit.d.ts +8 -0
- package/dist/config/mcp-call-limit.js +18 -0
- package/dist/config/mcp-servers.d.ts +8 -0
- package/dist/config/mcp-servers.js +12 -0
- package/dist/config/providers.d.ts +12 -3
- package/dist/config/providers.js +55 -5
- package/dist/config/test-simulators.d.ts +92 -0
- package/dist/config/test-simulators.js +333 -0
- package/dist/config/tool-timeout.d.ts +1 -0
- package/dist/config/tool-timeout.js +18 -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-mcp.d.ts +36 -0
- package/dist/core/coding-mcp.js +253 -0
- package/dist/core/coding-queue.d.ts +2 -1
- package/dist/core/coding-queue.js +7 -0
- package/dist/core/coding-repository.d.ts +46 -0
- package/dist/core/coding-repository.js +92 -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/delegation-slots.d.ts +27 -0
- package/dist/core/delegation-slots.js +44 -0
- package/dist/core/dispatch.d.ts +48 -2
- package/dist/core/dispatch.js +166 -66
- package/dist/core/engine-native.js +1 -1
- package/dist/core/error-code.d.ts +38 -0
- package/dist/core/error-code.js +169 -0
- package/dist/core/grants.d.ts +46 -8
- package/dist/core/grants.js +99 -8
- package/dist/core/host-events.d.ts +18 -2
- package/dist/core/host-events.js +291 -27
- package/dist/core/host-status.d.ts +85 -3
- package/dist/core/host-status.js +300 -22
- 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 +58 -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/mcp-client/client.d.ts +47 -0
- package/dist/core/mcp-client/client.js +141 -0
- package/dist/core/mcp-client/jsonrpc.d.ts +15 -0
- package/dist/core/mcp-client/jsonrpc.js +54 -0
- package/dist/core/mcp-client/results.d.ts +13 -0
- package/dist/core/mcp-client/results.js +42 -0
- package/dist/core/mcp-servers.d.ts +90 -0
- package/dist/core/mcp-servers.js +230 -0
- package/dist/core/mcp-tools.d.ts +108 -0
- package/dist/core/mcp-tools.js +287 -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 +44 -18
- package/dist/core/notification-dispatcher.js +2 -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 +49 -20
- 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 +4 -3
- 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 +102 -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 +145 -49
- package/dist/core/runner.js +719 -216
- 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 +12 -74
- package/dist/core/secret-broker-config.js +1 -1
- package/dist/core/secret-guard.d.ts +49 -0
- package/dist/core/secret-guard.js +119 -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 +11 -1
- package/dist/core/secrets.js +27 -1
- package/dist/core/serializable-retry.d.ts +18 -0
- package/dist/core/serializable-retry.js +43 -0
- package/dist/core/stop-run.d.ts +46 -0
- package/dist/core/stop-run.js +61 -0
- package/dist/core/tool-admin.d.ts +5 -1
- package/dist/core/tool-admin.js +7 -2
- package/dist/core/tool-names.d.ts +13 -0
- package/dist/core/tool-names.js +20 -0
- package/dist/core/webhooks.d.ts +4 -0
- package/dist/core/webhooks.js +68 -49
- 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 +45 -9
- 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 +65 -3
- package/dist/generated/prisma/client.d.ts +65 -3
- package/dist/generated/prisma/commonInputTypes.d.ts +266 -106
- 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 +110 -0
- package/dist/generated/prisma/internal/class.js +4 -4
- package/dist/generated/prisma/internal/prismaNamespace.d.ts +957 -9
- package/dist/generated/prisma/internal/prismaNamespace.js +166 -2
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +174 -0
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +166 -2
- package/dist/generated/prisma/models/Agent.d.ts +377 -8
- package/dist/generated/prisma/models/AgentMcpServer.d.ts +1412 -0
- package/dist/generated/prisma/models/AgentMcpServer.js +1 -0
- package/dist/generated/prisma/models/AgentRepository.d.ts +81 -1
- package/dist/generated/prisma/models/AuthUser.d.ts +1 -1
- package/dist/generated/prisma/models/CodingAgentProfile.d.ts +228 -7
- package/dist/generated/prisma/models/CodingProxyRequest.d.ts +207 -3
- package/dist/generated/prisma/models/CodingProxySession.d.ts +232 -2
- package/dist/generated/prisma/models/CodingRun.d.ts +1712 -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/HostProvider.d.ts +2176 -0
- package/dist/generated/prisma/models/HostProvider.js +1 -0
- package/dist/generated/prisma/models/HostProviderCredential.d.ts +1285 -0
- package/dist/generated/prisma/models/HostProviderCredential.js +1 -0
- package/dist/generated/prisma/models/HostProviderOperation.d.ts +1470 -0
- package/dist/generated/prisma/models/HostProviderOperation.js +1 -0
- package/dist/generated/prisma/models/HostProviderTrustedAccount.d.ts +1145 -0
- package/dist/generated/prisma/models/HostProviderTrustedAccount.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/McpServer.d.ts +1500 -0
- package/dist/generated/prisma/models/McpServer.js +1 -0
- package/dist/generated/prisma/models/NativeGatewayCall.d.ts +77 -1
- package/dist/generated/prisma/models/NativeGatewaySession.d.ts +35 -1
- package/dist/generated/prisma/models/Principal.d.ts +167 -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/ResourceGrant.d.ts +1 -1
- 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/Secret.d.ts +387 -0
- package/dist/generated/prisma/models/Tool.d.ts +223 -1
- package/dist/generated/prisma/models.d.ts +10 -0
- package/dist/help/search.js +12 -3
- package/dist/help-index.json +2033 -110
- package/dist/import/create.js +48 -4
- package/dist/import/neutral-schema.d.ts +51 -281
- 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 +10 -2
- package/dist/mcp/auth/access.js +15 -1
- package/dist/mcp/auth/grants-cli.d.ts +6 -4
- package/dist/mcp/auth/grants-cli.js +42 -3
- package/dist/mcp/auth/ownership.d.ts +7 -7
- package/dist/mcp/auth/resource-server.d.ts +3 -1
- package/dist/mcp/auth/resource-server.js +17 -2
- 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 +3 -0
- 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 +69 -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 +295 -28
- package/dist/mcp/tools/datastore.js +17 -8
- package/dist/mcp/tools/grants.js +73 -29
- package/dist/mcp/tools/host-providers.d.ts +2 -0
- package/dist/mcp/tools/host-providers.js +215 -0
- package/dist/mcp/tools/mcp-servers.d.ts +26 -0
- package/dist/mcp/tools/mcp-servers.js +481 -0
- 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 +65 -12
- 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 +209 -27
- 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/secret-elicitation.d.ts +2 -0
- package/dist/mcp/tools/secret-elicitation.js +25 -2
- package/dist/mcp/tools/secrets.js +40 -6
- 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 +7 -5
- package/dist/mcp/tools/tools.js +64 -16
- package/dist/mcp/tools/trigger.js +28 -6
- package/dist/mcp/transport/http-limits.d.ts +2 -0
- package/dist/mcp/transport/http-limits.js +6 -2
- 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/mcp/webhooks/ingress.js +10 -0
- 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 +55 -3
- package/dist/native-worker/gateway-server.js +152 -34
- package/dist/native-worker/gateway.d.ts +29 -1
- package/dist/native-worker/gateway.js +74 -4
- package/dist/native-worker/http-server.d.ts +7 -1
- package/dist/native-worker/http-server.js +62 -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 +24 -4
- package/dist/native-worker/ledger.js +62 -8
- 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 +130 -577
- package/dist/native-worker/protocol.js +51 -2
- 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/capability-hash.d.ts +2 -0
- package/dist/providers/coding-proxy/capability-hash.js +5 -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/mcp-route.d.ts +34 -0
- package/dist/providers/coding-proxy/mcp-route.js +166 -0
- package/dist/providers/coding-proxy/memory-ledger.d.ts +17 -2
- package/dist/providers/coding-proxy/memory-ledger.js +99 -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 +16 -2
- package/dist/providers/coding-proxy/prisma-ledger.js +209 -69
- package/dist/providers/coding-proxy/proxy.d.ts +21 -2
- package/dist/providers/coding-proxy/proxy.js +300 -48
- 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 +10 -0
- package/dist/providers/coding-proxy/runtime.js +109 -16
- package/dist/providers/coding-proxy/server.d.ts +9 -1
- package/dist/providers/coding-proxy/server.js +55 -1
- package/dist/providers/coding-proxy/types.d.ts +78 -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 +52 -7
- package/dist/providers/executor/container.d.ts +394 -9
- package/dist/providers/executor/container.js +1210 -96
- 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/host-tools/invoke.d.ts +37 -0
- package/dist/providers/host-tools/invoke.js +117 -0
- package/dist/providers/host-tools/operations.d.ts +65 -0
- package/dist/providers/host-tools/operations.js +149 -0
- package/dist/providers/host-tools/registry.d.ts +79 -0
- package/dist/providers/host-tools/registry.js +362 -0
- package/dist/providers/host-tools/request-guard.d.ts +17 -0
- package/dist/providers/host-tools/request-guard.js +99 -0
- package/dist/providers/host-tools/self-test.d.ts +64 -0
- package/dist/providers/host-tools/self-test.js +142 -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 +10 -2
- package/dist/providers/jobs/docker-isolation.js +47 -8
- package/dist/providers/jobs/docker.d.ts +9 -0
- package/dist/providers/jobs/docker.js +60 -11
- 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 +5 -1
- package/dist/providers/jobs/kubernetes-isolation.js +32 -3
- package/dist/providers/jobs/kubernetes.d.ts +11 -1
- package/dist/providers/jobs/kubernetes.js +111 -17
- package/dist/providers/jobs/types.d.ts +39 -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 +140 -6
- package/dist/providers/review-host/types.js +9 -1
- 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 +39 -4
- package/dist/providers/vcs/git.js +339 -26
- 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 +183 -44
- package/dist/providers/vcs/github.js +455 -56
- package/dist/providers/vcs/index.d.ts +1 -1
- package/dist/providers/vcs/index.js +9 -2
- 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 +37 -1
- package/dist/providers/vcs/remote.js +7 -1
- package/dist/providers/vcs/routing.d.ts +16 -8
- package/dist/providers/vcs/routing.js +27 -6
- package/dist/providers/vcs/types.d.ts +150 -5
- package/dist/quickstart/coding-seed.d.ts +14 -3
- package/dist/quickstart/coding-seed.js +213 -4
- package/dist/quickstart/index.d.ts +5 -0
- package/dist/quickstart/index.js +21 -0
- 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/eval-core.d.ts +12 -2
- package/dist/sandbox/eval-core.js +20 -4
- 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 +5 -0
- package/dist/sandbox/host-functions.js +13 -13
- package/dist/sandbox/limits.d.ts +4 -1
- package/dist/sandbox/limits.js +4 -1
- package/dist/sandbox/run-in-sandbox.d.ts +6 -0
- package/dist/sandbox/run-in-sandbox.js +14 -2
- package/dist/sandbox/safe-fetch.d.ts +2 -0
- package/dist/sandbox/safe-fetch.js +1 -1
- package/dist/sandbox/secret-broker.d.ts +1 -0
- package/dist/sandbox/secret-broker.js +4 -5
- package/dist/sandbox/tool-capabilities.d.ts +10 -30
- package/dist/sandbox/tool-timeout.d.ts +32 -0
- package/dist/sandbox/tool-timeout.js +52 -0
- package/dist/sandbox/user-tool.d.ts +8 -1
- package/dist/sandbox/user-tool.js +9 -3
- 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/graph.js +2 -1
- package/dist/viewer/openapi.js +2 -4
- package/dist/wardby-bin.js +15 -0
- package/docs/README.md +11 -1
- package/docs/agent-recipes.md +95 -24
- package/docs/architecture-runtime.md +1 -1
- package/docs/claude-code-plugin.md +164 -0
- package/docs/code-review-agents.md +557 -41
- package/docs/coding-agent-setup.md +566 -8
- package/docs/coding-packages.md +1033 -90
- package/docs/coding-services.md +27 -12
- package/docs/coding-worker-byo-images.md +24 -2
- package/docs/coding-worker-isolation.md +183 -37
- package/docs/debugging-agent-runs.md +242 -0
- package/docs/getting-started-gke.md +129 -141
- package/docs/getting-started-identity-provider.md +53 -38
- package/docs/getting-started.md +17 -0
- package/docs/host-providers.md +294 -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/mcp-servers.md +254 -0
- package/docs/native-sandbox.md +143 -31
- package/docs/observability.md +4 -0
- package/docs/security-deployment.md +139 -29
- package/docs/slack-notifications.md +35 -19
- package/docs/tool-secrets.md +45 -10
- package/docs/viewer-api.md +6 -0
- package/docs/viewer-api.openapi.yml +1 -1
- package/help/admin-viewer.md +28 -2
- package/help/agent-recipes.md +33 -2
- package/help/architecture-agent.md +11 -6
- package/help/brokered-secrets.md +3 -0
- package/help/build-claude-code-image.md +1 -1
- package/help/build-worker-image.md +3 -1
- package/help/builder-agent.md +19 -6
- package/help/claude-code-run-pane.md +40 -0
- 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-mcp-pins-unavailable.md +35 -0
- 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 +1 -1
- 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/host-provider-error.md +40 -0
- package/help/errors/host-tool-failed.md +36 -0
- package/help/errors/mcp-call-limit.md +22 -0
- package/help/errors/mcp-call-timeout.md +22 -0
- package/help/errors/mcp-server-auth-failed.md +22 -0
- package/help/errors/mcp-server-credentials-unavailable.md +45 -0
- package/help/errors/mcp-server-error.md +28 -0
- package/help/errors/mcp-server-unreachable.md +22 -0
- package/help/errors/mcp-servers-off.md +21 -0
- package/help/errors/mcp-tool-not-allowed.md +26 -0
- package/help/errors/mcp-tool-removed.md +22 -0
- package/help/errors/mcp-unavailable.md +25 -0
- package/help/errors/merge-conflict.md +49 -0
- package/help/errors/native-sandbox-capacity.md +1 -1
- package/help/errors/native-sandbox-deadline-exceeded.md +1 -1
- package/help/errors/native-sandbox-docker-failed.md +1 -1
- package/help/errors/native-sandbox-gateway-error.md +20 -0
- package/help/errors/native-sandbox-gateway-unavailable.md +1 -1
- package/help/errors/native-sandbox-image-not-pinned.md +1 -1
- package/help/errors/native-sandbox-isolation-mismatch.md +1 -1
- package/help/errors/native-sandbox-launch-abandoned.md +21 -0
- package/help/errors/native-sandbox-network-unenforced.md +1 -1
- package/help/errors/native-sandbox-requires-catalog.md +1 -1
- package/help/errors/native-sandbox-unavailable.md +1 -1
- package/help/errors/native-sandbox-warm-delivery-failed.md +1 -1
- package/help/errors/native-sandbox-worker-exited.md +4 -3
- package/help/errors/native-sandbox-worker-lost.md +1 -1
- package/help/errors/native-sandbox-worker-unready.md +1 -1
- 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/repository-not-listed.md +36 -0
- package/help/errors/repository-required.md +36 -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/errors/tool-timeout.md +38 -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/host-providers.md +40 -0
- package/help/identity-and-access.md +6 -1
- 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/mcp-servers.md +73 -0
- package/help/mcp.md +7 -2
- package/help/merge-order-check.md +5 -0
- package/help/native-capabilities.md +55 -1
- package/help/native-sandbox.md +16 -2
- package/help/operating-agents.md +21 -0
- package/help/package-audit-mode.md +91 -0
- package/help/related-pull-requests.md +17 -10
- package/help/repo-instructions-and-skills.md +3 -1
- package/help/resume-runs-locally.md +134 -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 +86 -7
- package/help/troubleshooting/debugging-agent-runs.md +29 -0
- package/package.json +18 -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/migrations/20261102000000_host_providers/migration.sql +56 -0
- package/prisma/migrations/20261104000000_coding_agent_repository_list/migration.sql +5 -0
- package/prisma/migrations/20261106000000_tool_timeout/migration.sql +4 -0
- package/prisma/migrations/20261107000000_mcp_servers/migration.sql +33 -0
- package/prisma/migrations/20261108000000_coding_mcp/migration.sql +5 -0
- package/prisma/migrations/20261109000000_task_run_index/migration.sql +3 -0
- package/prisma/schema.prisma +468 -109
- package/scripts/git-askpass.sh +1 -1
- package/dist/sandbox/generated/zod-to-json-schema.bundle.js +0 -5
|
@@ -95,6 +95,10 @@ export interface FetchMetadataOptions {
|
|
|
95
95
|
export interface MetadataRoute {
|
|
96
96
|
kind: "metadata";
|
|
97
97
|
name: string;
|
|
98
|
+
/** One exact version's document instead of the whole package's
|
|
99
|
+
* (npm's `/<name>/<version>`, which corepack reads); only for adapters
|
|
100
|
+
* with `renderVersion`. */
|
|
101
|
+
version?: string;
|
|
98
102
|
}
|
|
99
103
|
export interface DownloadRoute {
|
|
100
104
|
kind: "download";
|
|
@@ -132,6 +136,13 @@ export interface DeclaredDependency {
|
|
|
132
136
|
key: string;
|
|
133
137
|
name: string;
|
|
134
138
|
range: string;
|
|
139
|
+
/** PyPI only: the extras the declaring line asks of the dependency
|
|
140
|
+
* (`uvicorn[standard]`), normalized. Absent when it asks none. */
|
|
141
|
+
extras?: readonly string[];
|
|
142
|
+
/** PyPI only: the parent's extras the line is gated on (`extra == "test"`);
|
|
143
|
+
* an empty list is a gate that could not be read, never followed. Absent
|
|
144
|
+
* for an ungated line. */
|
|
145
|
+
when?: readonly string[];
|
|
135
146
|
}
|
|
136
147
|
/** One installed package a lockfile claims, where it installs it. None of
|
|
137
148
|
* it is trusted: the plan verifies every registry entry against the
|
|
@@ -152,19 +163,37 @@ export interface LockfileEntry {
|
|
|
152
163
|
/** Why an `unsupported` entry is refused. */
|
|
153
164
|
unsupportedReason?: string;
|
|
154
165
|
}
|
|
155
|
-
/** A parsed lockfile: its entries, the projects
|
|
156
|
-
*
|
|
157
|
-
* the client's own rule for which entry a
|
|
166
|
+
/** A parsed lockfile: its entries, the projects it declares (the root and
|
|
167
|
+
* workspaces; kept for parsing and diagnostics, no longer where plan
|
|
168
|
+
* reachability starts), and the client's own rule for which entry a
|
|
169
|
+
* declared dependency uses. */
|
|
158
170
|
export interface ParsedLockfile {
|
|
159
171
|
entries: readonly LockfileEntry[];
|
|
160
172
|
projects: readonly {
|
|
161
173
|
path: string;
|
|
162
174
|
dependencies: readonly DeclaredDependency[];
|
|
163
175
|
}[];
|
|
176
|
+
/** What an entry's integrity is checked against. `lockfile` (the
|
|
177
|
+
* default): the entry's own `integrity` must equal the registry's, and
|
|
178
|
+
* one without any is refused. `registry`: the lockfile records no npm
|
|
179
|
+
* integrity at all (yarn Berry's `checksum` is yarn's hash of its own
|
|
180
|
+
* cache archive), so entries are approved as exact name@version pairs
|
|
181
|
+
* and each download is checked against the registry's integrity alone. */
|
|
182
|
+
integrity?: "lockfile" | "registry";
|
|
164
183
|
/** The entry that `key`, declared by the package at `fromPath`, resolves
|
|
165
184
|
* to (npm: the nearest ancestor `node_modules/<key>`), or undefined
|
|
166
185
|
* (not installed, or a local project). */
|
|
167
186
|
resolve(fromPath: string, key: string): LockfileEntry | undefined;
|
|
187
|
+
/** Every entry `key` may resolve to from `fromPath`, when the lockfile can
|
|
188
|
+
* pin one name at several versions without saying which a parent uses
|
|
189
|
+
* (a requirements file's marker-split pins); the plan keeps those inside
|
|
190
|
+
* the declared range. Omitted when `resolve` is exact. */
|
|
191
|
+
resolveAll?(fromPath: string, key: string): readonly LockfileEntry[];
|
|
192
|
+
/** The dependency keys the lockfile itself lists for the entry at
|
|
193
|
+
* `path`, when `resolve` answers only for those (pnpm, yarn). Such a
|
|
194
|
+
* lockfile can be parsed in a worker thread and shipped back as an edge
|
|
195
|
+
* table; npm's rule (any ancestor folder) cannot. */
|
|
196
|
+
dependencyKeys?(path: string): readonly string[];
|
|
168
197
|
}
|
|
169
198
|
/** Immutable facts about one published version, read from the registry
|
|
170
199
|
* itself (never from a lockfile): stored once, reused forever. */
|
|
@@ -184,6 +213,12 @@ export interface VersionFact {
|
|
|
184
213
|
* registry reads only. Every decision (integrity, edges, reachability,
|
|
185
214
|
* release age, advisories) is the registry core's. */
|
|
186
215
|
export interface LockfilePlanSupport {
|
|
216
|
+
/** What an approval grants. `versions` (the default): exact name@version
|
|
217
|
+
* pairs, each download served directly and checked against the approved
|
|
218
|
+
* integrity (npm: one tarball per version). `names`: an allowance for the
|
|
219
|
+
* name only, so downloads keep every usual per-file check (PyPI: a
|
|
220
|
+
* release has many files, wheels only, each with its own release age). */
|
|
221
|
+
readonly approves?: "versions" | "names";
|
|
187
222
|
/** Parse a lockfile. Throws a RegistryError for one it cannot verify
|
|
188
223
|
* (unsupported version: 400 `wardby_lockfile_unsupported`; invalid:
|
|
189
224
|
* 400 `wardby_bad_request`; more than `maxEntries` entries: 413
|
|
@@ -194,8 +229,9 @@ export interface LockfilePlanSupport {
|
|
|
194
229
|
maxEntries: number;
|
|
195
230
|
proxyRegistryUrl: string;
|
|
196
231
|
}): ParsedLockfile;
|
|
197
|
-
/** The registry's own record of one version, without its publish
|
|
198
|
-
*
|
|
232
|
+
/** The registry's own record of one version, with or without its publish
|
|
233
|
+
* time (`publishedAt` null: read with fetchPublishTimes); null when the
|
|
234
|
+
* registry has no such version. */
|
|
199
235
|
fetchVersionFact(name: string, version: string, upstream: UpstreamFetch, signal?: AbortSignal): Promise<VersionFact | null>;
|
|
200
236
|
/** Publish times of `versions` of one package, read by streaming the
|
|
201
237
|
* package's full document without ever holding it. A version the
|
|
@@ -207,6 +243,13 @@ export interface LockfilePlanSupport {
|
|
|
207
243
|
/** Whether a dependency declared as `range` accepts `version`, as the
|
|
208
244
|
* client itself decides it when it reuses a locked version. */
|
|
209
245
|
edgeSatisfies(version: string, range: string): boolean;
|
|
246
|
+
/** The dependencies of a version installed with `extras` (PyPI), from its
|
|
247
|
+
* fact; omitted when every declared dependency is always an edge (npm). */
|
|
248
|
+
dependenciesOf?(fact: VersionFact, extras: readonly string[]): readonly DeclaredDependency[];
|
|
249
|
+
/** Whether `body` should be parsed in a worker thread rather than on the
|
|
250
|
+
* proxy's event loop (a YAML or yarn lockfile, which is far costlier to
|
|
251
|
+
* read than JSON). Its parse must provide `dependencyKeys`. */
|
|
252
|
+
parsesOffThread?(body: string): boolean;
|
|
210
253
|
}
|
|
211
254
|
export interface WorkerConfigInput {
|
|
212
255
|
/** e.g. "http://wardby-proxy:8787/registry/npm/" */
|
|
@@ -237,8 +280,9 @@ export interface RegistryAdapter {
|
|
|
237
280
|
/** Whether fetchMetadata's VersionInfo.dependencies is complete (npm's
|
|
238
281
|
* packuments carry every version's dependencies). When true, the core
|
|
239
282
|
* may resolve a run's approved dependency graph from metadata alone,
|
|
240
|
-
* on demand, before refusing a
|
|
241
|
-
* tarballs without first requesting each parent's metadata
|
|
283
|
+
* on demand, before refusing a download (a lockfile install requests
|
|
284
|
+
* tarballs without first requesting each parent's metadata; a metadata
|
|
285
|
+
* request never walks). False for
|
|
242
286
|
* ecosystems whose indexes omit dependencies (PyPI), where such a walk
|
|
243
287
|
* would only make upstream calls and find nothing. */
|
|
244
288
|
readonly dependenciesInMetadata: boolean;
|
|
@@ -246,7 +290,8 @@ export interface RegistryAdapter {
|
|
|
246
290
|
* public URLs, applied before the workspace is collected (lockfiles.ts). Omitted when the client records none. */
|
|
247
291
|
readonly lockfiles?: {
|
|
248
292
|
names: readonly string[];
|
|
249
|
-
|
|
293
|
+
/** `name` is the lockfile's file name (one of `names`). */
|
|
294
|
+
normalize(content: string, registryUrl: string, name: string): string;
|
|
250
295
|
};
|
|
251
296
|
/** Lockfile verification (`POST /registry/<id>/-/plan`); omitted when the
|
|
252
297
|
* ecosystem has none. */
|
|
@@ -279,6 +324,11 @@ export interface RegistryAdapter {
|
|
|
279
324
|
* core's per-file release-age filter), with every download link
|
|
280
325
|
* rewritten to a proxy route. */
|
|
281
326
|
renderMetadata(meta: PackageMetadata, keep: ReadonlySet<string>, keptFiles: ReadonlySet<string>, proxyBase: string): RenderedDocument;
|
|
327
|
+
/** The client-facing document for one kept version (a metadata route
|
|
328
|
+
* with `version`), its download rewritten to a proxy route; null when
|
|
329
|
+
* the version or its file is not kept. Omitted when the ecosystem has
|
|
330
|
+
* no per-version documents. */
|
|
331
|
+
renderVersion?(meta: PackageMetadata, version: string, keptFiles: ReadonlySet<string>, proxyBase: string): RenderedDocument | null;
|
|
282
332
|
/** Map a download route to a file in metadata the proxy fetched itself.
|
|
283
333
|
* Returns null if the route names no known file. */
|
|
284
334
|
resolveDownload(route: DownloadRoute, meta: PackageMetadata): FileRef | null;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type ParsedLockfile } from "./types.js";
|
|
2
|
+
export declare function parseYarnClassicLockfile(body: string, options: {
|
|
3
|
+
maxEntries: number;
|
|
4
|
+
proxyRegistryUrl: string;
|
|
5
|
+
}): ParsedLockfile;
|
|
6
|
+
export declare function parseYarnBerryLockfile(document: Record<string, unknown>, options: {
|
|
7
|
+
maxEntries: number;
|
|
8
|
+
proxyRegistryUrl: string;
|
|
9
|
+
}): ParsedLockfile;
|
|
10
|
+
/** A `yarn.lock` of either generation: classic when it carries the
|
|
11
|
+
* `# yarn lockfile v1` marker, Berry when it has a `__metadata` section. */
|
|
12
|
+
export declare function parseYarnLockfile(body: string, options: {
|
|
13
|
+
maxEntries: number;
|
|
14
|
+
proxyRegistryUrl: string;
|
|
15
|
+
}): ParsedLockfile;
|
|
16
|
+
/** Whether `body` is a yarn classic lockfile (its marker comment within
|
|
17
|
+
* the first lines). */
|
|
18
|
+
export declare function isYarnClassicLockfile(body: string): boolean;
|
|
19
|
+
/** Whether `body` is a yarn Berry lockfile: a `__metadata:` mapping at the
|
|
20
|
+
* top level. */
|
|
21
|
+
export declare function isYarnBerryLockfile(body: string): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Rewrites what yarn records of the proxy in a `yarn.lock` to public URLs:
|
|
24
|
+
* a classic lockfile's `resolved` URLs become yarn's default registry URL
|
|
25
|
+
* for the same package and version (keeping the `#sha1` fragment yarn
|
|
26
|
+
* appends), and a Berry lockfile's `__archiveUrl` parameter pointing at the
|
|
27
|
+
* proxy is dropped (Berry records one only for a download URL other than
|
|
28
|
+
* the registry's conventional one). Only matched values change.
|
|
29
|
+
*/
|
|
30
|
+
export declare function normalizeYarnLockfile(content: string, registryUrl: string): string;
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* yarn lockfiles for npm lockfile plans (`POST /registry/npm/-/plan`) and
|
|
3
|
+
* for the rewrite of proxy URLs before collection:
|
|
4
|
+
*
|
|
5
|
+
* - yarn classic (1.x) `yarn.lock`, "# yarn lockfile v1": yarn's own
|
|
6
|
+
* indentation format, read here by a small line parser (no YAML). Each
|
|
7
|
+
* entry records the `resolved` download URL and npm's `integrity`.
|
|
8
|
+
* - yarn Berry (2+) `yarn.lock`: YAML with a `__metadata` section. Each
|
|
9
|
+
* entry records `resolution: "name@npm:x.y.z"` and a `checksum`, which is
|
|
10
|
+
* yarn's own hash of its cache archive, not npm's integrity: entries are
|
|
11
|
+
* approved as exact name@version pairs, and each download is checked
|
|
12
|
+
* against the registry's own integrity (ParsedLockfile.integrity).
|
|
13
|
+
*
|
|
14
|
+
* yarn resolves a dependency by its descriptor (`name@range`, as the
|
|
15
|
+
* parent's entry lists it), never by folder: `resolve` does the same.
|
|
16
|
+
* Workspaces, `link:`, `portal:`, `file:`, `exec:` and `patch:` entries are
|
|
17
|
+
* local (never fetched from the registry: a patch applies to an npm entry
|
|
18
|
+
* listed in its own right) and skipped; git, URL and other non-registry
|
|
19
|
+
* sources are refused. Nothing here decides anything: plan.ts verifies
|
|
20
|
+
* every claim against the registry.
|
|
21
|
+
*
|
|
22
|
+
* Kept free of imports from npm.ts, which imports this module.
|
|
23
|
+
*/
|
|
24
|
+
import { parseProxyPath, publicNpmTarballUrl } from "./npm-lockfile.js";
|
|
25
|
+
import { registryDependencyEdges } from "./npm-plan.js";
|
|
26
|
+
import { YARN_CLASSIC_REGISTRY, badRequest, buildResolve, entryOf, fromRegistry, isLocal, mapOf, parseLockfileYaml, splitDescriptor, stringOf, tooLarge, yamlEntryLines, } from "./lockfile-shared.js";
|
|
27
|
+
import { RegistryError } from "./types.js";
|
|
28
|
+
/** A lockfile's line limit for the classic parser, far above any real one
|
|
29
|
+
* for the entry bound, so a pathological body is refused early. */
|
|
30
|
+
const MAX_LINES_PER_ENTRY = 64;
|
|
31
|
+
// --- yarn classic (v1) ---------------------------------------------------
|
|
32
|
+
/** One `key value`, `key:` or `"quoted key" "quoted value"` line, unquoted. */
|
|
33
|
+
function tokens(line, lineNumber) {
|
|
34
|
+
const out = [];
|
|
35
|
+
let at = 0;
|
|
36
|
+
while (at < line.length) {
|
|
37
|
+
if (line[at] === " ") {
|
|
38
|
+
at += 1;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (line[at] === '"') {
|
|
42
|
+
let end = at + 1;
|
|
43
|
+
while (end < line.length && line[end] !== '"')
|
|
44
|
+
end += line[end] === "\\" ? 2 : 1;
|
|
45
|
+
if (end >= line.length)
|
|
46
|
+
throw badRequest(`yarn.lock line ${lineNumber} has an unterminated string`);
|
|
47
|
+
try {
|
|
48
|
+
out.push(JSON.parse(line.slice(at, end + 1)));
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
throw badRequest(`yarn.lock line ${lineNumber} has an invalid string`);
|
|
52
|
+
}
|
|
53
|
+
at = end + 1;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
let end = at;
|
|
57
|
+
while (end < line.length && line[end] !== " ")
|
|
58
|
+
end += 1;
|
|
59
|
+
out.push(line.slice(at, end));
|
|
60
|
+
at = end;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return out;
|
|
64
|
+
}
|
|
65
|
+
/** The descriptors a header line (`"a@^1", a@^1.2:`) names. */
|
|
66
|
+
function headerDescriptors(header, lineNumber) {
|
|
67
|
+
if (!header.endsWith(":"))
|
|
68
|
+
throw badRequest(`yarn.lock line ${lineNumber} is not an entry header`);
|
|
69
|
+
return header
|
|
70
|
+
.slice(0, -1)
|
|
71
|
+
.split(/,\s*/)
|
|
72
|
+
.map((part) => {
|
|
73
|
+
const [descriptor, ...rest] = tokens(part.trim(), lineNumber);
|
|
74
|
+
if (!descriptor || rest.length > 0)
|
|
75
|
+
throw badRequest(`yarn.lock line ${lineNumber} has an invalid descriptor`);
|
|
76
|
+
return descriptor;
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
function readClassic(body, maxEntries) {
|
|
80
|
+
const lines = body.split(/\r?\n/);
|
|
81
|
+
if (lines.length > (maxEntries + 1) * MAX_LINES_PER_ENTRY)
|
|
82
|
+
throw tooLarge(lines.length, maxEntries);
|
|
83
|
+
const entries = [];
|
|
84
|
+
let current;
|
|
85
|
+
let section;
|
|
86
|
+
lines.forEach((line, index) => {
|
|
87
|
+
const lineNumber = index + 1;
|
|
88
|
+
if (line.trim() === "" || line.startsWith("#"))
|
|
89
|
+
return;
|
|
90
|
+
const indent = line.length - line.trimStart().length;
|
|
91
|
+
const text = line.trim();
|
|
92
|
+
if (indent === 0) {
|
|
93
|
+
current = { descriptors: headerDescriptors(text, lineNumber), fields: new Map(), dependencies: new Map() };
|
|
94
|
+
entries.push(current);
|
|
95
|
+
if (entries.length > maxEntries)
|
|
96
|
+
throw tooLarge(entries.length, maxEntries);
|
|
97
|
+
section = undefined;
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (!current)
|
|
101
|
+
throw badRequest(`yarn.lock line ${lineNumber} is outside any entry`);
|
|
102
|
+
if (indent === 2) {
|
|
103
|
+
if (text.endsWith(":")) {
|
|
104
|
+
const [field] = tokens(text.slice(0, -1), lineNumber);
|
|
105
|
+
// Only these two sections name what an entry installs.
|
|
106
|
+
section =
|
|
107
|
+
field === "dependencies" || field === "optionalDependencies"
|
|
108
|
+
? current.dependencies
|
|
109
|
+
: new Map();
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const [field, value, ...rest] = tokens(text, lineNumber);
|
|
113
|
+
if (field === undefined || value === undefined || rest.length > 0)
|
|
114
|
+
throw badRequest(`yarn.lock line ${lineNumber} is not a "key value" pair`);
|
|
115
|
+
current.fields.set(field, value);
|
|
116
|
+
section = undefined;
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if (indent === 4 && section) {
|
|
120
|
+
const [key, value, ...rest] = tokens(text, lineNumber);
|
|
121
|
+
if (key === undefined || value === undefined || rest.length > 0)
|
|
122
|
+
throw badRequest(`yarn.lock line ${lineNumber} is not a "name range" pair`);
|
|
123
|
+
section.set(key, value);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
throw badRequest(`yarn.lock line ${lineNumber} has unexpected indentation`);
|
|
127
|
+
});
|
|
128
|
+
return entries;
|
|
129
|
+
}
|
|
130
|
+
export function parseYarnClassicLockfile(body, options) {
|
|
131
|
+
const entries = [];
|
|
132
|
+
const byPath = new Map();
|
|
133
|
+
const byDescriptor = new Map();
|
|
134
|
+
const referenced = new Set();
|
|
135
|
+
for (const raw of readClassic(body, options.maxEntries)) {
|
|
136
|
+
for (const [key, range] of raw.dependencies)
|
|
137
|
+
referenced.add(`${key}@${range}`);
|
|
138
|
+
const path = raw.descriptors[0];
|
|
139
|
+
if (byPath.has(path))
|
|
140
|
+
throw badRequest(`yarn.lock lists "${path}" twice`);
|
|
141
|
+
const first = splitDescriptor(path);
|
|
142
|
+
let target = null;
|
|
143
|
+
if (!isLocal(first.range)) {
|
|
144
|
+
// An alias (`x-cjs@npm:x@^4`) installs its target.
|
|
145
|
+
let name = first.name;
|
|
146
|
+
if (first.range.startsWith("npm:"))
|
|
147
|
+
name = splitDescriptor(first.range.slice("npm:".length)).name;
|
|
148
|
+
const resolved = raw.fields.get("resolved");
|
|
149
|
+
target = entryOf(path, name, raw.fields.get("version") ?? "", raw.fields.get("integrity") ?? null, resolved !== undefined && fromRegistry(resolved, options.proxyRegistryUrl) ? "registry" : "elsewhere");
|
|
150
|
+
entries.push(target);
|
|
151
|
+
}
|
|
152
|
+
byPath.set(path, { dependencies: raw.dependencies });
|
|
153
|
+
for (const descriptor of raw.descriptors) {
|
|
154
|
+
if (byDescriptor.has(descriptor))
|
|
155
|
+
throw badRequest(`yarn.lock lists "${descriptor}" twice`);
|
|
156
|
+
byDescriptor.set(descriptor, target);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
entries,
|
|
161
|
+
projects: classicProjects(byPath, byDescriptor, referenced),
|
|
162
|
+
...buildResolve(byPath, byDescriptor, (key, range) => [`${key}@${range}`]),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* yarn classic records no project section: the root's and workspaces'
|
|
167
|
+
* declarations live only in their package.json files. A descriptor no
|
|
168
|
+
* entry depends on can only come from one of them, so those stand in for
|
|
169
|
+
* the projects (one declaration per key each, so a name declared at two
|
|
170
|
+
* ranges gives a second project). A descriptor a project shares with an
|
|
171
|
+
* entry's dependency is not seen here. The stand-ins are added to `byPath`
|
|
172
|
+
* under paths no entry uses, for `resolve`.
|
|
173
|
+
*/
|
|
174
|
+
function classicProjects(byPath, byDescriptor, referenced) {
|
|
175
|
+
const layers = [];
|
|
176
|
+
const seen = new Map();
|
|
177
|
+
for (const descriptor of byDescriptor.keys()) {
|
|
178
|
+
if (referenced.has(descriptor))
|
|
179
|
+
continue;
|
|
180
|
+
const { name: key, range } = splitDescriptor(descriptor);
|
|
181
|
+
const at = seen.get(key) ?? 0;
|
|
182
|
+
seen.set(key, at + 1);
|
|
183
|
+
(layers[at] ??= new Map()).set(key, range);
|
|
184
|
+
}
|
|
185
|
+
const projects = [];
|
|
186
|
+
layers.forEach((dependencies, at) => {
|
|
187
|
+
const path = at === 0 ? "." : `.#${at}`;
|
|
188
|
+
if (byPath.has(path))
|
|
189
|
+
return;
|
|
190
|
+
byPath.set(path, { dependencies });
|
|
191
|
+
projects.push({ path, dependencies: registryDependencyEdges(Object.fromEntries(dependencies)) });
|
|
192
|
+
});
|
|
193
|
+
return projects;
|
|
194
|
+
}
|
|
195
|
+
// --- yarn Berry ----------------------------------------------------------
|
|
196
|
+
/** `name@npm:1.2.3` (with any `::param=value` suffix), or null for another
|
|
197
|
+
* protocol. */
|
|
198
|
+
function npmResolution(resolution) {
|
|
199
|
+
const { name, range } = splitDescriptor(resolution);
|
|
200
|
+
if (!range.startsWith("npm:"))
|
|
201
|
+
return null;
|
|
202
|
+
const [version, ...params] = range.slice("npm:".length).split("::");
|
|
203
|
+
let archiveUrl;
|
|
204
|
+
for (const param of params.join("&").split("&")) {
|
|
205
|
+
if (param.startsWith("__archiveUrl=")) {
|
|
206
|
+
try {
|
|
207
|
+
archiveUrl = decodeURIComponent(param.slice("__archiveUrl=".length));
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
archiveUrl = "";
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return { name, version, ...(archiveUrl !== undefined ? { archiveUrl } : {}) };
|
|
215
|
+
}
|
|
216
|
+
/** The descriptors a Berry dependency (`key: range`) may be listed under,
|
|
217
|
+
* in order: a patch's own npm descriptor first (the patch entry itself is
|
|
218
|
+
* local), then as written, then with the default `npm:` protocol older
|
|
219
|
+
* lockfiles leave out. */
|
|
220
|
+
function berryCandidates(key, range) {
|
|
221
|
+
if (range.startsWith("patch:")) {
|
|
222
|
+
const inner = range.slice("patch:".length).split("#")[0];
|
|
223
|
+
try {
|
|
224
|
+
return [decodeURIComponent(inner), `${key}@${range}`];
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
return [`${key}@${range}`];
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return /^[a-z]+:/.test(range) ? [`${key}@${range}`] : [`${key}@${range}`, `${key}@npm:${range}`];
|
|
231
|
+
}
|
|
232
|
+
/** A workspace's declared registry dependencies, Berry's `npm:` protocol
|
|
233
|
+
* read as npm's own spec syntax. */
|
|
234
|
+
function berryDeclared(dependencies) {
|
|
235
|
+
const specs = {};
|
|
236
|
+
for (const [key, value] of Object.entries(dependencies)) {
|
|
237
|
+
const range = stringOf(value);
|
|
238
|
+
if (range === undefined)
|
|
239
|
+
continue;
|
|
240
|
+
if (!range.startsWith("npm:"))
|
|
241
|
+
specs[key] = range;
|
|
242
|
+
else {
|
|
243
|
+
const rest = range.slice("npm:".length);
|
|
244
|
+
specs[key] = rest.indexOf("@", 1) > 0 ? range : rest;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return registryDependencyEdges(specs);
|
|
248
|
+
}
|
|
249
|
+
export function parseYarnBerryLockfile(document, options) {
|
|
250
|
+
const metadataVersion = Number(stringOf(mapOf(document.__metadata).version));
|
|
251
|
+
if (!Number.isInteger(metadataVersion) || metadataVersion < 4)
|
|
252
|
+
throw new RegistryError(400, "wardby_lockfile_unsupported", "this yarn.lock comes from a yarn release before 2.0's stable format; regenerate it with yarn 2 or later");
|
|
253
|
+
const keys = Object.keys(document).filter((key) => key !== "__metadata");
|
|
254
|
+
if (keys.length > options.maxEntries)
|
|
255
|
+
throw tooLarge(keys.length, options.maxEntries);
|
|
256
|
+
const entries = [];
|
|
257
|
+
const projects = [];
|
|
258
|
+
const byPath = new Map();
|
|
259
|
+
const byDescriptor = new Map();
|
|
260
|
+
for (const path of keys) {
|
|
261
|
+
const value = document[path];
|
|
262
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
263
|
+
throw badRequest(`yarn.lock entry "${path}" is not a mapping`);
|
|
264
|
+
const entry = value;
|
|
265
|
+
const resolution = stringOf(entry.resolution);
|
|
266
|
+
if (resolution === undefined)
|
|
267
|
+
throw badRequest(`yarn.lock entry "${path}" has no resolution`);
|
|
268
|
+
const declared = mapOf(entry.dependencies);
|
|
269
|
+
const dependencies = new Map();
|
|
270
|
+
for (const [key, range] of Object.entries(declared))
|
|
271
|
+
if (typeof range === "string")
|
|
272
|
+
dependencies.set(key, range);
|
|
273
|
+
const { range: protocol } = splitDescriptor(resolution);
|
|
274
|
+
const npm = npmResolution(resolution);
|
|
275
|
+
let target = null;
|
|
276
|
+
if (npm) {
|
|
277
|
+
const elsewhere = npm.archiveUrl !== undefined && !fromRegistry(npm.archiveUrl, options.proxyRegistryUrl);
|
|
278
|
+
// Berry's checksum is not npm's integrity: none is claimed.
|
|
279
|
+
target = entryOf(path, npm.name, npm.version, null, elsewhere ? "elsewhere" : "registry");
|
|
280
|
+
entries.push(target);
|
|
281
|
+
}
|
|
282
|
+
else if (protocol.startsWith("workspace:")) {
|
|
283
|
+
projects.push({ path, dependencies: berryDeclared(declared) });
|
|
284
|
+
}
|
|
285
|
+
else if (!isLocal(protocol)) {
|
|
286
|
+
target = entryOf(path, splitDescriptor(resolution).name, stringOf(entry.version) ?? "", null, "elsewhere");
|
|
287
|
+
entries.push(target);
|
|
288
|
+
}
|
|
289
|
+
byPath.set(path, { dependencies });
|
|
290
|
+
for (const descriptor of path.split(/,\s*/)) {
|
|
291
|
+
if (byDescriptor.has(descriptor))
|
|
292
|
+
throw badRequest(`yarn.lock lists "${descriptor}" twice`);
|
|
293
|
+
byDescriptor.set(descriptor, target);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return {
|
|
297
|
+
entries,
|
|
298
|
+
projects,
|
|
299
|
+
integrity: "registry",
|
|
300
|
+
...buildResolve(byPath, byDescriptor, berryCandidates),
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
/** A `yarn.lock` of either generation: classic when it carries the
|
|
304
|
+
* `# yarn lockfile v1` marker, Berry when it has a `__metadata` section. */
|
|
305
|
+
export function parseYarnLockfile(body, options) {
|
|
306
|
+
if (isYarnClassicLockfile(body))
|
|
307
|
+
return parseYarnClassicLockfile(body, options);
|
|
308
|
+
const lines = yamlEntryLines(body);
|
|
309
|
+
if (lines > options.maxEntries * MAX_LINES_PER_ENTRY)
|
|
310
|
+
throw tooLarge(lines, options.maxEntries);
|
|
311
|
+
return parseYarnBerryLockfile(parseLockfileYaml(body), options);
|
|
312
|
+
}
|
|
313
|
+
/** Whether `body` is a yarn classic lockfile (its marker comment within
|
|
314
|
+
* the first lines). */
|
|
315
|
+
export function isYarnClassicLockfile(body) {
|
|
316
|
+
return /^# yarn lockfile v1\s*$/m.test(body.slice(0, 1024));
|
|
317
|
+
}
|
|
318
|
+
/** Whether `body` is a yarn Berry lockfile: a `__metadata:` mapping at the
|
|
319
|
+
* top level. */
|
|
320
|
+
export function isYarnBerryLockfile(body) {
|
|
321
|
+
return /^__metadata:\s*$/m.test(body);
|
|
322
|
+
}
|
|
323
|
+
// --- Rewrite before collection -------------------------------------------
|
|
324
|
+
/** A ` resolved "<url>"` line of a classic lockfile. */
|
|
325
|
+
const CLASSIC_RESOLVED = /^(\s+resolved\s+)"([^"\\]*)"(\s*)$/gm;
|
|
326
|
+
/** A Berry `resolution: "name@npm:x.y.z::params"` line. */
|
|
327
|
+
const BERRY_PARAMETERS = /^(\s+resolution:\s+"[^"\n]*?@npm:[^":\n]*)::([^"\n]*)(".*)$/gm;
|
|
328
|
+
function decode(value) {
|
|
329
|
+
try {
|
|
330
|
+
return decodeURIComponent(value);
|
|
331
|
+
}
|
|
332
|
+
catch {
|
|
333
|
+
return null;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Rewrites what yarn records of the proxy in a `yarn.lock` to public URLs:
|
|
338
|
+
* a classic lockfile's `resolved` URLs become yarn's default registry URL
|
|
339
|
+
* for the same package and version (keeping the `#sha1` fragment yarn
|
|
340
|
+
* appends), and a Berry lockfile's `__archiveUrl` parameter pointing at the
|
|
341
|
+
* proxy is dropped (Berry records one only for a download URL other than
|
|
342
|
+
* the registry's conventional one). Only matched values change.
|
|
343
|
+
*/
|
|
344
|
+
export function normalizeYarnLockfile(content, registryUrl) {
|
|
345
|
+
const base = registryUrl.endsWith("/") ? registryUrl : `${registryUrl}/`;
|
|
346
|
+
if (isYarnClassicLockfile(content)) {
|
|
347
|
+
return content.replace(CLASSIC_RESOLVED, (match, open, value, close) => {
|
|
348
|
+
const hash = value.indexOf("#");
|
|
349
|
+
const url = hash < 0 ? value : value.slice(0, hash);
|
|
350
|
+
const target = url.startsWith(base) ? parseProxyPath(url.slice(base.length)) : null;
|
|
351
|
+
if (!target)
|
|
352
|
+
return match;
|
|
353
|
+
const fragment = hash < 0 ? "" : value.slice(hash);
|
|
354
|
+
const publicUrl = publicNpmTarballUrl(target.name, target.version).replace("https://registry.npmjs.org/", YARN_CLASSIC_REGISTRY);
|
|
355
|
+
return `${open}"${publicUrl}${fragment}"${close}`;
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
return content.replace(BERRY_PARAMETERS, (match, open, parameters, close) => {
|
|
359
|
+
const kept = parameters.split("&").filter((parameter) => {
|
|
360
|
+
if (!parameter.startsWith("__archiveUrl="))
|
|
361
|
+
return true;
|
|
362
|
+
const url = decode(parameter.slice("__archiveUrl=".length));
|
|
363
|
+
return url === null || !url.startsWith(base);
|
|
364
|
+
});
|
|
365
|
+
return `${open}${kept.length > 0 ? `::${kept.join("&")}` : ""}${close}`;
|
|
366
|
+
});
|
|
367
|
+
}
|