Skip to content

宿主多会话支持(二):回合边界判定统一 + 子会话状态继承(#317 遗留) #364

Description

@ranxianglei

背景

#317(Prime Agent 集成报告)中的记账隔离已由 #327 修复:nudgeShownTurns、压缩失败追踪等账本已按 sessionId 键化,会话启动/退出只清理本会话。本 issue 跟踪剩余的两个结构性缺口(即 #317 的接缝 1 与接缝 2),修复后同一 pi 进程内的多会话宿主(Prime 等内联子/兄弟会话)才能真正跑顺。

问题 1:回合边界判定不统一

现状:什么消息算"新回合起点"在三个地方各自独立判定,且互不一致:

  • src/tokens.ts:98 — hostTokens 估算
  • src/index.ts:739 — turnKey 计算
  • src/messages.ts:29 — 上下文条目划分

影响:宿主通过 agent_message(custom_message)注入的消息进入上下文,但不算回合起点 → 多个真实回合塌缩进同一个 turnKey:

  • nudge 记账格子错位(账本已隔离但格子本身错了)
  • 退化熔断、节流阀的周期统计失真
  • 回合证据闭合(reasoning-drop)对齐不到正确的回合

方案:

  • 导出单一谓词 isTurnBoundary(entry),三处收敛到同一实现
  • 提供宿主策略入口(是否把 custom_message/agent_message 计为回合起点),默认保持 pi 原生行为不变(不改变存量单会话用户的 nudge 节奏)
  • 在宿主适配文档中写明该契约(连带补 docs/host-adapter.md)

问题 2:子会话状态继承(deriveChildState)

现状:runtime.stateFor(childSid) 一律返回全新状态。

影响:

  • pi 原生 delegate(独立进程跑子会话)→ 全新状态是正确语义,保持不变
  • 内联子会话(同进程,如 Prime RLM)→ 需要继承父会话的压缩块(否则 decompress/search_context 找不到块),但节奏基线(nudge 记账、节流阀、失败计数、预算水位)应重新起算

方案:设计 deriveChildState(parentState) → childState 契约:

  • 继承:压缩块、消息引用、原始消息索引(保证块可解压、可搜索)
  • 重置:所有节奏账本(nudge shown、compress 失败追踪、节流阀、溢出计数)
  • 一次性迁移标记(子会话首次派生时写入,避免重复派生)
  • 持久化沿用 ~/.pi/agent/sessions/<childSid>.acp.json,与父文件独立

验收

  • 三处回界判定收敛为单一谓词,单元测试断言一致性
  • 宿主策略默认关闭时,存量行为逐字节不变(回归测试)
  • deriveChildState 继承/重置语义有单元测试;pi 原生 delegate 路径零变化
  • docs/host-adapter.md 覆盖回界策略与子会话派生契约

关联

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions