feat(desktop): 会话级只读 library extraDirs,ChatInput 不计系统槽 - #3745
Conversation
|
| Filename | Overview |
|---|---|
| apps/desktop/src/main/maker-ipc/register.ts | 新增统一目录授权和 library 系统槽入口,但入口没有生产调用方,核心注入及撤销流程不可达。 |
| packages/maker-core/src/agents/codex/index.ts | 旧版 app-server 的 setExtraDirs 改为静默忽略,导致上层误判成功并持久化未生效目录。 |
| apps/desktop/src/main/cindy-brain/libraryVault.ts | 读取改为 O_NOFOLLOW 加 bigint dev/ino 的同文件复核,并保持句柄清理与读取限额。 |
| apps/desktop/src/main/cindy-brain/librarySlot.ts | 增加正本相对键、available 引用及不泄露绝对路径的授权握手字段。 |
| apps/desktop/src/renderer/components/new-chat/ChatInput.tsx | 配额和角标计数改为排除 library 系统槽。 |
| packages/maker-core/src/agents/claude-code/index.ts | extraDirs 代际变化会在下一次发送前触发现有 resume/fork 重建路径。 |
Sequence Diagram
sequenceDiagram
participant L as Library 生命周期
participant H as Desktop 授权入口
participant A as Agent 运行时
participant D as Session DB
L->>H: ready / 迁根 / 撤销
H->>A: setExtraDirs(runtime roots)
alt 运行时接受
A-->>H: success
H->>D: persist extra_dirs
else 运行时拒绝
A-->>H: throw/error
H->>A: rollback previous dirs
end
Prompt To Fix All With AI
### Issue 1
apps/desktop/src/main/maker-ipc/register.ts:3016-3023
**Library 注入入口未接线**
`applyLibraryReadonlyExtraDir` 在生产代码中没有调用方,因此 library ready 时不会把根目录加入当前 Mivo 会话,迁根、解绑或卸载时也不会同步更新或撤销该槽。结果是 Claude、Codex 和 Pi 无法通过新增的原生 Read 路径读取正本 blob。
### Issue 2
packages/maker-core/src/agents/codex/index.ts:12447-12452
**Codex 授权状态失真**
当 app-server 不支持只读引用目录时,这里正常返回会让上层把运行时应用视为成功并持久化新目录,但 `mutableExtraDirs` 实际没有更新。数据库和 UI 因而显示 library 已授权,而活动 Codex 会话仍无法读取对应文件。
```suggestion
if (newDirs.length > 0 && !readonlyReferenceDirsSupported) {
throw new Error(
`Codex reference directories require app-server 0.144.6 or newer (current: ${initResp.userAgent ?? 'unknown'})`,
);
}
```
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.Reviews (1): Last reviewed commit: "docs(design-previews): library extraDirs..." | Re-trigger Greptile
|
这条 PR 需要维护者确认后才能合并(产品可见的 library 系统槽 + 插件基座 + 规则文档)。 请维护者直接在本 PR 上 Approve;若要改,请 Request Changes。讨论 issue:#3749 作者侧:确认完成前不用反复请求 review。当前还有 CI 失败和未 resolve conversation,那些仍需处理。 |
|
@PraiseZhu 👋 这个 PR 还有 2 条 review conversation 没 resolve(apps/desktop/src/main/maker-ipc/register.ts / packages/maker-core/src/agents/codex/index.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。 如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。 |
|
命中 UI 路径(apps/desktop/src/renderer/components/new-chat/AtMentionPanel.tsx / apps/desktop/src/renderer/components/new-chat/ChatInput.tsx / apps/desktop/src/renderer/components/new-chat/extraDirsActions.ts)但 description 未附界面效果证据——建议补充改动后效果:截图/录屏,或改动后界面的 HTML 页面(```html 代码块、.html 附件或在线预览链接),便于确认界面符合 DESIGN.md 设计规范 |
|
@MagicLizi UI 证据已在 description 的「UI 变化」:composer 两条 Greptile conversation 已按后续 commit 回帖并 resolve:library extraDirs 已接到 cindy-brain 生命周期;Codex 旧 app-server 对非空 extraDirs 改为 throw。请下一轮 auto-review 继续。 |
|
@PraiseZhu 👋 这个 PR 目前与 请在本地 merge 最新的 |
把 G2 的会话级只读 extraDirs 注入、blob 相对键、限额与 confirmed=writeCommit ACK 写进权威 library 规则与冻结稿。仓内无 libraryConfirmed.ts,不得发明该文件。 Signed-off-by: PraiseZhu <zhuzan@xd.com>
read() 打开后用 bigint dev/ino 同 fd 复核,换链/ino=0 走 INTERNAL 且不返回字节; 打开器保持私有,失败不回落裸 open。writeCommit ACK 形状不变。 Signed-off-by: PraiseZhu <zhuzan@xd.com>
editImage 只认 assets/<2>/<hash>/blob.<ext>,sidecar 禁止当像素; writeCommit ACK 仍用 sha256 升格 confirmed;open/status 回 authorizedReadonly 与 generation/identity,不回绝对路径。 Signed-off-by: PraiseZhu <zhuzan@xd.com>
editImage 解析后的绝对路径走 assertLibraryEditImageSource; 通道门只认 helper,不再平行正则。握手测试直接打 open/status。 Signed-off-by: PraiseZhu <zhuzan@xd.com>
hashes 先剥 library: 再判 blob/sidecar,前缀加 preview.webp/meta.json 不得进 resolveOwnedMedia。 Signed-off-by: PraiseZhu <zhuzan@xd.com>
IPC 与 library 槽共用内部入口;writableDirs 仍走 picker。 library 槽不占用户 10 名额,迁根/卸载传 null 即撤,恢复时剥前缀。 Signed-off-by: PraiseZhu <zhuzan@xd.com>
library 槽剥前缀后再走 excludeDirectoryGrantConflicts,写法改为 if/else,行为不变。 Signed-off-by: PraiseZhu <zhuzan@xd.com>
setExtraDirs 只改 closure;下一次 send 复用 rewind 三件套, 不用 fresh:true。拷贝兜底默认关闭。 Signed-off-by: PraiseZhu <zhuzan@xd.com>
启动仍闸 0.144.6;运行中低版本忽略 extraDirs, 读像素继续走 cindy-media 备胎。 Signed-off-by: PraiseZhu <zhuzan@xd.com>
cindy-library: 前缀与用户目录分区,计数豁免 EXTRA_DIRS_MAX。 Signed-off-by: PraiseZhu <zhuzan@xd.com>
只描述只读作品库能力并用 basename 标签,不含 /Users/.../libraries/。 Signed-off-by: PraiseZhu <zhuzan@xd.com>
cindy-library: 前缀不计入 EXTRA_DIRS_MAX;满 10 个用户目录时槽仍通过。 Signed-off-by: PraiseZhu <zhuzan@xd.com>
composer 加目录入口与 + 计数改走 countUserExtraDirs,列表把 cindy-library: 显示为系统项且不可移除。顺手把 applyDirectoryGrants 抽出后的源码扫描锚点改到 export function。 Signed-off-by: PraiseZhu <zhuzan@xd.com>
ChatInput 不计 cindy-library: 名额、列表显示「Mivo 作品库(只读)」的可交互验收件。 verify A-D 绿,未采像素基准。 Signed-off-by: PraiseZhu <zhuzan@xd.com>
open/status 与迁根、停用、卸载后调用 applyLibraryReadonlyExtraDir。 有焦点只注入当前会话;撤槽扫可见活跃会话。Codex 旧版 setExtraDirs 不再静默忽略,避免库里已授权、运行时读不到。 Signed-off-by: PraiseZhu <zhuzan@xd.com>
停用改到 setEnabled 成功之后刷新,避免仍读到 enabled=true 又把槽注回去。 删除改到 trash 成功之后刷新。切走焦点时也撤槽。 Signed-off-by: PraiseZhu <zhuzan@xd.com>
焦点同步对可见会话逐条写:当前焦点注入,其余撤槽。无 live handle 时仍 persist extraDirs。迁根失败也会 refresh 把旧根加回。懒恢复剥掉 cindy-library: 前缀再交给 harness。 Signed-off-by: PraiseZhu <zhuzan@xd.com>
注入走 cindy-library:realpath,切焦点把未聚焦会话的槽撤掉。 Claude 中途授权 resume+fork 续聊,不把 session id 当 resumeSessionAt,也不用 fresh:true。 单测钉死注入/撤权/10 名额豁免/代际换根/低版本 Codex 不持久化/握手无绝对路径。 Signed-off-by: PraiseZhu <zhuzan@xd.com>
焦点切换时旧一轮 sync 不得覆盖新一轮授权。Orca idle worker 唤醒时把 cindy-library: 逻辑槽剥成真实路径再交给 harness。 Signed-off-by: PraiseZhu <zhuzan@xd.com>
idle worker 唤醒已剥 cindy-library: 前缀,静态扫描测试跟着改。 Signed-off-by: PraiseZhu <zhuzan@xd.com>
旧一轮 sync 在某个 session 的 apply 返回后不得继续写后续会话。 Signed-off-by: PraiseZhu <zhuzan@xd.com>
握手 authorizedReadonly 只在 focused 本地会话 extraDirs 真正写入后为 true。 Codex 旧版本、远端会话、槽竞态与 writable 重叠都 fail-closed,走 cindy-media 备胎。 SET_EXTRA_DIRS 在 session 锁内合并 library 槽,不再锁外预读。 Signed-off-by: PraiseZhu <zhuzan@xd.com>
commitRewindFiles 已经 close 过旧 q。send 再建时只给 extraDirs 中途授权补 close,避免 abort rewind 测试里 close spy 被调两次。 Signed-off-by: PraiseZhu <zhuzan@xd.com>
eaa34cd to
3d8c1eb
Compare
|
@codex review |
|
To use Codex here, create a Codex account and connect to github. |
|
修复收口 dispatch:f820499381b01489 本轮重派核实 Greptile 两条 P1 均已按后续 commit 修复并推送(head Greptile P1 × 2
状态核对(2026-09-02)
|
|
Mivo 会话现在会静默带上只读作品库目录,composer 里那一项不占用户的 10 个名额,也没法误删。旧 Codex 版本会明确失败,不会假装已经授权。 |
这次改了什么
摘要
把当前 Mivo 会话的本地 library 根静默注入为只读 extraDirs 系统槽(
cindy-library:),三 harness 可原生 Read 正本 blob;composer 加目录入口与计数不再把该槽算进用户 10 名额,列表显示「Mivo 作品库(只读)」且不可移除。Agent 回执
mediaStates.available.imageRef仍由 Mivo 拼cindy-media://,本 PR 不改 Mivo、不改saveGhostMedia全局 URL。变更类型
feat新功能fix缺陷修复docs/test/chore文档、测试或工程维护范围
authorizedReadonly/libraryGeneration/libraryIdentity;静默注入 extraDirs;Claude resume+fork / Codex 版本门 / Pi prompt 去绝对路径;ChatInput 配额与系统项文案接线;qa-hifi-demobuildImageRef/agentBridgeavailable 回执改library:assets/...;saveGhostMedia全局改 URL;已冻结 G2 台账回写UI 变化
composer
+菜单:library 系统槽显示为「Mivo 作品库(只读)」,无移除按钮;用户目录计数不含该槽。可交互 demo:docs/design-previews/library-extradirs-quota/index.html怎么验证的
自动验证
手工验证
不涉及(未启动 Desktop 实机)。
未执行的验证
像素基准未采集。Mivo 端到端「Agent 回执改 library:」不在本仓。
风险
风险分类
影响与回滚
提交前检查