You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
自定义 Agent Preset 的 name/description 无法随界面语言本地化
问题
DSH 的 Web UI 支持中英文切换,内置的四个 Agent Preset(目录名/id 为
standard/code/minimal/cordis,其中cordis的显示名为 "Creator mode" / "创造模式",并非单独存在一个creatorpreset)的显示名称和描述会随当前界面语言自动切换。但据当前代码,自定义(trust: 'user')或未知内置(trust: 'system'但 id 不在硬编码表里)的 preset,其名称和描述只会显示preset.yml里的原始字符串,不会随语言切换。机制(据当前 master HEAD 复核)
预设名的本地化解析没有走 DSH 可扩展的
ctx.locale注册表,而是走一个模块私有、硬编码的纯函数。以下是复核到的关键代码位置:1. 映射表是模块私有常量,仅收四个固定 ID
packages/client/ui-agent-preset/src/client/locales.ts第 169-174 行:export,外部无法引用。BUILT_IN_PRESET_KEYS,仅出现在locales.ts本身和测试文件中,未发现外部引用点或扩展入口。2. 解析函数对
trust: 'user'短路,直接跳过字典同文件第 182-192 行,
presetDisplayText()是负责解析预设显示文案的函数,被 5 个 React 组件直接 import 调用(AgentPresetSeat/AgentPresetRow/AgentPresetLabel/PresetMenu/AgentPresetSection):即便是
trust: 'system'的 preset,只要 id 不在硬编码表里(例如deployment-extra),也会回退到文件原文。3.
presetDisplayText是纯函数,未发现拦截点该函数接收
(preset, t),不接收ctx。t虽绑定到settings.agentPreset命名空间,但函数只查映射表里硬编码的那几个 key。我做了仓库内搜索(关键词覆盖BUILT_IN_PRESET_KEYS、presetDisplayText、preset.*locale、name_zh/name_en、localiz.*preset等),未发现任何 slot、event、hook 允许第三方插件介入此解析路径。4. 服务端
preset.yml也不支持多语言packages/preset/agent-presets/src/metadata.ts第 28-39 行,PresetMetadata接口仅含name(string)、description(string)、order(number)三个扁平字段,无name_zh/name_en/i18n之类字段,服务端也不做 locale 解析。5. 此行为被测试显式锁定
packages/client/ui-agent-preset/tests/locales.client.spec.ts第 23-32 行,测试名 "keeps file metadata for user and unknown system presets":也就是说,这更像是当前有意的设计选择,而非疏忽。但
ui-agent-preset/README.md的 "Known Limitations and Deferred Work"(第 67-71 行)列出的三条限制中,并未提及自定义 preset 无法本地化这一点。6. locale 注册表本身是可扩展的
packages/client/locale/src/client/index.ts第 244 行,ctx.locale.register<N>(ns, dicts)确实允许任何插件注册命名空间字典(通过LocaleNamespaceMap声明合并),文档明确说"Registration bumps the revision so mounted outlets pick up late-arriving dictionaries"。ui-agent-preset自己也在index.ts:66注册了settings.agentPreset命名空间。也就是说,注册表层是开放的,但预设名的解析没有走它——这是我判断"可扩展但未接入"的依据。
影响
preset.yml里写的那一种语言。ui-agent-preset客户端插件,但这与 DSH "一切皆插件、扩展而非替换"的设计取向不太一致。建议方向(供讨论)
将
BUILT_IN_PRESET_KEYS从模块私有常量改为可注册的运行时映射,让任何插件都能贡献presetId → localeKey并注册对应字典条目。轻量方案
export一个registerPresetLocaleKeys(id, keys)函数,内部维护运行时Map(替代BUILT_IN_PRESET_KEYS常量)。preset.yml原文(去掉对trust的硬限制,或改为仅作 fallback 优先级)。apply(ctx)里调用registerPresetLocaleKeys('my-agent', { name: 'presetMyAgentName', description: 'presetMyAgentDescription' }),再通过ctx.locale.register('settings.agentPreset', { zh: { presetMyAgentName: '...', presetMyAgentDescription: '...' }, en: { ... } })注册翻译。locales.client.spec.ts:把 "keeps file metadata for user" 的 case 调整为 "未注册则回退",并新增 "注册后走字典" 的 case。更彻底的方案(匹配 DSH Capability Seam 模式)
定义
PresetDisplayResolverservice definition,让presetDisplayText改为查ctx上的这个服务(多 provider 按优先级合并),与ShellService/DirectoryPicker的设计一致。改动面更大,仅作备选。复现步骤
standard到$DSH_HOME/.agent-presets/my-agent/preset.yml:name: My Agent/description: A custom presetstandard显示为"标准模式",但my-agent仍显示My Agent环境信息
deepseek-ai/deepseek-harnessmaster,复核时 HEAD 为141eb6f(Merge PR Harness的极简模式当前没有记忆处理,是自己添加吗? #2783,release/dsh-0.1.0-rc.8)packages/client/ui-agent-preset/src/client/locales.ts(第 169-192 行)packages/client/ui-agent-preset/src/client/index.ts(第 66 行,注册settings.agentPreset命名空间)packages/preset/agent-presets/src/metadata.ts(第 28-39 行,preset.yml单语扁平字段)packages/client/locale/src/client/index.ts(第 244 行,ctx.locale.register签名,本身可扩展)packages/client/ui-agent-preset/tests/locales.client.spec.ts(第 23-32 行,行为被测试锁定)复核范围与局限
以上结论基于对 master 分支 commit
141eb6f的全仓库代码搜索和文件通读。搜索关键词覆盖了BUILT_IN_PRESET_KEYS、presetDisplayText、preset.*locale、name_zh/name_en、localiz.*preset等,但搜索模式有限,不能完全排除存在我未覆盖的间接扩展路径(例如某个未命中的 patch 机制或运行时注入点)。如维护者知晓其他介入方式,欢迎指正。All reactions