@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
|
@@ -72,6 +72,13 @@ function requestFromRow(row) {
|
|
|
72
72
|
}
|
|
73
73
|
: undefined,
|
|
74
74
|
upstreamStatus: row.upstreamStatus ?? undefined,
|
|
75
|
+
costEstimated: row.costEstimated === true,
|
|
76
|
+
...(row.requestBytes !== null ? { requestBytes: row.requestBytes } : {}),
|
|
77
|
+
...(row.ceilingUsd !== null && row.ceilingUsd !== undefined ? { ceilingUsd: Number(row.ceilingUsd) } : {}),
|
|
78
|
+
...(row.reservationBasis === "cached" || row.reservationBasis === "full"
|
|
79
|
+
? { reservationBasis: row.reservationBasis }
|
|
80
|
+
: {}),
|
|
81
|
+
...(row.conversationKey !== null ? { conversationKey: row.conversationKey } : {}),
|
|
75
82
|
};
|
|
76
83
|
}
|
|
77
84
|
async function requestById(db, id) {
|
|
@@ -79,7 +86,8 @@ async function requestById(db, id) {
|
|
|
79
86
|
SELECT "id", "sessionId", "requestKey", "requestFingerprint", "model", "status",
|
|
80
87
|
"reservationUsd", "actualCostUsd", "pricingVersion", "pricingSnapshot",
|
|
81
88
|
"inputTokens", "outputTokens", "cachedInputTokens", "cacheWriteTokens",
|
|
82
|
-
"reasoningTokens", "upstreamStatus"
|
|
89
|
+
"reasoningTokens", "upstreamStatus", "costEstimated",
|
|
90
|
+
"requestBytes", "ceilingUsd", "reservationBasis", "conversationKey"
|
|
83
91
|
FROM "CodingProxyRequest" WHERE "id" = ${id}
|
|
84
92
|
`;
|
|
85
93
|
return rows[0] ? requestFromRow(rows[0]) : null;
|
|
@@ -132,28 +140,54 @@ export class PrismaProxyLedger {
|
|
|
132
140
|
SELECT "id", "sessionId", "requestKey", "requestFingerprint", "model", "status",
|
|
133
141
|
"reservationUsd", "actualCostUsd", "pricingVersion", "pricingSnapshot",
|
|
134
142
|
"inputTokens", "outputTokens", "cachedInputTokens", "cacheWriteTokens",
|
|
135
|
-
"reasoningTokens", "upstreamStatus"
|
|
143
|
+
"reasoningTokens", "upstreamStatus", "costEstimated",
|
|
144
|
+
"requestBytes", "ceilingUsd", "reservationBasis", "conversationKey"
|
|
136
145
|
FROM "CodingProxyRequest"
|
|
137
146
|
WHERE "sessionId" = ${input.sessionId} AND "requestKey" = ${input.requestKey}
|
|
138
147
|
`;
|
|
139
148
|
if (duplicate[0])
|
|
140
149
|
return { outcome: "duplicate", request: requestFromRow(duplicate[0]) };
|
|
141
150
|
const totals = await tx.$queryRaw `
|
|
142
|
-
SELECT
|
|
143
|
-
CASE
|
|
151
|
+
SELECT
|
|
152
|
+
COALESCE(SUM(CASE
|
|
144
153
|
WHEN "status" = 'completed' THEN "actualCostUsd"
|
|
145
|
-
WHEN "status"
|
|
154
|
+
WHEN "status" = 'uncertain' AND "costEstimated" THEN "actualCostUsd"
|
|
146
155
|
ELSE 0
|
|
147
|
-
END
|
|
148
|
-
|
|
156
|
+
END), 0) AS "spent",
|
|
157
|
+
COALESCE(SUM(CASE WHEN "status" = 'reserved' THEN "reservationUsd" ELSE 0 END), 0) AS "heldReserved",
|
|
158
|
+
COALESCE(SUM(CASE
|
|
159
|
+
WHEN "status" = 'uncertain' AND NOT "costEstimated" THEN "reservationUsd"
|
|
160
|
+
ELSE 0
|
|
161
|
+
END), 0) AS "heldUncertain",
|
|
162
|
+
COUNT(*) FILTER (
|
|
163
|
+
WHERE "status" = 'completed' OR ("status" = 'uncertain' AND "costEstimated")
|
|
164
|
+
) AS "done"
|
|
149
165
|
FROM "CodingProxyRequest" WHERE "sessionId" = ${input.sessionId}
|
|
150
166
|
`;
|
|
151
|
-
|
|
167
|
+
const spentUsd = Number(totals[0]?.spent ?? 0);
|
|
168
|
+
const heldReservedUsd = Number(totals[0]?.heldReserved ?? 0);
|
|
169
|
+
const heldUncertainUsd = Number(totals[0]?.heldUncertain ?? 0);
|
|
170
|
+
if (spentUsd + heldReservedUsd + heldUncertainUsd + input.reservationUsd >= Number(row.budgetUsd)) {
|
|
171
|
+
const details = {
|
|
172
|
+
budgetUsd: Number(row.budgetUsd),
|
|
173
|
+
spentUsd,
|
|
174
|
+
heldReservedUsd,
|
|
175
|
+
heldUncertainUsd,
|
|
176
|
+
refusedHoldUsd: input.reservationUsd,
|
|
177
|
+
...(input.reservationBasis ? { refusedHoldBasis: input.reservationBasis } : {}),
|
|
178
|
+
...(input.ceilingUsd !== undefined ? { refusedHoldCeilingUsd: input.ceilingUsd } : {}),
|
|
179
|
+
model: input.model,
|
|
180
|
+
turn: Number(totals[0]?.done ?? 0) + 1,
|
|
181
|
+
};
|
|
182
|
+
// The numbers of the session's first refusal only; the control plane copies them into the
|
|
183
|
+
// run's budget event (this role has no access to that table).
|
|
184
|
+
const detailsJson = JSON.stringify({ source: "proxy", ...details });
|
|
152
185
|
await tx.$executeRaw `
|
|
153
|
-
UPDATE "CodingProxySession"
|
|
154
|
-
|
|
186
|
+
UPDATE "CodingProxySession"
|
|
187
|
+
SET "budgetExhaustedAt" = ${input.now}, "budgetRefusal" = ${detailsJson}::jsonb
|
|
188
|
+
WHERE "id" = ${input.sessionId} AND "budgetExhaustedAt" IS NULL
|
|
155
189
|
`;
|
|
156
|
-
return { outcome: "budget_exhausted" };
|
|
190
|
+
return { outcome: "budget_exhausted", details };
|
|
157
191
|
}
|
|
158
192
|
const pricing = JSON.stringify({
|
|
159
193
|
encoding: input.pricing.encoding,
|
|
@@ -165,11 +199,13 @@ export class PrismaProxyLedger {
|
|
|
165
199
|
await tx.$executeRaw `
|
|
166
200
|
INSERT INTO "CodingProxyRequest"
|
|
167
201
|
("id", "sessionId", "requestKey", "requestFingerprint", "model", "status",
|
|
168
|
-
"reservationUsd", "pricingVersion", "pricingSnapshot", "
|
|
202
|
+
"reservationUsd", "pricingVersion", "pricingSnapshot", "requestBytes", "ceilingUsd",
|
|
203
|
+
"reservationBasis", "conversationKey", "createdAt", "updatedAt")
|
|
169
204
|
VALUES
|
|
170
205
|
(${input.id}, ${input.sessionId}, ${input.requestKey}, ${input.requestFingerprint}, ${input.model},
|
|
171
206
|
'reserved', ${input.reservationUsd}, ${input.pricing.version}, ${pricing}::jsonb,
|
|
172
|
-
|
|
207
|
+
${input.requestBytes ?? null}, ${input.ceilingUsd ?? null}, ${input.reservationBasis ?? null},
|
|
208
|
+
${input.conversationKey ?? null}, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
|
|
173
209
|
`;
|
|
174
210
|
const request = await requestById(tx, input.id);
|
|
175
211
|
if (!request)
|
|
@@ -189,7 +225,8 @@ export class PrismaProxyLedger {
|
|
|
189
225
|
SELECT "id", "sessionId", "requestKey", "requestFingerprint", "model", "status",
|
|
190
226
|
"reservationUsd", "actualCostUsd", "pricingVersion", "pricingSnapshot",
|
|
191
227
|
"inputTokens", "outputTokens", "cachedInputTokens", "cacheWriteTokens",
|
|
192
|
-
"reasoningTokens", "upstreamStatus"
|
|
228
|
+
"reasoningTokens", "upstreamStatus", "costEstimated",
|
|
229
|
+
"requestBytes", "ceilingUsd", "reservationBasis", "conversationKey"
|
|
193
230
|
FROM "CodingProxyRequest" WHERE "id" = ${requestId} FOR UPDATE
|
|
194
231
|
`;
|
|
195
232
|
const prior = locked[0] ? requestFromRow(locked[0]) : null;
|
|
@@ -210,63 +247,73 @@ export class PrismaProxyLedger {
|
|
|
210
247
|
"inputTokens" = ${usage.inputTokens}, "outputTokens" = ${usage.outputTokens},
|
|
211
248
|
"cachedInputTokens" = ${usage.cachedInputTokens}, "cacheWriteTokens" = ${usage.cacheWriteTokens},
|
|
212
249
|
"reasoningTokens" = ${usage.reasoningTokens}, "upstreamStatus" = ${upstreamStatus},
|
|
250
|
+
"costEstimated" = false,
|
|
213
251
|
"completedAt" = CURRENT_TIMESTAMP, "updatedAt" = CURRENT_TIMESTAMP
|
|
214
252
|
WHERE "id" = ${requestId} AND "status" IN ('reserved', 'uncertain')
|
|
215
253
|
`;
|
|
216
|
-
|
|
217
|
-
UPDATE "Run" AS r
|
|
218
|
-
SET "tokensIn" = totals."tokensIn", "tokensOut" = totals."tokensOut", "costUsd" = totals."costUsd",
|
|
219
|
-
"turns" = totals."turns"
|
|
220
|
-
FROM (
|
|
221
|
-
SELECT s."runId", COALESCE(SUM(q."inputTokens"), 0)::integer AS "tokensIn",
|
|
222
|
-
COALESCE(SUM(q."outputTokens"), 0)::integer AS "tokensOut",
|
|
223
|
-
COALESCE(SUM(q."actualCostUsd"), 0) AS "costUsd",
|
|
224
|
-
COUNT(*)::integer AS "turns"
|
|
225
|
-
FROM "CodingProxySession" s
|
|
226
|
-
JOIN "CodingProxyRequest" q ON q."sessionId" = s."id" AND q."status" = 'completed'
|
|
227
|
-
WHERE s."id" = ${prior.sessionId}
|
|
228
|
-
GROUP BY s."runId"
|
|
229
|
-
) AS totals
|
|
230
|
-
WHERE r."id" = totals."runId"
|
|
231
|
-
RETURNING r."id"
|
|
232
|
-
`;
|
|
233
|
-
// Per-model usage (RunModelUsage), recomputed for this request's model and set, never incremented.
|
|
234
|
-
// Best effort inside a savepoint: Run totals and the ledger are the budget truth, so a failed
|
|
235
|
-
// write here (e.g. a role without the RunModelUsage grant) must never fail the completion.
|
|
236
|
-
await tx.$executeRaw `SAVEPOINT run_model_usage`;
|
|
237
|
-
try {
|
|
238
|
-
await tx.$executeRaw `
|
|
239
|
-
INSERT INTO "RunModelUsage"
|
|
240
|
-
("runId", "model", "freshInputTokens", "cachedInputTokens", "cacheWriteTokens", "outputTokens", "costUsd")
|
|
241
|
-
SELECT s."runId", q."model",
|
|
242
|
-
COALESCE(SUM(COALESCE(q."inputTokens", 0) - COALESCE(q."cachedInputTokens", 0)), 0)::integer,
|
|
243
|
-
COALESCE(SUM(q."cachedInputTokens"), 0)::integer,
|
|
244
|
-
COALESCE(SUM(q."cacheWriteTokens"), 0)::integer,
|
|
245
|
-
COALESCE(SUM(q."outputTokens"), 0)::integer,
|
|
246
|
-
COALESCE(SUM(q."actualCostUsd"), 0)
|
|
247
|
-
FROM "CodingProxySession" s
|
|
248
|
-
JOIN "CodingProxyRequest" q ON q."sessionId" = s."id" AND q."status" = 'completed'
|
|
249
|
-
WHERE s."id" = ${prior.sessionId} AND q."model" = ${prior.model}
|
|
250
|
-
GROUP BY s."runId", q."model"
|
|
251
|
-
ON CONFLICT ("runId", "model") DO UPDATE SET
|
|
252
|
-
"freshInputTokens" = EXCLUDED."freshInputTokens",
|
|
253
|
-
"cachedInputTokens" = EXCLUDED."cachedInputTokens",
|
|
254
|
-
"cacheWriteTokens" = EXCLUDED."cacheWriteTokens",
|
|
255
|
-
"outputTokens" = EXCLUDED."outputTokens",
|
|
256
|
-
"costUsd" = EXCLUDED."costUsd"
|
|
257
|
-
`;
|
|
258
|
-
await tx.$executeRaw `RELEASE SAVEPOINT run_model_usage`;
|
|
259
|
-
}
|
|
260
|
-
catch (err) {
|
|
261
|
-
await tx.$executeRaw `ROLLBACK TO SAVEPOINT run_model_usage`;
|
|
262
|
-
log.warn({ err, runId: updatedRun?.id, sessionId: prior.sessionId, model: prior.model }, "could not record the run's model usage");
|
|
263
|
-
}
|
|
254
|
+
await this.recomputeRunTotals(tx, prior.sessionId, prior.model);
|
|
264
255
|
const request = await requestById(tx, requestId);
|
|
265
256
|
if (!request)
|
|
266
257
|
throw new Error("proxy_completion_not_persisted");
|
|
267
258
|
return request;
|
|
268
259
|
});
|
|
269
260
|
}
|
|
261
|
+
/**
|
|
262
|
+
* Recomputes the run's totals (Run) and this model's usage (RunModelUsage) from its settled
|
|
263
|
+
* requests: completed ones and uncertain ones settled at an estimate. Set, never incremented.
|
|
264
|
+
*/
|
|
265
|
+
async recomputeRunTotals(tx, sessionId, model) {
|
|
266
|
+
const [updatedRun] = await tx.$queryRaw `
|
|
267
|
+
UPDATE "Run" AS r
|
|
268
|
+
SET "tokensIn" = totals."tokensIn", "tokensOut" = totals."tokensOut", "costUsd" = totals."costUsd",
|
|
269
|
+
"turns" = totals."turns"
|
|
270
|
+
FROM (
|
|
271
|
+
SELECT s."runId", COALESCE(SUM(q."inputTokens"), 0)::integer AS "tokensIn",
|
|
272
|
+
COALESCE(SUM(q."outputTokens"), 0)::integer AS "tokensOut",
|
|
273
|
+
COALESCE(SUM(q."actualCostUsd"), 0) AS "costUsd",
|
|
274
|
+
COUNT(*)::integer AS "turns"
|
|
275
|
+
FROM "CodingProxySession" s
|
|
276
|
+
JOIN "CodingProxyRequest" q ON q."sessionId" = s."id"
|
|
277
|
+
AND (q."status" = 'completed' OR (q."status" = 'uncertain' AND q."costEstimated"))
|
|
278
|
+
WHERE s."id" = ${sessionId}
|
|
279
|
+
GROUP BY s."runId"
|
|
280
|
+
) AS totals
|
|
281
|
+
WHERE r."id" = totals."runId"
|
|
282
|
+
RETURNING r."id"
|
|
283
|
+
`;
|
|
284
|
+
// Per-model usage (RunModelUsage), recomputed for this request's model and set, never incremented.
|
|
285
|
+
// Best effort inside a savepoint: Run totals and the ledger are the budget truth, so a failed
|
|
286
|
+
// write here (e.g. a role without the RunModelUsage grant) must never fail the completion.
|
|
287
|
+
await tx.$executeRaw `SAVEPOINT run_model_usage`;
|
|
288
|
+
try {
|
|
289
|
+
await tx.$executeRaw `
|
|
290
|
+
INSERT INTO "RunModelUsage"
|
|
291
|
+
("runId", "model", "freshInputTokens", "cachedInputTokens", "cacheWriteTokens", "outputTokens", "costUsd")
|
|
292
|
+
SELECT s."runId", q."model",
|
|
293
|
+
COALESCE(SUM(COALESCE(q."inputTokens", 0) - COALESCE(q."cachedInputTokens", 0)), 0)::integer,
|
|
294
|
+
COALESCE(SUM(q."cachedInputTokens"), 0)::integer,
|
|
295
|
+
COALESCE(SUM(q."cacheWriteTokens"), 0)::integer,
|
|
296
|
+
COALESCE(SUM(q."outputTokens"), 0)::integer,
|
|
297
|
+
COALESCE(SUM(q."actualCostUsd"), 0)
|
|
298
|
+
FROM "CodingProxySession" s
|
|
299
|
+
JOIN "CodingProxyRequest" q ON q."sessionId" = s."id"
|
|
300
|
+
AND (q."status" = 'completed' OR (q."status" = 'uncertain' AND q."costEstimated"))
|
|
301
|
+
WHERE s."id" = ${sessionId} AND q."model" = ${model}
|
|
302
|
+
GROUP BY s."runId", q."model"
|
|
303
|
+
ON CONFLICT ("runId", "model") DO UPDATE SET
|
|
304
|
+
"freshInputTokens" = EXCLUDED."freshInputTokens",
|
|
305
|
+
"cachedInputTokens" = EXCLUDED."cachedInputTokens",
|
|
306
|
+
"cacheWriteTokens" = EXCLUDED."cacheWriteTokens",
|
|
307
|
+
"outputTokens" = EXCLUDED."outputTokens",
|
|
308
|
+
"costUsd" = EXCLUDED."costUsd"
|
|
309
|
+
`;
|
|
310
|
+
await tx.$executeRaw `RELEASE SAVEPOINT run_model_usage`;
|
|
311
|
+
}
|
|
312
|
+
catch (err) {
|
|
313
|
+
await tx.$executeRaw `ROLLBACK TO SAVEPOINT run_model_usage`;
|
|
314
|
+
log.warn({ err, runId: updatedRun?.id, sessionId, model }, "could not record the run's model usage");
|
|
315
|
+
}
|
|
316
|
+
}
|
|
270
317
|
async release(requestId, upstreamStatus) {
|
|
271
318
|
await this.db.$executeRaw `
|
|
272
319
|
UPDATE "CodingProxyRequest"
|
|
@@ -274,12 +321,70 @@ export class PrismaProxyLedger {
|
|
|
274
321
|
WHERE "id" = ${requestId} AND "status" = 'reserved'
|
|
275
322
|
`;
|
|
276
323
|
}
|
|
277
|
-
async markUncertain(requestId, upstreamStatus) {
|
|
278
|
-
await this.
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
324
|
+
async markUncertain(requestId, upstreamStatus, estimate) {
|
|
325
|
+
await this.transaction(async (tx) => {
|
|
326
|
+
const initial = await requestById(tx, requestId);
|
|
327
|
+
if (!initial)
|
|
328
|
+
return;
|
|
329
|
+
await tx.$queryRaw `
|
|
330
|
+
SELECT "id" FROM "CodingProxySession" WHERE "id" = ${initial.sessionId} FOR UPDATE
|
|
331
|
+
`;
|
|
332
|
+
const updated = await tx.$executeRaw `
|
|
333
|
+
UPDATE "CodingProxyRequest"
|
|
334
|
+
SET "status" = 'uncertain', "upstreamStatus" = ${upstreamStatus ?? null},
|
|
335
|
+
"actualCostUsd" = ${estimate?.costUsd ?? null},
|
|
336
|
+
"inputTokens" = ${estimate?.usage.inputTokens ?? null}, "outputTokens" = ${estimate?.usage.outputTokens ?? null},
|
|
337
|
+
"cachedInputTokens" = ${estimate?.usage.cachedInputTokens ?? null},
|
|
338
|
+
"cacheWriteTokens" = ${estimate?.usage.cacheWriteTokens ?? null},
|
|
339
|
+
"reasoningTokens" = ${estimate ? 0 : null},
|
|
340
|
+
"costEstimated" = ${estimate !== undefined}, "updatedAt" = CURRENT_TIMESTAMP
|
|
341
|
+
WHERE "id" = ${requestId} AND "status" = 'reserved'
|
|
342
|
+
`;
|
|
343
|
+
if (estimate && updated > 0)
|
|
344
|
+
await this.recomputeRunTotals(tx, initial.sessionId, initial.model);
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
async settlementHints(sessionId, model) {
|
|
348
|
+
const median = await this.db.$queryRaw `
|
|
349
|
+
SELECT percentile_disc(0.5) WITHIN GROUP (ORDER BY "outputTokens") AS "median"
|
|
350
|
+
FROM "CodingProxyRequest"
|
|
351
|
+
WHERE "sessionId" = ${sessionId} AND "model" = ${model} AND "status" = 'completed'
|
|
352
|
+
AND "outputTokens" IS NOT NULL
|
|
282
353
|
`;
|
|
354
|
+
const medianOutputTokens = median[0]?.median ?? null;
|
|
355
|
+
return {
|
|
356
|
+
...(medianOutputTokens !== null ? { medianOutputTokens: Number(medianOutputTokens) } : {}),
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
async previousReply(sessionId, conversationKey) {
|
|
360
|
+
const rows = await this.db.$queryRaw `
|
|
361
|
+
SELECT "model", "status", "costEstimated", "inputTokens", "outputTokens", "cachedInputTokens",
|
|
362
|
+
"cacheWriteTokens", "reasoningTokens", "requestBytes", "createdAt"
|
|
363
|
+
FROM "CodingProxyRequest"
|
|
364
|
+
WHERE "sessionId" = ${sessionId} AND "conversationKey" = ${conversationKey}
|
|
365
|
+
AND "status" IN ('completed', 'uncertain')
|
|
366
|
+
ORDER BY "createdAt" DESC LIMIT 1
|
|
367
|
+
`;
|
|
368
|
+
const row = rows[0];
|
|
369
|
+
if (!row)
|
|
370
|
+
return null;
|
|
371
|
+
const usage = row.inputTokens !== null && row.outputTokens !== null
|
|
372
|
+
? {
|
|
373
|
+
inputTokens: row.inputTokens,
|
|
374
|
+
outputTokens: row.outputTokens,
|
|
375
|
+
cachedInputTokens: row.cachedInputTokens ?? 0,
|
|
376
|
+
cacheWriteTokens: row.cacheWriteTokens ?? 0,
|
|
377
|
+
reasoningTokens: row.reasoningTokens ?? 0,
|
|
378
|
+
}
|
|
379
|
+
: undefined;
|
|
380
|
+
return {
|
|
381
|
+
model: row.model,
|
|
382
|
+
status: row.status,
|
|
383
|
+
costEstimated: row.costEstimated === true,
|
|
384
|
+
...(usage ? { usage } : {}),
|
|
385
|
+
requestBytes: row.requestBytes,
|
|
386
|
+
startedAt: row.createdAt,
|
|
387
|
+
};
|
|
283
388
|
}
|
|
284
389
|
async cancelSession(sessionId) {
|
|
285
390
|
await this.db.$executeRaw `
|
|
@@ -293,6 +398,13 @@ export class PrismaProxyLedger {
|
|
|
293
398
|
`;
|
|
294
399
|
return rows.length > 0;
|
|
295
400
|
}
|
|
401
|
+
async budgetRefusal(sessionId) {
|
|
402
|
+
const rows = await this.db.$queryRaw `
|
|
403
|
+
SELECT "budgetRefusal" FROM "CodingProxySession" WHERE "id" = ${sessionId}
|
|
404
|
+
`;
|
|
405
|
+
const value = rows[0]?.budgetRefusal;
|
|
406
|
+
return value && typeof value === "object" ? value : null;
|
|
407
|
+
}
|
|
296
408
|
async recordUpstreamFailure(sessionId, code) {
|
|
297
409
|
await this.db.$executeRaw `
|
|
298
410
|
UPDATE "CodingProxySession" SET "upstreamFailure" = ${code}, "updatedAt" = CURRENT_TIMESTAMP
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ModelPricing } from "../llm/pricing-core.js";
|
|
2
|
-
import type { CredentialResolver, ProxyAuditSink, ProxyLedger, ProxyModelTerms, ProxyProtocol } from "./types.js";
|
|
2
|
+
import type { CredentialResolver, ProxyAuditSink, ProxyLedger, ProxyModelTerms, ProxyProtocol, ProxyRefusalRecord } from "./types.js";
|
|
3
3
|
export declare const PROXY_MAX_BODY_BYTES: number;
|
|
4
4
|
export declare const PROXY_MAX_OUTPUT_TOKENS = 1000000;
|
|
5
5
|
export declare const PROXY_DEFAULT_MAX_OUTPUT_TOKENS = 4096;
|
|
@@ -64,6 +64,11 @@ export interface CodingProxyOptions {
|
|
|
64
64
|
audit?: ProxyAuditSink;
|
|
65
65
|
pricing?: (model: string, protocol: ProxyProtocol) => ModelPricing;
|
|
66
66
|
pricingVersion?: string;
|
|
67
|
+
/**
|
|
68
|
+
* Called with the run's id on every authenticated model request, before it is forwarded (the
|
|
69
|
+
* dependency cache's seal, ModelRequestSeal). Awaited; a failure is ignored, never the request's.
|
|
70
|
+
*/
|
|
71
|
+
onModelRequest?: (runId: string) => Promise<void>;
|
|
67
72
|
}
|
|
68
73
|
export declare function capabilityHash(capability: string): string;
|
|
69
74
|
export declare class CodingProxy {
|
|
@@ -76,11 +81,14 @@ export declare class CodingProxy {
|
|
|
76
81
|
private readonly getPricing;
|
|
77
82
|
private readonly priceVersion;
|
|
78
83
|
private readonly activeRequests;
|
|
84
|
+
private readonly onModelRequest?;
|
|
79
85
|
constructor(options: CodingProxyOptions);
|
|
80
86
|
createSession(input: CreateCodingProxySession): Promise<CreatedCodingProxySession>;
|
|
81
87
|
cancelSession(sessionId: string): Promise<void>;
|
|
82
88
|
/** Whether this session's run was refused a model request for budget. */
|
|
83
89
|
budgetExhausted(sessionId: string): Promise<boolean>;
|
|
90
|
+
/** The numbers behind this session's first budget refusal, if any. */
|
|
91
|
+
budgetRefusal(sessionId: string): Promise<ProxyRefusalRecord | null>;
|
|
84
92
|
/** The code of the first upstream failure relayed for this session's run, if any. */
|
|
85
93
|
upstreamFailure(sessionId: string): Promise<string | null>;
|
|
86
94
|
execute(input: ExecuteProxyRequest, sink: ProxyResponseSink): Promise<void>;
|
|
@@ -95,4 +103,9 @@ export declare class CodingProxy {
|
|
|
95
103
|
/** Best effort: the executor reads it to name the failure; it must never break the relay. */
|
|
96
104
|
private recordUpstreamFailure;
|
|
97
105
|
private markUncertain;
|
|
106
|
+
/**
|
|
107
|
+
* The best known cost of a request that broke before its final usage (interrupted.ts), or
|
|
108
|
+
* undefined when none can be made: the request then keeps its full hold. Never throws.
|
|
109
|
+
*/
|
|
110
|
+
private estimateInterrupted;
|
|
98
111
|
}
|