fix(desktop): extraDirs 按 library opener 挂槽,握手跟实写走 - #3906
Conversation
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>
|
| 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 授权失效
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
|
本 PR 改到了插件 library 槽与握手路径,触发了维护者确认门(插件基座)。 插件基座改动会影响全部已装插件,需要维护者在 PR 上 Approve 后才会放行;需要修改就 Request Changes。讨论 issue:#3911 作者这边不用再反复请求 review,球在维护者手里。 |
|
@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>
|
合了。extraDirs 现在跟真正打开 library 的插件走,握手也不再假装已经挂上——这正好堵住「看起来能写、实际没授权」那种坑。 |
这次改了什么
摘要
#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缺陷修复范围
mivo-canvas)saveGhostMedia、无限容量UI 变化
怎么验证的
自动验证
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 安装包上复测(需合入后的构建)。
风险
风险分类
影响与回滚
提交前检查
git commit -s,见 DCO)