Files
ycode/docs/assessment-experts-2026-10-16.md

24 KiB
Raw Permalink Blame History

WorkBuddy 专家:源码评估与实现拆分(2026-10-16)

本轮仅评估,未改生产、未安装或启用专家、未向原版发送消息。所有原版输入均为 REA 已保存记录,补采安装包文本使用 REA public export-selected-artifact-text 并固定 ASAR SHA。未使用历史 CDP 文档作证。

结论:专家页面及选择菜单有足够源码可做严格恢复;真正的专家能力涉及插件包、会话绑定、依赖连接和对话驱动创建,当前证据不足以把它缩成一张 prompt CRUD 表。 创建/编辑入口在原版注入 expert-manager 技能及提示词并返回首页;本地 daemon 的包处理与实际 agent 执行仍需补证。云端商店、分享、购买及同步有独立服务依赖。

证据与身份

目标版本 WorkBuddy 5.8.2,根 ASAR SHA-256: 035254bc76310ea46317433e4840602094543ef323d2d5c5aff7c131729de918。

版本依据:REA ev_2caae424199a38371af743ef9111db835504c2dae54c1f02e1f9e5511032cc6b 中 package.json,SHA a295ae602e936abda5ae45f7a5c21fc481014989d2cf369182d3ce5d9dd400c2,name=@genie/workbuddy-desktop、version=5.8.2、main=main/index.js。

下表缩写用于后文逐项定位。JS/CSS offset 为 UTF-16 字符索引、end exclusive,不是字节偏移。全文 SHA 以 UTF-8 计算;函数/赋值源体另有 SHA,见 .tmp/experts-source-audit.json。表中所有源码事实均属于此固定版本;静态代码存在不等于分支已执行。

引用 文件 全文 SHA-256 REA Evidence
C renderer/assets/contexts-BMeWSUHk.js 5f35b7489b107e21ef452c8ee88a95265756f6fc444841eef869228bbc44768b R
P renderer/assets/workbuddy-provider-DkH2YFYM.js b588e875c469978f216beec86bdf4b6c33a31c0266f9bf996881b8dbf37b5dc7 R
W renderer/assets/wb-CocRQn4C.js d9ddb5d5464f2d863659a01493b58220bb5a0e270c22b16f405cfaeab2a7a972 R
I renderer/assets/wb-input-add-B045GnIg.js 7842fa4321d5351bf6c822bbd0253e0d6d6e68cc9cfae3f2470b3d493c23daf4 R
M renderer/assets/main-content-core-Dlaq72qt.js 998ada4969d1bf7af8d2dace15c0bc2a3ca5bf0ee9cf941823d85a66d6967991 R
S renderer/assets/services-Dzvfe5BC.js fb5344ad7a525593e4fde494997539a148a0ea7233dd09ede96ab206b178fc57 R
T renderer/assets/runtime-B7PLES2V.js b944fdfed0d52ca4c588833f94f50f878169a9244c05ed186abfa4eb37957911 R
U renderer/assets/expert-url-entry-coordinator-DDSbvr4R.js 34788957ae698799b6863d2d183c3a7d22b4dd08d4fc646ace656d766e86455f R
B renderer/assets/expert-install-intent-buffer-EAdFw3P1.js bda5eca334cc2a713b1bab0fe8119a21000b104d834deb11647641050814b8ae R
CSS renderer/assets/contexts-BkjwYSZT.css 50cbd673f7f35fc7f966bdddc6c9f5677fdfe944cb904888d214619fca259380 ev_377c8790468b3c67dad8577aabb327f98d3140659f0fffdbabfcff5a40cc9e94
MAIN main/index.js 6cc9d3079aca910b7c14c37a0a3b6f6af03f2b319d5625625926dbf5ad61aec8 ev_3de1f34ca809cd2e4f98dfac960b1913db75e43cd88957d3e4f82b3b16f47fbf

R = ev_717fa5e846e64d67ac19c8925d121bff632c0d3aefb3603b10858559cabb2dcb,保存于 .tmp/rea-runtime-scripts.json,本轮 339/339 正文 SHA 匹配。Root 新采 .tmp/rea-expert-runtime-scripts-20261016.json,Evidence ev_e91787b1d4dea651582c6cf12827775b9068b0ee8b80c68ba08d4c1d87d94e90,329/329 正文 SHA 匹配;以上相关同名模块 SHA 未变。

