diff --git a/docs/i18n/terminology.md b/docs/i18n/terminology.md index bab89e6efd..d23dea502f 100644 --- a/docs/i18n/terminology.md +++ b/docs/i18n/terminology.md @@ -64,7 +64,6 @@ | spawn | spawn | | | | | steering | steering | steering(中途引导) | | | | job id | job id | | 任务 id | 保留英文 | -| subagent | subagent | | | | | transcript | transcript | transcript(文本记录) | | 指会话渲染给用户或编辑器的完整文本,区别于事件日志 | | Typert | Typert | | TypeRT、typeRT、Type RT | DeepSeek Harness 类型图、生成器、loader 与运行时 registry 的产品拼写 | | waterfall | waterfall | waterfall(瀑布式事件) | | | @@ -195,6 +194,7 @@ | step | 步骤 | | | | | stream | 流 | | | | | structural signature | 结构签名 | | | i18n 配对机制用语:门禁比对两侧文件时提取的有序结构序列(标题层级、代码块、列表等) | +| subagent | 子智能体 | | 子代理 | | | Summary | 概述 | | | 事故复盘标题用语 | | system prompt | 系统提示词 | | | | | taxonomy | 分类体系 | | | | diff --git a/packages/client/ui-subagent/src/client/locales.ts b/packages/client/ui-subagent/src/client/locales.ts index c17a2f3cb1..97922b1977 100644 --- a/packages/client/ui-subagent/src/client/locales.ts +++ b/packages/client/ui-subagent/src/client/locales.ts @@ -19,8 +19,8 @@ export const zh = { 'tokens.thousand': '{value}K', 'tokens.million': '{value}M', 'tokens.total': '{value} tok', - 'loading.label': '正在加载子代理…', - 'load.error': '无法加载子代理', + 'loading.label': '正在加载子智能体…', + 'load.error': '无法加载子智能体', 'retry': '重试', 'mode.oneShot': '一次性', 'mode.continuable': '可继续', @@ -29,18 +29,18 @@ export const zh = { 'activity.running': '正在运行', 'activity.completed': '已完成', 'activity.inactive': '当前未运行', - 'branch.collapse': '收起 {label} 的下级子代理', - 'branch.expand': '展开 {label} 的下级子代理', - 'count.total.one': '{count} 个子代理', - 'count.total.other': '{count} 个子代理', - 'count.running.one': '{count} 个子代理,正在运行', - 'count.running.other': '{count} 个子代理,正在运行', - 'switcher.aria': '切换子代理:{title}', - 'tree.aria': '子代理会话', + 'branch.collapse': '收起 {label} 的下级子智能体', + 'branch.expand': '展开 {label} 的下级子智能体', + 'count.total.one': '{count} 个子智能体', + 'count.total.other': '{count} 个子智能体', + 'count.running.one': '{count} 个子智能体,正在运行', + 'count.running.other': '{count} 个子智能体,正在运行', + 'switcher.aria': '切换子智能体:{title}', + 'tree.aria': '子智能体会话', 'open.sidebar': '在侧边栏打开 {label}', 'sidebar.chat': '聊天', - 'readonly.oneShot.title': '一次性子代理记录', - 'readonly.title': '此子代理暂时只读', + 'readonly.oneShot.title': '一次性子智能体记录', + 'readonly.title': '此子智能体暂时只读', 'readonly.oneShot.body': '一次性任务不支持后续消息,可在这里查看完整执行记录。', 'readonly.body': '父会话当前不在线,重新打开父会话后即可继续发送消息。', } as const diff --git a/packages/client/ui-subagent/tests/conversation-ui.client.spec.tsx b/packages/client/ui-subagent/tests/conversation-ui.client.spec.tsx index 381d7523fb..be66c2ef55 100644 --- a/packages/client/ui-subagent/tests/conversation-ui.client.spec.tsx +++ b/packages/client/ui-subagent/tests/conversation-ui.client.spec.tsx @@ -166,7 +166,7 @@ describe('SubagentHeaderLineage', () => { useSessions={select => select({ ...initial, ids: [] })} useSessionStatus={select => select(statuses)} />) - expect(screen.getByRole('button', { name: '1 个子代理,正在运行' })).toBeTruthy() + expect(screen.getByRole('button', { name: '1 个子智能体,正在运行' })).toBeTruthy() }) it('shows retained children while an idle projection awaits refresh', () => { @@ -212,13 +212,13 @@ describe('SubagentHeaderLineage', () => { } const view = render() - const trigger = screen.getByRole('button', { name: '1 个子代理,正在运行' }) + const trigger = screen.getByRole('button', { name: '1 个子智能体,正在运行' }) expect(trigger.querySelector('[data-state="ongoing"]')).not.toBeNull() view.rerender() - const inactiveTrigger = screen.getByRole('button', { name: '2 个子代理' }) + const inactiveTrigger = screen.getByRole('button', { name: '2 个子智能体' }) expect(inactiveTrigger.querySelector('[data-state="ongoing"]')).toBeNull() }) @@ -238,22 +238,22 @@ describe('SubagentHeaderLineage', () => { [forkChild]: { ...summary(forkChild, 1), parentId: fork, origin: 'subagent', running: true }, })} />) - const trigger = screen.getByRole('button', { name: '1 个子代理' }) + const trigger = screen.getByRole('button', { name: '1 个子智能体' }) expect(trigger.querySelector('[data-state="ongoing"]')).toBeNull() }) it('renders stable rows and catalog-addressed navigation', () => { const input = props(catalog()) render() - const trigger = screen.getByRole('button', { name: /1 个子代理,正在运行/ }) + const trigger = screen.getByRole('button', { name: /1 个子智能体,正在运行/ }) hoverCatalog(trigger) expect(input.refreshProjection).not.toHaveBeenCalled() expect(screen.getAllByRole('treeitem')).toHaveLength(2) expect(screen.getByText('正在扫描项目文件 · 可继续 · 正在运行')).toBeTruthy() expect(screen.getByText('一次性 · 当前未运行')).toBeTruthy() - expect(screen.getByRole('button', { name: '展开 worker 的下级子代理' })).toBeTruthy() - expect(screen.getByRole('button', { name: '展开 reviewer 的下级子代理' })).toBeTruthy() + expect(screen.getByRole('button', { name: '展开 worker 的下级子智能体' })).toBeTruthy() + expect(screen.getByRole('button', { name: '展开 reviewer 的下级子智能体' })).toBeTruthy() const sidebarButton = screen.getByRole('button', { name: '在侧边栏打开 worker' }) fireEvent.keyDown(sidebarButton, { key: 'Enter' }) @@ -292,14 +292,14 @@ describe('SubagentHeaderLineage', () => { render() - hoverCatalog(screen.getByRole('button', { name: /1 个子代理/ })) + hoverCatalog(screen.getByRole('button', { name: /1 个子智能体/ })) expect(screen.getByRole('treeitem', { name: /worker/ }).children).toHaveLength(1) }) it('aligns a known leaf with siblings whose child catalog is still unknown', () => { render() - hoverCatalog(screen.getByRole('button', { name: /1 个子代理,正在运行/ })) + hoverCatalog(screen.getByRole('button', { name: /1 个子智能体,正在运行/ })) expect(screen.getByRole('treeitem', { name: /worker/ }).children).toHaveLength(2) expect(screen.getByRole('button', { name: /展开 reviewer/ })).toBeTruthy() @@ -308,7 +308,7 @@ describe('SubagentHeaderLineage', () => { it('supports trigger/menu keyboard traversal, Escape focus restore, and outside close', async () => { const input = props(catalog()) render() - const trigger = screen.getByRole('button', { name: /1 个子代理,正在运行/ }) + const trigger = screen.getByRole('button', { name: /1 个子智能体,正在运行/ }) fireEvent.keyDown(trigger, { key: 'ArrowDown' }) await Promise.resolve() expect(document.activeElement).toBe(screen.getByRole('treeitem', { name: /worker/ })) @@ -337,7 +337,7 @@ describe('SubagentHeaderLineage', () => { await act(async () => { await vi.advanceTimersByTimeAsync(duration) }) } const view = render() - const trigger = screen.getByRole('button', { name: /1 个子代理,正在运行/ }) + const trigger = screen.getByRole('button', { name: /1 个子智能体,正在运行/ }) const triggerRect = vi.spyOn(trigger, 'getBoundingClientRect') .mockReturnValue({ bottom: 40, left: 50 } as DOMRect) @@ -374,7 +374,7 @@ describe('SubagentHeaderLineage', () => { it('repositions an open catalog after viewport resize and document scroll', () => { const view = render() - const trigger = screen.getByRole('button', { name: /1 个子代理,正在运行/ }) + const trigger = screen.getByRole('button', { name: /1 个子智能体,正在运行/ }) const bounds = vi.spyOn(trigger, 'getBoundingClientRect') bounds.mockReturnValue({ bottom: 20, left: 30 } as DOMRect) hoverCatalog(trigger) @@ -397,7 +397,7 @@ describe('SubagentHeaderLineage', () => { it('cancels a pending hover when the trigger becomes hidden', async () => { vi.useFakeTimers() const view = render() - const trigger = screen.getByRole('button', { name: /1 个子代理,正在运行/ }) + const trigger = screen.getByRole('button', { name: /1 个子智能体,正在运行/ }) fireEvent.mouseEnter(trigger.parentElement!) await vi.advanceTimersByTimeAsync(149) @@ -424,7 +424,7 @@ describe('SubagentHeaderLineage', () => { ], })) render() - const trigger = screen.getByRole('button', { name: /1 个子代理,正在运行/ }) + const trigger = screen.getByRole('button', { name: /1 个子智能体,正在运行/ }) fireEvent.keyDown(trigger, { key: 'Tab' }) expect(screen.queryByRole('tree')).toBeNull() hoverCatalog(trigger) @@ -445,7 +445,7 @@ describe('SubagentHeaderLineage', () => { it('keeps unknown catalog children clickable by their durable parent address', () => { const input = props(catalog({ entries: [{ id: CHILD, mode: 'unknown', activity: 'inactive' }] })) render() - hoverCatalog(screen.getByRole('button', { name: /子代理/ })) + hoverCatalog(screen.getByRole('button', { name: /子智能体/ })) const row = screen.getByRole('treeitem', { name: new RegExp(CHILD) }) expect(row.textContent).toContain('模式未知') fireEvent.keyDown(row, { key: 'Enter' }) @@ -525,8 +525,8 @@ describe('SubagentHeaderLineage', () => { })) as Record const input = props(catalog({ entries }), {}, summaries) render() - const trigger = screen.getByRole('button', { name: '1 个子代理,正在运行' }) - expect(within(trigger).getByText('9 个子代理')).toBeTruthy() + const trigger = screen.getByRole('button', { name: '1 个子智能体,正在运行' }) + expect(within(trigger).getByText('9 个子智能体')).toBeTruthy() hoverCatalog(trigger) const runningRow = screen.getByRole('treeitem', { name: /running.*4\.6K tok · 1分10秒/ }) @@ -579,16 +579,16 @@ describe('SubagentHeaderLineage', () => { }, }) render() - hoverCatalog(screen.getByRole('button', { name: '1 个子代理' })) + hoverCatalog(screen.getByRole('button', { name: '1 个子智能体' })) const beforeExpand = vi.getTimerCount() - fireEvent.click(screen.getByRole('button', { name: '展开 worker 的下级子代理' })) + fireEvent.click(screen.getByRole('button', { name: '展开 worker 的下级子智能体' })) expect(screen.getByRole('treeitem', { name: /indexer.*5秒/ })).toBeTruthy() await act(async () => { await vi.advanceTimersByTimeAsync(1_000) }) expect(screen.getByRole('treeitem', { name: /indexer.*6秒/ })).toBeTruthy() - fireEvent.click(screen.getByRole('button', { name: '收起 worker 的下级子代理' })) + fireEvent.click(screen.getByRole('button', { name: '收起 worker 的下级子智能体' })) expect(vi.getTimerCount()).toBe(beforeExpand) await act(async () => { await vi.advanceTimersByTimeAsync(1_000) }) - fireEvent.click(screen.getByRole('button', { name: '展开 worker 的下级子代理' })) + fireEvent.click(screen.getByRole('button', { name: '展开 worker 的下级子智能体' })) expect(screen.getByRole('treeitem', { name: /indexer.*7秒/ })).toBeTruthy() }) @@ -607,9 +607,9 @@ describe('SubagentHeaderLineage', () => { [GRANDCHILD]: grandchildCatalog, }) render() - hoverCatalog(screen.getByRole('button', { name: /1 个子代理,正在运行/ })) + hoverCatalog(screen.getByRole('button', { name: /1 个子智能体,正在运行/ })) - fireEvent.click(screen.getByRole('button', { name: '展开 worker 的下级子代理' })) + fireEvent.click(screen.getByRole('button', { name: '展开 worker 的下级子智能体' })) expect(input.refreshProjection).toHaveBeenCalledWith(CHILD) const nested = screen.getByRole('treeitem', { name: /indexer/ }) expect(nested.getAttribute('aria-level')).toBe('2') @@ -635,19 +635,19 @@ describe('SubagentHeaderLineage', () => { } const deferred = props(catalog(), {}, summaries) const view = render() - hoverCatalog(screen.getByRole('button', { name: /1 个子代理,正在运行/ })) - fireEvent.click(screen.getByRole('button', { name: '展开 worker 的下级子代理' })) + hoverCatalog(screen.getByRole('button', { name: /1 个子智能体,正在运行/ })) + fireEvent.click(screen.getByRole('button', { name: '展开 worker 的下级子智能体' })) expect(deferred.refreshProjection).toHaveBeenCalledWith(CHILD) expect(screen.getByRole('group').getAttribute('aria-busy')).toBe('true') - expect(screen.getByText('正在加载子代理…')).toBeTruthy() - expect(screen.queryByRole('treeitem', { name: '正在加载子代理' })).toBeNull() + expect(screen.getByText('正在加载子智能体…')).toBeTruthy() + expect(screen.queryByRole('treeitem', { name: '正在加载子智能体' })).toBeNull() const loading = props(catalog(), { [CHILD]: catalog({ entries: [], state: 'loading' }), }, summaries) view.rerender() - expect(screen.getByText('正在加载子代理…')).toBeTruthy() + expect(screen.getByText('正在加载子智能体…')).toBeTruthy() const ready = props(catalog(), { [CHILD]: catalog({ @@ -667,7 +667,7 @@ describe('SubagentHeaderLineage', () => { expect(screen.getByRole('group').getAttribute('aria-busy')).toBeNull() expect(screen.getByRole('treeitem', { name: /indexer/ }).querySelector('[data-state="idle"]')).not.toBeNull() expect(screen.getByRole('treeitem', { name: /critic/ }).querySelector('[data-state="ongoing"]')).not.toBeNull() - expect(screen.queryByText('正在加载子代理…')).toBeNull() + expect(screen.queryByText('正在加载子智能体…')).toBeNull() }) it('uses ArrowRight and ArrowLeft for branch disclosure', async () => { @@ -680,7 +680,7 @@ describe('SubagentHeaderLineage', () => { }), }) render() - const trigger = screen.getByRole('button', { name: /1 个子代理,正在运行/ }) + const trigger = screen.getByRole('button', { name: /1 个子智能体,正在运行/ }) fireEvent.keyDown(trigger, { key: 'ArrowDown' }) await Promise.resolve() const worker = screen.getByRole('treeitem', { name: /worker/ }) @@ -700,10 +700,10 @@ describe('SubagentHeaderLineage', () => { }), }) render() - hoverCatalog(screen.getByRole('button', { name: /1 个子代理,正在运行/ })) - fireEvent.click(screen.getByRole('button', { name: '展开 worker 的下级子代理' })) - fireEvent.click(screen.getByRole('button', { name: '展开 indexer 的下级子代理' })) - fireEvent.click(screen.getByRole('button', { name: '收起 worker 的下级子代理' })) + hoverCatalog(screen.getByRole('button', { name: /1 个子智能体,正在运行/ })) + fireEvent.click(screen.getByRole('button', { name: '展开 worker 的下级子智能体' })) + fireEvent.click(screen.getByRole('button', { name: '展开 indexer 的下级子智能体' })) + fireEvent.click(screen.getByRole('button', { name: '收起 worker 的下级子智能体' })) expect(screen.queryByRole('treeitem', { name: /indexer/ })).toBeNull() }) @@ -724,7 +724,7 @@ describe('SubagentHeaderLineage', () => { error: new RemoteError('gateway/internal', 'index down', {}), })) render() - hoverCatalog(screen.getByRole('button', { name: /0 个子代理/ })) + hoverCatalog(screen.getByRole('button', { name: /0 个子智能体/ })) expect(screen.getByText('index down')).toBeTruthy() fireEvent.click(screen.getByRole('button', { name: /重试/ })) expect(failed.refreshProjection).toHaveBeenCalledWith(PARENT) @@ -758,9 +758,9 @@ describe('SubagentHeaderLineage', () => { const failed = props(catalog({ entries: [], state: 'error', error: null })) render() - const trigger = screen.getByRole('button', { name: /0 个子代理/ }) + const trigger = screen.getByRole('button', { name: /0 个子智能体/ }) hoverCatalog(trigger) - expect(screen.getByText('无法加载子代理')).toBeTruthy() + expect(screen.getByText('无法加载子智能体')).toBeTruthy() fireEvent.keyDown(trigger, { key: 'ArrowDown' }) await Promise.resolve() expect(screen.getByRole('tree')).toBeTruthy() @@ -770,7 +770,7 @@ describe('SubagentHeaderLineage', () => { it('navigates from outside the tree and tolerates a deferred focus after unmount', async () => { const input = props(catalog()) const view = render() - const trigger = screen.getByRole('button', { name: /1 个子代理,正在运行/ }) + const trigger = screen.getByRole('button', { name: /1 个子智能体,正在运行/ }) hoverCatalog(trigger) fireEvent.keyDown(screen.getByRole('tree'), { key: 'ArrowUp' }) expect(document.activeElement).toBe(screen.getByRole('treeitem', { name: /reviewer/ })) @@ -789,8 +789,8 @@ describe('SubagentHeaderLineage', () => { }), }) const view = render() - hoverCatalog(screen.getByRole('button', { name: /1 个子代理,正在运行/ })) - fireEvent.click(screen.getByRole('button', { name: '展开 worker 的下级子代理' })) + hoverCatalog(screen.getByRole('button', { name: /1 个子智能体,正在运行/ })) + fireEvent.click(screen.getByRole('button', { name: '展开 worker 的下级子智能体' })) const empty = props(catalog({ entries: [] })) view.rerender() @@ -801,7 +801,7 @@ describe('SubagentHeaderLineage', () => { const view = render() expect(screen.queryByText('/')).toBeNull() - expect(screen.getByRole('button', { name: /1 个子代理,正在运行/ })).toBeTruthy() + expect(screen.getByRole('button', { name: /1 个子智能体,正在运行/ })).toBeTruthy() view.rerender() expect(screen.queryByRole('button')).toBeNull() @@ -824,7 +824,7 @@ describe('SubagentHeaderLineage', () => { } render() - const switcher = screen.getByRole('button', { name: '切换子代理:worker' }) + const switcher = screen.getByRole('button', { name: '切换子智能体:worker' }) expect(switcher.className).toContain('switcherTrigger') expect(within(switcher).getByText('worker')).toBeTruthy() expect(switcher.querySelector('svg')).not.toBeNull() @@ -857,7 +857,7 @@ describe('SubagentHeaderLineage', () => { } render() - expect(screen.queryByRole('button', { name: '切换子代理:worker' })).toBeNull() + expect(screen.queryByRole('button', { name: '切换子智能体:worker' })).toBeNull() }) it('falls back to the catalog session id when the selected row has no label', () => { @@ -876,7 +876,7 @@ describe('SubagentHeaderLineage', () => { } render() - expect(screen.getByRole('button', { name: `切换子代理:${CHILD}` })).toBeTruthy() + expect(screen.getByRole('button', { name: `切换子智能体:${CHILD}` })).toBeTruthy() }) it('keeps an ancestor switcher muted and omits its descendant count', () => { @@ -900,9 +900,9 @@ describe('SubagentHeaderLineage', () => { } render() - const switcher = screen.getByRole('button', { name: '切换子代理:worker' }) + const switcher = screen.getByRole('button', { name: '切换子智能体:worker' }) expect(switcher.className).toContain('ancestorSwitcherTrigger') - expect(screen.queryByRole('button', { name: /1 个子代理/ })).toBeNull() + expect(screen.queryByRole('button', { name: /1 个子智能体/ })).toBeNull() vi.useFakeTimers() fireEvent.mouseEnter(switcher.parentElement!) fireEvent.click(switcher) @@ -934,7 +934,7 @@ describe('SubagentHeaderLineage', () => { } render() - expect(screen.getByRole('button', { name: '切换子代理:正在扫描项目文件' })).toBeTruthy() + expect(screen.getByRole('button', { name: '切换子智能体:正在扫描项目文件' })).toBeTruthy() expect(input.refreshProjection).not.toHaveBeenCalled() }) @@ -959,7 +959,7 @@ describe('SubagentHeaderLineage', () => { } render() - hoverCatalog(screen.getByRole('button', { name: '切换子代理:indexer' })) + hoverCatalog(screen.getByRole('button', { name: '切换子智能体:indexer' })) expect(input.refreshProjection).not.toHaveBeenCalled() const current = screen.getByRole('treeitem', { name: /indexer/ }) diff --git a/packages/client/ui-workspace/src/client/locales.ts b/packages/client/ui-workspace/src/client/locales.ts index 8f35978565..7aeccaf86d 100644 --- a/packages/client/ui-workspace/src/client/locales.ts +++ b/packages/client/ui-workspace/src/client/locales.ts @@ -62,8 +62,8 @@ export const zh = { 'archive.confirm.desc': '“{title}”仍有正在进行的工作。归档会先停止这些工作;之后可在侧栏“显示已归档”中恢复会话,被停止的工作不会自动继续。', 'archive.confirm.activity': '将被停止的工作', 'archive.confirm.turn': '进行中的回合', - 'archive.confirm.subagents.one': '{n} 个运行中的子代理:{names}', - 'archive.confirm.subagents.other': '{n} 个运行中的子代理:{names}', + 'archive.confirm.subagents.one': '{n} 个运行中的子智能体:{names}', + 'archive.confirm.subagents.other': '{n} 个运行中的子智能体:{names}', 'archive.confirm.jobs.one': '{n} 个后台任务:{names}', 'archive.confirm.jobs.other': '{n} 个后台任务:{names}', 'archive.confirm.schedules.one': '{n} 条定时提醒:{names}', @@ -90,8 +90,8 @@ export const zh = { 'actions.newSession': '新会话', 'actions.newSession.aria': '在“{name}”中新建会话', 'status.running': '进行中', - 'status.subagentsRunning.one': '{n} 个子代理运行中', - 'status.subagentsRunning.other': '{n} 个子代理运行中', + 'status.subagentsRunning.one': '{n} 个子智能体运行中', + 'status.subagentsRunning.other': '{n} 个子智能体运行中', 'status.idle': '空闲', 'status.waitingApproval': '等待审批', 'status.planReview': '计划待审', diff --git a/packages/client/ui-workspace/tests/rows.client.spec.tsx b/packages/client/ui-workspace/tests/rows.client.spec.tsx index 41e1b6e037..290dc0c44f 100644 --- a/packages/client/ui-workspace/tests/rows.client.spec.tsx +++ b/packages/client/ui-workspace/tests/rows.client.spec.tsx @@ -411,12 +411,12 @@ describe('workspace browser rows', () => { render() const row = screen.getByRole('treeitem') expect(row.querySelector('[data-state="ongoing"]')).not.toBeNull() - expect(screen.getByText('2 个子代理运行中')).toBeTruthy() + expect(screen.getByText('2 个子智能体运行中')).toBeTruthy() expect(screen.queryByText('进行中')).toBeNull() fireEvent.pointerEnter(row.parentElement as HTMLElement) act(() => { vi.advanceTimersByTime(800) }) - expect(screen.getAllByText('2 个子代理运行中')).toHaveLength(2) + expect(screen.getAllByText('2 个子智能体运行中')).toHaveLength(2) } finally { vi.useRealTimers() } @@ -433,12 +433,12 @@ describe('workspace browser rows', () => { const row = screen.getByRole('treeitem') expect(row.querySelectorAll('[data-state="ongoing"]')).toHaveLength(1) expect(screen.getByText('进行中')).toBeTruthy() - expect(screen.getByText('1 个子代理运行中')).toBeTruthy() + expect(screen.getByText('1 个子智能体运行中')).toBeTruthy() fireEvent.pointerEnter(row.parentElement as HTMLElement) act(() => { vi.advanceTimersByTime(800) }) expect(screen.getAllByText('进行中')).toHaveLength(2) - expect(screen.getAllByText('1 个子代理运行中')).toHaveLength(2) + expect(screen.getAllByText('1 个子智能体运行中')).toHaveLength(2) } finally { vi.useRealTimers() } @@ -454,7 +454,7 @@ describe('workspace browser rows', () => { expect(row.querySelector('[data-state="warning"]')).not.toBeNull() expect(row.querySelector('[data-state="ongoing"]')).toBeNull() expect(screen.getByText('等待回答')).toBeTruthy() - expect(screen.getByText('1 个子代理运行中')).toBeTruthy() + expect(screen.getByText('1 个子智能体运行中')).toBeTruthy() }) it('shows the green done dot on a finished search result row', () => { diff --git a/packages/client/ui-workspace/tests/session-actions.client.spec.tsx b/packages/client/ui-workspace/tests/session-actions.client.spec.tsx index fb594bc44d..bd96b3337d 100644 --- a/packages/client/ui-workspace/tests/session-actions.client.spec.tsx +++ b/packages/client/ui-workspace/tests/session-actions.client.spec.tsx @@ -379,7 +379,7 @@ describe('SessionArchiveConfirmDialog', () => { const lines = [...screen.getByRole('list', { name: '将被停止的工作' }).querySelectorAll('li')].map(li => li.textContent) expect(lines).toEqual([ '进行中的回合', - '2 个运行中的子代理:reviewer、child-2', + '2 个运行中的子智能体:reviewer、child-2', '1 个后台任务:pnpm run build', '1 条定时提醒:check the build', ]) diff --git a/website/docs.ts b/website/docs.ts index 5279241051..92016d10c3 100644 --- a/website/docs.ts +++ b/website/docs.ts @@ -330,7 +330,7 @@ const subsystemGroups = [ ['web.md', 'Web 访问', 'Web access'], ['skills.md', '技能', 'Skills'], ['workflow.md', '工作流', 'Workflows'], - ['subagent.md', '子代理', 'Subagents'], + ['subagent.md', '子智能体', 'Subagents'], ]], ['策略与交互', 'Policy and interaction', [ ['approval.md', '审批', 'Approvals'],