@wardby/cli 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/deploy/local/docker-compose.quickstart-coding.yml +13 -0
- package/dist/claude-coding-worker/driver.d.ts +21 -3
- package/dist/claude-coding-worker/driver.js +125 -17
- package/dist/claude-coding-worker/main.js +34 -6
- package/dist/claude-coding-worker/sdk.js +12 -1
- package/dist/claude-coding-worker/tool-socket.d.ts +27 -0
- package/dist/claude-coding-worker/tool-socket.js +111 -0
- package/dist/claude-coding-worker/transcript.d.ts +18 -0
- package/dist/claude-coding-worker/transcript.js +77 -0
- package/dist/cli-help.d.ts +1 -1
- package/dist/cli-help.js +1 -0
- package/dist/cli.js +24 -10
- package/dist/coding/continuation-wording.d.ts +35 -0
- package/dist/coding/continuation-wording.js +73 -0
- package/dist/coding/linked-issue-note.d.ts +23 -0
- package/dist/coding/linked-issue-note.js +47 -0
- package/dist/coding/merge-wording.d.ts +28 -0
- package/dist/coding/merge-wording.js +78 -0
- package/dist/coding/pr-description-note.d.ts +9 -0
- package/dist/coding/pr-description-note.js +32 -0
- package/dist/coding/profile.d.ts +46 -126
- package/dist/coding/profile.js +45 -4
- package/dist/coding/protected-path-wording.d.ts +8 -0
- package/dist/coding/protected-path-wording.js +1 -1
- package/dist/coding/protocol.d.ts +264 -346
- package/dist/coding/protocol.js +235 -12
- package/dist/coding/redact.d.ts +3 -0
- package/dist/coding/redact.js +12 -0
- package/dist/coding/registry/allowlist.d.ts +12 -0
- package/dist/coding/registry/allowlist.js +14 -1
- package/dist/coding/registry/audit-mode.d.ts +153 -0
- package/dist/coding/registry/audit-mode.js +304 -0
- package/dist/coding/registry/lockfile-shared.d.ts +36 -0
- package/dist/coding/registry/lockfile-shared.js +128 -0
- package/dist/coding/registry/lockfiles.js +1 -1
- package/dist/coding/registry/npm-lockfile-formats.d.ts +11 -0
- package/dist/coding/registry/npm-lockfile-formats.js +41 -0
- package/dist/coding/registry/npm-lockfile.d.ts +8 -4
- package/dist/coding/registry/npm-lockfile.js +4 -6
- package/dist/coding/registry/npm.js +78 -8
- package/dist/coding/registry/pnpm-lockfile.d.ts +17 -0
- package/dist/coding/registry/pnpm-lockfile.js +189 -0
- package/dist/coding/registry/pypi-plan.d.ts +50 -0
- package/dist/coding/registry/pypi-plan.js +406 -0
- package/dist/coding/registry/pypi-requirements.d.ts +58 -0
- package/dist/coding/registry/pypi-requirements.js +155 -0
- package/dist/coding/registry/pypi.d.ts +3 -27
- package/dist/coding/registry/pypi.js +40 -154
- package/dist/coding/registry/refusal-hints.d.ts +20 -0
- package/dist/coding/registry/refusal-hints.js +61 -0
- package/dist/coding/registry/refusal-wording.d.ts +11 -0
- package/dist/coding/registry/refusal-wording.js +56 -0
- package/dist/coding/registry/report.d.ts +70 -8
- package/dist/coding/registry/report.js +112 -5
- package/dist/coding/registry/types.d.ts +58 -8
- package/dist/coding/registry/yarn-lockfile.d.ts +30 -0
- package/dist/coding/registry/yarn-lockfile.js +367 -0
- package/dist/coding/services/catalog.d.ts +37 -351
- package/dist/coding/transcript/claude-code.d.ts +13 -0
- package/dist/coding/transcript/claude-code.js +273 -0
- package/dist/coding/transcript/download-protocol.d.ts +30 -0
- package/dist/coding/transcript/download-protocol.js +18 -0
- package/dist/coding/transcript/format.d.ts +20 -0
- package/dist/coding/transcript/format.js +32 -0
- package/dist/coding/transcript/recorder.d.ts +51 -0
- package/dist/coding/transcript/recorder.js +225 -0
- package/dist/coding/transcript/resume/checkout.d.ts +31 -0
- package/dist/coding/transcript/resume/checkout.js +203 -0
- package/dist/coding/transcript/resume/command.d.ts +17 -0
- package/dist/coding/transcript/resume/command.js +176 -0
- package/dist/coding/transcript/resume/download.d.ts +20 -0
- package/dist/coding/transcript/resume/download.js +153 -0
- package/dist/coding/transcript/resume/launch.d.ts +38 -0
- package/dist/coding/transcript/resume/launch.js +128 -0
- package/dist/coding/transcript/resume/session-file.d.ts +13 -0
- package/dist/coding/transcript/resume/session-file.js +79 -0
- package/dist/coding/transcript/resume/stand-in.d.ts +11 -0
- package/dist/coding/transcript/resume/stand-in.js +49 -0
- package/dist/coding-worker/artifact.d.ts +8 -3
- package/dist/coding-worker/artifact.js +3 -1
- package/dist/coding-worker/debug-trace.d.ts +6 -5
- package/dist/coding-worker/debug-trace.js +13 -18
- package/dist/coding-worker/dependency-cache.d.mts +229 -0
- package/dist/coding-worker/dependency-cache.mjs +2123 -0
- package/dist/coding-worker/driver.d.ts +4 -3
- package/dist/coding-worker/driver.js +116 -38
- package/dist/coding-worker/errors.d.ts +1 -0
- package/dist/coding-worker/errors.js +32 -0
- package/dist/coding-worker/task-note.d.ts +11 -0
- package/dist/coding-worker/task-note.js +13 -0
- package/dist/coding-worker/types.d.ts +11 -0
- package/dist/config/dependency-cache.d.ts +23 -0
- package/dist/config/dependency-cache.js +32 -0
- package/dist/config/providers.d.ts +12 -3
- package/dist/config/providers.js +55 -5
- package/dist/config/test-simulators.d.ts +82 -0
- package/dist/config/test-simulators.js +305 -0
- package/dist/core/async-context.d.ts +2 -0
- package/dist/core/async-context.js +12 -0
- package/dist/core/budget-events.d.ts +108 -0
- package/dist/core/budget-events.js +346 -0
- package/dist/core/budget-groups.d.ts +50 -1
- package/dist/core/budget-groups.js +236 -27
- package/dist/core/budget-stopped-head.d.ts +46 -0
- package/dist/core/budget-stopped-head.js +81 -0
- package/dist/core/budget-topup.d.ts +51 -0
- package/dist/core/budget-topup.js +156 -0
- package/dist/core/budget-wording.d.ts +16 -2
- package/dist/core/budget-wording.js +40 -2
- package/dist/core/coding-queue.d.ts +2 -1
- package/dist/core/coding-queue.js +7 -0
- package/dist/core/cron.d.ts +19 -1
- package/dist/core/cron.js +17 -0
- package/dist/core/datastores.js +1 -1
- package/dist/core/deferred-coding.d.ts +14 -0
- package/dist/core/deferred-coding.js +62 -0
- package/dist/core/delegation-child.d.ts +25 -0
- package/dist/core/delegation-child.js +37 -0
- package/dist/core/dispatch.d.ts +42 -0
- package/dist/core/dispatch.js +131 -56
- package/dist/core/engine-native.js +1 -1
- package/dist/core/error-code.d.ts +38 -0
- package/dist/core/error-code.js +168 -0
- package/dist/core/grants.d.ts +19 -6
- package/dist/core/grants.js +55 -6
- package/dist/core/host-events.d.ts +18 -2
- package/dist/core/host-events.js +284 -24
- package/dist/core/host-status.d.ts +85 -3
- package/dist/core/host-status.js +298 -20
- package/dist/core/issue-bridge.d.ts +50 -6
- package/dist/core/issue-bridge.js +124 -33
- package/dist/core/issue-events.d.ts +1 -1
- package/dist/core/issue-events.js +4 -10
- package/dist/core/issue-status.d.ts +1 -1
- package/dist/core/issue-status.js +54 -26
- package/dist/core/logger.d.ts +5 -0
- package/dist/core/logger.js +14 -1
- package/dist/core/lost-run-children.d.ts +6 -0
- package/dist/core/lost-run-children.js +32 -0
- package/dist/core/mark-ready.d.ts +34 -0
- package/dist/core/mark-ready.js +152 -0
- package/dist/core/markdown-code.d.ts +8 -0
- package/dist/core/markdown-code.js +107 -0
- package/dist/core/memory-tools.js +7 -0
- package/dist/core/merge-order-check.d.ts +2 -1
- package/dist/core/merge-order-check.js +8 -1
- package/dist/core/notification-templates.d.ts +1 -7
- package/dist/core/notification-templates.js +36 -2
- package/dist/core/pull-request-state-sync.js +2 -2
- package/dist/core/reconciler.d.ts +4 -3
- package/dist/core/reconciler.js +8 -1
- package/dist/core/related-pull-requests.d.ts +11 -3
- package/dist/core/related-pull-requests.js +27 -14
- package/dist/core/reply-parts.d.ts +21 -0
- package/dist/core/reply-parts.js +73 -0
- package/dist/core/review-fix.d.ts +1 -1
- package/dist/core/review-fix.js +2 -1
- package/dist/core/review-host-checks.d.ts +1 -1
- package/dist/core/review-host-tools.d.ts +3 -0
- package/dist/core/review-host-tools.js +99 -13
- package/dist/core/review-reads.d.ts +55 -0
- package/dist/core/review-reads.js +233 -0
- package/dist/core/run-status.d.ts +12 -0
- package/dist/core/run-status.js +12 -0
- package/dist/core/runner.d.ts +80 -34
- package/dist/core/runner.js +439 -144
- package/dist/core/schedule-start.d.ts +12 -0
- package/dist/core/schedule-start.js +14 -0
- package/dist/core/secret-broker-config.d.ts +10 -74
- package/dist/core/secret-guard.d.ts +46 -0
- package/dist/core/secret-guard.js +104 -0
- package/dist/core/secret-guarded-stores.d.ts +12 -0
- package/dist/core/secret-guarded-stores.js +41 -0
- package/dist/core/secret-spans.d.ts +50 -0
- package/dist/core/secret-spans.js +94 -0
- package/dist/core/stop-run.d.ts +46 -0
- package/dist/core/stop-run.js +61 -0
- package/dist/core/workflow-events.d.ts +14 -2
- package/dist/core/workflow-events.js +4 -0
- package/dist/core/workflow-run-events.d.ts +5 -3
- package/dist/core/workflow-run-events.js +43 -8
- package/dist/core/zod-json-schema.d.ts +4 -0
- package/dist/core/zod-json-schema.js +39 -0
- package/dist/core/zod3-window.d.ts +35 -0
- package/dist/core/zod3-window.js +124 -0
- package/dist/generated/prisma/browser.d.ts +34 -3
- package/dist/generated/prisma/client.d.ts +34 -3
- package/dist/generated/prisma/commonInputTypes.d.ts +220 -60
- package/dist/generated/prisma/enums.d.ts +10 -0
- package/dist/generated/prisma/enums.js +8 -0
- package/dist/generated/prisma/internal/class.d.ts +44 -0
- package/dist/generated/prisma/internal/class.js +4 -4
- package/dist/generated/prisma/internal/prismaNamespace.d.ts +428 -9
- package/dist/generated/prisma/internal/prismaNamespace.js +92 -1
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +95 -0
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +92 -1
- package/dist/generated/prisma/models/Agent.d.ts +106 -8
- package/dist/generated/prisma/models/AgentRepository.d.ts +42 -1
- package/dist/generated/prisma/models/CodingAgentProfile.d.ts +229 -1
- package/dist/generated/prisma/models/CodingProxyRequest.d.ts +207 -3
- package/dist/generated/prisma/models/CodingProxySession.d.ts +114 -1
- package/dist/generated/prisma/models/CodingRun.d.ts +1637 -1
- package/dist/generated/prisma/models/DependencySnapshot.d.ts +1668 -0
- package/dist/generated/prisma/models/DependencySnapshot.js +1 -0
- package/dist/generated/prisma/models/IssuePullRequest.d.ts +6 -2
- package/dist/generated/prisma/models/LocalReview.d.ts +40 -1
- package/dist/generated/prisma/models/NativeGatewayCall.d.ts +39 -1
- package/dist/generated/prisma/models/NativeGatewaySession.d.ts +35 -1
- package/dist/generated/prisma/models/RegistryAllowance.d.ts +41 -1
- package/dist/generated/prisma/models/RegistryApprovedVersion.d.ts +75 -1
- package/dist/generated/prisma/models/RegistryAuditRecord.d.ts +1364 -0
- package/dist/generated/prisma/models/RegistryAuditRecord.js +1 -0
- package/dist/generated/prisma/models/Run.d.ts +738 -2
- package/dist/generated/prisma/models/RunBudgetEvent.d.ts +1211 -0
- package/dist/generated/prisma/models/RunBudgetEvent.js +1 -0
- package/dist/generated/prisma/models/RunTranscript.d.ts +1339 -0
- package/dist/generated/prisma/models/RunTranscript.js +1 -0
- package/dist/generated/prisma/models.d.ts +4 -0
- package/dist/help-index.json +1320 -69
- package/dist/import/create.js +32 -3
- package/dist/import/neutral-schema.d.ts +50 -281
- package/dist/import/neutral-schema.js +5 -4
- package/dist/knowledge/check.d.ts +1 -1
- package/dist/knowledge/cli.d.ts +11 -1
- package/dist/knowledge/cli.js +37 -4
- package/dist/knowledge/concept.d.ts +3 -19
- package/dist/knowledge/location.d.ts +31 -0
- package/dist/knowledge/location.js +78 -0
- package/dist/mcp/auth/access.d.ts +10 -2
- package/dist/mcp/auth/access.js +15 -1
- package/dist/mcp/auth/ownership.d.ts +7 -7
- package/dist/mcp/auth/self-hosted/credentials.d.ts +3 -3
- package/dist/mcp/auth/self-hosted/session.d.ts +2 -2
- package/dist/mcp/host-events/github-ingress.d.ts +2 -0
- package/dist/mcp/host-events/github-ingress.js +2 -1
- package/dist/mcp/index.d.ts +6 -0
- package/dist/mcp/index.js +58 -10
- package/dist/mcp/server.d.ts +13 -0
- package/dist/mcp/server.js +33 -14
- package/dist/mcp/tools/agents.d.ts +4 -0
- package/dist/mcp/tools/agents.js +198 -16
- package/dist/mcp/tools/datastore.js +17 -8
- package/dist/mcp/tools/grants.js +9 -3
- package/dist/mcp/tools/memory.js +11 -1
- package/dist/mcp/tools/notification-channels.js +2 -2
- package/dist/mcp/tools/packages.d.ts +2 -0
- package/dist/mcp/tools/packages.js +195 -0
- package/dist/mcp/tools/repositories.js +18 -5
- package/dist/mcp/tools/run-access.d.ts +16 -0
- package/dist/mcp/tools/run-access.js +25 -0
- package/dist/mcp/tools/run-transcript-download.d.ts +30 -0
- package/dist/mcp/tools/run-transcript-download.js +129 -0
- package/dist/mcp/tools/run-transcript.d.ts +19 -0
- package/dist/mcp/tools/run-transcript.js +70 -0
- package/dist/mcp/tools/runs.js +34 -12
- package/dist/mcp/tools/scheduling.js +3 -1
- package/dist/mcp/tools/secret-elicitation-form.js +5 -0
- package/dist/mcp/tools/secret-elicitation-server.d.ts +6 -0
- package/dist/mcp/tools/secret-elicitation-server.js +10 -61
- package/dist/mcp/tools/secrets.js +2 -2
- package/dist/mcp/tools/stop-run.d.ts +2 -0
- package/dist/mcp/tools/stop-run.js +82 -0
- package/dist/mcp/tools/subagents.js +2 -2
- package/dist/mcp/tools/tools.d.ts +1 -1
- package/dist/mcp/tools/tools.js +25 -9
- package/dist/mcp/transport/stdio-link-host.d.ts +20 -0
- package/dist/mcp/transport/stdio-link-host.js +67 -0
- package/dist/mcp/transport/streamable-http.d.ts +13 -0
- package/dist/mcp/transport/streamable-http.js +41 -1
- package/dist/native-worker/docker-launcher.d.ts +38 -2
- package/dist/native-worker/docker-launcher.js +65 -5
- package/dist/native-worker/gateway-server.d.ts +41 -3
- package/dist/native-worker/gateway-server.js +124 -27
- package/dist/native-worker/gateway.d.ts +27 -1
- package/dist/native-worker/gateway.js +70 -4
- package/dist/native-worker/http-server.d.ts +3 -1
- package/dist/native-worker/http-server.js +11 -7
- package/dist/native-worker/http-transport.js +1 -1
- package/dist/native-worker/kubernetes-launcher.d.ts +7 -3
- package/dist/native-worker/kubernetes-launcher.js +43 -3
- package/dist/native-worker/launch.d.ts +18 -1
- package/dist/native-worker/launch.js +6 -1
- package/dist/native-worker/ledger.d.ts +18 -2
- package/dist/native-worker/ledger.js +57 -4
- package/dist/native-worker/loopback.js +3 -8
- package/dist/native-worker/main.d.ts +2 -1
- package/dist/native-worker/main.js +14 -3
- package/dist/native-worker/protocol.d.ts +129 -577
- package/dist/native-worker/protocol.js +47 -1
- package/dist/native-worker/sandbox-executor.d.ts +17 -2
- package/dist/native-worker/sandbox-executor.js +78 -4
- package/dist/native-worker/stderr-redaction.d.ts +77 -0
- package/dist/native-worker/stderr-redaction.js +237 -0
- package/dist/native-worker/stdio.d.ts +1 -1
- package/dist/native-worker/stdio.js +6 -5
- package/dist/native-worker/warm-pool.d.ts +2 -2
- package/dist/native-worker/warm-pool.js +4 -4
- package/dist/native-worker/worker.js +28 -2
- package/dist/observability/metrics.js +6 -1
- package/dist/providers/auth/self-hosted.d.ts +1 -1
- package/dist/providers/coding-proxy/dependency-cache/eviction.d.ts +29 -0
- package/dist/providers/coding-proxy/dependency-cache/eviction.js +87 -0
- package/dist/providers/coding-proxy/dependency-cache/key.d.ts +33 -0
- package/dist/providers/coding-proxy/dependency-cache/key.js +86 -0
- package/dist/providers/coding-proxy/dependency-cache/model-request-seal.d.ts +18 -0
- package/dist/providers/coding-proxy/dependency-cache/model-request-seal.js +40 -0
- package/dist/providers/coding-proxy/dependency-cache/prisma-store.d.ts +25 -0
- package/dist/providers/coding-proxy/dependency-cache/prisma-store.js +131 -0
- package/dist/providers/coding-proxy/dependency-cache/service.d.ts +70 -0
- package/dist/providers/coding-proxy/dependency-cache/service.js +409 -0
- package/dist/providers/coding-proxy/dependency-cache/store.d.ts +85 -0
- package/dist/providers/coding-proxy/dependency-cache/store.js +95 -0
- package/dist/providers/coding-proxy/hold.d.ts +32 -0
- package/dist/providers/coding-proxy/hold.js +86 -0
- package/dist/providers/coding-proxy/interrupted.d.ts +70 -0
- package/dist/providers/coding-proxy/interrupted.js +104 -0
- package/dist/providers/coding-proxy/memory-ledger.d.ts +15 -2
- package/dist/providers/coding-proxy/memory-ledger.js +84 -8
- package/dist/providers/coding-proxy/metering.d.ts +16 -0
- package/dist/providers/coding-proxy/metering.js +27 -4
- package/dist/providers/coding-proxy/prisma-ledger.d.ts +15 -2
- package/dist/providers/coding-proxy/prisma-ledger.js +179 -67
- package/dist/providers/coding-proxy/proxy.d.ts +14 -1
- package/dist/providers/coding-proxy/proxy.js +166 -14
- package/dist/providers/coding-proxy/registry/audit.d.ts +53 -10
- package/dist/providers/coding-proxy/registry/audit.js +94 -17
- package/dist/providers/coding-proxy/registry/lockfile-parse-worker.d.ts +36 -0
- package/dist/providers/coding-proxy/registry/lockfile-parse-worker.js +67 -0
- package/dist/providers/coding-proxy/registry/lockfile-parse.d.ts +16 -0
- package/dist/providers/coding-proxy/registry/lockfile-parse.js +110 -0
- package/dist/providers/coding-proxy/registry/plan.d.ts +9 -0
- package/dist/providers/coding-proxy/registry/plan.js +201 -48
- package/dist/providers/coding-proxy/registry/prisma-store.d.ts +11 -5
- package/dist/providers/coding-proxy/registry/prisma-store.js +120 -17
- package/dist/providers/coding-proxy/registry/service.d.ts +97 -16
- package/dist/providers/coding-proxy/registry/service.js +579 -112
- package/dist/providers/coding-proxy/registry/store.d.ts +84 -9
- package/dist/providers/coding-proxy/registry/store.js +54 -1
- package/dist/providers/coding-proxy/runtime.d.ts +4 -0
- package/dist/providers/coding-proxy/runtime.js +78 -16
- package/dist/providers/coding-proxy/server.d.ts +6 -1
- package/dist/providers/coding-proxy/server.js +45 -1
- package/dist/providers/coding-proxy/types.d.ts +65 -1
- package/dist/providers/datastore/types.d.ts +5 -0
- package/dist/providers/engine/types.d.ts +17 -2
- package/dist/providers/engine/types.js +17 -0
- package/dist/providers/executor/composition.d.ts +10 -3
- package/dist/providers/executor/composition.js +47 -7
- package/dist/providers/executor/container.d.ts +361 -8
- package/dist/providers/executor/container.js +1136 -91
- package/dist/providers/executor/dbos-status.d.ts +31 -0
- package/dist/providers/executor/dbos-status.js +64 -0
- package/dist/providers/executor/dbos.d.ts +50 -1
- package/dist/providers/executor/dbos.js +207 -20
- package/dist/providers/executor/deferred.d.ts +12 -24
- package/dist/providers/executor/deferred.js +10 -29
- package/dist/providers/executor/in-process.d.ts +9 -1
- package/dist/providers/executor/in-process.js +14 -4
- package/dist/providers/executor/linked-issue-reader.d.ts +16 -0
- package/dist/providers/executor/linked-issue-reader.js +30 -0
- package/dist/providers/executor/routing.d.ts +2 -0
- package/dist/providers/executor/routing.js +4 -0
- package/dist/providers/executor/types.d.ts +13 -0
- package/dist/providers/index.d.ts +2 -1
- package/dist/providers/issue-tracker/types.d.ts +17 -0
- package/dist/providers/issue-tracker/types.js +39 -1
- package/dist/providers/jobs/claude-tool-setup.d.ts +4 -0
- package/dist/providers/jobs/claude-tool-setup.js +5 -2
- package/dist/providers/jobs/docker-isolation.d.ts +8 -0
- package/dist/providers/jobs/docker-isolation.js +17 -0
- package/dist/providers/jobs/docker.d.ts +1 -0
- package/dist/providers/jobs/docker.js +27 -2
- package/dist/providers/jobs/fake-kubernetes-api.d.ts +2 -0
- package/dist/providers/jobs/fake-kubernetes-api.js +3 -0
- package/dist/providers/jobs/kubernetes-api.d.ts +8 -0
- package/dist/providers/jobs/kubernetes-api.js +10 -0
- package/dist/providers/jobs/kubernetes-client.js +10 -1
- package/dist/providers/jobs/kubernetes-isolation.d.ts +2 -0
- package/dist/providers/jobs/kubernetes-isolation.js +17 -1
- package/dist/providers/jobs/kubernetes.d.ts +6 -1
- package/dist/providers/jobs/kubernetes.js +105 -16
- package/dist/providers/jobs/types.d.ts +33 -0
- package/dist/providers/jobs/types.js +13 -1
- package/dist/providers/llm/anthropic.js +5 -1
- package/dist/providers/llm/bedrock.d.ts +0 -12
- package/dist/providers/llm/bedrock.js +4 -0
- package/dist/providers/llm/claude-messages.d.ts +3 -1
- package/dist/providers/llm/claude-messages.js +4 -1
- package/dist/providers/llm/claude-provider.d.ts +2 -2
- package/dist/providers/llm/claude-provider.js +2 -2
- package/dist/providers/llm/openai.d.ts +2 -2
- package/dist/providers/llm/openai.js +6 -2
- package/dist/providers/llm/routing.d.ts +2 -2
- package/dist/providers/llm/routing.js +2 -2
- package/dist/providers/llm/types.d.ts +12 -2
- package/dist/providers/review-host/github-events.d.ts +9 -1
- package/dist/providers/review-host/github-events.js +34 -12
- package/dist/providers/review-host/github.d.ts +29 -2
- package/dist/providers/review-host/github.js +224 -29
- package/dist/providers/review-host/local.d.ts +8 -4
- package/dist/providers/review-host/local.js +49 -31
- package/dist/providers/review-host/patch-pages.d.ts +41 -0
- package/dist/providers/review-host/patch-pages.js +176 -0
- package/dist/providers/review-host/review-format.d.ts +19 -1
- package/dist/providers/review-host/review-format.js +38 -7
- package/dist/providers/review-host/types.d.ts +134 -2
- package/dist/providers/review-host/types.js +8 -0
- package/dist/providers/storage/gcs.d.ts +63 -0
- package/dist/providers/storage/gcs.js +69 -0
- package/dist/providers/storage/index.d.ts +15 -0
- package/dist/providers/storage/index.js +14 -0
- package/dist/providers/storage/local.d.ts +24 -0
- package/dist/providers/storage/local.js +92 -0
- package/dist/providers/storage/meter.d.ts +14 -0
- package/dist/providers/storage/meter.js +34 -0
- package/dist/providers/storage/s3.d.ts +41 -0
- package/dist/providers/storage/s3.js +107 -0
- package/dist/providers/storage/types.d.ts +37 -3
- package/dist/providers/storage/types.js +21 -4
- package/dist/providers/vcs/git.d.ts +33 -2
- package/dist/providers/vcs/git.js +324 -22
- package/dist/providers/vcs/github-remote.d.ts +26 -3
- package/dist/providers/vcs/github-remote.js +124 -14
- package/dist/providers/vcs/github.d.ts +214 -6
- package/dist/providers/vcs/github.js +447 -45
- package/dist/providers/vcs/index.js +8 -1
- package/dist/providers/vcs/pr-description.d.ts +127 -0
- package/dist/providers/vcs/pr-description.js +270 -0
- package/dist/providers/vcs/remote.d.ts +33 -1
- package/dist/providers/vcs/routing.d.ts +4 -2
- package/dist/providers/vcs/routing.js +6 -0
- package/dist/providers/vcs/types.d.ts +80 -3
- package/dist/quickstart/coding-seed.d.ts +14 -3
- package/dist/quickstart/coding-seed.js +213 -4
- package/dist/quickstart/reviewer-prompt.d.ts +1 -1
- package/dist/quickstart/reviewer-prompt.js +6 -6
- package/dist/quickstart-images.json +1 -1
- package/dist/sandbox/generated/zod.bundle.js +62 -1
- package/dist/sandbox/generated/zod3.bundle.js +5 -0
- package/dist/sandbox/host-functions.d.ts +1 -0
- package/dist/sandbox/host-functions.js +6 -11
- package/dist/sandbox/secret-broker.js +3 -4
- package/dist/sandbox/tool-capabilities.d.ts +10 -30
- package/dist/sandbox/zod-params.d.ts +37 -5
- package/dist/sandbox/zod-params.js +181 -26
- package/dist/serve.js +8 -1
- package/dist/viewer/api-schema.d.ts +349 -2627
- package/dist/viewer/api-schema.js +7 -0
- package/dist/viewer/build-schemas.js +6 -2
- package/dist/viewer/openapi.js +2 -4
- package/dist/wardby-bin.js +10 -0
- package/docs/agent-recipes.md +58 -20
- package/docs/code-review-agents.md +551 -41
- package/docs/coding-agent-setup.md +489 -7
- package/docs/coding-packages.md +1033 -90
- package/docs/coding-services.md +27 -12
- package/docs/coding-worker-byo-images.md +20 -0
- package/docs/coding-worker-isolation.md +105 -30
- package/docs/getting-started-gke.md +124 -137
- package/docs/getting-started-identity-provider.md +10 -1
- package/docs/getting-started.md +9 -0
- package/docs/jira-agents.md +17 -8
- package/docs/knowledge/blob-not-found-semantics.md +41 -0
- package/docs/knowledge/bounded-file-descriptor.md +52 -0
- package/docs/knowledge/delegation-admission-slots.md +52 -0
- package/docs/knowledge/http-dispatcher-bootstrap.md +61 -0
- package/docs/knowledge/import-rename-target.md +52 -0
- package/docs/knowledge/index.md +57 -0
- package/docs/knowledge/log.md +9 -0
- package/docs/knowledge/mcp-cancelled-task-precedence.md +41 -0
- package/docs/knowledge/mcp-http-prompt-discovery.md +41 -0
- package/docs/knowledge/mcp-schema-module-boundary.md +41 -0
- package/docs/knowledge/nullable-tool-uniqueness.md +52 -0
- package/docs/knowledge/overview-cli.md +74 -0
- package/docs/knowledge/overview-coding-proxy.md +72 -0
- package/docs/knowledge/overview-coding.md +72 -0
- package/docs/knowledge/overview-config.md +60 -0
- package/docs/knowledge/overview-core.md +72 -0
- package/docs/knowledge/overview-deploy.md +83 -0
- package/docs/knowledge/overview-mcp.md +61 -0
- package/docs/knowledge/overview-prisma.md +72 -0
- package/docs/knowledge/overview-providers.md +89 -0
- package/docs/knowledge/overview-sandbox.md +83 -0
- package/docs/knowledge/overview-surfaces.md +83 -0
- package/docs/knowledge/private-datastore-shared-boundary.md +54 -0
- package/docs/knowledge/proxy-settlement-projections.md +41 -0
- package/docs/knowledge/run-pricing-first-writer.md +43 -0
- package/docs/knowledge/schedule-claim-transaction.md +41 -0
- package/docs/knowledge/secret-entry-replica-contract.md +52 -0
- package/docs/knowledge/terminal-run-first-writer.md +41 -0
- package/docs/knowledge/transactional-agent-authorization.md +52 -0
- package/docs/knowledge/viewer-notify-write-isolation.md +30 -0
- package/docs/knowledge/warm-input-publication.md +30 -0
- package/docs/knowledge/workspace-staging-failure.md +54 -0
- package/docs/knowledge.md +54 -14
- package/docs/native-sandbox.md +119 -23
- package/docs/observability.md +4 -0
- package/docs/security-deployment.md +33 -2
- package/docs/slack-notifications.md +35 -19
- package/docs/tool-secrets.md +42 -10
- package/docs/viewer-api.openapi.yml +1 -1
- package/help/admin-viewer.md +24 -2
- package/help/architecture-agent.md +11 -6
- package/help/build-worker-image.md +3 -1
- package/help/builder-agent.md +19 -6
- package/help/code-review-agents.md +177 -6
- package/help/coding-packages.md +156 -6
- package/help/cost-attribution.md +9 -5
- package/help/creating-agents.md +14 -1
- package/help/dependency-cache.md +143 -0
- package/help/deploy-gke.md +15 -8
- package/help/errors/budget-exhausted.md +187 -0
- package/help/errors/budget-group-exhausted.md +5 -1
- package/help/errors/coding-stream-quota-exceeded.md +33 -0
- package/help/errors/coding-workspace-disk-exceeds-limit.md +39 -0
- package/help/errors/continuation-closed.md +9 -12
- package/help/errors/delegation-conflict.md +24 -0
- package/help/errors/file-list-truncated.md +45 -0
- package/help/errors/full-read-required.md +49 -0
- package/help/errors/github-account-not-allowed.md +4 -0
- package/help/errors/graph-incomplete.md +43 -0
- package/help/errors/graph-limit.md +43 -0
- package/help/errors/merge-conflict.md +49 -0
- package/help/errors/native-sandbox-gateway-error.md +20 -0
- package/help/errors/native-sandbox-launch-abandoned.md +21 -0
- package/help/errors/native-sandbox-worker-exited.md +3 -2
- package/help/errors/package-not-allowed-pending.md +52 -0
- package/help/errors/package-not-allowed.md +51 -0
- package/help/errors/package-refusals.md +43 -0
- package/help/errors/patch-cursor-malformed.md +31 -0
- package/help/errors/run-lost.md +39 -0
- package/help/errors/run-transcript-download.md +44 -0
- package/help/errors/secret-in-value.md +69 -0
- package/help/errors/target-merge.md +40 -0
- package/help/fix-merge-conflicts.md +73 -0
- package/help/github-app-setup.md +132 -0
- package/help/github.md +22 -0
- package/help/identity-and-access.md +2 -0
- package/help/jira.md +23 -6
- package/help/knowledge.md +16 -7
- package/help/local-repositories.md +1 -1
- package/help/low-power-mode.md +7 -1
- package/help/merge-order-check.md +5 -0
- package/help/native-capabilities.md +29 -1
- package/help/native-sandbox.md +15 -1
- package/help/operating-agents.md +5 -0
- package/help/package-audit-mode.md +91 -0
- package/help/related-pull-requests.md +10 -7
- package/help/resume-runs-locally.md +131 -0
- package/help/review-fix-rounds.md +33 -1
- package/help/sharing-agents.md +59 -0
- package/help/slack-notifications.md +19 -5
- package/help/status-comments.md +31 -0
- package/help/stop-run.md +58 -0
- package/help/troubleshooting/budgets.md +28 -0
- package/help/troubleshooting/coding-workers.md +78 -7
- package/package.json +17 -10
- package/prisma/migrations/20261016000000_registry_approved_accepted_advisories/migration.sql +3 -0
- package/prisma/migrations/20261016000001_mark_ready_when_passing/migration.sql +3 -0
- package/prisma/migrations/20261017000000_debug_trace_max_mb/migration.sql +4 -0
- package/prisma/migrations/20261018000000_dependency_cache/migration.sql +53 -0
- package/prisma/migrations/20261019000000_claude_max_output_tokens/migration.sql +5 -0
- package/prisma/migrations/20261021000000_pr_description_hash/migration.sql +4 -0
- package/prisma/migrations/20261022000000_dependency_snapshot_validation_metadata/migration.sql +4 -0
- package/prisma/migrations/20261023000000_package_audit_mode/migration.sql +27 -0
- package/prisma/migrations/20261024000000_budget_events/migration.sql +26 -0
- package/prisma/migrations/20261025000000_cache_aware_holds/migration.sql +9 -0
- package/prisma/migrations/20261026000000_budget_overrun/migration.sql +4 -0
- package/prisma/migrations/20261027000000_coding_run_request/migration.sql +1 -0
- package/prisma/migrations/20261028000000_native_gateway_review_reads/migration.sql +6 -0
- package/prisma/migrations/20261029000000_lead_survives_deploy/migration.sql +6 -0
- package/prisma/migrations/20261030000000_local_review_covered_sha/migration.sql +2 -0
- package/prisma/migrations/20261031000000_coding_run_budget_limit/migration.sql +9 -0
- package/prisma/migrations/20261101000000_run_transcripts/migration.sql +22 -0
- package/prisma/schema.prisma +311 -97
- package/dist/sandbox/generated/zod-to-json-schema.bundle.js +0 -5
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { PrismaClient } from "#prisma";
|
|
2
|
+
import { type ScheduleState } from "./cron.js";
|
|
3
|
+
/**
|
|
4
|
+
* The `lastScheduledAt` to write with a schedule change: the database's
|
|
5
|
+
* clock when the change starts the schedule (see startsSchedule), nothing
|
|
6
|
+
* otherwise. The database's clock, not this process's, because the CLI and
|
|
7
|
+
* import can run on an operator's machine: a clock running ahead there would
|
|
8
|
+
* record a start after a window the scheduler has yet to fire, and skip it.
|
|
9
|
+
*/
|
|
10
|
+
export declare function scheduleStartFields(db: Pick<PrismaClient, "$queryRaw">, before: ScheduleState | null, after: ScheduleState): Promise<{
|
|
11
|
+
lastScheduledAt: Date;
|
|
12
|
+
} | Record<string, never>>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { startsSchedule } from "./cron.js";
|
|
2
|
+
/**
|
|
3
|
+
* The `lastScheduledAt` to write with a schedule change: the database's
|
|
4
|
+
* clock when the change starts the schedule (see startsSchedule), nothing
|
|
5
|
+
* otherwise. The database's clock, not this process's, because the CLI and
|
|
6
|
+
* import can run on an operator's machine: a clock running ahead there would
|
|
7
|
+
* record a start after a window the scheduler has yet to fire, and skip it.
|
|
8
|
+
*/
|
|
9
|
+
export async function scheduleStartFields(db, before, after) {
|
|
10
|
+
if (!startsSchedule(before, after))
|
|
11
|
+
return {};
|
|
12
|
+
const [{ now }] = await db.$queryRaw `SELECT now() AS now`;
|
|
13
|
+
return { lastScheduledAt: now };
|
|
14
|
+
}
|
|
@@ -1,88 +1,24 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
export declare const MIN_BROKERED_VALUE_LENGTH = 6;
|
|
3
3
|
export declare const SecretBrokerConfigSchema: z.ZodObject<{
|
|
4
|
-
hosts: z.ZodArray<z.
|
|
5
|
-
pathPrefixes: z.ZodOptional<z.ZodArray<z.
|
|
6
|
-
placement: z.ZodDiscriminatedUnion<
|
|
4
|
+
hosts: z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
|
|
5
|
+
pathPrefixes: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
6
|
+
placement: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
7
7
|
kind: z.ZodLiteral<"header">;
|
|
8
|
-
name: z.
|
|
9
|
-
format: z.
|
|
10
|
-
},
|
|
11
|
-
name: string;
|
|
12
|
-
kind: "header";
|
|
13
|
-
format: string;
|
|
14
|
-
}, {
|
|
15
|
-
name: string;
|
|
16
|
-
kind: "header";
|
|
17
|
-
format: string;
|
|
18
|
-
}>, z.ZodObject<{
|
|
8
|
+
name: z.ZodString;
|
|
9
|
+
format: z.ZodString;
|
|
10
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
19
11
|
kind: z.ZodLiteral<"query">;
|
|
20
12
|
name: z.ZodString;
|
|
21
|
-
},
|
|
22
|
-
name: string;
|
|
23
|
-
kind: "query";
|
|
24
|
-
}, {
|
|
25
|
-
name: string;
|
|
26
|
-
kind: "query";
|
|
27
|
-
}>, z.ZodObject<{
|
|
13
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
28
14
|
kind: z.ZodLiteral<"body">;
|
|
29
15
|
field: z.ZodString;
|
|
30
|
-
},
|
|
31
|
-
kind: "body";
|
|
32
|
-
field: string;
|
|
33
|
-
}, {
|
|
34
|
-
kind: "body";
|
|
35
|
-
field: string;
|
|
36
|
-
}>, z.ZodObject<{
|
|
16
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
37
17
|
kind: z.ZodLiteral<"aws-sigv4">;
|
|
38
18
|
region: z.ZodString;
|
|
39
19
|
service: z.ZodString;
|
|
40
|
-
},
|
|
41
|
-
|
|
42
|
-
service: string;
|
|
43
|
-
region: string;
|
|
44
|
-
}, {
|
|
45
|
-
kind: "aws-sigv4";
|
|
46
|
-
service: string;
|
|
47
|
-
region: string;
|
|
48
|
-
}>]>;
|
|
49
|
-
}, "strict", z.ZodTypeAny, {
|
|
50
|
-
hosts: string[];
|
|
51
|
-
placement: {
|
|
52
|
-
name: string;
|
|
53
|
-
kind: "header";
|
|
54
|
-
format: string;
|
|
55
|
-
} | {
|
|
56
|
-
name: string;
|
|
57
|
-
kind: "query";
|
|
58
|
-
} | {
|
|
59
|
-
kind: "body";
|
|
60
|
-
field: string;
|
|
61
|
-
} | {
|
|
62
|
-
kind: "aws-sigv4";
|
|
63
|
-
service: string;
|
|
64
|
-
region: string;
|
|
65
|
-
};
|
|
66
|
-
pathPrefixes?: string[] | undefined;
|
|
67
|
-
}, {
|
|
68
|
-
hosts: string[];
|
|
69
|
-
placement: {
|
|
70
|
-
name: string;
|
|
71
|
-
kind: "header";
|
|
72
|
-
format: string;
|
|
73
|
-
} | {
|
|
74
|
-
name: string;
|
|
75
|
-
kind: "query";
|
|
76
|
-
} | {
|
|
77
|
-
kind: "body";
|
|
78
|
-
field: string;
|
|
79
|
-
} | {
|
|
80
|
-
kind: "aws-sigv4";
|
|
81
|
-
service: string;
|
|
82
|
-
region: string;
|
|
83
|
-
};
|
|
84
|
-
pathPrefixes?: string[] | undefined;
|
|
85
|
-
}>;
|
|
20
|
+
}, z.core.$strict>], "kind">;
|
|
21
|
+
}, z.core.$strict>;
|
|
86
22
|
export type SecretBrokerConfig = z.infer<typeof SecretBrokerConfigSchema>;
|
|
87
23
|
export type SecretBrokerPlacement = SecretBrokerConfig["placement"];
|
|
88
24
|
export declare function parseSecretBrokerConfig(input: unknown): SecretBrokerConfig;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { PrismaClient } from "#prisma";
|
|
2
|
+
import { buildSecretsAccessor } from "./secrets.js";
|
|
3
|
+
export interface NamedSecretValues {
|
|
4
|
+
name: string;
|
|
5
|
+
values: string[];
|
|
6
|
+
}
|
|
7
|
+
type SecretGuardCipher = Parameters<typeof buildSecretsAccessor>[1];
|
|
8
|
+
type SecretGuardDb = Parameters<typeof buildSecretsAccessor>[2] & Pick<PrismaClient, "agentSecret">;
|
|
9
|
+
/** Every secret attached to the agent (readable and brokered), with every form to look for. Rejects if any read fails. */
|
|
10
|
+
export declare function loadAgentSecretValues(db: SecretGuardDb, cipher: SecretGuardCipher, agentId: string): Promise<NamedSecretValues[]>;
|
|
11
|
+
/** The sorted, unique names of the secrets whose value occurs anywhere in `value`. */
|
|
12
|
+
export declare function secretNamesIn(value: unknown, named: readonly NamedSecretValues[]): string[];
|
|
13
|
+
/** The agent-visible refusal: names the secrets, never a value. At most 1000 characters. */
|
|
14
|
+
export declare function secretInValueMessage(names: readonly string[]): string;
|
|
15
|
+
export declare const SECRET_CHECK_UNAVAILABLE_MESSAGE = "secret_check_unavailable: not stored. The agent's secrets could not be read to check this value; try again.";
|
|
16
|
+
export declare const WITHHELD_TEXT_NOTICE = "[withheld: this text could not be checked for secret values]";
|
|
17
|
+
export declare class SecretInValueError extends Error {
|
|
18
|
+
readonly code = "secret_in_value";
|
|
19
|
+
readonly secretNames: string[];
|
|
20
|
+
constructor(names: readonly string[]);
|
|
21
|
+
}
|
|
22
|
+
export declare class SecretCheckUnavailableError extends Error {
|
|
23
|
+
readonly code = "secret_check_unavailable";
|
|
24
|
+
constructor();
|
|
25
|
+
}
|
|
26
|
+
/** `text` with every value of every named secret masked. */
|
|
27
|
+
export declare function maskNamedSecrets(text: string, named: readonly NamedSecretValues[]): string;
|
|
28
|
+
export interface SecretWriteGuard {
|
|
29
|
+
assertNoSecrets(agentId: string, value: unknown): Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
/** Refuses a value holding an attached secret's value; fails closed when the secrets cannot be read. */
|
|
32
|
+
export declare function createSecretWriteGuard(source: {
|
|
33
|
+
load(agentId: string): Promise<NamedSecretValues[]>;
|
|
34
|
+
}): SecretWriteGuard;
|
|
35
|
+
export declare function createDbSecretWriteGuard(db: SecretGuardDb, cipher: SecretGuardCipher): SecretWriteGuard;
|
|
36
|
+
/**
|
|
37
|
+
* Built-in tools whose arguments become text on a host, so their arguments are masked before
|
|
38
|
+
* the call. Review host: repo_publish_review (summary, body, inline comment bodies), repo_comment
|
|
39
|
+
* (body). Jira: jira_comment and jira_edit_own_comment (body), jira_update_fields (labels,
|
|
40
|
+
* components, priority, custom fields), jira_create_issue (summary, description, labels,
|
|
41
|
+
* components, custom fields, fingerprint), jira_set_property (a stored value), jira_transition
|
|
42
|
+
* (toStatus, which Jira may echo in an error). Read tools and jira_link_issues (a link type name
|
|
43
|
+
* checked against an allowlist) are left out.
|
|
44
|
+
*/
|
|
45
|
+
export declare const POSTING_TOOL_NAMES: ReadonlySet<string>;
|
|
46
|
+
export {};
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { MIN_REDACTABLE_SECRET_LENGTH, redactExactSecretValues, withEscapedForms } from "./secret-spans.js";
|
|
2
|
+
import { buildSecretsAccessor } from "./secrets.js";
|
|
3
|
+
import { consoleRedactionValues } from "../sandbox/secret-broker.js";
|
|
4
|
+
/** Every secret attached to the agent (readable and brokered), with every form to look for. Rejects if any read fails. */
|
|
5
|
+
export async function loadAgentSecretValues(db, cipher, agentId) {
|
|
6
|
+
const rows = await db.agentSecret.findMany({ where: { agentId }, select: { boundName: true } });
|
|
7
|
+
if (rows.length === 0)
|
|
8
|
+
return [];
|
|
9
|
+
const accessor = buildSecretsAccessor(agentId, cipher, db);
|
|
10
|
+
return Promise.all(rows.map(async ({ boundName }) => {
|
|
11
|
+
const entry = await accessor.resolve(boundName);
|
|
12
|
+
return { name: boundName, values: entry ? withEscapedForms(consoleRedactionValues(entry)) : [] };
|
|
13
|
+
}));
|
|
14
|
+
}
|
|
15
|
+
function textOf(value) {
|
|
16
|
+
return typeof value === "string" ? value : (JSON.stringify(value) ?? "");
|
|
17
|
+
}
|
|
18
|
+
/** The sorted, unique names of the secrets whose value occurs anywhere in `value`. */
|
|
19
|
+
export function secretNamesIn(value, named) {
|
|
20
|
+
const text = textOf(value);
|
|
21
|
+
const hits = new Set();
|
|
22
|
+
for (const { name, values } of named) {
|
|
23
|
+
if (values.some((v) => v.length >= MIN_REDACTABLE_SECRET_LENGTH && text.includes(v)))
|
|
24
|
+
hits.add(name);
|
|
25
|
+
}
|
|
26
|
+
return [...hits].sort();
|
|
27
|
+
}
|
|
28
|
+
const MAX_MESSAGE_LENGTH = 1000;
|
|
29
|
+
function refusal(names, listed) {
|
|
30
|
+
const shown = names.slice(0, listed).map((n) => JSON.stringify(n));
|
|
31
|
+
const more = names.length - listed;
|
|
32
|
+
const list = shown.join(", ") + (more > 0 ? `, and ${more} more` : "");
|
|
33
|
+
const noun = names.length > 1 ? "secrets" : "secret";
|
|
34
|
+
const first = JSON.stringify(names[0]);
|
|
35
|
+
return `secret_in_value: not stored. The value contains the value of ${noun} ${list} attached to this agent, and secret values are never stored. Store the secret's name instead and read it when you need it: secrets.get(${first}), or fetch(url, { secrets: [${first}] }) if it is brokered.`;
|
|
36
|
+
}
|
|
37
|
+
/** The agent-visible refusal: names the secrets, never a value. At most 1000 characters. */
|
|
38
|
+
export function secretInValueMessage(names) {
|
|
39
|
+
let listed = names.length;
|
|
40
|
+
while (listed > 1 && refusal(names, listed).length > MAX_MESSAGE_LENGTH)
|
|
41
|
+
listed--;
|
|
42
|
+
return refusal(names, listed);
|
|
43
|
+
}
|
|
44
|
+
export const SECRET_CHECK_UNAVAILABLE_MESSAGE = "secret_check_unavailable: not stored. The agent's secrets could not be read to check this value; try again.";
|
|
45
|
+
export const WITHHELD_TEXT_NOTICE = "[withheld: this text could not be checked for secret values]";
|
|
46
|
+
export class SecretInValueError extends Error {
|
|
47
|
+
code = "secret_in_value";
|
|
48
|
+
secretNames;
|
|
49
|
+
constructor(names) {
|
|
50
|
+
super(secretInValueMessage(names));
|
|
51
|
+
this.name = "SecretInValueError";
|
|
52
|
+
this.secretNames = [...names];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export class SecretCheckUnavailableError extends Error {
|
|
56
|
+
code = "secret_check_unavailable";
|
|
57
|
+
constructor() {
|
|
58
|
+
super(SECRET_CHECK_UNAVAILABLE_MESSAGE);
|
|
59
|
+
this.name = "SecretCheckUnavailableError";
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** `text` with every value of every named secret masked. */
|
|
63
|
+
export function maskNamedSecrets(text, named) {
|
|
64
|
+
return redactExactSecretValues(text, named.flatMap((n) => n.values));
|
|
65
|
+
}
|
|
66
|
+
/** Refuses a value holding an attached secret's value; fails closed when the secrets cannot be read. */
|
|
67
|
+
export function createSecretWriteGuard(source) {
|
|
68
|
+
return {
|
|
69
|
+
async assertNoSecrets(agentId, value) {
|
|
70
|
+
let named;
|
|
71
|
+
try {
|
|
72
|
+
named = await source.load(agentId);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
throw new SecretCheckUnavailableError();
|
|
76
|
+
}
|
|
77
|
+
const names = secretNamesIn(value, named);
|
|
78
|
+
if (names.length > 0)
|
|
79
|
+
throw new SecretInValueError(names);
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
export function createDbSecretWriteGuard(db, cipher) {
|
|
84
|
+
return createSecretWriteGuard({ load: (id) => loadAgentSecretValues(db, cipher, id) });
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Built-in tools whose arguments become text on a host, so their arguments are masked before
|
|
88
|
+
* the call. Review host: repo_publish_review (summary, body, inline comment bodies), repo_comment
|
|
89
|
+
* (body). Jira: jira_comment and jira_edit_own_comment (body), jira_update_fields (labels,
|
|
90
|
+
* components, priority, custom fields), jira_create_issue (summary, description, labels,
|
|
91
|
+
* components, custom fields, fingerprint), jira_set_property (a stored value), jira_transition
|
|
92
|
+
* (toStatus, which Jira may echo in an error). Read tools and jira_link_issues (a link type name
|
|
93
|
+
* checked against an allowlist) are left out.
|
|
94
|
+
*/
|
|
95
|
+
export const POSTING_TOOL_NAMES = new Set([
|
|
96
|
+
"repo_publish_review",
|
|
97
|
+
"repo_comment",
|
|
98
|
+
"jira_comment",
|
|
99
|
+
"jira_edit_own_comment",
|
|
100
|
+
"jira_update_fields",
|
|
101
|
+
"jira_create_issue",
|
|
102
|
+
"jira_set_property",
|
|
103
|
+
"jira_transition",
|
|
104
|
+
]);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Datastore } from "../providers/datastore/types.js";
|
|
2
|
+
import type { AgentMemoryStore } from "../providers/memory/types.js";
|
|
3
|
+
import { type SecretWriteGuard } from "./secret-guard.js";
|
|
4
|
+
/**
|
|
5
|
+
* Datastore that refuses a key or value holding an attached secret's value. Shared
|
|
6
|
+
* writes are checked against `opts.writerAgentId`; without it the writer is
|
|
7
|
+
* unknown, so the write is refused (fail closed). `writerAgentId` is stripped
|
|
8
|
+
* before the inner store sees it.
|
|
9
|
+
*/
|
|
10
|
+
export declare function guardDatastore(inner: Datastore, guard: SecretWriteGuard): Datastore;
|
|
11
|
+
/** Agent memory that refuses a key or content holding an attached secret's value. */
|
|
12
|
+
export declare function guardAgentMemory(inner: AgentMemoryStore, guard: SecretWriteGuard): AgentMemoryStore;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { SecretCheckUnavailableError } from "./secret-guard.js";
|
|
2
|
+
/**
|
|
3
|
+
* Datastore that refuses a key or value holding an attached secret's value. Shared
|
|
4
|
+
* writes are checked against `opts.writerAgentId`; without it the writer is
|
|
5
|
+
* unknown, so the write is refused (fail closed). `writerAgentId` is stripped
|
|
6
|
+
* before the inner store sees it.
|
|
7
|
+
*/
|
|
8
|
+
export function guardDatastore(inner, guard) {
|
|
9
|
+
return {
|
|
10
|
+
get: (agentId, key) => inner.get(agentId, key),
|
|
11
|
+
async set(agentId, key, value, opts) {
|
|
12
|
+
await guard.assertNoSecrets(agentId, [key, value]);
|
|
13
|
+
return inner.set(agentId, key, value, opts);
|
|
14
|
+
},
|
|
15
|
+
delete: (agentId, key) => inner.delete(agentId, key),
|
|
16
|
+
list: (agentId, prefix) => inner.list(agentId, prefix),
|
|
17
|
+
getShared: (datastoreId, key) => inner.getShared(datastoreId, key),
|
|
18
|
+
async setShared(datastoreId, key, value, opts) {
|
|
19
|
+
const { writerAgentId, ...rest } = opts ?? {};
|
|
20
|
+
if (!writerAgentId)
|
|
21
|
+
throw new SecretCheckUnavailableError();
|
|
22
|
+
await guard.assertNoSecrets(writerAgentId, [key, value]);
|
|
23
|
+
return inner.setShared(datastoreId, key, value, rest);
|
|
24
|
+
},
|
|
25
|
+
deleteShared: (datastoreId, key) => inner.deleteShared(datastoreId, key),
|
|
26
|
+
listShared: (datastoreId, prefix) => inner.listShared(datastoreId, prefix),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/** Agent memory that refuses a key or content holding an attached secret's value. */
|
|
30
|
+
export function guardAgentMemory(inner, guard) {
|
|
31
|
+
return {
|
|
32
|
+
get: (agentId, key) => inner.get(agentId, key),
|
|
33
|
+
async set(agentId, key, content) {
|
|
34
|
+
await guard.assertNoSecrets(agentId, [key, content]);
|
|
35
|
+
return inner.set(agentId, key, content);
|
|
36
|
+
},
|
|
37
|
+
list: (agentId) => inner.list(agentId),
|
|
38
|
+
search: (agentId, query, limit) => inner.search(agentId, query, limit),
|
|
39
|
+
delete: (agentId, key) => inner.delete(agentId, key),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one redactor for exact secret values: every site that masks values it knows (the sandbox
|
|
3
|
+
* console bridge, the native gateway's log, the native worker's stderr, a brokered response, a
|
|
4
|
+
* coding worker's debug trace, git output) goes through these functions. It masks the union of
|
|
5
|
+
* every occurrence of every value, overlapping occurrences included, so no character of any
|
|
6
|
+
* occurrence survives however occurrences overlap (a value such as `abcabcabc` in `abc` x 5).
|
|
7
|
+
*
|
|
8
|
+
* No imports: every worker image (native sandbox, coding driver, Claude coding worker) ships this
|
|
9
|
+
* file next to its callers.
|
|
10
|
+
*/
|
|
11
|
+
/** Below this length a "secret" is too likely to coincidentally match ordinary log text — not worth the false-positive risk of redacting it. */
|
|
12
|
+
export declare const MIN_REDACTABLE_SECRET_LENGTH = 6;
|
|
13
|
+
/** The marker that stands in for each masked span, unless a site passes its own. */
|
|
14
|
+
export declare const REDACTED_MARKER = "[REDACTED]";
|
|
15
|
+
export interface RedactOptions {
|
|
16
|
+
/** Replaces each merged span (default REDACTED_MARKER). */
|
|
17
|
+
marker?: string;
|
|
18
|
+
/** Values shorter than this are left alone (default MIN_REDACTABLE_SECRET_LENGTH; an empty value never matches). */
|
|
19
|
+
minLength?: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Each value plus its JSON-escaped forms, deduplicated: escaped once (`JSON.stringify(v).slice(1, -1)`)
|
|
23
|
+
* and twice. A value holding a quote, a backslash, a newline or a control character appears escaped
|
|
24
|
+
* once inside JSON text (a console line, a log line), and twice when that JSON text is itself
|
|
25
|
+
* logged as a string (`console.log(JSON.stringify({ key: value }))` through the console bridge, or
|
|
26
|
+
* a logger field that already holds JSON). The one expansion every redaction list goes through.
|
|
27
|
+
*/
|
|
28
|
+
export declare function withEscapedForms(values: Iterable<string>): string[];
|
|
29
|
+
/**
|
|
30
|
+
* The merged, sorted [start, end) spans of `text` covered by any occurrence of any value, overlapping
|
|
31
|
+
* occurrences included (the search advances by one character, not by the value's length), so a
|
|
32
|
+
* self-overlapping value is covered wherever any occurrence of it lies. Values shorter than
|
|
33
|
+
* `minLength` are ignored. Overlapping or adjacent spans merge.
|
|
34
|
+
*/
|
|
35
|
+
export declare function secretSpans(text: string, values: Iterable<string>, minLength?: number): Array<[number, number]>;
|
|
36
|
+
/** `spans` sorted and merged, overlapping or adjacent ones joined. */
|
|
37
|
+
export declare function mergeSpans(spans: ReadonlyArray<readonly [number, number]>): Array<[number, number]>;
|
|
38
|
+
/** `text` with each of the merged, sorted `spans` replaced by one `marker`. */
|
|
39
|
+
export declare function maskSpans(text: string, spans: ReadonlyArray<readonly [number, number]>, marker?: string): string;
|
|
40
|
+
/**
|
|
41
|
+
* `text` with the union of every occurrence of each value (secretSpans) replaced by the marker;
|
|
42
|
+
* values shorter than the minimum length are left alone.
|
|
43
|
+
*/
|
|
44
|
+
export declare function redactExactSecretValues(text: string, values: Iterable<string>, options?: RedactOptions): string;
|
|
45
|
+
/**
|
|
46
|
+
* Whether `text` equals, contains, or is contained in any of `values`, under the same minimum
|
|
47
|
+
* length as redactExactSecretValues. For a short field that is sent whole or not at all (a native
|
|
48
|
+
* gateway error's cause code), where redacting part of it would still leave part of a value.
|
|
49
|
+
*/
|
|
50
|
+
export declare function overlapsSecretValue(text: string, values: Iterable<string>): boolean;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one redactor for exact secret values: every site that masks values it knows (the sandbox
|
|
3
|
+
* console bridge, the native gateway's log, the native worker's stderr, a brokered response, a
|
|
4
|
+
* coding worker's debug trace, git output) goes through these functions. It masks the union of
|
|
5
|
+
* every occurrence of every value, overlapping occurrences included, so no character of any
|
|
6
|
+
* occurrence survives however occurrences overlap (a value such as `abcabcabc` in `abc` x 5).
|
|
7
|
+
*
|
|
8
|
+
* No imports: every worker image (native sandbox, coding driver, Claude coding worker) ships this
|
|
9
|
+
* file next to its callers.
|
|
10
|
+
*/
|
|
11
|
+
/** Below this length a "secret" is too likely to coincidentally match ordinary log text — not worth the false-positive risk of redacting it. */
|
|
12
|
+
export const MIN_REDACTABLE_SECRET_LENGTH = 6;
|
|
13
|
+
/** The marker that stands in for each masked span, unless a site passes its own. */
|
|
14
|
+
export const REDACTED_MARKER = "[REDACTED]";
|
|
15
|
+
/** `text` as it appears inside a JSON string literal (JSON.stringify without the quotes). */
|
|
16
|
+
const jsonEscaped = (text) => JSON.stringify(text).slice(1, -1);
|
|
17
|
+
/**
|
|
18
|
+
* Each value plus its JSON-escaped forms, deduplicated: escaped once (`JSON.stringify(v).slice(1, -1)`)
|
|
19
|
+
* and twice. A value holding a quote, a backslash, a newline or a control character appears escaped
|
|
20
|
+
* once inside JSON text (a console line, a log line), and twice when that JSON text is itself
|
|
21
|
+
* logged as a string (`console.log(JSON.stringify({ key: value }))` through the console bridge, or
|
|
22
|
+
* a logger field that already holds JSON). The one expansion every redaction list goes through.
|
|
23
|
+
*/
|
|
24
|
+
export function withEscapedForms(values) {
|
|
25
|
+
const out = new Set();
|
|
26
|
+
for (const value of values) {
|
|
27
|
+
const once = jsonEscaped(value);
|
|
28
|
+
out.add(value);
|
|
29
|
+
out.add(once);
|
|
30
|
+
out.add(jsonEscaped(once));
|
|
31
|
+
}
|
|
32
|
+
return [...out];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* The merged, sorted [start, end) spans of `text` covered by any occurrence of any value, overlapping
|
|
36
|
+
* occurrences included (the search advances by one character, not by the value's length), so a
|
|
37
|
+
* self-overlapping value is covered wherever any occurrence of it lies. Values shorter than
|
|
38
|
+
* `minLength` are ignored. Overlapping or adjacent spans merge.
|
|
39
|
+
*/
|
|
40
|
+
export function secretSpans(text, values, minLength = MIN_REDACTABLE_SECRET_LENGTH) {
|
|
41
|
+
const spans = [];
|
|
42
|
+
const shortest = Math.max(1, minLength);
|
|
43
|
+
for (const value of new Set(values)) {
|
|
44
|
+
if (value.length < shortest)
|
|
45
|
+
continue;
|
|
46
|
+
for (let at = text.indexOf(value); at >= 0; at = text.indexOf(value, at + 1))
|
|
47
|
+
spans.push([at, at + value.length]);
|
|
48
|
+
}
|
|
49
|
+
return mergeSpans(spans);
|
|
50
|
+
}
|
|
51
|
+
/** `spans` sorted and merged, overlapping or adjacent ones joined. */
|
|
52
|
+
export function mergeSpans(spans) {
|
|
53
|
+
const sorted = spans.filter(([start, end]) => end > start).sort((a, b) => a[0] - b[0] || a[1] - b[1]);
|
|
54
|
+
const merged = [];
|
|
55
|
+
for (const [start, end] of sorted) {
|
|
56
|
+
const last = merged[merged.length - 1];
|
|
57
|
+
if (last && start <= last[1])
|
|
58
|
+
last[1] = Math.max(last[1], end);
|
|
59
|
+
else
|
|
60
|
+
merged.push([start, end]);
|
|
61
|
+
}
|
|
62
|
+
return merged;
|
|
63
|
+
}
|
|
64
|
+
/** `text` with each of the merged, sorted `spans` replaced by one `marker`. */
|
|
65
|
+
export function maskSpans(text, spans, marker = REDACTED_MARKER) {
|
|
66
|
+
let out = "";
|
|
67
|
+
let from = 0;
|
|
68
|
+
for (const [start, end] of spans) {
|
|
69
|
+
out += `${text.slice(from, start)}${marker}`;
|
|
70
|
+
from = end;
|
|
71
|
+
}
|
|
72
|
+
return out + text.slice(from);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* `text` with the union of every occurrence of each value (secretSpans) replaced by the marker;
|
|
76
|
+
* values shorter than the minimum length are left alone.
|
|
77
|
+
*/
|
|
78
|
+
export function redactExactSecretValues(text, values, options = {}) {
|
|
79
|
+
return maskSpans(text, secretSpans(text, values, options.minLength), options.marker);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Whether `text` equals, contains, or is contained in any of `values`, under the same minimum
|
|
83
|
+
* length as redactExactSecretValues. For a short field that is sent whole or not at all (a native
|
|
84
|
+
* gateway error's cause code), where redacting part of it would still leave part of a value.
|
|
85
|
+
*/
|
|
86
|
+
export function overlapsSecretValue(text, values) {
|
|
87
|
+
for (const value of values) {
|
|
88
|
+
if (value.length < MIN_REDACTABLE_SECRET_LENGTH)
|
|
89
|
+
continue;
|
|
90
|
+
if (text.includes(value) || value.includes(text))
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
@@ -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
|
+
}
|
|
@@ -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}`,
|