补采 MAIN 与其已引用 main/host.js、main/workbuddy-packaged-runtime.js、main/bridge.js、main/workbuddy-paths.js,使用 public REA root pin。四个补充文件 Evidence ev_4b2ecb341891999360045418cacfa9a51cd7bd4185d370f6766dc4cb4713b653;每项 SHA 及长度保存在 audit 的 supplementary。本轮没有声称搜索完整 daemon/CLI 文件树。

1. 页面、列表与详情

源码观察 精确依据 实施含义 / 尚未验证
ExpertCenter 管理 center / 我的专家子页、搜索、专家/专家团、builtin/enterprise 来源、reco/popular/newest 排序、详情选择;窄布局条件 0 < screenWidth < 980 C ExpertCenter [3876908,3886115);源体 SHA aa152a80d85870f456cad1c9d53383696a637c597ded7128ce9bd55458312f67 可恢复同一页面状态机;980 临界值尚无本轮窄屏原版验收
页面依赖布局配置与 feature flags;布局 tabs 从 expert/expert_group/enterprise_expert 映射,并按 position 排序去重 C resolveExpertPageLayoutTabs [3568360,3568681)、useExpertPageLayout [3567807,3568197) 不能把当前账号看到的 tabs/分类/推广数据写死成全量规格
列表卡可展示头像、职业、描述、标签、作者/版本/使用量、付费/购买状态、云同步徽标;支持 selectable、disabled、footer、额外内容等 props C ExpertCard$1 [3531248,3540077),SHA a5fc885e829f97854a6cbbf6b0cfbcab21e6f2c7cd0f2581b5f911b662f019e3;纯字段辅助函数 [3525615,3527802) 可恢复 DOM/图标/CSS;购买规则与遥测通过明确 host adapter,不能伪称已有支付
详情提供头像/角色、简介、标签、metadata、快捷提示词、相关案例、团队成员与召唤动作 C ExpertDetailContent [3826056,3833750),SHA 6edf5d32b8ecba712593611f13ea8d763d9659551d2db060d8dab2fb7428eb56;ExpertDetailMetadata [3821706,3823592) 原 props:{expert,resolveAvatarUrl,onClose,onSummon,onCaseClick,onRefreshExperts};详情与召唤/购买控制需拆开适配
我的专家分专家/专家团;过滤、空态、编辑/删除、逐个/批量云上传、下载及云端删除 C CreatedExpertsPanel [3845690,3851495),SHA 73d81b6f1c3205fa1b8c67639fa821af60f0b29d236be4d2260406a75f579e47;CreatedExpertCard [3836312,3843963) “我的专家”包含本地与云状态;不是另一个固定 marketplace 列表
搜索当前 locale 的 name/displayName/profession/description/displayDescription,忽略大小写,含空格关键字也尝试去空格 C filterExpertsByKeyword [3527461,3527802) 及相邻纯函数;I useExpertSearch [38275,39285) 页面本地过滤与 picker 的跨目录搜索不同,不宜共用一个简化 includes 全部替代

Root 已保存原版专家首页真实画面和计算布局: .tmp/rea-expert-entry-static-20261016/{workbuddy.png,layout.json},Evidence ev_20de2f04c99b1c27bc39b61f5e2f5a430c3c7029b09afb76b363652eb4fadc89。 PNG SHA e49ce30072a11898f3114b73dd3b941fe93fc0da46eee6fb15cb765635c5591a 已核验;视口 1336×901。这里只读取该 REA 记录,没有本子任务新操作原版。

已观察几何:node783 .expert-center-page 为 [284.28125,30,1051.703125,871];node786 topbar 高64;node826 起推广卡264×202、间隔16,DOM 实际有10张,首屏可见区域涉及前4张,不能把“4张可见”当总数;node1115/1147起常规卡宽319.234375、高156,三列、横距16。此截图只是一个账号/浅色/宽度/数据态,尚不证明暗色、hover、详情、我的专家、错误/加载、长文本或全响应式像素一致。

