@qwen-code/web-shell 0.24.7 → 0.25.0-nightly.20261009.085a44f336

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 (94) hide show
  1. package/README.md +65 -2
  2. package/dist/agents-route-D7hp7io8.js +1546 -0
  3. package/dist/daemon-react-sdk.js +1 -1
  4. package/dist/index-BEPcxy4Z.js +125142 -0
  5. package/dist/index.js +69 -120254
  6. package/dist/sw.js +1 -1
  7. package/dist/{toolNames-B0O1UjKB.js → toolNames-D4oueGGC.js} +5956 -5252
  8. package/dist/transcript.js +10276 -9739
  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 +23 -1
  12. package/dist/types/adapters/transcriptAdapter.d.ts +1 -0
  13. package/dist/types/components/ChatContextHeader.d.ts +3 -1
  14. package/dist/types/components/ChatEditor.d.ts +1 -0
  15. package/dist/types/components/DesktopRelayControl.d.ts +2 -1
  16. package/dist/types/components/LocalFilesControl.d.ts +3 -1
  17. package/dist/types/components/MessageItem.d.ts +1 -0
  18. package/dist/types/components/MessageList.d.ts +1 -0
  19. package/dist/types/components/agents/AgentCreatePage.d.ts +35 -1
  20. package/dist/types/components/agents/AgentsManagerPage.d.ts +5 -1
  21. package/dist/types/components/artifacts/TrajectoryFilters.d.ts +15 -0
  22. package/dist/types/components/artifacts/TrajectoryInspector.d.ts +5 -1
  23. package/dist/types/components/artifacts/TrajectoryOverview.d.ts +3 -1
  24. package/dist/types/components/artifacts/TrajectoryWaterfallCell.d.ts +15 -0
  25. package/dist/types/components/artifacts/artifactUtils.d.ts +9 -0
  26. package/dist/types/components/channels/ChannelsManagerPage.d.ts +1 -1
  27. package/dist/types/components/extensions/extensions-manager-logic.d.ts +3 -3
  28. package/dist/types/components/managed/ManagedToolResultPanel.d.ts +9 -0
  29. package/dist/types/components/managed/ManagedToolResultSummary.d.ts +5 -0
  30. package/dist/types/components/managed/generated/managed-agent-api.d.ts +915 -18
  31. package/dist/types/components/managed/java-managed-agent-client.d.ts +29 -1
  32. package/dist/types/components/managed/java-managed-agent-provider.d.ts +4 -0
  33. package/dist/types/components/managed/managed-agent-provider.d.ts +43 -1
  34. package/dist/types/components/managed/managed-agent-sse.test-fixtures.d.ts +8 -0
  35. package/dist/types/components/managed/managed-approval.d.ts +10 -0
  36. package/dist/types/components/managed/managed-artifact-download.d.ts +2 -0
  37. package/dist/types/components/managed/managed-request-error.d.ts +14 -0
  38. package/dist/types/components/managed/managed-tool-result-types.d.ts +24 -0
  39. package/dist/types/components/managed/managed-tool-result.test-fixtures.d.ts +6 -0
  40. package/dist/types/components/managed/use-managed-actions.d.ts +34 -0
  41. package/dist/types/components/messages/AssistantMessage.d.ts +6 -1
  42. package/dist/types/components/messages/AuthorAvatar.d.ts +16 -0
  43. package/dist/types/components/messages/ContextUsageMessage.d.ts +5 -1
  44. package/dist/types/components/messages/StatsMessage.d.ts +6 -1
  45. package/dist/types/components/messages/ToolApproval.d.ts +9 -1
  46. package/dist/types/components/messages/ToolGroup.d.ts +2 -0
  47. package/dist/types/components/messages/UserMessage.d.ts +3 -1
  48. package/dist/types/components/messages/agent-message-details.d.ts +36 -0
  49. package/dist/types/components/messages/squad-tag.d.ts +16 -0
  50. package/dist/types/components/sidebar/UpdateControl.d.ts +3 -1
  51. package/dist/types/components/sidebar/WebShellSidebar.d.ts +16 -5
  52. package/dist/types/components/sidebar/WorkspaceSection.d.ts +2 -1
  53. package/dist/types/components/sidebar/sessionSearch.d.ts +2 -1
  54. package/dist/types/components/workspace-agents/ThreadsPage.d.ts +122 -0
  55. package/dist/types/components/workspace-agents/add-runtime-dialog.d.ts +76 -0
  56. package/dist/types/components/workspace-agents/agent-events.d.ts +20 -0
  57. package/dist/types/components/workspace-agents/agents-route.d.ts +19 -0
  58. package/dist/types/components/workspace-agents/agents-view-logic.d.ts +31 -0
  59. package/dist/types/components/workspace-agents/lazy-agents-route.d.ts +7 -0
  60. package/dist/types/components/workspace-agents/messages.d.ts +16 -0
  61. package/dist/types/components/workspace-agents/messages.transcript-stub.d.ts +12 -0
  62. package/dist/types/components/workspace-agents/session-agent-live-runs.d.ts +96 -0
  63. package/dist/types/components/workspace-agents/session-agents-api.d.ts +39 -0
  64. package/dist/types/components/workspace-agents/share-agent-dialog.d.ts +33 -0
  65. package/dist/types/components/workspace-agents/squads-section.d.ts +28 -0
  66. package/dist/types/components/workspace-agents/threads-api.d.ts +52 -0
  67. package/dist/types/components/workspace-agents/use-session-agent-runs.d.ts +66 -0
  68. package/dist/types/components/workspace-agents/useAgentChatEntry.d.ts +100 -0
  69. package/dist/types/components/workspaces/WorkspaceHostProjects.d.ts +11 -0
  70. package/dist/types/components/workspaces/WorkspaceLocation.d.ts +7 -0
  71. package/dist/types/config/workspace-hosts.d.ts +11 -0
  72. package/dist/types/customization.d.ts +10 -0
  73. package/dist/types/daemon/session/types.d.ts +19 -3
  74. package/dist/types/daemon/workspace/hooks/useDaemonMemory.d.ts +4 -0
  75. package/dist/types/daemon/workspace/types.d.ts +6 -2
  76. package/dist/types/index.d.ts +2 -1
  77. package/dist/types/live/LiveVoiceButton.d.ts +2 -1
  78. package/dist/types/navigation.d.ts +1 -0
  79. package/dist/types/settings.d.ts +1 -0
  80. package/dist/types/trajectory/buildTrajectoryLayout.d.ts +27 -0
  81. package/dist/types/trajectory/filter-messages.d.ts +9 -0
  82. package/dist/types/trajectory/filter-messages.transcript-stub.d.ts +7 -0
  83. package/dist/types/trajectory/filterTrajectory.d.ts +22 -0
  84. package/dist/types/trajectory/types.d.ts +3 -1
  85. package/dist/types/trajectory/useTimelineViewport.d.ts +19 -0
  86. package/dist/types/trajectory/useTrajectoryWindow.d.ts +21 -36
  87. package/dist/types/trajectory/window-messages.d.ts +9 -0
  88. package/dist/types/trajectory/window-messages.transcript-stub.d.ts +7 -0
  89. package/dist/types/utils/cancelledTurn.d.ts +17 -0
  90. package/dist/types/utils/composerTag.d.ts +6 -1
  91. package/dist/types/utils/modelEncoding.d.ts +6 -0
  92. package/dist/types/utils/navigationUrl.d.ts +1 -1
  93. package/dist/types/utils/workspace.d.ts +1 -0
  94. package/package.json +2 -1
