import type { CliAdapter, PtyHandle, ResumableSession } from './types.js'; /** 判断是否 OpenCode 原生会话 id(`ses_…`)。opencode2 复用同一套 id 规则。 */ export declare function isOpenCodeSessionId(value: string | undefined): value is string; /** * 存储层版本选择。opencode 1.x 写 V1 表(session/message/part);opencode2 * (next-17135 起实测)把新会话写入 V2 表(session_v2/session_message),V1 表 * 冻结不再更新。两套表字段高度同构(id/directory/title/time_created 等一致), * 查询差异集中在 user 文本行的定位方式: * - V1:part JOIN message,role 从 message.data 解析,text 在 part.data * - V2:session_message 自带 type 列,user 文本在 data 的 $.text * 各 helper 按 kind 切换 SQL;opencode 适配器恒走 v1(默认),opencode2 传 v2。 */ export type OpenCodeDbKind = 'v1' | 'v2'; type DatabaseSyncLike = { prepare(sql: string): StatementSyncLike; close(): void; }; type StatementSyncLike = { get(...params: unknown[]): any; all(...params: unknown[]): any[]; }; /** 只读打开 opencode.db 执行一次查询。DB 是 WAL 模式且被活跃 OpenCode 进程持有, * read-only 连接可并发读;任何失败(模块缺失/文件不存在/短暂锁忙)都回落 null, * 上层按"无法验证"降级,不影响输入投递本身。opencode2 与 opencode 共用该库。 */ export declare function withDb(fn: (db: DatabaseSyncLike) => T): T | null; /** 提交验证基线:当前存储层最大 time_created(epoch ms,与 worker 同机同钟)。 * 之后只认 >= 基线的新行,避免历史消息误配。 */ export declare function snapPartBaseline(kind?: OpenCodeDbKind): number | null; /** 提交验证轮询(writeInput 共用实现,opencode2 复用):基线已由调用方采样, * 之后只认 > 基线的新 user 行;命中则带回 cliSessionId。斜杠命令基线为 null * (不产生 user message 行),直接视为已提交。kind 选存储层(v1/v2)。 */ export declare function detectOpenCodeSubmit(pty: PtyHandle, baseline: number | null, content: string, delayFn?: (ms: number) => Promise, kind?: OpenCodeDbKind): Promise<{ submitted: boolean; cliSessionId?: string; recheck?: () => { submitted: boolean; cliSessionId?: string; } | false; }>; /** 兜底反查:botmux 每条 prompt 都带 `xxx` 块,按该文本在 * user 行里找最近命中的 OpenCode 会话。用于 cliSessionId 尚未持久化时的 resume * (典型:首条消息经输入队列投递、没走 writeInput 验证就被 suspend/重启)。 */ export declare function latestOpenCodeSessionForBotmuxSession(botmuxSessionId: string, kind?: OpenCodeDbKind): string | undefined; export declare function sessionRowExists(cliSessionId: string, kind?: OpenCodeDbKind): boolean | null; /** Import path(/adopt 第二过滤器)共用实现:从当前存储层的会话表列出可续接的 * 顶层会话(parent_id 非空的是子代理会话,跳过)。opencode2 与 opencode 共用 * 同一库文件,kind 区分表空间。 */ export declare function listOpenCodeResumableSessions(opts: { limit: number; exclude?: ReadonlySet; }, kind?: OpenCodeDbKind): ResumableSession[]; export declare function createOpenCodeAdapter(pathOverride?: string): CliAdapter; export declare const create: typeof createOpenCodeAdapter; export {}; //# sourceMappingURL=opencode.d.ts.map