移除前端 consume 轮询兜底
- 唤醒只由 notify 驱动,bootstrap 后立刻 consume 一次补齐竞态窗口 - 定时 tick 无法自举:判断活动回合本身依赖事件,唤醒丢失时定时器不会启动 - 主规范、ADR 与实施计划同步删除该条款
This commit is contained in:
@@ -18,7 +18,7 @@ AGC 项目开发聊天框当前同时从三处取数据:Direct 回合事件(
|
||||
- 运行态事件与历史切片使用同形条目信封(`turnId` / `itemId` / `seq` / `payload`),Rust 在两侧套同一套安全过滤(脱敏、截断、路径归一),前端只有一个「条目 → 视图」投影函数;Rust 做的是机械投影,不是可见性判断。
|
||||
- 活动回合的唯一判据是「出现过 `turn.started` 且未出现对应 `turn.completed`」;进程重启后队列消失,历史里的半截回合一律按已结束渲染。
|
||||
- 分页锚点取原始条目 id;一次翻页操作在前端自动连拉,直到出现可显示条目或 `hasMore=false`,上限 5 页。
|
||||
- `notify` 仍是唯一唤醒意图,但前端在已判定存在活动回合期间叠加低频 `consume` tick(1–2 秒)兜底,因为唤醒本身允许丢失。
|
||||
- `notify` 是唯一唤醒来源:前端在 bootstrap 之后立刻 `consume` 一次补齐竞态窗口,之后完全由 `notify` 驱动,不设低频 tick 或任何轮询兜底。
|
||||
- 迁移按一次干净切换落地:不做灰度、不做运行时开关、不双跑;允许提交序列里存在「新源已启用、旧代码尚未删除」的中间窗口,禁止反向的「新源未启用、旧源已删」。
|
||||
- 思考过程与工具活动同样从运行态事件与历史条目推断,界面展示保持不变。
|
||||
- 运行态事件必须自足:`item.started` / `item.completed` 携带与历史切片同形的完整条目(同一套脱敏、截断、路径归一),前端按 `itemId` 合并快照得到运行中与完成态;不提供按 `itemId` 单点取快照的接口。
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
1. 先用真实 app-server 会话核对 `item.started` 与 `item.completed` 的条目 id 是否同一 id 空间;不一致则先在适配层统一 id,再进入后续步骤。
|
||||
2. Thread Manager 事件自足化:`item.started` / `item.completed` 携带经同一套脱敏、截断、路径归一的完整条目,且与历史切片同形。
|
||||
3. 删除 Direct 回合事件发点、`direct_turn_stream.rs` / `direct_tool_calls.rs` 两个投影模块及其命令注册,保留历史切片读取与 `subscribe` / `consume` / notify。
|
||||
4. 前端收敛为单一 reducer:bootstrap 与 consume 走同一条事件流,notify 唤醒为主、活动回合期间低频 `consume` tick 兜底,过期后重新订阅并原子替换。
|
||||
4. 前端收敛为单一 reducer:bootstrap 与 consume 走同一条事件流,bootstrap 后立刻 consume 一次补齐竞态窗口,此后只由 notify 唤醒,过期后重新订阅并原子替换。
|
||||
5. 首屏与分页:以 `lastCompletedItemId` 为锚点取最近切片,锚点按原始条目 id 推进,切片无可见条目时自动连拉(上限 5 页)。
|
||||
6. 删除前端 `directTurnStream` / `directToolCalls` 状态、活动回合快照接管与流排序回退分支,把聊天投影收敛成"条目 → 视图"一条路径。
|
||||
7. 测试与文档收口:补 reducer 单测、解锁跳过的工具卡片用例、更新主规范并把冲突的实施计划与工具卡片文档改写为当前状态。
|
||||
@@ -34,5 +34,5 @@
|
||||
|
||||
- 条目 id 空间不一致会让活跃条目永远收不到完成事件:这是第 1 步的显式前置验证,不通过不进入实现。
|
||||
- 事件 payload 变大(命令输出、文件变更明细):继续沿用既有截断上限,并观察 Thread Manager 单 thread 字节上限是否被提前触发。
|
||||
- 订阅过期与 notify 丢失:以重新 `subscribe` + 原子替换处理过期,以低频 tick 兜底丢失,两者都需要单测覆盖。
|
||||
- 订阅过期:以重新 `subscribe` + bootstrap 后立即 `consume` + 原子替换处理,需要单测覆盖;不引入定时轮询。
|
||||
- 回滚点:每一步都保持"新源可用即不依赖旧源"的中间态可回退;不允许出现新源未启用而旧源已删除的提交。
|
||||
|
||||
@@ -98,7 +98,7 @@ readHistory(threadId, { beforeItemId?, limit }) -> {
|
||||
|
||||
`notify` 只负责唤醒,不携带事件、cursor 或持久化状态。前端收到通知后调用 `consume`;通知可合并、重复或丢失,事件完整性由 `consume` 保证。
|
||||
|
||||
因为唤醒本身允许丢失,前端在「已判定存在活动回合」期间以低频 `consume` tick(1–2 秒)兜底;`consume` 自带 cursor,重复 tick 不会重复返回事件。
|
||||
`subscribe` 把新 subscriber 的游标钉在当时的队尾,因此前端拿到 bootstrap 后必须**立刻 `consume` 一次**,补齐"订阅落定到首条事件"之间的竞态窗口;此后不再轮询,也不设任何定时 `consume`。用定时器兜底既自举不了(判断"有活动回合"本身依赖事件),也把唤醒机制变成两套。
|
||||
|
||||
首屏历史不通过"读取整份对话"的命令获取:`subscribe` 返回的 `lastCompletedItemId` 就是首屏锚点,前端据此调用 `readHistory` 取最近的切片,再按滚动或按钮继续向前分页。系统不提供返回整份对话历史的命令。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user