Skip to content

修复:MSYS兼容边界、run_code路径扫描与unconfined反馈 - #24

Merged
KannaKuron merged 2 commits into
KannaKuron:mainfrom
KouzakiUmi:fix/msys-compatibility-boundaries-upstream
Oct 13, 2026
Merged

KannaKuron merged 2 commits into
KannaKuron:mainfrom
KouzakiUmi:fix/msys-compatibility-boundaries-upstream

Conversation

@KouzakiUmi

Copy link
Copy Markdown
Contributor

概要

Refs #23。

修复可安全处理的 run_code 源码路径边界与提示门控,同时把不能在插件层普遍解决的 MSYS 原生参数、输出编码和 Windows unconfined 边界写进模型可见反馈。这不是通用原生编码修复,也没有恢复 Windows shell confinement。

本 PR 基于上游 v0.39.2 主线,仅一个提交、12个文件;#22 已 squash 合并,不重复带入其历史。原实验分支保持不变。新内容写在 Unreleased,原 v0.39.2 发布记录保持原样。

提交:4816cd8。

具体改动

真正修复的缺陷

  • 完整 Unicode 字母/组合字符/数字及含#路径字面量走既有共享挂载表。
  • 合法EOF行注释不再让整份路径重写弃权;未闭合注释/字符串和不确定slash仍整份no-op。
  • tagged templates保留原始数据及raw/tag语义,包括String.raw、调用/索引tag及歧义上下文词;不扩展插值/动态表达式猜测。
  • 实际prompt listener读取live codePaths,OFF不再承诺源码字符串会翻译;ON明确best-effort并区分直接Node fs/path与工具路径字段。
  • 私有执行句柄在等待result之前带sandbox facts。前台正文、后台登记、后台结果摘要及超时转后台反馈明确显示unconfined;后台登记说的是计划执行边界,不假称命令已经运行。
  • defineTool和plain fallback输出联合均接受新增的可选后台sandbox facts;未弱化既有required/拒绝分类/退出标记、取消和超时规则。

无法普遍修复,因此准确警示

  • MSYS可能把native /all、/c当路径;提示//all///c或单命令EXCL前缀,并说明排除/c同时影响/c/...。
  • 不全局设置EXCL=*,不自动改用户command;cmd exit0可能没有预期效果,须核验实际输出/效果。
  • 宿主UTF-8解码与native OEM/ANSI输出可能不匹配;明确已知编码转换必须在字节捕获前,locale不保证native UTF-8,混合流不能全局GBK/自动猜码。
  • 保留Windows既有unconfined行为,不把警示冒充安全围栏;不得经shell绕过官方文件工具策略拒绝。
  • 双语文档说明file write/edit策略和读能力是不同层,移除“所有未来版本都无解”的过度结论。

不在范围

不替换root PowerShell、不修改市场patch、不增加依赖、不改安全默认或版本号、不静默回退其他shell、不劫持fs、不替换run_code运行时、不引入全源码AST改写。词法扫描仍不能辨认HTTP路由/search/command等字符串用途;动态路径及这些数据的可靠方向是native路径或显式类型化转换。

实际验证

在新的上游v0.39.2基线上重新执行:

  • npm test:166/166。
  • DSH_PREVIEW_HOST_DIR=<actual-installed-host> npm run test:preview:17/17。
  • 打包、语法与diff检查通过;包和插件manifest版本保持0.39.2。
  • 新增9项便携兼容回归、1项后台登记回归、3项实际Core API/执行句柄/run_code transport回归。旧护栏保留,没有通过删除断言或降低约束过关。
  • 实际宿主工具/执行器组件为Core0.2.1-alpha.2,测试Nodev24.13.0。新增部分用内存subprocess/source capture;既有preview仍跑真实Git Bash与PowerShell进程。

**覆盖限制:**新PTC测试只通过真实transport捕获程序,不执行真实PTC引擎或文件操作;未验证完整生产GUI、AppContainer或新的restricted-token隔离方案。

Issue #23中的基础平台/架构限制仍是已知边界,因此这里用Refs而非自动关闭整项跟踪。

@KouzakiUmi
KouzakiUmi marked this pull request as draft October 13, 2026 11:40
@KouzakiUmi
KouzakiUmi marked this pull request as ready for review October 13, 2026 12:49

@KannaKuron KannaKuron left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review:方向与实现全部通过,一处修改请求后合并

四个声称我们已对照 v0.39.2 源码逐一核实,本 PR 的修复逐项核对如下——质量很高:

