@sema-agent/server 7.43.0 → 7.44.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/USAGE.md +18 -0
- package/dist/adoption/plan.js +31 -192
- package/dist/adoption/quiesce.js +3 -86
- package/dist/adoption/runner.js +3 -140
- package/dist/adoption/sql.js +0 -74
- package/dist/adoption/wire.js +0 -80
- package/dist/approval-ask-machine.js +0 -75
- package/dist/approval-card.js +0 -323
- package/dist/approval-deny-reasons.js +0 -42
- package/dist/approval-hmac.js +0 -35
- package/dist/approval-reconciler.js +8 -166
- package/dist/approval.js +4 -67
- package/dist/audit.js +1 -44
- package/dist/auth-bridge.js +4 -47
- package/dist/auth-keys.js +0 -23
- package/dist/bake-runner/main.js +4 -65
- package/dist/bake-runner/protocol.js +3 -58
- package/dist/bake-runner/runner.js +5 -91
- package/dist/bench/l8/artifact.js +2 -61
- package/dist/bench/l8/escape.js +0 -25
- package/dist/bench/l8/index.js +0 -14
- package/dist/bench/l8/probes.js +0 -60
- package/dist/bench/l8/run-probes.js +2 -45
- package/dist/bench/s1/arms.js +14 -189
- package/dist/bench/s1/live-deps.js +11 -253
- package/dist/bench/s1/oracle.js +1 -36
- package/dist/bench/s1/repair-oracle-adapter.js +0 -30
- package/dist/bench/s1/reviewer.js +0 -34
- package/dist/bench/s1/row.js +0 -62
- package/dist/bench/s1/run-firm.js +4 -70
- package/dist/bench/s1/runner-ctx.js +0 -40
- package/dist/bench/s1/tasks.js +0 -115
- package/dist/boot/adoption.js +0 -20
- package/dist/boot/budget-tracing.js +3 -55
- package/dist/boot/config-center.js +43 -551
- package/dist/boot/coordinators.js +1 -69
- package/dist/boot/crash-last.js +0 -18
- package/dist/boot/deferred-sandbox-path-env.js +3 -119
- package/dist/boot/execution-env.js +5 -171
- package/dist/boot/governance-seams.js +0 -92
- package/dist/boot/leader.js +0 -69
- package/dist/boot/limit-sync.js +0 -2
- package/dist/boot/memory-boundary.js +3 -91
- package/dist/boot/org-memory.js +1 -25
- package/dist/boot/parked-revive-gate.js +0 -150
- package/dist/boot/permission-rules-audit.js +1 -56
- package/dist/boot/reapers.js +15 -273
- package/dist/boot/resolve-spec.js +9 -768
- package/dist/boot/retention-lane.js +4 -87
- package/dist/boot/runner-deps.js +3 -297
- package/dist/boot/runtime-caps.js +0 -40
- package/dist/boot/session-faces.js +2 -133
- package/dist/boot/shutdown.js +9 -83
- package/dist/boot/side-query-lane.js +2 -137
- package/dist/boot/stores.js +15 -215
- package/dist/boot/task-list-lane.js +0 -18
- package/dist/boot/webfetch-summarize-lane.js +0 -47
- package/dist/boot/workflow-orchestration.js +3 -99
- package/dist/boot-reclaim.js +0 -20
- package/dist/bounded-session-map.js +0 -19
- package/dist/brain.js +2 -139
- package/dist/budget.js +9 -244
- package/dist/capabilities/builtin-tools.js +0 -3
- package/dist/capabilities/center-plugins.js +6 -51
- package/dist/capabilities/center-prompts.js +6 -71
- package/dist/capabilities/code-review-council.js +7 -40
- package/dist/capabilities/collab-workflows.js +1 -44
- package/dist/capabilities/hands-lane.js +0 -65
- package/dist/capabilities/memory-notice.js +0 -70
- package/dist/capabilities/prompt.js +0 -14
- package/dist/capabilities/prompts/code-review.js +0 -14
- package/dist/capabilities/prompts/identity.js +0 -6
- package/dist/capabilities/prompts/team.js +0 -4
- package/dist/capabilities/repo-tools.js +0 -34
- package/dist/capabilities/sandbox-file-send.js +3 -92
- package/dist/capabilities/scenarios.d.ts +0 -1
- package/dist/capabilities/scenarios.js +18 -279
- package/dist/capabilities/select-environment-tool.js +0 -32
- package/dist/capabilities/send-user-file-tool.js +2 -66
- package/dist/capabilities/skills.d.ts +1 -2
- package/dist/capabilities/skills.js +3 -21
- package/dist/capabilities/team.d.ts +3 -11
- package/dist/capabilities/team.js +3 -51
- package/dist/capabilities/tool-defer.js +0 -3
- package/dist/config-center/apply-effective.js +15 -330
- package/dist/config-center/apply-ledger.js +5 -38
- package/dist/config-center/facade.js +0 -41
- package/dist/config-center/hot-keys-registry.js +0 -20
- package/dist/config-center/http-client.js +2 -125
- package/dist/config-center/mcp-revocation.js +2 -34
- package/dist/config-center/read-face.js +0 -59
- package/dist/config-center/restart-signal.js +1 -85
- package/dist/config-center/skills-mcp.d.ts +1 -1
- package/dist/config-center/skills-mcp.js +9 -76
- package/dist/config-center/stage-limits.js +8 -35
- package/dist/config-invariants.js +0 -16
- package/dist/config-lkg.js +0 -42
- package/dist/config-provider.js +3 -186
- package/dist/config-types.js +0 -5
- package/dist/config.js +107 -1145
- package/dist/degenerate-instrument.js +3 -67
- package/dist/deployment-governance.js +0 -124
- package/dist/digest-form.js +0 -12
- package/dist/elicitation.js +3 -86
- package/dist/env-facts.js +7 -75
- package/dist/fleet/fleet-bus.js +34 -507
- package/dist/fleet/fleet-reconciler.js +9 -149
- package/dist/fleet/fleet-terminal-window.js +10 -178
- package/dist/fleet/subagent-tail-bus.js +3 -72
- package/dist/fleet-client.js +10 -70
- package/dist/fleet-lease.js +5 -79
- package/dist/git-api-kind.js +0 -3
- package/dist/governance-ask-marks.js +2 -78
- package/dist/hooks/branch-transcript.js +0 -74
- package/dist/hooks/cc-agent-hook-prompt.js +0 -29
- package/dist/hooks/cc-stop-prompt.js +1 -46
- package/dist/hooks/hook-llm.js +1 -53
- package/dist/hooks/hook-runner.js +20 -414
- package/dist/http/active-run-conflict.js +4 -129
- package/dist/http/cursor-fingerprint.d.ts +5 -0
- package/dist/http/cursor-fingerprint.js +5 -0
- package/dist/http/idempotency.js +0 -37
- package/dist/http/principal-gate.js +3 -40
- package/dist/http/route-ctx.js +0 -9
- package/dist/http/routes/a2a-serve.js +7 -319
- package/dist/http/routes/admin-config-refresh.js +0 -4
- package/dist/http/routes/admin-drain.js +0 -10
- package/dist/http/routes/adoption.js +1 -29
- package/dist/http/routes/agents-roster.js +1 -47
- package/dist/http/routes/approvals-assistant.js +32 -395
- package/dist/http/routes/attachments.js +4 -22
- package/dist/http/routes/capabilities.js +3 -420
- package/dist/http/routes/diagnostics.js +1 -81
- package/dist/http/routes/fleet.js +9 -185
- package/dist/http/routes/images.js +14 -239
- package/dist/http/routes/leader.js +0 -13
- package/dist/http/routes/memory-bundle.js +1 -61
- package/dist/http/routes/memory-policy.js +9 -99
- package/dist/http/routes/notify-wake.js +3 -37
- package/dist/http/routes/observability.js +2 -19
- package/dist/http/routes/retention-ops.js +2 -34
- package/dist/http/routes/rules.js +1 -93
- package/dist/http/routes/runs.js +64 -873
- package/dist/http/routes/session-sync.js +19 -258
- package/dist/http/routes/sessions-list.js +17 -43
- package/dist/http/routes/sessions.js +34 -226
- package/dist/http/routes/shared-memory.js +5 -36
- package/dist/http/routes/side-query.js +1 -87
- package/dist/http/routes/tasks.js +52 -722
- package/dist/http/routes/trace-usage.js +32 -195
- package/dist/http/routes/workflows.js +19 -195
- package/dist/http/run-meta.js +0 -6
- package/dist/http/send.js +0 -32
- package/dist/http/server.js +92 -1597
- package/dist/http/sse-lifecycle.js +2 -13
- package/dist/http/sse-log.js +3 -48
- package/dist/http/tar.js +5 -21
- package/dist/http/verify-rounds.js +0 -5
- package/dist/http/wire-gate.js +0 -9
- package/dist/http/workspace-content.js +0 -10
- package/dist/images/bake-validate.js +1 -70
- package/dist/images/manifest.js +1 -6
- package/dist/index.js +0 -21
- package/dist/key-resolver.js +2 -17
- package/dist/leader/diffout.js +1 -20
- package/dist/leader/diffup.js +0 -47
- package/dist/leader/endpoint.js +2 -57
- package/dist/leader/fanout.js +3 -45
- package/dist/leader/grader-env-factory.js +3 -72
- package/dist/leader/leader.js +5 -156
- package/dist/leader/merge.js +8 -115
- package/dist/leader/planner.js +3 -54
- package/dist/leader/repair-oracle.js +1 -60
- package/dist/leader/repair-wire.js +2 -79
- package/dist/leader/wire.js +8 -307
- package/dist/lsp/e2b-bridge.js +4 -64
- package/dist/lsp/e2b-manager.js +6 -94
- package/dist/lsp/lsp-frames.js +0 -12
- package/dist/lsp/manager.js +4 -96
- package/dist/lsp/ws-transport.js +5 -55
- package/dist/lsp-evict.js +1 -15
- package/dist/main.js +57 -765
- package/dist/memory-bundle-engine.js +0 -55
- package/dist/memory-export.js +0 -4
- package/dist/memory-posture.js +1 -15
- package/dist/memory-scope.js +11 -148
- package/dist/memory-sync-client.js +2 -44
- package/dist/memory-sync.js +1 -80
- package/dist/model-select.js +3 -80
- package/dist/observability/cost-quota.js +1 -17
- package/dist/observability/cost-taxonomy.js +0 -34
- package/dist/observability/fail-open.js +7 -86
- package/dist/observability/logger.js +0 -6
- package/dist/observability/metrics.js +0 -94
- package/dist/observability/otel-exporter.js +3 -13
- package/dist/observability/principal-context.js +0 -9
- package/dist/observability/prompt-manifest.js +1 -37
- package/dist/observability/rate-limit.js +0 -4
- package/dist/observability/secret-env-scrub.js +2 -56
- package/dist/observability/tool-trace.js +1 -70
- package/dist/orchestration/hardened-vm-runner.js +4 -118
- package/dist/orchestration/hardened-vm-worker-runner.js +1 -26
- package/dist/orchestration/hardened-vm-worker.js +0 -27
- package/dist/orchestration/subagent-steer.js +1 -45
- package/dist/orchestration/workflow-agent-steer.js +1 -80
- package/dist/orchestration/workflow-completion-inbox.js +32 -285
- package/dist/orchestration/workflow-notify-journal.js +16 -259
- package/dist/org-memory-admission.js +3 -47
- package/dist/parent-watch.js +2 -48
- package/dist/parked-decide.js +1 -109
- package/dist/per-task-image.js +0 -57
- package/dist/plan-cache-probe.js +3 -27
- package/dist/plugins/adoption-log-sql.js +2 -119
- package/dist/plugins/approval-ask-store-memory.js +3 -38
- package/dist/plugins/approval-ask-store-sql.js +6 -188
- package/dist/plugins/approval-exemption-store.js +2 -28
- package/dist/plugins/background-agent-store-sql.js +4 -105
- package/dist/plugins/background-shell-support.js +14 -122
- package/dist/plugins/blob-backend.js +6 -169
- package/dist/plugins/breaker-state-sql.js +8 -46
- package/dist/plugins/caching-session-store.js +4 -106
- package/dist/plugins/checkpoint-store-sql.js +18 -505
- package/dist/plugins/e2b-orphan-reclaim.js +0 -45
- package/dist/plugins/file-outcome-sink.js +0 -9
- package/dist/plugins/file-resume-anchor-store.js +4 -43
- package/dist/plugins/file-run-store.js +26 -364
- package/dist/plugins/file-snapshot-store-sql.js +10 -181
- package/dist/plugins/fork-routing-session-store.js +8 -111
- package/dist/plugins/host-platform.js +2 -91
- package/dist/plugins/image-bake-store-sql.js +7 -250
- package/dist/plugins/image-index-sql.js +4 -123
- package/dist/plugins/k8s-bg-scripts.js +4 -88
- package/dist/plugins/k8s-exec-protocol.js +0 -41
- package/dist/plugins/leader-run-store-sql.js +0 -101
- package/dist/plugins/local-checkpoint-store.js +8 -128
- package/dist/plugins/local-session-store.js +34 -296
- package/dist/plugins/local-task-attachment-store.js +2 -16
- package/dist/plugins/mailbox-store-sql.js +8 -65
- package/dist/plugins/memory-embedder-fingerprint.js +5 -166
- package/dist/plugins/memory-embedder.js +4 -70
- package/dist/plugins/memory-engine-pg.js +6 -170
- package/dist/plugins/memory-engine-tidb.js +7 -155
- package/dist/plugins/memory-engine-vector-util.js +0 -10
- package/dist/plugins/memory-key-guards.js +0 -34
- package/dist/plugins/memory-origin-law.js +0 -187
- package/dist/plugins/memory-resume-anchor-store.js +0 -17
- package/dist/plugins/memory-run-store.js +12 -89
- package/dist/plugins/memory-session-policy-store.js +0 -17
- package/dist/plugins/memory-sync-store-pg.js +4 -49
- package/dist/plugins/memory-sync-store-tidb.js +3 -35
- package/dist/plugins/outcome-ledger-sql.js +3 -97
- package/dist/plugins/permission-rule-store-file.js +5 -133
- package/dist/plugins/permission-rule-store-sql.d.ts +3 -0
- package/dist/plugins/permission-rule-store-sql.js +50 -307
- package/dist/plugins/pg-cost-quota.js +0 -7
- package/dist/plugins/pg-pool.js +0 -92
- package/dist/plugins/pg-rate-limiter.js +2 -13
- package/dist/plugins/pg-safe-json.js +4 -40
- package/dist/plugins/pg-session-storage.js +25 -189
- package/dist/plugins/posix-shell-fs.js +1 -31
- package/dist/plugins/remote-env-adb.js +12 -101
- package/dist/plugins/remote-env-e2b.js +40 -371
- package/dist/plugins/remote-env-file-error.js +0 -37
- package/dist/plugins/remote-env-host.js +63 -483
- package/dist/plugins/remote-env-k8s.js +32 -326
- package/dist/plugins/remote-env-local-docker.js +24 -157
- package/dist/plugins/remote-env-ssh.js +20 -128
- package/dist/plugins/remote-scratchpad.js +2 -32
- package/dist/plugins/remote-shell.js +1 -32
- package/dist/plugins/resume-anchor-store-sql.js +0 -11
- package/dist/plugins/retention-lane-store-sql.js +0 -108
- package/dist/plugins/retention-store-sql.js +4 -383
- package/dist/plugins/roster-store-sql.js +0 -55
- package/dist/plugins/run-store-sql.js +14 -251
- package/dist/plugins/s3-presign.js +2 -49
- package/dist/plugins/scheduler-support.js +3 -80
- package/dist/plugins/send-file-ledger.js +4 -53
- package/dist/plugins/send-user-file.js +4 -94
- package/dist/plugins/session-placement.js +1 -89
- package/dist/plugins/session-policy-store-sql.js +3 -81
- package/dist/plugins/session-store.js +0 -57
- package/dist/plugins/shared-memory-store-sql.js +4 -167
- package/dist/plugins/sql-driver.js +0 -17
- package/dist/plugins/sql-errors.js +0 -7
- package/dist/plugins/sql-escape.js +0 -8
- package/dist/plugins/sql-row-helpers.js +0 -25
- package/dist/plugins/store-backend.js +42 -222
- package/dist/plugins/store-contracts.js +2 -46
- package/dist/plugins/task-attachment-store.js +3 -49
- package/dist/plugins/task-list-store-sql.js +0 -79
- package/dist/plugins/tidb-cost-quota.js +1 -4
- package/dist/plugins/tidb-pool.js +1 -207
- package/dist/plugins/tidb-rate-limiter.js +3 -9
- package/dist/plugins/tidb-session-storage.js +4 -70
- package/dist/plugins/tidb-session-store.js +19 -341
- package/dist/plugins/tool-result-store-sql.js +4 -179
- package/dist/plugins/usage-window-store-sql.js +0 -8
- package/dist/plugins/web-search.js +10 -132
- package/dist/plugins/workflow-journal-store-sql.js +2 -58
- package/dist/plugins/workflow-run-store-sql.js +6 -91
- package/dist/plugins/worktree-isolation.js +6 -126
- package/dist/plugins/write-behind-counter.js +16 -75
- package/dist/principal-jwt.js +5 -60
- package/dist/project-memory.js +15 -146
- package/dist/prompts-domain-validate.js +1 -51
- package/dist/question.js +2 -111
- package/dist/resource-suspend.js +0 -18
- package/dist/router/route-orchestration.js +0 -77
- package/dist/rules-consent.d.ts +44 -5
- package/dist/rules-consent.js +75 -215
- package/dist/run-local.js +14 -381
- package/dist/runs.js +29 -617
- package/dist/runtime-caps-resolver.js +6 -132
- package/dist/runtime-governance.js +1 -232
- package/dist/sandbox-pkg-source.js +0 -37
- package/dist/sealed-key.js +3 -68
- package/dist/security.js +6 -291
- package/dist/session-leaf-bus.js +0 -32
- package/dist/session-sync-content.js +1 -69
- package/dist/session-sync-kernel.js +3 -60
- package/dist/session-sync.js +3 -66
- package/dist/session-titler.js +7 -41
- package/dist/session-watch.js +9 -73
- package/dist/shared-memory-scope-authorizer.js +0 -18
- package/dist/sighup-idle.js +1 -12
- package/dist/spec-fields.js +4 -143
- package/dist/store-live-probe.js +3 -49
- package/dist/task-a2a.js +1 -126
- package/dist/task-cwd.js +1 -103
- package/dist/task-mcp.js +1 -89
- package/dist/task-settings.js +10 -300
- package/dist/task-workflow.js +8 -75
- package/dist/tool-approval.d.ts +28 -1
- package/dist/tool-approval.js +70 -1430
- package/dist/trace/artifacts.js +5 -20
- package/dist/trace/engine-notice-wire.js +6 -138
- package/dist/trace/ledger-sink.js +7 -96
- package/dist/trace/project.js +4 -448
- package/dist/trace/redact.js +9 -77
- package/dist/turn-activity.js +1 -27
- package/dist/usage-analytics.js +4 -34
- package/dist/wall-clock-jump-guard.js +1 -68
- package/package.json +3 -3
- package/dist/capabilities/scenario-alias.d.ts +0 -27
- package/dist/capabilities/scenario-alias.js +0 -61
|
@@ -3,19 +3,7 @@ import { BaseSessionStorage, SessionError, leafIdAfterEntry, normalizePromptEpoc
|
|
|
3
3
|
import { toIso } from "./sql-row-helpers.js";
|
|
4
4
|
import { isMysqlDupKeyError } from "./sql-errors.js";
|
|
5
5
|
import { PLACEMENT_SELECT_COLUMNS, placementFromRow } from "./session-placement.js";
|
|
6
|
-
/** 判据属主 = `sql-errors.ts`(A-032 P1-①;旧形只认 `code`,只带 errno 的驱动错误漏判)。 */
|
|
7
6
|
const isDupKey = isMysqlDupKeyError;
|
|
8
|
-
/**
|
|
9
|
-
* TiDB-backed {@link BaseSessionStorage} — the durable L1 event log for one session.
|
|
10
|
-
*
|
|
11
|
-
* - `appendEntry` / `setLeafId` persist with an **atomic compare-and-set** on `leaf_seq` + `leaf_id`
|
|
12
|
-
* (core's F2 optimistic-lock seam): a write only lands if the branch leaf is still what the entry
|
|
13
|
-
* was built against. Two stateless runners that both woke the same session can't silently fork —
|
|
14
|
-
* the loser gets `SessionError("conflict")` (catch with `isSessionConflict`).
|
|
15
|
-
* - The in-memory base tree is the wake-time snapshot; every write is also mirrored into it so the
|
|
16
|
-
* live harness keeps reading a consistent view. Wake is **bounded** to `[floor .. leaf]` (F3,
|
|
17
|
-
* core 1.6.0 branch-floor seam); older history is covered by the last compaction's summary.
|
|
18
|
-
*/
|
|
19
7
|
export class TiDBSessionStorage extends BaseSessionStorage {
|
|
20
8
|
pool;
|
|
21
9
|
sessionId;
|
|
@@ -28,29 +16,14 @@ export class TiDBSessionStorage extends BaseSessionStorage {
|
|
|
28
16
|
this.leafSeq = leafSeq;
|
|
29
17
|
this.floorSeq = floorSeq;
|
|
30
18
|
}
|
|
31
|
-
/**
|
|
32
|
-
* [976] S3 RB-14 pull seam — `SessionStorage.getEpochAnchor?()`: the nearest epoch carrier BELOW the
|
|
33
|
-
* bounded-wake floor. core's `Session.getPromptEpoch()` (≥1.305) calls this only when the in-window
|
|
34
|
-
* branch walk finds no carrier — i.e. a rewind/resumeAt cut inside the kept tail, where the compaction
|
|
35
|
-
* restatement is a DESCENDANT of the cut and the root pin sits under the floor. Semantics per core's
|
|
36
|
-
* ruling: highest-seq valid carrier below the floor (not an ancestor-chain walk — fallback of last
|
|
37
|
-
* resort); malformed rows are skipped (#13: fall back to the older valid pin — the write gate refuses
|
|
38
|
-
* malformed carriers, so these only exist via out-of-band writes); none ⇒ undefined = a genuine
|
|
39
|
-
* pre-epoch session (core mints legacy_migration, the correct meaning). core re-normalizes whatever we
|
|
40
|
-
* return, so this stays honest even if the two sides ever disagree on strictness.
|
|
41
|
-
*/
|
|
42
19
|
async getEpochAnchor() {
|
|
43
20
|
if (this.floorSeq <= 0)
|
|
44
|
-
return undefined;
|
|
45
|
-
// Keyset-paged scan to EXHAUSTION (codex HIGH): a long-lived session upgraded across the epoch
|
|
46
|
-
// release carries 100+ pre-epoch compactions with NO restatement between the floor and the older
|
|
47
|
-
// valid pin — a bounded LIMIT would run dry on them and return undefined, which here specifically
|
|
48
|
-
// means "genuinely pre-epoch" and would let the caller mint a migration epoch over a durable anchor.
|
|
21
|
+
return undefined;
|
|
49
22
|
let cursor = this.floorSeq;
|
|
50
23
|
for (;;) {
|
|
51
24
|
const [rows] = await this.pool.query("SELECT seq, payload FROM session_event WHERE session_id = ? AND seq < ? AND type IN ('prompt_epoch','compaction') ORDER BY seq DESC LIMIT 100", [this.sessionId, cursor]);
|
|
52
25
|
if (rows.length === 0)
|
|
53
|
-
return undefined;
|
|
26
|
+
return undefined;
|
|
54
27
|
for (const r of rows) {
|
|
55
28
|
const e = (typeof r.payload === "string" ? JSON.parse(r.payload) : r.payload);
|
|
56
29
|
const d = e.type === "prompt_epoch" ? normalizePromptEpoch(e) : normalizePromptEpoch(e.details?.promptEpoch);
|
|
@@ -60,45 +33,18 @@ export class TiDBSessionStorage extends BaseSessionStorage {
|
|
|
60
33
|
cursor = Number(rows[rows.length - 1].seq);
|
|
61
34
|
}
|
|
62
35
|
}
|
|
63
|
-
/**
|
|
64
|
-
* Rebuild a session from its event log (= wake). Returns null if the session does not exist.
|
|
65
|
-
*
|
|
66
|
-
* F3 bounded load: only `[floor .. leaf]` is read, where floor = the last compaction's
|
|
67
|
-
* `firstKeptEntryId` (everything older is represented by that compaction's summary, so it never
|
|
68
|
-
* enters context). No compaction yet → floor=null → full load (the session is still short).
|
|
69
|
-
*
|
|
70
|
-
* This is the durable, bounded-READ equivalent of core's `boundedTail(pathEntries)` (1.42.0): that
|
|
71
|
-
* helper trims a FULL-loaded path in memory, whereas we compute the floor seq first and only `SELECT
|
|
72
|
-
* seq >= floorSeq` — so the head never leaves cold storage. Our sessions are LINEAR (no fork), so
|
|
73
|
-
* seq-order == root→leaf path-order and our `seq >= floorSeq` tail is byte-identical to
|
|
74
|
-
* `boundedTail(path).tail`; the resulting floored `BaseSessionStorage.buildContext()` matches a
|
|
75
|
-
* full-tree wake (core's `session-floor.test.ts`). If branching is ever added, switch to `boundedTail`.
|
|
76
|
-
*/
|
|
77
36
|
static async wake(pool, sessionId) {
|
|
78
|
-
|
|
79
|
-
// appending between them can make this wake see MORE events than the meta row described (never
|
|
80
|
-
// fewer: seq is append-only and `seq >= floorSeq` reads the tail). That's only reachable when two
|
|
81
|
-
// actors drive the same session concurrently, which the task_active session lock already
|
|
82
|
-
// serializes; the persist path then re-CASes leaf_id/leaf_seq, so a stale wake loses cleanly there. A
|
|
83
|
-
// single-snapshot read would need a repeatable-read txn per wake — not worth it for this guard rail.
|
|
84
|
-
const [metaRows] = await pool.query(
|
|
85
|
-
// #292 C18:placement 六列**捎带**在这条既有的 meta SELECT 上(不另开一次往返)——准入判据
|
|
86
|
-
// (claim 关门 / 镜像 squat 判)读的就是这一份持久化元组,而 acquire 的热路径不该为它多付一次 RTT。
|
|
87
|
-
`SELECT created_at, leaf_id, leaf_seq, ${PLACEMENT_SELECT_COLUMNS} FROM session_meta WHERE session_id = ?`, [sessionId]);
|
|
37
|
+
const [metaRows] = await pool.query(`SELECT created_at, leaf_id, leaf_seq, ${PLACEMENT_SELECT_COLUMNS} FROM session_meta WHERE session_id = ?`, [sessionId]);
|
|
88
38
|
const meta = metaRows[0];
|
|
89
39
|
if (!meta)
|
|
90
40
|
return null;
|
|
91
41
|
const { floorEntryId, floorSeq } = await TiDBSessionStorage.computeFloor(pool, sessionId);
|
|
92
42
|
const [eventRows] = await pool.query("SELECT payload FROM session_event WHERE session_id = ? AND seq >= ? ORDER BY seq ASC", [sessionId, floorSeq]);
|
|
93
43
|
const entries = eventRows.map((r) => typeof r.payload === "string" ? JSON.parse(r.payload) : r.payload);
|
|
94
|
-
// #292 C18:持久化的 placement 元组骑在 core 5.48 的 `SessionMetadata.placement` 可选键上
|
|
95
|
-
// (普通会话不铸这个键)——于是「这只会话是不是 placed」对每一个拿到 session 的消费方都是**同一份**
|
|
96
|
-
// 事实,不需要谁再去猜或另查一次。
|
|
97
44
|
const placement = placementFromRow(meta);
|
|
98
45
|
const metadata = { id: sessionId, createdAt: toIso(meta.created_at), ...(placement !== undefined ? { placement } : {}) };
|
|
99
46
|
return new TiDBSessionStorage(pool, sessionId, metadata, entries, meta.leaf_id ?? null, Number(meta.leaf_seq), floorEntryId, floorSeq);
|
|
100
47
|
}
|
|
101
|
-
/** The bounded-window floor = last compaction's firstKeptEntryId (and its seq). */
|
|
102
48
|
static async computeFloor(pool, sessionId) {
|
|
103
49
|
const [compRows] = await pool.query("SELECT payload FROM session_event WHERE session_id = ? AND type = 'compaction' ORDER BY seq DESC LIMIT 1", [sessionId]);
|
|
104
50
|
if (!compRows[0])
|
|
@@ -108,12 +54,10 @@ export class TiDBSessionStorage extends BaseSessionStorage {
|
|
|
108
54
|
if (!fk)
|
|
109
55
|
return { floorEntryId: null, floorSeq: 0 };
|
|
110
56
|
const [seqRows] = await pool.query("SELECT seq FROM session_event WHERE session_id = ? AND entry_id = ?", [sessionId, fk]);
|
|
111
|
-
// firstKeptEntryId missing from the log (shouldn't happen) → degrade to full load.
|
|
112
57
|
if (!seqRows[0])
|
|
113
58
|
return { floorEntryId: null, floorSeq: 0 };
|
|
114
59
|
return { floorEntryId: fk, floorSeq: Number(seqRows[0].seq) };
|
|
115
60
|
}
|
|
116
|
-
/** Sub-floor lookups (e.g. a label target) aren't in the loaded tail — fall back to the durable log. */
|
|
117
61
|
async getEntry(id) {
|
|
118
62
|
const inMem = await super.getEntry(id);
|
|
119
63
|
if (inMem)
|
|
@@ -129,16 +73,10 @@ export class TiDBSessionStorage extends BaseSessionStorage {
|
|
|
129
73
|
this.recordEntry(entry);
|
|
130
74
|
}
|
|
131
75
|
async setLeafId(leafId, opts) {
|
|
132
|
-
// A leaf move is itself a persisted `leaf` entry whose parent is the current leaf.
|
|
133
76
|
const leafEntry = this.createLeafEntry(leafId);
|
|
134
77
|
await this.persist(leafEntry, opts);
|
|
135
78
|
this.recordEntry(leafEntry);
|
|
136
79
|
}
|
|
137
|
-
/**
|
|
138
|
-
* Atomically: CAS the meta leaf (+bump leaf_seq), then append the event at the new seq.
|
|
139
|
-
* The `(session_id, seq)` primary key is the backstop — a racing writer that grabbed the same
|
|
140
|
-
* seq makes our INSERT fail with a duplicate-key, which we translate to a conflict too.
|
|
141
|
-
*/
|
|
142
80
|
async persist(entry, opts) {
|
|
143
81
|
const newLeaf = leafIdAfterEntry(entry);
|
|
144
82
|
const conditional = opts !== undefined && opts.expectedLeafId !== undefined;
|
|
@@ -155,21 +93,17 @@ export class TiDBSessionStorage extends BaseSessionStorage {
|
|
|
155
93
|
}
|
|
156
94
|
const [seqRows] = await conn.query("SELECT leaf_seq, owner FROM session_meta WHERE session_id = ?", [this.sessionId]);
|
|
157
95
|
const seq = Number(seqRows[0].leaf_seq);
|
|
158
|
-
// codex-2(S2 批):S2 发射的 owner 必须取**本事务当前行**——wake 快照在「wake 后被 delete+reclaim」
|
|
159
|
-
// 窗口里是陈旧 A,而旧 A 条目仍在=假匹配,新租户 leaf 泄进旧流。事务内同 SELECT 捎带=commit 时刻
|
|
160
|
-
// 真 owner,零额外查询;reclaim 后=B ⇒ notifyLocal 对 A 条目 drop(围栏真闭合)。
|
|
161
96
|
const commitOwner = seqRows[0].owner ?? null;
|
|
162
97
|
await conn.query("INSERT INTO session_event (session_id, seq, entry_id, parent_id, type, payload, ts) VALUES (?,?,?,?,?,?,?)", [this.sessionId, seq, entry.id, entry.parentId ?? null, entry.type, JSON.stringify(entry), new Date(entry.timestamp)]);
|
|
163
98
|
await conn.commit();
|
|
164
99
|
this.leafSeq = seq;
|
|
165
|
-
emitLeafAdvance(this.sessionId, newLeaf, commitOwner, seq);
|
|
100
|
+
emitLeafAdvance(this.sessionId, newLeaf, commitOwner, seq);
|
|
166
101
|
}
|
|
167
102
|
catch (err) {
|
|
168
103
|
try {
|
|
169
104
|
await conn.rollback();
|
|
170
105
|
}
|
|
171
106
|
catch {
|
|
172
|
-
/* ignore rollback error */
|
|
173
107
|
}
|
|
174
108
|
if (err instanceof SessionError)
|
|
175
109
|
throw err;
|