@qwen-code/web-shell 0.24.7-nightly.20261004.9915c7ff8f → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -32,7 +32,7 @@ export interface WebShellSidebarOptions {
32
32
  showCompactToggle?: boolean;
33
33
  /** Whether to show the Tasks/Channels session-source switch. Defaults to true. */
34
34
  showSessionSourceSwitch?: boolean;
35
- /** Whether to show daemon-owned Live conversations. Defaults to false. */
35
+ /** Show Live conversations and, in rail layout, the Live entry. Defaults to false. */
36
36
  showLive?: boolean;
37
37
  /** Hide or replace the complete sidebar branding row. */
38
38
  branding?: false | WebShellSidebarBranding;
@@ -161,7 +161,7 @@ export interface WebShellProps {
161
161
  shadowDom?: WebShellShadowDom;
162
162
  /** Maximum chat content width in regular mode. Defaults to 1000px. */
163
163
  chatMaxWidth?: number;
164
- /** Optional workspace sidebar. Disabled by default. */
164
+ /** Workspace sidebar. Defaults to Home only; false hides it. */
165
165
  sidebar?: boolean | WebShellSidebarOptions;
166
166
  /** Persistent chat header options. */
167
167
  header?: WebShellChatHeaderOptions;
@@ -75,6 +75,7 @@ interface ChatEditorProps {
75
75
  showChatWidthToggle?: boolean;
76
76
  chatWidthToggleMin?: number;
77
77
  visibleToolbarActions?: readonly ComposerToolbarAction[];
78
+ liveVoicePortalContainer?: HTMLElement | null;
78
79
  /**
79
80
  * Where the composer's context chips (workspace selector, git branch) land.
80
81
  * `toolbar` (default) keeps both in the composer toolbar. `below` moves both
@@ -40,6 +40,7 @@ export declare function DesktopRelayPanel({ status, installCommand, copied, onCo
40
40
  interface DesktopRelayControlProps {
41
41
  /** Class for the trigger, supplied by the sidebar so it matches its neighbours. */
42
42
  triggerClassName: string;
43
+ portalContainer?: HTMLElement | null;
43
44
  workspaces?: readonly DaemonWorkspaceCapability[];
44
45
  showWhenIdle?: boolean;
45
46
  }
@@ -47,5 +48,5 @@ interface DesktopRelayControlProps {
47
48
  * "Use this computer": asks the relay on the viewer's computer to lend its
48
49
  * node_repl to this session over the daemon's reverse tool channel.
49
50
  */
50
- export declare function DesktopRelayControl({ triggerClassName, workspaces, showWhenIdle, }: DesktopRelayControlProps): import("react/jsx-runtime").JSX.Element | null;
51
+ export declare function DesktopRelayControl({ triggerClassName, portalContainer, workspaces, showWhenIdle, }: DesktopRelayControlProps): import("react/jsx-runtime").JSX.Element | null;
51
52
  export {};
@@ -24,6 +24,8 @@ interface LocalFilesControlProps {
24
24
  * neighbours instead of inventing a second button style.
25
25
  */
26
26
  triggerClassName: string;
27
+ /** Keep the bridge mounted while its menu trigger is absent. */
28
+ portalContainer?: HTMLElement | null;
27
29
  /**
28
30
  * The merged workspace list (capabilities snapshot plus a locked workspace
29
31
  * registered before the snapshot). The sidebar already holds it; resolving
@@ -70,5 +72,5 @@ export declare function createLocalFilesRewarm(options: {
70
72
  selector: AcpWorkspaceSelector | undefined;
71
73
  preheat: () => Promise<unknown>;
72
74
  }): () => Promise<void>;
73
- export declare function LocalFilesControl({ triggerClassName, workspaces, }: LocalFilesControlProps): import("react/jsx-runtime").JSX.Element;
75
+ export declare function LocalFilesControl({ triggerClassName, portalContainer, workspaces, }: LocalFilesControlProps): import("react/jsx-runtime").JSX.Element | null;
74
76
  export {};
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import { type Ref } from 'react';
7
7
  interface ChannelsManagerPageProps {
8
- onClose: () => void;
8
+ onClose?: () => void;
9
9
  initialFocusRef?: Ref<HTMLHeadingElement>;
10
10
  }
11
11
  export declare function ChannelsManagerPage({ onClose, initialFocusRef, }: ChannelsManagerPageProps): import("react/jsx-runtime").JSX.Element;
@@ -156,7 +156,7 @@ export interface paths {
156
156
  };
157
157
  get?: never;
158
158
  put?: never;
159
- /** @description D6 serves Hosted permission Actions. Question Actions and vote_recorded remain planned. Reads follow Session authorization; only the Session creator may respond. Responses are durable operations, reconciled against the original journal decision. */
159
+ /** @description D6 serves Hosted permission Actions. Question Actions and vote_recorded remain planned. Reads follow Session authorization; only the Session creator may respond (a Session with no recorded creator and no recorded create command answers to any caller in its tenant). Responses are durable operations, reconciled against the original journal decision. */
160
160
  post: operations["queryWebShellActions"];
161
161
  delete?: never;
162
162
  options?: never;
@@ -173,7 +173,7 @@ export interface paths {
173
173
  };
174
174
  get?: never;
175
175
  put?: never;
176
- /** @description D6 serves Hosted permission Actions. Question Actions and vote_recorded remain planned. Reads follow Session authorization; only the Session creator may respond. Responses are durable operations, reconciled against the original journal decision. */
176
+ /** @description D6 serves Hosted permission Actions. Question Actions and vote_recorded remain planned. Reads follow Session authorization; only the Session creator may respond (a Session with no recorded creator and no recorded create command answers to any caller in its tenant). Responses are durable operations, reconciled against the original journal decision. */
177
177
  post: operations["getWebShellAction"];
178
178
  delete?: never;
179
179
  options?: never;
@@ -190,7 +190,7 @@ export interface paths {
190
190
  };
191
191
  get?: never;
192
192
  put?: never;
193
- /** @description D6 serves Hosted permission Actions. Question Actions and vote_recorded remain planned. Reads follow Session authorization; only the Session creator may respond. Responses are durable operations, reconciled against the original journal decision. */
193
+ /** @description D6 serves Hosted permission Actions. Question Actions and vote_recorded remain planned. Reads follow Session authorization; only the Session creator may respond (a Session with no recorded creator and no recorded create command answers to any caller in its tenant). Responses are durable operations, reconciled against the original journal decision. */
194
194
  post: operations["respondWebShellAction"];
195
195
  delete?: never;
196
196
  options?: never;
@@ -821,7 +821,7 @@ export interface components {
821
821
  /** @enum {string} */
822
822
  TaskKind: "child_agent" | "workflow" | "background_shell" | "monitor" | "automation_run";
823
823
  /**
824
- * @description Logical run state. completed, failed and cancelled are terminal and are set only after the physical execution has settled. degraded means that the task still runs with reduced guarantees, such as a Monitor that lost its observation source. recovery_blocked means that recovery cannot prove the physical outcome: it is not settled, is never reported as success and is never re-run automatically.
824
+ * @description Logical run state. completed is terminal and is set when the run's own line ends settled, with or without a physical execution; failed and cancelled are terminal too, and they also cover a run that ended before its execution started (cancelled before dispatch, or failed with no provable start), when no physical execution ever settled. degraded means that the task still runs with reduced guarantees, such as a Monitor that lost its observation source. recovery_blocked means that recovery cannot prove the physical outcome: it is not settled, is never reported as success and is never re-run automatically.
825
825
  * @enum {string}
826
826
  */
827
827
  TaskState: "pending" | "running" | "waiting" | "completed" | "failed" | "cancelled" | "degraded" | "recovery_blocked";
@@ -959,7 +959,7 @@ export interface components {
959
959
  "application/json": components["schemas"]["ErrorEnvelope"];
960
960
  };
961
961
  };
962
- /** @description A trusted actor is required for this request but none was supplied. */
962
+ /** @description A trusted actor is required for this request but none was supplied (actor_required). In signed authentication mode (qwenSignature) every covered public and WebShell route additionally answers 401 authentication_required when the signature, timestamp or actor headers are missing, and 401 invalid_signature when the signature is wrong or stale. */
963
963
  Unauthorized: {
964
964
  headers: {
965
965
  [name: string]: unknown;
@@ -968,6 +968,15 @@ export interface components {
968
968
  "application/json": components["schemas"]["ErrorEnvelope"];
969
969
  };
970
970
  };
971
+ /** @description In signed authentication mode (qwenSignature) a request body beyond the configured signed-body limit (qwen.managed-agent.auth.max-signed-body-bytes, default 10 MiB) answers 413 payload_too_large before the signature is compared. */
972
+ PayloadTooLarge: {
973
+ headers: {
974
+ [name: string]: unknown;
975
+ };
976
+ content: {
977
+ "application/json": components["schemas"]["ErrorEnvelope"];
978
+ };
979
+ };
971
980
  /** @description Invalid request. */
972
981
  BadRequest: {
973
982
  headers: {
@@ -1040,7 +1049,9 @@ export interface operations {
1040
1049
  };
1041
1050
  };
1042
1051
  400: components["responses"]["BadRequest"];
1052
+ 401: components["responses"]["Unauthorized"];
1043
1053
  403: components["responses"]["Forbidden"];
1054
+ 413: components["responses"]["PayloadTooLarge"];
1044
1055
  };
1045
1056
  };
1046
1057
  webShellGetSession: {
@@ -1066,8 +1077,10 @@ export interface operations {
1066
1077
  };
1067
1078
  };
1068
1079
  400: components["responses"]["BadRequest"];
1080
+ 401: components["responses"]["Unauthorized"];
1069
1081
  403: components["responses"]["Forbidden"];
1070
1082
  404: components["responses"]["NotFound"];
1083
+ 413: components["responses"]["PayloadTooLarge"];
1071
1084
  };
1072
1085
  };
1073
1086
  webShellTranscript: {
@@ -1093,8 +1106,10 @@ export interface operations {
1093
1106
  };
1094
1107
  };
1095
1108
  400: components["responses"]["BadRequest"];
1109
+ 401: components["responses"]["Unauthorized"];
1096
1110
  403: components["responses"]["Forbidden"];
1097
1111
  404: components["responses"]["NotFound"];
1112
+ 413: components["responses"]["PayloadTooLarge"];
1098
1113
  };
1099
1114
  };
