Files
ycode/docs/created-expert-source-20261016.md
T

99 lines
8.1 KiB
Markdown
Raw 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.
# 已创建专家:源码恢复与宿主边界
日期:2026-10-16。原版版本:WorkBuddy 5.8.2。
本次只恢复组件文件、局部样式、恢复工具与本文;没有修改 App、ExpertsPage、CapabilityCenter、IPC、主进程或共享数据模型。生产页面与真实专家注册表由主上下文接入。生产代码没有填充专家样例,没有模拟安装、删除或召唤成功。
## 证据身份与观察范围
原版读取全部来自已保存 REA 结果,没有原版运行时操作,没有直接读取安装包。
- 安装包 root pin:`035254bc76310ea46317433e4840602094543ef323d2d5c5aff7c131729de918`。
- JavaScript:`.tmp/rea-runtime-scripts.json`,Evidence `ev_717fa5e846e64d67ac19c8925d121bff632c0d3aefb3603b10858559cabb2dcb`。
- CSS:`.tmp/rea-css-recovered/manifest.json`,Evidence `ev_377c8790468b3c67dad8577aabb327f98d3140659f0fffdbabfcff5a40cc9e94`。
- 空态 SVG:Evidence `ev_e5515aa84117724605f73439d065222c2e23b6ab8226be5d03f1ee0c7b387a9b`,原路径 `renderer/assets/empty-created-expert-BOI6XYXm.svg`;本地 `assets/empty-created-expert.svg`,SHA256 `157f07ef40d6cdf5f3aed362509861151fbdde0a8a9c89c98c26de6f35f664b7`。
恢复工具先核验全文 SHA,再用 AST 选择组件和纯函数。没有执行原模块初始化。
| 模块 | SHA256 |
| --- | --- |
| contexts-BMeWSUHk.js | `5f35b7489b107e21ef452c8ee88a95265756f6fc444841eef869228bbc44768b` |
| src-DPDj7_qD.js | `747e41d215375e1214c366213aea7e077d85421923029c61cbb6e9562be58de0` |
| src-0FGg1seX.js | `f2c6dbae949041b4e2bb456e8a23ae2837f2d7893ac24bf471485f77c7b15178` |
| contexts-BkjwYSZT.css | `50cbd673f7f35fc7f966bdddc6c9f5677fdfe944cb904888d214619fca259380` |
| src-Bh3YZ35H.css | `88dbdc1cd3f59d0e8b75824512a465a2be714bc7af481d790fe3a9484f85e01a` |
| src-CBaV_A3S.css | `2090ed21045c8f8b0fc388d76424c8751bf18fcd065cbbd5d0ef485163a2e36c` |
以下 offset 为 UTF-16,下界包含、上界不包含。完整 25 个函数体、273 个 CSS 记录及原始/适配 SHA 在 `assets/created-expert-source-manifest.json`。
| 原函数 | 模块与范围 | 函数体 SHA256 |
| --- | --- | --- |
| CreatedExpertCard | contexts `[3836312,3843963)` | `ecbaba2a34fe1e6afdb608845bf52e3d1e58518c17f8f7108d4ef43b865d3128` |
| CreatedExpertsPanel | contexts `[3845690,3851495)` | `73d81b6f1c3205fa1b8c67639fa821af60f0b29d236be4d2260406a75f579e47` |
| CreatedExpertDeleteDialog | contexts `[3605118,3606196)` | `8043033f6a107e1fbdb950df72dae9c28675ea6123262e977ea89eb948657ad4` |
| Dropdown | src-DPD `[824745,827584)` | `2d96b1bb76d33a59f1e8ecfe040bd40fc05255b9c4ff1831ab33a0f00cc8cbc1` |
| DropdownMenuList | src-DPD `[791722,795284)` | `bea2f5ed3c5c42cb6dd9599dfc6027bf2a29b5fa18526b6b18cb63d7a0c84a1e` |
| ConfirmDialog | src-0FG `[551341,554641)` | `25a5264f2a876512ef2d0a6217dbdceeb6246ed03d225795f5875af0b980d421` |
| Ku(cb Button) | src-0FG `[137355,138067)` | `a6bac5d42f03b0f4756d879228a2e24c35a7221fd6c6af8da7d9e7b1a94a656e` |
CreatedExpertsPanel 只有一个源码文字变更:静态 SVG 地址改成本地同 SHA SVG。原/适配函数体哈希分别记录。原卡片复用此前恢复的 ExpertCard;源图标还原了原 createIcon/bn 的 16px 默认尺寸,而非只复制 SVG path。
## 可接接口
`assets/created-expert-source.mjs` 具名导出:
```ts
CreatedExpertSourceProvider({ host?, children? })
CreatedExpertCard({ expert, onUse, onDelete?, onEdit?,
isMenuOpen?, onToggleMenu?, highlightKeyword? })
CreatedExpertsPanel({ createdExperts, activeTab, onTabChange,
onUse, onDelete?, onEdit?, searchKeyword?, toolbarExtra? })
```
`activeTab` 是 `expert | team`。Panel 保留原组件单一打开菜单 ID;独立 Card 必须由宿主维护 `isMenuOpen/onToggleMenu`。
- `onUse(id, initPrompt?)`:调用真实会话启动;预览的原 `onSummon(id, unused?, initPrompt?)` 保留参数位置。
- `onEdit(expert)`:把原专家对象交回对话驱动编辑入口。
- `onDelete(id)`:返回 `false` 或 reject 都保持原删除框。reject 只显示通用失败提示;等待中禁用确认、屏蔽关闭。返回 `true/void` 才按原组件成功分支关闭。
- `host.openPath(rootDir)`:必须由受控 IPC 实现。返回非空错误字符串或 reject 会显示原打开失败文案;组件不接触 fs。
- `host.resolveAssetUrl(value)`:可选本地头像解析器。默认只允许 image data/blob/file/ycode 协议,不自动请求 HTTP 头像。
- `host.renderPreview({expert,onClose,onSummon})`:宿主真实包详情。组件隔离 React 事件传播,避免关闭按钮冒泡到源 article 后重新打开。未提供时仅显示本地标题和描述,不能代替完整 TeamDetail。
- `host.notify(message,type)`、`host.locale: zh | en`:局部消息和原归档文案。
需要外层能力中心的源 token/主题样式。Provider 创建一次绑定,后续 host 对象更新只更新 ref,避免每次渲染重新挂载卡片/丢失弹窗状态。React、JSX 与 ReactDOM 均来自 YCode singleton。
卡片使用原字段:`id/name/displayName/profession/description/displayDescription/expertType/expertRootDir/avatar/version/updatedAt/tags/useCount`。`name` 是本地包字符串;displayName/profession/description 支持原 zh/en 文案结构。字段含义、包来源和激活由真实注册表负责。
## 宿主适配与未恢复内容
云开关 `ic/oc` 明确关闭;公开 facade 不接收 share/cloud callbacks。原服务 hooks 不执行、未导出。源卡片中保留的云分支不可由公开接口触发;不可把这部分声明为已实现。
原 Dropdown、菜单列表、文字、确认框、按钮、图标函数体保持。Popover 是本地宿主:使用已有 Floating UI 定位、4px offset、flip/shift、门户、外点关闭、Escape/方向键。仅验收当前本地平面菜单;没有宣称完整原 Popover、子菜单、tooltip 和动效逐帧等价。Tooltip 当前使用原文字的 native title。
cb 组件原依赖全局主题变量。本次恢复 src-CBa 原 cb token 声明并局部映射浅/深主题,向 ConfirmDialog 传宿主实际主题。缺少原 IDE 动态变量的错误前景/背景,通过明确适配桥接到已恢复 WB error/danger token。桥接不是原运行时颜色比对结论。
源 geometry 有条件:本地没有 useCount 时,ExpertCard 使用 centerCardWithoutMetadata,高度 auto;本次 128px。市场含 usage 卡片的固定 156px 不适用于此状态。CreatedExpertsPanel 文本 tabs 自身 24px;带 32px toolbarExtra 时整个 toolbar 自然 32px。
## 验证
```powershell
node scripts/rea/recover-created-experts.mjs --check --native-qa
npx tsc --noEmit -p tsconfig.web.json
node scripts/rea/recover-capability-center.mjs --check
```
恢复与旧能力中心源码审计通过;web TypeScript 通过。最终独立原生验证 **34/34 PASS**,报告 `.tmp/created-expert-source-H0svkz/report.json`。`--native-qa` 自带可重复的隔离 fixture:创建自身 `.tmp/created-expert-source-*` 目录与三份测试 manifest,生产 React bundle、真实 Electron 窗口,不假造 IPC、不发送消息、不使用用户目录、不操作原版。
最终报告目录见命令输出,`report.json` 含原生断言、geometry、renderer error/HTTP 列表,六张 PNG 保存卡片、菜单、浅/深删除框、空态与 480px 窄页。覆盖:原菜单四项与 16px 图标、24px more、32px item、4px anchor gap、单一菜单、Escape、编辑/目录/召唤参数、预览关闭不重开、删除 false/reject/pending/success、搜索与 team 分类、host 更新不卸载、明暗主题、窄屏长标题和 0 外部 HTTP/renderer error。
独立 fixture 通过不等于完整生产 App 流程通过,也不是原版全状态像素验收。真实注册表、对话驱动创建/编辑、删除/召唤及完整原版截图比较由主上下文继续验收。
## 文件
- `src/renderer/src/capabilities/assets/created-expert-source.mjs`
- `src/renderer/src/capabilities/assets/created-expert-source.d.mts`
- `src/renderer/src/capabilities/assets/created-expert-source-manifest.json`
- `src/renderer/src/capabilities/created-expert-source.css`
- `scripts/rea/recover-created-experts.mjs`
- 本文与 `.tmp` 隔离验收报告。