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

79 lines
6.0 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)
已新增独立 `SourceActiveExpert`,未编辑 App、ChatPane、ComposerControls、stores 或主进程。原版仅分析已保存 REA 脚本、CSS 与被动布局;本轮没有操作原版 UI。
## 证据与源码身份
WorkBuddy 5.8.2,REA 安装包基线 root SHA `035254bc76310ea46317433e4840602094543ef323d2d5c5aff7c131729de918`。
| 来源 | Evidence / SHA |
| --- | --- |
| `.tmp/rea-runtime-scripts.json` | `ev_717fa5e846e64d67ac19c8925d121bff632c0d3aefb3603b10858559cabb2dcb` |
| `src-DbE1_mgM.js` | `6c6ce63c93854783270e855572797d75e536e3b8d4548410e31fe9d147e1feb4` |
| `src-CyXHA0IC.css` | `a5e26b537bb50323aefbf25abddad52e288dd3868598be8d255d70886fe77cfe` |
| `src-CBaV_A3S.css`(颜色/主题变量) | `2090ed21045c8f8b0fc388d76424c8751bf18fcd065cbbd5d0ef485163a2e36c` |
| 当前原版被动截图/布局 | `ev_7e9604adb87a3d21570eb7a371001e48b3d316ee0388a03a97e2cb564d03aff7`,`.tmp/rea-expert-usage-current-20261016/` |
恢复脚本在解析前验证脚本和 CSS SHA。生成的 `SourceActiveExpertManifest.json` 完整保留30个原函数的源码字符区间和 body SHA,以及输出 SHA/字节。源区间为 `[start,end)`,不是行号:
| 函数 | 原字符区间 |
| --- | --- |
| `ExpertChip` | `[1693365,1695005)` |
| `ExpertAvatar` | `[1695006,1695726)` |
| 可显示判断、准备中匹配、team头像解析 | `[1692572,1693249)` |
| fallback seed 与确定性颜色 | `[1146532,1146927)` |
| `ChipCloseIcon` | `[471321,471715)` |
| `LoadingSpinnerIcon` | `[406658,407080)` |
| `Tooltip$1` | `[377803,380607)` |
| `TooltipLayer` | `[373215,375023)` |
初次找到的 `wb-status-chips-BkgUUbOl.js` 是另一套 `_1udom_` 实现。当前被动画面实际使用 `cr-*` 类,因此最终恢复上表 `src-DbE1_mgM.js` 的组件,没有混用旧组件的 avatar 或 tooltip 逻辑。
## 原版行为与宿主适配
- 标签优先显示 `profession.trim()`,其次为非 id 的 `name.trim()`。头像/名称尚未 hydrate 完整时沿用最近可展示的选择;显式 null 清空缓存。
- 外层是 `role=status` 静态标签。**没有点击标签打开菜单的源码行为**;专家菜单仍由输入工具栏的 + 入口负责,故这里不添加 `onOpenPicker`。
- hover/focus-within 时头像位置换成原16px ×图标。清除按钮 stopPropagation,乐观清空选择,再 await provider.onChange(null);拒绝时恢复。
- 原 provider 的 selected-id effect 会 silent summon;`suppressAutoSummon` 可跳过。YCode 真实选择/召唤由根上下文负责,标签 adapter 对非 null silent 通知不再次激活,避免重复 runtime 初始化。
- preparingExpertId 匹配 id 或 marketExpertId,原样显示 `aria-busy`、头像透明度与 spinner。坏图片回退到 profession/name/id seed 首字符及源8色确定性背景;team 可使用 assistantDisplayName/Profession/AvatarUrl。
- compact 仅保留32px圆形标签并给职业 tooltip;普通模式文字最大140px,只有截断时显示完整 tooltip。恢复原 Tooltip、TooltipLayer、150ms transition、200ms hover delay、3px arrow、键盘 focus 判断和按压抑制 helpers。
- `scopeKey` 是宿主额外边界,切换时重挂载缓存;旧清除失败不能覆盖新会话或新选择。`disabled` 是额外忙碌状态:禁用按钮并保留头像。原源码此标签没有完整 disabled 参数,这部分明确是 YCode host 适配。
- React/JSX 与 `@floating-ui/react` 使用 YCode 单例/已pin宿主依赖;没有声明等同原版打包依赖版本。源码 JSX namespace 绑定替换、CSS选择器限定作用域、tooltip portal包裹作用域;原 CSS 声明值保留。主题增加 YCode `data-theme` 到原 light 规则的宿主映射。
## 接口与集成
```tsx
import SourceActiveExpert from './capabilities/SourceActiveExpert'
<SourceActiveExpert
expert={expert ? {
id: expert.id,
name: expert.name,
profession: expert.profession,
avatarUrl: expert.avatarUrl
} : null}
scopeKey={actualOwnerKey}
disabled={busy}
preparingExpertId={preparingExpertId}
onRemove={async () => { await persistActualDeselection() }}
/>
```
`onRemove():void|Promise<void>` 必须执行真实清除;失败应 reject,不要先吞掉错误,组件才能按源回滚。父组件负责更新 controlled expert 与会话持久化。可选 `compact`。`ActiveExpert` 还支持 marketExpertId、expertType、assistantDisplayName、assistantProfession、assistantAvatarUrl、suppressAutoSummon。
## 文件与验证
新增模块:`SourceActiveExpert.tsx`、`SourceActiveExpertRuntime.tsx`、生成 `SourceActiveExpertRecovered.mjs/.d.mts`、`SourceActiveExpertSource.css`、`SourceActiveExpertManifest.json`。恢复脚本 `scripts/rea/recover-active-expert.mjs`,原生验证 `scripts/rea/test-active-expert-native.mjs`。
```powershell
node scripts/rea/recover-active-expert.mjs --check
node scripts/rea/test-active-expert-native.mjs
npm run typecheck
```
结果:恢复一致性 **30函数/3源通过**,typecheck通过;原生 Electron **38/38通过**,报告 `.tmp/active-expert-native-yS4h06/report.json`,截图 normal/hover/preparing/compact-tooltip。
固定原文“高级算法工程师”在同字体环境中:原 `[458.125,463.5,127,32]`,fixture `[100,100,127,32]`;位置由测试容器决定,尺寸一致。头像16×16、文字91×20、间隙4、左右padding8、13px/500/20px文字、圆角、颜色、transition等16项选定计算值与保存的REA布局完全相同。其余检查覆盖名称优先级、坏头像/team头像、准备中、长文本、紧凑模式/tooltip、真实 Enter 清除、失败恢复、异步切换选择和owner隔离。
本次 avatar 测试使用受控本地 fixture 图片;未将它当作原专家头像像素。原版 hover、preparing、tooltip 动态没有新增实时取证,只能确认其源实现已恢复并经本地执行。尚未验收整应用布局、原头像同状态像素、自然 Tab 遍历可达性和全状态动效;这些不能由编译/局部几何通过替代。