1100
1115
  webShellStreamEvents: {
@@ -1120,8 +1135,10 @@ export interface operations {
1120
1135
  };
1121
1136
  };
1122
1137
  400: components["responses"]["BadRequest"];
1138
+ 401: components["responses"]["Unauthorized"];
1123
1139
  403: components["responses"]["Forbidden"];
1124
1140
  404: components["responses"]["NotFound"];
1141
+ 413: components["responses"]["PayloadTooLarge"];
1125
1142
  };
1126
1143
  };
1127
1144
  webShellCreateSession: {
@@ -1152,6 +1169,7 @@ export interface operations {
1152
1169
  403: components["responses"]["Forbidden"];
1153
1170
  404: components["responses"]["NotFound"];
1154
1171
  409: components["responses"]["Conflict"];
1172
+ 413: components["responses"]["PayloadTooLarge"];
1155
1173
  503: components["responses"]["Unavailable"];
1156
1174
  };
1157
1175
  };
@@ -1179,9 +1197,11 @@ export interface operations {
1179
1197
  };
1180
1198
  };
1181
1199
  400: components["responses"]["BadRequest"];
1200
+ 401: components["responses"]["Unauthorized"];
1182
1201
  403: components["responses"]["Forbidden"];
1183
1202
  404: components["responses"]["NotFound"];
1184
1203
  409: components["responses"]["Conflict"];
1204
+ 413: components["responses"]["PayloadTooLarge"];
1185
1205
  };
1186
1206
  };
1187
1207
  webShellCancelTurn: {
@@ -1208,9 +1228,11 @@ export interface operations {
1208
1228
  };
1209
1229
  };
1210
1230
  400: components["responses"]["BadRequest"];
1231
+ 401: components["responses"]["Unauthorized"];
1211
1232
  403: components["responses"]["Forbidden"];
1212
1233
  404: components["responses"]["NotFound"];
1213
1234
  409: components["responses"]["Conflict"];
1235
+ 413: components["responses"]["PayloadTooLarge"];
1214
1236
  };
1215
1237
  };
1216
1238
  webShellQueryWorkspaces: {
@@ -1236,8 +1258,10 @@ export interface operations {
1236
1258
  };
1237
1259
  };
1238
1260
  400: components["responses"]["BadRequest"];
1261
+ 401: components["responses"]["Unauthorized"];
1239
1262
  403: components["responses"]["Forbidden"];
1240
1263
  404: components["responses"]["NotFound"];
1264
+ 413: components["responses"]["PayloadTooLarge"];
1241
1265
  };
1242
1266
  };
1243
1267
  webShellQueryCwdOperation: {
@@ -1263,9 +1287,11 @@ export interface operations {
1263
1287
  };
1264
1288
  };
