@wardby/cli 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +5 -5
- package/README.md +6 -1
- package/deploy/local/docker-compose.quickstart-coding.yml +19 -0
- package/dist/claude-coding-worker/driver.d.ts +33 -3
- package/dist/claude-coding-worker/driver.js +151 -21
- package/dist/claude-coding-worker/main.js +38 -6
- package/dist/claude-coding-worker/sdk.js +29 -2
- package/dist/claude-coding-worker/tool-socket.d.ts +27 -0
- package/dist/claude-coding-worker/tool-socket.js +111 -0
- package/dist/claude-coding-worker/transcript.d.ts +18 -0
- package/dist/claude-coding-worker/transcript.js +77 -0
- package/dist/claude-plugin/command.d.ts +61 -0
- package/dist/claude-plugin/command.js +376 -0
- package/dist/cli-help.d.ts +1 -1
- package/dist/cli-help.js +3 -1
- package/dist/cli.js +71 -13
- package/dist/coding/code-host.d.ts +16 -0
- package/dist/coding/code-host.js +60 -0
- package/dist/coding/continuation-wording.d.ts +35 -0
- package/dist/coding/continuation-wording.js +73 -0
- package/dist/coding/linked-issue-note.d.ts +23 -0
- package/dist/coding/linked-issue-note.js +47 -0
- package/dist/coding/mcp-token.d.ts +12 -0
- package/dist/coding/mcp-token.js +26 -0
- package/dist/coding/merge-wording.d.ts +28 -0
- package/dist/coding/merge-wording.js +78 -0
- package/dist/coding/pr-description-note.d.ts +9 -0
- package/dist/coding/pr-description-note.js +32 -0
- package/dist/coding/profile.d.ts +46 -126
- package/dist/coding/profile.js +45 -4
- package/dist/coding/protected-path-wording.d.ts +8 -0
- package/dist/coding/protected-path-wording.js +1 -1
- package/dist/coding/protocol.d.ts +264 -346
- package/dist/coding/protocol.js +237 -12
- package/dist/coding/redact.d.ts +3 -0
- package/dist/coding/redact.js +17 -0
- package/dist/coding/registry/allowlist.d.ts +12 -0
- package/dist/coding/registry/allowlist.js +14 -1
- package/dist/coding/registry/audit-mode.d.ts +153 -0
- package/dist/coding/registry/audit-mode.js +304 -0
- package/dist/coding/registry/lockfile-shared.d.ts +36 -0
- package/dist/coding/registry/lockfile-shared.js +128 -0
- package/dist/coding/registry/lockfiles.js +1 -1
- package/dist/coding/registry/npm-lockfile-formats.d.ts +11 -0
- package/dist/coding/registry/npm-lockfile-formats.js +41 -0
- package/dist/coding/registry/npm-lockfile.d.ts +8 -4
- package/dist/coding/registry/npm-lockfile.js +4 -6
- package/dist/coding/registry/npm.js +78 -8
- package/dist/coding/registry/pnpm-lockfile.d.ts +17 -0
- package/dist/coding/registry/pnpm-lockfile.js +189 -0
- package/dist/coding/registry/pypi-plan.d.ts +50 -0
- package/dist/coding/registry/pypi-plan.js +406 -0
- package/dist/coding/registry/pypi-requirements.d.ts +58 -0
- package/dist/coding/registry/pypi-requirements.js +155 -0
- package/dist/coding/registry/pypi.d.ts +3 -27
- package/dist/coding/registry/pypi.js +40 -154
- package/dist/coding/registry/refusal-hints.d.ts +20 -0
- package/dist/coding/registry/refusal-hints.js +61 -0
- package/dist/coding/registry/refusal-wording.d.ts +11 -0
- package/dist/coding/registry/refusal-wording.js +56 -0
- package/dist/coding/registry/report.d.ts +70 -8
- package/dist/coding/registry/report.js +112 -5
- package/dist/coding/registry/types.d.ts +58 -8
- package/dist/coding/registry/yarn-lockfile.d.ts +30 -0
- package/dist/coding/registry/yarn-lockfile.js +367 -0
- package/dist/coding/services/catalog.d.ts +37 -351
- package/dist/coding/transcript/claude-code.d.ts +13 -0
- package/dist/coding/transcript/claude-code.js +273 -0
- package/dist/coding/transcript/download-protocol.d.ts +30 -0
- package/dist/coding/transcript/download-protocol.js +18 -0
- package/dist/coding/transcript/format.d.ts +20 -0
- package/dist/coding/transcript/format.js +32 -0
- package/dist/coding/transcript/recorder.d.ts +52 -0
- package/dist/coding/transcript/recorder.js +225 -0
- package/dist/coding/transcript/resume/checkout.d.ts +31 -0
- package/dist/coding/transcript/resume/checkout.js +203 -0
- package/dist/coding/transcript/resume/command.d.ts +17 -0
- package/dist/coding/transcript/resume/command.js +176 -0
- package/dist/coding/transcript/resume/download.d.ts +20 -0
- package/dist/coding/transcript/resume/download.js +153 -0
- package/dist/coding/transcript/resume/launch.d.ts +38 -0
- package/dist/coding/transcript/resume/launch.js +128 -0
- package/dist/coding/transcript/resume/session-file.d.ts +13 -0
- package/dist/coding/transcript/resume/session-file.js +79 -0
- package/dist/coding/transcript/resume/stand-in.d.ts +11 -0
- package/dist/coding/transcript/resume/stand-in.js +49 -0
- package/dist/coding-worker/artifact.d.ts +8 -3
- package/dist/coding-worker/artifact.js +3 -1
- package/dist/coding-worker/debug-trace.d.ts +9 -6
- package/dist/coding-worker/debug-trace.js +16 -19
- package/dist/coding-worker/dependency-cache.d.mts +229 -0
- package/dist/coding-worker/dependency-cache.mjs +2123 -0
- package/dist/coding-worker/driver.d.ts +4 -3
- package/dist/coding-worker/driver.js +124 -39
- package/dist/coding-worker/errors.d.ts +1 -0
- package/dist/coding-worker/errors.js +32 -0
- package/dist/coding-worker/main.js +5 -1
- package/dist/coding-worker/mcp-config.d.ts +27 -0
- package/dist/coding-worker/mcp-config.js +32 -0
- package/dist/coding-worker/sdk.d.ts +36 -0
- package/dist/coding-worker/sdk.js +28 -1
- package/dist/coding-worker/task-note.d.ts +11 -0
- package/dist/coding-worker/task-note.js +13 -0
- package/dist/coding-worker/types.d.ts +15 -0
- package/dist/config/dependency-cache.d.ts +23 -0
- package/dist/config/dependency-cache.js +32 -0
- package/dist/config/mcp-call-limit.d.ts +8 -0
- package/dist/config/mcp-call-limit.js +18 -0
- package/dist/config/mcp-servers.d.ts +8 -0
- package/dist/config/mcp-servers.js +12 -0
- package/dist/config/providers.d.ts +12 -3
- package/dist/config/providers.js +55 -5
- package/dist/config/test-simulators.d.ts +92 -0
- package/dist/config/test-simulators.js +333 -0
- package/dist/config/tool-timeout.d.ts +1 -0
- package/dist/config/tool-timeout.js +18 -0
- package/dist/core/async-context.d.ts +2 -0
- package/dist/core/async-context.js +12 -0
- package/dist/core/budget-events.d.ts +108 -0
- package/dist/core/budget-events.js +346 -0
- package/dist/core/budget-groups.d.ts +50 -1
- package/dist/core/budget-groups.js +236 -27
- package/dist/core/budget-stopped-head.d.ts +46 -0
- package/dist/core/budget-stopped-head.js +81 -0
- package/dist/core/budget-topup.d.ts +51 -0
- package/dist/core/budget-topup.js +156 -0
- package/dist/core/budget-wording.d.ts +16 -2
- package/dist/core/budget-wording.js +40 -2
- package/dist/core/coding-mcp.d.ts +36 -0
- package/dist/core/coding-mcp.js +253 -0
- package/dist/core/coding-queue.d.ts +2 -1
- package/dist/core/coding-queue.js +7 -0
- package/dist/core/coding-repository.d.ts +46 -0
- package/dist/core/coding-repository.js +92 -0
- package/dist/core/cron.d.ts +19 -1
- package/dist/core/cron.js +17 -0
- package/dist/core/datastores.js +1 -1
- package/dist/core/deferred-coding.d.ts +14 -0
- package/dist/core/deferred-coding.js +62 -0
- package/dist/core/delegation-child.d.ts +25 -0
- package/dist/core/delegation-child.js +37 -0
- package/dist/core/delegation-slots.d.ts +27 -0
- package/dist/core/delegation-slots.js +44 -0
- package/dist/core/dispatch.d.ts +48 -2
- package/dist/core/dispatch.js +166 -66
- package/dist/core/engine-native.js +1 -1
- package/dist/core/error-code.d.ts +38 -0
- package/dist/core/error-code.js +169 -0
- package/dist/core/grants.d.ts +46 -8
- package/dist/core/grants.js +99 -8
- package/dist/core/host-events.d.ts +18 -2
- package/dist/core/host-events.js +291 -27
- package/dist/core/host-status.d.ts +85 -3
- package/dist/core/host-status.js +300 -22
- package/dist/core/issue-bridge.d.ts +50 -6
- package/dist/core/issue-bridge.js +124 -33
- package/dist/core/issue-events.d.ts +1 -1
- package/dist/core/issue-events.js +4 -10
- package/dist/core/issue-status.d.ts +1 -1
- package/dist/core/issue-status.js +58 -29
- package/dist/core/logger.d.ts +5 -0
- package/dist/core/logger.js +14 -1
- package/dist/core/lost-run-children.d.ts +6 -0
- package/dist/core/lost-run-children.js +32 -0
- package/dist/core/mark-ready.d.ts +34 -0
- package/dist/core/mark-ready.js +152 -0
- package/dist/core/markdown-code.d.ts +8 -0
- package/dist/core/markdown-code.js +107 -0
- package/dist/core/mcp-client/client.d.ts +47 -0
- package/dist/core/mcp-client/client.js +141 -0
- package/dist/core/mcp-client/jsonrpc.d.ts +15 -0
- package/dist/core/mcp-client/jsonrpc.js +54 -0
- package/dist/core/mcp-client/results.d.ts +13 -0
- package/dist/core/mcp-client/results.js +42 -0
- package/dist/core/mcp-servers.d.ts +90 -0
- package/dist/core/mcp-servers.js +230 -0
- package/dist/core/mcp-tools.d.ts +108 -0
- package/dist/core/mcp-tools.js +287 -0
- package/dist/core/memory-tools.js +7 -0
- package/dist/core/merge-order-check.d.ts +2 -1
- package/dist/core/merge-order-check.js +44 -18
- package/dist/core/notification-dispatcher.js +2 -1
- package/dist/core/notification-templates.d.ts +1 -7
- package/dist/core/notification-templates.js +36 -2
- package/dist/core/pull-request-state-sync.js +2 -2
- package/dist/core/reconciler.d.ts +4 -3
- package/dist/core/reconciler.js +8 -1
- package/dist/core/related-pull-requests.d.ts +11 -3
- package/dist/core/related-pull-requests.js +49 -20
- package/dist/core/reply-parts.d.ts +21 -0
- package/dist/core/reply-parts.js +73 -0
- package/dist/core/review-fix.d.ts +1 -1
- package/dist/core/review-fix.js +4 -3
- package/dist/core/review-host-checks.d.ts +1 -1
- package/dist/core/review-host-tools.d.ts +3 -0
- package/dist/core/review-host-tools.js +102 -14
- package/dist/core/review-reads.d.ts +55 -0
- package/dist/core/review-reads.js +233 -0
- package/dist/core/run-status.d.ts +12 -0
- package/dist/core/run-status.js +12 -0
- package/dist/core/runner.d.ts +145 -49
- package/dist/core/runner.js +719 -216
- package/dist/core/schedule-start.d.ts +12 -0
- package/dist/core/schedule-start.js +14 -0
- package/dist/core/secret-broker-config.d.ts +12 -74
- package/dist/core/secret-broker-config.js +1 -1
- package/dist/core/secret-guard.d.ts +49 -0
- package/dist/core/secret-guard.js +119 -0
- package/dist/core/secret-guarded-stores.d.ts +12 -0
- package/dist/core/secret-guarded-stores.js +41 -0
- package/dist/core/secret-spans.d.ts +50 -0
- package/dist/core/secret-spans.js +94 -0
- package/dist/core/secrets.d.ts +11 -1
- package/dist/core/secrets.js +27 -1
- package/dist/core/serializable-retry.d.ts +18 -0
- package/dist/core/serializable-retry.js +43 -0
- package/dist/core/stop-run.d.ts +46 -0
- package/dist/core/stop-run.js +61 -0
- package/dist/core/tool-admin.d.ts +5 -1
- package/dist/core/tool-admin.js +7 -2
- package/dist/core/tool-names.d.ts +13 -0
- package/dist/core/tool-names.js +20 -0
- package/dist/core/webhooks.d.ts +4 -0
- package/dist/core/webhooks.js +68 -49
- package/dist/core/workflow-events.d.ts +14 -2
- package/dist/core/workflow-events.js +4 -0
- package/dist/core/workflow-run-events.d.ts +5 -3
- package/dist/core/workflow-run-events.js +45 -9
- package/dist/core/zod-json-schema.d.ts +4 -0
- package/dist/core/zod-json-schema.js +39 -0
- package/dist/core/zod3-window.d.ts +35 -0
- package/dist/core/zod3-window.js +124 -0
- package/dist/generated/prisma/browser.d.ts +65 -3
- package/dist/generated/prisma/client.d.ts +65 -3
- package/dist/generated/prisma/commonInputTypes.d.ts +266 -106
- package/dist/generated/prisma/enums.d.ts +10 -0
- package/dist/generated/prisma/enums.js +8 -0
- package/dist/generated/prisma/internal/class.d.ts +110 -0
- package/dist/generated/prisma/internal/class.js +4 -4
- package/dist/generated/prisma/internal/prismaNamespace.d.ts +957 -9
- package/dist/generated/prisma/internal/prismaNamespace.js +166 -2
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +174 -0
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +166 -2
- package/dist/generated/prisma/models/Agent.d.ts +377 -8
- package/dist/generated/prisma/models/AgentMcpServer.d.ts +1412 -0
- package/dist/generated/prisma/models/AgentMcpServer.js +1 -0
- package/dist/generated/prisma/models/AgentRepository.d.ts +81 -1
- package/dist/generated/prisma/models/AuthUser.d.ts +1 -1
- package/dist/generated/prisma/models/CodingAgentProfile.d.ts +228 -7
- package/dist/generated/prisma/models/CodingProxyRequest.d.ts +207 -3
- package/dist/generated/prisma/models/CodingProxySession.d.ts +232 -2
- package/dist/generated/prisma/models/CodingRun.d.ts +1712 -1
- package/dist/generated/prisma/models/DependencySnapshot.d.ts +1668 -0
- package/dist/generated/prisma/models/DependencySnapshot.js +1 -0
- package/dist/generated/prisma/models/HostProvider.d.ts +2176 -0
- package/dist/generated/prisma/models/HostProvider.js +1 -0
- package/dist/generated/prisma/models/HostProviderCredential.d.ts +1285 -0
- package/dist/generated/prisma/models/HostProviderCredential.js +1 -0
- package/dist/generated/prisma/models/HostProviderOperation.d.ts +1470 -0
- package/dist/generated/prisma/models/HostProviderOperation.js +1 -0
- package/dist/generated/prisma/models/HostProviderTrustedAccount.d.ts +1145 -0
- package/dist/generated/prisma/models/HostProviderTrustedAccount.js +1 -0
- package/dist/generated/prisma/models/IssuePullRequest.d.ts +6 -2
- package/dist/generated/prisma/models/LocalReview.d.ts +40 -1
- package/dist/generated/prisma/models/McpServer.d.ts +1500 -0
- package/dist/generated/prisma/models/McpServer.js +1 -0
- package/dist/generated/prisma/models/NativeGatewayCall.d.ts +77 -1
- package/dist/generated/prisma/models/NativeGatewaySession.d.ts +35 -1
- package/dist/generated/prisma/models/Principal.d.ts +167 -0
- package/dist/generated/prisma/models/RegistryAllowance.d.ts +41 -1
- package/dist/generated/prisma/models/RegistryApprovedVersion.d.ts +75 -1
- package/dist/generated/prisma/models/RegistryAuditRecord.d.ts +1364 -0
- package/dist/generated/prisma/models/RegistryAuditRecord.js +1 -0
- package/dist/generated/prisma/models/ResourceGrant.d.ts +1 -1
- package/dist/generated/prisma/models/Run.d.ts +738 -2
- package/dist/generated/prisma/models/RunBudgetEvent.d.ts +1211 -0
- package/dist/generated/prisma/models/RunBudgetEvent.js +1 -0
- package/dist/generated/prisma/models/RunTranscript.d.ts +1339 -0
- package/dist/generated/prisma/models/RunTranscript.js +1 -0
- package/dist/generated/prisma/models/Secret.d.ts +387 -0
- package/dist/generated/prisma/models/Tool.d.ts +223 -1
- package/dist/generated/prisma/models.d.ts +10 -0
- package/dist/help/search.js +12 -3
- package/dist/help-index.json +2033 -110
- package/dist/import/create.js +48 -4
- package/dist/import/neutral-schema.d.ts +51 -281
- package/dist/import/neutral-schema.js +7 -4
- package/dist/knowledge/check.d.ts +1 -1
- package/dist/knowledge/cli.d.ts +11 -1
- package/dist/knowledge/cli.js +37 -4
- package/dist/knowledge/concept.d.ts +3 -19
- package/dist/knowledge/location.d.ts +31 -0
- package/dist/knowledge/location.js +78 -0
- package/dist/mcp/auth/access.d.ts +10 -2
- package/dist/mcp/auth/access.js +15 -1
- package/dist/mcp/auth/grants-cli.d.ts +6 -4
- package/dist/mcp/auth/grants-cli.js +42 -3
- package/dist/mcp/auth/ownership.d.ts +7 -7
- package/dist/mcp/auth/resource-server.d.ts +3 -1
- package/dist/mcp/auth/resource-server.js +17 -2
- package/dist/mcp/auth/self-hosted/credentials.d.ts +3 -3
- package/dist/mcp/auth/self-hosted/session.d.ts +2 -2
- package/dist/mcp/context.d.ts +3 -0
- package/dist/mcp/host-events/github-ingress.d.ts +2 -0
- package/dist/mcp/host-events/github-ingress.js +2 -1
- package/dist/mcp/index.d.ts +6 -0
- package/dist/mcp/index.js +69 -10
- package/dist/mcp/server.d.ts +13 -0
- package/dist/mcp/server.js +33 -14
- package/dist/mcp/tools/agents.d.ts +4 -0
- package/dist/mcp/tools/agents.js +295 -28
- package/dist/mcp/tools/datastore.js +17 -8
- package/dist/mcp/tools/grants.js +73 -29
- package/dist/mcp/tools/host-providers.d.ts +2 -0
- package/dist/mcp/tools/host-providers.js +215 -0
- package/dist/mcp/tools/mcp-servers.d.ts +26 -0
- package/dist/mcp/tools/mcp-servers.js +481 -0
- package/dist/mcp/tools/memory.js +11 -1
- package/dist/mcp/tools/notification-channels.js +2 -2
- package/dist/mcp/tools/packages.d.ts +2 -0
- package/dist/mcp/tools/packages.js +195 -0
- package/dist/mcp/tools/repositories.js +65 -12
- package/dist/mcp/tools/run-access.d.ts +16 -0
- package/dist/mcp/tools/run-access.js +25 -0
- package/dist/mcp/tools/run-transcript-download.d.ts +30 -0
- package/dist/mcp/tools/run-transcript-download.js +129 -0
- package/dist/mcp/tools/run-transcript.d.ts +19 -0
- package/dist/mcp/tools/run-transcript.js +70 -0
- package/dist/mcp/tools/runs.js +209 -27
- package/dist/mcp/tools/scheduling.js +3 -1
- package/dist/mcp/tools/secret-elicitation-form.js +5 -0
- package/dist/mcp/tools/secret-elicitation-server.d.ts +6 -0
- package/dist/mcp/tools/secret-elicitation-server.js +10 -61
- package/dist/mcp/tools/secret-elicitation.d.ts +2 -0
- package/dist/mcp/tools/secret-elicitation.js +25 -2
- package/dist/mcp/tools/secrets.js +40 -6
- package/dist/mcp/tools/stop-run.d.ts +2 -0
- package/dist/mcp/tools/stop-run.js +82 -0
- package/dist/mcp/tools/subagents.js +2 -2
- package/dist/mcp/tools/tools.d.ts +7 -5
- package/dist/mcp/tools/tools.js +64 -16
- package/dist/mcp/tools/trigger.js +28 -6
- package/dist/mcp/transport/http-limits.d.ts +2 -0
- package/dist/mcp/transport/http-limits.js +6 -2
- package/dist/mcp/transport/stdio-link-host.d.ts +20 -0
- package/dist/mcp/transport/stdio-link-host.js +67 -0
- package/dist/mcp/transport/streamable-http.d.ts +13 -0
- package/dist/mcp/transport/streamable-http.js +41 -1
- package/dist/mcp/webhooks/ingress.js +10 -0
- package/dist/native-worker/docker-launcher.d.ts +38 -2
- package/dist/native-worker/docker-launcher.js +65 -5
- package/dist/native-worker/gateway-server.d.ts +55 -3
- package/dist/native-worker/gateway-server.js +152 -34
- package/dist/native-worker/gateway.d.ts +29 -1
- package/dist/native-worker/gateway.js +74 -4
- package/dist/native-worker/http-server.d.ts +7 -1
- package/dist/native-worker/http-server.js +62 -7
- package/dist/native-worker/http-transport.js +1 -1
- package/dist/native-worker/kubernetes-launcher.d.ts +7 -3
- package/dist/native-worker/kubernetes-launcher.js +43 -3
- package/dist/native-worker/launch.d.ts +18 -1
- package/dist/native-worker/launch.js +6 -1
- package/dist/native-worker/ledger.d.ts +24 -4
- package/dist/native-worker/ledger.js +62 -8
- package/dist/native-worker/loopback.js +3 -8
- package/dist/native-worker/main.d.ts +2 -1
- package/dist/native-worker/main.js +14 -3
- package/dist/native-worker/protocol.d.ts +130 -577
- package/dist/native-worker/protocol.js +51 -2
- package/dist/native-worker/sandbox-executor.d.ts +17 -2
- package/dist/native-worker/sandbox-executor.js +78 -4
- package/dist/native-worker/stderr-redaction.d.ts +77 -0
- package/dist/native-worker/stderr-redaction.js +237 -0
- package/dist/native-worker/stdio.d.ts +1 -1
- package/dist/native-worker/stdio.js +6 -5
- package/dist/native-worker/warm-pool.d.ts +2 -2
- package/dist/native-worker/warm-pool.js +4 -4
- package/dist/native-worker/worker.js +28 -2
- package/dist/observability/metrics.js +6 -1
- package/dist/providers/auth/self-hosted.d.ts +1 -1
- package/dist/providers/coding-proxy/capability-hash.d.ts +2 -0
- package/dist/providers/coding-proxy/capability-hash.js +5 -0
- package/dist/providers/coding-proxy/dependency-cache/eviction.d.ts +29 -0
- package/dist/providers/coding-proxy/dependency-cache/eviction.js +87 -0
- package/dist/providers/coding-proxy/dependency-cache/key.d.ts +33 -0
- package/dist/providers/coding-proxy/dependency-cache/key.js +86 -0
- package/dist/providers/coding-proxy/dependency-cache/model-request-seal.d.ts +18 -0
- package/dist/providers/coding-proxy/dependency-cache/model-request-seal.js +40 -0
- package/dist/providers/coding-proxy/dependency-cache/prisma-store.d.ts +25 -0
- package/dist/providers/coding-proxy/dependency-cache/prisma-store.js +131 -0
- package/dist/providers/coding-proxy/dependency-cache/service.d.ts +70 -0
- package/dist/providers/coding-proxy/dependency-cache/service.js +409 -0
- package/dist/providers/coding-proxy/dependency-cache/store.d.ts +85 -0
- package/dist/providers/coding-proxy/dependency-cache/store.js +95 -0
- package/dist/providers/coding-proxy/hold.d.ts +32 -0
- package/dist/providers/coding-proxy/hold.js +86 -0
- package/dist/providers/coding-proxy/interrupted.d.ts +70 -0
- package/dist/providers/coding-proxy/interrupted.js +104 -0
- package/dist/providers/coding-proxy/mcp-route.d.ts +34 -0
- package/dist/providers/coding-proxy/mcp-route.js +166 -0
- package/dist/providers/coding-proxy/memory-ledger.d.ts +17 -2
- package/dist/providers/coding-proxy/memory-ledger.js +99 -8
- package/dist/providers/coding-proxy/metering.d.ts +16 -0
- package/dist/providers/coding-proxy/metering.js +27 -4
- package/dist/providers/coding-proxy/prisma-ledger.d.ts +16 -2
- package/dist/providers/coding-proxy/prisma-ledger.js +209 -69
- package/dist/providers/coding-proxy/proxy.d.ts +21 -2
- package/dist/providers/coding-proxy/proxy.js +300 -48
- package/dist/providers/coding-proxy/registry/audit.d.ts +53 -10
- package/dist/providers/coding-proxy/registry/audit.js +94 -17
- package/dist/providers/coding-proxy/registry/lockfile-parse-worker.d.ts +36 -0
- package/dist/providers/coding-proxy/registry/lockfile-parse-worker.js +67 -0
- package/dist/providers/coding-proxy/registry/lockfile-parse.d.ts +16 -0
- package/dist/providers/coding-proxy/registry/lockfile-parse.js +110 -0
- package/dist/providers/coding-proxy/registry/plan.d.ts +9 -0
- package/dist/providers/coding-proxy/registry/plan.js +201 -48
- package/dist/providers/coding-proxy/registry/prisma-store.d.ts +11 -5
- package/dist/providers/coding-proxy/registry/prisma-store.js +120 -17
- package/dist/providers/coding-proxy/registry/service.d.ts +97 -16
- package/dist/providers/coding-proxy/registry/service.js +579 -112
- package/dist/providers/coding-proxy/registry/store.d.ts +84 -9
- package/dist/providers/coding-proxy/registry/store.js +54 -1
- package/dist/providers/coding-proxy/runtime.d.ts +10 -0
- package/dist/providers/coding-proxy/runtime.js +109 -16
- package/dist/providers/coding-proxy/server.d.ts +9 -1
- package/dist/providers/coding-proxy/server.js +55 -1
- package/dist/providers/coding-proxy/types.d.ts +78 -1
- package/dist/providers/datastore/types.d.ts +5 -0
- package/dist/providers/engine/types.d.ts +17 -2
- package/dist/providers/engine/types.js +17 -0
- package/dist/providers/executor/composition.d.ts +10 -3
- package/dist/providers/executor/composition.js +52 -7
- package/dist/providers/executor/container.d.ts +394 -9
- package/dist/providers/executor/container.js +1210 -96
- package/dist/providers/executor/dbos-status.d.ts +31 -0
- package/dist/providers/executor/dbos-status.js +64 -0
- package/dist/providers/executor/dbos.d.ts +50 -1
- package/dist/providers/executor/dbos.js +207 -20
- package/dist/providers/executor/deferred.d.ts +12 -24
- package/dist/providers/executor/deferred.js +10 -29
- package/dist/providers/executor/in-process.d.ts +9 -1
- package/dist/providers/executor/in-process.js +14 -4
- package/dist/providers/executor/linked-issue-reader.d.ts +16 -0
- package/dist/providers/executor/linked-issue-reader.js +30 -0
- package/dist/providers/executor/routing.d.ts +2 -0
- package/dist/providers/executor/routing.js +4 -0
- package/dist/providers/executor/types.d.ts +13 -0
- package/dist/providers/host-tools/invoke.d.ts +37 -0
- package/dist/providers/host-tools/invoke.js +117 -0
- package/dist/providers/host-tools/operations.d.ts +65 -0
- package/dist/providers/host-tools/operations.js +149 -0
- package/dist/providers/host-tools/registry.d.ts +79 -0
- package/dist/providers/host-tools/registry.js +362 -0
- package/dist/providers/host-tools/request-guard.d.ts +17 -0
- package/dist/providers/host-tools/request-guard.js +99 -0
- package/dist/providers/host-tools/self-test.d.ts +64 -0
- package/dist/providers/host-tools/self-test.js +142 -0
- package/dist/providers/index.d.ts +2 -1
- package/dist/providers/issue-tracker/types.d.ts +17 -0
- package/dist/providers/issue-tracker/types.js +39 -1
- package/dist/providers/jobs/claude-tool-setup.d.ts +4 -0
- package/dist/providers/jobs/claude-tool-setup.js +5 -2
- package/dist/providers/jobs/docker-isolation.d.ts +10 -2
- package/dist/providers/jobs/docker-isolation.js +47 -8
- package/dist/providers/jobs/docker.d.ts +9 -0
- package/dist/providers/jobs/docker.js +60 -11
- package/dist/providers/jobs/fake-kubernetes-api.d.ts +2 -0
- package/dist/providers/jobs/fake-kubernetes-api.js +3 -0
- package/dist/providers/jobs/kubernetes-api.d.ts +8 -0
- package/dist/providers/jobs/kubernetes-api.js +10 -0
- package/dist/providers/jobs/kubernetes-client.js +10 -1
- package/dist/providers/jobs/kubernetes-isolation.d.ts +5 -1
- package/dist/providers/jobs/kubernetes-isolation.js +32 -3
- package/dist/providers/jobs/kubernetes.d.ts +11 -1
- package/dist/providers/jobs/kubernetes.js +111 -17
- package/dist/providers/jobs/types.d.ts +39 -0
- package/dist/providers/jobs/types.js +13 -1
- package/dist/providers/llm/anthropic.js +5 -1
- package/dist/providers/llm/bedrock.d.ts +0 -12
- package/dist/providers/llm/bedrock.js +4 -0
- package/dist/providers/llm/claude-messages.d.ts +3 -1
- package/dist/providers/llm/claude-messages.js +4 -1
- package/dist/providers/llm/claude-provider.d.ts +2 -2
- package/dist/providers/llm/claude-provider.js +2 -2
- package/dist/providers/llm/openai.d.ts +2 -2
- package/dist/providers/llm/openai.js +6 -2
- package/dist/providers/llm/routing.d.ts +2 -2
- package/dist/providers/llm/routing.js +2 -2
- package/dist/providers/llm/types.d.ts +12 -2
- package/dist/providers/review-host/github-events.d.ts +9 -1
- package/dist/providers/review-host/github-events.js +34 -12
- package/dist/providers/review-host/github.d.ts +29 -2
- package/dist/providers/review-host/github.js +224 -29
- package/dist/providers/review-host/local.d.ts +8 -4
- package/dist/providers/review-host/local.js +49 -31
- package/dist/providers/review-host/patch-pages.d.ts +41 -0
- package/dist/providers/review-host/patch-pages.js +176 -0
- package/dist/providers/review-host/review-format.d.ts +19 -1
- package/dist/providers/review-host/review-format.js +38 -7
- package/dist/providers/review-host/types.d.ts +140 -6
- package/dist/providers/review-host/types.js +9 -1
- package/dist/providers/storage/gcs.d.ts +63 -0
- package/dist/providers/storage/gcs.js +69 -0
- package/dist/providers/storage/index.d.ts +15 -0
- package/dist/providers/storage/index.js +14 -0
- package/dist/providers/storage/local.d.ts +24 -0
- package/dist/providers/storage/local.js +92 -0
- package/dist/providers/storage/meter.d.ts +14 -0
- package/dist/providers/storage/meter.js +34 -0
- package/dist/providers/storage/s3.d.ts +41 -0
- package/dist/providers/storage/s3.js +107 -0
- package/dist/providers/storage/types.d.ts +37 -3
- package/dist/providers/storage/types.js +21 -4
- package/dist/providers/vcs/git.d.ts +39 -4
- package/dist/providers/vcs/git.js +339 -26
- package/dist/providers/vcs/github-remote.d.ts +26 -3
- package/dist/providers/vcs/github-remote.js +124 -14
- package/dist/providers/vcs/github.d.ts +183 -44
- package/dist/providers/vcs/github.js +455 -56
- package/dist/providers/vcs/index.d.ts +1 -1
- package/dist/providers/vcs/index.js +9 -2
- package/dist/providers/vcs/pr-description.d.ts +127 -0
- package/dist/providers/vcs/pr-description.js +270 -0
- package/dist/providers/vcs/remote.d.ts +37 -1
- package/dist/providers/vcs/remote.js +7 -1
- package/dist/providers/vcs/routing.d.ts +16 -8
- package/dist/providers/vcs/routing.js +27 -6
- package/dist/providers/vcs/types.d.ts +150 -5
- package/dist/quickstart/coding-seed.d.ts +14 -3
- package/dist/quickstart/coding-seed.js +213 -4
- package/dist/quickstart/index.d.ts +5 -0
- package/dist/quickstart/index.js +21 -0
- package/dist/quickstart/reviewer-prompt.d.ts +1 -1
- package/dist/quickstart/reviewer-prompt.js +6 -6
- package/dist/quickstart-images.json +1 -1
- package/dist/sandbox/eval-core.d.ts +12 -2
- package/dist/sandbox/eval-core.js +20 -4
- package/dist/sandbox/generated/zod.bundle.js +62 -1
- package/dist/sandbox/generated/zod3.bundle.js +5 -0
- package/dist/sandbox/host-functions.d.ts +5 -0
- package/dist/sandbox/host-functions.js +13 -13
- package/dist/sandbox/limits.d.ts +4 -1
- package/dist/sandbox/limits.js +4 -1
- package/dist/sandbox/run-in-sandbox.d.ts +6 -0
- package/dist/sandbox/run-in-sandbox.js +14 -2
- package/dist/sandbox/safe-fetch.d.ts +2 -0
- package/dist/sandbox/safe-fetch.js +1 -1
- package/dist/sandbox/secret-broker.d.ts +1 -0
- package/dist/sandbox/secret-broker.js +4 -5
- package/dist/sandbox/tool-capabilities.d.ts +10 -30
- package/dist/sandbox/tool-timeout.d.ts +32 -0
- package/dist/sandbox/tool-timeout.js +52 -0
- package/dist/sandbox/user-tool.d.ts +8 -1
- package/dist/sandbox/user-tool.js +9 -3
- package/dist/sandbox/zod-params.d.ts +37 -5
- package/dist/sandbox/zod-params.js +181 -26
- package/dist/serve.js +8 -1
- package/dist/viewer/api-schema.d.ts +349 -2627
- package/dist/viewer/api-schema.js +7 -0
- package/dist/viewer/build-schemas.js +6 -2
- package/dist/viewer/graph.js +2 -1
- package/dist/viewer/openapi.js +2 -4
- package/dist/wardby-bin.js +15 -0
- package/docs/README.md +11 -1
- package/docs/agent-recipes.md +95 -24
- package/docs/architecture-runtime.md +1 -1
- package/docs/claude-code-plugin.md +164 -0
- package/docs/code-review-agents.md +557 -41
- package/docs/coding-agent-setup.md +566 -8
- package/docs/coding-packages.md +1033 -90
- package/docs/coding-services.md +27 -12
- package/docs/coding-worker-byo-images.md +24 -2
- package/docs/coding-worker-isolation.md +183 -37
- package/docs/debugging-agent-runs.md +242 -0
- package/docs/getting-started-gke.md +129 -141
- package/docs/getting-started-identity-provider.md +53 -38
- package/docs/getting-started.md +17 -0
- package/docs/host-providers.md +294 -0
- package/docs/jira-agents.md +17 -8
- package/docs/knowledge/blob-not-found-semantics.md +41 -0
- package/docs/knowledge/bounded-file-descriptor.md +52 -0
- package/docs/knowledge/delegation-admission-slots.md +52 -0
- package/docs/knowledge/http-dispatcher-bootstrap.md +61 -0
- package/docs/knowledge/import-rename-target.md +52 -0
- package/docs/knowledge/index.md +57 -0
- package/docs/knowledge/log.md +9 -0
- package/docs/knowledge/mcp-cancelled-task-precedence.md +41 -0
- package/docs/knowledge/mcp-http-prompt-discovery.md +41 -0
- package/docs/knowledge/mcp-schema-module-boundary.md +41 -0
- package/docs/knowledge/nullable-tool-uniqueness.md +52 -0
- package/docs/knowledge/overview-cli.md +74 -0
- package/docs/knowledge/overview-coding-proxy.md +72 -0
- package/docs/knowledge/overview-coding.md +72 -0
- package/docs/knowledge/overview-config.md +60 -0
- package/docs/knowledge/overview-core.md +72 -0
- package/docs/knowledge/overview-deploy.md +83 -0
- package/docs/knowledge/overview-mcp.md +61 -0
- package/docs/knowledge/overview-prisma.md +72 -0
- package/docs/knowledge/overview-providers.md +89 -0
- package/docs/knowledge/overview-sandbox.md +83 -0
- package/docs/knowledge/overview-surfaces.md +83 -0
- package/docs/knowledge/private-datastore-shared-boundary.md +54 -0
- package/docs/knowledge/proxy-settlement-projections.md +41 -0
- package/docs/knowledge/run-pricing-first-writer.md +43 -0
- package/docs/knowledge/schedule-claim-transaction.md +41 -0
- package/docs/knowledge/secret-entry-replica-contract.md +52 -0
- package/docs/knowledge/terminal-run-first-writer.md +41 -0
- package/docs/knowledge/transactional-agent-authorization.md +52 -0
- package/docs/knowledge/viewer-notify-write-isolation.md +30 -0
- package/docs/knowledge/warm-input-publication.md +30 -0
- package/docs/knowledge/workspace-staging-failure.md +54 -0
- package/docs/knowledge.md +54 -14
- package/docs/mcp-servers.md +254 -0
- package/docs/native-sandbox.md +143 -31
- package/docs/observability.md +4 -0
- package/docs/security-deployment.md +139 -29
- package/docs/slack-notifications.md +35 -19
- package/docs/tool-secrets.md +45 -10
- package/docs/viewer-api.md +6 -0
- package/docs/viewer-api.openapi.yml +1 -1
- package/help/admin-viewer.md +28 -2
- package/help/agent-recipes.md +33 -2
- package/help/architecture-agent.md +11 -6
- package/help/brokered-secrets.md +3 -0
- package/help/build-claude-code-image.md +1 -1
- package/help/build-worker-image.md +3 -1
- package/help/builder-agent.md +19 -6
- package/help/claude-code-run-pane.md +40 -0
- package/help/code-review-agents.md +177 -6
- package/help/coding-packages.md +156 -6
- package/help/cost-attribution.md +9 -5
- package/help/creating-agents.md +14 -1
- package/help/dependency-cache.md +143 -0
- package/help/deploy-gke.md +15 -8
- package/help/errors/budget-exhausted.md +187 -0
- package/help/errors/budget-group-exhausted.md +5 -1
- package/help/errors/coding-mcp-pins-unavailable.md +35 -0
- package/help/errors/coding-stream-quota-exceeded.md +33 -0
- package/help/errors/coding-workspace-disk-exceeds-limit.md +39 -0
- package/help/errors/continuation-closed.md +9 -12
- package/help/errors/database-auth-invalid.md +1 -1
- package/help/errors/delegation-conflict.md +24 -0
- package/help/errors/file-list-truncated.md +45 -0
- package/help/errors/full-read-required.md +49 -0
- package/help/errors/github-account-not-allowed.md +4 -0
- package/help/errors/graph-incomplete.md +43 -0
- package/help/errors/graph-limit.md +43 -0
- package/help/errors/host-provider-error.md +40 -0
- package/help/errors/host-tool-failed.md +36 -0
- package/help/errors/mcp-call-limit.md +22 -0
- package/help/errors/mcp-call-timeout.md +22 -0
- package/help/errors/mcp-server-auth-failed.md +22 -0
- package/help/errors/mcp-server-credentials-unavailable.md +45 -0
- package/help/errors/mcp-server-error.md +28 -0
- package/help/errors/mcp-server-unreachable.md +22 -0
- package/help/errors/mcp-servers-off.md +21 -0
- package/help/errors/mcp-tool-not-allowed.md +26 -0
- package/help/errors/mcp-tool-removed.md +22 -0
- package/help/errors/mcp-unavailable.md +25 -0
- package/help/errors/merge-conflict.md +49 -0
- package/help/errors/native-sandbox-capacity.md +1 -1
- package/help/errors/native-sandbox-deadline-exceeded.md +1 -1
- package/help/errors/native-sandbox-docker-failed.md +1 -1
- package/help/errors/native-sandbox-gateway-error.md +20 -0
- package/help/errors/native-sandbox-gateway-unavailable.md +1 -1
- package/help/errors/native-sandbox-image-not-pinned.md +1 -1
- package/help/errors/native-sandbox-isolation-mismatch.md +1 -1
- package/help/errors/native-sandbox-launch-abandoned.md +21 -0
- package/help/errors/native-sandbox-network-unenforced.md +1 -1
- package/help/errors/native-sandbox-requires-catalog.md +1 -1
- package/help/errors/native-sandbox-unavailable.md +1 -1
- package/help/errors/native-sandbox-warm-delivery-failed.md +1 -1
- package/help/errors/native-sandbox-worker-exited.md +4 -3
- package/help/errors/native-sandbox-worker-lost.md +1 -1
- package/help/errors/native-sandbox-worker-unready.md +1 -1
- package/help/errors/package-not-allowed-pending.md +52 -0
- package/help/errors/package-not-allowed.md +51 -0
- package/help/errors/package-refusals.md +43 -0
- package/help/errors/patch-cursor-malformed.md +31 -0
- package/help/errors/repository-not-listed.md +36 -0
- package/help/errors/repository-required.md +36 -0
- package/help/errors/run-lost.md +39 -0
- package/help/errors/run-transcript-download.md +44 -0
- package/help/errors/secret-in-value.md +69 -0
- package/help/errors/target-merge.md +40 -0
- package/help/errors/tool-timeout.md +38 -0
- package/help/fix-merge-conflicts.md +73 -0
- package/help/github-app-setup.md +132 -0
- package/help/github.md +22 -0
- package/help/host-providers.md +40 -0
- package/help/identity-and-access.md +6 -1
- package/help/jira.md +23 -6
- package/help/knowledge.md +16 -7
- package/help/local-repositories.md +1 -1
- package/help/low-power-mode.md +7 -1
- package/help/mcp-servers.md +73 -0
- package/help/mcp.md +7 -2
- package/help/merge-order-check.md +5 -0
- package/help/native-capabilities.md +55 -1
- package/help/native-sandbox.md +16 -2
- package/help/operating-agents.md +21 -0
- package/help/package-audit-mode.md +91 -0
- package/help/related-pull-requests.md +17 -10
- package/help/repo-instructions-and-skills.md +3 -1
- package/help/resume-runs-locally.md +134 -0
- package/help/review-fix-rounds.md +33 -1
- package/help/sharing-agents.md +59 -0
- package/help/slack-notifications.md +19 -5
- package/help/status-comments.md +31 -0
- package/help/stop-run.md +58 -0
- package/help/troubleshooting/budgets.md +28 -0
- package/help/troubleshooting/coding-workers.md +86 -7
- package/help/troubleshooting/debugging-agent-runs.md +29 -0
- package/package.json +18 -10
- package/prisma/migrations/20261016000000_registry_approved_accepted_advisories/migration.sql +3 -0
- package/prisma/migrations/20261016000001_mark_ready_when_passing/migration.sql +3 -0
- package/prisma/migrations/20261017000000_debug_trace_max_mb/migration.sql +4 -0
- package/prisma/migrations/20261018000000_dependency_cache/migration.sql +53 -0
- package/prisma/migrations/20261019000000_claude_max_output_tokens/migration.sql +5 -0
- package/prisma/migrations/20261021000000_pr_description_hash/migration.sql +4 -0
- package/prisma/migrations/20261022000000_dependency_snapshot_validation_metadata/migration.sql +4 -0
- package/prisma/migrations/20261023000000_package_audit_mode/migration.sql +27 -0
- package/prisma/migrations/20261024000000_budget_events/migration.sql +26 -0
- package/prisma/migrations/20261025000000_cache_aware_holds/migration.sql +9 -0
- package/prisma/migrations/20261026000000_budget_overrun/migration.sql +4 -0
- package/prisma/migrations/20261027000000_coding_run_request/migration.sql +1 -0
- package/prisma/migrations/20261028000000_native_gateway_review_reads/migration.sql +6 -0
- package/prisma/migrations/20261029000000_lead_survives_deploy/migration.sql +6 -0
- package/prisma/migrations/20261030000000_local_review_covered_sha/migration.sql +2 -0
- package/prisma/migrations/20261031000000_coding_run_budget_limit/migration.sql +9 -0
- package/prisma/migrations/20261101000000_run_transcripts/migration.sql +22 -0
- package/prisma/migrations/20261102000000_host_providers/migration.sql +56 -0
- package/prisma/migrations/20261104000000_coding_agent_repository_list/migration.sql +5 -0
- package/prisma/migrations/20261106000000_tool_timeout/migration.sql +4 -0
- package/prisma/migrations/20261107000000_mcp_servers/migration.sql +33 -0
- package/prisma/migrations/20261108000000_coding_mcp/migration.sql +5 -0
- package/prisma/migrations/20261109000000_task_run_index/migration.sql +3 -0
- package/prisma/schema.prisma +468 -109
- package/scripts/git-askpass.sh +1 -1
- package/dist/sandbox/generated/zod-to-json-schema.bundle.js +0 -5
package/dist/core/host-status.js
CHANGED
|
@@ -1,14 +1,37 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { summarizeRegistryFetches, warningRefusals } from "../coding/registry/report.js";
|
|
2
|
+
import { packageRefusalWording } from "../coding/registry/refusal-wording.js";
|
|
3
|
+
import { isPackageAuditMode, packageAuditWording, summarizePackageAudit, } from "../coding/registry/audit-mode.js";
|
|
4
|
+
import { codeProviderOf } from "../coding/code-host.js";
|
|
2
5
|
import { storedServiceNames } from "../coding/services/catalog.js";
|
|
3
6
|
import { SERVICE_UNREADY_CATEGORY, serviceRefusalSentence, serviceUnreadySentence, } from "../coding/services/wording.js";
|
|
4
7
|
import { PROTECTED_PATH_CATEGORY, PROTECTED_PATH_HOST_LINE } from "../coding/protected-path-wording.js";
|
|
5
|
-
import { CONTINUATION_CLOSED_CATEGORY, CONTINUATION_CLOSED_HOST_LINE } from "../coding/continuation-wording.js";
|
|
8
|
+
import { budgetStoppedChangesSentence, CONTINUATION_CLOSED_CATEGORY, CONTINUATION_CLOSED_HOST_LINE, } from "../coding/continuation-wording.js";
|
|
9
|
+
import { escapeHtmlComments } from "../providers/review-host/review-format.js";
|
|
6
10
|
import { loadBudgetSentence } from "./budget-wording.js";
|
|
11
|
+
import { continuedForAnotherIssue, githubIssueKey, recordIssuePullRequests } from "./issue-bridge.js";
|
|
7
12
|
import { logger } from "./logger.js";
|
|
8
13
|
import { providerClassOfCategory, providerSentence } from "./provider-wording.js";
|
|
14
|
+
import { defuseMentions, splitReply } from "./reply-parts.js";
|
|
15
|
+
import { splitTaskOverride } from "./untrusted-content.js";
|
|
9
16
|
const log = logger.child({ module: "host-status" });
|
|
10
|
-
/** Keeps the edited comment readable;
|
|
17
|
+
/** Keeps the edited comment readable; a longer reply goes out in full as follow-up comments (fullReplyOf). */
|
|
11
18
|
const MAX_REPLY_CHARS = 2000;
|
|
19
|
+
/** The most a GitHub follow-up comment holds, header and cut note included (GitHub's limit is 65,536). */
|
|
20
|
+
export const GITHUB_REPLY_MAX_CHARS = 60_000;
|
|
21
|
+
/** The most follow-up comments a full reply is posted as; the rest is cut, and stays on the run. */
|
|
22
|
+
export const REPLY_MAX_PARTS = 4;
|
|
23
|
+
/**
|
|
24
|
+
* The most a Jira follow-up comment holds, header and cut note included. Jira Cloud's limit is 32,767
|
|
25
|
+
* characters, but it may apply to the serialized ADF body markdownToAdf produces rather than to this
|
|
26
|
+
* Markdown (unverified), and ADF's JSON is longer than the text; so keep a wide margin.
|
|
27
|
+
*/
|
|
28
|
+
export const JIRA_REPLY_MAX_CHARS = 15_000;
|
|
29
|
+
/** The status comment's line when the full reply follows. */
|
|
30
|
+
const FULL_REPLY_FOLLOWS = "The full reply follows in the next comment(s).";
|
|
31
|
+
/** The same, for a status in a review thread: the follow-ups go to the pull request's conversation. */
|
|
32
|
+
const FULL_REPLY_FOLLOWS_IN_CONVERSATION = "The full reply follows in this pull request's conversation.";
|
|
33
|
+
/** Ends the last follow-up when the reply did not fit in REPLY_MAX_PARTS comments. */
|
|
34
|
+
const REPLY_CUT_NOTE = "\n\n---\n\n*The rest of the reply was cut: it was too long to post in full. The full text is on the run (`get_run` → `finalText`).*";
|
|
12
35
|
/** The run statuses a run never leaves. */
|
|
13
36
|
export const TERMINAL_RUN_STATUSES = [
|
|
14
37
|
"succeeded",
|
|
@@ -48,7 +71,7 @@ export function pullRequestOutcome(result) {
|
|
|
48
71
|
outcome: r.outcome,
|
|
49
72
|
repository: r.repository,
|
|
50
73
|
pullRequestNumber: r.pullRequestNumber,
|
|
51
|
-
codeProvider:
|
|
74
|
+
codeProvider: codeProviderOf(r.repository),
|
|
52
75
|
...(typeof r.pullRequestUrl === "string" ? { pullRequestUrl: r.pullRequestUrl } : {}),
|
|
53
76
|
...failedCheckCount(r.tests),
|
|
54
77
|
};
|
|
@@ -63,21 +86,82 @@ function failedCheckCount(tests) {
|
|
|
63
86
|
/** The agent's reply as a quote, cut to MAX_REPLY_CHARS, with @-mentions defused so nobody is pinged. */
|
|
64
87
|
const cutReply = (text) => text.length > MAX_REPLY_CHARS ? `${text.slice(0, MAX_REPLY_CHARS)}…` : text;
|
|
65
88
|
function quoteReply(text) {
|
|
66
|
-
return cutReply(text)
|
|
67
|
-
.replace(/@(?=[\w-])/g, "@")
|
|
89
|
+
return defuseMentions(cutReply(text))
|
|
68
90
|
.split("\n")
|
|
69
91
|
.map((line) => `> ${line}`)
|
|
70
92
|
.join("\n");
|
|
71
93
|
}
|
|
94
|
+
/**
|
|
95
|
+
* The reply to post in full as follow-up comments, or null when the ordinary quote applies: only for a
|
|
96
|
+
* run that succeeded with no pull request and no failed sub-run, whose trimmed reply is longer than the
|
|
97
|
+
* status comment's quote holds.
|
|
98
|
+
*/
|
|
99
|
+
export function fullReplyOf(run, pullRequests, failedChildren) {
|
|
100
|
+
if (run.status !== "succeeded" || pullRequests.length > 0 || failedChildren.length > 0)
|
|
101
|
+
return null;
|
|
102
|
+
const reply = run.finalText?.trim();
|
|
103
|
+
return reply && reply.length > MAX_REPLY_CHARS ? reply : null;
|
|
104
|
+
}
|
|
105
|
+
const partHeader = (i, n) => `**Reply, part ${i} of ${n}**\n\n`;
|
|
106
|
+
/**
|
|
107
|
+
* Numbered comment bodies for a full reply: "**Reply, part i of n**" then the part, the last ending with
|
|
108
|
+
* the cut note when the reply did not fit in `maxParts`. Each body, header and note included, is at most
|
|
109
|
+
* `maxChars`. @-mentions are defused (splitReply).
|
|
110
|
+
*/
|
|
111
|
+
export function fullReplyComments(reply, opts) {
|
|
112
|
+
const maxParts = Math.max(1, Math.floor(opts.maxParts));
|
|
113
|
+
const reserve = partHeader(maxParts, maxParts).length + REPLY_CUT_NOTE.length;
|
|
114
|
+
const { parts, truncated } = splitReply(reply, { maxChars: opts.maxChars - reserve, maxParts });
|
|
115
|
+
return parts.map((part, i) => `${partHeader(i + 1, parts.length)}${part}${truncated && i === parts.length - 1 ? REPLY_CUT_NOTE : ""}`);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* The refusals that can block the run: all of them when a coding sub-run failed, otherwise all but
|
|
119
|
+
* listing-only ones, which the installer may only have looked at (see LISTING_REFUSAL_FILENAME).
|
|
120
|
+
*/
|
|
121
|
+
export function blockingRefusals(outcome) {
|
|
122
|
+
const refusals = outcome.packageRefusals ?? [];
|
|
123
|
+
return outcome.failedChildren.length > 0 ? [...refusals] : warningRefusals(refusals);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Whether package refusals blocked the run: it succeeded, but nothing reached a pull request, a coding
|
|
127
|
+
* sub-run made no changes or failed, and packages were refused (blockingRefusals). The GitHub and Jira
|
|
128
|
+
* status comments and the Slack `run_blocked` event all use it, so they always agree.
|
|
129
|
+
*/
|
|
130
|
+
export function isBlockedByRefusals(run, outcome) {
|
|
131
|
+
return (run.status === "succeeded" &&
|
|
132
|
+
outcome.pullRequests.length === 0 &&
|
|
133
|
+
(outcome.noChanges === true || outcome.failedChildren.length > 0) &&
|
|
134
|
+
blockingRefusals(outcome).length > 0);
|
|
135
|
+
}
|
|
72
136
|
export function outcomeBody(run, repository, pullRequests, failedChildren = [], opts = {}) {
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
return pr.outcome === "pull_request_opened" ? `Opened ${ref}` : `Pushed changes to ${ref}`;
|
|
78
|
-
});
|
|
137
|
+
const refOf = (pr) => pr.repository.toLowerCase() === repository.toLowerCase()
|
|
138
|
+
? `#${pr.pullRequestNumber}`
|
|
139
|
+
: `${pr.repository}#${pr.pullRequestNumber}`;
|
|
140
|
+
const links = pullRequests.map((pr) => pr.outcome === "pull_request_opened" ? `Opened ${refOf(pr)}` : `Pushed changes to ${refOf(pr)}`);
|
|
79
141
|
const partial = links.length > 0 ? `\n\n${links.join(", ")}.` : "";
|
|
80
|
-
const
|
|
142
|
+
const refusals = opts.packageRefusals ?? [];
|
|
143
|
+
const blocked = isBlockedByRefusals(run, {
|
|
144
|
+
pullRequests,
|
|
145
|
+
failedChildren,
|
|
146
|
+
packageRefusals: refusals,
|
|
147
|
+
noChanges: opts.noChanges,
|
|
148
|
+
});
|
|
149
|
+
const blockedBy = blocked ? blockingRefusals({ pullRequests, failedChildren, packageRefusals: refusals }) : [];
|
|
150
|
+
// The ⚠️ line: on a no-changes run it keeps listing-only refusals (see LISTING_REFUSAL_FILENAME), and
|
|
151
|
+
// when blocked it holds only those the ⛔ list leaves out.
|
|
152
|
+
const noChangesRun = opts.noChanges === true && pullRequests.length === 0;
|
|
153
|
+
const warned = blocked
|
|
154
|
+
? refusals.filter((refusal) => !blockedBy.includes(refusal))
|
|
155
|
+
: noChangesRun
|
|
156
|
+
? refusals
|
|
157
|
+
: warningRefusals(refusals);
|
|
158
|
+
const warning = (links.length > 0 || run.status === "succeeded") && warned.length > 0
|
|
159
|
+
? packageRefusalWording(warned, { blocked: false })
|
|
160
|
+
: "";
|
|
161
|
+
const audit = opts.packageAudit ? packageAuditWording(opts.packageAudit.mode, opts.packageAudit.summary) : "";
|
|
162
|
+
const footer = warning + (warning ? "\n\n" : "") + audit + (audit ? "\n\n" : "") + runLine(run.id);
|
|
163
|
+
if (blocked)
|
|
164
|
+
return packageRefusalWording(blockedBy) + "\n\n" + footer;
|
|
81
165
|
if (run.status === "lost") {
|
|
82
166
|
return `❌ Interrupted before it finished (for example, wardby restarted). Repeat your request to retry.${partial}\n\n${footer}`;
|
|
83
167
|
}
|
|
@@ -93,7 +177,11 @@ export function outcomeBody(run, repository, pullRequests, failedChildren = [],
|
|
|
93
177
|
const quoted = reply ? `\n\n${quoteReply(reply)}` : "";
|
|
94
178
|
if (failedChildren.length > 0) {
|
|
95
179
|
// The agent itself finished, but the work it handed off did not.
|
|
96
|
-
|
|
180
|
+
// A sub-run stopped at its budget may still have pushed its changes so far (a draft to continue).
|
|
181
|
+
const keptBy = new Map(pullRequests.filter((pr) => pr.runId !== undefined).map((pr) => [pr.runId, pr]));
|
|
182
|
+
const keptOf = (c) => c.status === "budget_exhausted" ? keptBy.get(c.id) : undefined;
|
|
183
|
+
const kept = failedChildren.map(keptOf).filter((pr) => pr !== undefined);
|
|
184
|
+
const outOfBudget = failedChildren.filter((c) => c.status === "budget_exhausted" && !keptOf(c));
|
|
97
185
|
const providerClassOf = (c) => c.status === "failed" ? providerClassOfCategory(c.failureCategory) : null;
|
|
98
186
|
// A coding sub-run its services stopped: refused at dispatch, or a sidecar never became ready.
|
|
99
187
|
const serviceSentenceOf = (c) => c.status === "refused"
|
|
@@ -116,7 +204,7 @@ export function outcomeBody(run, repository, pullRequests, failedChildren = [],
|
|
|
116
204
|
serviceSentenceOf(c) === null &&
|
|
117
205
|
!protectedPathOf(c) &&
|
|
118
206
|
!continuationClosedOf(c));
|
|
119
|
-
const lines =
|
|
207
|
+
const lines = kept.map((pr) => `A sub-run ran out of budget before finishing. ${budgetStoppedChangesSentence(refOf(pr), pr.outcome === "pull_request_opened", opts.fromIssue === true)}`);
|
|
120
208
|
if (outOfBudget.length > 0) {
|
|
121
209
|
lines.push(`A sub-run ran out of budget: ${outOfBudget.map((c) => `\`${c.id}\``).join(", ")}.`);
|
|
122
210
|
}
|
|
@@ -135,7 +223,11 @@ export function outcomeBody(run, repository, pullRequests, failedChildren = [],
|
|
|
135
223
|
if (other.length > 0) {
|
|
136
224
|
lines.push(`A sub-run did not succeed: ${other.map((c) => `\`${c.id}\` (\`${c.status}\`)`).join(", ")}.`);
|
|
137
225
|
}
|
|
138
|
-
|
|
226
|
+
// The kept pull requests are named in their own lines.
|
|
227
|
+
const others = links.filter((_, i) => !kept.includes(pullRequests[i]));
|
|
228
|
+
const otherLinks = others.length > 0 ? `\n\n${others.join(", ")}.` : "";
|
|
229
|
+
const icon = kept.length === failedChildren.length ? "⚠️" : "❌";
|
|
230
|
+
return `${icon} ${lines.join(" ")}${otherLinks}${quoted}\n\n${footer}`;
|
|
139
231
|
}
|
|
140
232
|
const failedChecks = pullRequests.reduce((sum, pr) => sum + (pr.failedChecks ?? 0), 0);
|
|
141
233
|
if (links.length > 0 && failedChecks > 0) {
|
|
@@ -144,10 +236,41 @@ export function outcomeBody(run, repository, pullRequests, failedChildren = [],
|
|
|
144
236
|
}
|
|
145
237
|
if (links.length > 0)
|
|
146
238
|
return `✅ ${links.join(", ")}.\n\n${footer}`;
|
|
239
|
+
if (opts.fullReplyFollows && fullReplyOf(run, pullRequests, failedChildren) !== null) {
|
|
240
|
+
const follows = opts.statusInThread ? FULL_REPLY_FOLLOWS_IN_CONVERSATION : FULL_REPLY_FOLLOWS;
|
|
241
|
+
return opts.replyAsAnswer
|
|
242
|
+
? `✅ ${follows}\n\n${footer}`
|
|
243
|
+
: `✅ Finished without opening a pull request. ${follows}\n\n${footer}`;
|
|
244
|
+
}
|
|
147
245
|
if (opts.replyAsAnswer && reply)
|
|
148
246
|
return `✅ ${cutReply(reply)}\n\n${footer}`;
|
|
149
247
|
return `✅ ${opts.noPullRequestText ?? "Finished without opening a pull request."}${quoted}\n\n${footer}`;
|
|
150
248
|
}
|
|
249
|
+
/** The package audit of these children (best effort, like the refusals: a read failure reports none). */
|
|
250
|
+
async function loadPackageAudit(db, children) {
|
|
251
|
+
const audited = children.filter((c) => isPackageAuditMode(c.codingRun?.packageAuditMode));
|
|
252
|
+
if (audited.length === 0)
|
|
253
|
+
return undefined;
|
|
254
|
+
try {
|
|
255
|
+
const rows = await db.registryAuditRecord.findMany({
|
|
256
|
+
where: { runId: { in: audited.map((c) => c.id) } },
|
|
257
|
+
orderBy: { createdAt: "asc" },
|
|
258
|
+
});
|
|
259
|
+
const mode = audited.some((c) => c.codingRun?.packageAuditMode === "full") ? "full" : "audit";
|
|
260
|
+
return { mode, summary: summarizePackageAudit(rows) };
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
263
|
+
return undefined;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/** A run's package audit alone, for a run whose other outcome is not read (one that did not succeed). */
|
|
267
|
+
export async function collectPackageAudit(db, runId) {
|
|
268
|
+
const children = await db.run.findMany({
|
|
269
|
+
where: { parentRunId: runId },
|
|
270
|
+
select: { id: true, codingRun: { select: { packageAuditMode: true } } },
|
|
271
|
+
});
|
|
272
|
+
return loadPackageAudit(db, children);
|
|
273
|
+
}
|
|
151
274
|
/** The parts of a finished run's outcome a status comment reports; shared by GitHub and Jira status comments. */
|
|
152
275
|
export async function collectRunOutcome(db, run) {
|
|
153
276
|
const children = await db.run.findMany({
|
|
@@ -156,7 +279,7 @@ export async function collectRunOutcome(db, run) {
|
|
|
156
279
|
id: true,
|
|
157
280
|
status: true,
|
|
158
281
|
error: true,
|
|
159
|
-
codingRun: { select: { result: true, failureCategory: true, services: true } },
|
|
282
|
+
codingRun: { select: { result: true, failureCategory: true, services: true, packageAuditMode: true } },
|
|
160
283
|
},
|
|
161
284
|
orderBy: { startedAt: "asc" },
|
|
162
285
|
});
|
|
@@ -175,10 +298,116 @@ export async function collectRunOutcome(db, run) {
|
|
|
175
298
|
error: c.error ?? null,
|
|
176
299
|
services: storedServiceNames(c.codingRun?.services),
|
|
177
300
|
}));
|
|
301
|
+
let packageRefusals = [];
|
|
302
|
+
const codingIds = children.filter((c) => c.codingRun).map((c) => c.id);
|
|
303
|
+
if (codingIds.length > 0) {
|
|
304
|
+
try {
|
|
305
|
+
const fetches = await db.registryFetch.findMany({
|
|
306
|
+
where: { runId: { in: codingIds } },
|
|
307
|
+
select: {
|
|
308
|
+
ecosystem: true,
|
|
309
|
+
name: true,
|
|
310
|
+
version: true,
|
|
311
|
+
outcome: true,
|
|
312
|
+
reason: true,
|
|
313
|
+
sizeBytes: true,
|
|
314
|
+
filename: true,
|
|
315
|
+
runId: true,
|
|
316
|
+
},
|
|
317
|
+
orderBy: { createdAt: "asc" },
|
|
318
|
+
});
|
|
319
|
+
packageRefusals = summarizeRegistryFetches(fetches).packageRefusals;
|
|
320
|
+
}
|
|
321
|
+
catch {
|
|
322
|
+
// Registry reporting is best effort; keep the existing status on read failure.
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
const packageAudit = await loadPackageAudit(db, children);
|
|
178
326
|
const budgetSentence = run.status === "budget_exhausted" || run.status === "refused"
|
|
179
327
|
? await loadBudgetSentence(db, run.id, run.status)
|
|
180
328
|
: undefined;
|
|
181
|
-
|
|
329
|
+
const noChanges = children.some((c) => {
|
|
330
|
+
const result = c.codingRun?.result;
|
|
331
|
+
return result && typeof result === "object" && !Array.isArray(result) && result.outcome === "no_changes";
|
|
332
|
+
});
|
|
333
|
+
return {
|
|
334
|
+
pullRequests,
|
|
335
|
+
failedChildren,
|
|
336
|
+
packageRefusals,
|
|
337
|
+
noChanges,
|
|
338
|
+
...(budgetSentence ? { budgetSentence } : {}),
|
|
339
|
+
...(packageAudit ? { packageAudit } : {}),
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Whether a mention run's stored task is a mention on GitHub issue `number`
|
|
344
|
+
* of `repository`, not on a pull request. Read from the task's header block
|
|
345
|
+
* (mentionTaskText's "[GitHub issue #n…]" then "Repository: …"), which only
|
|
346
|
+
* wardby writes: the first section that opens with "[GitHub " is that header
|
|
347
|
+
* (any continuation hints before it are wardby's too), and everything a
|
|
348
|
+
* person wrote comes after it, so a comment cannot pass for an issue header.
|
|
349
|
+
* A review fix round's header names a PR.
|
|
350
|
+
*/
|
|
351
|
+
export function isIssueMentionTask(taskOverride, repository, number) {
|
|
352
|
+
if (!taskOverride)
|
|
353
|
+
return false;
|
|
354
|
+
const header = splitTaskOverride(taskOverride)
|
|
355
|
+
.task.split("\n\n")
|
|
356
|
+
.find((section) => section.startsWith("[GitHub "));
|
|
357
|
+
if (!header)
|
|
358
|
+
return false;
|
|
359
|
+
const [first = "", second] = header.split("\n");
|
|
360
|
+
const opener = `[GitHub issue #${number}`;
|
|
361
|
+
return (first === `${opener}]` || first.startsWith(`${opener}: `)) && second === `Repository: ${repository}`;
|
|
362
|
+
}
|
|
363
|
+
/** Whether the run was started by a mention on a GitHub issue (not a pull request). Never throws. */
|
|
364
|
+
async function runCameFromGitHubIssue(db, status, runId) {
|
|
365
|
+
if (status.provider !== "github")
|
|
366
|
+
return false;
|
|
367
|
+
try {
|
|
368
|
+
const run = await db.run.findUnique({ where: { id: runId }, select: { taskOverride: true } });
|
|
369
|
+
return !!run && isIssueMentionTask(run.taskOverride, status.repository, status.number);
|
|
370
|
+
}
|
|
371
|
+
catch (err) {
|
|
372
|
+
log.warn({ err, runId }, "could not tell whether the run came from an issue");
|
|
373
|
+
return false;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* A GitHub issue's run records the pull requests its coding sub-runs opened
|
|
378
|
+
* or continued, exactly as a Jira issue's does (recordIssuePullRequests, key
|
|
379
|
+
* githubIssueKey): a later mention on the issue continues them. Only for a
|
|
380
|
+
* mention on an issue (isIssueMentionTask), never on a pull request; a pull
|
|
381
|
+
* request continued from another tracked issue's run stays that issue's.
|
|
382
|
+
* Safe to repeat (a retried completion adds no row). Never throws.
|
|
383
|
+
*/
|
|
384
|
+
async function recordGitHubIssuePullRequests(db, status, runId, pullRequests) {
|
|
385
|
+
if (status.provider !== "github")
|
|
386
|
+
return;
|
|
387
|
+
const recordable = pullRequests.filter((pr) => !!pr.pullRequestUrl && !!pr.runId);
|
|
388
|
+
if (recordable.length === 0)
|
|
389
|
+
return;
|
|
390
|
+
try {
|
|
391
|
+
const run = await db.run.findUnique({ where: { id: runId }, select: { agentId: true, taskOverride: true } });
|
|
392
|
+
if (!run || !isIssueMentionTask(run.taskOverride, status.repository, status.number))
|
|
393
|
+
return;
|
|
394
|
+
const issue = { provider: "github", key: githubIssueKey(status.repository, status.number) };
|
|
395
|
+
const foreign = await continuedForAnotherIssue(db, recordable.map((pr) => pr.runId), issue);
|
|
396
|
+
await recordIssuePullRequests(db, issue, recordable
|
|
397
|
+
.filter((pr) => !foreign.has(pr.runId))
|
|
398
|
+
.map((pr) => ({
|
|
399
|
+
codeProvider: pr.codeProvider,
|
|
400
|
+
repository: pr.repository,
|
|
401
|
+
number: pr.pullRequestNumber,
|
|
402
|
+
url: pr.pullRequestUrl,
|
|
403
|
+
agentId: run.agentId,
|
|
404
|
+
openedByRunId: pr.runId,
|
|
405
|
+
outcome: pr.outcome,
|
|
406
|
+
})));
|
|
407
|
+
}
|
|
408
|
+
catch (err) {
|
|
409
|
+
log.warn({ err, runId }, "could not record the GitHub issue's pull requests");
|
|
410
|
+
}
|
|
182
411
|
}
|
|
183
412
|
/**
|
|
184
413
|
* Writes a finished run's outcome to its status comment and marks it
|
|
@@ -186,7 +415,8 @@ export async function collectRunOutcome(db, run) {
|
|
|
186
415
|
* outcome as a new comment only if `postIfMissing` (the reconciler, well after
|
|
187
416
|
* the run ended), and otherwise leaves the row for postMentionStatus, which
|
|
188
417
|
* is about to post it. A failed host call leaves the row open for the
|
|
189
|
-
* reconciler to retry.
|
|
418
|
+
* reconciler to retry. The row is then claimed (completed) in one step, and
|
|
419
|
+
* only the claiming call posts a full reply's follow-up comments.
|
|
190
420
|
*/
|
|
191
421
|
export async function completeHostStatus(db, run, hosts, opts = {}) {
|
|
192
422
|
if (!hosts)
|
|
@@ -200,8 +430,23 @@ export async function completeHostStatus(db, run, hosts, opts = {}) {
|
|
|
200
430
|
const host = hosts[status.provider];
|
|
201
431
|
if (!host)
|
|
202
432
|
return;
|
|
203
|
-
const { pullRequests, failedChildren, budgetSentence } = await collectRunOutcome(db, run);
|
|
204
|
-
|
|
433
|
+
const { pullRequests, failedChildren, budgetSentence, packageRefusals, noChanges, packageAudit } = await collectRunOutcome(db, run);
|
|
434
|
+
await recordGitHubIssuePullRequests(db, status, run.id, pullRequests);
|
|
435
|
+
// A blocked status is built from the refusals alone, so the agent's reply is not posted after it.
|
|
436
|
+
const fullReply = isBlockedByRefusals(run, { pullRequests, failedChildren, packageRefusals, noChanges })
|
|
437
|
+
? null
|
|
438
|
+
: fullReplyOf(run, pullRequests, failedChildren);
|
|
439
|
+
const body = outcomeBody(run, status.repository, pullRequests, failedChildren, {
|
|
440
|
+
budgetSentence,
|
|
441
|
+
fromIssue: failedChildren.some((c) => c.status === "budget_exhausted")
|
|
442
|
+
? await runCameFromGitHubIssue(db, status, run.id)
|
|
443
|
+
: false,
|
|
444
|
+
packageRefusals,
|
|
445
|
+
packageAudit,
|
|
446
|
+
noChanges,
|
|
447
|
+
fullReplyFollows: true,
|
|
448
|
+
statusInThread: status.commentKind === "inline",
|
|
449
|
+
});
|
|
205
450
|
let commentId = status.commentId;
|
|
206
451
|
if (commentId) {
|
|
207
452
|
await host.editComment(status.repository, {
|
|
@@ -217,12 +462,45 @@ export async function completeHostStatus(db, run, hosts, opts = {}) {
|
|
|
217
462
|
...(status.replyToReviewCommentId ? { replyToReviewCommentId: status.replyToReviewCommentId } : {}),
|
|
218
463
|
})).id;
|
|
219
464
|
}
|
|
220
|
-
|
|
465
|
+
// Claims the row in one step, saving a posted comment's id at once so a retry edits it instead of
|
|
466
|
+
// posting a second one. Only the completion that claims it posts the full reply, so two racing
|
|
467
|
+
// completions (the run's own and the reconciler's) never post it twice.
|
|
468
|
+
const claimed = await db.runHostStatus.updateMany({
|
|
469
|
+
where: { runId: run.id, completedAt: null },
|
|
470
|
+
data: { commentId, completedAt: new Date() },
|
|
471
|
+
});
|
|
472
|
+
if (claimed.count !== 1) {
|
|
473
|
+
log.warn({ runId: run.id }, "the run's status comment was completed meanwhile; leaving any full reply to that completion");
|
|
474
|
+
return;
|
|
475
|
+
}
|
|
476
|
+
if (fullReply !== null)
|
|
477
|
+
await postFullReply(host, status, run.id, fullReply);
|
|
221
478
|
}
|
|
222
479
|
catch (err) {
|
|
223
480
|
log.warn({ err, runId: run.id }, "could not complete the run's status comment");
|
|
224
481
|
}
|
|
225
482
|
}
|
|
483
|
+
/**
|
|
484
|
+
* Posts the full reply's parts in order, each at most once: the status comment already points to them,
|
|
485
|
+
* so a failed part is logged and the rest skipped (a gap would misnumber the reply), and the row is still
|
|
486
|
+
* completed. The full text stays on the run (`get_run` → `finalText`). Never throws.
|
|
487
|
+
*/
|
|
488
|
+
async function postFullReply(host, status, runId, reply) {
|
|
489
|
+
// Escaped before it is split, so each part stays under the cap as posted (comment() escapes again, a no-op).
|
|
490
|
+
const bodies = fullReplyComments(escapeHtmlComments(reply), {
|
|
491
|
+
maxChars: GITHUB_REPLY_MAX_CHARS,
|
|
492
|
+
maxParts: REPLY_MAX_PARTS,
|
|
493
|
+
});
|
|
494
|
+
for (const [i, body] of bodies.entries()) {
|
|
495
|
+
try {
|
|
496
|
+
await host.comment(status.repository, { number: status.number, body });
|
|
497
|
+
}
|
|
498
|
+
catch (err) {
|
|
499
|
+
log.warn({ err, runId, part: i + 1, parts: bodies.length }, "could not post a part of the run's full reply; the rest is skipped, the full text stays on the run");
|
|
500
|
+
return;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
}
|
|
226
504
|
/**
|
|
227
505
|
* Posts the "working on it" comment for a mention run whose status row was
|
|
228
506
|
* written at dispatch, and records the comment on the row. When the run
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Links a run's pull requests to the issue that started it: records each
|
|
3
|
-
* issue/PR pair,
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
3
|
+
* issue/PR pair (recordIssuePullRequests, the same for a Jira issue and a
|
|
4
|
+
* GitHub issue), and for a tracker issue puts a web link on the issue and
|
|
5
|
+
* applies the link's configured status move. Provider-neutral: a code host is
|
|
6
|
+
* only ever { provider, repository, number }. The issue key comes from the run
|
|
7
|
+
* tree (RunIssueStatus, or a GitHub mention's RunHostStatus), never from model
|
|
8
|
+
* output. The status move is a control-plane
|
|
7
9
|
* action (not gated by allowedTransitions). Nothing here throws, except
|
|
8
10
|
* handlePullRequestClosed's lookup before it has claimed anything (so the
|
|
9
11
|
* webhook delivery is rolled back and redelivered).
|
|
@@ -29,6 +31,47 @@ export interface RecordPullRequestsInput {
|
|
|
29
31
|
pullRequests: BridgedPullRequest[];
|
|
30
32
|
}
|
|
31
33
|
export declare const pullRequestGlobalId: (pr: Pick<BridgedPullRequest, "codeProvider" | "repository" | "number">) => string;
|
|
34
|
+
/** The issue side of an IssuePullRequest row: { provider: "jira", key: "PROJ-7" } or githubIssueKey's. */
|
|
35
|
+
export interface RecordedIssue {
|
|
36
|
+
provider: string;
|
|
37
|
+
key: string;
|
|
38
|
+
}
|
|
39
|
+
/** One pull request to record against an issue. */
|
|
40
|
+
export interface IssuePullRequestRecord {
|
|
41
|
+
codeProvider: string;
|
|
42
|
+
repository: string;
|
|
43
|
+
number: number;
|
|
44
|
+
url: string;
|
|
45
|
+
/** The issue-linked agent whose run tree opened it. */
|
|
46
|
+
agentId: string;
|
|
47
|
+
/** The coding run that opened it (the continuePriorRun target for follow-ups). */
|
|
48
|
+
openedByRunId: string;
|
|
49
|
+
/** What the run did to it: only a newly recorded opened pull request notifies (pr_opened). */
|
|
50
|
+
outcome: "pull_request_opened" | "pull_request_updated";
|
|
51
|
+
}
|
|
52
|
+
/** A GitHub issue's IssuePullRequest key: "<owner>/<repo>#<number>", the repository normalised. */
|
|
53
|
+
export declare function githubIssueKey(repository: string, number: number): string;
|
|
54
|
+
/**
|
|
55
|
+
* Records the pull requests a run opened or continued for an issue, the same
|
|
56
|
+
* for every issue provider (a Jira issue, a GitHub issue): one IssuePullRequest
|
|
57
|
+
* row per issue/PR pair, state "open", never duplicated or overwritten (a
|
|
58
|
+
* merged or closed pair stays so; an open one gets its url refreshed), and a
|
|
59
|
+
* pr_opened notification for each newly recorded opened pull request.
|
|
60
|
+
* handlePullRequestClosed settles the rows. A GitHub issue's key is always
|
|
61
|
+
* githubIssueKey's, so any lookup of its rows must build the key the same way.
|
|
62
|
+
* Safe to repeat; never throws.
|
|
63
|
+
*/
|
|
64
|
+
export declare function recordIssuePullRequests(db: IssueBridgeDb, issue: RecordedIssue, prs: readonly IssuePullRequestRecord[]): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* The coding runs (of `runIds`) that continued a pull request opened for a
|
|
67
|
+
* different issue: their PR belongs to that issue, not this one. A
|
|
68
|
+
* continuation is foreign when its root coding run was dispatched for another
|
|
69
|
+
* tracked issue (CodingRun.issueKey), or when that root opened a pull request
|
|
70
|
+
* recorded for a different issue of any provider (IssuePullRequest, which a
|
|
71
|
+
* GitHub issue's runs also write). A continued PR with no issue, or this same
|
|
72
|
+
* issue, is fine.
|
|
73
|
+
*/
|
|
74
|
+
export declare function continuedForAnotherIssue(db: Pick<PrismaClient, "codingRun" | "issuePullRequest">, runIds: string[], issue: RecordedIssue): Promise<Set<string>>;
|
|
32
75
|
/**
|
|
33
76
|
* Returns sentences for the outcome comment (a refused status move); empty
|
|
34
77
|
* when there is nothing to say. Safe to repeat (a retried completion): each
|
|
@@ -48,8 +91,9 @@ export interface ClosedPullRequest {
|
|
|
48
91
|
}
|
|
49
92
|
/**
|
|
50
93
|
* A pull request wardby recorded against an issue was merged or closed: marks
|
|
51
|
-
* each still-open pair
|
|
52
|
-
*
|
|
94
|
+
* each still-open pair (every issue provider, configured tracker or not),
|
|
95
|
+
* and, for an issue in a configured tracker where the agent's link to the
|
|
96
|
+
* issue's project is still write, comments on the issue (and on merge resolves the web link and
|
|
53
97
|
* applies the link's onPullRequestMerged move). Only rows wardby wrote are
|
|
54
98
|
* touched, matched by the host's own identity for the PR — nothing from the
|
|
55
99
|
* PR's text. The row is claimed first (open → merged/closed), so a duplicate
|