Skip to content

feat(desktop): 会话级只读 library extraDirs,ChatInput 不计系统槽 - #3745

Merged
MagicLizi merged 23 commits into
makecindy:mainfrom
PraiseZhu:feat/g2-library-agent-read
Sep 2, 2026
Merged

feat(desktop): 会话级只读 library extraDirs,ChatInput 不计系统槽#3745
MagicLizi merged 23 commits into
makecindy:mainfrom
PraiseZhu:feat/g2-library-agent-read

Conversation

@PraiseZhu

Copy link
Copy Markdown
Contributor

这次改了什么

摘要

把当前 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 文档、测试或工程维护

范围

  • 关联 Issue / 需求:G2 library 原生 Read(Cindy 宿主侧)
  • 本 PR 包含:libraryVault O_NOFOLLOW;editImage/upload 认 blob 正本;open/status 握手字段 authorizedReadonly / libraryGeneration / libraryIdentity;静默注入 extraDirs;Claude resume+fork / Codex 版本门 / Pi prompt 去绝对路径;ChatInput 配额与系统项文案接线;qa-hifi-demo
  • 明确不包含:Mivo buildImageRef / agentBridge available 回执改 library:assets/...saveGhostMedia 全局改 URL;已冻结 G2 台账回写
  • 用户可见变化:Mivo 会话的额外目录列表会出现只读系统项;用户自选目录满 10 个时仍可保留该系统项,加号按用户目录计数
  • 是否存在 breaking change:无

UI 变化

composer + 菜单:library 系统槽显示为「Mivo 作品库(只读)」,无移除按钮;用户目录计数不含该槽。可交互 demo:docs/design-previews/library-extradirs-quota/index.html

  • 引用的设计规范:DESIGN.md 列表行高 44px / 建议面板 480px 宽(AtMentionPanel 既有 F2 规格);本 diff 不改间距与色值,只改计数语义与系统项文案。不涉及:未改 token 或布局几何。

怎么验证的

自动验证

pnpm test:unit:related
结果:PASS apps/desktop unit + maker-core related + lizi-mcps + orca-workflow

pnpm --filter desktop run typecheck
结果:exit 0

node ~/.claude/skills/qa-hifi-demo/scripts/verify.mjs --demo docs/design-previews/library-extradirs-quota
结果:ok true;门 A/B/C/D 绿;未声明像素基准

手工验证

不涉及(未启动 Desktop 实机)。

未执行的验证

像素基准未采集。Mivo 端到端「Agent 回执改 library:」不在本仓。

风险

风险分类

  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)

影响与回滚

  • 影响范围:Desktop extraDirs 注入与 ChatInput 计数;library open/status 回执多三个握手字段(旧插件忽略未知字段);Claude/Codex/Pi extraDirs 消费
  • 回滚 / 降级方式:revert 本分支。存量插件影响:无。

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名
  • UI 改动已在「UI 变化」注明
  • 未提交凭证、令牌或授权文件
  • 已补充必要文档
  • 已确认测试结果或说明未执行原因

@PraiseZhu
PraiseZhu requested a review from a team as a code owner September 1, 2026 11:51
@greptile-apps

greptile-apps Bot commented Sep 1, 2026

Copy link
Copy Markdown

Greptile Summary

本 PR 为 Mivo library 增加会话级只读 extraDirs、正本 blob 读取和多 Agent 目录更新能力,并调整 composer 的系统槽展示与配额计算。

  • 为 library read 增加 O_NOFOLLOW 与文件身份复核,并扩展 open/status 握手。
  • 允许 editImage 消费 library 正本 blob,同时拒绝 sidecar。
  • 为 Claude、Codex、Pi 接入或调整运行时 extraDirs 行为。
  • composer 将 library 显示为不可移除的只读系统项,且不占用户十个目录名额。
  • 当前 library 注入入口尚未接入生产生命周期,旧版 Codex 的静默降级也会制造持久化与运行时状态分歧。

Confidence Score: 3/5

当前不宜合并,因为 library 注入流程尚未接线,且旧版 Codex 会把未生效的目录授权持久化为成功状态。

核心系统槽入口没有生产调用方,导致 PR 声明的原生 library Read 无法启用;同时 Codex 的静默版本降级破坏了运行时应用与数据库持久化必须一致的事务语义。

Files Needing Attention: apps/desktop/src/main/maker-ipc/register.ts, packages/maker-core/src/agents/codex/index.ts

Important Files Changed

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
Loading
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

Comment thread apps/desktop/src/main/maker-ipc/register.ts Outdated
Comment thread packages/maker-core/src/agents/codex/index.ts
@MagicLizi MagicLizi added awaiting-discussion 等待维护者讨论(review-pr) touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:large-diff 改动量较大(review-pr 自动维护,仅展示) touches:plugin-base 改动碰到插件基座(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) touches:rules 改动碰到规则 / 规范文档(review-pr 自动维护,仅展示) labels Sep 1, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

这条 PR 需要维护者确认后才能合并(产品可见的 library 系统槽 + 插件基座 + 规则文档)。

请维护者直接在本 PR 上 Approve;若要改,请 Request Changes。讨论 issue:#3749

作者侧:确认完成前不用反复请求 review。当前还有 CI 失败和未 resolve conversation,那些仍需处理。

@MagicLizi

Copy link
Copy Markdown
Contributor

@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。

@MagicLizi

Copy link
Copy Markdown
Contributor

命中 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 设计规范

@PraiseZhu

Copy link
Copy Markdown
Contributor Author

@MagicLizi UI 证据已在 description 的「UI 变化」:composer + 菜单系统槽文案与配额计数,可交互 demo 在 docs/design-previews/library-extradirs-quota/index.html(随 PR 入库,verify 门 A/B/C/D 绿)。未改间距/色值/token。

两条 Greptile conversation 已按后续 commit 回帖并 resolve:library extraDirs 已接到 cindy-brain 生命周期;Codex 旧 app-server 对非空 extraDirs 改为 throw。请下一轮 auto-review 继续。

@MagicLizi

Copy link
Copy Markdown
Contributor

@PraiseZhu 👋 这个 PR 目前与 main 有合并冲突,auto-review 因此暂时跳过、没法继续审查 / 合并。

请在本地 merge 最新的 origin/main 解决冲突后推送;冲突解除后,下一轮 auto-review 会自动重新处理这个 PR。

把 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>
@PraiseZhu
PraiseZhu force-pushed the feat/g2-library-agent-read branch from eaa34cd to 3d8c1eb Compare September 2, 2026 02:18
@PraiseZhu

Copy link
Copy Markdown
Contributor Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

To use Codex here, create a Codex account and connect to github.

@MagicLizi MagicLizi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

可以推进

@PraiseZhu

Copy link
Copy Markdown
Contributor Author

修复收口 dispatch:f820499381b01489

本轮重派核实 Greptile 两条 P1 均已按后续 commit 修复并推送(head 3d8c1eb8):

Greptile P1 × 2

  • Library 注入入口未接线:applyLibraryReadonlyExtraDir 已经 setGhostLibraryExtraDirSync(syncLibraryReadonlyExtraDir)(apps/desktop/src/main/maker-ipc/register.ts:10478)接入 cindy-brain 生命周期;focus / bind / relocate / revert-default / unbind / delete / uninstall / enable / disable 路径均调用 refreshMivoLibraryExtraDirGrant(),根变化即同步当前 Mivo 会话槽(commit 85fbc9720 起)。
  • Codex 授权状态失真:mid-session setExtraDirsnewDirs.length > 0 && !readonlyReferenceDirsSupported 时 fail-fast 抛错,不再 log.warn+return 静默降级;与 Greptile suggestion 一致(commit 62b8b5346)。

状态核对(2026-09-02)

  • 两条 review conversation 已 Resolve conversation(PRRT_kwDOTgdRUs6eF4dR / PRRT_kwDOTgdRUs6eF4dY)。
  • 与 main 的合并冲突已过时:当前 head merge-tree 预演干净,PR mergeable=true。
  • required contexts(verify / DCO / check:pr-design-basis / Desktop Git integration)在 head 3d8c1eb8 全绿。

@MagicLizi MagicLizi removed the awaiting-discussion 等待维护者讨论(review-pr) label Sep 2, 2026

@MagicLizi MagicLizi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

代码重审通过:当前 head 未发现 P0/P1。library 只读 extraDirs 已接到当前 Mivo 会话;Codex 旧 app-server 会显式失败且握手 authorizedReadonly=false,不会假装授权。讨论 issue #3749 里原先的生产调用链与状态分离问题已在后续提交落地。全部 conversation 已 resolve。

@MagicLizi
MagicLizi merged commit 11e02c0 into makecindy:main Sep 2, 2026
10 checks passed
@MagicLizi

Copy link
Copy Markdown
Contributor

Mivo 会话现在会静默带上只读作品库目录,composer 里那一项不占用户的 10 个名额,也没法误删。旧 Codex 版本会明确失败,不会假装已经授权。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:large-diff 改动量较大(review-pr 自动维护,仅展示) touches:plugin-base 改动碰到插件基座(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) touches:rules 改动碰到规则 / 规范文档(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants