@qwen-code/web-shell 0.26.1 → 0.26.2-preview.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 (47) hide show
  1. package/README.md +2 -0
  2. package/dist/{PierreFilePreview-BSn2Dh41.js → PierreFilePreview-Cf76KkJc.js} +1 -1
  3. package/dist/{SpreadsheetPreview-Cs6SPlHq.js → SpreadsheetPreview-BXxrs6FZ.js} +2 -2
  4. package/dist/{WorkspaceFileBrowser-Du2JJJeH.js → WorkspaceFileBrowser-Cfi_Fx8Q.js} +2 -2
  5. package/dist/{agents-route-Dk7VmGeH.js → agents-route-Dc73Pt04.js} +2 -2
  6. package/dist/daemon-react-sdk.js +1 -1
  7. package/dist/{index-C7o_tVb8.js → index-DjRVj9L_.js} +54762 -53059
  8. package/dist/index.js +3 -3
  9. package/dist/sw.js +1 -1
  10. package/dist/transcript.js +9120 -8920
  11. package/dist/types/components/ChatEditor.d.ts +5 -1
  12. package/dist/types/components/MessageItem.d.ts +1 -0
  13. package/dist/types/components/dialogs/AddWorkspaceDialog.d.ts +32 -1
  14. package/dist/types/components/extensions/ExtensionsManagerPage.d.ts +7 -1
  15. package/dist/types/components/managed/ManagedExtensionsManagerPage.d.ts +8 -0
  16. package/dist/types/components/managed/ManagedPermissionRulesDialog.d.ts +9 -0
  17. package/dist/types/components/managed/ManagedSessionActions.d.ts +2 -1
  18. package/dist/types/components/managed/ManagedSessionsPage.d.ts +1 -2
  19. package/dist/types/components/managed/ManagedUserMessageQueue.d.ts +5 -0
  20. package/dist/types/components/managed/WorkspaceBindingCreator.d.ts +1 -2
  21. package/dist/types/components/managed/generated/managed-agent-api.d.ts +961 -85
  22. package/dist/types/components/managed/java-managed-agent-client.d.ts +64 -1
  23. package/dist/types/components/managed/managed-agent-provider.d.ts +42 -10
  24. package/dist/types/components/managed/managed-extension-messages.d.ts +36 -0
  25. package/dist/types/components/managed/managed-extension-types.d.ts +10 -0
  26. package/dist/types/components/managed/use-managed-approval-change.d.ts +3 -1
  27. package/dist/types/components/managed/use-managed-file-references.d.ts +7 -0
  28. package/dist/types/components/managed/use-managed-file-upload.d.ts +23 -0
  29. package/dist/types/components/managed/use-managed-session-rename.d.ts +2 -2
  30. package/dist/types/components/managed/use-managed-user-messages.d.ts +13 -0
  31. package/dist/types/components/messages/AssistantMessage.d.ts +1 -0
  32. package/dist/types/components/messages/SettingsMessage.d.ts +13 -1
  33. package/dist/types/components/plugins/PluginManagerPage.d.ts +3 -1
  34. package/dist/types/components/ui/badge.d.ts +1 -1
  35. package/dist/types/components/ui/button.d.ts +1 -1
  36. package/dist/types/components/ui/tooltip.d.ts +3 -1
  37. package/dist/types/components/workspaces/WorkspaceDirectoriesSection.d.ts +11 -0
  38. package/dist/types/daemon/workspace/types.d.ts +12 -1
  39. package/dist/types/settings.d.ts +2 -1
  40. package/dist/types/utils/selectionClipboard.d.ts +1 -0
  41. package/dist/types/utils/selectionClipboard.transcript-stub.d.ts +1 -0
  42. package/dist/types/utils/todos.d.ts +8 -0
  43. package/dist/types/utils/turnDuration.d.ts +1 -0
  44. package/dist/{useDaemonMidTurnInjected-DGp6d4J1.js → useDaemonMidTurnInjected-DY7azBbC.js} +2480 -2255
  45. package/package.json +1 -1
  46. package/dist/types/components/managed/ManagedSessionCwdControl.d.ts +0 -9
  47. package/dist/types/components/managed/use-managed-cwd-change.d.ts +0 -21
@@ -1,3 +1,4 @@
1
+ import type { ManagedExtensionManifest, ManagedExtensionPin, ManagedExtensionPackageOperation, ManagedExtensionSelection } from './managed-extension-types';
1
2
  import type { components } from './generated/managed-agent-api';
2
3
  import type { ManagedArtifact } from './managed-tool-result-types';
3
4
  type Schemas = components['schemas'];
