@deepseek-ai/dsh-client-ui-workspace 0.1.7-alpha.2 → 0.1.7-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -34,6 +34,8 @@ export interface WorkspacePickFlowProps {
34
34
  onPick: (workspaceId: WorkspaceId) => void;
35
35
  /** Close the popover (outside click / Escape / post-pick). */
36
36
  onClose: () => void;
37
+ /** Report the picking interaction and adoption occupancy. */
38
+ onBusyChange?: (busy: boolean) => void;
37
39
  /** Only offer the add action, hide existing workspaces. */
38
40
  addOnly?: boolean;
39
41
  /** Menu opening direction relative to the anchor. */
@@ -46,7 +48,7 @@ export interface WorkspacePickFlowProps {
46
48
  * @param props - owner-controlled flow props.
47
49
  * @returns menu + dialog elements.
48
50
  */
49
- export declare function WorkspacePickFlow({ t, open, anchorRef, useWorkspaces, createWorkspace, useDirectoryFlow, renderDirectoryFlow, onPick, onClose, addOnly, side, selectedId, }: WorkspacePickFlowProps): import("react").JSX.Element;
51
+ export declare function WorkspacePickFlow({ t, open, anchorRef, useWorkspaces, createWorkspace, useDirectoryFlow, renderDirectoryFlow, onPick, onClose, addOnly, onBusyChange, side, selectedId, }: WorkspacePickFlowProps): import("react").JSX.Element;
50
52
  /**
51
53
  * The conversation empty-state registration: adapts the owner share to the
52
54
  * core flow (all state and semantics live in the flow / the owner).
@@ -31,12 +31,20 @@
31
31
  * face and reading its own Host state through hooks that face injects, so a
32
32
  * client plugin's action lands beside them by `order` and needs nothing from
33
33
  * the browser beyond the row identity.
34
+ *
35
+ * The browser entry additionally declares two `list` seats per Session row
36
+ * (`sidebar.session.row.leading` / `sidebar.session.row.hover`) for ambient
37
+ * row decorations. Both take the row's Session identity and nothing else: a
38
+ * session-scoped seat would force a Session binding, which would activate and
39
+ * retain every listed Session.
34
40
  */
35
41
  import type { HostObservable, InjectFace, PropsHooks, PropsLocale, PropsRenderSlots, PropsRuntime, PropsStore, SlotHookFactory } from '@deepseek-ai/dsh-client-ui-slots';
36
42
  import type { SessionSearchResultItem } from '@deepseek-ai/dsh-api-session-controller/client';
37
43
  import type { RemoteHostFacts } from '@deepseek-ai/dsh-api-remotes/client';
38
44
  import type { SessionActivity, WorkspaceId, WorkspaceView } from '@deepseek-ai/dsh-api-workspace-controller/client';
39
45
  import type { SessionId } from '@deepseek-ai/dsh-session/types';
46
+ import type { ShortcutCatalogEntry } from '@deepseek-ai/dsh-client-shortcuts/client';
47
+ import type { WorkspaceShortcutState } from '../shortcuts.ts';
40
48
  import type { createWorkspaceViewStore } from '../stores.ts';
41
49
  /**
42
50
  * Owner share of the directory-flow holes: the complete conversation between
@@ -79,6 +87,15 @@ export type UseMenuOpenState = () => MenuOpenState;
79
87
  * @returns the hook the entry calls.
80
88
  */
81
89
  export declare const menuOpenStateFactory: SlotHookFactory<'sidebar.workspaces.session.menu.item', UseMenuOpenState>;
90
+ /**
91
+ * Owner share of the two Session-row schedule seats. Both receive only the
92
+ * row's Session identity: the occupant reads that Session's own scheduled
93
+ * tasks, and reading them activates nothing.
94
+ */
95
+ export interface SessionRowScheduleOwnerProps {
96
+ /** Session this row shows; the occupant addresses its own data by this id. */
97
+ readonly sessionId: SessionId;
98
+ }
82
99
  declare module '@deepseek-ai/dsh-client-ui-slots' {
83
100
  interface SlotMap {
84
101
  /** Directory-flow hole under the conversation empty-state picker (declared by the WorkspacePicker entry). */
@@ -93,6 +110,29 @@ declare module '@deepseek-ai/dsh-client-ui-slots' {
93
110
  scope: 'root';
94
111
  owner: DirectoryFlowOwnerProps;
95
112
  };
113
+ /**
114
+ * Leading decoration of one Session row, in the 16px cell before the title
115
+ * that the row's own state dot otherwise occupies. A higher-priority state
116
+ * (a pending interaction, a new message, live activity) replaces the seat
117
+ * with that dot for the same row, so an occupant here never renders beside
118
+ * a status dot and is mounted only by a row whose primary state is idle.
119
+ * An archived row keeps that cell blank — neither its status dot nor this
120
+ * seat renders there, and its live status appears on the hover card only.
121
+ */
122
+ 'sidebar.session.row.leading': {
123
+ kind: 'list';
124
+ scope: 'root';
125
+ owner: SessionRowScheduleOwnerProps;
126
+ };
127
+ /**
128
+ * Section of the Session row's hover card between its relative time and
129
+ * its trailing status line. Mounted only while that card is open.
130
+ */
131
+ 'sidebar.session.row.hover': {
132
+ kind: 'list';
133
+ scope: 'root';
134
+ owner: SessionRowScheduleOwnerProps;
135
+ };
96
136
  /**
97
137
  * The rows of one Session's "..." menu, in ascending `order`. ui-workspace
98
138
  * registers the shipped rows here — `pin` (100), `rename` (200), `fork`
@@ -132,6 +172,7 @@ declare module '@deepseek-ai/dsh-client-ui-slots' {
132
172
  inject: {
133
173
  hooks: {
134
174
  menuOpenState: SlotHookFactory<'sidebar.workspaces.session.menu.item', UseMenuOpenState>;
175
+ shortcuts: HostObservable<readonly ShortcutCatalogEntry[]>;
135
176
  };
136
177
  };
137
178
  };
@@ -181,7 +222,19 @@ export type WorkspaceBrowserInjected = {
181
222
  * saw. Select the field the surface needs (`info => info.home`).
182
223
  */
183
224
  hostInfo: HostObservable<RemoteHostFacts>;
225
+ workspaceShortcuts: HostObservable<WorkspaceShortcutState>;
226
+ shortcuts: HostObservable<readonly ShortcutCatalogEntry[]>;
184
227
  };
228
+ /** Open the browser search and focus its input. */
229
+ requestSearch: () => void;
230
+ /** Request the existing directory picker. */
231
+ requestAddWorkspace: () => void;
232
+ /** Consume the directory-picker opening request. */
233
+ closeAddWorkspace: () => void;
234
+ /** Publish directory interaction occupancy for command availability. */
235
+ setDirectoryBusy: (busy: boolean) => void;
236
+ /** Dismiss the shortcut's fork-failure notification. */
237
+ dismissForkError: () => void;
185
238
  /**
186
239
  * Start a New Session in a Workspace: reuse-or-create its blank session and
187
240
  * open it; without an explicit workspace, inherit the current Session
@@ -370,10 +423,14 @@ export interface RowToastInjected {
370
423
  export type SessionRenameDialogProps = PropsRuntime<'shell.overlay'> & PropsLocale<'workspace'> & Omit<SessionRenameDialogInjected, 'hooks'> & PropsHooks<SessionRenameDialogInjected['hooks']>;
371
424
  /** Props of the stop-and-archive dialog entry in `shell.overlay`. */
372
425
  export type SessionArchiveConfirmProps = PropsRuntime<'shell.overlay'> & PropsLocale<'workspace'> & Omit<SessionArchiveConfirmInjected, 'hooks'> & PropsHooks<SessionArchiveConfirmInjected['hooks']>;
373
- /** Props of the row toast entry in `shell.overlay`. */
374
- export type RowToastProps = PropsRuntime<'shell.overlay'> & PropsLocale<'workspace'> & Omit<RowToastInjected, 'hooks'> & PropsHooks<RowToastInjected['hooks']>;
426
+ /**
427
+ * Props of the row toast entry in `shell.overlay`. The declared viewing store
428
+ * carries the archived filter; the archived notice omits its filter action
429
+ * when archived rows are already visible.
430
+ */
431
+ export type RowToastProps = PropsRuntime<'shell.overlay'> & PropsLocale<'workspace'> & PropsStore<WorkspaceViewStoreHandle> & Omit<RowToastInjected, 'hooks'> & PropsHooks<RowToastInjected['hooks']>;
375
432
  /** Full browser props: shell owner share + viewing store + injected actions + the locale seat. */
376
- export type WorkspaceBrowserProps = PropsRuntime<'sidebar.workspaces'> & PropsRenderSlots<'sidebar.workspaces.directoryFlow' | 'sidebar.workspaces.session.menu.item' | 'sidebar.workspaces.session.row.action'> & PropsStore<WorkspaceViewStoreHandle> & Omit<WorkspaceBrowserInjected, 'hooks'> & PropsHooks<WorkspaceBrowserInjected['hooks']> & PropsLocale<'workspace'>;
433
+ export type WorkspaceBrowserProps = PropsRuntime<'sidebar.workspaces'> & PropsRenderSlots<'sidebar.workspaces.directoryFlow' | 'sidebar.workspaces.session.menu.item' | 'sidebar.workspaces.session.row.action' | 'sidebar.session.row.leading' | 'sidebar.session.row.hover'> & PropsStore<WorkspaceViewStoreHandle> & Omit<WorkspaceBrowserInjected, 'hooks'> & PropsHooks<WorkspaceBrowserInjected['hooks']> & PropsLocale<'workspace'>;
377
434
  /**
378
435
  * Picker-private injected share. Pick semantics remain in the owner's onPick
379
436
  * callback; this callback creates only the real Host Workspace. A type alias
@@ -9,7 +9,10 @@
9
9
  * action lists, and this apply registers the shipped actions — pin, rename,
10
10
  * fork, archive — into them the way any client plugin would, each with its
11
11
  * own behavior, plus the rename dialog and the row-action notice into
12
- * `shell.overlay` (see the contract module doc). Export discipline:
12
+ * `shell.overlay` (see the contract module doc). It also declares two
13
+ * Session-row seats: the leading decoration a row renders only while its own
14
+ * primary state is idle, and the section the row's hover card renders between
15
+ * its relative time and its trailing status line. Export discipline:
13
16
  * packages/client/AGENTS.md.
14
17
  */
15
18
  import type { Context } from '@deepseek-ai/cordis';
@@ -17,7 +20,7 @@ import type { WorkspaceSnapshot } from '@deepseek-ai/dsh-api-workspace-controlle
17
20
  import type { SnapshotSelectorHook } from '@deepseek-ai/dsh-client-ui-slots';
18
21
  import { type WorkspaceKey } from './locales.ts';
19
22
  export type { UiWorkspace } from './navigation.ts';
20
- export type { DirectoryFlowOwnerProps, DirectoryFlowSlotName, DirectoryPickingHooks, DirectoryPickingInjected, MenuOpenState, RowToast, SessionRenameTarget, SessionRowOwnerProps, UseMenuOpenState, WorkspaceBrowserInjected, WorkspaceBrowserProps, WorkspacePickerInjected, WorkspacePickerProps, } from './contract/slots.ts';
23
+ export type { DirectoryFlowOwnerProps, DirectoryFlowSlotName, DirectoryPickingHooks, DirectoryPickingInjected, MenuOpenState, RowToast, SessionRenameTarget, SessionRowOwnerProps, UseMenuOpenState, WorkspaceBrowserInjected, SessionRowScheduleOwnerProps, WorkspaceBrowserProps, WorkspacePickerInjected, WorkspacePickerProps, } from './contract/slots.ts';
21
24
  export type { WorkspaceKey } from './locales.ts';
22
25
  declare module '@deepseek-ai/dsh-client-ui-slots' {
23
26
  interface GlobalStandardProps {
@@ -6,9 +6,13 @@
6
6
  /** Simplified Chinese dictionary (the key-set source of truth). */
7
7
  export declare const zh: {
8
8
  'defaultWorkspace.failed': string;
9
- 'defaultWorkspace.title': string;
10
9
  'group.ungrouped': string;
11
10
  'session.new': string;
11
+ 'shortcut.noSession': string;
12
+ 'shortcut.noPicker': string;
13
+ 'shortcut.directoryBusy': string;
14
+ 'shortcut.noCompletedTurn': string;
15
+ 'shortcut.forkFailed': string;
12
16
  'section.workspaces': string;
13
17
  'section.sessions': string;
14
18
  'viewOptions.label': string;
@@ -20,11 +24,14 @@ export declare const zh: {
20
24
  'orderBy.manual': string;
21
25
  'orderBy.updated': string;
22
26
  'filterBy.label': string;
27
+ 'viewOptions.hideArchived': string;
23
28
  'viewOptions.showArchived': string;
24
29
  'viewOptions.onlyArchived': string;
25
30
  'sessions.expand': string;
26
31
  'sessions.collapse': string;
27
32
  'empty.none': string;
33
+ 'empty.noneArchived': string;
34
+ 'empty.viewOthers': string;
28
35
  'empty.noMatches': string;
29
36
  'workspace.add': string;
30
37
  'search.sessions.aria': string;
@@ -99,7 +106,6 @@ export declare const zh: {
99
106
  'status.compact.planReview': string;
100
107
  'status.compact.answer': string;
101
108
  'status.completed': string;
102
- 'schedule.active': string;
103
109
  'hover.created': string;
104
110
  'hover.copied': string;
105
111
  'date.ymd': string;
@@ -116,9 +122,13 @@ export type WorkspaceKey = keyof typeof zh;
116
122
  /** English dictionary, checked complete against the zh key set. */
117
123
  export declare const en: {
118
124
  'defaultWorkspace.failed': string;
119
- 'defaultWorkspace.title': string;
120
125
  'group.ungrouped': string;
121
126
  'session.new': string;
127
+ 'shortcut.noSession': string;
128
+ 'shortcut.noPicker': string;
129
+ 'shortcut.directoryBusy': string;
130
+ 'shortcut.noCompletedTurn': string;
131
+ 'shortcut.forkFailed': string;
122
132
  'section.workspaces': string;
123
133
  'section.sessions': string;
124
134
  'viewOptions.label': string;
@@ -130,11 +140,14 @@ export declare const en: {
130
140
  'orderBy.manual': string;
131
141
  'orderBy.updated': string;
132
142
  'filterBy.label': string;
143
+ 'viewOptions.hideArchived': string;
133
144
  'viewOptions.showArchived': string;
134
145
  'viewOptions.onlyArchived': string;
135
146
  'sessions.expand': string;
136
147
  'sessions.collapse': string;
137
148
  'empty.none': string;
149
+ 'empty.noneArchived': string;
150
+ 'empty.viewOthers': string;
138
151
  'empty.noMatches': string;
139
152
  'workspace.add': string;
140
153
  'search.sessions.aria': string;
@@ -209,7 +222,6 @@ export declare const en: {
209
222
  'status.compact.planReview': string;
210
223
  'status.compact.answer': string;
211
224
  'status.completed': string;
212
- 'schedule.active': string;
213
225
  'hover.created': string;
214
226
  'hover.copied': string;
215
227
  'date.ymd': string;
@@ -16,7 +16,8 @@ export interface UiWorkspace {
16
16
  /**
17
17
  * Connect a Workspace and open its Session unless a later navigation supersedes it.
18
18
  * @param workspaceId - target Workspace.
19
- * @param beforeOpen - optional synchronous preparation for the selected Session, skipped after supersession.
19
+ * @param beforeOpen - optional synchronous preparation for the selected Session,
20
+ * skipped after supersession; a throw aborts the open and releases the retained reference.
20
21
  * @returns completion; a superseded request may create a Session but does not open it.
21
22
  * @throws on failure; a refused creation is also shown through the Workspace
22
23
  * notice unless a later navigation or disposal superseded the request.
@@ -1,4 +1,5 @@
1
1
  import type { PropsRenderSlots } from '@deepseek-ai/dsh-client-ui-slots';
2
+ import type { ShortcutCatalogEntry } from '@deepseek-ai/dsh-client-shortcuts/client';
2
3
  import type { WorkspaceBrowserProps } from '../contract/slots.ts';
3
4
  import type { GroupNode, SearchResultNode, SessionNode } from '../tree.ts';
4
5
  /** The standard locale seat, prop-passed from the browser root. */
@@ -38,8 +39,9 @@ interface WorkspaceRowDragProps {
38
39
  * @param props.t - the browser root's locale seat.
39
40
  * @returns the row element.
40
41
  */
41
- export declare function ProjectRowItem({ group, containsCurrentDescendant, onToggle, onCreate, actions, drag, home, t }: {
42
+ export declare function ProjectRowItem({ group, containsCurrentDescendant, onToggle, onCreate, actions, drag, home, newShortcut, t }: {
42
43
  group: GroupNode;
44
+ newShortcut?: ShortcutCatalogEntry | undefined;
43
45
  containsCurrentDescendant?: boolean;
44
46
  onToggle: () => void;
45
47
  onCreate: () => void;
@@ -74,22 +76,26 @@ export declare function SearchResultItem({ result, currentId, onOpen, onUnarchiv
74
76
  t: RowTranslate;
75
77
  }): import("react").JSX.Element;
76
78
  /**
77
- * One top-level 34px session row: status dot (pending user interaction outranks
78
- * own or descendant activity), title, relative time or compact pending label,
79
- * and the row actions menu.
79
+ * One top-level 32px session row: leading 16px cell (status dot, or the
80
+ * leading seat while the row's primary state is idle), title, relative time or
81
+ * compact pending label, and the row actions menu. A row that owns a state dot
82
+ * keeps that cell and renders no seat, so an ambient automation mark never
83
+ * appears beside the row's own state dot. An archived row keeps the cell blank:
84
+ * neither marker renders there, and its live status stays on the hover card.
80
85
  * @param props.node - derived session node.
81
86
  * @param props.currentId - selected session id (row highlight).
82
87
  * @param props.now - epoch ms for relative-time formatting.
83
88
  * @param props.onOpen - open a session by id.
84
89
  * @param props.onRenameRequest - open the rename dialog from a title double-click (id + current title).
85
- * @param props.renderSlot - render the row's `sidebar.workspaces.session.menu.item` and `sidebar.workspaces.session.row.action` lists.
90
+ * @param props.renderSlot - child-seat renderer for the row's action lists
91
+ * (`sidebar.workspaces.session.menu.item` / `sidebar.workspaces.session.row.action`),
92
+ * its leading decoration, and its hover-card section.
86
93
  * @param props.onReveal - scroll this row into view after search navigation, then acknowledge it.
87
94
  * @param props.drag - optional row-drag target wiring; blank rows cannot start a drag.
88
- * @param props.flat - omit the empty status slot in the hierarchy-free flat list.
89
95
  * @param props.t - the browser root's locale seat.
90
96
  * @returns the session row.
91
97
  */
92
- export declare function SessionNodeItem({ node, currentId, now, onOpen, onRenameRequest, renderSlot, onReveal, drag, flat, t, }: {
98
+ export declare function SessionNodeItem({ node, currentId, now, onOpen, onRenameRequest, renderSlot, onReveal, drag, t, }: {
93
99
  node: SessionNode;
94
100
  currentId: string | undefined;
95
101
  now: number;
@@ -100,9 +106,7 @@ export declare function SessionNodeItem({ node, currentId, now, onOpen, onRename
100
106
  onReveal?: (() => void) | undefined;
101
107
  /** Present on reorderable-list rows so every row can remain a drop target. */
102
108
  drag?: RowDragProps | undefined;
103
- /** The row is rendered without a parent Workspace header. */
104
- flat?: boolean | undefined;
105
109
  t: RowTranslate;
106
- } & PropsRenderSlots<'sidebar.workspaces.session.menu.item' | 'sidebar.workspaces.session.row.action'>): import("react").JSX.Element;
110
+ } & PropsRenderSlots<'sidebar.workspaces.session.menu.item' | 'sidebar.workspaces.session.row.action' | 'sidebar.session.row.leading' | 'sidebar.session.row.hover'>): import("react").JSX.Element;
107
111
  export {};
108
112
  //# sourceMappingURL=Rows.d.ts.map
@@ -4,5 +4,5 @@ import type { WorkspaceBrowserProps } from '../contract/slots.ts';
4
4
  * @param props - composed slot props (shell owner share + store + injected actions).
5
5
  * @returns the region element tree.
6
6
  */
7
- export declare function WorkspaceBrowser({ wide, usePanelInfo, expandSidebar, useSessions, useSessionStatus, useWorkspaces, useStore, actions, startSession, open, requestSessionRename, notifyArchivedNotOpenable, renameWorkspace, deleteWorkspace, insertWorkspaceBefore, unarchiveSession, createWorkspace, searchSessions, searchResultLimit, useDirectoryFlow, useHostInfo, renderSlot, t, }: WorkspaceBrowserProps): import("react").JSX.Element;
7
+ export declare function WorkspaceBrowser({ wide, usePanelInfo, expandSidebar, useSessions, useSessionStatus, useWorkspaces, useStore, actions, startSession, open, requestSessionRename, notifyArchivedNotOpenable, renameWorkspace, deleteWorkspace, insertWorkspaceBefore, unarchiveSession, createWorkspace, searchSessions, searchResultLimit, useDirectoryFlow, useHostInfo, useShortcuts, useWorkspaceShortcuts, requestSearch, requestAddWorkspace, closeAddWorkspace, setDirectoryBusy, dismissForkError, renderSlot, t, }: WorkspaceBrowserProps): import("react").JSX.Element;
8
8
  //# sourceMappingURL=WorkspaceBrowser.d.ts.map
@@ -4,7 +4,7 @@ import type { ArchiveSessionInjected, SessionArchiveConfirmProps, SessionMenuIte
4
4
  * @param props - owner share, the archive share, and the menu open state.
5
5
  * @returns the row.
6
6
  */
7
- export declare function ArchiveSessionMenuItem({ sessionId, useArchived, useMenuOpenState, archiveSession, unarchiveSession, t, }: SessionMenuItemProps<ArchiveSessionInjected>): import("react").JSX.Element;
7
+ export declare function ArchiveSessionMenuItem({ sessionId, useArchived, useMenuOpenState, useShortcuts, archiveSession, unarchiveSession, t, }: SessionMenuItemProps<ArchiveSessionInjected>): import("react").JSX.Element;
8
8
  /**
9
9
  * Hover button (order 100): archive, or restore an archived row.
10
10
  * @param props - owner share and the archive share.
@@ -5,5 +5,5 @@ import type { ForkSessionInjected, SessionMenuItemProps } from '../contract/slot
5
5
  * @param props - owner share, menu open state, and the fork share.
6
6
  * @returns the row.
7
7
  */
8
- export declare function ForkSessionMenuItem({ sessionId, useMenuOpenState, forkSession, t }: SessionMenuItemProps<ForkSessionInjected>): import("react").JSX.Element;
8
+ export declare function ForkSessionMenuItem({ sessionId, useMenuOpenState, useShortcuts, forkSession, t, }: SessionMenuItemProps<ForkSessionInjected>): import("react").JSX.Element;
9
9
  //# sourceMappingURL=ForkSession.d.ts.map
@@ -4,7 +4,7 @@ import type { RenameSessionInjected, SessionMenuItemProps, SessionRenameDialogPr
4
4
  * @param props - owner share, menu open state, and the rename share.
5
5
  * @returns the row.
6
6
  */
7
- export declare function RenameSessionMenuItem({ sessionId, displayTitle, useMenuOpenState, requestSessionRename, t, }: SessionMenuItemProps<RenameSessionInjected>): import("react").JSX.Element;
7
+ export declare function RenameSessionMenuItem({ sessionId, displayTitle, useMenuOpenState, useShortcuts, requestSessionRename, t, }: SessionMenuItemProps<RenameSessionInjected>): import("react").JSX.Element;
8
8
  /**
9
9
  * The `shell.overlay` entry: nothing while no rename is requested, otherwise
10
10
  * one dialog per request (keyed by the Session, so a new request starts a
@@ -1,11 +1,12 @@
1
1
  import type { RowToastProps } from '../contract/slots.ts';
2
2
  /**
3
3
  * Render the current notice: the archived and stopped-and-archived notices
4
- * with their undo and show-archived actions on a 6 s hold, a refused Session
5
- * creation with the Host's reason on the same hold, or a plain warning for a
6
- * failed pin, an archived row that was clicked, or default Workspace creation.
7
- * @param props - the notice hook, its dismissal, the two archived-notice actions, and the locale seat.
4
+ * with their undo action — plus the show-archived action while archived rows
5
+ * are hidden — on a 6 s hold, a refused Session creation with the Host's
6
+ * reason on the same hold, or a plain warning for a failed pin, an archived
7
+ * row that was clicked, or default Workspace creation.
8
+ * @param props - the notice hook, the shared viewing store, the notice dismissal, the two archived-notice actions, and the locale seat.
8
9
  * @returns the notice on display, or null.
9
10
  */
10
- export declare function RowActionToast({ useToast, dismissToast, undoArchive, showArchived, t }: RowToastProps): import("react").JSX.Element | null;
11
+ export declare function RowActionToast({ useToast, useStore, dismissToast, undoArchive, showArchived, t }: RowToastProps): import("react").JSX.Element | null;
11
12
  //# sourceMappingURL=RowActionToast.d.ts.map
@@ -0,0 +1,45 @@
1
+ /** Workspace command registration and browser-owned opening requests. */
2
+ import type { Context } from '@deepseek-ai/cordis';
3
+ import type { SnapshotStore } from '@deepseek-ai/dsh-client-store';
4
+ import type { SessionId } from '@deepseek-ai/dsh-session/types';
5
+ import type { UiWorkspace } from './navigation.ts';
6
+ /** Transient requests consumed by the existing workspace browser. */
7
+ export interface WorkspaceShortcutState {
8
+ readonly searchRequest: number;
9
+ readonly addRequested: boolean;
10
+ readonly directoryBusy: boolean;
11
+ readonly renameTarget: {
12
+ readonly sessionId: SessionId;
13
+ readonly currentTitle: string;
14
+ } | null;
15
+ readonly forkError: {
16
+ readonly reason: 'unavailable' | 'failed';
17
+ readonly seq: number;
18
+ } | null;
19
+ }
20
+ interface WorkspaceShortcutControls {
21
+ state: SnapshotStore<WorkspaceShortcutState>;
22
+ search: () => void;
23
+ add: () => void;
24
+ closeAdd: () => void;
25
+ directoryBusy: (busy: boolean) => void;
26
+ rename: (sessionId: SessionId, currentTitle: string) => void;
27
+ closeRename: () => void;
28
+ forkFailed: (reason: 'unavailable' | 'failed') => void;
29
+ dismissForkError: () => void;
30
+ }
31
+ /**
32
+ * Create the private browser request source shared by commands and controls.
33
+ * @returns observable state and its complete mutation callbacks.
34
+ */
35
+ export declare function createWorkspaceShortcutControls(): WorkspaceShortcutControls;
36
+ /**
37
+ * Register navigation commands against the existing workspace owner.
38
+ * @param ctx - plugin context with the shortcut, locale, and model services.
39
+ * @param navigation - session creation and forking from the pointer controls' navigation service.
40
+ * @param controls - browser-owned opening requests.
41
+ * @param archiveSession - shared archive action, including running-work confirmation and notices.
42
+ */
43
+ export declare function installWorkspaceShortcuts(ctx: Context, navigation: Pick<UiWorkspace, 'startSession' | 'forkSession'>, controls: ReturnType<typeof createWorkspaceShortcutControls>, archiveSession: (sessionId: SessionId) => void): void;
44
+ export {};
45
+ //# sourceMappingURL=shortcuts.d.ts.map
@@ -33,8 +33,6 @@ export interface SessionNode {
33
33
  runningSubagentCount: number;
34
34
  /** Finished running while not selected and not yet opened (the green "done" reminder dot). */
35
35
  completed: boolean;
36
- /** The current list projection contains at least one active Schedule record. */
37
- hasActiveSchedule: boolean;
38
36
  /** In the registry-global pin set: leads its section, reorderable only among pinned rows. */
39
37
  pinned: boolean;
40
38
  /** In the registry-global archive set: shown grayed in place and not openable. */
@@ -73,8 +71,6 @@ export interface SearchResultNode {
73
71
  runningSubagentCount: number;
74
72
  /** Finished running while not selected and not yet opened (the green "done" reminder dot). */
75
73
  completed: boolean;
76
- /** The current list projection contains at least one active Schedule record. */
77
- hasActiveSchedule: boolean;
78
74
  /** In the registry-global archive set: shown grayed and not openable. */
79
75
  archived: boolean;
80
76
  snippet?: string;
@@ -139,8 +135,9 @@ export interface SessionRowState {
139
135
  /**
140
136
  * Derive the workspace browser groups with every session as a top-level row.
141
137
  *
142
- * Every group shows; sessions populate under expanded groups with pinned rows
143
- * leading in the selected local order. Blank sessions are
138
+ * Every group shows, except that the archived-only filter drops groups
139
+ * without visible members; sessions populate under expanded groups with
140
+ * pinned rows leading in the selected local order. Blank sessions are
144
141
  * excluded except for the selected provisional New Session row; archived
145
142
  * sessions keep their slots and appear per the archived filter. Content
146
143
  * search lives outside this derivation (see {@link deriveSearchResults}).
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-client-ui-workspace",
3
3
  "description": "Workspace picker plugin: one WorkspacePicker registered into the sidebar and empty-state workspace slots",
4
- "version": "0.1.7-alpha.2",
4
+ "version": "0.1.7-rc.2",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -33,6 +33,7 @@
33
33
  "@deepseek-ai/dsh-api-workspace-controller",
34
34
  "@deepseek-ai/dsh-client-connection",
35
35
  "@deepseek-ai/dsh-client-locale",
36
+ "@deepseek-ai/dsh-client-shortcuts",
36
37
  "@deepseek-ai/dsh-client-ui-conversation",
37
38
  "@deepseek-ai/dsh-client-ui-layout",
38
39
  "@deepseek-ai/dsh-client-ui-renderer",
@@ -51,28 +52,29 @@
51
52
  "clsx": "^2.0.0",
52
53
  "react": "^18.2.0",
53
54
  "@deepseek-ai/cordis": "~4.0.4",
54
- "@deepseek-ai/dsh-api-remotes": "0.1.7-alpha.2",
55
- "@deepseek-ai/dsh-agent": "0.1.7-alpha.2",
56
- "@deepseek-ai/dsh-api-session-controller": "0.1.7-alpha.2",
57
- "@deepseek-ai/dsh-api-workspace-controller": "0.1.7-alpha.2",
58
- "@deepseek-ai/dsh-client-connection": "0.1.7-alpha.2",
59
- "@deepseek-ai/dsh-client-locale": "0.1.7-alpha.2",
60
- "@deepseek-ai/dsh-client-store": "0.1.7-alpha.2",
61
- "@deepseek-ai/dsh-client-test-runtime": "0.1.7-alpha.2",
62
- "@deepseek-ai/dsh-client-ui-conversation": "0.1.7-alpha.2",
63
- "@deepseek-ai/dsh-client-ui-layout": "0.1.7-alpha.2",
64
- "@deepseek-ai/dsh-client-ui-primitives": "0.1.7-alpha.2",
65
- "@deepseek-ai/dsh-client-ui-renderer": "0.1.7-alpha.2",
66
- "@deepseek-ai/dsh-client-ui-sidebar": "0.1.7-alpha.2",
67
- "@deepseek-ai/dsh-client-ui-slots": "0.1.7-alpha.2",
68
- "@deepseek-ai/dsh-jobs": "0.1.7-alpha.2",
69
- "@deepseek-ai/dsh-schedule": "0.1.7-alpha.2",
70
- "@deepseek-ai/dsh-session": "0.1.7-alpha.2",
71
- "@deepseek-ai/dsh-subagent": "0.1.7-alpha.2",
72
- "@deepseek-ai/dsh-typert-protocol": "0.1.7-alpha.2",
73
- "@deepseek-ai/dsh-client-ui-session": "0.1.7-alpha.2",
74
- "@deepseek-ai/dsh-util-values": "0.1.7-alpha.2",
75
- "@deepseek-ai/dsh-util-workspace-path": "0.1.7-alpha.2"
55
+ "@deepseek-ai/dsh-api-remotes": "0.1.7-rc.2",
56
+ "@deepseek-ai/dsh-agent": "0.1.7-rc.2",
57
+ "@deepseek-ai/dsh-api-session-controller": "0.1.7-rc.2",
58
+ "@deepseek-ai/dsh-api-workspace-controller": "0.1.7-rc.2",
59
+ "@deepseek-ai/dsh-client-connection": "0.1.7-rc.2",
60
+ "@deepseek-ai/dsh-client-store": "0.1.7-rc.2",
61
+ "@deepseek-ai/dsh-client-locale": "0.1.7-rc.2",
62
+ "@deepseek-ai/dsh-client-test-runtime": "0.1.7-rc.2",
63
+ "@deepseek-ai/dsh-client-ui-conversation": "0.1.7-rc.2",
64
+ "@deepseek-ai/dsh-client-ui-layout": "0.1.7-rc.2",
65
+ "@deepseek-ai/dsh-client-ui-primitives": "0.1.7-rc.2",
66
+ "@deepseek-ai/dsh-client-ui-session": "0.1.7-rc.2",
67
+ "@deepseek-ai/dsh-client-ui-renderer": "0.1.7-rc.2",
68
+ "@deepseek-ai/dsh-client-ui-sidebar": "0.1.7-rc.2",
69
+ "@deepseek-ai/dsh-jobs": "0.1.7-rc.2",
70
+ "@deepseek-ai/dsh-client-ui-slots": "0.1.7-rc.2",
71
+ "@deepseek-ai/dsh-session": "0.1.7-rc.2",
72
+ "@deepseek-ai/dsh-schedule": "0.1.7-rc.2",
73
+ "@deepseek-ai/dsh-subagent": "0.1.7-rc.2",
74
+ "@deepseek-ai/dsh-typert-protocol": "0.1.7-rc.2",
75
+ "@deepseek-ai/dsh-util-workspace-path": "0.1.7-rc.2",
76
+ "@deepseek-ai/dsh-client-shortcuts": "0.1.7-rc.2",
77
+ "@deepseek-ai/dsh-util-values": "0.1.7-rc.2"
76
78
  },
77
79
  "files": [
78
80
  "lib/index.js",