@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.
Files changed (53) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/index.cjs +81 -81
  3. package/dist/index.d.cts +61 -61
  4. package/dist/index.d.ts +61 -61
  5. package/dist/index.js +81 -81
  6. package/dist/index.js.map +1 -1
  7. package/docs/SPEC.md +1 -1
  8. package/package.json +6 -6
  9. package/src/client/ws-session-client.ts +1 -1
  10. package/src/clipboard.ts +2 -2
  11. package/src/components/AgentActivityPanel.tsx +8 -8
  12. package/src/components/AgentSwitcherSheet.tsx +2 -2
  13. package/src/components/Composer.tsx +27 -27
  14. package/src/components/ConversationView.tsx +14 -14
  15. package/src/components/Dialog.tsx +6 -6
  16. package/src/components/DiffLines.tsx +2 -2
  17. package/src/components/ExecutionDetailSheet.tsx +1 -1
  18. package/src/components/HelpSheet.tsx +2 -2
  19. package/src/components/PermissionPrompt.tsx +22 -22
  20. package/src/components/PopupMenu.tsx +1 -1
  21. package/src/components/ProjectPanel.tsx +2 -2
  22. package/src/components/SessionMonitor.tsx +1 -1
  23. package/src/components/SessionSidebar.tsx +8 -8
  24. package/src/components/SessionSurface.tsx +18 -18
  25. package/src/components/SessionSurfaceChrome.tsx +8 -8
  26. package/src/components/SettingsGeneralSection.tsx +1 -1
  27. package/src/components/SettingsMcpSection.tsx +1 -1
  28. package/src/components/SettingsPermissionsSection.tsx +1 -1
  29. package/src/components/SettingsPluginsSection.tsx +1 -1
  30. package/src/components/SettingsProvidersSection.tsx +3 -3
  31. package/src/components/SettingsScreen.tsx +3 -3
  32. package/src/components/StatusControls.tsx +12 -12
  33. package/src/components/composer-attachments.ts +5 -5
  34. package/src/driver-labels.ts +3 -3
  35. package/src/execution-entry-status.ts +1 -1
  36. package/src/goal-view.ts +1 -1
  37. package/src/hooks/command-menu.ts +2 -2
  38. package/src/hooks/excluded-commands.ts +2 -2
  39. package/src/hooks/prompt-state.ts +4 -4
  40. package/src/hooks/server-message-handling.ts +11 -11
  41. package/src/hooks/session-client-types.ts +29 -29
  42. package/src/hooks/ui-intent-state.ts +6 -6
  43. package/src/hooks/use-agent-switcher-state.ts +2 -2
  44. package/src/hooks/use-media-query.ts +1 -1
  45. package/src/hooks/use-model-list.ts +1 -1
  46. package/src/hooks/use-project-panel.ts +1 -1
  47. package/src/hooks/use-schedules-state.ts +4 -4
  48. package/src/hooks/use-session-directory.ts +4 -4
  49. package/src/hooks/use-settings-state.ts +4 -4
  50. package/src/hooks/useSessionClient.ts +44 -44
  51. package/src/index.ts +5 -5
  52. package/src/schedule-view.ts +1 -1
  53. 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
- * #3282 §2 (part 2): the models a person may switch to, grouped by configured provider profile —
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
- /** #3282 §4c — the Project panel's reads. Each result crosses the wire unchanged from the session
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
- /** REMOTE-014 E5: the co-driving author of a user turn. */
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
- /** #3288: a turn that changed files ends with this compact summary row. */
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
- /** #3288: correlates this call across `tool_start`/`tool_end` — how a finished call is matched. */
144
+ /** Correlates this call across `tool_start`/`tool_end` — how a finished call is matched. */
145
145
  executionId?: string;
146
- /** #3288: a unified diff (Edit/Write), built server-side — the same one an approval prompt showed. */
146
+ /** A unified diff (Edit/Write), built server-side — the same one an approval prompt showed. */
147
147
  diffLines?: readonly IDiffLine[];
148
- /** #3288: the file `diffLines` concerns, workspace-relative when the server could make it so. */
148
+ /** The file `diffLines` concerns, workspace-relative when the server could make it so. */
149
149
  diffFile?: string;
150
- /** #3288: the tool's raw result payload (Shell output, Read content, …), already capped server-side. */
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
- /** #3288: a workspace-relative display form of a path argument, additive to `input`/`firstArg`. */
154
+ /** A workspace-relative display form of a path argument, additive to `input`/`firstArg`. */
155
155
  displayPath?: string;
156
- /** #3288: set when this call is a projected `/command` tool — render "Ran /<commandName>". */
156
+ /** Set when this call is a projected `/command` tool — render "Ran /<commandName>". */
157
157
  commandName?: string;