@@ -99,6 +100,14 @@ export declare class JavaManagedAgentClient {
99
100
  createWorkspace(request: Schemas['WebShellWorkspaceCreateRequest'], signal?: AbortSignal): Promise<JavaAgentWorkspace>;
100
101
  queryWorkspaceFiles(request: Schemas['WebShellWorkspaceFileQueryRequest'], signal?: AbortSignal): Promise<Schemas['WebShellWorkspaceFilePage']>;
101
102
  readWorkspaceFile(request: Schemas['WebShellWorkspaceFileReadRequest'], signal?: AbortSignal): Promise<Schemas['WebShellWorkspaceFileSnapshot']>;
103
+ uploadWorkspaceFile(request: {
104
+ workspaceId: string;
105
+ cwdRelative: string;
106
+ path: string;
107
+ expectedScopeRevision: string;
108
+ uploadId: string;
109
+ }, data: Blob, signal?: AbortSignal): Promise<Schemas['WebShellWorkspaceFileUploadResult']>;
110
+ queryWorkspaceFileUpload(uploadId: string, signal?: AbortSignal): Promise<Schemas['WebShellWorkspaceFileUploadStatus']>;
102
111
  workspaceDirectories(request: Schemas['WebShellWorkspaceDirectoryQueryRequest'], signal?: AbortSignal): Promise<Schemas['WebShellWorkspaceDirectoryPage']>;
103
112
  getSessionApproval(sessionId: string, signal?: AbortSignal): Promise<Schemas['WebShellSessionApproval']>;
104
113
  changeApproval(request: Schemas['WebShellChangeApprovalRequest'], signal?: AbortSignal): Promise<Schemas['WebShellApprovalChangeResult']>;
@@ -172,7 +181,6 @@ export declare class JavaManagedAgentClient {
172
181
  respondAction(request: Schemas['WebShellActionRespondRequest'], signal?: AbortSignal): Promise<Schemas['WebShellCommandOperation']>;
173
182
  /** Reads an operation's latest durable status; polling is not a replay. */
174
183
  queryOperation(request: Schemas['WebShellOperationRequest'], signal?: AbortSignal): Promise<Schemas['WebShellOperation']>;
175
- changeCwd(request: Schemas['WebShellChangeCwdRequest'], signal?: AbortSignal): Promise<Schemas['WebShellCwdOperation']>;
176
184
  compressContext(request: Schemas['WebShellContextCompressionRequest'], signal?: AbortSignal): Promise<Schemas['WebShellContextCompressionOperation']>;
177
185
  getSessionModels(sessionId: string, signal?: AbortSignal): Promise<{
178
186
  models: components["schemas"]["WebShellModelOption"][];
@@ -187,6 +195,52 @@ export declare class JavaManagedAgentClient {
187
195
  session_id: string;
188
196
  servers: components["schemas"]["PublicMcpServerCatalog"][];
189
197
  }>;
198
+ listExtensionPackages(workspaceId: string, signal?: AbortSignal): Promise<{
199
+ supported: boolean;
200
+ extensions: components["schemas"]["ManagedExtensionPackage"][];
201
+ }>;
202
+ publishExtensionPackage(workspaceId: string, extensionId: string | undefined, packageDigest: string, manifest: ManagedExtensionManifest, archive: Blob, idempotencyKey: string, signal?: AbortSignal): Promise<ManagedExtensionPackageOperation>;
203
+ getExtensionSettings(workspaceId: string, extensionId: string, signal?: AbortSignal): Promise<{
204
+ settingsRevision: number;
205
+ configuredKeys: string[];
206
+ }>;
207
+ saveExtensionSettings(workspaceId: string, extensionId: string, expectedRevision: number, values: Record<string, string>, idempotencyKey: string, signal?: AbortSignal): Promise<{
208
+ operationId: string;
209
+ extensionId: string;
210
+ kind: "publish" | "settings";
211
+ state: "pending" | "settled";
212
+ revision: number;
213
+ packageDigest: string | null;
214
+ }>;
215
+ queryExtensionConfiguration(sessionId: string, operationId?: string, signal?: AbortSignal): Promise<{
216
+ sessionId: string;
217
+ supported: boolean;
218
+ revision: number;
219
+ extensions: components["schemas"]["ManagedExtensionPackagePin"][];
220
+ requestedExtensions: components["schemas"]["ManagedExtensionPackagePin"][];
221
+ operation?: components["schemas"]["ManagedExtensionApplyOperation"];
222
+ }>;
223
+ applyExtensionConfiguration(sessionId: string, command: ManagedExtensionSelection, idempotencyKey: string, signal?: AbortSignal): Promise<{
224
+ sessionId: string;
225
+ supported: boolean;
226
+ revision: number;
227
+ extensions: components["schemas"]["ManagedExtensionPackagePin"][];
228
+ requestedExtensions: components["schemas"]["ManagedExtensionPackagePin"][];
229
+ operation?: components["schemas"]["ManagedExtensionApplyOperation"];
230
+ }>;
231
+ resumeExtensionConfiguration(sessionId: string, operationId: string, recoverPrevious: boolean, signal?: AbortSignal): Promise<{
232
+ sessionId: string;
233
+ supported: boolean;
234
+ revision: number;
235
+ extensions: components["schemas"]["ManagedExtensionPackagePin"][];
236
+ requestedExtensions: components["schemas"]["ManagedExtensionPackagePin"][];
237
+ operation?: components["schemas"]["ManagedExtensionApplyOperation"];
238
+ }>;
239
+ getExtensionPackage(workspaceId: string, pin: ManagedExtensionPin, signal?: AbortSignal): Promise<{
240
+ pin: components["schemas"]["ManagedExtensionPackagePin"];
241
+ manifest: components["schemas"]["ManagedExtensionPackageManifest"];
242
+ byteLength: number;
243
+ }>;
190
244
  queryMcpManagement(request: Schemas['WebShellMcpManagementQuery'], signal?: AbortSignal): Promise<{
191
245
  sessionId: string;
192
246
  revision: number;
@@ -245,7 +299,16 @@ export declare class JavaManagedAgentClient {
245
299
  openArtifactStream(artifact: ManagedArtifact, signal?: AbortSignal): Promise<ReadableStream<Uint8Array>>;
246
300
  private artifactContent;
247
301
  streamEvents(request: Schemas['WebShellStreamRequest'], signal?: AbortSignal, onOpen?: () => void, onAlive?: () => void): AsyncGenerator<JavaAgentEvent | JavaAgentResyncRequired>;
302
+ queryUserMessages(sessionId: string, signal?: AbortSignal): Promise<{
303
+ paused: boolean;
304
+ messages: components["schemas"]["UserMessage"][];
305
+ }>;
306
+ commandUserMessages(sessionId: string, command: import('./use-managed-user-messages').ManagedUserMessageCommand, idempotencyKey: string, signal?: AbortSignal): Promise<{
307
+ paused: boolean;
308
+ messages: components["schemas"]["UserMessage"][];
309
+ }>;
248
310
  private post;
249
311
  private request;
312
+ private fetchRequest;
250
313
  }
251
314
  export {};
@@ -1,14 +1,22 @@
1
+ import type { ManagedExtensionManifest, ManagedExtensionPin, ManagedExtensionCatalog, ManagedExtensionPackageOperation, ManagedExtensionSettings, ManagedExtensionSnapshot, ManagedExtensionSelection } from './managed-extension-types';
1
2
  import type { components } from './generated/managed-agent-api';
2
3
  import type { ManagedMcpManagementCommand, ManagedMcpManagementSnapshot } from './managed-mcp-management-types';
3
4
  import type { ManagedToolResultReader } from './managed-tool-result-types';
4
5
  export type ManagedAgentSessionPhase = 'created' | 'admitted' | 'runtime_starting' | 'agent_running' | 'waiting_runtime' | 'tool_running' | 'cancelling' | 'completed' | 'failed' | 'cancelled';
5
6
  export declare function isManagedSessionRunning(phase: ManagedAgentSessionPhase): boolean;
6
7
  export type ManagedAgentRuntimeState = 'unknown' | 'starting' | 'ready' | 'failed';
7
- export type ManagedApprovalMode = 'default' | 'auto-edit' | 'yolo';
8
+ export interface ManagedPermissionRules {
9
+ readonly allow: readonly string[];
10
+ readonly ask: readonly string[];
11
+ readonly deny: readonly string[];
12
+ }
13
+ export type ManagedApprovalMode = 'default' | 'auto-edit' | 'auto' | 'yolo';
8
14
  export type ManagedInputBlock = components['schemas']['InputBlock'];
9
15
  export type ManagedSessionSkills = components['schemas']['WebShellSessionSkills'];
10
16
  export type ManagedSessionMcp = components['schemas']['PublicMcpCatalog'];
11
17
  export declare function isManagedApprovalMode(value: unknown): value is ManagedApprovalMode;
18
+ export declare function isManagedInitialApprovalMode(value: unknown): value is Exclude<ManagedApprovalMode, 'auto'>;
19
+ export declare function managedPermissionRulesEqual(left: ManagedPermissionRules | undefined, right: ManagedPermissionRules | undefined): boolean;
12
20
  export type ManagedSessionSkill = components['schemas']['SessionCreationSkill'];
13
21
  export type ManagedSessionRecovery = components['schemas']['SessionRecovery'];
14
22
  export type ManagedTurnCancelOperation = components['schemas']['WebShellCommandOperation'];
@@ -30,6 +38,8 @@ export interface ManagedSessionApproval extends ManagedSessionOptions {
30
38
  supported: boolean;
31
39
  planMode?: boolean;
32
40
  liveSupported?: boolean;
41
+ permissionRulesSupported?: boolean;
42
+ permissionRules?: ManagedPermissionRules;
33
43
  }
34
44
  export interface ManagedApprovalChangeResult {
35
45
  sessionId: string;
@@ -37,6 +47,7 @@ export interface ManagedApprovalChangeResult {
37
47
  approvalRevision: number;
38
48
  replayed: boolean;
39
49
  planMode?: boolean;
50
+ permissionRules?: ManagedPermissionRules;
40
51
  }
41
52
  export interface ManagedModelContext {
42
53
  modelId: string;
@@ -109,7 +120,6 @@ export interface ManagedAgentSessionSummary {
109
120
  artifacts?: boolean;
110
121
  /** The caller may submit later Turns to this Workspace-bound Session. */
111
122
  workspaceTurns?: boolean;
112
- cwdChange?: boolean;
113
123
  modelChange?: boolean;
114
124
  contextCompression?: boolean;
115
125
  approvalModeChange?: boolean;
@@ -152,7 +162,6 @@ export interface ManagedAgentRequestOptions {
152
162
  export interface ManagedAgentCommandOptions extends ManagedAgentRequestOptions {
153
163
  idempotencyKey: string;
154
164
  }
155
- export type ManagedCwdOperation = components['schemas']['WebShellCwdOperation'];
156
165
  export type ManagedContextCompressionOperation = components['schemas']['WebShellContextCompressionOperation'];
157
166
  export type ManagedTask = components['schemas']['WebShellTask'];
158
167
  export type ManagedTaskPage = components['schemas']['WebShellTaskPage'];
@@ -188,6 +197,13 @@ export interface ManagedAgentPendingAction {
188
197
  inputPreview?: components['schemas']['WebShellActionInputPreview'];
189
198
  }
190
199
  export interface ManagedAgentProvider {
200
+ readonly userMessages?: {
201
+ query(sessionId: string, options: ManagedAgentRequestOptions): Promise<import('./use-managed-user-messages').ManagedUserMessageSnapshot>;
202
+ command(sessionId: string, command: import('./use-managed-user-messages').ManagedUserMessageCommand, options: {
203
+ idempotencyKey: string;
204
+ signal?: AbortSignal;
205
+ }): Promise<import('./use-managed-user-messages').ManagedUserMessageSnapshot>;
206
+ };
191
207
  readonly lifecycle?: {
192
208
  submit(kind: ManagedLifecycleKind, sessionId: string, options: ManagedAgentCommandOptions): Promise<ManagedLifecycleOperation>;
193
209
  unarchive(sessionId: string, options: ManagedAgentCommandOptions): Promise<ManagedAgentSessionSummary>;
@@ -211,6 +227,18 @@ export interface ManagedAgentProvider {
211
227
  readonly mcp?: {
212
228
  list(sessionId: string, options: ManagedAgentRequestOptions): Promise<ManagedSessionMcp>;
213
229
  };
230
+ readonly extensions?: {
231
+ readonly storageScope?: string;
232
+ list(workspaceId: string, options: ManagedAgentRequestOptions): Promise<ManagedExtensionCatalog>;
233
+ publish(workspaceId: string, extensionId: string | undefined, packageDigest: string, manifest: ManagedExtensionManifest, archive: Blob, options: ManagedAgentCommandOptions): Promise<ManagedExtensionPackageOperation>;
234
+ settings(workspaceId: string, extensionId: string, options: ManagedAgentRequestOptions): Promise<ManagedExtensionSettings>;
235
+ saveSettings(workspaceId: string, extensionId: string, expectedRevision: number, values: Record<string, string>, options: ManagedAgentCommandOptions): Promise<ManagedExtensionPackageOperation>;
236
+ query(sessionId: string, options: ManagedAgentRequestOptions): Promise<ManagedExtensionSnapshot>;
237
+ apply(sessionId: string, selection: ManagedExtensionSelection, options: ManagedAgentCommandOptions): Promise<ManagedExtensionSnapshot>;
238
+ operation(sessionId: string, operationId: string, options: ManagedAgentRequestOptions): Promise<ManagedExtensionSnapshot>;
239
+ resume(sessionId: string, operationId: string, recoverPrevious: boolean, options: ManagedAgentRequestOptions): Promise<ManagedExtensionSnapshot>;
240
+ package(workspaceId: string, pin: ManagedExtensionPin, options: ManagedAgentRequestOptions): Promise<ManagedExtensionCatalog['extensions'][number]>;
241
+ };
214
242
  readonly mcpManagement?: {
215
243
  /** Explicit tenant/actor namespace for pending commands saved in this tab. */
216
244
  readonly storageScope?: string;
@@ -246,13 +274,6 @@ export interface ManagedAgentProvider {
246
274
  query(sessionId: string, taskId: string, operationId: string, options: ManagedAgentRequestOptions): Promise<ManagedTaskCancelOperation>;
247
275
  };
248
276
  };
249
- readonly cwdChange?: {
250
- submit(sessionId: string, request: {
251
- cwdRelative: string;
252
- expectedContextRevision: number;
253
- }, options: ManagedAgentCommandOptions): Promise<ManagedCwdOperation>;
254
- query(sessionId: string, operationId: string, options: ManagedAgentRequestOptions): Promise<ManagedCwdOperation>;
255
- };
256
277
  readonly contextCompression?: {
257
278
  submit(sessionId: string, request: {
258
279
  expectedCompactionRevision: number;
@@ -265,6 +286,7 @@ export interface ManagedAgentProvider {
265
286
  approvalMode: ManagedApprovalMode;
266
287
  expectedRevision: number;
267
288
  planMode?: boolean;
289
+ permissionRules?: ManagedPermissionRules;
268
290
  }, options: ManagedAgentCommandOptions & {
269
291
  requestId: string;
270
292
  }): Promise<ManagedApprovalChangeResult>;
@@ -279,6 +301,14 @@ export interface ManagedAgentProvider {
279
301
  readonly workspaceFiles?: {
280
302
  query(request: components['schemas']['WebShellWorkspaceFileQueryRequest'], options: ManagedAgentRequestOptions): Promise<components['schemas']['WebShellWorkspaceFilePage']>;
281
303
  read(request: components['schemas']['WebShellWorkspaceFileReadRequest'], options: ManagedAgentRequestOptions): Promise<components['schemas']['WebShellWorkspaceFileSnapshot']>;
304
+ upload?(request: {
305
+ workspaceId: string;
306
+ cwdRelative: string;
307
+ path: string;
308
+ expectedScopeRevision: string;
309
+ uploadId: string;
310
+ }, data: Blob, options: ManagedAgentRequestOptions): Promise<components['schemas']['WebShellWorkspaceFileUploadResult']>;
311
+ queryUpload?(uploadId: string, options: ManagedAgentRequestOptions): Promise<components['schemas']['WebShellWorkspaceFileUploadStatus']>;
282
312
  };
283
313
  readonly workspaceBinding?: {
284
314
  readonly agentId: string;
@@ -323,6 +353,7 @@ export interface ManagedAgentProvider {
323
353
  approvalMode?: ManagedApprovalMode;
324
354
  planMode?: boolean;
325
355
  skills?: ManagedSessionSkill[];
356
+ extensionPins?: ManagedExtensionPin[];
326
357
  }, options: ManagedAgentCommandOptions): Promise<{
327
358
  sessionId: string;
328
359
  }>;
@@ -336,6 +367,7 @@ export interface ManagedAgentProvider {
336
367
  approvalMode?: ManagedApprovalMode;
337
368
  planMode?: boolean;
338
369
  skills?: ManagedSessionSkill[];
370
+ extensionPins?: ManagedExtensionPin[];
339
371
  }, options: ManagedAgentCommandOptions): Promise<{
340
372
  sessionId: string;
341
373
  }>;
@@ -0,0 +1,36 @@
1
+ export declare const MANAGED_EXTENSION_MESSAGES_EN: {
2
+ readonly 'managed.extensions.title': "Managed extensions";
3
+ readonly 'managed.extensions.description': "Publish a fixed package, select versions, then apply to an idle session.";
4
+ readonly 'managed.extensions.selectSession': "Select a workspace and session to manage extensions.";
5
+ readonly 'managed.extensions.unsupported': "Package extensions are unavailable for this target.";
6
+ readonly 'managed.extensions.source': "Original Git, npm, directory or archive source";
7
+ readonly 'managed.extensions.ref': "Source revision (optional)";
8
+ readonly 'managed.extensions.target': "Target platform";
9
+ readonly 'managed.extensions.publish': "Publish package";
10
+ readonly 'managed.extensions.new': "New extension";
11
+ readonly 'managed.extensions.update': "Update selected extension";
12
+ readonly 'managed.extensions.apply': "Apply selection";
13
+ readonly 'managed.extensions.retry': "Retry original request";
14
+ readonly 'managed.extensions.continue': "Continue original operation";
15
+ readonly 'managed.extensions.recover': "Restore previous version";
16
+ readonly 'managed.extensions.settings': "Settings";
17
+ readonly 'managed.extensions.settingsDescription': "Enter the complete set of environment settings. Saved values are never displayed.";
18
+ readonly 'managed.extensions.addSetting': "Add setting";
19
+ readonly 'managed.extensions.key': "Environment variable";
20
+ readonly 'managed.extensions.value': "Value";
21
+ readonly 'managed.extensions.saveSettings': "Save settings revision";
22
+ readonly 'managed.extensions.useSettings': "Use saved settings revision";
23
+ readonly 'managed.extensions.settingsRevision': "Settings revision (optional)";
24
+ readonly 'managed.extensions.installed': "Installed";
25
+ readonly 'managed.extensions.pending': "Pending apply";
26
+ readonly 'managed.extensions.active': "Active";
27
+ readonly 'managed.extensions.preparing': "Preparing";
28
+ readonly 'managed.extensions.prepared': "Ready to apply";
29
+ readonly 'managed.extensions.committed': "Applying";
30
+ readonly 'managed.extensions.recovery_required': "Recovery blocked";
31
+ readonly 'managed.extensions.failed': "Failed";
32
+ readonly 'managed.extensions.empty': "No packages published in this workspace.";
33
+ readonly 'managed.extensions.failedRequest': "The request could not be confirmed. Refresh status or retry the original request.";
34
+ readonly 'managed.extensions.localPublisher': "A connected daemon is required to prepare an original source.";
35
+ };
36
+ export declare const MANAGED_EXTENSION_MESSAGES_ZH: Record<keyof typeof MANAGED_EXTENSION_MESSAGES_EN, string>;
@@ -0,0 +1,10 @@
1
+ import type { components } from './generated/managed-agent-api';
2
+ export type ManagedExtensionPin = components['schemas']['ManagedExtensionPackagePin'];
3
+ export type ManagedExtensionManifest = components['schemas']['ManagedExtensionPackageManifest'];
4
+ export type ManagedExtensionCatalog = components['schemas']['ManagedExtensionPackageCatalog'];
5
+ export type ManagedExtensionPackageOperation = components['schemas']['ManagedExtensionPackageOperation'];
6
+ export type ManagedExtensionSettings = components['schemas']['ManagedExtensionPackageSettings'];
7
+ export type ManagedExtensionSnapshot = components['schemas']['ManagedExtensionManagementSnapshot'];
8
+ export type ManagedExtensionSelection = components['schemas']['ManagedExtensionApplySelection'];
9
+ export declare function isManagedExtensionPins(value: unknown): value is ManagedExtensionPin[];
10
+ export declare function requireExtensionSnapshot(value: ManagedExtensionSnapshot, sessionId: string): ManagedExtensionSnapshot;
@@ -1,4 +1,5 @@
1
1
  import type { ManagedAgentProvider, ManagedApprovalMode, ManagedAgentSessionSummary, ManagedSessionApproval } from './managed-agent-provider';
2
+ import type { ManagedPermissionRules } from './managed-agent-provider';
2
3
  interface ApprovalIntent {
3
4
  sessionId: string;
4
5
  approvalMode: ManagedApprovalMode;
@@ -6,6 +7,7 @@ interface ApprovalIntent {
6
7
  idempotencyKey: string;
7
8
  requestId: string;
8
9
  planMode?: boolean;
10
+ permissionRules?: ManagedPermissionRules;
9
11
  }
10
12
  export declare function useManagedApprovalChange(provider: ManagedAgentProvider, clientId: string, sessionId: string | undefined, summary: ManagedAgentSessionSummary | undefined, refreshSummary: (signal?: AbortSignal) => Promise<ManagedAgentSessionSummary | undefined>, interactive: boolean): {
11
13
  options: ManagedSessionApproval | undefined;
@@ -13,7 +15,7 @@ export declare function useManagedApprovalChange(provider: ManagedAgentProvider,
13
15
  optionsError: boolean;
14
16
  supported: boolean;
15
17
  blocked: boolean;
16
- submit: (approvalMode: ManagedApprovalMode, planMode?: boolean) => Promise<true | undefined>;
18
+ submit: (approvalMode: ManagedApprovalMode, planMode?: boolean, permissionRules?: ManagedPermissionRules) => Promise<true | undefined>;
17
19
  confirm: () => Promise<true | undefined>;
18
20
  reloadOptions: () => void;
19
21
  isBlocked: () => boolean;
@@ -1,5 +1,6 @@
1
1
  import type { AtMentionWorkspaceActions } from '../../hooks/useAtMentionSources';
2
2
  import type { ComposerSubmitMetadata } from '../../hooks/useComposerCore';
3
+ import type { WebShellComposerTag } from '../../customization';
3
4
  import type { ManagedAgentProvider } from './managed-agent-provider';
4
5
  import type { PromptFile } from '../../adapters/promptTypes';
5
6
  export declare function useManagedFileReferences(provider: ManagedAgentProvider, clientId: string, workspace: {
@@ -9,6 +10,12 @@ export declare function useManagedFileReferences(provider: ManagedAgentProvider,
9
10
  state?: string;
10
11
  } | undefined, sessionId?: string): {
11
12
  actions: AtMentionWorkspaceActions | undefined;
13
+ uploadTarget: {
14
+ client: import("../../hooks/useFileUpload").FileUploadClient;
15
+ targetKey: string;
16
+ maxBytes: number;
17
+ createReference(path: string): WebShellComposerTag;
18
+ } | undefined;
12
19
  busy: boolean;
13
20
  prepareInput: (text: string, files?: readonly PromptFile[], metadata?: ComposerSubmitMetadata) => Promise<{
14
21
  text: string;
@@ -0,0 +1,23 @@
1
+ import type { FileUploadClient } from '../../hooks/useFileUpload';
2
+ import type { WebShellComposerTag } from '../../customization';
3
+ import type { ManagedAgentProvider } from './managed-agent-provider';
4
+ export interface ManagedUploadReference {
5
+ version: 1;
6
+ source: string;
7
+ scopeRevision: string;
8
+ path: string;
9
+ }
10
+ interface UploadScope {
11
+ workspaceId: string;
12
+ cwdRelative: string;
13
+ source: string;
14
+ scopeRevision: string;
15
+ maxUploadBytes: number;
16
+ }
17
+ export declare function useManagedFileUpload(provider: ManagedAgentProvider, clientId: string, scope: UploadScope | undefined): {
18
+ client: FileUploadClient;
19
+ targetKey: string;
20
+ maxBytes: number;
21
+ createReference(path: string): WebShellComposerTag;
22
+ } | undefined;
23
+ export {};
@@ -1,12 +1,12 @@
1
1
  import type { ManagedAgentProvider, ManagedAgentSessionSummary } from './managed-agent-provider';
2
- export declare function useManagedSessionRename(provider: ManagedAgentProvider, clientId: string, sessionId: string | undefined, summary: ManagedAgentSessionSummary | undefined, interactive: boolean, onRenamed: (displayName: string) => void): {
2
+ export declare function useManagedSessionRename(provider: ManagedAgentProvider, clientId: string, sessionId: string | undefined, summary: ManagedAgentSessionSummary | undefined, interactive: boolean, onRenamed: (sessionId: string, displayName: string) => void): {
3
3
  supported: boolean;
4
4
  editor: {
5
5
  value: string;
6
6
  busy: boolean;
7
7
  error?: string;
8
8
  } | undefined;
9
- open(): void;
9
+ open(session?: ManagedAgentSessionSummary | undefined): void;
10
10
  close(): void;
11
11
  setValue(value: string): void;
12
12
  submit(displayName: string): Promise<void>;
@@ -0,0 +1,13 @@
1
+ import type { ManagedAgentProvider } from './managed-agent-provider';
2
+ export type ManagedUserMessageSnapshot = import('./generated/managed-agent-api').components['schemas']['UserMessageSnapshot'];
3
+ export type ManagedUserMessageCommand = import('./generated/managed-agent-api').components['schemas']['UserMessageCommand'];
4
+ export declare function useManagedUserMessages(provider: ManagedAgentProvider, sessionId?: string): {
5
+ snapshot: {
6
+ paused: boolean;
7
+ messages: import("./generated/managed-agent-api").components["schemas"]["UserMessage"][];
8
+ } | undefined;
9
+ supported: boolean;
10
+ error: string | undefined;
11
+ command: (command: ManagedUserMessageCommand, key?: string) => Promise<void>;
12
+ refresh: (signal?: AbortSignal) => Promise<void>;
13
+ };
@@ -10,6 +10,7 @@ interface AssistantMessageProps {
10
10
  timestamp?: number;
11
11
  onBranchSession?: () => void | Promise<void>;
12
12
  showFooterActions?: boolean;
13
+ footerAlwaysVisible?: boolean;
13
14
  showBranchAction?: boolean;
14
15
  /** Satisfied / not-satisfied marks are only offered when this is set. */
15
16
  showAssistantFeedback?: boolean;
@@ -24,9 +24,21 @@ interface SettingsMessageProps {
24
24
  modelManagementSectionProps?: ModelManagementProps;
25
25
  /** Browser-local remote computer catalog and connection controls. */
26
26
  connections?: ReactNode;
27
+ /**
28
+ * Extra-directory management for the selected workspace. Rendered only on
29
+ * the Workspace scope tab; omitted when the daemon cannot manage them.
30
+ */
31
+ workspaceDirectoriesSection?: ReactNode;
27
32
  embedded?: boolean;
28
33
  /** Category to select on open (deep link, e.g. 'Daemon'). */
29
34
  initialCategory?: string;
35
+ /**
36
+ * Whether the active session may write workspace settings. Standalone
37
+ * sessions cannot: their `/language ui --project` is refused, so the UI
38
+ * language row is offered only under the User tab, the one scope it can
39
+ * persist.
40
+ */
41
+ workspaceSettingsWritable?: boolean;
30
42
  }
31
43
  export interface SettingsMessageSettingsState {
32
44
  status: DaemonWorkspaceSettingsStatus | undefined;
@@ -51,5 +63,5 @@ export type FlatRow = {
51
63
  localKey: 'chatWidth' | 'browserNotifications';
52
64
  };
53
65
  export declare function nextSettingIdx(rows: FlatRow[], current: number, dir: 1 | -1): number;
54
- export declare function SettingsMessage({ settingsState, presentation, onLanguageChange, onOutputLanguageChange, onSubDialog, onThemeChange, chatWidthMode, onChatWidthModeChange, modelManagementSectionProps, connections, embedded, initialCategory, }: SettingsMessageProps): import("react/jsx-runtime").JSX.Element;
66
+ export declare function SettingsMessage({ settingsState, presentation, onLanguageChange, onOutputLanguageChange, onSubDialog, onThemeChange, chatWidthMode, onChatWidthModeChange, modelManagementSectionProps, connections, workspaceDirectoriesSection, embedded, initialCategory, workspaceSettingsWritable, }: SettingsMessageProps): import("react/jsx-runtime").JSX.Element;
55
67
  export {};
@@ -1,4 +1,5 @@
1
1
  import { type Ref } from 'react';
2
+ import type { ManagedExtensionsManagerPageProps } from '../managed/ManagedExtensionsManagerPage';
2
3
  import { type ManagedMcpManagerPageProps } from '../managed/ManagedMcpManagerPage';
3
4
  type PluginTab = 'extensions' | 'mcp' | 'skills' | 'agents';
4
5
  interface PluginManagerPageProps {
@@ -9,7 +10,8 @@ interface PluginManagerPageProps {
9
10
  skillsWorkspaceCwd?: string;
10
11
  onSkillsWorkspaceChange?: (cwd: string) => void;
11
12
  managedSkills?: boolean;
13
+ managedExtensions?: Omit<ManagedExtensionsManagerPageProps, 'onClose'>;
12
14
  managedMcp?: ManagedMcpManagerPageProps;
13
15
  }
14
- export declare function PluginManagerPage({ onClose, onUseSkill, initialFocusRef, initialTab, skillsWorkspaceCwd, onSkillsWorkspaceChange, managedSkills, managedMcp, }: PluginManagerPageProps): import("react/jsx-runtime").JSX.Element;
16
+ export declare function PluginManagerPage({ onClose, onUseSkill, initialFocusRef, initialTab, skillsWorkspaceCwd, onSkillsWorkspaceChange, managedSkills, managedExtensions, managedMcp, }: PluginManagerPageProps): import("react/jsx-runtime").JSX.Element;
15
17
  export {};
@@ -1,7 +1,7 @@
1
1
  import type * as React from 'react';
2
2
  import { type VariantProps } from 'class-variance-authority';
3
3
  declare const badgeVariants: (props?: ({
4
- variant?: "default" | "destructive" | "link" | "outline" | "secondary" | "ghost" | null | undefined;
4
+ variant?: "default" | "link" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
5
5
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
6
6
  declare function Badge({ className, variant, asChild, ...props }: React.ComponentProps<'span'> & VariantProps<typeof badgeVariants> & {
7
7
  asChild?: boolean;
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { type VariantProps } from 'class-variance-authority';
3
3
  declare const buttonVariants: (props?: ({
4
- variant?: "default" | "destructive" | "link" | "outline" | "secondary" | "ghost" | null | undefined;
4
+ variant?: "default" | "link" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
5
5
  size?: "default" | "icon" | "xs" | "sm" | "lg" | "icon-xs" | "icon-sm" | "icon-lg" | null | undefined;
6
6
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
7
  type ButtonProps = React.ComponentProps<'button'> & VariantProps<typeof buttonVariants> & {
@@ -3,5 +3,7 @@ import { Tooltip as TooltipPrimitive } from 'radix-ui';
3
3
  declare function TooltipProvider({ delayDuration, ...props }: React.ComponentProps<typeof TooltipPrimitive.Provider>): import("react/jsx-runtime").JSX.Element;
4
4
  declare function Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>): import("react/jsx-runtime").JSX.Element;
5
5
  declare const TooltipTrigger: React.ForwardRefExoticComponent<Omit<TooltipPrimitive.TooltipTriggerProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
6
- declare const TooltipContent: React.ForwardRefExoticComponent<Omit<TooltipPrimitive.TooltipContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
6
+ declare const TooltipContent: React.ForwardRefExoticComponent<Omit<TooltipPrimitive.TooltipContentProps & React.RefAttributes<HTMLDivElement> & {
7
+ variant?: "default" | "black";
8
+ }, "ref"> & React.RefAttributes<HTMLDivElement>>;
7
9
  export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Qwen Team
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Extra directories of the selected workspace, presented in the Settings
8
+ * panel. Adds and removes go through the daemon's workspace-directory route,
9
+ * which applies them to live sessions and persists the workspace setting.
10
+ */
11
+ export declare function WorkspaceDirectoriesSection(): import("react/jsx-runtime").JSX.Element | null;
@@ -4,7 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import type { ReactNode } from 'react';
7
- import type { DaemonAgentMutationResult, DaemonAuthProviderId, DaemonAuthProviderCatalog, DaemonAuthProviderInstallRequest, DaemonAuthProviderInstallResult, DaemonAuthStatusSnapshot, DaemonCapabilities, DaemonChannelMutationResult, DaemonChannelPairingApprovalResult, DaemonChannelPairingApprovalsSnapshot, DaemonChannelPairingRequestsSnapshot, DaemonChannelPairingRevocationRequest, DaemonChannelPairingRevocationResult, DaemonChannelsSnapshot, DaemonChannelStartupRequest, DaemonChannelTypeCatalog, DaemonChannelUpsertRequest, DaemonClient, DaemonCreateAgentRequest, DaemonWorkspaceGenerationEvent, DaemonGeneratedAgentContent, DaemonDeviceFlowStartResult, DaemonDeviceFlowState, ExtensionMutationResponse, ExtensionInteractionResponse, ExtensionInteractionResponseResult, ExtensionOperationStatus, ExtensionActiveOperations, ExtensionRefreshResponse, ExtensionScopeRequest, ExtensionInstallRequest, ExtensionArchiveInstallRequest, ExtensionInstallResponse, ExtensionUpdateCheckResponse, GoalControlRequest, GoalSnapshotV2, GoalStateResponse, DaemonInitWorkspaceResult, DaemonMcpRestartResult, DaemonMcpManageAction, DaemonMcpManageResult, DaemonRuntimeMcpAddRequest, DaemonRuntimeMcpAddResult, DaemonRuntimeMcpRemoveResult, DaemonUpdateAgentRequest, DaemonWorkspaceAgentDetail, DaemonWorkspaceAgentsStatus, DaemonWorkspaceAcpPreheatResult, DaemonWorkspaceEnvStatus, DaemonWorkspaceExtensionsStatus, DaemonWorkspaceExtensionSummaries, DaemonExtensionEntry, DaemonWorkspaceFile, DaemonWorkspaceFileBytes, DaemonWorkspaceFileEditRequest, DaemonWorkspaceFileEditResult, DaemonWorkspaceFileWriteRequest, DaemonWorkspaceFileWriteResult, DaemonWorkspaceMcpStatus, DaemonWorkspaceMcpConfigStatus, DaemonMcpConfigMutationResult, DaemonMcpConfigScope, DaemonWorkspaceRuntimeStatus, DaemonWorkspaceMcpInitializeResult, DaemonWorkspaceMcpReloadResult, DaemonWorkspaceMcpToolsStatus, DaemonWorkspaceMcpResourcesStatus, DaemonWorkspaceMemoryStatus, DaemonWorkspaceCapability, DaemonWorkspaceRemovalResult, DaemonWorkspaceUpdate, DaemonWorkspacePreflightStatus, DaemonWorkspaceProvidersStatus, DaemonWorkspaceSkillsStatus, DaemonSkillToggleResult, DaemonSkillInstallRequest, DaemonSkillMutationResult, DaemonSkillScope, DaemonWorkspaceToolsStatus, DaemonBrand, DaemonWorkspaceSettingsStatus, DaemonSettingUpdateResult, DaemonModelDeleteRequest, DaemonModelDeleteResult, DaemonSessionGroup, DaemonSessionGroupCatalog, DaemonSessionGroupInput, DaemonSessionGroupUpdate, DaemonSessionListPage, DaemonSessionListPageOptions, DaemonSessionOrganizationResult, DaemonSessionOrganizationUpdate, DaemonSessionSummary, DaemonSessionExportFormat, DaemonSessionExportResult, DaemonStatusReport, DaemonStatusReportDetail, DaemonUsageDashboard, DaemonUsageRange, DaemonWriteMemoryRequest, DaemonWriteMemoryResult, DaemonRevisionRequest } from '@qwen-code/sdk/daemon';
7
+ import type { DaemonAgentMutationResult, DaemonAuthProviderId, DaemonAuthProviderCatalog, DaemonAuthProviderInstallRequest, DaemonAuthProviderInstallResult, DaemonAuthStatusSnapshot, DaemonCapabilities, DaemonChannelMutationResult, DaemonChannelPairingApprovalResult, DaemonChannelPairingApprovalsSnapshot, DaemonChannelPairingRequestsSnapshot, DaemonChannelPairingRevocationRequest, DaemonChannelPairingRevocationResult, DaemonChannelsSnapshot, DaemonChannelStartupRequest, DaemonChannelTypeCatalog, DaemonChannelUpsertRequest, DaemonClient, DaemonCreateAgentRequest, DaemonGitCloneJob, DaemonWorkspaceGenerationEvent, DaemonGeneratedAgentContent, DaemonDeviceFlowStartResult, DaemonDeviceFlowState, ExtensionMutationResponse, ExtensionInteractionResponse, ExtensionInteractionResponseResult, ExtensionOperationStatus, ExtensionActiveOperations, ExtensionRefreshResponse, ExtensionScopeRequest, ExtensionInstallRequest, ExtensionArchiveInstallRequest, ExtensionInstallResponse, ExtensionUpdateCheckResponse, GoalControlRequest, GoalSnapshotV2, GoalStateResponse, DaemonInitWorkspaceResult, DaemonMcpRestartResult, DaemonMcpManageAction, DaemonMcpManageResult, DaemonRuntimeMcpAddRequest, DaemonRuntimeMcpAddResult, DaemonRuntimeMcpRemoveResult, DaemonUpdateAgentRequest, DaemonWorkspaceAgentDetail, DaemonWorkspaceAgentsStatus, DaemonWorkspaceAcpPreheatResult, DaemonWorkspaceEnvStatus, DaemonWorkspaceExtensionsStatus, DaemonWorkspaceExtensionSummaries, DaemonExtensionEntry, DaemonWorkspaceFile, DaemonWorkspaceFileBytes, DaemonWorkspaceFileEditRequest, DaemonWorkspaceFileEditResult, DaemonWorkspaceFileWriteRequest, DaemonWorkspaceFileWriteResult, DaemonWorkspaceMcpStatus, DaemonWorkspaceDirectories, DaemonWorkspaceDirectoriesMutation, DaemonWorkspaceMcpConfigStatus, DaemonMcpConfigMutationResult, DaemonMcpConfigScope, DaemonWorkspaceRuntimeStatus, DaemonWorkspaceMcpInitializeResult, DaemonWorkspaceMcpReloadResult, DaemonWorkspaceMcpToolsStatus, DaemonWorkspaceMcpResourcesStatus, DaemonWorkspaceMemoryStatus, DaemonWorkspaceCapability, DaemonWorkspaceRemovalResult, DaemonWorkspaceUpdate, DaemonWorkspacePreflightStatus, DaemonWorkspaceProvidersStatus, DaemonWorkspaceSkillsStatus, DaemonSkillToggleResult, DaemonSkillInstallRequest, DaemonSkillMutationResult, DaemonSkillScope, DaemonWorkspaceToolsStatus, DaemonBrand, DaemonWorkspaceSettingsStatus, DaemonSettingUpdateResult, DaemonModelDeleteRequest, DaemonModelDeleteResult, DaemonSessionGroup, DaemonSessionGroupCatalog, DaemonSessionGroupInput, DaemonSessionGroupUpdate, DaemonSessionListPage, DaemonSessionListPageOptions, DaemonSessionOrganizationResult, DaemonSessionOrganizationUpdate, DaemonSessionSummary, DaemonSessionExportFormat, DaemonSessionExportResult, DaemonStatusReport, DaemonStatusReportDetail, DaemonUsageDashboard, DaemonUsageRange, DaemonWriteMemoryRequest, DaemonWriteMemoryResult, DaemonRevisionRequest } from '@qwen-code/sdk/daemon';
8
8
  export interface DaemonResourceOptions {
9
9
  autoLoad?: boolean;
10
10
  enabled?: boolean;
@@ -441,9 +441,20 @@ export interface DaemonWorkspaceActions {
441
441
  displayName?: string;
442
442
  }): Promise<DaemonAddWorkspaceResult>;
443
443
  addScratchWorkspace(): Promise<DaemonAddWorkspaceResult>;
444
+ startGitWorkspaceClone(input: {
445
+ url: string;
446
+ target: string;
447
+ }): Promise<{
448
+ jobId: string;
449
+ }>;
450
+ getGitWorkspaceCloneJob(jobId: string): Promise<DaemonGitCloneJob>;
451
+ cancelGitWorkspaceClone(jobId: string): Promise<DaemonGitCloneJob>;
444
452
  suggestWorkspacePaths(prefix: string): Promise<DaemonWorkspacePathSuggestions>;
445
453
  pickWorkspaceDirectory(): Promise<DaemonWorkspaceDirectoryPickerResult>;
446
454
  updateWorkspace(workspaceSelector: string, update: DaemonWorkspaceUpdate): Promise<DaemonWorkspaceCapability>;
455
+ listWorkspaceDirectories(workspaceSelector: string): Promise<DaemonWorkspaceDirectories>;
456
+ addWorkspaceDirectory(workspaceSelector: string, path: string): Promise<DaemonWorkspaceDirectoriesMutation>;
457
+ removeWorkspaceDirectory(workspaceSelector: string, path: string): Promise<DaemonWorkspaceDirectoriesMutation>;
447
458
  removeWorkspace(workspaceId: string, options?: {
448
459
  force?: boolean;
449
460
  timeoutMs?: number;
@@ -62,10 +62,11 @@ declare const SETTING_KEYS: {
62
62
  readonly 'setting:omni-media-delivery': "omni.enabled";
63
63
  readonly 'setting:artifacts': "experimental.artifact";
64
64
  readonly 'setting:tool-use-summaries': "experimental.emitToolUseSummaries";
65
+ readonly 'setting:unified-agent-loop': "experimental.unifiedAgentLoop";
65
66
  readonly 'setting:voice-model': "voiceModel";
66
67
  readonly 'setting:image-model': "imageModel";
67
68
  };
68
- declare const BUILTIN_IDS: readonly ["builtin:chat-width", "builtin:browser-notifications", "builtin:live-setup", "builtin:local-control", "builtin:connections", "builtin:model-management"];
69
+ declare const BUILTIN_IDS: readonly ["builtin:chat-width", "builtin:browser-notifications", "builtin:live-setup", "builtin:local-control", "builtin:connections", "builtin:workspace-directories", "builtin:model-management"];
69
70
  export type WebShellSettingItemId = keyof typeof SETTING_KEYS | (typeof BUILTIN_IDS)[number];
70
71
  export declare const WEB_SHELL_SETTING_ITEM_IDS: readonly WebShellSettingItemId[];
71
72
  export interface WebShellSettingsOptions {
@@ -1,4 +1,5 @@
1
1
  export declare function getReplySelectionRange(body: HTMLElement): Range | null;
2
+ export declare function getSelectedReplyText(body: HTMLElement, range: Range): string | null;
2
3
  export declare function getSelectedReplyContent(body: HTMLElement, range: Range): {
3
4
  text: string;
4
5
  markdown: string;
@@ -0,0 +1 @@
1
+ export declare function getSelectedReplyText(body: HTMLElement): string;
@@ -24,6 +24,14 @@ export interface FloatingTodosState {
24
24
  sourceMessageId: string | null;
25
25
  }
26
26
  export declare function getFloatingTodos(messages: readonly Message[]): FloatingTodosState;
27
+ /**
28
+ * The durable Managed session view only shows a Todo snapshot after its tool
29
+ * call has completed successfully. A pending or failed call can still carry
30
+ * the model's full input, but it must not replace the last committed list.
31
+ * Keep the empty array as a real snapshot so a successful clear can remove
32
+ * the panel while an absent snapshot remains distinguishable during loading.
33
+ */
34
+ export declare function getLatestSuccessfulTodos(messages: readonly Message[]): TodoItem[] | undefined;
27
35
  export declare function getSessionWorkflowTodos(messages: readonly Message[]): FloatingTodosState;
28
36
  export declare function getActiveTodosForPlanRevision(messages: readonly Message[], revision: {
29
37
  planId: string;
@@ -0,0 +1 @@
1
+ export declare function formatTurnDuration(ms: number): string;