Skip to content

fix(desktop): extraDirs 按 library opener 挂槽,握手跟实写走 - #3906

Merged
MagicLizi merged 2 commits into
makecindy:mainfrom
PraiseZhu:fix/library-extradirs-capability
Sep 4, 2026
Merged

fix(desktop): extraDirs 按 library opener 挂槽,握手跟实写走#3906
MagicLizi merged 2 commits into
makecindy:mainfrom
PraiseZhu:fix/library-extradirs-capability

Conversation

@PraiseZhu

Copy link
Copy Markdown
Contributor

这次改了什么

摘要

#3745 已经把 Mivo 作品库根写入当前会话的只读 extraDirs,但查找写死 xd-mivo / cindy-mivo。本机真正有 library 的是 mivo-canvas;内置 xd-mivo 开着却没有 library,刷新会先命中它再 sync(null) 把槽清掉。槽侧白名单把 mivo-canvas 的同步吞成 no-op,握手仍报 authorizedReadonly=true,Agent 发 library: 键却读不到根。

本 PR 认发起 open 的那个 library 插件,焦点刷新只复用该 opener。握手只在 extraDirs 实写成功后为 true,并只记当前 {ghostId, root}。同步被更新一轮取代时返回 superseded,不再把已授权握手打成 false。

变更类型

  • fix 缺陷修复

范围

  • 关联 Issue / 需求:跟进 feat(desktop): 会话级只读 library extraDirs,ChatInput 不计系统槽 #3745 运行时未生效(本机 ghost id mivo-canvas
  • 本 PR 包含:extraDirs 查找、握手诚实、单槽授权记账
  • 明确不包含:Mivo 插件文案、saveGhostMedia、无限容量
  • 用户可见变化:Ask/Auto 会话应出现不可移除的「Mivo 作品库(只读)」系统槽,并能 Read library 正本
  • 是否存在 breaking change:无

UI 变化

怎么验证的

自动验证

pnpm --dir apps/desktop exec vitest run src/main/cindy-brain/__tests__/librarySlot.test.ts src/main/cindy-brain/__tests__/libraryExtraDirGrantContract.test.ts src/main/__tests__/sessionRuntimeControlWiring.test.ts
结果:3 files / 76 tests PASS(lead 在干净 worktree HEAD 5bfd7e2f6 跑)

GPT 单审 unresolved=0(HEAD=5bfd7e2f63d7f1cd477177493fdf591c172c65d0)。

手工验证

不涉及安装包回归。合入并装到本机 Cindy 后,应用层验收仍是:当前 Ask/Auto 会话 extraDirs 出现 cindy-library:<libraries/mivo-canvas>,握手 authorizedReadonly=true 与槽同时成立。

未执行的验证

未跑完整 desktop typecheck / 全量 unit。本改动只触及 cindy-brain library extraDirs 与对应静态接线测试。未在 0.1.73 安装包上复测(需合入后的构建)。

风险

风险分类

  • 权限 / 安全 / 用户数据

