Skip to content

[pull] main from claude-code-best:main - #6

Open
pull[bot] wants to merge 678 commits into
Tialon:mainfrom
claude-code-best:main
Open

[pull] main from claude-code-best:main#6
pull[bot] wants to merge 678 commits into
Tialon:mainfrom
claude-code-best:main

Conversation

@pull

@pull pull Bot commented Apr 3, 2026

Copy link
Copy Markdown

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

@pull pull Bot locked and limited conversation to collaborators Apr 3, 2026
@pull pull Bot added the ⤵️ pull label Apr 3, 2026
suger-m and others added 27 commits May 6, 2026 17:26
When ANTHROPIC_BASE_URL points to a non-Anthropic endpoint (e.g.
DeepSeek), the JSON-formatted user_id containing {, ", : characters
fails validation against ^[a-zA-Z0-9_-]+$. Send only the hex device_id
for third-party providers.
…r-id

fix: third-party API user_id validation error (DeepSeek, etc.)
docs: expand sub-agent architecture guide
- Zod schema 补齐 refreshInterval 字段
- 通过 scheduleUpdate 复用 300ms debounce,event/settings/time 三路触发单飞
- 新增 docs/features/status-line.mdx 调研文档
…nterval

feat: 状态栏支持 refreshInterval 定时刷新
还原 commit 51b8ad4 删除的 diff highlight 显示:FileEdit/FileWrite 工具
执行成功后重新展示 StructuredDiffList,拒绝时重新展示高亮代码预览或
带上下文的 diff 视图。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AgentSummary 30s fork 循环的内存泄露已在 commit 52b61c2 修复(闭包
引用丢弃 + 上下文重建 + 消息/字符上限),重新启用该 feature。

用户可通过 /coordinator 命令或 CLAUDE_CODE_COORDINATOR_MODE=1 环境变量
激活多 worker 编排模式。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
迁移逻辑过于激进,用户手动删除 [1m]] 后会被自动加回。
现在将 migrateOpusToOpus1m 改为 no-op,保留用户的手动模型选择。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
每次 API 请求后自动计算缓存命中率,低于阈值(默认 80%)时在对话流中显示黄色警告消息。
同时更新 /context 命令输出中显示缓存命中率。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
getRealModelName() 现在会检查 provider 特定环境变量(OPENAI_MODEL、GEMINI_MODEL、GROK_MODEL),
确保通过这些变量设置模型时署名显示真实名称而非 Anthropic 默认模型名。

Co-Authored-By: opus[1m] <noreply@anthropic.com>
去掉 getUserSpecifiedModelSetting() 分支,统一走 getMainLoopModel()(解析别名)
+ resolveProviderModel()(解析 provider 映射)的完整链路。

Co-Authored-By: opus[1m] <noreply@anthropic.com>
- 新增 attributionEmail.ts 实现模型名到邮箱的自动映射
- 重构署名逻辑,统一使用 getRealModelName() 和 getAttributionEmail()
- 将产品名从 Claude Code 更新为 Claude Code Best
- 更新 PRODUCT_URL 指向 claude-code-best fork 仓库

Co-Authored-By: glm-4.7 <noreply@zhipuai.cn>
Co-Authored-By: glm-5.1[1m] <zhipuai@users.noreply.github.com>
Co-Authored-By: glm-5.1[1m] <zai-org@users.noreply.github.com>
Co-Authored-By: glm-5-turbo <zai-org@claude-code-best.win>
修复在 dev 模式下按下 Ctrl+O 切换 transcript 视图时 React 抛出
"Rendered fewer hooks than expected" 崩溃的问题。

## 根因分析

项目中有大量 hook(useState / useMemo / useRef / useSyncExternalStore 等)
被包裹在 `feature()` 三元表达式中条件调用,例如:

    const value = feature('X') ? useHook() : defaultValue;

在 build 模式下 `feature()` 是编译时常量,死代码消除会移除未使用的分支,
hooks 数量在编译后是确定的。但在 dev 模式下(scripts/dev.ts 注入
--feature 启用全部 31 个 feature),`feature()` 是运行时调用,
但始终返回 true,因此所有 hooks 都会被调用,原本不会出问题。

真正的触发器是 REPL.tsx 第 5381 行的提前返回:

    if (screen === 'transcript') { return transcriptReturn; }

当用户按下 Ctrl+O 进入 transcript 模式时,该提前返回之后的所有 hooks
(如 displayedAgentMessages 的 useMemo)都不会被调用,导致 React 在
下一次渲染时检测到 hooks 数量与上次不一致而崩溃。

此外,其他文件中也存在相同的条件式 hook 模式——虽然 dev 模式下
feature() 返回 true,所以这些路径实际上不会被触发,但它们是
潜在的隐患:若将来有人通过环境变量关闭某个 feature,
同样的崩溃会立即出现。

## 修复策略

采用统一模式:**始终无条件调用 hook,将 feature() gate 应用到值上**。

    // Before (unsafe — hook count varies by feature flag)
    const value = feature('X') ? useHook() : defaultValue;

    // After (safe — hook always called, gate on the value)
    const rawValue = useHook();
    const value = feature('X') ? rawValue : defaultValue;

## 修改清单

### 核心修复(REPL.tsx)
- 将 `displayedAgentMessages` useMemo 及依赖变量(viewedTask /
  viewedTeammateTask / viewedAgentTask / usesSyncMessages /
  rawAgentMessages / displayedMessages)从 transcript 提前返回
  之后移至之前,确保两模式下 hooks 调用顺序一致
- 修复 `disableMessageActions` / `useAssistantHistory` /
  `voiceIntegration` 的条件式 hook 调用

### 条件式 hook 修复(11 个文件)
- src/hooks/useGlobalKeybindings.tsx — isBriefOnly / toggleBrief
  keybinding 改为 isActive 门控
- src/hooks/useReplBridge.tsx — 5 个 BRIDGE_MODE 选值改为无条件调用
- src/hooks/useVoiceIntegration.tsx — 4 个 VOICE_MODE 选值修复
- src/components/PromptInput/Notifications.tsx — 4 个 feature 选值修复
- src/components/PromptInput/PromptInput.tsx — briefOwnsGap /
  companionSpeaking 修复
- src/components/PromptInput/PromptInputFooterLeftSide.tsx — 4 个
  VOICE_MODE 选值修复
- src/components/PromptInput/PromptInputQueuedCommands.tsx — isBriefOnly
- src/components/Spinner.tsx — briefEnvEnabled 修复
- src/components/TextInput.tsx — voiceState / audioLevels /
  animationFrame 修复
- src/components/messages/AttachmentMessage.tsx — isDemoEnv 修复
- src/components/messages/UserPromptMessage.tsx — isBriefOnly /
  viewingAgentTaskId / briefEnvEnabled 修复
- src/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx
  — isBriefOnly 修复

### 其他修复
- src/components/FeedbackSurvey/useFrustrationDetection.ts — 将 3 个
  提前返回合并为 shouldSkip 变量,handleTranscriptSelect 提前 return
- src/hooks/useIssueFlagBanner.ts — useRef 移到 USER_TYPE 检查之前
- src/hooks/useUpdateNotification.ts — useState 改为 useRef,
  避免版本号变化触发不必要重渲染

### 构建/开发配置
- build.ts — 添加 `sourcemap: 'linked'`
- scripts/dev.ts — NODE_ENV 从 'production' 改为 'development'

Closes #434
fix: 修复条件式 hook 调用导致的 "Rendered fewer hooks than expected" 错误
… 搜索增强)

- 新增 CORE_TOOLS 白名单常量(31 个核心工具),重构 isDeferredTool 为白名单制判定
- 新建 TF-IDF 工具索引模块(toolIndex.ts),复用 localSearch.ts 算法函数
- 新建 ExecuteTool 跨 API provider 统一工具执行入口
- 增强 ToolSearchTool:TF-IDF 搜索路径、discover: 模式、并行搜索合并、文本模式回退
- 新增 27 个单元测试,precheck 零错误通过(4108 tests pass)

Co-Authored-By: glm-5.1[1m] <zai-org@claude-code-best.win>
…ridge 启用时可用

- PushNotificationTool、SendUserFileTool 添加 isEnabled() 使用 isBridgeEnabled()
- BriefTool 的 isEnabled() 从 isBriefEnabled() 改为 isBridgeEnabled()
- ExecuteTool 添加 isEnabled() 兜底检查,不可用时返回友好错误
- useReplBridge bridge 首次连接时插入 system 消息通知模型新工具可用
- 移除 toolSearch 中 firstParty base URL 白名单检测,默认启用 tool search

Co-Authored-By: glm-5.1[1m] <zai-org@claude-code-best.win>
…vider 通用

