本版修复 Windows 上内核因协程暴涨而崩溃的问题,让同一工作区里写不同文件的会话可以并行,并补强记忆迁移备份、递归删除保护、自动压缩失败说明,以及市场、主题、插件和 MCP 的大量使用细节。
新增
- 手机访问的局域网直连链接可以在用户配置的
[serve] share_port里指定固定端口,不再每次随机;端口被占用时会明确提示 (#11568, #11540) - 市场「我的包」每一行新增「发布新版本」,自动带入类型、名称、简介、仓库、标签和可见性,只需补来源 (#11566 by @KHG420)
- 新增主题作者指南和可直接安装的纯主题示例 Paper Dawn,替换掉旧桌面时代的指南和含无效字段的模板 (#11578 by @KHG420)
- 市场发布表单在名称或来源框里按回车即可提交;市场的种类、排序和浏览切换支持方向键,MCP 安装位置支持方向键与 Home、End (#11845 by @KHG420, #11821 by @KHG420, #11847 by @KHG420)
- 扩展作者新增可安装的工具扩展示例、可运行的 stdio MCP 插件示例,以及本地测试和自定义宿主关闭的说明 (#11553 by @KHG420, #11584 by @KHG420, #11788 by @KHG420)
变更
- 同一工作区里写入不同路径的会话现在可以并行,不再整个工作区排队等第一个写入的会话;同一路径、重叠目录和移动的两端仍会互相等待 (#11823, #11815, #11833)
- 旧版记忆文件在迁移到 V2 之前会先原样备份,迁移改写的内容不再无从找回 (#11857, #11846 fixed in #11857)
- 自动压缩失败时,卡片会说明具体原因(超时、摘要被截断、服务商出错、上下文已变化等),不再只写「这一轮什么也没折叠」 (#11869, #11838)
- 子代理继承的思考强度在执行模型不支持时自动退回该模型默认值,换回支持的模型后恢复;子代理指定与父会话相同的模型时沿用父会话强度 (#11269 by @zcxads666, #11841, #11268 fixed in #11269 by @zcxads666)
- 递归删除的目标不是工作区授权范围内的字面路径时,即使在自动或 YOLO 模式下也会被拒绝,模型会收到明确原因 (#11786, #11782 fixed in #11786)
- 只改动
.md、.rst文档且工作区没有任何检查项时,不再要求先跑一遍验证命令 (#11780, #11776) - 手机访问的互联网设备编号复用最小的空号,同一台手机重连不再变成「设备 3、4、5」 (#11879, #11855)
- 命令行的
--compact-ratio接受 0 到 100 之间任意比例,例如 0.5,与配置文件一致 (#11854) - 切换到已在使用的模型或思考强度时不再重建会话,切换更快 (#11546 by @Harbor404)
- 市场发布表单选择私有时,说明改为「仅自己可见、无需审核」,不再承诺审核后发布 (#11716 by @KHG420)
修复
- Windows 上宿主因工作区快照遍历把协程和线程撑爆而崩溃,现在遍历受限,不再崩溃 (#11840, #11820 fixed in #11840)
- 删除保护不再因 Windows 8.3 短路径里的
~把工作区外的删除误判为「目标不是字面路径」,现在会按越界目标拒绝 (#11866) - 通过 SSH 连接远程时,引导阶段点取消会立刻中止,不再卡在打开会话 (#11622 by @Harbor404, #11619 fixed in #11622 by @Harbor404)
- 远程「从目录树打开」支持 Windows 盘符、UNC 和绝对路径,不再拼到远程主目录后面 (#11543 by @Harbor404, #11539 fixed in #11541 and #11543 by @Harbor404)
- PowerShell 命令别名存在但无法启动时被跳过,并记录实际用的外壳,不再每条命令都报
exit status 1(#11504 by @Harbor404, #10633 fixed in #11504 by @Harbor404) - 项目里的 MCP 条目不再丢掉用户禁用的工具,调用被禁用的工具会得到明确提示,空工具名不再被接受 (#11506 by @Harbor404, #11473 fixed in #11506 by @Harbor404)
- 第三方中转拒绝
previous_response_id并返回 400 时,自动改发完整历史重试,不再反复报错 (#11803, #11797 fixed in #11803) - 托盘菜单跟随系统语言,从访达或程序坞启动也不再回退为英文 (#11759, #11750 fixed in #11759)
- 身份服务不可达时,侧栏和账号面板一致显示「已登录」和错误,并提供重试与退出,不再弹出登录表单 (#11777, #11769 fixed in #11777)
- 界面大小不是 100% 时,会话和项目的右键菜单不再偏离点击位置或超出窗口底部 (#11729, #11727, #11773)
- 侧栏拖到很窄时文字不再挤在一起重叠,最小宽度提高到 232 像素 (#11731, #11723)
- 运行分析里点开一条记录,详情显示在被点的那一行下面,不必拖到列表最底部 (#11732, #11720)
- 安装文本插件后切换模型,插件的技能和代理、自定义技能目录不再丢失 (#11736 by @KHG420)
- 回退对话后不再在工作目录留下
.bak临时备份文件 (#11699 by @Guan0923) - MCP 添加命令:复制的
mcp add命令(含续行、绝对路径启动器)能被正确解析,空定义不再出现在粘贴预览里 (#11747 by @KHG420, #11779 by @KHG420, #11804 by @KHG420, #11752 by @KHG420) - MCP 名称与传输:npx、uvx、Python、Node、Go 等启动方式生成的名字不再带版本号或选项值;只有路径里完整的
sse段才判为 SSE,大小写不同的 HTTP 也能识别 (#11865 by @KHG420, #11787 by @KHG420, #11768 by @KHG420) - 需要认证的 MCP 服务选「仅此项目」安装后,不再被保存为全局启用 (#11749 by @KHG420)
- MCP 检查输入在读取期间保持稳定,操作失败时显示当前的诊断信息 (#11805 by @KHG420, #11809 by @KHG420)
- 主题:导入期间禁用重复操作;同一地址重新导入后图片立即更新;同时选 ZIP 与散文件时给出明确提示;读取失败时保留已有主题并可重试预览 (#11810 by @KHG420, #11811 by @KHG420, #11814 by @KHG420, #11812 by @KHG420, #11813 by @KHG420)
- 市场:安装失败可重新预览并保留失败项,登录失效时点赞回到登录入口,连续点提交审核不再重复提交,确认与发布反馈支持读屏 (#11784 by @KHG420, #11781 by @KHG420, #11580 by @KHG420, #11807 by @KHG420, #11800 by @KHG420)
- 插件、MCP 和技能清单读取失败时显示错误和重试按钮,不再当成空列表;更新期间的禁用导航变灰,插件开关保留重载结果 (#11796 by @KHG420, #11477 by @KHG420, #11819 by @KHG420)
- 插件安装失败后可通过重新预览恢复;空插件列表的指引改为设置 > 扩展 > 已安装 > 插件包 > 添加 (#11651 by @KHG420, #11696 by @KHG420)
plugin doctor会检查已声明的代理目录,目录被删或被换成文件时报错;声明成文件的技能、代理、命令和提示目录会给出警告 (#11745 by @KHG420, #11689 by @KHG420, #11790)- 已安装插件换版本后,重复的贡献行和兼容性提示行不再残留旧内容;中文名技能显示为
/包名:审查而不是SKILL(#11737 by @KHG420, #11733 by @KHG420, #11740 by @KHG420) - 导出插件包时,数字开头的 MCP 服务名和残缺的
$NAME引用不再让收件人填写的值失效 (#11725 by @KHG420, #11738 by @KHG420) - 扩展 SDK:交互结果需显式确认,取消的请求不再写出,关闭回调和通知队列更稳,工具参数缺失与响应格式会校验 (#11850 by @KHG420, #11802 by @KHG420, #11798 by @KHG420, #11793 by @KHG420, #11828 by @KHG420, #11835 by @KHG420)
贡献者
感谢本版本的贡献者:@KHG420、@zcxads666、@Harbor404、@Guan0923
What's Changed
- fix(studio): place rail context menus correctly at a zoomed interface size in #11729
- fix(studio): open a run-analysis record under the row that was clicked in #11732
- fix(studio): keep the narrow workspace column legible in #11731
- fix(boot): retain configured skill discovery after Studio model switches by @KHG420 in #11736
- fix(studio): refresh repeated compatibility issue rows by @KHG420 in #11733
- fix(studio): replace duplicate contribution rows with current package inventory by @KHG420 in #11737
- fix(studio): validate declared agent roots in plugin doctor by @KHG420 in #11745
- fix(studio): parse copied MCP add commands as declarations by @KHG420 in #11747
- fix(sdk): declare only callable tool handlers by @KHG420 in #11758
- fix(studio): omit empty MCP definitions from pasted previews by @KHG420 in #11752
- fix(studio): derive MCP names through mixed-case runner extensions by @KHG420 in #11753
- fix(studio): skip uvx from values when deriving MCP names by @KHG420 in #11756
- fix(studio): keep uvx version pins out of MCP server names by @KHG420 in #11755
- fix(checkpoint): 回退成功后清理临时备份 by @Guan0923 in #11699
- test(boot): exercise exported MCP recipient headers by @KHG420 in #11724
- fix(repolint): keep quoted paragraphs separate by @KHG420 in #11715
- test(gitcmd): mark rewritten staging fixture stat dirty by @KHG420 in #11705
- test(schedrun): wait for child startup before supervisor crash by @KHG420 in #11698
- fix(studio): derive Python MCP names from interpreter entry points by @KHG420 in #11764
- fix(remote): open absolute Windows workspaces from tree by @Harbor404 in #11543
- fix(studio): follow Registry pages for exact MCP installation names by @KHG420 in #11765
- fix(studio): correct empty plugin list install guidance by @KHG420 in #11696
- fix(studio): diagnose native contribution roots that name files by @KHG420 in #11689
- fix(pluginpkg): generate expandable numeric server aliases by @KHG420 in #11725
- fix(studio): show a signed-in account consistently when the identity service is unreachable in #11777
- test(boot): verify copied slash commands across their lifecycle by @KHG420 in #11508
- test(studio): verify installed hook context lifecycle by @KHG420 in #11507
- fix(studio): skip uv dependency values when deriving MCP names by @KHG420 in #11767
- fix(studio): derive Node MCP names from script entry points by @KHG420 in #11766
- fix(studio): recognize HTTP URL schemes regardless of case by @KHG420 in #11768
- fix(studio): drop mixed-case Markdown command suffixes by @KHG420 in #11748
- fix(sdk): make starter interceptor work on composed inputs by @KHG420 in #11503
- feat(examples): add a runnable stdio MCP plugin by @KHG420 in #11584
- docs(sdk): add an installable tool extension example by @KHG420 in #11553
- fix(mcp): preserve disabled tool policy by @Harbor404 in #11506
- feat(studio): prepare market release drafts from own packages by @KHG420 in #11566
- fix(cli): print package warnings before plugin doctor rejects an agent root in #11790
- perf(studio): skip rebuilds for unchanged model or effort by @Harbor404 in #11546
- fix(shell): skip a PowerShell Store alias that will not start; record which ran by @Harbor404 in #11504
- fix(evidence): do not demand verification after supporting-only edits when no checks exist in #11780
- fix(responses): fall back to full history when a relay rejects previous_response_id in #11803
- feat(host): log elapsed milliseconds per startup phase in #11760
- fix(shell): refuse recursive deletes whose target is not a literal path inside the granted roots in #11786
- fix(studio): parse continued MCP setup commands by @KHG420 in #11779
- fix(studio): skip Node option values in MCP names by @KHG420 in #11799
- fix(studio): derive MCP names through uv global options by @KHG420 in #11801
- fix(studio): pass the system language to the kernel host so the tray follows it in #11759
- fix(sdk): synchronize notification queue shutdown by @KHG420 in #11793
- fix(studio): recognize copied MCP add launcher paths by @KHG420 in #11804
- docs: add the change discipline rules to REASONIX.md in #11829
- fix(sdk): recover shutdown callback panics by @KHG420 in #11798
- fix(sdk): stop already-cancelled host requests before writing by @KHG420 in #11802
- fix(sdk): require tool argument presence by @KHG420 in #11828
- fix(sdk): handle null arguments in fullsidecar demo by @KHG420 in #11826
- fix(sdk): validate provider response format types by @KHG420 in #11835
- ci(ops): register the ops events relay deploy workflow on the default branch in #11862
- fix(cli): validate compact-ratio against the config layer bounds in #11854
- fix(state): bound the workspace snapshot walk so goroutines and threads stay limited in #11840
- fix(boot): a subagent that names the parent's model inherits the parent's effort in #11841
- fix(sdk): require explicit UI result acknowledgements by @KHG420 in #11850
- fix(shell): only a leading tilde makes a delete target non-literal in #11866
- fix(studio): recover signed-out market vote writes by @KHG420 in #11781
- fix(studio): keep MCP inspection input stable while reading by @KHG420 in #11805
- fix(studio): show current MCP operation diagnostics by @KHG420 in #11809
- fix(studio): retain plugin switch reload outcomes by @KHG420 in #11819
- fix(pluginpkg): redact literals mistaken for environment references by @KHG420 in #11738
- fix(studio): name installation source inputs accessibly by @KHG420 in #11818
- test(extension): clean conformance scratch before exiting by @KHG420 in #11792
- fix(studio): retain themes when inventory reads fail by @KHG420 in #11812
- fix(session): let sessions that write disjoint paths of one workspace proceed in parallel in #11823
- docs(sdk): align fullsidecar demo guidance by @KHG420 in #11556
- test(studio): cover installed SDK provider streams at boot by @KHG420 in #11832
- fix(studio): retry previews after theme inventory refresh by @KHG420 in #11813
- fix(studio): add semantics to publisher feedback by @KHG420 in #11800
- fix(studio): serialize own-package review submissions by @KHG420 in #11580
- fix(studio): submit publishing drafts with Enter by @KHG420 in #11845
- fix(studio): expose market confirmation busy and error states by @KHG420 in #11807
- feat(share): let the phone-access LAN link use a fixed port in #11568
- fix(studio): support keyboard MCP installation locations by @KHG420 in #11847
- fix(boot): let inherited subagent effort yield to execution model (studio) by @zcxads666 in #11269
- test(studio): drive own-review regression through the real inventory reload in #11874
- fix(studio): recover from extension inventory read failures by @KHG420 in #11796
- fix(studio): recover failed plugin installs through fresh previews by @KHG420 in #11651
- test(builtin): compare ambiguous writer grant targets against the resolved root in #11875
- fix(studio): explain private market drafts before saving by @KHG420 in #11716
- fix(studio): recover failed market install results by @KHG420 in #11784
- fix(compaction): name why an automatic fold failed instead of "folded nothing" in #11869
- test(boot): bound snapshot walk goroutines by pool size, not total growth in #11877
- docs(studio): add current theme author guide and starter by @KHG420 in #11578
- fix(studio): show disabled update navigation and cover lock release by @KHG420 in #11477
- fix(serve): reuse the lowest free ordinal for Internet controllers in #11879
- fix(studio): retain local scope for pending MCP installs by @KHG420 in #11749
- docs(sdk): explain local tests and custom host shutdown by @KHG420 in #11788
- fix(memory): back up legacy memory files before the V2 migration rewrites them in #11857
- fix(remote): cancel SSH session opening during bootstrap by @Harbor404 in #11622
- test(control): wait for turn events within testenv.Budget instead of fixed 2-10s in #11881
- test(boot): bound permission-rule contention by writer count and process readiness by testenv.Budget in #11883
- test(shellrun): give the quiet-timeout case a deadline that outlasts PowerShell startup in #11882
- fix(studio): serialize theme import feedback by @KHG420 in #11810
- perf(sandbox): remember a bash.exe that already passed the launch probe (refs #11885) in #11887
- test(shellrun): stop the quiet-timeout test racing interpreter startup in #11888
- test(boot): make the workspace scan limit injectable (refs #11885) in #11886
- fix(studio): share keyboard navigation for market radios by @KHG420 in #11821
- fix(studio): infer MCP transport from endpoint path segments by @KHG420 in #11787
- fix(studio): revalidate theme assets with content ETags by @KHG420 in #11811
- fix(studio): reject mixed theme archive selections by @KHG420 in #11814
- docs(ecosystem): add compatible command example and host proof by @KHG420 in #11569
- fix(studio): unify MCP launcher name inference by @KHG420 in #11865
- fix(studio): align package skill inventory with runtime names by @KHG420 in #11740
- test(boot): close process-global catalogs before the temp dir is removed in #11889
- docs(release): prepare Studio 2.27.0 notes in #11890
- fix(release): never credit the repository owner in release notes in #11891
Full Changelog: studio-v2.26.0...studio-v2.27.0
macOS 已用 Developer ID 签名并公证,打开时不需要清除隔离属性。Windows 的窗口、内核与安装器都经 Certum 代码签名证书做了 Authenticode 签名。Linux 从 .deb 安装。
三个平台都能自更新:Linux 走自己的包,Windows 运行下一个安装器,macOS 替换自身 bundle。