@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,343 @@
|
|
|
1
|
+
import { CODING_CODE_PROVIDER, normalizeGitHubRepository } from "../coding/protocol.js";
|
|
2
|
+
import { logger } from "./logger.js";
|
|
3
|
+
import { maybeMarkReady } from "./mark-ready.js";
|
|
4
|
+
import { collectRelatedPullRequests, runTreeRoot } from "./related-pull-requests.js";
|
|
5
|
+
const moduleLog = logger.child({ module: "merge-order-check" });
|
|
6
|
+
export const MERGE_ORDER_CHECK_NAME = "wardby merge order";
|
|
7
|
+
/**
|
|
8
|
+
* `set` may include or omit `self`: self's own order always counts toward
|
|
9
|
+
* the distinct orders, and self is never its own dependency (dependencies
|
|
10
|
+
* have a strictly lower order). `self` need not be the same object instance
|
|
11
|
+
* as its entry in `set`; only `mergeOrder` is read from it.
|
|
12
|
+
*/
|
|
13
|
+
export function mergeOrderVerdict(self, set) {
|
|
14
|
+
const distinctOrders = new Set();
|
|
15
|
+
if (self.mergeOrder !== null)
|
|
16
|
+
distinctOrders.add(self.mergeOrder);
|
|
17
|
+
for (const m of set)
|
|
18
|
+
if (m.mergeOrder !== null)
|
|
19
|
+
distinctOrders.add(m.mergeOrder);
|
|
20
|
+
if (distinctOrders.size < 2)
|
|
21
|
+
return { status: "skip" };
|
|
22
|
+
if (self.mergeOrder === null)
|
|
23
|
+
return { status: "skip" };
|
|
24
|
+
const selfOrder = self.mergeOrder;
|
|
25
|
+
const dependencies = set.filter((m) => m.mergeOrder !== null && m.mergeOrder < selfOrder);
|
|
26
|
+
const closedUnmerged = dependencies.filter((m) => m.state === "closed");
|
|
27
|
+
if (closedUnmerged.length > 0)
|
|
28
|
+
return { status: "failure", closedUnmerged };
|
|
29
|
+
const waitingFor = dependencies.filter((m) => m.state !== "merged");
|
|
30
|
+
if (waitingFor.length > 0)
|
|
31
|
+
return { status: "in_progress", waitingFor };
|
|
32
|
+
return { status: "success", dependencies };
|
|
33
|
+
}
|
|
34
|
+
const prUrl = (repository, number) => `https://github.com/${repository}/pull/${number}`;
|
|
35
|
+
/** `repository#number` as a link: never a title or any other free text from the host. */
|
|
36
|
+
const prLink = (m) => `[${m.repository}#${m.number}](${prUrl(m.repository, m.number)})`;
|
|
37
|
+
const keyOf = (repository, number) => `${repository}#${number}`;
|
|
38
|
+
function safeRepository(value) {
|
|
39
|
+
try {
|
|
40
|
+
return normalizeGitHubRepository(value);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function originState(origin) {
|
|
47
|
+
if (origin.merged)
|
|
48
|
+
return "merged";
|
|
49
|
+
if (origin.state !== "open")
|
|
50
|
+
return "closed";
|
|
51
|
+
return origin.draft ? "draft" : "open";
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The check run's text for one verdict: step label, then the pull requests
|
|
55
|
+
* it depends on, as links. While the delegating run is still running
|
|
56
|
+
* (`leadRunning`) it may still add or reorder steps, so a success for any
|
|
57
|
+
* step above the set's lowest is posted as in_progress, waiting for it.
|
|
58
|
+
*/
|
|
59
|
+
export function mergeOrderCheckInput(self, verdict, steps, headSha, leadRunning = false) {
|
|
60
|
+
const step = `Step ${steps.indexOf(self.mergeOrder) + 1} of ${steps.length} in the merge order set by the delegating agent.`;
|
|
61
|
+
const base = { headSha, name: MERGE_ORDER_CHECK_NAME };
|
|
62
|
+
const lines = (members) => members.map(prLink).join(", ");
|
|
63
|
+
if (verdict.status === "success" && leadRunning && self.mergeOrder !== steps[0]) {
|
|
64
|
+
return {
|
|
65
|
+
...base,
|
|
66
|
+
status: "in_progress",
|
|
67
|
+
title: "Waiting for the delegating run to finish",
|
|
68
|
+
summary: `${step}\n\nEvery earlier step has merged, but the delegating run is still running and may change ` +
|
|
69
|
+
`the steps; waiting for it to finish.` +
|
|
70
|
+
(verdict.dependencies.length > 0 ? `\n\nMerged: ${lines(verdict.dependencies)}` : ""),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
switch (verdict.status) {
|
|
74
|
+
case "success":
|
|
75
|
+
return {
|
|
76
|
+
...base,
|
|
77
|
+
status: "completed",
|
|
78
|
+
conclusion: "success",
|
|
79
|
+
title: verdict.dependencies.length > 0 ? "Every earlier step has merged" : "First step: nothing to wait for",
|
|
80
|
+
summary: verdict.dependencies.length > 0 ? `${step}\n\nMerged: ${lines(verdict.dependencies)}` : step,
|
|
81
|
+
};
|
|
82
|
+
case "failure":
|
|
83
|
+
return {
|
|
84
|
+
...base,
|
|
85
|
+
status: "completed",
|
|
86
|
+
conclusion: "failure",
|
|
87
|
+
title: "An earlier step was closed without merging",
|
|
88
|
+
summary: `${step}\n\nClosed without merging: ${lines(verdict.closedUnmerged)}`,
|
|
89
|
+
};
|
|
90
|
+
case "in_progress":
|
|
91
|
+
return {
|
|
92
|
+
...base,
|
|
93
|
+
status: "in_progress",
|
|
94
|
+
title: `Waiting for ${verdict.waitingFor.length} earlier pull request${verdict.waitingFor.length === 1 ? "" : "s"} to merge`,
|
|
95
|
+
summary: `${step}\n\nWaiting for: ${lines(verdict.waitingFor)}`,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Recomputes and posts the `wardby merge order` check on every open (or
|
|
101
|
+
* draft) pull request of the set `seedRunId` belongs to (any run of the
|
|
102
|
+
* request's tree). Nothing happens unless the set has more than one
|
|
103
|
+
* distinct merge order. Each member's state is read live from the host
|
|
104
|
+
* (a stored "merged" is final and not re-read); the check is posted only on
|
|
105
|
+
* an open or draft pull request the App opened whose marker names a coding
|
|
106
|
+
* run this deployment recorded for that repository, on its current head.
|
|
107
|
+
* A member that can't be read holds back only the checks that depend on it.
|
|
108
|
+
* Never throws.
|
|
109
|
+
*/
|
|
110
|
+
export async function syncMergeOrderChecks(deps, seedRunId, opts = {}) {
|
|
111
|
+
const log = deps.log ?? moduleLog;
|
|
112
|
+
const host = deps.hosts?.[CODING_CODE_PROVIDER];
|
|
113
|
+
if (!host?.upsertNamedCheck || !host.pullRequestOrigin)
|
|
114
|
+
return;
|
|
115
|
+
try {
|
|
116
|
+
const group = await collectRelatedPullRequests(deps.db, seedRunId);
|
|
117
|
+
if (opts.synced) {
|
|
118
|
+
const setKey = group.pullRequests
|
|
119
|
+
.map((pr) => keyOf(pr.repository, pr.number))
|
|
120
|
+
.sort()
|
|
121
|
+
.join("\n");
|
|
122
|
+
if (opts.synced.has(setKey))
|
|
123
|
+
return;
|
|
124
|
+
opts.synced.add(setKey);
|
|
125
|
+
}
|
|
126
|
+
const steps = [
|
|
127
|
+
...new Set(group.pullRequests.flatMap((pr) => (pr.mergeOrder !== undefined ? [pr.mergeOrder] : []))),
|
|
128
|
+
].sort((a, b) => a - b);
|
|
129
|
+
if (steps.length < 2)
|
|
130
|
+
return;
|
|
131
|
+
// A property of the set, whichever root it was seeded from: only a native lead (a root that is
|
|
132
|
+
// not itself a coding run) declares merge order, so only one still running may change steps. A
|
|
133
|
+
// top-level coding run that continued one of the PRs never holds the check: its own later pushes
|
|
134
|
+
// re-sync through pr_updated, and nothing re-syncs when it ends.
|
|
135
|
+
const leadRunning = (group.roots ?? []).some((r) => !r.codingRun && (r.status === "pending" || r.status === "running"));
|
|
136
|
+
const reused = opts.origin ? safeRepository(opts.origin.repository) : undefined;
|
|
137
|
+
const closed = opts.closed ? safeRepository(opts.closed.repository) : undefined;
|
|
138
|
+
const members = [];
|
|
139
|
+
// Bounded by the collector's MAX_RELATED_GROUP: at most one read per member.
|
|
140
|
+
for (const pr of group.pullRequests) {
|
|
141
|
+
const base = { repository: pr.repository, number: pr.number, mergeOrder: pr.mergeOrder ?? null };
|
|
142
|
+
const key = keyOf(pr.repository, pr.number);
|
|
143
|
+
if (closed && key === keyOf(closed, opts.closed.number)) {
|
|
144
|
+
members.push({ member: { ...base, state: opts.closed.merged ? "merged" : "closed" }, known: true });
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
if (pr.state === "merged") {
|
|
148
|
+
members.push({ member: { ...base, state: "merged" }, known: true });
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
// No order: never a dependency and never checked, so its state is never needed: no read.
|
|
152
|
+
if (base.mergeOrder === null) {
|
|
153
|
+
members.push({ member: { ...base, state: "open" }, known: true });
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
try {
|
|
157
|
+
const origin = reused && key === keyOf(reused, opts.origin.number)
|
|
158
|
+
? await opts.origin.read()
|
|
159
|
+
: await host.pullRequestOrigin(pr.repository, pr.number);
|
|
160
|
+
let headSha;
|
|
161
|
+
if (origin.markerRunId) {
|
|
162
|
+
const opener = await deps.db.codingRun.findUnique({
|
|
163
|
+
where: { runId: origin.markerRunId },
|
|
164
|
+
select: { repository: true },
|
|
165
|
+
});
|
|
166
|
+
if (opener && opener.repository.toLowerCase() === pr.repository)
|
|
167
|
+
headSha = origin.headSha;
|
|
168
|
+
}
|
|
169
|
+
members.push({ member: { ...base, state: originState(origin) }, known: true, ...(headSha ? { headSha } : {}) });
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
log.warn({ err, seedRunId, repository: pr.repository, number: pr.number }, "could not read a pull request of a merge-ordered set");
|
|
173
|
+
members.push({ member: { ...base, state: "open" }, known: false });
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
const set = members.map((m) => m.member);
|
|
177
|
+
for (const target of members) {
|
|
178
|
+
const self = target.member;
|
|
179
|
+
if (!target.headSha || self.mergeOrder === null || (self.state !== "open" && self.state !== "draft"))
|
|
180
|
+
continue;
|
|
181
|
+
const order = self.mergeOrder;
|
|
182
|
+
if (members.some((m) => !m.known && m.member.mergeOrder !== null && m.member.mergeOrder < order)) {
|
|
183
|
+
log.info({ seedRunId, repository: self.repository, number: self.number }, "merge order check left as is: an earlier step could not be read");
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
const verdict = mergeOrderVerdict(self, set);
|
|
187
|
+
if (verdict.status === "skip")
|
|
188
|
+
continue;
|
|
189
|
+
const input = mergeOrderCheckInput(self, verdict, steps, target.headSha, leadRunning);
|
|
190
|
+
try {
|
|
191
|
+
await host.upsertNamedCheck(self.repository, input);
|
|
192
|
+
log.info({ seedRunId, repository: self.repository, number: self.number, status: verdict.status }, "merge order check posted");
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
log.warn({ err, seedRunId, repository: self.repository, number: self.number }, "could not post the merge order check");
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
if (input.status === "completed" && input.conclusion === "success") {
|
|
199
|
+
// The last earlier step merged: the pull request may now be ready for review (#287).
|
|
200
|
+
await maybeMarkReady({ db: deps.db, hosts: deps.hosts, log: deps.log }, self.repository, self.number);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
log.warn({ err, seedRunId }, "could not sync the merge order checks");
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* At a run's end: a tree root (the lead) that delegated anything syncs its
|
|
210
|
+
* set. A run that delegated nothing costs one indexed lookup. Never throws.
|
|
211
|
+
*/
|
|
212
|
+
export async function syncMergeOrderChecksAfterRun(deps, run) {
|
|
213
|
+
if (run.parentRunId !== null)
|
|
214
|
+
return;
|
|
215
|
+
const host = deps.hosts?.[CODING_CODE_PROVIDER];
|
|
216
|
+
if (!host?.upsertNamedCheck || !host.pullRequestOrigin)
|
|
217
|
+
return;
|
|
218
|
+
try {
|
|
219
|
+
if (!(await deps.db.run.findFirst({ where: { parentRunId: run.id }, select: { id: true } })))
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
(deps.log ?? moduleLog).warn({ err, runId: run.id }, "could not sync the merge order checks");
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
await syncMergeOrderChecks(deps, run.id);
|
|
227
|
+
}
|
|
228
|
+
/** Most coding runs (seeds) looked up per pull request event or sweep pass. */
|
|
229
|
+
const MAX_SEEDS = 20;
|
|
230
|
+
/** Coding runs with a merge order whose outcome is pull request `repository#number`. */
|
|
231
|
+
async function orderedSeeds(db, repository, number) {
|
|
232
|
+
const rows = await db.$queryRaw `
|
|
233
|
+
SELECT cr."runId"
|
|
234
|
+
FROM "CodingRun" cr
|
|
235
|
+
WHERE cr."mergeOrder" IS NOT NULL
|
|
236
|
+
AND lower(cr."repository") = lower(${repository})
|
|
237
|
+
AND cr."result"->>'outcome' IN ('pull_request_opened', 'pull_request_updated')
|
|
238
|
+
AND lower(cr."result"->>'repository') = lower(${repository})
|
|
239
|
+
AND cr."result"->>'pullRequestNumber' = ${String(number)}
|
|
240
|
+
ORDER BY cr."updatedAt" DESC
|
|
241
|
+
LIMIT ${MAX_SEEDS}`;
|
|
242
|
+
return rows.map((r) => r.runId);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* A pull request closed or got a new head: syncs every set it is an
|
|
246
|
+
* ordered member of. Only a pull request a coding run with a merge order
|
|
247
|
+
* opened or continued can change any verdict (a member without an order is
|
|
248
|
+
* no one's dependency and gets no check), so anything else costs one query
|
|
249
|
+
* and no host call. Never throws.
|
|
250
|
+
*/
|
|
251
|
+
export async function syncMergeOrderChecksForPullRequest(deps, pr, opts = {}) {
|
|
252
|
+
const log = deps.log ?? moduleLog;
|
|
253
|
+
const host = deps.hosts?.[CODING_CODE_PROVIDER];
|
|
254
|
+
if (!host?.upsertNamedCheck || !host.pullRequestOrigin)
|
|
255
|
+
return;
|
|
256
|
+
const repository = safeRepository(pr.repository);
|
|
257
|
+
if (!repository || !Number.isSafeInteger(pr.number) || pr.number <= 0)
|
|
258
|
+
return;
|
|
259
|
+
let roots;
|
|
260
|
+
try {
|
|
261
|
+
roots = [];
|
|
262
|
+
for (const seed of await orderedSeeds(deps.db, repository, pr.number)) {
|
|
263
|
+
const root = await runTreeRoot(deps.db, seed, repository);
|
|
264
|
+
if (root && !roots.some((r) => r.id === root.id))
|
|
265
|
+
roots.push(root);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
catch (err) {
|
|
269
|
+
log.warn({ err, repository, number: pr.number }, "could not find the merge-ordered sets of a pull request");
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
const synced = new Set();
|
|
273
|
+
for (const root of roots)
|
|
274
|
+
await syncMergeOrderChecks(deps, root.id, { ...opts, synced });
|
|
275
|
+
}
|
|
276
|
+
/** The sweep runs at most this often per process (the reconciler ticks every 15 s). */
|
|
277
|
+
export const MERGE_ORDER_SWEEP_INTERVAL_MS = 10 * 60_000;
|
|
278
|
+
/** Coding runs with a merge order updated within this long are swept. */
|
|
279
|
+
export const MERGE_ORDER_SWEEP_MAX_AGE_MS = 7 * 24 * 60 * 60_000;
|
|
280
|
+
/** Most coding runs read per sweep pass. */
|
|
281
|
+
const MERGE_ORDER_SWEEP_SEEDS = 50;
|
|
282
|
+
/** Most sets synced per sweep pass; the least recently synced go first. */
|
|
283
|
+
export const MERGE_ORDER_SWEEP_BATCH = 10;
|
|
284
|
+
let lastSweepAt = Number.NEGATIVE_INFINITY;
|
|
285
|
+
/** Root run id -> when this process last swept it: rotates the batch across passes. */
|
|
286
|
+
const lastSyncedAt = new Map();
|
|
287
|
+
export function resetMergeOrderSweepForTests() {
|
|
288
|
+
lastSweepAt = Number.NEGATIVE_INFINITY;
|
|
289
|
+
lastSyncedAt.clear();
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* The reconciler's half, for missed pr_closed/pr_updated events: syncs the
|
|
293
|
+
* sets of pull requests that coding runs with a merge order opened or
|
|
294
|
+
* continued in the last 7 days, a bounded batch per pass, at most once per
|
|
295
|
+
* MERGE_ORDER_SWEEP_INTERVAL_MS per process. Returns the number of sets
|
|
296
|
+
* synced. Never throws.
|
|
297
|
+
*/
|
|
298
|
+
export async function sweepMergeOrderChecks(deps, now = new Date()) {
|
|
299
|
+
const log = deps.log ?? moduleLog;
|
|
300
|
+
const host = deps.hosts?.[CODING_CODE_PROVIDER];
|
|
301
|
+
if (!host?.upsertNamedCheck || !host.pullRequestOrigin)
|
|
302
|
+
return 0;
|
|
303
|
+
if (now.getTime() - lastSweepAt < MERGE_ORDER_SWEEP_INTERVAL_MS)
|
|
304
|
+
return 0;
|
|
305
|
+
lastSweepAt = now.getTime();
|
|
306
|
+
const since = new Date(now.getTime() - MERGE_ORDER_SWEEP_MAX_AGE_MS);
|
|
307
|
+
for (const [root, at] of lastSyncedAt)
|
|
308
|
+
if (at < since.getTime())
|
|
309
|
+
lastSyncedAt.delete(root);
|
|
310
|
+
let roots;
|
|
311
|
+
try {
|
|
312
|
+
// Covers the MERGE_ORDER_SWEEP_SEEDS most recently updated coding runs with a merge order
|
|
313
|
+
// within the last 7 days; older sets rely on their pr_closed/pr_updated events alone.
|
|
314
|
+
const rows = await deps.db.$queryRaw `
|
|
315
|
+
SELECT cr."runId", cr."repository"
|
|
316
|
+
FROM "CodingRun" cr
|
|
317
|
+
WHERE cr."mergeOrder" IS NOT NULL
|
|
318
|
+
AND cr."updatedAt" >= ${since}
|
|
319
|
+
AND cr."result"->>'outcome' IN ('pull_request_opened', 'pull_request_updated')
|
|
320
|
+
ORDER BY cr."updatedAt" DESC
|
|
321
|
+
LIMIT ${MERGE_ORDER_SWEEP_SEEDS}`;
|
|
322
|
+
roots = [];
|
|
323
|
+
for (const row of rows) {
|
|
324
|
+
const root = await runTreeRoot(deps.db, row.runId, row.repository);
|
|
325
|
+
if (root && !roots.some((r) => r.id === root.id))
|
|
326
|
+
roots.push(root);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
catch (err) {
|
|
330
|
+
log.warn({ err }, "merge order check sweep failed");
|
|
331
|
+
return 0;
|
|
332
|
+
}
|
|
333
|
+
const batch = roots
|
|
334
|
+
.map((root, index) => ({ root, index, at: lastSyncedAt.get(root.id) ?? Number.NEGATIVE_INFINITY }))
|
|
335
|
+
.sort((a, b) => a.at - b.at || a.index - b.index)
|
|
336
|
+
.slice(0, MERGE_ORDER_SWEEP_BATCH);
|
|
337
|
+
const synced = new Set();
|
|
338
|
+
for (const { root } of batch) {
|
|
339
|
+
lastSyncedAt.set(root.id, now.getTime());
|
|
340
|
+
await syncMergeOrderChecks(deps, root.id, { synced });
|
|
341
|
+
}
|
|
342
|
+
return batch.length;
|
|
343
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delivers pending NotificationDelivery rows to chat (Slack), one thread per
|
|
3
|
+
* work item (or PR, or run) per channel.
|
|
4
|
+
*
|
|
5
|
+
* Rules:
|
|
6
|
+
* - Lease-gated: only the holder of the "notification-dispatch" SchedulerLease
|
|
7
|
+
* delivers. The lease is renewed before every delivery and the pass ends
|
|
8
|
+
* when renewal fails; a pass also stops after PASS_BUDGET_MS so a delivery
|
|
9
|
+
* always starts well inside the lease TTL. Replicas therefore don't
|
|
10
|
+
* double-post while the lease is held. Delivery is still at-least-once: a
|
|
11
|
+
* failed "delivered" write after a successful post retries (and reposts).
|
|
12
|
+
* - Threads: the first delivery for a (provider, channel, threadKey) posts a
|
|
13
|
+
* parent message and stores its ts in NotificationThread; every event is a
|
|
14
|
+
* reply under it. The thread status is derived from its delivered events;
|
|
15
|
+
* NotificationThread.status is the status last rendered on the parent, which
|
|
16
|
+
* is re-rendered with chat.update whenever the two differ. A deleted parent
|
|
17
|
+
* (message_not_found on update) drops the thread row; the next event posts
|
|
18
|
+
* a fresh parent.
|
|
19
|
+
* - Ordering: within a thread, deliveries go strictly oldest-first. A thread is
|
|
20
|
+
* only worked when its oldest pending delivery is due, and it stops at its
|
|
21
|
+
* first failure in a pass, so a reply never overtakes an older one.
|
|
22
|
+
* - Pacing: at most one Slack call per second per channel (posts and updates).
|
|
23
|
+
* - Errors: rate_limited defers by Retry-After without counting an attempt and
|
|
24
|
+
* holds the whole channel (every thread on it) until Retry-After passes;
|
|
25
|
+
* transient (and any non-ChatError) backs
|
|
26
|
+
* off exponentially and fails at MAX_ATTEMPTS; channel_unreachable fails
|
|
27
|
+
* every pending delivery for the channel and stamps lastError on its links;
|
|
28
|
+
* auth_failed pauses the whole dispatcher for 5 minutes (no attempt counted),
|
|
29
|
+
* then re-checks each provider with auth.test.
|
|
30
|
+
* - Sender: with WARDBY_SLACK_CUSTOMIZE on, a message's display name is the
|
|
31
|
+
* agent the event names (picked up, review, failure), else "wardby".
|
|
32
|
+
* - The pause and channel holds live on `deps.state` (created on first use), not in module
|
|
33
|
+
* state: one dispatcher (or one test) per deps object.
|
|
34
|
+
*/
|
|
35
|
+
import { Prisma, type PrismaClient } from "#prisma";
|
|
36
|
+
import { type ChatProviderRegistry } from "../providers/chat/types.js";
|
|
37
|
+
export declare const DISPATCH_LEASE_SCOPE = "notification-dispatch";
|
|
38
|
+
export declare const MAX_ATTEMPTS = 10;
|
|
39
|
+
/** Per-dispatcher mutable state; `dispatchOnce` creates it on `deps` when absent. */
|
|
40
|
+
export interface DispatcherState {
|
|
41
|
+
/** While set and in the future, passes deliver nothing. */
|
|
42
|
+
pausedUntil?: Date;
|
|
43
|
+
/** provider\0channel → no Slack call to that channel before this time (rate limit Retry-After). */
|
|
44
|
+
channelBlockedUntil?: Map<string, Date>;
|
|
45
|
+
}
|
|
46
|
+
export interface DispatcherDeps {
|
|
47
|
+
db: PrismaClient;
|
|
48
|
+
chat: ChatProviderRegistry;
|
|
49
|
+
holder: string;
|
|
50
|
+
now?: () => Date;
|
|
51
|
+
sleep?: (ms: number) => Promise<void>;
|
|
52
|
+
state?: DispatcherState;
|
|
53
|
+
/** Test-only: deliver only rows whose channelId starts with this (keeps parallel DB suites apart). */
|
|
54
|
+
channelIdPrefix?: string;
|
|
55
|
+
}
|
|
56
|
+
/** Exponential back-off: 5s · 2^(attempts-1), capped at 1h. */
|
|
57
|
+
export declare function backoffMs(attempts: number): number;
|
|
58
|
+
/** One pass: deliver what is due. Returns the number of deliveries attempted. */
|
|
59
|
+
export declare function dispatchOnce(deps: DispatcherDeps): Promise<number>;
|
|
60
|
+
/**
|
|
61
|
+
* Deletes events (and their deliveries) older than `days` with no pending
|
|
62
|
+
* delivery. `only` narrows the candidates further (tests scope it to their own rows).
|
|
63
|
+
*/
|
|
64
|
+
export declare function pruneWorkflowEvents(db: PrismaClient, now: Date, days?: number, only?: Prisma.WorkflowEventWhereInput): Promise<number>;
|
|
65
|
+
export interface DispatcherHandle {
|
|
66
|
+
stop(): void;
|
|
67
|
+
}
|
|
68
|
+
export declare function startNotificationDispatcher(deps: DispatcherDeps & {
|
|
69
|
+
intervalMs?: number;
|
|
70
|
+
}): DispatcherHandle;
|