makecindy / makecindy/cindy

[Bug] 个人账号下插件页与会话输入框的企业插件可见范围不一致

Open
#164 2 comments 0 reactions 1 assignee Claimed by @DavidShenXD View on GitHub
bug inprogress
Dominant language
TypeScript
Stars
2.7k
Forks
395
Avg merge
21h 48m
Merged PRs (30d)
776

Description

## 问题描述

个人账号登录 Cindy Desktop 后,插件管理页只显示 6 个内置插件,但会话输入框的「+」菜单仍会显示插件页中不可见的 XD Atlassian、XD Feishu 等企业插件。

这会导致同一批已安装插件在不同入口呈现出不一致的可见、可管理和可使用状态。

手机号登录是当前发现问题的入口,但源码中的实际触发条件是登录身份满足:

```ts
membershipKind === 'personal'
```

邮箱等其他登录方式只要进入 personal membership,也会出现相同行为。

## 复现步骤

1. 使用最终得到 `membershipKind: 'personal'` 的账号登录 Cindy Desktop;
2. 打开「插件」页面;
3. 确认页面只显示 Cindy Art、Cindy GitHub、Cindy GitLab、Cindy Mermaid、Cindy Web Search、Filo Google 这 6 个内置插件;
4. 返回任意会话,点击输入框左下角的「+」;
5. 查看「已安装的插件」列表。

## 实际结果

插件页面隐藏了 `enterprise` 来源的插件,但会话输入框仍显示其中的插件,例如:

- XD Atlassian
- XD Feishu
- XD Mivo
- XD Pages

## 预期结果

插件管理页、会话输入框插件菜单和 `$` 插件命令入口应使用一致的插件可见性与可用性策略。

无论最终产品策略选择哪一种,都不应出现“插件可以在输入框中选择,但在插件页中完全不可见”的状态:

1. 如果个人账号允许使用 `audience: "all"` 的 enterprise 插件,插件页应展示这些已安装插件,并允许查看、配置、启停和卸载;
2. 如果个人账号不允许发现或使用 enterprise 插件,会话输入框和命令入口也应同步隐藏或禁止调用。

插件详情深链可以继续保留存量插件管理能力,但不应替代正常的插件列表入口。

## 源码分析

### Enterprise 插件仍会安装给个人账号

`apps/desktop/resources/builtin-ghosts/provisioning.json` 中,XD Pages、XD Mivo、XD Atlassian、XD Feishu 均同时配置了:

```json
{
"audience": "all",
"tier": "enterprise"
}
```

`apps/desktop/src/main/cindy-brain/builtinGhostProvisioner.ts` 明确规定:

- `audience` 决定是否播种;
- `tier` 只影响来源分组与标签,不改变播种行为。

因此 personal membership 下,这些插件仍存在于 `useInstalledGhosts()` 返回的已安装清单中。

### 插件页进行了 membership 过滤

`GhostPluginPage.tsx` 使用:

```ts
const showEnterprise = showsEnterpriseGhostGroup(user?.membershipKind);
```

而 `showsEnterpriseGhostGroup` 只在 `membershipKind === 'org'` 时返回 `true`。插件页的快捷区和完整列表随后都经过 `visibleGhostPluginItems`,personal membership 下所有 `origin === 'enterprise'` 条目都会被过滤。

### 会话输入框没有复用该过滤

`ChatInput.tsx` 的 `pluginsForMenu` 直接来自 `useInstalledGhosts()`,只处理了旧版 Mivo 重名兼容,没有使用 `membershipKind`、`enterpriseIds` 或 `visibleGhostPluginItems`。

`ExtraDirsButton.tsx` 会遍历并渲染全部传入插件,因此 enterprise 插件仍出现在会话输入框中。

该不一致由提交 `38938071` 引入:提交只给插件管理页增加了个人账号门控,没有同步 composer 等其他插件入口。

## 建议处理方向

抽取一份统一的插件 discoverability/use policy,由以下入口共同消费:

- 插件页已安装快捷区;
- 插件页完整列表;
- 会话输入框「+」插件菜单;
- `$` 插件命令清单;
- 发送前插件命令解析。

不要分别在各 UI 入口重复实现 membership/origin 判断。最终允许策略需要产品确认,但策略确定后,各入口必须保持一致。

## 验收标准

- [ ] personal membership 下,插件页与会话输入框展示的可发现插件集合一致;
- [ ] `$` 插件命令入口与会话输入框使用相同的可见性/可用性策略;
- [ ] 如果 personal 用户允许使用 `audience: "all"` 的 enterprise 插件,插件页可以正常查看和管理这些插件;
- [ ] 如果 personal 用户不允许使用 enterprise 插件,composer 和发送路径不能继续暴露或调用这些插件;
- [ ] org membership 下现有企业插件展示和使用行为不回退;
- [ ] 登录态缺失或初始化期间采用一致的 fail-closed 行为;
- [ ] 保留已安装企业插件详情深链的管理兜底;
- [ ] 增加 personal/org 两种身份下插件页与 composer 一致性的回归测试。

## 影响范围

当前确认影响 Cindy Desktop renderer。

未发现手机号认证接口、插件播种逻辑或插件安装数据本身存在异常;问题集中在不同 renderer 入口采用了不同的可见性策略。

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.