1265
1289
  400: components["responses"]["BadRequest"];
1290
+ 401: components["responses"]["Unauthorized"];
1266
1291
  403: components["responses"]["Forbidden"];
1267
1292
  404: components["responses"]["NotFound"];
1268
1293
  409: components["responses"]["Conflict"];
1294
+ 413: components["responses"]["PayloadTooLarge"];
1269
1295
  };
1270
1296
  };
1271
1297
  queryWebShellActions: {
@@ -1291,11 +1317,12 @@ export interface operations {
1291
1317
  };
1292
1318
  };
1293
1319
  400: components["responses"]["BadRequest"];
1294
- /** @description Responding requires the Session creator (action_forbidden). */
1320
+ 401: components["responses"]["Unauthorized"];
1295
1321
  403: components["responses"]["Forbidden"];
1296
1322
  /** @description Unknown or unreadable Session (session_not_found), or unknown Action (action_not_found). */
1297
1323
  404: components["responses"]["NotFound"];
1298
1324
  409: components["responses"]["Conflict"];
1325
+ 413: components["responses"]["PayloadTooLarge"];
1299
1326
  };
1300
1327
  };
1301
1328
  getWebShellAction: {
@@ -1321,11 +1348,12 @@ export interface operations {
1321
1348
  };
1322
1349
  };
1323
1350
  400: components["responses"]["BadRequest"];
1324
- /** @description Responding requires the Session creator (action_forbidden). */
1351
+ 401: components["responses"]["Unauthorized"];
1325
1352
  403: components["responses"]["Forbidden"];
1326
1353
  /** @description Unknown or unreadable Session (session_not_found), or unknown Action (action_not_found). */
1327
1354
  404: components["responses"]["NotFound"];
1328
1355
  409: components["responses"]["Conflict"];
1356
+ 413: components["responses"]["PayloadTooLarge"];
1329
1357
  };
1330
1358
  };
1331
1359
  respondWebShellAction: {
@@ -1351,12 +1379,14 @@ export interface operations {
1351
1379
  };
1352
1380
  };
1353
1381
  400: components["responses"]["BadRequest"];
1354
- /** @description Responding requires the Session creator (action_forbidden). */
1382
+ 401: components["responses"]["Unauthorized"];
1383
+ /** @description Responding requires the Session creator (action_forbidden). A Session with no recorded creator and no recorded create command (anonymous open-mode creation, or a Session created before the V40 migration that also has no Workspace creation record) answers to any caller in its tenant, matching its read ACL. The tenant filter's 403 actor_scope_mismatch also applies on this route. */
1355
1384
  403: components["responses"]["Forbidden"];
1356
1385
  /** @description Unknown or unreadable Session (session_not_found), or unknown Action (action_not_found). */
1357
1386
  404: components["responses"]["NotFound"];
1358
1387
  /** @description Idempotency conflict, a non-active Session (session_inactive), or an ended Action (action_expired, action_cancelled, action_already_resolved). An existing matching response replays before the Session-state check. */
1359
1388
  409: components["responses"]["Conflict"];
1389
+ 413: components["responses"]["PayloadTooLarge"];
1360
1390
  };
1361
1391
  };
1362
1392
  closeWebShellSession: {
@@ -1382,9 +1412,11 @@ export interface operations {
1382
1412
  };
1383
1413
  };
1384
1414
  400: components["responses"]["BadRequest"];
1415
+ 401: components["responses"]["Unauthorized"];
1385
1416
  403: components["responses"]["Forbidden"];
1386
1417
  404: components["responses"]["NotFound"];
1387
1418
  409: components["responses"]["Conflict"];
1419
+ 413: components["responses"]["PayloadTooLarge"];
1388
1420
  };
1389
1421
  };
1390
1422
  archiveWebShellSession: {
@@ -1410,9 +1442,11 @@ export interface operations {
1410
1442
  };
1411
1443
  };
1412
1444
  400: components["responses"]["BadRequest"];
