chore: establish YCode replication baseline and TODO
This commit is contained in:
commit
6dc59f89ba
1118 files changed
+196002
No files matched your search
@@ -0,0 +1,112 @@
|
||||
# 新建任务与自定义模型评估(2026-10-15)
|
||||
|
||||
本次只评估,不修改生产代码。用户要求新建任务交互和自定义模型添加体验对标 WorkBuddy,不使用 WorkBuddy 服务端模型。结论:可继续源码级对齐客户端,但目前两个模块均存在状态与数据能力缺口,工作量显著超过 CSS 调整;不能以已有会话导入、输入框外观或单一网关设置代表完成。评估中已追加获取模型设置主体 JS/CSS,表单源码缺失这一阻碍已解除。
|
||||
|
||||
## 证据范围
|
||||
|
||||
本子任务仅分析保存的 REA 导出和主上下文追加采集的 REA 证据;没有绕过 REA 连接原版 CDP、执行原版 evaluate、直接读取安装文件或使用旧 `wb-*` 工具。主上下文已新增模型列表运行时画面;静态分支不等于动态已验证,尚无这两个模块的双端像素验收。
|
||||
|
||||
- WorkBuddy 5.8.2;安装包 SHA-256 `035254bc76310ea46317433e4840602094543ef323d2d5c5aff7c131729de918`。
|
||||
- JS:`.tmp/rea-runtime-scripts.json`,Evidence `ev_717fa5e846e64d67ac19c8925d121bff632c0d3aefb3603b10858559cabb2dcb`。以下锚点为 `items[].source.artifact.text` 的 JavaScript 字符偏移(不是字节或行号)。
|
||||
- CSS:`.tmp/rea-css-recovered/manifest.json`,Evidence `ev_377c8790468b3c67dad8577aabb327f98d3140659f0fffdbabfcff5a40cc9e94`。仅说明当时已加载样式的范围,不覆盖全部 lazy 页面。
|
||||
- 模型设置主体:`.tmp/rea-assessment-model-source.json`,Evidence `ev_25f013c9fd2ad66153046eec06e94fb6128bfacc1e87e57aa90db6bc419075ec`,REA 对相同 ASAR 根摘要选择性导出两个成员。
|
||||
- 模型列表画面:`.tmp/rea-assessment-models/frame-000.png`(900×680),Evidence `ev_40da6df0424193923bae64a8ccb6fca97ea67813d7de671986d4d7e154b848c1`;REA 原生点击进入模型设置并等待,不运行模型请求。画面显示自定义模型卡片、两个已有模型、添加/编辑/测试/删除入口。本次没有读取或展示真实密钥。
|
||||
|
||||
| 原版文件 | SHA-256 | 相关函数/锚点 |
|
||||
| --- | --- | --- |
|
||||
| `home-CC-czDJL.js` | `121d5a07acccb09e48f20f3a94f9fac8b10770e4a82bca1916d2cccd333f8d14` | `useCreateHomeTask` 43266–51436;`useHomeInputSendHandler` 81136–85362;`useHomeInputProviders` 74819–80388;`useBuddyHomeInputPersistence` 13205–14363 |
|
||||
| `contexts-BMeWSUHk.js` | `5f35b7489b107e21ef452c8ee88a95265756f6fc444841eef869228bbc44768b` | `buildDefaultModelFormValue` 4036703–4037412;`resolveLocalCustomModelSettingsConfig` 4033903–4034815;`useModelSelector` 4097539–4112154;`useCustomModelEntry` 4115869–4116529;`saveNewTaskModel` 4088062、`loadNewTaskModel` 4088234 |
|
||||
| `workbuddy-provider-DkH2YFYM.js` | `b588e875c469978f216beec86bdf4b6c33a31c0266f9bf996881b8dbf37b5dc7` | `getLocalCustomModels`、`saveLocalCustomModel`、`deleteLocalCustomModel`、`testLocalCustomModel`、`checkLocalCustomModels`,567600–568800 附近 |
|
||||
| `home-D6iylhBV.css` | `bb1aa03bc4ac4e18072461e7b493ab5cd6aeab3deb5b77e059dc075b55a720d5` | `.wb-home-route`、`.wb-home-page`、首页输入/推荐/页脚等 |
|
||||
| `home-CyzXSQsx.css` | `0661cfef3bf9372f4d3ebad7de35b8c023178c3aae6d4e1b61d7f9a841197f60` | 同一固定 CSS 集中的另一首页样式 |
|
||||
| `ModelsSettingsPanel-Dn7mp8BK.js` | `739ab43ee521d8ef6e5b5b7731bb4e71b51454b2865f44a1228d7fcc2700149c` | 52007 B;`ModelsSettingsPanel` 22133–51116;校验/构造 payload 回调 `J` 27210–29304;保存 `Y` 29305–29739;提交 `Ke` 29740–30143;测试 `qe` 30144–30810;删除 `Je` 31340–31710 |
|
||||
| `ModelsSettingsPanel-FfiX-Du7.css` | `cd80b01d04589227a3c2db5dbe67b6c83b019bef18d3dba68ae5486448651018` | 18989 B;完整模型设置列表、编辑覆盖层、字段网格、测试反馈、删除弹窗样式 |
|
||||
|
||||
先前固定导出未包含模型设置 lazy chunk;主上下文随后经 REA 选择性补齐以上 JS/CSS。本报告已据新增正文修订字段、校验、覆盖确认、连接测试和删除流程。实际请求层的协议映射/能力处理与所有动态失败状态仍需进一步核对,不再把“拿不到表单源码”列为阻碍。
|
||||
|
||||
## 当前 YCode 真实能力及缺口
|
||||
|
||||
| 能力 | 当前状态与源码 | 与已知原版的差距 |
|
||||
| --- | --- | --- |
|
||||
| 新建入口 | `Sidebar.tsx:159` 调用 `newSession`;`stores/chat.ts:67` 调用真实 IPC 创建并切换;`main/ipc.ts:299` 实际存储 | 原版首页 `useCreateHomeTask` 在首条提交才调用 `conversations.create`,同时带任务配置。YCode 点击即产生持久空会话;首页又用 `messages.length === 0` 判定,缺独立新任务草稿/创建阶段 |
|
||||
| 首页内容 | `ChatPane.tsx:151` 渲染标题、三场景、胶囊和推荐;数据来自 `mock.ts` | 当前场景点击直接写固定提示词;原版具有场景配置、模板选择、输入草稿同步、推荐/选择状态,不是同一状态机。历史“实测”注释不能充当本次 REA 验证 |
|
||||
| 首次发送 | 输入框通过真实 `send`/IPC/内核运行;附件、资源、权限、语音已有宿主接入 | 创建 payload 没有 model/cwd/interaction mode/scene 的任务快照;原版创建携带这些字段,提交前还检查工作区、模型能力和创建并发 |
|
||||
| 草稿 | `ChatPane.tsx:32` 组件内按 session ID 保存文本/附件/资源 | 组件内状态没有持久首页草稿;原版 `useBuddyHomeInputPersistence` 有作用域与 500 ms 持久化等分支。重启、导航和场景切换具体行为需实测确认 |
|
||||
| 工作目录 | 全局目录真实可选、落盘;首页按钮打开设置 | 原版首页提供任务目标/cwd/worktree 的输入 provider、有效性检查及本地目录记忆。YCode `SessionMeta` 无 cwd;当前目录全局变更影响后续会话执行,不能模拟每任务绑定 |
|
||||
| 模型按钮 | `ChatPane.tsx:126` 只打开设置;展示 OMP 首模型或网关名 | 没有原版模型下拉、分组、当前项、搜索/编辑入口、思考设置、上下文选择。新任务模型偏好与每会话选择未贯通 |
|
||||
| 模型设置 | `SettingsDialog.tsx:180` 是单一旧网关的 baseUrl/model/key/temperature 表单,配置真实保存,密钥不回传渲染器 | 没有多模型列表、provider 分组、添加/编辑/删除/连接测试/能力设置;OMP 可用时该表单对实际对话不生效。这是功能断点,不能只换表单外观 |
|
||||
| 模型持久化 | `main/config.ts:15` 一个 `StoredConfig`;`updateConfig` 真正保存并 safeStorage 加密 key | 当前不是自定义模型注册表,缺稳定模型 ID、多记录与选择引用、导入旧配置迁移,以及按模型维护密钥的接口 |
|
||||
| 模型运行时 | `main/omp.ts:154` 读取 profile 首个 provider/model;构造器支持 modelOverride;`main/ipc.ts:126` 创建内核时未传 override | 首模型解析/显示不等于选择生效。必须打通 UI 选择→任务记录→实际 OMP 请求/内核模型→重启恢复。已有实例仅按 cwd 判定复用,需要评估模型切换时的行为 |
|
||||
|
||||
账号、云端模型、企业策略、收费/推荐请求属于原版存在的额外分支。本次用户已排除原版服务端模型;自定义 provider 配置可采用明确的本地数据来源,不能因此保留“选中模型实际仍跑固定 OMP 首模型”的断点。无需取得 WorkBuddy 服务端才能完成自定义模型客户端交互与用户自己的上游调用。
|
||||
|
||||
## 原版静态实现已明确的行为
|
||||
|
||||
新任务 `useCreateHomeTask` 有创建锁、空内容拒绝、creating/worktreePreparing 状态,创建配置包含标题、cwd、welcomeMode、mode、model、expert、permission、promptContentBlocks 等;成功后导航新会话,并清理对应草稿/准备上下文。`useHomeInputSendHandler` 会先筛掉 failed blocks,检查本地工作目录可用性,处理 before-send 拒绝和创建错误,失败路径可回滚已准备状态。这里只列可从源码确认的分支,不代表所有分支都需要同时实现云端依赖。
|
||||
|
||||
自定义模型 `buildDefaultModelFormValue` 明确返回:providerId、modelId、endpoint、apiKey、supportsToolCall、supportsImages、supportsReasoning、onlyReasoning、canDisableThinking、defaultEffort、supportedEfforts、useCustomProtocol、maxInputTokens、maxOutputTokens。provider 配置还明确区分 authMode(apiKey/none)、endpointMode(readonly/editable)、modelInputMode(select/selectOrInput/input)、advancedConfigMode、savePolicy 和能力默认值。
|
||||
|
||||
原版 selector 把 configurable/custom 标签或 `custom-local:` ID 识别为自定义模型;自定义入口支持设置 `models/new`、`models/edit/<id>`。新任务偏好保存 id/isThinking/reasoningEffort/contextWindow,并按用户/应用作用域读取。模型调用适配器有真正 list/save/delete/test/check 接口,说明“添加一个输入框”无法覆盖其生命周期。
|
||||
|
||||
## 补齐表单后的确切约束
|
||||
|
||||
以下来自新增 REA 模型主体正文,已经能直接指导实现;动态表现仍需同输入验收。
|
||||
|
||||
| 项目 | 原版规则与源码锚点 |
|
||||
| --- | --- |
|
||||
| 打开/关闭/编辑 | 新建回调 `K` 24640–24819 重置表单/测试错误/密码可见性;编辑 `q` 25093–26214 回填模型、endpoint、apiKey、能力和 reasoning/token 字段;Escape 关闭编辑覆盖层。切换 provider 重新采用该 provider 默认值并清除当前编辑对象 |
|
||||
| provider | 按配置分组;provider 总数大于 6 显示搜索。readonly endpoint 隐藏输入并用 provider tooltip 显示;editable 显示地址输入与即时 error 状态 |
|
||||
| 校验顺序 | `J`:选择 provider → trim 后 modelId 必填 → endpoint 必填 → editable endpoint 必须是 URL 且为 http/https → authMode=apiKey 时 key 必填且字符合法;失败 toast 后终止,没有新增记录 |
|
||||
| API Key | `sanitizeApiKeyInput` 19991–20052 删除全部 Unicode 空白;允许字符为 `^[\x21-\x7E]+$`(ASCII 可打印非空格)。表单密码/文本切换;实时字符错误和测试错误共用反馈区。authMode=none 隐藏输入且保存 payload 的 apiKey 为 undefined。编辑会回填已有 key,不能把 YCode 旧表单“留空保持”当成原版行为 |
|
||||
| 模型输入 | 当 provider.modelInputMode=selectOrInput 且有候选时用模型下拉,候选数大于 6 显示搜索;当前非候选值会加入选项。其余分支使用文本输入。模型选择可更新能力与 reasoning 默认值 |
|
||||
| 重复 ID | `Ke` 29740–30143 检查与当前编辑对象不同的同 ID 记录;出现覆盖确认,确认后才保存。不是直接拒绝或静默覆盖 |
|
||||
| 保存 | `Y` 调用 `adapter.saveLocalCustomModel({model,previousId,visible:true})`;成功更新列表/文件路径,发出 `agent-ui:custom-models-updated`,关闭编辑。失败普通 toast 并可继续编辑;企业策略拒绝分支会关闭编辑 |
|
||||
| 能力/协议 | provider.showCapabilitiesInForm 控制工具、图片、推理、自定义协议开关;支持推理后才显示仅推理、允许关闭思考、默认 effort、支持 effort 复选组。关闭推理会清除其附加状态;保存 reasoning 空对象时为 undefined。useCustomProtocol 是保存的布尔字段,其真实请求协议效果尚未由本表单证明 |
|
||||
| provider 自动策略 | savePolicy=autoFromModel 时以模型选项自动产生能力/推理默认值;手动能力分支保留表单选择。不能所有 provider 都用同一组默认 checkbox |
|
||||
| 高级区域 | advancedConfigMode 非 hidden 时出现标题与内容;该 JSX 没有折叠展开按钮。需纠正把它预设为可折叠区域的推断 |
|
||||
| tokens | 输入为 number/min=0/step=1;空字符串保存为 undefined,非空由 `parseInt(...,10)` 且 finite 判定。该函数没有正数、安全整数、上下文上限或输入输出大小关系校验,不能凭 UI min 属性声称服务层已有约束。输入快捷值 32768/65536/131072/262144(32/64/128/256K),输出 8192/16384/32768/65536(8/16/32/64K) |
|
||||
| 表单连接测试 | `qe` 30144–30810 复用上述 `J` 校验,只调用 `testLocalCustomModel(model)`,不调用保存;testing 中取消/保存按钮 disabled,测试按钮在 saving 或 testing 时 disabled。成功 toast;失败按 errorCode 映射到本地化反馈,无匹配用 defaultError;异常也落默认错误 |
|
||||
| 列表连接测试 | `X` 30811–31339 同时仅允许一个已有模型测试;失败给行标记,成功移除。编辑该失败项也移除失败标记;不是保存配置失败状态 |
|
||||
| 删除 | 点击显示含模型名的确认弹窗,遮罩/取消可关闭;`Je` 31340–31710 调用 `wb.models.deleteCustom(id)` 后 `wb.models.customs()` 刷新,再发 `agent-ui:custom-model-deleted` 并关闭。失败 toast,弹窗保留。表单层没有证明删除选中运行模型后的内核行为 |
|
||||
|
||||
表单 runtime bridge 是 `adapter-context` 提供的 adapter(保存/测试/读取),删除走 `wb-singleton` 的 models facade。已有 `workbuddy-provider` 将 save/test/list 交给 daemonClient 对应方法;当前证据仅证明客户端调用,不证明 daemon 内部 OpenAI/Responses/其他协议构造。YCode 无需调用这些原版服务,但自己的接口必须覆盖这些生命周期状态,并把选择实接用户上游/OMP。
|
||||
|
||||
## 建议采集与验收矩阵
|
||||
|
||||
每行应同时留原版 REA 截图/布局/交互证据和 YCode 相同输入证据;光暗主题、相同窗口和字号是对比条件。危险或联网状态可先用隔离用户上游和本地测试 fixture 验证 YCode,不改原版真实密钥或发送真实消耗请求。
|
||||
|
||||
| 组 | 必采/必验状态 | YCode 行为判据 |
|
||||
| --- | --- | --- |
|
||||
| 首页进入 | 从已有任务点新建;重复点击;初次启动无任务 | 首次发送前是否创建记录按原版实测定稿;不会不断堆积空会话;既有运行不会被误停止 |
|
||||
| 首页草稿 | 输入后导航返回;场景切换;切回;重启恢复;附件选取未完成时切走 | 与原版相同保留/清理范围;不会把 A 的附件/草稿挂到 B |
|
||||
| 首页布局 | 三场景及各展开子项;推荐有/无;窄窗口;长中文路径/长模型名;空输入和多行输入 | 原版组件结构、尺寸、字体、间距、滚动区域、图标及焦点表现逐状态对照 |
|
||||
| 创建 | 空/纯文本/附件;Enter/Shift+Enter/IME;快速重复提交;创建中;创建失败重试 | 一次操作一次创建;失败保留可重试输入;错误、禁用、loading 与原版一致 |
|
||||
| 任务配置 | 本地 cwd 选取/取消/不存在;mode/permission 选择;有/无模型 | 首轮真实使用提交时配置快照;与其他任务隔离,重启仍可还原 |
|
||||
| 模型入口 | 下拉关闭/打开;零个/一个/多个自定义模型;选中/悬停/键盘;进入新建/编辑 | 选择项与实际使用的 provider/model 一致;新任务和已有任务选择范围明确 |
|
||||
| 添加表单 | 默认 provider;custom provider;auth none/apiKey;模型选择/手填;高级显示/隐藏;推理条件字段 | 按原版字段条件和默认值显示,不把服务端模型写死为本地假项 |
|
||||
| 校验 | 必填空白;重复 ID 覆盖/取消;非法 URL;key 空白/非法字符;输入/输出 token 边界;能力组合;取消未保存 | 按已知校验顺序和数据结果验证;未声明的 token 服务层约束单独采证,不用自造规则代替原版 |
|
||||
| 编辑/删除 | 编辑已配置 key;清空 key 后提交;切换密码显示/遮罩;删除确认/取消;删除选中模型 | 编辑与密钥处理按原版可见行为设计并保护采集数据;引用被删除时行为待实测定稿,错误不静默 |
|
||||
| 连接测试 | 未填/就绪/测试中/成功/鉴权失败/超时/不可达/重复点击 | 测试走选定用户上游;状态可取消/重试,输入与执行目标一致,不误保存 |
|
||||
| 持久与运行 | 新增重启;编辑后重启;首轮/后续轮选择;运行中切换;回退内核 | UI、持久 ID、OMP/native provider 请求均一致;重建/切换不丢已有上下文 |
|
||||
|
||||
原版下一轮采集至少需要:首页本地目标(不会真实发送)、场景切换、目录 picker、模型 selector,以及设置新建/provider 切换/高级条件/删除确认。模型列表已有单状态画面,模型主体 JS/CSS 已补齐;后续采集聚焦各状态,而非继续停留在获取这两份正文。编辑、校验与网络失败可优先用隔离模型数据/假上游回归 YCode。账号/企业限制分支不等于用户范围内的自定义 API 能力,不能从代码里看到分支就要求用户接入原版后端。
|
||||
|
||||
## 实施依赖和拆分建议
|
||||
|
||||
以下是模块依赖,整体架构和排期由主上下文决策。
|
||||
|
||||
1. ModelsSettingsPanel 源码/CSS 已固定;补齐可复现首页/模型各状态画面、所用 selector 控件/弹窗依赖与运行时协议证据。
|
||||
2. 明确新任务草稿与已创建会话的边界,任务的 model/cwd/mode 绑定及旧会话迁移策略。此项同时影响空间和右侧栏,应由主上下文统筹。
|
||||
3. 自定义模型本地 CRUD、密钥和连接测试 IPC;模型 UI 与原版 selector/设置布局并行实现需要共享稳定数据契约。
|
||||
4. 将选择接入 OMP;说明运行中的切换时机/内核复用规则,验证多轮及重启。不能把旧网关表单改名后作为模型添加完成。
|
||||
5. 恢复首页输入 provider、场景与创建状态,再做完整状态回归和逐画面像素/动效对比。
|
||||
|
||||
可明确拆为“证据补全、任务草稿/配置、模型数据与 IPC、模型设置与 picker、OMP 选择贯通、首页交互、双端验收”七个有独立产出的工作包;其中数据契约和内核接入是实质依赖。当前证据不足以给精确工时或可信百分比。
|
||||
|
||||
## 本次检查结果及限制
|
||||
|
||||
- 修改文件:仅本文。
|
||||
- 检查方式:读取 YCode 源码;对保存 REA JSON 的目标 source 做关键词检索和 Babel AST 函数边界检查;使用 Node crypto 计算上述选中正文 SHA-256,与固定 manifest 中 CSS 身份对应。
|
||||
- 没有修改生产代码,未运行构建或测试;本次不是功能验收。
|
||||
- 已分析主上下文新增的原版模型列表运行时画面和表单完整 lazy JS/CSS;表单字段/校验/覆盖确认/测试与删除客户端流程已明确。网络请求协议、服务层 token 约束、删除选中模型行为、运行中模型切换、首页重复点击/重启细节仍待采证据。
|
||||
- OMP 自定义协议与原版 useCustomProtocol 等效性需单独确认;用户自己的上游可替代服务来源,但不可声称所有协议/能力组合已经等价。
|
||||
Reference in new issue
Block a user