@sema-agent/server 7.147.0 → 7.149.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 +1468 -24
- package/README.md +35 -7
- package/README.zh-CN.md +18 -8
- package/USAGE.md +444 -193
- 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/approval-card.d.ts +36 -38
- package/dist/approval-gate-currency.js +3 -2
- package/dist/approval-leg-origin.d.ts +33 -0
- package/dist/approval-leg-origin.js +4 -0
- 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 +9 -15
- package/dist/auth-bridge.js +4 -11
- package/dist/auth-keys.d.ts +10 -1
- package/dist/auth-keys.js +8 -0
- 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 +47 -42
- package/dist/boot/execution-lane.d.ts +6 -4
- package/dist/boot/execution-lane.js +3 -1
- 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-delivery.d.ts +3 -2
- 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 +60 -70
- 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 +14 -5
- 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.d.ts +1 -0
- package/dist/boot/stage-01-config.js +13 -4
- package/dist/boot/stage-02-web-admin-pull.d.ts +2 -0
- package/dist/boot/stage-02-web-admin-pull.js +16 -3
- package/dist/boot/stage-03-store-backend.d.ts +4 -0
- package/dist/boot/stage-03-store-backend.js +4 -3
- package/dist/boot/stage-04-stores.d.ts +3 -0
- package/dist/boot/stage-04-stores.js +2 -2
- package/dist/boot/stage-05-execution-env.d.ts +8 -3
- package/dist/boot/stage-05-execution-env.js +2 -2
- package/dist/boot/stage-06-runners.d.ts +12 -13
- package/dist/boot/stage-06-runners.js +23 -15
- package/dist/boot/stage-07-capability-layer.d.ts +13 -9
- package/dist/boot/stage-07-capability-layer.js +5 -3
- package/dist/boot/stage-08-reapers.d.ts +13 -9
- package/dist/boot/stage-08-reapers.js +3 -3
- package/dist/boot/stage-09-leader.d.ts +14 -16
- package/dist/boot/stage-09-leader.js +12 -4
- package/dist/boot/stage-10-http-server.d.ts +14 -16
- 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 +6 -0
- package/dist/boot/stores.js +41 -27
- 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 +39 -11
- package/dist/capability-facts.js +35 -7
- package/dist/card-settle-stored-scope.d.ts +56 -0
- package/dist/card-settle-stored-scope.js +27 -0
- package/dist/card-void.d.ts +8 -13
- package/dist/card-void.js +2 -7
- package/dist/center-credential-renewer.d.ts +6 -2
- package/dist/center-credential-renewer.js +7 -3
- package/dist/config-catalog.d.ts +28 -1
- package/dist/config-catalog.js +95 -85
- package/dist/config-dir-trust.d.ts +37 -4
- package/dist/config-dir-trust.js +88 -44
- package/dist/config-invariants.d.ts +43 -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 +62 -21
- package/dist/config.d.ts +14 -21
- package/dist/config.js +141 -64
- package/dist/context-window-notice.d.ts +31 -0
- package/dist/context-window-notice.js +28 -0
- 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 +46 -11
- package/dist/deployment-shape.js +8 -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-name-allowlist-knobs.d.ts +6 -5
- package/dist/env-name-allowlist-knobs.js +5 -0
- package/dist/env-witness.d.ts +7 -0
- package/dist/env-witness.js +16 -0
- package/dist/execution-lane-caps.d.ts +25 -23
- package/dist/execution-lane-caps.js +18 -26
- 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/command-spawn.d.ts +7 -2
- package/dist/hooks/command-spawn.js +13 -6
- package/dist/hooks/hook-llm.d.ts +5 -1
- package/dist/hooks/hook-llm.js +24 -15
- package/dist/hooks/hook-runner.d.ts +72 -57
- package/dist/hooks/hook-runner.js +271 -193
- 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 +76 -79
- package/dist/http/approval-sweeps.d.ts +3 -3
- package/dist/http/approval-sweeps.js +56 -31
- 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 +16 -8
- package/dist/http/claimed-run.js +8 -0
- package/dist/http/dispatch.d.ts +8 -1
- package/dist/http/dispatch.js +78 -30
- package/dist/http/durable-run-leg.d.ts +11 -4
- package/dist/http/durable-run-leg.js +45 -21
- package/dist/http/execution-context.d.ts +122 -47
- package/dist/http/execution-context.js +135 -43
- 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 +392 -67
- package/dist/http/owner-access.js +370 -35
- package/dist/http/principal-gate.d.ts +39 -89
- package/dist/http/principal-gate.js +26 -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 +46 -12
- package/dist/http/resume-ctx-read.js +31 -6
- package/dist/http/resume-legs.d.ts +54 -19
- package/dist/http/resume-legs.js +408 -196
- package/dist/http/retired-skill-manifest.d.ts +1 -1
- package/dist/http/route-ctx.d.ts +31 -32
- package/dist/http/routes/a2a-serve.d.ts +43 -5
- package/dist/http/routes/a2a-serve.js +60 -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 +73 -67
- 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 +16 -19
- 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 +29 -3
- package/dist/http/routes/diagnostics.js +49 -18
- 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 +4 -2
- package/dist/http/routes/principal-inbox.js +5 -4
- 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 +155 -237
- 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 +28 -7
- package/dist/http/routes/session-sync.js +63 -50
- 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 +237 -187
- 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 +43 -45
- package/dist/http/server.js +61 -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 +17 -8
- package/dist/http/submit-ctx.js +8 -5
- 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 +4 -1
- package/dist/index.js +2 -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/leg-facts.d.ts +7 -2
- package/dist/leg-facts.js +1 -0
- package/dist/local-store-declaration.d.ts +54 -0
- package/dist/local-store-declaration.js +59 -0
- package/dist/lsp-evict.d.ts +6 -4
- package/dist/lsp-evict.js +2 -3
- package/dist/mcp-assertion-header.d.ts +1 -1
- package/dist/mcp-assertion-header.js +1 -1
- package/dist/memory-operator-faces.d.ts +5 -4
- package/dist/memory-operator-faces.js +1 -1
- package/dist/memory-project-layer.js +1 -1
- package/dist/memory-scope.d.ts +33 -6
- package/dist/memory-scope.js +68 -19
- package/dist/memory-store-refusal.d.ts +5 -2
- package/dist/memory-sync-client.d.ts +3 -2
- package/dist/memory-sync-client.js +8 -5
- package/dist/model-compat.d.ts +17 -8
- package/dist/model-compat.js +6 -2
- package/dist/model-context-window.d.ts +57 -0
- package/dist/model-context-window.js +21 -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 +40 -20
- package/dist/model-entry-refusal.js +57 -30
- 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-reach-scope.d.ts +2 -1
- 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 +72 -40
- package/dist/observability/fail-open.js +74 -40
- package/dist/observability/logger.d.ts +22 -1
- package/dist/observability/logger.js +89 -12
- package/dist/observability/metrics.js +4 -5
- 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 +6 -2
- package/dist/observability/secret-env-scrub.d.ts +1 -1
- package/dist/observability/secret-env-scrub.js +1 -1
- 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 +36 -10
- package/dist/org-delivery-gate.js +12 -8
- 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 +532 -0
- package/dist/owner-faces.js +126 -0
- package/dist/park-row-commit.d.ts +67 -0
- package/dist/park-row-commit.js +76 -0
- package/dist/parked-decide.d.ts +76 -12
- package/dist/parked-decide.js +152 -11
- package/dist/parked-revive-surface.d.ts +14 -4
- package/dist/parked-revive-surface.js +5 -4
- package/dist/peer-directory.d.ts +7 -9
- 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 +3 -25
- package/dist/plugins/adoption-log-sql.js +23 -21
- 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 +40 -21
- package/dist/plugins/approval-ask-store-sql.js +44 -15
- package/dist/plugins/approval-exemption-skill-cutoff.d.ts +64 -0
- package/dist/plugins/approval-exemption-skill-cutoff.js +122 -0
- package/dist/plugins/approval-exemption-skill-m46.d.ts +14 -0
- package/dist/plugins/approval-exemption-skill-m46.js +21 -0
- package/dist/plugins/approval-exemption-store.d.ts +32 -2
- package/dist/plugins/approval-exemption-store.js +42 -19
- 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 +36 -18
- package/dist/plugins/ensure-schema-lock-policy.js +76 -9
- package/dist/plugins/file-run-store.d.ts +85 -32
- package/dist/plugins/file-run-store.js +177 -94
- 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 +62 -23
- package/dist/plugins/local-checkpoint-store.js +197 -77
- package/dist/plugins/local-data-dir-modes-m39.js +2 -1
- package/dist/plugins/local-data-root-admission.d.ts +52 -0
- package/dist/plugins/local-data-root-admission.js +100 -0
- 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 +29 -6
- package/dist/plugins/local-engine-high-water.js +27 -19
- package/dist/plugins/local-session-store.d.ts +458 -140
- package/dist/plugins/local-session-store.js +906 -292
- 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 +53 -36
- package/dist/plugins/memory-run-store.js +116 -88
- package/dist/plugins/one-time-migration-marker.d.ts +26 -0
- package/dist/plugins/one-time-migration-marker.js +13 -0
- package/dist/plugins/one-time-migrations.d.ts +214 -47
- package/dist/plugins/one-time-migrations.js +481 -135
- package/dist/plugins/org-delivery-quota-store.d.ts +34 -11
- package/dist/plugins/org-delivery-quota-store.js +31 -15
- package/dist/plugins/permission-rule-store-file.d.ts +3 -3
- package/dist/plugins/permission-rule-store-sql.d.ts +5 -64
- package/dist/plugins/permission-rule-store-sql.js +11 -95
- package/dist/plugins/pg-pool.d.ts +2 -32
- package/dist/plugins/pg-pool.js +24 -17
- package/dist/plugins/remote-env-device.d.ts +3 -2
- package/dist/plugins/remote-env-e2b.d.ts +8 -32
- package/dist/plugins/remote-env-e2b.js +44 -32
- package/dist/plugins/remote-env-host.d.ts +51 -17
- package/dist/plugins/remote-env-host.js +111 -42
- package/dist/plugins/remote-env-k8s.d.ts +40 -45
- package/dist/plugins/remote-env-k8s.js +111 -60
- package/dist/plugins/remote-env-local-docker.d.ts +152 -15
- package/dist/plugins/remote-env-local-docker.js +352 -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 +82 -75
- package/dist/plugins/run-store-sql.js +164 -125
- 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 +56 -0
- package/dist/plugins/scenario-prefix-switch-m42.js +56 -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 +131 -14
- package/dist/plugins/schema-consistency.js +388 -18
- package/dist/plugins/schema-drift-sentence.d.ts +10 -6
- package/dist/plugins/schema-drift-sentence.js +15 -7
- 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 +27 -20
- 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 +42 -0
- package/dist/plugins/shell-sentinel-owner-m48.js +9 -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/stop-then-start-sentence.d.ts +16 -0
- package/dist/plugins/stop-then-start-sentence.js +7 -0
- package/dist/plugins/store-backend.d.ts +99 -16
- package/dist/plugins/store-backend.js +230 -65
- package/dist/plugins/store-contracts.d.ts +123 -33
- package/dist/plugins/store-contracts.js +38 -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.d.ts +11 -6
- package/dist/plugins/tidb-pool.js +39 -18
- 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/plugins/workspace-custody.d.ts +44 -0
- package/dist/plugins/workspace-custody.js +47 -0
- 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/project-identity.d.ts +8 -7
- package/dist/project-identity.js +40 -17
- package/dist/project-layer-key.d.ts +13 -2
- package/dist/project-layer-key.js +9 -1
- package/dist/question.d.ts +13 -23
- package/dist/question.js +21 -39
- package/dist/read-deny-floor-notice.d.ts +36 -0
- package/dist/read-deny-floor-notice.js +40 -0
- package/dist/{plain-string-record.d.ts → request-declaration-disposition.d.ts} +9 -23
- package/dist/request-declaration-disposition.js +39 -0
- 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-cancel-card.d.ts +28 -0
- package/dist/run-cancel-card.js +19 -0
- package/dist/run-cancel-context.d.ts +10 -0
- package/dist/run-cancel-context.js +1 -0
- package/dist/run-local.d.ts +14 -6
- package/dist/run-local.js +117 -90
- package/dist/run-stale-default.d.ts +7 -0
- package/dist/run-stale-default.js +2 -0
- package/dist/runs.d.ts +56 -21
- package/dist/runs.js +73 -43
- 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 +55 -25
- package/dist/server-secret-env.js +75 -22
- package/dist/session-agent.d.ts +3 -2
- package/dist/session-children-retire.d.ts +13 -8
- package/dist/session-children-retire.js +9 -7
- 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/session-workspace.d.ts +3 -3
- package/dist/spec-fields.d.ts +57 -3
- package/dist/spec-fields.js +72 -51
- package/dist/store-admission.d.ts +33 -0
- package/dist/store-admission.js +49 -0
- package/dist/store-posture.d.ts +141 -20
- package/dist/store-posture.js +205 -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 +34 -29
- package/dist/stores-sql/checkpoint-store-sql.js +78 -49
- package/dist/stores-sql/file-history-store-sql.d.ts +1 -1
- package/dist/stores-sql/file-history-store-sql.js +3 -5
- 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/tool-result-store-sql.d.ts +1 -1
- package/dist/stores-sql/tool-result-store-sql.js +4 -6
- 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 +3 -8
- package/dist/task-a2a.js +28 -30
- package/dist/task-cwd.d.ts +43 -7
- package/dist/task-cwd.js +11 -0
- package/dist/task-mcp.d.ts +3 -3
- package/dist/task-mcp.js +4 -4
- package/dist/task-settings.d.ts +14 -10
- package/dist/task-settings.js +19 -7
- package/dist/terminal.d.ts +27 -43
- package/dist/terminal.js +49 -14
- package/dist/tool-approval.d.ts +173 -163
- package/dist/tool-approval.js +247 -232
- 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/engine-notice-wire.d.ts +24 -21
- package/dist/trace/engine-notice-wire.js +7 -3
- 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 +4 -31
- 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 +59 -44
- package/dist/trace/project.js +60 -26
- package/dist/trace/redact.d.ts +135 -27
- package/dist/trace/redact.js +884 -260
- package/dist/trace/self-minted-wire.d.ts +567 -20
- package/dist/trace/self-minted-wire.js +205 -24
- 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 +33 -23
- 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/docs/error-text-lexicon.json +317 -0
- package/package.json +8 -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/scripts/embed-minimal.mjs +183 -0
- package/wire-changes/server@7.148.0.json +1517 -0
- package/wire-changes/server@7.149.0.json +372 -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/plain-string-record.js +0 -70
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { LeaderResult } from "./leader.js";
|
|
2
2
|
import { type LeaderRunRecord, type LeaderRunStatus, type NewLeaderRun, type LeaderRunTerminal } from "../plugins/leader-run-store-sql.js";
|
|
3
3
|
import { type IdemCaller } from "../http/idempotency.js";
|
|
4
|
+
import type { Subject } from "../owner-brands.js";
|
|
5
|
+
import type { RunIdentity } from "../identity-source.js";
|
|
6
|
+
import type { LeaderParkExpiry } from "./wire.js";
|
|
4
7
|
/**
|
|
5
8
|
* endpoint 消费的 store 面(结构型,不是 nominal union):真实现是 `SqlLeaderRunStore` 的两个方言孪生,
|
|
6
9
|
* 测试用进程内假件。窄到只有 endpoint 真调的三个方法 —— 端点不该看见店的其余口。
|
|
@@ -14,6 +17,8 @@ export interface LeaderRunStore {
|
|
|
14
17
|
/** 按提交幂等键(已 scope 的定宽 hash)读行 —— `GET /v1/leader?idempotencyKey=` 的读口。 */
|
|
15
18
|
getByIdem(idemKey: string): Promise<LeaderRunRecord | undefined>;
|
|
16
19
|
finishRun(id: string, patch: LeaderRunTerminal): Promise<boolean>;
|
|
20
|
+
/** 翻耐久取消旗(只翻 `running` 行;回执 = 翻没翻)。驱动副本经 `getRun` 读它(一次读拿到状态 + 旗)。 */
|
|
21
|
+
requestCancel(id: string): Promise<boolean>;
|
|
17
22
|
}
|
|
18
23
|
export interface LeaderRequestBody {
|
|
19
24
|
/** The task to decompose + execute (the Planner turns it into N disjoint sub-tasks). */
|
|
@@ -36,6 +41,10 @@ export interface LeaderRun {
|
|
|
36
41
|
/** BL-4: the principal that submitted this run (null = anonymous/single-tenant). The GET is owner-checked so
|
|
37
42
|
* an owned run is visible ONLY to its owner (404 to others — no existence oracle), like GET /v1/runs/:id. */
|
|
38
43
|
owner?: string | null;
|
|
44
|
+
/** 降级臂的取消旗(店在场时以库上的旗为准,本地这一格只服务降级臂的读面)。 */
|
|
45
|
+
cancelRequested: boolean;
|
|
46
|
+
/** 取消口停下的终局带 `cancelled`。 */
|
|
47
|
+
errorCode?: LeaderRunTerminal["errorCode"];
|
|
39
48
|
}
|
|
40
49
|
export interface LeaderEndpoint {
|
|
41
50
|
/** Returns a {status,body} to send, or null if the (method,url) is not a leader route. Kicks the background
|
|
@@ -45,7 +54,9 @@ export interface LeaderEndpoint {
|
|
|
45
54
|
* header; `GET /v1/leader`: the `idempotencyKey` query — the read port "which leader run did this key create"; scoped by the
|
|
46
55
|
* caller's identity bit `principal ?? source` before it reaches the store — the one key minter `idemKeyOf(raw, caller, "leader")`).
|
|
47
56
|
* ASYNC because the durable arm reads/writes SQL. */
|
|
48
|
-
handle(method: string, url: string, body: unknown, caller?: IdemCaller, idempotencyKey?: string | null
|
|
57
|
+
handle(method: string, url: string, body: unknown, caller?: IdemCaller, idempotencyKey?: string | null,
|
|
58
|
+
/** POST 受理时的身份元组(路由经 `runIdentityOf` 铸;缺席 = `null` = 不合格)。只写进行,不上 wire。 */
|
|
59
|
+
identity?: RunIdentity | null): Promise<{
|
|
49
60
|
status: number;
|
|
50
61
|
body: object;
|
|
51
62
|
} | null>;
|
|
@@ -59,7 +70,9 @@ export interface LeaderEndpoint {
|
|
|
59
70
|
* With a store in place this Map holds only the runs THIS replica is driving. Exposed for tests. */
|
|
60
71
|
runs: Map<string, LeaderRun>;
|
|
61
72
|
}
|
|
62
|
-
|
|
73
|
+
/** 取消终局的 `error` 句(机读位是 `errorCode: "cancelled"`)。 */
|
|
74
|
+
export declare const LEADER_RUN_CANCELLED_ERROR = "leader run cancelled (POST /v1/leader/:id/cancel): it stopped at an abort checkpoint before any push";
|
|
75
|
+
export declare function createLeaderEndpoint(runLeader: (body: LeaderRequestBody, signal: AbortSignal) => Promise<LeaderResult>, opts: {
|
|
63
76
|
logger?: {
|
|
64
77
|
info?: (m: string, x?: Record<string, unknown>) => void;
|
|
65
78
|
error?: (m: string, x?: Record<string, unknown>) => void;
|
|
@@ -73,8 +86,16 @@ export declare function createLeaderEndpoint(runLeader: (body: LeaderRequestBody
|
|
|
73
86
|
requiredFields?: readonly string[];
|
|
74
87
|
/** [ref] 车4 件1:durable 登记表。缺席 ⇒ 显式的单副本内存降级臂(见文件头注)。 */
|
|
75
88
|
store?: LeaderRunStore;
|
|
76
|
-
/** [ref] RH-3:「这个调用方读得到这一行 leader run 吗」—— 属主存取器的判官形(`http/owner-access.ts` 的 `
|
|
77
|
-
* 必填:本模块不自判属主(修前手抄 `owner == null || owner === requester`,缺 [ref] C8 窄互认臂而注称 mirrors
|
|
78
|
-
ownerVisible: (
|
|
89
|
+
/** [ref] RH-3:「这个调用方读得到这一行 leader run 吗」—— 属主存取器的判官形(`http/owner-access.ts` 的 `seesRunAs("run.leader")`,boot 装一次)。
|
|
90
|
+
* 必填:本模块不自判属主(修前手抄 `owner == null || owner === requester`,缺 [ref] C8 窄互认臂而注称 mirrors admitRunRow),读面与幂等重放同读它。 */
|
|
91
|
+
ownerVisible: (subject: Subject | null | undefined, owner: string | null | undefined) => boolean;
|
|
92
|
+
/** 过期一组 worker 会话的待决停驻(`wire.ts` 的 `createLeaderParkExpirer`,boot 在有 checkpoint 店时递)。缺席 = 本部署没有 checkpoint 店 ⇒
|
|
93
|
+
* worker 由构造即不可能停驻(durable spec 要那只店),没有可过期的东西。 */
|
|
94
|
+
expireWorkerParks?: (workers: ReadonlyArray<{
|
|
95
|
+
readonly workerId: string;
|
|
96
|
+
readonly sessionId: string;
|
|
97
|
+
}>) => Promise<LeaderParkExpiry>;
|
|
98
|
+
/** 旗读拍距(ms)。缺席 = `LIVENESS_HEARTBEAT_MS`(与 run 心跳同一个数);测试注入短拍。 */
|
|
99
|
+
cancelPollMs?: number;
|
|
79
100
|
}): LeaderEndpoint;
|
|
80
101
|
//# sourceMappingURL=endpoint.d.ts.map
|
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).
|