@robota-sdk/agent-ui-web 3.2.1 → 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 (56) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/index.cjs +161 -118
  3. package/dist/index.d.cts +65 -63
  4. package/dist/index.d.cts.map +1 -1
  5. package/dist/index.d.ts +65 -63
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +161 -118
  8. package/dist/index.js.map +1 -1
  9. package/docs/SPEC.md +6 -1
  10. package/package.json +6 -6
  11. package/src/client/ws-session-client.ts +1 -1
  12. package/src/clipboard.ts +2 -2
  13. package/src/components/AgentActivityPanel.tsx +46 -39
  14. package/src/components/AgentSwitcherSheet.tsx +2 -2
  15. package/src/components/Composer.tsx +40 -37
  16. package/src/components/ConversationView.tsx +14 -14
  17. package/src/components/Dialog.tsx +6 -6
  18. package/src/components/DiffLines.tsx +2 -2
  19. package/src/components/ExecutionDetailSheet.tsx +1 -1
  20. package/src/components/HelpSheet.tsx +2 -2
  21. package/src/components/PermissionPrompt.tsx +22 -22
  22. package/src/components/PopupMenu.tsx +1 -1
  23. package/src/components/ProjectPanel.tsx +2 -2
  24. package/src/components/SessionMonitor.tsx +1 -1
  25. package/src/components/SessionSidebar.tsx +8 -8
  26. package/src/components/SessionSurface.tsx +83 -56
  27. package/src/components/SessionSurfaceChrome.tsx +8 -8
  28. package/src/components/SettingsGeneralSection.tsx +1 -1
  29. package/src/components/SettingsMcpSection.tsx +1 -1
  30. package/src/components/SettingsPermissionsSection.tsx +1 -1
  31. package/src/components/SettingsPluginsSection.tsx +1 -1
  32. package/src/components/SettingsProvidersSection.tsx +3 -3
  33. package/src/components/SettingsScreen.tsx +3 -3
  34. package/src/components/StatusControls.tsx +12 -12
  35. package/src/components/composer-attachments.ts +5 -5
  36. package/src/driver-labels.ts +3 -3
  37. package/src/execution-entry-status.ts +1 -1
  38. package/src/goal-view.ts +1 -1
  39. package/src/hooks/command-menu.ts +2 -2
  40. package/src/hooks/excluded-commands.ts +2 -2
  41. package/src/hooks/prompt-state.ts +4 -4
  42. package/src/hooks/server-message-handling.ts +13 -11
  43. package/src/hooks/session-client-types.ts +36 -30
  44. package/src/hooks/ui-intent-state.ts +6 -6
  45. package/src/hooks/use-agent-switcher-state.ts +2 -2
  46. package/src/hooks/use-app-view-requests.ts +8 -1
  47. package/src/hooks/use-media-query.ts +1 -1
  48. package/src/hooks/use-model-list.ts +1 -1
  49. package/src/hooks/use-project-panel.ts +1 -1
  50. package/src/hooks/use-schedules-state.ts +4 -4
  51. package/src/hooks/use-session-directory.ts +11 -6
  52. package/src/hooks/use-settings-state.ts +4 -4
  53. package/src/hooks/useSessionClient.ts +81 -50
  54. package/src/index.ts +5 -5
  55. package/src/schedule-view.ts +1 -1
  56. package/src/styles/surface.css +1 -1
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
+ import { IWireAgentDefinitionSummary, TClientMessage, TClientMessage as TClientMessage$1, TServerMessage, TServerMessage as TServerMessage$1, TSessionSurfaceRole } from "@robota-sdk/agent-transport";
1
2
  import React$1, { ReactNode } from "react";
2
3
  import { IAskRequestEvent, IDiffLine, IGoalState, IPermissionRequestEvent, ISettingsSnapshot, IToolAppViewRef, IToolState, TDriverId, TPermissionResultValue, TSettingsPatch } from "@robota-sdk/agent-interface-session";
3
- import { IWireAgentDefinitionSummary, TClientMessage, TClientMessage as TClientMessage$1, TServerMessage, TServerMessage as TServerMessage$1 } from "@robota-sdk/agent-transport";
4
4
  import { TActionResponse } from "@robota-sdk/agent-interface-transport";
5
5
  import { IBackgroundTaskState, IExecutionDetailRecord, IExecutionWorkspaceEntry, IExecutionWorkspaceSnapshot } from "@robota-sdk/agent-interface-execution";
6
6
  import { TCommandUiIntent } from "@robota-sdk/agent-interface-command";
@@ -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
  */
@@ -220,12 +220,14 @@ interface IWsSessionState<TStatus extends string = TConnectionStatus> {
220
220
  sessionName: string | null;
221
221
  /** This connection's own driver id, learned from the server's first frame; null until then. */
222
222
  ownDriverId: TDriverId | null;
223
+ /** The role the host gave this connection, learned when it connects; null until the host answers. */
224
+ role: TSessionSurfaceRole | null;
223
225
  /** Null until the session has answered; refreshed after every command. */
224
226
  commandCatalog: TCommandCatalog | null;
225
227
  /** Null until the session has answered; refreshed after every command and turn. */
226
228
  sessionStatus: TSessionStatus | null;
227
229
  /**
228
- * #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
229
231
  * menu asks for it when it opens (or refreshes it) rather than every surface fetching it eagerly.
230
232
  */
231
233
  modelList: TModelListSnapshot | null;
@@ -249,13 +251,13 @@ interface IWsSessionState<TStatus extends string = TConnectionStatus> {
249
251
  setSessionSidebarOpen: (open: boolean) => void;
250
252
  send: (msg: TClientMessage$1) => void;
251
253
  /**
252
- * #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
253
255
  * outcome as controls-triggered — `useSessionClient` skips the conversation card for a change made
254
256
  * this way (the control's own label confirms it instead), while a typed command keeps its card.
255
257
  */
256
258
  sendCommandSilently: (name: string, args?: string) => void;
257
259
  pendingPrompts: readonly TPendingPrompt[];
258
- /** #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. */
259
261
  queuedPrompt: IQueuedPrompt | null;
260
262
  answerPermission: (id: string, result: TPermissionResultValue) => void;
261
263
  answerAsk: (id: string, response: TActionResponse) => void;
@@ -273,29 +275,29 @@ interface IWsSessionState<TStatus extends string = TConnectionStatus> {
273
275
  requestCurrentSessionUsage: () => void;
274
276
  sessionNotices: readonly ISessionNotice[];
275
277
  dismissSessionNotice: (id: string) => void;
276
- /** #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. */
277
279
  settingsOpen: boolean;
278
280
  settingsStatus: 'idle' | 'loading' | 'ready' | 'error';
279
281
  /** Null until the first `get-settings` reply arrives. */
280
282
  settingsSnapshot: ISettingsSnapshot | null;
281
283
  /** The plain message from the most recent failed read or write, if any. */
282
284
  settingsError: string | null;
283
- /** #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. */
284
286
  settingsInitialSectionId: string | null;
285
287
  /**
286
288
  * Opens the screen and (re-)fetches its snapshot — the "reopen and see the new value" path.
287
289
  * `sectionId` jumps straight to that section (e.g. `/plugin` → `'plugins'`, "Manage providers…"
288
- * (#3282 §2/§4b) → `'providers'`); omitted opens on the screen's own default (General).
290
+ * → `'providers'`); omitted opens on the screen's own default (General).
289
291
  */
290
292
  openSettings: (sectionId?: string) => void;
291
293
  closeSettings: () => void;
292
294
  /** A failed write leaves `settingsSnapshot` at its previous value; `settingsError` names why. */
293
295
  updateSettings: (patch: TSettingsPatch) => void;
294
- /** #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. */
295
297
  helpOpen: boolean;
296
298
  openHelp: () => void;
297
299
  closeHelp: () => void;
298
- /** #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. */
299
301
  openEntryId: string | null;
300
302
  executionDetailStatus: 'idle' | 'loading' | 'ready' | 'error';
301
303
  executionDetailRecords: readonly IExecutionDetailRecord[];
@@ -317,21 +319,21 @@ interface IWsSessionState<TStatus extends string = TConnectionStatus> {
317
319
  openExecutionDetail: (entryId: string) => void;
318
320
  loadMoreExecutionDetail: () => void;
319
321
  closeExecutionDetail: () => void;
320
- /** #3282 §4c — the Project panel's "Changes" section (git status). */
322
+ /** The Project panel's "Changes" section (git status). */
321
323
  projectStatusState: 'idle' | 'loading' | 'ready' | 'error';
322
324
  projectStatus: TProjectStatusRead | null;
323
325
  requestProjectStatus: () => void;
324
- /** #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. */
325
327
  projectDiffState: 'idle' | 'loading' | 'ready' | 'error';
326
328
  projectDiffPath: string | null;
327
329
  projectDiff: TProjectDiffRead | null;
328
330
  requestProjectDiff: (path: string) => void;
329
- /** #3282 §4c — the Project panel's "Memory" section. */
331
+ /** The Project panel's "Memory" section. */
330
332
  projectMemoryState: 'idle' | 'loading' | 'ready' | 'error';
331
333
  projectMemory: TProjectMemoryRead | null;
332
334
  requestProjectMemory: () => void;
333
335
  /**
334
- * #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
335
337
  * own control both open it.
336
338
  */
337
339
  agentSwitcherOpen: boolean;
@@ -348,7 +350,7 @@ interface IWsSessionState<TStatus extends string = TConnectionStatus> {
348
350
  /** Runs the same path as `/agent <name>`. */
349
351
  selectAgent: (agentType: string) => void;
350
352
  /**
351
- * #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
352
354
  * `IBackgroundTaskState` of `kind: 'scheduled'`, refreshed on connect and after a write.
353
355
  */
354
356
  scheduledTasks: readonly IBackgroundTaskState<'scheduled'>[];
@@ -357,7 +359,7 @@ interface IWsSessionState<TStatus extends string = TConnectionStatus> {
357
359
  resumeSchedule: (taskId: string) => void;
358
360
  /**
359
361
  * Permanently stops a schedule — the same `cancel-background-task` write Stop already uses. A
360
- * 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`
361
363
  * session notice) — no separate error state here.
362
364
  */
363
365
  deleteSchedule: (taskId: string) => void;
@@ -395,7 +397,7 @@ declare function createDesktopSessionClient(bridge: IDesktopSessionBridge, callb
395
397
  //#endregion
396
398
  //#region src/components/composer-attachments.d.ts
397
399
  /**
398
- * 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
399
401
  * sync with `IPickedFile` in `apps/agent-gui-web/src/gui-host.ts` and
400
402
  * `apps/agent-app/electron/sidecar.ts` — the three are not imported across the Electron/browser/
401
403
  * presentation package boundaries, same as this codebase already does for the trust question.
@@ -474,7 +476,7 @@ declare function guiScreenForUiIntent(intent: TCommandUiIntent): 'session-sideba
474
476
  * Describe one intent for this surface: a plain, honest sentence for a screen this HOST cannot back
475
477
  * right now (a session picker with no session list), the `/theme` exclusion this intent defensively
476
478
  * reuses, or an unrecognized future kind. Never called for `show-settings`, `show-plugin-manager` or
477
- * `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 —
478
480
  * but their cases are left out of this switch rather than kept as dead branches that would claim
479
481
  * otherwise; an unknown wire-level kind (a newer host) still yields an explicit notice naming the raw
480
482
  * kind, so the "never a silent no-op" floor holds for future intents too.
@@ -487,7 +489,7 @@ interface IConversationViewProps {
487
489
  activeTools: IActiveTool[];
488
490
  streamingText: string;
489
491
  isThinking: boolean;
490
- /** 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. */
491
493
  ownDriverId: TDriverId | null;
492
494
  }
493
495
  declare function ConversationView({ messages, activeTools, streamingText, isThinking, ownDriverId }: IConversationViewProps): React$1.ReactElement;
@@ -495,34 +497,34 @@ declare function ConversationView({ messages, activeTools, streamingText, isThin
495
497
  //#region src/components/AgentActivityPanel.d.ts
496
498
  interface IAgentActivityPanelProps {
497
499
  tasks: readonly IExecutionWorkspaceEntry[];
498
- /** #3282 §4 part b-3: the "Scheduled" group — every `kind: 'scheduled'` background task. */
500
+ /** The "Scheduled" group — every `kind: 'scheduled'` background task. */
499
501
  schedules?: readonly IBackgroundTaskState<'scheduled'>[];
500
- /** #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. */
501
503
  goal?: IGoalState | null;
502
504
  onPauseSchedule?: (taskId: string) => void;
503
505
  onResumeSchedule?: (taskId: string) => void;
504
506
  onDeleteSchedule?: (taskId: string) => void;
505
507
  onCancelGoal?: () => void;
506
508
  className?: string;
507
- /** #3288 §1: open a non-main-thread entry's detail sheet. */
509
+ /** Open a non-main-thread entry's detail sheet. */
508
510
  onSelect?: (entry: IExecutionWorkspaceEntry) => void;
509
- /** #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. */
510
512
  onReturnToConversation?: () => void;
511
- /** #3288 §1: Stop was clicked on a running/queued entry. */
513
+ /** Stop was clicked on a running/queued entry. */
512
514
  onStop?: (entry: IExecutionWorkspaceEntry) => void;
513
- /** #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. */
514
516
  selectedEntryId?: string;
515
517
  }
516
518
  declare function AgentActivityPanel({ tasks, schedules, goal, onPauseSchedule, onResumeSchedule, onDeleteSchedule, onCancelGoal, className, onSelect, onReturnToConversation, onStop, selectedEntryId }: IAgentActivityPanelProps): React$1.ReactElement;
517
519
  //#endregion
518
520
  //#region src/components/AgentSwitcherSheet.d.ts
519
521
  /**
520
- * #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
521
523
  * sheet instead of the surface's old "not available" line. It lists every agent this session can
522
524
  * run — name, one-line description, and where each is defined in plain words — with the current one
523
525
  * checked. Choosing a row runs the SAME path as typing `/agent <name>` (a plain `command`, wired in
524
526
  * `useAgentSwitcherState`); the reply is this sheet's own confirmation line, never a conversation
525
- * card (issue #3282 §4's decided design).
527
+ * card.
526
528
  */
527
529
  declare function AgentSwitcherSheet({ state }: {
528
530
  state: IWsSessionState;
@@ -530,19 +532,19 @@ declare function AgentSwitcherSheet({ state }: {
530
532
  //#endregion
531
533
  //#region src/components/PermissionPrompt.d.ts
532
534
  /**
533
- * 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
534
536
  * browser owner answers its OWN prompts; the first pending prompt is shown. A gated tool call blocks
535
537
  * until answered, so this is on the critical path — not decorative.
536
538
  *
537
539
  * `modal` covers the page; `dock` sits above the composer, as desktop agent apps place a pending
538
540
  * question next to where the answer is typed. Once armed and focused, its keys answer it: 1–9 picks
539
541
  * an option, Esc cancels a question or denies a permission — but it never takes that focus away from
540
- * 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
541
543
  * request sets `allowFreeText` also shows a text field (masked when `masked` is set); Enter there
542
- * 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
543
545
  * lives only in `FreeTextField`, keyed by `prompt.id`: a cancelled or answered prompt's text can
544
546
  * never reach the next prompt's render, masked or not, because the field is a fresh component
545
- * 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.
546
548
  *
547
549
  * An ask whose `maxSelect` is above 1 is a multi-select: each option is a toggle (a click or 1–9 ticks
548
550
  * it, nothing answers yet), and Submit — or Enter at the prompt, once the selection is allowed —
@@ -554,7 +556,7 @@ interface IPermissionPromptProps {
554
556
  prompts: readonly TPendingPrompt[];
555
557
  onAnswerPermission: (id: string, result: boolean) => void;
556
558
  onAnswerAsk: (id: string, response: TActionResponse) => void;
557
- /** 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. */
558
560
  ownDriverId?: TDriverId | null;
559
561
  layout?: 'modal' | 'dock';
560
562
  /** How long a new prompt waits before its keys answer it; tests pass their own. */
@@ -582,7 +584,7 @@ declare function PersonalUsageDashboard({ state }: {
582
584
  * The full desktop layout over an `IWsSessionState`. `surface` is an optional label shown next to the
583
585
  * mark (e.g. "app").
584
586
  */
585
- declare function SessionSurface({ state, surface, personalUsageEnabled, draftMode, onReconnect, pickFiles, getPathForFile, onOpenMemoryInEditor, appViewSandboxUrl }: {
587
+ declare function SessionSurface({ state, surface, personalUsageEnabled: personalUsageRequested, draftMode, onReconnect, pickFiles, getPathForFile, onOpenMemoryInEditor, appViewSandboxUrl }: {
586
588
  state: IWsSessionState;
587
589
  surface?: string;
588
590
  /** Desktop shells opt in; embedded/session-only surfaces keep their existing chat-only contract. */
@@ -590,17 +592,17 @@ declare function SessionSurface({ state, surface, personalUsageEnabled, draftMod
590
592
  /** Secure desktop discards unsent text and attachment paths when the session closes. */
591
593
  draftMode?: 'persistent' | 'volatile';
592
594
  /**
593
- * Present only when the host can restart the runtime after the connection is lost for good (issue
594
- * #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.
595
597
  */
596
598
  onReconnect?: () => Promise<void>;
597
- /** 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. */
598
600
  pickFiles?: () => Promise<readonly IPickedFile[]>;
599
- /** 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. */
600
602
  getPathForFile?: (file: File) => string;
601
603
  /**
602
604
  * The Project panel's memory "Open in editor" action — present only when the host can open a file
603
- * 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
604
606
  * itself is hidden (only shown "if the host supports it").
605
607
  */
606
608
  onOpenMemoryInEditor?: (path: string) => void;
@@ -608,7 +610,7 @@ declare function SessionSurface({ state, surface, personalUsageEnabled, draftMod
608
610
  }): React.ReactElement;
609
611
  /**
610
612
  * A centered chrome frame for the pre-session (loading) and fatal states — reused by app shells. Its
611
- * 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
612
614
  * three call sites (starting, fatal, the trust question) supplies one, and none of the three ever
613
615
  * render alongside `SessionSurface`'s own. `header` stays a sibling of `main`, not inside it, so it
614
616
  * keeps its own implicit `banner` role.
@@ -620,12 +622,12 @@ declare function CenteredChrome({ tone, children }: {
620
622
  //#endregion
621
623
  //#region src/components/SessionSidebar.d.ts
622
624
  /**
623
- * #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:
624
626
  * start a new one, or click another to make it current. Rows the host could not read are listed,
625
627
  * disabled, so a damaged session never looks deleted. A refused switch comes back as a notice.
626
628
  * A host that keeps several sessions live marks the rows running now and counts who else is on them.
627
629
  *
628
- * #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
629
631
  * (confirmed). Rename on the current row reuses the `/rename` command, which also updates the live
630
632
  * session's own name and title bar; rename on any other row writes the stored record directly.
631
633
  */
@@ -646,9 +648,9 @@ declare function SessionMonitor({ wsUrl, className }: ISessionMonitorProps): Rea
646
648
  //#endregion
647
649
  //#region src/components/Dialog.d.ts
648
650
  /**
649
- * The shared modal-shell primitive (#3282 §4a, coordinated with #3282 §2's model/mode controls,
650
- * which also need a confirmation dialog). Whichever of the two lands first defines this file; the
651
- * 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.
652
654
  *
653
655
  * `role="dialog"` (or `"alertdialog"`, see `role` below), `aria-modal`, a labelled title, focus moved
654
656
  * inside on open, a focus trap while open, Esc to close, and focus restored to whatever had it before
@@ -669,7 +671,7 @@ interface IDialogProps {
669
671
  /** Id of an element describing the dialog, wired to `aria-describedby`. */
670
672
  describedById?: string;
671
673
  /**
672
- * 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
673
675
  * `document.activeElement` when the dialog opens — which fails for a caller whose opener element
674
676
  * is removed from the DOM in the SAME update that opens this dialog (e.g. a menu item whose menu
675
677
  * closes as this dialog opens): by the time this dialog's open-effect runs, the browser has already
@@ -677,7 +679,7 @@ interface IDialogProps {
677
679
  */
678
680
  restoreFocusTo?: HTMLElement | null;
679
681
  /**
680
- * #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
681
683
  * can happen (a destructive confirmation) — WAI-ARIA's distinction from a dialog the user can set
682
684
  * aside. Default `'dialog'`.
683
685
  */
@@ -699,14 +701,14 @@ interface IConfirmDialogProps {
699
701
  }
700
702
  /**
701
703
  * A title, a body, Cancel focused by default, and a confirm button that can be styled destructive.
702
- * #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
703
705
  * that demands a decision before anything else, e.g. deleting a session), `"dialog"` otherwise.
704
706
  */
705
707
  declare function ConfirmDialog({ open, title, body, confirmLabel, cancelLabel, destructive, onConfirm, onCancel, restoreFocusTo }: IConfirmDialogProps): React$1.ReactElement | null;
706
708
  //#endregion
707
709
  //#region src/components/SettingsScreen.d.ts
708
710
  /**
709
- * 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
710
712
  * GUI's Settings screen, opened by the sidebar's gear button, the desktop app's ⌘, menu item, or
711
713
  * `/settings` (its `show-settings` `ui_intent` calls `state.openSettings()`, wired in
712
714
  * `useSessionClient`). Every change applies at once; there is no Save button. Esc and the Close
@@ -718,7 +720,7 @@ declare function SettingsScreen({ state }: {
718
720
  //#endregion
719
721
  //#region src/components/HelpSheet.d.ts
720
722
  /**
721
- * 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
722
724
  * `send` catches `/help` before it ever reaches the session and opens this instead, so there is no
723
725
  * round trip and nothing terminal-style to replace it with. It lists the same commands and skills the
724
726
  * `/` menu offers (`commandMenuFor`, unfiltered by any query — an excluded command has no row here
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/app-view/types.ts","../src/client/ws-session-client.ts","../src/hooks/prompt-state.ts","../src/hooks/session-client-types.ts","../src/hooks/useSessionClient.ts","../src/hooks/use-session-directory.ts","../src/client/desktop-session-client.ts","../src/components/composer-attachments.ts","../src/components/Composer.tsx","../src/client/runtime-host.ts","../src/hooks/ui-intent-state.ts","../src/components/ConversationView.tsx","../src/components/AgentActivityPanel.tsx","../src/components/AgentSwitcherSheet.tsx","../src/components/PermissionPrompt.tsx","../src/components/personal-usage-dashboard-types.ts","../src/components/PersonalUsageDashboard.tsx","../src/components/SessionSurface.tsx","../src/components/SessionSidebar.tsx","../src/components/SessionMonitor.tsx","../src/components/Dialog.tsx","../src/components/SettingsScreen.tsx","../src/components/HelpSheet.tsx","../src/components/Brand.tsx","../src/product-identity.tsx"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/app-view/types.ts","../src/client/ws-session-client.ts","../src/hooks/prompt-state.ts","../src/hooks/session-client-types.ts","../src/hooks/useSessionClient.ts","../src/hooks/use-session-directory.ts","../src/client/desktop-session-client.ts","../src/components/composer-attachments.ts","../src/components/Composer.tsx","../src/client/runtime-host.ts","../src/hooks/ui-intent-state.ts","../src/components/ConversationView.tsx","../src/components/AgentActivityPanel.tsx","../src/components/AgentSwitcherSheet.tsx","../src/components/PermissionPrompt.tsx","../src/components/personal-usage-dashboard-types.ts","../src/components/PersonalUsageDashboard.tsx","../src/components/SessionSurface.tsx","../src/components/SessionSidebar.tsx","../src/components/SessionMonitor.tsx","../src/components/Dialog.tsx","../src/components/SettingsScreen.tsx","../src/components/HelpSheet.tsx","../src/components/Brand.tsx","../src/product-identity.tsx"],"mappings":"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"}