@qwen-code/web-shell 0.24.7 → 0.25.1-preview.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.
Files changed (79) hide show
  1. package/README.md +65 -2
  2. package/dist/ThreadsRoute-CXAiD3t_.js +2407 -0
  3. package/dist/daemon-react-sdk.js +1 -1
  4. package/dist/index-D9Bc2Hcz.js +123543 -0
  5. package/dist/index.js +69 -120254
  6. package/dist/sw.js +1 -1
  7. package/dist/{toolNames-B0O1UjKB.js → toolNames-CDhDlFnq.js} +5415 -4628
  8. package/dist/transcript.js +8980 -8737
  9. package/dist/types/App.d.ts +2 -2
  10. package/dist/types/ManagedAgentWebShell.d.ts +1 -0
  11. package/dist/types/adapters/messageTypes.d.ts +15 -0
  12. package/dist/types/adapters/transcriptAdapter.d.ts +1 -0
  13. package/dist/types/components/ChatEditor.d.ts +1 -0
  14. package/dist/types/components/DesktopRelayControl.d.ts +2 -1
  15. package/dist/types/components/LocalFilesControl.d.ts +3 -1
  16. package/dist/types/components/MessageItem.d.ts +1 -0
  17. package/dist/types/components/MessageList.d.ts +1 -0
  18. package/dist/types/components/agents/AgentCreatePage.d.ts +29 -1
  19. package/dist/types/components/agents/AgentsManagerPage.d.ts +6 -1
  20. package/dist/types/components/artifacts/ArtifactPanel.d.ts +8 -1
  21. package/dist/types/components/artifacts/TrajectoryInspector.d.ts +3 -1
  22. package/dist/types/components/artifacts/TrajectoryOverview.d.ts +3 -1
  23. package/dist/types/components/artifacts/TrajectoryWaterfallCell.d.ts +15 -0
  24. package/dist/types/components/channels/ChannelsManagerPage.d.ts +1 -1
  25. package/dist/types/components/extensions/extensions-manager-logic.d.ts +3 -3
  26. package/dist/types/components/managed/ManagedToolResultPanel.d.ts +9 -0
  27. package/dist/types/components/managed/ManagedToolResultSummary.d.ts +5 -0
  28. package/dist/types/components/managed/generated/managed-agent-api.d.ts +911 -16
  29. package/dist/types/components/managed/java-managed-agent-client.d.ts +27 -1
  30. package/dist/types/components/managed/java-managed-agent-provider.d.ts +4 -0
  31. package/dist/types/components/managed/managed-agent-provider.d.ts +43 -1
  32. package/dist/types/components/managed/managed-agent-sse.test-fixtures.d.ts +8 -0
  33. package/dist/types/components/managed/managed-approval.d.ts +10 -0
  34. package/dist/types/components/managed/managed-artifact-download.d.ts +2 -0
  35. package/dist/types/components/managed/managed-request-error.d.ts +14 -0
  36. package/dist/types/components/managed/managed-tool-result-types.d.ts +24 -0
  37. package/dist/types/components/managed/managed-tool-result.test-fixtures.d.ts +6 -0
  38. package/dist/types/components/managed/use-managed-actions.d.ts +33 -0
  39. package/dist/types/components/messages/AssistantMessage.d.ts +3 -0
  40. package/dist/types/components/messages/AuthorAvatar.d.ts +16 -0
  41. package/dist/types/components/messages/ContextUsageMessage.d.ts +5 -1
  42. package/dist/types/components/messages/StatsMessage.d.ts +6 -1
  43. package/dist/types/components/messages/ToolApproval.d.ts +9 -1
  44. package/dist/types/components/messages/ToolGroup.d.ts +2 -0
  45. package/dist/types/components/sidebar/UpdateControl.d.ts +3 -1
  46. package/dist/types/components/sidebar/WebShellSidebar.d.ts +18 -5
  47. package/dist/types/components/sidebar/WorkspaceSection.d.ts +3 -1
  48. package/dist/types/components/sidebar/sessionSearch.d.ts +2 -1
  49. package/dist/types/components/workspace-agents/LazyThreadsRoute.d.ts +7 -0
  50. package/dist/types/components/workspace-agents/ThreadChat.d.ts +35 -0
  51. package/dist/types/components/workspace-agents/ThreadView.d.ts +72 -0
  52. package/dist/types/components/workspace-agents/ThreadsPage.d.ts +146 -0
  53. package/dist/types/components/workspace-agents/ThreadsRoute.d.ts +23 -0
  54. package/dist/types/components/workspace-agents/add-runtime-dialog.d.ts +50 -0
  55. package/dist/types/components/workspace-agents/agent-events.d.ts +50 -0
  56. package/dist/types/components/workspace-agents/agents-view-logic.d.ts +180 -0
  57. package/dist/types/components/workspace-agents/messages.d.ts +16 -0
  58. package/dist/types/components/workspace-agents/messages.transcript-stub.d.ts +12 -0
  59. package/dist/types/components/workspace-agents/share-agent-dialog.d.ts +33 -0
  60. package/dist/types/components/workspace-agents/threads-api.d.ts +63 -0
  61. package/dist/types/components/workspace-agents/useAgentChatEntry.d.ts +36 -0
  62. package/dist/types/components/workspace-agents/useProjectConversations.d.ts +10 -0
  63. package/dist/types/customization.d.ts +10 -0
  64. package/dist/types/daemon/session/types.d.ts +19 -3
  65. package/dist/types/daemon/workspace/hooks/useDaemonMemory.d.ts +4 -0
  66. package/dist/types/daemon/workspace/types.d.ts +6 -2
  67. package/dist/types/index.d.ts +2 -1
  68. package/dist/types/live/LiveVoiceButton.d.ts +2 -1
  69. package/dist/types/navigation.d.ts +1 -0
  70. package/dist/types/settings.d.ts +1 -0
  71. package/dist/types/trajectory/buildTrajectoryLayout.d.ts +27 -0
  72. package/dist/types/trajectory/types.d.ts +2 -1
  73. package/dist/types/trajectory/useTimelineViewport.d.ts +19 -0
  74. package/dist/types/utils/cancelledTurn.d.ts +17 -0
  75. package/dist/types/utils/composerTag.d.ts +6 -1
  76. package/dist/types/utils/modelEncoding.d.ts +6 -0
  77. package/dist/types/utils/navigationUrl.d.ts +1 -1
  78. package/dist/types/utils/workspace.d.ts +1 -0
  79. package/package.json +1 -1
@@ -1,4 +1,5 @@
1
1
  import type { components } from './generated/managed-agent-api';
2
+ import type { ManagedArtifact } from './managed-tool-result-types';
2
3
  type Schemas = components['schemas'];
3
4
  export type JavaAgentDate = number | string;
4
5
  export type JavaAgentTurn = Schemas['WebShellTurn'];
@@ -17,11 +18,14 @@ export type JavaAgentSessionPage = Omit<Schemas['WebShellSessionPage'], 'data'>
17
18
  };
18
19
  export type JavaAgentEvent = Schemas['WebShellEvent'];
19
20
  export type JavaAgentResyncRequired = Schemas['WebShellResyncRequired'];
21
+ export declare const SKIP_ON_CORRUPT: ReadonlySet<string>;
20
22
  export declare function isJavaAgentResyncRequired(frame: JavaAgentEvent | JavaAgentResyncRequired): frame is JavaAgentResyncRequired;
21
23
  export type JavaAgentContentPart = Schemas['WebShellContentPart'];
22
24
  export type JavaAgentItem = Schemas['WebShellItem'];
23
25
  export type JavaAgentCommandAdmission = Schemas['WebShellAdmission'];
24
26
  export type JavaAgentTranscript = Schemas['WebShellTranscript'];
27
+ export type JavaAgentAction = Schemas['WebShellAction'];
28
+ export type JavaAgentActionPage = Schemas['WebShellActionPage'];
25
29
  export interface JavaManagedAgentClientOptions {
26
30
  baseUrl: string;
27
31
  getHeaders?: () => HeadersInit | Promise<HeadersInit>;
@@ -52,7 +56,29 @@ export declare class JavaManagedAgentClient {
52
56
  createSession(request: Schemas['WebShellCreateRequest'], signal?: AbortSignal): Promise<JavaAgentCommandAdmission>;
53
57
  submitTurn(request: Schemas['WebShellSubmitRequest'], signal?: AbortSignal): Promise<JavaAgentCommandAdmission>;
54
58
  cancelTurn(request: Schemas['WebShellCancelRequest'], signal?: AbortSignal): Promise<JavaAgentCommandAdmission>;
55
- streamEvents(request: Schemas['WebShellStreamRequest'], signal?: AbortSignal): AsyncGenerator<JavaAgentEvent | JavaAgentResyncRequired>;
59
+ queryActions(request: Schemas['WebShellActionQueryRequest'], signal?: AbortSignal): Promise<JavaAgentActionPage>;
60
+ respondAction(request: Schemas['WebShellActionRespondRequest'], signal?: AbortSignal): Promise<Schemas['WebShellCommandOperation']>;
61
+ getToolResult(sessionId: string, itemId: string, signal?: AbortSignal): Promise<{
62
+ result: components["schemas"]["PublicToolResult"];
63
+ access: components["schemas"]["ArtifactAccess"];
64
+ }>;
65
+ listArtifacts(request: {
66
+ sessionId: string;
67
+ cursor?: string;
68
+ limit?: number;
69
+ }, signal?: AbortSignal): Promise<{
70
+ data: components["schemas"]["ArtifactResponse"][];
71
+ nextCursor: string | null;
72
+ hasMore: boolean;
73
+ }>;
74
+ getArtifact(sessionId: string, artifactId: string, signal?: AbortSignal): Promise<{
75
+ artifact: components["schemas"]["PublicArtifact"];
76
+ access: components["schemas"]["ArtifactAccess"];
77
+ }>;
78
+ readArtifactRange(artifact: ManagedArtifact, offset: number, length: number, signal?: AbortSignal): Promise<Uint8Array>;
79
+ openArtifactStream(artifact: ManagedArtifact, signal?: AbortSignal): Promise<ReadableStream<Uint8Array>>;
80
+ private artifactContent;
81
+ streamEvents(request: Schemas['WebShellStreamRequest'], signal?: AbortSignal, onOpen?: () => void): AsyncGenerator<JavaAgentEvent | JavaAgentResyncRequired>;
56
82
  private post;
57
83
  private request;
58
84
  }
@@ -1,9 +1,13 @@
1
1
  import { type JavaManagedAgentClientOptions } from './java-managed-agent-client';
2
+ import type { ManagedArtifactSave } from './managed-tool-result-types';
2
3
  import type { ManagedAgentProvider } from './managed-agent-provider';
3
4
  export interface JavaManagedAgentProviderOptions extends JavaManagedAgentClientOptions {
4
5
  agentId?: string;
5
6
  environmentId?: string;
7
+ /** Include tenant and actor identity; replace this scope/provider when either changes. Token refresh alone can use getHeaders. */
6
8
  productScope?: string;
7
9
  enableWorkspaceBinding?: boolean;
10
+ /** Acquire a streaming save target during the user gesture, then call openStream. */
11
+ saveArtifact?: ManagedArtifactSave;
8
12
  }
9
13
  export declare function createJavaManagedAgentProvider(options: JavaManagedAgentProviderOptions): ManagedAgentProvider;
@@ -1,3 +1,5 @@
1
+ import type { components } from './generated/managed-agent-api';
2
+ import type { ManagedToolResultReader } from './managed-tool-result-types';
1
3
  export type ManagedAgentSessionPhase = 'created' | 'admitted' | 'runtime_starting' | 'agent_running' | 'waiting_runtime' | 'tool_running' | 'cancelling' | 'completed' | 'failed' | 'cancelled';
2
4
  export type ManagedAgentRuntimeState = 'unknown' | 'starting' | 'ready' | 'failed';
3
5
  export interface ManagedAgentSessionSummary {
@@ -18,13 +20,17 @@ export interface ManagedAgentSessionSummary {
18
20
  capabilities: {
19
21
  canSend: boolean;
20
22
  canCancel: boolean;
23
+ actions?: boolean;
24
+ artifacts?: boolean;
25
+ /** The caller may submit later Turns to this Workspace-bound Session. */
26
+ workspaceTurns?: boolean;
21
27
  };
22
28
  failure?: {
23
29
  code: string;
24
30
  message: string;
25
31
  };
26
32
  }
27
- export type ManagedAgentSessionEventType = 'accepted' | 'runtime_starting' | 'runtime_ready' | 'runtime_failed' | 'runtime_released' | 'agent_started' | 'assistant_thought' | 'assistant_delta' | 'tool_requested' | 'tool_started' | 'tool_completed' | 'completed' | 'failed' | 'cancelling' | 'cancelled' | 'stream_gap';
33
+ export type ManagedAgentSessionEventType = 'accepted' | 'runtime_starting' | 'runtime_ready' | 'runtime_failed' | 'runtime_released' | 'agent_started' | 'assistant_thought' | 'assistant_delta' | 'tool_requested' | 'tool_started' | 'tool_completed' | 'tool_result_updated' | 'completed' | 'failed' | 'cancelling' | 'cancelled' | 'action_updated' | 'stream_gap';
28
34
  export interface ManagedAgentSessionEvent {
29
35
  id: number;
30
36
  at: number;
@@ -32,6 +38,12 @@ export interface ManagedAgentSessionEvent {
32
38
  sessionId: string;
33
39
  turnId: string;
34
40
  data?: unknown;
41
+ /**
42
+ * Projected from a durable snapshot item rather than a raw event. The
43
+ * server can retract its items (reconciliation), after which these
44
+ * projections must not survive a resync.
45
+ */
46
+ assembledFromItem?: boolean;
35
47
  }
36
48
  export interface ManagedAgentSessionTranscript {
37
49
  events: ManagedAgentSessionEvent[];
@@ -49,11 +61,34 @@ export interface ManagedAgentRequestOptions {
49
61
  export interface ManagedAgentCommandOptions extends ManagedAgentRequestOptions {
50
62
  idempotencyKey: string;
51
63
  }
64
+ /** A Hosted tool approval waiting for the Session owner's answer. */
65
+ export interface ManagedAgentPendingAction {
66
+ actionId: string;
67
+ sessionId: string;
68
+ /** Public Turn ID; absent when the Turn could not be resolved. */
69
+ turnId?: string;
70
+ functionCallId: string;
71
+ toolName: string;
72
+ inputRevision: number;
73
+ policyRevision: string;
74
+ expiresAt: number;
75
+ options: Array<{
76
+ id: string;
77
+ label: string;
78
+ }>;
79
+ inputPreview?: components['schemas']['WebShellActionInputPreview'];
80
+ }
52
81
  export interface ManagedAgentProvider {
53
82
  readonly kind: 'daemon' | 'java';
54
83
  readonly storageKey: string;
55
84
  readonly canCancel: boolean;
56
85
  readonly acceptsWorkspaceCwd: boolean;
86
+ /** Present when the provider can serve Hosted permission Actions. */
87
+ readonly actions?: {
88
+ listPending(sessionId: string, options: ManagedAgentRequestOptions): Promise<ManagedAgentPendingAction[]>;
89
+ respond(action: ManagedAgentPendingAction, optionId: string, options: ManagedAgentCommandOptions): Promise<void>;
90
+ };
91
+ readonly toolResults?: ManagedToolResultReader;
57
92
  readonly workspaceBinding?: {
58
93
  readonly agentId: string;
59
94
  list(options: ManagedAgentRequestOptions & {
@@ -97,6 +132,13 @@ export interface ManagedAgentProvider {
97
132
  cancel(sessionId: string, turnId: string, options: ManagedAgentCommandOptions): Promise<void>;
98
133
  subscribeEvents(sessionId: string, options: ManagedAgentRequestOptions & {
99
134
  lastEventId?: number;
135
+ /**
136
+ * Called once the stream connection has been (re-)established. An
137
+ * established stream can stay silent indefinitely — heartbeats are
138
+ * not events — so this is the only liveness signal that does not
139
+ * depend on stream activity.
140
+ */
141
+ onEstablished?(): void;
100
142
  }): AsyncIterable<ManagedAgentSessionEvent>;
101
143
  }
102
144
  export interface ManagedAgentWorkspace {
@@ -0,0 +1,8 @@
1
+ export declare function javaDeltaEvent(sequence: number, text: string): string;
2
+ /** A complete item.output_text.delta SSE frame. */
3
+ export declare function sseFrame(sequence: number, text: string): string;
4
+ /** A complete item.output_text.delta SSE frame with an empty data object. */
5
+ export declare function validEventFrame(sequence: number): string;
6
+ /** A well-formed SSE frame whose data payload is truncated JSON. */
7
+ export declare function corruptFrame(sequence: number, name?: string): string;
8
+ export declare function javaSessionPayload(lastSequence: number): string;
@@ -0,0 +1,10 @@
1
+ import type { ACPToolCall, Message, PermissionRequest } from '../../adapters/types';
2
+ import type { ManagedAgentPendingAction } from './managed-agent-provider';
3
+ /**
4
+ * Finds the transcript tool that a pending Action asks about. Managed tool
5
+ * rows are keyed `${turnId}:${toolCallId}`, and the Action's functionCallId is
6
+ * that tool call ID; without a resolved Turn only the call ID can match.
7
+ */
8
+ export declare function findManagedApprovalTool(messages: readonly Message[], action: ManagedAgentPendingAction): ACPToolCall | undefined;
9
+ /** Presents a pending Hosted approval through the shared approval card. */
10
+ export declare function toManagedPermissionRequest(action: ManagedAgentPendingAction, messages: readonly Message[]): PermissionRequest;
@@ -0,0 +1,2 @@
1
+ import type { ManagedArtifactSave } from './managed-tool-result-types';
2
+ export declare function browserArtifactSave(): ManagedArtifactSave | undefined;
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Qwen Team
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Whether the service answered a request in a way a retry cannot change.
8
+ *
9
+ * A 4xx other than a timeout (408) or a rate limit (429) is an answer, not a
10
+ * hiccup: a deleted Session or an unknown Action replies the same way however
11
+ * often it is asked, so retrying only burns requests. Timeouts and rate limits
12
+ * are worth another attempt.
13
+ */
14
+ export declare function isNonRetryableClientError(error: unknown): boolean;
@@ -0,0 +1,24 @@
1
+ import type { components } from './generated/managed-agent-api';
2
+ import type { ManagedAgentRequestOptions } from './managed-agent-provider';
3
+ type Schemas = components['schemas'];
4
+ export type ManagedToolResult = Schemas['PublicToolResult'];
5
+ export type ManagedArtifact = Schemas['PublicArtifact'];
6
+ export type ManagedToolResultResponse = Schemas['ToolResultResponse'];
7
+ export type ManagedArtifactResponse = Schemas['ArtifactResponse'];
8
+ export type ManagedArtifactPage = Schemas['WebShellArtifactPage'];
9
+ export type ManagedArtifactSave = (artifact: ManagedArtifact, options: {
10
+ signal?: AbortSignal;
11
+ openStream: () => Promise<ReadableStream<Uint8Array>>;
12
+ }) => Promise<void>;
13
+ export interface ManagedToolResultReader {
14
+ readonly canDownload: boolean;
15
+ getResult(sessionId: string, itemId: string, options: ManagedAgentRequestOptions): Promise<ManagedToolResultResponse>;
16
+ listArtifacts(sessionId: string, options: ManagedAgentRequestOptions & {
17
+ cursor?: string;
18
+ limit?: number;
19
+ }): Promise<ManagedArtifactPage>;
20
+ getArtifact(sessionId: string, artifactId: string, options: ManagedAgentRequestOptions): Promise<ManagedArtifactResponse>;
21
+ readRange(artifact: ManagedArtifact, offset: number, length: number, options: ManagedAgentRequestOptions): Promise<Uint8Array>;
22
+ downloadArtifact(artifact: ManagedArtifact, options: ManagedAgentRequestOptions): Promise<void>;
23
+ }
24
+ export {};
@@ -0,0 +1,6 @@
1
+ import type { ManagedArtifact, ManagedToolResult } from './managed-tool-result-types';
2
+ export declare const artifact: ManagedArtifact;
3
+ export declare const result: ManagedToolResult;
4
+ export declare const notStartedResult: ManagedToolResult;
5
+ export declare const blockedResult: ManagedToolResult;
6
+ export declare const previewOnlyResult: ManagedToolResult;
@@ -0,0 +1,33 @@
1
+ import type { ManagedAgentPendingAction, ManagedAgentProvider, ManagedAgentSessionEvent } from './managed-agent-provider';
2
+ export interface ManagedActionsState {
3
+ /** The approval to show; answered ones stay hidden while they settle. */
4
+ action?: ManagedAgentPendingAction;
5
+ /** Reading the pending approvals failed; retries run in the background. */
6
+ loadError?: unknown;
7
+ /**
8
+ * The pending approvals have been read for this Session, so a failed read is
9
+ * a failed refresh of what the page already shows rather than an empty list.
10
+ */
11
+ loaded: boolean;
12
+ /** Sending an answer failed; the approval is shown again. */
13
+ answerError?: unknown;
14
+ /**
15
+ * The service refused an answer as creator-only. That is a fact about the
16
+ * viewer and the Session, not about one Action, so it outlives the refused
17
+ * Action, covers every later approval the same Session raises, and survives
18
+ * leaving that Session and coming back. It is remembered per mount: a reload
19
+ * or reopening the panel starts clean.
20
+ */
21
+ respondForbidden: boolean;
22
+ respond(actionId: string, optionId: string): Promise<void>;
23
+ /** Reads the pending approvals again now. */
24
+ retry(): void;
25
+ }
26
+ /**
27
+ * Loads a Session's pending Hosted approvals and answers them. It re-reads
28
+ * when the transcript reports an approval change or a reconciled gap, when an
29
+ * approval expires, and after an answer. `enabled` is undefined while the
30
+ * Session summary is unknown, for example during a reload: the shown approval
31
+ * stays and can be answered, and reads resume once the capability is known.
32
+ */
33
+ export declare function useManagedActions(provider: ManagedAgentProvider, sessionId: string | undefined, clientId: string, enabled: boolean | undefined, events: readonly ManagedAgentSessionEvent[]): ManagedActionsState;
@@ -1,7 +1,9 @@
1
1
  import { type WebShellAssistantFeedbackRating, type WebShellAssistantTurnFooterRenderInfo, type WebShellSource } from '../../customization';
2
2
  import type { DaemonSessionGenerationEvent } from '@qwen-code/sdk/daemon';
3
+ import type { DaemonMessageAuthor } from '../../adapters/messageTypes';
3
4
  interface AssistantMessageProps {
4
5
  content: string;
6
+ author?: DaemonMessageAuthor;
5
7
  isStreaming?: boolean;
6
8
  timestamp?: number;
7
9
  onBranchSession?: () => void | Promise<void>;
@@ -19,6 +21,7 @@ interface AssistantMessageProps {
19
21
  export declare const AssistantMessage: import("react").NamedExoticComponent<AssistantMessageProps>;
20
22
  interface ThinkingMessageProps {
21
23
  content: string;
24
+ author?: DaemonMessageAuthor;
22
25
  isStreaming?: boolean;
23
26
  timestamp?: number;
24
27
  isLocateFlashing?: boolean;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Qwen Team
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * The initial of a named assistant voice, tinted with its color when it has
8
+ * one. The same mark stands for an agent in its replies, the Team panel and
9
+ * the Agents page, so a reader learns it once.
10
+ */
11
+ export declare function AuthorAvatar({ name, color, size, className, }: {
12
+ name: string;
13
+ color?: string;
14
+ size?: 'sm' | 'md';
15
+ className?: string;
16
+ }): import("react/jsx-runtime").JSX.Element;
@@ -1,6 +1,10 @@
1
1
  import type { DaemonSessionContextUsageStatus } from '@qwen-code/web-shell/daemon-react-sdk';
2
+ export declare function createContextUsageMessageData(status: DaemonSessionContextUsageStatus): {
3
+ type: string;
4
+ status: DaemonSessionContextUsageStatus;
5
+ };
2
6
  export declare function serializeContextUsageMessage(status: DaemonSessionContextUsageStatus): string;
3
- export declare function parseContextUsageMessage(content: string): DaemonSessionContextUsageStatus | null;
7
+ export declare function parseContextUsageMessage(content: string, data?: unknown): DaemonSessionContextUsageStatus | null;
4
8
  export declare function ContextUsageMessage({ status, onShowDetail, compact, }: {
5
9
  status: DaemonSessionContextUsageStatus;
6
10
  /** Run /context detail, exactly like typing it. */
@@ -4,8 +4,13 @@ interface ParsedStats {
4
4
  view: StatsView;
5
5
  status: DaemonSessionStatsStatus;
6
6
  }
7
+ export declare function createStatsMessageData(status: DaemonSessionStatsStatus, view?: StatsView): {
8
+ type: string;
9
+ view: StatsView;
10
+ status: DaemonSessionStatsStatus;
11
+ };
7
12
  export declare function serializeStatsMessage(status: DaemonSessionStatsStatus, view?: StatsView): string;
8
- export declare function parseStatsMessage(content: string): ParsedStats | null;
13
+ export declare function parseStatsMessage(content: string, data?: unknown): ParsedStats | null;
9
14
  export declare function formatDuration(ms: number): string;
10
15
  export declare function StatsMessage({ view, status, }: {
11
16
  view: StatsView;
@@ -16,6 +16,14 @@ interface ToolApprovalProps {
16
16
  * it — it just never grabs focus on its own.
17
17
  */
18
18
  keyboardActive?: boolean;
19
+ /**
20
+ * Id of an extra description the caller renders beside this panel, added to
21
+ * `aria-describedby`. The Managed approvals card states there that the tool
22
+ * arguments are unavailable, which is exactly the case where the panel's own
23
+ * description (tool name only) would let a screen-reader user confirm blind.
24
+ * Pass it only while that element is mounted, so no IDREF dangles.
25
+ */
26
+ extraDescriptionId?: string;
19
27
  planTodos?: readonly TodoItem[];
20
28
  planExecutionMode?: string;
21
29
  generateContent?: SessionContentGenerator;
@@ -24,5 +32,5 @@ export declare function parseTitle(title?: string): {
24
32
  toolName: string;
25
33
  description: string;
26
34
  };
27
- export declare function ToolApproval({ request, onConfirm, variant, disabled, keyboardActive, planTodos, planExecutionMode, generateContent, }: ToolApprovalProps): import("react/jsx-runtime").JSX.Element;
35
+ export declare function ToolApproval({ request, onConfirm, variant, disabled, keyboardActive, extraDescriptionId, planTodos, planExecutionMode, generateContent, }: ToolApprovalProps): import("react/jsx-runtime").JSX.Element;
28
36
  export {};
@@ -19,6 +19,7 @@ interface ToolGroupProps {
19
19
  pendingApproval?: PermissionRequest | null;
20
20
  workspaceCwd?: string;
21
21
  onTurnOutputOpen?: (request: TurnOutputOpenRequest) => void;
22
+ onToolResultOpen?: (itemId: string) => void;
22
23
  isLocateFlashing?: boolean;
23
24
  /** Powers the translate action on completed thinking rows (zh-CN). */
24
25
  generateContent?: SessionContentGenerator;
@@ -32,6 +33,7 @@ interface ToolLineProps {
32
33
  approval?: PermissionRequest | null;
33
34
  workspaceCwd?: string;
34
35
  onTurnOutputOpen?: (request: TurnOutputOpenRequest) => void;
36
+ onToolResultOpen?: (itemId: string) => void;
35
37
  summaryOnly?: boolean;
36
38
  forceExpanded?: boolean;
37
39
  detailsVisible?: boolean;
@@ -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' | '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';
@@ -54,11 +58,20 @@ export interface WebShellSidebarWorkspaceOverviewOptions {
54
58
  }
55
59
  export type { WorkspaceManagementTarget, WorkspaceOverviewItem };
56
60
  interface WebShellSidebarProps {
61
+ selectedCollaborationId?: string;
62
+ onOpenCollaboration?: (id: string, cwd: string) => void;
57
63
  collapsed: boolean;
64
+ layout?: 'single' | 'rail';
65
+ activePage?: string;
66
+ containerWidth?: number;
67
+ onOpenHome?: () => void;
58
68
  onCollapsedChange: (collapsed: boolean) => void;
59
69
  onOpenSettings: () => void;
70
+ onOpenAgents?: (view?: 'agents' | 'tasks' | 'runtime') => void;
60
71
  onOpenPlugins: () => void;
61
72
  onOpenChannels: () => void;
73
+ onOpenLive?: () => void;
74
+ onLiveVoiceSlotChange?: (element: HTMLDivElement | null) => void;
62
75
  onOpenManagedSessions?: () => void;
63
76
  onOpenDaemonStatus: () => void;
64
77
  onOpenScheduledTasks: () => void;
@@ -120,7 +133,7 @@ interface WebShellSidebarProps {
120
133
  primaryNav?: WebShellSidebarPrimaryNavOptions;
121
134
  /** Whether to show the Tasks/Channels session-source switch. Defaults to true. */
122
135
  showSessionSourceSwitch?: boolean;
123
- /** Whether to show daemon-owned Live conversations. Defaults to false. */
136
+ /** Show Live conversations and, in rail layout, the Live entry. Defaults to false. */
124
137
  showLive?: boolean;
125
138
  /** Whether to hide the "Projects" header row (with search and add workspace). Defaults to false (shown). */
126
139
  hideProjectHeader?: boolean;
@@ -145,4 +158,4 @@ interface WebShellSidebarProps {
145
158
  onLoadStandaloneSession?: (sessionId: string) => Promise<void> | void;
146
159
  onStandaloneNotice?: (message: string) => void;
147
160
  }
148
- export declare function WebShellSidebar({ collapsed, onCollapsedChange, onOpenSettings, 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;
@@ -9,9 +9,11 @@ export interface WorkspaceHeaderActionsContext {
9
9
  gitBranch: string | null | undefined;
10
10
  }
11
11
  interface WorkspaceSectionProps {
12
+ additionalSessions?: readonly DaemonSessionSummary[];
12
13
  workspace: DaemonWorkspaceCapability;
13
14
  remote?: boolean;
14
15
  renderHeader?: (expanded: boolean) => ReactNode;
16
+ hideHeader?: boolean;
15
17
  client: DaemonClient;
16
18
  reloadToken: number;
17
19
  untrustedLabel: string;
@@ -116,5 +118,5 @@ interface WorkspaceSectionProps {
116
118
  /** Commit entry for the same picker; the row still opens without it. */
117
119
  onOpenCommit?: (workspaceCwd: string) => void;
118
120
  }
119
- export declare function WorkspaceSection({ 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;
120
122
  export {};
@@ -8,7 +8,8 @@ export declare function sessionMatchesGitQuery(session: DaemonSessionSummary, qu
8
8
  /**
9
9
  * The sidebar's session-source scope: the "channel" tab lists only
10
10
  * channel-source sessions, the "default" tab lists unattributed (legacy)
11
- * and default/Qwen Live tasks, and no filter lists everything.
11
+ * and default/Qwen Live tasks, every other source lists exact matches, and
12
+ * no filter lists everything.
12
13
  */
13
14
  export declare function sessionMatchesSource(session: DaemonSessionSummary, source: string | undefined): boolean;
14
15
  /**
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Qwen Team
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { ThreadsRouteProps } from './ThreadsRoute';
7
+ export declare function LazyThreadsRoute(props: ThreadsRouteProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,35 @@
1
+ import { type ThreadDetailView } from './ThreadView';
2
+ import { type RoutingPreviewTarget } from './agents-view-logic';
3
+ interface AgentEntry {
4
+ id: string;
5
+ name: string;
6
+ color?: string;
7
+ enabled: boolean;
8
+ retiredAt?: number;
9
+ status?: string;
10
+ runtime?: {
11
+ label: string;
12
+ status: string;
13
+ };
14
+ }
15
+ export declare function ThreadChat({ thread, agents, preview, pending, onSend, onDraftChange, onOpenAgentSession, onCancelRun, onMarkDone, onOpenThread, onRespondPermission, onAssign, onBack, activityOnly, onOpenActivity, headerActionsContainer, }: {
16
+ headerActionsContainer?: HTMLElement | null;
17
+ activityOnly?: boolean;
18
+ onOpenActivity?: () => void;
19
+ preview?: readonly RoutingPreviewTarget[];
20
+ agents: readonly AgentEntry[];
21
+ thread: ThreadDetailView;
22
+ pending: boolean;
23
+ onSend: (text: string) => Promise<boolean>;
24
+ onDraftChange: (text: string) => void;
25
+ onOpenAgentSession?: (sessionId: string) => void;
26
+ onCancelRun: (runId: string) => void;
27
+ onMarkDone: () => void;
28
+ onOpenThread: (threadId: string) => void;
29
+ onRespondPermission?: (sessionId: string, requestId: string, optionId: string) => Promise<unknown>;
30
+ /** Hands the conversation to another agent. */
31
+ onAssign?: (assignee?: string) => void;
32
+ /** Shown when the conversation is not in the shell's own chat column. */
33
+ onBack?: () => void;
34
+ }): import("react/jsx-runtime").JSX.Element;
35
+ export {};
@@ -0,0 +1,72 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Qwen Team
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { type RunRow, type RunView } from './agents-view-logic';
7
+ export interface ThreadPostView {
8
+ sourceRunId?: string;
9
+ id: string;
10
+ sequence: number;
11
+ authorKind: 'human' | 'agent' | 'system';
12
+ authorName: string;
13
+ authorDeleted?: boolean;
14
+ text: string;
15
+ at: number;
16
+ outcomes?: readonly {
17
+ agentName?: string;
18
+ kind: 'dispatch' | 'coalesce' | 'skip';
19
+ reason?: string;
20
+ into?: 'queued' | 'running';
21
+ }[];
22
+ }
23
+ export interface ThreadDetailView {
24
+ id: string;
25
+ title: string;
26
+ body: string;
27
+ /** What "done" means here, in the author's words. */
28
+ acceptanceCriteria?: string;
29
+ priority?: 'urgent' | 'high' | 'normal' | 'low';
30
+ parent?: {
31
+ id: string;
32
+ title: string;
33
+ };
34
+ assigneeName?: string;
35
+ status: 'open' | 'in_progress' | 'blocked' | 'in_review' | 'done' | 'cancelled';
36
+ /** The resolver's sentence. Rendered verbatim. */
37
+ reason: string;
38
+ posts: readonly ThreadPostView[];
39
+ runs: readonly RunView[];
40
+ children?: readonly ThreadChildView[];
41
+ budget: {
42
+ turnsUsed: number;
43
+ turnLimit: number;
44
+ tokensUsed: number;
45
+ tokenLimit: number;
46
+ };
47
+ }
48
+ export interface ThreadChildView {
49
+ id: string;
50
+ title: string;
51
+ status: ThreadDetailView['status'];
52
+ reason: string;
53
+ assigneeName?: string;
54
+ }
55
+ /**
56
+ * One run: its state, how long it has gone, and what it is doing, with the
57
+ * thinking and output so far folded under it. Under a member in the Team
58
+ * panel the member row already names the agent, so `hideAgent` drops it.
59
+ */
60
+ export declare function RunRowView({ row, agent, hideAgent, onOpenAgentSession, onCancelRun, }: {
61
+ row: RunRow;
62
+ agent?: {
63
+ status?: string;
64
+ runtime?: {
65
+ label: string;
66
+ status: string;
67
+ };
68
+ };
69
+ hideAgent?: boolean;
70
+ onOpenAgentSession?: (sessionId: string) => void;
71
+ onCancelRun?: (runId: string) => void;
72
+ }): import("react/jsx-runtime").JSX.Element;