@robota-sdk/agent-ui-web 3.3.0 → 3.3.1
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/CHANGELOG.md +11 -0
- package/dist/index.cjs +81 -81
- package/dist/index.d.cts +61 -61
- package/dist/index.d.ts +61 -61
- package/dist/index.js +81 -81
- package/dist/index.js.map +1 -1
- package/docs/SPEC.md +1 -1
- package/package.json +6 -6
- package/src/client/ws-session-client.ts +1 -1
- package/src/clipboard.ts +2 -2
- package/src/components/AgentActivityPanel.tsx +8 -8
- package/src/components/AgentSwitcherSheet.tsx +2 -2
- package/src/components/Composer.tsx +27 -27
- package/src/components/ConversationView.tsx +14 -14
- package/src/components/Dialog.tsx +6 -6
- package/src/components/DiffLines.tsx +2 -2
- package/src/components/ExecutionDetailSheet.tsx +1 -1
- package/src/components/HelpSheet.tsx +2 -2
- package/src/components/PermissionPrompt.tsx +22 -22
- package/src/components/PopupMenu.tsx +1 -1
- package/src/components/ProjectPanel.tsx +2 -2
- package/src/components/SessionMonitor.tsx +1 -1
- package/src/components/SessionSidebar.tsx +8 -8
- package/src/components/SessionSurface.tsx +18 -18
- package/src/components/SessionSurfaceChrome.tsx +8 -8
- package/src/components/SettingsGeneralSection.tsx +1 -1
- package/src/components/SettingsMcpSection.tsx +1 -1
- package/src/components/SettingsPermissionsSection.tsx +1 -1
- package/src/components/SettingsPluginsSection.tsx +1 -1
- package/src/components/SettingsProvidersSection.tsx +3 -3
- package/src/components/SettingsScreen.tsx +3 -3
- package/src/components/StatusControls.tsx +12 -12
- package/src/components/composer-attachments.ts +5 -5
- package/src/driver-labels.ts +3 -3
- package/src/execution-entry-status.ts +1 -1
- package/src/goal-view.ts +1 -1
- package/src/hooks/command-menu.ts +2 -2
- package/src/hooks/excluded-commands.ts +2 -2
- package/src/hooks/prompt-state.ts +4 -4
- package/src/hooks/server-message-handling.ts +11 -11
- package/src/hooks/session-client-types.ts +29 -29
- package/src/hooks/ui-intent-state.ts +6 -6
- package/src/hooks/use-agent-switcher-state.ts +2 -2
- package/src/hooks/use-media-query.ts +1 -1
- package/src/hooks/use-model-list.ts +1 -1
- package/src/hooks/use-project-panel.ts +1 -1
- package/src/hooks/use-schedules-state.ts +4 -4
- package/src/hooks/use-session-directory.ts +4 -4
- package/src/hooks/use-settings-state.ts +4 -4
- package/src/hooks/useSessionClient.ts +44 -44
- package/src/index.ts +5 -5
- package/src/schedule-view.ts +1 -1
- package/src/styles/surface.css +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -68,7 +68,7 @@ type TSessionStatus = Extract<TServerMessage, {
|
|
|
68
68
|
type: 'session_status';
|
|
69
69
|
}>['status'];
|
|
70
70
|
/**
|
|
71
|
-
*
|
|
71
|
+
* The models a person may switch to, grouped by configured provider profile —
|
|
72
72
|
* what the model control's pop-up menu is built from. `null` until requested (`list-models`).
|
|
73
73
|
*/
|
|
74
74
|
type TModelListSnapshot = Omit<Extract<TServerMessage, {
|
|
@@ -85,7 +85,7 @@ type TSessionsError = Omit<Extract<TServerMessage, {
|
|
|
85
85
|
type TCurrentSessionUsageReport = Extract<TServerMessage, {
|
|
86
86
|
type: 'usage_report';
|
|
87
87
|
}>['report'];
|
|
88
|
-
/**
|
|
88
|
+
/** The Project panel's reads. Each result crosses the wire unchanged from the session
|
|
89
89
|
* method's own return value (see `wire-messages.ts`'s doc comment on `project_status`). */
|
|
90
90
|
type TProjectStatusRead = Extract<TServerMessage, {
|
|
91
91
|
type: 'project_status';
|
|
@@ -101,7 +101,7 @@ interface IConversationMessage {
|
|
|
101
101
|
role: 'user' | 'assistant';
|
|
102
102
|
content: string;
|
|
103
103
|
isStreaming?: boolean;
|
|
104
|
-
/**
|
|
104
|
+
/** The co-driving author of a user turn. */
|
|
105
105
|
author?: string;
|
|
106
106
|
}
|
|
107
107
|
/**
|
|
@@ -128,7 +128,7 @@ interface IChangedFileSummary {
|
|
|
128
128
|
removed: number;
|
|
129
129
|
diffLines: readonly IDiffLine[];
|
|
130
130
|
}
|
|
131
|
-
/**
|
|
131
|
+
/** A turn that changed files ends with this compact summary row. */
|
|
132
132
|
interface IChangedFilesEntry {
|
|
133
133
|
id: string;
|
|
134
134
|
role: 'changed-files';
|
|
@@ -141,26 +141,26 @@ interface IActiveTool {
|
|
|
141
141
|
status: 'running' | 'done' | 'error';
|
|
142
142
|
input?: string;
|
|
143
143
|
result?: IToolState['result'];
|
|
144
|
-
/**
|
|
144
|
+
/** Correlates this call across `tool_start`/`tool_end` — how a finished call is matched. */
|
|
145
145
|
executionId?: string;
|
|
146
|
-
/**
|
|
146
|
+
/** A unified diff (Edit/Write), built server-side — the same one an approval prompt showed. */
|
|
147
147
|
diffLines?: readonly IDiffLine[];
|
|
148
|
-
/**
|
|
148
|
+
/** The file `diffLines` concerns, workspace-relative when the server could make it so. */
|
|
149
149
|
diffFile?: string;
|
|
150
|
-
/**
|
|
150
|
+
/** The tool's raw result payload (Shell output, Read content, …), already capped server-side. */
|
|
151
151
|
toolResultData?: string;
|
|
152
152
|
/** Admitted observations; opaque resource URIs do not authorize a client-side fetch. */
|
|
153
153
|
toolResultParts?: IToolState['toolResultParts'];
|
|
154
|
-
/**
|
|
154
|
+
/** A workspace-relative display form of a path argument, additive to `input`/`firstArg`. */
|
|
155
155
|
displayPath?: string;
|
|
156
|
-
/**
|
|
156
|
+
/** Set when this call is a projected `/command` tool — render "Ran /<commandName>". */
|
|
157
157
|
commandName?: string;
|
|
158
|
-
/**
|
|
158
|
+
/** True for an internal signal tool (e.g. goal-status) — never rendered as a call. */
|
|
159
159
|
internal?: boolean;
|
|
160
160
|
appView?: IToolAppViewRef;
|
|
161
161
|
}
|
|
162
162
|
/**
|
|
163
|
-
*
|
|
163
|
+
* A prompt the host queued behind the running turn — the server has already taken it, so it
|
|
164
164
|
* is not lost, but it will not run until the turn ends. `count` is the TOTAL number waiting (the shown
|
|
165
165
|
* `text` plus any behind it), matching the wire's `pendingCount`.
|
|
166
166
|
*/
|
|
@@ -173,14 +173,14 @@ interface ISessionNotice {
|
|
|
173
173
|
/**
|
|
174
174
|
* `session-change-refused`: the host refused a new or switch this surface asked for.
|
|
175
175
|
* `background-task-control-failed`: a Stop in the Agents panel did not take effect.
|
|
176
|
-
* `command-failed
|
|
176
|
+
* `command-failed`: a change made through a status control (model/mode/effort)
|
|
177
177
|
* failed — a plain notice rather than a conversation card, since the control's own label is where
|
|
178
178
|
* a successful change confirms itself and the label stays unchanged when it fails.
|
|
179
179
|
*/
|
|
180
180
|
kind: 'session-error' | 'protocol-error' | 'session-change-refused' | 'background-task-control-failed' | 'command-failed' | 'context-compacted';
|
|
181
181
|
message: string;
|
|
182
182
|
/**
|
|
183
|
-
* A `session-error` classified at the wire boundary
|
|
183
|
+
* A `session-error` classified at the wire boundary — present only when the host could
|
|
184
184
|
* tell what kind of failure this was. `SessionNotices` maps it to one plain sentence and keeps
|
|
185
185
|
* `message` behind a "Details" disclosure; absent, it shows `message` as before.
|
|
186
186
|
*/
|
|
@@ -207,7 +207,7 @@ type TMakeSessionClient<TStatus extends string = TConnectionStatus> = (callbacks
|
|
|
207
207
|
interface IWsSessionState<TStatus extends string = TConnectionStatus> {
|
|
208
208
|
status: TStatus;
|
|
209
209
|
/**
|
|
210
|
-
* Set by `useWsSession` once its reconnect retries give up
|
|
210
|
+
* Set by `useWsSession` once its reconnect retries give up: the runtime is not
|
|
211
211
|
* coming back by itself. Cleared again once `status` reaches `connected`. Undefined for a reducer
|
|
212
212
|
* with no such concept (e.g. the WebRTC surface, which has its own `failed`/`refused` statuses).
|
|
213
213
|
*/
|
|
@@ -227,7 +227,7 @@ interface IWsSessionState<TStatus extends string = TConnectionStatus> {
|
|
|
227
227
|
/** Null until the session has answered; refreshed after every command and turn. */
|
|
228
228
|
sessionStatus: TSessionStatus | null;
|
|
229
229
|
/**
|
|
230
|
-
*
|
|
230
|
+
* The models the model control's pop-up menu offers. Null until requested — the
|
|
231
231
|
* menu asks for it when it opens (or refreshes it) rather than every surface fetching it eagerly.
|
|
232
232
|
*/
|
|
233
233
|
modelList: TModelListSnapshot | null;
|
|
@@ -251,13 +251,13 @@ interface IWsSessionState<TStatus extends string = TConnectionStatus> {
|
|
|
251
251
|
setSessionSidebarOpen: (open: boolean) => void;
|
|
252
252
|
send: (msg: TClientMessage$1) => void;
|
|
253
253
|
/**
|
|
254
|
-
*
|
|
254
|
+
* Run a command the SAME way `send({type:'command', ...})` does, but mark its
|
|
255
255
|
* outcome as controls-triggered — `useSessionClient` skips the conversation card for a change made
|
|
256
256
|
* this way (the control's own label confirms it instead), while a typed command keeps its card.
|
|
257
257
|
*/
|
|
258
258
|
sendCommandSilently: (name: string, args?: string) => void;
|
|
259
259
|
pendingPrompts: readonly TPendingPrompt[];
|
|
260
|
-
/**
|
|
260
|
+
/** The prompt queued behind a running turn, or null when none is queued. */
|
|
261
261
|
queuedPrompt: IQueuedPrompt | null;
|
|
262
262
|
answerPermission: (id: string, result: TPermissionResultValue) => void;
|
|
263
263
|
answerAsk: (id: string, response: TActionResponse) => void;
|
|
@@ -275,29 +275,29 @@ interface IWsSessionState<TStatus extends string = TConnectionStatus> {
|
|
|
275
275
|
requestCurrentSessionUsage: () => void;
|
|
276
276
|
sessionNotices: readonly ISessionNotice[];
|
|
277
277
|
dismissSessionNotice: (id: string) => void;
|
|
278
|
-
/**
|
|
278
|
+
/** Whether the Settings modal is shown. `/settings` and the gear button both open it. */
|
|
279
279
|
settingsOpen: boolean;
|
|
280
280
|
settingsStatus: 'idle' | 'loading' | 'ready' | 'error';
|
|
281
281
|
/** Null until the first `get-settings` reply arrives. */
|
|
282
282
|
settingsSnapshot: ISettingsSnapshot | null;
|
|
283
283
|
/** The plain message from the most recent failed read or write, if any. */
|
|
284
284
|
settingsError: string | null;
|
|
285
|
-
/**
|
|
285
|
+
/** Which section the screen should land on for the open in progress. */
|
|
286
286
|
settingsInitialSectionId: string | null;
|
|
287
287
|
/**
|
|
288
288
|
* Opens the screen and (re-)fetches its snapshot — the "reopen and see the new value" path.
|
|
289
289
|
* `sectionId` jumps straight to that section (e.g. `/plugin` → `'plugins'`, "Manage providers…"
|
|
290
|
-
*
|
|
290
|
+
* → `'providers'`); omitted opens on the screen's own default (General).
|
|
291
291
|
*/
|
|
292
292
|
openSettings: (sectionId?: string) => void;
|
|
293
293
|
closeSettings: () => void;
|
|
294
294
|
/** A failed write leaves `settingsSnapshot` at its previous value; `settingsError` names why. */
|
|
295
295
|
updateSettings: (patch: TSettingsPatch) => void;
|
|
296
|
-
/**
|
|
296
|
+
/** Whether the Help sheet is shown. `/help` opens it instead of reaching the session. */
|
|
297
297
|
helpOpen: boolean;
|
|
298
298
|
openHelp: () => void;
|
|
299
299
|
closeHelp: () => void;
|
|
300
|
-
/**
|
|
300
|
+
/** The id of the execution-workspace entry open in the detail sheet, or null when closed. */
|
|
301
301
|
openEntryId: string | null;
|
|
302
302
|
executionDetailStatus: 'idle' | 'loading' | 'ready' | 'error';
|
|
303
303
|
executionDetailRecords: readonly IExecutionDetailRecord[];
|
|
@@ -319,21 +319,21 @@ interface IWsSessionState<TStatus extends string = TConnectionStatus> {
|
|
|
319
319
|
openExecutionDetail: (entryId: string) => void;
|
|
320
320
|
loadMoreExecutionDetail: () => void;
|
|
321
321
|
closeExecutionDetail: () => void;
|
|
322
|
-
/**
|
|
322
|
+
/** The Project panel's "Changes" section (git status). */
|
|
323
323
|
projectStatusState: 'idle' | 'loading' | 'ready' | 'error';
|
|
324
324
|
projectStatus: TProjectStatusRead | null;
|
|
325
325
|
requestProjectStatus: () => void;
|
|
326
|
-
/**
|
|
326
|
+
/** The Project panel's "File diff" section, for the file `projectDiffPath` names. */
|
|
327
327
|
projectDiffState: 'idle' | 'loading' | 'ready' | 'error';
|
|
328
328
|
projectDiffPath: string | null;
|
|
329
329
|
projectDiff: TProjectDiffRead | null;
|
|
330
330
|
requestProjectDiff: (path: string) => void;
|
|
331
|
-
/**
|
|
331
|
+
/** The Project panel's "Memory" section. */
|
|
332
332
|
projectMemoryState: 'idle' | 'loading' | 'ready' | 'error';
|
|
333
333
|
projectMemory: TProjectMemoryRead | null;
|
|
334
334
|
requestProjectMemory: () => void;
|
|
335
335
|
/**
|
|
336
|
-
*
|
|
336
|
+
* Whether the agent switcher sheet is shown. `/agent` (bare) and this surface's
|
|
337
337
|
* own control both open it.
|
|
338
338
|
*/
|
|
339
339
|
agentSwitcherOpen: boolean;
|
|
@@ -350,7 +350,7 @@ interface IWsSessionState<TStatus extends string = TConnectionStatus> {
|
|
|
350
350
|
/** Runs the same path as `/agent <name>`. */
|
|
351
351
|
selectAgent: (agentType: string) => void;
|
|
352
352
|
/**
|
|
353
|
-
*
|
|
353
|
+
* The schedules shown in the Agents panel's "Scheduled" group — every
|
|
354
354
|
* `IBackgroundTaskState` of `kind: 'scheduled'`, refreshed on connect and after a write.
|
|
355
355
|
*/
|
|
356
356
|
scheduledTasks: readonly IBackgroundTaskState<'scheduled'>[];
|
|
@@ -359,7 +359,7 @@ interface IWsSessionState<TStatus extends string = TConnectionStatus> {
|
|
|
359
359
|
resumeSchedule: (taskId: string) => void;
|
|
360
360
|
/**
|
|
361
361
|
* Permanently stops a schedule — the same `cancel-background-task` write Stop already uses. A
|
|
362
|
-
* failure surfaces the same way a failed Stop does (
|
|
362
|
+
* failure surfaces the same way a failed Stop does (the `background-task-control-failed`
|
|
363
363
|
* session notice) — no separate error state here.
|
|
364
364
|
*/
|
|
365
365
|
deleteSchedule: (taskId: string) => void;
|
|
@@ -397,7 +397,7 @@ declare function createDesktopSessionClient(bridge: IDesktopSessionBridge, callb
|
|
|
397
397
|
//#endregion
|
|
398
398
|
//#region src/components/composer-attachments.d.ts
|
|
399
399
|
/**
|
|
400
|
-
* One file the desktop host's native "Attach files" dialog returned
|
|
400
|
+
* One file the desktop host's native "Attach files" dialog returned. Kept in structural
|
|
401
401
|
* sync with `IPickedFile` in `apps/agent-gui-web/src/gui-host.ts` and
|
|
402
402
|
* `apps/agent-app/electron/sidecar.ts` — the three are not imported across the Electron/browser/
|
|
403
403
|
* presentation package boundaries, same as this codebase already does for the trust question.
|
|
@@ -476,7 +476,7 @@ declare function guiScreenForUiIntent(intent: TCommandUiIntent): 'session-sideba
|
|
|
476
476
|
* Describe one intent for this surface: a plain, honest sentence for a screen this HOST cannot back
|
|
477
477
|
* right now (a session picker with no session list), the `/theme` exclusion this intent defensively
|
|
478
478
|
* reuses, or an unrecognized future kind. Never called for `show-settings`, `show-plugin-manager` or
|
|
479
|
-
* `show-agent-switcher` — all three always have a screen now
|
|
479
|
+
* `show-agent-switcher` — all three always have a screen now —
|
|
480
480
|
* but their cases are left out of this switch rather than kept as dead branches that would claim
|
|
481
481
|
* otherwise; an unknown wire-level kind (a newer host) still yields an explicit notice naming the raw
|
|
482
482
|
* kind, so the "never a silent no-op" floor holds for future intents too.
|
|
@@ -489,7 +489,7 @@ interface IConversationViewProps {
|
|
|
489
489
|
activeTools: IActiveTool[];
|
|
490
490
|
streamingText: string;
|
|
491
491
|
isThinking: boolean;
|
|
492
|
-
/** This connection's own driver id
|
|
492
|
+
/** This connection's own driver id, threaded to every message it renders. */
|
|
493
493
|
ownDriverId: TDriverId | null;
|
|
494
494
|
}
|
|
495
495
|
declare function ConversationView({ messages, activeTools, streamingText, isThinking, ownDriverId }: IConversationViewProps): React$1.ReactElement;
|
|
@@ -497,34 +497,34 @@ declare function ConversationView({ messages, activeTools, streamingText, isThin
|
|
|
497
497
|
//#region src/components/AgentActivityPanel.d.ts
|
|
498
498
|
interface IAgentActivityPanelProps {
|
|
499
499
|
tasks: readonly IExecutionWorkspaceEntry[];
|
|
500
|
-
/**
|
|
500
|
+
/** The "Scheduled" group — every `kind: 'scheduled'` background task. */
|
|
501
501
|
schedules?: readonly IBackgroundTaskState<'scheduled'>[];
|
|
502
|
-
/**
|
|
502
|
+
/** The current goal (`/goal`), or null/absent when none is set. */
|
|
503
503
|
goal?: IGoalState | null;
|
|
504
504
|
onPauseSchedule?: (taskId: string) => void;
|
|
505
505
|
onResumeSchedule?: (taskId: string) => void;
|
|
506
506
|
onDeleteSchedule?: (taskId: string) => void;
|
|
507
507
|
onCancelGoal?: () => void;
|
|
508
508
|
className?: string;
|
|
509
|
-
/**
|
|
509
|
+
/** Open a non-main-thread entry's detail sheet. */
|
|
510
510
|
onSelect?: (entry: IExecutionWorkspaceEntry) => void;
|
|
511
|
-
/**
|
|
511
|
+
/** The main thread entry was clicked — the conversation beside this panel is it. */
|
|
512
512
|
onReturnToConversation?: () => void;
|
|
513
|
-
/**
|
|
513
|
+
/** Stop was clicked on a running/queued entry. */
|
|
514
514
|
onStop?: (entry: IExecutionWorkspaceEntry) => void;
|
|
515
|
-
/**
|
|
515
|
+
/** The entry whose detail sheet is currently open, for a highlighted row. */
|
|
516
516
|
selectedEntryId?: string;
|
|
517
517
|
}
|
|
518
518
|
declare function AgentActivityPanel({ tasks, schedules, goal, onPauseSchedule, onResumeSchedule, onDeleteSchedule, onCancelGoal, className, onSelect, onReturnToConversation, onStop, selectedEntryId }: IAgentActivityPanelProps): React$1.ReactElement;
|
|
519
519
|
//#endregion
|
|
520
520
|
//#region src/components/AgentSwitcherSheet.d.ts
|
|
521
521
|
/**
|
|
522
|
-
*
|
|
522
|
+
* The agent switcher: `show-agent-switcher` (`/agent` with no args) opens this
|
|
523
523
|
* sheet instead of the surface's old "not available" line. It lists every agent this session can
|
|
524
524
|
* run — name, one-line description, and where each is defined in plain words — with the current one
|
|
525
525
|
* checked. Choosing a row runs the SAME path as typing `/agent <name>` (a plain `command`, wired in
|
|
526
526
|
* `useAgentSwitcherState`); the reply is this sheet's own confirmation line, never a conversation
|
|
527
|
-
* card
|
|
527
|
+
* card.
|
|
528
528
|
*/
|
|
529
529
|
declare function AgentSwitcherSheet({ state }: {
|
|
530
530
|
state: IWsSessionState;
|
|
@@ -532,19 +532,19 @@ declare function AgentSwitcherSheet({ state }: {
|
|
|
532
532
|
//#endregion
|
|
533
533
|
//#region src/components/PermissionPrompt.d.ts
|
|
534
534
|
/**
|
|
535
|
-
* Renders the owner's pending permission/ask prompts
|
|
535
|
+
* Renders the owner's pending permission/ask prompts. Under local == remote the paired
|
|
536
536
|
* browser owner answers its OWN prompts; the first pending prompt is shown. A gated tool call blocks
|
|
537
537
|
* until answered, so this is on the critical path — not decorative.
|
|
538
538
|
*
|
|
539
539
|
* `modal` covers the page; `dock` sits above the composer, as desktop agent apps place a pending
|
|
540
540
|
* question next to where the answer is typed. Once armed and focused, its keys answer it: 1–9 picks
|
|
541
541
|
* an option, Esc cancels a question or denies a permission — but it never takes that focus away from
|
|
542
|
-
* a field the person is typing in
|
|
542
|
+
* a field the person is typing in. A click on a button always answers at once. An ask whose
|
|
543
543
|
* request sets `allowFreeText` also shows a text field (masked when `masked` is set); Enter there
|
|
544
|
-
* submits it, and its own keys never reach the prompt's shortcuts
|
|
544
|
+
* submits it, and its own keys never reach the prompt's shortcuts. The field's typed value
|
|
545
545
|
* lives only in `FreeTextField`, keyed by `prompt.id`: a cancelled or answered prompt's text can
|
|
546
546
|
* never reach the next prompt's render, masked or not, because the field is a fresh component
|
|
547
|
-
* instance rather than a value carried over in this component's own state
|
|
547
|
+
* instance rather than a value carried over in this component's own state.
|
|
548
548
|
*
|
|
549
549
|
* An ask whose `maxSelect` is above 1 is a multi-select: each option is a toggle (a click or 1–9 ticks
|
|
550
550
|
* it, nothing answers yet), and Submit — or Enter at the prompt, once the selection is allowed —
|
|
@@ -556,7 +556,7 @@ interface IPermissionPromptProps {
|
|
|
556
556
|
prompts: readonly TPendingPrompt[];
|
|
557
557
|
onAnswerPermission: (id: string, result: boolean) => void;
|
|
558
558
|
onAnswerAsk: (id: string, response: TActionResponse) => void;
|
|
559
|
-
/** This connection's own driver id
|
|
559
|
+
/** This connection's own driver id: a prompt raised by its own turn shows no requester. */
|
|
560
560
|
ownDriverId?: TDriverId | null;
|
|
561
561
|
layout?: 'modal' | 'dock';
|
|
562
562
|
/** How long a new prompt waits before its keys answer it; tests pass their own. */
|
|
@@ -592,17 +592,17 @@ declare function SessionSurface({ state, surface, personalUsageEnabled: personal
|
|
|
592
592
|
/** Secure desktop discards unsent text and attachment paths when the session closes. */
|
|
593
593
|
draftMode?: 'persistent' | 'volatile';
|
|
594
594
|
/**
|
|
595
|
-
* Present only when the host can restart the runtime after the connection is lost for good (
|
|
596
|
-
*
|
|
595
|
+
* Present only when the host can restart the runtime after the connection is lost for good (the
|
|
596
|
+
* desktop app); absent in the browser, where the banner says how to reopen it instead.
|
|
597
597
|
*/
|
|
598
598
|
onReconnect?: () => Promise<void>;
|
|
599
|
-
/** Forwarded to the composer's attach button — present only on the desktop app
|
|
599
|
+
/** Forwarded to the composer's attach button — present only on the desktop app. */
|
|
600
600
|
pickFiles?: () => Promise<readonly IPickedFile[]>;
|
|
601
|
-
/** Forwarded to the composer's drag-and-drop — present only on the desktop app
|
|
601
|
+
/** Forwarded to the composer's drag-and-drop — present only on the desktop app. */
|
|
602
602
|
getPathForFile?: (file: File) => string;
|
|
603
603
|
/**
|
|
604
604
|
* The Project panel's memory "Open in editor" action — present only when the host can open a file
|
|
605
|
-
* in an external editor (the desktop app
|
|
605
|
+
* in an external editor (the desktop app). Absent in the browser, where the action
|
|
606
606
|
* itself is hidden (only shown "if the host supports it").
|
|
607
607
|
*/
|
|
608
608
|
onOpenMemoryInEditor?: (path: string) => void;
|
|
@@ -610,7 +610,7 @@ declare function SessionSurface({ state, surface, personalUsageEnabled: personal
|
|
|
610
610
|
}): React.ReactElement;
|
|
611
611
|
/**
|
|
612
612
|
* A centered chrome frame for the pre-session (loading) and fatal states — reused by app shells. Its
|
|
613
|
-
* content area is this page's `main` landmark
|
|
613
|
+
* content area is this page's `main` landmark: nothing above `CenteredChrome`'s
|
|
614
614
|
* three call sites (starting, fatal, the trust question) supplies one, and none of the three ever
|
|
615
615
|
* render alongside `SessionSurface`'s own. `header` stays a sibling of `main`, not inside it, so it
|
|
616
616
|
* keeps its own implicit `banner` role.
|
|
@@ -622,12 +622,12 @@ declare function CenteredChrome({ tone, children }: {
|
|
|
622
622
|
//#endregion
|
|
623
623
|
//#region src/components/SessionSidebar.d.ts
|
|
624
624
|
/**
|
|
625
|
-
*
|
|
625
|
+
* This workspace's sessions on the left of the conversation, as in Claude Code Desktop:
|
|
626
626
|
* start a new one, or click another to make it current. Rows the host could not read are listed,
|
|
627
627
|
* disabled, so a damaged session never looks deleted. A refused switch comes back as a notice.
|
|
628
628
|
* A host that keeps several sessions live marks the rows running now and counts who else is on them.
|
|
629
629
|
*
|
|
630
|
-
*
|
|
630
|
+
* Each row also carries a "More" menu (or right-click) with Rename (inline) and Delete
|
|
631
631
|
* (confirmed). Rename on the current row reuses the `/rename` command, which also updates the live
|
|
632
632
|
* session's own name and title bar; rename on any other row writes the stored record directly.
|
|
633
633
|
*/
|
|
@@ -648,9 +648,9 @@ declare function SessionMonitor({ wsUrl, className }: ISessionMonitorProps): Rea
|
|
|
648
648
|
//#endregion
|
|
649
649
|
//#region src/components/Dialog.d.ts
|
|
650
650
|
/**
|
|
651
|
-
* The shared modal-shell primitive (
|
|
652
|
-
*
|
|
653
|
-
*
|
|
651
|
+
* The shared modal-shell primitive (the model/mode controls and the
|
|
652
|
+
* session-delete confirmation both need a confirmation dialog). Both
|
|
653
|
+
* consumers share it rather than shipping a second copy.
|
|
654
654
|
*
|
|
655
655
|
* `role="dialog"` (or `"alertdialog"`, see `role` below), `aria-modal`, a labelled title, focus moved
|
|
656
656
|
* inside on open, a focus trap while open, Esc to close, and focus restored to whatever had it before
|
|
@@ -671,7 +671,7 @@ interface IDialogProps {
|
|
|
671
671
|
/** Id of an element describing the dialog, wired to `aria-describedby`. */
|
|
672
672
|
describedById?: string;
|
|
673
673
|
/**
|
|
674
|
-
* Overrides what focus returns to when the dialog closes
|
|
674
|
+
* Overrides what focus returns to when the dialog closes. Default behavior captures
|
|
675
675
|
* `document.activeElement` when the dialog opens — which fails for a caller whose opener element
|
|
676
676
|
* is removed from the DOM in the SAME update that opens this dialog (e.g. a menu item whose menu
|
|
677
677
|
* closes as this dialog opens): by the time this dialog's open-effect runs, the browser has already
|
|
@@ -679,7 +679,7 @@ interface IDialogProps {
|
|
|
679
679
|
*/
|
|
680
680
|
restoreFocusTo?: HTMLElement | null;
|
|
681
681
|
/**
|
|
682
|
-
*
|
|
682
|
+
* `'alertdialog'` for a dialog that interrupts to demand a decision before anything else
|
|
683
683
|
* can happen (a destructive confirmation) — WAI-ARIA's distinction from a dialog the user can set
|
|
684
684
|
* aside. Default `'dialog'`.
|
|
685
685
|
*/
|
|
@@ -701,14 +701,14 @@ interface IConfirmDialogProps {
|
|
|
701
701
|
}
|
|
702
702
|
/**
|
|
703
703
|
* A title, a body, Cancel focused by default, and a confirm button that can be styled destructive.
|
|
704
|
-
*
|
|
704
|
+
* `destructive` also picks the dialog's ARIA role — `"alertdialog"` when it is (an action
|
|
705
705
|
* that demands a decision before anything else, e.g. deleting a session), `"dialog"` otherwise.
|
|
706
706
|
*/
|
|
707
707
|
declare function ConfirmDialog({ open, title, body, confirmLabel, cancelLabel, destructive, onConfirm, onCancel, restoreFocusTo }: IConfirmDialogProps): React$1.ReactElement | null;
|
|
708
708
|
//#endregion
|
|
709
709
|
//#region src/components/SettingsScreen.d.ts
|
|
710
710
|
/**
|
|
711
|
-
* A large modal sheet with a section sidebar on the left and content on the right
|
|
711
|
+
* A large modal sheet with a section sidebar on the left and content on the right — the
|
|
712
712
|
* GUI's Settings screen, opened by the sidebar's gear button, the desktop app's ⌘, menu item, or
|
|
713
713
|
* `/settings` (its `show-settings` `ui_intent` calls `state.openSettings()`, wired in
|
|
714
714
|
* `useSessionClient`). Every change applies at once; there is no Save button. Esc and the Close
|
|
@@ -720,7 +720,7 @@ declare function SettingsScreen({ state }: {
|
|
|
720
720
|
//#endregion
|
|
721
721
|
//#region src/components/HelpSheet.d.ts
|
|
722
722
|
/**
|
|
723
|
-
* The GUI's Help sheet
|
|
723
|
+
* The GUI's Help sheet, a `Dialog` opened by `/help` — client-only: `useSessionClient.ts`'s
|
|
724
724
|
* `send` catches `/help` before it ever reaches the session and opens this instead, so there is no
|
|
725
725
|
* round trip and nothing terminal-style to replace it with. It lists the same commands and skills the
|
|
726
726
|
* `/` menu offers (`commandMenuFor`, unfiltered by any query — an excluded command has no row here
|