核实通过项

  1. unconfined 可观测性(声称③):sandboxUnconfinedMarker 文案准确(明示 NOT enforced + 文件工具策略独立 + 不得经 shell 绕过);前台正文(renderResult)、job 读数(renderJobRead→sandboxNotes)、初始后台登记(renderBackground + output union 扩展)三面都是纯加法,exit/signal marker 仍锚定末尾,parseExitStatus 不受影响;renderJobRead 收编进 sandboxNotes 后 runnerFailed/denied/escalation 三分支完整保留(对照过);decorateExecution 的 ex.sandbox = sandbox 补上了「句柄等待 result 前」的 facts;executor.gitBashRoute 与 shell.js:247 的既有方法名匹配,防御式调用不遮蔽失败。
  2. run_code 边界(声称④):EOF 行注释 break(合法语法,不再弃权)而未闭合块注释/字符串/插值仍整份 no-op——铁律保持;白名单 \p{L}\p{M}\p{N} + # 只作用于「以 / 或 ~/ 开头的整串」,其后还有 translateMsysPath 段边界二次校验,误伤面可控;tagged template 判定(tag 紧邻、String.raw、调用/索引/括号 tag、of/await/yield 作标识符)八种形态全部保守跳过,方向正确——宁漏勿错。
  3. 提示门控(声称④d):runCodeHintFor(tools, codePaths) + 调用点读 live 值;RUN_CODE_DIRECTIVE_OFF_TEXT 诚实声明 OFF;新测试从源码截取真实 listener 用 new Function 构造验证三种方言组合——这是真接线断言,不是 grep。
  4. 工具描述(声称①②):官方镜像 + 四句增补的偏离已诚实标注("plus unavoidable boundaries");ipconfig //all/EXCL 前缀语义/UTF-8 与 CP936/mixed streams 不可猜/unconfined 声明全部在案,且不随方言开关消失。
  5. 测试真实性:本地 macOS 全量 npm test 166/166(165 pass + 1 skip,与 CHANGELOG 一致);新增断言是真实求值(new Function)与真实 ToolRuntime/Context 集成,不是正则凑数;README 删除「所有未来版本无解」的过度结论、CHANGELOG 如实——文档纪律到位。

修改请求(一处,补上即合并)

CHANGELOG 声称警示「贯穿…超时转后台」,但 renderPromoted 本身不读 sandbox、promote 分支也未传入——测试 renderPromoted({ …, output: delta }) 的 output 是人工构造的已含警示文本,而真实链路里 promote 时刻的 output 是前台原始输出的累积(未经 renderJobRead),不含警示。即:转后台那一刻模型看到的文本仍无警示,要等下一次 job 读数才补上——与 #23 的验收标准(「贯穿超时转后台」)及 CHANGELOG 表述有落差。

建议:promote 分支把句柄上的 sandbox facts(decorateExecution 现已挂在 handle 上)传入,renderPromoted(promoted, sandbox?) 在文本尾追加 sandboxNotes——几行改动;对应测试改为断言「promote 返回值自带警示」而非「传入含警示的 output 被保留」。

附带报告(不阻塞):tests/host-loader.mjs 的 registerHooks 在 Node 24.21 上对 createRequire(...).resolve('@deepseek-ai/…') 也会生效,hostRequire.resolve 再次进入 hook → 无限递归 RangeError(你的 24.13 正常;本机 main 分支同样复现,与 PR 无关)。preview 这条我这边以你的 Windows 实测 + CI 为准。值得留意:未来 Node 小版本可能继续改变同步 resolve 钩子的作用范围,hook 里可考虑按 context.parentURL 区分自身与宿主解析,或对 hostRequire 的解析结果做一层 memo 短路。

补上 promoted 一处并 rebase 后,我们按 v0.39.3 发布(同轮会带上 #25 报告的 SIDEBAR_NS row-id 修正)。

@KouzakiUmi

KouzakiUmi commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor Author

已在 c79332e 补上这一处,谢谢指出测试证据的缺口。

  • promotion DTO 显式携带执行句柄上的 sandbox,promoted output schema 增加闭合的可选 facts。
  • renderPromoted 根据 facts 自行追加 sandboxNotes;promotion 的 output 不再预渲染 sandbox 警示,保留 ring/spill/丢失提示,因此不会重复追加。defineTool 与 JSON-schema 回退渲染均走相同路径。
  • 原回归改用不含警示的原始 output;覆盖空输出、unconfined、full、denied 与 runnerFailed。
  • 新增实际 Core ToolRuntime → 私有执行器 → 内存 provider 的 promotion 回归:RO/WW 各有一条最终警示,full 无警示,DTO.output 不含警示,最终模型文本自身补上;同时验证丢失/spill 提示与官方 root 服务保持不变。Jobs wait/read 是受控桩,不将此测试称为真实 Jobs 时钟或生产 GUI 验收。

验证:普通完整回归 166/166、实际安装 Core 完整 preview 18/18,均 exit 0,无 skip/cancel;语法及 diff 检查通过。

核对时上游 main 仍为 6244efc,已是此前 PR 提交的直接父基线,故没有需要重放的 upstream 更新。此提交仅包含审查修补及测试/CHANGELOG,不包含 #26 的实验入口。

Node 24.21 host-loader 递归按您说明保留为非阻塞后续项,本次未扩展修改范围。

@KannaKuron
KannaKuron merged commit cffd680 into KannaKuron:main Oct 13, 2026
4 checks passed
KannaKuron added a commit that referenced this pull request Oct 13, 2026
…mespace, and release v0.39.3 (#25 #27)

issue #27: the private bash tool's hard inject of workingDirectory left the module fiber INACTIVE on hosts without that service (0.2.0-rc.2) — inject minimized, cwd seam falls back to the rc.2-era official resolveWorkdir order, and activation success now requires a tools.schemas read-back. issue #25 Bug 3: SIDEBAR_NS now uses the real row id (better-sidebar) instead of the npm package name. Carries PR #24 (MSYS boundaries, run_code scan edges, unconfined feedback) as v0.39.3.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants