@wardby/cli 0.5.3 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +33 -0
- package/README.md +25 -14
- package/deploy/local/docker-compose.quickstart-coding.yml +13 -0
- package/dist/claude-coding-worker/context.d.ts +22 -0
- package/dist/claude-coding-worker/context.js +92 -0
- package/dist/claude-coding-worker/driver.d.ts +27 -3
- package/dist/claude-coding-worker/driver.js +161 -20
- package/dist/claude-coding-worker/main.js +34 -6
- package/dist/claude-coding-worker/sdk.js +25 -5
- package/dist/claude-coding-worker/tool-socket.d.ts +27 -0
- package/dist/claude-coding-worker/tool-socket.js +111 -0
- package/dist/claude-coding-worker/transcript.d.ts +18 -0
- package/dist/claude-coding-worker/transcript.js +77 -0
- package/dist/cli-help.d.ts +1 -1
- package/dist/cli-help.js +6 -2
- package/dist/cli-native-mode.d.ts +9 -0
- package/dist/cli-native-mode.js +20 -0
- package/dist/cli.d.ts +3 -1
- package/dist/cli.js +161 -11
- package/dist/coding/claude-context.d.ts +45 -0
- package/dist/coding/claude-context.js +434 -0
- package/dist/coding/continuation-wording.d.ts +35 -0
- package/dist/coding/continuation-wording.js +73 -0
- package/dist/coding/linked-issue-note.d.ts +23 -0
- package/dist/coding/linked-issue-note.js +47 -0
- package/dist/coding/merge-wording.d.ts +28 -0
- package/dist/coding/merge-wording.js +78 -0
- package/dist/coding/pr-description-note.d.ts +9 -0
- package/dist/coding/pr-description-note.js +32 -0
- package/dist/coding/profile.d.ts +50 -118
- package/dist/coding/profile.js +51 -4
- package/dist/coding/protected-path-wording.d.ts +8 -0
- package/dist/coding/protected-path-wording.js +1 -1
- package/dist/coding/protocol.d.ts +292 -270
- package/dist/coding/protocol.js +322 -15
- package/dist/coding/redact.d.ts +3 -0
- package/dist/coding/redact.js +12 -0
- package/dist/coding/registry/allowlist.d.ts +12 -0
- package/dist/coding/registry/allowlist.js +14 -1
- package/dist/coding/registry/audit-mode.d.ts +153 -0
- package/dist/coding/registry/audit-mode.js +304 -0
- package/dist/coding/registry/lockfile-shared.d.ts +36 -0
- package/dist/coding/registry/lockfile-shared.js +128 -0
- package/dist/coding/registry/lockfiles.js +1 -1
- package/dist/coding/registry/npm-lockfile-formats.d.ts +11 -0
- package/dist/coding/registry/npm-lockfile-formats.js +41 -0
- package/dist/coding/registry/npm-lockfile.d.ts +8 -4
- package/dist/coding/registry/npm-lockfile.js +4 -6
- package/dist/coding/registry/npm.js +78 -8
- package/dist/coding/registry/pnpm-lockfile.d.ts +17 -0
- package/dist/coding/registry/pnpm-lockfile.js +189 -0
- package/dist/coding/registry/pypi-plan.d.ts +50 -0
- package/dist/coding/registry/pypi-plan.js +406 -0
- package/dist/coding/registry/pypi-requirements.d.ts +58 -0
- package/dist/coding/registry/pypi-requirements.js +155 -0
- package/dist/coding/registry/pypi.d.ts +3 -27
- package/dist/coding/registry/pypi.js +40 -154
- package/dist/coding/registry/refusal-hints.d.ts +20 -0
- package/dist/coding/registry/refusal-hints.js +61 -0
- package/dist/coding/registry/refusal-wording.d.ts +11 -0
- package/dist/coding/registry/refusal-wording.js +56 -0
- package/dist/coding/registry/report.d.ts +70 -8
- package/dist/coding/registry/report.js +112 -5
- package/dist/coding/registry/types.d.ts +58 -8
- package/dist/coding/registry/yarn-lockfile.d.ts +30 -0
- package/dist/coding/registry/yarn-lockfile.js +367 -0
- package/dist/coding/services/catalog.d.ts +37 -351
- package/dist/coding/transcript/claude-code.d.ts +13 -0
- package/dist/coding/transcript/claude-code.js +273 -0
- package/dist/coding/transcript/download-protocol.d.ts +30 -0
- package/dist/coding/transcript/download-protocol.js +18 -0
- package/dist/coding/transcript/format.d.ts +20 -0
- package/dist/coding/transcript/format.js +32 -0
- package/dist/coding/transcript/recorder.d.ts +51 -0
- package/dist/coding/transcript/recorder.js +225 -0
- package/dist/coding/transcript/resume/checkout.d.ts +31 -0
- package/dist/coding/transcript/resume/checkout.js +203 -0
- package/dist/coding/transcript/resume/command.d.ts +17 -0
- package/dist/coding/transcript/resume/command.js +176 -0
- package/dist/coding/transcript/resume/download.d.ts +20 -0
- package/dist/coding/transcript/resume/download.js +153 -0
- package/dist/coding/transcript/resume/launch.d.ts +38 -0
- package/dist/coding/transcript/resume/launch.js +128 -0
- package/dist/coding/transcript/resume/session-file.d.ts +13 -0
- package/dist/coding/transcript/resume/session-file.js +79 -0
- package/dist/coding/transcript/resume/stand-in.d.ts +11 -0
- package/dist/coding/transcript/resume/stand-in.js +49 -0
- package/dist/coding-worker/artifact.d.ts +16 -3
- package/dist/coding-worker/artifact.js +5 -3
- package/dist/coding-worker/debug-trace.d.ts +6 -5
- package/dist/coding-worker/debug-trace.js +13 -18
- package/dist/coding-worker/dependency-cache.d.mts +229 -0
- package/dist/coding-worker/dependency-cache.mjs +2123 -0
- package/dist/coding-worker/driver.d.ts +4 -3
- package/dist/coding-worker/driver.js +118 -38
- package/dist/coding-worker/errors.d.ts +1 -0
- package/dist/coding-worker/errors.js +32 -0
- package/dist/coding-worker/sdk.d.ts +6 -0
- package/dist/coding-worker/sdk.js +1 -0
- package/dist/coding-worker/skills.d.ts +23 -0
- package/dist/coding-worker/skills.js +117 -0
- package/dist/coding-worker/task-note.d.ts +11 -0
- package/dist/coding-worker/task-note.js +13 -0
- package/dist/coding-worker/types.d.ts +13 -0
- package/dist/config/dependency-cache.d.ts +23 -0
- package/dist/config/dependency-cache.js +32 -0
- package/dist/config/github-allowed-accounts.d.ts +15 -0
- package/dist/config/github-allowed-accounts.js +36 -0
- package/dist/config/low-power.d.ts +12 -0
- package/dist/config/low-power.js +18 -0
- package/dist/config/mobile.d.ts +12 -0
- package/dist/config/mobile.js +18 -0
- package/dist/config/providers.d.ts +65 -3
- package/dist/config/providers.js +147 -11
- package/dist/config/test-simulators.d.ts +82 -0
- package/dist/config/test-simulators.js +305 -0
- package/dist/core/async-context.d.ts +2 -0
- package/dist/core/async-context.js +12 -0
- package/dist/core/budget-events.d.ts +108 -0
- package/dist/core/budget-events.js +346 -0
- package/dist/core/budget-groups.d.ts +50 -1
- package/dist/core/budget-groups.js +236 -27
- package/dist/core/budget-stopped-head.d.ts +46 -0
- package/dist/core/budget-stopped-head.js +81 -0
- package/dist/core/budget-topup.d.ts +51 -0
- package/dist/core/budget-topup.js +156 -0
- package/dist/core/budget-wording.d.ts +16 -2
- package/dist/core/budget-wording.js +40 -2
- package/dist/core/coding-queue.d.ts +2 -1
- package/dist/core/coding-queue.js +7 -0
- package/dist/core/cron.d.ts +19 -1
- package/dist/core/cron.js +17 -0
- package/dist/core/datastores.js +1 -1
- package/dist/core/db.d.ts +16 -6
- package/dist/core/db.js +12 -10
- package/dist/core/deferred-coding.d.ts +14 -0
- package/dist/core/deferred-coding.js +62 -0
- package/dist/core/delegation-child.d.ts +25 -0
- package/dist/core/delegation-child.js +37 -0
- package/dist/core/dispatch.d.ts +53 -0
- package/dist/core/dispatch.js +167 -57
- package/dist/core/engine-native.js +10 -6
- package/dist/core/error-code.d.ts +38 -0
- package/dist/core/error-code.js +168 -0
- package/dist/core/grants.d.ts +19 -6
- package/dist/core/grants.js +55 -6
- package/dist/core/host-events.d.ts +67 -5
- package/dist/core/host-events.js +571 -37
- package/dist/core/host-status.d.ts +85 -3
- package/dist/core/host-status.js +298 -20
- package/dist/core/issue-bridge.d.ts +50 -6
- package/dist/core/issue-bridge.js +151 -20
- package/dist/core/issue-events.d.ts +1 -1
- package/dist/core/issue-events.js +16 -11
- package/dist/core/issue-status.d.ts +1 -1
- package/dist/core/issue-status.js +68 -29
- package/dist/core/logger.d.ts +5 -0
- package/dist/core/logger.js +14 -1
- package/dist/core/lost-run-children.d.ts +6 -0
- package/dist/core/lost-run-children.js +32 -0
- package/dist/core/mark-ready.d.ts +34 -0
- package/dist/core/mark-ready.js +152 -0
- package/dist/core/markdown-code.d.ts +8 -0
- package/dist/core/markdown-code.js +107 -0
- package/dist/core/memory-tools.js +7 -0
- package/dist/core/merge-order-check.d.ts +130 -0
- package/dist/core/merge-order-check.js +343 -0
- package/dist/core/notification-dispatcher.d.ts +70 -0
- package/dist/core/notification-dispatcher.js +368 -0
- package/dist/core/notification-templates.d.ts +19 -0
- package/dist/core/notification-templates.js +139 -0
- package/dist/core/notifications.d.ts +10 -0
- package/dist/core/notifications.js +38 -0
- package/dist/core/pg-auth.d.ts +22 -0
- package/dist/core/pg-auth.js +152 -0
- package/dist/core/power-composition.d.ts +16 -0
- package/dist/core/power-composition.js +37 -0
- package/dist/core/power-idle.d.ts +14 -0
- package/dist/core/power-idle.js +30 -0
- package/dist/core/power.d.ts +71 -0
- package/dist/core/power.js +202 -0
- package/dist/core/pull-request-state-sync.js +2 -2
- package/dist/core/reconciler.d.ts +8 -5
- package/dist/core/reconciler.js +37 -6
- package/dist/core/related-pull-requests.d.ts +59 -7
- package/dist/core/related-pull-requests.js +140 -25
- package/dist/core/reply-parts.d.ts +21 -0
- package/dist/core/reply-parts.js +73 -0
- package/dist/core/repo-access.d.ts +15 -0
- package/dist/core/repo-access.js +66 -0
- package/dist/core/review-fix.d.ts +38 -1
- package/dist/core/review-fix.js +209 -7
- package/dist/core/review-host-checks.d.ts +1 -1
- package/dist/core/review-host-tools.d.ts +23 -0
- package/dist/core/review-host-tools.js +156 -14
- package/dist/core/review-reads.d.ts +55 -0
- package/dist/core/review-reads.js +233 -0
- package/dist/core/run-status.d.ts +12 -0
- package/dist/core/run-status.js +12 -0
- package/dist/core/runner.d.ts +384 -5
- package/dist/core/runner.js +1244 -372
- package/dist/core/schedule-start.d.ts +12 -0
- package/dist/core/schedule-start.js +14 -0
- package/dist/core/secret-broker-config.d.ts +39 -0
- package/dist/core/secret-broker-config.js +112 -0
- package/dist/core/secret-guard.d.ts +46 -0
- package/dist/core/secret-guard.js +104 -0
- package/dist/core/secret-guarded-stores.d.ts +12 -0
- package/dist/core/secret-guarded-stores.js +41 -0
- package/dist/core/secret-spans.d.ts +50 -0
- package/dist/core/secret-spans.js +94 -0
- package/dist/core/secrets.d.ts +39 -4
- package/dist/core/secrets.js +148 -40
- package/dist/core/stop-run.d.ts +46 -0
- package/dist/core/stop-run.js +61 -0
- package/dist/core/workflow-event-recorder.d.ts +14 -0
- package/dist/core/workflow-event-recorder.js +120 -0
- package/dist/core/workflow-events.d.ts +94 -0
- package/dist/core/workflow-events.js +48 -0
- package/dist/core/workflow-run-events.d.ts +18 -0
- package/dist/core/workflow-run-events.js +75 -0
- package/dist/core/zod-json-schema.d.ts +4 -0
- package/dist/core/zod-json-schema.js +39 -0
- package/dist/core/zod3-window.d.ts +35 -0
- package/dist/core/zod3-window.js +124 -0
- package/dist/generated/prisma/browser.d.ts +92 -3
- package/dist/generated/prisma/client.d.ts +92 -3
- package/dist/generated/prisma/commonInputTypes.d.ts +364 -54
- package/dist/generated/prisma/enums.d.ts +37 -0
- package/dist/generated/prisma/enums.js +31 -0
- package/dist/generated/prisma/internal/class.d.ts +132 -0
- package/dist/generated/prisma/internal/class.js +4 -4
- package/dist/generated/prisma/internal/prismaNamespace.d.ts +1332 -142
- package/dist/generated/prisma/internal/prismaNamespace.js +227 -5
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +234 -0
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +227 -5
- package/dist/generated/prisma/models/Agent.d.ts +464 -7
- package/dist/generated/prisma/models/AgentRepository.d.ts +42 -1
- package/dist/generated/prisma/models/CodingAgentProfile.d.ts +301 -1
- package/dist/generated/prisma/models/CodingProxyRequest.d.ts +207 -3
- package/dist/generated/prisma/models/CodingProxySession.d.ts +114 -1
- package/dist/generated/prisma/models/CodingRun.d.ts +1841 -1
- package/dist/generated/prisma/models/DeferredReview.d.ts +78 -1
- package/dist/generated/prisma/models/DependencySnapshot.d.ts +1668 -0
- package/dist/generated/prisma/models/DependencySnapshot.js +1 -0
- package/dist/generated/prisma/models/IssuePullRequest.d.ts +6 -2
- package/dist/generated/prisma/models/LocalReview.d.ts +40 -1
- package/dist/generated/prisma/models/NativeGatewayCall.d.ts +1713 -0
- package/dist/generated/prisma/models/NativeGatewayCall.js +1 -0
- package/dist/generated/prisma/models/NativeGatewaySession.d.ts +1551 -0
- package/dist/generated/prisma/models/NativeGatewaySession.js +1 -0
- package/dist/generated/prisma/models/NativeWarmWorker.d.ts +1296 -0
- package/dist/generated/prisma/models/NativeWarmWorker.js +1 -0
- package/dist/generated/prisma/models/NotificationChannel.d.ts +1543 -0
- package/dist/generated/prisma/models/NotificationChannel.js +1 -0
- package/dist/generated/prisma/models/NotificationDelivery.d.ts +1502 -0
- package/dist/generated/prisma/models/NotificationDelivery.js +1 -0
- package/dist/generated/prisma/models/NotificationThread.d.ts +1090 -0
- package/dist/generated/prisma/models/NotificationThread.js +1 -0
- package/dist/generated/prisma/models/RegistryAllowance.d.ts +41 -1
- package/dist/generated/prisma/models/RegistryApprovedVersion.d.ts +75 -1
- package/dist/generated/prisma/models/RegistryAuditRecord.d.ts +1364 -0
- package/dist/generated/prisma/models/RegistryAuditRecord.js +1 -0
- package/dist/generated/prisma/models/Run.d.ts +1619 -58
- package/dist/generated/prisma/models/RunBudgetEvent.d.ts +1211 -0
- package/dist/generated/prisma/models/RunBudgetEvent.js +1 -0
- package/dist/generated/prisma/models/RunHostCheck.d.ts +36 -1
- package/dist/generated/prisma/models/RunTranscript.d.ts +1339 -0
- package/dist/generated/prisma/models/RunTranscript.js +1 -0
- package/dist/generated/prisma/models/Secret.d.ts +37 -1
- package/dist/generated/prisma/models/SecretBrokerChange.d.ts +1101 -0
- package/dist/generated/prisma/models/SecretBrokerChange.js +1 -0
- package/dist/generated/prisma/models/WorkflowEvent.d.ts +1422 -0
- package/dist/generated/prisma/models/WorkflowEvent.js +1 -0
- package/dist/generated/prisma/models.d.ts +12 -0
- package/dist/help/build.js +4 -2
- package/dist/help/catalog.d.ts +1 -1
- package/dist/help/catalog.js +31 -6
- package/dist/help-index.json +2584 -146
- package/dist/import/create.js +49 -3
- package/dist/import/neutral-schema.d.ts +50 -277
- package/dist/import/neutral-schema.js +7 -4
- package/dist/knowledge/check.d.ts +1 -1
- package/dist/knowledge/cli.d.ts +11 -1
- package/dist/knowledge/cli.js +37 -4
- package/dist/knowledge/concept.d.ts +3 -19
- package/dist/knowledge/location.d.ts +31 -0
- package/dist/knowledge/location.js +78 -0
- package/dist/mcp/auth/access.d.ts +11 -2
- package/dist/mcp/auth/access.js +15 -1
- package/dist/mcp/auth/ownership.d.ts +7 -7
- package/dist/mcp/auth/repo-authorization.js +14 -0
- package/dist/mcp/auth/resource-server.d.ts +2 -1
- package/dist/mcp/auth/resource-server.js +7 -2
- package/dist/mcp/auth/self-hosted/browser.d.ts +1 -1
- package/dist/mcp/auth/self-hosted/browser.js +19 -6
- package/dist/mcp/auth/self-hosted/credentials.d.ts +3 -3
- package/dist/mcp/auth/self-hosted/session.d.ts +2 -2
- package/dist/mcp/context.d.ts +6 -0
- package/dist/mcp/host-events/github-ingress.d.ts +25 -1
- package/dist/mcp/host-events/github-ingress.js +70 -1
- package/dist/mcp/index.d.ts +19 -0
- package/dist/mcp/index.js +117 -20
- package/dist/mcp/server.d.ts +13 -0
- package/dist/mcp/server.js +33 -14
- package/dist/mcp/tools/agents.d.ts +4 -0
- package/dist/mcp/tools/agents.js +277 -24
- package/dist/mcp/tools/datastore.js +17 -8
- package/dist/mcp/tools/grants.js +9 -3
- package/dist/mcp/tools/memory.js +11 -1
- package/dist/mcp/tools/notification-channels.d.ts +2 -0
- package/dist/mcp/tools/notification-channels.js +293 -0
- package/dist/mcp/tools/packages.d.ts +2 -0
- package/dist/mcp/tools/packages.js +195 -0
- package/dist/mcp/tools/power.d.ts +2 -0
- package/dist/mcp/tools/power.js +77 -0
- package/dist/mcp/tools/repositories.js +18 -5
- package/dist/mcp/tools/run-access.d.ts +16 -0
- package/dist/mcp/tools/run-access.js +25 -0
- package/dist/mcp/tools/run-transcript-download.d.ts +30 -0
- package/dist/mcp/tools/run-transcript-download.js +129 -0
- package/dist/mcp/tools/run-transcript.d.ts +19 -0
- package/dist/mcp/tools/run-transcript.js +70 -0
- package/dist/mcp/tools/runs.d.ts +0 -6
- package/dist/mcp/tools/runs.js +41 -14
- package/dist/mcp/tools/scheduling.js +3 -1
- package/dist/mcp/tools/secret-broker-compat.d.ts +12 -0
- package/dist/mcp/tools/secret-broker-compat.js +23 -0
- package/dist/mcp/tools/secret-elicitation-form.d.ts +22 -2
- package/dist/mcp/tools/secret-elicitation-form.js +205 -10
- package/dist/mcp/tools/secret-elicitation-server.d.ts +6 -0
- package/dist/mcp/tools/secret-elicitation-server.js +10 -54
- package/dist/mcp/tools/secret-elicitation.d.ts +38 -3
- package/dist/mcp/tools/secret-elicitation.js +110 -12
- package/dist/mcp/tools/secrets.js +186 -9
- package/dist/mcp/tools/stop-run.d.ts +2 -0
- package/dist/mcp/tools/stop-run.js +82 -0
- package/dist/mcp/tools/subagents.js +2 -2
- package/dist/mcp/tools/tools.d.ts +2 -2
- package/dist/mcp/tools/tools.js +47 -11
- package/dist/mcp/transport/stdio-link-host.d.ts +20 -0
- package/dist/mcp/transport/stdio-link-host.js +67 -0
- package/dist/mcp/transport/streamable-http.d.ts +13 -0
- package/dist/mcp/transport/streamable-http.js +41 -1
- package/dist/native-worker/composition.d.ts +23 -0
- package/dist/native-worker/composition.js +77 -0
- package/dist/native-worker/docker-isolation.d.ts +65 -0
- package/dist/native-worker/docker-isolation.js +183 -0
- package/dist/native-worker/docker-launcher.d.ts +110 -0
- package/dist/native-worker/docker-launcher.js +297 -0
- package/dist/native-worker/gateway-server.d.ts +77 -0
- package/dist/native-worker/gateway-server.js +412 -0
- package/dist/native-worker/gateway.d.ts +70 -0
- package/dist/native-worker/gateway.js +263 -0
- package/dist/native-worker/http-server.d.ts +24 -0
- package/dist/native-worker/http-server.js +113 -0
- package/dist/native-worker/http-transport.d.ts +17 -0
- package/dist/native-worker/http-transport.js +88 -0
- package/dist/native-worker/kubernetes-isolation.d.ts +90 -0
- package/dist/native-worker/kubernetes-isolation.js +218 -0
- package/dist/native-worker/kubernetes-launcher.d.ts +106 -0
- package/dist/native-worker/kubernetes-launcher.js +375 -0
- package/dist/native-worker/launch.d.ts +62 -0
- package/dist/native-worker/launch.js +49 -0
- package/dist/native-worker/ledger.d.ts +125 -0
- package/dist/native-worker/ledger.js +245 -0
- package/dist/native-worker/loopback.d.ts +12 -0
- package/dist/native-worker/loopback.js +44 -0
- package/dist/native-worker/main.d.ts +8 -0
- package/dist/native-worker/main.js +85 -0
- package/dist/native-worker/protocol.d.ts +296 -0
- package/dist/native-worker/protocol.js +246 -0
- package/dist/native-worker/sandbox-executor.d.ts +83 -0
- package/dist/native-worker/sandbox-executor.js +284 -0
- package/dist/native-worker/stderr-redaction.d.ts +77 -0
- package/dist/native-worker/stderr-redaction.js +237 -0
- package/dist/native-worker/stdio.d.ts +29 -0
- package/dist/native-worker/stdio.js +189 -0
- package/dist/native-worker/warm-delivery.d.ts +16 -0
- package/dist/native-worker/warm-delivery.js +33 -0
- package/dist/native-worker/warm-pool-ledger.d.ts +39 -0
- package/dist/native-worker/warm-pool-ledger.js +73 -0
- package/dist/native-worker/warm-pool.d.ts +107 -0
- package/dist/native-worker/warm-pool.js +283 -0
- package/dist/native-worker/worker.d.ts +17 -0
- package/dist/native-worker/worker.js +141 -0
- package/dist/observability/metrics.js +6 -1
- package/dist/providers/auth/authorization-server.d.ts +3 -0
- package/dist/providers/auth/index.js +2 -0
- package/dist/providers/auth/self-hosted.d.ts +14 -2
- package/dist/providers/auth/self-hosted.js +54 -4
- package/dist/providers/chat/fake.d.ts +46 -0
- package/dist/providers/chat/fake.js +39 -0
- package/dist/providers/chat/index.d.ts +4 -0
- package/dist/providers/chat/index.js +8 -0
- package/dist/providers/chat/slack.d.ts +37 -0
- package/dist/providers/chat/slack.js +105 -0
- package/dist/providers/chat/types.d.ts +42 -0
- package/dist/providers/chat/types.js +19 -0
- package/dist/providers/coding-proxy/dependency-cache/eviction.d.ts +29 -0
- package/dist/providers/coding-proxy/dependency-cache/eviction.js +87 -0
- package/dist/providers/coding-proxy/dependency-cache/key.d.ts +33 -0
- package/dist/providers/coding-proxy/dependency-cache/key.js +86 -0
- package/dist/providers/coding-proxy/dependency-cache/model-request-seal.d.ts +18 -0
- package/dist/providers/coding-proxy/dependency-cache/model-request-seal.js +40 -0
- package/dist/providers/coding-proxy/dependency-cache/prisma-store.d.ts +25 -0
- package/dist/providers/coding-proxy/dependency-cache/prisma-store.js +131 -0
- package/dist/providers/coding-proxy/dependency-cache/service.d.ts +70 -0
- package/dist/providers/coding-proxy/dependency-cache/service.js +409 -0
- package/dist/providers/coding-proxy/dependency-cache/store.d.ts +85 -0
- package/dist/providers/coding-proxy/dependency-cache/store.js +95 -0
- package/dist/providers/coding-proxy/hold.d.ts +32 -0
- package/dist/providers/coding-proxy/hold.js +86 -0
- package/dist/providers/coding-proxy/interrupted.d.ts +70 -0
- package/dist/providers/coding-proxy/interrupted.js +104 -0
- package/dist/providers/coding-proxy/memory-ledger.d.ts +15 -2
- package/dist/providers/coding-proxy/memory-ledger.js +84 -8
- package/dist/providers/coding-proxy/metering.d.ts +16 -0
- package/dist/providers/coding-proxy/metering.js +27 -4
- package/dist/providers/coding-proxy/prisma-ledger.d.ts +15 -2
- package/dist/providers/coding-proxy/prisma-ledger.js +179 -67
- package/dist/providers/coding-proxy/proxy.d.ts +14 -1
- package/dist/providers/coding-proxy/proxy.js +166 -14
- package/dist/providers/coding-proxy/registry/audit.d.ts +53 -10
- package/dist/providers/coding-proxy/registry/audit.js +94 -17
- package/dist/providers/coding-proxy/registry/lockfile-parse-worker.d.ts +36 -0
- package/dist/providers/coding-proxy/registry/lockfile-parse-worker.js +67 -0
- package/dist/providers/coding-proxy/registry/lockfile-parse.d.ts +16 -0
- package/dist/providers/coding-proxy/registry/lockfile-parse.js +110 -0
- package/dist/providers/coding-proxy/registry/plan.d.ts +9 -0
- package/dist/providers/coding-proxy/registry/plan.js +201 -48
- package/dist/providers/coding-proxy/registry/prisma-store.d.ts +11 -5
- package/dist/providers/coding-proxy/registry/prisma-store.js +120 -17
- package/dist/providers/coding-proxy/registry/service.d.ts +97 -16
- package/dist/providers/coding-proxy/registry/service.js +579 -112
- package/dist/providers/coding-proxy/registry/store.d.ts +84 -9
- package/dist/providers/coding-proxy/registry/store.js +54 -1
- package/dist/providers/coding-proxy/runtime.d.ts +4 -0
- package/dist/providers/coding-proxy/runtime.js +78 -16
- package/dist/providers/coding-proxy/server.d.ts +6 -1
- package/dist/providers/coding-proxy/server.js +45 -1
- package/dist/providers/coding-proxy/types.d.ts +65 -1
- package/dist/providers/datastore/types.d.ts +5 -0
- package/dist/providers/engine/types.d.ts +36 -2
- package/dist/providers/engine/types.js +39 -0
- package/dist/providers/executor/composition.d.ts +31 -1
- package/dist/providers/executor/composition.js +81 -8
- package/dist/providers/executor/container.d.ts +385 -9
- package/dist/providers/executor/container.js +1234 -99
- package/dist/providers/executor/dbos-status.d.ts +31 -0
- package/dist/providers/executor/dbos-status.js +64 -0
- package/dist/providers/executor/dbos.d.ts +91 -0
- package/dist/providers/executor/dbos.js +319 -26
- package/dist/providers/executor/deferred.d.ts +44 -0
- package/dist/providers/executor/deferred.js +100 -0
- package/dist/providers/executor/in-process.d.ts +9 -1
- package/dist/providers/executor/in-process.js +14 -4
- package/dist/providers/executor/linked-issue-reader.d.ts +16 -0
- package/dist/providers/executor/linked-issue-reader.js +30 -0
- package/dist/providers/executor/routing.d.ts +39 -10
- package/dist/providers/executor/routing.js +77 -32
- package/dist/providers/executor/types.d.ts +25 -0
- package/dist/providers/index.d.ts +2 -1
- package/dist/providers/issue-tracker/types.d.ts +17 -0
- package/dist/providers/issue-tracker/types.js +39 -1
- package/dist/providers/jobs/claude-tool-setup.d.ts +4 -0
- package/dist/providers/jobs/claude-tool-setup.js +5 -2
- package/dist/providers/jobs/docker-isolation.d.ts +8 -0
- package/dist/providers/jobs/docker-isolation.js +17 -0
- package/dist/providers/jobs/docker.d.ts +1 -0
- package/dist/providers/jobs/docker.js +29 -4
- package/dist/providers/jobs/fake-kubernetes-api.d.ts +23 -2
- package/dist/providers/jobs/fake-kubernetes-api.js +45 -1
- package/dist/providers/jobs/kubernetes-api.d.ts +25 -1
- package/dist/providers/jobs/kubernetes-api.js +17 -0
- package/dist/providers/jobs/kubernetes-client.d.ts +10 -1
- package/dist/providers/jobs/kubernetes-client.js +61 -3
- package/dist/providers/jobs/kubernetes-dry-run-fixture.d.ts +6 -1
- package/dist/providers/jobs/kubernetes-dry-run-fixture.js +6 -3
- package/dist/providers/jobs/kubernetes-isolation.d.ts +5 -1
- package/dist/providers/jobs/kubernetes-isolation.js +23 -1
- package/dist/providers/jobs/kubernetes-platform.d.ts +4 -1
- package/dist/providers/jobs/kubernetes-platform.js +38 -1
- package/dist/providers/jobs/kubernetes-preflight.d.ts +2 -1
- package/dist/providers/jobs/kubernetes-preflight.js +4 -2
- package/dist/providers/jobs/kubernetes.d.ts +42 -2
- package/dist/providers/jobs/kubernetes.js +178 -19
- package/dist/providers/jobs/metadata-probes.d.ts +11 -0
- package/dist/providers/jobs/metadata-probes.js +13 -0
- package/dist/providers/jobs/types.d.ts +42 -0
- package/dist/providers/jobs/types.js +13 -1
- package/dist/providers/llm/anthropic.js +5 -1
- package/dist/providers/llm/bedrock.d.ts +0 -12
- package/dist/providers/llm/bedrock.js +4 -0
- package/dist/providers/llm/claude-messages.d.ts +3 -1
- package/dist/providers/llm/claude-messages.js +4 -1
- package/dist/providers/llm/claude-provider.d.ts +2 -2
- package/dist/providers/llm/claude-provider.js +2 -2
- package/dist/providers/llm/openai.d.ts +2 -2
- package/dist/providers/llm/openai.js +6 -2
- package/dist/providers/llm/routing.d.ts +2 -2
- package/dist/providers/llm/routing.js +2 -2
- package/dist/providers/llm/types.d.ts +12 -2
- package/dist/providers/review-host/github-events.d.ts +9 -1
- package/dist/providers/review-host/github-events.js +34 -12
- package/dist/providers/review-host/github.d.ts +39 -2
- package/dist/providers/review-host/github.js +274 -29
- package/dist/providers/review-host/local.d.ts +8 -4
- package/dist/providers/review-host/local.js +49 -31
- package/dist/providers/review-host/patch-pages.d.ts +41 -0
- package/dist/providers/review-host/patch-pages.js +176 -0
- package/dist/providers/review-host/review-format.d.ts +19 -1
- package/dist/providers/review-host/review-format.js +38 -7
- package/dist/providers/review-host/types.d.ts +157 -2
- package/dist/providers/review-host/types.js +8 -0
- package/dist/providers/storage/gcs.d.ts +63 -0
- package/dist/providers/storage/gcs.js +69 -0
- package/dist/providers/storage/index.d.ts +15 -0
- package/dist/providers/storage/index.js +14 -0
- package/dist/providers/storage/local.d.ts +24 -0
- package/dist/providers/storage/local.js +92 -0
- package/dist/providers/storage/meter.d.ts +14 -0
- package/dist/providers/storage/meter.js +34 -0
- package/dist/providers/storage/s3.d.ts +41 -0
- package/dist/providers/storage/s3.js +107 -0
- package/dist/providers/storage/types.d.ts +37 -3
- package/dist/providers/storage/types.js +21 -4
- package/dist/providers/vcs/git.d.ts +33 -2
- package/dist/providers/vcs/git.js +324 -22
- package/dist/providers/vcs/github-remote.d.ts +26 -3
- package/dist/providers/vcs/github-remote.js +124 -14
- package/dist/providers/vcs/github.d.ts +246 -12
- package/dist/providers/vcs/github.js +521 -61
- package/dist/providers/vcs/index.js +8 -1
- package/dist/providers/vcs/pr-description.d.ts +127 -0
- package/dist/providers/vcs/pr-description.js +270 -0
- package/dist/providers/vcs/remote.d.ts +33 -1
- package/dist/providers/vcs/routing.d.ts +4 -2
- package/dist/providers/vcs/routing.js +6 -0
- package/dist/providers/vcs/types.d.ts +80 -3
- package/dist/quickstart/coding-seed.d.ts +21 -3
- package/dist/quickstart/coding-seed.js +283 -3
- package/dist/quickstart/images.d.ts +2 -0
- package/dist/quickstart/images.js +7 -1
- package/dist/quickstart/reviewer-prompt.d.ts +1 -1
- package/dist/quickstart/reviewer-prompt.js +6 -6
- package/dist/quickstart-images.json +1 -1
- package/dist/sandbox/brokered-fetch.d.ts +23 -0
- package/dist/sandbox/brokered-fetch.js +37 -0
- package/dist/sandbox/generated/zod.bundle.js +62 -1
- package/dist/sandbox/generated/zod3.bundle.js +5 -0
- package/dist/sandbox/host-functions.d.ts +35 -0
- package/dist/sandbox/host-functions.js +150 -91
- package/dist/sandbox/prelude.js +7 -1
- package/dist/sandbox/run-in-sandbox.d.ts +19 -0
- package/dist/sandbox/run-in-sandbox.js +28 -10
- package/dist/sandbox/safe-fetch.d.ts +2 -0
- package/dist/sandbox/safe-fetch.js +3 -1
- package/dist/sandbox/secret-broker-sigv4.d.ts +2 -0
- package/dist/sandbox/secret-broker-sigv4.js +49 -0
- package/dist/sandbox/secret-broker.d.ts +34 -0
- package/dist/sandbox/secret-broker.js +161 -0
- package/dist/sandbox/tool-capabilities.d.ts +10 -30
- package/dist/sandbox/user-tool.d.ts +14 -0
- package/dist/sandbox/user-tool.js +32 -0
- package/dist/sandbox/zod-params.d.ts +37 -5
- package/dist/sandbox/zod-params.js +181 -26
- package/dist/serve.js +25 -0
- package/dist/viewer/api-schema.d.ts +372 -2454
- package/dist/viewer/api-schema.js +29 -0
- package/dist/viewer/build-schemas.js +10 -3
- package/dist/viewer/event-bus.d.ts +6 -0
- package/dist/viewer/event-bus.js +16 -7
- package/dist/viewer/graph.d.ts +5 -2
- package/dist/viewer/graph.js +7 -2
- package/dist/viewer/http.d.ts +0 -1
- package/dist/viewer/http.js +2 -2
- package/dist/viewer/infra.js +25 -2
- package/dist/viewer/limits.d.ts +4 -0
- package/dist/viewer/limits.js +4 -0
- package/dist/viewer/openapi.d.ts +15 -0
- package/dist/viewer/openapi.js +170 -0
- package/dist/wardby-bin.js +10 -0
- package/docs/README.md +7 -0
- package/docs/agent-recipes.md +114 -27
- package/docs/architecture-runtime.md +16 -1
- package/docs/code-review-agents.md +689 -45
- package/docs/coding-agent-setup.md +602 -12
- package/docs/coding-packages.md +1037 -92
- package/docs/coding-services.md +30 -13
- package/docs/coding-worker-byo-images.md +218 -6
- package/docs/coding-worker-isolation.md +173 -44
- package/docs/getting-started-gke.md +332 -129
- package/docs/getting-started-identity-provider.md +31 -11
- package/docs/getting-started.md +14 -4
- package/docs/jira-agents.md +22 -9
- package/docs/knowledge/blob-not-found-semantics.md +41 -0
- package/docs/knowledge/bounded-file-descriptor.md +52 -0
- package/docs/knowledge/delegation-admission-slots.md +52 -0
- package/docs/knowledge/http-dispatcher-bootstrap.md +61 -0
- package/docs/knowledge/import-rename-target.md +52 -0
- package/docs/knowledge/index.md +57 -0
- package/docs/knowledge/log.md +9 -0
- package/docs/knowledge/mcp-cancelled-task-precedence.md +41 -0
- package/docs/knowledge/mcp-http-prompt-discovery.md +41 -0
- package/docs/knowledge/mcp-schema-module-boundary.md +41 -0
- package/docs/knowledge/nullable-tool-uniqueness.md +52 -0
- package/docs/knowledge/overview-cli.md +74 -0
- package/docs/knowledge/overview-coding-proxy.md +72 -0
- package/docs/knowledge/overview-coding.md +72 -0
- package/docs/knowledge/overview-config.md +60 -0
- package/docs/knowledge/overview-core.md +72 -0
- package/docs/knowledge/overview-deploy.md +83 -0
- package/docs/knowledge/overview-mcp.md +61 -0
- package/docs/knowledge/overview-prisma.md +72 -0
- package/docs/knowledge/overview-providers.md +89 -0
- package/docs/knowledge/overview-sandbox.md +83 -0
- package/docs/knowledge/overview-surfaces.md +83 -0
- package/docs/knowledge/private-datastore-shared-boundary.md +54 -0
- package/docs/knowledge/proxy-settlement-projections.md +41 -0
- package/docs/knowledge/run-pricing-first-writer.md +43 -0
- package/docs/knowledge/schedule-claim-transaction.md +41 -0
- package/docs/knowledge/secret-entry-replica-contract.md +52 -0
- package/docs/knowledge/terminal-run-first-writer.md +41 -0
- package/docs/knowledge/transactional-agent-authorization.md +52 -0
- package/docs/knowledge/viewer-notify-write-isolation.md +30 -0
- package/docs/knowledge/warm-input-publication.md +30 -0
- package/docs/knowledge/workspace-staging-failure.md +54 -0
- package/docs/knowledge.md +54 -14
- package/docs/native-sandbox.md +731 -0
- package/docs/observability.md +4 -0
- package/docs/release-verification.md +9 -0
- package/docs/security-deployment.md +146 -14
- package/docs/slack-notifications.md +268 -0
- package/docs/tool-secrets.md +284 -0
- package/docs/viewer-api.md +46 -5
- package/docs/viewer-api.openapi.yml +1404 -0
- package/help/admin-viewer.md +29 -3
- package/help/agent-recipes.md +27 -0
- package/help/architecture-agent.md +11 -6
- package/help/brokered-secrets.md +79 -0
- package/help/build-claude-code-image.md +131 -0
- package/help/build-worker-image.md +6 -7
- package/help/builder-agent.md +19 -6
- package/help/code-review-agents.md +243 -10
- package/help/coding-packages.md +156 -6
- package/help/cost-attribution.md +9 -5
- package/help/creating-agents.md +14 -1
- package/help/dependency-cache.md +143 -0
- package/help/deploy-gke.md +23 -9
- package/help/deployment-targets.md +25 -14
- package/help/errors/budget-exhausted.md +187 -0
- package/help/errors/budget-group-exhausted.md +5 -1
- package/help/errors/coding-provider-not-configured.md +2 -2
- package/help/errors/coding-stream-quota-exceeded.md +33 -0
- package/help/errors/coding-workspace-disk-exceeds-limit.md +39 -0
- package/help/errors/continuation-closed.md +9 -12
- package/help/errors/database-auth-invalid.md +28 -0
- package/help/errors/delegation-conflict.md +24 -0
- package/help/errors/file-list-truncated.md +45 -0
- package/help/errors/full-read-required.md +49 -0
- package/help/errors/github-account-not-allowed.md +29 -0
- package/help/errors/graph-incomplete.md +43 -0
- package/help/errors/graph-limit.md +43 -0
- package/help/errors/low-power-disabled.md +29 -0
- package/help/errors/low-power-scale-forbidden.md +35 -0
- package/help/errors/low-power-wake-timeout.md +30 -0
- package/help/errors/merge-conflict.md +49 -0
- package/help/errors/mobile-disabled.md +31 -0
- package/help/errors/native-sandbox-capacity.md +22 -0
- package/help/errors/native-sandbox-deadline-exceeded.md +19 -0
- package/help/errors/native-sandbox-docker-failed.md +20 -0
- package/help/errors/native-sandbox-gateway-error.md +20 -0
- package/help/errors/native-sandbox-gateway-unavailable.md +21 -0
- package/help/errors/native-sandbox-image-not-pinned.md +19 -0
- package/help/errors/native-sandbox-isolation-mismatch.md +20 -0
- package/help/errors/native-sandbox-launch-abandoned.md +21 -0
- package/help/errors/native-sandbox-network-unenforced.md +22 -0
- package/help/errors/native-sandbox-requires-catalog.md +31 -0
- package/help/errors/native-sandbox-unavailable.md +19 -0
- package/help/errors/native-sandbox-warm-delivery-failed.md +21 -0
- package/help/errors/native-sandbox-worker-exited.md +21 -0
- package/help/errors/native-sandbox-worker-lost.md +20 -0
- package/help/errors/native-sandbox-worker-unready.md +22 -0
- package/help/errors/package-not-allowed-pending.md +52 -0
- package/help/errors/package-not-allowed.md +51 -0
- package/help/errors/package-refusals.md +43 -0
- package/help/errors/patch-cursor-malformed.md +31 -0
- package/help/errors/run-lost.md +39 -0
- package/help/errors/run-transcript-download.md +44 -0
- package/help/errors/secret-broker-body-invalid.md +26 -0
- package/help/errors/secret-broker-changed.md +20 -0
- package/help/errors/secret-broker-config-invalid.md +30 -0
- package/help/errors/secret-broker-conflict.md +27 -0
- package/help/errors/secret-broker-destination-denied.md +28 -0
- package/help/errors/secret-broker-value-invalid.md +28 -0
- package/help/errors/secret-brokered.md +24 -0
- package/help/errors/secret-in-value.md +69 -0
- package/help/errors/secret-not-brokered.md +25 -0
- package/help/errors/slack-auth-failed.md +48 -0
- package/help/errors/slack-channel-unreachable.md +39 -0
- package/help/errors/slack-not-configured.md +33 -0
- package/help/errors/target-merge.md +40 -0
- package/help/fix-merge-conflicts.md +73 -0
- package/help/getting-started.md +4 -5
- package/help/github-app-setup.md +132 -0
- package/help/github.md +40 -1
- package/help/identity-and-access.md +7 -1
- package/help/jira.md +23 -6
- package/help/knowledge.md +16 -7
- package/help/local-repositories.md +3 -4
- package/help/low-power-mode.md +131 -0
- package/help/merge-order-check.md +122 -0
- package/help/mobile-app.md +54 -0
- package/help/native-capabilities.md +29 -1
- package/help/native-sandbox.md +150 -0
- package/help/observability.md +8 -0
- package/help/operating-agents.md +5 -0
- package/help/package-audit-mode.md +91 -0
- package/help/related-pull-requests.md +80 -16
- package/help/repo-instructions-and-skills.md +91 -0
- package/help/resume-runs-locally.md +131 -0
- package/help/review-fix-rounds.md +43 -1
- package/help/sharing-agents.md +59 -0
- package/help/slack-notifications.md +76 -0
- package/help/status-comments.md +31 -0
- package/help/stop-run.md +58 -0
- package/help/troubleshooting/budgets.md +28 -0
- package/help/troubleshooting/coding-workers.md +99 -7
- package/package.json +27 -13
- package/prisma/migrations/20261009000003_native_execution_mode/migration.sql +12 -0
- package/prisma/migrations/20261009000004_native_gateway_ledger/migration.sql +65 -0
- package/prisma/migrations/20261009000005_native_gateway_call_child_agent/migration.sql +5 -0
- package/prisma/migrations/20261009000006_run_deferred_start_stop/migration.sql +14 -0
- package/prisma/migrations/20261009000007_native_gateway_network_ready/migration.sql +5 -0
- package/prisma/migrations/20261010000001_workflow_notifications/migration.sql +99 -0
- package/prisma/migrations/20261011000001_native_gateway_session_status_index/migration.sql +2 -0
- package/prisma/migrations/20261012000001_native_warm_worker/migration.sql +32 -0
- package/prisma/migrations/20261013000001_coding_run_merge_order/migration.sql +2 -0
- package/prisma/migrations/20261013000001_secret_broker/migration.sql +17 -0
- package/prisma/migrations/20261013000002_deferred_review_request/migration.sql +4 -0
- package/prisma/migrations/20261014000000_repo_skills/migration.sql +15 -0
- package/prisma/migrations/20261015000001_coding_run_merge_order_index/migration.sql +2 -0
- package/prisma/migrations/20261015000002_no_change_rereview/migration.sql +2 -0
- package/prisma/migrations/20261016000000_registry_approved_accepted_advisories/migration.sql +3 -0
- package/prisma/migrations/20261016000001_mark_ready_when_passing/migration.sql +3 -0
- package/prisma/migrations/20261017000000_debug_trace_max_mb/migration.sql +4 -0
- package/prisma/migrations/20261018000000_dependency_cache/migration.sql +53 -0
- package/prisma/migrations/20261019000000_claude_max_output_tokens/migration.sql +5 -0
- package/prisma/migrations/20261021000000_pr_description_hash/migration.sql +4 -0
- package/prisma/migrations/20261022000000_dependency_snapshot_validation_metadata/migration.sql +4 -0
- package/prisma/migrations/20261023000000_package_audit_mode/migration.sql +27 -0
- package/prisma/migrations/20261024000000_budget_events/migration.sql +26 -0
- package/prisma/migrations/20261025000000_cache_aware_holds/migration.sql +9 -0
- package/prisma/migrations/20261026000000_budget_overrun/migration.sql +4 -0
- package/prisma/migrations/20261027000000_coding_run_request/migration.sql +1 -0
- package/prisma/migrations/20261028000000_native_gateway_review_reads/migration.sql +6 -0
- package/prisma/migrations/20261029000000_lead_survives_deploy/migration.sql +6 -0
- package/prisma/migrations/20261030000000_local_review_covered_sha/migration.sql +2 -0
- package/prisma/migrations/20261031000000_coding_run_budget_limit/migration.sql +9 -0
- package/prisma/migrations/20261101000000_run_transcripts/migration.sql +22 -0
- package/prisma/schema.prisma +631 -146
- package/dist/sandbox/generated/zod-to-json-schema.bundle.js +0 -5
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
import { logger } from "./logger.js";
|
|
2
|
+
import { groupName, overrunPercent } from "./budget-wording.js";
|
|
3
|
+
const log = logger.child({ module: "budget-events" });
|
|
4
|
+
const usd = (amount) => `$${amount.toFixed(2)}`;
|
|
5
|
+
const PERIOD_ADJECTIVE = { day: "daily", week: "weekly", month: "monthly" };
|
|
6
|
+
function periodAdjective(limit) {
|
|
7
|
+
return PERIOD_ADJECTIVE[limit] ?? limit;
|
|
8
|
+
}
|
|
9
|
+
/** `the "name" group`, or a neutral phrase when the name could not be read. */
|
|
10
|
+
function groupPhrase(details) {
|
|
11
|
+
const name = groupName(details.groupName);
|
|
12
|
+
return name ? `the "${name}" group` : "the budget group";
|
|
13
|
+
}
|
|
14
|
+
/** Below this, two amounts are the same (CodingRun's 6 decimal places). */
|
|
15
|
+
const SAME_USD = 0.000001;
|
|
16
|
+
/**
|
|
17
|
+
* The run's budget as the proxy enforced it: its base, and how much of its
|
|
18
|
+
* allowed overrun it had been granted. An older run without a recorded limit
|
|
19
|
+
* had its whole overrun reserved, so its budget is the limit.
|
|
20
|
+
*/
|
|
21
|
+
function budgetPhrase(details) {
|
|
22
|
+
const granted = details.budgetUsd;
|
|
23
|
+
const base = details.baseBudgetUsd;
|
|
24
|
+
const percent = overrunPercent(base, details.limitUsd ?? granted);
|
|
25
|
+
if (percent === null || base === undefined || granted <= base + SAME_USD)
|
|
26
|
+
return `${usd(granted)} budget`;
|
|
27
|
+
if (details.limitUsd === undefined || granted >= details.limitUsd - SAME_USD) {
|
|
28
|
+
return `${usd(base)} budget and its ${percent}% allowed overrun (${usd(granted)} in all)`;
|
|
29
|
+
}
|
|
30
|
+
return `${usd(base)} budget and ${usd(granted - base)} of its ${percent}% allowed overrun (${usd(granted)} in all)`;
|
|
31
|
+
}
|
|
32
|
+
/** What the proxy refused, and what was left: `{subject} needed a $X hold, but only $Y of ... was left (...)`. */
|
|
33
|
+
function proxyFacts(details, subject) {
|
|
34
|
+
const held = details.heldReservedUsd + details.heldUncertainUsd;
|
|
35
|
+
const left = Math.max(0, details.budgetUsd - details.spentUsd - held);
|
|
36
|
+
const heldPart = held > 0 ? `, ${usd(held)} held by requests in flight` : "";
|
|
37
|
+
const budget = budgetPhrase(details);
|
|
38
|
+
return (`${subject} needed a ${usd(details.refusedHoldUsd)} hold, but only ${usd(left)} of this run's ` +
|
|
39
|
+
`${budget} was left (${usd(details.spentUsd)} spent${heldPart}).`);
|
|
40
|
+
}
|
|
41
|
+
function periodCapSentence(limit, details) {
|
|
42
|
+
const phrase = groupPhrase(details);
|
|
43
|
+
return `${phrase.charAt(0).toUpperCase()}${phrase.slice(1)}'s ${periodAdjective(limit)} cap limited this run to ${usd(details.budgetUsd)}.`;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Why the run's allowed overrun was not (all) there: `Its 10% allowed overrun
|
|
47
|
+
* wasn't available because the "X" group had nothing left of its daily cap.`,
|
|
48
|
+
* or `Only $0.40 of its 10% allowed overrun was available because ...` when
|
|
49
|
+
* the run got part of it. A top-up takes whatever room there is, so the run is
|
|
50
|
+
* refused only once nothing is left.
|
|
51
|
+
* `lead` names the lead for a run-tree limit (owner sentences only).
|
|
52
|
+
*/
|
|
53
|
+
function overrunUnavailableSentence(overrun, lead) {
|
|
54
|
+
const { details, limit } = overrun;
|
|
55
|
+
const percent = overrunPercent(details.baseBudgetUsd, details.limitUsd);
|
|
56
|
+
const allowed = `${percent === null ? "" : `${percent}% `}allowed overrun`;
|
|
57
|
+
const where = limit === "run-tree" ? (lead ? `the lead's (${lead}) run tree` : "the lead's run tree") : groupPhrase(details);
|
|
58
|
+
const of = limit === "run-tree" ? `of its ${usd(details.capUsd)} budget` : `of its ${periodAdjective(limit)} cap`;
|
|
59
|
+
const got = details.grantedUsd - details.baseBudgetUsd;
|
|
60
|
+
if (got >= SAME_USD)
|
|
61
|
+
return `Only ${usd(got)} of its ${allowed} was available because ${where} had no more left ${of}.`;
|
|
62
|
+
return `Its ${allowed} wasn't available because ${where} had nothing left ${of}.`;
|
|
63
|
+
}
|
|
64
|
+
/** What to raise when the overrun was what ran out: the full group's cap, or the lead's budget. */
|
|
65
|
+
function overrunContinueSentence(overrun, lead) {
|
|
66
|
+
return overrun.limit === "run-tree"
|
|
67
|
+
? `To continue, raise budgetUsd on ${lead}.`
|
|
68
|
+
: `To continue, raise the group's ${periodAdjective(overrun.limit)} cap.`;
|
|
69
|
+
}
|
|
70
|
+
function dispatchPeriodSentence(limit, details) {
|
|
71
|
+
const left = Math.max(0, details.capUsd - details.spentUsd - details.heldUsd);
|
|
72
|
+
return (`${groupPhrase(details)} had ${usd(left)} left of its ${usd(details.capUsd)} ${periodAdjective(limit)} cap ` +
|
|
73
|
+
`(${usd(details.spentUsd)} spent, ${usd(details.heldUsd)} held by ${details.heldRuns} running run(s)).`);
|
|
74
|
+
}
|
|
75
|
+
/** Sentence for the run owner (run error, lead's sub-agent result, get_run consumers). */
|
|
76
|
+
export function ownerBudgetSentence(event, agentName) {
|
|
77
|
+
const { details, limit } = event;
|
|
78
|
+
if (details.source === "top-up") {
|
|
79
|
+
return overrunUnavailableSentence({ limit, details }, details.leadAgentName ?? "lead agent");
|
|
80
|
+
}
|
|
81
|
+
if (details.source === "dispatch") {
|
|
82
|
+
if (limit === "run-tree") {
|
|
83
|
+
const lead = details.leadAgentName ?? "lead agent";
|
|
84
|
+
return `Could not start: the lead's (${lead}) run tree had nothing left of its ${usd(details.capUsd)} budget (${usd(details.spentUsd)} spent).`;
|
|
85
|
+
}
|
|
86
|
+
return `Could not start: ${dispatchPeriodSentence(limit, details)}`;
|
|
87
|
+
}
|
|
88
|
+
const lead = details.leadAgentName ?? event.overrun?.details.leadAgentName ?? "lead agent";
|
|
89
|
+
const overrun = event.overrun ? ` ${overrunUnavailableSentence(event.overrun, lead)}` : "";
|
|
90
|
+
const first = `Stopped before turn ${details.turn}: ${proxyFacts(details, "the next request")}${overrun}`;
|
|
91
|
+
if (limit === "run") {
|
|
92
|
+
if (event.overrun)
|
|
93
|
+
return `${first} ${overrunContinueSentence(event.overrun, lead)}`;
|
|
94
|
+
const overran = overrunPercent(details.baseBudgetUsd, details.limitUsd ?? details.budgetUsd) !== null;
|
|
95
|
+
return `${first} To continue, raise ${overran ? "budgetUsd or allowedOverrunPercent" : "budgetUsd"} on ${agentName}.`;
|
|
96
|
+
}
|
|
97
|
+
if (limit === "run-tree") {
|
|
98
|
+
return (`${first} The lead's (${lead}) remaining budget limited this run to ${usd(details.budgetUsd)}. ` +
|
|
99
|
+
`To continue, raise budgetUsd on ${lead}.`);
|
|
100
|
+
}
|
|
101
|
+
return `${first} ${periodCapSentence(limit, details)} To continue, raise the group's ${periodAdjective(limit)} cap.`;
|
|
102
|
+
}
|
|
103
|
+
/** Sentence for a host comment: amounts and group name only. */
|
|
104
|
+
export function hostBudgetSentence(event) {
|
|
105
|
+
const { details, limit } = event;
|
|
106
|
+
if (details.source === "top-up")
|
|
107
|
+
return `Out of budget: ${overrunUnavailableSentence({ limit, details })}`;
|
|
108
|
+
if (details.source === "dispatch") {
|
|
109
|
+
if (limit === "run-tree") {
|
|
110
|
+
return `Out of budget: could not start: the lead's run tree had nothing left of its ${usd(details.capUsd)} budget (${usd(details.spentUsd)} spent).`;
|
|
111
|
+
}
|
|
112
|
+
return `Out of budget: could not start: ${dispatchPeriodSentence(limit, details)}`;
|
|
113
|
+
}
|
|
114
|
+
const overrun = event.overrun ? ` ${overrunUnavailableSentence(event.overrun)}` : "";
|
|
115
|
+
const first = `Out of budget: ${proxyFacts(details, "the next model request")}${overrun}`;
|
|
116
|
+
if (limit === "run" || limit === "run-tree")
|
|
117
|
+
return first;
|
|
118
|
+
return `${first} ${periodCapSentence(limit, details)} To continue, raise the group's ${periodAdjective(limit)} cap.`;
|
|
119
|
+
}
|
|
120
|
+
/** Records a refusal; best effort, never throws (a record must not change the refusal). */
|
|
121
|
+
export async function recordBudgetEvent(db, runId, limit, details) {
|
|
122
|
+
try {
|
|
123
|
+
await db.runBudgetEvent.create({
|
|
124
|
+
data: { runId, kind: "refused", limit, details: details },
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
log.warn({ err, runId }, "could not record a budget event");
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const BUDGET_LIMITS = new Set(["run", "run-tree", "day", "week", "month"]);
|
|
132
|
+
const MODEL_ID = /^[A-Za-z0-9._:/-]{1,128}$/;
|
|
133
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
134
|
+
const isFiniteNumber = (value) => typeof value === "number" && Number.isFinite(value);
|
|
135
|
+
const isCount = (value) => Number.isInteger(value) && value >= 0;
|
|
136
|
+
/**
|
|
137
|
+
* A proxy refusal rebuilt from only its stored amounts, model and turn, or
|
|
138
|
+
* null when any is missing or malformed. The proxy (a less-trusted role)
|
|
139
|
+
* writes the source record, so nothing else it wrote is kept: names are
|
|
140
|
+
* filled at read time from the database.
|
|
141
|
+
*/
|
|
142
|
+
export function proxyRefusalDetails(raw) {
|
|
143
|
+
if (!isRecord(raw))
|
|
144
|
+
return null;
|
|
145
|
+
const { budgetUsd, spentUsd, heldReservedUsd, heldUncertainUsd, refusedHoldUsd, turn, model } = raw;
|
|
146
|
+
if (![budgetUsd, spentUsd, heldReservedUsd, heldUncertainUsd, refusedHoldUsd].every(isFiniteNumber))
|
|
147
|
+
return null;
|
|
148
|
+
if (!isCount(turn) || typeof model !== "string" || !MODEL_ID.test(model))
|
|
149
|
+
return null;
|
|
150
|
+
const result = {
|
|
151
|
+
source: "proxy",
|
|
152
|
+
budgetUsd: budgetUsd,
|
|
153
|
+
spentUsd: spentUsd,
|
|
154
|
+
heldReservedUsd: heldReservedUsd,
|
|
155
|
+
heldUncertainUsd: heldUncertainUsd,
|
|
156
|
+
refusedHoldUsd: refusedHoldUsd,
|
|
157
|
+
model,
|
|
158
|
+
turn,
|
|
159
|
+
};
|
|
160
|
+
const basis = raw.refusedHoldBasis;
|
|
161
|
+
const ceiling = raw.refusedHoldCeilingUsd;
|
|
162
|
+
return {
|
|
163
|
+
...result,
|
|
164
|
+
...(basis === "cached" || basis === "full" ? { refusedHoldBasis: basis } : {}),
|
|
165
|
+
...(isFiniteNumber(ceiling) ? { refusedHoldCeilingUsd: ceiling } : {}),
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/** A dispatch refusal rebuilt from only its stored amounts, or null when any is missing or malformed. */
|
|
169
|
+
function dispatchRefusalDetails(raw) {
|
|
170
|
+
const { capUsd, spentUsd, heldUsd, heldRuns } = raw;
|
|
171
|
+
if (![capUsd, spentUsd, heldUsd].every(isFiniteNumber) || !isCount(heldRuns))
|
|
172
|
+
return null;
|
|
173
|
+
return {
|
|
174
|
+
source: "dispatch",
|
|
175
|
+
capUsd: capUsd,
|
|
176
|
+
spentUsd: spentUsd,
|
|
177
|
+
heldUsd: heldUsd,
|
|
178
|
+
heldRuns,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
/** A top-up refusal rebuilt from only its stored amounts and group name, or null when any is missing or malformed. */
|
|
182
|
+
function topUpRefusalDetails(raw) {
|
|
183
|
+
const { capUsd, spentUsd, heldUsd, leftUsd, baseBudgetUsd, grantedUsd, limitUsd, groupName } = raw;
|
|
184
|
+
if (![capUsd, spentUsd, heldUsd, leftUsd, baseBudgetUsd, grantedUsd, limitUsd].every(isFiniteNumber))
|
|
185
|
+
return null;
|
|
186
|
+
return {
|
|
187
|
+
source: "top-up",
|
|
188
|
+
capUsd: capUsd,
|
|
189
|
+
spentUsd: spentUsd,
|
|
190
|
+
heldUsd: heldUsd,
|
|
191
|
+
leftUsd: leftUsd,
|
|
192
|
+
baseBudgetUsd: baseBudgetUsd,
|
|
193
|
+
grantedUsd: grantedUsd,
|
|
194
|
+
limitUsd: limitUsd,
|
|
195
|
+
...(typeof groupName === "string" && groupName ? { groupName } : {}),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
/** A stored row as a view, or null when its limit or details fail the shape check (so no sentence can throw). */
|
|
199
|
+
function budgetEventView(row) {
|
|
200
|
+
if (!BUDGET_LIMITS.has(row.limit) || !isRecord(row.details))
|
|
201
|
+
return null;
|
|
202
|
+
const at = row.at.toISOString();
|
|
203
|
+
const limit = row.limit;
|
|
204
|
+
if (row.kind === "overrun_unavailable") {
|
|
205
|
+
const details = row.details.source === "top-up" ? topUpRefusalDetails(row.details) : null;
|
|
206
|
+
return details ? { kind: "overrun_unavailable", limit, at, details } : null;
|
|
207
|
+
}
|
|
208
|
+
if (row.kind !== "refused")
|
|
209
|
+
return null;
|
|
210
|
+
const details = row.details.source === "proxy"
|
|
211
|
+
? proxyRefusalDetails(row.details)
|
|
212
|
+
: row.details.source === "dispatch"
|
|
213
|
+
? dispatchRefusalDetails(row.details)
|
|
214
|
+
: null;
|
|
215
|
+
if (!details)
|
|
216
|
+
return null;
|
|
217
|
+
return { kind: "refused", limit, at, details };
|
|
218
|
+
}
|
|
219
|
+
/** The run's latest well-formed budget event of `kind`, or null. Never throws. */
|
|
220
|
+
async function latestEvent(db, runId, kind) {
|
|
221
|
+
try {
|
|
222
|
+
const row = await db.runBudgetEvent.findFirst({ where: { runId, kind }, orderBy: { at: "desc" } });
|
|
223
|
+
return row ? budgetEventView(row) : null;
|
|
224
|
+
}
|
|
225
|
+
catch (err) {
|
|
226
|
+
log.warn({ err, runId }, "could not read the latest budget event");
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/** The run's latest well-formed budget refusal, or null. Never throws. */
|
|
231
|
+
export async function latestBudgetEvent(db, runId) {
|
|
232
|
+
return latestEvent(db, runId, "refused");
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Loads the run, its agent and budget group once and, when `withLead`, walks
|
|
236
|
+
* `parentRunId` (bounded) to the tree root once.
|
|
237
|
+
*/
|
|
238
|
+
async function budgetEventNames(db, runId, withLead) {
|
|
239
|
+
const run = await db.run.findUnique({
|
|
240
|
+
where: { id: runId },
|
|
241
|
+
select: {
|
|
242
|
+
parentRunId: true,
|
|
243
|
+
agent: { select: { name: true, budgetUsd: true, budgetGroup: { select: { name: true } } } },
|
|
244
|
+
codingRun: { select: { budgetBaseUsd: true, budgetLimitUsd: true } },
|
|
245
|
+
},
|
|
246
|
+
});
|
|
247
|
+
const names = {};
|
|
248
|
+
if (!run)
|
|
249
|
+
return names;
|
|
250
|
+
if (run.agent) {
|
|
251
|
+
names.agentName = run.agent.name;
|
|
252
|
+
const budget = Number(run.agent.budgetUsd);
|
|
253
|
+
if (Number.isFinite(budget))
|
|
254
|
+
names.agentBudgetUsd = budget;
|
|
255
|
+
if (run.agent.budgetGroup?.name)
|
|
256
|
+
names.groupName = run.agent.budgetGroup.name;
|
|
257
|
+
}
|
|
258
|
+
const base = run.codingRun?.budgetBaseUsd == null ? NaN : Number(run.codingRun.budgetBaseUsd);
|
|
259
|
+
if (Number.isFinite(base))
|
|
260
|
+
names.baseBudgetUsd = base;
|
|
261
|
+
const limit = run.codingRun?.budgetLimitUsd == null ? NaN : Number(run.codingRun.budgetLimitUsd);
|
|
262
|
+
if (Number.isFinite(limit))
|
|
263
|
+
names.limitUsd = limit;
|
|
264
|
+
if (withLead) {
|
|
265
|
+
let lead = run.agent?.name;
|
|
266
|
+
let id = run.parentRunId;
|
|
267
|
+
for (let hops = 1; id && hops < 32; hops++) {
|
|
268
|
+
const row = await db.run.findUnique({
|
|
269
|
+
where: { id },
|
|
270
|
+
select: { parentRunId: true, agent: { select: { name: true } } },
|
|
271
|
+
});
|
|
272
|
+
if (!row)
|
|
273
|
+
break;
|
|
274
|
+
lead = row.agent?.name ?? lead;
|
|
275
|
+
id = row.parentRunId;
|
|
276
|
+
}
|
|
277
|
+
if (lead)
|
|
278
|
+
names.leadAgentName = lead;
|
|
279
|
+
}
|
|
280
|
+
return names;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* The event with its names filled: the group, the agent budget (proxy refusals) and the lead (run-tree).
|
|
284
|
+
* A top-up refusal keeps the group it recorded: the full cap can be the lead's group, not the run's.
|
|
285
|
+
*/
|
|
286
|
+
function withNames(event, names) {
|
|
287
|
+
const details = { ...event.details };
|
|
288
|
+
if (names.groupName && details.source !== "top-up")
|
|
289
|
+
details.groupName = names.groupName;
|
|
290
|
+
if (details.source === "proxy" && names.agentBudgetUsd !== undefined)
|
|
291
|
+
details.agentBudgetUsd = names.agentBudgetUsd;
|
|
292
|
+
if (details.source === "proxy" && names.baseBudgetUsd !== undefined)
|
|
293
|
+
details.baseBudgetUsd = names.baseBudgetUsd;
|
|
294
|
+
if (details.source === "proxy" && names.limitUsd !== undefined)
|
|
295
|
+
details.limitUsd = names.limitUsd;
|
|
296
|
+
if (event.limit === "run-tree" && names.leadAgentName)
|
|
297
|
+
details.leadAgentName = names.leadAgentName;
|
|
298
|
+
if (!event.overrun)
|
|
299
|
+
return { ...event, details };
|
|
300
|
+
const overrun = { limit: event.overrun.limit, details: { ...event.overrun.details } };
|
|
301
|
+
if (overrun.limit === "run-tree" && names.leadAgentName)
|
|
302
|
+
overrun.details.leadAgentName = names.leadAgentName;
|
|
303
|
+
return { ...event, details, overrun };
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* The run's latest budget refusal with names filled in from its agent, budget
|
|
307
|
+
* group and (for a run-tree limit) the tree root. A proxy refusal carries the
|
|
308
|
+
* run's overrun_unavailable event, when its overrun top-up found no room.
|
|
309
|
+
* Never throws; null when there is none.
|
|
310
|
+
*/
|
|
311
|
+
export async function loadBudgetEvent(db, runId) {
|
|
312
|
+
try {
|
|
313
|
+
const refusal = await latestBudgetEvent(db, runId);
|
|
314
|
+
if (!refusal)
|
|
315
|
+
return null;
|
|
316
|
+
const overrun = refusal.details.source === "proxy" ? await latestEvent(db, runId, "overrun_unavailable") : null;
|
|
317
|
+
const event = overrun?.details.source === "top-up"
|
|
318
|
+
? { ...refusal, overrun: { limit: overrun.limit, details: overrun.details } }
|
|
319
|
+
: refusal;
|
|
320
|
+
const names = await budgetEventNames(db, runId, event.limit === "run-tree" || event.overrun?.limit === "run-tree");
|
|
321
|
+
return { event: withNames(event, names), agentName: names.agentName ?? "this agent" };
|
|
322
|
+
}
|
|
323
|
+
catch (err) {
|
|
324
|
+
log.warn({ err, runId }, "could not load the budget event");
|
|
325
|
+
return null;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Every well-formed budget event of the run, oldest first, with names filled
|
|
330
|
+
* in as loadBudgetEvent does (the run and tree are read once for all of
|
|
331
|
+
* them). If the names cannot be read the events are returned without them.
|
|
332
|
+
*/
|
|
333
|
+
export async function loadBudgetEvents(db, runId) {
|
|
334
|
+
const rows = await db.runBudgetEvent.findMany({ where: { runId }, orderBy: { at: "asc" } });
|
|
335
|
+
const events = rows.map(budgetEventView).filter((event) => event !== null);
|
|
336
|
+
if (events.length === 0)
|
|
337
|
+
return events;
|
|
338
|
+
try {
|
|
339
|
+
const names = await budgetEventNames(db, runId, events.some((event) => event.limit === "run-tree"));
|
|
340
|
+
return events.map((event) => withNames(event, names));
|
|
341
|
+
}
|
|
342
|
+
catch (err) {
|
|
343
|
+
log.warn({ err, runId }, "could not read the budget event names");
|
|
344
|
+
return events;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
@@ -51,6 +51,8 @@ export interface PeriodSpend {
|
|
|
51
51
|
reservedUsd: number;
|
|
52
52
|
/** capUsd - spentUsd - reservedUsd, never below zero. */
|
|
53
53
|
remainingUsd: number;
|
|
54
|
+
/** How many of the period's runs hold something (reservedUsd > 0 each). */
|
|
55
|
+
heldRuns: number;
|
|
54
56
|
}
|
|
55
57
|
/** A group member as computeGroupSpend needs it: a native run in flight holds its agent's budgetUsd. */
|
|
56
58
|
export interface GroupMember {
|
|
@@ -120,6 +122,18 @@ export declare function isHoldLive(run: HoldRow, now: Date, codingQueueTimeoutSe
|
|
|
120
122
|
* returned with a null cap. One query at the widest configured window
|
|
121
123
|
* (month contains week contains day), bucketed in JS, rather than a
|
|
122
124
|
* separate DB round trip per period.
|
|
125
|
+
*
|
|
126
|
+
* A delegated run tree is held once, at its root. A sub-run whose tree root
|
|
127
|
+
* is a counted run of this group with a live, counted hold spends inside the
|
|
128
|
+
* root's hold, so it holds nothing (its cost still counts as spent), and the
|
|
129
|
+
* root holds its reservation minus the cost of every run in its tree, or the
|
|
130
|
+
* unspent holds of its tree's live runs when that is more (a coding run's
|
|
131
|
+
* grant can grow past the root's budget through overrun top-ups). A sub-run
|
|
132
|
+
* whose root is in another group, has finished, or whose hold is left out
|
|
133
|
+
* here (excludeReservationRunIds, holdsBefore) holds its own reservation. So
|
|
134
|
+
* does a sub-run in a period its root did not start in (a root that started
|
|
135
|
+
* yesterday, a child today: today's daily cap still holds the child's own
|
|
136
|
+
* reservation, since the root's hold falls in yesterday's bucket).
|
|
123
137
|
*/
|
|
124
138
|
export declare function computeGroupSpend(db: BudgetGroupsDb, group: Pick<BudgetGroup, "dailyBudgetUsd" | "weeklyBudgetUsd" | "monthlyBudgetUsd">, members: readonly GroupMember[], now?: Date, options?: SpendOptions): Promise<PeriodSpend[]>;
|
|
125
139
|
export interface RunTreeSpend {
|
|
@@ -148,11 +162,21 @@ export interface RunTreeSpend {
|
|
|
148
162
|
export declare function computeRunTreeSpend(db: BudgetGroupsDb, parentRunId: string, now?: Date): Promise<RunTreeSpend>;
|
|
149
163
|
export type BudgetConstraint = Period | "run-tree";
|
|
150
164
|
export interface EffectiveBudgetResult {
|
|
165
|
+
/** The ceiling to use. */
|
|
151
166
|
effectiveBudgetUsd: number;
|
|
152
|
-
/** Which constraint(s), if any, are tighter than the agent's own budgetUsd
|
|
167
|
+
/** Which constraint(s), if any, are tighter right now than the agent's own budgetUsd. */
|
|
153
168
|
constrainedBy: BudgetConstraint[];
|
|
154
169
|
/** The first constraint with nothing left (< MIN_RESERVATION_USD), set only when there is one. */
|
|
155
170
|
exhaustedBy?: BudgetConstraint;
|
|
171
|
+
/** The constraint whose value equals effectiveBudgetUsd, when that is below the agent's own budgetUsd. */
|
|
172
|
+
limitedBy?: BudgetConstraint;
|
|
173
|
+
/** The numbers behind exhaustedBy, for the dispatch refusal record. */
|
|
174
|
+
exhaustedDetail?: {
|
|
175
|
+
capUsd: number;
|
|
176
|
+
spentUsd: number;
|
|
177
|
+
heldUsd: number;
|
|
178
|
+
heldRuns: number;
|
|
179
|
+
};
|
|
156
180
|
}
|
|
157
181
|
export interface EffectiveBudgetOptions {
|
|
158
182
|
/**
|
|
@@ -181,4 +205,29 @@ export interface EffectiveBudgetOptions {
|
|
|
181
205
|
* the tree's included.
|
|
182
206
|
*/
|
|
183
207
|
export declare function effectiveBudgetForRun(db: BudgetGroupsDb, agent: Pick<Agent, "id" | "budgetGroupId" | "budgetUsd">, now?: Date, parentRunId?: string, options?: EffectiveBudgetOptions): Promise<EffectiveBudgetResult>;
|
|
208
|
+
/** What limits a coding run's next overrun top-up: the room left, and the constraint with the least. */
|
|
209
|
+
export interface TopUpRoom {
|
|
210
|
+
/** The most a top-up may add now; Infinity when no group or run tree constrains the run. */
|
|
211
|
+
roomUsd: number;
|
|
212
|
+
limitedBy?: BudgetConstraint;
|
|
213
|
+
/** The numbers behind limitedBy. */
|
|
214
|
+
detail?: {
|
|
215
|
+
capUsd: number;
|
|
216
|
+
spentUsd: number;
|
|
217
|
+
heldUsd: number;
|
|
218
|
+
};
|
|
219
|
+
/** The budget group whose cap limits it, when limitedBy is a period. */
|
|
220
|
+
groupName?: string;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Room for a coding run's overrun top-up (budget-topup.ts): the least of what
|
|
224
|
+
* its budget group, its run tree's root group, and its run tree's
|
|
225
|
+
* overrun-raised ceiling have left right now. Each group is seen whole: every
|
|
226
|
+
* live hold counts, this run's own grant (or its tree's hold) included, with
|
|
227
|
+
* no first-come-first-served ordering, because a top-up is new money that runs
|
|
228
|
+
* started later did not count when they reserved. A grant of at most roomUsd
|
|
229
|
+
* raises each group's and the tree's committed total by at most that much, so
|
|
230
|
+
* caps and ceilings stay hard. Callers hold the group dispatch lock.
|
|
231
|
+
*/
|
|
232
|
+
export declare function codingTopUpRoom(db: BudgetGroupsDb, runId: string, now?: Date): Promise<TopUpRoom>;
|
|
184
233
|
export {};
|