@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.
- package/CHANGELOG.md +29 -0
- package/dist/index.cjs +161 -118
- package/dist/index.d.cts +65 -63
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +65 -63
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +161 -118
- package/dist/index.js.map +1 -1
- package/docs/SPEC.md +6 -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 +46 -39
- package/src/components/AgentSwitcherSheet.tsx +2 -2
- package/src/components/Composer.tsx +40 -37
- 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 +83 -56
- 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 +13 -11
- package/src/hooks/session-client-types.ts +36 -30
- package/src/hooks/ui-intent-state.ts +6 -6
- package/src/hooks/use-agent-switcher-state.ts +2 -2
- package/src/hooks/use-app-view-requests.ts +8 -1
- 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 +11 -6
- package/src/hooks/use-settings-state.ts +4 -4
- package/src/hooks/useSessionClient.ts +81 -50
- 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
|
@@ -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
|
-
*
|
|
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
|
*/
|
|
@@ -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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
*
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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 (
|
|
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
|
|
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
|
|
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
|
|
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
|
-
/**
|
|
500
|
+
/** The "Scheduled" group — every `kind: 'scheduled'` background task. */
|
|
499
501
|
schedules?: readonly IBackgroundTaskState<'scheduled'>[];
|
|
500
|
-
/**
|
|
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
|
-
/**
|
|
509
|
+
/** Open a non-main-thread entry's detail sheet. */
|
|
508
510
|
onSelect?: (entry: IExecutionWorkspaceEntry) => void;
|
|
509
|
-
/**
|
|
511
|
+
/** The main thread entry was clicked — the conversation beside this panel is it. */
|
|
510
512
|
onReturnToConversation?: () => void;
|
|
511
|
-
/**
|
|
513
|
+
/** Stop was clicked on a running/queued entry. */
|
|
512
514
|
onStop?: (entry: IExecutionWorkspaceEntry) => void;
|
|
513
|
-
/**
|
|
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
|
-
*
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 (
|
|
594
|
-
*
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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 (
|
|
650
|
-
*
|
|
651
|
-
*
|
|
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
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
|
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
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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":";;;;;;;KAEY,WAAW,QAAQ;EAAkB;;KAErC,kBAAkB,KAC5B,QAAQ;EAAkB;;KAIhB,oBAAoB,QAAQ;EAAkB;;;;KCE9C;UAEK;EACf,YAAY,KAAK;EACjB,iBAAiB,QAAQ;;;;;EAKzB;;UAGe;EACf;EACA;EACA,OAAO,KAAK;EACZ,cAAc;;iBAMA,sBACd,aACA,WAAW,4BACV;;;;KCjBS;WACI;IAAuB;WACvB;IAAgB;;;;;;iBAOhB,iBACd,kBAAkB,kBAClB,KAAK,0BACK;;iBA4CI,mBAAmB,YAAY,QAAQ,yBAAyB;;iBAKhE,YAAY,YAAY,UAAU,kBAAkB;;;
|
|
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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"}
|