import { type SessionStore } from "@sema-agent/core"; import type { ServiceConfig } from "../config-types.js"; import type { StoreBackend } from "./store-backend.js"; /** * Session-store plugin seam. * * - `memory` (default): core's in-memory `TtlSessionStore` (lost on restart, 7-day idle TTL). * - `tidb`: the durable "Session event-log center" (L1) — append-only events + wake/resume + * cross-instance CAS (F2), on whichever SQL engine `DB_BACKEND` selects (TiDB or PG, via the store backend). * Optionally wrapped in a warm cache (reuse a hot session across turns; requires session affinity) — * set `SESSION_CACHE_TTL_SEC=0` to disable. */ export declare function createSessionStore(config: ServiceConfig, backend?: StoreBackend, metrics?: { inc(name: string, labels?: Record, n?: number): void; }): SessionStore; /** * core 1.382([ref],[ref] 提货单①②)`SubagentToolOptions.background.ensureChildSessionDurable` * 的实现体——从 main.ts 装配点抽出为可独立测试的纯函数(main.ts 里的其余装配闭包历来无单测覆盖, * 这条因为承载真实的 park/veto 裁决,拆出来直接钉)。 * * 只在 `sessionId` 已经真正路由到 HOST(durable)会话店、且**真有内容**时 resolve;其余(未路由到 host/ * 两店皆无/host 店只有一行空壳)一律 reject——veto,core 侧子代按 pre-153 settle failed,零回归,不是 * 危险失败模式(见函数体内注释)。 * * 传入必须是 HOST 店本身(main.ts 里 `createSessionStore(...)` 的返回值),不能是 subRunner 用的 * `ForkRoutingSessionStore` 包装店——那层包装对 `acquire(id,{requireExisting:true})` 是 transient-优先 * (F-7 案:让"真会话在 transient"赢过"host 店里的同 id 空壳"),会把"只在 transient 店有真内容"误判成 * "host 店已经有了"。这里要问的是纯粹"host 店本身是否已经有这份真内容",必须绕开那层路由。 * * 🔴 [ref] F3(cli 复查抓获,真红确认)调用方前提——**本函数假设 `hostStore.release()` 是"归还租约" * 语义(不销毁内容)**,这对 core `TiDBSessionStore` 成立(`release()` 逐字注释「Durable history is * retained; just drop any in-flight cache entry」),但对无 repo 构造的 `TtlSessionStore`(`createSessionStore` * 在 `SESSION_BACKEND !== "tidb"` 时返回的那种)**不成立**——那个店形的 `release()` 是整删会话 * (`evictPolicy="delete"`)。本函数自己**不做**、也无法通用地做"这个 store 实例的 release 是否安全"的 * 判别(`SessionStore` 接口没有暴露这个信息,类型层面区分不了两种店形)——上文"误判方向永远偏保守" * 只覆盖 `getLeafId` 那道校验,不覆盖"传了一个 release=delete 的店进来"这个前提违反。**调用方必须 * 保证只在真正 durable(release 非破坏性)的店上调用本函数**——server 侧的强制点在 main.ts 装配区: * `ensureChildSessionDurable` 闭包只在 `config.sessionBackend === "tidb"` 时构造。 */ export declare function ensureSessionDurable(hostStore: SessionStore, sessionId: string): Promise; /** * [ref] 主动晋升版 ensureChildSessionDurable(cli TiDB 真机撞获:1.263 的只查不迁形在拆店生产形下 * 恒否决 park——bg 子会话住 subRunner 私有 TTL 店、从不在 host 店,core 收 veto 即 expire checkpoint * (14ms~2s)+ settle failed,赎回窗口不存在): * 1. 快路:已在 host 店且有真内容 → 直接通过(幂等/重入)。 * 2. 晋升:routing.promoteToHost 把子会话整树从私店拷进 host 店(拷贝→私店 forget→路由记 host, * 三步见 ForkRoutingSessionStore.promoteToHost)。 * 3. 复验:同一把 `ensureSessionDurable` 严检(leaf 非空)——晋升产物必须达到与既有校验完全相同的 * durable 标准,任何一步失败=如实 reject=veto=pre-153 行为(不放大)。 * 调用方纪律与 {@link ensureSessionDurable} 同款:hostStore 必须是 release 非破坏性的真 durable 店 * (main.ts 的 `config.sessionBackend === "tidb"` 门不变)。 */ export declare function ensureChildSessionDurableWithPromotion(hostStore: SessionStore, routing: { promoteToHost(sessionId: string): Promise; }, sessionId: string): Promise; //# sourceMappingURL=session-store.d.ts.map