AgoraIO-Extensions / AgoraIO-Extensions/agent-infra

feat(connection): guide users through connector availability and authorization states

Aperta
#434 2 commenti 0 reazioni 1 assegnatario Rivendicata da @guoxianzhe Vedi su GitHub
enhancement
Lingua principale
TypeScript
Stelle
0
Fork
0
Merge medio
8h 51m
PR unite (30g)
99

Descrizione

## Problem

Connection 的通用 MCP/API 当前会把多种不可用状态折叠为空结果。例如客户端请求尚未接入或尚未授权的 Confluence 时,`list_apps(query="confluence")`、`list_connections(service="confluence")` 和 `search_actions(service="confluence")` 都只返回空数组。用户无法判断 Provider 未受支持、账号未连接、Consumer 未获 Grant、Action 未授权,还是授权失效或 Provider 故障,也得不到可执行的下一步。

这不是 Confluence 特例。所有 Provider 都需要一致、可机器识别且可面向用户解释的状态与恢复引导,同时保持 Connection 服务端解析 Principal、Consumer、Grant、Connection 和 Credential,不能为改善易用性而暴露账号选择器或凭证。

## Scope

- 为所有 Provider 定义统一的可用性与授权状态模型,至少区分:
- Provider 未被部署或不受支持;
- Provider 已支持,但当前 Principal 尚未创建 Connection;
- Connection 存在,但当前 Consumer/ConsumerInstance 尚未获得 Grant;
- Grant 存在,但未授权请求的 Action;
- Connection、Credential 或 Grant 已失效、被撤销或需重新授权;
- Provider 暂时不可用或 Connection 无法完成状态核验。
- 调整 `list_apps`、`list_connections`、`search_actions`、`get_action_guide` 和 `execute_action` 的响应/错误契约,使空搜索结果与“连接器不可用”不再混淆。
- 返回稳定的机器可识别 reason code、简洁的用户说明和安全的 next-action descriptor;不得返回 Provider Credential、内部授权对象 ID 或允许调用方选择权威账号。
- Connection Web 为对应状态提供明确入口,包括连接 Provider、授权当前客户端、重新授权、查看状态和联系管理员;MCP/API 客户端能够基于同一契约给出等价文字引导。
- 引导链接只指向 Connection 自己的受控页面,并在服务端绑定当前 Principal 与 Consumer 上下文;不得接受调用方提交的任意 redirect 或账号 selector。
- 对未知 Provider 名称与已知但未授权 Provider 使用可区分且不泄露其他用户、组织或未公开 Provider 配置的响应。
- 记录状态转换、授权拒绝与恢复结果所需的审计事件,但不记录 Credential 或普通用户 Provider 内容。
- 以 GitHub、Jira、Confluence 三类场景覆盖通用契约;Confluence 仅作为真实验收案例,不引入 Confluence 专用分支逻辑。

## Acceptance criteria

- [ ] **AC-1:** 对任意 Provider,客户端可以仅根据稳定 reason code 区分 unsupported、not connected、Grant missing、Action denied、reauthorization required 和 temporarily unavailable;真正的零搜索结果保持独立语义。
- [ ] **AC-2:** 五个通用 MCP tool 和对应 HTTP API 使用同一状态模型;相同 Principal、Consumer、Provider 状态产生一致的 reason code 与 next action。
- [ ] **AC-3:** 每个可恢复状态均返回可执行且安全的下一步,包括 Connection Web 入口或明确的管理员处理说明;完成操作后客户端重试可观察到状态变化。
- [ ] **AC-4:** 响应和引导不暴露 Credential、Provider token、其他 Principal 的 Connection、内部 Grant/Connection selector 或未授权 Provider 的敏感目录信息。
- [ ] **AC-5:** 调用方不能通过 provider/service 字符串、redirect、account selector 或伪造身份字段越过服务端 Principal、Consumer、Grant 和 Action 解析。
- [ ] **AC-6:** 撤销、过期、Provider 401/403、状态核验超时与上游故障 fail closed,并能区分需要用户重新授权与仅可稍后重试的情形。
- [ ] **AC-7:** Connection Web 在桌面与移动端对全部状态显示清晰中文说明和唯一主要操作;无死链、循环跳转或操作后仍停留在陈旧状态。
- [ ] **AC-8:** 契约、单元、集成和端到端测试覆盖 GitHub 已连接、Jira 未授权、Confluence 未支持/未连接等场景,以及跨用户、跨 Consumer 和枚举探测负向路径。
- [ ] **AC-9:** OpenAPI 与 MCP action guide 对状态词汇、错误码、隐私边界和恢复流程保持一致;现有 PRD/HLD/工程 Spec 继续作为实现依据,不要求本票改写。
- [ ] **AC-10:** 真实验收重放 Confluence Page ID `1293845172` 的访问路径:当能力不可用时得到准确引导;完成所需接入与授权后,同一客户端无需修改账号或凭证参数即可继续读取。

## Validation

- `pnpm install --frozen-lockfile`
- `pnpm check`
- `pnpm check-types`
- `pnpm test`
- 临时 PostgreSQL 集成测试覆盖每个状态转换、撤销与跨主体负向路径。
- MCP/HTTP contract tests 验证五个通用 tool 的 reason code、next action 和隐私边界。
- Browser QA 验证 Connection Web 桌面/移动端引导与恢复闭环。
- 线上受监督只读验收:GitHub 已连接路径,以及 Jira/Confluence 的未配置、未授权和恢复后路径;不记录普通用户页面正文或 Provider Credential。
- `pnpm build`
- `pnpm smoke`
- `pnpm docker:build`
- Markdown lint/link checks、workflow policy、actionlint、gitleaks 与 `git diff --check`。

## Blocked by

None

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Valutazione

Questa issue non è ancora stata valutata.

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.