8.3 KiB
DEV-LOG
Enable Remote Control / BRIDGE_MODE (2026-04-03)
PR: claude-code-best/claude-code#60
Remote Control 功能将本地 CLI 注册为 bridge 环境,生成可分享的 URL(https://claude.ai/code/session_xxx),允许从浏览器、手机或其他设备远程查看输出、发送消息、审批工具调用。
改动文件:
| 文件 | 变更 |
|---|---|
scripts/dev.ts |
DEFAULT_FEATURES 加入 "BRIDGE_MODE",dev 模式默认启用 |
src/bridge/peerSessions.ts |
stub → 完整实现:通过 bridge API 发送跨会话消息,含三层安全防护(trim + validateBridgeId 白名单 + encodeURIComponent) |
src/bridge/webhookSanitizer.ts |
stub → 完整实现:正则 redact 8 类 secret(GitHub/Anthropic/AWS/npm/Slack token),先 redact 再截断,失败返回安全占位符 |
src/entrypoints/sdk/controlTypes.ts |
12 个 any stub → z.infer<ReturnType<typeof XxxSchema>> 从现有 Zod schema 推导类型 |
src/hooks/useReplBridge.tsx |
tengu_bridge_system_init 默认值 false → true,使 app 端显示 "active" 而非卡在 "connecting" |
关键设计决策:
- 不改现有代码逻辑 — 只补全 stub、修正默认值、开启编译开关
tengu_bridge_system_init— Anthropic 通过 GrowthBook 给订阅用户推送true,但我们的 build 收不到推送;改默认值是唯一不侵入其他代码的方案peerSessions.ts认证 — 使用getBridgeAccessToken()获取 OAuth Bearer token,与bridgeApi.ts/codeSessionApi.ts认证模式一致webhookSanitizer.ts安全 — fail-closed(出错返回[webhook content redacted due to sanitization error]),不泄露原始内容
验证结果:
/remote-control命令可见且可用- CLI 连接 Anthropic CCR,生成可分享 URL
- App 端(claude.ai/code)显示 "Remote Control active"
- 手机端(Claude iOS app)通过 URL 连接,双向消息正常
WebSearch Bing 适配器补全 (2026-04-03)
原始 WebSearchTool 仅支持 Anthropic API 服务端搜索(web_search_20250305 server tool),在非官方 API 端点(第三方代理)下搜索功能不可用。本次改动引入适配器架构,新增 Bing 搜索页面解析作为 fallback。
新增文件:
| 文件 | 说明 |
|---|---|
src/tools/WebSearchTool/adapters/types.ts |
适配器接口定义:WebSearchAdapter、SearchResult、SearchOptions、SearchProgress |
src/tools/WebSearchTool/adapters/apiAdapter.ts |
API 适配器 — 将原有 queryModelWithStreaming 逻辑封装为 ApiSearchAdapter |
src/tools/WebSearchTool/adapters/bingAdapter.ts |
Bing 适配器 — 直接抓取 Bing HTML,正则提取搜索结果 |
src/tools/WebSearchTool/adapters/index.ts |
适配器工厂 — 根据环境变量 / API Base URL 选择后端 |
src/tools/WebSearchTool/__tests__/bingAdapter.test.ts |
Bing 适配器单元测试(32 cases:decodeHtmlEntities、extractBingResults、search mock) |
src/tools/WebSearchTool/__tests__/bingAdapter.integration.ts |
Bing 适配器集成测试 — 真实网络请求验证 |
重构文件:
| 文件 | 变更 |
|---|---|
src/tools/WebSearchTool/WebSearchTool.ts |
从直接调用 API 改为 createAdapter() 工厂模式;isEnabled() 始终返回 true;删除 ~200 行内联 API 调用逻辑 |
src/tools/WebFetchTool/utils.ts |
skipWebFetchPreflight 默认值从 !undefined(即 true)改为显式 === false,使域名预检默认启用 |
Bing 适配器关键技术细节:
- 反爬绕过:使用完整 Edge 浏览器请求头(含
Sec-Ch-Ua、Sec-Fetch-*等 13 个标头),避免 Bing 返回 JS 渲染的空页面;setmkt=en-US参数强制美式英语市场,避免 IP 地理定位导致的区域化结果(德语论坛、新加坡金价等不相关内容) - URL 解码(
resolveBingUrl()):Bing 返回的重定向 URL(bing.com/ck/a?...&u=a1aHR0cHM6Ly9...)中u参数为 base64 编码的真实 URL,需解码后使用 - 摘要提取(
extractSnippet()):三级降级策略 —b_lineclamp→b_caption <p>→b_caption直接文本 - HTML 实体解码(
decodeHtmlEntities()):处理 7 种常见 HTML 实体 - 域过滤:客户端侧
allowedDomains/blockedDomains过滤,支持子域名匹配
当前状态:adapters/index.ts 中 createAdapter() 硬编码返回 BingSearchAdapter,跳过了 API/Bing 自动选择逻辑(原逻辑被注释保留)。未来可通过取消注释恢复自动选择。
移除反蒸馏机制 (2026-04-02)
项目中发现三处 anti-distillation 相关代码,全部移除。
移除内容:
src/services/api/claude.ts— 删除 fake_tools 注入逻辑(原第 302-314 行),该代码通过ANTI_DISTILLATION_CCfeature flag 在 API 请求中注入anti_distillation: ['fake_tools'],使服务端在响应中混入虚假工具调用以污染蒸馏数据src/utils/betas.ts— 删除 connector-text summarization beta 注入块及SUMMARIZE_CONNECTOR_TEXT_BETA_HEADER导入,该机制让服务端缓冲工具调用间的 assistant 文本并摘要化返回src/constants/betas.ts— 删除SUMMARIZE_CONNECTOR_TEXT_BETA_HEADER常量定义(原第 23-25 行)src/utils/streamlinedTransform.ts— 注释从 "distillation-resistant" 改为 "compact",streamlined 模式本身是有效的输出压缩功能,仅修正描述
Buddy 命令合入 + Feature Flag 规范修正 (2026-04-02)
合入 pr/smallflyingpig/36 分支(支持 buddy 命令 + 修复 rehatch),并修正 feature flag 使用方式。
合入内容(来自 PR):
src/commands/buddy/buddy.ts— 新增/buddy命令,支持 hatch / rehatch / pet / mute / unmute 子命令src/commands/buddy/index.ts— 从 stub 改为正确的Command类型导出src/buddy/companion.ts— 新增generateSeed(),getCompanion()支持 seed 驱动的可复现 rollingsrc/buddy/types.ts—CompanionSoul增加seed?字段
合并后修正:
src/entrypoints/cli.tsx— PR 硬编码了const feature = (name) => name === "BUDDY",违反 feature flag 规范,恢复为标准import { feature } from 'bun:bundle'src/commands.ts— PR 用静态import buddy绕过了 feature gate,恢复为feature('BUDDY') ? require(...) : null+ 条件展开src/commands/buddy/buddy.ts— 删除未使用的companionInfoText函数和多余的Roll/SPECIESimportCLAUDE.md— 重写 Feature Flag System 章节,明确规范:代码中统一用import { feature } from 'bun:bundle',启用走环境变量FEATURE_<NAME>=1
用法: FEATURE_BUDDY=1 bun run dev
Auto Mode 补全 (2026-04-02)
反编译丢失了 auto mode 分类器的三个 prompt 模板文件,代码逻辑完整但无法运行。
新增:
yolo-classifier-prompts/auto_mode_system_prompt.txt— 主系统提示词yolo-classifier-prompts/permissions_external.txt— 外部权限模板(用户规则替换默认值)yolo-classifier-prompts/permissions_anthropic.txt— 内部权限模板(用户规则追加)
改动:
scripts/dev.ts+build.ts— 扫描FEATURE_*环境变量注入 Bun--featurecli.tsx— 启动时打印已启用的 featurepermissionSetup.ts—AUTO_MODE_ENABLED_DEFAULT由feature('TRANSCRIPT_CLASSIFIER')决定,开 feature 即开 auto modedocs/safety/auto-mode.mdx— 补充 prompt 模板章节
用法: FEATURE_TRANSCRIPT_CLASSIFIER=1 bun run dev
注意: prompt 模板为重建产物。
USER_TYPE=ant TUI 修复 (2026-04-02)
global.d.ts 声明的全局函数在反编译版本运行时未定义,导致 USER_TYPE=ant 时 TUI 崩溃。
修复方式:显式 import / 本地 stub / 全局 stub / 新建 stub 文件。涉及文件:
cli.tsx, model.ts, context.ts, effort.ts, thinking.ts, undercover.ts, Spinner.tsx, AntModelSwitchCallout.tsx(新建), UndercoverAutoCallout.tsx(新建)
注意:
USER_TYPE=ant启用 alt-screen 全屏模式,中心区域满屏是预期行为global.d.ts中剩余未 stub 的全局函数(getAntModels等)遇到X is not defined时按同样模式处理
