@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,4 +1,4 @@
|
|
|
1
|
-
import { SESSION_EXT_TABLE, ensureSessionExtRowStatement } from "./session-ext-table.js";
|
|
1
|
+
import { BUMP_CLIENT_WRITES, SESSION_EXT_TABLE, ensureSessionExtRowStatement } from "./session-ext-table.js";
|
|
2
2
|
import { incarnationFromCell } from "../session-incarnation.js";
|
|
3
3
|
import { judgeSessionRowWrite, settleSessionRowWrite, } from "../session-row.js";
|
|
4
4
|
function binder(dialect) {
|
|
@@ -60,8 +60,8 @@ export async function writeSessionRowCellsSql(db, sessionId, cells, how, readAns
|
|
|
60
60
|
sets.push(`title = ${w.p(cells.title)}`);
|
|
61
61
|
if (cells.pinned !== undefined)
|
|
62
62
|
sets.push(`pinned = ${w.p(cells.pinned)}`);
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
sets.push(BUMP_CLIENT_WRITES);
|
|
64
|
+
await conn.query(`UPDATE ${SESSION_EXT_TABLE} SET ${sets.join(", ")} WHERE session_id = ${w.p(sessionId)}`, w.values);
|
|
65
65
|
await conn.commit();
|
|
66
66
|
}
|
|
67
67
|
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* run 账里「每会话的 run 投影」的**唯一 JS 规则**({@link SessionRunRollup} 的五位)—— 文件 / 内存两只 run 店的窄读面
|
|
3
|
+
* (`SessionRunRollupSource.sessionRunRollups`)都调这一只;SQL 侧是会话店列表投影里的子查询文本(`plugins/session-store-sql.ts` 的 `selectListRows`),
|
|
4
|
+
* 两侧由同一张用例表钉同读数(`test/helpers/session-preview-cases.ts`)。
|
|
5
|
+
*
|
|
6
|
+
* 律:
|
|
7
|
+
* · 排序口径 `created_at DESC, task_id DESC`(与 SQL 的 rn=1 窗函数 / `DISTINCT ON` 逐字同一句);
|
|
8
|
+
* · `runCount` = 全部行数;`lastStatus` / `lastRunId` / `lastTaskRunId` = 最新一条(rn=1)的状态 / task_id / `result.runId`(非空串才铸键);
|
|
9
|
+
* · `objectivePreview` = 同一排序下第一条「预览列是串且 `length > 0`」的那一列,没有 ⇒ `null` —— 按字符长度判,不按与 `""` 比较
|
|
10
|
+
* (只空格的老值 `" "` 算有;SQL 侧 `CHAR_LENGTH(…) > 0` 同读,`<> ''` 在 PAD SPACE 排序规则下会把它当空);
|
|
11
|
+
* · `q`(非空)⇒ 只交「有一条行的预览列含 q」的会话(两边转小写后按字面包含;SQL 侧 `LOWER(…) LIKE LOWER(…)` + `ESCAPE`)。
|
|
12
|
+
*
|
|
13
|
+
* 单遍、不排序、不把一只会话的行展开成函数实参(一只会话的行数没有上界:展开约 12.5 万条就是 `RangeError`,而 local 列表读的是全账)。
|
|
14
|
+
*/
|
|
15
|
+
import type { SessionRunRollup } from "./store-contracts.js";
|
|
16
|
+
/** 一条 run 行在本规则眼里的六格(两只店的行形结构上都满足它)。`objectivePreview` 可缺席(公开快照之前写下、没有这一键的 run.json)= 不是串 ⇒ 跳过。 */
|
|
17
|
+
export interface SessionRunRollupRow {
|
|
18
|
+
readonly sessionId: string;
|
|
19
|
+
readonly taskId: string;
|
|
20
|
+
readonly createdAt: Date;
|
|
21
|
+
readonly status: string;
|
|
22
|
+
readonly objectivePreview?: string | null;
|
|
23
|
+
readonly result: unknown;
|
|
24
|
+
}
|
|
25
|
+
/** 一次读的结果:有 run 行的每只会话 → 五位;`q` 非空 ⇒ 只留命中的会话。 */
|
|
26
|
+
export declare function buildSessionRunRollups(rows: Iterable<SessionRunRollupRow>, opts?: {
|
|
27
|
+
readonly q?: string;
|
|
28
|
+
}): ReadonlyMap<string, SessionRunRollup>;
|
|
29
|
+
//# sourceMappingURL=session-run-rollup.d.ts.map
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
const newer = (a, b) => {
|
|
2
|
+
const ta = a.createdAt.getTime();
|
|
3
|
+
const tb = b.createdAt.getTime();
|
|
4
|
+
return ta > tb || (ta === tb && a.taskId > b.taskId);
|
|
5
|
+
};
|
|
6
|
+
const hasPreview = (r) => typeof r.objectivePreview === "string" && r.objectivePreview.length > 0;
|
|
7
|
+
export function buildSessionRunRollups(rows, opts = {}) {
|
|
8
|
+
const needle = opts.q ? opts.q.toLowerCase() : undefined;
|
|
9
|
+
const acc = new Map();
|
|
10
|
+
for (const r of rows) {
|
|
11
|
+
const hit = needle !== undefined && typeof r.objectivePreview === "string" && r.objectivePreview.toLowerCase().includes(needle);
|
|
12
|
+
const cur = acc.get(r.sessionId);
|
|
13
|
+
if (cur === undefined) {
|
|
14
|
+
acc.set(r.sessionId, { count: 1, latest: r, withPreview: hasPreview(r) ? r : undefined, hit });
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
cur.count += 1;
|
|
18
|
+
if (newer(r, cur.latest))
|
|
19
|
+
cur.latest = r;
|
|
20
|
+
if (hasPreview(r) && (cur.withPreview === undefined || newer(r, cur.withPreview)))
|
|
21
|
+
cur.withPreview = r;
|
|
22
|
+
if (hit)
|
|
23
|
+
cur.hit = true;
|
|
24
|
+
}
|
|
25
|
+
const out = new Map();
|
|
26
|
+
for (const [sessionId, a] of acc) {
|
|
27
|
+
if (needle !== undefined && !a.hit)
|
|
28
|
+
continue;
|
|
29
|
+
const runId = a.latest.result?.runId;
|
|
30
|
+
out.set(sessionId, {
|
|
31
|
+
runCount: a.count,
|
|
32
|
+
lastStatus: a.latest.status,
|
|
33
|
+
lastRunId: a.latest.taskId,
|
|
34
|
+
...(typeof runId === "string" && runId !== "" ? { lastTaskRunId: runId } : {}),
|
|
35
|
+
objectivePreview: a.withPreview?.objectivePreview ?? null,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return out;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=session-run-rollup.js.map
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* ## 两半,一只店
|
|
5
5
|
* · **座**(`src/stores-sql/` 的方言店):引擎座表 `session_meta` / `session_event` 的唯一写者 —— 唤醒、追加、fork、导入、暂存、删除。
|
|
6
6
|
* · **部署格**(本模块):本服务记在一只会话上的格,全部住旁表 `session_ext`(属主 `session-ext-table.ts`)—— 列表投影的标题 / 置顶 / 行标签、
|
|
7
|
-
* 换源通告的基线、位置与项目、执行放置那一格与 fork 键。读引擎座表只经它的公布列(
|
|
7
|
+
* 换源通告的基线、位置与项目、执行放置那一格与 fork 键。读引擎座表只经它的公布列(身份、属主、化身、时刻、委派判别位、fork 谱系的源 id);写只写旁表。
|
|
8
8
|
* 座在它的写事务里锁住根行之后调部署的**事务内钩**({@link createSqlSessionWriteHooks},契约在 `stores-sql/session-write-hooks.ts`)——
|
|
9
9
|
* 认领、本处写者、导入落 mirror、fork 键都在座的同一事务里由钩判 / 写(同事务两句:锁根行一句、钩的读写各一句)。
|
|
10
10
|
*
|
|
@@ -17,17 +17,19 @@
|
|
|
17
17
|
* 每个格写者在一只事务里:锁根 `session_meta` 行(行不在 ⇒ 不写)→ 补旁表行(行在不动)→ 要判格的再锁定读那一行 → 一句按 `session_id` 定址的格写。根行先 ⇒ 与座的删除 /
|
|
18
18
|
* 导入 / 换装同一锁序,外键的补行不会与删除的级联互等;补行先于锁定读 ⇒ 锁定读永远落在一行在的记录上(不拿 InnoDB 间隙锁)。
|
|
19
19
|
*/
|
|
20
|
-
import type
|
|
20
|
+
import { type AcquiredSession, type PlacedSessionRow, type SessionHead, type SessionPlacementRecord, type SessionStore, type SessionTreeEntry } from "@sema-agent/core";
|
|
21
21
|
import type { TiDBSessionStore } from "../stores-sql/tidb-session-store.js";
|
|
22
22
|
import type { SessionWriteHooks } from "../stores-sql/session-write-hooks.js";
|
|
23
23
|
import type { SqlDriver } from "./sql-driver.js";
|
|
24
24
|
import { type ExecutionPlacementSeat } from "../execution-placement.js";
|
|
25
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";
|
|
26
28
|
import { type ClientSessionRowWrite, type ReplaySessionRowWrite, type ReplaySessionRowWriteOutcome, type SessionRowAnswer, type SessionRowPatch, type SessionRowWriteOutcome } from "../session-row.js";
|
|
27
29
|
import type { SessionSummary } from "./store-contracts.js";
|
|
28
30
|
import type { SessionWorkspace } from "../session-workspace.js";
|
|
29
31
|
/** 座的面:座的公开成员(两方言同形 —— PG 孪生按结构赋给它,组合座里 tsc 判)。 */
|
|
30
|
-
export type SessionSeat = Pick<TiDBSessionStore, "retention" | "placements" | "durability" | "acquire" | "register" | "placementOf" | "listPlaced" | "headOf" | "touch" | "release" | "forget" | "fork" | "forkTo" | "exportEntries" | "listEntryIds" | "exportEntriesStream" | "importEntries" | "replaceEntries" | "beginImportStaging" | "readStagedEntries" | "sweepStagingSessions" | "
|
|
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">;
|
|
31
33
|
/** 列表面的查询(`OwnerAwareSessionStore.listSessions` 的入参形)。 */
|
|
32
34
|
export interface SessionListOptions {
|
|
33
35
|
owner?: string;
|
|
@@ -41,8 +43,9 @@ export interface SessionListOptions {
|
|
|
41
43
|
}
|
|
42
44
|
/**
|
|
43
45
|
* 会话店的事务内钩(座锁住根行之后、写之前调;同一事务、同一连接):
|
|
44
|
-
* ·
|
|
45
|
-
*
|
|
46
|
+
* · 四个词同一只判官 {@link judgeSessionWrite}(local 店的写锁内同调这一只):`erase` 只判这一行的在删令牌(不是 ⇒ 拒 `SessionDeletionSupersededError`);其余认领在 ⇒ 拒 `SessionActiveRunError`;
|
|
47
|
+
* `import` 再判这一处是写者 ⇒ 拒 `SessionWriterPresentError`;
|
|
48
|
+
* · `import` 放行 ⇒ 这一格落 mirror(写者在别处)、客户端写计数 +1;删除三词放行 ⇒ 什么都不写(级联随根行带走旁表行,钩不另删);
|
|
46
49
|
* · 键控 fork(服务扩展)—— `record`:新行的 fork 键落旁表(新行是本事务刚插下的,本事务持着它的锁);`targetOf`:撞上已在的目标时的一次池读(属主 + fork 键)。
|
|
47
50
|
*/
|
|
48
51
|
export declare function createSqlSessionWriteHooks(db: Pick<SqlDriver, "dialect" | "query">): SessionWriteHooks;
|
|
@@ -60,9 +63,19 @@ export declare class SqlSessionStore implements SessionStore {
|
|
|
60
63
|
constructor(db: SqlDriver, seatOn: (hooks: SessionWriteHooks) => SessionSeat);
|
|
61
64
|
acquire(...a: Parameters<SessionSeat["acquire"]>): Promise<AcquiredSession>;
|
|
62
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>;
|
|
63
70
|
placementOf(sessionId: string): Promise<SessionPlacementRecord | undefined>;
|
|
64
71
|
listPlaced(...a: Parameters<SessionSeat["listPlaced"]>): Promise<PlacedSessionRow[]>;
|
|
72
|
+
/**
|
|
73
|
+
* 按 id 读一行(属主 / 住客 / 叶子一次读)—— 座的那一读加一条「不在删」:在删的行对删除门之外的读者读作不在(会话三态,`src/session-deletion.ts`)。
|
|
74
|
+
* 一条 PK SELECT(根行 LEFT JOIN 旁表行),不上锁。
|
|
75
|
+
*/
|
|
65
76
|
headOf(sessionId: string): Promise<SessionHead | undefined>;
|
|
77
|
+
/** 删除门的头读(`OwnerAwareSessionStore.deletionHeadOf`):活行 ∪ 在删行 —— 座的原始一读。开始删它的那位属主重发删除(= 接管)就过得了门;别人得到与「不在」同一句。 */
|
|
78
|
+
deletionHeadOf(sessionId: string): Promise<SessionHead | undefined>;
|
|
66
79
|
touch(sessionId: string): Promise<void>;
|
|
67
80
|
release(sessionId: string): Promise<void>;
|
|
68
81
|
forget(sessionId: string): void;
|
|
@@ -76,28 +89,41 @@ export declare class SqlSessionStore implements SessionStore {
|
|
|
76
89
|
beginImportStaging(...a: Parameters<SessionSeat["beginImportStaging"]>): ReturnType<SessionSeat["beginImportStaging"]>;
|
|
77
90
|
readStagedEntries(stagingId: string): Promise<SessionTreeEntry[]>;
|
|
78
91
|
sweepStagingSessions(): Promise<number>;
|
|
79
|
-
|
|
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;
|
|
80
102
|
get size(): number;
|
|
81
103
|
dispose(): void;
|
|
82
104
|
/**
|
|
83
105
|
* E16 — list the caller's sessions (CC /resume picker), keyset-paginated newest-first by last activity. Session IDENTITY/enumeration comes from
|
|
84
|
-
* `session_meta` (owner-filtered on its owner column); the side table supplies the title / pin;
|
|
85
|
-
*
|
|
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)`.
|
|
86
108
|
*/
|
|
87
109
|
listSessions(opts: SessionListOptions): Promise<SessionSummary[]>;
|
|
88
110
|
/** {@link listSessions} with each row's occupant (owner + incarnation) from the same SELECT — `OwnerAwareSessionStore.listSessionRows`; the incarnation never enters the row. */
|
|
89
111
|
listSessionRows(opts: SessionListOptions): Promise<Array<SessionRowAnswer<SessionSummary>>>;
|
|
90
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
|
|
91
|
-
* (no such session / placed). The run
|
|
113
|
+
* (no such session / placed). The run subqueries are scoped to the same id. */
|
|
92
114
|
sessionSummaryOf(sessionId: string): Promise<SessionSummary | undefined>;
|
|
93
115
|
/** {@link sessionSummaryOf} 那一读 + 读到它时行上的住客(写原语的应答行要复核住客,`settleSessionRowWrite`)。 */
|
|
94
116
|
private listRowOf;
|
|
95
117
|
/**
|
|
96
118
|
* The list projection's ONE SELECT + row mapper ({@link listSessions} and {@link sessionSummaryOf} both read through it). `runSessionId` scopes the
|
|
97
|
-
*
|
|
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,
|
|
98
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.
|
|
99
|
-
* The run
|
|
100
|
-
*
|
|
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).
|
|
101
127
|
*/
|
|
102
128
|
private selectListRows;
|
|
103
129
|
/**
|
|
@@ -1,14 +1,19 @@
|
|
|
1
|
+
import { uuidv7 } from "@sema-agent/core";
|
|
1
2
|
import { escapeLike } from "./sql-escape.js";
|
|
2
3
|
import { jsonColumnText } from "./sql-json-column.js";
|
|
3
4
|
import { pgSafeJsonStringify } from "./pg-safe-json.js";
|
|
4
|
-
import { SESSION_EXT_TABLE, ensureSessionExtRowStatement } from "./session-ext-table.js";
|
|
5
|
+
import { DELETING_TOKEN_COLUMN, SESSION_EXT_TABLE, ensureSessionExtRowStatement, readDeletingTokenOn } from "./session-ext-table.js";
|
|
5
6
|
import { decodeSessionWorkspaceCell, encodeSessionWorkspaceCell } from "./session-workspace-cell.js";
|
|
6
7
|
import { createSqlExecutionPlacementSeat, markMirrorStatement, readCellOn, readClaimOn, writeCellOn } from "./execution-placement-sql.js";
|
|
7
|
-
import {
|
|
8
|
+
import { judgeSessionWrite, sessionWriteTouchesCell } from "../execution-placement.js";
|
|
8
9
|
import { BASELINE_IO_DEADLINE_MS, decodeInstructionSource, encodeInstructionSource } from "../instruction-source-notice.js";
|
|
9
|
-
import { incarnationFromCell } from "../session-incarnation.js";
|
|
10
|
+
import { forkLineageOfRow, headFromRow, incarnationFromCell } from "../session-incarnation.js";
|
|
11
|
+
import { CROSS_PROCESS_TAKEOVER_AFTER_MS, deletionTokenMintedAt } from "../session-deletion.js";
|
|
10
12
|
import { sessionRowTagKey } from "../session-row.js";
|
|
11
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";
|
|
12
17
|
function binder(dialect) {
|
|
13
18
|
const values = [];
|
|
14
19
|
return {
|
|
@@ -26,24 +31,14 @@ export function createSqlSessionWriteHooks(db) {
|
|
|
26
31
|
async beforeCommit(txn, write) {
|
|
27
32
|
const rows = rowsOnTxn(txn);
|
|
28
33
|
const root = write.rootSessionId;
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
return "proceed";
|
|
36
|
-
}
|
|
37
|
-
case "delete":
|
|
38
|
-
case "retention-delete": {
|
|
39
|
-
const claim = await readClaimOn(rows, dialect, root);
|
|
40
|
-
return claim === null ? "proceed" : { refuse: new SessionActiveRunError(root, claim) };
|
|
41
|
-
}
|
|
42
|
-
default: {
|
|
43
|
-
const unknownOp = write.op;
|
|
44
|
-
throw new Error(`session write hooks: no write ${JSON.stringify(unknownOp)}`);
|
|
45
|
-
}
|
|
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);
|
|
46
40
|
}
|
|
41
|
+
return "proceed";
|
|
47
42
|
},
|
|
48
43
|
keyedFork: {
|
|
49
44
|
async record(txn, fork) {
|
|
@@ -91,6 +86,22 @@ async function withLockedSessionExt(db, sessionId, lock, write) {
|
|
|
91
86
|
}
|
|
92
87
|
}
|
|
93
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
|
+
}
|
|
94
105
|
export class SqlSessionStore {
|
|
95
106
|
db;
|
|
96
107
|
seat;
|
|
@@ -112,13 +123,32 @@ export class SqlSessionStore {
|
|
|
112
123
|
register(sessionId, owner) {
|
|
113
124
|
return this.seat.register(sessionId, owner);
|
|
114
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
|
+
}
|
|
115
137
|
placementOf(sessionId) {
|
|
116
138
|
return this.seat.placementOf(sessionId);
|
|
117
139
|
}
|
|
118
140
|
listPlaced(...a) {
|
|
119
141
|
return this.seat.listPlaced(...a);
|
|
120
142
|
}
|
|
121
|
-
headOf(sessionId) {
|
|
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) {
|
|
122
152
|
return this.seat.headOf(sessionId);
|
|
123
153
|
}
|
|
124
154
|
touch(sessionId) {
|
|
@@ -160,8 +190,66 @@ export class SqlSessionStore {
|
|
|
160
190
|
sweepStagingSessions() {
|
|
161
191
|
return this.seat.sweepStagingSessions();
|
|
162
192
|
}
|
|
163
|
-
|
|
164
|
-
|
|
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
|
+
}
|
|
165
253
|
}
|
|
166
254
|
get size() {
|
|
167
255
|
return this.seat.size;
|
|
@@ -202,24 +290,35 @@ export class SqlSessionStore {
|
|
|
202
290
|
const dialect = this.db.dialect;
|
|
203
291
|
const b = binder(dialect);
|
|
204
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)}` : "");
|
|
205
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 `;
|
|
206
295
|
const latest = dialect === "pg"
|
|
207
|
-
? "LEFT JOIN (SELECT DISTINCT ON (session_id) session_id,
|
|
296
|
+
? "LEFT JOIN (SELECT DISTINCT ON (session_id) session_id, status, task_id, result ->> 'runId' AS last_task_run_id FROM task_run" +
|
|
208
297
|
runWhere() +
|
|
209
298
|
" ORDER BY session_id, created_at DESC, task_id DESC) latest ON latest.session_id = sm.session_id "
|
|
210
|
-
: "LEFT JOIN (SELECT session_id,
|
|
211
|
-
" SELECT 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, " +
|
|
212
301
|
" ROW_NUMBER() OVER (PARTITION BY session_id ORDER BY created_at DESC, task_id DESC) AS rn FROM task_run" +
|
|
213
302
|
runWhere() +
|
|
214
303
|
" ) lr WHERE rn = 1) latest ON latest.session_id = sm.session_id ";
|
|
215
|
-
const
|
|
216
|
-
|
|
217
|
-
|
|
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 " +
|
|
218
316
|
"FROM session_meta sm " +
|
|
219
317
|
`LEFT JOIN ${SESSION_EXT_TABLE} se ON se.session_id = sm.session_id ` +
|
|
220
318
|
runCount +
|
|
221
319
|
latest +
|
|
222
|
-
|
|
320
|
+
preview +
|
|
321
|
+
"WHERE " + where.join(" AND ") + " " +
|
|
223
322
|
`ORDER BY sm.updated_at DESC, sm.session_id DESC LIMIT ${b.p(q.limit)}`;
|
|
224
323
|
const rows = (await this.db.query(sql, b.values)).rows;
|
|
225
324
|
return rows.map((r) => {
|
|
@@ -242,6 +341,7 @@ export class SqlSessionStore {
|
|
|
242
341
|
title,
|
|
243
342
|
pinned,
|
|
244
343
|
...sessionRowTagKey({ sessionId, owner, incarnation, cells: { title, pinned } }),
|
|
344
|
+
...listedLineageOf(sessionId, r.forked_from),
|
|
245
345
|
};
|
|
246
346
|
return { row, occupant: { owner, incarnation } };
|
|
247
347
|
});
|
|
@@ -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,72 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* [ref] — the SQL `SharedMemoryStoreProvider`: the deployment's ORG-scoped shared memory libraries
|
|
3
|
-
* (`memory_list` / `memory_read`), served out of the durable store instead of a BYOM host callback.
|
|
4
|
-
*
|
|
5
|
-
* ─────────────────────────────────────────────────────────────────────────────────────────────────
|
|
6
|
-
* WHAT THIS IS (and, just as load-bearing, what it is NOT)
|
|
7
|
-
* ─────────────────────────────────────────────────────────────────────────────────────────────────
|
|
8
|
-
* core's seam is a document-only READ face reached exclusively through two tools. There is no model
|
|
9
|
-
* write channel at all — write governance is the environment's, and the tool face's entire
|
|
10
|
-
* participation in it is relaying each store's `writable` bit verbatim. This module keeps that shape:
|
|
11
|
-
* {@link SqlSharedMemoryStore.snapshot} is the only method core ever calls; the `put*`/`delete*` half
|
|
12
|
-
* is the DEPLOYMENT's admin plane (migrations, an import job, an operator face) and is deliberately
|
|
13
|
-
* NOT reachable from any model-facing surface in this repo.
|
|
14
|
-
*
|
|
15
|
-
* 🔴 ORG PLANE ≠ THE LOCAL MEMORY CHAIN (设计 182 §13). `agent_memory_engine_*` (the [ref]
|
|
16
|
-
* MemoryEngine) and these three tables share NOTHING: no join, no view, no shared row, no shared
|
|
17
|
-
* scope registry. The local chain is an entry-transactional index injection with a write path; this
|
|
18
|
-
* one is a read-only document library. Bridging them in EITHER direction would let harvested private
|
|
19
|
-
* notes leak into a team library (or a team library into a model-writable disk), which is exactly the
|
|
20
|
-
* boundary core's seam doc draws. If a future feature needs both, it composes them ABOVE this layer.
|
|
21
|
-
*
|
|
22
|
-
* ─────────────────────────────────────────────────────────────────────────────────────────────────
|
|
23
|
-
* AUTHORIZATION (v2/F4) — server-side, injected, never inferred here
|
|
24
|
-
* ─────────────────────────────────────────────────────────────────────────────────────────────────
|
|
25
|
-
* `SharedMemoryRequestContext` carries the caller's `principal`. Who belongs to `org:acme` is NOT this
|
|
26
|
-
* module's question: it takes a {@link SharedMemoryScopeAuthorizer} and serves exactly the scopes that
|
|
27
|
-
* verdict names. The production binding folds the SAME `OrgMemoryDirectory` instance the memory-policy
|
|
28
|
-
* face and core's admission seam already read (`src/shared-memory-scope-authorizer.ts`), so a process
|
|
29
|
-
* has ONE answer to "who belongs to org:acme".
|
|
30
|
-
*
|
|
31
|
-
* The verdict is a discriminated union on purpose (same 裁定 as org-memory-admission's N3/C5): a
|
|
32
|
-
* directory that CANNOT ANSWER must never collapse into "you belong to nothing". The first renders as
|
|
33
|
-
* `unavailable` ("reads are refused until it is restored" — try again); the second renders as a
|
|
34
|
-
* settled "no memory stores are connected to this session", which teaches the model to give up. Those
|
|
35
|
-
* are opposite instructions and a fail-open collapse between them is a real defect, not a nuance.
|
|
36
|
-
*
|
|
37
|
-
* ─────────────────────────────────────────────────────────────────────────────────────────────────
|
|
38
|
-
* ORDERING / PAGINATION — why the collations are part of the contract
|
|
39
|
-
* ─────────────────────────────────────────────────────────────────────────────────────────────────
|
|
40
|
-
* core's cursor vocabulary is "an EXCLUSIVE lower bound over document paths in plain UTF-16 code-unit
|
|
41
|
-
* order", and its paging loop only advances while `nextCursor > windowCursor` **in JavaScript**. So the
|
|
42
|
-
* SQL ordering must agree with JS string comparison or a listing would silently stop early.
|
|
43
|
-
* · MySQL: the tables are `COLLATE utf8mb4_bin` ⇒ comparison is by code point.
|
|
44
|
-
* · PG: every string column is `COLLATE "C"` ⇒ comparison is by UTF-8 byte, which for valid UTF-8 is
|
|
45
|
-
* also code-point order.
|
|
46
|
-
* Code-point order equals UTF-16 code-unit order for every BMP character, and differs ONLY for
|
|
47
|
-
* supplementary-plane characters (U+10000+, whose surrogates sort before U+E000..U+FFFF in UTF-16).
|
|
48
|
-
* Rather than leave that as an invisible "listing silently truncates" hazard, {@link assertDocumentPath}
|
|
49
|
-
* REFUSES a non-BMP path at write time — the divergence is made impossible by construction, loudly, at
|
|
50
|
-
* the one place a human is watching. (Store ids and org scopes are already ASCII-only by their own
|
|
51
|
-
* shape rules, so this is the only column that needed the ruling.)
|
|
52
|
-
*
|
|
53
|
-
* KEYSET, never OFFSET: `WHERE store_id = ? AND path > ?` walks the PRIMARY KEY. An OFFSET pager over a
|
|
54
|
-
* live library both re-scans the prefix on every page and skips rows when a document is inserted mid-walk.
|
|
55
|
-
*
|
|
56
|
-
* ─────────────────────────────────────────────────────────────────────────────────────────────────
|
|
57
|
-
* 事务与锁
|
|
58
|
-
* ─────────────────────────────────────────────────────────────────────────────────────────────────
|
|
59
|
-
* **四个**写方法(putStore / putDocument / deleteDocument / deleteStore)都是「先读注册行、再按结果写」
|
|
60
|
-
* 的形状,并且都用 `SELECT … FOR UPDATE` 拿同一把行锁,于是彼此串行。判据只有一处:
|
|
61
|
-
* {@link SqlTxConn.begin} 的 `@contract txn.read-semantics` —— 加锁读在两引擎都是当前读,而「当前读」
|
|
62
|
-
* 的前提(TiDB 悲观模式、MySQL 会话级 REPEATABLE READ)是**连接初始化**的结构保证,不是服务器默认值。
|
|
63
|
-
*
|
|
64
|
-
* 本店的**第二道防线**照旧在:`store_id` 的主键唯一性才是最终裁决者,撞键被 {@link isDupKey} 翻成一句
|
|
65
|
-
* 响亮的拒绝(见 putStore)—— 即便某一天读语义出岔,结果也只会是「一方被响亮拒绝」,绝不会是一次静默
|
|
66
|
-
* 的换属主。⚠️ 另一处不可混线的分歧:InnoDB 的加锁读对**不存在的键**取 gap/next-key 锁,TiDB 悲观事务
|
|
67
|
-
* **没有** gap 锁(retention-store 的「先 ON DUPLICATE 造行、再 FOR UPDATE 锁行」就是为它而写)。
|
|
68
|
-
* 「加锁读=当前读」两引擎同真,「gap 锁」只有 InnoDB 有 —— 两条性质不共享一个「同理」。
|
|
69
|
-
*/
|
|
70
1
|
import type { Pool as MySqlPool } from "mysql2/promise";
|
|
71
2
|
import type { Pool as PgPool } from "pg";
|
|
72
3
|
import { type SharedMemoryRequestContext, type SharedMemorySnapshot, type SharedMemoryStoreProvider } from "@sema-agent/core";
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { writeLogText } from "../observability/logger.js";
|
|
1
2
|
import { isOrgScopeKey, isSharedMemoryDocumentPath, isSharedMemoryStoreId, SHARED_MEMORY_READ_CAP_BYTES, SharedMemoryStoreError, } from "@sema-agent/core";
|
|
2
3
|
import { mysqlDriver, pgDriver } from "./sql-driver.js";
|
|
3
4
|
import { isDupKeyError } from "./sql-errors.js";
|
|
@@ -81,7 +82,7 @@ async function rollbackPreservingError(conn, primary) {
|
|
|
81
82
|
await conn.rollback();
|
|
82
83
|
}
|
|
83
84
|
catch (rollbackErr) {
|
|
84
|
-
|
|
85
|
+
writeLogText("stderr", "[shared-memory-store] rollback failed after a failed transaction; reporting the PRIMARY error:", { primary, rollbackErr });
|
|
85
86
|
}
|
|
86
87
|
}
|
|
87
88
|
function storeGone(storeId) {
|