@sema-agent/server 7.147.0 → 7.149.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MIGRATION.md +1468 -24
- package/README.md +35 -7
- package/README.zh-CN.md +18 -8
- package/USAGE.md +444 -193
- package/deploy/sema-up/README.md +16 -5
- package/deploy/sema-up/chart/templates/NOTES.txt +1 -1
- package/deploy/sema-up/chart/templates/_helpers.tpl +20 -4
- package/deploy/sema-up/chart/values.yaml +3 -2
- package/deploy/sema-up/cluster-up.sh +74 -176
- package/deploy/sema-up/kube-up.sh +29 -49
- package/deploy/sema-up/lib/chart-run.sh +23 -0
- package/deploy/sema-up/lib/dataroot.sh +3 -3
- package/deploy/sema-up/lib/health.sh +62 -13
- package/deploy/sema-up/lib/helm-values-cluster.py +18 -0
- package/deploy/sema-up/lib/helm-values-kube.py +35 -0
- package/deploy/sema-up/lib/regcred.py +8 -0
- package/deploy/sema-up/lib/remote/helm-install.sh +3 -0
- package/deploy/sema-up/lib/remote/image-import.sh +6 -0
- package/deploy/sema-up/lib/remote/machine-precheck.sh +11 -0
- package/deploy/sema-up/lib/remote/region-probe.sh +3 -0
- package/deploy/sema-up/lib/remote/stack-ready.sh +26 -0
- package/deploy/sema-up/lib/remote/vxlan-guard.sh +8 -0
- package/deploy/sema-up/lib/render-stack.py +17 -0
- package/deploy/sema-up/lib/shell-text.sh +87 -0
- package/deploy/sema-up/lib/usage-flags.txt +10 -0
- package/deploy/sema-up/lib/usage-head.txt +1 -0
- package/deploy/sema-up/lib/usage-tail.txt +13 -0
- package/deploy/sema-up/preflight.sh +10 -8
- package/deploy/sema-up/sema-up.sh +14 -39
- package/deploy/sema-up/smoke.sh +7 -6
- package/deploy/sema-up/stack/compose.dataroot.yaml +3 -0
- package/deploy/sema-up/stack/compose.yaml +13 -1
- package/deploy/sema-up/stack/sema-stack-cluster.yaml +21 -0
- package/dist/adoption/plan.d.ts +24 -0
- package/dist/adoption/plan.js +53 -1
- package/dist/adoption/runner.d.ts +10 -1
- package/dist/adoption/runner.js +36 -16
- package/dist/approval-card.d.ts +36 -38
- package/dist/approval-gate-currency.js +3 -2
- package/dist/approval-leg-origin.d.ts +33 -0
- package/dist/approval-leg-origin.js +4 -0
- package/dist/approval-reconciler.d.ts +4 -13
- package/dist/approval-reconciler.js +2 -2
- package/dist/approval.d.ts +13 -11
- package/dist/approval.js +3 -3
- package/dist/audit.d.ts +10 -3
- package/dist/audit.js +15 -7
- package/dist/auth-bridge.d.ts +9 -15
- package/dist/auth-bridge.js +4 -11
- package/dist/auth-keys.d.ts +10 -1
- package/dist/auth-keys.js +8 -0
- package/dist/auto-mode-face.d.ts +10 -7
- package/dist/auto-mode-face.js +7 -4
- package/dist/background-agent-name.d.ts +19 -1
- package/dist/background-agent-name.js +12 -2
- package/dist/background-session-reap.d.ts +1 -1
- package/dist/bake-runner/main.js +9 -6
- package/dist/bench/s1/arms.js +6 -5
- package/dist/bench/s1/live-deps.js +5 -2
- package/dist/bench/s1/run-firm.js +6 -5
- package/dist/bind-host.d.ts +25 -0
- package/dist/bind-host.js +25 -0
- package/dist/boot/adoption.d.ts +3 -0
- package/dist/boot/adoption.js +1 -0
- package/dist/boot/deployment-mods.d.ts +1 -1
- package/dist/boot/execution-env.d.ts +17 -7
- package/dist/boot/execution-env.js +47 -42
- package/dist/boot/execution-lane.d.ts +6 -4
- package/dist/boot/execution-lane.js +3 -1
- package/dist/boot/exit-boundary.d.ts +2 -2
- package/dist/boot/exit-boundary.js +6 -5
- package/dist/boot/fatal-exit.d.ts +3 -5
- package/dist/boot/fatal-exit.js +2 -2
- package/dist/boot/leader.d.ts +15 -0
- package/dist/boot/leader.js +17 -15
- package/dist/boot/memory-consolidation.d.ts +37 -29
- package/dist/boot/memory-consolidation.js +11 -5
- package/dist/boot/org-delivery.d.ts +3 -2
- package/dist/boot/org-memory.js +1 -1
- package/dist/boot/parked-revive-gate.js +2 -2
- package/dist/boot/reapers.d.ts +4 -3
- package/dist/boot/reapers.js +19 -16
- package/dist/boot/resolve-spec.d.ts +5 -3
- package/dist/boot/resolve-spec.js +60 -70
- package/dist/boot/retention-lane.d.ts +4 -4
- package/dist/boot/retention-lane.js +2 -2
- package/dist/boot/runner-deps.d.ts +28 -7
- package/dist/boot/runner-deps.js +14 -5
- package/dist/boot/runtime-caps.d.ts +2 -2
- package/dist/boot/runtime-caps.js +16 -2
- package/dist/boot/session-faces.d.ts +16 -7
- package/dist/boot/session-faces.js +114 -94
- package/dist/boot/shutdown.d.ts +5 -4
- package/dist/boot/shutdown.js +6 -4
- package/dist/boot/stage-01-config.d.ts +1 -0
- package/dist/boot/stage-01-config.js +13 -4
- package/dist/boot/stage-02-web-admin-pull.d.ts +2 -0
- package/dist/boot/stage-02-web-admin-pull.js +16 -3
- package/dist/boot/stage-03-store-backend.d.ts +4 -0
- package/dist/boot/stage-03-store-backend.js +4 -3
- package/dist/boot/stage-04-stores.d.ts +3 -0
- package/dist/boot/stage-04-stores.js +2 -2
- package/dist/boot/stage-05-execution-env.d.ts +8 -3
- package/dist/boot/stage-05-execution-env.js +2 -2
- package/dist/boot/stage-06-runners.d.ts +12 -13
- package/dist/boot/stage-06-runners.js +23 -15
- package/dist/boot/stage-07-capability-layer.d.ts +13 -9
- package/dist/boot/stage-07-capability-layer.js +5 -3
- package/dist/boot/stage-08-reapers.d.ts +13 -9
- package/dist/boot/stage-08-reapers.js +3 -3
- package/dist/boot/stage-09-leader.d.ts +14 -16
- package/dist/boot/stage-09-leader.js +12 -4
- package/dist/boot/stage-10-http-server.d.ts +14 -16
- package/dist/boot/stage-10-http-server.js +7 -4
- package/dist/boot/store-evidence.d.ts +20 -0
- package/dist/boot/store-evidence.js +13 -0
- package/dist/boot/stores.d.ts +6 -0
- package/dist/boot/stores.js +41 -27
- package/dist/boot/task-list-lane.d.ts +4 -4
- package/dist/boot/web-admin.d.ts +4 -2
- package/dist/boot/web-admin.js +55 -35
- package/dist/boot/webfetch-summarize-lane.d.ts +1 -1
- package/dist/boot-reclaim.d.ts +3 -1
- package/dist/boot-reclaim.js +1 -1
- package/dist/brain.d.ts +7 -18
- package/dist/brain.js +5 -17
- package/dist/budget.js +6 -6
- package/dist/capabilities/center-plugins.d.ts +7 -1
- package/dist/capabilities/center-plugins.js +32 -10
- package/dist/capabilities/center-wiring.js +1 -1
- package/dist/capabilities/composite-members.d.ts +2 -2
- package/dist/capabilities/composite-members.js +2 -2
- package/dist/capabilities/repo-tools.d.ts +2 -0
- package/dist/capabilities/repo-tools.js +14 -12
- package/dist/capabilities/scenarios.d.ts +6 -15
- package/dist/capabilities/scenarios.js +11 -16
- package/dist/capabilities/skills.d.ts +1 -1
- package/dist/capabilities/tool-defer.d.ts +1 -1
- package/dist/capability-facts.d.ts +39 -11
- package/dist/capability-facts.js +35 -7
- package/dist/card-settle-stored-scope.d.ts +56 -0
- package/dist/card-settle-stored-scope.js +27 -0
- package/dist/card-void.d.ts +8 -13
- package/dist/card-void.js +2 -7
- package/dist/center-credential-renewer.d.ts +6 -2
- package/dist/center-credential-renewer.js +7 -3
- package/dist/config-catalog.d.ts +28 -1
- package/dist/config-catalog.js +95 -85
- package/dist/config-dir-trust.d.ts +37 -4
- package/dist/config-dir-trust.js +88 -44
- package/dist/config-invariants.d.ts +43 -3
- package/dist/config-invariants.js +69 -5
- package/dist/config-lkg.d.ts +23 -1
- package/dist/config-lkg.js +17 -3
- package/dist/config-provider.d.ts +9 -9
- package/dist/config-provider.js +25 -110
- package/dist/config-pull-failure.d.ts +50 -0
- package/dist/config-pull-failure.js +48 -0
- package/dist/config-types.d.ts +62 -21
- package/dist/config.d.ts +14 -21
- package/dist/config.js +141 -64
- package/dist/context-window-notice.d.ts +31 -0
- package/dist/context-window-notice.js +28 -0
- package/dist/delegated-session-owner.d.ts +1 -1
- package/dist/deleted-session-ids.d.ts +3 -2
- package/dist/deployment-governance.d.ts +3 -3
- package/dist/deployment-shape.d.ts +46 -11
- package/dist/deployment-shape.js +8 -0
- package/dist/egress-redirect.d.ts +25 -7
- package/dist/egress-redirect.js +20 -2
- package/dist/elicitation.d.ts +6 -5
- package/dist/elicitation.js +23 -22
- package/dist/engine-identity.d.ts +28 -0
- package/dist/engine-identity.js +10 -0
- package/dist/entry-problems.d.ts +5 -7
- package/dist/entry-problems.js +1 -1
- package/dist/env-facts.js +2 -1
- package/dist/env-name-allowlist-knobs.d.ts +6 -5
- package/dist/env-name-allowlist-knobs.js +5 -0
- package/dist/env-witness.d.ts +7 -0
- package/dist/env-witness.js +16 -0
- package/dist/execution-lane-caps.d.ts +25 -23
- package/dist/execution-lane-caps.js +18 -26
- package/dist/execution-placement.d.ts +58 -18
- package/dist/execution-placement.js +41 -2
- package/dist/field-conflict.d.ts +7 -11
- package/dist/field-conflict.js +3 -3
- package/dist/file-history-capture.d.ts +3 -3
- package/dist/file-history-disclosure.js +1 -0
- package/dist/fleet/fleet-bus.d.ts +21 -3
- package/dist/fleet/fleet-bus.js +35 -25
- package/dist/fleet/fleet-reconciler.js +2 -2
- package/dist/fleet/serving-lease.js +3 -3
- package/dist/fleet-client.js +3 -3
- package/dist/fleet-lease.d.ts +0 -1
- package/dist/fleet-lease.js +4 -5
- package/dist/history-anchor.d.ts +23 -3
- package/dist/history-anchor.js +24 -4
- package/dist/hitl-delivery.d.ts +90 -0
- package/dist/hitl-delivery.js +98 -0
- package/dist/hooks/classic-stations.d.ts +8 -11
- package/dist/hooks/classic-stations.js +0 -7
- package/dist/hooks/command-spawn.d.ts +7 -2
- package/dist/hooks/command-spawn.js +13 -6
- package/dist/hooks/hook-llm.d.ts +5 -1
- package/dist/hooks/hook-llm.js +24 -15
- package/dist/hooks/hook-runner.d.ts +72 -57
- package/dist/hooks/hook-runner.js +271 -193
- package/dist/host-lsp-manager.d.ts +22 -8
- package/dist/host-lsp-manager.js +4 -1
- package/dist/http/active-run-conflict.d.ts +2 -43
- package/dist/http/active-run-conflict.js +3 -7
- package/dist/http/admission.d.ts +4 -18
- package/dist/http/admission.js +76 -79
- package/dist/http/approval-sweeps.d.ts +3 -3
- package/dist/http/approval-sweeps.js +56 -31
- package/dist/http/caller-trust.d.ts +8 -10
- package/dist/http/caller-trust.js +1 -2
- package/dist/http/claim-heartbeat.d.ts +49 -0
- package/dist/http/claim-heartbeat.js +46 -0
- package/dist/http/claimed-run.d.ts +16 -8
- package/dist/http/claimed-run.js +8 -0
- package/dist/http/dispatch.d.ts +8 -1
- package/dist/http/dispatch.js +78 -30
- package/dist/http/durable-run-leg.d.ts +11 -4
- package/dist/http/durable-run-leg.js +45 -21
- package/dist/http/execution-context.d.ts +122 -47
- package/dist/http/execution-context.js +135 -43
- package/dist/http/health-reader.d.ts +36 -0
- package/dist/http/health-reader.js +21 -0
- package/dist/http/health-self-report.d.ts +9 -9
- package/dist/http/health-self-report.js +4 -4
- package/dist/http/idempotency.d.ts +9 -5
- package/dist/http/idempotency.js +4 -4
- package/dist/http/memory-compliance-failure-reply.d.ts +15 -16
- package/dist/http/memory-compliance-failure-reply.js +4 -2
- package/dist/http/memory-face-fault-reply.d.ts +67 -0
- package/dist/http/memory-face-fault-reply.js +71 -0
- package/dist/http/memory-store-refusal-reply.d.ts +1 -1
- package/dist/http/memory-store-refusal-reply.js +3 -0
- package/dist/http/owner-access.d.ts +392 -67
- package/dist/http/owner-access.js +370 -35
- package/dist/http/principal-gate.d.ts +39 -89
- package/dist/http/principal-gate.js +26 -68
- package/dist/http/refusal-body.d.ts +35 -2
- package/dist/http/refusal-body.js +34 -0
- package/dist/http/request-guards.d.ts +9 -13
- package/dist/http/request-guards.js +34 -68
- package/dist/http/resume-composition.d.ts +37 -0
- package/dist/http/resume-composition.js +18 -0
- package/dist/http/resume-ctx-read.d.ts +46 -12
- package/dist/http/resume-ctx-read.js +31 -6
- package/dist/http/resume-legs.d.ts +54 -19
- package/dist/http/resume-legs.js +408 -196
- package/dist/http/retired-skill-manifest.d.ts +1 -1
- package/dist/http/route-ctx.d.ts +31 -32
- package/dist/http/routes/a2a-serve.d.ts +43 -5
- package/dist/http/routes/a2a-serve.js +60 -37
- package/dist/http/routes/admin-config-refresh.js +2 -2
- package/dist/http/routes/admin-drain.js +2 -2
- package/dist/http/routes/admin-memory-optout.js +4 -3
- package/dist/http/routes/adoption.d.ts +3 -0
- package/dist/http/routes/adoption.js +17 -10
- package/dist/http/routes/agents-roster.js +13 -7
- package/dist/http/routes/approvals-assistant.js +73 -67
- package/dist/http/routes/attachments.js +2 -2
- package/dist/http/routes/background.d.ts +3 -3
- package/dist/http/routes/background.js +9 -17
- package/dist/http/routes/capabilities.js +16 -19
- package/dist/http/routes/config-catalog.js +2 -2
- package/dist/http/routes/devices.d.ts +3 -3
- package/dist/http/routes/devices.js +4 -4
- package/dist/http/routes/diagnostics.d.ts +29 -3
- package/dist/http/routes/diagnostics.js +49 -18
- package/dist/http/routes/engine.js +2 -2
- package/dist/http/routes/fleet.js +5 -3
- package/dist/http/routes/images.js +10 -6
- package/dist/http/routes/leader.d.ts +7 -2
- package/dist/http/routes/leader.js +12 -3
- package/dist/http/routes/mcp-reconnect.d.ts +1 -1
- package/dist/http/routes/mcp-reconnect.js +7 -15
- package/dist/http/routes/memory-bundle.js +4 -7
- package/dist/http/routes/memory-compliance.js +4 -4
- package/dist/http/routes/memory-consolidation.js +6 -9
- package/dist/http/routes/memory-origin.d.ts +2 -0
- package/dist/http/routes/memory-origin.js +7 -8
- package/dist/http/routes/memory-policy.js +17 -12
- package/dist/http/routes/notify-wake.js +10 -19
- package/dist/http/routes/observability.js +3 -3
- package/dist/http/routes/principal-inbox.d.ts +4 -2
- package/dist/http/routes/principal-inbox.js +5 -4
- package/dist/http/routes/projects.d.ts +1 -1
- package/dist/http/routes/projects.js +3 -2
- package/dist/http/routes/retention-ops.js +6 -9
- package/dist/http/routes/rules.js +20 -5
- package/dist/http/routes/run-memory-capture.d.ts +2 -2
- package/dist/http/routes/run-memory-capture.js +6 -12
- package/dist/http/routes/run-permission-mode.d.ts +2 -2
- package/dist/http/routes/run-permission-mode.js +10 -17
- package/dist/http/routes/runs.js +155 -237
- package/dist/http/routes/session-memory-sync.d.ts +2 -2
- package/dist/http/routes/session-memory-sync.js +7 -13
- package/dist/http/routes/session-sync.d.ts +28 -7
- package/dist/http/routes/session-sync.js +63 -50
- package/dist/http/routes/sessions-list.d.ts +3 -3
- package/dist/http/routes/sessions-list.js +9 -9
- package/dist/http/routes/sessions.js +87 -124
- package/dist/http/routes/shared-memory.js +6 -6
- package/dist/http/routes/side-query.js +2 -2
- package/dist/http/routes/tasks.js +237 -187
- package/dist/http/routes/trace-usage.d.ts +0 -12
- package/dist/http/routes/trace-usage.js +40 -46
- package/dist/http/routes/workflows.d.ts +39 -4
- package/dist/http/routes/workflows.js +42 -14
- package/dist/http/run-concurrency-cap.d.ts +20 -12
- package/dist/http/run-concurrency-cap.js +39 -26
- package/dist/http/run-read-face.d.ts +3 -5
- package/dist/http/run-read-face.js +8 -13
- package/dist/http/send.d.ts +12 -3
- package/dist/http/send.js +42 -6
- package/dist/http/server.d.ts +43 -45
- package/dist/http/server.js +61 -11
- package/dist/http/sse-log.d.ts +17 -10
- package/dist/http/sse-log.js +7 -7
- package/dist/http/stored-body-replay.d.ts +12 -0
- package/dist/http/stored-body-replay.js +2 -2
- package/dist/http/submit-ctx.d.ts +17 -8
- package/dist/http/submit-ctx.js +8 -5
- package/dist/http/submit-replay.d.ts +19 -6
- package/dist/http/submit-replay.js +18 -6
- package/dist/http/sync-submit-body.d.ts +3 -4
- package/dist/http/sync-submit-body.js +4 -5
- package/dist/http/wire-types.d.ts +4 -3
- package/dist/identity-source.d.ts +36 -5
- package/dist/identity-source.js +27 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.js +2 -0
- package/dist/key-resolver.d.ts +32 -0
- package/dist/key-resolver.js +23 -9
- package/dist/leader/diffup.js +2 -1
- package/dist/leader/endpoint.d.ts +26 -5
- package/dist/leader/endpoint.js +154 -14
- package/dist/leader/fanout.d.ts +3 -0
- package/dist/leader/fanout.js +78 -63
- package/dist/leader/leader.d.ts +16 -0
- package/dist/leader/leader.js +43 -3
- package/dist/leader/merge.d.ts +9 -1
- package/dist/leader/merge.js +16 -1
- package/dist/leader/repair-wire.js +1 -1
- package/dist/leader/wire.d.ts +36 -3
- package/dist/leader/wire.js +59 -18
- package/dist/leg-facts.d.ts +7 -2
- package/dist/leg-facts.js +1 -0
- package/dist/local-store-declaration.d.ts +54 -0
- package/dist/local-store-declaration.js +59 -0
- package/dist/lsp-evict.d.ts +6 -4
- package/dist/lsp-evict.js +2 -3
- package/dist/mcp-assertion-header.d.ts +1 -1
- package/dist/mcp-assertion-header.js +1 -1
- package/dist/memory-operator-faces.d.ts +5 -4
- package/dist/memory-operator-faces.js +1 -1
- package/dist/memory-project-layer.js +1 -1
- package/dist/memory-scope.d.ts +33 -6
- package/dist/memory-scope.js +68 -19
- package/dist/memory-store-refusal.d.ts +5 -2
- package/dist/memory-sync-client.d.ts +3 -2
- package/dist/memory-sync-client.js +8 -5
- package/dist/model-compat.d.ts +17 -8
- package/dist/model-compat.js +6 -2
- package/dist/model-context-window.d.ts +57 -0
- package/dist/model-context-window.js +21 -0
- package/dist/model-entry-headers.d.ts +46 -4
- package/dist/model-entry-headers.js +2 -2
- package/dist/model-entry-refusal.d.ts +40 -20
- package/dist/model-entry-refusal.js +57 -30
- package/dist/model-plane-face.d.ts +19 -11
- package/dist/model-plane-face.js +9 -1
- package/dist/model-plane-probe.d.ts +2 -0
- package/dist/model-plane-probe.js +17 -0
- package/dist/model-provider.d.ts +3 -3
- package/dist/model-reach-scope.d.ts +2 -1
- package/dist/model-route-endpoint.d.ts +9 -5
- package/dist/model-route-endpoint.js +29 -7
- package/dist/model-select.d.ts +16 -0
- package/dist/model-select.js +4 -0
- package/dist/mountinfo.d.ts +37 -0
- package/dist/mountinfo.js +47 -0
- package/dist/namespaced-rule-name.d.ts +23 -14
- package/dist/namespaced-rule-name.js +8 -11
- package/dist/net-address.d.ts +1 -1
- package/dist/observability/corrupt-read-seat.d.ts +4 -4
- package/dist/observability/corrupt-read-seat.js +5 -3
- package/dist/observability/fail-open.d.ts +72 -40
- package/dist/observability/fail-open.js +74 -40
- package/dist/observability/logger.d.ts +22 -1
- package/dist/observability/logger.js +89 -12
- package/dist/observability/metrics.js +4 -5
- package/dist/observability/otel-exporter.js +2 -1
- package/dist/observability/principal-context.d.ts +14 -7
- package/dist/observability/principal-context.js +8 -3
- package/dist/observability/run-terminal.d.ts +7 -1
- package/dist/observability/run-terminal.js +6 -2
- package/dist/observability/secret-env-scrub.d.ts +1 -1
- package/dist/observability/secret-env-scrub.js +1 -1
- package/dist/orchestration/hardened-vm-runner.d.ts +1 -0
- package/dist/orchestration/hardened-vm-runner.js +11 -5
- package/dist/orchestration/hardened-vm-worker-runner.d.ts +0 -14
- package/dist/orchestration/hardened-vm-worker-runner.js +5 -0
- package/dist/orchestration/hardened-vm-worker.js +2 -1
- package/dist/orchestration/workflow-completion-inbox.d.ts +3 -3
- package/dist/orchestration/workflow-completion-inbox.js +3 -2
- package/dist/org-delivery-gate.d.ts +36 -10
- package/dist/org-delivery-gate.js +12 -8
- package/dist/outbound-dispatcher.d.ts +1 -1
- package/dist/outbound-dispatcher.js +6 -12
- package/dist/owner-brands.d.ts +81 -0
- package/dist/owner-brands.js +42 -0
- package/dist/owner-faces.d.ts +532 -0
- package/dist/owner-faces.js +126 -0
- package/dist/park-row-commit.d.ts +67 -0
- package/dist/park-row-commit.js +76 -0
- package/dist/parked-decide.d.ts +76 -12
- package/dist/parked-decide.js +152 -11
- package/dist/parked-revive-surface.d.ts +14 -4
- package/dist/parked-revive-surface.js +5 -4
- package/dist/peer-directory.d.ts +7 -9
- package/dist/peer-directory.js +3 -2
- package/dist/permission-rule-vocab.d.ts +53 -8
- package/dist/permission-rule-vocab.js +30 -2
- package/dist/plugins/adoption-log-sql.d.ts +3 -25
- package/dist/plugins/adoption-log-sql.js +23 -21
- package/dist/plugins/approval-ask-retired-delete-by-task-m50.d.ts +7 -0
- package/dist/plugins/approval-ask-retired-delete-by-task-m50.js +17 -0
- package/dist/plugins/approval-ask-store-file.d.ts +18 -7
- package/dist/plugins/approval-ask-store-file.js +37 -14
- package/dist/plugins/approval-ask-store-memory.d.ts +12 -4
- package/dist/plugins/approval-ask-store-memory.js +24 -10
- package/dist/plugins/approval-ask-store-sql.d.ts +40 -21
- package/dist/plugins/approval-ask-store-sql.js +44 -15
- package/dist/plugins/approval-exemption-skill-cutoff.d.ts +64 -0
- package/dist/plugins/approval-exemption-skill-cutoff.js +122 -0
- package/dist/plugins/approval-exemption-skill-m46.d.ts +14 -0
- package/dist/plugins/approval-exemption-skill-m46.js +21 -0
- package/dist/plugins/approval-exemption-store.d.ts +32 -2
- package/dist/plugins/approval-exemption-store.js +42 -19
- package/dist/plugins/approval-nonce-store.d.ts +39 -12
- package/dist/plugins/approval-nonce-store.js +72 -23
- package/dist/plugins/blob-backend.d.ts +2 -0
- package/dist/plugins/blob-backend.js +9 -6
- package/dist/plugins/caching-session-store.d.ts +13 -1
- package/dist/plugins/caching-session-store.js +43 -4
- package/dist/plugins/checkpoint-index-columns.d.ts +32 -5
- package/dist/plugins/checkpoint-index-columns.js +36 -1
- package/dist/plugins/checkpoint-store-face.d.ts +83 -10
- package/dist/plugins/checkpoint-store-face.js +18 -1
- package/dist/plugins/device-store-sql.js +1 -0
- package/dist/plugins/ensure-index.d.ts +13 -1
- package/dist/plugins/ensure-index.js +154 -21
- package/dist/plugins/ensure-schema-lock-policy.d.ts +36 -18
- package/dist/plugins/ensure-schema-lock-policy.js +76 -9
- package/dist/plugins/file-run-store.d.ts +85 -32
- package/dist/plugins/file-run-store.js +177 -94
- package/dist/plugins/host-platform.d.ts +24 -3
- package/dist/plugins/host-platform.js +15 -1
- package/dist/plugins/image-bake-store-sql.js +2 -0
- package/dist/plugins/imported-layer-root-retirement.d.ts +2 -2
- package/dist/plugins/k8s-pod-reaper.d.ts +1 -3
- package/dist/plugins/k8s-pod-reaper.js +0 -1
- package/dist/plugins/leader-run-store-sql.d.ts +22 -0
- package/dist/plugins/leader-run-store-sql.js +34 -4
- package/dist/plugins/local-checkpoint-store.d.ts +62 -23
- package/dist/plugins/local-checkpoint-store.js +197 -77
- package/dist/plugins/local-data-dir-modes-m39.js +2 -1
- package/dist/plugins/local-data-root-admission.d.ts +52 -0
- package/dist/plugins/local-data-root-admission.js +100 -0
- package/dist/plugins/local-docker-capacity.d.ts +93 -0
- package/dist/plugins/local-docker-capacity.js +194 -0
- package/dist/plugins/local-docker-reaper.d.ts +92 -0
- package/dist/plugins/local-docker-reaper.js +102 -0
- package/dist/plugins/local-engine-high-water.d.ts +29 -6
- package/dist/plugins/local-engine-high-water.js +27 -19
- package/dist/plugins/local-session-store.d.ts +458 -140
- package/dist/plugins/local-session-store.js +906 -292
- package/dist/plugins/local-session-window.d.ts +3 -2
- package/dist/plugins/local-session-window.js +3 -2
- package/dist/plugins/local-sidecar-quarantine.js +3 -2
- package/dist/plugins/local-task-attachment-store.d.ts +18 -1
- package/dist/plugins/local-task-attachment-store.js +22 -1
- package/dist/plugins/memory-embedder.js +9 -7
- package/dist/plugins/memory-engine-pg.d.ts +3 -2
- package/dist/plugins/memory-engine-pg.js +14 -5
- package/dist/plugins/memory-engine-sql-apply.d.ts +8 -4
- package/dist/plugins/memory-engine-sql-apply.js +6 -8
- package/dist/plugins/memory-engine-tidb.d.ts +4 -2
- package/dist/plugins/memory-engine-tidb.js +11 -2
- package/dist/plugins/memory-optout-grant-store-sql.d.ts +1 -1
- package/dist/plugins/memory-optout-grant-store-sql.js +3 -3
- package/dist/plugins/memory-run-store.d.ts +53 -36
- package/dist/plugins/memory-run-store.js +116 -88
- package/dist/plugins/one-time-migration-marker.d.ts +26 -0
- package/dist/plugins/one-time-migration-marker.js +13 -0
- package/dist/plugins/one-time-migrations.d.ts +214 -47
- package/dist/plugins/one-time-migrations.js +481 -135
- package/dist/plugins/org-delivery-quota-store.d.ts +34 -11
- package/dist/plugins/org-delivery-quota-store.js +31 -15
- package/dist/plugins/permission-rule-store-file.d.ts +3 -3
- package/dist/plugins/permission-rule-store-sql.d.ts +5 -64
- package/dist/plugins/permission-rule-store-sql.js +11 -95
- package/dist/plugins/pg-pool.d.ts +2 -32
- package/dist/plugins/pg-pool.js +24 -17
- package/dist/plugins/remote-env-device.d.ts +3 -2
- package/dist/plugins/remote-env-e2b.d.ts +8 -32
- package/dist/plugins/remote-env-e2b.js +44 -32
- package/dist/plugins/remote-env-host.d.ts +51 -17
- package/dist/plugins/remote-env-host.js +111 -42
- package/dist/plugins/remote-env-k8s.d.ts +40 -45
- package/dist/plugins/remote-env-k8s.js +111 -60
- package/dist/plugins/remote-env-local-docker.d.ts +152 -15
- package/dist/plugins/remote-env-local-docker.js +352 -72
- package/dist/plugins/remote-scratchpad.js +4 -0
- package/dist/plugins/retention-deployment.d.ts +49 -17
- package/dist/plugins/retention-deployment.js +39 -8
- package/dist/plugins/run-preview-m45.d.ts +11 -0
- package/dist/plugins/run-preview-m45.js +19 -0
- package/dist/plugins/run-store-sql.d.ts +82 -75
- package/dist/plugins/run-store-sql.js +164 -125
- package/dist/plugins/s3-answer.d.ts +2 -1
- package/dist/plugins/sandbox-reaper.d.ts +26 -0
- package/dist/plugins/sandbox-reaper.js +2 -0
- package/dist/plugins/scenario-prefix-switch-m42.d.ts +56 -0
- package/dist/plugins/scenario-prefix-switch-m42.js +56 -0
- package/dist/plugins/scheduler-support.d.ts +16 -1
- package/dist/plugins/scheduler-support.js +22 -2
- package/dist/plugins/schema-consistency.d.ts +131 -14
- package/dist/plugins/schema-consistency.js +388 -18
- package/dist/plugins/schema-drift-sentence.d.ts +10 -6
- package/dist/plugins/schema-drift-sentence.js +15 -7
- package/dist/plugins/schema-ensure-legs.d.ts +9 -0
- package/dist/plugins/schema-ensure-legs.js +1 -1
- package/dist/plugins/schema-indexes.js +3 -0
- package/dist/plugins/schema-live-columns.d.ts +14 -5
- package/dist/plugins/schema-live-columns.js +10 -10
- package/dist/plugins/send-user-file.js +2 -1
- package/dist/plugins/session-birth.d.ts +37 -0
- package/dist/plugins/session-birth.js +38 -0
- package/dist/plugins/session-epoch-anchor.d.ts +40 -12
- package/dist/plugins/session-epoch-anchor.js +33 -11
- package/dist/plugins/session-ext-table.d.ts +27 -3
- package/dist/plugins/session-ext-table.js +19 -6
- package/dist/plugins/session-fork.d.ts +15 -1
- package/dist/plugins/session-fork.js +3 -0
- package/dist/plugins/session-ownership.d.ts +1 -1
- package/dist/plugins/session-placement.d.ts +27 -20
- package/dist/plugins/session-placement.js +15 -12
- package/dist/plugins/session-row-sql.d.ts +12 -0
- package/dist/plugins/session-row-sql.js +3 -3
- package/dist/plugins/session-run-rollup.d.ts +29 -0
- package/dist/plugins/session-run-rollup.js +40 -0
- package/dist/plugins/session-store-sql.d.ts +38 -12
- package/dist/plugins/session-store-sql.js +130 -30
- package/dist/plugins/session-withdraw-sql.d.ts +36 -0
- package/dist/plugins/session-withdraw-sql.js +42 -0
- package/dist/plugins/shared-memory-store-sql.d.ts +0 -69
- package/dist/plugins/shared-memory-store-sql.js +2 -1
- package/dist/plugins/shell-sentinel-owner-m48.d.ts +42 -0
- package/dist/plugins/shell-sentinel-owner-m48.js +9 -0
- package/dist/plugins/snapshot-bucket-presence.d.ts +2 -1
- package/dist/plugins/sql-driver.d.ts +1 -1
- package/dist/plugins/sql-driver.js +2 -1
- package/dist/plugins/sql-errors.d.ts +32 -5
- package/dist/plugins/sql-errors.js +55 -7
- package/dist/plugins/sql-json-column.d.ts +8 -7
- package/dist/plugins/sql-json-column.js +10 -6
- package/dist/plugins/stop-then-start-sentence.d.ts +16 -0
- package/dist/plugins/stop-then-start-sentence.js +7 -0
- package/dist/plugins/store-backend.d.ts +99 -16
- package/dist/plugins/store-backend.js +230 -65
- package/dist/plugins/store-contracts.d.ts +123 -33
- package/dist/plugins/store-contracts.js +38 -1
- package/dist/plugins/store-fault.d.ts +28 -2
- package/dist/plugins/store-fault.js +20 -2
- package/dist/plugins/task-attachment-store.d.ts +15 -3
- package/dist/plugins/task-attachment-store.js +22 -9
- package/dist/plugins/tidb-pool.d.ts +11 -6
- package/dist/plugins/tidb-pool.js +39 -18
- package/dist/plugins/web-search.js +5 -3
- package/dist/plugins/workflow-run-store-sql.d.ts +6 -1
- package/dist/plugins/workflow-run-store-sql.js +11 -5
- package/dist/plugins/workspace-custody.d.ts +44 -0
- package/dist/plugins/workspace-custody.js +47 -0
- package/dist/principal-jwt.d.ts +4 -4
- package/dist/principal-jwt.js +20 -5
- package/dist/principal-shape.d.ts +41 -0
- package/dist/principal-shape.js +19 -0
- package/dist/project-identity.d.ts +8 -7
- package/dist/project-identity.js +40 -17
- package/dist/project-layer-key.d.ts +13 -2
- package/dist/project-layer-key.js +9 -1
- package/dist/question.d.ts +13 -23
- package/dist/question.js +21 -39
- package/dist/read-deny-floor-notice.d.ts +36 -0
- package/dist/read-deny-floor-notice.js +40 -0
- package/dist/{plain-string-record.d.ts → request-declaration-disposition.d.ts} +9 -23
- package/dist/request-declaration-disposition.js +39 -0
- package/dist/request-declaration-refusal.d.ts +35 -12
- package/dist/request-declaration-refusal.js +21 -9
- package/dist/request-form.d.ts +58 -0
- package/dist/request-form.js +72 -0
- package/dist/request-image-urls.d.ts +8 -2
- package/dist/request-image-urls.js +2 -1
- package/dist/request-images.d.ts +20 -0
- package/dist/request-images.js +59 -0
- package/dist/request-key-closure.d.ts +6 -7
- package/dist/request-key-closure.js +15 -2
- package/dist/resource-suspend.d.ts +7 -16
- package/dist/resource-suspend.js +1 -1
- package/dist/retired-name-host-notice.d.ts +21 -0
- package/dist/retired-name-host-notice.js +12 -0
- package/dist/rule-entry-list.d.ts +2 -2
- package/dist/rule-entry-list.js +3 -4
- package/dist/rule-issue-reading.d.ts +58 -0
- package/dist/rule-issue-reading.js +14 -0
- package/dist/rules-consent.d.ts +5 -3
- package/dist/rules-consent.js +1 -0
- package/dist/run-acceptance.d.ts +3 -1
- package/dist/run-acceptance.js +3 -0
- package/dist/run-cancel-card.d.ts +28 -0
- package/dist/run-cancel-card.js +19 -0
- package/dist/run-cancel-context.d.ts +10 -0
- package/dist/run-cancel-context.js +1 -0
- package/dist/run-local.d.ts +14 -6
- package/dist/run-local.js +117 -90
- package/dist/run-stale-default.d.ts +7 -0
- package/dist/run-stale-default.js +2 -0
- package/dist/runs.d.ts +56 -21
- package/dist/runs.js +73 -43
- package/dist/runtime-caps-resolver.d.ts +21 -6
- package/dist/runtime-caps-resolver.js +17 -4
- package/dist/runtime-governance.d.ts +2 -2
- package/dist/runtime-governance.js +5 -3
- package/dist/sealed-key-layout.d.ts +12 -5
- package/dist/sealed-key-layout.js +5 -0
- package/dist/sealed-key.d.ts +12 -2
- package/dist/sealed-key.js +115 -27
- package/dist/security.d.ts +128 -158
- package/dist/security.js +163 -59
- package/dist/sema-config-dir.d.ts +20 -0
- package/dist/sema-config-dir.js +25 -0
- package/dist/server-secret-env.d.ts +55 -25
- package/dist/server-secret-env.js +75 -22
- package/dist/session-agent.d.ts +3 -2
- package/dist/session-children-retire.d.ts +13 -8
- package/dist/session-children-retire.js +9 -7
- package/dist/session-deletion.d.ts +88 -0
- package/dist/session-deletion.js +8 -0
- package/dist/session-erase.d.ts +145 -0
- package/dist/session-erase.js +115 -0
- package/dist/session-error-wire.d.ts +5 -5
- package/dist/session-error-wire.js +1 -1
- package/dist/session-incarnation.d.ts +52 -5
- package/dist/session-incarnation.js +19 -2
- package/dist/session-policy-wire.d.ts +6 -3
- package/dist/session-policy-wire.js +11 -1
- package/dist/session-resident-background.d.ts +0 -71
- package/dist/session-resident-background.js +4 -3
- package/dist/session-row.d.ts +2 -1
- package/dist/session-rules-seat.d.ts +12 -0
- package/dist/session-rules-seat.js +19 -0
- package/dist/session-titler.d.ts +7 -15
- package/dist/session-titler.js +1 -1
- package/dist/session-workspace.d.ts +3 -3
- package/dist/spec-fields.d.ts +57 -3
- package/dist/spec-fields.js +72 -51
- package/dist/store-admission.d.ts +33 -0
- package/dist/store-admission.js +49 -0
- package/dist/store-posture.d.ts +141 -20
- package/dist/store-posture.js +205 -3
- package/dist/stored-request-hooks-m20.js +2 -2
- package/dist/stores-sql/background-agent-store-sql.d.ts +11 -2
- package/dist/stores-sql/background-agent-store-sql.js +73 -20
- package/dist/stores-sql/checkpoint-store-sql.d.ts +34 -29
- package/dist/stores-sql/checkpoint-store-sql.js +78 -49
- package/dist/stores-sql/file-history-store-sql.d.ts +1 -1
- package/dist/stores-sql/file-history-store-sql.js +3 -5
- package/dist/stores-sql/mailbox-store-sql.d.ts +7 -4
- package/dist/stores-sql/mailbox-store-sql.js +31 -32
- package/dist/stores-sql/pg-session-storage.d.ts +7 -5
- package/dist/stores-sql/pg-session-storage.js +54 -46
- package/dist/stores-sql/retention-store-sql.d.ts +87 -19
- package/dist/stores-sql/retention-store-sql.js +92 -27
- package/dist/stores-sql/session-policy-store-sql.d.ts +32 -10
- package/dist/stores-sql/session-policy-store-sql.js +44 -36
- package/dist/stores-sql/session-write-hooks.d.ts +12 -6
- package/dist/stores-sql/tidb-session-storage.d.ts +4 -4
- package/dist/stores-sql/tidb-session-storage.js +13 -8
- package/dist/stores-sql/tidb-session-store.d.ts +36 -17
- package/dist/stores-sql/tidb-session-store.js +69 -39
- package/dist/stores-sql/tool-result-store-sql.d.ts +1 -1
- package/dist/stores-sql/tool-result-store-sql.js +4 -6
- package/dist/stores-sql/windowed-session-storage.d.ts +5 -0
- package/dist/stores-sql/windowed-session-storage.js +9 -0
- package/dist/submission-exit.d.ts +50 -0
- package/dist/submission-exit.js +108 -0
- package/dist/task-a2a.d.ts +3 -8
- package/dist/task-a2a.js +28 -30
- package/dist/task-cwd.d.ts +43 -7
- package/dist/task-cwd.js +11 -0
- package/dist/task-mcp.d.ts +3 -3
- package/dist/task-mcp.js +4 -4
- package/dist/task-settings.d.ts +14 -10
- package/dist/task-settings.js +19 -7
- package/dist/terminal.d.ts +27 -43
- package/dist/terminal.js +49 -14
- package/dist/tool-approval.d.ts +173 -163
- package/dist/tool-approval.js +247 -232
- package/dist/trace/core-keyset-guard.d.ts +13 -6
- package/dist/trace/core-vocab-wire.d.ts +95 -0
- package/dist/trace/core-vocab-wire.js +15 -0
- package/dist/trace/engine-notice-wire.d.ts +24 -21
- package/dist/trace/engine-notice-wire.js +7 -3
- package/dist/trace/exit-seat.d.ts +30 -4
- package/dist/trace/exit-seat.js +40 -36
- package/dist/trace/extension-call-face.d.ts +3 -2
- package/dist/trace/extension-call-face.js +3 -1
- package/dist/trace/ledger-events.d.ts +4 -7
- package/dist/trace/ledger-sink.d.ts +4 -31
- package/dist/trace/ledger-sink.js +0 -11
- package/dist/trace/model-segment.d.ts +5 -5
- package/dist/trace/model-segment.js +5 -5
- package/dist/trace/project.d.ts +59 -44
- package/dist/trace/project.js +60 -26
- package/dist/trace/redact.d.ts +135 -27
- package/dist/trace/redact.js +884 -260
- package/dist/trace/self-minted-wire.d.ts +567 -20
- package/dist/trace/self-minted-wire.js +205 -24
- package/dist/trace/wire-projection-faces.d.ts +5 -6
- package/dist/trace/wire-projection-faces.js +2 -2
- package/dist/upstream-body.d.ts +23 -0
- package/dist/upstream-body.js +16 -0
- package/dist/url-refusal.d.ts +3 -3
- package/dist/url-refusal.js +11 -4
- package/dist/user-authored-text.d.ts +1 -1
- package/dist/user-input-ledger.d.ts +7 -8
- package/dist/user-input-ledger.js +1 -1
- package/dist/web-admin-client/apply-effective.d.ts +6 -3
- package/dist/web-admin-client/apply-effective.js +33 -23
- package/dist/web-admin-client/apply-ledger.d.ts +16 -7
- package/dist/web-admin-client/apply-ledger.js +5 -2
- package/dist/web-admin-client/center-request.d.ts +2 -2
- package/dist/web-admin-client/center-request.js +15 -15
- package/dist/web-admin-client/effective-keys.d.ts +1 -1
- package/dist/web-admin-client/effective-keys.js +1 -1
- package/dist/web-admin-client/entry-metadata.d.ts +8 -0
- package/dist/web-admin-client/entry-metadata.js +13 -0
- package/dist/web-admin-client/http-client.d.ts +1 -1
- package/dist/web-admin-client/http-client.js +23 -4
- package/dist/web-admin-client/mcp-revocation.d.ts +1 -1
- package/dist/web-admin-client/mcp-revocation.js +2 -1
- package/dist/web-admin-client/read-warnings.d.ts +1 -0
- package/dist/web-admin-client/read-warnings.js +1 -0
- package/dist/web-admin-client/restart-signal.js +8 -4
- package/dist/web-admin-client/skills-mcp.d.ts +2 -2
- package/dist/web-admin-client/types.d.ts +1 -2
- package/dist/workspace-space.d.ts +3 -2
- package/docs/DEVICE-EXECUTOR-PROTOCOL.md +4 -4
- package/docs/error-text-lexicon.json +317 -0
- package/package.json +8 -3
- package/scripts/drain-check-local.mjs +118 -147
- package/scripts/drain-check.mysql.sql +22 -2
- package/scripts/drain-check.pg.sql +22 -2
- package/scripts/embed-minimal.mjs +183 -0
- package/wire-changes/server@7.148.0.json +1517 -0
- package/wire-changes/server@7.149.0.json +372 -0
- package/dist/http/memory-control-plane-corrupt-reply.d.ts +0 -25
- package/dist/http/memory-control-plane-corrupt-reply.js +0 -19
- package/dist/http/memory-layer-reply.d.ts +0 -30
- package/dist/http/memory-layer-reply.js +0 -24
- package/dist/lsp/e2b-bridge.d.ts +0 -57
- package/dist/lsp/e2b-bridge.js +0 -139
- package/dist/lsp/e2b-manager.d.ts +0 -93
- package/dist/lsp/e2b-manager.js +0 -178
- package/dist/lsp/lsp-frames.d.ts +0 -14
- package/dist/lsp/lsp-frames.js +0 -25
- package/dist/lsp/manager.d.ts +0 -129
- package/dist/lsp/manager.js +0 -127
- package/dist/lsp/types.d.ts +0 -12
- package/dist/lsp/types.js +0 -2
- package/dist/lsp/ws-transport.d.ts +0 -40
- package/dist/lsp/ws-transport.js +0 -210
- package/dist/plain-string-record.js +0 -70
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { parkedApprovalCard } from "../approval-content-kind.js";
|
|
2
2
|
import { createHash } from "node:crypto";
|
|
3
|
-
import { CHECKPOINT_FACET_SQL, CHECKPOINT_SWEEP_ORDER_SQL, CheckpointIndexRefusedError, judgeCheckpointIndexCells } from "../plugins/checkpoint-index-columns.js";
|
|
3
|
+
import { CHECKPOINT_FACET_SQL, CHECKPOINT_SWEEP_ORDER_SQL, CheckpointIndexRefusedError, checkpointSweepAfterSql, hostSessionOf, judgeCheckpointIndexCells } from "../plugins/checkpoint-index-columns.js";
|
|
4
4
|
import { CheckpointError, validatePendingSteer, appendPendingSteer, winnerFromOutcome, summarizeCheckpoint, checkpointRevOf, judgeCheckpointRow, CONTRACT_KIT_ENGINE_VERSION, ExecutionOutcomeConflictError, executionRecordDisposition, executionVerdict, } from "@sema-agent/core";
|
|
5
5
|
import { parkRowFacts, skillCardFacts } from "../approval-card.js";
|
|
6
6
|
import { assertJsonColumnWritable, createObjectColumnReader, decodeJsonColumn, decodeNullableJsonColumn, foldJsonColumn, isJsonColumnBodyProblem, jsonColumnText, jsonColumnTextSha256, readJsonArrayColumn, readJsonColumnTextSha256, readNonNullJsonValueColumn, StoreCorruptError, } from "../plugins/sql-json-column.js";
|
|
@@ -8,10 +8,10 @@ import { recordFailOpen } from "../observability/fail-open.js";
|
|
|
8
8
|
import { durableRowIdentity, withoutCheckpointToken } from "../checkpoint-identity.js";
|
|
9
9
|
import { mysqlDriver, pgDriver, dialectProtocolJsonEncoder } from "../plugins/sql-driver.js";
|
|
10
10
|
import { isDupKeyError, isMissingColumnError, rowTooLargeOrSelf, StoreRowTooLargeError } from "../plugins/sql-errors.js";
|
|
11
|
-
import {
|
|
11
|
+
import { probedMissingColumnRefusal } from "../plugins/schema-drift-sentence.js";
|
|
12
12
|
import { MANAGED_RETENTION, UNMANAGED_RETENTION } from "../plugins/retention-declaration.js";
|
|
13
13
|
import { approvalPayloadFingerprint } from "../plugins/approval-payload-fingerprint.js";
|
|
14
|
-
import { approvalDecisionOfWinner, boundedRuleOffers, boundedToolInput, candidateIdentityOf, DECIDED_REPLAY_SCAN_CAP, queueRowGateKind, TERMINAL_BACKSTOP_MS, TERMINAL_GRACE_MS, UnreadableCheckpointRowError, } from "../plugins/checkpoint-store-face.js";
|
|
14
|
+
import { approvalDecisionOfWinner, boundedRuleOffers, boundedToolInput, candidateIdentityOf, DECIDED_REPLAY_SCAN_CAP, DENY_SWEEP_PAGE_ROWS, isUnreadableSummaryForm, parkedLegTaskId, queueRowGateKind, queueTriageOrder, readRiskDescriptorBody, TERMINAL_BACKSTOP_MS, TERMINAL_GRACE_MS, UnreadableCheckpointRowError, } from "../plugins/checkpoint-store-face.js";
|
|
15
15
|
const CTX_REWRITE_PAGE = 500;
|
|
16
16
|
export function tokenFingerprint(token) {
|
|
17
17
|
return "sha256:" + createHash("sha256").update(token).digest("hex").slice(0, 12);
|
|
@@ -61,7 +61,14 @@ export const CHECKPOINT_ADDED_COLUMNS = [
|
|
|
61
61
|
column: "execution_at_ms",
|
|
62
62
|
breaksAt: "it is written in the same CAS as `execution_outcome` (the record and its stamp are one write group)",
|
|
63
63
|
},
|
|
64
|
+
{
|
|
65
|
+
column: "host_session_id",
|
|
66
|
+
breaksAt: "the park-mint write (put) stamps it, the one-time backfill M49 (which runs right after this check) fills it on the rows already parked, " +
|
|
67
|
+
"and every read that finds a run's card — cancel, steer, both park reapers, resume-context retention, the queue row's run — names it, " +
|
|
68
|
+
"so every durable suspend fails at first park and every cancel of a parked run errors",
|
|
69
|
+
},
|
|
64
70
|
];
|
|
71
|
+
const PENDING_ROW_AXIS_COLUMN = { card: "session_id", run: "host_session_id" };
|
|
65
72
|
export async function assertCheckpointColumnSchema(query, dialect) {
|
|
66
73
|
for (const { column, breaksAt } of CHECKPOINT_ADDED_COLUMNS) {
|
|
67
74
|
try {
|
|
@@ -70,30 +77,22 @@ export async function assertCheckpointColumnSchema(query, dialect) {
|
|
|
70
77
|
catch (err) {
|
|
71
78
|
if (!isMissingColumnError(err, dialect))
|
|
72
79
|
throw err;
|
|
73
|
-
throw
|
|
80
|
+
throw await probedMissingColumnRefusal(query, dialect, ["checkpoint"], `checkpoint is missing the column ${column} — refusing to start. ` +
|
|
74
81
|
`On this table ${breaksAt} — at runtime, after a healthy-looking boot. ` +
|
|
75
82
|
"The table holds IN-FLIGHT durable parks (suspended approvals/reviews awaiting a decision), so the way forward is an in-place " +
|
|
76
|
-
"ALTER that keeps them; `checkpoint_ctx`, run rows and every other persistent face are untouched
|
|
77
|
-
`Underlying probe error: ${err instanceof Error ? err.message : String(err)}\n\n` +
|
|
78
|
-
(await describeProbedTableDrift(query, dialect, ["checkpoint"])));
|
|
83
|
+
"ALTER that keeps them; `checkpoint_ctx`, run rows and every other persistent face are untouched.", err);
|
|
79
84
|
}
|
|
80
85
|
}
|
|
81
86
|
}
|
|
82
87
|
const readCheckpointBlobBody = createObjectColumnReader();
|
|
83
88
|
const readResumeOutcomeBody = createObjectColumnReader();
|
|
84
89
|
const readGateOutcomeBody = createObjectColumnReader();
|
|
85
|
-
const readRiskDescriptorBody = createObjectColumnReader();
|
|
86
90
|
function decodeCheckpointColumn(cell, where) {
|
|
87
91
|
return decodeJsonColumn(cell, readCheckpointBlobBody, `checkpoint.checkpoint ${where}`);
|
|
88
92
|
}
|
|
89
93
|
function verdictOfUnreadableBody(cell) {
|
|
90
94
|
return judgeCheckpointRow(cell);
|
|
91
95
|
}
|
|
92
|
-
const UNREADABLE_SUMMARY_MEMBERS = new Set(["token", "rowVerdict", "sessionId", "scope", "gateKind", "createdAt", "deadline"]);
|
|
93
|
-
function isUnreadableSummaryForm(summary) {
|
|
94
|
-
const names = UNREADABLE_SUMMARY_MEMBERS;
|
|
95
|
-
return summary.rowVerdict.kind !== "ok" && Object.keys(summary).every((member) => names.has(member));
|
|
96
|
-
}
|
|
97
96
|
function readCheckpointBodyOrRefuse(cell, where) {
|
|
98
97
|
try {
|
|
99
98
|
return refusing("a checkpoint nobody can resume", () => decodeCheckpointColumn(cell, where));
|
|
@@ -161,8 +160,8 @@ function readParkRowActionCell(cell) {
|
|
|
161
160
|
return undefined;
|
|
162
161
|
}
|
|
163
162
|
}
|
|
164
|
-
const PARK_ROW_PENDING_ACTION = {
|
|
165
|
-
const PARK_ROW_CHECKPOINT_ID = {
|
|
163
|
+
const PARK_ROW_PENDING_ACTION = { path: ["pendingAction"], as: "pending_action" };
|
|
164
|
+
const PARK_ROW_CHECKPOINT_ID = { path: ["checkpointId"], as: "checkpoint_id" };
|
|
166
165
|
const readCheckpointIdMemberBody = (body) => (typeof body === "string" ? { value: body } : { problem: "checkpointId is not a JSON string" });
|
|
167
166
|
function readCheckpointIdCell(cell) {
|
|
168
167
|
try {
|
|
@@ -174,6 +173,18 @@ function readCheckpointIdCell(cell) {
|
|
|
174
173
|
return null;
|
|
175
174
|
}
|
|
176
175
|
}
|
|
176
|
+
const PARK_ROW_RECORDED_TASK_ID = { path: ["state", "rowTaskId"], as: "row_task_id" };
|
|
177
|
+
const readRecordedTaskIdMemberBody = (body) => (typeof body === "string" ? { value: body } : { problem: "state.rowTaskId is not a JSON string" });
|
|
178
|
+
function readRecordedTaskIdCell(cell) {
|
|
179
|
+
try {
|
|
180
|
+
return decodeNullableJsonColumn(cell, readRecordedTaskIdMemberBody, "checkpoint.checkpoint $.state.rowTaskId (operator queue row)");
|
|
181
|
+
}
|
|
182
|
+
catch (e) {
|
|
183
|
+
if (!isJsonColumnBodyProblem(e))
|
|
184
|
+
throw e;
|
|
185
|
+
return undefined;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
177
188
|
const readPendingActionMemberBody = createObjectColumnReader();
|
|
178
189
|
function candidateIdentityOfColumn(cell, where) {
|
|
179
190
|
let cp;
|
|
@@ -238,13 +249,11 @@ export class SqlCheckpointStore {
|
|
|
238
249
|
durability = "durable";
|
|
239
250
|
fidelity = "json";
|
|
240
251
|
execution = { outcome: true };
|
|
241
|
-
claims;
|
|
242
252
|
storedRowMemo = new StoredRowProjectionMemo();
|
|
243
253
|
constructor(db, logger, opts = {}) {
|
|
244
254
|
this.db = db;
|
|
245
255
|
this.logger = logger;
|
|
246
256
|
this.retention = opts.retention ?? UNMANAGED_RETENTION;
|
|
247
|
-
this.claims = opts.claims;
|
|
248
257
|
}
|
|
249
258
|
q(mysql, pg) {
|
|
250
259
|
return this.db.dialect === "mysql" ? mysql : pg;
|
|
@@ -260,7 +269,7 @@ export class SqlCheckpointStore {
|
|
|
260
269
|
}
|
|
261
270
|
pendingRowQuery(select, sessionId, scope, binding) {
|
|
262
271
|
const params = [sessionId];
|
|
263
|
-
const where = [
|
|
272
|
+
const where = [`${PENDING_ROW_AXIS_COLUMN[binding?.axis ?? "card"]}=${this.ph(1)}`, "status='pending'"];
|
|
264
273
|
if (scope !== undefined) {
|
|
265
274
|
params.push(scope);
|
|
266
275
|
where.push(`scope=${this.ph(params.length)}`);
|
|
@@ -286,15 +295,16 @@ export class SqlCheckpointStore {
|
|
|
286
295
|
if (judged.kind !== "cells")
|
|
287
296
|
throw new CheckpointIndexRefusedError(cp.sessionId, judged);
|
|
288
297
|
const cells = judged.cells;
|
|
298
|
+
const hostSessionId = hostSessionOf(cp);
|
|
289
299
|
const pa = cp.pendingAction;
|
|
290
300
|
const toolInput = boundedToolInput(pa?.args);
|
|
291
301
|
const ruleOffers = boundedRuleOffers(pa?.ruleOffers);
|
|
292
302
|
const executionOutcome = cp.executionOutcome === undefined ? null : this.json(cp.executionOutcome, "execution outcome");
|
|
293
303
|
const executionAtMs = cp.executionOutcome === undefined ? null : (cp.executionAtMs ?? null);
|
|
294
304
|
try {
|
|
295
|
-
await this.db.query(this.q("INSERT INTO checkpoint (token, scope, session_id, version, status, tool_name, tool_call_id, tool_input, checkpoint, deadline, created_at_ms, terminal_at_ms, gate_kind, approval_card, bound_input_hash, risk_descriptor, rule_suggestions, has_bidi_controls, rev, reopen_reason, execution_outcome, execution_at_ms) " +
|
|
296
|
-
"VALUES (
|
|
297
|
-
"VALUES ($1,$2,$3,$4,$5,$6,$7,$8::jsonb,$9::jsonb,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21::jsonb,$22)"), [
|
|
305
|
+
await this.db.query(this.q("INSERT INTO checkpoint (token, scope, session_id, version, status, tool_name, tool_call_id, tool_input, checkpoint, deadline, created_at_ms, terminal_at_ms, gate_kind, approval_card, bound_input_hash, risk_descriptor, rule_suggestions, has_bidi_controls, rev, reopen_reason, execution_outcome, execution_at_ms, host_session_id) " +
|
|
306
|
+
"VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", "INSERT INTO checkpoint (token, scope, session_id, version, status, tool_name, tool_call_id, tool_input, checkpoint, deadline, created_at_ms, terminal_at_ms, gate_kind, approval_card, bound_input_hash, risk_descriptor, rule_suggestions, has_bidi_controls, rev, reopen_reason, execution_outcome, execution_at_ms, host_session_id) " +
|
|
307
|
+
"VALUES ($1,$2,$3,$4,$5,$6,$7,$8::jsonb,$9::jsonb,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21::jsonb,$22,$23)"), [
|
|
298
308
|
token,
|
|
299
309
|
cells.scope,
|
|
300
310
|
cells.session_id,
|
|
@@ -317,6 +327,7 @@ export class SqlCheckpointStore {
|
|
|
317
327
|
cp.reopenReason ?? null,
|
|
318
328
|
executionOutcome,
|
|
319
329
|
executionAtMs,
|
|
330
|
+
hostSessionId,
|
|
320
331
|
]);
|
|
321
332
|
}
|
|
322
333
|
catch (e) {
|
|
@@ -439,17 +450,20 @@ export class SqlCheckpointStore {
|
|
|
439
450
|
`WHERE status = 'pending' AND ((deadline IS NOT NULL AND deadline <= $2 AND COALESCE(${CHECKPOINT_FACET_SQL.pg}, '') <> 'A') OR (terminal_at_ms IS NOT NULL AND terminal_at_ms <= $3))`), [Date.now(), cutoff, cutoff]);
|
|
440
451
|
return res.affected;
|
|
441
452
|
}
|
|
442
|
-
async listExpiredApprovalGates(cutoff, limit =
|
|
443
|
-
const
|
|
444
|
-
|
|
453
|
+
async listExpiredApprovalGates(cutoff, limit = DENY_SWEEP_PAGE_ROWS, after) {
|
|
454
|
+
const head = "SELECT session_id, scope, deadline, token FROM checkpoint WHERE status = 'pending' AND deadline IS NOT NULL AND deadline <= ";
|
|
455
|
+
const { rows } = after === undefined
|
|
456
|
+
? await this.db.query(this.q(`${head}? AND ${CHECKPOINT_FACET_SQL.mysql} = 'A' ORDER BY ${CHECKPOINT_SWEEP_ORDER_SQL} LIMIT ?`, `${head}$1 AND ${CHECKPOINT_FACET_SQL.pg} = 'A' ORDER BY ${CHECKPOINT_SWEEP_ORDER_SQL} LIMIT $2`), [cutoff, limit])
|
|
457
|
+
: await this.db.query(this.q(`${head}? AND ${CHECKPOINT_FACET_SQL.mysql} = 'A' AND ${checkpointSweepAfterSql(() => "?")} ORDER BY ${CHECKPOINT_SWEEP_ORDER_SQL} LIMIT ?`, `${head}$1 AND ${CHECKPOINT_FACET_SQL.pg} = 'A' AND ${checkpointSweepAfterSql((i) => `$${i + 2}`)} ORDER BY ${CHECKPOINT_SWEEP_ORDER_SQL} LIMIT $5`), [cutoff, after.deadline, after.deadline, after.token, limit]);
|
|
458
|
+
return rows.map((r) => ({ sessionId: String(r.session_id), scope: String(r.scope), position: { deadline: Number(r.deadline), token: String(r.token) } }));
|
|
445
459
|
}
|
|
446
460
|
async listPending(scope) {
|
|
447
461
|
const d = this.db.dialect;
|
|
448
462
|
const base = `SELECT c.session_id, c.token, c.scope, c.tool_name, c.tool_call_id, ${jsonColumnText(d, "tool_input")}, c.bound_input_hash, ` +
|
|
449
463
|
`${jsonColumnText(d, "risk_descriptor")}, ${jsonColumnText(d, "rule_suggestions")}, c.has_bidi_controls, c.created_at_ms, c.deadline, c.gate_kind, c.approval_card, ta.task_id, ` +
|
|
450
|
-
`${jsonColumnText(d, "checkpoint", PARK_ROW_PENDING_ACTION)}, ${jsonColumnText(d, "checkpoint", PARK_ROW_CHECKPOINT_ID)}, ` +
|
|
464
|
+
`${jsonColumnText(d, "checkpoint", PARK_ROW_PENDING_ACTION)}, ${jsonColumnText(d, "checkpoint", PARK_ROW_CHECKPOINT_ID)}, ${jsonColumnText(d, "checkpoint", PARK_ROW_RECORDED_TASK_ID)}, ` +
|
|
451
465
|
`${jsonColumnTextSha256(d, "checkpoint", CHECKPOINT_SHA256_AS)} ` +
|
|
452
|
-
"FROM checkpoint c LEFT JOIN task_active ta ON ta.session_id = c.
|
|
466
|
+
"FROM checkpoint c LEFT JOIN task_active ta ON ta.session_id = c.host_session_id WHERE c.status='pending'";
|
|
453
467
|
const { rows } = scope
|
|
454
468
|
? await this.db.query(`${base}${this.q(" AND c.scope=?", " AND c.scope=$1")} ORDER BY c.created_at_ms ASC`, [scope])
|
|
455
469
|
: await this.db.query(`${base} ORDER BY c.created_at_ms ASC`);
|
|
@@ -472,7 +486,7 @@ export class SqlCheckpointStore {
|
|
|
472
486
|
...(toolCallId !== null ? { boundCallId: toolCallId } : {}),
|
|
473
487
|
...(boundInputHash !== null ? { boundInputHash } : {}),
|
|
474
488
|
gateKind,
|
|
475
|
-
taskId: r.task_id ?? null,
|
|
489
|
+
taskId: parkedLegTaskId(readRecordedTaskIdCell(r[PARK_ROW_RECORDED_TASK_ID.as]), r.task_id ?? null),
|
|
476
490
|
input: refusing("a tool input the operator would be approving unseen", () => decodeToolInputColumn(r.tool_input)) ?? null,
|
|
477
491
|
createdAt: Number(r.created_at_ms),
|
|
478
492
|
deadline: r.deadline == null ? null : Number(r.deadline),
|
|
@@ -489,7 +503,7 @@ export class SqlCheckpointStore {
|
|
|
489
503
|
const p = projections.get(e.token);
|
|
490
504
|
return p === undefined ? e.row : { ...e.row, ...p.skillCardFacts, rowVerdict: p.rowVerdict };
|
|
491
505
|
});
|
|
492
|
-
return out.sort(
|
|
506
|
+
return out.sort(queueTriageOrder);
|
|
493
507
|
}
|
|
494
508
|
async storedRowProjections(rows) {
|
|
495
509
|
const out = new Map();
|
|
@@ -676,42 +690,57 @@ export class SqlCheckpointStore {
|
|
|
676
690
|
return undefined;
|
|
677
691
|
return rows[0].scope ?? null;
|
|
678
692
|
}
|
|
679
|
-
async
|
|
693
|
+
async hostSessionOfCard(token) {
|
|
694
|
+
const { rows } = await this.db.query(this.q("SELECT host_session_id FROM checkpoint WHERE token = ?", "SELECT host_session_id FROM checkpoint WHERE token = $1"), [token]);
|
|
695
|
+
if (!rows[0])
|
|
696
|
+
return undefined;
|
|
697
|
+
const host = rows[0].host_session_id;
|
|
698
|
+
return typeof host === "string" && host !== "" ? host : null;
|
|
699
|
+
}
|
|
700
|
+
async putCtx(sessionId, ctx, claim) {
|
|
701
|
+
if (claim !== undefined)
|
|
702
|
+
return this.writeCtxWhileClaimed(sessionId, ctx, claim, "claim-fenced write", async (tx, text) => (await this.upsertCtx(tx, sessionId, text), "written"));
|
|
680
703
|
const text = this.json(ctx, "checkpoint ctx");
|
|
681
704
|
assertJsonColumnWritable(text, createObjectColumnReader(), `checkpoint_ctx.ctx for session ${JSON.stringify(sessionId)} (write leg)`);
|
|
682
705
|
try {
|
|
683
|
-
await this.
|
|
684
|
-
"ON DUPLICATE KEY UPDATE ctx = VALUES(ctx), updated_at_ms = VALUES(updated_at_ms)", "INSERT INTO checkpoint_ctx (session_id, ctx, updated_at_ms) VALUES ($1,$2::jsonb,$3) " +
|
|
685
|
-
"ON CONFLICT (session_id) DO UPDATE SET ctx = EXCLUDED.ctx, updated_at_ms = EXCLUDED.updated_at_ms"), [sessionId, text, Date.now()]);
|
|
706
|
+
await this.upsertCtx(this.db, sessionId, text);
|
|
686
707
|
}
|
|
687
708
|
catch (e) {
|
|
688
709
|
throw rowTooLargeOrSelf(this.db.dialect, e, `checkpoint_ctx.ctx for session ${JSON.stringify(sessionId)}`);
|
|
689
710
|
}
|
|
711
|
+
return "written";
|
|
712
|
+
}
|
|
713
|
+
async upsertCtx(exec, sessionId, text) {
|
|
714
|
+
await exec.query(this.q("INSERT INTO checkpoint_ctx (session_id, ctx, updated_at_ms) VALUES (?,?,?) " +
|
|
715
|
+
"ON DUPLICATE KEY UPDATE ctx = VALUES(ctx), updated_at_ms = VALUES(updated_at_ms)", "INSERT INTO checkpoint_ctx (session_id, ctx, updated_at_ms) VALUES ($1,$2::jsonb,$3) " +
|
|
716
|
+
"ON CONFLICT (session_id) DO UPDATE SET ctx = EXCLUDED.ctx, updated_at_ms = EXCLUDED.updated_at_ms"), [sessionId, text, Date.now()]);
|
|
690
717
|
}
|
|
691
718
|
async getCtx(sessionId) {
|
|
692
719
|
const { rows } = await this.db.query(this.q(`SELECT ${jsonColumnText("mysql", "ctx")} FROM checkpoint_ctx WHERE session_id=?`, `SELECT ${jsonColumnText("pg", "ctx")} FROM checkpoint_ctx WHERE session_id=$1`), [sessionId]);
|
|
693
720
|
return rows[0] ? refusing("a resume context nobody can read", () => decodeCtxColumn(rows[0].ctx, `for session ${JSON.stringify(sessionId)}`)) : null;
|
|
694
721
|
}
|
|
695
|
-
async rewriteCtxWhileClaimed(sessionId,
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
722
|
+
async rewriteCtxWhileClaimed(sessionId, ctx, claim) {
|
|
723
|
+
return this.writeCtxWhileClaimed(sessionId, ctx, claim, "claim-fenced rewrite", async (tx, text) => {
|
|
724
|
+
const row = await tx.query(this.q("SELECT session_id FROM checkpoint_ctx WHERE session_id = ? FOR UPDATE", "SELECT session_id FROM checkpoint_ctx WHERE session_id = $1 FOR UPDATE"), [sessionId]);
|
|
725
|
+
if (row.rows.length === 0)
|
|
726
|
+
return "context_absent";
|
|
727
|
+
await tx.query(this.q("UPDATE checkpoint_ctx SET ctx = ?, updated_at_ms = ? WHERE session_id = ?", "UPDATE checkpoint_ctx SET ctx = $1::jsonb, updated_at_ms = $2 WHERE session_id = $3"), [text, Date.now(), sessionId]);
|
|
728
|
+
return "written";
|
|
729
|
+
});
|
|
730
|
+
}
|
|
731
|
+
async writeCtxWhileClaimed(sessionId, ctx, claim, leg, write) {
|
|
732
|
+
const fence = claim.fence;
|
|
733
|
+
if (!("db" in fence) || fence.db.dialect !== this.db.dialect) {
|
|
734
|
+
throw new Error(`SqlCheckpointStore ${leg}: the claim fence must be the ${this.db.dialect} run store on this store's database (wiring defect: the run store and the checkpoint store come from one backend)`);
|
|
735
|
+
}
|
|
699
736
|
const text = this.json(ctx, "checkpoint ctx");
|
|
700
|
-
assertJsonColumnWritable(text, createObjectColumnReader(), `checkpoint_ctx.ctx for session ${JSON.stringify(sessionId)} (
|
|
737
|
+
assertJsonColumnWritable(text, createObjectColumnReader(), `checkpoint_ctx.ctx for session ${JSON.stringify(sessionId)} (${leg})`);
|
|
701
738
|
let fenced;
|
|
702
739
|
try {
|
|
703
|
-
fenced = await
|
|
704
|
-
if (!legHolds(run))
|
|
705
|
-
return "claim_released";
|
|
706
|
-
const row = await tx.query(this.q("SELECT session_id FROM checkpoint_ctx WHERE session_id = ? FOR UPDATE", "SELECT session_id FROM checkpoint_ctx WHERE session_id = $1 FOR UPDATE"), [sessionId]);
|
|
707
|
-
if (row.rows.length === 0)
|
|
708
|
-
return "context_absent";
|
|
709
|
-
await tx.query(this.q("UPDATE checkpoint_ctx SET ctx = ?, updated_at_ms = ? WHERE session_id = ?", "UPDATE checkpoint_ctx SET ctx = $1::jsonb, updated_at_ms = $2 WHERE session_id = $3"), [text, Date.now(), sessionId]);
|
|
710
|
-
return "written";
|
|
711
|
-
});
|
|
740
|
+
fenced = await fence.whileHoldingClaim(sessionId, claim.taskId, async (tx, run) => (claim.legHolds(run) ? write(tx, text) : "claim_released"));
|
|
712
741
|
}
|
|
713
742
|
catch (e) {
|
|
714
|
-
throw rowTooLargeOrSelf(this.db.dialect, e, `checkpoint_ctx.ctx for session ${JSON.stringify(sessionId)} (
|
|
743
|
+
throw rowTooLargeOrSelf(this.db.dialect, e, `checkpoint_ctx.ctx for session ${JSON.stringify(sessionId)} (${leg})`);
|
|
715
744
|
}
|
|
716
745
|
return fenced.held ? fenced.value : "claim_released";
|
|
717
746
|
}
|
|
@@ -760,9 +789,9 @@ export class SqlCheckpointStore {
|
|
|
760
789
|
}
|
|
761
790
|
async reapCtx(cutoff) {
|
|
762
791
|
const res = await this.db.query(this.q("DELETE FROM checkpoint_ctx WHERE updated_at_ms < ? " +
|
|
763
|
-
"AND session_id NOT IN (SELECT
|
|
792
|
+
"AND session_id NOT IN (SELECT host_session_id FROM checkpoint WHERE status='pending' AND host_session_id IS NOT NULL) " +
|
|
764
793
|
"AND session_id NOT IN (SELECT session_id FROM task_active)", "DELETE FROM checkpoint_ctx WHERE updated_at_ms < $1 " +
|
|
765
|
-
"AND session_id NOT IN (SELECT
|
|
794
|
+
"AND session_id NOT IN (SELECT host_session_id FROM checkpoint WHERE status='pending' AND host_session_id IS NOT NULL) " +
|
|
766
795
|
"AND session_id NOT IN (SELECT session_id FROM task_active)"), [cutoff]);
|
|
767
796
|
return res.affected;
|
|
768
797
|
}
|
|
@@ -208,7 +208,7 @@ export declare class PgFileHistoryStore extends SqlFileHistoryStore {
|
|
|
208
208
|
* ONLY a provable missing-column error gets the missing-column refusal — everything else
|
|
209
209
|
* (timeout / reset / permission / missing table) rethrows untouched: diagnosing a connection blip as a
|
|
210
210
|
* schema drift is more expensive than the defect this gate exists to stop. The refusal's ways out are the
|
|
211
|
-
* closed set of three shared with the whole-database check (`
|
|
211
|
+
* closed set of three shared with the whole-database check (`probedMissingColumnRefusal`); none of them
|
|
212
212
|
* is destructive. Honest cost statement: the history lives in these tables (per-file REWIND history,
|
|
213
213
|
* working-tree convenience state) — session transcripts and every other durable subsystem are untouched.
|
|
214
214
|
*/
|
|
@@ -3,7 +3,7 @@ import { captureFileBackupViaEnv, applyFileRestoreViaEnv, fileHistoryModeProvenD
|
|
|
3
3
|
import { BlobTooLargeError, SqlBlobIndex } from "./blob-index-sql.js";
|
|
4
4
|
import { mysqlDriver, pgDriver } from "../plugins/sql-driver.js";
|
|
5
5
|
import { isMissingColumnError, retryOnDeadlock } from "../plugins/sql-errors.js";
|
|
6
|
-
import {
|
|
6
|
+
import { probedMissingColumnRefusal } from "../plugins/schema-drift-sentence.js";
|
|
7
7
|
import { recordFailOpen } from "../observability/fail-open.js";
|
|
8
8
|
import { foldCaughtFailure } from "../file-history-disclosure.js";
|
|
9
9
|
export const FILE_HISTORY_BLOB_TABLE = "file_history_blob";
|
|
@@ -844,12 +844,10 @@ export async function assertFileHistorySchema(query, dialect) {
|
|
|
844
844
|
catch (err) {
|
|
845
845
|
if (!isMissingColumnError(err, dialect))
|
|
846
846
|
throw err;
|
|
847
|
-
throw
|
|
847
|
+
throw await probedMissingColumnRefusal(query, dialect, [table], `${table} is missing required columns — refusing to start. This build's per-file rewind history (S-15) ` +
|
|
848
848
|
`references every probed column unconditionally; a partial table would fail mid-write and could publish a ` +
|
|
849
849
|
`half-shaped history graph. The file_history_* tables hold the per-file REWIND history (working-tree convenience ` +
|
|
850
|
-
`state); session transcripts and all other durable subsystems are untouched, and an in-place ALTER keeps the history
|
|
851
|
-
`Underlying probe error: ${err instanceof Error ? err.message : String(err)}\n\n` +
|
|
852
|
-
(await describeProbedTableDrift(query, dialect, [table])));
|
|
850
|
+
`state); session transcripts and all other durable subsystems are untouched, and an in-place ALTER keeps the history.`, err);
|
|
853
851
|
}
|
|
854
852
|
}
|
|
855
853
|
}
|
|
@@ -16,10 +16,6 @@ export declare const MAILBOX_TOMBSTONE_TABLE = "mailbox_tombstone";
|
|
|
16
16
|
* 是**盒**事实(与 `next_seq` 同生命周期):`drop` 随盒删、`reap` 留着(它清掉的东西从没被收过)。新表而不是 `mailbox` 加列,理由同墓碑表(存量库零运维动作)。
|
|
17
17
|
* `digests` = 引擎 `mailboxReplayDigests` 的四面摘要 JSON(只读那一只函数,不另算)。 */
|
|
18
18
|
export declare const MAILBOX_CONSUMED_TABLE = "mailbox_consumed";
|
|
19
|
-
/**
|
|
20
|
-
* 身份键(`scope` / `handle` / lease `owner`)的 UTF-8 字节上界 = 键列宽(TiDB `VARBINARY(190)`;PG 列按字符,本判官在两方言上都按字节拒)。
|
|
21
|
-
*/
|
|
22
|
-
export declare const MAILBOX_KEY_MAX_UTF8_BYTES = 190;
|
|
23
19
|
/**
|
|
24
20
|
* 🔴 **「这只串能当收件箱的身份键吗」的唯一判官**(三只键列:`scope` / `handle` / lease `owner`;两方言同一只、同一句拒因)。一只串当得了键 ⇔
|
|
25
21
|
* ⓪ `scope` 非空(引擎 InMemory 同一句「without a scope」:没有箱址;handle / owner 空照引擎参照形放行);
|
|
@@ -46,6 +42,13 @@ export declare const MAILBOX_KEYED_TABLES: readonly ["mailbox", "mailbox_message
|
|
|
46
42
|
export type MailboxKeyedTable = (typeof MAILBOX_KEYED_TABLES)[number];
|
|
47
43
|
/** 按键删收件箱表族的一张表(两方言;参数 = [scope_key, handle])。 */
|
|
48
44
|
export declare function mailboxKeyDeleteSql(dialect: SqlDialect, table: MailboxKeyedTable): string;
|
|
45
|
+
/**
|
|
46
|
+
* **整盒删**(盒行先删 → 消息 → 消费记录 → 墓碑,{@link MAILBOX_KEYED_TABLES} 序;锁序与理由见店的 `drop`)发在调用方事务的连接上。
|
|
47
|
+
* 语句源唯一:店的 `drop` 与删净会话的执行体(`plugins/retention-deployment.ts` 的部署行,在执行体那一个事务里)同调。判官拒的键没有箱 ⇒ 零语句。
|
|
48
|
+
*/
|
|
49
|
+
export declare function dropMailboxBoxOn(exec: {
|
|
50
|
+
query(sql: string, params: unknown[]): Promise<unknown>;
|
|
51
|
+
}, dialect: SqlDialect, scope: string, handle: string): Promise<void>;
|
|
49
52
|
/** 店侧日志座(可选;boot 注入 `Logger`)。7.58.0 合并重扫 [medium]:坏行的 fail-closed 抛必须**响亮**——core 唯一的
|
|
50
53
|
* claimLease 调用方(peer-session-drain)吞掉该错,店不记这一笔就成了「静默永久卡箱」。抛之前记
|
|
51
54
|
* `mailbox_message_column_corrupt`(scope/handle/seq/column/code),运维按 seq 修行。
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { isUtf8 } from "node:buffer";
|
|
2
2
|
import { MAILBOX_CONSUMED_ID_WINDOW, MAILBOX_INVALID_PEER_META_CODE, MAILBOX_RECORD_ID_MAX_CHARS, MAILBOX_REPLAY_FACETS, MAILBOX_TOMBSTONED_RECIPIENT_CODE, MailboxStoreError, assertMailboxDecisionMove, judgeMailboxAppendById, mailboxReplayDigests, readMailboxAppend, readMailboxPeerMeta, readStoredMailboxDecision } from "@sema-agent/core";
|
|
3
3
|
import { pgHasUnstorable, pgSanitizeText, PgUnstorableError } from "../plugins/pg-safe-json.js";
|
|
4
|
-
import { isWellFormedUnicode } from "../principal-
|
|
4
|
+
import { PRINCIPAL_MAX_BYTES, isWellFormedUnicode } from "../principal-shape.js";
|
|
5
5
|
import { ensureIndexes } from "../plugins/ensure-index.js";
|
|
6
6
|
import { escapeLike } from "../plugins/sql-escape.js";
|
|
7
7
|
import { SqlJsonColumnError, decodeJsonColumn, decodeNullableJsonColumn, foldJsonColumn, isJsonColumnBodyProblem, jsonColumnText, readStringArrayColumn } from "../plugins/sql-json-column.js";
|
|
@@ -22,15 +22,14 @@ function rowToTombstone(r) {
|
|
|
22
22
|
const label = r.label === null || r.label === undefined ? undefined : bufToStr(r.label);
|
|
23
23
|
return { handle: bufToStr(r.handle), retiredAt: Number(r.retired_at_ms), ...(label !== undefined ? { label } : {}) };
|
|
24
24
|
}
|
|
25
|
-
export const MAILBOX_KEY_MAX_UTF8_BYTES = 190;
|
|
26
25
|
export function mailboxKeyProblem(what, v) {
|
|
27
26
|
if (what === "scope" && (v === undefined || v === ""))
|
|
28
27
|
return "MailboxStore: refusing a message without a scope (an empty scope addresses no box)";
|
|
29
28
|
const unaddressable = byteExactIdentityProblem(what, v);
|
|
30
29
|
if (unaddressable !== undefined)
|
|
31
30
|
return unaddressable;
|
|
32
|
-
if (Buffer.byteLength(v, "utf8") >
|
|
33
|
-
return `MailboxStore: ${what} exceeds the ${
|
|
31
|
+
if (Buffer.byteLength(v, "utf8") > PRINCIPAL_MAX_BYTES) {
|
|
32
|
+
return `MailboxStore: ${what} exceeds the ${PRINCIPAL_MAX_BYTES}-byte key column (refusing — a truncated key would desync from its byte-exact lookups)`;
|
|
34
33
|
}
|
|
35
34
|
return undefined;
|
|
36
35
|
}
|
|
@@ -122,6 +121,12 @@ export const MAILBOX_KEYED_TABLES = [MAILBOX_TABLE, MAILBOX_MSG_TABLE, MAILBOX_C
|
|
|
122
121
|
export function mailboxKeyDeleteSql(dialect, table) {
|
|
123
122
|
return dialect === "mysql" ? `DELETE FROM ${table} WHERE scope_key = ? AND handle = ?` : `DELETE FROM ${table} WHERE scope_key = $1 AND handle = $2`;
|
|
124
123
|
}
|
|
124
|
+
export async function dropMailboxBoxOn(exec, dialect, scope, handle) {
|
|
125
|
+
if (keyless(scope, handle))
|
|
126
|
+
return;
|
|
127
|
+
for (const table of MAILBOX_KEYED_TABLES)
|
|
128
|
+
await exec.query(mailboxKeyDeleteSql(dialect, table), [scope, handle]);
|
|
129
|
+
}
|
|
125
130
|
function bufToStr(v) {
|
|
126
131
|
return Buffer.isBuffer(v) ? v.toString("utf8") : String(v);
|
|
127
132
|
}
|
|
@@ -223,18 +228,18 @@ function decisionMoveVerdict(rows, expect) {
|
|
|
223
228
|
}
|
|
224
229
|
export async function ensureTiDBMailboxSchema(pool) {
|
|
225
230
|
await pool.query(`CREATE TABLE IF NOT EXISTS ${MAILBOX_TABLE} (
|
|
226
|
-
scope_key VARBINARY(
|
|
227
|
-
handle VARBINARY(
|
|
228
|
-
scope VARCHAR(
|
|
231
|
+
scope_key VARBINARY(${PRINCIPAL_MAX_BYTES}) NOT NULL,
|
|
232
|
+
handle VARBINARY(${PRINCIPAL_MAX_BYTES}) NOT NULL,
|
|
233
|
+
scope VARCHAR(${PRINCIPAL_MAX_BYTES}) NOT NULL,
|
|
229
234
|
next_seq BIGINT NOT NULL,
|
|
230
|
-
lease_owner VARBINARY(
|
|
235
|
+
lease_owner VARBINARY(${PRINCIPAL_MAX_BYTES}) NULL,
|
|
231
236
|
lease_expires_at_ms BIGINT NULL,
|
|
232
237
|
lease_max_seq BIGINT NULL,
|
|
233
238
|
PRIMARY KEY (scope_key, handle)
|
|
234
239
|
) COLLATE utf8mb4_bin`);
|
|
235
240
|
await pool.query(`CREATE TABLE IF NOT EXISTS ${MAILBOX_MSG_TABLE} (
|
|
236
|
-
scope_key VARBINARY(
|
|
237
|
-
handle VARBINARY(
|
|
241
|
+
scope_key VARBINARY(${PRINCIPAL_MAX_BYTES}) NOT NULL,
|
|
242
|
+
handle VARBINARY(${PRINCIPAL_MAX_BYTES}) NOT NULL,
|
|
238
243
|
seq BIGINT NOT NULL,
|
|
239
244
|
from_id VARBINARY(255) NULL,
|
|
240
245
|
content LONGTEXT NOT NULL,
|
|
@@ -259,16 +264,16 @@ export async function ensureTiDBMailboxSchema(pool) {
|
|
|
259
264
|
KEY idx_mbm_sent (scope_key, handle, sent_at_ms)
|
|
260
265
|
) COLLATE utf8mb4_bin`);
|
|
261
266
|
await pool.query(`CREATE TABLE IF NOT EXISTS ${MAILBOX_CONSUMED_TABLE} (
|
|
262
|
-
scope_key VARBINARY(
|
|
263
|
-
handle VARBINARY(
|
|
267
|
+
scope_key VARBINARY(${PRINCIPAL_MAX_BYTES}) NOT NULL,
|
|
268
|
+
handle VARBINARY(${PRINCIPAL_MAX_BYTES}) NOT NULL,
|
|
264
269
|
seq BIGINT NOT NULL,
|
|
265
270
|
record_id VARCHAR(${MAILBOX_RECORD_ID_MAX_CHARS}) NOT NULL,
|
|
266
271
|
digests TEXT NOT NULL,
|
|
267
272
|
PRIMARY KEY (scope_key, handle, seq)
|
|
268
273
|
) COLLATE utf8mb4_bin`);
|
|
269
274
|
await pool.query(`CREATE TABLE IF NOT EXISTS ${MAILBOX_TOMBSTONE_TABLE} (
|
|
270
|
-
scope_key VARBINARY(
|
|
271
|
-
handle VARBINARY(
|
|
275
|
+
scope_key VARBINARY(${PRINCIPAL_MAX_BYTES}) NOT NULL,
|
|
276
|
+
handle VARBINARY(${PRINCIPAL_MAX_BYTES}) NOT NULL,
|
|
272
277
|
retired_at_ms BIGINT NOT NULL,
|
|
273
278
|
-- 退役前的显示名(会话的删前 title)。纯显示面:目录据它铸 PeerSessionRecord.name;NULL = 当时无名可用。
|
|
274
279
|
label TEXT NULL,
|
|
@@ -281,18 +286,18 @@ export const MAILBOX_INDEXES = [
|
|
|
281
286
|
];
|
|
282
287
|
export async function ensurePgMailboxSchema(q) {
|
|
283
288
|
await q(`CREATE TABLE IF NOT EXISTS ${MAILBOX_TABLE} (
|
|
284
|
-
scope_key VARCHAR(
|
|
285
|
-
handle VARCHAR(
|
|
286
|
-
scope VARCHAR(
|
|
289
|
+
scope_key VARCHAR(${PRINCIPAL_MAX_BYTES}) COLLATE "C" NOT NULL,
|
|
290
|
+
handle VARCHAR(${PRINCIPAL_MAX_BYTES}) COLLATE "C" NOT NULL,
|
|
291
|
+
scope VARCHAR(${PRINCIPAL_MAX_BYTES}) COLLATE "C" NOT NULL,
|
|
287
292
|
next_seq BIGINT NOT NULL,
|
|
288
|
-
lease_owner VARCHAR(
|
|
293
|
+
lease_owner VARCHAR(${PRINCIPAL_MAX_BYTES}) COLLATE "C",
|
|
289
294
|
lease_expires_at_ms BIGINT,
|
|
290
295
|
lease_max_seq BIGINT,
|
|
291
296
|
PRIMARY KEY (scope_key, handle)
|
|
292
297
|
)`);
|
|
293
298
|
await q(`CREATE TABLE IF NOT EXISTS ${MAILBOX_MSG_TABLE} (
|
|
294
|
-
scope_key VARCHAR(
|
|
295
|
-
handle VARCHAR(
|
|
299
|
+
scope_key VARCHAR(${PRINCIPAL_MAX_BYTES}) COLLATE "C" NOT NULL,
|
|
300
|
+
handle VARCHAR(${PRINCIPAL_MAX_BYTES}) COLLATE "C" NOT NULL,
|
|
296
301
|
seq BIGINT NOT NULL,
|
|
297
302
|
from_id VARCHAR(255) COLLATE "C",
|
|
298
303
|
content TEXT COLLATE "C" NOT NULL,
|
|
@@ -304,16 +309,16 @@ export async function ensurePgMailboxSchema(q) {
|
|
|
304
309
|
PRIMARY KEY (scope_key, handle, seq)
|
|
305
310
|
)`);
|
|
306
311
|
await q(`CREATE TABLE IF NOT EXISTS ${MAILBOX_CONSUMED_TABLE} (
|
|
307
|
-
scope_key VARCHAR(
|
|
308
|
-
handle VARCHAR(
|
|
312
|
+
scope_key VARCHAR(${PRINCIPAL_MAX_BYTES}) COLLATE "C" NOT NULL,
|
|
313
|
+
handle VARCHAR(${PRINCIPAL_MAX_BYTES}) COLLATE "C" NOT NULL,
|
|
309
314
|
seq BIGINT NOT NULL,
|
|
310
315
|
record_id VARCHAR(${MAILBOX_RECORD_ID_MAX_CHARS}) COLLATE "C" NOT NULL,
|
|
311
316
|
digests TEXT COLLATE "C" NOT NULL, -- TiDB twin 同注:已收窗(core 7.61.0),四面摘要 JSON
|
|
312
317
|
PRIMARY KEY (scope_key, handle, seq)
|
|
313
318
|
)`);
|
|
314
319
|
await q(`CREATE TABLE IF NOT EXISTS ${MAILBOX_TOMBSTONE_TABLE} (
|
|
315
|
-
scope_key VARCHAR(
|
|
316
|
-
handle VARCHAR(
|
|
320
|
+
scope_key VARCHAR(${PRINCIPAL_MAX_BYTES}) COLLATE "C" NOT NULL,
|
|
321
|
+
handle VARCHAR(${PRINCIPAL_MAX_BYTES}) COLLATE "C" NOT NULL,
|
|
317
322
|
retired_at_ms BIGINT NOT NULL,
|
|
318
323
|
label TEXT COLLATE "C", -- TiDB twin 同注:纯显示面,NULL = 无名可用
|
|
319
324
|
PRIMARY KEY (scope_key, handle)
|
|
@@ -441,10 +446,7 @@ export class TiDBMailboxStore {
|
|
|
441
446
|
async drop(scope, handle) {
|
|
442
447
|
if (keyless(scope, handle))
|
|
443
448
|
return;
|
|
444
|
-
await this.tx(
|
|
445
|
-
for (const table of MAILBOX_KEYED_TABLES)
|
|
446
|
-
await c.query(mailboxKeyDeleteSql("mysql", table), [scope, handle]);
|
|
447
|
-
});
|
|
449
|
+
await this.tx((c) => dropMailboxBoxOn(c, "mysql", scope, handle));
|
|
448
450
|
}
|
|
449
451
|
async reap(scope, now, opts) {
|
|
450
452
|
if (opts?.maxAgeMs === undefined || mailboxKeyProblem("scope", scope) !== undefined)
|
|
@@ -617,10 +619,7 @@ export class PgMailboxStore {
|
|
|
617
619
|
async drop(scope, handle) {
|
|
618
620
|
if (keyless(scope, handle))
|
|
619
621
|
return;
|
|
620
|
-
await this.tx(
|
|
621
|
-
for (const table of MAILBOX_KEYED_TABLES)
|
|
622
|
-
await c.query(mailboxKeyDeleteSql("pg", table), [scope, handle]);
|
|
623
|
-
});
|
|
622
|
+
await this.tx((c) => dropMailboxBoxOn(c, "pg", scope, handle));
|
|
624
623
|
}
|
|
625
624
|
async reap(scope, now, opts) {
|
|
626
625
|
if (opts?.maxAgeMs === undefined || mailboxKeyProblem("scope", scope) !== undefined)
|
|
@@ -4,8 +4,10 @@ import { WindowedSessionStorage } from "./windowed-session-storage.js";
|
|
|
4
4
|
import { type PlacementAcquireOpts } from "../plugins/session-placement.js";
|
|
5
5
|
import { type StagingHandle } from "../session-sync-kernel.js";
|
|
6
6
|
import type { RetentionDeclaration } from "@sema-agent/core";
|
|
7
|
+
import { type RegisterReceipt, type WithdrawOutcome } from "../session-incarnation.js";
|
|
7
8
|
import type { SessionWriteHooks } from "./session-write-hooks.js";
|
|
8
9
|
import { type IndexSpec } from "../plugins/ensure-index.js";
|
|
10
|
+
import { type SessionDeleteCondition } from "./tidb-session-store.js";
|
|
9
11
|
import { type ForkPlacement, type ForkTarget, type ForkToOutcome } from "../plugins/session-fork.js";
|
|
10
12
|
/**
|
|
11
13
|
* PG-dialect DDL for the L1 session log, translated from tidb-pool.ts SCHEMA_STATEMENTS:
|
|
@@ -31,7 +33,7 @@ export declare class PgSessionStorage extends WindowedSessionStorage {
|
|
|
31
33
|
private readonly floorSeq;
|
|
32
34
|
constructor(pool: Pool, sessionId: string, metadata: SessionMetadata, entries: SessionTreeEntry[], leafId: string | null, floorEntryId?: string | null, floorSeq?: number);
|
|
33
35
|
/** @see TiDBSessionStorage.getEpochAnchor — [ref] S3 [ref] pull seam, PG dialect twin: the same reading
|
|
34
|
-
* ({@link scanEpochAnchor}, the record as stored), this
|
|
36
|
+
* ({@link scanEpochAnchor}: the floor's parent chain, the record as stored), the same page in this dialect's spelling. */
|
|
35
37
|
getEpochAnchor(): Promise<unknown>;
|
|
36
38
|
/** @see TiDBSessionStorage.wake — F3 bounded `[floor..leaf]` rebuild; null if the session does not exist. */
|
|
37
39
|
static wake(pool: Pool, sessionId: string): Promise<PgSessionStorage | null>;
|
|
@@ -75,6 +77,10 @@ export declare class PgSessionStore implements SessionStore {
|
|
|
75
77
|
private load;
|
|
76
78
|
/** Idempotently create a session_meta row with an owner (core `SessionStore.register`). Existing owner is never overwritten. */
|
|
77
79
|
register(sessionId: string, owner: string | null): Promise<void>;
|
|
80
|
+
/** 出生回执面(TiDB 孪生 {@link TiDBSessionStore.registerWithReceipt} 同义:候选 = 这一次 INSERT 入参里铸的化身)。 */
|
|
81
|
+
registerWithReceipt(sessionId: string, owner: string | null): Promise<RegisterReceipt>;
|
|
82
|
+
/** 条件删除(TiDB 孪生 {@link TiDBSessionStore.deleteSessionIf} 同义)。 */
|
|
83
|
+
deleteSessionIf(sessionId: string, cond: SessionDeleteCondition): Promise<WithdrawOutcome>;
|
|
78
84
|
/** acquire 的建行(唯一一处;placed 会话的属主 = `placement.owner` 原样,core 7.62.0 [ref] 盒义务 7 —— TiDB 孪生同名方法同注)。 */
|
|
79
85
|
private createOnAcquire;
|
|
80
86
|
/** The one session_meta INSERT. Existing owner is never overwritten.
|
|
@@ -151,10 +157,6 @@ export declare class PgSessionStore implements SessionStore {
|
|
|
151
157
|
* under a `%#stg-%` id with NO session_meta whose oldest row is older than the grace window (in-flight stays fresh).
|
|
152
158
|
* Returns the affected row count. Driven by main.ts's reaper. */
|
|
153
159
|
sweepStagingSessions(): Promise<number>;
|
|
154
|
-
/** @see TiDBSessionStore.deleteSession — purge session_meta + session_event; idempotent (false if absent).
|
|
155
|
-
* Owner-guarded on session_meta.owner (`IS NOT DISTINCT FROM` = the PG `<=>`); the event purge is gated on the
|
|
156
|
-
* owner-matched meta delete (session_event has no owner column). A live run claim read inside the txn ⇒ `SessionActiveRunError`. */
|
|
157
|
-
deleteSession(sessionId: string, owner: string | null): Promise<boolean>;
|
|
158
160
|
get size(): number;
|
|
159
161
|
dispose(): void;
|
|
160
162
|
}
|