@sema-agent/server 7.146.0 → 7.148.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MIGRATION.md +1423 -24
- package/README.md +21 -8
- package/README.zh-CN.md +15 -9
- package/USAGE.md +537 -216
- package/deploy/facts/lanes.json +7 -0
- package/deploy/sema-up/README.md +18 -7
- package/deploy/sema-up/chart/templates/NOTES.txt +1 -1
- package/deploy/sema-up/chart/templates/_helpers.tpl +42 -4
- package/deploy/sema-up/chart/templates/server-v4pro.yaml +5 -4
- package/deploy/sema-up/chart/templates/server.yaml +5 -4
- package/deploy/sema-up/chart/values.yaml +4 -3
- package/deploy/sema-up/cluster-up.sh +75 -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/flagshape.sh +4 -0
- 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/lanes.json +2 -5
- 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 +26 -48
- 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 +18 -5
- package/deploy/sema-up/stack/sema-stack-cluster.yaml +25 -3
- package/dist/adoption/plan.d.ts +24 -0
- package/dist/adoption/plan.js +53 -1
- package/dist/adoption/runner.d.ts +10 -1
- package/dist/adoption/runner.js +36 -16
- package/dist/adoption/wire.d.ts +3 -3
- package/dist/approval-card.d.ts +32 -34
- package/dist/approval-gate-currency.js +3 -2
- package/dist/approval-reconciler.d.ts +4 -13
- package/dist/approval-reconciler.js +2 -2
- package/dist/approval.d.ts +16 -14
- package/dist/approval.js +3 -3
- package/dist/audit.d.ts +10 -3
- package/dist/audit.js +17 -9
- package/dist/auth-bridge.d.ts +0 -14
- package/dist/auth-bridge.js +0 -7
- package/dist/auto-mode-face.d.ts +10 -7
- package/dist/auto-mode-face.js +7 -4
- package/dist/background-agent-name.d.ts +19 -1
- package/dist/background-agent-name.js +12 -2
- package/dist/background-session-reap.d.ts +1 -1
- package/dist/bake-runner/main.js +9 -6
- package/dist/bench/s1/arms.js +6 -5
- package/dist/bench/s1/live-deps.js +8 -3
- 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/crash-last.js +2 -1
- package/dist/boot/deployment-mods.d.ts +1 -1
- package/dist/boot/device-lane.js +5 -5
- package/dist/boot/engine-lease.d.ts +12 -11
- package/dist/boot/execution-env.d.ts +19 -8
- package/dist/boot/execution-env.js +80 -62
- package/dist/boot/execution-lane.d.ts +37 -9
- package/dist/boot/execution-lane.js +74 -20
- package/dist/boot/exit-boundary.d.ts +3 -3
- package/dist/boot/exit-boundary.js +6 -5
- package/dist/boot/exit-last.js +2 -1
- package/dist/boot/fatal-exit.d.ts +3 -5
- package/dist/boot/fatal-exit.js +2 -2
- package/dist/boot/governance-seams.d.ts +2 -2
- package/dist/boot/leader.d.ts +15 -0
- package/dist/boot/leader.js +18 -16
- package/dist/boot/memory-boundary.d.ts +11 -11
- package/dist/boot/memory-boundary.js +3 -3
- package/dist/boot/memory-consolidation.d.ts +50 -53
- package/dist/boot/memory-consolidation.js +11 -18
- package/dist/boot/org-memory.js +4 -3
- package/dist/boot/parked-revive-gate.d.ts +1 -1
- package/dist/boot/parked-revive-gate.js +3 -3
- package/dist/boot/reapers.d.ts +4 -3
- package/dist/boot/reapers.js +20 -17
- package/dist/boot/resolve-spec.d.ts +5 -3
- package/dist/boot/resolve-spec.js +133 -165
- package/dist/boot/retention-lane.d.ts +7 -45
- package/dist/boot/retention-lane.js +2 -2
- package/dist/boot/runner-deps.d.ts +28 -7
- package/dist/boot/runner-deps.js +11 -4
- package/dist/boot/runtime-caps.d.ts +2 -2
- package/dist/boot/runtime-caps.js +16 -2
- package/dist/boot/session-faces.d.ts +17 -7
- package/dist/boot/session-faces.js +122 -96
- package/dist/boot/shutdown.d.ts +5 -4
- package/dist/boot/shutdown.js +6 -4
- package/dist/boot/stage-01-config.d.ts +1 -1
- package/dist/boot/stage-01-config.js +14 -2
- package/dist/boot/stage-02-web-admin-pull.d.ts +2 -1
- package/dist/boot/stage-02-web-admin-pull.js +15 -8
- package/dist/boot/stage-03-store-backend.d.ts +4 -1
- package/dist/boot/stage-03-store-backend.js +4 -3
- package/dist/boot/stage-04-stores.d.ts +3 -1
- package/dist/boot/stage-04-stores.js +2 -2
- package/dist/boot/stage-05-execution-env.d.ts +9 -5
- package/dist/boot/stage-05-execution-env.js +5 -5
- package/dist/boot/stage-06-runners.d.ts +13 -15
- package/dist/boot/stage-06-runners.js +24 -18
- package/dist/boot/stage-07-capability-layer.d.ts +14 -11
- package/dist/boot/stage-07-capability-layer.js +9 -12
- package/dist/boot/stage-08-reapers.d.ts +14 -11
- package/dist/boot/stage-08-reapers.js +3 -3
- package/dist/boot/stage-09-leader.d.ts +16 -18
- package/dist/boot/stage-09-leader.js +12 -4
- package/dist/boot/stage-10-http-server.d.ts +16 -18
- package/dist/boot/stage-10-http-server.js +9 -5
- package/dist/boot/store-evidence.d.ts +20 -0
- package/dist/boot/store-evidence.js +13 -0
- package/dist/boot/stores.d.ts +12 -0
- package/dist/boot/stores.js +39 -17
- 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 +58 -38
- 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 +9 -1
- package/dist/capabilities/center-plugins.js +37 -11
- package/dist/capabilities/center-wiring.js +1 -1
- package/dist/capabilities/composite-members.d.ts +3 -2
- package/dist/capabilities/composite-members.js +3 -2
- package/dist/capabilities/execution-lane.d.ts +7 -7
- package/dist/capabilities/execution-lane.js +2 -2
- package/dist/capabilities/hands-lane.d.ts +1 -1
- package/dist/capabilities/repo-tools.d.ts +2 -0
- package/dist/capabilities/repo-tools.js +14 -12
- package/dist/capabilities/scenarios.d.ts +38 -33
- package/dist/capabilities/scenarios.js +24 -25
- package/dist/capabilities/settings-contract.d.ts +29 -0
- package/dist/capabilities/settings-contract.js +14 -0
- package/dist/capabilities/skills.d.ts +6 -6
- package/dist/capabilities/tool-defer.d.ts +1 -1
- package/dist/capability-facts.d.ts +69 -4
- package/dist/capability-facts.js +77 -5
- package/dist/card-void.d.ts +4 -4
- package/dist/card-void.js +1 -1
- package/dist/center-credential-renewer.d.ts +6 -2
- package/dist/center-credential-renewer.js +10 -5
- package/dist/config-catalog.d.ts +16 -1
- package/dist/config-catalog.js +68 -61
- package/dist/config-dir-trust.d.ts +37 -4
- package/dist/config-dir-trust.js +88 -44
- package/dist/config-invariants.d.ts +58 -4
- package/dist/config-invariants.js +104 -23
- package/dist/config-lkg.d.ts +24 -2
- package/dist/config-lkg.js +22 -9
- package/dist/config-provider.d.ts +9 -9
- package/dist/config-provider.js +25 -108
- package/dist/config-pull-failure.d.ts +50 -0
- package/dist/config-pull-failure.js +48 -0
- package/dist/config-types.d.ts +215 -202
- package/dist/config.d.ts +69 -14
- package/dist/config.js +188 -96
- package/dist/degenerate-instrument.js +1 -1
- package/dist/delegated-session-owner.d.ts +1 -1
- package/dist/deleted-session-ids.d.ts +3 -2
- package/dist/deploy-facts.js +3 -2
- package/dist/deployment-governance.d.ts +3 -3
- package/dist/deployment-shape.d.ts +51 -16
- package/dist/deployment-shape.js +31 -6
- 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.d.ts +7 -5
- package/dist/env-facts.js +12 -7
- package/dist/env-witness.d.ts +7 -0
- package/dist/env-witness.js +16 -0
- package/dist/execution-config-root.d.ts +5 -5
- package/dist/execution-config-root.js +5 -5
- package/dist/execution-env-purpose.d.ts +14 -0
- package/dist/execution-env-purpose.js +29 -0
- package/dist/execution-lane-caps.d.ts +53 -103
- package/dist/execution-lane-caps.js +51 -83
- package/dist/execution-placement.d.ts +65 -9
- package/dist/execution-placement.js +58 -0
- 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.d.ts +2 -2
- package/dist/file-history-disclosure.js +1 -0
- package/dist/fleet/drain-entry.d.ts +17 -10
- package/dist/fleet/drain-entry.js +1 -1
- 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 +6 -7
- 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 +42 -0
- package/dist/history-anchor.js +34 -0
- 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 +1 -4
- package/dist/hooks/command-spawn.js +0 -11
- package/dist/hooks/hook-llm.d.ts +5 -1
- package/dist/hooks/hook-llm.js +24 -15
- package/dist/hooks/hook-runner.d.ts +119 -65
- package/dist/hooks/hook-runner.js +415 -217
- package/dist/host-lsp-manager.d.ts +22 -8
- package/dist/host-lsp-manager.js +4 -1
- package/dist/http/active-run-conflict.d.ts +2 -43
- package/dist/http/active-run-conflict.js +3 -7
- package/dist/http/admission.d.ts +4 -18
- package/dist/http/admission.js +75 -78
- package/dist/http/approval-sweeps.d.ts +5 -8
- package/dist/http/approval-sweeps.js +55 -30
- package/dist/http/caller-trust.d.ts +8 -10
- package/dist/http/caller-trust.js +1 -2
- package/dist/http/checkpoint-ctx.d.ts +17 -0
- package/dist/http/checkpoint-ctx.js +6 -0
- package/dist/http/claim-heartbeat.d.ts +49 -0
- package/dist/http/claim-heartbeat.js +46 -0
- package/dist/http/claim-latency.d.ts +10 -0
- package/dist/http/claim-latency.js +12 -0
- package/dist/http/claimed-run.d.ts +4 -3
- package/dist/http/dispatch.d.ts +8 -1
- package/dist/http/dispatch.js +77 -31
- package/dist/http/durable-run-leg.d.ts +3 -3
- package/dist/http/durable-run-leg.js +18 -12
- package/dist/http/execution-context.d.ts +18 -42
- package/dist/http/execution-context.js +11 -5
- package/dist/http/health-reader.d.ts +36 -0
- package/dist/http/health-reader.js +21 -0
- package/dist/http/health-self-report.d.ts +9 -9
- package/dist/http/health-self-report.js +4 -4
- package/dist/http/idempotency.d.ts +9 -5
- package/dist/http/idempotency.js +4 -4
- package/dist/http/memory-compliance-failure-reply.d.ts +15 -16
- package/dist/http/memory-compliance-failure-reply.js +7 -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 +3 -3
- package/dist/http/memory-store-refusal-reply.js +6 -0
- package/dist/http/owner-access.d.ts +391 -56
- package/dist/http/owner-access.js +372 -33
- package/dist/http/principal-gate.d.ts +26 -94
- package/dist/http/principal-gate.js +24 -81
- package/dist/http/refusal-body.d.ts +35 -2
- package/dist/http/refusal-body.js +34 -0
- package/dist/http/request-guards.d.ts +10 -14
- package/dist/http/request-guards.js +34 -68
- package/dist/http/resume-composition.d.ts +37 -0
- package/dist/http/resume-composition.js +18 -0
- package/dist/http/resume-ctx-read.d.ts +35 -12
- package/dist/http/resume-ctx-read.js +25 -6
- package/dist/http/resume-legs.d.ts +24 -24
- package/dist/http/resume-legs.js +260 -171
- package/dist/http/retired-skill-manifest.d.ts +1 -1
- package/dist/http/rewind-files-reply.d.ts +34 -0
- package/dist/http/rewind-files-reply.js +36 -0
- package/dist/http/route-ctx.d.ts +56 -47
- package/dist/http/route-table.js +2 -0
- package/dist/http/routes/a2a-serve.d.ts +43 -5
- package/dist/http/routes/a2a-serve.js +58 -37
- package/dist/http/routes/admin-config-refresh.js +2 -2
- package/dist/http/routes/admin-drain.js +2 -2
- package/dist/http/routes/admin-memory-optout.js +4 -3
- package/dist/http/routes/adoption.d.ts +3 -0
- package/dist/http/routes/adoption.js +17 -10
- package/dist/http/routes/agents-roster.js +13 -7
- package/dist/http/routes/approvals-assistant.js +73 -88
- 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 +23 -20
- package/dist/http/routes/config-catalog.js +2 -2
- package/dist/http/routes/devices.d.ts +3 -3
- package/dist/http/routes/devices.js +5 -5
- package/dist/http/routes/diagnostics.d.ts +27 -3
- package/dist/http/routes/diagnostics.js +27 -21
- package/dist/http/routes/engine.js +2 -2
- package/dist/http/routes/fleet.js +5 -3
- package/dist/http/routes/images.js +10 -6
- package/dist/http/routes/leader.d.ts +7 -2
- package/dist/http/routes/leader.js +12 -3
- package/dist/http/routes/mcp-reconnect.d.ts +1 -1
- package/dist/http/routes/mcp-reconnect.js +7 -15
- package/dist/http/routes/memory-bundle.js +4 -7
- package/dist/http/routes/memory-compliance.js +4 -4
- package/dist/http/routes/memory-consolidation.js +6 -9
- package/dist/http/routes/memory-origin.d.ts +3 -1
- 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 +12 -20
- package/dist/http/routes/observability.js +3 -3
- package/dist/http/routes/principal-inbox.d.ts +1 -1
- package/dist/http/routes/principal-inbox.js +2 -2
- package/dist/http/routes/projects.d.ts +70 -0
- package/dist/http/routes/projects.js +87 -0
- package/dist/http/routes/retention-ops.js +6 -9
- package/dist/http/routes/rules.js +50 -7
- 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 +148 -233
- package/dist/http/routes/session-memory-sync.d.ts +2 -2
- package/dist/http/routes/session-memory-sync.js +7 -13
- package/dist/http/routes/session-sync.d.ts +4 -2
- package/dist/http/routes/session-sync.js +48 -30
- package/dist/http/routes/sessions-list.d.ts +3 -3
- package/dist/http/routes/sessions-list.js +9 -9
- package/dist/http/routes/sessions.d.ts +7 -1
- package/dist/http/routes/sessions.js +177 -112
- package/dist/http/routes/shared-memory.js +6 -6
- package/dist/http/routes/side-query.js +2 -2
- package/dist/http/routes/tasks.js +144 -122
- 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 +63 -50
- package/dist/http/server.js +52 -16
- 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 +17 -3
- package/dist/http/stored-body-replay.js +11 -2
- package/dist/http/submit-ctx.d.ts +16 -8
- package/dist/http/submit-ctx.js +6 -2
- package/dist/http/submit-replay.d.ts +19 -6
- package/dist/http/submit-replay.js +18 -6
- package/dist/http/sync-submit-body.d.ts +3 -4
- package/dist/http/sync-submit-body.js +4 -5
- package/dist/http/wire-types.d.ts +23 -13
- package/dist/identity-source.d.ts +36 -5
- package/dist/identity-source.js +27 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.js +2 -1
- package/dist/instruction-source-notice.d.ts +1 -1
- package/dist/key-resolver.d.ts +32 -0
- package/dist/key-resolver.js +23 -9
- package/dist/leader/diffup.js +2 -1
- package/dist/leader/endpoint.d.ts +26 -5
- package/dist/leader/endpoint.js +154 -14
- package/dist/leader/fanout.d.ts +3 -0
- package/dist/leader/fanout.js +78 -63
- package/dist/leader/leader.d.ts +16 -0
- package/dist/leader/leader.js +43 -3
- package/dist/leader/merge.d.ts +9 -1
- package/dist/leader/merge.js +16 -1
- package/dist/leader/repair-wire.js +1 -1
- package/dist/leader/wire.d.ts +36 -3
- package/dist/leader/wire.js +59 -18
- package/dist/lsp-evict.d.ts +6 -4
- package/dist/lsp-evict.js +2 -3
- package/dist/memory-embedder-reembed.d.ts +38 -0
- package/dist/memory-embedder-reembed.js +20 -0
- package/dist/memory-incident-sink.d.ts +0 -28
- package/dist/memory-incident-sink.js +5 -0
- package/dist/memory-operator-faces.d.ts +5 -4
- package/dist/memory-operator-faces.js +1 -1
- package/dist/memory-scope.d.ts +31 -4
- package/dist/memory-scope.js +65 -16
- package/dist/memory-store-refusal.d.ts +20 -4
- package/dist/memory-store-refusal.js +1 -1
- package/dist/memory-sync-client.d.ts +5 -2
- package/dist/memory-sync-client.js +19 -14
- package/dist/memory-sync.js +1 -1
- package/dist/model-compat.d.ts +51 -28
- package/dist/model-compat.js +55 -23
- package/dist/model-context-window.d.ts +18 -0
- package/dist/model-context-window.js +2 -0
- package/dist/model-entry-headers.d.ts +46 -4
- package/dist/model-entry-headers.js +2 -2
- package/dist/model-entry-refusal.d.ts +46 -17
- package/dist/model-entry-refusal.js +47 -27
- package/dist/model-plane-face.d.ts +19 -11
- package/dist/model-plane-face.js +9 -1
- package/dist/model-plane-probe.d.ts +2 -0
- package/dist/model-plane-probe.js +17 -0
- package/dist/model-provider.d.ts +3 -3
- package/dist/model-route-endpoint.d.ts +9 -5
- package/dist/model-route-endpoint.js +29 -7
- package/dist/model-select.d.ts +16 -0
- package/dist/model-select.js +4 -0
- package/dist/mountinfo.d.ts +37 -0
- package/dist/mountinfo.js +47 -0
- package/dist/namespaced-rule-name.d.ts +28 -2
- package/dist/namespaced-rule-name.js +10 -1
- 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 +75 -47
- package/dist/observability/fail-open.js +77 -47
- package/dist/observability/logger.d.ts +22 -1
- package/dist/observability/logger.js +89 -12
- package/dist/observability/metrics.d.ts +2 -0
- package/dist/observability/metrics.js +5 -4
- package/dist/observability/otel-exporter.js +2 -1
- package/dist/observability/principal-context.d.ts +14 -7
- package/dist/observability/principal-context.js +8 -3
- package/dist/observability/run-terminal.d.ts +7 -1
- package/dist/observability/run-terminal.js +5 -2
- package/dist/observability/secret-env-scrub.d.ts +30 -4
- package/dist/observability/secret-env-scrub.js +15 -3
- 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-agent-session-index.d.ts +7 -12
- package/dist/orchestration/workflow-agent-session-index.js +1 -6
- package/dist/orchestration/workflow-completion-inbox.d.ts +29 -9
- package/dist/orchestration/workflow-completion-inbox.js +65 -46
- package/dist/org-delivery-gate.d.ts +5 -4
- package/dist/org-delivery-gate.js +7 -6
- package/dist/org-memory-admission.d.ts +5 -2
- package/dist/org-memory-admission.js +25 -10
- package/dist/outbound-dispatcher.d.ts +1 -1
- package/dist/outbound-dispatcher.js +6 -12
- package/dist/owner-brands.d.ts +81 -0
- package/dist/owner-brands.js +42 -0
- package/dist/owner-faces.d.ts +531 -0
- package/dist/owner-faces.js +126 -0
- package/dist/parked-decide.d.ts +100 -31
- package/dist/parked-decide.js +162 -48
- package/dist/parked-revive-surface.d.ts +14 -4
- package/dist/parked-revive-surface.js +5 -4
- package/dist/peer-directory.d.ts +6 -8
- package/dist/peer-directory.js +3 -2
- package/dist/permission-rule-vocab.d.ts +53 -8
- package/dist/permission-rule-vocab.js +30 -2
- package/dist/plugins/adoption-log-sql.d.ts +0 -22
- package/dist/plugins/adoption-log-sql.js +5 -3
- package/dist/plugins/approval-ask-retired-delete-by-task-m50.d.ts +7 -0
- package/dist/plugins/approval-ask-retired-delete-by-task-m50.js +17 -0
- package/dist/plugins/approval-ask-store-file.d.ts +28 -9
- package/dist/plugins/approval-ask-store-file.js +74 -18
- package/dist/plugins/approval-ask-store-memory.d.ts +17 -7
- package/dist/plugins/approval-ask-store-memory.js +35 -12
- package/dist/plugins/approval-ask-store-sql.d.ts +42 -20
- package/dist/plugins/approval-ask-store-sql.js +44 -11
- package/dist/plugins/approval-exemption-skill-m46.d.ts +20 -0
- package/dist/plugins/approval-exemption-skill-m46.js +25 -0
- package/dist/plugins/approval-exemption-store.d.ts +6 -1
- package/dist/plugins/approval-exemption-store.js +14 -0
- package/dist/plugins/approval-nonce-store.d.ts +39 -12
- package/dist/plugins/approval-nonce-store.js +72 -23
- package/dist/plugins/blob-backend.d.ts +40 -195
- package/dist/plugins/blob-backend.js +41 -234
- package/dist/plugins/caching-session-store.d.ts +22 -5
- package/dist/plugins/caching-session-store.js +43 -4
- package/dist/plugins/checkpoint-index-columns.d.ts +33 -6
- package/dist/plugins/checkpoint-index-columns.js +39 -3
- package/dist/plugins/checkpoint-store-face.d.ts +84 -11
- package/dist/plugins/checkpoint-store-face.js +18 -1
- package/dist/plugins/device-store-sql.d.ts +2 -2
- package/dist/plugins/device-store-sql.js +6 -10
- package/dist/plugins/ensure-index.d.ts +13 -1
- package/dist/plugins/ensure-index.js +154 -21
- package/dist/plugins/ensure-schema-lock-policy.d.ts +0 -15
- package/dist/plugins/ensure-schema-lock-policy.js +3 -2
- package/dist/plugins/execution-lane-rename-m40.d.ts +20 -0
- package/dist/plugins/execution-lane-rename-m40.js +10 -0
- package/dist/plugins/execution-placement-sql.d.ts +63 -88
- package/dist/plugins/execution-placement-sql.js +94 -54
- package/dist/plugins/file-run-store.d.ts +89 -35
- package/dist/plugins/file-run-store.js +197 -142
- 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 +19 -10
- package/dist/plugins/imported-layer-root-retirement.js +4 -8
- package/dist/plugins/inbox-payload-column.d.ts +14 -0
- package/dist/plugins/inbox-payload-column.js +13 -0
- 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 +63 -23
- package/dist/plugins/local-checkpoint-store.js +204 -81
- package/dist/plugins/local-data-dir-modes-m39.d.ts +48 -0
- package/dist/plugins/local-data-dir-modes-m39.js +183 -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 +13 -0
- package/dist/plugins/local-engine-high-water.js +62 -0
- package/dist/plugins/local-session-store.d.ts +442 -143
- package/dist/plugins/local-session-store.js +941 -289
- 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 +20 -1
- package/dist/plugins/local-task-attachment-store.js +32 -12
- package/dist/plugins/memory-embedder-fingerprint.d.ts +33 -10
- package/dist/plugins/memory-embedder-fingerprint.js +52 -12
- package/dist/plugins/memory-embedder.d.ts +1 -1
- package/dist/plugins/memory-embedder.js +11 -9
- package/dist/plugins/memory-engine-pg.d.ts +7 -5
- package/dist/plugins/memory-engine-pg.js +18 -9
- package/dist/plugins/memory-engine-sql-apply.d.ts +21 -8
- package/dist/plugins/memory-engine-sql-apply.js +7 -9
- package/dist/plugins/memory-engine-tidb.d.ts +12 -7
- package/dist/plugins/memory-engine-tidb.js +18 -10
- package/dist/plugins/memory-optout-grant-store-sql.d.ts +1 -1
- package/dist/plugins/memory-optout-grant-store-sql.js +3 -3
- package/dist/plugins/memory-run-store.d.ts +39 -27
- package/dist/plugins/memory-run-store.js +72 -70
- package/dist/plugins/one-time-migration-marker.d.ts +10 -0
- package/dist/plugins/one-time-migration-marker.js +7 -0
- package/dist/plugins/one-time-migrations.d.ts +325 -74
- package/dist/plugins/one-time-migrations.js +705 -230
- package/dist/plugins/org-delivery-quota-store.js +2 -1
- package/dist/plugins/owner-only-file-mode.d.ts +29 -0
- package/dist/plugins/owner-only-file-mode.js +141 -0
- package/dist/plugins/permission-rule-store-file.d.ts +11 -11
- package/dist/plugins/permission-rule-store-file.js +14 -2
- package/dist/plugins/permission-rule-store-sql.d.ts +4 -63
- package/dist/plugins/permission-rule-store-sql.js +6 -86
- package/dist/plugins/pg-pool.d.ts +3 -32
- package/dist/plugins/pg-pool.js +27 -11
- package/dist/plugins/release-version.d.ts +20 -0
- package/dist/plugins/release-version.js +28 -0
- package/dist/plugins/remote-env-adb.d.ts +20 -4
- package/dist/plugins/remote-env-adb.js +39 -11
- package/dist/plugins/remote-env-e2b.d.ts +19 -28
- package/dist/plugins/remote-env-e2b.js +40 -29
- package/dist/plugins/remote-env-host.d.ts +11 -10
- package/dist/plugins/remote-env-host.js +40 -27
- package/dist/plugins/remote-env-k8s.d.ts +45 -47
- package/dist/plugins/remote-env-k8s.js +122 -62
- package/dist/plugins/remote-env-local-docker.d.ts +152 -15
- package/dist/plugins/remote-env-local-docker.js +370 -75
- package/dist/plugins/remote-env-ssh.d.ts +8 -2
- package/dist/plugins/remote-env-ssh.js +26 -24
- package/dist/plugins/remote-scratchpad.js +4 -0
- package/dist/plugins/remote-shell.d.ts +59 -30
- package/dist/plugins/remote-shell.js +175 -62
- package/dist/plugins/retention-declaration.d.ts +37 -0
- package/dist/plugins/retention-declaration.js +9 -0
- package/dist/plugins/retention-deployment.d.ts +158 -0
- package/dist/plugins/retention-deployment.js +119 -0
- package/dist/plugins/retention-lane-store-sql.d.ts +74 -4
- package/dist/plugins/retention-lane-store-sql.js +103 -1
- package/dist/plugins/retention-sql.d.ts +29 -0
- package/dist/plugins/retention-sql.js +8 -0
- package/dist/plugins/run-preview-m45.d.ts +11 -0
- package/dist/plugins/run-preview-m45.js +19 -0
- package/dist/plugins/run-store-sql.d.ts +56 -68
- package/dist/plugins/run-store-sql.js +127 -116
- package/dist/plugins/s3-answer.d.ts +2 -1
- package/dist/plugins/sandbox-reaper.d.ts +26 -0
- package/dist/plugins/sandbox-reaper.js +2 -0
- package/dist/plugins/scenario-prefix-switch-m42.d.ts +54 -0
- package/dist/plugins/scenario-prefix-switch-m42.js +55 -0
- package/dist/plugins/scheduler-support.d.ts +16 -1
- package/dist/plugins/scheduler-support.js +22 -2
- package/dist/plugins/schema-consistency.d.ts +42 -15
- package/dist/plugins/schema-consistency.js +213 -13
- package/dist/plugins/schema-drift-sentence.d.ts +4 -1
- package/dist/plugins/schema-drift-sentence.js +4 -4
- package/dist/plugins/schema-ensure-legs.d.ts +10 -1
- package/dist/plugins/schema-ensure-legs.js +12 -2
- 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 +98 -0
- package/dist/plugins/session-ext-table.js +134 -0
- package/dist/plugins/session-fork.d.ts +16 -2
- package/dist/plugins/session-fork.js +3 -0
- package/dist/plugins/session-ownership.d.ts +1 -1
- package/dist/plugins/session-placement.d.ts +22 -16
- package/dist/plugins/session-placement.js +15 -12
- package/dist/plugins/session-row-sql.d.ts +20 -7
- package/dist/plugins/session-row-sql.js +16 -8
- 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 +157 -0
- package/dist/plugins/session-store-sql.js +398 -0
- package/dist/plugins/session-withdraw-sql.d.ts +36 -0
- package/dist/plugins/session-withdraw-sql.js +42 -0
- package/dist/plugins/session-workspace-cell.d.ts +2 -2
- package/dist/plugins/session-workspace-cell.js +2 -2
- package/dist/plugins/shared-memory-store-sql.d.ts +10 -69
- package/dist/plugins/shared-memory-store-sql.js +15 -14
- package/dist/plugins/shell-sentinel-owner-m48.d.ts +20 -0
- package/dist/plugins/shell-sentinel-owner-m48.js +3 -0
- package/dist/plugins/snapshot-bucket-presence.d.ts +2 -1
- package/dist/plugins/snapshot-bucket-presence.js +1 -1
- package/dist/plugins/sql-driver.d.ts +24 -8
- package/dist/plugins/sql-driver.js +43 -9
- package/dist/plugins/sql-errors.d.ts +35 -5
- package/dist/plugins/sql-errors.js +55 -3
- package/dist/plugins/sql-json-column.d.ts +8 -7
- package/dist/plugins/sql-json-column.js +10 -6
- package/dist/plugins/store-backend.d.ts +114 -18
- package/dist/plugins/store-backend.js +340 -87
- package/dist/plugins/store-contracts.d.ts +97 -30
- package/dist/plugins/store-contracts.js +23 -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 +21 -11
- package/dist/plugins/task-attachment-store.js +37 -19
- package/dist/plugins/task-list-store-sql.d.ts +1 -1
- package/dist/plugins/text-column-capacity.d.ts +21 -0
- package/dist/plugins/text-column-capacity.js +5 -0
- package/dist/plugins/tidb-pool.d.ts +3 -2
- package/dist/plugins/tidb-pool.js +42 -39
- package/dist/plugins/user-input-ledger-sql.d.ts +1 -1
- package/dist/plugins/web-search.js +5 -3
- package/dist/plugins/workflow-run-store-sql.d.ts +6 -1
- package/dist/plugins/workflow-run-store-sql.js +11 -5
- package/dist/principal-jwt.d.ts +4 -4
- package/dist/principal-jwt.js +20 -5
- package/dist/principal-shape.d.ts +41 -0
- package/dist/principal-shape.js +19 -0
- package/dist/question.d.ts +13 -23
- package/dist/question.js +21 -39
- package/dist/read-face-posture.d.ts +6 -6
- package/dist/read-face-posture.js +2 -2
- 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/request-value-closure.d.ts +5 -5
- package/dist/request-value-closure.js +1 -1
- 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 +46 -16
- package/dist/rules-consent.js +102 -53
- package/dist/run-acceptance.d.ts +3 -1
- package/dist/run-acceptance.js +3 -0
- package/dist/run-local.d.ts +14 -6
- package/dist/run-local.js +109 -93
- package/dist/run-stale-default.d.ts +7 -0
- package/dist/run-stale-default.js +2 -0
- package/dist/runs.d.ts +73 -44
- package/dist/runs.js +65 -43
- package/dist/runtime-caps-resolver.d.ts +36 -14
- package/dist/runtime-caps-resolver.js +31 -14
- package/dist/runtime-governance.d.ts +2 -2
- package/dist/runtime-governance.js +5 -3
- package/dist/sealed-key-layout.d.ts +12 -6
- package/dist/sealed-key-layout.js +5 -1
- package/dist/sealed-key.d.ts +12 -2
- package/dist/sealed-key.js +116 -26
- package/dist/security.d.ts +133 -161
- package/dist/security.js +163 -59
- package/dist/sema-config-dir.d.ts +20 -0
- package/dist/sema-config-dir.js +27 -2
- package/dist/server-secret-env.d.ts +23 -5
- package/dist/server-secret-env.js +14 -4
- package/dist/service-version.d.ts +2 -1
- package/dist/service-version.js +2 -2
- package/dist/session-children-retire.d.ts +7 -5
- package/dist/session-children-retire.js +7 -2
- package/dist/session-deletion.d.ts +88 -0
- package/dist/session-deletion.js +8 -0
- package/dist/session-erase.d.ts +145 -0
- package/dist/session-erase.js +115 -0
- package/dist/session-error-wire.d.ts +6 -6
- package/dist/session-error-wire.js +1 -1
- package/dist/session-incarnation.d.ts +60 -10
- 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 +29 -47
- package/dist/session-resident-background.js +77 -8
- package/dist/session-row.d.ts +3 -2
- package/dist/session-rules-seat.d.ts +12 -0
- package/dist/session-rules-seat.js +19 -0
- package/dist/session-sync-kernel.d.ts +1 -1
- package/dist/session-titler.d.ts +7 -15
- package/dist/session-titler.js +1 -1
- package/dist/session-workspace.d.ts +11 -2
- package/dist/session-workspace.js +5 -0
- package/dist/sighup-idle.d.ts +1 -1
- package/dist/spec-fields.d.ts +57 -3
- package/dist/spec-fields.js +72 -51
- package/dist/store-posture.d.ts +138 -21
- package/dist/store-posture.js +188 -3
- package/dist/stored-request-hooks-m20.d.ts +3 -2
- package/dist/stored-request-hooks-m20.js +21 -16
- 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/blob-index-sql.d.ts +148 -0
- package/dist/stores-sql/blob-index-sql.js +154 -0
- package/dist/stores-sql/checkpoint-store-sql.d.ts +34 -29
- package/dist/stores-sql/checkpoint-store-sql.js +86 -71
- package/dist/{plugins → stores-sql}/file-history-store-sql.d.ts +23 -11
- package/dist/{plugins → stores-sql}/file-history-store-sql.js +23 -18
- package/dist/stores-sql/mailbox-store-sql.d.ts +7 -4
- package/dist/stores-sql/mailbox-store-sql.js +31 -32
- package/dist/{plugins → stores-sql}/pg-session-storage.d.ts +30 -81
- package/dist/{plugins → stores-sql}/pg-session-storage.js +123 -244
- package/dist/{plugins → stores-sql}/retention-store-sql.d.ts +197 -223
- package/dist/{plugins → stores-sql}/retention-store-sql.js +148 -207
- package/dist/{plugins → stores-sql}/session-event-payload.d.ts +1 -1
- package/dist/{plugins → stores-sql}/session-event-payload.js +1 -1
- package/dist/stores-sql/session-policy-store-sql.d.ts +33 -11
- package/dist/stores-sql/session-policy-store-sql.js +44 -36
- package/dist/stores-sql/session-write-hooks.d.ts +65 -0
- package/dist/stores-sql/session-write-hooks.js +2 -0
- package/dist/{plugins → stores-sql}/tidb-session-storage.d.ts +14 -15
- package/dist/{plugins → stores-sql}/tidb-session-storage.js +22 -28
- package/dist/{plugins → stores-sql}/tidb-session-store.d.ts +67 -138
- package/dist/{plugins → stores-sql}/tidb-session-store.js +130 -200
- package/dist/stores-sql/tool-result-store-sql.d.ts +1 -1
- package/dist/stores-sql/tool-result-store-sql.js +1 -1
- package/dist/stores-sql/windowed-session-storage.d.ts +61 -0
- package/dist/stores-sql/windowed-session-storage.js +70 -0
- package/dist/submission-exit.d.ts +50 -0
- package/dist/submission-exit.js +108 -0
- package/dist/task-a2a.d.ts +7 -1
- package/dist/task-a2a.js +18 -17
- package/dist/task-cwd.d.ts +31 -3
- package/dist/task-cwd.js +25 -1
- package/dist/task-mcp.d.ts +11 -3
- package/dist/task-mcp.js +16 -19
- package/dist/task-settings.d.ts +23 -14
- package/dist/task-settings.js +35 -13
- package/dist/terminal.d.ts +25 -43
- package/dist/terminal.js +31 -11
- package/dist/tool-approval.d.ts +152 -137
- package/dist/tool-approval.js +199 -199
- package/dist/trace/core-keyset-guard.d.ts +22 -9
- 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 +1 -1
- package/dist/trace/engine-notice-wire.js +2 -0
- package/dist/trace/exit-seat.d.ts +52 -4
- package/dist/trace/exit-seat.js +43 -36
- package/dist/trace/extension-call-face.d.ts +3 -2
- package/dist/trace/extension-call-face.js +3 -1
- package/dist/trace/ledger-events.d.ts +4 -7
- package/dist/trace/ledger-sink.d.ts +1 -30
- package/dist/trace/ledger-sink.js +0 -11
- package/dist/trace/model-segment.d.ts +5 -5
- package/dist/trace/model-segment.js +5 -5
- package/dist/trace/project.d.ts +88 -58
- package/dist/trace/project.js +64 -28
- package/dist/trace/redact.d.ts +124 -28
- package/dist/trace/redact.js +936 -328
- package/dist/trace/self-minted-wire.d.ts +750 -29
- package/dist/trace/self-minted-wire.js +262 -25
- package/dist/trace/sema-provenance.d.ts +45 -41
- package/dist/trace/sema-provenance.js +81 -10
- package/dist/trace/task-notification-facets.d.ts +70 -2
- package/dist/trace/task-notification-facets.js +71 -1
- package/dist/trace/wire-projection-faces.d.ts +43 -8
- package/dist/trace/wire-projection-faces.js +28 -3
- package/dist/unread-request-members.d.ts +66 -0
- package/dist/unread-request-members.js +41 -0
- 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 -40
- 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/candidate-gate.d.ts +35 -3
- package/dist/web-admin-client/candidate-gate.js +53 -5
- package/dist/web-admin-client/center-request.d.ts +6 -3
- package/dist/web-admin-client/center-request.js +17 -16
- package/dist/web-admin-client/effective-keys.d.ts +1 -1
- package/dist/web-admin-client/effective-keys.js +1 -2
- 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/facade.d.ts +1 -1
- package/dist/web-admin-client/http-client.d.ts +2 -1
- package/dist/web-admin-client/http-client.js +40 -13
- 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 +13 -6
- package/dist/web-admin-client/skills-mcp.d.ts +22 -8
- package/dist/web-admin-client/skills-mcp.js +26 -21
- package/dist/web-admin-client/types.d.ts +35 -51
- package/dist/workspace-space.d.ts +3 -2
- package/docs/DEVICE-EXECUTOR-PROTOCOL.md +4 -4
- package/package.json +16 -12
- package/scripts/drain-check-local.mjs +118 -173
- package/scripts/drain-check.mysql.sql +20 -16
- package/scripts/drain-check.pg.sql +20 -16
- package/wire-changes/server@7.147.0.json +813 -0
- package/wire-changes/server@7.148.0.json +1517 -0
- package/dist/http/memory-control-plane-corrupt-reply.d.ts +0 -25
- package/dist/http/memory-control-plane-corrupt-reply.js +0 -19
- package/dist/http/memory-layer-reply.d.ts +0 -30
- package/dist/http/memory-layer-reply.js +0 -24
- package/dist/lsp/e2b-bridge.d.ts +0 -57
- package/dist/lsp/e2b-bridge.js +0 -139
- package/dist/lsp/e2b-manager.d.ts +0 -93
- package/dist/lsp/e2b-manager.js +0 -178
- package/dist/lsp/lsp-frames.d.ts +0 -14
- package/dist/lsp/lsp-frames.js +0 -25
- package/dist/lsp/manager.d.ts +0 -129
- package/dist/lsp/manager.js +0 -127
- package/dist/lsp/types.d.ts +0 -12
- package/dist/lsp/types.js +0 -2
- package/dist/lsp/ws-transport.d.ts +0 -40
- package/dist/lsp/ws-transport.js +0 -210
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* **SQL 会话店 = 引擎座店 + 部署的会话格**(两方言同一只类;组合座 `store-backend.ts` 装配)。
|
|
3
|
+
*
|
|
4
|
+
* ## 两半,一只店
|
|
5
|
+
* · **座**(`src/stores-sql/` 的方言店):引擎座表 `session_meta` / `session_event` 的唯一写者 —— 唤醒、追加、fork、导入、暂存、删除。
|
|
6
|
+
* · **部署格**(本模块):本服务记在一只会话上的格,全部住旁表 `session_ext`(属主 `session-ext-table.ts`)—— 列表投影的标题 / 置顶 / 行标签、
|
|
7
|
+
* 换源通告的基线、位置与项目、执行放置那一格与 fork 键。读引擎座表只经它的公布列(身份、属主、化身、时刻、委派判别位、fork 谱系的源 id);写只写旁表。
|
|
8
|
+
* 座在它的写事务里锁住根行之后调部署的**事务内钩**({@link createSqlSessionWriteHooks},契约在 `stores-sql/session-write-hooks.ts`)——
|
|
9
|
+
* 认领、本处写者、导入落 mirror、fork 键都在座的同一事务里由钩判 / 写(同事务两句:锁根行一句、钩的读写各一句)。
|
|
10
|
+
*
|
|
11
|
+
* ## 一条列表读口
|
|
12
|
+
* 列表面(`listSessions` / `listSessionRows` / `sessionSummaryOf`)是一条 SELECT、一只行映射({@link SqlSessionStore.selectListRows}):
|
|
13
|
+
* `session_meta` LEFT JOIN 旁表(标题 / 置顶;行不在 = 未命名、未置顶)LEFT JOIN run 账本的预览。两方言只差语句文本(窗函数 / `DISTINCT ON`、JSON 标量提取、
|
|
14
|
+
* LIKE 的转义字面量、布尔的读法)。
|
|
15
|
+
*
|
|
16
|
+
* ## 旁表的写序(一条,与执行放置的写序律同一条)
|
|
17
|
+
* 每个格写者在一只事务里:锁根 `session_meta` 行(行不在 ⇒ 不写)→ 补旁表行(行在不动)→ 要判格的再锁定读那一行 → 一句按 `session_id` 定址的格写。根行先 ⇒ 与座的删除 /
|
|
18
|
+
* 导入 / 换装同一锁序,外键的补行不会与删除的级联互等;补行先于锁定读 ⇒ 锁定读永远落在一行在的记录上(不拿 InnoDB 间隙锁)。
|
|
19
|
+
*/
|
|
20
|
+
import { type AcquiredSession, type PlacedSessionRow, type SessionHead, type SessionPlacementRecord, type SessionStore, type SessionTreeEntry } from "@sema-agent/core";
|
|
21
|
+
import type { TiDBSessionStore } from "../stores-sql/tidb-session-store.js";
|
|
22
|
+
import type { SessionWriteHooks } from "../stores-sql/session-write-hooks.js";
|
|
23
|
+
import type { SqlDriver } from "./sql-driver.js";
|
|
24
|
+
import { type ExecutionPlacementSeat } from "../execution-placement.js";
|
|
25
|
+
import { type InstructionSourceBaseline } from "../instruction-source-notice.js";
|
|
26
|
+
import { type RegisterReceipt, type SessionBirth, type WithdrawOutcome } from "../session-incarnation.js";
|
|
27
|
+
import { type SessionDeletionFace } from "../session-deletion.js";
|
|
28
|
+
import { type ClientSessionRowWrite, type ReplaySessionRowWrite, type ReplaySessionRowWriteOutcome, type SessionRowAnswer, type SessionRowPatch, type SessionRowWriteOutcome } from "../session-row.js";
|
|
29
|
+
import type { SessionSummary } from "./store-contracts.js";
|
|
30
|
+
import type { SessionWorkspace } from "../session-workspace.js";
|
|
31
|
+
/** 座的面:座的公开成员(两方言同形 —— PG 孪生按结构赋给它,组合座里 tsc 判)。 */
|
|
32
|
+
export type SessionSeat = Pick<TiDBSessionStore, "retention" | "placements" | "durability" | "acquire" | "register" | "registerWithReceipt" | "deleteSessionIf" | "placementOf" | "listPlaced" | "headOf" | "touch" | "release" | "forget" | "fork" | "forkTo" | "exportEntries" | "listEntryIds" | "exportEntriesStream" | "importEntries" | "replaceEntries" | "beginImportStaging" | "readStagedEntries" | "sweepStagingSessions" | "size" | "dispose">;
|
|
33
|
+
/** 列表面的查询(`OwnerAwareSessionStore.listSessions` 的入参形)。 */
|
|
34
|
+
export interface SessionListOptions {
|
|
35
|
+
owner?: string;
|
|
36
|
+
includeUnowned?: boolean;
|
|
37
|
+
cursor?: {
|
|
38
|
+
lastActivityAt: string;
|
|
39
|
+
sessionId: string;
|
|
40
|
+
};
|
|
41
|
+
limit: number;
|
|
42
|
+
q?: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 会话店的事务内钩(座锁住根行之后、写之前调;同一事务、同一连接):
|
|
46
|
+
* · 四个词同一只判官 {@link judgeSessionWrite}(local 店的写锁内同调这一只):`erase` 只判这一行的在删令牌(不是 ⇒ 拒 `SessionDeletionSupersededError`);其余认领在 ⇒ 拒 `SessionActiveRunError`;
|
|
47
|
+
* `import` 再判这一处是写者 ⇒ 拒 `SessionWriterPresentError`;
|
|
48
|
+
* · `import` 放行 ⇒ 这一格落 mirror(写者在别处)、客户端写计数 +1;删除三词放行 ⇒ 什么都不写(级联随根行带走旁表行,钩不另删);
|
|
49
|
+
* · 键控 fork(服务扩展)—— `record`:新行的 fork 键落旁表(新行是本事务刚插下的,本事务持着它的锁);`targetOf`:撞上已在的目标时的一次池读(属主 + fork 键)。
|
|
50
|
+
*/
|
|
51
|
+
export declare function createSqlSessionWriteHooks(db: Pick<SqlDriver, "dialect" | "query">): SessionWriteHooks;
|
|
52
|
+
export declare class SqlSessionStore implements SessionStore {
|
|
53
|
+
private readonly db;
|
|
54
|
+
/** 座(引擎座表的唯一写者)。 */
|
|
55
|
+
private readonly seat;
|
|
56
|
+
/** 托管留存声明 / placement 声明 / 耐久声明:座的声明逐字转发。 */
|
|
57
|
+
readonly retention: SessionSeat["retention"];
|
|
58
|
+
readonly placements: SessionSeat["placements"];
|
|
59
|
+
readonly durability: SessionSeat["durability"];
|
|
60
|
+
/** 执行席(规则在 `src/execution-placement.ts`;实现与语句的唯一属主 = `execution-placement-sql.ts`)。 */
|
|
61
|
+
readonly executionPlacement: ExecutionPlacementSeat;
|
|
62
|
+
/** `db` = 座的池包成的 SqlDriver(同一只池);`seatOn` 拿部署的事务内钩建座。 */
|
|
63
|
+
constructor(db: SqlDriver, seatOn: (hooks: SessionWriteHooks) => SessionSeat);
|
|
64
|
+
acquire(...a: Parameters<SessionSeat["acquire"]>): Promise<AcquiredSession>;
|
|
65
|
+
register(sessionId: string, owner: string | null): Promise<void>;
|
|
66
|
+
/** 出生回执面(座逐字转发;`plugins/session-birth.ts`)。 */
|
|
67
|
+
registerWithReceipt(sessionId: string, owner: string | null): Promise<RegisterReceipt>;
|
|
68
|
+
/** 条件撤回面:座的条件删除 + 本部署的判据(启用标记 / 客户端写计数 / 别的 run / 本次 run 的部署行;同一事务)。 */
|
|
69
|
+
withdrawBirth(birth: SessionBirth, ownTaskId: string | undefined): Promise<WithdrawOutcome>;
|
|
70
|
+
placementOf(sessionId: string): Promise<SessionPlacementRecord | undefined>;
|
|
71
|
+
listPlaced(...a: Parameters<SessionSeat["listPlaced"]>): Promise<PlacedSessionRow[]>;
|
|
72
|
+
/**
|
|
73
|
+
* 按 id 读一行(属主 / 住客 / 叶子一次读)—— 座的那一读加一条「不在删」:在删的行对删除门之外的读者读作不在(会话三态,`src/session-deletion.ts`)。
|
|
74
|
+
* 一条 PK SELECT(根行 LEFT JOIN 旁表行),不上锁。
|
|
75
|
+
*/
|
|
76
|
+
headOf(sessionId: string): Promise<SessionHead | undefined>;
|
|
77
|
+
/** 删除门的头读(`OwnerAwareSessionStore.deletionHeadOf`):活行 ∪ 在删行 —— 座的原始一读。开始删它的那位属主重发删除(= 接管)就过得了门;别人得到与「不在」同一句。 */
|
|
78
|
+
deletionHeadOf(sessionId: string): Promise<SessionHead | undefined>;
|
|
79
|
+
touch(sessionId: string): Promise<void>;
|
|
80
|
+
release(sessionId: string): Promise<void>;
|
|
81
|
+
forget(sessionId: string): void;
|
|
82
|
+
fork(...a: Parameters<SessionSeat["fork"]>): ReturnType<SessionSeat["fork"]>;
|
|
83
|
+
forkTo(...a: Parameters<SessionSeat["forkTo"]>): ReturnType<SessionSeat["forkTo"]>;
|
|
84
|
+
exportEntries(sessionId: string): Promise<SessionTreeEntry[] | null>;
|
|
85
|
+
listEntryIds(sessionId: string): Promise<string[] | null>;
|
|
86
|
+
exportEntriesStream(...a: Parameters<SessionSeat["exportEntriesStream"]>): ReturnType<SessionSeat["exportEntriesStream"]>;
|
|
87
|
+
importEntries(sessionId: string, owner: string | null, entries: SessionTreeEntry[]): Promise<void>;
|
|
88
|
+
replaceEntries(sessionId: string, owner: string | null, entries: SessionTreeEntry[]): Promise<void>;
|
|
89
|
+
beginImportStaging(...a: Parameters<SessionSeat["beginImportStaging"]>): ReturnType<SessionSeat["beginImportStaging"]>;
|
|
90
|
+
readStagedEntries(stagingId: string): Promise<SessionTreeEntry[]>;
|
|
91
|
+
sweepStagingSessions(): Promise<number>;
|
|
92
|
+
readonly sessionDeletion: SessionDeletionFace;
|
|
93
|
+
/**
|
|
94
|
+
* 围栏(删除路唯一的认领判):一只事务 —— 锁根行(读属主与住客)→ 不在 / 属主不等 ⇒ 回滚、`undefined` → 补旁表行 + 锁定读在删令牌 →
|
|
95
|
+
* · 活 ∧ 不带 `expect` ⇒ 判认领(判官 `judgeSessionWrite` 的 `delete` 臂,锁定读 `task_active`;在 ⇒ 回滚、抛 `SessionActiveRunError`)→ 写新令牌;
|
|
96
|
+
* 活 ∧ 带 `expect`(收尾者)⇒ 回滚、`undefined` —— 收尾者读到之后那一次删完、同 id 重登记的新行不被碰;
|
|
97
|
+
* · 在删 ∧ 带 `expect` 而持有的不是它 ⇒ `undefined`;持有者仍可能活着(`running`,或 `elsewhere` 且令牌铸于接管期限之内 —— 别的副本上那一次可能还在跑)⇒
|
|
98
|
+
* 回滚、`{ inProgress }`;否则 ⇒ 接管(换新令牌;不判认领:在删期间规则 L 不让认领落下)。
|
|
99
|
+
* 写序与旁表的其余格写者同一条(根行 → 旁表;根行先 ⇒ 与认领事务、座的删除 / 导入同一锁序)。
|
|
100
|
+
*/
|
|
101
|
+
private fenceDeletion;
|
|
102
|
+
get size(): number;
|
|
103
|
+
dispose(): void;
|
|
104
|
+
/**
|
|
105
|
+
* E16 — list the caller's sessions (CC /resume picker), keyset-paginated newest-first by last activity. Session IDENTITY/enumeration comes from
|
|
106
|
+
* `session_meta` (owner-filtered on its owner column); the side table supplies the title / pin; LEFT JOINs onto the `task_run` runs ledger
|
|
107
|
+
* supply the run-derived half (latest run's status / task_id / runId, run count, the preview) but never gate which sessions exist. Keyset on `(updated_at, session_id)`.
|
|
108
|
+
*/
|
|
109
|
+
listSessions(opts: SessionListOptions): Promise<SessionSummary[]>;
|
|
110
|
+
/** {@link listSessions} with each row's occupant (owner + incarnation) from the same SELECT — `OwnerAwareSessionStore.listSessionRows`; the incarnation never enters the row. */
|
|
111
|
+
listSessionRows(opts: SessionListOptions): Promise<Array<SessionRowAnswer<SessionSummary>>>;
|
|
112
|
+
/** ONE session's list row — {@link listSessions}' projection (same SELECT, same mapper) scoped to one id; `undefined` = not a row of the list face
|
|
113
|
+
* (no such session / placed). The run subqueries are scoped to the same id. */
|
|
114
|
+
sessionSummaryOf(sessionId: string): Promise<SessionSummary | undefined>;
|
|
115
|
+
/** {@link sessionSummaryOf} 那一读 + 读到它时行上的住客(写原语的应答行要复核住客,`settleSessionRowWrite`)。 */
|
|
116
|
+
private listRowOf;
|
|
117
|
+
/**
|
|
118
|
+
* The list projection's ONE SELECT + row mapper ({@link listSessions} and {@link sessionSummaryOf} both read through it). `runSessionId` scopes the
|
|
119
|
+
* three run subqueries to one session (the single-row read); the list leaves them whole. Placeholders are minted in text order (run scope ×3,
|
|
120
|
+
* then `where`, then the LIMIT), so one builder serves both dialects. `sm.incarnation` is read for the row tag and the answer row's occupant only.
|
|
121
|
+
* The run JOINs (the run-derived half of the row — `SessionRunRollup` in `store-contracts.ts`; the local twin's rule is `session-run-rollup.ts`, one case table pins both):
|
|
122
|
+
* · a count rollup;
|
|
123
|
+
* · `latest` = the LATEST run per session (`created_at DESC, task_id DESC`, ties broken by task_id so EXACTLY one row joins) ⇒ status / task_id / runId;
|
|
124
|
+
* · `preview` = the most recent run whose preview column is non-empty BY CHARACTER LENGTH ({@link RUN_PREVIEW_PRESENT}) ⇒ `objectivePreview` — decoupled
|
|
125
|
+
* from `latest`: a last turn with no user text (column `""`) falls back to the sentence before it; none ⇒ NULL.
|
|
126
|
+
* LEFT JOINs keep sessions with no runs (preview NULL, run_count 0) and sessions with no side-table row (title NULL, not pinned).
|
|
127
|
+
*/
|
|
128
|
+
private selectListRows;
|
|
129
|
+
/**
|
|
130
|
+
* 会话行格写原语 —— 用户标题 / 置顶的唯一写口(规则与判序:`src/session-row.ts` 头注「写原语」;事务与语句:`session-row-sql.ts`)。应答行在提交 / 回滚之后
|
|
131
|
+
* 由列表行读另读(含新 `rowTag`)、复核仍是判过的那一位住客。只写列表面上的行(委派分区行 ⇒ `absent`);`updated_at` 不动(改名不是活动)。
|
|
132
|
+
*/
|
|
133
|
+
writeSessionRowCells(sessionId: string, cells: SessionRowPatch, how: ClientSessionRowWrite): Promise<SessionRowWriteOutcome<SessionSummary>>;
|
|
134
|
+
writeSessionRowCells(sessionId: string, cells: SessionRowPatch, how: ReplaySessionRowWrite): Promise<ReplaySessionRowWriteOutcome<SessionSummary>>;
|
|
135
|
+
/** Cheap pre-LLM probe: "none" = session_meta row not yet REGISTERED (createRun fires before the Runner's session acquire — the titler retries),
|
|
136
|
+
* "untitled" / "titled" as read (no side-table row = untitled). */
|
|
137
|
+
probeTitle(sessionId: string): Promise<"none" | "untitled" | "titled">;
|
|
138
|
+
/** The auto-titler's write: lands ONLY when title IS NULL (a concurrent/prior title — the user's included — wins; writer order: `src/session-row.ts`).
|
|
139
|
+
* Returns whether this call set it. No session row ⇒ `false`. */
|
|
140
|
+
setTitleIfNull(sessionId: string, title: string): Promise<boolean>;
|
|
141
|
+
/** 换源通告的基线读(一行 PK 读;列的三态读法见 `instruction-source-notice.ts`)。旁表行不在 ⇒ 读作「没记过」。语句期限 {@link BASELINE_IO_DEADLINE_MS}(过期 ⇒ 查询自己拒、连接销毁)。 */
|
|
142
|
+
readInstructionSource(sessionId: string): Promise<InstructionSourceBaseline>;
|
|
143
|
+
/**
|
|
144
|
+
* CAS 覆写基线(期望值 = 调用方读到的那一份;不符 ⇒ 0 行、不抛 —— 契约见 `InstructionSourceStore`)。会话行不在 ⇒ 不写。**不**碰 `updated_at`。
|
|
145
|
+
* 期限:事务里每一句带语句期限 {@link BASELINE_IO_DEADLINE_MS} —— 被行锁卡住的写由查询自己在期限内拒、连接销毁(事务随连接关闭回滚,池里不留卡住的连接);
|
|
146
|
+
* 调用方的 `withinIoDeadline` 同一只数,是它那一侧的放手。
|
|
147
|
+
*/
|
|
148
|
+
recordInstructionSource(sessionId: string, expected: InstructionSourceBaseline, source: string | null): Promise<void>;
|
|
149
|
+
/** 会话行的位置与项目那一格(域律 `src/session-workspace.ts`,列属主 `session-workspace-cell.ts`)。一行 PK 读,按文本投影、恰好解一次;行不在 / 格为 NULL ⇒ `undefined`。 */
|
|
150
|
+
readSessionWorkspace(sessionId: string): Promise<SessionWorkspace | undefined>;
|
|
151
|
+
/**
|
|
152
|
+
* 整格覆写(最后一帧胜;唯一调用方 = 腿的记录座)。**住客围栏**:只写化身仍是 `incarnation` 的那一行(锁根行时按化身收窄)—— 行不在、或同 id 已换了住客 ⇒
|
|
153
|
+
* 不写、不抛。**不**碰 `updated_at`。
|
|
154
|
+
*/
|
|
155
|
+
recordSessionWorkspace(sessionId: string, incarnation: string, workspace: SessionWorkspace): Promise<void>;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=session-store-sql.d.ts.map
|
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
import { uuidv7 } from "@sema-agent/core";
|
|
2
|
+
import { escapeLike } from "./sql-escape.js";
|
|
3
|
+
import { jsonColumnText } from "./sql-json-column.js";
|
|
4
|
+
import { pgSafeJsonStringify } from "./pg-safe-json.js";
|
|
5
|
+
import { DELETING_TOKEN_COLUMN, SESSION_EXT_TABLE, ensureSessionExtRowStatement, readDeletingTokenOn } from "./session-ext-table.js";
|
|
6
|
+
import { decodeSessionWorkspaceCell, encodeSessionWorkspaceCell } from "./session-workspace-cell.js";
|
|
7
|
+
import { createSqlExecutionPlacementSeat, markMirrorStatement, readCellOn, readClaimOn, writeCellOn } from "./execution-placement-sql.js";
|
|
8
|
+
import { judgeSessionWrite, sessionWriteTouchesCell } from "../execution-placement.js";
|
|
9
|
+
import { BASELINE_IO_DEADLINE_MS, decodeInstructionSource, encodeInstructionSource } from "../instruction-source-notice.js";
|
|
10
|
+
import { forkLineageOfRow, headFromRow, incarnationFromCell } from "../session-incarnation.js";
|
|
11
|
+
import { CROSS_PROCESS_TAKEOVER_AFTER_MS, deletionTokenMintedAt } from "../session-deletion.js";
|
|
12
|
+
import { sessionRowTagKey } from "../session-row.js";
|
|
13
|
+
import { writeSessionRowCellsSql } from "./session-row-sql.js";
|
|
14
|
+
import { bumpClientWritesOn, createSqlWithdrawJudge } from "./session-withdraw-sql.js";
|
|
15
|
+
import { WITHDRAWABLE_ENTRY_TYPES } from "./session-birth.js";
|
|
16
|
+
const RUN_PREVIEW_PRESENT = "CHAR_LENGTH(objective_preview) > 0";
|
|
17
|
+
function binder(dialect) {
|
|
18
|
+
const values = [];
|
|
19
|
+
return {
|
|
20
|
+
values,
|
|
21
|
+
p: (v) => {
|
|
22
|
+
values.push(v);
|
|
23
|
+
return dialect === "pg" ? `$${values.length}` : "?";
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
const rowsOnTxn = (txn) => async (sql, values) => (await txn.query(sql, [...values])).rows;
|
|
28
|
+
export function createSqlSessionWriteHooks(db) {
|
|
29
|
+
const dialect = db.dialect;
|
|
30
|
+
return {
|
|
31
|
+
async beforeCommit(txn, write) {
|
|
32
|
+
const rows = rowsOnTxn(txn);
|
|
33
|
+
const root = write.rootSessionId;
|
|
34
|
+
const verdict = await judgeSessionWrite(write, { claim: () => readClaimOn(rows, dialect, root), cell: () => readCellOn(rows, dialect, root), deleting: () => readDeletingTokenOn(rows, dialect, root) });
|
|
35
|
+
if (verdict !== "proceed")
|
|
36
|
+
return verdict;
|
|
37
|
+
if (sessionWriteTouchesCell(write.op)) {
|
|
38
|
+
await writeCellOn(txn, dialect, root, markMirrorStatement(dialect, root));
|
|
39
|
+
await bumpClientWritesOn(txn, dialect, root);
|
|
40
|
+
}
|
|
41
|
+
return "proceed";
|
|
42
|
+
},
|
|
43
|
+
keyedFork: {
|
|
44
|
+
async record(txn, fork) {
|
|
45
|
+
const ensure = ensureSessionExtRowStatement(dialect, fork.rootSessionId);
|
|
46
|
+
await txn.query(ensure.text, [...ensure.values]);
|
|
47
|
+
const b = binder(dialect);
|
|
48
|
+
const res = await txn.query(`UPDATE ${SESSION_EXT_TABLE} SET fork_key = ${b.p(fork.forkKey)} WHERE session_id = ${b.p(fork.rootSessionId)}`, b.values);
|
|
49
|
+
if (res.affected !== 1)
|
|
50
|
+
throw new Error(`fork of session ${fork.rootSessionId}: the fork key write matched no row of a row this transaction just created — engine/driver anomaly, refusing to guess`);
|
|
51
|
+
},
|
|
52
|
+
async targetOf(sessionId) {
|
|
53
|
+
const b = binder(dialect);
|
|
54
|
+
const row = (await db.query(`SELECT sm.owner, se.fork_key FROM session_meta sm LEFT JOIN ${SESSION_EXT_TABLE} se ON se.session_id = sm.session_id WHERE sm.session_id = ${b.p(sessionId)}`, b.values)).rows[0];
|
|
55
|
+
if (row === undefined)
|
|
56
|
+
return undefined;
|
|
57
|
+
return { owner: row.owner === null || row.owner === undefined ? null : String(row.owner), forkKey: row.fork_key === null || row.fork_key === undefined ? null : String(row.fork_key) };
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
const BASELINE_STATEMENT = { deadlineMs: BASELINE_IO_DEADLINE_MS };
|
|
63
|
+
async function withLockedSessionExt(db, sessionId, lock, write) {
|
|
64
|
+
const conn = await db.connect();
|
|
65
|
+
const query = (sql, params) => conn.query(sql, params, lock.statement);
|
|
66
|
+
try {
|
|
67
|
+
await conn.begin();
|
|
68
|
+
const b = binder(db.dialect);
|
|
69
|
+
const locked = await query(`SELECT session_id FROM session_meta WHERE session_id = ${b.p(sessionId)}${lock.where === undefined ? "" : ` AND ${lock.where(b.p)}`} FOR UPDATE`, b.values);
|
|
70
|
+
if (locked.rows.length === 0) {
|
|
71
|
+
await conn.rollback();
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
const ensure = ensureSessionExtRowStatement(db.dialect, sessionId);
|
|
75
|
+
await query(ensure.text, [...ensure.values]);
|
|
76
|
+
const wrote = await write(query);
|
|
77
|
+
await conn.commit();
|
|
78
|
+
return wrote;
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
await conn.rollback().catch(() => undefined);
|
|
82
|
+
throw err;
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
conn.release();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const pinnedOf = (dialect, v) => (dialect === "pg" ? v === true : Number(v) === 1);
|
|
89
|
+
const listedLineageOf = (sessionId, forkedFrom) => {
|
|
90
|
+
const lineage = forkLineageOfRow(sessionId, forkedFrom, undefined);
|
|
91
|
+
return lineage.forkedFrom !== undefined ? { forkedFrom: lineage.forkedFrom } : {};
|
|
92
|
+
};
|
|
93
|
+
function holderMayBeAlive(holder, token) {
|
|
94
|
+
switch (holder) {
|
|
95
|
+
case "running":
|
|
96
|
+
return true;
|
|
97
|
+
case "ended":
|
|
98
|
+
return false;
|
|
99
|
+
case "elsewhere": {
|
|
100
|
+
const minted = deletionTokenMintedAt(token);
|
|
101
|
+
return minted === undefined || Date.now() - minted < CROSS_PROCESS_TAKEOVER_AFTER_MS;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
export class SqlSessionStore {
|
|
106
|
+
db;
|
|
107
|
+
seat;
|
|
108
|
+
retention;
|
|
109
|
+
placements;
|
|
110
|
+
durability;
|
|
111
|
+
executionPlacement;
|
|
112
|
+
constructor(db, seatOn) {
|
|
113
|
+
this.db = db;
|
|
114
|
+
this.seat = seatOn(createSqlSessionWriteHooks(db));
|
|
115
|
+
this.retention = this.seat.retention;
|
|
116
|
+
this.placements = this.seat.placements;
|
|
117
|
+
this.durability = this.seat.durability;
|
|
118
|
+
this.executionPlacement = createSqlExecutionPlacementSeat(db);
|
|
119
|
+
}
|
|
120
|
+
acquire(...a) {
|
|
121
|
+
return this.seat.acquire(...a);
|
|
122
|
+
}
|
|
123
|
+
register(sessionId, owner) {
|
|
124
|
+
return this.seat.register(sessionId, owner);
|
|
125
|
+
}
|
|
126
|
+
registerWithReceipt(sessionId, owner) {
|
|
127
|
+
return this.seat.registerWithReceipt(sessionId, owner);
|
|
128
|
+
}
|
|
129
|
+
withdrawBirth(birth, ownTaskId) {
|
|
130
|
+
const cond = {
|
|
131
|
+
expect: { owner: birth.owner, incarnation: birth.incarnation },
|
|
132
|
+
withdrawableEntryTypes: WITHDRAWABLE_ENTRY_TYPES,
|
|
133
|
+
judge: createSqlWithdrawJudge(this.db.dialect, birth.sessionId, ownTaskId),
|
|
134
|
+
};
|
|
135
|
+
return this.seat.deleteSessionIf(birth.sessionId, cond);
|
|
136
|
+
}
|
|
137
|
+
placementOf(sessionId) {
|
|
138
|
+
return this.seat.placementOf(sessionId);
|
|
139
|
+
}
|
|
140
|
+
listPlaced(...a) {
|
|
141
|
+
return this.seat.listPlaced(...a);
|
|
142
|
+
}
|
|
143
|
+
async headOf(sessionId) {
|
|
144
|
+
const b = binder(this.db.dialect);
|
|
145
|
+
const row = (await this.db.query(`SELECT sm.owner, sm.incarnation, sm.leaf_id FROM session_meta sm LEFT JOIN ${SESSION_EXT_TABLE} se ON se.session_id = sm.session_id ` +
|
|
146
|
+
`WHERE sm.session_id = ${b.p(sessionId)} AND se.${DELETING_TOKEN_COLUMN.name} IS NULL`, b.values)).rows[0];
|
|
147
|
+
if (row === undefined)
|
|
148
|
+
return undefined;
|
|
149
|
+
return headFromRow(sessionId, row.owner ?? null, row.incarnation, row.leaf_id ?? null);
|
|
150
|
+
}
|
|
151
|
+
deletionHeadOf(sessionId) {
|
|
152
|
+
return this.seat.headOf(sessionId);
|
|
153
|
+
}
|
|
154
|
+
touch(sessionId) {
|
|
155
|
+
return this.seat.touch(sessionId);
|
|
156
|
+
}
|
|
157
|
+
release(sessionId) {
|
|
158
|
+
return this.seat.release(sessionId);
|
|
159
|
+
}
|
|
160
|
+
forget(sessionId) {
|
|
161
|
+
this.seat.forget(sessionId);
|
|
162
|
+
}
|
|
163
|
+
fork(...a) {
|
|
164
|
+
return this.seat.fork(...a);
|
|
165
|
+
}
|
|
166
|
+
forkTo(...a) {
|
|
167
|
+
return this.seat.forkTo(...a);
|
|
168
|
+
}
|
|
169
|
+
exportEntries(sessionId) {
|
|
170
|
+
return this.seat.exportEntries(sessionId);
|
|
171
|
+
}
|
|
172
|
+
listEntryIds(sessionId) {
|
|
173
|
+
return this.seat.listEntryIds(sessionId);
|
|
174
|
+
}
|
|
175
|
+
exportEntriesStream(...a) {
|
|
176
|
+
return this.seat.exportEntriesStream(...a);
|
|
177
|
+
}
|
|
178
|
+
importEntries(sessionId, owner, entries) {
|
|
179
|
+
return this.seat.importEntries(sessionId, owner, entries);
|
|
180
|
+
}
|
|
181
|
+
replaceEntries(sessionId, owner, entries) {
|
|
182
|
+
return this.seat.replaceEntries(sessionId, owner, entries);
|
|
183
|
+
}
|
|
184
|
+
beginImportStaging(...a) {
|
|
185
|
+
return this.seat.beginImportStaging(...a);
|
|
186
|
+
}
|
|
187
|
+
readStagedEntries(stagingId) {
|
|
188
|
+
return this.seat.readStagedEntries(stagingId);
|
|
189
|
+
}
|
|
190
|
+
sweepStagingSessions() {
|
|
191
|
+
return this.seat.sweepStagingSessions();
|
|
192
|
+
}
|
|
193
|
+
sessionDeletion = {
|
|
194
|
+
fence: (sessionId, owner, opts) => this.fenceDeletion(sessionId, owner, opts),
|
|
195
|
+
holds: async (sessionId, token) => {
|
|
196
|
+
const b = binder(this.db.dialect);
|
|
197
|
+
const row = (await this.db.query(`SELECT ${DELETING_TOKEN_COLUMN.name} FROM ${SESSION_EXT_TABLE} WHERE session_id = ${b.p(sessionId)}`, b.values)).rows[0];
|
|
198
|
+
return row !== undefined && row[DELETING_TOKEN_COLUMN.name] === token;
|
|
199
|
+
},
|
|
200
|
+
pending: async () => {
|
|
201
|
+
const rows = (await this.db.query(`SELECT sm.session_id, sm.owner, se.${DELETING_TOKEN_COLUMN.name} AS token FROM session_meta sm JOIN ${SESSION_EXT_TABLE} se ON se.session_id = sm.session_id WHERE se.${DELETING_TOKEN_COLUMN.name} IS NOT NULL ORDER BY sm.session_id`, [])).rows;
|
|
202
|
+
return rows.map((r) => ({ sessionId: String(r.session_id), owner: r.owner ?? null, token: String(r.token) }));
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
async fenceDeletion(sessionId, owner, opts) {
|
|
206
|
+
const dialect = this.db.dialect;
|
|
207
|
+
const conn = await this.db.connect();
|
|
208
|
+
try {
|
|
209
|
+
await conn.begin();
|
|
210
|
+
const rows = async (sql, values) => (await conn.query(sql, [...values])).rows;
|
|
211
|
+
const root = (await rows(`SELECT owner, incarnation FROM session_meta WHERE session_id = ${dialect === "pg" ? "$1" : "?"} FOR UPDATE`, [sessionId]))[0];
|
|
212
|
+
if (root === undefined || (root.owner ?? null) !== owner) {
|
|
213
|
+
await conn.rollback();
|
|
214
|
+
return undefined;
|
|
215
|
+
}
|
|
216
|
+
const held = await readDeletingTokenOn(rows, dialect, sessionId);
|
|
217
|
+
if (held === null) {
|
|
218
|
+
if (opts.expect !== undefined) {
|
|
219
|
+
await conn.rollback();
|
|
220
|
+
return undefined;
|
|
221
|
+
}
|
|
222
|
+
const verdict = await judgeSessionWrite({ op: "delete", rootSessionId: sessionId }, { claim: () => readClaimOn(rows, dialect, sessionId), cell: async () => ({ role: "absent" }), deleting: async () => held });
|
|
223
|
+
if (verdict !== "proceed") {
|
|
224
|
+
await conn.rollback();
|
|
225
|
+
throw verdict.refuse;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
if (opts.expect !== undefined && held !== opts.expect) {
|
|
230
|
+
await conn.rollback();
|
|
231
|
+
return undefined;
|
|
232
|
+
}
|
|
233
|
+
if (holderMayBeAlive(opts.holder(held), held)) {
|
|
234
|
+
await conn.rollback();
|
|
235
|
+
return { inProgress: true };
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
const token = uuidv7();
|
|
239
|
+
const b = binder(dialect);
|
|
240
|
+
const res = await conn.query(`UPDATE ${SESSION_EXT_TABLE} SET ${DELETING_TOKEN_COLUMN.name} = ${b.p(token)} WHERE session_id = ${b.p(sessionId)}`, b.values);
|
|
241
|
+
if (res.affected !== 1)
|
|
242
|
+
throw new Error(`deletion fence of session ${sessionId}: the token write matched ${res.affected} row(s) of a side-table row this transaction ensured under a held root-row lock — engine/driver anomaly, refusing to guess`);
|
|
243
|
+
await conn.commit();
|
|
244
|
+
return { token, incarnation: incarnationFromCell(sessionId, root.incarnation, "absent") };
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
await conn.rollback().catch(() => undefined);
|
|
248
|
+
throw err;
|
|
249
|
+
}
|
|
250
|
+
finally {
|
|
251
|
+
conn.release();
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
get size() {
|
|
255
|
+
return this.seat.size;
|
|
256
|
+
}
|
|
257
|
+
dispose() {
|
|
258
|
+
this.seat.dispose();
|
|
259
|
+
}
|
|
260
|
+
async listSessions(opts) {
|
|
261
|
+
return (await this.listSessionRows(opts)).map((a) => a.row);
|
|
262
|
+
}
|
|
263
|
+
async listSessionRows(opts) {
|
|
264
|
+
const dialect = this.db.dialect;
|
|
265
|
+
return this.selectListRows({
|
|
266
|
+
limit: opts.limit,
|
|
267
|
+
where: (p) => {
|
|
268
|
+
const where = ["sm.placement_kind IS NULL"];
|
|
269
|
+
if (opts.owner !== undefined)
|
|
270
|
+
where.push(opts.includeUnowned ? `(sm.owner = ${p(opts.owner)} OR sm.owner IS NULL)` : `sm.owner = ${p(opts.owner)}`);
|
|
271
|
+
if (opts.q) {
|
|
272
|
+
const escape = dialect === "pg" ? "'\\'" : "'\\\\'";
|
|
273
|
+
where.push(`EXISTS (SELECT 1 FROM task_run tr WHERE tr.session_id = sm.session_id AND LOWER(tr.objective_preview) LIKE LOWER(${p(`%${escapeLike(opts.q)}%`)}) ESCAPE ${escape})`);
|
|
274
|
+
}
|
|
275
|
+
if (opts.cursor) {
|
|
276
|
+
const at = new Date(opts.cursor.lastActivityAt);
|
|
277
|
+
where.push(`(sm.updated_at < ${p(at)} OR (sm.updated_at = ${p(at)} AND sm.session_id < ${p(opts.cursor.sessionId)}))`);
|
|
278
|
+
}
|
|
279
|
+
return where;
|
|
280
|
+
},
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
async sessionSummaryOf(sessionId) {
|
|
284
|
+
return (await this.listRowOf(sessionId))?.row;
|
|
285
|
+
}
|
|
286
|
+
async listRowOf(sessionId) {
|
|
287
|
+
return (await this.selectListRows({ limit: 1, runSessionId: sessionId, where: (p) => ["sm.placement_kind IS NULL", `sm.session_id = ${p(sessionId)}`] }))[0];
|
|
288
|
+
}
|
|
289
|
+
async selectListRows(q) {
|
|
290
|
+
const dialect = this.db.dialect;
|
|
291
|
+
const b = binder(dialect);
|
|
292
|
+
const runWhere = () => (q.runSessionId !== undefined ? ` WHERE session_id = ${b.p(q.runSessionId)}` : "");
|
|
293
|
+
const runAnd = () => (q.runSessionId !== undefined ? ` AND session_id = ${b.p(q.runSessionId)}` : "");
|
|
294
|
+
const runCount = `LEFT JOIN (SELECT session_id, COUNT(*) AS run_count FROM task_run${runWhere()} GROUP BY session_id) r ON r.session_id = sm.session_id `;
|
|
295
|
+
const latest = dialect === "pg"
|
|
296
|
+
? "LEFT JOIN (SELECT DISTINCT ON (session_id) session_id, status, task_id, result ->> 'runId' AS last_task_run_id FROM task_run" +
|
|
297
|
+
runWhere() +
|
|
298
|
+
" ORDER BY session_id, created_at DESC, task_id DESC) latest ON latest.session_id = sm.session_id "
|
|
299
|
+
: "LEFT JOIN (SELECT session_id, status, task_id, last_task_run_id FROM (" +
|
|
300
|
+
" SELECT session_id, status, task_id, JSON_UNQUOTE(JSON_EXTRACT(result, '$.runId')) AS last_task_run_id, " +
|
|
301
|
+
" ROW_NUMBER() OVER (PARTITION BY session_id ORDER BY created_at DESC, task_id DESC) AS rn FROM task_run" +
|
|
302
|
+
runWhere() +
|
|
303
|
+
" ) lr WHERE rn = 1) latest ON latest.session_id = sm.session_id ";
|
|
304
|
+
const preview = dialect === "pg"
|
|
305
|
+
? `LEFT JOIN (SELECT DISTINCT ON (session_id) session_id, objective_preview FROM task_run WHERE ${RUN_PREVIEW_PRESENT}` +
|
|
306
|
+
runAnd() +
|
|
307
|
+
" ORDER BY session_id, created_at DESC, task_id DESC) pv ON pv.session_id = sm.session_id "
|
|
308
|
+
: "LEFT JOIN (SELECT session_id, objective_preview FROM (" +
|
|
309
|
+
" SELECT session_id, objective_preview, ROW_NUMBER() OVER (PARTITION BY session_id ORDER BY created_at DESC, task_id DESC) AS rn " +
|
|
310
|
+
`FROM task_run WHERE ${RUN_PREVIEW_PRESENT}` +
|
|
311
|
+
runAnd() +
|
|
312
|
+
" ) pr WHERE rn = 1) pv ON pv.session_id = sm.session_id ";
|
|
313
|
+
const where = [...q.where(b.p), `se.${DELETING_TOKEN_COLUMN.name} IS NULL`];
|
|
314
|
+
const sql = "SELECT sm.session_id, sm.owner, sm.incarnation, sm.updated_at AS last_activity, sm.created_at AS first_activity, sm.forked_from, se.title, se.pinned, " +
|
|
315
|
+
" COALESCE(r.run_count, 0) AS run_count, pv.objective_preview, latest.status, latest.task_id AS last_run_id, latest.last_task_run_id " +
|
|
316
|
+
"FROM session_meta sm " +
|
|
317
|
+
`LEFT JOIN ${SESSION_EXT_TABLE} se ON se.session_id = sm.session_id ` +
|
|
318
|
+
runCount +
|
|
319
|
+
latest +
|
|
320
|
+
preview +
|
|
321
|
+
"WHERE " + where.join(" AND ") + " " +
|
|
322
|
+
`ORDER BY sm.updated_at DESC, sm.session_id DESC LIMIT ${b.p(q.limit)}`;
|
|
323
|
+
const rows = (await this.db.query(sql, b.values)).rows;
|
|
324
|
+
return rows.map((r) => {
|
|
325
|
+
const runId = r.last_task_run_id;
|
|
326
|
+
const sessionId = String(r.session_id);
|
|
327
|
+
const owner = r.owner ?? null;
|
|
328
|
+
const incarnation = incarnationFromCell(sessionId, r.incarnation, "absent");
|
|
329
|
+
const title = r.title ?? null;
|
|
330
|
+
const pinned = pinnedOf(dialect, r.pinned);
|
|
331
|
+
const row = {
|
|
332
|
+
sessionId,
|
|
333
|
+
owner,
|
|
334
|
+
lastActivityAt: r.last_activity instanceof Date ? r.last_activity.toISOString() : String(r.last_activity),
|
|
335
|
+
firstActivityAt: r.first_activity instanceof Date ? r.first_activity.toISOString() : String(r.first_activity),
|
|
336
|
+
runCount: Number(r.run_count),
|
|
337
|
+
objectivePreview: r.objective_preview ?? null,
|
|
338
|
+
lastStatus: r.status == null ? "" : String(r.status),
|
|
339
|
+
lastRunId: r.last_run_id ?? null,
|
|
340
|
+
...(typeof runId === "string" && runId !== "" ? { lastTaskRunId: runId } : {}),
|
|
341
|
+
title,
|
|
342
|
+
pinned,
|
|
343
|
+
...sessionRowTagKey({ sessionId, owner, incarnation, cells: { title, pinned } }),
|
|
344
|
+
...listedLineageOf(sessionId, r.forked_from),
|
|
345
|
+
};
|
|
346
|
+
return { row, occupant: { owner, incarnation } };
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
async writeSessionRowCells(sessionId, cells, how) {
|
|
350
|
+
return writeSessionRowCellsSql(this.db, sessionId, cells, how, (id) => this.listRowOf(id));
|
|
351
|
+
}
|
|
352
|
+
async probeTitle(sessionId) {
|
|
353
|
+
const b = binder(this.db.dialect);
|
|
354
|
+
const row = (await this.db.query(`SELECT se.title FROM session_meta sm LEFT JOIN ${SESSION_EXT_TABLE} se ON se.session_id = sm.session_id WHERE sm.session_id = ${b.p(sessionId)}`, b.values)).rows[0];
|
|
355
|
+
if (row === undefined)
|
|
356
|
+
return "none";
|
|
357
|
+
return row.title === null || row.title === undefined ? "untitled" : "titled";
|
|
358
|
+
}
|
|
359
|
+
async setTitleIfNull(sessionId, title) {
|
|
360
|
+
return withLockedSessionExt(this.db, sessionId, {}, async (query) => {
|
|
361
|
+
const b = binder(this.db.dialect);
|
|
362
|
+
return (await query(`UPDATE ${SESSION_EXT_TABLE} SET title = ${b.p(title)} WHERE session_id = ${b.p(sessionId)} AND title IS NULL`, b.values)).affected > 0;
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
async readInstructionSource(sessionId) {
|
|
366
|
+
const b = binder(this.db.dialect);
|
|
367
|
+
const conn = await this.db.connect();
|
|
368
|
+
try {
|
|
369
|
+
const row = (await conn.query(`SELECT instruction_source FROM ${SESSION_EXT_TABLE} WHERE session_id = ${b.p(sessionId)}`, b.values, BASELINE_STATEMENT)).rows[0];
|
|
370
|
+
return decodeInstructionSource(row?.instruction_source);
|
|
371
|
+
}
|
|
372
|
+
finally {
|
|
373
|
+
conn.release();
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
async recordInstructionSource(sessionId, expected, source) {
|
|
377
|
+
const next = encodeInstructionSource(source);
|
|
378
|
+
await withLockedSessionExt(this.db, sessionId, { statement: BASELINE_STATEMENT }, async (query) => {
|
|
379
|
+
const b = binder(this.db.dialect);
|
|
380
|
+
const text = `UPDATE ${SESSION_EXT_TABLE} SET instruction_source = ${b.p(next)} WHERE session_id = ${b.p(sessionId)} AND ${expected.recorded ? `instruction_source = ${b.p(encodeInstructionSource(expected.source))}` : "instruction_source IS NULL"}`;
|
|
381
|
+
return (await query(text, b.values)).affected > 0;
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
async readSessionWorkspace(sessionId) {
|
|
385
|
+
const b = binder(this.db.dialect);
|
|
386
|
+
const row = (await this.db.query(`SELECT ${jsonColumnText(this.db.dialect, "workspace")} FROM ${SESSION_EXT_TABLE} WHERE session_id = ${b.p(sessionId)}`, b.values)).rows[0];
|
|
387
|
+
return row === undefined ? undefined : decodeSessionWorkspaceCell(row.workspace, sessionId);
|
|
388
|
+
}
|
|
389
|
+
async recordSessionWorkspace(sessionId, incarnation, workspace) {
|
|
390
|
+
const dialect = this.db.dialect;
|
|
391
|
+
const cell = encodeSessionWorkspaceCell(workspace, dialect === "pg" ? pgSafeJsonStringify : JSON.stringify, sessionId);
|
|
392
|
+
await withLockedSessionExt(this.db, sessionId, { where: (p) => `incarnation = ${p(incarnation)}` }, async (query) => {
|
|
393
|
+
const b = binder(dialect);
|
|
394
|
+
return (await query(`UPDATE ${SESSION_EXT_TABLE} SET workspace = ${b.p(cell)}${dialect === "pg" ? "::jsonb" : ""} WHERE session_id = ${b.p(sessionId)}`, b.values)).affected > 0;
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
//# sourceMappingURL=session-store-sql.js.map
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* **条件撤回的部署那一半**(SQL 两方言;规则在 `plugins/session-birth.ts` 头注)—— 会话店座(`stores-sql/tidb-session-store.ts` 的 `withdrawSessionOn`,
|
|
3
|
+
* PG 孪生同调)锁住根行、判完化身 / 内容 / 认领之后,在**同一事务、同一连接**上问部署:启用标记、客户端写计数、别的 run;放行 ⇒ 删本次 run 的部署行。
|
|
4
|
+
* 客户端写计数的 +1 也在这里一处:四个 SQL 写者里不在自己 UPDATE 里带它的那几个(导入、会话规则、附件绑定)调 {@link countClientWriteOn}。
|
|
5
|
+
* 每一读都是锁定读(`FOR UPDATE`;TiDB 悲观事务里普通 SELECT 读事务开始时的快照,看不到等根锁期间别人提交的写)。
|
|
6
|
+
*/
|
|
7
|
+
import type { SqlDialect } from "./sql-driver.js";
|
|
8
|
+
import type { WithdrawJudgeVerdict } from "../session-incarnation.js";
|
|
9
|
+
/**
|
|
10
|
+
* 判据与计数句只用到的那一面:一句语句、交回行(会话店交给部署钩的事务语句面 `SessionTxStatements`、驱动的事务连接 `SqlTxConn` 都满足它 ——
|
|
11
|
+
* 结构型,本部署不读店目录里的型)。
|
|
12
|
+
*/
|
|
13
|
+
export interface WithdrawStatementFace {
|
|
14
|
+
query(sql: string, params?: unknown[]): Promise<{
|
|
15
|
+
readonly rows: ReadonlyArray<Readonly<Record<string, unknown>>>;
|
|
16
|
+
}>;
|
|
17
|
+
}
|
|
18
|
+
/** 撤回出口的启用标记在标记表(`plugins/one-time-migration-marker.ts`)里的键 = 落它的一次性迁移(窗口见 `plugins/one-time-migrations.ts` 登记表 M43 行)。 */
|
|
19
|
+
export declare const WITHDRAW_MARK_ID = "M43";
|
|
20
|
+
/**
|
|
21
|
+
* 部署判据(一次提交的一只候选;`ownTaskId` = 本次提交认领赢的那条 run):
|
|
22
|
+
* · 启用标记(M43)不在 ⇒ `upgrade_pending`(混跑窗里旧副本的写者不递增计数,判不出「没人写过」⇒ 一律留);
|
|
23
|
+
* · 客户端写计数 > 0 ⇒ `client_writes`(先补旁表行再锁定读 —— 锁定读落在在的行上,见 `execution-placement-sql.ts` 的写序律);
|
|
24
|
+
* · 本会话有本次 run 之外的 run 行 ⇒ `runs`;
|
|
25
|
+
* · 放行 ⇒ 同一语句面上删本次 run 的部署行(账本事件 / 认领 / run 行)与本会话的续跑输入(别的 run 都不在 ⇒ 那一行只能是本次写的)。
|
|
26
|
+
*/
|
|
27
|
+
export declare function createSqlWithdrawJudge(dialect: SqlDialect, sessionId: string, ownTaskId: string | undefined): (tx: WithdrawStatementFace) => Promise<WithdrawJudgeVerdict>;
|
|
28
|
+
/**
|
|
29
|
+
* 一次客户端写:补旁表行 + 锁定读在删令牌 + 计数 +1(调用方已在同一事务里锁住根行、根行在)。会话规则、附件绑定两个 SQL 写者调这一只(会话规则店收它作构造参数,组合座交入,店目录不读部署);
|
|
30
|
+
* 这只会话在删(会话三态,`src/session-deletion.ts`)⇒ 抛 `SessionDeletingError`,调用方的写不发生(删除级联的规则 / 附件腿之后到的写不复活它们;local 孪生 = 会话店 `withClientWrite` 的计数口同判)。
|
|
31
|
+
* 导入臂的旁表行已由锁它的那一读补过,只调计数那一句 {@link bumpClientWritesOn};标题 / 置顶的写者在自己的 UPDATE 里带 `BUMP_CLIENT_WRITES`(`session-row-sql.ts`)。
|
|
32
|
+
*/
|
|
33
|
+
export declare function countClientWriteOn(tx: WithdrawStatementFace, dialect: SqlDialect, sessionId: string): Promise<void>;
|
|
34
|
+
/** 客户端写计数 +1 的那一句(前提:同一事务里根行已锁、旁表行已在)。 */
|
|
35
|
+
export declare function bumpClientWritesOn(tx: WithdrawStatementFace, dialect: SqlDialect, sessionId: string): Promise<void>;
|
|
36
|
+
//# sourceMappingURL=session-withdraw-sql.d.ts.map
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { BUMP_CLIENT_WRITES, ensureSessionExtRowStatement, readDeletingTokenOn, SESSION_EXT_TABLE } from "./session-ext-table.js";
|
|
2
|
+
import { SessionDeletingError } from "../execution-placement.js";
|
|
3
|
+
import { MIGRATION_MARKER_TABLE } from "./one-time-migration-marker.js";
|
|
4
|
+
function placeholders(dialect, from, count) {
|
|
5
|
+
return Array.from({ length: count }, (_, i) => (dialect === "pg" ? `$${from + i}` : "?"));
|
|
6
|
+
}
|
|
7
|
+
export const WITHDRAW_MARK_ID = "M43";
|
|
8
|
+
export function createSqlWithdrawJudge(dialect, sessionId, ownTaskId) {
|
|
9
|
+
const [p1, p2] = placeholders(dialect, 1, 2);
|
|
10
|
+
return async (tx) => {
|
|
11
|
+
const mark = await tx.query(`SELECT migration_id FROM ${MIGRATION_MARKER_TABLE} WHERE migration_id = ${p1}`, [WITHDRAW_MARK_ID]);
|
|
12
|
+
if (mark.rows.length === 0)
|
|
13
|
+
return { keep: "upgrade_pending" };
|
|
14
|
+
const ensure = ensureSessionExtRowStatement(dialect, sessionId);
|
|
15
|
+
await tx.query(ensure.text, [...ensure.values]);
|
|
16
|
+
const ext = (await tx.query(`SELECT client_writes FROM ${SESSION_EXT_TABLE} WHERE session_id = ${p1} FOR UPDATE`, [sessionId])).rows[0];
|
|
17
|
+
if (Number(ext?.client_writes ?? 0) > 0)
|
|
18
|
+
return { keep: "client_writes" };
|
|
19
|
+
const others = ownTaskId === undefined
|
|
20
|
+
? await tx.query(`SELECT task_id FROM task_run WHERE session_id = ${p1} LIMIT 1 FOR UPDATE`, [sessionId])
|
|
21
|
+
: await tx.query(`SELECT task_id FROM task_run WHERE session_id = ${p1} AND task_id <> ${p2} LIMIT 1 FOR UPDATE`, [sessionId, ownTaskId]);
|
|
22
|
+
if (others.rows.length > 0)
|
|
23
|
+
return { keep: "runs" };
|
|
24
|
+
if (ownTaskId !== undefined) {
|
|
25
|
+
await tx.query(`DELETE FROM task_event WHERE task_id = ${p1}`, [ownTaskId]);
|
|
26
|
+
await tx.query(`DELETE FROM task_active WHERE task_id = ${p1}`, [ownTaskId]);
|
|
27
|
+
await tx.query(`DELETE FROM task_run WHERE task_id = ${p1}`, [ownTaskId]);
|
|
28
|
+
}
|
|
29
|
+
await tx.query(`DELETE FROM checkpoint_ctx WHERE session_id = ${p1}`, [sessionId]);
|
|
30
|
+
return "proceed";
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export async function countClientWriteOn(tx, dialect, sessionId) {
|
|
34
|
+
if ((await readDeletingTokenOn(async (sql, values) => (await tx.query(sql, [...values])).rows, dialect, sessionId)) !== null)
|
|
35
|
+
throw new SessionDeletingError(sessionId);
|
|
36
|
+
await bumpClientWritesOn(tx, dialect, sessionId);
|
|
37
|
+
}
|
|
38
|
+
export async function bumpClientWritesOn(tx, dialect, sessionId) {
|
|
39
|
+
const [p1] = placeholders(dialect, 1, 1);
|
|
40
|
+
await tx.query(`UPDATE ${SESSION_EXT_TABLE} SET ${BUMP_CLIENT_WRITES} WHERE session_id = ${p1}`, [sessionId]);
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=session-withdraw-sql.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { SessionWorkspace } from "../session-workspace.js";
|
|
2
2
|
import { type JsonColumnReader } from "./sql-json-column.js";
|
|
3
|
-
/** 列定义的唯一属主(
|
|
4
|
-
export declare const
|
|
3
|
+
/** 列定义的唯一属主(旁表建表句内插它,`session-ext-table.ts`)。 */
|
|
4
|
+
export declare const SESSION_WORKSPACE_COLUMN: {
|
|
5
5
|
readonly name: "workspace";
|
|
6
6
|
readonly mysql: "workspace JSON NULL";
|
|
7
7
|
readonly pg: "workspace JSONB";
|