Assistant

Assistant 模块通过 sessionHistory.ts 实现会话事件的远程获取与分页加载。它封装了与 Anthropic API 的会话事件接口交互,支持获取最新事件页(anchor_to_latest)和向前翻页(before_id 游标),为会话恢复(/resume)和历史浏览提供数据源。模块设计精简——仅一个文件,但它是连接本地对话状态与云端持久化的关键桥梁。

职责与设计理念

职责说明

会话历史管理与远程事件同步,连接本地对话与云端持久化

设计理念

极简即力量——一个文件、一个职责、零冗余。会话历史的复杂性被封装在分页游标协议中,调用者只需关心"最新页"和"更早页"两个语义。

架构决策

为什么用游标分页而不是 offset 分页?

使用 before_id 游标 + anchor_to_latest 锚点

会话事件是追加写入的流式数据,offset 分页在并发写入时会产生重复或遗漏。游标分页基于事件 ID 的全序关系,保证分页的一致性。

文件清单

文件名 用途
sessionHistory.ts 会话事件远程获取,支持分页游标、OAuth 认证、超时控制

使用场景

/resume 命令

从云端拉取历史会话事件,恢复中断的对话上下文

Commands.resume → Assistant.fetchLatestEvents() → 重建消息列表

向上滚动查看历史

触发 fetchOlderEvents(),按需加载更早的对话事件

UI.ScrollBox → Assistant.fetchOlderEvents(beforeId)

依赖关系

  • Entrypoints — 多模式入口适配器,统一 CLI/SDK/MCP 三种调用方式的启动路径
  • Bootstrap — 全局状态容器与会话生命周期管理,维护运行时的单一真相源

关键代码片段

会话历史分页加载

export type HistoryPage = {
  events: SDKMessage[]      // 按时间顺序排列的事件
  firstId: string | null    // 最早事件 ID → 翻页游标
  hasMore: boolean           // 是否有更早的事件
}

export async function fetchLatestEvents(
  ctx: HistoryAuthCtx, limit = 100
): Promise<HistoryPage | null> {
  return fetchPage(ctx, { limit, anchor_to_latest: true }, 'latest')
}

export async function fetchOlderEvents(
  ctx: HistoryAuthCtx, beforeId: string, limit = 100
): Promise<HistoryPage | null> {
  return fetchPage(ctx, { limit, before_id: beforeId }, 'older')
}

基于游标的分页协议:anchor_to_latest 获取最新页,before_id 向前翻页

技术笔记

security

OAuth 认证上下文

HistoryAuthCtx 封装 OAuth token 和会话 ID,每次请求自动附加认证头,token 过期时触发刷新流程。

edge-case

超时与重试

网络请求设置 30s 超时,失败时返回 null 而非抛异常,调用者通过 null 检查优雅降级。