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

8.1 KiB
Raw Blame History

已创建专家:源码恢复与宿主边界

日期: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 具名导出:

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。

验证

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 隔离验收报告。