mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-21 15:55:50 +00:00
Fix/bypass root confirm (#1275)
* fix(ink): 主屏幕模式周期性终端重绘, 防止长时间运行 TUI 显示腐蚀 - 添加 lastMainScreenHealTime 字段, 每 5 秒触发一次全量终端重绘 - 使用 wall-clock 时间替代帧计数, 避免 drain frames (250fps) 加速周期 - 添加 isTTY 守卫, 防止非 TTY 环境泄漏 ANSI 转义序列 - 扩展 needsEraseBeforePaint 到主屏幕模式, BSU/ESU 确保原子性无闪烁 - 修复 log-update cursor 漂移和 blit ghosting 导致的文字重叠/残留 Co-Authored-By: deepseek-v4-pro <deepseek-ai@claude-code-best.win> * fix(messages): lookups 缓存感知 progress tick 替换, 修复 Bash 进度时间卡死 REPL.tsx 用原地替换处理 ephemeral progress (Bash/PowerShell/MCP) 以 限制 messages 数组增长, 但 computeMessageStructureKey 只把 parentToolUseID 计入 key, 替换前后 key 完全相同, Messages.tsx 的 lookups 缓存命中, updateMessageLookupsIncremental 长度相同时又直接返回 existing, 导致 progressMessagesByToolUseID 永远停在首条 tick, ShellProgressMessage 的 elapsed time 卡在首次显示值不动. - computeMessageStructureKey: 加入 progress.uuid, tick 替换后 key 必变 - updateMessageLookupsIncremental: 长度相同 + 末尾为 progress 时返回 null 触发 full rebuild, 让新 tick 进入 progressMessagesByToolUseID 补充 4 个测试覆盖 bug 行为与 fast path 保护. Co-Authored-By: glm-5.2 <zai-org@claude-code-best.win> * fix: bypass 模式在 root/sudo 下改为警告 + y 确认而非直接退出 交互式 TTY 下打印风险警告并等待用户输入 y 才进入 bypass 模式; 非 TTY (pipe/ACP/CI) 维持原 exit(1) 行为,因为无法交互确认。 Co-Authored-By: glm-5.2 <zai-org@claude-code-best.win> --------- Co-authored-by: deepseek-v4-pro <deepseek-ai@claude-code-best.win> Co-authored-by: glm-5.2 <zai-org@claude-code-best.win>
This commit is contained in:
@@ -1417,11 +1417,21 @@ export function updateMessageLookupsIncremental(
|
||||
return null
|
||||
}
|
||||
|
||||
// No new messages — nothing to do
|
||||
// No new messages — nothing to do, UNLESS the trailing message is a
|
||||
// progress tick. REPL.tsx replaces ephemeral progress (Bash/PowerShell/MCP)
|
||||
// in-place to bound the messages array — same length, but the trailing
|
||||
// progress is a fresh tick. Returning `existing` here would leave
|
||||
// progressMessagesByToolUseID stuck on the first tick and elapsed-time
|
||||
// displays (ShellProgressMessage) would freeze. Force a full rebuild so
|
||||
// the fresh tick propagates.
|
||||
if (
|
||||
normalizedMessages.length === previousNormalizedCount &&
|
||||
messages.length === previousMessageCount
|
||||
) {
|
||||
const lastNormalized = normalizedMessages[normalizedMessages.length - 1]
|
||||
if (lastNormalized && lastNormalized.type === 'progress') {
|
||||
return null
|
||||
}
|
||||
return existing
|
||||
}
|
||||
|
||||
@@ -1605,7 +1615,13 @@ export function computeMessageStructureKey(
|
||||
}
|
||||
for (const msg of normalizedMessages) {
|
||||
if (msg.type === 'progress') {
|
||||
parts.push('p', (msg as ProgressMessage).parentToolUseID as string)
|
||||
const pMsg = msg as ProgressMessage
|
||||
// Include uuid so ephemeral progress tick replacements
|
||||
// (Bash/PowerShell/MCP) invalidate the lookups cache. Without this,
|
||||
// REPL.tsx's in-place tick replacement (same parentToolUseID, same
|
||||
// length) yields an identical key, lookups cache the first tick
|
||||
// forever, and ShellProgressMessage's elapsed time freezes.
|
||||
parts.push('p', pMsg.parentToolUseID as string, pMsg.uuid)
|
||||
}
|
||||
}
|
||||
return parts.join(',')
|
||||
|
||||
Reference in New Issue
Block a user