diff --git a/packages/client/ui-workspace/README.i18n.yaml b/packages/client/ui-workspace/README.i18n.yaml
index 373ff6d361..1de79a4099 100644
--- a/packages/client/ui-workspace/README.i18n.yaml
+++ b/packages/client/ui-workspace/README.i18n.yaml
@@ -27,8 +27,8 @@
en: 9eab3bfbaf98c987
zh: 54e7e141dae5c9e8
/deepseek-ai-dsh-client-ui-workspace/use-this-package/managing-sessions:
- en: 745c8b9cb3858789
- zh: fb7fdf5856dfba89
+ en: 3c297ecd96033099
+ zh: 4864420a37633b52
/deepseek-ai-dsh-client-ui-workspace/use-this-package/pending-interactions:
en: 9fb88260380bf093
zh: 3bace2b96ecd4a82
diff --git a/packages/client/ui-workspace/README.md b/packages/client/ui-workspace/README.md
index d4d4e0df8f..3d1e75e7b9 100644
--- a/packages/client/ui-workspace/README.md
+++ b/packages/client/ui-workspace/README.md
@@ -49,7 +49,7 @@ Collapsed search is one header action beside the view and add actions: activatin
The Session row's Rename action opens a dialog prefilled with the row's display title; confirming an unchanged title is deliberately allowed — it pins the current automatic title against regeneration. Double-clicking a title also opens Rename; for an unarchived Session, the preceding clicks open its conversation. Rename uses a temporary `workspaceOperation` reference and awaits its initial history opening. The row's Fork action forks at the source's last completed turn and increments the inherited persisted title through Session Controller without retaining the child, opening its history, or changing selection. Workspace Delete opens a confirmation that states the retention boundary; success removes the group while its Sessions remain under Ungrouped. Pin, Rename, Fork, and Archive are themselves entries of the `sidebar.workspaces.session.menu.item` list (pin and archive also of `sidebar.workspaces.session.row.action`), so a client plugin's action takes whatever position its `order` gives it.
-Archive commits without a confirmation dialog for a quiet Session and retains the Session's account position. A Session with running work is the one case that asks first: the Host refuses the plain archive and names that work, and the sidebar opens a stop-and-archive dialog listing it by family — the turn in progress, running subagents, background jobs, scheduled reminders, each with its labels — with the restore path stated; confirming asks the Host to stop the work the way the stop button does and archives once the archive set is durable, while the stops settle in the background, and cancelling leaves the Session running and visible. View options control visibility: the default hides archived Sessions, Show archived includes them, and Archived only hides ordinary Sessions. Visible archived rows are grayed and carry an accessible explanation that they cannot be opened until restored; Rename, Fork, and Unarchive remain available. A successful archive shows a notice with an undo action and a "show archived" action that switches the filter directly; a stop-and-archive shows the same notice under its own wording, and undo restores the Session without resuming the stopped work. Unarchive removes the archive mark without restoring a pin or changing the saved position.
+Archive commits without a confirmation dialog for a quiet Session and retains the Session's account position. A Session with running work is the one case that asks first: the Host refuses the plain archive and names that work, and the sidebar opens a stop-and-archive dialog listing it by family — the turn in progress, running subagents, background jobs, scheduled reminders, each with its labels — with the restore path stated; confirming asks the Host to stop the work the way the stop button does and archives once the archive set is durable, while the stops settle in the background, and cancelling leaves the Session running and visible. View options control visibility through one explicit three-way choice: Hide archived (the default) hides archived Sessions, All conversations (show archived) includes them, and Archived only hides ordinary Sessions and drops Workspaces without an archived Session; in tree grouping, children of a dropped Workspace nest under the nearest shown ancestor. Visible archived rows are grayed and carry an accessible explanation that they cannot be opened until restored; Rename, Fork, and Unarchive remain available. A successful archive shows a notice with an undo action and an "all conversations" action that switches the filter directly; a stop-and-archive shows the same notice under its own wording, and undo restores the Session without resuming the stopped work. Unarchive removes the archive mark without restoring a pin or changing the saved position.
A Session title wider than its row is clipped with an ellipsis at rest. Hovering the row scrolls the title to its far edge — the incremented title of a fork, for example — and reveals it without the ellipsis; leaving the row returns the title to its start.
diff --git a/packages/client/ui-workspace/README.zh.md b/packages/client/ui-workspace/README.zh.md
index cf84f9e703..a3481f2f53 100644
--- a/packages/client/ui-workspace/README.zh.md
+++ b/packages/client/ui-workspace/README.zh.md
@@ -49,7 +49,7 @@ kind: "package-reference"
Session 行内的 Rename 操作打开一个以该行显示标题预填的对话框;确认未修改的标题是有意允许的——这正是把当前自动标题钉住、不再被重新生成覆盖的手势。双击标题也会打开 Rename;对于未归档 Session,先发生的点击会打开其对话。Rename 使用临时 `workspaceOperation` reference,并等待首次历史打开。行内 Fork 在源会话最后一个已完成轮次处 fork,通过 Session Controller 递增继承的持久化标题,不 retain 子会话、不打开其历史,也不改变选择。Workspace 行内的 Delete 操作会打开确认框,说明保留边界;成功后该分组被移除,其 Session 则留在 Ungrouped 下。Pin、Rename、Fork、Archive 本身就是 `sidebar.workspaces.session.menu.item` 列表的条目(pin 与 archive 同时也是 `sidebar.workspaces.session.row.action` 的条目),因此客户端插件的 action 由其 `order` 决定落在哪个位置。
-对静止的 Session,Archive 不经确认对话框直接提交,并保留 Session 的记账位置。仍有工作在跑的 Session 是唯一会先询问的情形:Host 拒绝普通归档并列出这些工作,侧栏随即打开"停止并归档"对话框,按族列出——进行中的回合、运行中的子代理、后台任务、定时提醒,各带名称——并写明恢复路径;确认后请 Host 按停止按钮同样的方式停止这些工作,归档集合持久化后即完成归档,停止在后台收敛;取消则让 Session 继续运行并保持可见。视图选项控制显隐:默认隐藏已归档 Session,显示已归档会将其纳入列表,仅显示已归档则隐藏普通 Session。可见的归档行置灰,并提供无障碍说明,告知取消归档后才能打开;Rename、Fork 与取消归档仍然可用。归档成功后的提示提供"撤销"和"筛选已归档会话"两个动作,后者直接把筛选切到显示已归档;停止并归档显示同样的提示但措辞不同,撤销只恢复 Session,不会让被停止的工作继续。取消归档移除归档标记,但不恢复置顶,也不改变保存的位置。
+对静止的 Session,Archive 不经确认对话框直接提交,并保留 Session 的记账位置。仍有工作在跑的 Session 是唯一会先询问的情形:Host 拒绝普通归档并列出这些工作,侧栏随即打开"停止并归档"对话框,按族列出——进行中的回合、运行中的子代理、后台任务、定时提醒,各带名称——并写明恢复路径;确认后请 Host 按停止按钮同样的方式停止这些工作,归档集合持久化后即完成归档,停止在后台收敛;取消则让 Session 继续运行并保持可见。视图选项以一组显式三选一控制显隐:隐藏已归档(默认项)隐藏已归档 Session,全部对话(显示已归档)将其纳入列表,仅显示已归档则隐藏普通 Session,并丢弃没有归档 Session 的 Workspace;树形分组下,被丢弃 Workspace 的子级挂到最近一个仍显示的祖先下。可见的归档行置灰,并提供无障碍说明,告知取消归档后才能打开;Rename、Fork 与取消归档仍然可用。归档成功后的提示提供"撤销"和"筛选已归档会话"两个动作,后者直接把筛选切到全部对话(显示已归档);停止并归档显示同样的提示但措辞不同,撤销只恢复 Session,不会让被停止的工作继续。取消归档移除归档标记,但不恢复置顶,也不改变保存的位置。
标题宽于所在行时,静止状态以省略号裁切。把指针停在行上,标题会滚动到远端——例如 fork 递增后的标题——并在揭示时不显示省略号;指针离开后标题回到开头。
diff --git a/packages/client/ui-workspace/src/client/locales.ts b/packages/client/ui-workspace/src/client/locales.ts
index 0cbb0efd5d..3e35c52e63 100644
--- a/packages/client/ui-workspace/src/client/locales.ts
+++ b/packages/client/ui-workspace/src/client/locales.ts
@@ -27,7 +27,8 @@ export const zh = {
'orderBy.manual': '手动排序',
'orderBy.updated': '最近更新',
'filterBy.label': '筛选会话',
- 'viewOptions.showArchived': '显示已归档',
+ 'viewOptions.hideArchived': '隐藏已归档',
+ 'viewOptions.showArchived': '全部对话(显示已归档)',
'viewOptions.onlyArchived': '仅显示已归档',
'sessions.expand': '展开其余 {n} 个会话',
'sessions.collapse': '收起',
@@ -65,7 +66,7 @@ export const zh = {
'toast.archived': '会话已归档,可',
'toast.stoppedAndArchived': '已停止并归档,可',
'archive.confirm.title': '停止并归档此会话?',
- 'archive.confirm.desc': '“{title}”仍有正在进行的工作。归档会先停止这些工作;之后可在侧栏“显示已归档”中恢复会话,被停止的工作不会自动继续。',
+ 'archive.confirm.desc': '“{title}”仍有正在进行的工作。归档会先停止这些工作;之后可在侧栏筛选“全部对话(显示已归档)”中恢复会话,被停止的工作不会自动继续。',
'archive.confirm.activity': '将被停止的工作',
'archive.confirm.turn': '进行中的回合',
'archive.confirm.subagents.one': '{n} 个运行中的子智能体:{names}',
@@ -144,7 +145,8 @@ export const en = {
'orderBy.manual': 'Manual',
'orderBy.updated': 'Last updated',
'filterBy.label': 'Filter sessions',
- 'viewOptions.showArchived': 'Show archived',
+ 'viewOptions.hideArchived': 'Hide archived',
+ 'viewOptions.showArchived': 'All conversations (show archived)',
'viewOptions.onlyArchived': 'Archived only',
'sessions.expand': 'Show {n} more sessions',
'sessions.collapse': 'Show less',
@@ -182,7 +184,7 @@ export const en = {
'toast.archived': 'Session archived. You can ',
'toast.stoppedAndArchived': 'Session stopped and archived. You can ',
'archive.confirm.title': 'Stop and archive this session?',
- 'archive.confirm.desc': '“{title}” still has work in progress. Archiving stops it first; you can restore the session later from “Show archived” in the sidebar, and the stopped work will not resume on its own.',
+ 'archive.confirm.desc': '“{title}” still has work in progress. Archiving stops it first; you can restore the session later from the “All conversations (show archived)” filter in the sidebar, and the stopped work will not resume on its own.',
'archive.confirm.activity': 'Work that will be stopped',
'archive.confirm.turn': 'The turn in progress',
'archive.confirm.subagents.one': '{n} running subagent: {names}',
diff --git a/packages/client/ui-workspace/src/client/rows/WorkspaceBrowser.tsx b/packages/client/ui-workspace/src/client/rows/WorkspaceBrowser.tsx
index 7de46dc0e9..9b64a932e8 100644
--- a/packages/client/ui-workspace/src/client/rows/WorkspaceBrowser.tsx
+++ b/packages/client/ui-workspace/src/client/rows/WorkspaceBrowser.tsx
@@ -17,10 +17,10 @@
import { type CSSProperties, type ReactNode, useEffect, useMemo, useRef, useState } from 'react'
import clsx from 'clsx'
import {
- Button, IconArchiveCheckOutlineRegular, IconArchiveOutlineRegular,
+ Button, IconArchiveCheckOutlineRegular, IconArchiveOffOutlineRegular,
IconChevronsUpDownOutlineRegular, IconClockOutlineRegular, IconCloseFillRegular,
IconFlatListOutlineRegular, IconFolderCloseRegular, IconProjectAddOutlineRegular,
- IconSearchOutlineRegular, IconSlidersTwoOutlineRegular,
+ IconQueueOutlineRegular, IconSearchOutlineRegular, IconSlidersTwoOutlineRegular,
IconWorkspaceTreeOutlineRegular, Menu, Modal, Toast, Tooltip,
} from '@deepseek-ai/dsh-client-ui-primitives'
import type {
@@ -127,22 +127,21 @@ function ViewOptionsMenu({ groupBy, orderBy, archivedFilter, onGroupPick, onOrde
{ id: 'updated', label: t('orderBy.updated'), icon: },
{ type: 'separator' as const, id: 'archived-filter-separator' },
{ type: 'label' as const, id: 'filter-by', text: t('filterBy.label') },
- { id: 'show-archived', label: t('viewOptions.showArchived'), icon: },
+ { id: 'hide-archived', label: t('viewOptions.hideArchived'), icon: },
+ { id: 'show-archived', label: t('viewOptions.showArchived'), icon: },
{ id: 'only-archived', label: t('viewOptions.onlyArchived'), icon: },
]}
selectedIds={[
groupBy,
orderBy,
- ...archivedFilter === 'show' ? ['show-archived'] : [],
- ...archivedFilter === 'only' ? ['only-archived'] : [],
+ { default: 'hide-archived', show: 'show-archived', only: 'only-archived' }[archivedFilter],
]}
onSelect={(id) => {
if (id === 'workspace' || id === 'workspace-tree' || id === 'flat') onGroupPick(id)
else if (id === 'manual' || id === 'updated') onOrderPick(id)
- // The two archived items are mutually exclusive; re-picking the
- // selected one returns to the default hide-archived view.
- else if (id === 'show-archived') onArchivedFilterPick(archivedFilter === 'show' ? 'default' : 'show')
- else if (id === 'only-archived') onArchivedFilterPick(archivedFilter === 'only' ? 'default' : 'only')
+ else if (id === 'hide-archived') onArchivedFilterPick('default')
+ else if (id === 'show-archived') onArchivedFilterPick('show')
+ else if (id === 'only-archived') onArchivedFilterPick('only')
setOpen(false)
}}
align="end"
@@ -375,9 +374,13 @@ function SessionTree({
})
}
const childrenByParent = useMemo(() => {
+ const rendered = new Set(groups.map(group => group.key))
const children = new Map()
for (const group of groups) {
- const parent = parents.get(group.key)
+ // The archived-only view drops empty groups, so an ancestor may be
+ // absent; nest under the nearest rendered one.
+ let parent = parents.get(group.key)
+ while (parent !== undefined && !rendered.has(parent)) parent = parents.get(parent)
const siblings = children.get(parent)
if (siblings === undefined) children.set(parent, [group])
else siblings.push(group)
diff --git a/packages/client/ui-workspace/src/client/tree.ts b/packages/client/ui-workspace/src/client/tree.ts
index 8036af75d8..0be603f662 100644
--- a/packages/client/ui-workspace/src/client/tree.ts
+++ b/packages/client/ui-workspace/src/client/tree.ts
@@ -349,6 +349,9 @@ function groupByWorkspace(
if (!sessionVisible(summary, current, archived, archivedFilter)) continue
members.push(summary)
}
+ // The archived-only view lists archives, not the Workspace inventory, so
+ // a Workspace without archived Sessions contributes no group.
+ if (archivedFilter === 'only' && members.length === 0) continue
groups.push(buildGroup(
workspace.workspaceId, workspace.workspaceId, workspace.path,
Date.parse(workspace.createdAt), workspace.title, members,
@@ -416,8 +419,9 @@ function sessionNode(
/**
* Derive the workspace browser groups with every session as a top-level row.
*
- * Every group shows; sessions populate under expanded groups with pinned rows
- * leading in the selected local order. Blank sessions are
+ * Every group shows, except that the archived-only filter drops groups
+ * without visible members; sessions populate under expanded groups with
+ * pinned rows leading in the selected local order. Blank sessions are
* excluded except for the selected provisional New Session row; archived
* sessions keep their slots and appear per the archived filter. Content
* search lives outside this derivation (see {@link deriveSearchResults}).
diff --git a/packages/client/ui-workspace/tests/tree.client.spec.ts b/packages/client/ui-workspace/tests/tree.client.spec.ts
index a04bb01814..f5dc42aa81 100644
--- a/packages/client/ui-workspace/tests/tree.client.spec.ts
+++ b/packages/client/ui-workspace/tests/tree.client.spec.ts
@@ -483,6 +483,29 @@ describe('deriveGroups', () => {
])
})
+ it('drops Workspaces without visible members under the only filter', () => {
+ const sessions = list(summary('stored', 2), summary('live', 1))
+ const groups = deriveGroups(
+ sessions, [workspace('full', ['stored', 'live']), workspace('empty', ['live'])],
+ rowState({ archived: ['stored'], archivedFilter: 'only' }),
+ noAttention, view(['full', 'empty']),
+ )
+ expect(groups.map(group => group.key)).toEqual(['full'])
+ expect(groups[0]!.sessions.map(node => node.id)).toEqual([sid('stored')])
+ })
+
+ it.each(['default', 'show'] as const)('keeps memberless Workspaces under the %s filter', (archivedFilter) => {
+ const sessions = list(summary('stored', 1))
+ const groups = deriveGroups(
+ sessions, [workspace('empty', ['stored'])],
+ rowState({ archived: ['stored'], archivedFilter }),
+ noAttention, view(['empty']),
+ )
+ expect(groups.map(group => [group.key, group.sessionCount])).toEqual([
+ ['empty', archivedFilter === 'show' ? 1 : 0],
+ ])
+ })
+
it('marks selected Workspace and Ungrouped sessions without relying on an Intent', () => {
const owned = summary('owned', 1)
const loose = summary('loose', 2)
diff --git a/packages/client/ui-workspace/tests/workspace-browser.client.spec.tsx b/packages/client/ui-workspace/tests/workspace-browser.client.spec.tsx
index 2b6c30ffd7..ccb2d43dac 100644
--- a/packages/client/ui-workspace/tests/workspace-browser.client.spec.tsx
+++ b/packages/client/ui-workspace/tests/workspace-browser.client.spec.tsx
@@ -436,7 +436,7 @@ describe('WorkspaceBrowser', () => {
expect(screen.getByText('alive')).toBeTruthy()
expect(screen.queryByText('gone')).toBeNull()
fireEvent.click(screen.getByRole('button', { name: '视图选项' }))
- fireEvent.click(screen.getByRole('menuitem', { name: '显示已归档' }))
+ fireEvent.click(screen.getByRole('menuitem', { name: '全部对话(显示已归档)' }))
expect(b.store.getSnapshot().archivedFilter).toBe('show')
expect(screen.getByText('gone')).toBeTruthy()
} finally {
@@ -461,7 +461,7 @@ describe('WorkspaceBrowser', () => {
expect(screen.getByText('分组方式')).toBeTruthy() // the menu heading label
expect(screen.getAllByRole('separator')).toHaveLength(2)
expect(screen.getAllByRole('menuitem').map(item => item.textContent)).toEqual([
- '按工作区', '按工作区树', '单列表', '手动排序', '最近更新', '显示已归档', '仅显示已归档',
+ '按工作区', '按工作区树', '单列表', '手动排序', '最近更新', '隐藏已归档', '全部对话(显示已归档)', '仅显示已归档',
])
expect(screen.getByRole('menuitem', { name: '按工作区' }).querySelector('svg')).toBeTruthy()
expect(screen.getByRole('menuitem', { name: '手动排序' }).querySelector('svg')).toBeTruthy()
@@ -487,7 +487,7 @@ describe('WorkspaceBrowser', () => {
expect(b.store.getSnapshot().groupBy).toBe('workspace')
})
- it('picking 显示已归档 keeps existing rows and reveals archived ones in place', () => {
+ it('picking 全部对话(显示已归档) keeps existing rows and reveals archived ones in place', () => {
mount({
useSessions: hook(sessionState([summary('kept', 2), summary('stored', 1)])),
useWorkspaces: hook(workspaceState([workspace('alpha', ['kept', 'stored'])], [sid('stored')])),
@@ -497,12 +497,12 @@ describe('WorkspaceBrowser', () => {
expect(screen.queryByText('stored')).toBeNull()
fireEvent.click(screen.getByRole('button', { name: '视图选项' }))
- fireEvent.click(screen.getByRole('menuitem', { name: '显示已归档' }))
+ fireEvent.click(screen.getByRole('menuitem', { name: '全部对话(显示已归档)' }))
expect(screen.getByText('kept')).toBeTruthy()
expect(screen.getByText('stored')).toBeTruthy()
})
- it('the two archived filters are mutually exclusive and re-picking returns to default', () => {
+ it('the archived filters are one exclusive choice and re-picking keeps it', () => {
const b = mount({
useSessions: hook(sessionState([summary('kept', 2), summary('stored', 1)])),
useWorkspaces: hook(workspaceState([workspace('alpha', ['kept', 'stored'])], [sid('stored')])),
@@ -519,26 +519,71 @@ describe('WorkspaceBrowser', () => {
expect(screen.queryByText('kept')).toBeNull()
expect(screen.getByText('stored')).toBeTruthy()
- // Picking the other filter replaces it: everything visible.
- pick('显示已归档')
+ // Picking another filter replaces it: everything visible.
+ pick('全部对话(显示已归档)')
expect(b.store.getSnapshot().archivedFilter).toBe('show')
expect(screen.getByText('kept')).toBeTruthy()
expect(screen.getByText('stored')).toBeTruthy()
- // Re-picking the selected filter returns to the default hidden view.
- pick('显示已归档')
- expect(b.store.getSnapshot().archivedFilter).toBe('default')
+ // Re-picking the selected filter keeps it selected.
+ pick('全部对话(显示已归档)')
+ expect(b.store.getSnapshot().archivedFilter).toBe('show')
expect(screen.getByText('kept')).toBeTruthy()
- expect(screen.queryByText('stored')).toBeNull()
+ expect(screen.getByText('stored')).toBeTruthy()
- // The same toggle-off applies to 仅显示已归档.
- pick('仅显示已归档')
- pick('仅显示已归档')
+ // 隐藏已归档 is the explicit way back to the default hidden view.
+ pick('隐藏已归档')
expect(b.store.getSnapshot().archivedFilter).toBe('default')
expect(screen.getByText('kept')).toBeTruthy()
expect(screen.queryByText('stored')).toBeNull()
})
+ it('仅显示已归档 hides Workspaces without archived Sessions', () => {
+ mount({
+ useSessions: hook(sessionState([summary('kept', 2), summary('stored', 1)])),
+ useWorkspaces: hook(workspaceState(
+ [workspace('alpha', ['kept', 'stored']), workspace('beta', ['kept'])],
+ [sid('stored')],
+ )),
+ })
+ expect(screen.getByText('alpha')).toBeTruthy()
+ expect(screen.getByText('beta')).toBeTruthy()
+
+ fireEvent.click(screen.getByRole('button', { name: '视图选项' }))
+ fireEvent.click(screen.getByRole('menuitem', { name: '仅显示已归档' }))
+ expect(screen.getByText('alpha')).toBeTruthy()
+ expect(screen.queryByText('beta')).toBeNull()
+
+ fireEvent.click(screen.getByRole('button', { name: '视图选项' }))
+ fireEvent.click(screen.getByRole('menuitem', { name: '隐藏已归档' }))
+ expect(screen.getByText('beta')).toBeTruthy()
+ })
+
+ it('仅显示已归档 nests tree children of hidden Workspaces under the nearest shown ancestor', () => {
+ mount({
+ useSessions: hook(sessionState([summary('live', 2), summary('stored', 1)])),
+ useWorkspaces: hook(workspaceState(
+ [
+ { ...workspace('root', ['live'], 'Projects'), path: '/projects' },
+ workspace('child', ['stored'], 'Child'),
+ ],
+ [sid('stored')],
+ )),
+ })
+ const choose = (name: string) => {
+ fireEvent.click(screen.getByRole('button', { name: '视图选项' }))
+ fireEvent.click(screen.getByRole('menuitem', { name }))
+ }
+ choose('按工作区树')
+ const parentSection = screen.getByText('Projects').closest('[class*="groupSection"]')!
+ expect(within(parentSection).getByText('Child')).toBeTruthy()
+
+ // Projects keeps no archived Sessions, so Child rises to the top level.
+ choose('仅显示已归档')
+ expect(screen.queryByText('Projects')).toBeNull()
+ expect(screen.getByText('Child')).toBeTruthy()
+ })
+
it('keeps the picked archived filter across remounts through the view store', () => {
const seats = {
useSessions: hook(sessionState([summary('kept', 2), summary('stored', 1)])),
@@ -547,7 +592,7 @@ describe('WorkspaceBrowser', () => {
const b = mount(seats)
fireEvent.click(screen.getByText('alpha'))
fireEvent.click(screen.getByRole('button', { name: '视图选项' }))
- fireEvent.click(screen.getByRole('menuitem', { name: '显示已归档' }))
+ fireEvent.click(screen.getByRole('menuitem', { name: '全部对话(显示已归档)' }))
expect(b.store.getSnapshot().archivedFilter).toBe('show')
cleanup()
@@ -1154,7 +1199,7 @@ describe('WorkspaceBrowser', () => {
unarchiveSession,
})
fireEvent.click(screen.getByRole('button', { name: '视图选项' }))
- fireEvent.click(screen.getByRole('menuitem', { name: '显示已归档' }))
+ fireEvent.click(screen.getByRole('menuitem', { name: '全部对话(显示已归档)' }))
fireEvent.click(screen.getByRole('button', { name: '搜索会话' }))
fireEvent.change(screen.getByPlaceholderText('搜索会话名称'), { target: { value: 'e' } })
await act(async () => { await Promise.resolve() })