Description 关联 RFC / 架构
提案/架构 issue :终端诊断设计 (V5 终极落地版 - 严格依从现有网关协议)
对应用户场景 :Phase 4 继续补齐终端诊断的真实可用性,包括全屏应用防干扰、诊断响应提速、IDM @ai 可用性与权限安全。
当前问题 :作为诊断落地的 Phase 4,排查链路与安全防线(截断、脱敏已在 Phase 2 前置)在前期已跑通,但真实开发环境仍有三类体验风险:
当用户使用 vim、less、top、htop 等接管全屏的交互式 TUI 程序时,如果在后台或退出时触发了非零退出(或遇到中断),Auto 模式的强行插入会瞬间毁掉整个屏幕的字符排版。
手动诊断、自动诊断、IDM 诊断整体响应偏慢。当前主要等待完整模型诊断结果返回,用户在等待期间缺少即时反馈,导致“诊断服务不可用”的体感。
IDM 模式内 @ai 存在卡死风险:流式等待缺少进展兜底,gateway.run 异常返回后可能仍进入事件等待,agent_done 仅依赖 chunk 缓冲渲染,导致部分场景看似无响应。
目标与成功标准
要解决的用户问题 :保障终端交互连续性,同时让诊断服务在不缩短超时预算的前提下更快给出可用反馈,并让 IDM @ai 在 plan 模式下安全、可中断、可恢复。
阶段目标 :
为 Auto 诊断增加“全屏期抑制 + 退出后一次性保护 + 超时软降级”能力。
为手动/自动诊断增加“快速首响 + 结果复用 + 队列治理”能力,优化平均响应时间,但不修改现有超时常量。
为 IDM @ai 接入 Runtime plan 模式,并补齐 ACK 校验、无进展兜底、done payload 兜底与权限事件自动拒绝回归测试。
成功标准 :
vim/less/top/htop 运行期间,Auto 诊断插播次数为 0。
诊断触发后可以快速显示低置信度预判或处理中状态,完整诊断回来后再替换或补充。
同一错误短时间重复触发时,manual 可复用已有 in-flight 或缓存结果,避免重复等待。
IDM @ai 不再无限等待:异常 ACK、无进展、权限请求、取消请求都能稳定结束并恢复 IDM> 提示。
plan 模式下 IDM 不增加写权限审批风险,Phase 3 的权限自动拒绝兜底继续有效。
非目标 :
不重构 Runtime / Gateway / Provider。
不改诊断工具对外 RPC schema。
不修改 diagnoseCallTimeout、autoDiagnoseCallTimeout、defaultDiagnoseToolTimeout、diagnoseSubAgentTimeout 等超时预算。
不把诊断工具逻辑上移到 runtime 或 tui。
不在本阶段引入跨平台(Windows)行为一致性改造。
技术选型依据
工作线 A:全屏保护 :在 ptyproxy 输出解析层(与 OSC133Parser 同层)实现全屏状态追踪与 Auto 触发抑制。
工作线 B:诊断响应提速 :在 ptyproxy 诊断调度层增加快速预判、in-flight 合并、短 TTL 结果缓存与 manual/auto 优先级治理。
工作线 C:IDM plan 与防卡死 :在 IDM gateway.run 调用中显式传递 mode=plan,并在 waitRunStream 及 run ACK 处理处补齐终止条件。
选择理由 :
边界稳定 :继续遵守 TUI -> Gateway -> Runtime -> Tools 主链路。诊断提速发生在触发与展示层,真实诊断仍走 gateway.executeSystemTool(diagnose)。
响应更快 :快速首响、本地缓存与 in-flight 合并优化的是平均等待体验,不牺牲长尾超时预算。
权限更稳 :IDM 接 plan 后,Runtime 只读阶段会减少写工具暴露;即使出现 permission_requested,现有 IDM 自动拒绝机制仍兜底。
回滚清晰 :全屏保护、诊断缓存、IDM plan 都可独立开关或回退,不要求一次性大改。
方案对比与取舍
候选 A:上移到 Runtime 层做全屏判定(放弃)
放弃原因:Runtime 不直接消费 PTY 原始字节流,信息不完备;会引入跨层耦合并破坏职责边界。
候选 B:仅缩短诊断超时预算(放弃)
放弃原因:缩短超时只能更快失败,不能提升诊断服务可用性。用户当前真正缺的是首响、复用与调度治理。
候选 C:让 manual/auto 诊断直接走 Runtime plan 模式(暂不采用)
放弃原因:manual/auto 当前走 executeSystemTool(diagnose),不是 runtime.Run。直接迁移会扩大改动面,也会改变诊断工具确定性执行模型。
候选 D:IDM @ai 默认接 build 模式(放弃)
放弃原因:build 模式可能暴露写工具与审批路径,和 IDM 缺少交互式审批 UI 的现实冲突。plan 模式更符合“诊断与分析优先”的职责。
最终采用 :
全屏保护继续采用 PTY 输出解析同层状态机。
诊断提速采用“快速首响 + 去重复用 + 调度治理”,不改超时预算。
IDM @ai 默认以 mode=plan 运行,并保留自动拒绝权限请求的 Phase 3 安全兜底。
实现设计(How)
可观测验收指标
全屏稳定性指标 :在 vim/less/top/htop 运行期间,auto diagnose 插播次数 = 0 。
退出保护指标 :退出全屏后仅屏蔽 1 次 pending auto 触发,后续触发恢复常态。
首响指标 :manual/auto 诊断触发后可以在完整模型结果前输出快速预判或明确处理中状态。
复用指标 :同 fingerprint 重复诊断可以命中 in-flight 或短 TTL 缓存,避免重复 RPC。
队列指标 :manual 诊断不被 auto 队列长期阻塞。
IDM 稳定性指标 :@ai run ACK 异常、无事件进展、权限请求、用户取消都能恢复 IDM> 提示。
权限稳定性指标 :IDM plan 模式下,permission_requested 不会导致等待死锁;自动拒绝路径继续可用。
超时韧性指标 :诊断超时后 shell 不假死,仍可连续输入命令并获得输出。
协议稳定性指标 :公共 Gateway RPC 请求/响应 schema 变更数 = 0 。
任务拆解
测试与验证
假设与默认决策
当前优先目标是“把 Phase 4 设计理由写清楚”,实现时仍应按最小 PR 分步落地。
文档主语言保持中文,术语与路径沿用现有风格。
实现范围限定在 Unix-like neocode shell 的 ptyproxy 路径,Windows 暂不纳入。
诊断提速优化的是首响、复用与平均等待时间,不把超时失败当作可用性提升。
manual/auto 诊断保持 executeSystemTool(diagnose) 确定性执行模型,不在本阶段迁移到 runtime.Run。
IDM @ai 默认使用 plan,因为该模式更贴合诊断分析场景,也更容易控制写权限风险。
所有新增缓存只允许保存脱敏、裁剪后的内容,不保存原始终端日志。
风险与回滚
风险 1:全屏状态机漏判 :可能对极小众或深度定制终端模拟器漏判,导致 Auto 诊断在全屏程序运行中途打印,冲乱屏幕排版。
缓解方案 :保留 neocode diag auto off 人工兜底路径,提供 Ctrl+L 刷屏重绘建议,持续覆盖常见 shell/tmux 场景。
风险 2:快速预判误导用户 :本地模式匹配可能给出低质量判断。
缓解方案 :明确标记“快速预判/低置信度”,并以最终模型诊断为准。
风险 3:缓存复用返回过期结论 :同类错误短时间内上下文可能变化。
缓解方案 :TTL 保持短周期,fingerprint 纳入日志摘要与 exit code,manual 可提示缓存命中来源。
风险 4:IDM plan 输出规划协议噪音 :模型可能误输出 plan_spec / summary_candidate。
缓解方案 :terminal-diagnosis skill 明确禁止输出 plan JSON;必要时在渲染层做降噪。
风险 5:IDM plan 仍出现权限请求 :只读工具面或模型行为仍可能触发 permission_requested。
缓解方案 :保留 Phase 3 自动拒绝路径,并补充回归测试;清理 todo_write 等只读可见噪音。
回滚方案(工程化) :
一级回滚:设置 NEOCODE_DIAG_ALTSCREEN_GUARD_DISABLED=1 快速禁用全屏抑制逻辑。
二级回滚:关闭诊断 in-flight 合并与短 TTL 缓存,退回每次独立诊断。
三级回滚:关闭 IDM mode=plan 注入,退回原有 IDM run 行为。
四级回滚:必要时执行版本回退,恢复到 Phase 3 行为。
Reactions are currently unavailable
You can’t perform that action at this time.
关联 RFC / 架构
@ai可用性与权限安全。vim、less、top、htop等接管全屏的交互式 TUI 程序时,如果在后台或退出时触发了非零退出(或遇到中断),Auto 模式的强行插入会瞬间毁掉整个屏幕的字符排版。@ai存在卡死风险:流式等待缺少进展兜底,gateway.run异常返回后可能仍进入事件等待,agent_done仅依赖 chunk 缓冲渲染,导致部分场景看似无响应。目标与成功标准
@ai在 plan 模式下安全、可中断、可恢复。@ai接入 Runtime plan 模式,并补齐 ACK 校验、无进展兜底、done payload 兜底与权限事件自动拒绝回归测试。vim/less/top/htop运行期间,Auto 诊断插播次数为 0。@ai不再无限等待:异常 ACK、无进展、权限请求、取消请求都能稳定结束并恢复IDM>提示。plan模式下 IDM 不增加写权限审批风险,Phase 3 的权限自动拒绝兜底继续有效。diagnoseCallTimeout、autoDiagnoseCallTimeout、defaultDiagnoseToolTimeout、diagnoseSubAgentTimeout等超时预算。runtime或tui。技术选型依据
ptyproxy输出解析层(与OSC133Parser同层)实现全屏状态追踪与 Auto 触发抑制。ptyproxy诊断调度层增加快速预判、in-flight 合并、短 TTL 结果缓存与 manual/auto 优先级治理。gateway.run调用中显式传递mode=plan,并在waitRunStream及 run ACK 处理处补齐终止条件。TUI -> Gateway -> Runtime -> Tools主链路。诊断提速发生在触发与展示层,真实诊断仍走gateway.executeSystemTool(diagnose)。permission_requested,现有 IDM 自动拒绝机制仍兜底。方案对比与取舍
executeSystemTool(diagnose),不是runtime.Run。直接迁移会扩大改动面,也会改变诊断工具确定性执行模型。@ai默认接 build 模式(放弃)@ai默认以mode=plan运行,并保留自动拒绝权限请求的 Phase 3 安全兜底。实现设计(How)
关键改动点:
internal/ptyproxy/screen_state.go(或复用既有事件检测层)中加入屏幕切换控制序列检测与状态维护。CSI ? 1049 h/l、CSI ? 47 h/l、CSI ? 1047 h/l,并支持分片输入与 tmux passthrough 场景。isAltScreen=true期间,禁止派发 auto diagnose。neocode diag/neocode diag -i。exit_code、command_text、最近错误日志片段、常见错误模式。command not found、permission denied、no such file or directory、context deadline exceeded、module not found、port already in use。hash(command_text + exit_code + sanitized_error_log)。fatal、error、panic、permission、denied、not found、trace等关键行及其邻近上下文。@ai接入 plan 模式:在gateway.run的RunParams中传递Mode: "plan"。mode字段,无需新增 Gateway RPC schema。plan,保留内部开关方便回退到build。bind_stream与gateway.run都必须校验 ACK / ERROR / 非预期帧。waitRunStream增加无进展检测:长期没有匹配 run 事件或没有任何输出进展时,取消当前 run 并恢复提示符。agent_done如 chunk 缓冲为空,应尝试从 done payload 中提取最终文本并渲染。permission_requested继续调用自动拒绝流程,拒绝后恢复提示符,不进入审批等待死锁。Ctrl+C取消路径继续调用gateway.cancel,并确保mode/currentRunID/streamCancel被清理。todo_write在只读可见名单里,但权限映射是 write,存在“可见但执行必被拦截”的噪声。NEOCODE_DIAG_ALTSCREEN_GUARD_DISABLED=1禁用全屏抑制逻辑。@ai的 plan 注入。config.yaml配置项并补齐配置迁移与持久化策略。影响模块:
ptyproxy:屏幕模式追踪、Auto 触发抑制、诊断快速首响、诊断 in-flight 合并/缓存、manual/auto 调度、IDM run mode 注入与流式防卡死。runtime:仅在必要时补充测试或小范围修正 plan 只读工具可见性,不改变 Runtime 主循环语义。tools:修正只读可见工具列表中的todo_write噪音项,诊断工具执行语义不变。gateway client:沿用既有超时与 per-call 覆盖能力,无需新增协议字段。接口影响说明:
RunParams.Mode字段,不新增 Gateway RPC 字段。ptyproxy内部接口/状态扩展,不引入对外 API 破坏性变化。边界与非目标:本阶段聚焦终端诊断可用性,不涉及安全脱敏重构、核心状态机重写或 Provider 协议扩展。
可观测验收指标
vim/less/top/htop运行期间,auto diagnose 插播次数 = 0。@airun ACK 异常、无事件进展、权限请求、用户取消都能恢复IDM>提示。permission_requested不会导致等待死锁;自动拒绝路径继续可用。任务拆解
CSI ? 1049 h/l、CSI ? 47 h/l、CSI ? 1047 h/l,维护isAltScreen与一次性退出保护窗口状态,覆盖分片输入与 tmux passthrough。@airun ACK 校验:bind_stream与gateway.run均校验 ACK / ERROR / 非预期帧,异常时立即恢复提示符。@ai无进展兜底:为waitRunStream增加进展检测,长期无匹配事件或无输出进展时取消 run 并恢复提示符。agent_donepayload 兜底渲染:chunk 缓冲为空时尝试读取 done payload,避免“完成但无显示”。RunParams中显式传递Mode: "plan",并保留回退开关。todo_write噪音,减少 IDM plan 下无意义的 blocked tool 事件。测试与验证
isAltScreen=true时禁触发 auto。gateway.runERROR / 非 ACK 返回时不进入无限等待。waitRunStream无进展时能取消 run 并恢复提示符。agent_donepayload fallback 能渲染最终文本。permission_requested自动拒绝后恢复提示符。Ctrl+C取消 streaming 后状态清理完整。RunParams.Mode正确传递plan。OSC133自动触发链路。diag auto on/off/status行为。shouldTerminateShellOnAutoDiagnoseError的软/硬失败分类。neocode shell,使用vim打开文件并以:cq异常退出,确认终端排版无污染、无突发诊断插播。command not found、permission denied、no such file等错误,确认快速预判先出现,最终模型诊断随后补齐。neocode diag -i,执行@ai,确认 run mode 为 plan,回复正常显示,无写权限审批等待。IDM>提示。假设与默认决策
neocode shell的ptyproxy路径,Windows 暂不纳入。executeSystemTool(diagnose)确定性执行模型,不在本阶段迁移到runtime.Run。@ai默认使用plan,因为该模式更贴合诊断分析场景,也更容易控制写权限风险。风险与回滚
neocode diag auto off人工兜底路径,提供Ctrl+L刷屏重绘建议,持续覆盖常见 shell/tmux 场景。plan_spec/summary_candidate。permission_requested。todo_write等只读可见噪音。NEOCODE_DIAG_ALTSCREEN_GUARD_DISABLED=1快速禁用全屏抑制逻辑。mode=plan注入,退回原有 IDM run 行为。