1445
+ 401: components["responses"]["Unauthorized"];
1413
1446
  403: components["responses"]["Forbidden"];
1414
1447
  404: components["responses"]["NotFound"];
1415
1448
  409: components["responses"]["Conflict"];
1449
+ 413: components["responses"]["PayloadTooLarge"];
1416
1450
  };
1417
1451
  };
1418
1452
  deleteWebShellSession: {
@@ -1438,9 +1472,11 @@ export interface operations {
1438
1472
  };
1439
1473
  };
1440
1474
  400: components["responses"]["BadRequest"];
1475
+ 401: components["responses"]["Unauthorized"];
1441
1476
  403: components["responses"]["Forbidden"];
1442
1477
  404: components["responses"]["NotFound"];
1443
1478
  409: components["responses"]["Conflict"];
1479
+ 413: components["responses"]["PayloadTooLarge"];
1444
1480
  };
1445
1481
  };
1446
1482
  webShellGetWorkspace: {
@@ -1466,8 +1502,10 @@ export interface operations {
1466
1502
  };
1467
1503
  };
1468
1504
  400: components["responses"]["BadRequest"];
1505
+ 401: components["responses"]["Unauthorized"];
1469
1506
  403: components["responses"]["Forbidden"];
1470
1507
  404: components["responses"]["NotFound"];
1508
+ 413: components["responses"]["PayloadTooLarge"];
1471
1509
  };
1472
1510
  };
1473
1511
  queryWebShellTasks: {
@@ -1493,8 +1531,10 @@ export interface operations {
1493
1531
  };
1494
1532
  };
1495
1533
  400: components["responses"]["BadRequest"];
1534
+ 401: components["responses"]["Unauthorized"];
1496
1535
  403: components["responses"]["Forbidden"];
1497
1536
  404: components["responses"]["NotFound"];
1537
+ 413: components["responses"]["PayloadTooLarge"];
1498
1538
  };
1499
1539
  };
1500
1540
  getWebShellTask: {
@@ -1520,8 +1560,10 @@ export interface operations {
1520
1560
  };
1521
1561
  };
1522
1562
  400: components["responses"]["BadRequest"];
1563
+ 401: components["responses"]["Unauthorized"];
1523
1564
  403: components["responses"]["Forbidden"];
1524
1565
  404: components["responses"]["NotFound"];
1566
+ 413: components["responses"]["PayloadTooLarge"];
1525
1567
  };
1526
1568
  };
1527
1569
  getWebShellToolResult: {
@@ -1575,6 +1617,7 @@ export interface operations {
1575
1617
  "application/json": components["schemas"]["ErrorEnvelope"];
1576
1618
  };
1577
1619
  };
1620
+ 413: components["responses"]["PayloadTooLarge"];
1578
1621
  /** @description Resource temporarily unavailable. */
1579
1622
  503: {
1580
1623
  headers: {
@@ -1637,6 +1680,7 @@ export interface operations {
1637
1680
  "application/json": components["schemas"]["ErrorEnvelope"];
1638
1681
  };
1639
1682
  };
1683
+ 413: components["responses"]["PayloadTooLarge"];
1640
1684
  /** @description Resource temporarily unavailable. */
1641
1685
  503: {
1642
1686
  headers: {
@@ -1699,6 +1743,7 @@ export interface operations {
1699
1743
  "application/json": components["schemas"]["ErrorEnvelope"];
1700
1744
  };
1701
1745
  };
1746
+ 413: components["responses"]["PayloadTooLarge"];
1702
1747
  /** @description Resource temporarily unavailable. */
1703
1748
  503: {
1704
1749
  headers: {
@@ -1734,9 +1779,11 @@ export interface operations {
1734
1779
  };
1735
1780
  };
1736
1781
  400: components["responses"]["BadRequest"];
1782
+ 401: components["responses"]["Unauthorized"];
1737
1783
  403: components["responses"]["Forbidden"];
1738
1784
  404: components["responses"]["NotFound"];
1739
1785
  409: components["responses"]["Conflict"];
1786
+ 413: components["responses"]["PayloadTooLarge"];
1740
1787
  };
1741
1788
  };
1742
1789
  }
@@ -5,6 +5,8 @@ interface UpdateControlProps {
5
5
  currentVersion: string;
6
6
  onError: (error: unknown, fallback: string) => void;
7
7
  onRestarted?: (url: string) => void;
8
+ /** Keep background update/restart polling alive when the menu closes. */
9
+ portalContainer?: HTMLElement | null;
8
10
  }
