Skip to content

v1.14.0

Choose a tag to compare

@github-actions github-actions released this 30 Sep 18:34
· 303 commits to main since this release

1.14.0 (2026-09-30)

Bug Fixes

  • abort: run 终结处未摘除 abort 监听器——闭包钉住整个 agent state (278b1c1)
  • agents: 子 agent 批量派发不兑现并发契约——task 工具串行、工作流硬编码 3、agents.subagentConcurrency 是死配置 (9568e7d)
  • agents: 并发池 worker 遇退化元素提前退出——后续任务静默跳过 (f93b5cd)
  • bash: cwd 参数纳入 safeResolve 沙箱,阻断工作目录越界执行 (31f4341)
  • bash: 子进程被信号杀死时谎报成功——工具回 success 且 exitCode=0 (903c2cf)
  • bash: 跨 chunk 多字节 UTF-8 输出损坏——stdout/stderr 逐片 toString 解码 (c5053c6)
  • chat: POST body 字段无类型校验——畸形 JSON 击穿 500 或持久化毒化图片消息 (d1ebbdb)
  • composer: @agent 提及从平铺消息文本提取——引用片段/代码示例里的名字误触发 subagent 派发 (da736bd)
  • composer: popover 插入/引用追加从平铺文本重建 prompt——既有 pill 被降级为文本 (ea3750a)
  • composer: 光标恢复在嵌套元素处坠到末尾——offset 定位不递归下钻 (5da0fc8)
  • composer: 提示历史存展开后的消息文本——召回引用消息灌回整段代码块 (3a13ccb)
  • composer: 提示历史导航方向倒置——↑ 首次召回最旧命令 (89021e6)
  • config: providers 数组条目形状未校验——REST 500 / 落盘毒化 / 启动击穿 (0be389d)
  • config: 机器绑定密文解密失败无兜底——跨机同步配置击穿启动/请求路径 (426fee4)
  • config: 点路径/配置文件的原型链键未过滤——写穿 Object.prototype (5690b1f)
  • config: 非有限数值经配置写入路径静默落盘为 null——键被无声删除 (33377a5)
  • core: markdown 代码剥离漏过围栏变体——workflowz 误触发、todo 标签幽灵应用 (d75c7c0)
  • currency: toFixed 二进制浮点舍入误差——1.005 显示为 1.00;roundTo 十进制舍入替换三处金额格式化站点 (d69fe44)
  • currency: 徽标/会话树/用量面板残留金额 toFixed 站点收敛 formatCost 十进制舍入——1.005 不再显示 1.00(少一分钱),d69fe44 三站点之外的漏网同型 (427d5ad)
  • dap: debug_breakpoint 逐条设置互相覆盖——同文件已有断点被静默丢弃 (bf2e6ad)
  • dap: node 适配器映射到 npm 上不存在的包——node 调试从第一步就起不来 (3817bf0)
  • dap: 启动握手缺 type 与 configurationDone——debug_start 挂到 120s 超时、目标永不运行 (b7c862d)
  • dap: 客户端请求无超时——适配器不响应时 debug_* 与 launch 永久挂死 (60533b7)
  • dap: 适配器 stderr 管道从不读取——写满 64KB 缓冲即卡死子进程、DAP 帧永不发出 (dc13500)
  • edit: CRLF 文件编辑路径缺失行尾处理——diff 模式匹配失败、hashline 模式混合行尾 (53ddf59)
  • edit: diff 模式行尾判定按区域局部——单行区域多行替换产出混合行尾 (b03ba58)
  • edit: hashline 补丁块尾终止时吞入尾部空行——最后操作内容多出幽灵空行 (c562bf5), closes path#hash
  • editor: 主题切换重建视图以磁盘基线为初始文档——未保存编辑被静默丢弃 (141ae40)
  • editor: 换文件时读陈旧「已见 initial」镜像 ref——编辑器残留旧文件内容且误报外部变更 (9abcb23)
  • edit: 模糊匹配区域以换行开头时残留孤立 \r——CRLF 行尾被写坏 (41ad63f)
  • edit: 空 oldText 早退报错,不再推到数组溢出烧数秒 CPU (5474894)
  • files: /raw 后缀优先于文件实存误判——名为 raw 的文件恒读不到 (d102144)
  • files: 分支名以 - 开头时被 git 当作选项——checkout -B 静默重置分支指针 (9368f0d)
  • files: 文件名含 ?/# 时前端路径段编码错误导致读错/删错文件 (d90e87d)
  • fs-walk: 目录深度上限差一层——maxDepth=N 实际收集到第 N+1 层 (e29c762)
  • git-status: 重命名/复制状态挂到新路径而非旧路径 (238bc8c)
  • glob,grep: path 参数纳入 safeResolve 沙箱,阻断 cwd 越界 (f5d26a0)
  • glob: ** 恒译 .* 段边界失守——a//b 命中 a/xb、/b 命中 foob、a**b 命中 a/x/b (71cf543)
  • glob: 字符类取反/退化类崩溃/空花括号分支修复,workflow glob 与工具实现收敛 (7044fca)
  • glob: 花括号分支内通配符按字面转义,模式恒不匹配 (c4390be)
  • glob: 花括号嵌套被截到第一个 }——内层分支静默零命中 (6032fd0)
  • grep: 单文件读取失败中断整个搜索 + 大小上限在读取之后才判定 (616dce8)
  • grep: 无扩展名文本文件不再被静默跳过 (c07adeb)
  • hashline: --- 分隔符空白变体被当内容吞入——替换文件被静默写坏 (d70b497)
  • hashline: 内容行含 [path#hash] 形行被误判为块头——补丁截断/合法编辑失败;无 --- 的多操作补丁 DEL 吞掉后续操作 (9d48dc4), closes path#hash x.ts#2222
  • hashline: 同锚点操作先插入后替换——插入行被 SWAP/DEL 吞掉、原行未改 (1c103f8)
  • import: 未受信导出 JSON 字段类型未收敛——畸形分片毒化会话、非有限数值击穿 500 (8a0df50)
  • kanban: REST body 字段无类型校验——畸形 JSON 击穿 500 或持久化毒化看板 (7b4231e)
  • kanban: 项目作用域 store 的变更操作按卡片 id 越界——REST 的 projectId 形同虚设 (f12e8a8)
  • llm: provider 注册实现 server/CLI 两份漂移——畸形配置条目击穿 CLI 启动 (3dcee92)
  • llm: retry-after 头仅接受正有限值,headers 缺指示时退避同样封顶 30s (e344a4b)
  • llm: 图片数据在 provider 边界被静默丢弃——多模态消息从未送达模型 (084c6cb)
  • llm: 工具调用身份字段迟到的流式 delta 被整体丢弃——领先参数片段静默蒸发,入参损坏 (dcbf5c9)
  • llm: 未注册的回退目标击穿整条回退链——resolveRoute 在 try 之外抛 NoRoute (8bd391c)
  • llm: 流终结后 step 状态机未置终结标记——重复 usage 帧重发 finish、迟到 delta 产出幻影文本 (aeb97c0)
  • loop: 暂停中的 run 被 signal-only abort 中止后永久空转——run 槽位泄漏、父 run 工具批次永不返回 (46cc3cc)
  • markdown: 模块级渲染缓存无界增长——流式中间版本永不驱逐 (58d7028)
  • mcp,dap: stdin socket 加 error 监听,阻断 EPIPE unhandled error 击穿宿主 (225bcb2)
  • mcp: 服务器名/工具名未按 provider 函数名文法规范化——非法名让整轮请求被 400 拒绝 (30966d1)
  • parse: 数值参数严格解析,垃圾输入不再静默命中错误目标 (a6add33)
  • path: ..-前缀合法名被当作越界拒绝 + 127. 前缀域名被误判回环 (c6d14fa)
  • permission: abort 联动监听器终结后不摘除——同一次 run 内按权限请求数累积 (129032a)
  • project: git 位置参数未以 -- 终止选项解析——- 开头文件名/remote 名劫持选项 (104f93a)
  • project: 合并漂移项目时看板被孤儿化——卡片在项目视图与回收站双双消失 (506996d)
  • read,grep: 数值参数未校验导致的静默错误切片,改为显式报错 (89ab563)
  • routes: 6 个写端点畸形/非对象 JSON body 击穿 500——统一 .catch + 显式 400 (1a85dcb)
  • routes: POST /api/sessions 显式 projectId 不校验存在性——FK violation 击穿 500 (07c5e88)
  • routes: uuid 路径参数未校验——PG 22P02 击穿 500 并回显 SQL 错误细节 (9e64c33)
  • routes: 写端点 JSON body 未校验形状/类型——null body 击穿 500 (604c661)
  • routes: 权限路由 sessionId 未校验 UUID——PG 22P02 击穿 500 并回显 SQL 细节 (1932c51)
  • security: file:// 与 skill:// 解析器纳入 cwd 沙箱,阻断路径越界读取 (83c1565)
  • server: 文件路径只做部分 URL 解码——含 ?/#/% 的文件名读写删全部落到错误路径 (16d9997)
  • session: getTree 静默丢弃 parentId 成环的会话——列表看不到/无法打开/无法删除 (148a631)
  • session: parentId 成环时恢复路径祖先链无限循环——回收站「恢复」请求永不返回 (362e56d)
  • session: 回收站物理清除的删除闭包漏掉集合外子行——清空/定时清理撞自引用 FK 23503 (5651e39)
  • session: 条目顺序依赖并列 createdAt——fork 丢时间戳、shake 重插与压缩摘要落位错误 (b323de9)
  • session: 永久删除会话按拓扑序子先于父,修复自引用 FK 违反 (0532bd3)
  • session: 缺字段 tool_call/tool_result 分片击穿 token 估算与上下文构建 (7fe8c5a)
  • shake,grep: CRLF 行尾未归一化——XML 块漏识别、shake 替换产出混合行尾、锚定匹配静默零命中 (bbb3715)
  • shake: 围栏配对忽略 marker 一致性——异种/更短围栏行提前闭合 (c971da0)
  • snapshot: parentId 成环击穿热更新——拓扑排序在环上无限递归直至栈溢出 (654876d)
  • snapshot: parentId 成环数据击穿热更新恢复——拓扑序仅保证终止,环上节点子先父后插入撞自引用 FK 23503 (213b27c)
  • sse: 三处 SSE 解析器支持 CRLF 行结束,事件不再滞留丢失 (53ee630)
  • sse: 流关闭时尾部残留帧被丢弃——无尾空行的最后一条事件丢失 (f8c1d5d)
  • terminal: 分屏 sizes 非有限/负值直入 flexGrow——pane 塌成 0 宽且拖不回来 (7da37b3)
  • terminal: 命令块输入跟踪把 DEL/转义序列当文本累积——Add to Chat 命令失真 (f535b6c)
  • terminal: 控制帧规范化校验未钉住字段序——键序变体 JSON 输出被吞成假退出提示 (875be2d)
  • test: 修复 serve 测试桩类型与格式化(biome) (32805da)
  • timers: 用户配置/声明值直作 timer 时长——下界与两处上界未归一化,超长变立即、间隔变每毫秒狂刷 (bd95a37)
  • timers: 超 32 位上限的 timer 时长被 Node 钳到 1ms——bash 超时瞬间误杀、插件工具声明瞬间超时、更新检查每毫秒狂刷 npm (9f7e304)
  • todo: markdown round-trip 丢失阶段名前导空白——与尾随空白同型的静默改写 (b14ab78)
  • todo: markdown round-trip 破坏多行/结构化任务内容——数据丢失 + 结构注入 (8987099)
  • todo: markdown 往返破坏空阶段名/空列表/含回车内容——阶段被改名、任务错位、数据丢失 (25ebc4b)
  • todo: markdown 解析静默改写状态——round-trip 不保真、空内容任务被丢弃 (5c1bbe9)
  • todo: REST 直调 todoTool 绕过 schema 校验——畸形 body 击穿 500/持久化毒化状态 (0e69a4e)
  • todo: 历史消息里畸形 phases 条目毒化恢复路径——todo 面板击穿 500 (5042dec)
  • tokens: image 部分纳入 token 估算——图片轮次此前恒计 0,预算护栏与压缩窗口把图片消息当免费(provider 实收约千级 token/张);shake 私有同型估算收敛至 estimateMessageTokens 单源 (1fe28b2)
  • tokens: 估算双实现收敛——llm 朴素 chars/4 无 CJK 感知(中文低估 8 倍),context 预算只计 text/thinking 与 compaction 全口径脱节 (a56a1fb)
  • tools,kanban: 数值参数拒绝 Infinity/小数/非正值,阻断静默错误行为 (ad236ba)
  • tools: edit diff 模糊空白匹配的规范化→原文映射漂移——tab 处吃掉后续行 (2e1ddea)
  • tools: JSON Schema 校验器忽略 additionalProperties 模式形式——bash env 类型约束形同虚设 (06c3810)
  • tools: JSON Schema 校验器忽略 minItems/maxItems——数组基数约束形同虚设 (7fc2bb4)
  • tools: JSON Schema 结构关键字在缺少同层 type 时被忽略——task 工具 anyOf 二选一守卫形同虚设 (d92234b)
  • tools: task 工具入参校验被 anyOf 短路——批量条目缺 assignment 静默派出 undefined prompt 子 agent (2986561)
  • tools: ToolDef.timeout 声明未执行——挂起工具让整个 run 无限期挂死 (7463f6f)
  • tools: 多结果 tool 消息只取首个 tool_result——其余结果静默丢失 (82b97be)
  • tools: 行尾归一化只做 CRLF 方向——LF 文件写入 CRLF 内容产出混合行尾 (670f6f1)
  • tools: 行截断优先路径再按字符兜底,输出不再突破 maxChars (87db6da)
  • tools: 输出/分帧缓冲设上限,杜绝无界累积 OOM (81f6013)
  • truncate,compaction,pty: 截断标记计入上限,输出不再越界 (92c1d75)
  • truncate: 三处漏网截断点不再切碎代理对,杜绝孤立码元损坏输出 (c555196)
  • truncate: 字符截断不再切碎代理对,杜绝孤立码元损坏输出 (c36b3bb)
  • truncate: 零省略不再插标记、微型上限不再被标记自身突破——headLines 覆盖全行时此前恒插 [.. 0 lines truncated ..](输出反而更长);maxChars 放不下标记时无标记硬截断保 ≤ maxChars (a676349)
  • update: cleanupSnapshot 删除越过所有权边界——调用方指定路径的整个父目录被递归删除 (d091dcb)
  • update: semver 比较尊重 prerelease 并剥离 build metadata (85b154b)
  • web: DirectoryPicker 无条件消费 Escape/Enter——宿主对话框键盘交互成死代码 (5a30201)
  • web: localStorage 访问未兜底——站点数据被禁时渲染期抛 SecurityError 白屏 (5fe02e6)
  • web: provider 测试结果按行下标索引——删除行后结果串位到其他 provider (e3a3831)
  • web: 乐观消息不与持久化历史对账——历史重取后整轮对话重复渲染 (54e24ab)
  • web: 会话搜索的「已展示 id」只收一层——深层后代重复出现在内容匹配区 (133af77)
  • web: 回收站后代计数在 parentId 成环数据上死循环——页面冻结 (8ed4e5a)
  • web: 图片添加把副作用写进 React 状态更新器——StrictMode 下同一张图被加两次 (7f2d32f)
  • web: 富文本编辑器块级 DOM 换行丢失与拖拽光标锁死 (7932fcf)
  • web: 导出到看板硬编码 columnId='todo'——看板无该列时导出整体失败 (2e20f1b)
  • web: 数字输入框把溢出字面量折成 Infinity——JSON 落盘为 null,配置键被静默删除 (e515f07)
  • web: 无扩展名文件路径的代码引用被误判为消息引用——README/Makefile 单行引用点击不跳转文件 (8089df1)
  • web: 权限超时拒绝把 confirmTool POST 写进状态更新器——StrictMode 下同一拒绝请求发两次 (1df2f4d)
  • web: 看板拖拽落位与预览差一格——相邻换位完全无效 (3da46dd)
  • web: 终端分屏布局变更不生效——tabs 派生缓存经 ref 读取分屏状态,拖拽/切换方向全部无反馈 (dbf9469)
  • web: 终端输出被误判为控制帧——含 type 字段的 JSON 输出被整条吞掉、显示假退出提示 (ea01b1c)
  • web: 虚拟化渲染的 DOM 子集下标当全量索引——滞留浮层显示错消息、引用行号与跳转定位失效 (c5134fd)
  • web: 重试白名单依赖库默认值——PUT/DELETE 写操作被重放 (b75728d)
  • web: 键盘处理器不看 IME 组合态——中文输入法确认候选被当最终输入提交 (55b267e)
  • web: 附着入口对 paused run 直接放弃——冷启动/广播附着拿不到暂停态,会话锁死 (c5752b7)
  • web: 附着轮询把 paused 当 run 结束——该标签页无恢复入口且新消息撞 409 (def68b8)
  • workflow: utils.read 行号范围未经校验直接切片——0 基范围静默返回最后一行 (4107a47)
  • write: 工具输出字节数按 UTF-16 码元谎报——非 ASCII 内容被低估数倍 (f426955)
  • xss: markdown 代码块 renderer 转义 lang 与 fallback 文本,阻断 dangerouslySetInnerHTML 注入 (6814c8f)
  • xss: markdown 原始 HTML 与危险 URL scheme 未过滤——未受信内容注入脚本 (670278e), closes #106 #115

Features

  • 缺口补齐——MCP 客户端接入、DAP 宿主接线、插件 hook 死挂载点、outputSchema 校验、skills 数据源 (c0e25ff)