Files
ycode/docs/assessment-connectors-2026-10-16.md

145 lines
24 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# WorkBuddy 连接器复刻评估(2026-10-16)
当前可直接推进原 DOM/CSS 的商店、详情、搜索、自定义 MCP 列表和配置界面;真正可用的连接器还需要连接状态服务、凭据与授权流程、MCP host,以及会话工具选择/执行链路。YCode 现有工具展示组件不等于已实现 MCP 连接。官方目录、企业下发、WorkBuddy OAuth 中转与账号绑定包含 WorkBuddy 服务依赖;YCode 可实现自己的目录、授权和 MCP host,但不能把相同界面或受控测试成功称为原版云端等价。
本轮仅静态评估与拆解。没有改生产代码,没有安装 MCP、添加/启用连接器或授权任何账号。没有通过直接原版文件、CDP、WebSocket、evaluate 或旧文档取证。
## 证据、范围、校验
版本 **WorkBuddy 5.8.2**;固定安装包 root pin **035254bc76310ea46317433e4840602094543ef323d2d5c5aff7c131729de918**。后续需要增补主进程/daemon 时,仍应通过 public REA 选中路径 export 并固定此 root;本轮未增补读取安装包。
- **S1**:`.tmp/rea-runtime-scripts.json`,REA `ev_717fa5e846e64d67ac19c8925d121bff632c0d3aefb3603b10858559cabb2dcb`;339/339 脚本文本按 UTF-8 SHA-256 验证通过。
- **S2**:Root 新采 `.tmp/rea-expert-runtime-scripts-20261016.json`,`ev_e91787b1d4dea651582c6cf12827775b9068b0ee8b80c68ba08d4c1d87d94e90`;329/329 通过,共有同名脚本没有 hash 变化。本轮实现结论以 S1 为主。
- **C1**:`.tmp/rea-css-recovered/manifest.json`,`ev_377c8790468b3c67dad8577aabb327f98d3140659f0fffdbabfcff5a40cc9e94`;下列 3 份连接器 CSS 实际文件 hash 已复验。
- **V1**:Root 原版连接器页 action 后 PNG `.tmp/rea-market-connectors-20261016/frame-000.png`,`ev_d0183b5ee9e28b74126f773e134d9e4b1e856fcc67083212c6e258813c9ea890`。该操作记录顶层 layout 属于 action 前,不能作为连接器页布局证据。
- **V2**:Root 随后静态捕获 `.tmp/rea-market-connectors-static-20261016/layout.json`、`workbuddy.png`,`ev_e91bdc6e46275f4460985cfff25fd7f7bc334afc45f49fac1935de1249f4cb22`,PNG SHA-256 `2a537f83fcad50cf355668cc007c70f48446c7d92dc9a3a6ec388b84c4b12854`。这里已存在连接器页 DOM。V1 可见“专家/技能/连接器”、搜索框、“自定义连接器”、三列卡片/加号;不能由此证明连接健康或成功授权。
- **V3(partial)**:Root `.tmp/rea-connector-detail-20261016/frame-000.png`、`frame-001.png`,`ev_b898a87832d1e800810d391145a6ec6c6999e98b5cea6c7f382a3fc19aa7b3ac`。frame 000 为 QQ 邮箱主体点击后的详情,frame 001 为 Escape 后仍打开的详情。Root 报告操作 steps 成功,但 neutral-pointer cleanup 被取消,因此 overall failed,不能把整条 probe 说成 PASS;顶层 layout 属于 action 前。两帧本地 SHA 分别 `0b4c3fd29fdedded1fafd7e53e4b1216a3ac3d9117ff6acb6a41269b99e4f6bc`、`38d15afce56622e03e50b93cbb52aaeb8174028faed83483e5729e6bef25786d`。
- **V4**:Root `.tmp/rea-custom-connectors-static-20261016/layout.json`、稳定 `workbuddy.png`,`ev_b89281177f6a1cf2e4697887d576b8ddf7d811a8fa2d1148b7024a4ec898906f`,PNG SHA-256 `8d76ef16a32d9415bb8116715b386df5fbd0c11f498837e74df083004bcfcd5d`。可见“MCP 服务管理”“我的 MCP(4)”“3 启用”、搜索/Hub/添加、80 工具警告、4 个现存 server 与工具数/健康点/开关。这里只观察现存状态,Root 没有 toggle/connect/save/auth。最初半透明过渡帧不作为稳定像素基线。
新增 `scripts/audit-connectors.cjs` 只读上述工作区 REA 归档,不读取原版路径、不执行源 JS。默认生成 `.tmp/connector-assessment-20261016/integrity-and-anchors.json`;`--find <精确文件名> <文本...>` 和 `--excerpt <精确文件名> <start> <length>` 可复查。下文 offset 都是 **0 起始 JavaScript UTF-16 字符偏移,不是字节偏移**。
| S1 归档脚本 | SHA-256 | 核心锚点 |
|---|---|---|
| `skills-panel-CvMlV3m8.js` | `b30c43c11ec476db639d6be58065d927411845487d34b0ea8e839d1c6eb7a238` | `ConnectorPanel` 62950;`McpPanel` 27216;`McpConfigEditor` 20816;`ConnectorDetailSetting` 11484 |
| `store-BKmTj0KI.js` | `ea51bfd988c299d00574dccdb28f73c199502d79074da9ae560031a3307a2f89` | `createConnectorCatalogGateway` 8673;状态投影 19577;`executeConnectorAction` 51049;cancel 57566 |
| `use-connector-actions-DhLHDumM.js` | `04d7f42118e0d6190fde9fda001baef7ccfa78bc1035be31a35bd2c029b1c3a8` | `useConnectorActions`;handleConnect/Repair/Disconnect/Cancel;5 分钟 pending-auth 追踪 |
| `open-deeplink-connector-store-GkwgNaZv.js` | `56095700d10ad8427243a03fb3257ce9df11b308e19b7287af5d39eefff2f9d3` | `setOpenDeeplinkPendingConnectors`、remove/clear;去重 ID 集合,非商店实现本体 |
| `connector-token-config-gate-DtzOLq6x.js` | `da8bd45173a3d000dfa025481f29f196ff51bf1002ea9189d6d69e08c5d2825c` | `runTokenConnectorSaveFlow` 513;Gate 1154 |
| `connector-token-config-modal-DXJvYxRD.js` | `16560cc681eb38e34be8687350d3782903a28ca6df9f9c4029939968e65887bf` | 必填 327;payload 574;初值 747;Modal 1342 |
| `connector-device-code-modal-ClMm_s3k.js` | `ced26ec4253dc675267f136451322376cc81bf0d3f14cd86f73fffac49b720d7` | `formatRemaining` 1022;Modal 1173;Host 4434 |
| `connector-runtime-toast-DmevVoHX.js` | `97431e4b57a37c3be9973e83903c99f860a43f3a8a226fbb5e2f6d64955384fa` | `ProgressToastBody` 618;Subscriber 1237 |
| `oauth-contract-D3wxpVaW.js` | `39621f3478f1c56dcb2d0080581500d2036c2306baa10665ddca3481c3160b4f` | `readAuthScope`、`notifyIfAuthExpired`;account/runtime 过期分流,不等于 connector OAuth 后端 |
| `connector-icon-C4VuqOCA.js` | `c14c59b43943fe4af821cb6155171dca1a3502743fa70deb65dbb16ad334d2cc` | 详情批量补齐、stateful 目录合并、图标失败 fallback |
| `mcp-server-loader-DFUSVF9N.js` | `b37999cd9a1e38450f8ff30ce4ceb0f08ff3aca249135e77b426cf95c6a58db6` | `getMcpServersDedupedWithMeta`、`mergeMcpDescription`、状态/来源投影 |
| `contexts-BMeWSUHk.js` | `5f35b7489b107e21ef452c8ee88a95265756f6fc444841eef869228bbc44768b` | `useConnectorFacade` 1762814;keyword filter 3526103;专家依赖 3934216;会话选择/注入 6072687/6076938 |
| `workbuddy-provider-DkH2YFYM.js` | `b588e875c469978f216beec86bdf4b6c33a31c0266f9bf996881b8dbf37b5dc7` | `pollAuthStatus` 14550;`DesktopConnectorManager` 15291;desktop localOps 约 35200 |
| `adapters-SPAem2E3.js` | `b1f740a608087d6ede5a94f3b485c189e3b57698a79aff4b07da9c66acfae1ba` | client.sessions MCP 113602;getConnectorConfigs 117713;updateConnectorEnv 120264 |
| `common-DRZ6FwkK.js` | `924f348494323c3b09cfbde84f7729a178cd95a72e4f9ca654859c75fec9e2f5` | BackendProvider `/console/as/connector/user/`、task 约 430350–432500 |
| `runtime-B7PLES2V.js` | `b944fdfed0d52ca4c588833f94f50f878169a9244c05ed186abfa4eb37957911` | `connector:init/getConfigs/getStates/connect/repairConnect/...` IPC 常量约 7260 |
| `wb-CocRQn4C.js` | `d9ddb5d5464f2d863659a01493b58220bb5a0e270c22b16f405cfaeab2a7a972` | reason→动作 28900;bridge authorizer 89000;connectors/mcp/cloud guest proxy 101851 |
| `wb-input-add-B045GnIg.js` | `7842fa4321d5351bf6c822bbd0253e0d6d6e68cc9cfae3f2470b3d493c23daf4` | `sortConnectorsLikeCapsule` 22935;ConnectorsSubmenu 约 24200 |
| `desktop-sdk-setup-C2AUiJmx.js` | `ac3bdeb6d81776491e175ddfae262e64f77d3dc9c0821d6075a91bf1b889dc23` | `prepareInput` connectorIds→UI/configManager 约 376400 |
| C1 CSS | SHA-256 | 已归档内容 |
|---|---|---|
| `skills-panel-CsnIUki4.css` | `c1d5c5de51554a886fde0399c5202cd45063fa091b213b842014bea91dbb69a0` | 59,787 bytes / 470 rules,包含连接器与 MCP 面板规则 |
| `connector-token-config-modal-B4MFl7DI.css` | `08a4b349ae9020ad87fe798e2b5ea44f77f38ea46f5b4e7b4daa97fd21a297f7` | 4,610 bytes / 32 rules |
| `connector-device-code-modal-DLS20fDt.css` | `b6ed4f94669f02815fb2969bfd2e8b6cbf40097c8840343e0a080480415d6bd8` | 4,818 bytes / 30 rules |
## 已知实现与原版边界
### 商店、已添加、搜索与详情
`ConnectorPanel` 是实际连接器页。local 模式保留目录顺序,逐项映射 installed/available 卡片;非 local 会先显示 installed 再 available。installed 判定是 **bound 或 connected 或 pending 或 enabled 任一为真**,不是只有 connected。状态有 disconnected/connecting/connected/unauthorized/error,reason 类型驱动重授权、配置、重连、升级或联系管理员。
目录 gateway 支持 local `listMarket({start,limit,includeStateful})`,每页 50;market 模式才使用服务端 search/getDetails,legacy 模式在已加载名称/描述上过滤。列表与搜索分别有 loading/loadingMore/hasMore/cursor;搜索 trim、200ms 防抖、IME composition;epoch/关键词检查防止旧响应覆盖新结果。`useInfiniteScroll` 用 200px 接近阈值。初次列表 skeleton 数 9,面板加载超时 20s。详情补 examples 与 stateful 目录缺项,按 ID 去重。
本版本 `ConnectorPanel` 源码有 conditional **official/enterprise** tab:仅存在企业专有连接器时显示;没有证据表明这里必有“办公/开发/设计”或更多固定分类,不能把专家页分类移植成连接器分类。V1 当前画面没有该企业 tab,目录内容随服务和账号变化,不能写死为完整永恒清单。
卡片主体点击仅展示详情(必要时只读补 examples),卡片 `.connector-card-action` 的加号独立 stopPropagation 后连接。详情有名称、描述、图标、版本不兼容提示、最多 10 个 examples、连接/重授权/配置/试用/重置、已安装且存在 tools 时的可展开工具名与描述。背景点击/关闭按钮关闭详情。试用先确保连接,再 `conversations.prepareInput({target:{type:'new'},contentBlocks,connectorIds})`,不是静态提示文案。
V3 已只读观察 QQ 邮箱详情的未连接态、examples 与滚动截断;Escape 在该观察中未关闭,关闭按钮随后由 Root 使用。不得把其他 modal 的 Escape 规则擅加到该详情。没有点击“连接”或 examples,因此没有真实授权行为。
`open-deeplink-connector-store` 文件名容易误导:其中主体是首页草稿与 pending connector IDs 去重集合。商店列表和详情主体位于 `skills-panel`,不能仅复制 deeplink store 当成商店实现。
### 添加、Token 配置、OAuth 与 device code
存在至少两条 Token UI 路径,不能强行合成一个返回 success 的表单:
1. schema 多字段 modal/gate:`tokenConfig.fields`,字段 key/label/type/required/defaultValue/placeholder/description,title/description/docUrl/docLabel。password 必填允许已有 `hasSecretFields` 且本次留空;password 空白不进入 env payload,其他字段即使为空也提交。初值优先 initialValues,非 password 才采用 defaultValue。修改清对应错误/submit error;第一字段 autofocus、最后字段 Enter 提交;保存时 input/close/cancel disabled,Escape 仅非 busy 可取消。overlay 没有 click-away cancel handler。
2. 新 `action-required/form` 分支:store 取 fields 的第一字段 key(缺省 token),显示 connectorTokenPrompt,submit `{kind:'form',values:{[key]:token}}`。Token invalid 可以保留表单重试,CLI_ 错误有终止分支。须在后续 UI 采集中区分它与多字段 modal。
Gate 的保存顺序是 **updateEnv 成功 → connect**。保存配置失败与连接失败分 stage;connecting 可返回 pending 而不是 connected。connect-failed/secretInvalidated 可再次打开配置并丢弃“已有 secret”标记;取消会调用真实 cancelMcpConnector。渲染端支持 hasSecretFields 不等于已经证明主进程凭据加密或“原版永不返明文”:buildInitialFormValues 对传入 string initialValues 也会设置 password,真实 adapter 返回值边界仍需后端证据。
`DesktopConnectorManager` 分 local、server-side、gateway 和 projectConnectorAuth。server-side 可从 service.authAccessToken 取 token 写 Authorization header;userInitiated 会走 authRevoke 后重新 OAuth。gateway 的 authStart 可能返回 connected、show_form 或 redirect;redirect 打开外部浏览器并轮询 authStatus(1.5s,默认期限 5 分钟/服务提供 expireAt,AbortSignal 支持取消)。这证明接口和前端分支,未证明任何账号实际授权成功、token refresh/PKCE/state 校验实现。普通本地连接转 localOps;WorkBuddy service facade 与本地操作同时存在。
device code 从 `connector:device-code` 事件取得 verificationUri/userCode/expiresIn/codeEmbeddedInUri。Modal 每秒更新时间、剩余不足 60s 高亮、到期调用 onExpired 或 onCancel;复制 code/link 成功提示 2s,Clipboard API 有 textarea fallback;可只有 URL 没有 code。Host cancel 会关闭 modal 并 cancelMcpConnector。Modal 声明 `onOpenInBrowser` 但本体此归档没有调用该 callback;打开浏览器可来自 action flow 或链接,不能推断“显示 modal 必自动打开”。QR code 有独立 `connector:auth-qr-url` 分支,也应保留待验。
### 自定义 MCP、健康、工具、删除与 trust
“自定义连接器”入口仅 local 且企业 customConnectorPolicy 允许时展示。入口刷新 policy、打开 McpModal 并只读计数;不是直接安装/启用。McpPanel 使用 `wb.mcp.list/describe/setEnabled/connect/beginAuthorization/remove/setToolEnabled/approve`。UI 的 connected/connecting/idle/disabled/disconnected 是 host 状态投影;工具列表、prompts/resources/resourceTemplates、来源 plugin/marketplace、editable、trusted/configHash 均影响操作。缓存 500ms、并发 list 去重;connecting 轮询 5s、最长 60s,隐藏窗口暂停。官方 connector store 的 pending poll 为 3s/最长 60s,状态 event 与异步 snapshot 的写入代次/intent guard 防回滚;两个 poll 不应混为一个。
自定义配置不是简单“名称+URL”表单:`McpConfigEditor` 为 JSON Monaco 编辑器,显示真实配置路径、dirty 标记,Ctrl/Cmd-V 支持 host clipboard,返回时确认未保存改动。空文本规范化 `{mcpServers:{}}`,JSON syntax 和顶层结构校验;兼容把误套的 mcpServers 扁平化。此处 validator **只证实结构**,不能据此宣称所有 command/args/env/HTTP/stdio/SSE transport 均已校验或支持。保存全配置走 `wb.mcp.saveConfiguration`,具体后端原子性/启动方式尚未知。
未信任 server 的 toggle 强制关且 disabled;有 approve 按钮,调用 **approve({id,configHash}) → setEnabled → connect**。服务/工具操作 busy 去重,工具 disabled/外层 server off 不可点;>80 个 enabled tools 有警告。OAuth unauthorized 的 reconnect 可调用 beginAuthorization 后外部浏览器,避免重复 authorizing。网络错误有 reconnect/troubleshooting/copyLog。
三种操作必须区分:
- **disconnect/disable**:停用当前连接,可保留 bound/已授权关系;会话选择 off 也有 selection-only 分支。
- **unbind/reset 官方连接器**:详情实际调用 `wb.connectors.unbind`;manager 可先 service.authRevoke 或腾讯文档 revoke,再 local unbind。企业 oneidGate/admin 权限可阻止,builtinPluginId 可隐藏重置按钮。不能把它实现成简单本地删一行。
- **remove 自定义 MCP**:editable 条件下进入确认框后 `mcp.remove(id)`;非 editable/plugin 来源项不应随意显示相同删除入口。源当前详情 unbind handler 本身没有二次确认框;legacy connector revoke、MCP remove 则有确认。
runtime toast 单独处理 `connector-prepare` 与 `connector-install`、progress/complete/error,按 operationId 去重,进度可无百分比,complete 延迟 300ms 关闭、error 5s。这说明存在二进制/package 准备/安装流程,不能用 loading UI 冒充安装已实现。实际包分发、校验、可执行进程与 transport 不在本轮 renderer 证据内。
### 会话工具注入、权限和凭据
`useConversationConnectorSelection` 把 enabled 选择写 `conversation.config.setConnectors`,保存 name/displayName/description/connectStatus/activeStatus。后台 automation 的 selectionOnlyToggle/scope 来自已持久 config;scope cache 以会话 ID 分离,删除清理。lookup missing 与 unresolved 有区别,只有确定 missing 才 reconcile 删除;外部 auth 完成可自动选择。普通 local 与 cloud-input 操作取不同 facade/runtime key;必须保留不同会话/传输边界。
`prepareInput` 将 connectorIds 同步给输入 UI/configManager;send diagnostics 获取真实 states,不可把菜单“已选中”当作 supplier tools 已注入。专家依赖另有 connector connect/repair 与 custom MCP import/connect/authorize 路径;importServer 冲突可在该依赖分支重试 overwrite。实际工具如何注册内核、名称空间冲突/权限、进程调用与结果回写仍需 host/daemon证据及端到端验收。
SDK connectors/mcp/cloud 是 guest proxy;bridge 具有 trusted subject/authorizer 分支。MCP UI approve/configHash 是信任边界的可见证据,但不是已证实所有 host 调用都被正确授权。企业 policy、authScope(account/runtime)、登录过期、connector reason 和每工具 enabled 状态需要分别处理。原版 secret at rest、日志脱敏、OAuth callback/state/refresh/revoke、取消后迟到回调无副作用都没有真实认证验证;不能由 renderer 猜成已完成。
## YCode 当前真实基线与依赖
本轮只读当前 YCode:`SettingsDialog` 的 supportedTabs 为 models/appearance;Sidebar 非新建任务导航仍提示尚未实现;`src/main`、`src/shared`、`src/preload` 的 connector/MCP 检索没有连接器 host/API 实现;`agent/tools/index.ts` 的 ALL_TOOLS 是 8 个本地文件/命令/问答/计划工具。现有 `workbuddy/conversation/ToolCallRenderer.tsx` 可展示 MCP 名称/参数/结果,recovered summary/词典包含 MCP 文本,均不构成运行 MCP 的证据。模型凭据存储已有实现也不能自动推出连接器凭据已接入。
| 范围 | 可由 YCode 自有实现 | WorkBuddy/第三方依赖或未知 |
|---|---|---|
| 原 DOM/CSS/搜索/详情/空态/busy | 可按固定源码及 REA 画面恢复 | 更多尺寸、hover、暗色、动态异常的原版基线待采 |
| 自有目录与已添加持久化 | 可定义自有 catalog/provider 适配与 registry,保留状态契约 | 官方 listMarket/search/details 排序、更新、资产和企业目录依赖原版服务;静态快照不能称实时商店 |
| Token/环境配置 | 自有 secret store、schema/blank-preserve/update-then-connect 流程 | 每个连接器的真实 token scope/可用性需第三方配置与验证 |
| OAuth/device/QR | 自有授权状态机、外部浏览器/回调、取消/过期界面 | 不能复用 WorkBuddy 私有 account token/client registration;自有第三方 OAuth app/redirect 配置是实际依赖 |
| 自定义 MCP host | 可实现 list/describe/tools/resources/prompts、trust、连接/取消/删除 | transport/包安装/原版 daemon 细节尚未证实;需要受控 server 与真实内核端到端 |
| 会话选择/注入 | 可接现有 session/OMP host tools,主上下文决定接口 | 当前 OMP 通路通过不等于动态 MCP 注入/审批/取消等价 |
| 企业管理、server-side OAuth、项目授权、WB内置业务 | 自有服务可另行提供对应能力 | 原版企业 policy、registry2cList/revocation、腾讯文档/ima/乐享 oneid gate、云任务 APIs 等依赖 WB/第三方;无权限不能伪造成功 |
这里是任务/依赖建议,不替主上下文决定生产模块架构或授权账号。
## 可委派任务与验收矩阵
建议先冻结一组只读原版基线和状态契约,再分界面与 host 两条实现任务;未接入后端的状态只能在显式 QA fixture 演示,不写回生产“已连接”。
| 任务边界 | 交付与依赖 | 验收状态 |
|---|---|---|
| A. 商店/详情 source UI | 新连接器 page/modal 组件及作用域化原 CSS;依赖 catalog/state props | 1336×901 V2 原几何/字体/卡片/搜索;长标题、图标失败、空目录、无结果、load failure/retry、分页/stale search;官方/企业分支独立 |
| B. MCP 管理与配置 UI | McpModal/McpPanel/JSON editor source DOM;仅UI helper与明确 host callbacks | 空/连接中/健康/未授权/错误/disabled/untrusted/readonly plugin;工具 toggle;JSON syntax/schema/nested/blank/dirty/cancel;删除确认;原版像素以采样状态逐个验证 |
| C. Token/device/QR UI | 两种 Token 路径分别恢复,通用 schema helpers、source CSS | 必填trim/已有secret留空/新secret/默认值、update失败/connect失败/pending、busy Enter/Escape、取消;device 无code/embedded/复制失败/低剩余/过期。原版未真实授权的状态标未验 |
| D. 自有连接状态服务 | registry、op queue、generation/intent guard、bounded poll/event、cancel/repair/disconnect/unbind | 重复connect、迟到snapshot、搜索换代、窗口隐藏、取消后迟到success、restart恢复;禁用与解绑不混;具体生产文件由主上下文分配 |
| E. 自有 MCP host/凭据 | trust/configHash、server/tool enable、describe/resources/prompts、secret storage、host生命周期 | 自有受控 MCP server证明list→connect→toolcall→结果→cancel/remove;未trust不启动、config变更重审、密钥不回显;安装/transport支持只按实测声明 |
| F. 会话与内核接线 | per-session选择/scope、prepareInput、动态工具注册/执行/approval | 两会话不串、selection-only不开新全局连接、disconnect后不发工具、tools:false不注入、MCP错误/cancel不混done、历史回放;必须真实 App/preload/IPC→OMP→MCP 验收 |
| G. 第三方授权适配 | 在明确用户授权后接自有 provider OAuth/device/token;不使用WB私钥/账号 | 真实提供方 success/deny/expire/cancel/revoke/reauth/刷新;原版服务无法访问的分支独立标依赖,不拿受控PASS替代真实auth |
每个任务都需返回修改文件、source Evidence/SHA/offset、验证命令与结果、未验状态。视觉验收需要同内容/同宽度/同主题/同渲染条件和严格像素报告;token 一致/编译通过不能算 UI 或服务全量 1:1。
## 下一批只读取证与未知项
Root 当前独占原版 runtime,本 worker 未操作原版。已确认可只读采:card 主体详情;“自定义连接器”入口打开 MCP 列表;配置编辑页展示读取。不要误点 card action plus、详情连接/试用/reset、MCP toggle/reconnect/approve/remove/save。
已补 V3 QQ 邮箱未连接详情 action 后截图(partial,无 action 后 layout)和 V4 稳定现有 MCP 列表截图/layout。尚需:详情 action 后静态 DOM、MCP empty/config editor 基线;搜索文本及清除/IME/空结果与分页;原版现存 server 展开后的 readonly tools/prompts/resources;企业 tab 是否可观察;暗色/窄宽/hover/键盘 focus/滚动和 toast 动效。Token/device/QR auth 动态状态本轮不触发,后续需明确授权或经 REA 的受控原版场景,不能用 YCode fixture 冒充已观察。
核心后端未知:主进程 connectors/mcp namespace 的实现路径、daemon RPC 与具体 transport/schema、安装包下载/完整性/重启策略、secret at rest/refresh/revoke、服务端 state machine/回调校验、会话工具实际注入/权限。图标有失败 fallback 的源逻辑与 V1/V2 外观,完整实际图标资源尚未逐项经 REA 导出,不能用截图存在代替资源字节已恢复。客户端可读分支已足够拆任务,但尚不足声称完整连接器功能已能 1:1 等价。
## 本轮验证
`node --check scripts/audit-connectors.cjs` 与 `node scripts/audit-connectors.cjs`:退出 0;339/339 baseline、329/329 supplementary script hashes、3/3 CSS hashes 通过,同名 source 无变化。25 个相关脚本的 SHA/function offsets 已写机器报告;3 份归档 workbuddy PNG 与 V3 的 2 份 action frame 均按 REA 声明 hash 复验,并保留 V3 failed/steps/restoration 原始状态。所有原版事实来自上述 REA 归档;未跑生产修改测试,因为没有生产修改;未真实 auth/安装/启用。