Files
deepseek-harness/docs/rfc/implemented/feature/2026-07-10-session-query-service.zh.md
T
Ziya 2565133af3 docs(i18n): RFC tree batch — 146 bilingual pairs via the committed pipeline
implemented(除 4 篇超长文档随后补)、proposed、rejected 全树配对;
同一流水线 + 二遍校验(paraphrase-back + 仓库上下文一致性)产出。
docs/rfc/implemented/AGENTS.md 与其 CLAUDE.md 符号链接列入排除
(agent 指令文件,与根 AGENTS.md 同策略)。
2026-07-15 23:25:06 -07:00

4.4 KiB
Raw Blame History

RFC:精确会话查询服务

Status: implemented

English | 中文

问题

会话历史存在于两处:当前的 SessionStore 对象和可选的持久化后端。需要精确检查的消费方如果不借助统一服务,就得各自重复实现活跃/持久化优先级、持久化生命周期处理、原始事件 surface 分类和防御性克隆。检查点之间持久状态可能落后于活跃日志,因此单靠持久化并不是可信的当前数据源。

全文搜索与此相关但规模大得多。在真正的后端出现之前就设计提供方注册、抽取、同步、失效、排序和游标契约,会产生两个投机性的状态机:一个在接口服务中,另一个在最终的数据库包中。

决策

@deepseek-ai/dsh-session-query 拥有 ctx.sessionQuery:一个面向单一逻辑语料库的小型可信精确读取服务。它暴露 listSessions()、listEvents(sessionId) 和有界的 readEvent(request)。它不暴露过滤器、血缘/溯源遍历、文本抽取器、搜索请求、提供方注册或派生索引同步。

该服务动态观察可选的 ctx.sessionPersistence 绑定,但不保留持久化缓存或失效监听器。每次跨语料库列举都向活跃后端请求权威元数据,然后叠加一份新鲜的活跃 store 列表。id 匹配的条目合并为一条 SessionRecord:活跃 header 优先,live/persisted 独立报告来源可用性。不可变 header 不一致时报 SESSION_QUERY_SOURCE_CONFLICT。

精确目标读取首先检查活跃 store,快照活跃 header 和事件日志。此路径从不查询持久化,因此持久化后端故障不会使已知的活跃历史变得不可读。当活跃 store 中无目标时,服务列举当前持久化元数据、证明该 id 存在、加载它,并在列举/加载的 header 不一致时拒绝。所有返回的 header 和事件都经过一次 structured-clone 边界。

Surface 语义

dsh-session 导出 foldSurface(events),SurfaceManager 对其增量缓存使用相同的转换函数。fold 返回分离的当前节点以及每次替换实际移除的 seq。listEvents() 利用该结果将每个原始事件分类为 current、shadowed 或 log-only,使检查结果不会在位置替换语义上与 model-history 推导产生分歧。

readEvent() 返回完整的目标事件以及按连续 seq 排列的原始邻居。before 和 after 默认为零,各自受 readWindowMax(默认 50)约束。结果携带克隆的 SessionHeader 而非来源可用性记录,因为判断活跃目标的 persisted 标志会违反「活跃精确读取不依赖持久化健康状态」这一保证。

安全边界

该服务是上下文范围内的可信基础设施,而非授权层。未来面向模型的历史工具或人类 UI 将施加显式的调用方/会话作用域。本阶段不添加面向模型的工具,也不改变 transcript(文本记录)或快照 surface。

曾考虑的替代方案

  • 让每个消费方自行实现逻辑语料库解析:否决。来源优先级、冲突处理、可选服务生命周期、克隆和 surface 分类是共享的正确性规则。
  • 只查询持久化:否决。检查点之间持久化可能落后于当前活跃日志。
  • 缓存持久化元数据并监听写入/删除:否决。精确读取可以直接询问权威来源,而缓存失效在规模尚未要求之前就引入了生命周期和并发状态。
  • 现在就定义提供方无关的搜索协议:否决。目前没有提供方消费它。第一个 SQLite FTS 包应自行拥有一个协调/事务状态机;只有当第二个实现证明了边界时,才提取更小的共享 seam。
  • 在第一阶段就包含血缘、溯源和通用过滤器:否决。当前没有消费方需要它们,且规范日志足以在有证据时再行添加。

后果

第一阶段只有一个来源解析状态变量:当前挂载的持久化服务。没有提供方队列、指纹、抽取器注册表、观察代次或派生索引更新。精确读取在纯活跃部署中仍然可用,在持久化存在时具有确定性。

跨语料库列举和持久化精确读取每次调用都执行后端 I/O。这是有意为之:正确性来自当前权威状态,面向规模的搜索属于第二阶段的数据库。全文搜索在该包定义并实现其完整契约之前不可用。