ZH

 


会话要落地:JSONL 持久化

关掉终端,对话不能就此蒸发。Session Manager 负责把会话写进磁盘——用JSONL(每行一个 JSON)格式:每产生一条消息,就追加一行。崩溃、断电也只会丢最后一行,已写的内容安然无恙。

~/.pi/agent/sessions/--Users-you-projectA--/<id>.jsonl
                       └─ cwd 编码进目录名(绑定项目)
  {"type":"node","id":"n1","parentId":null,"message":{…}}
  {"type":"node","id":"n2","parentId":"n1","message":{…}}
  {"type":"node","id":"n3","parentId":"n2","message":{…}}
  └─ append-only:新事件就是新的一行

为什么是 JSONL 而不是一个大 JSON?

  • 追加便宜:写一行就行,不必每次重写整个文件。
  • 抗损坏:解析时逐行读,坏掉的一行不会带走整份会话。
  • 可流式:恢复会话时边读边重建树,无需一次性载入全部。

cwd-bound services:会话认得「在哪个项目」

Session Manager 是绑定当前工作目录的:cwd 被编码进 ~/.pi/agent/sessions/ 下的子目录名。于是在 ~/projectA 启动 pi,列出的就是 projectA 的历史会话;切到 ~/projectB 又是另一批。会话、CLAUDE.md、技能——都以 cwd 为锚点。

恢复 = 逐行重放
function loadSession(path): SessionTree {
  const tree = new SessionTree()
  for (const line of readLines(path)) {
    const entry = JSON.parse(line)        // 每行带 type 判别字段
    if (entry.type === "node")
      tree.addNode(entry.id, entry.parentId, entry.message)
  }
  return tree
}

持久化(JSONL)+ 数据结构(树)+ 作用域(cwd)三者合起来,才有了 pi 「关掉再开还能接着聊、还能回到任意岔口」的体验。