影响与回滚

  • 影响范围:当前焦点会话的只读 extraDirs 系统槽;library open/status 握手布尔
  • 回滚 / 降级方式:revert 本 PR。未改磁盘库根、未改插件包格式。存量插件无需重装;需新宿主构建才会改挂槽行为。

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名(git commit -s,见 DCO
  • UI 改动已在「UI 变化」注明引用的设计规范章节(不涉及 UI 则跳过)
  • 未提交凭证、令牌或授权文件
  • 已补充必要文档
  • 已确认测试结果或说明未执行原因

makecindy#3745 把作品库根写入会话只读 extraDirs,但查找写死 xd-mivo/cindy-mivo。
本机真正有库的是 mivo-canvas;内置 xd-mivo 开着却没有 library,刷新会
先命中它再 sync(null) 把槽清掉。槽侧白名单把 mivo-canvas 的同步吞成
no-op,握手仍报 authorizedReadonly=true。

改成认发起 open 的那个 library 插件,焦点刷新只复用该 opener,不抓
清单第一个。资格不符返回 not-granted;握手只在 extraDirs 实写成功后
为 true,并只记当前 {ghostId, root}。B 挂上后 A 的旧授权失效;任一
ghost 撤槽成功也清掉当前授权。同步被更新一轮取代时返回 superseded,
同一 opener 保留授权,其它 opener 不得把别人的根当成自己已授权。

Signed-off-by: PraiseZhu <zhuzan@xd.com>
@PraiseZhu
PraiseZhu requested a review from a team as a code owner September 4, 2026 08:11
@greptile-apps

greptile-apps Bot commented Sep 4, 2026

Copy link
Copy Markdown

Greptile Summary

此 PR 将 library extraDirs 同步从硬编码的 Mivo 插件 ID 改为按请求插件处理,引入三态同步结果,并以 {ghostId, root} 记录实际授权。

  • register.ts 将被后继同步取代的任务返回 superseded,并明确报告是否实际挂槽。
  • librarySlot.ts 仅在同步确认成功后返回 authorizedReadonly=true
  • 当前实现尚未把挂槽和撤槽限制到真正执行 open 的 owner,因此其他 library 插件的 status 或 teardown 可以抢占或清除唯一槽。

Confidence Score: 4/5

此 PR 暂不宜合并,因为非 opener 的 library 插件可通过 status 或 teardown 抢占或清除当前会话的唯一只读槽。

动态放开 library-capable 插件后,同步函数没有区分真正的 open owner 与普通 status/清理请求;这会使另一个插件覆盖当前库根并让原插件的授权握手失效。

Files Needing Attention: apps/desktop/src/main/cindy-brain/index.ts, apps/desktop/src/main/cindy-brain/librarySlot.ts

Important Files Changed

Filename Overview
apps/desktop/src/main/cindy-brain/index.ts 新增 library-capable 动态选择和 owner 记账,但同步入口没有验证请求方是否为实际 opener/current owner。
apps/desktop/src/main/cindy-brain/librarySlot.ts 握手改为按 {ghostId, root} 跟踪实写授权;任意操作创建会话时及 status 中都会触发挂槽同步。
apps/desktop/src/main/maker-ipc/register.ts 同步队列改为返回 granted、not-granted 或 superseded,并继续串行替换焦点会话的唯一 library 槽。
apps/desktop/src/main/cindy-brain/tests/librarySlot.test.ts 增加三态同步和多插件授权记账测试,但未覆盖第二个插件仅通过 status 抢占 opener 槽的路径。
apps/desktop/src/main/cindy-brain/tests/libraryExtraDirGrantContract.test.ts 新增源码级接线断言以防恢复硬编码插件 ID,但未验证运行时 opener 所有权。

Sequence Diagram

sequenceDiagram
  participant A as 当前 opener A
  participant B as 另一 library 插件 B
  participant Slot as GhostLibrarySlot
  participant Sync as extraDirs 同步
  A->>Slot: open
  Slot->>Sync: 同步 A 根
  Sync-->>Slot: granted
  Note over Slot: owner=A
  B->>Slot: status
  Slot->>Slot: 自动创建并打开 B 会话
  Slot->>Sync: 同步 B 根
  Sync-->>Slot: granted
  Note over Slot: owner 被覆盖为 B,A 授权失效
Loading
Prompt To Fix All With AI
### Issue 1
apps/desktop/src/main/cindy-brain/index.ts:3229
**非 opener 可抢占槽**

另一个已启用且声明了 library 能力的插件即使没有先执行 `open`,仅发送 `status` 也会创建会话并同步自己的根。同步成功后,这里会无条件将 `libraryExtraDirOwnerGhostId` 改成该插件,使原 opener 的只读槽和授权握手失效。类似地,非 owner 的 teardown 传入 `root=null` 时也会清除全局唯一槽。应只允许实际 opener/current owner 取得或撤销该槽。

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Reviews (1): Last reviewed commit: "fix(desktop): extraDirs 按 library opener..." | Re-trigger Greptile

Comment thread apps/desktop/src/main/cindy-brain/index.ts Outdated
@MagicLizi MagicLizi added touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:plugin-base 改动碰到插件基座(review-pr 自动维护,仅展示) labels Sep 4, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

本 PR 改到了插件 library 槽与握手路径,触发了维护者确认门(插件基座)

插件基座改动会影响全部已装插件,需要维护者在 PR 上 Approve 后才会放行;需要修改就 Request Changes。讨论 issue:#3911

作者这边不用再反复请求 review,球在维护者手里。

@MagicLizi

Copy link
Copy Markdown
Contributor

@PraiseZhu 👋 这个 PR 还有 1 条 review conversation 没 resolve(apps/desktop/src/main/cindy-brain/index.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。

如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。

status 和首次任意 library 请求不再把唯一只读槽挂到别的插件。
撤槽只允许当前 owner。Greptile P1:非 opener 可抢占槽。

Signed-off-by: PraiseZhu <zhuzan@xd.com>

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

可以继续

@MagicLizi MagicLizi removed the awaiting-discussion 等待维护者讨论(review-pr) label Sep 4, 2026
@MagicLizi
MagicLizi merged commit f817dab into makecindy:main Sep 4, 2026
10 checks passed
@MagicLizi

Copy link
Copy Markdown
Contributor

合了。extraDirs 现在跟真正打开 library 的插件走,握手也不再假装已经挂上——这正好堵住「看起来能写、实际没授权」那种坑。

@PraiseZhu
PraiseZhu deleted the fix/library-extradirs-capability branch September 4, 2026 18:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:plugin-base 改动碰到插件基座(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants