@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.
- package/README.i18n.yaml +72 -5
- package/README.md +12 -10
- package/README.zh.md +12 -10
- package/lib/client.js +608 -329
- package/lib/types/client/WorkspacePicker.d.ts +3 -1
- package/lib/types/client/contract/slots.d.ts +60 -3
- package/lib/types/client/index.d.ts +5 -2
- package/lib/types/client/locales.d.ts +16 -4
- package/lib/types/client/navigation.d.ts +2 -1
- package/lib/types/client/rows/Rows.d.ts +14 -10
- package/lib/types/client/rows/WorkspaceBrowser.d.ts +1 -1
- package/lib/types/client/session-actions/ArchiveSession.d.ts +1 -1
- package/lib/types/client/session-actions/ForkSession.d.ts +1 -1
- package/lib/types/client/session-actions/RenameSession.d.ts +1 -1
- package/lib/types/client/session-actions/RowActionToast.d.ts +6 -5
- package/lib/types/client/shortcuts.d.ts +45 -0
- package/lib/types/client/tree.d.ts +3 -6
- package/package.json +25 -23
|
@@ -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
|
-
/**
|
|
374
|
-
|
|
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).
|
|
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,
|
|
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
|
|
78
|
-
*
|
|
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 -
|
|
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,
|
|
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
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
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
|
|
143
|
-
*
|
|
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-
|
|
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-
|
|
55
|
-
"@deepseek-ai/dsh-agent": "0.1.7-
|
|
56
|
-
"@deepseek-ai/dsh-api-session-controller": "0.1.7-
|
|
57
|
-
"@deepseek-ai/dsh-api-workspace-controller": "0.1.7-
|
|
58
|
-
"@deepseek-ai/dsh-client-connection": "0.1.7-
|
|
59
|
-
"@deepseek-ai/dsh-client-
|
|
60
|
-
"@deepseek-ai/dsh-client-
|
|
61
|
-
"@deepseek-ai/dsh-client-test-runtime": "0.1.7-
|
|
62
|
-
"@deepseek-ai/dsh-client-ui-conversation": "0.1.7-
|
|
63
|
-
"@deepseek-ai/dsh-client-ui-layout": "0.1.7-
|
|
64
|
-
"@deepseek-ai/dsh-client-ui-primitives": "0.1.7-
|
|
65
|
-
"@deepseek-ai/dsh-client-ui-
|
|
66
|
-
"@deepseek-ai/dsh-client-ui-
|
|
67
|
-
"@deepseek-ai/dsh-client-ui-
|
|
68
|
-
"@deepseek-ai/dsh-jobs": "0.1.7-
|
|
69
|
-
"@deepseek-ai/dsh-
|
|
70
|
-
"@deepseek-ai/dsh-session": "0.1.7-
|
|
71
|
-
"@deepseek-ai/dsh-
|
|
72
|
-
"@deepseek-ai/dsh-
|
|
73
|
-
"@deepseek-ai/dsh-
|
|
74
|
-
"@deepseek-ai/dsh-util-
|
|
75
|
-
"@deepseek-ai/dsh-
|
|
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",
|