@umialpha/dsh-client-ui-workspace-groups 0.0.0-stage → 0.1.0

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.
@@ -0,0 +1,246 @@
1
+ /**
2
+ * `workspace` namespace dictionaries: the browsing region (section header,
3
+ * search, tree rows, dialogs) and the pick/add flow. Runtime failure
4
+ * messages (wire error strings) pass through untranslated by policy.
5
+ */
6
+ /** Simplified Chinese dictionary (the key-set source of truth). */
7
+ export declare const zh: {
8
+ 'defaultWorkspace.failed': string;
9
+ 'draft.workspaceRequired': string;
10
+ 'draft.initializationFailed': string;
11
+ 'group.ungrouped': string;
12
+ 'session.new': string;
13
+ 'session.untitled': string;
14
+ 'shortcut.noSession': string;
15
+ 'shortcut.noPicker': string;
16
+ 'shortcut.directoryBusy': string;
17
+ 'shortcut.noCompletedTurn': string;
18
+ 'shortcut.forkFailed': string;
19
+ 'section.workspaces': string;
20
+ 'section.sessions': string;
21
+ 'viewOptions.label': string;
22
+ 'groupBy.label': string;
23
+ 'groupBy.workspace': string;
24
+ 'groupBy.workspaceTree': string;
25
+ 'groupBy.flat': string;
26
+ 'orderBy.label': string;
27
+ 'orderBy.manual': string;
28
+ 'orderBy.updated': string;
29
+ 'filterBy.label': string;
30
+ 'viewOptions.hideArchived': string;
31
+ 'viewOptions.showArchived': string;
32
+ 'viewOptions.onlyArchived': string;
33
+ 'sessions.expand': string;
34
+ 'sessions.collapse': string;
35
+ 'empty.none': string;
36
+ 'empty.noneArchived': string;
37
+ 'empty.viewOthers': string;
38
+ 'empty.noMatches': string;
39
+ 'workspace.add': string;
40
+ 'search.sessions.aria': string;
41
+ 'search.placeholder': string;
42
+ 'search.clear': string;
43
+ 'search.results.aria': string;
44
+ 'search.pending': string;
45
+ 'search.noMatches': string;
46
+ 'search.hasMore': string;
47
+ 'menu.addWorkspace': string;
48
+ 'picker.loading': string;
49
+ 'conflict.named': string;
50
+ 'folderError.title': string;
51
+ 'folderError.retry': string;
52
+ rename: string;
53
+ 'rename.workspace.title': string;
54
+ 'rename.session.title': string;
55
+ 'field.workspaceName': string;
56
+ 'field.sessionName': string;
57
+ 'delete.workspace': string;
58
+ 'delete.desc': string;
59
+ 'delete.pending': string;
60
+ 'menu.fork': string;
61
+ 'menu.archiveSession': string;
62
+ 'menu.unarchiveSession': string;
63
+ 'menu.pinSession': string;
64
+ 'menu.unpinSession': string;
65
+ 'row.archived': string;
66
+ 'row.pinned': string;
67
+ 'toast.archivedNotOpenable': string;
68
+ 'toast.archived': string;
69
+ 'toast.stoppedAndArchived': string;
70
+ 'archive.confirm.title': string;
71
+ 'archive.confirm.desc': string;
72
+ 'archive.confirm.activity': string;
73
+ 'archive.confirm.turn': string;
74
+ 'archive.confirm.subagents.one': string;
75
+ 'archive.confirm.subagents.other': string;
76
+ 'archive.confirm.jobs.one': string;
77
+ 'archive.confirm.jobs.other': string;
78
+ 'archive.confirm.schedules.one': string;
79
+ 'archive.confirm.schedules.other': string;
80
+ 'archive.confirm.other.one': string;
81
+ 'archive.confirm.other.other': string;
82
+ 'archive.confirm.listSeparator': string;
83
+ 'archive.confirm.action': string;
84
+ 'archive.confirm.pending': string;
85
+ 'toast.archivedUndo': string;
86
+ 'toast.archivedOr': string;
87
+ 'toast.archivedFilter': string;
88
+ 'toast.pinFailed': string;
89
+ 'toast.unpinFailed': string;
90
+ 'toast.createFailed': string;
91
+ 'toast.forkRequiresOpen': string;
92
+ 'toast.openForkSource': string;
93
+ 'sessions.count.one': string;
94
+ 'sessions.count.other': string;
95
+ 'actions.workspace.aria': string;
96
+ 'actions.session.aria': string;
97
+ 'actions.archive': string;
98
+ 'actions.unarchive': string;
99
+ 'actions.pin': string;
100
+ 'actions.unpin': string;
101
+ 'actions.newSession': string;
102
+ 'actions.newSession.aria': string;
103
+ 'status.running': string;
104
+ 'status.subagentsRunning.one': string;
105
+ 'status.subagentsRunning.other': string;
106
+ 'status.idle': string;
107
+ 'status.waitingApproval': string;
108
+ 'status.planReview': string;
109
+ 'status.waitingAnswer': string;
110
+ 'status.compact.approval': string;
111
+ 'status.compact.planReview': string;
112
+ 'status.compact.answer': string;
113
+ 'status.completed': string;
114
+ 'hover.created': string;
115
+ 'hover.copied': string;
116
+ 'date.ymd': string;
117
+ 'time.now': string;
118
+ 'time.minutes': string;
119
+ 'time.hours': string;
120
+ 'time.days': string;
121
+ 'time.months': string;
122
+ 'time.years': string;
123
+ 'time.ago': string;
124
+ };
125
+ /** The workspace namespace key union. */
126
+ export type WorkspaceKey = keyof typeof zh;
127
+ /** English dictionary, checked complete against the zh key set. */
128
+ export declare const en: {
129
+ 'defaultWorkspace.failed': string;
130
+ 'draft.workspaceRequired': string;
131
+ 'draft.initializationFailed': string;
132
+ 'group.ungrouped': string;
133
+ 'session.new': string;
134
+ 'session.untitled': string;
135
+ 'shortcut.noSession': string;
136
+ 'shortcut.noPicker': string;
137
+ 'shortcut.directoryBusy': string;
138
+ 'shortcut.noCompletedTurn': string;
139
+ 'shortcut.forkFailed': string;
140
+ 'section.workspaces': string;
141
+ 'section.sessions': string;
142
+ 'viewOptions.label': string;
143
+ 'groupBy.label': string;
144
+ 'groupBy.workspace': string;
145
+ 'groupBy.workspaceTree': string;
146
+ 'groupBy.flat': string;
147
+ 'orderBy.label': string;
148
+ 'orderBy.manual': string;
149
+ 'orderBy.updated': string;
150
+ 'filterBy.label': string;
151
+ 'viewOptions.hideArchived': string;
152
+ 'viewOptions.showArchived': string;
153
+ 'viewOptions.onlyArchived': string;
154
+ 'sessions.expand': string;
155
+ 'sessions.collapse': string;
156
+ 'empty.none': string;
157
+ 'empty.noneArchived': string;
158
+ 'empty.viewOthers': string;
159
+ 'empty.noMatches': string;
160
+ 'workspace.add': string;
161
+ 'search.sessions.aria': string;
162
+ 'search.placeholder': string;
163
+ 'search.clear': string;
164
+ 'search.results.aria': string;
165
+ 'search.pending': string;
166
+ 'search.noMatches': string;
167
+ 'search.hasMore': string;
168
+ 'menu.addWorkspace': string;
169
+ 'picker.loading': string;
170
+ 'conflict.named': string;
171
+ 'folderError.title': string;
172
+ 'folderError.retry': string;
173
+ rename: string;
174
+ 'rename.workspace.title': string;
175
+ 'rename.session.title': string;
176
+ 'field.workspaceName': string;
177
+ 'field.sessionName': string;
178
+ 'delete.workspace': string;
179
+ 'delete.desc': string;
180
+ 'delete.pending': string;
181
+ 'menu.fork': string;
182
+ 'menu.archiveSession': string;
183
+ 'menu.unarchiveSession': string;
184
+ 'menu.pinSession': string;
185
+ 'menu.unpinSession': string;
186
+ 'row.archived': string;
187
+ 'row.pinned': string;
188
+ 'toast.archivedNotOpenable': string;
189
+ 'toast.archived': string;
190
+ 'toast.stoppedAndArchived': string;
191
+ 'archive.confirm.title': string;
192
+ 'archive.confirm.desc': string;
193
+ 'archive.confirm.activity': string;
194
+ 'archive.confirm.turn': string;
195
+ 'archive.confirm.subagents.one': string;
196
+ 'archive.confirm.subagents.other': string;
197
+ 'archive.confirm.jobs.one': string;
198
+ 'archive.confirm.jobs.other': string;
199
+ 'archive.confirm.schedules.one': string;
200
+ 'archive.confirm.schedules.other': string;
201
+ 'archive.confirm.other.one': string;
202
+ 'archive.confirm.other.other': string;
203
+ 'archive.confirm.listSeparator': string;
204
+ 'archive.confirm.action': string;
205
+ 'archive.confirm.pending': string;
206
+ 'toast.archivedUndo': string;
207
+ 'toast.archivedOr': string;
208
+ 'toast.archivedFilter': string;
209
+ 'toast.pinFailed': string;
210
+ 'toast.unpinFailed': string;
211
+ 'toast.createFailed': string;
212
+ 'toast.forkRequiresOpen': string;
213
+ 'toast.openForkSource': string;
214
+ 'sessions.count.one': string;
215
+ 'sessions.count.other': string;
216
+ 'actions.workspace.aria': string;
217
+ 'actions.session.aria': string;
218
+ 'actions.archive': string;
219
+ 'actions.unarchive': string;
220
+ 'actions.pin': string;
221
+ 'actions.unpin': string;
222
+ 'actions.newSession': string;
223
+ 'actions.newSession.aria': string;
224
+ 'status.running': string;
225
+ 'status.subagentsRunning.one': string;
226
+ 'status.subagentsRunning.other': string;
227
+ 'status.idle': string;
228
+ 'status.waitingApproval': string;
229
+ 'status.planReview': string;
230
+ 'status.waitingAnswer': string;
231
+ 'status.compact.approval': string;
232
+ 'status.compact.planReview': string;
233
+ 'status.compact.answer': string;
234
+ 'status.completed': string;
235
+ 'hover.created': string;
236
+ 'hover.copied': string;
237
+ 'date.ymd': string;
238
+ 'time.now': string;
239
+ 'time.minutes': string;
240
+ 'time.hours': string;
241
+ 'time.days': string;
242
+ 'time.months': string;
243
+ 'time.years': string;
244
+ 'time.ago': string;
245
+ };
246
+ //# sourceMappingURL=locales.d.ts.map
@@ -0,0 +1,157 @@
1
+ /** Workspace archive and directory UI capability. */
2
+ import { Service, type Context } from '@deepseek-ai/cordis';
3
+ import type { ClientRemote, DirectoryListing, RemoteFailure } from '@deepseek-ai/dsh-api-remotes/client';
4
+ import type { ISessions, SessionTarget } from '@deepseek-ai/dsh-api-session-controller/client';
5
+ import type { IWorkspaces, WorkspaceId } from '@deepseek-ai/dsh-api-workspace-controller/client';
6
+ import type { SessionId } from '@deepseek-ai/dsh-session/types';
7
+ import type { DraftInitializationOptions } from '@deepseek-ai/dsh-client-ui-conversation/client';
8
+ import type { RowToast } from './contract/slots.ts';
9
+ import type { WorkspaceViewStoreActions } from './stores.ts';
10
+ /** Optional content preparation for the resolved target Session. */
11
+ export type StartSessionOptions = DraftInitializationOptions;
12
+ /** Workspace archive and directory operations consumed by Client UI domains. */
13
+ export interface UiWorkspace {
14
+ /**
15
+ * Select a Session and show its Conversation as one UI navigation action.
16
+ * @param target - known Session identity or durable direct-parent subagent address to display.
17
+ */
18
+ openSession(target: SessionTarget): void;
19
+ /**
20
+ * Connect a Workspace and open its Session unless a later navigation supersedes it.
21
+ * @param workspaceId - target Workspace.
22
+ * @param beforeOpen - optional synchronous preparation for the selected Session,
23
+ * skipped after supersession; a throw aborts the open and releases the retained reference.
24
+ * @returns completion; a superseded request may create a Session but does not open it.
25
+ * @throws on failure; a refused creation is also shown through the Workspace
26
+ * notice unless a later navigation or disposal superseded the request.
27
+ */
28
+ openWorkspace(workspaceId: WorkspaceId, beforeOpen?: (sessionId: SessionId) => void): Promise<void>;
29
+ /**
30
+ * Fork a Session without changing the current selection.
31
+ * @param sessionId - source Session.
32
+ * @param onCreated - observer before the optional child-title update.
33
+ * @param options - optional permission to start source migration; omission preserves the Host default.
34
+ * @returns the child SessionId after creation and inherited-title increment.
35
+ */
36
+ forkSession(sessionId: SessionId, onCreated?: (childId: SessionId) => void, options?: Pick<Parameters<ISessions['fork']>[0], 'allowMigration'>): Promise<SessionId>;
37
+ /**
38
+ * Resolve the reusable or newly created blank Session for a Workspace.
39
+ * @param workspaceId - target Workspace.
40
+ * @returns a Session already addressable through the Session Controller.
41
+ */
42
+ connectWorkspace(workspaceId: WorkspaceId): Promise<SessionId>;
43
+ /**
44
+ * Create a fresh Session, or reuse a blank when preparing an explicit draft. A creation the Host
45
+ * refuses is shown through the Workspace notice and leaves the selection as it was.
46
+ * @param workspaceId - explicit target; absent inherits the current or most recent Workspace.
47
+ * @param options - initial content; existing text or attachments are preserved unless clearPreviousDraft is true.
48
+ */
49
+ startSession(workspaceId?: WorkspaceId, options?: StartSessionOptions): void;
50
+ /**
51
+ * Archive a Session and clear it when it is the current selection.
52
+ * @param sessionId - Session to archive.
53
+ * @param options - `stopActivity` asks the Host to stop the Session's running work instead of refusing.
54
+ */
55
+ archiveSession(sessionId: SessionId, options?: {
56
+ readonly stopActivity?: boolean;
57
+ }): Promise<void>;
58
+ /**
59
+ * Unarchive a Session, restoring it to its recorded Workspace position.
60
+ * @param sessionId - Session to unarchive.
61
+ */
62
+ unarchiveSession(sessionId: SessionId): Promise<void>;
63
+ /**
64
+ * Pin a Session on the Host, then lead it in its accounts' saved orders
65
+ * (its Workspace group or Ungrouped, and the flat list). The order write
66
+ * reads the memberships current at completion, so reorders that landed
67
+ * while the Host call was pending keep their positions.
68
+ * @param sessionId - Session to pin.
69
+ */
70
+ pinSession(sessionId: SessionId): Promise<void>;
71
+ /**
72
+ * Unpin a Session on the Host; saved positions stay as they are.
73
+ * @param sessionId - Session to unpin.
74
+ */
75
+ unpinSession(sessionId: SessionId): Promise<void>;
76
+ /**
77
+ * Open the Host-native directory picker.
78
+ * @returns the selected directory, or null when cancelled.
79
+ */
80
+ pickDirectory(): Promise<string | null>;
81
+ /**
82
+ * List one Host directory level.
83
+ * @param path - directory path; absent selects the Host home.
84
+ * @param signal - cancellation for a superseded scan.
85
+ * @returns directory entries and breadcrumb ancestry.
86
+ */
87
+ listDirectory(path?: string, signal?: AbortSignal): Promise<DirectoryListing>;
88
+ /**
89
+ * Create a child directory.
90
+ * @param path - existing parent directory.
91
+ * @param name - child directory name.
92
+ * @returns created absolute path.
93
+ */
94
+ createDirectory(path: string, name: string): Promise<string>;
95
+ }
96
+ declare module '@deepseek-ai/cordis' {
97
+ interface Context {
98
+ /** Cross-Controller Workspace navigation and directory UI capability. */
99
+ uiWorkspace: UiWorkspace;
100
+ }
101
+ }
102
+ /** Structured directory failure exposed to directory UI consumers. */
103
+ export declare class DirectoryBrowseError extends Error {
104
+ readonly rpcError: RemoteFailure;
105
+ readonly name = "DirectoryBrowseError";
106
+ /** @param rpcError - Host directory business failure. */
107
+ constructor(rpcError: RemoteFailure);
108
+ }
109
+ /** Implements Workspace archive and directory UI operations. */
110
+ declare class UiWorkspaceService extends Service implements UiWorkspace {
111
+ private readonly directoryPicker;
112
+ private readonly workspaces;
113
+ private readonly sessions;
114
+ private readonly view;
115
+ private readonly notify;
116
+ private readonly connecting;
117
+ private readonly lifetime;
118
+ private readonly selection;
119
+ private mainReference;
120
+ /**
121
+ * @param ctx - Client root Context.
122
+ * @param directoryPicker - the directory-picking Remote namespace.
123
+ * @param workspaces - pure Workspace Controller.
124
+ * @param sessions - pure Session Controller.
125
+ * @param view - the browser's viewing-store write set (one instance shared with its registration).
126
+ * @param notify - show one notice through the Workspace notice channel.
127
+ */
128
+ constructor(ctx: Context, directoryPicker: ClientRemote['directoryPicker'], workspaces: IWorkspaces, sessions: ISessions, view: Pick<WorkspaceViewStoreActions, 'pinSessionOrder'>, notify: (toast: RowToast) => void);
129
+ connectWorkspace(workspaceId: WorkspaceId): Promise<SessionId>;
130
+ private connectBlank;
131
+ private reuseOrCreateBlank;
132
+ private reuseBlank;
133
+ openSession(target: SessionTarget): void;
134
+ openWorkspace(workspaceId: WorkspaceId, beforeOpen?: (sessionId: SessionId) => void): Promise<void>;
135
+ private openWorkspaceSession;
136
+ forkSession(sessionId: SessionId, onCreated?: (childId: SessionId) => void, options?: Pick<Parameters<ISessions['fork']>[0], 'allowMigration'>): Promise<SessionId>;
137
+ startSession(workspaceId?: WorkspaceId, options?: StartSessionOptions): void;
138
+ private prepareDraft;
139
+ private draftPreparationFailed;
140
+ archiveSession(sessionId: SessionId, options?: {
141
+ readonly stopActivity?: boolean;
142
+ }): Promise<void>;
143
+ unarchiveSession(sessionId: SessionId): Promise<void>;
144
+ pinSession(sessionId: SessionId): Promise<void>;
145
+ unpinSession(sessionId: SessionId): Promise<void>;
146
+ pickDirectory(): Promise<string | null>;
147
+ listDirectory(path?: string, signal?: AbortSignal): Promise<DirectoryListing>;
148
+ createDirectory(path: string, name: string): Promise<string>;
149
+ private watchNavigation;
150
+ private restoreSelection;
151
+ /** @returns true when an archived current selection was cleared. */
152
+ private clearArchivedCurrent;
153
+ private clearMain;
154
+ private replaceMain;
155
+ }
156
+ export { UiWorkspaceService };
157
+ //# sourceMappingURL=navigation.d.ts.map
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The complete account memberships a Pin order write reconciles against,
3
+ * derived from the same Host snapshots the browser orders by, so the
4
+ * UiWorkspace service can complete the write without the browser in the loop.
5
+ */
6
+ import type { SessionListState } from '@deepseek-ai/dsh-api-session-controller/client';
7
+ import type { WorkspaceView } from '@deepseek-ai/dsh-api-workspace-controller/client';
8
+ import type { SessionId } from '@deepseek-ai/dsh-session/types';
9
+ import { type SessionRowState } from './tree.ts';
10
+ /** What `pinSessionOrder` reconciles a pinned Session's accounts against. */
11
+ export interface PinOrderSource {
12
+ members: Readonly<Record<string, readonly SessionId[]>>;
13
+ summaries: SessionListState['byId'];
14
+ rowState: Pick<SessionRowState, 'pinnedSessionIds' | 'archivedSessionIds'>;
15
+ }
16
+ /**
17
+ * Every account's complete membership: each Workspace, Ungrouped, and the flat list.
18
+ * @param workspaces - current Host Workspaces.
19
+ * @param list - current Session list snapshot.
20
+ * @param rowState - registry-global pin and archive sets.
21
+ * @returns the order source for one pin write.
22
+ */
23
+ export declare function pinOrderSource(workspaces: readonly WorkspaceView[], list: SessionListState, rowState: PinOrderSource['rowState']): PinOrderSource;
24
+ /**
25
+ * The accounts a pinned Session leads: its group (or Ungrouped) and the flat list.
26
+ * @param workspaces - current Host Workspaces.
27
+ * @param sessionId - the Session being pinned.
28
+ * @returns the account keys `pinSessionOrder` fronts.
29
+ */
30
+ export declare function pinOrderAccounts(workspaces: readonly WorkspaceView[], sessionId: SessionId): readonly string[];
31
+ //# sourceMappingURL=pin-order.d.ts.map
@@ -0,0 +1,44 @@
1
+ /** React-commit-driven movement and entry/exit fades for the sidebar's keyed rows. */
2
+ import { Component, type ReactNode } from 'react';
3
+ interface AnimatedRowsProps {
4
+ children: ReactNode;
5
+ className: string;
6
+ label: string;
7
+ /** Unique DOM-order keys matching the rendered data-row-key attributes. */
8
+ rowKeys: readonly string[];
9
+ ready: boolean;
10
+ /** Changes that replace the view or reveal hidden rows settle immediately. */
11
+ resetKey: string;
12
+ }
13
+ interface RowPosition {
14
+ element: HTMLElement;
15
+ rect: DOMRect;
16
+ opacity: number;
17
+ }
18
+ interface RowSnapshot {
19
+ positions: Map<string, RowPosition>;
20
+ removed: Map<string, RowPosition>;
21
+ }
22
+ /**
23
+ * Animates keyed sidebar rows only when their rendered membership or order changes.
24
+ * Motion starts after the first pointer or keyboard input inside the mounted list.
25
+ * The parent supplies a positioned container for the inert exit overlay.
26
+ */
27
+ export declare class AnimatedRows extends Component<AnimatedRowsProps> {
28
+ private armed;
29
+ private readonly list;
30
+ private readonly overlay;
31
+ private readonly movements;
32
+ private readonly exits;
33
+ getSnapshotBeforeUpdate(previous: AnimatedRowsProps): RowSnapshot | null;
34
+ componentDidUpdate(previous: AnimatedRowsProps, _state: unknown, snapshot: RowSnapshot | null): void;
35
+ componentWillUnmount(): void;
36
+ private readPositions;
37
+ private move;
38
+ private cancelMovements;
39
+ private removeExit;
40
+ private clear;
41
+ render(): ReactNode;
42
+ }
43
+ export {};
44
+ //# sourceMappingURL=AnimatedRows.d.ts.map
@@ -0,0 +1,112 @@
1
+ import type { PropsRenderSlots } from '@deepseek-ai/dsh-client-ui-slots';
2
+ import type { ShortcutCatalogEntry } from '@deepseek-ai/dsh-client-shortcuts/client';
3
+ import type { WorkspaceBrowserProps } from '../contract/slots.ts';
4
+ import type { GroupNode, SearchResultNode, SessionNode } from '../tree.ts';
5
+ /** The standard locale seat, prop-passed from the browser root. */
6
+ type RowTranslate = WorkspaceBrowserProps['t'];
7
+ /**
8
+ * Row drag wiring supplied by the tree owner. `drop` reports the half of the
9
+ * row where the pointer released so the owner can resolve an insert anchor.
10
+ */
11
+ export interface RowDragProps {
12
+ /** Start dragging this row. */
13
+ start: () => void;
14
+ /** A compatible row drag is in flight. */
15
+ active: boolean;
16
+ /** Current marker on this row: insert line above, below, or none. */
17
+ marker: 'before' | 'after' | null;
18
+ /** Report the hovered half while a compatible drag passes over this row. */
19
+ hover: (half: 'before' | 'after') => void;
20
+ drop: (half: 'before' | 'after') => void;
21
+ end: () => void;
22
+ }
23
+ /** Drag lifecycle owned by a workspace row; its enclosing group owns hit testing. */
24
+ interface WorkspaceRowDragProps {
25
+ start: () => void;
26
+ end: () => void;
27
+ }
28
+ /**
29
+ * Project (workspace) header row: folder + title;
30
+ * hover reveals the chevron and create button, and dwelling on a real
31
+ * Workspace shows its hover card (the ungrouped bucket has none).
32
+ * `containsCurrent` arrives on the node (derivation fact, no renderer scan).
33
+ * @param props.group - derived group node.
34
+ * @param props.containsCurrentDescendant - highlight an ancestor even when its subtree is collapsed.
35
+ * @param props.onToggle - expand/collapse the group.
36
+ * @param props.onCreate - start a frontend Session inside this Workspace.
37
+ * @param props.drag - optional workspace-row drag wiring.
38
+ * @param props.home - host account home for POSIX hover-path abbreviation.
39
+ * @param props.t - the browser root's locale seat.
40
+ * @returns the row element.
41
+ */
42
+ export declare function ProjectRowItem({ group, containsCurrentDescendant, onToggle, onCreate, actions, drag, home, newShortcut, t }: {
43
+ group: GroupNode;
44
+ newShortcut?: ShortcutCatalogEntry | undefined;
45
+ containsCurrentDescendant?: boolean;
46
+ onToggle: () => void;
47
+ onCreate: () => void;
48
+ /** Real-Workspace actions; absent for the ungrouped bucket (no menu shown). */
49
+ actions?: {
50
+ rename: () => void;
51
+ delete: () => void;
52
+ } | undefined;
53
+ /** Present only for real Workspace rows in the grouped view. */
54
+ drag?: WorkspaceRowDragProps | undefined;
55
+ /** Host account home; POSIX home-rooted hover paths display as `~`. */
56
+ home?: string | undefined;
57
+ t: RowTranslate;
58
+ }): import("react").JSX.Element;
59
+ /**
60
+ * One flat search result: title, Workspace context, and optional content
61
+ * excerpt. Search navigation opens the session only; it does not address an
62
+ * event inside the conversation. Archived rows carry a hover unarchive
63
+ * button, because search is where the filter surfaces them for recovery.
64
+ * @param props.result - merged local/content search row.
65
+ * @param props.currentId - selected session id.
66
+ * @param props.onOpen - open the selected session.
67
+ * @param props.onUnarchive - unarchive an archived result row.
68
+ * @param props.t - Workspace-browser translation seat.
69
+ * @returns the result row.
70
+ */
71
+ export declare function SearchResultItem({ result, currentId, onOpen, onUnarchive, t }: {
72
+ result: SearchResultNode;
73
+ currentId: string | undefined;
74
+ onOpen: (id: SearchResultNode['id']) => void;
75
+ onUnarchive: (id: SearchResultNode['id']) => void;
76
+ t: RowTranslate;
77
+ }): import("react").JSX.Element;
78
+ /**
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.
85
+ * @param props.node - derived session node.
86
+ * @param props.currentId - selected session id (row highlight).
87
+ * @param props.now - epoch ms for relative-time formatting.
88
+ * @param props.onOpen - open a session by id.
89
+ * @param props.onRenameRequest - open the rename dialog from a title double-click (id + current title).
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.
93
+ * @param props.onReveal - scroll this row into view after search navigation, then acknowledge it.
94
+ * @param props.drag - optional row-drag target wiring; blank rows cannot start a drag.
95
+ * @param props.t - the browser root's locale seat.
96
+ * @returns the session row.
97
+ */
98
+ export declare function SessionNodeItem({ node, currentId, now, onOpen, onRenameRequest, renderSlot, onReveal, drag, t, }: {
99
+ node: SessionNode;
100
+ currentId: string | undefined;
101
+ now: number;
102
+ onOpen: (id: SessionNode['id']) => void;
103
+ /** Open the rename dialog from a title double-click (id + current title). */
104
+ onRenameRequest: (id: SessionNode['id'], currentTitle: string) => void;
105
+ /** Scroll this row into view after search navigation, then acknowledge it. */
106
+ onReveal?: (() => void) | undefined;
107
+ /** Present on reorderable-list rows so every row can remain a drop target. */
108
+ drag?: RowDragProps | undefined;
109
+ t: RowTranslate;
110
+ } & PropsRenderSlots<'sidebar.workspaces.session.menu.item' | 'sidebar.workspaces.session.row.action' | 'sidebar.session.row.leading' | 'sidebar.session.row.hover'>): import("react").JSX.Element;
111
+ export {};
112
+ //# sourceMappingURL=Rows.d.ts.map
@@ -0,0 +1,8 @@
1
+ import type { WorkspaceBrowserProps } from '../contract/slots.ts';
2
+ /**
3
+ * Render the browsing region.
4
+ * @param props - composed slot props (shell owner share + store + injected actions).
5
+ * @returns the region element tree.
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, useShortcuts, useWorkspaceShortcuts, requestSearch, requestAddWorkspace, closeAddWorkspace, setDirectoryBusy, dismissForkError, renderSlot, t, }: WorkspaceBrowserProps): import("react").JSX.Element;
8
+ //# sourceMappingURL=WorkspaceBrowser.d.ts.map
@@ -0,0 +1,23 @@
1
+ import type { ArchiveSessionInjected, SessionArchiveConfirmProps, SessionMenuItemProps, SessionRowActionProps } from '../contract/slots.ts';
2
+ /**
3
+ * Menu row (order 400): archive, or restore an archived row.
4
+ * @param props - owner share, the archive share, and the menu open state.
5
+ * @returns the row.
6
+ */
7
+ export declare function ArchiveSessionMenuItem({ sessionId, useArchived, useMenuOpenState, useShortcuts, archiveSession, unarchiveSession, t, }: SessionMenuItemProps<ArchiveSessionInjected>): import("react").JSX.Element;
8
+ /**
9
+ * Hover button (order 100): archive, or restore an archived row.
10
+ * @param props - owner share and the archive share.
11
+ * @returns the button.
12
+ */
13
+ export declare function ArchiveSessionRowButton({ sessionId, useArchived, archiveSession, unarchiveSession, t, }: SessionRowActionProps<ArchiveSessionInjected>): import("react").JSX.Element;
14
+ /**
15
+ * The `shell.overlay` entry: nothing while no confirmation is pending,
16
+ * otherwise one dialog per request (keyed by the Session). Confirming asks
17
+ * the Host to stop the listed work and archive; cancelling leaves the
18
+ * Session running and visible.
19
+ * @param props - the request hook, its settlement, the stop-and-archive hop, and the locale seat.
20
+ * @returns the open dialog, or null.
21
+ */
22
+ export declare function SessionArchiveConfirmDialog({ useArchiveRequest, settleSessionArchive, stopAndArchiveSession, t, }: SessionArchiveConfirmProps): import("react").JSX.Element | null;
23
+ //# sourceMappingURL=ArchiveSession.d.ts.map
@@ -0,0 +1,9 @@
1
+ import type { ForkSessionInjected, SessionMenuItemProps } from '../contract/slots.ts';
2
+ /**
3
+ * Menu row (order 300): fork at the Session's last completed turn; the child
4
+ * arrives through the Host list beside its source.
5
+ * @param props - owner share, menu open state, and the fork share.
6
+ * @returns the row.
7
+ */
8
+ export declare function ForkSessionMenuItem({ sessionId, useMenuOpenState, useShortcuts, forkSession, t, }: SessionMenuItemProps<ForkSessionInjected>): import("react").JSX.Element;
9
+ //# sourceMappingURL=ForkSession.d.ts.map
@@ -0,0 +1,14 @@
1
+ import type { PinSessionInjected, SessionMenuItemProps, SessionRowActionProps } from '../contract/slots.ts';
2
+ /**
3
+ * Menu row (order 100): pin or unpin by the row's current state; absent on archived rows.
4
+ * @param props - owner share, the pin share, and the menu open state.
5
+ * @returns the row, or null for an archived Session.
6
+ */
7
+ export declare function PinSessionMenuItem(props: SessionMenuItemProps<PinSessionInjected>): import("react").JSX.Element | null;
8
+ /**
9
+ * Hover button (order 200, rightmost: it lands where the rest-state pin marker sits); absent on archived rows.
10
+ * @param props - owner share and the pin share.
11
+ * @returns the button, or null for an archived Session.
12
+ */
13
+ export declare function PinSessionRowButton(props: SessionRowActionProps<PinSessionInjected>): import("react").JSX.Element | null;
14
+ //# sourceMappingURL=PinSession.d.ts.map