import type { Pool as MySqlPool } from "mysql2/promise"; import type { Pool as PgPool } from "pg"; import { type TaskListStore } from "@sema-agent/core"; export declare const TASK_LIST_META_TABLE = "task_list_meta"; export declare const TASK_LIST_ITEM_TABLE = "task_list_item"; /** * [ref] `sessionId ↦ 本表的身份键`:`session:<可读前缀>-`。 * * 🔴 为什么不直接把 sessionId 当 listKey:sessionId 是**调用方可自报**的不透明串(提交门 * `http/server.ts` 只卡 ≤64 **字符** —— [#15] 刻意的宽松提交契约,不卡字节数也不卡字符集)。 * 而本文件的身份键是字节面严格的:{@link assertListKeyBytes} 对 >190 字节当场拒(超长键截断案), * PG twin 对孤代理/NUL 走 {@link PgUnstorableError} 拒。直接透传 * 的话,一个 64 字符全四字节 emoji 的会话(256 字节)会让**整条请求**在场景装配处 500 —— 而那条腿 * 只是待办清单。派生一个恒可存的键把这一整类失败模式消掉(既不是 fail-open 也不是 fail-loud,是让 * 那条臂不存在)。 * * 判据:确定性(同 sessionId 跨副本/跨重启恒同键)、字节安全(纯 ASCII,≤ 8+24+1+16 = 49 字节)、 * 抗碰撞(摘要取**全串**,可读前缀只为运维肉眼对账)。 * * `session:` 是**命名空间**位:[ref] §6 D2 的团队共享清单将来若按 team 分区,两族键同表不撞。 * 同族先例 = `env-facts.ts` 的 `scratchpadSessionSegment`(文件名面)——刻意**不**复用彼此的实现: * 一个键空间改了算法不该把另一个键空间的存量行全孤儿化。 * * 🔴 属主在**本文件**(而不是消费它的 boot 车道):留存腿(`retention-store-sql.ts`)按同一派生式 * 批量删本表的行,两个消费点必须读同一个函数 —— 键派生有两份就是「在线删除删得掉、留存腿删不掉」。 */ export declare function taskListKeyFor(sessionId: string): string; export declare function ensureTiDBTaskListSchema(pool: MySqlPool): Promise; export declare function ensurePgTaskListSchema(q: (text: string, params?: unknown[]) => Promise): Promise; /** * 整份清单删除([ref] / E21 会话删除级联;codex R1-[high] 验真后加)。 * * 语义 = 「这个 listKey 的清单**不存在过**」:item 行 + meta 行(高水位 `next_id` / 插入序 * `next_sort`)一并抹掉。⚠️ **meta 行必须一起删**:留着它,同一个 listKey 被重新登记后 * (会话 id 由调用方自选、删除后可被别人 `register`)新主的第一条任务会从旧主的高水位续号 —— * 那是一条跨化身的信息外泄(「上一位在这里建过 47 条」)。 * * 事务内先对 meta 行 `FOR UPDATE`(与 `mutate` 同一把分区锁)⇒ 与并发的清单写串行,不会删到 * 一半被插回新行。meta 行不在(从未写过任何任务)= 无锁可拿,DELETE 命中 0 行,幂等。 */ export declare function deleteTiDBTaskList(pool: MySqlPool, listKey: string): Promise; /** {@link deleteTiDBTaskList} 的 PG 孪生(同语义、同事务姿势)。 */ export declare function deletePgTaskList(pool: PgPool, listKey: string): Promise; export declare function createTiDBTaskListStore(pool: MySqlPool, listKey: string): TaskListStore; export declare function createPgTaskListStore(pool: PgPool, listKey: string): TaskListStore; //# sourceMappingURL=task-list-store-sql.d.ts.map