158
- /** #3288: true for an internal signal tool (e.g. goal-status) — never rendered as a call. */
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
- * #3280 §2: a prompt the host queued behind the running turn — the server has already taken it, so it
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` (#3282 §2 part 2): a change made through a status control (model/mode/effort)
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 (#3289 §3) — present only when the host could
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 (issue #3280 §5): the runtime is not
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
- * #3282 §2 (part 2): the models the model control's pop-up menu offers. Null until requested — the
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
- * #3282 §2 (part 2): run a command the SAME way `send({type:'command', ...})` does, but mark its
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
- /** #3280 §2: the prompt queued behind a running turn, or null when none is queued. */
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
- /** #3282 §4a: whether the Settings modal is shown. `/settings` and the gear button both open it. */
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
- /** #3282 §4 part b-2: which section the screen should land on for the open in progress. */
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
- * (#3282 §2/§4b) → `'providers'`); omitted opens on the screen's own default (General).
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
- /** #3282 §4e: whether the Help sheet is shown. `/help` opens it instead of reaching the session. */
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
- /** #3288 §1: the id of the execution-workspace entry open in the detail sheet, or null when closed. */
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
- /** #3282 §4c — the Project panel's "Changes" section (git status). */
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
- /** #3282 §4c — the Project panel's "File diff" section, for the file `projectDiffPath` names. */
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
- /** #3282 §4c — the Project panel's "Memory" section. */
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
- * #3282 §4 part b-3: whether the agent switcher sheet is shown. `/agent` (bare) and this surface's
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
- * #3282 §4 part b-3: the schedules shown in the Agents panel's "Scheduled" group — every
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 (#3288 §1's `background-task-control-failed`
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 (#3282 §4d). Kept in structural
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 (#3282 §4a, §4 part b-2, §4 part b-3) —
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 (§3289 §3), threaded to every message it renders. */
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
- /** #3282 §4 part b-3: the "Scheduled" group — every `kind: 'scheduled'` background task. */
500
+ /** The "Scheduled" group — every `kind: 'scheduled'` background task. */
501
501
  schedules?: readonly IBackgroundTaskState<'scheduled'>[];
502
- /** #3282 §4 part b-3: the current goal (`/goal`), or null/absent when none is set. */
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
- /** #3288 §1: open a non-main-thread entry's detail sheet. */
509
+ /** Open a non-main-thread entry's detail sheet. */
510
510
  onSelect?: (entry: IExecutionWorkspaceEntry) => void;
511
- /** #3288 §1: the main thread entry was clicked — the conversation beside this panel is it. */
511
+ /** The main thread entry was clicked — the conversation beside this panel is it. */
512
512
  onReturnToConversation?: () => void;
513
- /** #3288 §1: Stop was clicked on a running/queued entry. */
513
+ /** Stop was clicked on a running/queued entry. */
514
514
  onStop?: (entry: IExecutionWorkspaceEntry) => void;
515
- /** #3288 §1: the entry whose detail sheet is currently open, for a highlighted row. */
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
- * #3282 §4 part b-3 — the agent switcher: `show-agent-switcher` (`/agent` with no args) opens this
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 (issue #3282 §4's decided design).
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 (REMOTE-007/009). Under local == remote the paired
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 (#3280 §1). A click on a button always answers at once. An ask whose
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 (#3280 §3). The field's typed value
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 (#3280 §3 follow-up).
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 (§3289 §3): a prompt raised by its own turn shows no requester. */
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 (issue
596
- * #3280 §5, the desktop app); absent in the browser, where the banner says how to reopen it instead.
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 (#3282 §4d). */
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 (#3282 §4d). */
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, #3282 §4c). Absent in the browser, where the action
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 (#3289 §3 review): nothing above `CenteredChrome`'s
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
- * #3189 — this workspace's sessions on the left of the conversation, as in Claude Code Desktop:
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
- * #3289 §1 — each row also carries a "More" menu (or right-click) with Rename (inline) and Delete
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 (#3282 §4a, coordinated with #3282 §2's model/mode controls,
652
- * which also need a confirmation dialog). Whichever of the two lands first defines this file; the
653
- * other rebases onto it rather than shipping a second copy.
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 (#3289 §1). Default behavior captures
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
- * #3282 §4e: `'alertdialog'` for a dialog that interrupts to demand a decision before anything else
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
- * #3282 §4e: `destructive` also picks the dialog's ARIA role — `"alertdialog"` when it is (an action
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 (#3282 §4a) — the
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 (#3282 §4e), a `Dialog` opened by `/help` — client-only: `useSessionClient.ts`'s
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