evanjcosgrove/claude-cowork-1m-patch

GitHub: evanjcosgrove/claude-cowork-1m-patch

macOS 本地补丁脚本,用于修复 Claude Desktop Cowork 模式下因服务器端标志回滚导致的上下文窗口降级。

Stars: 1 | Forks: 0

# claude-cowork-1m-patch macOS 补丁脚本,用于在 Claude Desktop 的 Cowork 模式下恢复 1M 上下文行为。修改两个本地文件,更新 ASAR 完整性元数据,并使用原始权限重新签署应用程序包。最初需要该补丁,因为 2026-03-19 服务器端功能标志回滚导致 Max 计划订阅者从 1M 上下文被静默降级为 200K。 ## 范围 本脚本故意保持狭窄。 **仅本地修改:** - `/Applications/Claude.app/Contents/Resources/app.asar` — 两个相同长度的 JS 字节交换 - `/Applications/Claude.app/Contents/Info.plist` — 重新计算的 ASAR 头部哈希 **读取:** - 本地应用程序包及其当前的代码签名权限 **网络:** - 如果尚未存在,则从 npm 安装 `@electron/asar@4.2.0` 到临时目录(使用 `--ignore-scripts`)。建议预先安装以跳过此步骤。 - 不调用 Anthropic API。 **备份(在修改前创建):** - `~/Desktop/app.asar.backup-YYYYMMDD-HHMMSS` - `~/Desktop/Info.plist.backup-YYYYMMDD-HHMMSS` **安全关闭:** 如果脚本无法识别 ASAR 结构,则以 `unknown` 退出,而不是半修补。不需要 `sudo`。 ## 兼容性 | Claude Desktop 版本 | 第一层形式 | 状态 | 最后测试时间 | | --- | --- | --- | --- | | 1.569.0 | 正则表达式 | 可用 | 2026-04-18 | | 1.3109.0 | 数组 | 可用 | 2026-04-20 | 介于两者之间的版本很可能可用,但尚未验证。如果字节锚点匹配任一形式失败,预检将退出 `unknown` 而不是猜测——请参阅 [CHANGELOG.md](CHANGELOG.md) 了解变更详情。 ## 快速开始 ``` ./patch-claude-1m.sh ``` 脚本处理一切:备份原始 ASAR,打印功能标志,更新所有完整性哈希,并使用保留的权限重新签署应用程序。 完成后,重启 Claude Desktop 并开始一个新的 Cowork 会话: ``` osascript -e 'quit app "Claude"'; sleep 3; open -a Claude ``` **前提条件:** Node.js、Python 3、已安装 Claude Desktop 的 macOS。脚本会自动安装 `@electron/asar` 到临时目录(如果尚不可用)。 ## 检查后再运行 审核脚本会触及的内容及其使用的网络: ``` grep -nE 'npm|curl|wget|ssh|scp|rsync' patch-claude-1m.sh grep -nE '/Applications/Claude.app|Info.plist|app.asar' patch-claude-1m.sh bash -n patch-claude-1m.sh ``` 要完全跳过 npm 安装,请预先安装固定依赖项: ``` npm install -g @electron/asar@4.2.0 ``` ## 验证成功 成功运行将打印: ``` Layer 1a (feature flag): BYPASSED Layer 1b (model allow-list): BROADENED Virtualization entitlement: PRESENT ``` 然后退出并重新启动 Claude,开始一个 **新的** Cowork 会话,并确认 `[1m]` 是否被传递给生成的模型: ``` tail -f ~/Library/Logs/Claude/cowork_vm_node.log | grep -- '--model' ``` 你应该看到 `--model claude-opus-4-7[1m]`(或 `claude-opus-4-6[1m]`)。 ## 回滚 从桌面上的备份恢复脚本创建的文件: ``` cp ~/Desktop/app.asar.backup-YYYYMMDD-HHMMSS \ /Applications/Claude.app/Contents/Resources/app.asar cp ~/Desktop/Info.plist.backup-YYYYMMDD-HHMMSS \ /Applications/Claude.app/Contents/Info.plist osascript -e 'quit app "Claude"'; sleep 2; open -a Claude ``` ## 问题 功能标志 `3885610113` 控制 Cowork 模型解析函数是否在模型名称后追加 `[1m]`。2026-03-19,服务器端对该标志进行了回滚——相同的应用程序版本、相同的会话设置,但行为不同。日志时间戳确认了边界:`18:36` 时存在 `[1m]`,`19:59` 时不存在。CLI 未受影响;只有 Desktop 的 `LocalAgentModeSessionManager` 被破坏。 17 位以上用户在 GitHub 问题中报告了此问题 [#37413](https://github.com/anthropics/claude-code/issues/37413)、[#36760](https://github.com/anthropics/claude-code/issues/36760)、[#36351](https://github.com/anthropics/claude-code/issues/36351) 和 [#33154](https://github.com/anthropics/claude-code/issues/33154),但 Anthropic 沉默了一个多月仍未解决。Max 订阅者(每月 200 美元)支付了 1M 却只得到了 200K。 ## 根本原因 Electron 应用程序的 `app.asar` 包含一个模型解析函数,其中有两个**独立的门控条件**,两者都必须通过才能追加 `[1m]`: ``` function ZAt(t) { return /\[1m\]/i.test(t) || !Sn("3885610113") || !/sonnet-4-6|opus-4-6/i.test(t) ? t : `${t}[1m]` } ``` 这是一个三条件 OR 的三元表达式——只要**任意一个**为真,模型名称就会原样返回。 - **门控 A — 服务器功能标志。** `Sn("3885610113")` 检查服务器端标志。当**关闭**时(自 2026-03-19 的当前状态),`!Sn(...)` 求值为 `true`,三元表达式短路,`[1m]` 从未追加。无论计划如何,你都只能得到 200K。 - **门控 B — 模型允许列表。** 即使标志开启,正则表达式 `/sonnet-4-6|opus-4-6/i` 也只允许 1M 对应这两个模型名称。当 Anthropic 在 2026-04-18 向 Cowork 推送 `claude-opus-4-7` 时,该正则表达式**不匹配**——因此即使已修补的二进制文件也会将 4-7 会话降级到 200K。 该补丁通过两个相同长度的 JS 替换来解决这两个门控。函数和变量名(`ZAt`、`Sn`、`A7e`、`Ti`、……)已被压缩并可能在不同应用程序版本间轮换。该标志 ID `3885610113` 是稳定的第一层锚点。 对于第二层,Anthropic 在 Claude Desktop v1.3109 附近将门控从正则表达式重构为数组 `.includes()` 检查。脚本知道两种字节锚点并根据运行时存在的形式进行检测: - **形式 A(正则表达式;较旧的 ASAR,< v1.3109):** 锚点 `sonnet-4-6|opus-4-6` → `opus-4-[67](?:)(?:)`(19 字节替换)。 - **形式 B(数组;较新的 ASAR,≥ v1.3109):** 锚点 `["claude-sonnet-4-6","claude-opus-4-6"]` → `[ "claude-opus-4-6","claude-opus-4-7" ]`(39 字节替换)。 如果在任一形式中都找不到锚点,脚本将拒绝半修补并退出 `unknown`——这意味着 Anthropic 可能再次重构了门控,需要添加形式 C。请参阅 [CHANGELOG.md](CHANGELOG.md)。 ## 工作原理 该补丁修改 ASAR 中的一个 JS 表达式,但应用程序强制执行四层完整性校验,任意文件的更改都会破坏这些层。每一层都必须按顺序更新: | 层 | 检查内容 | 补丁处理方式 | | --- | --- | --- | | **1. JS 应用逻辑** | 模型解析函数中的两个门控:服务器功能标志 + 模型允许列表(旧版 ASAR 为正则表达式,新版为 JS 数组)。 | **1a:** 将 `!Sn("3885610113")` 替换为 `!1/*___________*/`(相同的 17 字节,求值结果为 `false`)。
**1b:** 要么将 `sonnet-4-6\|opus-4-6` → `opus-4-[67](?:)(?:)`(正则形式,19 字节),要么将 `["claude-sonnet-4-6","claude-opus-4-6"]` → `[ "claude-opus-4-6","claude-opus-4-7" ]`(数组形式,39 字节),取决于 ASAR 中包含的锚点。 | | **2. 每文件完整性** | ASAR 头部的 `index.js` 的 SHA256 哈希 | 重新计算文件哈希 + 块哈希,在头部替换(长度相同)。 | | **3. 头部完整性** | ASAR 头部在 `Info.plist` 中的 SHA256 哈希 | 通过 `@electron/asar` 的 `getRawHeader()` 重新计算,并写入 plist。 | | **. 代码签名** | macOS 权限,用于 Cowork 的 VM 沙箱 | 在替换前提取原始权限,使用 `--entitlements` 重新签署。 | 关键约束:所有替换必须**长度相同**。更改任何文件偏移量都会使 V8 的编译字节码缓存失效,导致启动时出现 `EXC_BREAKPOINT` 崩溃。这排除了明显的方法(提取 ASAR、编辑 JS、重新打包)——因为重新打包会使存档从 19MB 膨胀到 60MB,因为原生 `.node` 二进制文件会从 `app.asar.unpacked` 中拉取。 有关每一层完整技术细节,请参阅 [docs/integrity-layers.md](docs/integrity-layers.md)。有关逆向工程过程和失败的提取/重新打包尝试,请参阅 [docs/root-cause-analysis.md](docs/root-cause-analysis.md)。 ### 权限注意事项 重新签署后,如果缺少 `com.apple.security.virtualization`,Cowork 可能会显示“无效安装”。这发生在使用 `codesign --deep` 时,它会重新签署内部框架并剥离其原始的 Anthropic 签名。修复方法:**不要**使用 `--deep` 进行签署,并通过 `--entitlements` 传递原始权限。脚本会自动在修改前提取权限并处理此问题。 ## 日志证据 | 时间戳 | 事件 | | --- | --- | | 2026-03-18 06:51 | 在 Cowork 会话中首次观察到 `[1m]` | | 2026-03-19 18:36:58 | **最后正常会话** — `model: claude-opus-4-6[1m]` | | 2026-03-19 19:59:08 | **首次故障会话** — `model: claude-opus-4-6`(相同应用程序版本,标志回滚) | | 2026-03-31 → 2026-04-06 | 110 个连续会话,均无 `[1m]` | | 2026-04-03 09:08 | 上下文窗口超出错误 — 确认达到 200K 限制 | | 2026-04-18 20:19:30 | 最后一次使用仅标志绕过补丁的 `opus-4-6[1m]` 正常会话 | | 2026-04-18 20:19:53 | **第二次回归** — 首个 `opus-4-7` 会话,无 `[1m]`。相同应用程序版本 (1.569.0),标志绕过补丁仍安装。模型允许列表正则表达式不匹配 4-7。 | | 2026-04-19 → 04-20 | **v1.3109.0 重构发现** — Anthropic 将门控替换为数组 (`.some(t => e.includes(t))`),使用 `["claude-sonnet-4-6","claude-opus-4-6"]`。脚本的正则锚点在新的 ASAR 中不存在;预检半修补并验证失败。添加了形式 B(数组)检测 + 匹配相同长度的替换。请参阅 [CHANGELOG.md](CHANGELOG.md)。 | ## 注意事项 - **自动更新会覆盖补丁。** 每次 Claude Desktop 更新后,请重新运行 `./patch-claude-1m.sh`。 - **压缩名称会随版本变化。** 脚本通过稳定的字节锚点匹配:标志 ID `3885610113`(第一层),以及根据 ASAR 版本选择两个第二层锚点之一 — `sonnet-4-6|opus-4-6`(正则形式,旧版)或 `["claude-sonnet-4-6","claude-opus-4-6"]`(数组形式,新版)。不依赖具体的变量和函数名(`ZAt`、`Sn`、`A7e`、`Ti`、……)。当 Anthropic 再次重构门控时,预计需要添加形式 C。 - **仅限 Opus。** 第二层的新正则 `opus-4-[67]` 仅匹配 `opus-4-6` 和 `opus-4-7`。原始正则也匹配了 `sonnet-4-6` — 该匹配被有意移除,以便规则确定性。如果将来 Anthropic 推出 `opus-4-8`,请在编辑 `patch-claude-1m.sh` 中 19 字节字面量后重新运行脚本(或提交问题)。 - **脚本保守设计。** 如果无法识别当前构建,脚本会退出 `unknown` 而非半修补,可安全重试。 - **修改应用程序二进制文件。** 每次运行都会创建备份,完全可逆(请参阅回滚)。 - **`ANTHROPIC_DEFAULT_OPUS_MODEL` 环境变量无帮助。** `LocalAgentModeSessionManager` 有自己的模型解析路径,会忽略环境变量覆盖。 - **使用条款:** 这是针对已记录回归的个人变通方案,影响付费用户。请自行承担风险使用。 ## 相关问题 - [anthropics/claude-code#37413](https://github.com/anthropics/claude-code/issues/37413) - [anthropics/claude-code#36760](https://github.com/anthropics/claude-code/issues/36760) - [anthropics/claude-code#36351](https://github.com/anthropics/claude-code/issues/36351) - [anthropics/claude-code#33154](https://github.com/anthropics/claude-code/issues/33154) ## 法律声明 本仓库提供本地补丁脚本和相关文档。它不分发 Anthropic 的代码、不绕过 DRM 或加密,也不访问 Anthropic 服务器——仅执行您的计划所允许的正常 API 调用。您有责任评估在您所在司法管辖区使用是否符合适用条款和法律。
标签:1M上下文, 2026-03-19, ASAR, Claude Desktop, Cowork, Electron, GNU通用公共许可证, MITM代理, Node.js, Python, 上下文窗口, 云资产清单, 代码签名, 备份, 字节交换, 完整性校验, 快速恢复, 技术修复, 无sudo, 无后门, 服务器回滚, 本地修改, 熵恢复, 特征标志, 系统优化, 补丁, 软件破解, 逆向工具, 逆向工程, 降级修复