对应可直接恢复的 CSS:CSS offset811600 .\_page_1yu3o_7 定义 gutter24、主题背景/文字与布局;733774 .\_card_1hdcm_2;735217 .\_centerCard_1hdcm_60 定义中心卡156px;765443 list row/tabs/sort;730341 分类横向拖动滚动条;722717 我的专家空态。须保留上下文主题 token、keyframes、媒体条件、module class mapping;抽出几条颜色/字号不足以验收 1:1。

2. 数据模型(观察到的 renderer 契约,不冒称持久化 schema)

层 已观察字段 / 枚举 源码依据
商店原始条目 → 专家展示数据 marketExpertId/sourceId/categoryId,name/displayName/profession/description 多语言,avatar,plugin/version/downloadUrl,defaultInitPrompt/quickPrompts/tags,expertType,useCount/author/developer,members/leader,visibility/source/namespace,payMode/payDetail,createdAt/updatedAt/isCloud/isInCloud W mapMarketItemToExpertInfo [108592,110484),SHA 30fecc1b1838880639efd68cf31f494ac14691d6ce5e2ab4eb104bc4b1edbc0b
picker / 输入区选择项 id/name/profession/avatarUrl,defaultInitPrompt,pluginName/updatedAt,expertType=`agent skill
运行时已激活选择 还含 prompt、localPath、pluginRegisteredName、summonTimestamp/reliability、assistantDisplayName/assistantProfession/assistantAvatarUrl、teamMembers P hydrateSelectedExpertForRuntime [431496,433326);resolveCustomExpertRootDir [39581,39733) 仅接受自定义来源
可持久化运行时身份字符串 expert-v2: + JSON {v:2,kind:'expert',expertId,marketExpertId?,pluginRegisteredName?,agentName?,source?};source 仅 builtin/enterprise/custom;官方 market ID 检查 ^ex_[A-Za-z0-9-]+$ C [847880,850063),createExpertRuntimeIdentity [848557,849001);prefix850082
会话助理显示快照 source=expert,name/profession/avatarUrl/expertId/expertType/isCloud/resolution/identityKey/identityVariant C buildExpertAssistantDisplaySnapshot [3906431,3907161)
云同步展示状态 presence 可为 local_only/cloud_only/both/local_ahead/cloud_ahead;cloudStatus checking/ready 等;cloudUid/cloud/syncReason/invalidLocal 参与 UI 与传输判定 C 云徽标3523524附近、CreatedExpertsPanel3845690、ensureExpertReadyForTransport [3955051,3956226)

注意:W 把远端 source:'custom' 条目映射为 enterprise,不能直接等同“本机自建专家”。本机判断采用 marketplace:'my-experts' 或 isCustomExpert:true(C847880、P39489)。包内部 plugin manifest、AGENT/prompt 文件格式、索引路径、同名覆盖/版本升级细则及实际持久化迁移,本轮尚未取得 handler,仍未知。

3. 创建、编辑、发现新专家

观察:C [926000,927450) 定义 expert-manager、默认创建提示、编辑指定 ID 提示和创建专家团提示。buildCreateExpertModeBlocks [3863507,3863752) 返回 skill block 加 text block;useMyExperts [3863923,3867901) 的 create/edit 均 navigation.goHome() 后发布输入草稿。C880431附近的公开 wb.experts.create 也是 session.prepare {skill:{name:'expert-manager',displayText:'创建专家'},editExpert?:{id}}。

观察:M useExpertCreationDetector [32571,37974) 检测 createdBySession,维护按会话的 created experts 索引,刷新专家预览并切右侧 expert 视图,然后调用 custom.clearSessionMarker;custom 列表/插件文件变化订阅由 P580293之后转交 daemon watch-path 与 file-change API。

推断 / 边界:原版设计是对话驱动写入/更新专家包,再通过发现事件反映到 UI;可真实复现入口与草稿,却不能仅把“创建成功”Toast 或一个自建 prompt JSON 当作已复刻创建流程。expert-manager 技能正文、写包工具、session marker 格式与 agent 执行方式是本地创建下一步所需证据。当前未安装/运行该技能,没有验证它实际生成哪些文件。

4. 导入、安装、分享与深链

已观察流程 源码定位 仍依赖 / 未验证
分享导入先取 share detail 首个 inode,再 verifyShare 得到访问资料,构建下载 URL;调用 experts.import.fromUrl({downloadUrl,expertName,overwrite,securityCheck:true}) S useExpertImportConfirm [12813,16585),SHA 15d186da0713d48a70d47034625c3a0b17ffac75ec44fd25bd4e3a9b515ffed0 分享/鉴权是服务依赖,本轮未发下载请求
处理 duplicate_expert:若非当前用户拥有,记入我的专家;若拥有,要求覆盖确认,再重试安装 同上;S19207之后 checked-path 安装分支 “重复即覆盖”不是原版流程;覆盖实际磁盘语义待 handler
security_check_blocked 返回 preCheck/selectedPath/md5/scanResult;轮询扫描,非高风险自动继续、跳过及风险确认有专门 modal;本地 checked-path 走 fromPath({zipPath,expertName,overwrite}) S12813/19207;P625748之后 installExpertFromUrl/Path 有安全服务 appKey/扫描结果依赖;本地 scanner 与包路径校验实现尚未恢复
URL expertId 只消费一次并从地址栏删掉;get专家存在则 summon;不存在而 resolver 有提示词则回首页填草稿 U consumeExpertIdFromUrl [508,882)、ExpertUrlEntryCoordinator [953,1885) __wbExpertPromptResolver 是 host 注册的全局 holder,不等于专家 API 文本全部内置
安装意图需要 expertName/shareCode,保存一个 pending intent;订阅时消费并向监听器交付 B setPendingExpertInstallIntent [145,345) / subscribePendingExpertInstallIntent [345,522),函数 SHA见 audit 可以原体恢复缓冲逻辑;不代表导入已经成功

5. 选择与发送消息绑定

源码事实 精确依据 YCode 需要真实连接的部分
本地选择会 experts.summon,传 expertId/sessionId/source/locale/marketExpertId/updatedAt/applicationId;有竞态代次、重复请求复用、500ms提示及失败回滚;云 transport 走不同分支 C useExpertSummon [3951518,3954856),SHA e891982347cd938912d18ae4dc3614251180a87359f39658d28c5beedb52f610 会话和草稿选择作用域必须隔离;不能只改变 chip 文本
summon 激活结果可含 expertType/agentName/localPath/pluginRegisteredName;无 legacy prompt 时尝试激活插件;既无 prompt 也无激活信息会报不可用 P getExpert [609114,610423)、activateExpertPlugin [618015,618502)、hydrateSelectedExpertForRuntime [431496,433326) 本地插件执行/启停需要能力适配;OMP 当前可用不证明其与原插件机制等价
bind会话设置 expertId 及 locale/marketplace/marketExpertId/expertType/source/runtimeIdentity/assistantDisplay,且模式改为 craft;返回原会话保留既有输入并抑制默认提示 C bindExpertToConversation [3907799,3908569)、returnExpertToConversation [3908569,3909521) SessionConfig 持久化、历史恢复、助理头像/身份快照都需接入
发送前保存 recent;cached prompt 排除等于 defaultInitPrompt 的值;无指令时重试插件激活,仍不可用清除无效绑定;最终 _meta['codebuddy.ai'] 含 expertId、可选 expert prompt、tags:['expert:…']、assistantDisplay M [225000,229900) 默认开场提示不是专家系统指令;不应直接把输入模板当专家 prompt
会话切换插件单独请求 disablePluginName/enablePluginName/agentName/sourcePluginId,可携内部 model 请求 headers;选择更新串行并同步 launch config;失败回滚 P setSelectedExpertForSessionInternal [612975,614938)、switchExpertPluginForSession [618762,619301) 原插件启停与用户模型 headers 的桥接需另证,不能复制 WorkBuddy 私有请求信息
专家声明 dependencies;requirements API可返回 connector/MCP,分别连接、修复、token字段、授权打开外部页与等待状态 C connectExpertDependency [3934992,3936890)、useExpertDependencyGate [3938212,3946396) 不能把 dependencybar 接成功 mock;本轮未连接任何服务

以上发送 metadata 是原版 renderer 构造事实,不是已验证服务器如何消费该 metadata。原版团队专家/子代理编排也未由此证明;团队成员展示可恢复,执行调度另列未知。

6. 本地与云、host API

本地与云的选择并非只有 isCloud 一个布尔值。 C createExpertApi [3560992,3562607) 可选 default 或 cloud-in-local scope;picker 根据 transport 选择 wb.experts / wb.cloud.experts(C3957662)。本地使用 cloud_only 专家先下载;云会话使用 local_only 专家先上传,conflict_local_wins 要求覆盖确认;checking 中取消;源纯函数 ensureExpertReadyForTransport [3955051,3956226) 可恢复,实际 upload/download 是外部宿主接口。

本机 custom.list 是本地专家入口,启用云同步时可能改 cloudSync.list,NOT_SUPPORTED/NOT_READY 可回退(C useLocalExperts [3862148,3863357))。云上传处理 confirmation_required/preflight_blocked/quota_blocked、批量 succeeded/failed/skipped;删除本机专家与删除 cloudUid 是不同动作(C3863923)。商店发布资料、推广布局、企业可见性、付费权益、分享和云同步都可能受账号/产品配置影响。

T8991起定义 expert IPC,T29132附近绑定 invoke;P 转给 getDaemonClientFeature。已证实 renderer/daemon 契约:

类别 通道 / 接口
目录 expert:init/getCategories/getExperts/getFeaturedScenes/getExpert/getAgentTemplates/getUseRequirements/refresh,expert:loadStateChanged
激活 expert:activatePlugin/deactivatePlugin/getActivePlugins/switchPluginForSession
包与导入 expert:exportZip/importFromUrl/installFromPath/previewFromUrl/preCheckShare/queryShareSecurityScan
本地自建 expert:scanCustomExperts/getCustomExpert/deleteCustomExpert/addUserExperts/clearCustomExpertSessionMarker;localExpertsGetWatchPath/localExpertsGetPluginJsonPath
历史 expert-history:getRecent/add/remove/clear
同步 expert:cloudSyncList/cloudSyncCheckUploadQuota/cloudSyncUpload/cloudSyncUploadMany/cloudSyncDownload/cloudSyncDeleteCloud

具体参数已在前文函数定位可读。新增审计输出保留 import binding graph,便于下一轮从确切 exported symbol 接口恢复;本轮不假造 TS 原类型或 IPC handler 实现。

MAIN 静态入口与已引用补采文件没有提供上述 expert handler 定义;这是所查文件范围的负结果,不是说安装包不含实现。下一步应由 REA 包清单/模块图定位 daemon 注册点和 expert-manager bundled skill,定向补 exact paths;不得猜路径后自行读原包,或用直接 CDP/手写提取器替代 REA。

7. 可复用源码与真实依赖边界

恢复单元 可直接恢复的原体 必须明确替换的宿主依赖
纯数据/展示 normalizeExpertToMenuItem、去重、locale字段选择、title/version/useCount/tags/search、runtimeIdentity生成读取、云传输分支判定 URL/avatar resolver、locale 与 feature输入;这些纯函数不需要 WorkBuddy 云服务才能测试
基础页面 ExpertCenterContainer、card/avatar、category/source/sort tabs、searchbar、empty/skeleton、CreatedExpertsPanel、detail/quickprompt;同名 CSS module maps 与 SVG React/JSX singleton、原按钮/tooltip/dialog/scroll primitives、主题/字号、i18n、account/产品flag;不能直接加载7.5MB contexts而把其全局 app/provider 初始化也执行
有状态 hooks useLocalExperts、useMyExperts、useExpertDirectory、useExpertPinState、useExpertSummon、useExpertTransfer、创建检测、URL/buffer协调 YCode registry/session/navigation/events、atomic本地持久化、真实列表/安装/执行结果;toast/telemetry应显式适配
导入/依赖 可恢复导入/覆盖/安全确认 modal 与状态机,dependencybar UI ZIP读写/路径约束、下载/安全扫描、文件监控、MCP授权与连接;服务可用性要明确表达
云商业功能 已有源码可说明 upload/download/share/pay/quota 展示和请求契约 云后端与账号/权益,不在本轮恢复或替换;不能用本地假成功冒充

真实已见模块依赖是同包 react-z__Ncn__.js、jsx-runtime-DM1VED__.js、rolldown-runtime-BJCASTsb.js、contexts、module-host-context、provider/adapter/runtime,以及 CSS token/图片资源。没有本轮证据支持为“专家”安装一个新的第三方专家 SDK;也没有确证原 React npm semver或本地插件/skill包的 schema/version。依赖表记录实际 module path,不猜 npm 版本。

8. YCode 实施建议(候选拆分,主上下文决定架构)

YCode 当前 src/renderer/src/mock.ts:90 的 experts 为 implemented:false,Sidebar.tsx 只有导航图标;共享词典含部分专家文案不等于页面/宿主已实现。src/main/src/shared 本轮搜索未见专家 CRUD 主进程接口。以下按可验收模块拆分,避免先铺一套无法执行的空壳。

  1. 固定页面证据及纯源恢复:恢复卡片、tabs、分类、排序、详情/我的专家空态与 CSS/图标。验收同视口/主题/字体、搜索/长名/加载/错误、980临界和hover;商店数据暂作为明确的 REA 离线fixture,不能标真实已安装。Root 正在独立补我的专家和详情只读样本。
  2. 本地包模型与 registry:先补 daemon/skill证据,确定 manifest、prompt/agents/skills/connector依赖、用户索引、createdBySession、ZIP安全和覆盖语义,再实现 YCode 自有 host + focused真实临时目录测试。普通prompt型专家、plugin/agent/skill/team要按真实能力区分。
  3. 选择、会话与发送:接 draft/会话 expert selection、recents/pins、runtime identity、assistantDisplay、craft模式与默认prompt草稿;接真实指令加载/能力校验、切换清理、重启恢复。实际 OMP 请求/工具行为验证后才能宣称可使用专家。
  4. 对话创建/编辑闭环:恢复expert-manager入口和草稿,接本地真实管理工具/能力,发现marker和filechange后打开专家预览;以真实磁盘产物、编辑更新、取消/失败/重启验收,不能以点击入口代替完成。
  5. 导入导出与依赖:真实ZIP/路径/重复安装/错误/取消/清理,再接MCP依赖授权;根据所恢复实现表达安全检查的真实能力。
  6. 云功能单独验收:目录服务、同步/配额/分享/付费与账号后端另接;用户此前云端与子代理暂后要求下,不妨碍本地页面和可真实工作的本地子集先做,但全功能1:1仍保留在差距表。

9. 未知与所需新证据

  • 本地 daemon handler / expert-manager技能 / 包schema:REA模块清单与精确导出路径;优先 expertScanCustomExperts、expertActivatePlugin、expertInstallFromPath、expertSwitchPluginForSession、exportZip注册函数以及 bundled expert-manager 的 SKILL.md/工具依赖。当前 renderer 可知参数,无法代替磁盘及执行语义。
  • 实际创建/编辑/安装闭环:后续得到明确测试授权再做受控原版 REA scenario;本轮只读,没有修改原版。需要原始产物manifest、变化事件、取消/错误/覆盖的执行证据;不能单凭静态入口断言创建工具已可移植。
  • 详情/我的专家/暗色/窄屏/hover等视觉态:Root 的后续 REA采样;当前仅首页宽屏浅色静态样本。动态市场图片/列表排序不是包内固定CSS的替代品。
  • 云端语义与服务替代:哪些资源属于内置可离线、企业权限、市场manifest、账号云同步、扫描、付费、分享;本轮没有访问这些服务。私有后端源码不因客户端请求契约存在而被恢复。
  • 专家团执行/子代理等价:显示 members/leader 和expertType已证,运行调度及各模型工具兼容未验。不可把多头像/UI字段当实际协同完成。

验证与交接

新增 scripts/audit-experts-source.mjs 只读已导出的 REA JSON;所有读取正文先校验 SHA,选中模块用 Babel AST 记录函数/赋值的范围、源体 SHA及 imports,不执行原应用。默认生成 .tmp/experts-source-audit.json,输出有界文件摘要;node scripts/audit-experts-source.mjs contexts-BMe getCustomExpert 可查有界源码片段。

本轮 node scripts/audit-experts-source.mjs PASS:339旧脚本、329当前脚本、5个 publicREA补采文本、专家CSS和首页PNG均身份匹配。node --check scripts/audit-experts-source.mjs PASS。未修改 production,无需 build/产品测试;没有把静态审计当运行验收。

本轮文件:本评估、独立audit脚本;.tmp/experts-{audit-inventory,source-audit}.json、.tmp/rea-experts-{main,host}-evidence.json。Root 新采runtime/首页是Root证据,本子任务只读。后续实现须由主上下文决定架构与执行顺序。