9
- export declare function UpdateControl({ client, collapsed, currentVersion, onError, onRestarted, }: UpdateControlProps): import("react/jsx-runtime").JSX.Element | null;
11
+ export declare function UpdateControl({ client, collapsed, currentVersion, onError, onRestarted, portalContainer, }: UpdateControlProps): import("react/jsx-runtime").JSX.Element | null;
10
12
  export {};
@@ -2,11 +2,12 @@ import { type ReactNode } from 'react';
2
2
  import { type DaemonWorkspaceCapability } from '@qwen-code/sdk/daemon';
3
3
  import { type WebShellTheme } from '../../themeContext';
4
4
  import { type WorkspaceManagementTarget, type WorkspaceOverviewItem } from './workspaceOverviewModel';
5
+ export declare const SIDEBAR_RAIL_WIDTH = 56;
5
6
  export type WebShellSidebarFooterItem = 'settings' | 'update' | 'version' | 'theme' | 'sessionsOverview' | 'workspacesOverview' | 'splitView' | 'daemonStatus' | 'localFiles' | 'desktopRelay' | 'collapse';
6
7
  export interface WebShellSidebarBranding {
7
8
  /** Replace the complete top branding row. */
8
9
  render?: () => ReactNode;
9
- /** Hide the branding row in the compact drawer. Defaults to true. */
10
+ /** Hide the branding row in the compact drawer. Defaults to false. */
10
11
  hideWhenCompact?: boolean;
11
12
  }
12
13
  export interface WebShellSidebarLockedWorkspace {
@@ -15,9 +16,9 @@ export interface WebShellSidebarLockedWorkspace {
15
16
  expanded: boolean;
16
17
  }) => ReactNode;
17
18
  }