@@ -0,0 +1,100 @@
1
+ import { type ComponentProps } from 'react';
2
+ import type { ChatEditor } from '../ChatEditor';
3
+ import type { WebShellAtProvider } from '../../customization';
4
+ import type { useI18n } from '../../i18n';
5
+ import { type SessionAgentsApi } from './session-agents-api';
6
+ import type { WorkspaceAgentSummaryView } from './ThreadsPage';
7
+ import { type DaemonTranscriptBlock, type SessionSquadView } from '@qwen-code/sdk/daemon';
8
+ type Submit = ComponentProps<typeof ChatEditor>['onSubmit'];
9
+ /**
10
+ * The @tokens of a message, lowercased. Same rules as core's parseMentions: no
11
+ * ASCII word character before `@`, so "请@迁移助手" counts and "a@b.dev" does
12
+ * not; a token followed by `/` is a path, not a mention.
13
+ */
14
+ export declare function mentionTokens(text: string): string[];
15
+ /**
16
+ * The agents a message addresses, in mention order. A name may run into the
17
+ * next word in scripts without spaces ("@迁移助手看一下"); the longest name the
18
+ * token starts with wins. Same addressability predicate as the picker: an
19
+ * agent the server would skip must not divert the message.
20
+ */
21
+ export declare function resolveMentionedAgents(tokens: readonly string[], agents: readonly WorkspaceAgentSummaryView[]): WorkspaceAgentSummaryView[];
22
+ /** A 32px "people" mask: squads get an icon in the picker, agents none. */
23
+ export declare const SQUAD_PICKER_ICON = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAVklEQVR42u2TMQ4AIAgD+f+ncXXRgKFWTC/pai8CZkKIJvgi1PKdRKlgRgDyU20ETkb1lwD0WqIPU88VdoaCOlsPhlo+S5QJOijU8rAEXeDGrggh3mEAQPbbJbEAqj0AAAAASUVORK5CYII=";
24
+ /**
25
+ * The squads a message addresses, by the same token rules as
26
+ * {@link resolveMentionedAgents}. A token that names an agent exactly is the
27
+ * agent's, as on the daemon.
28
+ */
29
+ export declare function resolveMentionedSquads(tokens: readonly string[], squads: readonly SessionSquadView[]): SessionSquadView[];
30
+ /** The chat session an @-mention goes to, and the workspace it lives in. */
31
+ export interface AgentMentionSession {
32
+ sessionId: string;
33
+ /** Unset: the hook's own `cwd`. */
34
+ workspaceCwd?: string;
35
+ }
36
+ /**
37
+ * An @-mention the daemon accepted but deferred behind a running main-model
38
+ * turn (`deferred: true`): its record, and so the user's message, only lands
39
+ * once that turn settles. Shown as the user's message until then.
40
+ */
41
+ export interface PendingAgentMention {
42
+ /** The post's `clientMessageId`. */
43
+ id: string;
44
+ sessionId: string;
45
+ text: string;
46
+ /**
47
+ * Recorded mentions with this text the session already had, plus earlier
48
+ * pending ones, when it was posted: the record that settles this one is
49
+ * the next.
50
+ */
51
+ recordedBefore: number;
52
+ }
53
+ /**
54
+ * The text of each recorded @-mention (`agent_mention` user message) in the
55
+ * transcript, in order. Compare with {@link isPendingMentionRecorded}.
56
+ */
57
+ export declare function recordedAgentMentionTexts(blocks: readonly DaemonTranscriptBlock[]): string[];
58
+ /** True once the record of `mention` is among the recorded mention texts. */
59
+ export declare function isPendingMentionRecorded(mention: PendingAgentMention, recordedTexts: readonly string[]): boolean;
60
+ export declare function useAgentChatEntry({ enabled, cwd, baseUrl, token, sessionApi, sessionApiFor, ensureSession, onSubmit, onError, onCreateAgent, sessionId, recordedMentionTexts, t, }: {
61
+ enabled: boolean;
62
+ cwd?: string;
63
+ baseUrl: string;
64
+ token?: string;
65
+ /** The session routes of the same workspace (`cwd`). */
66
+ sessionApi?: SessionAgentsApi;
67
+ /**
68
+ * The session routes of another workspace, for a session that lives
69
+ * elsewhere. Defaults to the HTTP routes of that workspace.
70
+ */
71
+ sessionApiFor?: (workspaceCwd: string) => SessionAgentsApi;
72
+ /**
73
+ * The current chat session, creating it first when this is a new chat (the
74
+ * same lazy creation an ordinary first prompt goes through), with the
75
+ * workspace it was created in.
76
+ */
77
+ ensureSession: () => Promise<AgentMentionSession | string | undefined>;
78
+ onSubmit: Submit;
79
+ onError: (message: string) => void;
80
+ /** Offered as the picker's last item: open the New agent page. */
81
+ onCreateAgent?: () => void;
82
+ /** The session the chat shows; only its pending @-mentions are returned. */
83
+ sessionId?: string;
84
+ /**
85
+ * {@link recordedAgentMentionTexts} of that session's transcript, memoized:
86
+ * a pending @-mention is dropped once its record shows up here.
87
+ */
88
+ recordedMentionTexts?: readonly string[];
89
+ /**
90
+ * The caller's translator. App calls this hook above its I18nProvider, where
91
+ * useI18n() would hand back the default that echoes keys.
92
+ */
93
+ t: ReturnType<typeof useI18n>['t'];
94
+ }): {
95
+ providers: WebShellAtProvider[];
96
+ submit: (text: string, images?: import("../../adapters/promptTypes").PromptImage[], files?: import("../../adapters/promptTypes").PromptFile[], commitAccepted?: import("../../hooks/useComposerCore").ComposerSubmitCommit, metadata?: import("../../hooks/useComposerCore").ComposerSubmitMetadata) => boolean | void;
97
+ pending: boolean;
98
+ pendingMentions: PendingAgentMention[];
99
+ };
100
+ export {};
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Names the connected host above its live project list. Until another host is
3
+ * saved there is nothing to tell apart, so the plain list stays unlabeled.
4
+ */
5
+ export declare function WorkspaceHostHeading(): import("react/jsx-runtime").JSX.Element | null;
6
+ /**
7
+ * Saved projects on the other hosts, grouped by host below the live list.
8
+ * Only the connected host is live; choosing one of these reloads the page
9
+ * against its host.
10
+ */
11
+ export declare function OtherHostProjects(): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Compact label naming the host a chat runs on, with the working directory in
3
+ * its tooltip. Hidden until a project can live on more than one host.
4
+ */
5
+ export declare function WorkspaceLocation({ cwd }: {
6
+ cwd?: string;
7
+ }): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,11 @@
1
+ import type { DaemonWorkspaceCapability } from '@qwen-code/sdk/daemon';
2
+ export declare const WorkspaceHostsEnabled: import("react").Context<boolean>;
3
+ export interface WorkspaceHost {
4
+ origin: string;
5
+ workspaces: Pick<DaemonWorkspaceCapability, 'id' | 'cwd' | 'displayName'>[];
6
+ }
7
+ export declare function readWorkspaceHosts(): WorkspaceHost[];
8
+ export declare function rememberWorkspaceHost(origin: string, workspaces: WorkspaceHost['workspaces']): void;
9
+ /** Saved hosts, kept in sync with catalog updates from this and other tabs. */
10
+ export declare function useWorkspaceHosts(): WorkspaceHost[];
11
+ export declare function openHostedWorkspace(origin: string, workspaceId?: string): void;
@@ -362,6 +362,11 @@ export interface WebShellAtItem {
362
362
  iconTooltip?: string;
363
363
  insertText?: string;
364
364
  composerTag?: WebShellComposerTag;
365
+ /**
366
+ * Makes the item an action instead of a reference: choosing it removes the
367
+ * typed `@query` and calls this, inserting nothing.
368
+ */
369
+ onSelect?: () => void;
365
370
  }
366
371
  export type WebShellBuiltinAtProviderId = 'files' | 'extensions' | 'mcp-resources';
367
372
  export type WebShellBuiltinAtProvidersConfig = boolean | readonly WebShellBuiltinAtProviderId[] | {
@@ -389,6 +394,11 @@ export interface WebShellAtProvider {
389
394
  order?: number;
390
395
  tabs?: readonly WebShellAtProviderTab[];
391
396
  renderItem?: WebShellAtItemRenderer;
397
+ /**
398
+ * Claims a typed `@query` that names no category, so it searches this
399
+ * provider instead of falling back to files.
400
+ */
401
+ claimsTypedQuery?(query: string): boolean;
392
402
  search(params: {
393
403
  query: string;
394
404
  signal: AbortSignal;
@@ -202,6 +202,12 @@ export interface DaemonPromptSettledEvent {
202
202
  sessionId: string;
203
203
  promptId: string;
204
204
  outcome: DaemonPromptSettlementOutcome;
205
+ /**
206
+ * The client that submitted the prompt, from the terminal frame's
207
+ * envelope. Lets a submitter recognise its own turn when the admission
208
+ * response never reached it.
209
+ */
210
+ originatorClientId?: string;
205
211
  /** Daemon terminal reason. Present for completed and cancelled turns. */
206
212
  stopReason?: string;
207
213
  error?: {
@@ -277,9 +283,12 @@ export interface SendPromptOptions {
277
283
  * runs to completion. Lets a caller act on "the prompt reached the session"
278
284
  * without waiting for the whole turn — e.g. the scheduled-tasks "run now",
279
285
  * which records the run at admission so a long/stalled turn or a closed tab
280
- * can't lose the record.
286
+ * can't lose the record. Carries the daemon's id for the prompt, the key
287
+ * its terminal `turn_complete` / `turn_error` settles under.
281
288
  */
282
- onAdmitted?: () => void;
289
+ onAdmitted?: (admission: {
290
+ promptId: string;
291
+ }) => void;
283
292
  }
284
293
  export interface SubmitPromptOptions extends SendPromptOptions {
285
294
  sessionId?: string;
@@ -440,11 +449,18 @@ export interface DaemonSessionActions {
440
449
  generateSessionContent(prompt: string, opts?: {
441
450
  signal?: AbortSignal;
442
451
  }): AsyncGenerator<DaemonSessionGenerationEvent>;
443
- getRewindSnapshots(): Promise<{
452
+ getRewindSnapshots(opts?: {
453
+ /** Rethrow failures raw instead of recording a notice; for best-effort
454
+ * callers that fall back on their own. */
455
+ silent?: boolean;
456
+ }): Promise<{
444
457
  snapshots: DaemonRewindSnapshotInfo[];
445
458
  }>;
446
459
  rewindSession(promptId: string, opts?: {
447
460
  rewindFiles?: boolean;
461
+ /** Rethrow failures raw instead of recording a notice; for best-effort
462
+ * callers that fall back on their own. */
463
+ silent?: boolean;
448
464
  }): Promise<DaemonRewindResult>;
449
465
  btwSession(question: string, opts?: {
450
466
  signal?: AbortSignal;
@@ -10,6 +10,10 @@ export declare function useDaemonMemory(options?: DaemonResourceOptions): {
10
10
  readFile: (filePath: string, opts?: {
11
11
  maxBytes?: number;
12
12
  }) => Promise<import("@qwen-code/sdk/daemon").DaemonWorkspaceFile>;
13
+ readMemoryFile: (filePath: string) => Promise<import("@qwen-code/sdk/daemon").DaemonWorkspaceFile | {
14
+ content: string;
15
+ truncated: boolean;
16
+ }>;
13
17
  writeMemory: (req: import("@qwen-code/sdk/daemon").DaemonWriteMemoryRequest) => Promise<import("@qwen-code/sdk/daemon").DaemonWriteMemoryResult>;
14
18
  reload: () => Promise<import("@qwen-code/sdk/daemon").DaemonWorkspaceMemoryStatus | undefined>;
15
19
  data: import("@qwen-code/sdk/daemon").DaemonWorkspaceMemoryStatus | undefined;
@@ -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, 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, 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';
8
8
  export interface DaemonResourceOptions {
9
9
  autoLoad?: boolean;
10
10
  enabled?: boolean;
@@ -330,6 +330,8 @@ export interface DaemonWorkspaceActions {
330
330
  installWorkspaceSkill(request: DaemonSkillInstallRequest): Promise<DaemonSkillMutationResult>;
331
331
  deleteWorkspaceSkill(skillName: string, scope: DaemonSkillScope): Promise<DaemonSkillMutationResult>;
332
332
  loadExtensionsStatus(): Promise<DaemonWorkspaceExtensionsStatus>;
333
+ loadExtensionSummaries(): Promise<DaemonWorkspaceExtensionSummaries>;
334
+ loadExtensionDetails(name: string): Promise<DaemonExtensionEntry>;
333
335
  preheatAcp(timeoutMs?: number): Promise<DaemonWorkspaceAcpPreheatResult>;
334
336
  loadToolsStatus(): Promise<DaemonWorkspaceToolsStatus>;
335
337
  setWorkspaceToolEnabled(toolName: string, enabled: boolean): Promise<unknown>;
@@ -340,7 +342,9 @@ export interface DaemonWorkspaceActions {
340
342
  name: string;
341
343
  };
342
344
  }): Promise<DaemonSettingUpdateResult>;
343
- loadMemoryStatus(): Promise<DaemonWorkspaceMemoryStatus>;
345
+ loadMemoryStatus(options?: {
346
+ includeContent?: boolean;
347
+ }): Promise<DaemonWorkspaceMemoryStatus>;
344
348
  /**
345
349
  * `opts.maxBytes` is how a caller accepts partial content: without a window
346
350
  * argument the daemon refuses any file above its own read cap instead of
@@ -10,7 +10,8 @@ export type { WebShellBrowserNotificationsOptions } from './browser-turn-notific
10
10
  export { JavaManagedAgentClient, JavaManagedAgentHttpError, type JavaAgentCommandAdmission, type JavaAgentEnvironment, type JavaAgentEvent, type JavaAgentSession, type JavaAgentTranscript, type JavaAgentTurn, type JavaManagedAgentClientOptions, } from './components/managed/java-managed-agent-client';
11
11
  export { createJavaManagedAgentProvider, type JavaManagedAgentProviderOptions, } from './components/managed/java-managed-agent-provider';
12
12
  export { ManagedAgentWebShell, type ManagedAgentWebShellProps, } from './ManagedAgentWebShell';
13
- export { type ManagedAgentCommandOptions, type ManagedAgentProvider, type ManagedAgentRequestOptions, type ManagedAgentRuntimeState, type ManagedAgentSessionEvent, type ManagedAgentSessionEventType, type ManagedAgentSessionPhase, type ManagedAgentSessionSummary, type ManagedAgentSessionTranscript, type ManagedAgentTurnAdmission, } from './components/managed/managed-agent-provider';
13
+ export type { ManagedArtifact, ManagedArtifactPage, ManagedArtifactResponse, ManagedArtifactSave, ManagedToolResult, ManagedToolResultReader, ManagedToolResultResponse, } from './components/managed/managed-tool-result-types';
14
+ export { type ManagedAgentCommandOptions, type ManagedAgentPendingAction, type ManagedAgentProvider, type ManagedAgentRequestOptions, type ManagedAgentRuntimeState, type ManagedAgentSessionEvent, type ManagedAgentSessionEventType, type ManagedAgentSessionPhase, type ManagedAgentSessionSummary, type ManagedAgentSessionTranscript, type ManagedAgentTurnAdmission, } from './components/managed/managed-agent-provider';
14
15
  export interface WebShellWithProvidersProps extends WebShellProps {
15
16
  /**
16
17
  * Opt in to URL routing. Explicit initial session target props override the
@@ -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;
@@ -53,6 +53,7 @@ declare const SETTING_KEYS: {
53
53
  readonly 'setting:scheduled-tasks': "experimental.cron";
54
54
  readonly 'setting:session-writer-lease': "experimental.sessionWriterLease";
55
55
  readonly 'setting:agent-team': "experimental.agentTeam";
56
+ readonly 'setting:agent-collaboration': "experimental.agentCollaboration";
56
57
  readonly 'setting:omni-media-delivery': "omni.enabled";
57
58
  readonly 'setting:artifacts': "experimental.artifact";
58
59
  readonly 'setting:tool-use-summaries': "experimental.emitToolUseSummaries";
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Qwen Team
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { Trajectory, TrajectoryRow, TrajectoryTurn } from './types';
7
+ export type TrajectoryVisualRow = {
8
+ kind: 'turn';
9
+ key: string;
10
+ turn: TrajectoryTurn;
11
+ } | {
12
+ kind: 'row';
13
+ key: string;
14
+ row: TrajectoryRow;
15
+ };
16
+ export interface TrajectoryLayout {
17
+ rows: TrajectoryVisualRow[];
18
+ ancestors: Map<string, string[]>;
19
+ groups: Set<string>;
20
+ groupIdentities: Map<string, string>;
21
+ unresolvedParents: Set<string>;
22
+ }
23
+ export declare function buildTrajectoryLayout(trajectory: Trajectory): TrajectoryLayout;
24
+ /** Range context is computed before collapse, so hiding never changes a hit. */
25
+ export declare function trajectoryRowsInRange(layout: TrajectoryLayout, inRange: ReadonlySet<string> | undefined): TrajectoryVisualRow[];
26
+ export declare function visibleTrajectoryRows(layout: TrajectoryLayout, rangeRows: TrajectoryVisualRow[], collapsed: ReadonlySet<string>): TrajectoryVisualRow[];
27
+ export declare function visibleTrajectoryAncestor(layout: TrajectoryLayout, key: string, visible: ReadonlySet<string>): string | undefined;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Qwen Team
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ type FilterMessage = string | ((vars?: Record<string, string | number>) => string);
7
+ export declare const TRAJECTORY_FILTER_MESSAGES_EN: Record<string, FilterMessage>;
8
+ export declare const TRAJECTORY_FILTER_MESSAGES_ZH: Record<string, FilterMessage>;
9
+ export {};
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Qwen Team
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export declare const TRAJECTORY_FILTER_MESSAGES_EN: {};
7
+ export declare const TRAJECTORY_FILTER_MESSAGES_ZH: {};
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Qwen Team
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { Trajectory, TrajectoryRow } from './types';
7
+ export interface TrajectoryFilter {
8
+ query: string;
9
+ type: 'all' | TrajectoryRow['kind'];
10
+ status: 'all' | 'success' | 'error' | 'cancelled' | 'running' | 'unknown';
11
+ }
12
+ export interface TrajectorySearchIndex {
13
+ rows: Array<{
14
+ key: string;
15
+ kind: TrajectoryRow['kind'];
16
+ status?: Exclude<TrajectoryFilter['status'], 'all'>;
17
+ fields: string[];
18
+ }>;
19
+ truncatedCount: number;
20
+ }
21
+ export declare function buildTrajectorySearchIndex(trajectory: Trajectory): TrajectorySearchIndex;
22
+ export declare function filterTrajectory(index: TrajectorySearchIndex, filter: TrajectoryFilter): string[];
@@ -81,11 +81,13 @@ export interface TrajectoryRequestRow extends TrajectoryRowBase {
81
81
  model?: string;
82
82
  /** Folded from the round's assistant block; absent when none carried it. */
83
83
  usage?: DaemonTurnUsage;
84
+ recordId?: string;
85
+ executionId?: string;
84
86
  responseId?: string;
85
87
  promptId?: string;
86
88
  /** Set when a subagent issued the request. */
87
89
  subagentId?: string;
88
- /** Main-session tool call that spawned the subagent, when resolvable. */
90
+ /** Tool call that spawned the subagent, when resolvable. */
89
91
  parentToolCallId?: string;
90
92
  }
91
93
  export interface TrajectoryMessageRow extends TrajectoryRowBase {
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Qwen Team
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { TimelineModel } from './buildTimeline';
7
+ export interface TimelineViewport {
8
+ start: number;
9
+ end: number;
10
+ }
11
+ export interface TimelineViewportController {
12
+ viewport: TimelineViewport | undefined;
13
+ currentView: () => {
14
+ start: number;
15
+ length: number;
16
+ };
17
+ applyViewport: (next: TimelineViewport | undefined) => void;
18
+ }
19
+ export declare function useTimelineViewport(model: TimelineModel | undefined): TimelineViewportController;
@@ -59,55 +59,40 @@ export type TrajectoryWindowFailure = {
59
59
  } | {
60
60
  kind: 'unreadable';
61
61
  message: string;
62
+ } | {
63
+ kind: 'expired' | 'protocol' | 'budget';
62
64
  };
65
+ export declare const TRAJECTORY_BOOKMARK_LIMIT = 64;
66
+ export declare const TRAJECTORY_CURSOR_BUDGET: number;
63
67
  export interface TrajectoryWindow {
64
68
  trajectory: Trajectory | undefined;
65
69
  status: 'idle' | 'loading' | 'ready' | 'error';
66
- /**
67
- * The newest page could not be read. The window already on screen, if any,
68
- * is kept.
69
- */
70
70
  error?: TrajectoryWindowFailure;
71
- /**
72
- * Pages read so far by the load under way, or held by the window once it
73
- * is ready. What the placeholder counts while the walk back is running.
74
- */
75
71
  loadedPages: number;
76
- /**
77
- * The session has history older than the window: the walk stopped at the
78
- * page cap, at a page the daemon gave no cursor for, or at an older page it
79
- * could not read.
80
- */
72
+ windowPages: number;
81
73
  truncated: boolean;
82
- /**
83
- * An older page could not be read, so the window stops just after it. The
84
- * newer pages are drawn; `refresh` is the retry.
85
- */
86
74
  olderFailure?: TrajectoryWindowFailure;
87
- /** Read the window again from the newest page. Also every retry. */
75
+ navigationError?: TrajectoryWindowFailure;
76
+ mode: 'latest' | 'history';
77
+ navigationVersion: number;
78
+ canRefresh: boolean;
79
+ canOlder: boolean;
80
+ canNewer: boolean;
81
+ historyReleased: boolean;
82
+ bookmarks: number;
88
83
  refresh: () => void;
84
+ older: () => void;
85
+ newer: () => void;
86
+ retry: () => void;
89
87
  }
90
88
  /**
91
- * Hold a window of one session's transcript and fold it into a trajectory.
92
- *
93
- * The pages are this view's own: paged replay is the only path that emits
94
- * timing frames, and the chat store is fed by the live stream and by bulk
95
- * replay, neither of which carries them. Reading here also keeps the window
96
- * contiguous by construction, which is what lets the projection pair a frame
97
- * with what it measured.
98
- *
99
- * A load walks back from the newest page by cursor, up to the page cap, and
100
- * the window lands once, whole, when the walk ends. Nothing is ever put in
101
- * front of rows already drawn: a list that grew upwards under the reader would
102
- * have to move its scroll offset, its keys, its selection and its focus in
103
- * step, and no part of that is observable outside a real browser.
104
- *
105
- * `refresh` rebuilds the window from the newest page rather than splicing into
106
- * it: page boundaries are chosen per request, so a fresh page and the held
107
- * ones overlap by an unknown amount and cannot be joined without dropping or
108
- * repeating records.
89
+ * Windows are contiguous cursor walks, committed whole. Only bookmarks survive
90
+ * a switch: replaying a saved cursor stays in its snapshot, whereas a read
91
+ * without one explicitly returns to the latest snapshot.
109
92
  */
110
93
  export declare function useTrajectoryWindow(loadPage: TrajectoryPageLoader | undefined, options?: {
111
94
  pageSize?: number;
112
95
  maxPages?: number;
96
+ bookmarkLimit?: number;
97
+ cursorBudget?: number;
113
98
  }): TrajectoryWindow;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Qwen Team
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ type WindowMessage = string | ((vars?: Record<string, string | number>) => string);
7
+ export declare const TRAJECTORY_WINDOW_MESSAGES_EN: Record<string, WindowMessage>;
8
+ export declare const TRAJECTORY_WINDOW_MESSAGES_ZH: Record<string, WindowMessage>;
9
+ export {};
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Qwen Team
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export declare const TRAJECTORY_WINDOW_MESSAGES_EN: {};
7
+ export declare const TRAJECTORY_WINDOW_MESSAGES_ZH: {};
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Qwen Team
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { DaemonTranscriptBlock } from '@qwen-code/sdk/daemon';
7
+ /**
8
+ * Whether everything a cancelled turn left behind its prompt can go with it.
9
+ * Thoughts count as nothing: cancelling mid-reasoning is exactly when taking
10
+ * the prompt back matters, and the TUI's restore-on-cancel treats them the
11
+ * same way. An answer, a tool call, shell output, a permission request or a
12
+ * later user message all keep the turn.
13
+ *
14
+ * Only meaningful once the daemon has settled the turn: until its terminal
15
+ * event arrives, "nothing received yet" is not "nothing produced".
16
+ */
17
+ export declare function cancelledTurnProducedNothing(blocksAfterPrompt: readonly DaemonTranscriptBlock[]): boolean;
@@ -37,6 +37,11 @@ export declare function parseUserMessageContentSafely(content: string, parser: U
37
37
  export declare function getComposerTagSerialized(tag: WebShellComposerTag): string;
38
38
  export declare function getComposerTagIconUrl(kind: WebShellComposerTagKind | undefined, customIconUrls?: WebShellComposerTagIconMap): string | undefined;
39
39
  export declare function isBuiltinComposerTagIconUrl(iconUrl: string | undefined): boolean;
40
- export declare function createInputAnnotationsFromComposerTags(content: string, tags: readonly WebShellComposerTag[]): DaemonInputAnnotation[];
40
+ export interface ComposerTagKnownPlacement {
41
+ start: number;
42
+ end: number;
43
+ tag: WebShellComposerTag;
44
+ }
45
+ export declare function createInputAnnotationsFromComposerTags(content: string, tags: readonly WebShellComposerTag[], knownPlacements?: readonly ComposerTagKnownPlacement[]): DaemonInputAnnotation[];
41
46
  export declare function splitComposerTagContentByAnnotations(content: string, inputAnnotations?: readonly DaemonInputAnnotation[]): ComposerTagContentSegment[];
42
47
  export declare function getComposerTagViewModel(tag: WebShellComposerTag, composerTagIcons?: WebShellComposerTagIconMap): ComposerTagViewModel;
@@ -13,3 +13,9 @@ export declare function extractBareModelId(modelId: string): string;
13
13
  * If the input has no colon, returns it unchanged.
14
14
  */
15
15
  export declare function decodeVisionModelForPicker(storedValue: string): string;
16
+ export declare function resolveFastModelForPicker(storedValue: string, models: readonly {
17
+ id: string;
18
+ baseModelId?: string;
19
+ authType?: string;
20
+ baseUrl?: string;
21
+ }[]): string;
@@ -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;
@@ -4,6 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import type { DaemonCapabilities, DaemonSessionSummary, DaemonWorkspaceCapability } from '@qwen-code/sdk/daemon';
7
+ export declare function isAgentCollaborationEnabledForWorkspace(capabilities: DaemonCapabilities | undefined, cwd: string | undefined): boolean;
7
8
  /**
8
9
  * Last path segment of an absolute workspace cwd, for a compact per-workspace
9
10
  * label (e.g. `/home/me/projects/api` → `api`). Falls back to the full path when
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qwen-code/web-shell",
3
- "version": "0.24.7",
3
+ "version": "0.25.0-nightly.20261009.085a44f336",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/QwenLM/qwen-code.git",
@@ -72,6 +72,7 @@
72
72
  },
73
73
  "devDependencies": {
74
74
  "@playwright/test": "1.61.1",
75
+ "@qwen-code/acp-bridge": "file:../acp-bridge",
75
76
  "@qwen-code/sdk": "file:../sdk-typescript",
76
77
  "@tailwindcss/vite": "^4.3.2",
77
78
  "@types/hast": "^3.0.5",