@sema-agent/server 7.147.0 → 7.148.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/MIGRATION.md +1039 -24
- package/README.md +20 -7
- package/README.zh-CN.md +14 -8
- package/USAGE.md +380 -163
- package/deploy/sema-up/README.md +16 -5
- package/deploy/sema-up/chart/templates/NOTES.txt +1 -1
- package/deploy/sema-up/chart/templates/_helpers.tpl +20 -4
- package/deploy/sema-up/chart/values.yaml +3 -2
- package/deploy/sema-up/cluster-up.sh +74 -176
- package/deploy/sema-up/kube-up.sh +29 -49
- package/deploy/sema-up/lib/chart-run.sh +23 -0
- package/deploy/sema-up/lib/dataroot.sh +3 -3
- package/deploy/sema-up/lib/health.sh +62 -13
- package/deploy/sema-up/lib/helm-values-cluster.py +18 -0
- package/deploy/sema-up/lib/helm-values-kube.py +35 -0
- package/deploy/sema-up/lib/regcred.py +8 -0
- package/deploy/sema-up/lib/remote/helm-install.sh +3 -0
- package/deploy/sema-up/lib/remote/image-import.sh +6 -0
- package/deploy/sema-up/lib/remote/machine-precheck.sh +11 -0
- package/deploy/sema-up/lib/remote/region-probe.sh +3 -0
- package/deploy/sema-up/lib/remote/stack-ready.sh +26 -0
- package/deploy/sema-up/lib/remote/vxlan-guard.sh +8 -0
- package/deploy/sema-up/lib/render-stack.py +17 -0
- package/deploy/sema-up/lib/shell-text.sh +87 -0
- package/deploy/sema-up/lib/usage-flags.txt +10 -0
- package/deploy/sema-up/lib/usage-head.txt +1 -0
- package/deploy/sema-up/lib/usage-tail.txt +13 -0
- package/deploy/sema-up/preflight.sh +10 -8
- package/deploy/sema-up/sema-up.sh +14 -39
- package/deploy/sema-up/smoke.sh +7 -6
- package/deploy/sema-up/stack/compose.dataroot.yaml +3 -0
- package/deploy/sema-up/stack/compose.yaml +13 -1
- package/deploy/sema-up/stack/sema-stack-cluster.yaml +21 -0
- package/dist/adoption/plan.d.ts +24 -0
- package/dist/adoption/plan.js +53 -1
- package/dist/adoption/runner.d.ts +10 -1
- package/dist/adoption/runner.js +36 -16
- package/dist/adoption/wire.d.ts +3 -3
- package/dist/approval-card.d.ts +28 -30
- package/dist/approval-gate-currency.js +3 -2
- package/dist/approval-reconciler.d.ts +4 -13
- package/dist/approval-reconciler.js +2 -2
- package/dist/approval.d.ts +13 -11
- package/dist/approval.js +3 -3
- package/dist/audit.d.ts +10 -3
- package/dist/audit.js +15 -7
- package/dist/auth-bridge.d.ts +0 -14
- package/dist/auth-bridge.js +0 -7
- package/dist/auto-mode-face.d.ts +10 -7
- package/dist/auto-mode-face.js +7 -4
- package/dist/background-agent-name.d.ts +19 -1
- package/dist/background-agent-name.js +12 -2
- package/dist/background-session-reap.d.ts +1 -1
- package/dist/bake-runner/main.js +9 -6
- package/dist/bench/s1/arms.js +6 -5
- package/dist/bench/s1/live-deps.js +5 -2
- package/dist/bench/s1/run-firm.js +6 -5
- package/dist/bind-host.d.ts +25 -0
- package/dist/bind-host.js +25 -0
- package/dist/boot/adoption.d.ts +3 -0
- package/dist/boot/adoption.js +1 -0
- package/dist/boot/deployment-mods.d.ts +1 -1
- package/dist/boot/execution-env.d.ts +17 -7
- package/dist/boot/execution-env.js +37 -31
- package/dist/boot/exit-boundary.d.ts +2 -2
- package/dist/boot/exit-boundary.js +6 -5
- package/dist/boot/fatal-exit.d.ts +3 -5
- package/dist/boot/fatal-exit.js +2 -2
- package/dist/boot/leader.d.ts +15 -0
- package/dist/boot/leader.js +17 -15
- package/dist/boot/memory-consolidation.d.ts +37 -29
- package/dist/boot/memory-consolidation.js +11 -5
- package/dist/boot/org-memory.js +1 -1
- package/dist/boot/parked-revive-gate.js +2 -2
- package/dist/boot/reapers.d.ts +4 -3
- package/dist/boot/reapers.js +19 -16
- package/dist/boot/resolve-spec.d.ts +5 -3
- package/dist/boot/resolve-spec.js +55 -67
- package/dist/boot/retention-lane.d.ts +4 -4
- package/dist/boot/retention-lane.js +2 -2
- package/dist/boot/runner-deps.d.ts +28 -7
- package/dist/boot/runner-deps.js +11 -4
- package/dist/boot/runtime-caps.d.ts +2 -2
- package/dist/boot/runtime-caps.js +16 -2
- package/dist/boot/session-faces.d.ts +16 -7
- package/dist/boot/session-faces.js +114 -94
- package/dist/boot/shutdown.d.ts +5 -4
- package/dist/boot/shutdown.js +6 -4
- package/dist/boot/stage-01-config.js +9 -1
- package/dist/boot/stage-02-web-admin-pull.d.ts +1 -0
- package/dist/boot/stage-02-web-admin-pull.js +6 -1
- package/dist/boot/stage-03-store-backend.d.ts +3 -0
- package/dist/boot/stage-03-store-backend.js +4 -3
- package/dist/boot/stage-04-stores.d.ts +2 -0
- package/dist/boot/stage-04-stores.js +2 -2
- package/dist/boot/stage-05-execution-env.d.ts +7 -3
- package/dist/boot/stage-05-execution-env.js +2 -2
- package/dist/boot/stage-06-runners.d.ts +10 -12
- package/dist/boot/stage-06-runners.js +23 -15
- package/dist/boot/stage-07-capability-layer.d.ts +11 -8
- package/dist/boot/stage-07-capability-layer.js +5 -3
- package/dist/boot/stage-08-reapers.d.ts +11 -8
- package/dist/boot/stage-08-reapers.js +3 -3
- package/dist/boot/stage-09-leader.d.ts +12 -15
- package/dist/boot/stage-09-leader.js +12 -4
- package/dist/boot/stage-10-http-server.d.ts +12 -15
- package/dist/boot/stage-10-http-server.js +7 -4
- package/dist/boot/store-evidence.d.ts +20 -0
- package/dist/boot/store-evidence.js +13 -0
- package/dist/boot/stores.d.ts +3 -0
- package/dist/boot/stores.js +21 -10
- package/dist/boot/task-list-lane.d.ts +4 -4
- package/dist/boot/web-admin.d.ts +4 -2
- package/dist/boot/web-admin.js +55 -35
- package/dist/boot/webfetch-summarize-lane.d.ts +1 -1
- package/dist/boot-reclaim.d.ts +3 -1
- package/dist/boot-reclaim.js +1 -1
- package/dist/brain.d.ts +7 -18
- package/dist/brain.js +5 -17
- package/dist/budget.js +6 -6
- package/dist/capabilities/center-plugins.d.ts +7 -1
- package/dist/capabilities/center-plugins.js +32 -10
- package/dist/capabilities/center-wiring.js +1 -1
- package/dist/capabilities/composite-members.d.ts +2 -2
- package/dist/capabilities/composite-members.js +2 -2
- package/dist/capabilities/repo-tools.d.ts +2 -0
- package/dist/capabilities/repo-tools.js +14 -12
- package/dist/capabilities/scenarios.d.ts +6 -15
- package/dist/capabilities/scenarios.js +11 -16
- package/dist/capabilities/skills.d.ts +1 -1
- package/dist/capabilities/tool-defer.d.ts +1 -1
- package/dist/capability-facts.d.ts +38 -11
- package/dist/capability-facts.js +47 -8
- package/dist/card-void.d.ts +4 -4
- package/dist/card-void.js +1 -1
- package/dist/center-credential-renewer.d.ts +6 -2
- package/dist/center-credential-renewer.js +7 -3
- package/dist/config-catalog.d.ts +16 -1
- package/dist/config-catalog.js +62 -56
- package/dist/config-dir-trust.d.ts +37 -4
- package/dist/config-dir-trust.js +88 -44
- package/dist/config-invariants.d.ts +42 -3
- package/dist/config-invariants.js +69 -5
- package/dist/config-lkg.d.ts +23 -1
- package/dist/config-lkg.js +17 -3
- package/dist/config-provider.d.ts +9 -9
- package/dist/config-provider.js +25 -110
- package/dist/config-pull-failure.d.ts +50 -0
- package/dist/config-pull-failure.js +48 -0
- package/dist/config-types.d.ts +26 -17
- package/dist/config.d.ts +8 -16
- package/dist/config.js +113 -47
- package/dist/delegated-session-owner.d.ts +1 -1
- package/dist/deleted-session-ids.d.ts +3 -2
- package/dist/deployment-governance.d.ts +3 -3
- package/dist/deployment-shape.d.ts +30 -4
- package/dist/deployment-shape.js +7 -0
- package/dist/egress-redirect.d.ts +25 -7
- package/dist/egress-redirect.js +20 -2
- package/dist/elicitation.d.ts +6 -5
- package/dist/elicitation.js +23 -22
- package/dist/engine-identity.d.ts +28 -0
- package/dist/engine-identity.js +10 -0
- package/dist/entry-problems.d.ts +5 -7
- package/dist/entry-problems.js +1 -1
- package/dist/env-facts.js +2 -1
- package/dist/env-witness.d.ts +7 -0
- package/dist/env-witness.js +16 -0
- package/dist/execution-lane-caps.d.ts +5 -18
- package/dist/execution-lane-caps.js +0 -22
- package/dist/execution-placement.d.ts +58 -18
- package/dist/execution-placement.js +41 -2
- package/dist/field-conflict.d.ts +7 -11
- package/dist/field-conflict.js +3 -3
- package/dist/file-history-capture.d.ts +3 -3
- package/dist/file-history-disclosure.js +1 -0
- package/dist/fleet/fleet-bus.d.ts +21 -3
- package/dist/fleet/fleet-bus.js +35 -25
- package/dist/fleet/fleet-reconciler.js +2 -2
- package/dist/fleet/serving-lease.js +3 -3
- package/dist/fleet-client.js +3 -3
- package/dist/fleet-lease.d.ts +0 -1
- package/dist/fleet-lease.js +4 -5
- package/dist/history-anchor.d.ts +23 -3
- package/dist/history-anchor.js +24 -4
- package/dist/hitl-delivery.d.ts +90 -0
- package/dist/hitl-delivery.js +98 -0
- package/dist/hooks/classic-stations.d.ts +8 -11
- package/dist/hooks/classic-stations.js +0 -7
- package/dist/hooks/hook-llm.d.ts +5 -1
- package/dist/hooks/hook-llm.js +24 -15
- package/dist/hooks/hook-runner.d.ts +67 -57
- package/dist/hooks/hook-runner.js +260 -186
- package/dist/host-lsp-manager.d.ts +22 -8
- package/dist/host-lsp-manager.js +4 -1
- package/dist/http/active-run-conflict.d.ts +2 -43
- package/dist/http/active-run-conflict.js +3 -7
- package/dist/http/admission.d.ts +4 -18
- package/dist/http/admission.js +75 -78
- package/dist/http/approval-sweeps.d.ts +3 -3
- package/dist/http/approval-sweeps.js +54 -30
- package/dist/http/caller-trust.d.ts +8 -10
- package/dist/http/caller-trust.js +1 -2
- package/dist/http/claim-heartbeat.d.ts +49 -0
- package/dist/http/claim-heartbeat.js +46 -0
- package/dist/http/claimed-run.d.ts +4 -3
- package/dist/http/dispatch.d.ts +8 -1
- package/dist/http/dispatch.js +76 -30
- package/dist/http/durable-run-leg.d.ts +3 -3
- package/dist/http/durable-run-leg.js +17 -12
- package/dist/http/execution-context.d.ts +17 -43
- package/dist/http/execution-context.js +7 -5
- package/dist/http/health-reader.d.ts +36 -0
- package/dist/http/health-reader.js +21 -0
- package/dist/http/health-self-report.d.ts +9 -9
- package/dist/http/health-self-report.js +4 -4
- package/dist/http/idempotency.d.ts +9 -5
- package/dist/http/idempotency.js +4 -4
- package/dist/http/memory-compliance-failure-reply.d.ts +15 -16
- package/dist/http/memory-compliance-failure-reply.js +4 -2
- package/dist/http/memory-face-fault-reply.d.ts +67 -0
- package/dist/http/memory-face-fault-reply.js +71 -0
- package/dist/http/memory-store-refusal-reply.d.ts +1 -1
- package/dist/http/memory-store-refusal-reply.js +3 -0
- package/dist/http/owner-access.d.ts +391 -67
- package/dist/http/owner-access.js +371 -35
- package/dist/http/principal-gate.d.ts +24 -81
- package/dist/http/principal-gate.js +24 -68
- package/dist/http/refusal-body.d.ts +35 -2
- package/dist/http/refusal-body.js +34 -0
- package/dist/http/request-guards.d.ts +9 -13
- package/dist/http/request-guards.js +34 -68
- package/dist/http/resume-composition.d.ts +37 -0
- package/dist/http/resume-composition.js +18 -0
- package/dist/http/resume-ctx-read.d.ts +35 -12
- package/dist/http/resume-ctx-read.js +25 -6
- package/dist/http/resume-legs.d.ts +21 -18
- package/dist/http/resume-legs.js +189 -129
- package/dist/http/retired-skill-manifest.d.ts +1 -1
- package/dist/http/route-ctx.d.ts +25 -32
- package/dist/http/routes/a2a-serve.d.ts +43 -5
- package/dist/http/routes/a2a-serve.js +58 -37
- package/dist/http/routes/admin-config-refresh.js +2 -2
- package/dist/http/routes/admin-drain.js +2 -2
- package/dist/http/routes/admin-memory-optout.js +4 -3
- package/dist/http/routes/adoption.d.ts +3 -0
- package/dist/http/routes/adoption.js +17 -10
- package/dist/http/routes/agents-roster.js +13 -7
- package/dist/http/routes/approvals-assistant.js +70 -65
- package/dist/http/routes/attachments.js +2 -2
- package/dist/http/routes/background.d.ts +3 -3
- package/dist/http/routes/background.js +9 -17
- package/dist/http/routes/capabilities.js +15 -18
- package/dist/http/routes/config-catalog.js +2 -2
- package/dist/http/routes/devices.d.ts +3 -3
- package/dist/http/routes/devices.js +4 -4
- package/dist/http/routes/diagnostics.d.ts +27 -3
- package/dist/http/routes/diagnostics.js +27 -21
- package/dist/http/routes/engine.js +2 -2
- package/dist/http/routes/fleet.js +5 -3
- package/dist/http/routes/images.js +10 -6
- package/dist/http/routes/leader.d.ts +7 -2
- package/dist/http/routes/leader.js +12 -3
- package/dist/http/routes/mcp-reconnect.d.ts +1 -1
- package/dist/http/routes/mcp-reconnect.js +7 -15
- package/dist/http/routes/memory-bundle.js +4 -7
- package/dist/http/routes/memory-compliance.js +4 -4
- package/dist/http/routes/memory-consolidation.js +6 -9
- package/dist/http/routes/memory-origin.d.ts +2 -0
- package/dist/http/routes/memory-origin.js +7 -8
- package/dist/http/routes/memory-policy.js +17 -12
- package/dist/http/routes/notify-wake.js +10 -19
- package/dist/http/routes/observability.js +3 -3
- package/dist/http/routes/principal-inbox.d.ts +1 -1
- package/dist/http/routes/principal-inbox.js +2 -2
- package/dist/http/routes/projects.d.ts +1 -1
- package/dist/http/routes/projects.js +3 -2
- package/dist/http/routes/retention-ops.js +6 -9
- package/dist/http/routes/rules.js +20 -5
- package/dist/http/routes/run-memory-capture.d.ts +2 -2
- package/dist/http/routes/run-memory-capture.js +6 -12
- package/dist/http/routes/run-permission-mode.d.ts +2 -2
- package/dist/http/routes/run-permission-mode.js +10 -17
- package/dist/http/routes/runs.js +146 -231
- package/dist/http/routes/session-memory-sync.d.ts +2 -2
- package/dist/http/routes/session-memory-sync.js +7 -13
- package/dist/http/routes/session-sync.d.ts +4 -2
- package/dist/http/routes/session-sync.js +21 -20
- package/dist/http/routes/sessions-list.d.ts +3 -3
- package/dist/http/routes/sessions-list.js +9 -9
- package/dist/http/routes/sessions.js +87 -124
- package/dist/http/routes/shared-memory.js +6 -6
- package/dist/http/routes/side-query.js +2 -2
- package/dist/http/routes/tasks.js +136 -120
- package/dist/http/routes/trace-usage.d.ts +0 -12
- package/dist/http/routes/trace-usage.js +40 -46
- package/dist/http/routes/workflows.d.ts +39 -4
- package/dist/http/routes/workflows.js +42 -14
- package/dist/http/run-concurrency-cap.d.ts +20 -12
- package/dist/http/run-concurrency-cap.js +39 -26
- package/dist/http/run-read-face.d.ts +3 -5
- package/dist/http/run-read-face.js +8 -13
- package/dist/http/send.d.ts +12 -3
- package/dist/http/send.js +42 -6
- package/dist/http/server.d.ts +39 -40
- package/dist/http/server.js +36 -11
- package/dist/http/sse-log.d.ts +17 -10
- package/dist/http/sse-log.js +7 -7
- package/dist/http/stored-body-replay.d.ts +12 -0
- package/dist/http/stored-body-replay.js +2 -2
- package/dist/http/submit-ctx.d.ts +16 -8
- package/dist/http/submit-ctx.js +6 -2
- package/dist/http/submit-replay.d.ts +19 -6
- package/dist/http/submit-replay.js +18 -6
- package/dist/http/sync-submit-body.d.ts +3 -4
- package/dist/http/sync-submit-body.js +4 -5
- package/dist/http/wire-types.d.ts +4 -3
- package/dist/identity-source.d.ts +36 -5
- package/dist/identity-source.js +27 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/key-resolver.d.ts +32 -0
- package/dist/key-resolver.js +23 -9
- package/dist/leader/diffup.js +2 -1
- package/dist/leader/endpoint.d.ts +26 -5
- package/dist/leader/endpoint.js +154 -14
- package/dist/leader/fanout.d.ts +3 -0
- package/dist/leader/fanout.js +78 -63
- package/dist/leader/leader.d.ts +16 -0
- package/dist/leader/leader.js +43 -3
- package/dist/leader/merge.d.ts +9 -1
- package/dist/leader/merge.js +16 -1
- package/dist/leader/repair-wire.js +1 -1
- package/dist/leader/wire.d.ts +36 -3
- package/dist/leader/wire.js +59 -18
- package/dist/lsp-evict.d.ts +6 -4
- package/dist/lsp-evict.js +2 -3
- package/dist/memory-operator-faces.d.ts +5 -4
- package/dist/memory-operator-faces.js +1 -1
- package/dist/memory-scope.d.ts +29 -2
- package/dist/memory-scope.js +64 -15
- package/dist/memory-store-refusal.d.ts +5 -2
- package/dist/memory-sync-client.d.ts +3 -2
- package/dist/memory-sync-client.js +6 -3
- package/dist/model-compat.d.ts +17 -8
- package/dist/model-compat.js +6 -2
- package/dist/model-context-window.d.ts +18 -0
- package/dist/model-context-window.js +2 -0
- package/dist/model-entry-headers.d.ts +46 -4
- package/dist/model-entry-headers.js +2 -2
- package/dist/model-entry-refusal.d.ts +35 -16
- package/dist/model-entry-refusal.js +40 -27
- package/dist/model-plane-face.d.ts +19 -11
- package/dist/model-plane-face.js +9 -1
- package/dist/model-plane-probe.d.ts +2 -0
- package/dist/model-plane-probe.js +17 -0
- package/dist/model-provider.d.ts +3 -3
- package/dist/model-route-endpoint.d.ts +9 -5
- package/dist/model-route-endpoint.js +29 -7
- package/dist/model-select.d.ts +16 -0
- package/dist/model-select.js +4 -0
- package/dist/mountinfo.d.ts +37 -0
- package/dist/mountinfo.js +47 -0
- package/dist/namespaced-rule-name.d.ts +23 -14
- package/dist/namespaced-rule-name.js +8 -11
- package/dist/net-address.d.ts +1 -1
- package/dist/observability/corrupt-read-seat.d.ts +4 -4
- package/dist/observability/corrupt-read-seat.js +5 -3
- package/dist/observability/fail-open.d.ts +58 -38
- package/dist/observability/fail-open.js +60 -38
- package/dist/observability/logger.d.ts +22 -1
- package/dist/observability/logger.js +89 -12
- package/dist/observability/metrics.js +3 -4
- package/dist/observability/otel-exporter.js +2 -1
- package/dist/observability/principal-context.d.ts +14 -7
- package/dist/observability/principal-context.js +8 -3
- package/dist/observability/run-terminal.d.ts +7 -1
- package/dist/observability/run-terminal.js +5 -2
- package/dist/orchestration/hardened-vm-runner.d.ts +1 -0
- package/dist/orchestration/hardened-vm-runner.js +11 -5
- package/dist/orchestration/hardened-vm-worker-runner.d.ts +0 -14
- package/dist/orchestration/hardened-vm-worker-runner.js +5 -0
- package/dist/orchestration/hardened-vm-worker.js +2 -1
- package/dist/orchestration/workflow-completion-inbox.d.ts +3 -3
- package/dist/orchestration/workflow-completion-inbox.js +3 -2
- package/dist/org-delivery-gate.d.ts +5 -4
- package/dist/org-delivery-gate.js +7 -6
- package/dist/outbound-dispatcher.d.ts +1 -1
- package/dist/outbound-dispatcher.js +6 -12
- package/dist/owner-brands.d.ts +81 -0
- package/dist/owner-brands.js +42 -0
- package/dist/owner-faces.d.ts +531 -0
- package/dist/owner-faces.js +126 -0
- package/dist/parked-decide.d.ts +67 -5
- package/dist/parked-decide.js +127 -5
- package/dist/parked-revive-surface.d.ts +14 -4
- package/dist/parked-revive-surface.js +5 -4
- package/dist/peer-directory.d.ts +6 -8
- package/dist/peer-directory.js +3 -2
- package/dist/permission-rule-vocab.d.ts +53 -8
- package/dist/permission-rule-vocab.js +30 -2
- package/dist/plugins/adoption-log-sql.d.ts +0 -22
- package/dist/plugins/adoption-log-sql.js +5 -3
- package/dist/plugins/approval-ask-retired-delete-by-task-m50.d.ts +7 -0
- package/dist/plugins/approval-ask-retired-delete-by-task-m50.js +17 -0
- package/dist/plugins/approval-ask-store-file.d.ts +18 -7
- package/dist/plugins/approval-ask-store-file.js +37 -14
- package/dist/plugins/approval-ask-store-memory.d.ts +12 -4
- package/dist/plugins/approval-ask-store-memory.js +24 -10
- package/dist/plugins/approval-ask-store-sql.d.ts +39 -20
- package/dist/plugins/approval-ask-store-sql.js +41 -10
- package/dist/plugins/approval-exemption-skill-m46.d.ts +20 -0
- package/dist/plugins/approval-exemption-skill-m46.js +25 -0
- package/dist/plugins/approval-exemption-store.d.ts +6 -1
- package/dist/plugins/approval-exemption-store.js +14 -0
- package/dist/plugins/approval-nonce-store.d.ts +39 -12
- package/dist/plugins/approval-nonce-store.js +72 -23
- package/dist/plugins/blob-backend.d.ts +2 -0
- package/dist/plugins/blob-backend.js +9 -6
- package/dist/plugins/caching-session-store.d.ts +13 -1
- package/dist/plugins/caching-session-store.js +43 -4
- package/dist/plugins/checkpoint-index-columns.d.ts +32 -5
- package/dist/plugins/checkpoint-index-columns.js +36 -1
- package/dist/plugins/checkpoint-store-face.d.ts +83 -10
- package/dist/plugins/checkpoint-store-face.js +18 -1
- package/dist/plugins/device-store-sql.js +1 -0
- package/dist/plugins/ensure-index.d.ts +13 -1
- package/dist/plugins/ensure-index.js +154 -21
- package/dist/plugins/ensure-schema-lock-policy.d.ts +0 -15
- package/dist/plugins/ensure-schema-lock-policy.js +3 -2
- package/dist/plugins/file-run-store.d.ts +63 -23
- package/dist/plugins/file-run-store.js +138 -83
- package/dist/plugins/host-platform.d.ts +24 -3
- package/dist/plugins/host-platform.js +15 -1
- package/dist/plugins/image-bake-store-sql.js +2 -0
- package/dist/plugins/imported-layer-root-retirement.d.ts +2 -2
- package/dist/plugins/k8s-pod-reaper.d.ts +1 -3
- package/dist/plugins/k8s-pod-reaper.js +0 -1
- package/dist/plugins/leader-run-store-sql.d.ts +22 -0
- package/dist/plugins/leader-run-store-sql.js +34 -4
- package/dist/plugins/local-checkpoint-store.d.ts +58 -23
- package/dist/plugins/local-checkpoint-store.js +195 -76
- package/dist/plugins/local-data-dir-modes-m39.js +2 -1
- package/dist/plugins/local-docker-capacity.d.ts +93 -0
- package/dist/plugins/local-docker-capacity.js +194 -0
- package/dist/plugins/local-docker-reaper.d.ts +92 -0
- package/dist/plugins/local-docker-reaper.js +102 -0
- package/dist/plugins/local-engine-high-water.d.ts +4 -2
- package/dist/plugins/local-engine-high-water.js +4 -1
- package/dist/plugins/local-session-store.d.ts +358 -125
- package/dist/plugins/local-session-store.js +824 -251
- package/dist/plugins/local-session-window.d.ts +3 -2
- package/dist/plugins/local-session-window.js +3 -2
- package/dist/plugins/local-sidecar-quarantine.js +3 -2
- package/dist/plugins/local-task-attachment-store.d.ts +18 -1
- package/dist/plugins/local-task-attachment-store.js +22 -1
- package/dist/plugins/memory-embedder.js +9 -7
- package/dist/plugins/memory-engine-pg.d.ts +3 -2
- package/dist/plugins/memory-engine-pg.js +14 -5
- package/dist/plugins/memory-engine-sql-apply.d.ts +8 -4
- package/dist/plugins/memory-engine-sql-apply.js +6 -8
- package/dist/plugins/memory-engine-tidb.d.ts +4 -2
- package/dist/plugins/memory-engine-tidb.js +11 -2
- package/dist/plugins/memory-optout-grant-store-sql.d.ts +1 -1
- package/dist/plugins/memory-optout-grant-store-sql.js +3 -3
- package/dist/plugins/memory-run-store.d.ts +39 -27
- package/dist/plugins/memory-run-store.js +72 -70
- package/dist/plugins/one-time-migration-marker.d.ts +10 -0
- package/dist/plugins/one-time-migration-marker.js +7 -0
- package/dist/plugins/one-time-migrations.d.ts +186 -45
- package/dist/plugins/one-time-migrations.js +442 -119
- package/dist/plugins/org-delivery-quota-store.js +2 -1
- package/dist/plugins/permission-rule-store-file.d.ts +3 -3
- package/dist/plugins/permission-rule-store-sql.d.ts +4 -63
- package/dist/plugins/permission-rule-store-sql.js +6 -86
- package/dist/plugins/pg-pool.d.ts +1 -31
- package/dist/plugins/pg-pool.js +16 -7
- package/dist/plugins/remote-env-e2b.d.ts +7 -25
- package/dist/plugins/remote-env-e2b.js +34 -25
- package/dist/plugins/remote-env-host.d.ts +2 -9
- package/dist/plugins/remote-env-host.js +34 -22
- package/dist/plugins/remote-env-k8s.d.ts +40 -45
- package/dist/plugins/remote-env-k8s.js +107 -58
- package/dist/plugins/remote-env-local-docker.d.ts +148 -14
- package/dist/plugins/remote-env-local-docker.js +367 -72
- package/dist/plugins/remote-scratchpad.js +4 -0
- package/dist/plugins/retention-deployment.d.ts +49 -17
- package/dist/plugins/retention-deployment.js +39 -8
- package/dist/plugins/run-preview-m45.d.ts +11 -0
- package/dist/plugins/run-preview-m45.js +19 -0
- package/dist/plugins/run-store-sql.d.ts +56 -68
- package/dist/plugins/run-store-sql.js +127 -116
- package/dist/plugins/s3-answer.d.ts +2 -1
- package/dist/plugins/sandbox-reaper.d.ts +26 -0
- package/dist/plugins/sandbox-reaper.js +2 -0
- package/dist/plugins/scenario-prefix-switch-m42.d.ts +54 -0
- package/dist/plugins/scenario-prefix-switch-m42.js +55 -0
- package/dist/plugins/scheduler-support.d.ts +16 -1
- package/dist/plugins/scheduler-support.js +22 -2
- package/dist/plugins/schema-consistency.d.ts +42 -9
- package/dist/plugins/schema-consistency.js +212 -11
- package/dist/plugins/schema-drift-sentence.d.ts +4 -1
- package/dist/plugins/schema-drift-sentence.js +4 -4
- package/dist/plugins/schema-ensure-legs.d.ts +9 -0
- package/dist/plugins/schema-ensure-legs.js +1 -1
- package/dist/plugins/schema-indexes.js +3 -0
- package/dist/plugins/schema-live-columns.d.ts +14 -5
- package/dist/plugins/schema-live-columns.js +10 -10
- package/dist/plugins/send-user-file.js +2 -1
- package/dist/plugins/session-birth.d.ts +37 -0
- package/dist/plugins/session-birth.js +38 -0
- package/dist/plugins/session-epoch-anchor.d.ts +40 -12
- package/dist/plugins/session-epoch-anchor.js +33 -11
- package/dist/plugins/session-ext-table.d.ts +27 -3
- package/dist/plugins/session-ext-table.js +19 -6
- package/dist/plugins/session-fork.d.ts +15 -1
- package/dist/plugins/session-fork.js +3 -0
- package/dist/plugins/session-ownership.d.ts +1 -1
- package/dist/plugins/session-placement.d.ts +22 -16
- package/dist/plugins/session-placement.js +15 -12
- package/dist/plugins/session-row-sql.d.ts +12 -0
- package/dist/plugins/session-row-sql.js +3 -3
- package/dist/plugins/session-run-rollup.d.ts +29 -0
- package/dist/plugins/session-run-rollup.js +40 -0
- package/dist/plugins/session-store-sql.d.ts +38 -12
- package/dist/plugins/session-store-sql.js +130 -30
- package/dist/plugins/session-withdraw-sql.d.ts +36 -0
- package/dist/plugins/session-withdraw-sql.js +42 -0
- package/dist/plugins/shared-memory-store-sql.d.ts +0 -69
- package/dist/plugins/shared-memory-store-sql.js +2 -1
- package/dist/plugins/shell-sentinel-owner-m48.d.ts +20 -0
- package/dist/plugins/shell-sentinel-owner-m48.js +3 -0
- package/dist/plugins/snapshot-bucket-presence.d.ts +2 -1
- package/dist/plugins/sql-driver.d.ts +1 -1
- package/dist/plugins/sql-driver.js +2 -1
- package/dist/plugins/sql-errors.d.ts +32 -5
- package/dist/plugins/sql-errors.js +55 -7
- package/dist/plugins/sql-json-column.d.ts +8 -7
- package/dist/plugins/sql-json-column.js +10 -6
- package/dist/plugins/store-backend.d.ts +84 -15
- package/dist/plugins/store-backend.js +186 -55
- package/dist/plugins/store-contracts.d.ts +90 -30
- package/dist/plugins/store-contracts.js +22 -1
- package/dist/plugins/store-fault.d.ts +28 -2
- package/dist/plugins/store-fault.js +20 -2
- package/dist/plugins/task-attachment-store.d.ts +15 -3
- package/dist/plugins/task-attachment-store.js +22 -9
- package/dist/plugins/tidb-pool.js +23 -8
- package/dist/plugins/web-search.js +5 -3
- package/dist/plugins/workflow-run-store-sql.d.ts +6 -1
- package/dist/plugins/workflow-run-store-sql.js +11 -5
- package/dist/principal-jwt.d.ts +4 -4
- package/dist/principal-jwt.js +20 -5
- package/dist/principal-shape.d.ts +41 -0
- package/dist/principal-shape.js +19 -0
- package/dist/question.d.ts +13 -23
- package/dist/question.js +21 -39
- package/dist/request-declaration-refusal.d.ts +35 -12
- package/dist/request-declaration-refusal.js +21 -9
- package/dist/request-form.d.ts +58 -0
- package/dist/request-form.js +72 -0
- package/dist/request-image-urls.d.ts +8 -2
- package/dist/request-image-urls.js +2 -1
- package/dist/request-images.d.ts +20 -0
- package/dist/request-images.js +59 -0
- package/dist/request-key-closure.d.ts +6 -7
- package/dist/request-key-closure.js +15 -2
- package/dist/resource-suspend.d.ts +7 -16
- package/dist/resource-suspend.js +1 -1
- package/dist/retired-name-host-notice.d.ts +21 -0
- package/dist/retired-name-host-notice.js +12 -0
- package/dist/rule-entry-list.d.ts +2 -2
- package/dist/rule-entry-list.js +3 -4
- package/dist/rule-issue-reading.d.ts +58 -0
- package/dist/rule-issue-reading.js +14 -0
- package/dist/rules-consent.d.ts +5 -3
- package/dist/rules-consent.js +1 -0
- package/dist/run-acceptance.d.ts +3 -1
- package/dist/run-acceptance.js +3 -0
- package/dist/run-local.d.ts +14 -6
- package/dist/run-local.js +92 -80
- package/dist/run-stale-default.d.ts +7 -0
- package/dist/run-stale-default.js +2 -0
- package/dist/runs.d.ts +26 -15
- package/dist/runs.js +39 -27
- package/dist/runtime-caps-resolver.d.ts +21 -6
- package/dist/runtime-caps-resolver.js +17 -4
- package/dist/runtime-governance.d.ts +2 -2
- package/dist/runtime-governance.js +5 -3
- package/dist/sealed-key-layout.d.ts +12 -5
- package/dist/sealed-key-layout.js +5 -0
- package/dist/sealed-key.d.ts +12 -2
- package/dist/sealed-key.js +115 -27
- package/dist/security.d.ts +128 -158
- package/dist/security.js +163 -59
- package/dist/sema-config-dir.d.ts +20 -0
- package/dist/sema-config-dir.js +25 -0
- package/dist/server-secret-env.d.ts +21 -5
- package/dist/server-secret-env.js +14 -4
- package/dist/session-children-retire.d.ts +7 -5
- package/dist/session-children-retire.js +7 -2
- package/dist/session-deletion.d.ts +88 -0
- package/dist/session-deletion.js +8 -0
- package/dist/session-erase.d.ts +145 -0
- package/dist/session-erase.js +115 -0
- package/dist/session-error-wire.d.ts +5 -5
- package/dist/session-error-wire.js +1 -1
- package/dist/session-incarnation.d.ts +52 -5
- package/dist/session-incarnation.js +19 -2
- package/dist/session-policy-wire.d.ts +6 -3
- package/dist/session-policy-wire.js +11 -1
- package/dist/session-resident-background.d.ts +0 -71
- package/dist/session-resident-background.js +4 -3
- package/dist/session-row.d.ts +2 -1
- package/dist/session-rules-seat.d.ts +12 -0
- package/dist/session-rules-seat.js +19 -0
- package/dist/session-titler.d.ts +7 -15
- package/dist/session-titler.js +1 -1
- package/dist/spec-fields.d.ts +57 -3
- package/dist/spec-fields.js +72 -51
- package/dist/store-posture.d.ts +136 -20
- package/dist/store-posture.js +188 -3
- package/dist/stored-request-hooks-m20.js +2 -2
- package/dist/stores-sql/background-agent-store-sql.d.ts +11 -2
- package/dist/stores-sql/background-agent-store-sql.js +73 -20
- package/dist/stores-sql/checkpoint-store-sql.d.ts +33 -28
- package/dist/stores-sql/checkpoint-store-sql.js +75 -44
- package/dist/stores-sql/mailbox-store-sql.d.ts +7 -4
- package/dist/stores-sql/mailbox-store-sql.js +31 -32
- package/dist/stores-sql/pg-session-storage.d.ts +7 -5
- package/dist/stores-sql/pg-session-storage.js +54 -46
- package/dist/stores-sql/retention-store-sql.d.ts +87 -19
- package/dist/stores-sql/retention-store-sql.js +92 -27
- package/dist/stores-sql/session-policy-store-sql.d.ts +32 -10
- package/dist/stores-sql/session-policy-store-sql.js +44 -36
- package/dist/stores-sql/session-write-hooks.d.ts +12 -6
- package/dist/stores-sql/tidb-session-storage.d.ts +4 -4
- package/dist/stores-sql/tidb-session-storage.js +13 -8
- package/dist/stores-sql/tidb-session-store.d.ts +36 -17
- package/dist/stores-sql/tidb-session-store.js +69 -39
- package/dist/stores-sql/windowed-session-storage.d.ts +5 -0
- package/dist/stores-sql/windowed-session-storage.js +9 -0
- package/dist/submission-exit.d.ts +50 -0
- package/dist/submission-exit.js +108 -0
- package/dist/task-a2a.d.ts +1 -1
- package/dist/task-a2a.js +3 -3
- package/dist/task-cwd.d.ts +20 -0
- package/dist/task-cwd.js +8 -0
- package/dist/task-mcp.d.ts +1 -1
- package/dist/task-mcp.js +3 -3
- package/dist/task-settings.d.ts +14 -10
- package/dist/task-settings.js +18 -7
- package/dist/terminal.d.ts +25 -43
- package/dist/terminal.js +31 -11
- package/dist/tool-approval.d.ts +131 -129
- package/dist/tool-approval.js +189 -193
- package/dist/trace/core-keyset-guard.d.ts +13 -6
- package/dist/trace/core-vocab-wire.d.ts +95 -0
- package/dist/trace/core-vocab-wire.js +15 -0
- package/dist/trace/exit-seat.d.ts +30 -4
- package/dist/trace/exit-seat.js +40 -36
- package/dist/trace/extension-call-face.d.ts +3 -2
- package/dist/trace/extension-call-face.js +3 -1
- package/dist/trace/ledger-events.d.ts +4 -7
- package/dist/trace/ledger-sink.d.ts +1 -30
- package/dist/trace/ledger-sink.js +0 -11
- package/dist/trace/model-segment.d.ts +5 -5
- package/dist/trace/model-segment.js +5 -5
- package/dist/trace/project.d.ts +55 -42
- package/dist/trace/project.js +52 -19
- package/dist/trace/redact.d.ts +123 -27
- package/dist/trace/redact.js +880 -260
- package/dist/trace/self-minted-wire.d.ts +487 -19
- package/dist/trace/self-minted-wire.js +172 -23
- package/dist/trace/wire-projection-faces.d.ts +5 -6
- package/dist/trace/wire-projection-faces.js +2 -2
- package/dist/upstream-body.d.ts +23 -0
- package/dist/upstream-body.js +16 -0
- package/dist/url-refusal.d.ts +3 -3
- package/dist/url-refusal.js +11 -4
- package/dist/user-authored-text.d.ts +1 -1
- package/dist/user-input-ledger.d.ts +7 -8
- package/dist/user-input-ledger.js +1 -1
- package/dist/web-admin-client/apply-effective.d.ts +6 -3
- package/dist/web-admin-client/apply-effective.js +13 -16
- package/dist/web-admin-client/apply-ledger.d.ts +16 -7
- package/dist/web-admin-client/apply-ledger.js +5 -2
- package/dist/web-admin-client/center-request.d.ts +2 -2
- package/dist/web-admin-client/center-request.js +15 -15
- package/dist/web-admin-client/effective-keys.d.ts +1 -1
- package/dist/web-admin-client/effective-keys.js +1 -1
- package/dist/web-admin-client/entry-metadata.d.ts +8 -0
- package/dist/web-admin-client/entry-metadata.js +13 -0
- package/dist/web-admin-client/http-client.d.ts +1 -1
- package/dist/web-admin-client/http-client.js +23 -4
- package/dist/web-admin-client/mcp-revocation.d.ts +1 -1
- package/dist/web-admin-client/mcp-revocation.js +2 -1
- package/dist/web-admin-client/read-warnings.d.ts +1 -0
- package/dist/web-admin-client/read-warnings.js +1 -0
- package/dist/web-admin-client/restart-signal.js +8 -4
- package/dist/web-admin-client/skills-mcp.d.ts +2 -2
- package/dist/web-admin-client/types.d.ts +1 -2
- package/dist/workspace-space.d.ts +3 -2
- package/docs/DEVICE-EXECUTOR-PROTOCOL.md +4 -4
- package/package.json +6 -3
- package/scripts/drain-check-local.mjs +118 -147
- package/scripts/drain-check.mysql.sql +22 -2
- package/scripts/drain-check.pg.sql +22 -2
- package/wire-changes/server@7.148.0.json +1517 -0
- package/dist/http/memory-control-plane-corrupt-reply.d.ts +0 -25
- package/dist/http/memory-control-plane-corrupt-reply.js +0 -19
- package/dist/http/memory-layer-reply.d.ts +0 -30
- package/dist/http/memory-layer-reply.js +0 -24
- package/dist/lsp/e2b-bridge.d.ts +0 -57
- package/dist/lsp/e2b-bridge.js +0 -139
- package/dist/lsp/e2b-manager.d.ts +0 -93
- package/dist/lsp/e2b-manager.js +0 -178
- package/dist/lsp/lsp-frames.d.ts +0 -14
- package/dist/lsp/lsp-frames.js +0 -25
- package/dist/lsp/manager.d.ts +0 -129
- package/dist/lsp/manager.js +0 -127
- package/dist/lsp/types.d.ts +0 -12
- package/dist/lsp/types.js +0 -2
- package/dist/lsp/ws-transport.d.ts +0 -40
- package/dist/lsp/ws-transport.js +0 -210
package/dist/leader/endpoint.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { uuidv7 } from "@sema-agent/core";
|
|
2
2
|
import { redactErrorMessage, redactHead, redactLeaderResult, redactLeaderResultWithFlag } from "../observability/run-terminal.js";
|
|
3
|
-
import {
|
|
3
|
+
import { withSubject } from "../observability/principal-context.js";
|
|
4
4
|
import {} from "../plugins/leader-run-store-sql.js";
|
|
5
5
|
import { idemKeyOf } from "../http/idempotency.js";
|
|
6
6
|
import { refusalBody } from "../http/refusal-body.js";
|
|
7
|
+
import { LIVENESS_HEARTBEAT_MS } from "../config-invariants.js";
|
|
8
|
+
import { seatText } from "../trace/exit-seat.js";
|
|
7
9
|
function statusForLeaderResult(result) {
|
|
8
10
|
if (result.conflict)
|
|
9
11
|
return "needs_human";
|
|
@@ -20,6 +22,9 @@ function statusForLeaderResult(result) {
|
|
|
20
22
|
}
|
|
21
23
|
}
|
|
22
24
|
const LEADER_ID_RE = /^\/v1\/leader\/([^/]+)$/;
|
|
25
|
+
const LEADER_CANCEL_RE = /^\/v1\/leader\/([^/]+)\/cancel$/;
|
|
26
|
+
export const LEADER_RUN_CANCELLED_ERROR = "leader run cancelled (POST /v1/leader/:id/cancel): it stopped at an abort checkpoint before any push";
|
|
27
|
+
const LEADER_RUN_ROW_SETTLED_ELSEWHERE = "leader run stopped: its row was settled elsewhere (stale sweep or external delete) — this replica stopped driving it";
|
|
23
28
|
const RUN_RETENTION_MS = 60 * 60_000;
|
|
24
29
|
const TERMINAL_WRITE_ATTEMPTS = 3;
|
|
25
30
|
const TERMINAL_WRITE_RETRY_MS = 200;
|
|
@@ -31,6 +36,12 @@ function idemShapeError(raw) {
|
|
|
31
36
|
}
|
|
32
37
|
export function createLeaderEndpoint(runLeader, opts) {
|
|
33
38
|
const runs = new Map();
|
|
39
|
+
const controllers = new Map();
|
|
40
|
+
const abortLocal = (id, cause) => {
|
|
41
|
+
const ac = controllers.get(id);
|
|
42
|
+
if (ac && !ac.signal.aborted)
|
|
43
|
+
ac.abort(cause);
|
|
44
|
+
};
|
|
34
45
|
const memIdem = new Map();
|
|
35
46
|
function reap() {
|
|
36
47
|
const cutoff = Date.now() - RUN_RETENTION_MS;
|
|
@@ -44,24 +55,63 @@ export function createLeaderEndpoint(runLeader, opts) {
|
|
|
44
55
|
}
|
|
45
56
|
}
|
|
46
57
|
function drive(id, body, owner) {
|
|
58
|
+
const ac = new AbortController();
|
|
59
|
+
controllers.set(id, ac);
|
|
60
|
+
let pollWarned = false;
|
|
61
|
+
const poll = opts.store
|
|
62
|
+
? setInterval(() => {
|
|
63
|
+
if (ac.signal.aborted)
|
|
64
|
+
return;
|
|
65
|
+
void readRow(id).then((row) => {
|
|
66
|
+
if (row === undefined || row.status !== "running")
|
|
67
|
+
abortLocal(id, "stall_verdict");
|
|
68
|
+
else if (row.cancelRequested)
|
|
69
|
+
abortLocal(id, "cancel_verb");
|
|
70
|
+
}, (e) => {
|
|
71
|
+
if (pollWarned)
|
|
72
|
+
return;
|
|
73
|
+
pollWarned = true;
|
|
74
|
+
opts.logger?.error?.("leader_cancel_poll_failed", { id, err: opErr(e), effect: "a cancel landed on another replica is not seen until a later tick reads the row" });
|
|
75
|
+
});
|
|
76
|
+
}, opts.cancelPollMs ?? LIVENESS_HEARTBEAT_MS)
|
|
77
|
+
: undefined;
|
|
78
|
+
poll?.unref?.();
|
|
47
79
|
void (async () => {
|
|
48
80
|
let terminal;
|
|
81
|
+
let result;
|
|
49
82
|
try {
|
|
50
|
-
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
83
|
+
result = redactLeaderResult(await withSubject(owner ?? undefined, () => runLeader(body, ac.signal)));
|
|
84
|
+
const cause = ac.signal.aborted ? ac.signal.reason : undefined;
|
|
85
|
+
if (result.stopped === true && cause === "cancel_verb") {
|
|
86
|
+
terminal = { status: "failed", result, error: LEADER_RUN_CANCELLED_ERROR, errorCode: "cancelled" };
|
|
87
|
+
}
|
|
88
|
+
else if (result.stopped === true && cause === "stall_verdict") {
|
|
89
|
+
terminal = { status: "failed", result, error: LEADER_RUN_ROW_SETTLED_ELSEWHERE };
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
const status = statusForLeaderResult(result);
|
|
93
|
+
terminal = { status: status, result };
|
|
94
|
+
}
|
|
95
|
+
opts.logger?.info?.("leader_run_done", { id, ok: result.ok, status: terminal.status, ...(terminal.errorCode ? { errorCode: terminal.errorCode } : {}), ...(cause ? { stopCause: cause } : {}), ...(result.repairTerminal ? { repairTerminal: result.repairTerminal } : {}), merged: result.merge && result.merge.ok ? result.merge.merged : undefined });
|
|
54
96
|
}
|
|
55
97
|
catch (e) {
|
|
56
98
|
terminal = { status: "failed", error: redactErrorMessage(e instanceof Error ? e.message : String(e)) ?? "" };
|
|
57
99
|
opts.logger?.error?.("leader_run_error", { id, err: terminal.error });
|
|
58
100
|
}
|
|
101
|
+
finally {
|
|
102
|
+
if (poll)
|
|
103
|
+
clearInterval(poll);
|
|
104
|
+
controllers.delete(id);
|
|
105
|
+
}
|
|
106
|
+
let settledElsewhere = ac.signal.reason === "stall_verdict";
|
|
59
107
|
if (opts.store) {
|
|
60
108
|
for (let attempt = 1;; attempt += 1) {
|
|
61
109
|
try {
|
|
62
110
|
const moved = await opts.store.finishRun(id, terminal);
|
|
63
|
-
if (!moved)
|
|
111
|
+
if (!moved) {
|
|
112
|
+
settledElsewhere = true;
|
|
64
113
|
opts.logger?.error?.("leader_run_terminal_not_applied", { id, status: terminal.status, why: "row missing or already terminal — another writer settled it (e.g. the stale-running sweep), or the row was deleted" });
|
|
114
|
+
}
|
|
65
115
|
break;
|
|
66
116
|
}
|
|
67
117
|
catch (e) {
|
|
@@ -74,16 +124,68 @@ export function createLeaderEndpoint(runLeader, opts) {
|
|
|
74
124
|
}
|
|
75
125
|
}
|
|
76
126
|
const local = runs.get(id);
|
|
127
|
+
const residueEnds = settledElsewhere || ac.signal.reason === "cancel_verb" || (opts.store ? await cancelFlagAfterSettle(id) : local?.cancelRequested === true);
|
|
128
|
+
if (residueEnds && result)
|
|
129
|
+
await expireResidue(id, result, "drive");
|
|
77
130
|
if (local) {
|
|
78
131
|
local.status = terminal.status;
|
|
79
132
|
if (terminal.result !== undefined)
|
|
80
133
|
local.result = terminal.result;
|
|
81
134
|
if (terminal.error !== undefined)
|
|
82
135
|
local.error = terminal.error;
|
|
136
|
+
if (terminal.errorCode !== undefined)
|
|
137
|
+
local.errorCode = terminal.errorCode;
|
|
83
138
|
local.finishedAt = Date.now();
|
|
84
139
|
}
|
|
85
140
|
})();
|
|
86
141
|
}
|
|
142
|
+
function readRow(id) {
|
|
143
|
+
return opts.store.getRun(id);
|
|
144
|
+
}
|
|
145
|
+
const opErr = (e) => seatText("operator-log-error", e instanceof Error ? e.message : String(e));
|
|
146
|
+
async function cancelFlagAfterSettle(id) {
|
|
147
|
+
try {
|
|
148
|
+
return (await readRow(id))?.cancelRequested === true;
|
|
149
|
+
}
|
|
150
|
+
catch (e) {
|
|
151
|
+
opts.logger?.error?.("leader_cancel_flag_reread_failed", { id, err: opErr(e), effect: "if a cancel landed on this run just before its terminal write, its worker parks are expired only when the cancel is re-sent" });
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function workerSessionsOf(result) {
|
|
156
|
+
const out = new Map();
|
|
157
|
+
const r = result && typeof result === "object" ? result : {};
|
|
158
|
+
for (const list of [r.reports, r.suspended]) {
|
|
159
|
+
if (!Array.isArray(list))
|
|
160
|
+
continue;
|
|
161
|
+
for (const x of list) {
|
|
162
|
+
const w = x;
|
|
163
|
+
if (w && typeof w.workerId === "string" && typeof w.sessionId === "string")
|
|
164
|
+
out.set(`${w.workerId}\u0000${w.sessionId}`, { workerId: w.workerId, sessionId: w.sessionId });
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return [...out.values()];
|
|
168
|
+
}
|
|
169
|
+
async function expireResidue(id, result, site) {
|
|
170
|
+
const none = { expired: 0, lost: 0 };
|
|
171
|
+
if (!opts.expireWorkerParks)
|
|
172
|
+
return none;
|
|
173
|
+
const sessions = workerSessionsOf(result);
|
|
174
|
+
if (sessions.length === 0)
|
|
175
|
+
return none;
|
|
176
|
+
try {
|
|
177
|
+
const r = await opts.expireWorkerParks(sessions);
|
|
178
|
+
if (r.expired > 0 || r.lost > 0)
|
|
179
|
+
opts.logger?.info?.("leader_cancel_parks_expired", { id, site, expired: r.expired, lost: r.lost });
|
|
180
|
+
return r;
|
|
181
|
+
}
|
|
182
|
+
catch (e) {
|
|
183
|
+
if (site === "cancel")
|
|
184
|
+
throw e;
|
|
185
|
+
opts.logger?.error?.("leader_cancel_parks_expire_failed", { id, err: opErr(e), effect: "the worker parks of this cancelled run stay pending until their own deadline or until the cancel is re-sent" });
|
|
186
|
+
return none;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
87
189
|
const CLEAN_MEMO_CAP = 4096;
|
|
88
190
|
const cleanIds = new Set();
|
|
89
191
|
const DIRTY_MEMO_CAP = 256;
|
|
@@ -125,12 +227,12 @@ export function createLeaderEndpoint(runLeader, opts) {
|
|
|
125
227
|
return view;
|
|
126
228
|
}
|
|
127
229
|
function getBody(run) {
|
|
128
|
-
return { status: 200, body: { id: run.id, status: run.status, ...redactedView(run) } };
|
|
230
|
+
return { status: 200, body: { id: run.id, status: run.status, cancelRequested: run.cancelRequested, ...(run.errorCode ? { errorCode: run.errorCode } : {}), ...redactedView(run) } };
|
|
129
231
|
}
|
|
130
232
|
const NOT_FOUND = { status: 404, body: refusalBody({ errorCode: "not_found.leader_run", message: "leader run not found" }) };
|
|
131
|
-
async function handle(method, url, body, caller, idempotencyKey) {
|
|
132
|
-
const requester = caller?.
|
|
133
|
-
const idemCaller = caller ?? {
|
|
233
|
+
async function handle(method, url, body, caller, idempotencyKey, identity) {
|
|
234
|
+
const requester = caller?.subject ?? null;
|
|
235
|
+
const idemCaller = caller ?? { subject: null, source: null };
|
|
134
236
|
if (method === "POST" && url === "/v1/leader") {
|
|
135
237
|
const b = body;
|
|
136
238
|
if (!b || typeof b.objective !== "string" || b.objective.trim() === "") {
|
|
@@ -152,14 +254,14 @@ export function createLeaderEndpoint(runLeader, opts) {
|
|
|
152
254
|
}
|
|
153
255
|
reap();
|
|
154
256
|
if (opts.store) {
|
|
155
|
-
const { created, run } = await opts.store.createRun({ objective: b.objective, owner, idemKey: scopedIdem });
|
|
257
|
+
const { created, run } = await opts.store.createRun({ objective: b.objective, owner, idemKey: scopedIdem, identity: identity ?? null });
|
|
156
258
|
if (!created) {
|
|
157
259
|
if (!opts.ownerVisible(requester, run.owner)) {
|
|
158
260
|
return { status: 409, body: refusalBody({ errorCode: "conflict.leader_run_exists", message: "idempotency key already used by another principal" }) };
|
|
159
261
|
}
|
|
160
262
|
return { status: 202, body: { leaderRunId: run.id, status: run.status } };
|
|
161
263
|
}
|
|
162
|
-
runs.set(run.id, { id: run.id, status: "running", startedAt: run.startedAtMs, owner });
|
|
264
|
+
runs.set(run.id, { id: run.id, status: "running", startedAt: run.startedAtMs, owner, cancelRequested: false });
|
|
163
265
|
drive(run.id, b, owner);
|
|
164
266
|
return { status: 202, body: { leaderRunId: run.id, status: "running" } };
|
|
165
267
|
}
|
|
@@ -170,7 +272,7 @@ export function createLeaderEndpoint(runLeader, opts) {
|
|
|
170
272
|
return { status: 202, body: { leaderRunId: priorRun.id, status: priorRun.status } };
|
|
171
273
|
}
|
|
172
274
|
const id = uuidv7();
|
|
173
|
-
runs.set(id, { id, status: "running", startedAt: Date.now(), owner });
|
|
275
|
+
runs.set(id, { id, status: "running", startedAt: Date.now(), owner, cancelRequested: false });
|
|
174
276
|
if (scopedIdem)
|
|
175
277
|
memIdem.set(scopedIdem, id);
|
|
176
278
|
drive(id, b, owner);
|
|
@@ -196,11 +298,14 @@ export function createLeaderEndpoint(runLeader, opts) {
|
|
|
196
298
|
return NOT_FOUND;
|
|
197
299
|
return getBody(run);
|
|
198
300
|
}
|
|
301
|
+
const c = method === "POST" ? LEADER_CANCEL_RE.exec(url) : null;
|
|
302
|
+
if (c)
|
|
303
|
+
return cancel(c[1], ownerOk);
|
|
199
304
|
const m = method === "GET" ? LEADER_ID_RE.exec(url) : null;
|
|
200
305
|
if (m) {
|
|
201
306
|
const id = m[1];
|
|
202
307
|
if (opts.store) {
|
|
203
|
-
const run = await
|
|
308
|
+
const run = await readRow(id);
|
|
204
309
|
if (!run || !ownerOk(run.owner))
|
|
205
310
|
return NOT_FOUND;
|
|
206
311
|
return getBody(run);
|
|
@@ -212,6 +317,41 @@ export function createLeaderEndpoint(runLeader, opts) {
|
|
|
212
317
|
}
|
|
213
318
|
return null;
|
|
214
319
|
}
|
|
320
|
+
async function answerTerminal(id, row) {
|
|
321
|
+
abortLocal(id, "cancel_verb");
|
|
322
|
+
const r = await expireResidue(id, row.result, "cancel");
|
|
323
|
+
if (r.lost > 0) {
|
|
324
|
+
return { status: 409, body: refusalBody({ errorCode: "conflict.approval_settled", message: `this run is already ${row.status}; ${r.lost} of its worker approvals were settled concurrently (decided or expired) while this cancel tried to expire them — a decided approval continues as its own run (stop it with POST /v1/runs/:id/cancel); retry cancel to expire what is still pending` }) };
|
|
325
|
+
}
|
|
326
|
+
return { status: 202, body: { leaderRunId: id, status: row.status, cancelRequested: row.cancelRequested, note: r.expired > 0 ? `already ${row.status} — ${r.expired} pending worker approval(s) it left behind were expired` : `already ${row.status} — nothing left to stop` } };
|
|
327
|
+
}
|
|
328
|
+
async function cancel(id, ownerOk) {
|
|
329
|
+
if (opts.store) {
|
|
330
|
+
const row = await readRow(id);
|
|
331
|
+
if (!row || !ownerOk(row.owner))
|
|
332
|
+
return NOT_FOUND;
|
|
333
|
+
if (row.status === "running") {
|
|
334
|
+
if (await opts.store.requestCancel(id)) {
|
|
335
|
+
abortLocal(id, "cancel_verb");
|
|
336
|
+
return { status: 202, body: { leaderRunId: id, status: "cancelling", cancelRequested: true } };
|
|
337
|
+
}
|
|
338
|
+
const now = await readRow(id);
|
|
339
|
+
if (!now)
|
|
340
|
+
return NOT_FOUND;
|
|
341
|
+
return answerTerminal(id, now);
|
|
342
|
+
}
|
|
343
|
+
return answerTerminal(id, row);
|
|
344
|
+
}
|
|
345
|
+
const run = runs.get(id);
|
|
346
|
+
if (!run || !ownerOk(run.owner))
|
|
347
|
+
return NOT_FOUND;
|
|
348
|
+
if (run.status === "running") {
|
|
349
|
+
run.cancelRequested = true;
|
|
350
|
+
abortLocal(id, "cancel_verb");
|
|
351
|
+
return { status: 202, body: { leaderRunId: id, status: "cancelling", cancelRequested: true } };
|
|
352
|
+
}
|
|
353
|
+
return answerTerminal(id, run);
|
|
354
|
+
}
|
|
215
355
|
return { handle, inflight: () => [...runs.values()].filter((r) => r.status === "running").length, runs };
|
|
216
356
|
}
|
|
217
357
|
//# sourceMappingURL=endpoint.js.map
|
package/dist/leader/fanout.d.ts
CHANGED
|
@@ -100,6 +100,9 @@ export interface FanOutOptions {
|
|
|
100
100
|
* suspended worker itself has already settled (its stream is deregistered), so the cancel sweep cannot
|
|
101
101
|
* touch its checkpoint/paused env (the destroy-exemption falls out of the registration lifecycle). */
|
|
102
102
|
cancelOnSuspend?: boolean;
|
|
103
|
+
/** 这条 leader run 的中止信号(取消口 / 陈旧裁决;与 core `TaskSpec.signal` 同一约定:缺席 = 不可外部取消)。abort ⇒ 走同一只
|
|
104
|
+
* {@link fanOut} 内的 `cancelAll`(先 abort 共享信号、再 destroy 已登记的流)—— 父中止与总超时是同一个动作的两个触发,不是两套收法。 */
|
|
105
|
+
signal?: AbortSignal;
|
|
103
106
|
}
|
|
104
107
|
export interface FanOutResult {
|
|
105
108
|
reports: WorkerReport[];
|
package/dist/leader/fanout.js
CHANGED
|
@@ -37,76 +37,91 @@ export async function fanOut(subtasks, opts) {
|
|
|
37
37
|
};
|
|
38
38
|
const sem = new Semaphore(opts.maxConcurrency);
|
|
39
39
|
let pendingCancel;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
40
|
+
let parentStop;
|
|
41
|
+
let deadlineTimer;
|
|
42
|
+
let graceTimer;
|
|
43
|
+
const parentStopped = new Promise((resolve) => { parentStop = () => resolve("stopped"); });
|
|
44
|
+
const onParentAbort = () => { pendingCancel ??= cancelAll(); parentStop(); };
|
|
45
|
+
if (opts.signal?.aborted)
|
|
46
|
+
onParentAbort();
|
|
47
|
+
else
|
|
48
|
+
opts.signal?.addEventListener("abort", onParentAbort, { once: true });
|
|
49
|
+
try {
|
|
50
|
+
const maybeCancelOnSuspend = (r) => {
|
|
51
|
+
if (opts.cancelOnSuspend && r.status === "suspended" && !cancelled) {
|
|
52
|
+
opts.logger?.info?.("fanout_suspend_cancel", { suspendedWorker: r.workerId });
|
|
53
|
+
pendingCancel ??= cancelAll();
|
|
54
|
+
}
|
|
55
|
+
return r;
|
|
56
|
+
};
|
|
57
|
+
const runOne = async (st) => {
|
|
58
|
+
const base = { workerId: st.workerId, sessionId: st.sessionId, branch: st.branch, baseSha: st.baseSha };
|
|
59
|
+
return sem.run(async () => {
|
|
60
|
+
if (sharedAC.signal.aborted)
|
|
61
|
+
return { ...base, status: "timeout", error: "cancelled before start" };
|
|
62
|
+
if (opts.runWorker) {
|
|
63
|
+
try {
|
|
64
|
+
return maybeCancelOnSuspend(redactWorkerReportError(await opts.runWorker(st, sharedAC.signal)));
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
return { ...base, status: cancelled ? "timeout" : "failed", error: redactErrorMessage(e instanceof Error ? e.message : String(e)) ?? "" };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
let stream;
|
|
53
71
|
try {
|
|
54
|
-
|
|
72
|
+
stream = opts.runner.runTaskStream({ ...st.spec, sessionId: st.sessionId, signal: sharedAC.signal });
|
|
55
73
|
}
|
|
56
74
|
catch (e) {
|
|
57
|
-
return { ...base, status:
|
|
75
|
+
return { ...base, status: "failed", error: redactErrorMessage(e instanceof Error ? e.message : String(e)) ?? "" };
|
|
58
76
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}
|
|
80
|
-
return maybeCancelOnSuspend(report);
|
|
81
|
-
});
|
|
82
|
-
};
|
|
83
|
-
const results = new Map();
|
|
84
|
-
const work = Promise.all(subtasks.map((st) => runOne(st).then((r) => { results.set(st.workerId, r); return r; })));
|
|
85
|
-
const timer = new Promise((resolve) => {
|
|
86
|
-
const id = setTimeout(() => resolve("timeout"), opts.timeoutMs);
|
|
87
|
-
void work.then(() => clearTimeout(id));
|
|
88
|
-
});
|
|
89
|
-
const raced = await Promise.race([work.then(() => "done"), timer]);
|
|
90
|
-
if (raced === "timeout") {
|
|
91
|
-
opts.logger?.warn?.("fanout_timeout", { timeoutMs: opts.timeoutMs, workers: subtasks.length });
|
|
92
|
-
await cancelAll();
|
|
93
|
-
const graceMs = opts.cancelGraceMs ?? CANCEL_GRACE_MS;
|
|
94
|
-
const grace = new Promise((resolve) => {
|
|
95
|
-
const id = setTimeout(() => resolve("grace"), graceMs);
|
|
96
|
-
void work.then(() => clearTimeout(id));
|
|
77
|
+
streams.set(st.workerId, stream);
|
|
78
|
+
let report;
|
|
79
|
+
try {
|
|
80
|
+
const result = await stream.result();
|
|
81
|
+
const plane = outwardPlane(result.terminal);
|
|
82
|
+
report = { ...base, status: mapStatus(result.terminal), stats: result.stats, ...(plane.errorMessage ? { error: redactErrorMessage(plane.errorMessage) ?? "" } : {}) };
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
report = { ...base, status: cancelled ? "timeout" : "failed", error: redactErrorMessage(e instanceof Error ? e.message : String(e)) ?? "" };
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
streams.delete(st.workerId);
|
|
89
|
+
}
|
|
90
|
+
return maybeCancelOnSuspend(report);
|
|
91
|
+
});
|
|
92
|
+
};
|
|
93
|
+
const results = new Map();
|
|
94
|
+
const work = Promise.all(subtasks.map((st) => runOne(st).then((r) => { results.set(st.workerId, r); return r; })));
|
|
95
|
+
const timer = new Promise((resolve) => {
|
|
96
|
+
deadlineTimer = setTimeout(() => resolve("timeout"), opts.timeoutMs);
|
|
97
97
|
});
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
cancelled,
|
|
103
|
-
};
|
|
98
|
+
const raced = await Promise.race([work.then(() => "done"), timer, parentStopped]);
|
|
99
|
+
if (raced === "timeout") {
|
|
100
|
+
opts.logger?.warn?.("fanout_timeout", { timeoutMs: opts.timeoutMs, workers: subtasks.length });
|
|
101
|
+
pendingCancel ??= cancelAll();
|
|
104
102
|
}
|
|
103
|
+
if (pendingCancel) {
|
|
104
|
+
const sweep = pendingCancel.catch(() => { });
|
|
105
|
+
const graceMs = opts.cancelGraceMs ?? CANCEL_GRACE_MS;
|
|
106
|
+
const grace = new Promise((resolve) => {
|
|
107
|
+
graceTimer = setTimeout(() => resolve("grace"), graceMs);
|
|
108
|
+
});
|
|
109
|
+
if ((await Promise.race([Promise.all([sweep, work]).then(() => "done"), grace])) === "grace") {
|
|
110
|
+
opts.logger?.warn?.("fanout_cancel_grace_expired", { graceMs, settled: results.size, of: subtasks.length });
|
|
111
|
+
return {
|
|
112
|
+
reports: subtasks.map((st) => results.get(st.workerId) ?? { workerId: st.workerId, sessionId: st.sessionId, branch: st.branch, baseSha: st.baseSha, status: "timeout", error: "did not settle within cancel grace" }),
|
|
113
|
+
cancelled,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
const reports = await work;
|
|
118
|
+
return { reports, cancelled };
|
|
119
|
+
}
|
|
120
|
+
finally {
|
|
121
|
+
opts.signal?.removeEventListener("abort", onParentAbort);
|
|
122
|
+
clearTimeout(deadlineTimer);
|
|
123
|
+
clearTimeout(graceTimer);
|
|
105
124
|
}
|
|
106
|
-
const reports = await work;
|
|
107
|
-
if (pendingCancel)
|
|
108
|
-
await pendingCancel.catch(() => { });
|
|
109
|
-
return { reports, cancelled };
|
|
110
125
|
}
|
|
111
126
|
const CANCEL_GRACE_MS = 30_000;
|
|
112
127
|
//# sourceMappingURL=fanout.js.map
|
package/dist/leader/leader.d.ts
CHANGED
|
@@ -84,6 +84,12 @@ export interface LeaderRunEntry {
|
|
|
84
84
|
*/
|
|
85
85
|
export declare function withLeaderLeg<S extends Partial<TaskSpec>>(spec: S, entry: LeaderRunEntry): S & UnattendedLegSpec;
|
|
86
86
|
export interface LeaderDeps {
|
|
87
|
+
/**
|
|
88
|
+
* 本 run 的中止信号(取消口 / 陈旧裁决;HTTP 驱动腿恒给,`endpoint.ts` 的 `drive`)。与 core `TaskSpec.signal` 同一约定:缺席 = 不可外部取消(单测 / bench 形)。
|
|
89
|
+
* 读法只有一条:段界核点(规划后、每次建 worker 前、每波扇出后、模块门、collapse / redispatch、合并前)看见 abort ⇒ 交 {@link stoppedResult} 的那一份,
|
|
90
|
+
* 不再起任何新的计费工作;在跑的腿经 spec 的同一根信号中止(fan-out 共享信号 / 修复腿 / 单代理修复环);合并在 push 咽喉前再核一次(`merge.ts`)。
|
|
91
|
+
*/
|
|
92
|
+
signal?: AbortSignal;
|
|
87
93
|
/** 本 run 的入口体({@link LeaderRunEntry}:运维地板在 run 出生时盖一次)。必填:没有地板的装配写 `{}` —— 缺席不是「没有地板」的合法拼法。
|
|
88
94
|
* 模块门修复与单代理修复环这两个出生点从这里取词(经 {@link withLeaderLeg})。 */
|
|
89
95
|
entry: LeaderRunEntry;
|
|
@@ -175,6 +181,9 @@ export interface LeaderResult {
|
|
|
175
181
|
reports: WorkerReport[];
|
|
176
182
|
merge?: MergeResult;
|
|
177
183
|
cancelled: boolean;
|
|
184
|
+
/** 只在这条 run 在某个中止核点停下时在场(恒 `true`):核点之后没有起新的工作、**零 push**(push 咽喉的核点在 `deps.push` 正上方)。
|
|
185
|
+
* 缺席 = run 走完了自己的路(含「取消晚到、push 已发出」—— 那一趟的结局照实)。HTTP 驱动腿据它判取消终局(`failed` + `errorCode: "cancelled"`)。 */
|
|
186
|
+
stopped?: true;
|
|
178
187
|
/** Which route the difficulty router picked (search [43]): "single" = a 1-subtask plan, "fanout" = N. */
|
|
179
188
|
route?: "single" | "fanout";
|
|
180
189
|
/** Set when planning/provisioning failed before fan-out. */
|
|
@@ -243,6 +252,13 @@ export interface LeaderResult {
|
|
|
243
252
|
gradedHash?: string;
|
|
244
253
|
};
|
|
245
254
|
}
|
|
255
|
+
/** 中止核点停下的那一句(人读;机读位是 {@link LeaderResult.stopped})。 */
|
|
256
|
+
export declare const LEADER_RUN_STOPPED = "leader run stopped at an abort checkpoint (cancel): no further work was started and nothing was pushed after the stop";
|
|
257
|
+
/**
|
|
258
|
+
* 中止核点的**唯一**结果形(`runLeaderTask` 每一处段界核点、合并停下的那一形都交这一只):`stopped: true` + 已知的报告 +
|
|
259
|
+
* 其中停驻着的 worker(`suspended[]`,与 C4 的形同 —— 取消落定时 HTTP 驱动腿按它和 `reports[]` 过期这条 run 的残留停驻)。不打捞(取消 = 立刻停)。
|
|
260
|
+
*/
|
|
261
|
+
export declare function stoppedResult(reports: WorkerReport[], route: LeaderResult["route"]): LeaderResult;
|
|
246
262
|
/**
|
|
247
263
|
* Run a task to an integrated, pushed result. Never throws — failures (plan, provision, fan-out, merge) are
|
|
248
264
|
* captured in LeaderResult. ALWAYS destroys every provisioned worker env (leader owns the lifecycle).
|
package/dist/leader/leader.js
CHANGED
|
@@ -22,14 +22,25 @@ export function withLeaderLeg(spec, entry) {
|
|
|
22
22
|
const word = entryPermissionMode(spec.permissionMode, entry.permissionMode).effective;
|
|
23
23
|
return withUnattendedLeg(word === undefined ? spec : { ...spec, permissionMode: word });
|
|
24
24
|
}
|
|
25
|
+
export const LEADER_RUN_STOPPED = "leader run stopped at an abort checkpoint (cancel): no further work was started and nothing was pushed after the stop";
|
|
26
|
+
export function stoppedResult(reports, route) {
|
|
27
|
+
const sus = reports.filter((r) => r.status === "suspended").map((r) => ({ workerId: r.workerId, sessionId: r.sessionId }));
|
|
28
|
+
return { ok: false, reports, cancelled: true, stopped: true, error: LEADER_RUN_STOPPED, ...(route ? { route } : {}), ...(sus.length > 0 ? { suspended: sus } : {}) };
|
|
29
|
+
}
|
|
25
30
|
export async function runLeaderTask(task, durableBaseSha, deps) {
|
|
31
|
+
const signal = deps.signal;
|
|
32
|
+
const aborted = () => signal?.aborted === true;
|
|
26
33
|
let subs;
|
|
27
34
|
try {
|
|
28
35
|
subs = await deps.plan(task);
|
|
29
36
|
}
|
|
30
37
|
catch (e) {
|
|
38
|
+
if (aborted())
|
|
39
|
+
return stoppedResult([], undefined);
|
|
31
40
|
return { ok: false, reports: [], cancelled: false, error: `plan failed: ${e instanceof Error ? e.message : String(e)}` };
|
|
32
41
|
}
|
|
42
|
+
if (aborted())
|
|
43
|
+
return stoppedResult([], undefined);
|
|
33
44
|
if (subs.length === 0)
|
|
34
45
|
return { ok: false, reports: [], cancelled: false, error: "planner produced no sub-tasks" };
|
|
35
46
|
const route = subs.length === 1 ? "single" : "fanout";
|
|
@@ -37,6 +48,8 @@ export async function runLeaderTask(task, durableBaseSha, deps) {
|
|
|
37
48
|
let finalReports = [];
|
|
38
49
|
try {
|
|
39
50
|
for (const sub of subs) {
|
|
51
|
+
if (aborted())
|
|
52
|
+
return stoppedResult([], route);
|
|
40
53
|
try {
|
|
41
54
|
workers.push(await deps.provisionWorker(sub));
|
|
42
55
|
}
|
|
@@ -52,7 +65,7 @@ export async function runLeaderTask(task, durableBaseSha, deps) {
|
|
|
52
65
|
const toSubtask = (w) => ({
|
|
53
66
|
workerId: w.workerId, sessionId: w.sessionId, branch: w.branch, baseSha: w.baseSha, spec: w.spec,
|
|
54
67
|
});
|
|
55
|
-
const foBase = { runner, timeoutMs: deps.timeoutMs, maxConcurrency: deps.maxConcurrency, cancelOnSuspend: true, ...(deps.logger ? { logger: deps.logger } : {}) };
|
|
68
|
+
const foBase = { runner, timeoutMs: deps.timeoutMs, maxConcurrency: deps.maxConcurrency, cancelOnSuspend: true, ...(signal ? { signal } : {}), ...(deps.logger ? { logger: deps.logger } : {}) };
|
|
56
69
|
const runWave = async (sts) => {
|
|
57
70
|
if (!deps.verifyWorker) {
|
|
58
71
|
return fanOut(sts, {
|
|
@@ -149,12 +162,16 @@ export async function runLeaderTask(task, durableBaseSha, deps) {
|
|
|
149
162
|
return runWave([toSubtask(solo)]);
|
|
150
163
|
}
|
|
151
164
|
};
|
|
165
|
+
if (aborted())
|
|
166
|
+
return stoppedResult([], route);
|
|
152
167
|
const fo1 = route === "single" && workers.length === 1
|
|
153
168
|
? await runSolo(workers[0], subs[0])
|
|
154
169
|
: await runWave(workers.map(toSubtask));
|
|
155
170
|
let reports = fo1.reports;
|
|
156
171
|
let cancelled = fo1.cancelled;
|
|
157
172
|
finalReports = reports;
|
|
173
|
+
if (aborted())
|
|
174
|
+
return stoppedResult(finalReports, route);
|
|
158
175
|
const workerRepoDir = deps.workerRepoDir ?? deps.repoDir;
|
|
159
176
|
const workerDiff = (w) => w.fetchDiff
|
|
160
177
|
? w.fetchDiff()
|
|
@@ -193,6 +210,8 @@ export async function runLeaderTask(task, durableBaseSha, deps) {
|
|
|
193
210
|
const w = byId.get(r.workerId);
|
|
194
211
|
const sub = subById.get(r.workerId);
|
|
195
212
|
for (let attempt = 0; attempt <= maxR; attempt++) {
|
|
213
|
+
if (aborted())
|
|
214
|
+
return;
|
|
196
215
|
const d = await workerDiff(w);
|
|
197
216
|
if (!d.ok)
|
|
198
217
|
return;
|
|
@@ -201,6 +220,8 @@ export async function runLeaderTask(task, durableBaseSha, deps) {
|
|
|
201
220
|
r.repairs = attempt;
|
|
202
221
|
if (verdict.ok)
|
|
203
222
|
return;
|
|
223
|
+
if (aborted())
|
|
224
|
+
return;
|
|
204
225
|
const safeVerdictReason = redactErrorMessage(verdict.reason ?? "behaviorally incorrect") ?? "";
|
|
205
226
|
if (attempt === maxR) {
|
|
206
227
|
r.status = "failed";
|
|
@@ -209,7 +230,7 @@ export async function runLeaderTask(task, durableBaseSha, deps) {
|
|
|
209
230
|
}
|
|
210
231
|
deps.logger?.info?.("module_repair", { workerId: r.workerId, attempt: attempt + 1, reason: redactHead(verdict.reason ?? "", 500) });
|
|
211
232
|
try {
|
|
212
|
-
const rr = await w.runner.runTaskStream(withLeaderLeg({ ...sub.spec, objective: deps.moduleGate.repairObjective(sub, safeVerdictReason), sessionId: `${w.sessionId}-r${attempt + 1}
|
|
233
|
+
const rr = await w.runner.runTaskStream(withLeaderLeg({ ...sub.spec, objective: deps.moduleGate.repairObjective(sub, safeVerdictReason), sessionId: `${w.sessionId}-r${attempt + 1}`, ...(signal ? { signal } : {}) }, deps.entry)).result();
|
|
213
234
|
if (r.stats && rr?.stats)
|
|
214
235
|
r.stats = { ...r.stats, tokens: (r.stats.tokens ?? 0) + (rr.stats.tokens ?? 0), costMicroUsd: (r.stats.costMicroUsd ?? 0) + (rr.stats.costMicroUsd ?? 0) };
|
|
215
236
|
}
|
|
@@ -222,6 +243,8 @@ export async function runLeaderTask(task, durableBaseSha, deps) {
|
|
|
222
243
|
}));
|
|
223
244
|
};
|
|
224
245
|
await runModuleGate();
|
|
246
|
+
if (aborted())
|
|
247
|
+
return stoppedResult(finalReports, route);
|
|
225
248
|
const mergeDeps = {
|
|
226
249
|
pullWorkerDiff: async (r) => workerDiff(byId.get(r.workerId)),
|
|
227
250
|
provisionIntegrationSandbox: deps.provisionIntegrationSandbox,
|
|
@@ -232,6 +255,7 @@ export async function runLeaderTask(task, durableBaseSha, deps) {
|
|
|
232
255
|
...(deps.mergeGates?.measureGates ? { measureGates: true } : {}),
|
|
233
256
|
...(deps.mergeGates?.strongOracleSeeded ? { strongOracleSeeded: true } : {}),
|
|
234
257
|
...(deps.mergeGates?.measureDrivesRepair ? { measureDrivesRepair: deps.mergeGates.measureDrivesRepair } : {}),
|
|
258
|
+
...(signal ? { signal } : {}),
|
|
235
259
|
...(deps.logger ? { logger: deps.logger } : {}),
|
|
236
260
|
};
|
|
237
261
|
let redispatched;
|
|
@@ -260,8 +284,10 @@ export async function runLeaderTask(task, durableBaseSha, deps) {
|
|
|
260
284
|
});
|
|
261
285
|
const collapseToSingle = async (trigger, reason) => {
|
|
262
286
|
const safeReason = redactHead(reason, 300);
|
|
263
|
-
deps.logger?.warn?.("replan_collapse_to_single", { trigger, reason: safeReason });
|
|
264
287
|
const replan = { trigger, collapsed: safeReason, ...(redispatched ? { redispatched } : {}) };
|
|
288
|
+
if (aborted())
|
|
289
|
+
return { ...stoppedResult(finalReports, route), replan };
|
|
290
|
+
deps.logger?.warn?.("replan_collapse_to_single", { trigger, reason: safeReason });
|
|
265
291
|
const soloSub = { workerId: "collapse-solo", branch: "worker/collapse-solo", files: ["."], spec: { objective: task } };
|
|
266
292
|
let solo;
|
|
267
293
|
try {
|
|
@@ -274,12 +300,18 @@ export async function runLeaderTask(task, durableBaseSha, deps) {
|
|
|
274
300
|
workers.push(solo);
|
|
275
301
|
byId.set(solo.workerId, solo);
|
|
276
302
|
bySession.set(solo.sessionId, solo);
|
|
303
|
+
if (aborted())
|
|
304
|
+
return { ...stoppedResult(finalReports, route), replan };
|
|
277
305
|
const fo = await runSolo(solo, soloSub);
|
|
278
306
|
finalReports = [...reports, ...fo.reports];
|
|
307
|
+
if (aborted())
|
|
308
|
+
return { ...stoppedResult(finalReports, route), replan };
|
|
279
309
|
const sus = await surfaceSuspended(finalReports, fo.reports);
|
|
280
310
|
if (sus)
|
|
281
311
|
return { ...sus, replan: { ...replan, trigger: "suspended" }, ...(repairTerminal ? { repairTerminal } : {}), ...(candidatePatch ? { candidatePatch } : {}) };
|
|
282
312
|
const m = await mergeBranches(fo.reports, durableBaseSha, mergeDeps);
|
|
313
|
+
if (!m.ok && m.stopped)
|
|
314
|
+
return { ...stoppedResult(finalReports, route), merge: m, replan };
|
|
283
315
|
if (!m.ok && m.conflict) {
|
|
284
316
|
const cc = m.conflict;
|
|
285
317
|
deps.logger?.warn?.("merge_conflict_to_user", { conflicted: cc.conflicted, applied: cc.applied, files: cc.files.slice(0, 20) });
|
|
@@ -325,6 +357,8 @@ export async function runLeaderTask(task, durableBaseSha, deps) {
|
|
|
325
357
|
const fresh = [];
|
|
326
358
|
try {
|
|
327
359
|
for (const id of failedIds) {
|
|
360
|
+
if (aborted())
|
|
361
|
+
return stoppedResult(finalReports, route);
|
|
328
362
|
const w = await deps.provisionWorker(subById.get(id));
|
|
329
363
|
fresh.push(w);
|
|
330
364
|
workers.push(w);
|
|
@@ -342,6 +376,8 @@ export async function runLeaderTask(task, durableBaseSha, deps) {
|
|
|
342
376
|
const retryById = new Map(fo2.reports.map((r) => [r.workerId, r]));
|
|
343
377
|
reports = reports.map((r) => retryById.get(r.workerId) ?? r);
|
|
344
378
|
finalReports = reports;
|
|
379
|
+
if (aborted())
|
|
380
|
+
return stoppedResult(finalReports, route);
|
|
345
381
|
const sus2 = await surfaceSuspended(reports, fo2.reports);
|
|
346
382
|
if (sus2)
|
|
347
383
|
return sus2;
|
|
@@ -351,7 +387,11 @@ export async function runLeaderTask(task, durableBaseSha, deps) {
|
|
|
351
387
|
}
|
|
352
388
|
}
|
|
353
389
|
}
|
|
390
|
+
if (aborted())
|
|
391
|
+
return stoppedResult(finalReports, route);
|
|
354
392
|
const merge = await mergeBranches(reports, durableBaseSha, mergeDeps);
|
|
393
|
+
if (!merge.ok && merge.stopped)
|
|
394
|
+
return { ...stoppedResult(finalReports, route), merge };
|
|
355
395
|
if (!merge.ok && merge.conflict) {
|
|
356
396
|
const c = merge.conflict;
|
|
357
397
|
deps.logger?.warn?.("merge_conflict_to_user", { conflicted: c.conflicted, applied: c.applied, files: c.files.slice(0, 20) });
|