85 lines
9.9 KiB
Markdown
85 lines
9.9 KiB
Markdown
# 自定义模型 Select 恢复评估(2026-10-16)
|
||
|
||
可以恢复为原组件结构与状态行为,当前阻碍不是拿不到源码。本次只做原版REA取证和只读评估,没有修改ModelSettingsPanel/Select生产代码。
|
||
|
||
## 固定来源
|
||
|
||
- WorkBuddy5.8.2、ASAR SHA `035254bc76310ea46317433e4840602094543ef323d2d5c5aff7c131729de918`。
|
||
- ModelsSettingsPanel JS/CSS:REA `ev_25f013c9fd2ad66153046eec06e94fb6128bfacc1e87e57aa90db6bc419075ec`,`.tmp/rea-assessment-model-source.json`。JS SHA `739ab43ee521d8ef6e5b5b7731bb4e71b51454b2865f44a1228d7fcc2700149c`,CSS SHA `cd80b01d04589227a3c2db5dbe67b6c83b019bef18d3dba68ae5486448651018`。
|
||
- 共享Select/Popover/SVG:REA `ev_717fa5e846e64d67ac19c8925d121bff632c0d3aefb3603b10858559cabb2dcb`,`.tmp/rea-runtime-scripts.json` 的 `src-DPDj7_qD.js`,SHA `747e41d215375e1214c366213aea7e077d85421923029c61cbb6e9562be58de0`。
|
||
- 共享CSS:REA `ev_377c8790468b3c67dad8577aabb327f98d3140659f0fffdbabfcff5a40cc9e94`,`src-Bh3YZ35H.css`,SHA `88dbdc1cd3f59d0e8b75824512a465a2be714bc7af481d790fe3a9484f85e01a`。
|
||
- 当前原provider dropdown:REA `ev_7f4bada062e5643e7866e0dbe8a35f2ab5903421c94b5084ab710dbe77b3ab19`,`.tmp/rea-model-select-provider-static-20261016/`。
|
||
- 当前原model dropdown:REA `ev_a6b221d6a364c9f2db118a9dde18b9a3bc4a7c051663a6a0ccafb99c33c76237`,`.tmp/rea-model-select-model-static-20261016/`。
|
||
|
||
原版本次仅从首页模型菜单进入设置、打开provider/model dropdown,随后取消未保存编辑并关闭设置窗,没有保存/连接测试/发送消息。原设置窗900×680。关闭设置窗导致REA最终capture返回`protocol_error`;随后REA discovery仅剩main target,证明设置窗已关闭。main仍在首页。关闭过程诊断保存在 `.tmp/model-select-audit/settings-close-result.json`。
|
||
|
||
首次进入设置后编辑器已经自动打开;第一次probe试图点击背后的add按钮被REA遮挡校验拒绝,没有产生修改。有效provider证据来自随后只点已打开编辑器的provider按钮。
|
||
|
||
## 与当前adapter的具体差异
|
||
|
||
当前适配器位于 `ModelSettingsPanel.tsx` 的local `Choice`/`Select` 段,样式为 `model-settings.css` 中 `model-ui-*`。字段CRUD和密钥生命周期不是本评估替换范围。
|
||
|
||
| 项目 | 原版实现 | 当前adapter差异 |
|
||
| --- | --- | --- |
|
||
| Trigger DOM | `wb-select--medium/--full-width/--open/--empty/--disabled/--invalid`,value/placeholder区分,caret/loading/clear专用class | 只有`wb-select`、value和下箭头,缺状态class及原caret class/旋转;placeholder也复用provider提示 |
|
||
| provider数据 | options为嵌套group对象;label为含原vendor图标的ReactNode;searchText为中文+英文displayName | Choice仅label/value/group字符串;没有provider图标/双语searchText,分组只按相邻字符串插标题 |
|
||
| 搜索结构 | `wb-select__search > wb-input-wrapper--small --filled`,14px搜索SVG、allowClear、原input/prefix/suffix结构 | 独立带边框`model-ui-search`,缺搜索图标与清除按钮;provider也使用模型专用placeholder,原provider为“搜索” |
|
||
| 分组DOM | `li.wb-select__group[role=presentation] > group-label + ul.group-list[role=group]` | div包裹group标题和button,原group CSS无法完整命中 |
|
||
| Option DOM | `li.wb-select__option[role=option][tabIndex]`,OptionLabel,选中加两个状态class,原绿色check class/SVG | button节点,缺`__option-label`与完整selected class;generic check没有`__option-check`。自建`font:inherit`还覆盖源选中weight600 |
|
||
| model输入语义 | 候选存在时用普通WBSelect;已有非候选modelId注入Qe首项;无候选时用文本Input | `editable`让query无匹配时新增可选项并Enter选用。原WBSelect没有allowCreate分支,不能将`selectOrInput`名称直接解释成下拉搜索可创建 |
|
||
| Search条件 | provider数>6;model原候选数Z>6 | 当前`searchable || editable`会让<=6模型的下拉也出现搜索;应按调用条件恢复 |
|
||
| 定位 | 原Popover offset8,inline absolute;Floating UI offset/flip/shift/size/autoUpdate,按clipping ancestors与8px padding约束 | body fixed portal,offset4,只在打开时读rect;只按window剩余高度,缺ancestor裁剪、flip、自动更新 |
|
||
| 展开/退出 | expand preset、原placement class、150ms退出保留,初次activation next tick防误选 | 直接mount/unmount,缺expand DOM状态/退出、activation guard |
|
||
| 键盘/焦点 | 搜索时manageFocus和initialFocus;option原Enter/Space;触发器由原Popover绑定 | 当前自建上下箭头active/clamp与Enter选中;不能未经证据宣称与原焦点/键盘等价 |
|
||
| 溢出与tooltip | 字符串option用ResizeObserver检测ellipsis后显示原Tooltip | 没有检测/tooltip;当前文字/图标布局也不相同 |
|
||
|
||
源代码的模型创建/保存/上游测试可以继续使用YCode现有真实宿主;无需调用WorkBuddy服务端模型。
|
||
|
||
## 原版当前几何
|
||
|
||
| 元素 | provider dropdown | model dropdown |
|
||
| --- | --- | --- |
|
||
| trigger | `[154,136,592,32]` | `[154,304,592,32]` |
|
||
| popover | `[154,176,592,306]` | `[154,344,592,216]` |
|
||
| panel | `[163,177,574,304]` | `[163,345,574,214]` |
|
||
| search区 | `[163,177,574,48]` | `[163,345,574,48]` |
|
||
| filled search input wrapper | `[163,185,574,32]` | `[163,353,574,32]` |
|
||
| list | `[163,225,580,256]` | `[163,393,580,166]` |
|
||
| option | 高32、相邻y步进34、radius8 | 高32、相邻y步进34、radius8 |
|
||
|
||
原editor-body `[130,104,640,464]`,底边568;model popover底边560,正好留下原8px clipping padding。当前只看window高度的portal会进入footer区域。Provider selected项背景rgb247、check16px绿色;原provider option同时渲染16px vendor图标。上述是同一900×680原状态,不混入YCode较早截图的测量。
|
||
|
||
## 恢复边界建议
|
||
|
||
建议一个独立、有界的实现任务:
|
||
|
||
1. 新增 `SourceSelect.tsx`、`source-select-recovered.css`、`source-select.css`、`SourceSelectIcons.tsx` 和恢复脚本。承接ReactNode label、searchText、OptionGroup、source条件class、搜索Input、选中check、empty/disabled、源键盘/焦点行为。共用在provider/model/effort三个callsite。
|
||
2. 恢复私有 `SourceSelectPopover`(可单文件内)与其定位/焦点/activation/exit依赖,保留原inline策略和clipping。原PopoverLayer使用Floating UI;当前仓库没有`@floating-ui/react`。依赖选择、版本与新增package范围由主上下文决定;不要直接执行完整原共享bundle的初始化。应恢复有限纯组件/辅助函数,并用原900×680截图验收。
|
||
3. 新增 `SourceProviderIcon.tsx`、必要真实vendor资源;将provider label/render与列表row icon映射恢复。当前catalog已带icon字段,无需主进程/存储修改。原Tencent/OpenRouter/Ollama三张PNG已是REA脚本内data URI,可从固定导出解码,无须新取原安装包;其余是可提取的纯SVG。
|
||
4. 只接 `ModelSettingsPanel.tsx` 的imports、local Choice/Select段、三个Select调用与provider label/row icon;`model-settings.css`只移除对应`model-ui-select/search/options/group/active`覆盖。不改CRUD、测试、密钥、保存策略、main/preload/store。主上下文正在新增的`createRequest`路由hook与begin后effect保持不动。
|
||
|
||
共享源码可直接恢复的范围已经固定:
|
||
|
||
| 定义 | offset | 源长度 |
|
||
| --- | ---: | ---: |
|
||
| isOptionGroup / flattenOptions / defaultFilter | 836748 / 836806 / 836915 | 58 / 109 / 214 |
|
||
| OptionLabel / OptionStringLabel | 837129 / 837295 | 166 / 459 |
|
||
| Select | 837754 | 5860 |
|
||
| usePopoverActivation | 759107 | 1589 |
|
||
| PopoverLayer | 761887 | 4211 |
|
||
| useExitTransition / Popover | 766474 / 766808 | 334 / 1027 |
|
||
|
||
原CSS可恢复Select69条、Popover24条、Input107条,另模型CSS的Select2条/provider3条,必须保留media父条件与token闭包;无需凭截图另写一套尺寸。
|
||
|
||
原vendor内嵌PNG:Tencent `Kkt` offset4016979、1190B、SHA `5fd576ec40a7682780b2ef3b83f51cf2de41b960cc351c9a40edf951c8a797dd`;OpenRouter `Wkt` offset4014335、1945B、SHA `f66f19c8b7c99bb9f37c0239b6575cd01803112050161c0ba5275928f2db0194`;Ollama `Hkt` offset4011891、1797B、SHA `8f38edfb007d7b74f03d2ad7a57c023daa678031795ad11836df593970764a0b`,均来自固定contexts脚本。
|
||
|
||
## 数据与仍需证据的状态
|
||
|
||
本次原runtime provider16项/4组、默认Tencent Token Plan model15项;当前静态catalog domestic13项/4组、该provider模型8项。它是数据差异。原 `useLocalCustomModelSettingsConfig` offset4066587通过adapter.getProductConfiguration获取customModelSettingsUrl,允许显式local override/fallback URL,再fetchWithCache载入配置。当前静态catalog不是这个实时配置的完整快照;不能填造ID或假造WorkBuddy云端模型服务。可保留YCode自己的静态provider库并明确数据来源,同时让组件按源客户端规则分组/过滤/展示。
|
||
|
||
入口另有已证实差异:原 `useCustomModelEntry` offset4115869,在footerAction=`openSettingsAndCreate`时调用 `openSettings('models','new')`。原首页“配置自定义模型”直接打开添加overlay;当前旧入口只打开设置列表。已交主上下文修正路由,不由Select子任务覆盖。
|
||
|
||
尚需原版状态证据:搜索输入/清空/no-result、<=6模型无搜索、当前非候选modelId、切换provider、popover flip/滚动/窄窗、暗色和退出动效。当前REA probe schema没有任意文本输入action,故未对原输入查询;搜索过滤规则已有源码,任意文字行为实测需先由REA补明确输入能力,不能直接CDP输入替代。未保存/测试/发消息是本次取证范围,不构成自定义模型后续功能缩减。
|
||
|
||
可复现评估:`node scripts/audit-model-select-reference.mjs`。结果 `.tmp/model-select-audit/report.json`、shared-select-readable.js、models-provider-readable.js、own-select-readable.tsx与有限CSS正文,源SHA校验通过。原生provider/model截图与全部layout保留;当前阶段未进行新Select实现、YCode dropdown像素对比或完整1:1通过声明。
|