@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
package/dist/store-posture.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { readdirSync } from "node:fs";
|
|
1
2
|
import { projectSqlEngineCapability } from "./sql-engine-posture.js";
|
|
3
|
+
import { parseMountinfo, readProcessMountinfo, visibleMountOf } from "./mountinfo.js";
|
|
4
|
+
import { recordFailOpen } from "./observability/fail-open.js";
|
|
2
5
|
export const STORE_DEGRADED_REASONS = ["local_unwritable"];
|
|
3
6
|
export function storeDegradedReasonFor(declared) {
|
|
4
7
|
switch (declared) {
|
|
@@ -16,19 +19,218 @@ export function storeDegradedReasonFor(declared) {
|
|
|
16
19
|
}
|
|
17
20
|
}
|
|
18
21
|
export function sessionStoreLabelOf(sessionBackend, backendKind) {
|
|
19
|
-
return sessionBackend === "tidb" && backendKind !== undefined ?
|
|
22
|
+
return sessionBackend === "tidb" && backendKind !== undefined ? backendKind : sessionBackend;
|
|
23
|
+
}
|
|
24
|
+
export const STORE_DURABILITIES = ["durable", "ephemeral", "unknown"];
|
|
25
|
+
export const STORE_ROOTS = ["data", "sealed_key", "memory"];
|
|
26
|
+
export const STORE_DURABILITY_RULES = [
|
|
27
|
+
"backend_memory",
|
|
28
|
+
"backend_sql",
|
|
29
|
+
"fs_volatile",
|
|
30
|
+
"k8s_empty_dir",
|
|
31
|
+
"k8s_persistent_volume",
|
|
32
|
+
"network_fs",
|
|
33
|
+
"block_device",
|
|
34
|
+
"unrecognized_mount",
|
|
35
|
+
"mount_unresolved",
|
|
36
|
+
"mountinfo_unreadable",
|
|
37
|
+
"mountinfo_malformed",
|
|
38
|
+
"path_unresolvable",
|
|
39
|
+
"not_linux",
|
|
40
|
+
];
|
|
41
|
+
export function durabilityOfRule(rule) {
|
|
42
|
+
switch (rule) {
|
|
43
|
+
case "backend_sql":
|
|
44
|
+
case "k8s_persistent_volume":
|
|
45
|
+
case "network_fs":
|
|
46
|
+
case "block_device":
|
|
47
|
+
return "durable";
|
|
48
|
+
case "backend_memory":
|
|
49
|
+
case "fs_volatile":
|
|
50
|
+
case "k8s_empty_dir":
|
|
51
|
+
return "ephemeral";
|
|
52
|
+
case "unrecognized_mount":
|
|
53
|
+
case "mount_unresolved":
|
|
54
|
+
case "mountinfo_unreadable":
|
|
55
|
+
case "mountinfo_malformed":
|
|
56
|
+
case "path_unresolvable":
|
|
57
|
+
case "not_linux":
|
|
58
|
+
return "unknown";
|
|
59
|
+
default: {
|
|
60
|
+
const unhandled = rule;
|
|
61
|
+
throw new Error(`store posture: no ruling for durability rule ${String(unhandled)}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const VOLATILE_FS_TYPES = new Set(["overlay", "tmpfs", "ramfs"]);
|
|
66
|
+
const NETWORK_FS_TYPES = new Set(["cifs", "smb3", "ceph", "glusterfs", "fuse.glusterfs", "9p"]);
|
|
67
|
+
export const STORE_MOUNT_RULES = [
|
|
68
|
+
{ rule: "fs_volatile", holds: (m) => VOLATILE_FS_TYPES.has(m.fsType) },
|
|
69
|
+
{ rule: "k8s_empty_dir", holds: (m) => m.root.includes("kubernetes.io~empty-dir") },
|
|
70
|
+
{ rule: "k8s_persistent_volume", holds: (m) => m.root.includes("kubernetes.io~csi") || m.root.includes("kubernetes.io~local-volume") },
|
|
71
|
+
{ rule: "network_fs", holds: (m) => (m.fsType.startsWith("nfs") || NETWORK_FS_TYPES.has(m.fsType)) && !(m.fsType === "9p" && m.mountPoint === "/") },
|
|
72
|
+
{ rule: "block_device", holds: (m) => m.source.startsWith("/dev/") && m.root === "/" },
|
|
73
|
+
];
|
|
74
|
+
export function classifyStoreMount(m) {
|
|
75
|
+
return STORE_MOUNT_RULES.find((r) => r.holds(m))?.rule ?? "unrecognized_mount";
|
|
76
|
+
}
|
|
77
|
+
const readingWithoutMount = (path, rule) => ({ path, mountPoint: null, mountSource: null, fsType: null, rule, verdict: durabilityOfRule(rule) });
|
|
78
|
+
export function judgeStoreRootPath(physicalPath, reading) {
|
|
79
|
+
switch (reading.kind) {
|
|
80
|
+
case "not_linux":
|
|
81
|
+
return readingWithoutMount(physicalPath, "not_linux");
|
|
82
|
+
case "unreadable":
|
|
83
|
+
return readingWithoutMount(physicalPath, "mountinfo_unreadable");
|
|
84
|
+
case "read": {
|
|
85
|
+
if (reading.table.malformed > 0)
|
|
86
|
+
return readingWithoutMount(physicalPath, "mountinfo_malformed");
|
|
87
|
+
const visible = visibleMountOf(reading.table.rows, physicalPath);
|
|
88
|
+
if (typeof visible !== "object")
|
|
89
|
+
return readingWithoutMount(physicalPath, "mount_unresolved");
|
|
90
|
+
const rule = classifyStoreMount(visible);
|
|
91
|
+
return { path: physicalPath, mountPoint: visible.mountPoint, mountSource: visible.source, fsType: visible.fsType, rule, verdict: durabilityOfRule(rule) };
|
|
92
|
+
}
|
|
93
|
+
default: {
|
|
94
|
+
const unhandled = reading;
|
|
95
|
+
throw new Error(`store posture: unknown mount table reading ${JSON.stringify(unhandled)}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const DURABILITY_RANK = { ephemeral: 0, unknown: 1, durable: 2 };
|
|
100
|
+
export function weakestDurability(verdicts) {
|
|
101
|
+
return verdicts.reduce((w, v) => (w === undefined || DURABILITY_RANK[v] < DURABILITY_RANK[w] ? v : w), undefined) ?? "unknown";
|
|
102
|
+
}
|
|
103
|
+
export function localDataRootHoldsData(root) {
|
|
104
|
+
try {
|
|
105
|
+
return readdirSync(root).length > 0;
|
|
106
|
+
}
|
|
107
|
+
catch (e) {
|
|
108
|
+
const code = e.code;
|
|
109
|
+
return code !== "ENOENT" && code !== "ENOTDIR";
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const EVIDENCE_TAG = "server.store-durability.evidence-unreadable";
|
|
113
|
+
const errnoOf = (e) => (e instanceof Error && "code" in e && typeof e.code === "string" ? e.code : e instanceof Error ? e.name : "unknown");
|
|
114
|
+
export async function captureStoreEvidence(paths, host) {
|
|
115
|
+
let reading;
|
|
116
|
+
try {
|
|
117
|
+
const text = await (host.mountinfo ?? readProcessMountinfo)();
|
|
118
|
+
reading = text === null ? { kind: "not_linux" } : { kind: "read", table: parseMountinfo(text) };
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
recordFailOpen(EVIDENCE_TAG, `why=mountinfo_unreadable err=${errnoOf(err)}`);
|
|
122
|
+
reading = { kind: "unreadable" };
|
|
123
|
+
}
|
|
124
|
+
if (reading.kind === "read" && reading.table.malformed > 0)
|
|
125
|
+
recordFailOpen(EVIDENCE_TAG, `why=mountinfo_malformed lines=${reading.table.malformed}`);
|
|
126
|
+
const judge = (p) => {
|
|
127
|
+
let physical;
|
|
128
|
+
try {
|
|
129
|
+
physical = host.canonical(p);
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
recordFailOpen(EVIDENCE_TAG, `why=path_unresolvable err=${errnoOf(err)} path=${p}`);
|
|
133
|
+
return readingWithoutMount(p, "path_unresolvable");
|
|
134
|
+
}
|
|
135
|
+
const judged = judgeStoreRootPath(physical, reading);
|
|
136
|
+
if (judged.rule === "mount_unresolved")
|
|
137
|
+
recordFailOpen(EVIDENCE_TAG, `why=mount_unresolved path=${physical}`);
|
|
138
|
+
return judged;
|
|
139
|
+
};
|
|
140
|
+
return {
|
|
141
|
+
dataRootHeldData: (host.holdsData ?? localDataRootHoldsData)(paths.dataRoot),
|
|
142
|
+
dataRoot: judge(paths.dataRoot),
|
|
143
|
+
sealedKey: judge(paths.sealedKeyDir),
|
|
144
|
+
...(paths.memoryRoot !== undefined ? { memory: judge(paths.memoryRoot) } : {}),
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
function dataRootReadingOf(backend, evidence) {
|
|
148
|
+
switch (backend) {
|
|
149
|
+
case "memory":
|
|
150
|
+
return readingWithoutMount(null, "backend_memory");
|
|
151
|
+
case "mysql":
|
|
152
|
+
case "pg":
|
|
153
|
+
return readingWithoutMount(null, "backend_sql");
|
|
154
|
+
case "local":
|
|
155
|
+
if (evidence === undefined)
|
|
156
|
+
throw new Error("store posture: a local backend was assembled without boot evidence of its data root's mount — wiring defect (stage 2 captures it before the key directory is written)");
|
|
157
|
+
return evidence.dataRoot;
|
|
158
|
+
default: {
|
|
159
|
+
const unhandled = backend;
|
|
160
|
+
throw new Error(`store posture: unknown backend kind ${String(unhandled)}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
20
163
|
}
|
|
21
164
|
export function buildStorePosture(a) {
|
|
22
|
-
|
|
165
|
+
const backend = a.assembled ?? "memory";
|
|
166
|
+
const ev = a.evidence;
|
|
167
|
+
const memory = a.memoryRootWired ? ev?.memory : undefined;
|
|
168
|
+
const roots = [
|
|
169
|
+
{ root: "data", ...dataRootReadingOf(backend, ev) },
|
|
170
|
+
...(ev !== undefined ? [{ root: "sealed_key", ...ev.sealedKey }] : []),
|
|
171
|
+
...(memory !== undefined ? [{ root: "memory", ...memory }] : []),
|
|
172
|
+
];
|
|
173
|
+
return {
|
|
174
|
+
declared: a.declared,
|
|
175
|
+
backend,
|
|
176
|
+
...(a.degradedReason !== undefined ? { degradedReason: a.degradedReason } : {}),
|
|
177
|
+
durability: weakestDurability(roots.map((r) => r.verdict)),
|
|
178
|
+
roots,
|
|
179
|
+
...localDeclarationOf(backend, a.localDeclaration),
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
function localDeclarationOf(backend, declaration) {
|
|
183
|
+
switch (backend) {
|
|
184
|
+
case "local":
|
|
185
|
+
if (declaration === undefined)
|
|
186
|
+
throw new Error("store posture: a local backend was assembled without the declaration it handed its stores — wiring defect (read it back from the backend)");
|
|
187
|
+
return { localDeclaration: declaration };
|
|
188
|
+
case "memory":
|
|
189
|
+
case "mysql":
|
|
190
|
+
case "pg":
|
|
191
|
+
return {};
|
|
192
|
+
default: {
|
|
193
|
+
const unhandled = backend;
|
|
194
|
+
throw new Error(`store posture: unknown backend kind ${String(unhandled)}`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
export function unwiredStorePosture(declared) {
|
|
199
|
+
return buildStorePosture({ declared, assembled: undefined, degradedReason: undefined, evidence: undefined, memoryRootWired: false, localDeclaration: undefined });
|
|
200
|
+
}
|
|
201
|
+
export function buildStoreFreshStartLine(posture, evidence) {
|
|
202
|
+
if (posture.backend !== "local" || evidence.dataRootHeldData)
|
|
203
|
+
return undefined;
|
|
204
|
+
return {
|
|
205
|
+
dataRoot: evidence.dataRoot.path,
|
|
206
|
+
durability: posture.durability,
|
|
207
|
+
roots: posture.roots.map((r) => ({ root: r.root, verdict: r.verdict, rule: r.rule })),
|
|
208
|
+
note: "this boot initialized an empty local store (the data root held nothing before startup wrote to it); a first start, a lost volume and a wrong mount all look like this — if this deployment had data before, check the volume mounted at the data root",
|
|
209
|
+
};
|
|
23
210
|
}
|
|
24
211
|
export function projectStoreCapability(posture, sqlFacts) {
|
|
25
212
|
const sql = posture.backend === "mysql" || posture.backend === "pg" ? projectSqlEngineCapability(sqlFacts) : null;
|
|
26
213
|
return {
|
|
27
214
|
declared: posture.declared,
|
|
28
215
|
backend: posture.backend,
|
|
29
|
-
|
|
216
|
+
durability: posture.durability,
|
|
30
217
|
...(posture.degradedReason !== undefined ? { degradedReason: posture.degradedReason } : {}),
|
|
31
218
|
...(sql !== null ? { sql } : {}),
|
|
32
219
|
};
|
|
33
220
|
}
|
|
221
|
+
export function projectHealthStoreSection(posture) {
|
|
222
|
+
return { durability: posture.durability };
|
|
223
|
+
}
|
|
224
|
+
export function projectStoreDurabilityWiring(posture) {
|
|
225
|
+
return { durability: posture.durability, roots: posture.roots };
|
|
226
|
+
}
|
|
227
|
+
export function describeStoreRoot(r) {
|
|
228
|
+
const where = r.path ?? (r.rule === "backend_sql" ? "(rows held by the database)" : "(no store backend)");
|
|
229
|
+
const mount = r.fsType !== null ? ` (${r.fsType} ${r.mountSource ?? "?"} at ${r.mountPoint ?? "?"})` : "";
|
|
230
|
+
return `${r.root} ${where}${mount} ⇒ ${r.verdict} [${r.rule}]`;
|
|
231
|
+
}
|
|
232
|
+
export const STORE_NOT_DURABLE_CODE = "config.store_not_durable";
|
|
233
|
+
export class StoreNotDurableError extends Error {
|
|
234
|
+
code = STORE_NOT_DURABLE_CODE;
|
|
235
|
+
}
|
|
34
236
|
//# sourceMappingURL=store-posture.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { HOOK_ENTRY_FIELDS, HOOK_ENTRY_TYPES } from "@sema-agent/settings-schema/hooks";
|
|
2
|
-
import {
|
|
2
|
+
import { hooksFieldCoordinate, parseHooksConfig } from "./hooks/hook-runner.js";
|
|
3
3
|
import { ONE_TIME_MIGRATIONS, migrationWindowOpen } from "./plugins/one-time-migrations.js";
|
|
4
4
|
const MATCHER_FIELD_NAMES = { matcher: true, hooks: true };
|
|
5
5
|
function isRecord(v) {
|
|
@@ -113,7 +113,7 @@ export function rereadStoredHooksM20(raw, read = parseHooksConfig) {
|
|
|
113
113
|
for (const target of targets) {
|
|
114
114
|
if (!removeKeyAt(doc, target))
|
|
115
115
|
continue;
|
|
116
|
-
stripped.push(
|
|
116
|
+
stripped.push(hooksFieldCoordinate(["hooks", ...target]));
|
|
117
117
|
removedAny = true;
|
|
118
118
|
}
|
|
119
119
|
if (!removedAny)
|
|
@@ -43,13 +43,21 @@ type ListOpts = {
|
|
|
43
43
|
status?: BackgroundAgentRecord["status"];
|
|
44
44
|
limit?: number;
|
|
45
45
|
};
|
|
46
|
+
declare const CORRUPT_TAG: "server.sql-json.background-agent.unreadable-row-skipped";
|
|
47
|
+
/**
|
|
48
|
+
* 本店容忍臂(上面规则里的「跳过 + 计 tag」)的 **F 类披露口** —— `recordFailOpen` 形,由组合座注入(生产装配 = `boot/stores.ts` 交
|
|
49
|
+
* `observability/fail-open.ts` 的 `recordFailOpen`):店不直引服务的披露座(本目录对 server 其余部分零依赖,要能原样搬进 core 包)。
|
|
50
|
+
* 两只店的构造参里**必填**:缺席是编译错,不存在一只静默跳行的实例。
|
|
51
|
+
*/
|
|
52
|
+
export type BackgroundAgentRowDisclosure = (tag: typeof CORRUPT_TAG, detail: string) => void;
|
|
46
53
|
export declare function ensureTiDBBackgroundAgentSchema(pool: Pool): Promise<void>;
|
|
47
54
|
/** [ref]:本 store 的索引**声明**(两方言共用一份)。PG 侧由下面的 `ensurePgBackgroundAgentSchema` 应用,MySQL 侧由 `tidb-pool.ts` 的中央 `ensureSchema` 应用(那里内联 `KEY` 已在 `CREATE TABLE` 里 ⇒ 新建库探到即零 DDL,存量库缺谁补谁)。加索引以外的 schema 变更仍归运维,见 `plugins/ensure-index.ts` 头注。 */
|
|
48
55
|
export declare const BACKGROUND_AGENT_INDEXES: readonly IndexSpec[];
|
|
49
56
|
export declare function ensurePgBackgroundAgentSchema(q: PgQueryFn): Promise<void>;
|
|
50
57
|
export declare class TiDBBackgroundAgentStore implements BackgroundAgentStore {
|
|
51
58
|
private readonly pool;
|
|
52
|
-
|
|
59
|
+
private readonly disclose;
|
|
60
|
+
constructor(pool: Pool, disclose: BackgroundAgentRowDisclosure);
|
|
53
61
|
put(record: BackgroundAgentRecord): Promise<void>;
|
|
54
62
|
get(handle: string, scope: string): Promise<BackgroundAgentRecord | null>;
|
|
55
63
|
update(handle: string, scope: string, record: BackgroundAgentRecord, expect: {
|
|
@@ -89,7 +97,8 @@ export declare class TiDBBackgroundAgentStore implements BackgroundAgentStore {
|
|
|
89
97
|
}
|
|
90
98
|
export declare class PgBackgroundAgentStore implements BackgroundAgentStore {
|
|
91
99
|
private readonly q;
|
|
92
|
-
|
|
100
|
+
private readonly disclose;
|
|
101
|
+
constructor(q: PgQueryFn, disclose: BackgroundAgentRowDisclosure);
|
|
93
102
|
put(record: BackgroundAgentRecord): Promise<void>;
|
|
94
103
|
get(handle: string, scope: string): Promise<BackgroundAgentRecord | null>;
|
|
95
104
|
update(handle: string, scope: string, record: BackgroundAgentRecord, expect: {
|
|
@@ -2,8 +2,8 @@ import { BackgroundAgentStoreError, STALE_RUNNING_REAP_ATTRIBUTION, } from "@sem
|
|
|
2
2
|
import { pgSafeJsonStringify, pgSanitizeText } from "../plugins/pg-safe-json.js";
|
|
3
3
|
import { isMysqlDupKeyError } from "../plugins/sql-errors.js";
|
|
4
4
|
import { ensureIndexes } from "../plugins/ensure-index.js";
|
|
5
|
-
import { createObjectColumnReader, decodeJsonColumn, decodeNullableJsonColumn, foldJsonColumn, jsonColumnText } from "../plugins/sql-json-column.js";
|
|
6
|
-
import { backgroundAgentNameOf } from "../background-agent-name.js";
|
|
5
|
+
import { createObjectColumnReader, decodeJsonColumn, decodeNullableJsonColumn, foldJsonColumn, jsonColumnText, SqlJsonColumnError, StoreCorruptError } from "../plugins/sql-json-column.js";
|
|
6
|
+
import { backgroundAgentNameOf, readBackgroundAgentName } from "../background-agent-name.js";
|
|
7
7
|
export const BACKGROUND_AGENT_TABLE = "background_agent";
|
|
8
8
|
function summaryCols(dialect) {
|
|
9
9
|
return ("handle, owner, session_scoped, session_id, parent_session_id, root_session_id, name, agent_type, status, " +
|
|
@@ -19,7 +19,15 @@ function readRecordColumn(v, handle) {
|
|
|
19
19
|
catch (e) {
|
|
20
20
|
throw foldJsonColumn(e, (m) => `BackgroundAgentStore: ${m} — refusing rather than serve a hollow agent record`);
|
|
21
21
|
}
|
|
22
|
-
return { ...record, name:
|
|
22
|
+
return { ...record, name: agentNameOrRefuse(record, `${BACKGROUND_AGENT_TABLE}.record_json for handle ${handle}`) };
|
|
23
|
+
}
|
|
24
|
+
const TERMINAL_STATUSES = new Set(["completed", "failed", "killed"]);
|
|
25
|
+
const CORRUPT_TAG = "server.sql-json.background-agent.unreadable-row-skipped";
|
|
26
|
+
function agentNameOrRefuse(row, where) {
|
|
27
|
+
const read = readBackgroundAgentName(row);
|
|
28
|
+
if (read.ok)
|
|
29
|
+
return read.name;
|
|
30
|
+
throw new StoreCorruptError(new SqlJsonColumnError("malformed", where, read.problem), `BackgroundAgentStore: ${where}: ${read.problem} — refusing rather than serve an agent row without a name`);
|
|
23
31
|
}
|
|
24
32
|
function readUsageColumn(v, handle) {
|
|
25
33
|
try {
|
|
@@ -71,7 +79,7 @@ function rowToSummary(r) {
|
|
|
71
79
|
...(r.session_id !== null && r.session_id !== undefined ? { sessionId: String(r.session_id) } : {}),
|
|
72
80
|
...(r.parent_session_id !== null && r.parent_session_id !== undefined ? { parentSessionId: String(r.parent_session_id) } : {}),
|
|
73
81
|
...(r.root_session_id !== null && r.root_session_id !== undefined ? { rootSessionId: String(r.root_session_id) } : {}),
|
|
74
|
-
name:
|
|
82
|
+
name: agentNameOrRefuse({ handle: String(r.handle), ...(r.name !== null && r.name !== undefined ? { name: String(r.name) } : {}) }, `${BACKGROUND_AGENT_TABLE}.name for handle ${String(r.handle)}`),
|
|
75
83
|
...(r.agent_type !== null && r.agent_type !== undefined ? { agentType: String(r.agent_type) } : {}),
|
|
76
84
|
status: String(r.status),
|
|
77
85
|
spawnedAt: Number(r.spawned_at_ms),
|
|
@@ -80,6 +88,41 @@ function rowToSummary(r) {
|
|
|
80
88
|
...((u) => (u === undefined ? {} : { usage: u }))(readUsageColumn(r.usage_json, String(r.handle))),
|
|
81
89
|
};
|
|
82
90
|
}
|
|
91
|
+
async function listReadable(fetchRows, limit, op, disclose) {
|
|
92
|
+
const want = limit === undefined || limit === Infinity ? undefined : Number.isFinite(Math.floor(limit)) ? Math.max(0, Math.floor(limit)) : 0;
|
|
93
|
+
for (let extra = 0;;) {
|
|
94
|
+
const rows = await fetchRows(want === undefined ? limit : want + extra);
|
|
95
|
+
const out = [];
|
|
96
|
+
const skipped = [];
|
|
97
|
+
for (const r of rows) {
|
|
98
|
+
try {
|
|
99
|
+
out.push(rowToSummary(r));
|
|
100
|
+
}
|
|
101
|
+
catch (e) {
|
|
102
|
+
if (!(e instanceof StoreCorruptError) || !TERMINAL_STATUSES.has(String(r.status)))
|
|
103
|
+
throw e;
|
|
104
|
+
skipped.push(`table=${BACKGROUND_AGENT_TABLE} op=${op} handle=${String(r.handle)} status=${String(r.status)} ${e.message}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (want === undefined || out.length >= want || rows.length < want + extra || skipped.length === 0) {
|
|
108
|
+
for (const detail of skipped)
|
|
109
|
+
disclose(CORRUPT_TAG, detail);
|
|
110
|
+
return want === undefined ? out : out.slice(0, want);
|
|
111
|
+
}
|
|
112
|
+
extra = skipped.length;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function staleRowOrSkip(row, disclose) {
|
|
116
|
+
try {
|
|
117
|
+
return readRecordColumn(row.record_json, String(row.handle));
|
|
118
|
+
}
|
|
119
|
+
catch (e) {
|
|
120
|
+
if (!(e instanceof StoreCorruptError))
|
|
121
|
+
throw e;
|
|
122
|
+
disclose(CORRUPT_TAG, `table=${BACKGROUND_AGENT_TABLE} op=reap handle=${String(row.handle)} status=running ${e.message}`);
|
|
123
|
+
return undefined;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
83
126
|
function flippedForm(live, now) {
|
|
84
127
|
return {
|
|
85
128
|
...live,
|
|
@@ -198,8 +241,10 @@ export async function ensurePgBackgroundAgentSchema(q) {
|
|
|
198
241
|
}
|
|
199
242
|
export class TiDBBackgroundAgentStore {
|
|
200
243
|
pool;
|
|
201
|
-
|
|
244
|
+
disclose;
|
|
245
|
+
constructor(pool, disclose) {
|
|
202
246
|
this.pool = pool;
|
|
247
|
+
this.disclose = disclose;
|
|
203
248
|
}
|
|
204
249
|
async put(record) {
|
|
205
250
|
assertScope(record);
|
|
@@ -234,14 +279,18 @@ export class TiDBBackgroundAgentStore {
|
|
|
234
279
|
return res.affectedRows === 1;
|
|
235
280
|
}
|
|
236
281
|
async listBySession(scope, sessionId, opts) {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
282
|
+
return listReadable(async (limit) => {
|
|
283
|
+
const [rows] = (await this.pool.query(`SELECT ${summaryCols("mysql")} FROM ${BACKGROUND_AGENT_TABLE} WHERE scope_key = ? AND (session_anchor = ? OR root_session_id = ?)${opts?.status !== undefined ? " AND status = ?" : ""}
|
|
284
|
+
ORDER BY spawned_at_ms DESC, handle DESC${limitClause(limit)}`, opts?.status !== undefined ? [scope, sessionId, sessionId, opts.status] : [scope, sessionId, sessionId]));
|
|
285
|
+
return rows;
|
|
286
|
+
}, opts?.limit, "listBySession", this.disclose);
|
|
240
287
|
}
|
|
241
288
|
async listByScope(scope, opts) {
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
289
|
+
return listReadable(async (limit) => {
|
|
290
|
+
const [rows] = (await this.pool.query(`SELECT ${summaryCols("mysql")} FROM ${BACKGROUND_AGENT_TABLE} WHERE scope_key = ?${opts?.status !== undefined ? " AND status = ?" : ""}
|
|
291
|
+
ORDER BY spawned_at_ms DESC, handle DESC${limitClause(limit)}`, opts?.status !== undefined ? [scope, opts.status] : [scope]));
|
|
292
|
+
return rows;
|
|
293
|
+
}, opts?.limit, "listByScope", this.disclose);
|
|
245
294
|
}
|
|
246
295
|
async delete(handle, scope, expect) {
|
|
247
296
|
const [res] = (await this.pool.query(`DELETE FROM ${BACKGROUND_AGENT_TABLE} WHERE scope_key = ? AND handle = ?${expect !== undefined ? " AND rev = ?" : ""}`, expect !== undefined ? [scope, handle, expect.rev] : [scope, handle]));
|
|
@@ -254,7 +303,9 @@ export class TiDBBackgroundAgentStore {
|
|
|
254
303
|
if (opts.staleRunningMaxAgeMs !== undefined) {
|
|
255
304
|
const [stale] = (await this.pool.query(`SELECT handle, ${jsonColumnText("mysql", "record_json")} FROM ${BACKGROUND_AGENT_TABLE} WHERE scope_key = ? AND status = 'running' AND updated_at_ms < ?`, [scope, now - opts.staleRunningMaxAgeMs]));
|
|
256
305
|
for (const row of stale) {
|
|
257
|
-
const live =
|
|
306
|
+
const live = staleRowOrSkip(row, this.disclose);
|
|
307
|
+
if (live === undefined)
|
|
308
|
+
continue;
|
|
258
309
|
if (await this.update(String(row.handle), scope, flippedForm(live, now), { rev: live.rev }))
|
|
259
310
|
flipped.add(String(row.handle));
|
|
260
311
|
}
|
|
@@ -281,8 +332,10 @@ export class TiDBBackgroundAgentStore {
|
|
|
281
332
|
}
|
|
282
333
|
export class PgBackgroundAgentStore {
|
|
283
334
|
q;
|
|
284
|
-
|
|
335
|
+
disclose;
|
|
336
|
+
constructor(q, disclose) {
|
|
285
337
|
this.q = q;
|
|
338
|
+
this.disclose = disclose;
|
|
286
339
|
}
|
|
287
340
|
async put(record) {
|
|
288
341
|
assertScope(record);
|
|
@@ -316,14 +369,12 @@ export class PgBackgroundAgentStore {
|
|
|
316
369
|
return rows.length === 1;
|
|
317
370
|
}
|
|
318
371
|
async listBySession(scope, sessionId, opts) {
|
|
319
|
-
|
|
320
|
-
ORDER BY spawned_at_ms DESC, handle DESC${limitClause(
|
|
321
|
-
return rows.map(rowToSummary);
|
|
372
|
+
return listReadable(async (limit) => (await this.q(`SELECT ${summaryCols("pg")} FROM ${BACKGROUND_AGENT_TABLE} WHERE scope_key = $1 AND (session_anchor = $2 OR root_session_id = $3)${opts?.status !== undefined ? " AND status = $4" : ""}
|
|
373
|
+
ORDER BY spawned_at_ms DESC, handle DESC${limitClause(limit)}`, opts?.status !== undefined ? [scope, sessionId, sessionId, opts.status] : [scope, sessionId, sessionId])).rows, opts?.limit, "listBySession", this.disclose);
|
|
322
374
|
}
|
|
323
375
|
async listByScope(scope, opts) {
|
|
324
|
-
|
|
325
|
-
ORDER BY spawned_at_ms DESC, handle DESC${limitClause(
|
|
326
|
-
return rows.map(rowToSummary);
|
|
376
|
+
return listReadable(async (limit) => (await this.q(`SELECT ${summaryCols("pg")} FROM ${BACKGROUND_AGENT_TABLE} WHERE scope_key = $1${opts?.status !== undefined ? " AND status = $2" : ""}
|
|
377
|
+
ORDER BY spawned_at_ms DESC, handle DESC${limitClause(limit)}`, opts?.status !== undefined ? [scope, opts.status] : [scope])).rows, opts?.limit, "listByScope", this.disclose);
|
|
327
378
|
}
|
|
328
379
|
async delete(handle, scope, expect) {
|
|
329
380
|
const { rows } = await this.q(`DELETE FROM ${BACKGROUND_AGENT_TABLE} WHERE scope_key = $1 AND handle = $2${expect !== undefined ? " AND rev = $3" : ""} RETURNING handle`, expect !== undefined ? [scope, handle, expect.rev] : [scope, handle]);
|
|
@@ -336,7 +387,9 @@ export class PgBackgroundAgentStore {
|
|
|
336
387
|
if (opts.staleRunningMaxAgeMs !== undefined) {
|
|
337
388
|
const { rows: stale } = await this.q(`SELECT handle, ${jsonColumnText("pg", "record_json")} FROM ${BACKGROUND_AGENT_TABLE} WHERE scope_key = $1 AND status = 'running' AND updated_at_ms < $2`, [scope, now - opts.staleRunningMaxAgeMs]);
|
|
338
389
|
for (const row of stale) {
|
|
339
|
-
const live =
|
|
390
|
+
const live = staleRowOrSkip(row, this.disclose);
|
|
391
|
+
if (live === undefined)
|
|
392
|
+
continue;
|
|
340
393
|
if (await this.update(String(row.handle), scope, flippedForm(live, now), { rev: live.rev }))
|
|
341
394
|
affected.add(String(row.handle));
|
|
342
395
|
}
|
|
@@ -2,10 +2,9 @@ import type { Pool as MySqlPool } from "mysql2/promise";
|
|
|
2
2
|
import type { Pool as PgPool } from "pg";
|
|
3
3
|
import { type ExecutionOutcomeRecordWord, type GateOutcome, type Checkpoint, type CheckpointState, type CheckpointStore, type CheckpointSummary, type CheckpointToken, type PendingSteerInput, type ResumeOutcome, type ResolveExpectation, type ReopenReason, type StoreDurability, type StoreFidelity } from "@sema-agent/core";
|
|
4
4
|
import { type SqlDialect, type SqlDriver } from "../plugins/sql-driver.js";
|
|
5
|
-
import type {
|
|
6
|
-
import type { FencedRun } from "../plugins/store-contracts.js";
|
|
5
|
+
import type { CtxWriteClaim } from "../plugins/store-contracts.js";
|
|
7
6
|
import type { RetentionDeclaration } from "@sema-agent/core";
|
|
8
|
-
import { type CheckpointAskCandidate, type CtxClaimRewrite, type CtxRowRewrite, type CtxRowsRewrite, type DecidedApprovalRecord, type PendingCheckpoint, type PendingRowBinding } from "../plugins/checkpoint-store-face.js";
|
|
7
|
+
import { type CheckpointAskCandidate, type CtxClaimPut, type CtxClaimRewrite, type CtxRowRewrite, type CtxRowsRewrite, type DecidedApprovalRecord, type ExpiredApprovalGate, type ExpiredGatePosition, type PendingCheckpoint, type PendingRowBinding } from "../plugins/checkpoint-store-face.js";
|
|
9
8
|
import type { SealedCheckpointCtx } from "../http/checkpoint-ctx.js";
|
|
10
9
|
/**
|
|
11
10
|
* The capability token IS the resume credential (token-as-auth) — anyone who reads it can impersonate a
|
|
@@ -41,7 +40,7 @@ export declare const CHECKPOINT_ADDED_COLUMNS: ReadonlyArray<{
|
|
|
41
40
|
*
|
|
42
41
|
* 判据 = **能力探测**(恒空的 `WHERE 1=0` 读)+ **方言的缺列错误码**({@link isMissingColumnError},
|
|
43
42
|
* 判据属主 `sql-errors.ts`);其余错误**原样 rethrow**,一个字都不加工 —— 把一次瞬时故障诊断成「缺列」的拒因
|
|
44
|
-
* 比它要挡的缺陷更贵([ref] 两轮收窄的结论逐字继承)。拒因的出路是**闭集三条**(与整库对账同一份,{@link
|
|
43
|
+
* 比它要挡的缺陷更贵([ref] 两轮收窄的结论逐字继承)。拒因的出路是**闭集三条**(与整库对账同一份,{@link probedMissingColumnRefusal}),
|
|
45
44
|
* 没有销毁性的一条:这张表里是在飞的停驻,出路是原表上加列。
|
|
46
45
|
*
|
|
47
46
|
* 位置:与三条先例同款,不在 `ensureSchema` 里(那条通道的契约是「只发 CREATE」),放在 boot 的
|
|
@@ -73,10 +72,9 @@ interface SteerColumnRead {
|
|
|
73
72
|
* 列有内容却读不出 ⇒ `lossy`(两个调用点对它的处置见 {@link SteerColumnRead})。
|
|
74
73
|
*/
|
|
75
74
|
export declare function readPendingSteerQueueColumn(queueRaw: unknown): SteerColumnRead;
|
|
76
|
-
/** SQL checkpoint
|
|
75
|
+
/** SQL checkpoint 店的装配选项:托管留存声明。(ctx 栅栏写口的认领由调用方每次交进来 —— [ref]:栅栏的来源是认领本身,店不另绑 run 店。) */
|
|
77
76
|
export interface SqlCheckpointStoreOptions {
|
|
78
77
|
readonly retention?: RetentionDeclaration;
|
|
79
|
-
readonly claims?: SqlRunStore;
|
|
80
78
|
}
|
|
81
79
|
/** Dual-dialect durable CheckpointStore. See the file header for the dialect-delta ledger. */
|
|
82
80
|
export declare class SqlCheckpointStore implements CheckpointStore {
|
|
@@ -132,9 +130,6 @@ export declare class SqlCheckpointStore implements CheckpointStore {
|
|
|
132
130
|
readonly execution: {
|
|
133
131
|
readonly outcome: true;
|
|
134
132
|
};
|
|
135
|
-
/** ctx 改写的认领栅栏({@link SqlCheckpointStore.rewriteCtxWhileClaimed}):后端装配绑**同一只池**上的 run 店(`plugins/store-backend.ts` 的 `checkpoint()`)。
|
|
136
|
-
* 缺席 ⇒ 那一口响亮抛(装配缺陷),其余口不读它。 */
|
|
137
|
-
private readonly claims;
|
|
138
133
|
/** 停驻行投影记忆([ref] ④;运维队列与调度视图共用,见 {@link StoredRowProjectionMemo})。进程内、按店实例。 */
|
|
139
134
|
private readonly storedRowMemo;
|
|
140
135
|
constructor(db: SqlDriver, logger?: {
|
|
@@ -290,19 +285,16 @@ export declare class SqlCheckpointStore implements CheckpointStore {
|
|
|
290
285
|
* in SQL, before the LIMIT: `limit` bounds the per-tick deny-resume work (each is a model run), never hides a row behind
|
|
291
286
|
* rows the sweep does not own.
|
|
292
287
|
*
|
|
293
|
-
* Order ({@link CHECKPOINT_SWEEP_ORDER_SQL}
|
|
294
|
-
*
|
|
295
|
-
*
|
|
296
|
-
*
|
|
297
|
-
* order does: rows whose facet is certain take the window first and a straggler cannot crowd them out.
|
|
288
|
+
* Order and paging ({@link CHECKPOINT_SWEEP_ORDER_SQL} / {@link checkpointSweepAfterSql}): deadline, then token. Each row carries
|
|
289
|
+
* its position on that order; `after` (the last position the sweep read) returns only the rows strictly after it, so the sweep
|
|
290
|
+
* walks the expired set round-robin — a row it could not settle (refused before claim, skipped, parked child) never holds the
|
|
291
|
+
* window for the rows behind it ([ref]). The two position columns are the cursor only: in-process, never on the wire.
|
|
298
292
|
*/
|
|
299
|
-
listExpiredApprovalGates(cutoff: number, limit?: number): Promise<
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
* joined from task_active (the JOIN KEY to the run/trace — a suspended run KEEPS its
|
|
305
|
-
* session claim, so the join is live for every pending row; null only in pathological windows). */
|
|
293
|
+
listExpiredApprovalGates(cutoff: number, limit?: number, after?: ExpiredGatePosition): Promise<ExpiredApprovalGate[]>;
|
|
294
|
+
/** Pending checkpoints for the operator queue — NON-secret fields only (never the token). `taskId` = the task the
|
|
295
|
+
* parked leg runs as ([ref], written by `parkedLegTaskId`): the registry row the engine recorded on the row
|
|
296
|
+
* (`$.state.rowTaskId`, a background child's `a…` handle), else the task_active join (a suspended run KEEPS its
|
|
297
|
+
* session claim); null when neither (a synchronous / workflow child, a terminal-only park). */
|
|
306
298
|
/**
|
|
307
299
|
* [ref] 显式记账 —— **本口与 {@link SqlCheckpointStore.listByScope} 都不投执行判词,这是结构性的不是遗漏**:
|
|
308
300
|
* 两口的谓词都硬 `status='pending'`,而执行记录的 CAS 谓词是 `status='resolved' AND execution_outcome IS NULL`
|
|
@@ -463,9 +455,15 @@ export declare class SqlCheckpointStore implements CheckpointStore {
|
|
|
463
455
|
*/
|
|
464
456
|
peekScopeByToken(token: CheckpointToken): Promise<string | null | undefined>;
|
|
465
457
|
peekPendingScope(sessionId: string, binding?: PendingRowBinding): Promise<string | null | undefined>;
|
|
466
|
-
/**
|
|
467
|
-
*
|
|
468
|
-
*
|
|
458
|
+
/**
|
|
459
|
+
* 一张卡**归在哪只会话上**(归属列;不判状态、不读 blob)—— 手里拿着卡(凭据)、要找它那条 run 的读者读它:决断腿的 run 行 / 续跑输入 / 认领,结算作废的核对。
|
|
460
|
+
* `undefined` = 没有这一行;`null` = 行在、归属列空(滚动升级窗里旧副本写下、还没被 M49 补上的行:说不出归属,读者按「找不到它的 run」处置)。
|
|
461
|
+
*/
|
|
462
|
+
hostSessionOfCard(token: CheckpointToken): Promise<string | null | undefined>;
|
|
463
|
+
/** Upsert the resume rebuild inputs for a session —— 续跑输入的**唯一**写口([ref]):写者持有一只认领 ⇒ 交 `claim`,写落在那只认领的栅栏里
|
|
464
|
+
* ({@link writeCtxWhileClaimed}:「这条 run 此刻仍持有会话认领、在跑、腿判据答是」与写同一笔,同一条事务连接;不持有 ⇒ 零写,答 `claim_released`);
|
|
465
|
+
* 没有认领的写者(leader 子工作者 / 无 run 店的部署)不交 ⇒ 无条件写(没有栅栏可依)。持认领的腿:提交腿 `createRun` 之后、续跑腿 CAS 赢点。
|
|
466
|
+
* 于是「认领 → 写在路上 → 认领被收割 / 终局放掉 → 同会话新 run 写下它的体 → 迟到的这一笔」**结构上落不下**。结局闭集 {@link CtxClaimPut}。
|
|
469
467
|
*
|
|
470
468
|
* 🔴 `ctx: object`, not `unknown` ([ref]): the read leg judges this column as a JSON **object**
|
|
471
469
|
* ({@link decodeCtxColumn}), so a writer that took `unknown` would be the "writes fine, reads back
|
|
@@ -479,7 +477,9 @@ export declare class SqlCheckpointStore implements CheckpointStore {
|
|
|
479
477
|
* SUCCEED and replace a readable durable row with an unreadable one (caller sees 2xx, the next resume
|
|
480
478
|
* 409s forever). So the serialized value is judged by {@link assertJsonColumnWritable} — the SAME shape
|
|
481
479
|
* reader the read leg uses — BEFORE the statement runs: refuse loudly, leave the row on disk untouched. */
|
|
482
|
-
putCtx(sessionId: string, ctx: SealedCheckpointCtx): Promise<
|
|
480
|
+
putCtx(sessionId: string, ctx: SealedCheckpointCtx, claim?: CtxWriteClaim): Promise<CtxClaimPut>;
|
|
481
|
+
/** ctx 行的 upsert 语句(唯一一份;无栅栏写跑在池上,栅栏写跑在栅栏的事务连接上)。 */
|
|
482
|
+
private upsertCtx;
|
|
483
483
|
getCtx<T extends object = object>(sessionId: string): Promise<T | null>;
|
|
484
484
|
/**
|
|
485
485
|
* **认领栅栏下改写既有 ctx 行** —— 在飞 run 的切档口(`http/routes/run-permission-mode.ts`)把准入的模式词写回存储体的唯一写口。
|
|
@@ -487,17 +487,22 @@ export declare class SqlCheckpointStore implements CheckpointStore {
|
|
|
487
487
|
* 规则:只有**接下这笔改写的那条腿**此刻仍持有这条 run 时才写 —— `taskId` 持有 `sessionId` 的会话认领、这条 run 在跑、且调用方的腿判据 `legHolds`
|
|
488
488
|
* 对锁住那一行的 {@link FencedRun} 答是(认领与 `running` 只认 taskId:续跑腿让同一个 taskId 停驻之后回到 `running`、认领仍在,旧腿迟到的改写不许盖掉续跑的新腿
|
|
489
489
|
* 写下的体 —— 那是 ABA,只有腿判据分得开;今天的腿身份 = 副本 `instanceId`(续跑的 CAS 赢点改写它)∧ 调用方进程里这条 run 的活流仍是接下改写的那一只)。
|
|
490
|
-
*
|
|
490
|
+
* 写在调用方交来的那只认领(`claim.fence`,持认领的 run 店)的栅栏事务里
|
|
491
491
|
* (`SqlRunStore.whileHoldingClaim`:先锁 run 行、再锁认领行 —— 与终局 / 收割同序 —— 刷新活性,本口的锁读 + UPDATE 在同一个事务连接上)。
|
|
492
492
|
* 于是「这条 run 终局放掉认领 → 同会话新 run 写下它自己的 ctx → 本口迟到的改写」这一序**结构上不可能**盖掉新 run 的行:终局要等本事务提交才拿得到
|
|
493
|
-
* run
|
|
494
|
-
* 不在腿里的写者走这一口。
|
|
493
|
+
* run 行的锁,拿到之后本口再来就判出不持有、一个字节都不写。持认领的腿自己的写(提交 / 续跑 CAS 赢点)经 {@link putCtx} 交认领、走同一只栅栏例程([ref])。
|
|
495
494
|
* 只改**既有**行(锁读零行 ⇒ `context_absent`,不建行):切档改的是这条 run 提交时写下的那一行,没有那一行就没有要改的存储体。
|
|
496
495
|
* 结局闭集 {@link CtxClaimRewrite}:`written` / `claim_released`(接下改写的那条腿已不持有这条 run —— 认领放了 / 不在跑 / 腿判据答否:零写)/ `context_absent`(持有、无行:零写)。
|
|
497
496
|
* 腿判据在栅栏里同步问一次(锁已持有、写之前);它只读、不许 await。
|
|
498
497
|
* 编码与形闸同 {@link SqlCheckpointStore.putCtx}(写之前判,坏形响亮拒、盘上不动);一行装不下 ⇒ `StoreRowTooLargeError`。
|
|
499
498
|
*/
|
|
500
|
-
rewriteCtxWhileClaimed(sessionId: string,
|
|
499
|
+
rewriteCtxWhileClaimed(sessionId: string, ctx: SealedCheckpointCtx, claim: CtxWriteClaim): Promise<CtxClaimRewrite>;
|
|
500
|
+
/**
|
|
501
|
+
* 两只 ctx 栅栏写(`putCtx` 交认领的那一形 / `rewriteCtxWhileClaimed`)共用的栅栏例程(一处判形、一处判持有、一处折码):调用方交来的认领栅栏必须是 SQL run 店且与本店同方言
|
|
502
|
+
* (两店出自同一后端 —— 同一只池;错形 ⇒ 响亮抛,不降级成无栅栏写);在它的事务里(先锁 run 行、再锁认领行,与终局 / 收割同序)问一次腿判据,
|
|
503
|
+
* 答是才在**同一条事务连接**上跑 `write`。形闸在栅栏之前(坏形不开事务);一行装不下 ⇒ `StoreRowTooLargeError`。
|
|
504
|
+
*/
|
|
505
|
+
private writeCtxWhileClaimed;
|
|
501
506
|
/**
|
|
502
507
|
* 🔴 **一次性迁移的 ctx 行改写店腿**({@link CheckpointCtxRowsRewriter};用它的迁移与各自的行改写见那里,窗与删法见 `plugins/one-time-migrations.ts` 登记表;
|
|
503
508
|
* 本店不知道改写是什么,只负责扫与回写):按 `session_id` 键集分页扫 `checkpoint_ctx`
|