fix(i18n): translate subagent as 子智能体 in Chinese UI

This commit is contained in:
ZiyaZhang committed 2026-09-23 00:33:41 -07:00
1 parent bbeef5f250
commit 995caa05ed
7 files changed
+72 -72

No files matched your search

+1 -1
View File
@@ -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 | 分类体系 | | | |
@@ -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
@@ -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(<HeaderCatalog {...props(catalog(), {}, summaries)} />)
const trigger = screen.getByRole('button', { name: '1 个子代理,正在运行' })
const trigger = screen.getByRole('button', { name: '1 个子智能体,正在运行' })
expect(trigger.querySelector('[data-state="ongoing"]')).not.toBeNull()
view.rerender(<HeaderCatalog {...props(catalog(), {}, {
...summaries, [CHILD]: { ...summaries[CHILD]!, running: false },
})} />)
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(<HeaderCatalog {...input} />)
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(<HeaderCatalog {...props(catalog({
entries: catalog().entries.slice(0, 1),
}), { [CHILD]: catalog({ entries: [] }) })} />)
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(<HeaderCatalog {...props(catalog(), { [CHILD]: catalog({ entries: [] }) })} />)
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(<HeaderCatalog {...input} />)
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(<HeaderCatalog {...props(catalog())} />)
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(<HeaderCatalog {...props(catalog())} />)
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(<HeaderCatalog {...props(catalog())} />)
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(<HeaderCatalog {...input} />)
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(<HeaderCatalog {...input} />)
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<SessionId, SessionSummary>
const input = props(catalog({ entries }), {}, summaries)
render(<HeaderCatalog {...input} />)
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(<HeaderCatalog {...input} />)
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(<HeaderCatalog {...input} />)
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(<HeaderCatalog {...deferred} />)
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(<HeaderCatalog {...loading} />)
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(<HeaderCatalog {...input} />)
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(<HeaderCatalog {...input} />)
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(<HeaderCatalog {...failed} />)
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(<HeaderCatalog {...failed} />)
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(<HeaderCatalog {...input} />)
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(<HeaderCatalog {...populated} />)
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(<HeaderCatalog {...empty} />)
@@ -801,7 +801,7 @@ describe('SubagentHeaderLineage', () => {
const view = render(<HeaderCatalog {...props(catalog())} />)
expect(screen.queryByText('/')).toBeNull()
expect(screen.getByRole('button', { name: /1 个子代理,正在运行/ })).toBeTruthy()
expect(screen.getByRole('button', { name: /1 个子智能体,正在运行/ })).toBeTruthy()
view.rerender(<HeaderCatalog {...props(catalog({ entries: [] }))} />)
expect(screen.queryByRole('button')).toBeNull()
@@ -824,7 +824,7 @@ describe('SubagentHeaderLineage', () => {
}
render(<HeaderCatalog {...input} />)
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(<HeaderCatalog {...input} />)
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(<HeaderCatalog {...input} />)
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(<HeaderCatalog {...input} />)
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(<HeaderCatalog {...input} />)
expect(screen.getByRole('button', { name: '切换子代理:正在扫描项目文件' })).toBeTruthy()
expect(screen.getByRole('button', { name: '切换子智能体:正在扫描项目文件' })).toBeTruthy()
expect(input.refreshProjection).not.toHaveBeenCalled()
})
@@ -959,7 +959,7 @@ describe('SubagentHeaderLineage', () => {
}
render(<HeaderCatalog {...input} />)
hoverCatalog(screen.getByRole('button', { name: '切换子代理:indexer' }))
hoverCatalog(screen.getByRole('button', { name: '切换子智能体:indexer' }))
expect(input.refreshProjection).not.toHaveBeenCalled()
const current = screen.getByRole('treeitem', { name: /indexer/ })
@@ -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': '计划待审',
@@ -411,12 +411,12 @@ describe('workspace browser rows', () => {
render(<SessionNodeItem node={node} currentId={undefined} now={0} onOpen={vi.fn()} t={t} />)
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', () => {
@@ -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',
])
+1 -1
View File
@@ -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'],