本次更新

WillDeep

这里只说这次 WillDeep 更新里真正影响使用的内容。内部测试、版本同步和代码提交记录都不会拿来凑数。

版本1.403.0-rc5
发布时间2026-09-22

问题修复

  • 让 Agent 用浏览器干活,它却换成 curl 冒充浏览器去取网页。 例子:用户让它用侧栏浏览器找 Google“杭州一日游”的第一个非广告结果。Google 结果页的链接是加密跳转 /goto?url=…,它为了拿到真实网址,发起了 curl -D - -A 'Mozilla/5.0 … Chrome/128' 'https://www.google.com/goto?url=…',想在浏览器之外读跳转的 Location。当时是智能审核把它拦下来交给用户确认。原因是浏览器指引里,“不准用伪造 UA 或 curl 重放”只在“网站拦截了自动化”这个前提下才适用,也没有一条规则写着“用户指定用浏览器,就全程在浏览器里做”。这次改了两层:
  • 浏览器指引加了一条(只在浏览器工具包加载时出现,稳定核心不变,核心的前缀缓存不受影响):用户要用浏览器,就在浏览器里把事做完,不为了这些页面或它们的跳转改用 run_command、curl 或 web_fetch。搜索结果的跳转链接(Google /goto、百度 /link),就报结果上能看到的站点和路径,或者在浏览器里打开并如实报告结果,包括被拒绝的情况。任何时候都不准给 curl/wget 设置浏览器样式的 User-Agent。
  • 加了一道硬拦截 AgentBrowserUserAgentSpoofGuard:同一回合里调用过 embedded_browser_* 之后,如果 run_command / terminal_send_command 里的 curl 或 wget 带了 Mozilla/… 样式的 UA(-A、--user-agent、wget 的 -U、User-Agent: 请求头都算),直接拒绝,不弹确认卡,并告诉模型回到浏览器里做。普通的 curl、自定义工具 UA(如 -A my-cli/1.0)、grep 'User-Agent: Mozilla' 这类命令不受影响;上一回合用过浏览器也不算。
  • 浏览器能力附录的快照哈希更新为 a877e8835f704327。另外三个附录和三档稳定核心的哈希都没变。
  • 测试:AgentBrowserRunawayGuardTests 新增 4 项:
  • 指引的语义断言;
  • UA 识别表格,共 11 例,包括截图里原样的那条命令;
  • 拦截范围:只拦 shell 类工具、只在本回合用过浏览器时拦;
  • “本回合用过浏览器”只看回合开始之后的调用。
版本1.403.0-rc3
发布时间2026-09-22

问题修复

  • 网站单纯返回 403 时,不再说成“站点在阻止自动化访问”。 以前内置浏览器只要看到 403 / 429 / 503 加一个很短的页面,就标记 blocked_by_site,并提示“The site is blocking automated access”,模型再把这句当事实转述给你。实际上,单纯的 403 只能说明网站拒绝了访问,原因页面里没写:可能是 IP 或地区限制、代理出口、没有登录,也可能是防爬规则。例子是 klook 返回的 403,标题只有 klook.com,页面里没有验证码。现在分开处理:
  • 验证码、人机验证、challenge 页、Just a moment / Attention Required 这类页面,以及 429 限流:和以前一样,标记 blocked_by_site,要求停下来汇报。
  • 403 / 503 加短页面,但没有任何验证特征:改为标记 access_refused。提示模型如实告诉你“网站返回了 HTTP 403”,列出可能的原因,不许说成识别到了自动化。同样禁止用伪造 UA、代理、抓取中转、curl 重放或 OCR 绕过;你可以在浏览器面板里打开看看网站显示了什么。
  • navigate、点击 / 按键后的跳转、read_page 三个入口都统一走 AgentBlockedPageDetector.verdict 和 annotate。系统提示词没有改动。
  • 测试:更新 AgentBrowserRunawayGuardTests 的拦截页识别表格。单纯 403 不再算拦截,带 Cloudflare 验证标题的 403 仍然算。另外新增 1 项:klook 式 403 标记 access_refused,提示里包含状态码、不含“blocking automated access”;503 同样处理;长正文的 403 不做标记;429 和 challenge 页仍然算拦截。
版本1.403.0-rc1
发布时间2026-09-22

