@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
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stopping a run on request (the stop_run MCP tool). Every executor already owns the stop of the
|
|
3
|
+
* runs it executes (`Executor.stop`), and each makes the terminal write itself, conditional on the
|
|
4
|
+
* run still being pending or running, so the first terminal write wins and a finished run is never
|
|
5
|
+
* rewritten:
|
|
6
|
+
*
|
|
7
|
+
* - a native run in the control plane is recorded `cancelled` and stops at its next step boundary
|
|
8
|
+
* (InProcessExecutor/DbosExecutor; a run that has not started never does);
|
|
9
|
+
* - a native run in the sandbox is recorded `cancelled`, its gateway session ends so the worker's
|
|
10
|
+
* next call is refused, and after a short grace its worker is killed and removed
|
|
11
|
+
* (NativeSandboxExecutor);
|
|
12
|
+
* - a coding run, queued for a slot or running, is recorded `cancelled` first (the fence that keeps
|
|
13
|
+
* a finishing run from pushing or opening a pull request), then its proxy session is cancelled and
|
|
14
|
+
* its job stopped and removed (ContainerExecutor).
|
|
15
|
+
*
|
|
16
|
+
* This module adds what a caller asks for on top: the run's in-flight delegated child runs are
|
|
17
|
+
* stopped too (depth-first, so nothing keeps spending for a parent that stopped), who stopped it
|
|
18
|
+
* and why is kept on the row (Run.stopRequestReason) and logged, and a run already finished is
|
|
19
|
+
* returned unchanged.
|
|
20
|
+
*/
|
|
21
|
+
import type { PrismaClient, RunStatus } from "#prisma";
|
|
22
|
+
import type { Executor } from "../providers/executor/types.js";
|
|
23
|
+
export type StopRunDb = Pick<PrismaClient, "run">;
|
|
24
|
+
export interface StopRunOptions {
|
|
25
|
+
db: StopRunDb;
|
|
26
|
+
executor: Pick<Executor, "stop">;
|
|
27
|
+
runId: string;
|
|
28
|
+
/** Who asked (a principal id), recorded with the reason. */
|
|
29
|
+
stoppedBy: string;
|
|
30
|
+
/** The caller's own words, if any. */
|
|
31
|
+
reason?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface StopRunResult {
|
|
34
|
+
runId: string;
|
|
35
|
+
/** The run's status before this call. */
|
|
36
|
+
previousStatus: RunStatus;
|
|
37
|
+
/** The run's status after it: `cancelled` once stopped, or whatever it had already ended as. */
|
|
38
|
+
status: RunStatus;
|
|
39
|
+
/** False when the run had already finished: nothing was changed. */
|
|
40
|
+
stopRequested: boolean;
|
|
41
|
+
/** In-flight delegated child runs this call stopped as well. */
|
|
42
|
+
stoppedChildRunIds: string[];
|
|
43
|
+
}
|
|
44
|
+
/** The text recorded on a stopped run: who stopped it and why. */
|
|
45
|
+
export declare function stopRunReason(stoppedBy: string, reason?: string): string;
|
|
46
|
+
export declare function stopRun(options: StopRunOptions): Promise<StopRunResult>;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { logger } from "./logger.js";
|
|
2
|
+
const stopLog = logger.child({ module: "stop-run" });
|
|
3
|
+
const DRIVABLE = ["pending", "running"];
|
|
4
|
+
/** Delegation trees are shallow; this only bounds a malformed one. */
|
|
5
|
+
const MAX_CHILD_DEPTH = 16;
|
|
6
|
+
/** The text recorded on a stopped run: who stopped it and why. */
|
|
7
|
+
export function stopRunReason(stoppedBy, reason) {
|
|
8
|
+
const why = reason?.trim();
|
|
9
|
+
return `Stopped by ${stoppedBy} with stop_run${why ? `: ${why}` : "."}`;
|
|
10
|
+
}
|
|
11
|
+
export async function stopRun(options) {
|
|
12
|
+
const { db, runId } = options;
|
|
13
|
+
const row = await db.run.findUnique({ where: { id: runId }, select: { status: true } });
|
|
14
|
+
if (!row)
|
|
15
|
+
throw new Error(`Unknown run "${runId}".`);
|
|
16
|
+
const previousStatus = row.status;
|
|
17
|
+
if (!DRIVABLE.includes(previousStatus)) {
|
|
18
|
+
return { runId, previousStatus, status: previousStatus, stopRequested: false, stoppedChildRunIds: [] };
|
|
19
|
+
}
|
|
20
|
+
const reason = stopRunReason(options.stoppedBy, options.reason);
|
|
21
|
+
stopLog.info({ runId, stoppedBy: options.stoppedBy, previousStatus, reason }, "stopping run");
|
|
22
|
+
const stoppedChildRunIds = [];
|
|
23
|
+
await stopOne(options, runId, reason, stoppedChildRunIds, 0, new Set());
|
|
24
|
+
const after = await db.run.findUniqueOrThrow({ where: { id: runId }, select: { status: true } });
|
|
25
|
+
return { runId, previousStatus, status: after.status, stopRequested: true, stoppedChildRunIds };
|
|
26
|
+
}
|
|
27
|
+
async function stopOne(options, runId, reason, stoppedChildRunIds, depth, visited) {
|
|
28
|
+
const { db, executor } = options;
|
|
29
|
+
visited.add(runId);
|
|
30
|
+
try {
|
|
31
|
+
await executor.stop(runId, reason);
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
// Still stop the children and record the request: a failed stop is retried by calling again.
|
|
35
|
+
stopLog.warn({ err, runId }, "the executor failed to stop the run");
|
|
36
|
+
}
|
|
37
|
+
// A run that never started has nothing to interrupt: end it here if no executor did.
|
|
38
|
+
await db.run.updateMany({
|
|
39
|
+
where: { id: runId, status: "pending" },
|
|
40
|
+
data: { status: "cancelled", error: reason, finishedAt: new Date() },
|
|
41
|
+
});
|
|
42
|
+
// Kept for get_run; written only on a run this stop (or another) cancelled, never on one that
|
|
43
|
+
// finished some other way meanwhile. stopRequestedAt stays null: it is the native sandbox
|
|
44
|
+
// gateway's deferred-stop marker, which the scheduler leader drains.
|
|
45
|
+
await db.run.updateMany({
|
|
46
|
+
where: { id: runId, status: "cancelled", stopRequestReason: null },
|
|
47
|
+
data: { stopRequestReason: reason },
|
|
48
|
+
});
|
|
49
|
+
if (depth >= MAX_CHILD_DEPTH)
|
|
50
|
+
return;
|
|
51
|
+
const children = await db.run.findMany({
|
|
52
|
+
where: { parentRunId: runId, status: { in: [...DRIVABLE] } },
|
|
53
|
+
select: { id: true },
|
|
54
|
+
});
|
|
55
|
+
for (const child of children) {
|
|
56
|
+
if (visited.has(child.id))
|
|
57
|
+
continue;
|
|
58
|
+
stoppedChildRunIds.push(child.id);
|
|
59
|
+
await stopOne(options, child.id, `Parent run ${runId} was stopped. ${reason}`, stoppedChildRunIds, depth + 1, visited);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -33,6 +33,8 @@ export interface ToolChanges {
|
|
|
33
33
|
description?: string;
|
|
34
34
|
paramsZod?: string;
|
|
35
35
|
code?: string;
|
|
36
|
+
/** null clears it (back to the default limit). Checked against the ceiling by the caller (toolTimeoutProblem). */
|
|
37
|
+
timeoutMs?: number | null;
|
|
36
38
|
}
|
|
37
39
|
/**
|
|
38
40
|
* Why a tool change was refused because of its attachments:
|
|
@@ -76,6 +78,8 @@ export declare function deleteToolGuarded(db: Pick<PrismaClient, "$transaction">
|
|
|
76
78
|
authorize: AuthorizeTool;
|
|
77
79
|
}): Promise<string[]>;
|
|
78
80
|
/** One `wardby tool list` line: names are only unique per owner, so the id and owner disambiguate. */
|
|
79
|
-
export declare function formatToolLine(tool: Pick<Tool, "id" | "name" | "description" | "ownerId">
|
|
81
|
+
export declare function formatToolLine(tool: Pick<Tool, "id" | "name" | "description" | "ownerId"> & {
|
|
82
|
+
timeoutMs?: number | null;
|
|
83
|
+
}): string;
|
|
80
84
|
/** Attached agents for an operator-facing refusal: unlike MCP's, nothing is redacted. */
|
|
81
85
|
export declare function formatAttachedAgents(agents: AttachedAgent[]): string;
|
package/dist/core/tool-admin.js
CHANGED
|
@@ -46,7 +46,10 @@ export class ToolAttachedError extends Error {
|
|
|
46
46
|
}
|
|
47
47
|
/** Whether `changes` names at least one field to change. */
|
|
48
48
|
export function hasToolChanges(changes) {
|
|
49
|
-
return changes.description !== undefined ||
|
|
49
|
+
return (changes.description !== undefined ||
|
|
50
|
+
changes.paramsZod !== undefined ||
|
|
51
|
+
changes.code !== undefined ||
|
|
52
|
+
changes.timeoutMs !== undefined);
|
|
50
53
|
}
|
|
51
54
|
/**
|
|
52
55
|
* The row update for `changes`, with jsonSchema re-derived exactly as tool
|
|
@@ -59,6 +62,7 @@ export async function prepareToolUpdate(changes) {
|
|
|
59
62
|
const data = {
|
|
60
63
|
...(changes.description !== undefined ? { description: changes.description } : {}),
|
|
61
64
|
...(changes.code !== undefined ? { code: changes.code } : {}),
|
|
65
|
+
...(changes.timeoutMs !== undefined ? { timeoutMs: changes.timeoutMs } : {}),
|
|
62
66
|
};
|
|
63
67
|
if (changes.paramsZod !== undefined) {
|
|
64
68
|
const schemaResult = await deriveJsonSchema(changes.paramsZod);
|
|
@@ -119,7 +123,8 @@ export async function deleteToolGuarded(db, toolId, options) {
|
|
|
119
123
|
}
|
|
120
124
|
/** One `wardby tool list` line: names are only unique per owner, so the id and owner disambiguate. */
|
|
121
125
|
export function formatToolLine(tool) {
|
|
122
|
-
|
|
126
|
+
const timeout = tool.timeoutMs === null || tool.timeoutMs === undefined ? "" : ` timeoutMs:${tool.timeoutMs}`;
|
|
127
|
+
return `${tool.id} ${tool.name} owner:${tool.ownerId ?? "public"}${timeout} ${tool.description}`;
|
|
123
128
|
}
|
|
124
129
|
/** Attached agents for an operator-facing refusal: unlike MCP's, nothing is redacted. */
|
|
125
130
|
export function formatAttachedAgents(agents) {
|
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
* the model would see a duplicate tool name and one tool would silently
|
|
10
10
|
* shadow the other; every attach path refuses that instead
|
|
11
11
|
* (findSameNamedAttachedTool), and the runner asserts it at load time.
|
|
12
|
+
* The same holds against an attached MCP server's exposed tool names
|
|
13
|
+
* (findSameNamedMcpTool); the runner leaves a clashing MCP tool out.
|
|
12
14
|
*/
|
|
13
15
|
import type { Prisma, PrismaClient, Tool } from "#prisma";
|
|
14
16
|
/** The runner's synthesized sub-agent tools are `delegate_to_<boundName>`. */
|
|
@@ -28,6 +30,17 @@ export type ToolLookupDb = Pick<PrismaClient | Prisma.TransactionClient, "tool"
|
|
|
28
30
|
* is Serializable) so a concurrent attach can't slip in between.
|
|
29
31
|
*/
|
|
30
32
|
export declare function findSameNamedAttachedTool(db: Pick<ToolLookupDb, "agentTool">, agentId: string, tool: Pick<Tool, "id" | "name">): Promise<Pick<Tool, "id" | "name" | "ownerId"> | null>;
|
|
33
|
+
/**
|
|
34
|
+
* An MCP attachment of `agentId` whose exposed tool name (`<server>__<tool>`) equals `toolName`,
|
|
35
|
+
* or null: the other direction of attach_mcp_server's clash check, for every path that attaches a
|
|
36
|
+
* Tool. Every exposed name contains "__", so any other name needs no lookup.
|
|
37
|
+
*/
|
|
38
|
+
export declare function findSameNamedMcpTool(db: Pick<PrismaClient | Prisma.TransactionClient, "agentMcpServer">, agentId: string, toolName: string): Promise<{
|
|
39
|
+
serverId: string;
|
|
40
|
+
serverName: string;
|
|
41
|
+
} | null>;
|
|
42
|
+
/** The refusal for a Tool whose name is an exposed MCP tool name on the agent (findSameNamedMcpTool). */
|
|
43
|
+
export declare function sameNamedMcpToolMessage(agentRef: string, toolName: string, serverName: string): string;
|
|
31
44
|
/**
|
|
32
45
|
* Resolves a CLI tool reference: an id, else a name. A name is no longer
|
|
33
46
|
* unique across owners, so more than one match is refused -- with the
|
package/dist/core/tool-names.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { MEMORY_TOOL_NAMES } from "./memory-tools.js";
|
|
2
2
|
import { SUBAGENT_MEMORY_TOOL_NAMES } from "./subagent-memory-tools.js";
|
|
3
3
|
import { ISSUE_TRACKER_TOOL_NAMES } from "./issue-tracker-tools.js";
|
|
4
|
+
import { exposedNames } from "./mcp-servers.js";
|
|
4
5
|
/** The runner's synthesized sub-agent tools are `delegate_to_<boundName>`. */
|
|
5
6
|
export const DELEGATE_TOOL_PREFIX = "delegate_to_";
|
|
6
7
|
/**
|
|
@@ -44,6 +45,25 @@ export async function findSameNamedAttachedTool(db, agentId, tool) {
|
|
|
44
45
|
});
|
|
45
46
|
return clash?.tool ?? null;
|
|
46
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* An MCP attachment of `agentId` whose exposed tool name (`<server>__<tool>`) equals `toolName`,
|
|
50
|
+
* or null: the other direction of attach_mcp_server's clash check, for every path that attaches a
|
|
51
|
+
* Tool. Every exposed name contains "__", so any other name needs no lookup.
|
|
52
|
+
*/
|
|
53
|
+
export async function findSameNamedMcpTool(db, agentId, toolName) {
|
|
54
|
+
if (!toolName.includes("__"))
|
|
55
|
+
return null;
|
|
56
|
+
const rows = await db.agentMcpServer.findMany({
|
|
57
|
+
where: { agentId },
|
|
58
|
+
select: { allowedTools: true, server: { select: { id: true, name: true } } },
|
|
59
|
+
});
|
|
60
|
+
const hit = rows.find((row) => exposedNames(row.server.name, row.allowedTools).includes(toolName));
|
|
61
|
+
return hit ? { serverId: hit.server.id, serverName: hit.server.name } : null;
|
|
62
|
+
}
|
|
63
|
+
/** The refusal for a Tool whose name is an exposed MCP tool name on the agent (findSameNamedMcpTool). */
|
|
64
|
+
export function sameNamedMcpToolMessage(agentRef, toolName, serverName) {
|
|
65
|
+
return `Agent "${agentRef}" already has the tool "${toolName}" from MCP server "${serverName}"; detach it or allow a different tool first.`;
|
|
66
|
+
}
|
|
47
67
|
/**
|
|
48
68
|
* Resolves a CLI tool reference: an id, else a name. A name is no longer
|
|
49
69
|
* unique across owners, so more than one match is refused -- with the
|
package/dist/core/webhooks.d.ts
CHANGED
|
@@ -22,6 +22,9 @@ export type ResolveWebhookRunResult = {
|
|
|
22
22
|
} | {
|
|
23
23
|
ok: false;
|
|
24
24
|
reason: "not_found" | "invalid_secret" | "disabled";
|
|
25
|
+
} | {
|
|
26
|
+
ok: false;
|
|
27
|
+
reason: "invalid_repository";
|
|
25
28
|
} | {
|
|
26
29
|
ok: false;
|
|
27
30
|
reason: "invalid_issue";
|
|
@@ -35,4 +38,5 @@ export type ResolveWebhookRunResult = {
|
|
|
35
38
|
export declare function resolveWebhookRun(id: string, presentedSecret: string, db: PrismaClient, executor: Executor, codingTask?: string, opts?: {
|
|
36
39
|
issue?: unknown;
|
|
37
40
|
issueTrackers?: IssueTrackerRegistry;
|
|
41
|
+
repository?: string;
|
|
38
42
|
}): Promise<ResolveWebhookRunResult>;
|
package/dist/core/webhooks.js
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { createHash, randomBytes, timingSafeEqual } from "node:crypto";
|
|
12
12
|
import { AttributionError, explicitAttribution, RESPONSE_PATH_SNAPSHOT_BUDGET, } from "./attribution.js";
|
|
13
|
+
import { RepositoryChoiceRefusedError } from "./coding-repository.js";
|
|
13
14
|
import { dispatchRun } from "./dispatch.js";
|
|
14
15
|
import { atLeast, effectiveAccess } from "./grants.js";
|
|
15
16
|
function hashSecret(secret) {
|
|
@@ -81,6 +82,13 @@ export async function resolveWebhookRun(id, presentedSecret, db, executor, codin
|
|
|
81
82
|
if (codingTask !== undefined && !taskAllowed(agent.kind, agent.codingProfile)) {
|
|
82
83
|
return { ok: false, reason: "disabled" };
|
|
83
84
|
}
|
|
85
|
+
// Choosing a repository takes the same opt-in as a task, and only a coding agent has one.
|
|
86
|
+
if (opts.repository !== undefined) {
|
|
87
|
+
if (agent.kind !== "coding")
|
|
88
|
+
return { ok: false, reason: "invalid_repository" };
|
|
89
|
+
if (!taskAllowed(agent.kind, agent.codingProfile))
|
|
90
|
+
return { ok: false, reason: "disabled" };
|
|
91
|
+
}
|
|
84
92
|
// An invalid or unlinked issue refuses the call before any run exists.
|
|
85
93
|
let attribution;
|
|
86
94
|
if (opts.issue !== undefined) {
|
|
@@ -97,55 +105,66 @@ export async function resolveWebhookRun(id, presentedSecret, db, executor, codin
|
|
|
97
105
|
}
|
|
98
106
|
}
|
|
99
107
|
let rejected = "disabled";
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
108
|
+
let dispatched;
|
|
109
|
+
try {
|
|
110
|
+
dispatched = await dispatchRun({
|
|
111
|
+
db,
|
|
112
|
+
executor,
|
|
113
|
+
selfDefects: { db, issueTrackers: opts.issueTrackers },
|
|
114
|
+
agentId: agent.id,
|
|
115
|
+
trigger: "webhook",
|
|
116
|
+
attribution,
|
|
117
|
+
// Coding agents keep the existing per-agent opt-in (allowWebhookTaskOverride);
|
|
118
|
+
// a native agent's system prompt has no per-run input at all otherwise, so
|
|
119
|
+
// accepting task text over an authenticated webhook call needs no separate
|
|
120
|
+
// opt-in — it's a much lower-risk capability than a coding agent being told
|
|
121
|
+
// to modify a real repository.
|
|
122
|
+
codingTask: agent.kind === "coding" ? codingTask : undefined,
|
|
123
|
+
taskOverride: agent.kind === "native" ? codingTask : undefined,
|
|
124
|
+
codingRepository: agent.kind === "coding" ? opts.repository : undefined,
|
|
125
|
+
// The webhook is its creator's standing trigger: its runs are visible to
|
|
126
|
+
// the creator (and the agent owner), like a trigger_agent call.
|
|
127
|
+
triggeredById: webhook.ownerId,
|
|
128
|
+
beforePersist: async (tx, currentAgent) => {
|
|
129
|
+
const current = await tx.webhook.findUnique({ where: { id } });
|
|
130
|
+
if (!current) {
|
|
131
|
+
rejected = "not_found";
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
if (!secretMatches(presentedSecret, current.secretHash)) {
|
|
135
|
+
rejected = "invalid_secret";
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
if (current.status !== "enabled") {
|
|
139
|
+
rejected = "disabled";
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
if ((codingTask !== undefined || opts.repository !== undefined) &&
|
|
143
|
+
!taskAllowed(currentAgent.kind, currentAgent.codingProfile)) {
|
|
144
|
+
rejected = "disabled";
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
// The creator must still be allowed to trigger the agent (resource-
|
|
148
|
+
// sharing grants spec §3.10): its owner, or a holder of execute. Read
|
|
149
|
+
// through tx, so a revoke or make_owner takes effect on the next fire.
|
|
150
|
+
// A webhook on a formerly public agent keeps firing through the
|
|
151
|
+
// migration's everyone-execute grant.
|
|
152
|
+
const creatorAccess = await effectiveAccess(tx, "agent", currentAgent, current.ownerId);
|
|
153
|
+
if (!atLeast("agent", creatorAccess, "execute")) {
|
|
154
|
+
rejected = "disabled";
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
await tx.webhook.update({ where: { id }, data: { lastFiredAt: new Date() } });
|
|
158
|
+
return true;
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
// The refusal's message lists the agent's repositories; the caller gets only the code.
|
|
164
|
+
if (err instanceof RepositoryChoiceRefusedError)
|
|
165
|
+
return { ok: false, reason: "invalid_repository" };
|
|
166
|
+
throw err;
|
|
167
|
+
}
|
|
149
168
|
if (!dispatched)
|
|
150
169
|
return { ok: false, reason: rejected };
|
|
151
170
|
return { ok: true, runId: dispatched.run.id };
|
|
@@ -1,7 +1,13 @@
|
|
|
1
|
-
|
|
1
|
+
import type { PackageAuditDigest, PackageAuditMode } from "../coding/registry/audit-mode.js";
|
|
2
|
+
import type { RegistryRefusalSummary } from "../coding/registry/report.js";
|
|
3
|
+
export declare const WORKFLOW_EVENT_KINDS: readonly ["issue_picked_up", "run_failed", "run_blocked", "pr_opened", "review_posted", "review_fix", "pr_closed", "packages_audited"];
|
|
2
4
|
export type WorkflowEventKind = (typeof WORKFLOW_EVENT_KINDS)[number];
|
|
3
5
|
/** Template inputs per kind. Every string here may be shown in Slack (escaped). */
|
|
4
6
|
export type WorkflowPayload = {
|
|
7
|
+
kind: "run_blocked";
|
|
8
|
+
agentName: string;
|
|
9
|
+
packageRefusals: RegistryRefusalSummary[];
|
|
10
|
+
} | {
|
|
5
11
|
kind: "issue_picked_up";
|
|
6
12
|
agentName: string;
|
|
7
13
|
trigger: string;
|
|
@@ -34,7 +40,11 @@ export type WorkflowPayload = {
|
|
|
34
40
|
prUrl: string;
|
|
35
41
|
merged: boolean;
|
|
36
42
|
movedTo: string | null;
|
|
37
|
-
}
|
|
43
|
+
} | ({
|
|
44
|
+
kind: "packages_audited";
|
|
45
|
+
agentName: string;
|
|
46
|
+
mode: PackageAuditMode;
|
|
47
|
+
} & PackageAuditDigest);
|
|
38
48
|
/** What a thread's parent message shows about its subject. */
|
|
39
49
|
export interface ThreadSubject {
|
|
40
50
|
/** "PAY-241" or "org/repo#212" or "run abc123". */
|
|
@@ -44,11 +54,13 @@ export interface ThreadSubject {
|
|
|
44
54
|
}
|
|
45
55
|
export declare const dedupeKeys: {
|
|
46
56
|
issuePickedUp: (runId: string) => string;
|
|
57
|
+
runBlocked: (runId: string) => string;
|
|
47
58
|
runFailed: (runId: string) => string;
|
|
48
59
|
prOpened: (codeProvider: string, repository: string, n: number) => string;
|
|
49
60
|
reviewPosted: (runId: string) => string;
|
|
50
61
|
reviewFix: (repository: string, n: number, round: number, state: "started" | "capped") => string;
|
|
51
62
|
prClosed: (codeProvider: string, repository: string, n: number) => string;
|
|
63
|
+
packagesAudited: (runId: string) => string;
|
|
52
64
|
};
|
|
53
65
|
export declare const threadKeys: {
|
|
54
66
|
issue: (provider: string, key: string) => string;
|
|
@@ -2,18 +2,22 @@ import { logger } from "./logger.js";
|
|
|
2
2
|
export const WORKFLOW_EVENT_KINDS = [
|
|
3
3
|
"issue_picked_up",
|
|
4
4
|
"run_failed",
|
|
5
|
+
"run_blocked",
|
|
5
6
|
"pr_opened",
|
|
6
7
|
"review_posted",
|
|
7
8
|
"review_fix",
|
|
8
9
|
"pr_closed",
|
|
10
|
+
"packages_audited",
|
|
9
11
|
];
|
|
10
12
|
export const dedupeKeys = {
|
|
11
13
|
issuePickedUp: (runId) => `issue_picked_up:${runId}`,
|
|
14
|
+
runBlocked: (runId) => `run_blocked:${runId}`,
|
|
12
15
|
runFailed: (runId) => `run_failed:${runId}`,
|
|
13
16
|
prOpened: (codeProvider, repository, n) => `pr_opened:${codeProvider}:${repository}#${n}`,
|
|
14
17
|
reviewPosted: (runId) => `review_posted:${runId}`,
|
|
15
18
|
reviewFix: (repository, n, round, state) => `review_fix:${repository}#${n}:${round}:${state}`,
|
|
16
19
|
prClosed: (codeProvider, repository, n) => `pr_closed:${codeProvider}:${repository}#${n}`,
|
|
20
|
+
packagesAudited: (runId) => `packages_audited:${runId}`,
|
|
17
21
|
};
|
|
18
22
|
export const threadKeys = {
|
|
19
23
|
issue: (provider, key) => `issue:${provider}:${key}`,
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Workflow notifications a run's finalizer emits: run_failed for a top-level
|
|
3
|
-
* run that did not succeed
|
|
3
|
+
* run that did not succeed, run_blocked for package refusals without changes
|
|
4
|
+
* (children are summarized by their parent), packages_audited when its coding
|
|
5
|
+
* children installed anything under package audit mode, and
|
|
4
6
|
* review_posted when the run published a verdict on its own check. Called
|
|
5
7
|
* only by the finalizer that made the run terminal. Never throws.
|
|
6
8
|
*/
|
|
7
9
|
import type { PrismaClient } from "#prisma";
|
|
8
|
-
export type RunEventsDb = Pick<PrismaClient, "agent" | "runHostCheck">;
|
|
9
|
-
/** Emits
|
|
10
|
+
export type RunEventsDb = Pick<PrismaClient, "agent" | "runHostCheck" | "run" | "runBudgetEvent" | "registryFetch" | "registryAuditRecord">;
|
|
11
|
+
/** Emits top-level run outcomes and published review verdicts. Never throws. */
|
|
10
12
|
export declare function emitRunFinishedEvents(db: RunEventsDb, run: {
|
|
11
13
|
id: string;
|
|
12
14
|
agentId: string;
|
|
@@ -1,19 +1,55 @@
|
|
|
1
|
+
import { pullRequestWebUrl } from "../coding/code-host.js";
|
|
2
|
+
import { packageAuditDigest } from "../coding/registry/audit-mode.js";
|
|
3
|
+
import { blockingRefusals, collectPackageAudit, collectRunOutcome, isBlockedByRefusals } from "./host-status.js";
|
|
1
4
|
import { logger } from "./logger.js";
|
|
2
5
|
import { dedupeKeys, emitWorkflowEvent, shortReason } from "./workflow-events.js";
|
|
3
6
|
const log = logger.child({ module: "workflow-run-events" });
|
|
4
7
|
const FAILED = new Set(["failed", "budget_exhausted", "cancelled", "lost", "refused"]);
|
|
5
8
|
const VERDICTS = new Set(["APPROVE", "CHANGES_REQUESTED", "COMMENT"]);
|
|
6
|
-
/** Emits
|
|
9
|
+
/** Emits top-level run outcomes and published review verdicts. Never throws. */
|
|
7
10
|
export async function emitRunFinishedEvents(db, run) {
|
|
8
11
|
try {
|
|
9
12
|
const agentName = (await db.agent.findUnique({ where: { id: run.agentId }, select: { name: true } }))?.name ?? run.agentId;
|
|
10
|
-
if (!run.parentRunId
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
if (!run.parentRunId) {
|
|
14
|
+
try {
|
|
15
|
+
// Only a succeeded run can be blocked (isBlockedByRefusals), so only it needs its children read.
|
|
16
|
+
const succeeded = { id: run.id, status: "succeeded", finalText: null };
|
|
17
|
+
const outcome = run.status === "succeeded" ? await collectRunOutcome(db, succeeded) : null;
|
|
18
|
+
if (outcome && isBlockedByRefusals(succeeded, outcome)) {
|
|
19
|
+
await emitWorkflowEvent({
|
|
20
|
+
dedupeKey: dedupeKeys.runBlocked(run.id),
|
|
21
|
+
runId: run.id,
|
|
22
|
+
agentId: run.agentId,
|
|
23
|
+
payload: { kind: "run_blocked", agentName, packageRefusals: blockingRefusals(outcome) },
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
// Any terminal status: what audit mode let in is worth knowing whether or not the run succeeded.
|
|
27
|
+
const audit = outcome ? outcome.packageAudit : await collectPackageAudit(db, run.id);
|
|
28
|
+
if (audit && audit.summary.entries.length > 0) {
|
|
29
|
+
await emitWorkflowEvent({
|
|
30
|
+
dedupeKey: dedupeKeys.packagesAudited(run.id),
|
|
31
|
+
runId: run.id,
|
|
32
|
+
agentId: run.agentId,
|
|
33
|
+
payload: {
|
|
34
|
+
kind: "packages_audited",
|
|
35
|
+
agentName,
|
|
36
|
+
mode: audit.mode,
|
|
37
|
+
...packageAuditDigest(audit.mode, audit.summary),
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// A reporting read failure must not prevent other workflow events.
|
|
44
|
+
}
|
|
45
|
+
if (FAILED.has(run.status)) {
|
|
46
|
+
await emitWorkflowEvent({
|
|
47
|
+
dedupeKey: dedupeKeys.runFailed(run.id),
|
|
48
|
+
runId: run.id,
|
|
49
|
+
agentId: run.agentId,
|
|
50
|
+
payload: { kind: "run_failed", agentName, status: run.status, reason: shortReason(run.error) },
|
|
51
|
+
});
|
|
52
|
+
}
|
|
17
53
|
}
|
|
18
54
|
const check = await db.runHostCheck.findUnique({ where: { runId: run.id } });
|
|
19
55
|
if (check?.verdict && VERDICTS.has(check.verdict) && check.prNumber !== null) {
|
|
@@ -28,7 +64,7 @@ export async function emitRunFinishedEvents(db, run) {
|
|
|
28
64
|
agentName,
|
|
29
65
|
verdict: check.verdict,
|
|
30
66
|
prLabel,
|
|
31
|
-
prUrl: check.provider
|
|
67
|
+
prUrl: pullRequestWebUrl(check.provider, check.repository, check.prNumber),
|
|
32
68
|
ciPending: check.ciPendingAtReview === true,
|
|
33
69
|
},
|
|
34
70
|
});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
function isStringKeySchema(value) {
|
|
2
|
+
return (!!value &&
|
|
3
|
+
typeof value === "object" &&
|
|
4
|
+
!Array.isArray(value) &&
|
|
5
|
+
Object.keys(value).length === 1 &&
|
|
6
|
+
value.type === "string");
|
|
7
|
+
}
|
|
8
|
+
export function legacyJsonSchema(node, options = {}) {
|
|
9
|
+
if (Array.isArray(node))
|
|
10
|
+
return node.map((item) => legacyJsonSchema(item, options));
|
|
11
|
+
if (!node || typeof node !== "object")
|
|
12
|
+
return node;
|
|
13
|
+
const source = node;
|
|
14
|
+
const out = {};
|
|
15
|
+
for (const [key, value] of Object.entries(source)) {
|
|
16
|
+
if (source.type === "integer" && key === "minimum" && value === Number.MIN_SAFE_INTEGER)
|
|
17
|
+
continue;
|
|
18
|
+
if (source.type === "integer" && key === "maximum" && value === Number.MAX_SAFE_INTEGER)
|
|
19
|
+
continue;
|
|
20
|
+
if (key === "propertyNames" && isStringKeySchema(value))
|
|
21
|
+
continue;
|
|
22
|
+
if (options.closeObjects &&
|
|
23
|
+
key === "additionalProperties" &&
|
|
24
|
+
value &&
|
|
25
|
+
typeof value === "object" &&
|
|
26
|
+
Object.keys(value).length === 0) {
|
|
27
|
+
out[key] = true;
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
// A `properties` map's keys are names, not keywords: only its values are schemas.
|
|
31
|
+
out[key === "oneOf" ? "anyOf" : key] =
|
|
32
|
+
key === "properties" && value && typeof value === "object"
|
|
33
|
+
? Object.fromEntries(Object.entries(value).map(([name, sub]) => [name, legacyJsonSchema(sub, options)]))
|
|
34
|
+
: legacyJsonSchema(value, options);
|
|
35
|
+
}
|
|
36
|
+
if (options.closeObjects && source.type === "object" && "properties" in source && !("additionalProperties" in source))
|
|
37
|
+
out.additionalProperties = false;
|
|
38
|
+
return out;
|
|
39
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { PrismaClient } from "#prisma";
|
|
2
|
+
import { type Zod4Compatibility } from "../sandbox/zod-params.js";
|
|
3
|
+
import type { SandboxResult } from "../sandbox/eval-core.js";
|
|
4
|
+
export declare const ZOD3_WINDOW_ENDS = "Zod 3 schemas stop working in the next release";
|
|
5
|
+
/** The warning for one paramsZod, or undefined when Zod 4 compiles it (or there is nothing to say). */
|
|
6
|
+
export declare function zod3WindowWarning(subject: string, compatibility: Zod4Compatibility): string | undefined;
|
|
7
|
+
/** How a warning names a tool. */
|
|
8
|
+
export declare function toolSubject(name: string): string;
|
|
9
|
+
export declare function cachedZod4Compatibility(paramsZod: string): Promise<Zod4Compatibility>;
|
|
10
|
+
/** Test hook: empties the compatibility cache. */
|
|
11
|
+
export declare function clearZod4CompatibilityCache(): void;
|
|
12
|
+
/** The warnings for one tool's paramsZod (empty or one entry), ready for a result's `warnings`. */
|
|
13
|
+
export declare function zod3ToolWarnings(subject: string, paramsZod: string): Promise<string[]>;
|
|
14
|
+
/**
|
|
15
|
+
* A tool row with its Zod 3 window warnings, for a caller who owns it (and so
|
|
16
|
+
* already sees its paramsZod). Rows projected for anyone else, which carry no
|
|
17
|
+
* paramsZod, pass through unchanged: a warning would reveal part of the schema.
|
|
18
|
+
*/
|
|
19
|
+
export declare function withZod3ToolWarnings<T extends object>(projected: T): Promise<T | (T & {
|
|
20
|
+
warnings: string[];
|
|
21
|
+
})>;
|
|
22
|
+
/**
|
|
23
|
+
* dry_run_tool's check of a schema Zod 4 does compile: whether Zod 4 treats
|
|
24
|
+
* the sample arguments as the current release does. Names no values.
|
|
25
|
+
*/
|
|
26
|
+
export declare function zod3SampleArgsWarning(subject: string, current: SandboxResult, zod4: SandboxResult): string | undefined;
|
|
27
|
+
interface WarnLog {
|
|
28
|
+
warn(fields: object, message: string): void;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Logs one warning per stored tool whose paramsZod Zod 4 can't compile. Runs
|
|
32
|
+
* in the background at startup; never throws.
|
|
33
|
+
*/
|
|
34
|
+
export declare function logZod3ToolWarnings(db: Pick<PrismaClient, "tool">, log: WarnLog): Promise<number>;
|
|
35
|
+
export {};
|