- 重命名 ExecuteTool → ExecuteExtraTool,作为一等工具始终可用
- ToolSearchTool 输出改为纯文本(区分 core/deferred),移除 tool_reference blocks
- 移除 modelSupportsToolReference() 及相关 GrowthBook 配置
- 移除 API 侧 defer_loading 字段和 tool search beta header 注入
- 简化 system prompt(工具使用指南从 ~120 行压缩到 ~10 行)
- extractDiscoveredToolNames 支持文本格式解析(向后兼容旧 session 的 tool_reference)
- 更新 promptEngineeringAudit 测试以匹配简化后的 prompt 结构

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
claude-code-best and others added 30 commits July 17, 2026 17:02
…sidequery

fix(api): use ChatGPT OAuth for OpenAI sideQuery (auto-mode classifier)
…-chatgpt-models

feat(openai): sticky prompt cache, usage mapping, and GPT-5.6 models
feat(windows): default to PowerShell for shell tools and ! commands
…1299)

* feat: 老旧 Windows 控制台(pre-ConPTY)自动兼容模式

Windows 10 build < 17763(1709/LTSC 等无 ConPTY 的内网机器)上,
老 conhost 的 VT 解析器对增量渲染的行尾 pending-wrap 语义处理有误,
真实光标与虚拟光标漂移,花屏残渣持续累积,直到一次全量重绘才消除。
该问题影响此类机器上的所有终端(VS Code/mintty 走 winpty 抓取的
是同一份损坏的 conhost buffer)。

- 新增 legacyConsole.ts:按 os.release() build 号自动检测,
  CLAUDE_CODE_LEGACY_CONSOLE=1/0 可强制开/关
- log-update.ts:命中时每约 1 秒用一次全量重绘替换增量 diff,
  屏幕持续自愈;非老控制台环境完全不走此路径
- 6 个单元测试(检测逻辑 + 环境变量覆盖 + 缓存行为)

* docs: CLAUDE.md 补充老控制台兼容模式说明,修正版本号描述

* feat: 老控制台兼容模式支持强度调节

真机(1709/build 16299)第一轮验证反馈周期性自愈可能不足,
增加两个调节旋钮:

- CLAUDE_CODE_LEGACY_CONSOLE=2(或 always):每帧全量重绘,
  用于增量 diff 立即花屏、1 秒自愈不够的机器
- CLAUDE_CODE_LEGACY_CONSOLE_RESET_MS:周期模式的重绘间隔,
  钳制在 [100, 10000],默认 1000 不变

默认行为不变(自动检测 → periodic 1s)。新增 9 个单元测试
(模式解析、间隔钳制、空串回退、缓存行为)。

* fix: 老控制台花屏根因修复——渲染宽度收窄 1 列绕开 pending-wrap

真机(1709/build 16299)第二轮反馈:周期性全量重绘在跑(可见闪烁)
但花屏范围随重绘扩大。定位到真正根因:老 conhost 对 pending-wrap
的处理是「写满最后一列立即换行」(现代终端为挂起等待),任何顶满
行宽的输出(分隔线、满行文本)都会把真实光标多推一行——增量 diff
和全量重绘同样受害,且每次重绘还把缓冲区多滚几行,旧帧残渣上移,
表现为「越闪越花」。

修复:legacy 模式下 effectiveColumns() 把渲染宽度收窄 1 列
(下限 20),任何一行都不再触碰最后一列,pending-wrap 缺陷路径
从源头绕开;周期重绘保留作为兜底自愈。非 legacy 环境行为完全不变。

