fix(i18n): translate subagent as 子智能体 in Chinese UI
This commit is contained in:
1 parent
bbeef5f250
commit
995caa05ed
7 files changed
+72
-72
No files matched your search
@@ -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
@@ -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'],
|
||||
|
||||
Reference in new issue
Block a user