diff --git a/apps/web/tests/snapshots/settings-chrome/dialog.expected.md b/apps/web/tests/snapshots/settings-chrome/dialog.expected.md index aa69a337cb..cf87f5acbd 100644 --- a/apps/web/tests/snapshots/settings-chrome/dialog.expected.md +++ b/apps/web/tests/snapshots/settings-chrome/dialog.expected.md @@ -14,9 +14,9 @@ - button "关闭": - img - text: 关闭 - - text: Agent 预设 对此后新建的会话生效。运行中的会话保持它开始时的 preset。 - - button "standard": - - text: standard + - text: Agent 预设 对此后新建的会话生效。运行中的会话保持它开始时的预设。 + - button "标准模式": + - text: 标准模式 - img - text: 权限 选择新会话的默认权限模式 - button "Workspace Write": diff --git a/packages/client/ui-agent-preset/src/client/AgentPresetRow.tsx b/packages/client/ui-agent-preset/src/client/AgentPresetRow.tsx index 492f593134..178c2a6ada 100644 --- a/packages/client/ui-agent-preset/src/client/AgentPresetRow.tsx +++ b/packages/client/ui-agent-preset/src/client/AgentPresetRow.tsx @@ -52,7 +52,12 @@ export function AgentPresetRow({ load, select, useAgentPreset, t }: AgentPresetR // every session shares the host composition — the row simply does not exist. if (state.status === 'unavailable') return null const busy = state.status === 'loading' || state.status === 'saving' - const label = state.currentValue === '' ? t('loading') : state.currentValue + // The metadata name is what every other surface shows — the new-session chip, + // the session header, the preset cards — so this row shows it too; the id is + // the addressing, not the label. A preset that names itself nothing falls + // back to its id, which is then all there is to say about it. + const chosen = state.options.find(option => option.id === state.currentValue) + const label = state.currentValue === '' ? t('loading') : (chosen?.name ?? state.currentValue) const description: string = state.error ?? t('description') return ( @@ -69,7 +74,9 @@ export function AgentPresetRow({ load, select, useAgentPreset, t }: AgentPresetR // every preset as shipped and vetted. items={state.options.map(option => ({ id: option.id, - label: option.trust === 'user' ? `${option.id} · ${t('userTrust')}` : option.id, + label: option.trust === 'user' + ? `${option.name ?? option.id} · ${t('userTrust')}` + : option.name ?? option.id, }))} selectedId={state.currentValue} onSelect={(id) => { diff --git a/packages/client/ui-agent-preset/src/client/locales.ts b/packages/client/ui-agent-preset/src/client/locales.ts index 1b4d940e44..e3aab04f84 100644 --- a/packages/client/ui-agent-preset/src/client/locales.ts +++ b/packages/client/ui-agent-preset/src/client/locales.ts @@ -64,7 +64,7 @@ export const en: Record = { /** Simplified Chinese copy. */ export const zh: Record = { title: 'Agent 预设', - description: '对此后新建的会话生效。运行中的会话保持它开始时的 preset。', + description: '对此后新建的会话生效。运行中的会话保持它开始时的预设。', loading: '正在加载预设…', error: '无法加载 Agent 预设。', userTrust: '自定义', diff --git a/packages/client/ui-agent-preset/tests/components.spec.tsx b/packages/client/ui-agent-preset/tests/components.spec.tsx index eff1e047e9..c0d1bf45b1 100644 --- a/packages/client/ui-agent-preset/tests/components.spec.tsx +++ b/packages/client/ui-agent-preset/tests/components.spec.tsx @@ -28,7 +28,9 @@ const ROW_READY: AgentPresetSettingsState = { error: null, writable: true, currentValue: 'standard', - options: [{ id: 'standard', trust: 'system' }, { id: 'mine', trust: 'user' }], + // `mine` deliberately names itself nothing: the row must fall back to the + // id for a preset whose author wrote no metadata. + options: [{ id: 'standard', trust: 'system', name: '标准模式' }, { id: 'mine', trust: 'user' }], } const SEAT_READY: AgentPresetSeatState = { @@ -88,7 +90,7 @@ describe('the General-settings row', () => { const actions = renderRow() await waitFor(() => { expect(actions.load).toHaveBeenCalledTimes(1) }) - expect(screen.getByRole('button').textContent).toContain('standard') + expect(screen.getByRole('button').textContent).toContain('标准模式') }) it('marks a locally authored option as local', () => { @@ -100,7 +102,7 @@ describe('the General-settings row', () => { // list says which rows are local rather than presenting all as vetted. expect(screen.getByText(`mine · ${en.userTrust}`)).toBeTruthy() // The shipped one carries no marker; only local rows are called out. - expect(screen.getAllByText('standard')).toHaveLength(2) + expect(screen.getAllByText('标准模式')).toHaveLength(2) }) it('writes the picked preset and closes the menu', () => {