新功能

  • 内置浏览器可以切换到“独立浏览器”,它不带你的登录态。 浏览器面板工具栏新增一个切换按钮(人像图标):
  • 我的浏览器:默认,行为和以前一样,用系统默认的网站数据存储,带你的登录态和从 Chrome 导入的 cookie。
  • 独立浏览器:单独的一套网站数据存储,和“我的浏览器”完全隔离。macOS 14 及以上用固定标识的持久存储,数据会保留;macOS 13 上用隔离的临时存储,退出 App 后清空。面板底部会显示“独立浏览器”标记;这时“从 Chrome 导入登录”按钮不可用,免得把登录态带进来。
  • 切换时重建 WebView,当前网页在新的存储里重新打开。同一会话里新开的浏览器标签页沿用最后一次的选择;关闭会话后恢复为“我的浏览器”。
  • 在独立浏览器里,普通操作不需要确认,包括打开网页、点击、输入、按键、滚动、执行脚本。那里没有你的登录态,也就谈不上“以你的身份操作”。以下情况仍然要确认:
  • 上传本地文件;
  • 有后果的点击(发送、删除、付款、登录等,见 1.402.0-rc1);
  • 带密钥占位符 ${secret: 的调用,比如把保存的密钥输入网站;
  • 选了严格模式(每次都问)。
  • 宿主在登记每个内置浏览器调用时,写入隐藏参数 _willdeep_browser_profile。如果批准之后切换过配置,调用会在执行前被拒绝,要求重新发起。embedded_browser_status 返回 profile 字段,模型能知道自己在哪套浏览器里。
  • 新文件 Xedit/AgentEmbeddedBrowserProfile.swift。设计记录见 docs/EMBEDDED_BROWSER_SITE_AUTHORIZATION.md 第 4 步。
  • 测试:新增 AgentEmbeddedBrowserProfileTests,共 6 项:
  • 独立浏览器里写的 cookie 不会出现在“我的浏览器”里。测试只读取默认存储,不往里写,因为测试宿主和真实 App 共用同一个容器。
  • 切换会重建 WebView,状态里能看到当前配置,新标签页沿用,关闭会话后恢复默认。
  • 宿主写入配置(包括 navigate,不包括 Chrome)。
  • 免确认的范围:上传、有后果的点击、带密钥占位符的调用、我的浏览器都不免。
  • 智能模式直接放行,严格模式仍然询问。
  • 切换过配置的调用在执行前被拒绝。
版本1.398.0-rc5
发布时间2026-09-22

问题修复

  • 两个内置浏览器用例在全量测试里不再必红。 rc4 里记作"满载下偶发"的 AgentEmbeddedBrowserInputTests.enterSubmitsForm() 和 AgentEmbeddedBrowserInteractionTests.blankTargetLinkOpensInPlace(),实际上连续两次全量测试都红,并不是偶发。
  • 它们都是各自串行 suite 里的第一个用例,失败都发生在测试准备阶段的第一次页面加载:这次加载要冷启动 WebKit 的 WebContent 进程,全量 4526 个用例同时跑时,冷启动就会超过生产代码 10 秒的等待上限。同一个 suite 里后面的用例都通过,单独跑也只要 0.9 秒。
  • 只放宽这两个 suite 准备阶段的首次加载等待(60 秒)。全量实测这两个用例各用 33.7 秒和 36.3 秒,冷启动本身就要二十多秒,30 秒余量太小。被测的按键和点击动作仍然用生产代码的超时,产品代码没动。
版本1.397.0-rc2
发布时间2026-09-22

问题修复

  • Chrome 工具不再跟着你切换的标签页走。 以前扩展每执行一条命令都重新查一次"当前活动标签页":Agent 刚对 A 页做完 snapshot,你切到 B 页,接下来的 type 就把文字输进了 B 页;截图、导航、调试命令也一样。现在扩展会记住 Agent 正在操作的标签页(存在 chrome.storage.session 里,service worker 休眠重启也不会丢),每条命令按下面的顺序决定目标:

1. 显式传入的 tab_id(这个标签页同时成为 Agent 的标签页);

2. 已锁定的 Agent 标签页;

3. 当前活动标签页,并把它锁定下来。

chrome_activate_tab 和 chrome_navigate 会更新锁定目标。

  • 14 个 Chrome 页面 / 标签页工具新增可选参数 tab_id:read_page、read_selection、snapshot、navigate、history、click、type、hover、select_option、press_key、scroll、wait_for、capture_tab、debugger_command。
  • 每个结果都带上 tab_id、tab_title、tab_url,模型能看到自己操作的是哪个页面。
  • 锁定的标签页被关掉时,改用当前活动标签页,并在结果里用 retargeted 说明。
  • 显式传了一个已经不存在的 tab_id 会直接报错,不会悄悄换成别的页面。
  • chrome_list_tabs 返回 agent_tab_id,每个标签页带 agent_target 标记。
  • 截图不再在后台抢你的标签页。 Chrome 的截图 API 只能截窗口里正在显示的那个标签页。Agent 的标签页在后台时,chrome_capture_tab 会明确报错并给出办法:先 chrome_activate_tab,或者改用在后台标签页也能用的 read_page / snapshot。
  • 扩展 popup 里的"读取页面 / 读取选区 / 截图"按钮仍然作用于你正在看的页面(带 useActiveTab),不会读 Agent 的标签页,也不会改变锁定目标。
  • 工具描述、浏览器能力块和审计摘要(新增 tab_id=)同步更新;能力块只更新了浏览器块的哈希快照。
  • 需要在 chrome://extensions 里重新加载 WillDeep Browser 扩展后才生效。
  • 测试:
  • 新增 Ruby 行为测试 scripts/chrome_extension_agent_tab_test.rb,已登记进 CI 的 interaction 守卫组。它用 Node 加载真实的 service_worker.js,注入模拟的 chrome API,走一遍 11 个场景:首次命令锁定活动标签页、用户中途切换标签页后输入仍落在 Agent 的页面、popup 读用户的页面且不改锁定、后台标签页截图被拒而不抢焦点、导航留在 Agent 的标签页并等加载完、显式 tabId 改锁定、未知 tabId 报错、列表标记、锁定的标签页被关掉后回退并说明、activate 锁定、前台标签页截图正常。输出 JSON 和 Markdown 两份报告。
  • 反验:用修改前的 service_worker.js 跑同一套测试,11 项全部失败,其中复现了"用户切换标签页后,Agent 的输入落到了用户的页面上"。
  • AgentChromeToolTests 新增两项:14 个工具都有可选的 tab_id 且描述不再写"active Chrome tab";tab_id 的解析。
版本1.396.0-rc1
发布时间2026-09-21

新功能

  • 内置 willdeep-config 配置管理插件(0.2.0)。 以子模块 PluginExamples/config(niuwoai/willdeep-config,锁在 v0.2.0)接入,随 App 打进 BundledPlugins/config:.codex-plugin、.willdeep-plugin、mcp.json、Ruby stdio 服务端 server/ 与页面 ui/index.html。它的插件本体在仓库的 plugin/ 子目录,打包脚本新增 bundle_plugin_from <id> <源目录>,原有 bundle_plugin 改为调用它,其它插件的打包结果不变。
  • 短剧插件(video-studio)已是最新提交 cb8bd36(v0.28.0-rc5 之上的 streamable-http 两个修复),本版未变。
  • 测试:repositoryExamplesPassTheProductionLoader 加入 config/plugin,用生产加载器校验清单。
版本1.395.0-rc2
发布时间2026-09-21

问题修复

  • 用量日历与单日详情也合并 CLI,并跟随「全部 / 桌面 / CLI」切换。 1.395.0-rc1 装到本机后实测:总览的「API 请求 · 近 7 天」已从 471 变成 2,045,但点进用量日历,9 月 21 日仍是桌面的 324.8k、9 月合计仍是纯桌面的 198.44M。日历按月汇总(dailyUsage)、当月会话数、单日详情(dailyDetail)和分享卡片都直接读桌面快照,漏接了 CLI 账本。现在它们和热力图一样,都读 AppState.agentUsageFilteredSnapshots / agentUsageFilteredCLIRecords:CLI 的 Token、会话、按同一张价目表估的费用、模型行、最大上下文都算进去。
  • 热力图标题行的切换按钮不再被「点进日历」吞掉。 以前整个 Token 活动区块(含标题行)是一个按钮,点「CLI」在无障碍路径上触发的是进日历,筛选没切过去。现在只有格子区可点进日历,标题行的「全部 / 桌面 / CLI」「每日 / 每周 / 累计」各自独立。
  • 新增测试:dailyUsageMergesCLI、dailyDetailMergesCLI。
版本1.395.0-rc1
发布时间2026-09-21

新功能

  • 用量统计合并 willdeep CLI 的用量,并能按「桌面 / CLI」分开看。 设计见 docs/USAGE_LEDGER_DESIGN.md(双端 canonical,rs 侧引用)。2026-09-21 用户反馈 CLI 跑了一天、Token 活动只有 32.5 万:热力图只读桌面会话,而当天 CLI 实际是 704 次模型调用、约 3297 万 Token,一条都没进来。
  • 读取 willdeep-rs 写的本地用量账本 ~/.willdeep/usage/YYYY-MM.jsonl(willdeep.usage-ledger.v1,WILLDEEP_HOME 优先)。只读;增量读取,写到一半的行留到下次;按 id 去重。账本没有或为空时,面板和以前完全一样。
  • 用量面板打开时读一次,开着期间监听账本目录,2 秒节流刷新;面板关掉就停止监听。
  • 热力图、总览(Token、会话数、活跃天数、连续天数、峰值时段、单任务峰值)、模型拆分、本地 / API 请求页都合并 CLI 数据。同一模型两端合成一行,行内标「桌面 + CLI」或「CLI」。
  • 热力图标题行在有 CLI 数据时出现「全部 / 桌面 / CLI」切换,所有统计跟着切,选择会记住。
  • 提示框在两端都有调用的日子显示「桌面 N · CLI M」,有缓存数据时显示缓存命中比例。

体验改进

  • 热力图的「请求」改为模型调用次数,与请求页和 CLI 账本同一口径。 以前数的是当天的用户消息,跨零点的回合在次日只剩 Token,于是出现「请求:0 次 · Token:32.5 万」(当天那格就是一次 22:18 发起、跑到 01:12 的定时巡检)。现在主循环每轮、worker 的每一轮、标题 / 压缩 / 图片描述 / 路由 / 输入预测这些辅助请求都各算一次,worker 和辅助请求自己的 Token 也补进热力图。数字会比以前大。
  • 「最爱模型」按每一次调用实际用的模型计。 以前按会话默认模型 × 消息数,省心托管和中途切模型的会话都算在默认模型头上。早期没有逐次请求记录的会话退回旧算法。
  • 新增测试 AgentCLIUsageLedgerTests(12 项):读取器的解析 / 增量 / 半行 / inode 变化 / 目录缺失 / WILLDEEP_HOME,以及热力图分来源与缓存命中、跨零点、worker 与辅助请求计入、总览合并、模型行合并、请求页、无 CLI 时模型拆分逐项不变。
版本1.394.0-rc5
发布时间2026-09-21

问题修复

  • 两个用桩的 Worker 套件在满载全量里撞 1 分钟时限。 本机升到 Xcode 27 后第一次发版,全量测试里 AgentWorkerOwnerStopTests.workerPropagatesRealApprovalFailure 连续两次「超过 1 分钟执行时限」,单独跑 1.5 秒全过;今天更早一次发版里 AgentPlanningBudgetTransportTests.structuredRunnerUsesActualLedger 也这样红过一次(单跑 0.135 秒)。和 2026-09-12 3273071a 修的是同一类:这些套件全是 @MainActor,Swift Testing 跨套件并行时抢同一个主执行器,满载时一次等待就可能耗满为测试放宽过的 45 秒首轮联系,再叠一轮裁判请求就越过 1 分钟。
  • 两个套件的 .timeLimit 从 1 分钟放到 3 分钟。时限只是防挂死的兜底,断言验的是抛出哪种错误,放宽不削弱判据;产品超时一个字没动。
  • 同一轮全量里 AgentPluginAuditLogTests 的两条「等文件落盘」也红过一次,重跑即过、单跑全过,未改动,继续观察。
  • 本机开发环境备忘:升到 Xcode 27 后要先 sudo xcodebuild -license accept、sudo xcodebuild -runFirstLaunch,再 xcodebuild -downloadComponent MetalToolchain(Shaders.metal 需要,Xcode 26 起 Metal 工具链不再随 Xcode 自带),否则 git 与构建都会被拦。
版本1.394.0-rc2
发布时间2026-09-21

问题修复

  • AgentContextRunwayHandoffFooterTests.latestHandoffCarriesRelayActions 跟上 1.394.0-rc1 的页脚载荷。 rc1 把「开新会话继续」图标挂的内容从 NEXT PROMPT 一句改成整份交接,这条用例还在断言只带那一句,结果在发布前的全量测试里红了,发布在归档前中止,没有任何产物上传。现在断言页脚带的是整份交接。rc1 开发时只按结构体名选了 AgentContextRunwayHandoffDisplayTests,同文件里的 footer suite 没被选中,所以漏掉了。
  • 同一次全量里 AgentPlanningBudgetTransportTests.structuredRunnerUsesActualLedger 报「超过 1 分钟执行时限」。单独跑 0.135 秒通过,是满载下的计时抖动,与本次改动无关,未改动。
返回 WillDeep