@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,25 +1,36 @@
|
|
|
1
|
-
import { redactErrorMessage, redactLedgerEventData, sealRunRowResult } from "../observability/run-terminal.js";
|
|
2
|
-
import { outwardPlane } from "../terminal.js";
|
|
1
|
+
import { redactErrorMessage, redactLedgerEventData, runRowErrorCodeOf, sealRunRowResult } from "../observability/run-terminal.js";
|
|
2
|
+
import { outwardPlane, persistedPlaneOf } from "../terminal.js";
|
|
3
3
|
import { projectUsageStats, USAGE_SCAN_LIMIT } from "../usage-analytics.js";
|
|
4
|
-
import { escapeLike } from "./sql-escape.js";
|
|
5
4
|
import { pgSanitizeText } from "./pg-safe-json.js";
|
|
6
5
|
import { toIso as iso } from "./sql-row-helpers.js";
|
|
7
6
|
import { recordFailOpen } from "../observability/fail-open.js";
|
|
8
7
|
import { createObjectColumnReader, decodeJsonColumn, decodeNullableJsonColumn, foldJsonColumn, isJsonColumnBodyProblem, jsonColumnText, readJsonObjectColumn, readNonNullJsonValueColumn } from "./sql-json-column.js";
|
|
9
|
-
import { RUN_HOLDER_DEATH_CODES, RUN_STALLED_ERROR, settledLegObservationOf } from "./store-contracts.js";
|
|
8
|
+
import { RUN_HOLDER_DEATH_CODES, RUN_STALLED_ERROR, RUN_STALL_DEFAULT_WIRING, RUN_STALL_VERDICT_UNLANDED_TAG, isParkedRunStatus, isTerminalRunStatus, mintRunLegId, runLivenessOf, settledLegObservationOf } from "./store-contracts.js";
|
|
10
9
|
import { notifyRunTerminal, runTerminalLogLevel } from "../observability/run-terminal.js";
|
|
11
10
|
import { mysqlDriver, pgDriver, dialectJsonEncoder, SQL_DB_NOW_MS, sqlDbNowMs } from "./sql-driver.js";
|
|
12
11
|
import { isDupKeyError } from "./sql-errors.js";
|
|
12
|
+
import { readDeletingTokenOn } from "./session-ext-table.js";
|
|
13
13
|
import { readRunIdentityCells, runIdentityCells } from "../identity-source.js";
|
|
14
14
|
import { decideSpaceCommitAbandon, decideSpaceCommitClaim, fenceSpaceCommitAtTerminal, spaceCommitStateOf } from "../workspace-space-commit.js";
|
|
15
15
|
function runRowCols(dialect) {
|
|
16
16
|
return (`task_id, session_id, owner, status, ${jsonColumnText(dialect, "result")}, error, error_code, job_id, source, ` +
|
|
17
|
-
"identity_source, identity_scope, identity_principal_inc, instance_id, cancel_requested, objective_preview, created_at, updated_at");
|
|
17
|
+
"identity_source, identity_scope, identity_principal_inc, instance_id, leg_id, cancel_requested, objective_preview, created_at, updated_at");
|
|
18
18
|
}
|
|
19
19
|
const readPersistedTaskResultBody = createObjectColumnReader();
|
|
20
20
|
function decodeResultColumn(v, taskId) {
|
|
21
21
|
return decodeNullableJsonColumn(v, readPersistedTaskResultBody, `task_run.result for run ${taskId}`);
|
|
22
22
|
}
|
|
23
|
+
export function decodeRunResultCellM44(v, taskId) {
|
|
24
|
+
try {
|
|
25
|
+
return decodeResultColumn(v, taskId) ?? null;
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
if (!isJsonColumnBodyProblem(e))
|
|
29
|
+
throw e;
|
|
30
|
+
recordFailOpen("server.run-store.m44-result-unreadable", e.message);
|
|
31
|
+
return "unreadable";
|
|
32
|
+
}
|
|
33
|
+
}
|
|
23
34
|
function refusing(what, read) {
|
|
24
35
|
try {
|
|
25
36
|
return read();
|
|
@@ -42,10 +53,19 @@ function usageResultBody(v) {
|
|
|
42
53
|
function decodeEventDataColumn(v, taskId, seq) {
|
|
43
54
|
return decodeNullableJsonColumn(v, readNonNullJsonValueColumn, `task_event.data for run ${taskId} seq ${seq}`);
|
|
44
55
|
}
|
|
56
|
+
function m44ErrorCodeReadSide(status, result, column) {
|
|
57
|
+
if (status === "running")
|
|
58
|
+
return null;
|
|
59
|
+
if (column !== null || !isParkedRunStatus(status))
|
|
60
|
+
return column;
|
|
61
|
+
return persistedPlaneOf(result).errorCode ?? null;
|
|
62
|
+
}
|
|
45
63
|
export class SqlRunStore {
|
|
46
64
|
db;
|
|
47
|
-
|
|
65
|
+
stall;
|
|
66
|
+
constructor(db, stall = RUN_STALL_DEFAULT_WIRING) {
|
|
48
67
|
this.db = db;
|
|
68
|
+
this.stall = stall;
|
|
49
69
|
}
|
|
50
70
|
q(mysql, pg) {
|
|
51
71
|
return this.db.dialect === "mysql" ? mysql : pg;
|
|
@@ -58,6 +78,14 @@ export class SqlRunStore {
|
|
|
58
78
|
}
|
|
59
79
|
async tx(fn) {
|
|
60
80
|
const conn = await this.db.connect();
|
|
81
|
+
try {
|
|
82
|
+
await this.txOn(conn, fn);
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
conn.release();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async txOn(conn, fn) {
|
|
61
89
|
try {
|
|
62
90
|
await conn.begin();
|
|
63
91
|
await fn(conn);
|
|
@@ -71,18 +99,27 @@ export class SqlRunStore {
|
|
|
71
99
|
}
|
|
72
100
|
throw err;
|
|
73
101
|
}
|
|
102
|
+
}
|
|
103
|
+
async createRun(taskId, sessionId, owner, instanceId, meta = {}) {
|
|
104
|
+
const legId = mintRunLegId();
|
|
105
|
+
const conn = await this.db.connect();
|
|
106
|
+
try {
|
|
107
|
+
const first = await this.createRunOn(conn, taskId, sessionId, owner, instanceId, legId, meta);
|
|
108
|
+
if (first.activeTaskId === undefined || !(await this.settleDueHolderOn(conn, first.activeTaskId)))
|
|
109
|
+
return first;
|
|
110
|
+
return await this.createRunOn(conn, taskId, sessionId, owner, instanceId, legId, meta);
|
|
111
|
+
}
|
|
74
112
|
finally {
|
|
75
113
|
conn.release();
|
|
76
114
|
}
|
|
77
115
|
}
|
|
78
|
-
async
|
|
116
|
+
async createRunOn(conn, taskId, sessionId, owner, instanceId, legId, meta) {
|
|
79
117
|
const idemKey = meta.idem?.key ?? null;
|
|
80
|
-
const conn = await this.db.connect();
|
|
81
118
|
let stage = "claim";
|
|
82
119
|
try {
|
|
83
120
|
await conn.begin();
|
|
84
121
|
const { rows: root } = await conn.query(this.q("SELECT session_id FROM session_meta WHERE session_id = ? FOR UPDATE", "SELECT session_id FROM session_meta WHERE session_id = $1 FOR UPDATE"), [sessionId]);
|
|
85
|
-
if (root.length === 0) {
|
|
122
|
+
if (root.length === 0 || (await readDeletingTokenOn(async (sql, values) => (await conn.query(sql, [...values])).rows, this.db.dialect, sessionId)) !== null) {
|
|
86
123
|
await conn.rollback();
|
|
87
124
|
return { ok: false, sessionAbsent: true };
|
|
88
125
|
}
|
|
@@ -91,13 +128,14 @@ export class SqlRunStore {
|
|
|
91
128
|
await conn.query(this.q("INSERT INTO task_active (session_id, task_id, since) VALUES (?,?,?)", "INSERT INTO task_active (session_id, task_id, since) VALUES ($1,$2,$3)"), [sessionId, taskId, now]);
|
|
92
129
|
stage = "row";
|
|
93
130
|
const cells = runIdentityCells(meta.identity ?? null);
|
|
94
|
-
await conn.query(this.q("INSERT INTO task_run (task_id, session_id, owner, status, instance_id, job_id, source, identity_source, identity_scope, identity_principal_inc, objective_preview, idem_key, idem_body_fingerprint, created_at, updated_at) " +
|
|
95
|
-
"VALUES (?,?,?,'running'
|
|
96
|
-
"VALUES ($1,$2,$3,'running',$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14)"), [
|
|
131
|
+
await conn.query(this.q("INSERT INTO task_run (task_id, session_id, owner, status, instance_id, leg_id, job_id, source, identity_source, identity_scope, identity_principal_inc, objective_preview, idem_key, idem_body_fingerprint, created_at, updated_at) " +
|
|
132
|
+
"VALUES (?,?,?,'running',?,?,?,?,?,?,?,?,?,?,?,?)", "INSERT INTO task_run (task_id, session_id, owner, status, instance_id, leg_id, job_id, source, identity_source, identity_scope, identity_principal_inc, objective_preview, idem_key, idem_body_fingerprint, created_at, updated_at) " +
|
|
133
|
+
"VALUES ($1,$2,$3,'running',$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15)"), [
|
|
97
134
|
taskId,
|
|
98
135
|
sessionId,
|
|
99
136
|
owner,
|
|
100
137
|
instanceId,
|
|
138
|
+
legId,
|
|
101
139
|
meta.jobId ?? null,
|
|
102
140
|
meta.source ?? null,
|
|
103
141
|
cells.identitySource,
|
|
@@ -114,7 +152,7 @@ export class SqlRunStore {
|
|
|
114
152
|
now,
|
|
115
153
|
]);
|
|
116
154
|
await conn.commit();
|
|
117
|
-
return { ok: true };
|
|
155
|
+
return { ok: true, legId };
|
|
118
156
|
}
|
|
119
157
|
catch (err) {
|
|
120
158
|
if (!this.isDupKey(err))
|
|
@@ -137,9 +175,62 @@ export class SqlRunStore {
|
|
|
137
175
|
}
|
|
138
176
|
throw err;
|
|
139
177
|
}
|
|
140
|
-
|
|
141
|
-
|
|
178
|
+
}
|
|
179
|
+
async settleDueHolderOn(conn, holderTaskId) {
|
|
180
|
+
const { rows } = await conn.query(this.q("SELECT status, updated_at FROM task_run WHERE task_id = ?", "SELECT status, updated_at FROM task_run WHERE task_id = $1"), [holderTaskId]);
|
|
181
|
+
const row = rows[0];
|
|
182
|
+
if (row === undefined)
|
|
183
|
+
return false;
|
|
184
|
+
const nowMs = Date.now();
|
|
185
|
+
const windowMs = this.stall.windowMs();
|
|
186
|
+
if (runLivenessOf({ status: String(row.status), updatedAt: iso(row.updated_at) }, nowMs, windowMs) !== "due")
|
|
187
|
+
return false;
|
|
188
|
+
let landed = 0;
|
|
189
|
+
try {
|
|
190
|
+
await this.txOn(conn, async (c) => {
|
|
191
|
+
landed = await this.landStallVerdicts(c, new Date(nowMs - windowMs), holderTaskId);
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
recordFailOpen(RUN_STALL_VERDICT_UNLANDED_TAG, err instanceof Error ? err.message : String(err));
|
|
196
|
+
return false;
|
|
142
197
|
}
|
|
198
|
+
if (landed > 0)
|
|
199
|
+
this.stall.onVerdicts(landed);
|
|
200
|
+
return landed > 0;
|
|
201
|
+
}
|
|
202
|
+
async landStallVerdicts(conn, cutoff, taskId) {
|
|
203
|
+
const one = taskId !== undefined;
|
|
204
|
+
const { affected } = await conn.query(this.q(`UPDATE task_run SET status = 'failed', result = NULL, error = '${RUN_STALLED_ERROR}', error_code = '${RUN_HOLDER_DEATH_CODES.stalled}', updated_at = ? ` +
|
|
205
|
+
`WHERE status = 'running' AND updated_at < ?${one ? " AND task_id = ?" : ""}`, `UPDATE task_run SET status = 'failed', result = NULL, error = '${RUN_STALLED_ERROR}', error_code = '${RUN_HOLDER_DEATH_CODES.stalled}', updated_at = $1 ` +
|
|
206
|
+
`WHERE status = 'running' AND updated_at < $2${one ? " AND task_id = $3" : ""}`), one ? [new Date(), cutoff, taskId] : [new Date(), cutoff]);
|
|
207
|
+
if (one) {
|
|
208
|
+
if (affected === 1)
|
|
209
|
+
await conn.query(this.q("DELETE FROM task_active WHERE task_id = ?", "DELETE FROM task_active WHERE task_id = $1"), [taskId]);
|
|
210
|
+
return affected;
|
|
211
|
+
}
|
|
212
|
+
await conn.query(this.q("DELETE ta FROM task_active ta JOIN task_run tr ON ta.task_id = tr.task_id WHERE tr.status NOT IN ('running','suspended','needs_review')", "DELETE FROM task_active ta USING task_run tr WHERE ta.task_id = tr.task_id AND tr.status NOT IN ('running','suspended','needs_review')"));
|
|
213
|
+
await conn.query(this.q("DELETE FROM task_active WHERE NOT EXISTS (SELECT 1 FROM task_run tr WHERE tr.task_id = task_active.task_id)", "DELETE FROM task_active WHERE NOT EXISTS (SELECT 1 FROM task_run tr WHERE tr.task_id = task_active.task_id)"));
|
|
214
|
+
return affected;
|
|
215
|
+
}
|
|
216
|
+
async observeRun(row) {
|
|
217
|
+
const nowMs = Date.now();
|
|
218
|
+
const windowMs = this.stall.windowMs();
|
|
219
|
+
if (runLivenessOf(row, nowMs, windowMs) !== "due")
|
|
220
|
+
return row;
|
|
221
|
+
let landed = 0;
|
|
222
|
+
try {
|
|
223
|
+
await this.tx(async (conn) => {
|
|
224
|
+
landed = await this.landStallVerdicts(conn, new Date(nowMs - windowMs), row.taskId);
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
catch (err) {
|
|
228
|
+
recordFailOpen(RUN_STALL_VERDICT_UNLANDED_TAG, err instanceof Error ? err.message : String(err));
|
|
229
|
+
return row;
|
|
230
|
+
}
|
|
231
|
+
if (landed > 0)
|
|
232
|
+
this.stall.onVerdicts(landed);
|
|
233
|
+
return (await this.getRun(row.taskId)) ?? row;
|
|
143
234
|
}
|
|
144
235
|
async fillObjectivePreview(taskId, preview) {
|
|
145
236
|
await this.db.query(this.q("UPDATE task_run SET objective_preview = ? WHERE task_id = ? AND objective_preview IS NULL", "UPDATE task_run SET objective_preview = $1 WHERE task_id = $2 AND objective_preview IS NULL"), [this.db.dialect === "mysql" ? preview : pgSanitizeText(preview), taskId]);
|
|
@@ -161,7 +252,11 @@ export class SqlRunStore {
|
|
|
161
252
|
return Boolean(rows[0]?.preempt_requested);
|
|
162
253
|
}
|
|
163
254
|
async heartbeat(taskId, owner) {
|
|
164
|
-
await this.db.query(this.q("UPDATE task_run SET updated_at = ? WHERE task_id = ? AND owner <=> ? AND status = 'running'", "UPDATE task_run SET updated_at = $1 WHERE task_id = $2 AND owner IS NOT DISTINCT FROM $3 AND status = 'running'"), [new Date(), taskId, owner]);
|
|
255
|
+
const { affected } = await this.db.query(this.q("UPDATE task_run SET updated_at = ? WHERE task_id = ? AND owner <=> ? AND status = 'running'", "UPDATE task_run SET updated_at = $1 WHERE task_id = $2 AND owner IS NOT DISTINCT FROM $3 AND status = 'running'"), [new Date(), taskId, owner]);
|
|
256
|
+
if (affected > 0)
|
|
257
|
+
return true;
|
|
258
|
+
const { rows } = await this.db.query(this.q("SELECT status FROM task_run WHERE task_id = ?", "SELECT status FROM task_run WHERE task_id = $1"), [taskId]);
|
|
259
|
+
return rows[0] !== undefined && String(rows[0].status) === "running";
|
|
165
260
|
}
|
|
166
261
|
async appendEvent(taskId, seq, type, data) {
|
|
167
262
|
data = redactLedgerEventData(type, data);
|
|
@@ -175,7 +270,7 @@ export class SqlRunStore {
|
|
|
175
270
|
async setTerminal(taskId, status, result, error) {
|
|
176
271
|
result = sealRunRowResult(result);
|
|
177
272
|
error = error === null ? null : (redactErrorMessage(error) ?? null);
|
|
178
|
-
const errorCode =
|
|
273
|
+
const errorCode = runRowErrorCodeOf(result);
|
|
179
274
|
let won = false;
|
|
180
275
|
let observed;
|
|
181
276
|
await fenceSpaceCommitAtTerminal(taskId, async (spaceCommit) => {
|
|
@@ -270,17 +365,20 @@ export class SqlRunStore {
|
|
|
270
365
|
}
|
|
271
366
|
}
|
|
272
367
|
}
|
|
273
|
-
async setSuspended(taskId, result) {
|
|
368
|
+
async setSuspended(taskId, result, legId) {
|
|
274
369
|
const sealed = sealRunRowResult(result);
|
|
275
|
-
await this.db.query(this.q("UPDATE task_run SET status = 'suspended', result = ?, updated_at = ? WHERE task_id = ? AND status IN ('running','suspended')", "UPDATE task_run SET status = 'suspended', result = $1::jsonb,
|
|
370
|
+
const { affected } = await this.db.query(this.q("UPDATE task_run SET status = 'suspended', result = ?, error_code = ?, updated_at = ? WHERE task_id = ? AND leg_id = ? AND status IN ('running','suspended') AND cancel_requested = 0", "UPDATE task_run SET status = 'suspended', result = $1::jsonb, error_code = $2, updated_at = $3 WHERE task_id = $4 AND leg_id = $5 AND status IN ('running','suspended') AND cancel_requested = 0"), [sealed == null ? null : this.json(sealed), runRowErrorCodeOf(sealed), new Date(), taskId, legId]);
|
|
371
|
+
return affected > 0;
|
|
276
372
|
}
|
|
277
|
-
async setNeedsReview(taskId, result) {
|
|
373
|
+
async setNeedsReview(taskId, result, legId) {
|
|
278
374
|
const sealed = sealRunRowResult(result);
|
|
279
|
-
await this.db.query(this.q("UPDATE task_run SET status = 'needs_review', result = ?, updated_at = ? WHERE task_id = ? AND status IN ('running','needs_review')", "UPDATE task_run SET status = 'needs_review', result = $1::jsonb,
|
|
375
|
+
const { affected } = await this.db.query(this.q("UPDATE task_run SET status = 'needs_review', result = ?, error_code = ?, updated_at = ? WHERE task_id = ? AND leg_id = ? AND status IN ('running','needs_review') AND cancel_requested = 0", "UPDATE task_run SET status = 'needs_review', result = $1::jsonb, error_code = $2, updated_at = $3 WHERE task_id = $4 AND leg_id = $5 AND status IN ('running','needs_review') AND cancel_requested = 0"), [sealed == null ? null : this.json(sealed), runRowErrorCodeOf(sealed), new Date(), taskId, legId]);
|
|
376
|
+
return affected > 0;
|
|
280
377
|
}
|
|
281
378
|
async markResuming(taskId, instanceId) {
|
|
282
|
-
const
|
|
283
|
-
|
|
379
|
+
const legId = mintRunLegId();
|
|
380
|
+
const { affected } = await this.db.query(this.q("UPDATE task_run SET status = 'running', cancel_requested = 0, preempt_requested = 0, result = NULL, error_code = NULL, instance_id = ?, leg_id = ?, updated_at = ? WHERE task_id = ? AND status IN ('suspended','needs_review')", "UPDATE task_run SET status = 'running', cancel_requested = 0, preempt_requested = 0, result = NULL, error_code = NULL, instance_id = $1, leg_id = $2, updated_at = $3 WHERE task_id = $4 AND status IN ('suspended','needs_review')"), [instanceId, legId, new Date(), taskId]);
|
|
381
|
+
return affected === 1 ? legId : undefined;
|
|
284
382
|
}
|
|
285
383
|
async whileHoldingClaim(sessionId, taskId, write) {
|
|
286
384
|
let fenced = { held: false };
|
|
@@ -303,18 +401,20 @@ export class SqlRunStore {
|
|
|
303
401
|
return rows[0] ? String(rows[0].task_id) : undefined;
|
|
304
402
|
}
|
|
305
403
|
rowToRun(r) {
|
|
404
|
+
const result = refusing("serve a finished run as if it had produced nothing", () => decodeResultColumn(r.result, String(r.task_id))) ?? null;
|
|
306
405
|
return {
|
|
307
406
|
taskId: String(r.task_id),
|
|
308
407
|
sessionId: String(r.session_id),
|
|
309
408
|
owner: r.owner ?? null,
|
|
310
409
|
status: r.status,
|
|
311
|
-
result
|
|
410
|
+
result,
|
|
312
411
|
error: r.error ?? null,
|
|
313
|
-
errorCode: r.error_code ?? null,
|
|
412
|
+
errorCode: m44ErrorCodeReadSide(String(r.status), result, r.error_code ?? null),
|
|
314
413
|
jobId: r.job_id ?? null,
|
|
315
414
|
source: r.source ?? null,
|
|
316
415
|
identity: readRunIdentityCells(r.identity_source, r.identity_scope, r.identity_principal_inc),
|
|
317
416
|
instanceId: r.instance_id ?? null,
|
|
417
|
+
legId: r.leg_id ?? null,
|
|
318
418
|
cancelRequested: Boolean(r.cancel_requested),
|
|
319
419
|
objectivePreview: r.objective_preview ?? null,
|
|
320
420
|
createdAt: iso(r.created_at),
|
|
@@ -339,7 +439,29 @@ export class SqlRunStore {
|
|
|
339
439
|
return rows[0] ? this.rowToRun(rows[0]) : undefined;
|
|
340
440
|
}
|
|
341
441
|
async releaseIdemKey(taskId) {
|
|
342
|
-
await this.db.query(this.
|
|
442
|
+
await this.db.query(this.releaseIdemKeySql(), [taskId]);
|
|
443
|
+
}
|
|
444
|
+
releaseIdemKeySql() {
|
|
445
|
+
return this.q("UPDATE task_run SET idem_key = NULL, idem_body_fingerprint = NULL WHERE task_id = ?", "UPDATE task_run SET idem_key = NULL, idem_body_fingerprint = NULL WHERE task_id = $1");
|
|
446
|
+
}
|
|
447
|
+
async withdrawMintedRun(taskId, legId) {
|
|
448
|
+
let withdrawn = false;
|
|
449
|
+
await this.tx(async (conn) => {
|
|
450
|
+
const { rows } = await conn.query(this.q("SELECT status FROM task_run WHERE task_id = ? AND leg_id = ? FOR UPDATE", "SELECT status FROM task_run WHERE task_id = $1 AND leg_id = $2 FOR UPDATE"), [taskId, legId]);
|
|
451
|
+
if (rows.length === 0)
|
|
452
|
+
return;
|
|
453
|
+
const status = rows[0].status;
|
|
454
|
+
if (status !== "running") {
|
|
455
|
+
if (isTerminalRunStatus(status))
|
|
456
|
+
await conn.query(this.releaseIdemKeySql(), [taskId]);
|
|
457
|
+
return;
|
|
458
|
+
}
|
|
459
|
+
await conn.query(this.q("DELETE FROM task_event WHERE task_id = ?", "DELETE FROM task_event WHERE task_id = $1"), [taskId]);
|
|
460
|
+
await conn.query(this.q("DELETE FROM task_active WHERE task_id = ?", "DELETE FROM task_active WHERE task_id = $1"), [taskId]);
|
|
461
|
+
await conn.query(this.q("DELETE FROM task_run WHERE task_id = ?", "DELETE FROM task_run WHERE task_id = $1"), [taskId]);
|
|
462
|
+
withdrawn = true;
|
|
463
|
+
});
|
|
464
|
+
return withdrawn;
|
|
343
465
|
}
|
|
344
466
|
async bindIdemBodyFingerprint(taskId, idem) {
|
|
345
467
|
await this.db.query(this.q("UPDATE task_run SET idem_body_fingerprint = ? WHERE task_id = ? AND idem_key = ? AND idem_body_fingerprint IS NULL", "UPDATE task_run SET idem_body_fingerprint = $1 WHERE task_id = $2 AND idem_key = $3 AND idem_body_fingerprint IS NULL"), [idem.bodyFingerprint, taskId, idem.key]);
|
|
@@ -424,89 +546,9 @@ export class SqlRunStore {
|
|
|
424
546
|
const taskId = String(r.task_id);
|
|
425
547
|
return settledLegObservationOf(taskId, refusing("read a settled leg as if it had observed no memory", () => decodeResultColumn(r.result, taskId)) ?? null);
|
|
426
548
|
}
|
|
427
|
-
async
|
|
428
|
-
if (this.db.dialect === "mysql") {
|
|
429
|
-
const params = [];
|
|
430
|
-
let innerWhere = "";
|
|
431
|
-
if (opts.owner !== undefined) {
|
|
432
|
-
innerWhere = opts.includeUnowned ? " WHERE (owner = ? OR owner IS NULL)" : " WHERE owner = ?";
|
|
433
|
-
params.push(opts.owner);
|
|
434
|
-
}
|
|
435
|
-
const outer = ["rn = 1"];
|
|
436
|
-
if (opts.q) {
|
|
437
|
-
outer.push("EXISTS (SELECT 1 FROM task_run tr WHERE tr.session_id = t.session_id AND LOWER(tr.objective_preview) LIKE LOWER(?) ESCAPE '\\\\')");
|
|
438
|
-
params.push(`%${escapeLike(opts.q)}%`);
|
|
439
|
-
}
|
|
440
|
-
if (opts.cursor) {
|
|
441
|
-
outer.push("(last_activity < ? OR (last_activity = ? AND session_id < ?))");
|
|
442
|
-
params.push(new Date(opts.cursor.lastActivityAt), new Date(opts.cursor.lastActivityAt), opts.cursor.sessionId);
|
|
443
|
-
}
|
|
444
|
-
const sql = "SELECT session_id, owner, task_id, last_activity, first_activity, run_count, objective_preview, status, last_task_run_id FROM (" +
|
|
445
|
-
"SELECT session_id, owner, task_id, objective_preview, status, JSON_UNQUOTE(JSON_EXTRACT(result, '$.runId')) AS last_task_run_id," +
|
|
446
|
-
" ROW_NUMBER() OVER (PARTITION BY session_id ORDER BY created_at DESC, task_id DESC) AS rn," +
|
|
447
|
-
" MAX(created_at) OVER (PARTITION BY session_id) AS last_activity," +
|
|
448
|
-
" MIN(created_at) OVER (PARTITION BY session_id) AS first_activity," +
|
|
449
|
-
" COUNT(*) OVER (PARTITION BY session_id) AS run_count" +
|
|
450
|
-
" FROM task_run" + innerWhere + ") t WHERE " + outer.join(" AND ") +
|
|
451
|
-
" ORDER BY last_activity DESC, session_id DESC LIMIT ?";
|
|
452
|
-
params.push(opts.limit);
|
|
453
|
-
const { rows } = await this.db.query(sql, params);
|
|
454
|
-
return rows.map((r) => this.rowToSession(r));
|
|
455
|
-
}
|
|
456
|
-
const params = [];
|
|
457
|
-
const p = (v) => {
|
|
458
|
-
params.push(v);
|
|
459
|
-
return `$${params.length}`;
|
|
460
|
-
};
|
|
461
|
-
const innerWhere = opts.owner !== undefined ? (opts.includeUnowned ? ` WHERE (owner = ${p(opts.owner)} OR owner IS NULL)` : ` WHERE owner = ${p(opts.owner)}`) : "";
|
|
462
|
-
const outer = ["rn = 1"];
|
|
463
|
-
if (opts.q)
|
|
464
|
-
outer.push(`EXISTS (SELECT 1 FROM task_run tr WHERE tr.session_id = t.session_id AND LOWER(tr.objective_preview) LIKE LOWER(${p(`%${escapeLike(opts.q)}%`)}) ESCAPE '\\')`);
|
|
465
|
-
if (opts.cursor) {
|
|
466
|
-
const a = p(new Date(opts.cursor.lastActivityAt));
|
|
467
|
-
const b = p(new Date(opts.cursor.lastActivityAt));
|
|
468
|
-
const sid = p(opts.cursor.sessionId);
|
|
469
|
-
outer.push(`(last_activity < ${a} OR (last_activity = ${b} AND session_id < ${sid}))`);
|
|
470
|
-
}
|
|
471
|
-
const sql = "SELECT session_id, owner, task_id, last_activity, first_activity, run_count, objective_preview, status, last_task_run_id FROM (" +
|
|
472
|
-
"SELECT session_id, owner, task_id, objective_preview, status, result ->> 'runId' AS last_task_run_id," +
|
|
473
|
-
" ROW_NUMBER() OVER (PARTITION BY session_id ORDER BY created_at DESC, task_id DESC) AS rn," +
|
|
474
|
-
" MAX(created_at) OVER (PARTITION BY session_id) AS last_activity," +
|
|
475
|
-
" MIN(created_at) OVER (PARTITION BY session_id) AS first_activity," +
|
|
476
|
-
" COUNT(*) OVER (PARTITION BY session_id) AS run_count" +
|
|
477
|
-
" FROM task_run" + innerWhere + ") t WHERE " + outer.join(" AND ") +
|
|
478
|
-
` ORDER BY last_activity DESC, session_id DESC LIMIT ${p(opts.limit)}`;
|
|
479
|
-
const { rows } = await this.db.query(sql, params);
|
|
480
|
-
return rows.map((r) => this.rowToSession(r));
|
|
481
|
-
}
|
|
482
|
-
rowToSession(r) {
|
|
483
|
-
const lastTaskRunId = r.last_task_run_id;
|
|
484
|
-
return {
|
|
485
|
-
sessionId: String(r.session_id),
|
|
486
|
-
owner: r.owner ?? null,
|
|
487
|
-
lastActivityAt: iso(r.last_activity),
|
|
488
|
-
firstActivityAt: iso(r.first_activity),
|
|
489
|
-
runCount: Number(r.run_count),
|
|
490
|
-
objectivePreview: r.objective_preview ?? null,
|
|
491
|
-
lastStatus: String(r.status),
|
|
492
|
-
lastRunId: r.task_id ?? null,
|
|
493
|
-
...(typeof lastTaskRunId === "string" && lastTaskRunId !== "" ? { lastTaskRunId } : {}),
|
|
494
|
-
title: null,
|
|
495
|
-
pinned: false,
|
|
496
|
-
};
|
|
497
|
-
}
|
|
498
|
-
async deleteBySession(sessionId, expectedSessionOwner) {
|
|
549
|
+
async deleteBySession(sessionId) {
|
|
499
550
|
let result = { removed: 0 };
|
|
500
551
|
await this.tx(async (conn) => {
|
|
501
|
-
const { rows: meta } = await conn.query(this.q("SELECT owner FROM session_meta WHERE session_id = ? FOR UPDATE", "SELECT owner FROM session_meta WHERE session_id = $1 FOR UPDATE"), [sessionId]);
|
|
502
|
-
const metaRow = meta[0];
|
|
503
|
-
if (metaRow === undefined || (metaRow.owner ?? null) !== expectedSessionOwner)
|
|
504
|
-
return;
|
|
505
|
-
const { rows: active } = await conn.query(this.q("SELECT task_id FROM task_active WHERE session_id = ? FOR UPDATE", "SELECT task_id FROM task_active WHERE session_id = $1 FOR UPDATE"), [sessionId]);
|
|
506
|
-
if (active[0]) {
|
|
507
|
-
result = { active: String(active[0].task_id) };
|
|
508
|
-
return;
|
|
509
|
-
}
|
|
510
552
|
await conn.query(this.q("DELETE te FROM task_event te JOIN task_run tr ON te.task_id = tr.task_id WHERE tr.session_id = ?", "DELETE FROM task_event te USING task_run tr WHERE te.task_id = tr.task_id AND tr.session_id = $1"), [sessionId]);
|
|
511
553
|
await conn.query(this.q("DELETE ta FROM task_active ta JOIN task_run tr ON ta.task_id = tr.task_id WHERE tr.session_id = ?", "DELETE FROM task_active ta USING task_run tr WHERE ta.task_id = tr.task_id AND tr.session_id = $1"), [sessionId]);
|
|
512
554
|
const { affected } = await conn.query(this.q("DELETE FROM task_run WHERE session_id = ?", "DELETE FROM task_run WHERE session_id = $1"), [sessionId]);
|
|
@@ -553,17 +595,14 @@ export class SqlRunStore {
|
|
|
553
595
|
ts: iso(r.ts),
|
|
554
596
|
}));
|
|
555
597
|
}
|
|
556
|
-
async reapStale(
|
|
557
|
-
const cutoff = new Date(Date.now() -
|
|
598
|
+
async reapStale() {
|
|
599
|
+
const cutoff = new Date(Date.now() - this.stall.windowMs());
|
|
558
600
|
let reaped = 0;
|
|
559
601
|
await this.tx(async (conn) => {
|
|
560
|
-
|
|
561
|
-
"WHERE status = 'running' AND updated_at < ?", `UPDATE task_run SET status = 'failed', result = NULL, error = '${RUN_STALLED_ERROR}', error_code = '${RUN_HOLDER_DEATH_CODES.stalled}', updated_at = $1 ` +
|
|
562
|
-
"WHERE status = 'running' AND updated_at < $2"), [new Date(), cutoff]);
|
|
563
|
-
reaped = affected;
|
|
564
|
-
await conn.query(this.q("DELETE ta FROM task_active ta JOIN task_run tr ON ta.task_id = tr.task_id WHERE tr.status NOT IN ('running','suspended','needs_review')", "DELETE FROM task_active ta USING task_run tr WHERE ta.task_id = tr.task_id AND tr.status NOT IN ('running','suspended','needs_review')"));
|
|
565
|
-
await conn.query(this.q("DELETE FROM task_active WHERE NOT EXISTS (SELECT 1 FROM task_run tr WHERE tr.task_id = task_active.task_id)", "DELETE FROM task_active WHERE NOT EXISTS (SELECT 1 FROM task_run tr WHERE tr.task_id = task_active.task_id)"));
|
|
602
|
+
reaped = await this.landStallVerdicts(conn, cutoff);
|
|
566
603
|
});
|
|
604
|
+
if (reaped > 0)
|
|
605
|
+
this.stall.onVerdicts(reaped);
|
|
567
606
|
return reaped;
|
|
568
607
|
}
|
|
569
608
|
async reapSuspended(olderThanMs) {
|
|
@@ -572,9 +611,9 @@ export class SqlRunStore {
|
|
|
572
611
|
await this.tx(async (conn) => {
|
|
573
612
|
const { affected } = await conn.query(this.q("UPDATE task_run tr SET tr.status = 'failed', tr.result = NULL, tr.error = 'approval expired before decision', tr.error_code = 'approval.expired', tr.updated_at = ? " +
|
|
574
613
|
"WHERE tr.status = 'suspended' AND tr.updated_at < ? " +
|
|
575
|
-
"AND NOT EXISTS (SELECT 1 FROM checkpoint c WHERE c.
|
|
614
|
+
"AND NOT EXISTS (SELECT 1 FROM checkpoint c WHERE c.host_session_id = tr.session_id AND c.status = 'pending')", "UPDATE task_run AS tr SET status = 'failed', result = NULL, error = 'approval expired before decision', error_code = 'approval.expired', updated_at = $1 " +
|
|
576
615
|
"WHERE tr.status = 'suspended' AND tr.updated_at < $2 " +
|
|
577
|
-
"AND NOT EXISTS (SELECT 1 FROM checkpoint c WHERE c.
|
|
616
|
+
"AND NOT EXISTS (SELECT 1 FROM checkpoint c WHERE c.host_session_id = tr.session_id AND c.status = 'pending')"), [new Date(), cutoff]);
|
|
578
617
|
reaped = affected;
|
|
579
618
|
await conn.query(this.q("DELETE ta FROM task_active ta JOIN task_run tr ON ta.task_id = tr.task_id WHERE tr.status NOT IN ('running','suspended','needs_review')", "DELETE FROM task_active ta USING task_run tr WHERE ta.task_id = tr.task_id AND tr.status NOT IN ('running','suspended','needs_review')"));
|
|
580
619
|
});
|
|
@@ -585,11 +624,11 @@ export class SqlRunStore {
|
|
|
585
624
|
await this.tx(async (conn) => {
|
|
586
625
|
const { affected } = await conn.query(this.q("UPDATE task_run tr SET tr.status = 'failed', tr.result = NULL, tr.error = 'approval expired before decision', tr.error_code = 'approval.expired', tr.updated_at = ? " +
|
|
587
626
|
"WHERE tr.status IN ('suspended','needs_review') " +
|
|
588
|
-
"AND EXISTS (SELECT 1 FROM checkpoint ce WHERE ce.
|
|
589
|
-
"AND NOT EXISTS (SELECT 1 FROM checkpoint cp WHERE cp.
|
|
627
|
+
"AND EXISTS (SELECT 1 FROM checkpoint ce WHERE ce.host_session_id = tr.session_id AND ce.status = 'expired') " +
|
|
628
|
+
"AND NOT EXISTS (SELECT 1 FROM checkpoint cp WHERE cp.host_session_id = tr.session_id AND cp.status = 'pending')", "UPDATE task_run AS tr SET status = 'failed', result = NULL, error = 'approval expired before decision', error_code = 'approval.expired', updated_at = $1 " +
|
|
590
629
|
"WHERE tr.status IN ('suspended','needs_review') " +
|
|
591
|
-
"AND EXISTS (SELECT 1 FROM checkpoint ce WHERE ce.
|
|
592
|
-
"AND NOT EXISTS (SELECT 1 FROM checkpoint cp WHERE cp.
|
|
630
|
+
"AND EXISTS (SELECT 1 FROM checkpoint ce WHERE ce.host_session_id = tr.session_id AND ce.status = 'expired') " +
|
|
631
|
+
"AND NOT EXISTS (SELECT 1 FROM checkpoint cp WHERE cp.host_session_id = tr.session_id AND cp.status = 'pending')"), [new Date()]);
|
|
593
632
|
reaped = affected;
|
|
594
633
|
await conn.query(this.q("DELETE ta FROM task_active ta JOIN task_run tr ON ta.task_id = tr.task_id WHERE tr.status NOT IN ('running','suspended','needs_review')", "DELETE FROM task_active ta USING task_run tr WHERE ta.task_id = tr.task_id AND tr.status NOT IN ('running','suspended','needs_review')"));
|
|
595
634
|
});
|
|
@@ -597,13 +636,13 @@ export class SqlRunStore {
|
|
|
597
636
|
}
|
|
598
637
|
}
|
|
599
638
|
export class TiDBRunStore extends SqlRunStore {
|
|
600
|
-
constructor(pool) {
|
|
601
|
-
super(mysqlDriver(pool));
|
|
639
|
+
constructor(pool, stall) {
|
|
640
|
+
super(mysqlDriver(pool), stall);
|
|
602
641
|
}
|
|
603
642
|
}
|
|
604
643
|
export class PgRunStore extends SqlRunStore {
|
|
605
|
-
constructor(pool) {
|
|
606
|
-
super(pgDriver(pool));
|
|
644
|
+
constructor(pool, stall) {
|
|
645
|
+
super(pgDriver(pool), stall);
|
|
607
646
|
}
|
|
608
647
|
}
|
|
609
648
|
//# sourceMappingURL=run-store-sql.js.map
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
* the second as the first turns a missing bucket into a silently empty workspace on every run. The ONLY evidence of a missing bucket is
|
|
7
7
|
* a 404 whose body carries the S3 error code `NoSuchBucket`: a bare 404, a 404 from a proxy or a wrong path, a 403 (credentials that
|
|
8
8
|
* cannot list ≠ no bucket) and a 5xx prove nothing about the bucket. Every consumer asks this one predicate: the boot probe of a
|
|
9
|
-
* configured bucket (`MinioBlobBackend.probeBucket`)
|
|
9
|
+
* configured bucket (`MinioBlobBackend.probeBucket`), the runtime read of the workspace `latest` pointer, and a restore's archive GET whose 404 answer the
|
|
10
|
+
* pod hands back as it is (`remote-env-k8s.ts` — the pod never judges it).
|
|
10
11
|
*/
|
|
11
12
|
/** The code a run's refusal / operator line carries when the store answered "no such bucket" (the `workspace_snapshot_bucket_missing` line's `code`). */
|
|
12
13
|
export declare const SNAPSHOT_BUCKET_MISSING = "snapshot_bucket_missing";
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 车道沙箱回收腿的接口 —— 维护 tick(`boot/reapers.ts`)上**唯一一只**沙箱回收座:k8s 车道 = 沙箱 Pod 回收器({@link createSandboxPodReaper},`k8s-pod-reaper.ts`),
|
|
3
|
+
* local-docker 车道 = 无主容器回收器({@link createLocalDockerReaper},`local-docker-reaper.ts`)。一次部署只有一条执行车道,所以座只有一只、节拍只有一个
|
|
4
|
+
* ({@link SANDBOX_REAP_PERIOD_MS})、连败告警只有一个名;两条车道各自的判据与读数留在各自的模块里,这里只有 tick 要知道的那一点。
|
|
5
|
+
*/
|
|
6
|
+
/** 一个副本两轮沙箱回收之间的间隔。常量:起服后第一个维护 tick 即跑一轮(起服那一轮),此后每个周期一轮。 */
|
|
7
|
+
export declare const SANDBOX_REAP_PERIOD_MS: number;
|
|
8
|
+
/** run 店的窄读口(三只 run 店共有的 `getRun`):回收器按 run 行的终态判「这只沙箱还有没有主人」。 */
|
|
9
|
+
export interface SandboxReaperRunReader {
|
|
10
|
+
getRun(taskId: string): Promise<{
|
|
11
|
+
readonly status: string;
|
|
12
|
+
readonly updatedAt: string;
|
|
13
|
+
} | null | undefined>;
|
|
14
|
+
}
|
|
15
|
+
/** 一轮的公共读数(两条车道的轮次读数都是它的超集):列出来了没有 / 扫了几只 / 按各自闭集原因分的删与跳过计数。 */
|
|
16
|
+
export interface SandboxReapRound {
|
|
17
|
+
readonly listed: boolean;
|
|
18
|
+
readonly scanned: number;
|
|
19
|
+
readonly deleted: Readonly<Record<string, number | undefined>>;
|
|
20
|
+
readonly skipped: Readonly<Record<string, number | undefined>>;
|
|
21
|
+
}
|
|
22
|
+
/** 维护 tick 调的那一口:一轮 = 列举 → 逐只判 → 收被判无主的;不抛。`runs` 缺席 = 本部署没有 run 店(判不了 run 的沙箱一律不动)。 */
|
|
23
|
+
export interface SandboxReaper {
|
|
24
|
+
reapOnce(runs: SandboxReaperRunReader | undefined): Promise<SandboxReapRound>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=sandbox-reaper.d.ts.map
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { StoreBootRefusalError } from "./store-contracts.js";
|
|
2
|
+
/** 本条的拒启码(机读)。 */
|
|
3
|
+
export declare const SCENARIO_PREFIX_SWITCH_REFUSED_CODE = "config.scenario_prefix_switch_refused";
|
|
4
|
+
/** 本条在标记表(`one-time-migration-marker.ts`)里的那一行的键。 */
|
|
5
|
+
export declare const SCENARIO_PREFIX_MARKER_ID = "M42";
|
|
6
|
+
/** local 车道的标记文件(数据根下,文件名即本条)。 */
|
|
7
|
+
export declare const LOCAL_MARKER_FILE = "one-time-migration-M42.json";
|
|
8
|
+
/** 身份列的名字判据(建表句派生扫描面的唯一一条)。 */
|
|
9
|
+
export declare const IDENTITY_COLUMN_NAME: RegExp;
|
|
10
|
+
/** `LIKE` 的前缀模式(`!` 作转义符:两方言同义、不碰反斜杠的方言差;前缀里的 `_` 是通配符,必须转义)。 */
|
|
11
|
+
export declare const SCENARIO_PREFIX_LIKE: string;
|
|
12
|
+
/** 一处命中:来源(SQL = `表.列`;local = 店名)+ 以保留前缀开头的行数。 */
|
|
13
|
+
export interface ScenarioPrefixHit {
|
|
14
|
+
readonly source: string;
|
|
15
|
+
readonly rows: number;
|
|
16
|
+
}
|
|
17
|
+
/** 本条的读数 / 收据格(扫了几处来源;0 = 标记在场、没扫)。 */
|
|
18
|
+
export interface ScenarioPrefixReceipt {
|
|
19
|
+
scenarioPrefixSourcesScanned: number;
|
|
20
|
+
}
|
|
21
|
+
/** 拒因闭集:存量命中 / 零命中而更早版本的副本可能仍在服务(SQL 的停-迁-起)。 */
|
|
22
|
+
export type ScenarioPrefixRefusalReason = "stored_prefix" | "live_runs";
|
|
23
|
+
/** 判活读数(`live_runs` 那一拒带):判活窗内心跳过的 run 数与可以再起的最早时刻。 */
|
|
24
|
+
export interface ScenarioPrefixLiveRuns {
|
|
25
|
+
readonly liveRuns: number;
|
|
26
|
+
readonly windowSec: number;
|
|
27
|
+
readonly restartAfter: string;
|
|
28
|
+
readonly after: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* M42 的起服拒。具名类型 + 机读码 + 拒因;继承 {@link StoreBootRefusalError}(SQL 开库的等待窗不重试它;隐式 local 的降级臂不吞)。一个字节没改(扫描只读,标记没写)。
|
|
32
|
+
* · `stored_prefix` —— 存量里有以保留前缀开头的身份(`hits` 逐来源点名);
|
|
33
|
+
* · `live_runs` —— 零命中,但判活窗内仍有 run 在心跳:更早版本的副本可能还在服务,扫描之后它还会收下这类身份 ⇒ 全停之后再起(`live` 带时刻)。
|
|
34
|
+
*/
|
|
35
|
+
export declare class ScenarioPrefixSwitchRefusedError extends StoreBootRefusalError {
|
|
36
|
+
readonly reason: ScenarioPrefixRefusalReason;
|
|
37
|
+
readonly hits: readonly ScenarioPrefixHit[];
|
|
38
|
+
readonly live?: ScenarioPrefixLiveRuns | undefined;
|
|
39
|
+
readonly code = "config.scenario_prefix_switch_refused";
|
|
40
|
+
constructor(reason: ScenarioPrefixRefusalReason, hits: readonly ScenarioPrefixHit[], live?: ScenarioPrefixLiveRuns | undefined,
|
|
41
|
+
/** 库此刻还差的列(SQL 腿经 `describeUpgradeDriftTail` 读到的;列齐 / local 腿 ⇒ 空串):一次起服读全。 */
|
|
42
|
+
tail?: string);
|
|
43
|
+
private static sentence;
|
|
44
|
+
}
|
|
45
|
+
/** local 腿的一处来源:店名 + 它的计数口(以保留前缀开头的属主行数)。 */
|
|
46
|
+
export interface LocalScenarioPrefixSource {
|
|
47
|
+
readonly source: string;
|
|
48
|
+
readonly rows: () => number | Promise<number>;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 🔴 M42 的 local 腿(唯一调用点 `LocalBackend.runOneTimeMigrations`,第一步):标记文件在 ⇒ 0(零扫描);否则逐店计数,一处命中 ⇒ {@link ScenarioPrefixSwitchRefusedError}
|
|
52
|
+
* (一字节没写);零命中 ⇒ 原子写标记文件(`required`:标记没落盘就不算扫过 —— 写不进 ⇒ 抛,起服拒,下一次起服重扫)。返回扫了几处来源。
|
|
53
|
+
* 数据根独占(根锁):同一只根上没有第二个起服者、也没有更早版本的副本与本次并跑 ⇒ 没有 SQL 腿的判活守卫。
|
|
54
|
+
*/
|
|
55
|
+
export declare function switchLocalScenarioPrefixM42(markerPath: string, sources: readonly LocalScenarioPrefixSource[]): Promise<number>;
|
|
56
|
+
//# sourceMappingURL=scenario-prefix-switch-m42.d.ts.map
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { SCENARIO_SUBJECT_PREFIX } from "../owner-brands.js";
|
|
3
|
+
import { atomicWriteFileSync } from "./owner-only-file-mode.js";
|
|
4
|
+
import { StoreBootRefusalError } from "./store-contracts.js";
|
|
5
|
+
import { stopThenStartAction } from "./stop-then-start-sentence.js";
|
|
6
|
+
export const SCENARIO_PREFIX_SWITCH_REFUSED_CODE = "config.scenario_prefix_switch_refused";
|
|
7
|
+
export const SCENARIO_PREFIX_MARKER_ID = "M42";
|
|
8
|
+
export const LOCAL_MARKER_FILE = "one-time-migration-M42.json";
|
|
9
|
+
export const IDENTITY_COLUMN_NAME = /(^|_)(owner|scope|principal|subject)$/;
|
|
10
|
+
export const SCENARIO_PREFIX_LIKE = `${SCENARIO_SUBJECT_PREFIX.replace(/[!%_]/g, "!$&")}%`;
|
|
11
|
+
export class ScenarioPrefixSwitchRefusedError extends StoreBootRefusalError {
|
|
12
|
+
reason;
|
|
13
|
+
hits;
|
|
14
|
+
live;
|
|
15
|
+
code = SCENARIO_PREFIX_SWITCH_REFUSED_CODE;
|
|
16
|
+
constructor(reason, hits, live, tail = "") {
|
|
17
|
+
super(ScenarioPrefixSwitchRefusedError.sentence(reason, hits, live) + tail);
|
|
18
|
+
this.reason = reason;
|
|
19
|
+
this.hits = hits;
|
|
20
|
+
this.live = live;
|
|
21
|
+
this.name = "ScenarioPrefixSwitchRefusedError";
|
|
22
|
+
}
|
|
23
|
+
static sentence(reason, hits, live) {
|
|
24
|
+
switch (reason) {
|
|
25
|
+
case "stored_prefix":
|
|
26
|
+
return (`${SCENARIO_PREFIX_SWITCH_REFUSED_CODE}: stored identities start with the reserved prefix "${SCENARIO_SUBJECT_PREFIX}" (` +
|
|
27
|
+
hits.map((h) => `${h.source}: ${h.rows} row${h.rows === 1 ? "" : "s"}`).join(", ") +
|
|
28
|
+
`). This version reads that prefix as a scenario of a person, so these rows would be attributed to another person; it refuses to start rather than misread them. ` +
|
|
29
|
+
`Nothing was changed. Rename or delete those identities (the identity boundary now rejects principals with this prefix), then restart — ` +
|
|
30
|
+
`the check runs until it finds none, then records a marker in the store and does not run again.`);
|
|
31
|
+
case "live_runs":
|
|
32
|
+
return (`${SCENARIO_PREFIX_SWITCH_REFUSED_CODE}: no stored identity starts with the reserved prefix "${SCENARIO_SUBJECT_PREFIX}", but ${live?.liveRuns ?? 0} run(s) heartbeated on this database ` +
|
|
33
|
+
`within the last ${live?.windowSec ?? 0}s — a replica of an earlier version may still be serving, and it accepts principals with that prefix, so a clean check now would not stay clean. ` +
|
|
34
|
+
`Nothing was changed and no marker was written. ${stopThenStartAction(live?.after)}`);
|
|
35
|
+
default: {
|
|
36
|
+
const unhandled = reason;
|
|
37
|
+
throw new Error(`scenario-prefix-switch: unknown refusal reason ${String(unhandled)}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export async function switchLocalScenarioPrefixM42(markerPath, sources) {
|
|
43
|
+
if (existsSync(markerPath))
|
|
44
|
+
return 0;
|
|
45
|
+
const hits = [];
|
|
46
|
+
for (const s of sources) {
|
|
47
|
+
const rows = await s.rows();
|
|
48
|
+
if (rows > 0)
|
|
49
|
+
hits.push({ source: s.source, rows });
|
|
50
|
+
}
|
|
51
|
+
if (hits.length > 0)
|
|
52
|
+
throw new ScenarioPrefixSwitchRefusedError("stored_prefix", hits);
|
|
53
|
+
atomicWriteFileSync(markerPath, JSON.stringify({ migration: SCENARIO_PREFIX_MARKER_ID, markedAt: new Date().toISOString() }), { durability: "required" });
|
|
54
|
+
return sources.length;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=scenario-prefix-switch-m42.js.map
|