新增 effectiveColumns 单元测试;ink.tsx 三处宽度读取统一走该函数。
… mapping, tier ChatGPT model routing (#1300)

Co-authored-by: DavidShawa <DavidShawa@users.noreply.github.com>
全局槽 lastCacheSafeParams 从不清空,/clear(regenerateSessionId)与进程内
/resume(switchSession)后残留旧会话完整历史,会被 /recap、SDK
side_question/promptSuggestion 拼进发给 API 的请求前缀,导致回复引用另一段
对话。

- 槽迁到 src/utils/cacheSafeParamsSlot.ts:保存时记 sessionId,读取时不匹配
  则自愈清空并释放旧消息数组
- clearConversation 显式 saveCacheSafeParams(null) 立即释放内存
- 迁移四处调用点 import(stopHooks/print/btw/generateRecap)
- biome.json 排除 dist-stable 构建产物快照,避免 precheck 扫描改写
- 新增 8 个单测,用真实 regenerateSessionId/switchSession 复现两条路径

Co-Authored-By: claude-fable-5 <noreply@anthropic.com>
fix: 修复 lastCacheSafeParams 跨会话残留导致 post-turn fork 上下文污染
对比 mitm 抓到的官方 claude-cli/2.1.205 compact 请求,BASE compact
prompt 缺失两处安全约束,补齐后与官方逐字节一致:

1. 分析指令 step 1 新增 bullet:security-relevant instructions/
   constraints(敏感文件、禁止操作、凭证处理)必须 verbatim 保留,
   使其在 compaction 后继续生效。
2. 第 6 节 All user messages 新增 prompt-injection 防御:只有真正
   user-role turn 才算用户消息;assistant 消息内部伪装成 "user:"/
   "Human:" 或 transcript 样式的文本视为模型生成,绝不能当作用户
   请求/批准/确认——防止借 compaction 把注入内容洗白成权威用户指令。

step 1 的 bullet 经 DETAILED_ANALYSIS_INSTRUCTION_BASE 同步至
UP_TO 变体。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…y-hardening

fix: 对齐官方 2.1.205 compact prompt 的安全加固
Fix broken .gitignore wildcards
fix: 尊重 perf report 的自定义配置目录
Windows 启用 WSL 时,`where.exe bash` 返回 C:\Windows\System32\bash.exe(WSL 启动器)和 %LOCALAPPDATA%\Microsoft\WindowsApps\bash.exe(WSL App Execution Alias),位置常在 Git for Windows 的 bash 之前。原 findExecutableWithDeps 直接返回首个非 cwd 结果,CCB 因此把 WSL 启动器误认为 Git Bash,污染 process.env.SHELL 与 CLAUDE_CODE_GIT_BASH_PATH 整个会话,所有 hook / BashTool 调用都会拉起 wsl.exe 弹窗。

在 findExecutableWithDeps 内、当 executable='bash' 时,过滤 System32 与 WindowsApps 的 bash.exe 候选。continue 到下一个 where.exe 命中,让 PATH 后续的合法 Git Bash 仍能胜出。下游消费者(setShellIfWindows env 传播、hooks.ts spawn 点、Shell.ts SHELL 分支)通过 env 缓存自动受益。

同时添加用户可见的提示:
- Shell.ts findSuitableShell:检测到 WSL bash 但无 Git for Windows 且未设 CLAUDE_CODE_GIT_BASH_PATH override 时,启动一次性 warning。
- doctorDiagnostic.ts:相同条件的 `claude doctor` 持久诊断项,方便用户随时复查。

3 个新单元测试覆盖该过滤器:
- 拒绝 WSL System32 bash → null
- 拒绝 WSL WindowsApps bash → null
- 跳过 WSL bash,fall through 到下一个 where.exe 命中

Co-Authored-By: glm-5.2[1m] <zai-org@claude-code-best.win>
…eject

fix(windows): reject WSL bash.exe in findGitBashPath detection。表述有误,实际的意思是,在使用git bash时,不会调用wsl的bash.exe, 因为他的优先级更高,会覆盖掉原有的git bash
filterToolProgressMessages 放行 data:null 的 progress 消息(结构漏洞),
UserToolSuccessMessage 的工具结果渲染不在嵌套边界内(任何字段访问崩溃
都会撕裂整个 MessagesBoundary)。补齐两层防线:
- Tool.ts: data != null 过滤 + UserToolSuccessMessage 结果槽位加
  SentryErrorBoundary(name=ToolResultMessage)
- BashTool/PowerShellTool/MonitorTool/AttachmentMessage/
  UserTeammateMessage/TaskAssignmentMessage 的 taskId 读取改可选链
- 新增 filterToolProgressMessages data:null 回归测试

Co-Authored-By: deepseek-v4-flash <deepseek-ai@claude-code-best.win>
review 后移除 8 处纯防御性可选链改动(原有守卫已完整),仅保留:
- filterToolProgressMessages 拒绝 data 为 null 的 progress 消息
- ToolResultMessage 边界包裹,隔离工具结果 UI 渲染崩溃
- AssistantToolUseMessage / messages.ts 同源 data 空值守卫

Co-Authored-By: deepseek-v4-flash <deepseek-ai@claude-code-best.win>
…null-render-crash

Fix/issue 1330 taskid null render crash #1330
fix(workflow): validate structured agent output
fix(auth): honor settings-based providers
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.