18
- export type WebShellSidebarPrimaryNavItem = 'newTask' | 'agents' | 'plugins' | 'channels' | 'scheduledTasks' | 'workflows' | 'goals' | 'managed';
19
+ export type WebShellSidebarPrimaryNavItem = 'newTask' | 'agents' | 'plugins' | 'channels' | 'live' | 'scheduledTasks' | 'workflows' | 'goals' | 'managed';
19
20
  export interface WebShellSidebarPrimaryNavOptions {
20
- /** Built-in primary nav entries to show. Defaults to all. */
21
+ /** Built-in primary nav entries to show. Embedded hosts default to New task only. */
21
22
  items?: readonly WebShellSidebarPrimaryNavItem[];
22
23
  /** Additional custom content rendered after the built-in nav buttons. */
23
24
  render?: () => ReactNode;
@@ -28,6 +29,9 @@ export interface WebShellSidebarFooterOptions {
28
29
  /** Additional custom content rendered before the built-in footer items (left side). */
29
30
  render?: () => ReactNode;
30
31
  }
32
+ export declare const DEFAULT_FOOTER_ITEMS: readonly WebShellSidebarFooterItem[];
33
+ export declare const DESKTOP_DEFAULT_FOOTER_ITEMS: readonly WebShellSidebarFooterItem[];
34
+ export declare const DEFAULT_PRIMARY_NAV_ITEMS: readonly WebShellSidebarPrimaryNavItem[];
31
35
  export type WebShellSidebarSessionActionItem = 'details' | 'rename' | 'group' | 'export' | 'delete' | 'pin' | 'archive';
32
36
  /** Subset of action items that have working inline (hover-button) handlers. */
33
37
  export type WebShellSidebarSessionInlineActionItem = 'pin' | 'rename' | 'export' | 'delete';
@@ -57,11 +61,17 @@ interface WebShellSidebarProps {
57
61
  selectedCollaborationId?: string;
58
62
  onOpenCollaboration?: (id: string, cwd: string) => void;
59
63
  collapsed: boolean;
64
+ layout?: 'single' | 'rail';
65
+ activePage?: string;
66
+ containerWidth?: number;
67
+ onOpenHome?: () => void;
60
68
  onCollapsedChange: (collapsed: boolean) => void;
61
69
  onOpenSettings: () => void;
62
70
  onOpenAgents?: (view?: 'agents' | 'tasks' | 'runtime') => void;
63
71
  onOpenPlugins: () => void;
64
72
  onOpenChannels: () => void;
73
+ onOpenLive?: () => void;
74
+ onLiveVoiceSlotChange?: (element: HTMLDivElement | null) => void;
65
75
  onOpenManagedSessions?: () => void;
66
76
  onOpenDaemonStatus: () => void;
67
77
  onOpenScheduledTasks: () => void;
@@ -123,7 +133,7 @@ interface WebShellSidebarProps {
123
133
  primaryNav?: WebShellSidebarPrimaryNavOptions;
124
134
  /** Whether to show the Tasks/Channels session-source switch. Defaults to true. */
125
135
  showSessionSourceSwitch?: boolean;
126
- /** Whether to show daemon-owned Live conversations. Defaults to false. */
136
+ /** Show Live conversations and, in rail layout, the Live entry. Defaults to false. */
127
137
  showLive?: boolean;
128
138
  /** Whether to hide the "Projects" header row (with search and add workspace). Defaults to false (shown). */
129
139
  hideProjectHeader?: boolean;
@@ -148,4 +158,4 @@ interface WebShellSidebarProps {
148
158
  onLoadStandaloneSession?: (sessionId: string) => Promise<void> | void;
149
159
  onStandaloneNotice?: (message: string) => void;
150
160
  }
151
- export declare function WebShellSidebar({ selectedCollaborationId, onOpenCollaboration, collapsed, onCollapsedChange, onOpenSettings, onOpenAgents, onOpenPlugins, onOpenChannels, onOpenManagedSessions, onOpenDaemonStatus, onOpenScheduledTasks, onOpenWorkflows, onOpenGoals, onOpenSessions, canOpenSessionsOverview, onOpenWorkspacesOverview, onOpenSplitView, canOpenSplitView, onNewSession, onNewStandaloneSession, onLoadSession, onSelectCurrentSession, onSessionRenameConfirmed, onSessionsDeleted, onError, theme, onThemeChange, mobileOpen, onMobileClose, selectedWorkspaceCwd, onSelectWorkspace, onOpenGitDiff, onOpenCommit, onOpenAddWorkspace, workspaces: providedWorkspaces, lockedWorkspaceCwd, lockedWorkspace: lockedWorkspaceOptions, branding, primaryNav: primaryNavOptions, showSessionSourceSwitch, showLive, hideProjectHeader, sessionActions: sessionActionsOptions, footer, workspaceOverview, onOpenWorkspaceManagement, onNewWorktreeSession, projectFeaturesEnabled, onLoadStandaloneSession, onStandaloneNotice, }: WebShellSidebarProps): import("react/jsx-runtime").JSX.Element;
161
+ export declare function WebShellSidebar({ selectedCollaborationId, onOpenCollaboration, collapsed, layout, activePage, containerWidth, onOpenHome, onCollapsedChange, onOpenSettings, onOpenAgents, onOpenPlugins, onOpenChannels, onOpenLive, onLiveVoiceSlotChange, onOpenManagedSessions, onOpenDaemonStatus, onOpenScheduledTasks, onOpenWorkflows, onOpenGoals, onOpenSessions, canOpenSessionsOverview, onOpenWorkspacesOverview, onOpenSplitView, canOpenSplitView, onNewSession, onNewStandaloneSession, onLoadSession, onSelectCurrentSession, onSessionRenameConfirmed, onSessionsDeleted, onError, theme, onThemeChange, mobileOpen, onMobileClose, selectedWorkspaceCwd, onSelectWorkspace, onOpenGitDiff, onOpenCommit, onOpenAddWorkspace, workspaces: providedWorkspaces, lockedWorkspaceCwd, lockedWorkspace: lockedWorkspaceOptions, branding, primaryNav: primaryNavOptions, showSessionSourceSwitch, showLive, hideProjectHeader, sessionActions: sessionActionsOptions, footer, workspaceOverview, onOpenWorkspaceManagement, onNewWorktreeSession, projectFeaturesEnabled, onLoadStandaloneSession, onStandaloneNotice, }: WebShellSidebarProps): import("react/jsx-runtime").JSX.Element;
@@ -13,6 +13,7 @@ interface WorkspaceSectionProps {
13
13
  workspace: DaemonWorkspaceCapability;
14
14
  remote?: boolean;
15
15
  renderHeader?: (expanded: boolean) => ReactNode;
16
+ hideHeader?: boolean;
16
17
  client: DaemonClient;
17
18
  reloadToken: number;
18
19
  untrustedLabel: string;
@@ -117,5 +118,5 @@ interface WorkspaceSectionProps {
117
118
  /** Commit entry for the same picker; the row still opens without it. */
118
119
  onOpenCommit?: (workspaceCwd: string) => void;
119
120
  }
120
- export declare function WorkspaceSection({ additionalSessions, workspace, remote, renderHeader, client, reloadToken, untrustedLabel, readOnlyLabel, trustToOpenLabel, noSessionsLabel, loadErrorLabel, organizationEnabled, sessionCatalogRequestsEnabled, sessionGroupCatalog, sessionLiveStateEnabled, sourceType, channelGroupingEnabled, ungroupedLabel, searchQuery, expanded: controlledExpanded, autoExpandKey, forceAutoExpand, onExpandedChange, renderSessions, renderSession, pendingSession, mapSession, showSessionDetails, headerActions, overviewEnabled, overviewMenuOpen, overviewItems, gitBranchWanted, sessionStats, onRenameGroup, onDeleteGroup, renameGroupLabel, deleteGroupLabel, groupActionsDisabled, excludePinned, limitSessions, isPinnedSectionMember, onOpenPathLocally, onOpenTerminalLocally, onOpenGitDiff, onOpenCommit, }: WorkspaceSectionProps): import("react/jsx-runtime").JSX.Element;
121
+ export declare function WorkspaceSection({ additionalSessions, workspace, remote, renderHeader, hideHeader, client, reloadToken, untrustedLabel, readOnlyLabel, trustToOpenLabel, noSessionsLabel, loadErrorLabel, organizationEnabled, sessionCatalogRequestsEnabled, sessionGroupCatalog, sessionLiveStateEnabled, sourceType, channelGroupingEnabled, ungroupedLabel, searchQuery, expanded: controlledExpanded, autoExpandKey, forceAutoExpand, onExpandedChange, renderSessions, renderSession, pendingSession, mapSession, showSessionDetails, headerActions, overviewEnabled, overviewMenuOpen, overviewItems, gitBranchWanted, sessionStats, onRenameGroup, onDeleteGroup, renameGroupLabel, deleteGroupLabel, groupActionsDisabled, excludePinned, limitSessions, isPinnedSectionMember, onOpenPathLocally, onOpenTerminalLocally, onOpenGitDiff, onOpenCommit, }: WorkspaceSectionProps): import("react/jsx-runtime").JSX.Element;
121
122
  export {};
@@ -4,8 +4,9 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import type React from 'react';
7
- export declare function LiveVoiceButton({ hideInactiveTrigger, open, onOpenChange, onSupportedChange, onRequestFocusFallback, }?: {
7
+ export declare function LiveVoiceButton({ hideInactiveTrigger, portalContainer, open, onOpenChange, onSupportedChange, onRequestFocusFallback, }?: {
8
8
  hideInactiveTrigger?: boolean;
9
+ portalContainer?: HTMLElement | null;
9
10
  open?: boolean;
10
11
  onOpenChange?: (open: boolean) => void;
11
12
  onSupportedChange?: (supported: boolean) => void;
@@ -21,6 +21,7 @@ export interface NavigationSessionProps {
21
21
  interface NavigationController {
22
22
  route: WebShellRoute;
23
23
  revision: number;
24
+ historyRevision?: number;
24
25
  openPage: (page: WebShellPage) => void;
25
26
  returnToChat: () => void;
26
27
  reconcilePage: (page: WebShellPage | undefined) => void;
@@ -3,7 +3,7 @@
3
3
  * Copyright 2026 Qwen Team
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- export declare const WEB_SHELL_PAGES: readonly ["plugins", "channels", "scheduled-tasks", "goals", "settings"];
6
+ export declare const WEB_SHELL_PAGES: readonly ["plugins", "channels", "live", "scheduled-tasks", "goals", "settings"];
7
7
  export type WebShellPage = (typeof WEB_SHELL_PAGES)[number];
8
8
  export interface SessionUrlTarget {
9
9
  sessionId?: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qwen-code/web-shell",
3
- "version": "0.24.7-nightly.20261004.9915c7ff8f",
3
+ "version": "0.25.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/QwenLM/qwen-code.git",