新增
上下文压缩改成「摘要 + 压缩边界」:压过之后,请求里真的只剩摘要
- 模型把边界之后的对话写成一段固定九节的摘要,产出一条带
compact_boundary的消息提交进转录;此后发给模型的只有它及之后的内容 —— 「从哪切」在仓库里只有这一处判据,装配请求、手动 /compact、界面画线读的都是同一份。旧的机械压缩(清空旧工具输出、整条丢弃留骨架)、检查点表、digest 全部删除:机械压缩压不动以正文为主的历史,真实会话从 330K 一路涨到 624K、每轮按长上下文计费,压不动之后还判「榨干」让整个 run 不再重试;检查点表则会复现「界面说压过了、请求里还是全量」,而且零报错 - 自动压缩的阈值换成 Claude Code 的公式:先给摘要请求自己的输出(20K)和一次工具回执(13K)留位置,其余全部给对话 —— 272K 窗口从 185K 推迟到 239K 才触发;阈值封底到窗口的一半,否则 8K / 32K 的本地模型光减预留就是负数,变成每轮都压、压完仍为真、永远收敛不了
- 压完把最近碰过的文件从磁盘现读重附上,连同待办清单和用过的技能正文(文件 ≤5 个 / 总 50K token):摘要写的是「做过什么」而不是「文件现在长什么样」,不附的话模型压完第一个动作是把这几个文件重新 Read 一遍,或者按摘要里的旧片段去 Edit、old_string 对不上。重附是锦上添花,读失败(被删 / 无权限 / 二进制)静默跳过
- 上游以「prompt 太长」拒稿时压一次再重发这一轮(只在一个字都没吐出来时、每轮最多一次 —— 压完还被拒说明压缩救不了);摘要请求自己超长则从最早一侧按轮丢弃重试,切点避开 tool_result:切错的剩下开头是一个没有配对 tool_use 的回执,上游直接判请求非法,重试换来的是另一种失败
- 压完圆环立刻回落(不清掉的话,它显示的是压缩之前那次请求的真值,要等下一次回包才被覆盖 —— 压缩成功了,圆环还写着「已超出」);状态行分「正在压缩 / 已压缩 · 省下 N / 本轮按原历史发送 / 连续失败已暂停」四档,熔断那档用告警色:到这一步唯一有用的动作在用户那边(/compact、换模型、另起会话)
- 老会话的检查点表直接删除、不迁移:检查点记的是「窗口序号 + 一段笔记」,而边界要的是摘要正文和压缩前后的真实读数,硬造出来的是一段编的摘要,而模型会当真。代价是老会话退回整段照发,到阈值立刻自动给它建一条真边界
- 分隔线展开区改成自足的:前后 token 读数、重附文件清单、补充要求、摘要按 Markdown 渲染(九节模板当纯文本铺出来是一屏
##);顶上那张「上下文检查点」面板连同笔记编辑一起删除,context:list/context:updateCheckpoint/context:window三条频道下线 —— 边界就是转录里的一条消息,界面上看到的和请求里发出去的不再有两个来源 - 手动 /compact 产出的也是边界消息(重开会话仍然生效);「智能上下文管理」开关删除 —— 压缩只剩模型摘要一条路,
autoCompact是唯一总闸,关掉后到阈值也不压,一路涨到上游报超长为止
钱包:应用内充值,Stripe 收银台走系统浏览器
- 设置 › 钱包重写:现金 / 赠送 / 累计消费与当前 Team 一张卡,消费记录整块撤掉(逐条明细走「使用统计」页);余额不在页面里另存一份 —— 页面里再存一份,迟早复现「这里和菜单里的数字对不上」
- 「充值」选档 → 创建订单 → 主进程把 Stripe 收银页交给系统浏览器,渲染层只拿订单号轮询:收银地址来自网络、是外部输入,只放行
checkout.stripe.com,不经过渲染层;关掉弹窗就停止轮询 —— 后台偷偷轮询一个用户已经不看的订单,只会在别的页面突然弹出结果 - 订单跟进画全状态(等待支付 / 已收款·正在入账 / 充值成功 / 取消 / 失败 / 已退款),失败按原因分档给能操作的话:登录失效、平台暂未开放(桌面端比服务端先发版,404 重试永远不会好,必须单列)、未绑 Team、角色不够(403 是业务拒绝不是未登录 —— 归成「请重新登录」的表现是 Member 用户被要求重新登录,而重新登录永远不会好)、网络。服务端的业务拒绝(「只有 Team Owner 或 Admin 可以充值」)原话带给用户
- 充值按钮只在服务端说能充时才画,不能充时画一句原因 —— 不画一颗点了必失败的按钮;钱包页收进登录态:本地模式下这一页没有任何能做的事,未登录时搜不到、深链进来也落回账户页
- 新增
recharge:getOptions/recharge:checkout/recharge:getOrder三条频道,一律失败不抛、按原因成档返回
会话费用:悬停看逐次账目
- 输入框上方的费用可悬停出明细:按实际请求的模型列费用与输入 / 输出 / 缓存读写分项;总额取落盘冻结值,分项用请求发生时刻的定价估算并照实说 —— 不把估算冒充原始账单;混合币种或缺价时不把各模型的数字硬加成一笔「看似准确」的会话费用
- 账目只在浮层挂载时读(
usage:getSessionAttempts,按 session_id 精确查 —— 搜索日志不是精确匹配),不把全量请求日志带进流式对话的热路径;Tooltip 因此新增「可交互」一档(允许跨过间隙进入可滚动的卡片),其余浮层仍是移开即关
文件树改版:离开再回来,树还是原样
- 展开状态、目录列表、滚动位置跨 Tab 保留:右侧工作台同一格只挂激活的那个 Tab,点开文件 = 切走 = 文件树整棵卸载,此前回来时「展开的目录又收起了」。恢复时第一帧就画出上次的展开行、后台静默重读 —— 每切回来闪一圈转圈、顶部冒一行提示,恰恰是在提醒用户「树被重置过」
- 右键 = 行尾
…,同一份菜单两个入口(此前是两套,代价是条目顺序慢慢分叉);条目顺序重排成「打开在前、文件管理在后」;远端工作区只画成立的那几行 —— SSH 上的文件不在本机磁盘上,本机的 VS Code 打开它只会开出一个不存在的路径 - 键盘可走全树:↑↓ 相邻、Home/End、→ 展开或进第一个子项、← 收起或回父行、Enter / Space 激活,整棵树只占一个 Tab 停靠点;新行入场动画一次最多播 40 行(展开
node_modules上千行同时播会明显掉帧,而一屏本来就只有三四十行);悬停底色全树只有一个元素在行间滑动,换行时行本身一概不重渲 - 新增「添加到聊天」:追加到正在写的草稿末尾而不是替换它,写法与 @ 提及逐字相同(同一个函数产出),照样画成 chip;新增「另存为」走系统保存对话框,落点由主进程产出,顺带挡掉「挑了源文件自己:复制到自身在部分平台上会先截断再读,等于把文件清空」
打开方式:新增「默认应用」,并可设默认打开方式
- 第三个通用目标「默认应用」:
.png/.pdf/.docx这类文件交给「系统平时用什么开就用什么开」。它不是去问系统「这个类型关联了谁」再列成一项 —— 那是把「用什么打开」交给一个不知何时被改过的关联;它是一个和「文件管理器」同级的通用出口,关联交给系统在打开那一刻自己解析。菜单顺序:文件管理器 → 默认应用 → 终端 → 编辑器 - 文件树右键第一行是「在 X 中打开」(落点按 设置里的默认打开方式 → 第一个探测到的编辑器 → 默认应用 逐级退回),其余收进「打开方式 ›」二级菜单;子菜单右侧放不下时翻到左边(文件树贴着窗口右缘),纵向只往上推不翻转 —— 第一项必须和触发行同高,否则鼠标横移过去会先扫过别的父菜单项、把子菜单切走
- 设置 › 通用 › 文件新增「默认打开方式」:它是机器本地的选择(它描述的是这台机器上装了什么,换配置档 / 云同步不该把它换掉);存着的程序已卸载时下拉里明说「已选的程序当前不可用」,不偷偷改回自动 —— 悄悄改写的话,用户重装 IDE 之后得再来设置一遍,而他不知道为什么
插件可以携带原生组件(办公文档引擎的前置)
- 清单新增
nativeComponents:入口(必须落在包内native/目录)、逐平台 / 架构 target 的 sha256、随包运行时的文件索引与 SPDX 许可材料;contributes.documentEngines声明引擎认哪些办公格式(docx / xlsx / pptx / pdf 及其宏格式),自定义编辑器可绑定viewId+ 引擎。装载期严格、整份拒绝 —— 半份生效的原生组件意味着某个平台打开文档时才发现入口不存在 - 原生包单独一档限额(ZIP 2 GiB / 展开 6 GiB / 10 万条目 / 48 层 —— 实测一份 LibreOffice 804 MB、1.7 万个文件),只给声明了 nativeComponents 的包,其余插件的限额一个数不变
- 安装三道闸:解压之前就判本机有没有对应构建(几百 MB 的包解压完才发现装不上,用户白等一分钟);所有平台的入口都查(缺一个 Windows 入口的包在 macOS 上装得上,发布出去就是 Windows 用户装不上,而作者永远复现不出来);核对在 staging 里、切换版本之前做,失败整次回滚,用户手里仍是旧版本 —— 而不是换上一个起不来的引擎。可执行位由安装器补上(ZIP 里的权限位不还原,那是有意的;不补的话 spawn 直接 EACCES,而那个报错不会让人想到是安装器丢了 +x)
- 运行时文件按索引逐个核对:多一个文件也拒(索引之外没人核对过,它可能是会被引擎当插件加载的动态库),少一个也拒(症状是「打开某类文档才崩」,而且离安装很远);每次 spawn 前重核入口摘要 —— 插件目录在用户机器上是可写的。
native/永不通过ncw-plugin://发给插件视图:词法、大小写、URL 编码、软链四条绕过路都拦,不拦的话任何一个视图都能 fetch 走引擎二进制 - webapp 不许带原生组件 —— 「零代码插件」携带本机可执行文件,等于把「不跑代码」变成一句假话;helper 协议版本高于宿主时拒装,而不是等用户第一次打开文档时才失败
- 说清边界:这一版是清单 + 安装 + 校验闭环,驱动引擎的
documents.*会话 RPC、helper 进程接线与视图通道还没上 —— 插件详情页会明确提示「文档引擎已校验,但宿主尚未接线」,打开 .docx 仍走原来的自定义编辑器路径。文档会话那套(同一文档只有一个活动模型、修订号 / 世代、结果未知绝不重放、私有副本 + 原子落盘、一文档一 helper 进程)已随先行用例落库
插件工具每轮与现状对齐,加号菜单多一份工具目录
- 每轮装配工具表之前:先唤醒声明
onTool:的插件 → 把它们的工具并进全局注册表 → 再截本轮工具快照,三步缺一不可且顺序不能动。少了唤醒,只声明onTool:的插件没注册任何工具;少了并表,那些工具停在单例之外 —— 症状是「插件明明白白列在已启用插件的工具列表里,模型却说没有这个工具」,而且全程零报错 - 每次对齐先整批撤下插件工具再注册:被禁用 / 卸载的插件工具此前会留在表里,模型照样调得到 —— 那是一次静默越权;与内置 / MCP / Skill 工具重名的一律跳过:放行就是一条让插件把真 Bash 换成自己实现的提权路径
- 加号菜单新增「插件工具列表」:当前已启用、可运行插件声明的 Agent 工具的只读目录(仅展示,不更改工具授权);数据来自 catalog 的权威投影,不从聊天历史推断「曾用过什么工具」—— 后者会遗漏尚未调用但当前可用的,也会留下已禁用插件的旧条目
- 新增示例插件
acme.wechat-exports:微信导出记录的只读检索(列出 / 有界读取 / 字面量搜索),演示onTool:按需唤醒 + 插件工具进 Agent 工具表的完整链路;只读导出的 TXT / ZIP,不解数据库、不联网,解包前按条目元数据限制展开规模
「深度思考」示例插件与子代理思考档位
- 新增示例插件
acme.think:零权限、无副作用的单一工具think—— 不读文件、不联网、不落任何状态,全部价值在写入侧:引导模型按固定框架把分析显式写下来(锚定用户整体任务目标 → 显式与隐含约束 → 边界 / 空值 / 错误路径 → 假设与风险 → 方案对比与取舍 → 可验证的完成标准),思考随调用进入转录,工具卡按 reasoning 形态渲染、折叠行显示本次锚定的目标。装完即用,无需任何权限批准 - 设置 › 通用 › Agent 新增「子代理思考深度」,缺省「跟随本轮对话」;子代理 frontmatter 的
thinking:是对单个代理的明确安排,盖过全局默认;取出的档位还要按子 run 自己的模型归一化一次 —— 档位是模型的属性,而子 run 的模型未必和父 run 是同一个。三档来源由同一段代码算出:界面显示的档位和真正下发的档位分头算的话,两边只是碰巧一致,一旦不一致就是「设置里写着高、请求里发的是中」,且零报错
使用统计页:同一模型在三张图里同一个颜色
- 新增 8 槽分类色 + 中性灰,同一模型在环形图、趋势堆叠图、费用条里同色:此前三处各按「本列表里的序号」取色,而三张图的排序口径不同(按 token 排 / 按金额排),各自看都对、对照才发现对不上。按排名分配而不是按名字哈希(8 个槽放 8 个模型,哈希几乎必然撞色);色值刻意不进换色器的调色 —— 跟着走的话,换一次 accent 可能把两个槽换成同一个色,而图表不会报错
- 趋势图改成按模型堆叠面积(每点的分模型之和等于总量,堆叠的顶和总量线重合);图表布局从视口断点改成容器查询 —— 这一页住在设置浮层里,内容区只有视口一半宽,视口一宽就强行两栏 / 六栏,模型名全被截断
- 粒度切换器挪到趋势图面板:热力图固定看最近一年、不受粒度影响,切换器挂在它上面时「点了纹丝不动」
改动
- Skill 包的 frontmatter 认块标量与一层
metadata:嵌套:description: |是官方 Skill 写多行说明最常见的形状,此前解析器直接跳过、而installSkillZip把 skipped 当硬失败 —— 症状是整包装不上、错误只说「frontmatter 无法识别」,完全看不出问题出在 description 的写法上;metadata:写回与解析互逆(不写回去的话,编辑器读一次写一次就会把它整块吃掉)。Skill 版本号改从metadata.version读(市场包多半写在这儿,文件名是用户能随手改的) - 上下文圆环菜单里的归因卡只算「最后一条边界之后」那段 —— 那才是下一次请求真会发出去的内容;三个上游编码器都不再编码边界摘要本身(摘要正文就在同一条消息的 text 块里,再编一遍等于把摘要发两遍、双倍计费)
- 侧边栏「最近 7 天」默认收起:七天里攒下的会话会把「今天」挤出可视区;展开态按工作区各存一份 —— 共用一份的话这个功能在别的工作区里「时灵时不灵」,而且没有任何报错
- 任务清单收起 15 秒后缩成一颗进度球:它即使收起也仍占着正文和输入框之间一整行;点球直接完全展开,警示点保留在球上
- 附件缩略图可点开灯箱(只有上传完成的可预览,上传中的保持只读);用户消息气泡下统一陈列正文文件引用与附件卡片,路径相同只占一张
- 安装进度的档位判断抽成插件与 Skill 共用一份(
skills:installProgress与plugins:installProgress严格同形状,字段一分叉,共用的那份就得改成两套)。Skill 页的进度界面还没接上,这版 Skill 安装仍走原有的状态提示 - 「YAML 有损保存」的警告措辞收紧为「两层以上的嵌套、锚点等」——块标量与一层嵌套现在真会保留,说错会让用户白担心
修复
- 「打开方式」里的通用目标点了只弹「无法用这个程序打开」:文件管理器 / 默认应用不是可执行文件,查表查不到就落进 unknown 分支 —— 表现是点了一下只弹一句失败提示
- 展开右侧工作台要点两下:面板开关与「那格里还有没有 Tab」脱节后,格子空了开关还亮着,第一下只是把已经没有画面的 true 翻成 false(看上去毫无反应)。只同步「有 → 没有」这个跳变 —— 无条件写 false 会抹掉「先掀开面板、再补 Tab」那几条路径
- 模型下拉显示空白:未配置与「跟随对话」共用空值,编码成特殊串会让 Select 找不到选项,触发器留白
- 数据页「创建/解锁云同步」失败看不见:校验失败的错误条被全窗遮罩盖住,表现为点按钮毫无反馈;现在就地显示在弹窗里,打开弹窗时先清掉上一次的旧报错
测试
- 新增(上下文压缩,47 项):边界(含)之后切起、多条边界只认最后一条、边界被删后判据自动退回「没压过」、摘要剥掉
<analysis>、未闭合的<analysis>不当摘要、PTL 重试有上限且每次输入更短、切点避开 tool_result、末尾是工具回执时不产生连续两条 user、边界之后没有真实对话时拒绝再压(防「拿摘要去摘要摘要」)、重附内容现读不抄转录、读失败只是少附一个文件、九节标题一节不少、连续失败到上限熔断、压缩过的会话从边界切起且之前一条都不进请求、切整轮后不留孤儿 tool_use - 新增(文件树 / 打开方式):快照恢复第一帧就画出上次展开的行(故意让
listDir挂起不返回)、右键与…共用一份菜单且远端只画成立的行、←在平铺数组里找父行、入场动画上限、落点逐级退回、目录上不列编辑器(点了会把 IDE 的工作区根换掉)、子菜单右放不下翻左且纵向只上推、菜单顺序固定 - 新增(插件):原生清单 15 项(入口必须在
native/、协议高于宿主拒装、webapp 不带原生、旧清单解析结果零变化)、安装 5 项(走真安装器:摘要不符整次回滚保留旧版本、其他平台的入口缺失也拒、spawn 前重核发现被替换的入口)、协议 3 项(URL 编码与软链绕过在碰文件系统之前就 403)、插件工具 4 项(停报即撤下、重名不覆盖内置、反复同步后外部名稳定) - 新增(其余):frontmatter 83 项(块标量与一层嵌套往返、
metadata:不被编辑器吃掉、'|2-'这类块头往返)、Skill 端到端(真实市场包形能装上、版本号读到metadata.version)、钱包(订单相位、充值闸门、失败分档)、会话费用分项估算、图表色槽分配与「堆叠顶等于总量」、面板开关同步、未登录搜不到钱包页、文档会话 reducer 与会话管理器 30 项(同一文件跨 Tab 共享会话、脏会话不自动关、result_unknown绝不重放、盘上被改时disk_conflict不覆盖) - 已知红项照实记:文档引擎 / 插件文档会话的先行用例在实现落地前是红的 ——
document-rpc/provider-registry两个实现文件尚未落库(整文件 import 失败,各整文件记失败),document-scope的documents.*作用域 4 项与native-host的渲染 / 环境 5 项同因;session-mux的 3 项依赖本机python命令,没装的机器上报spawn python ENOENT。typecheck:node的 9 条错误全部落在这几个先行测试文件里(manager.render未实现、两个模块未落地),实现文件本身干净 —— 修完它们typecheck才会整体转绿 - 除上述 12 项:完整套件 6165 项通过(23 skipped);
typecheck:web与lint通过(0 error,4 个既有 any warning)