Replies: 1 comment
|
全部六条源码核实完毕(本地 0.1.2-alpha.1 = cd5ef81;你对照的 master 2026-08-27 相关文件与本地一致)。你的定位全部准确,逐条给行号 + 少量补充: ① fs-sandbox ino=0 绕过(确认): ② token 估算中文低估(确认): ③ --dump-config 无条件重写(确认): ④ JSONL 无 loadStoredFrom(确认): ⑤ invoke 无调用方会话校验(确认,比你说的更彻底): ⑥ compaction 同生命周期 unmatched start 永久 busy(确认): (附注:Windows ACL 沙箱 SChannel TLS 不可用那条作为已知限制记录很有价值——Node 自带 TLS 不受影响即默认路径安全,文档化即可。) 三条补丁方向全部正确,可直接作为上游 PR 素材(通道恢复后)。 |
Uh oh!
There was an error while loading. Please reload this page.
Discussion: 六个已定位的实现缺陷与修复建议(0.1.1-rc.2 实测 / master 对照)
1. fs 写围栏在 ino=0 文件系统上可被绕过(附补丁)
packages/fs/fs-sandbox/src/containment.ts的sameIdentity用dev+ino相等判定目标位于可写根之下。FAT/exFAT 与部分网络共享卷的ino恒为 0,导致任意已存在祖先都与工作区根"身份相同",isPathUnder恒真,write/edit工具可越过工作区边界。建议:
ino === 0n时返回 false(补丁fix-fs-sandbox-ino-zero)。2. token 估算对中文低估约 4 倍(附补丁)
packages/llm/token-meter/src/estimate.ts固定CHARS_PER_TOKEN = 4。中文约 1 字/token,导致压缩阈值延迟触发、上下文预算偏斜。assistant 消息有服务端 usage 锚定,漂移集中在工具结果增量——但大段中文工具结果场景下影响显著。建议:按 Unicode 块加权(CJK 区 1 字/token,其余维持 4 字符/token;补丁
fix-token-meter-cjk)。3. --dump-config 无条件重写 profile 根文件,沙箱内 EPERM 崩溃(附补丁)
apps/cli/src/profile-boot.ts的prepareProfile每次调用都重写cordis.yml。诊断命令在沙箱内执行时($DSH_HOME在工作区外)直接 EPERM 退出,只读诊断不可用。建议:内容已等于模板时跳过写入(补丁
fix-dump-config-readonly-write)。4. JSONL 后端无 loadStoredFrom,冷读全量解压(建议官方实现)
packages/session/session-persistence-jsonl/src/index.ts注释明示无跳读钩子,readFrom退化为全文件读入+全帧解压(实测单会话 25MB 压缩)。SQLite 后端已有实现。建议:利用现有分帧容器做帧级跳读。
5. 动态插件 invoke 无调用方会话校验(master 已部分修)
管理动词已线程化 agent 并校验归属(
owned()),但@Remote('invoke')仍只校验pluginRunId,配合inventory()可跨会话枚举并调用私有 Host handler。建议:invoke 载荷携带发起者身份并校验
sessionId;inventory按会话过滤。6. compaction 同生命周期 unmatched start 永久 busy(master 已部分修)
进程死在
compaction/start与compaction/end之间时,同生命周期内无后续 end-seed 覆盖,会话压缩永久 busy。master 已处理跨生命周期陈旧标记,同生命周期场景仍在。建议:恢复加载时按 turn 闭合性补写
compaction/end或判定 inactive。(另:Windows ACL 沙箱受限令牌下 SChannel TLS 全面不可用(Edge/.NET/git
SEC_E_NO_CREDENTIALS),Node 自带 TLS 不受影响——作为已知限制记录,供文档化参考。)All reactions