Files
ycode/docs/model-select-assessment-2026-10-16.md
T

9.9 KiB
Raw Blame History

自定义模型 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
定位 原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通过声明。