@qwen-code/web-shell 0.24.4 → 0.24.5-nightly.20260925.c3a4058a0c

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 (85) hide show
  1. package/README.md +152 -1
  2. package/dist/code-highlighter.js +4 -0
  3. package/dist/codeHighlighter-pfciSYNN.js +89 -0
  4. package/dist/daemon-react-sdk.js +1 -1
  5. package/dist/index.js +49184 -44478
  6. package/dist/sw.js +1 -1
  7. package/dist/{toolNames-Cnaa5VCB.js → toolNames-C6S4xtsA.js} +7018 -6371
  8. package/dist/transcript.js +11334 -10857
  9. package/dist/types/App.d.ts +18 -3
  10. package/dist/types/App.typecheck.d.ts +6 -0
  11. package/dist/types/ManagedAgentWebShell.d.ts +17 -0
  12. package/dist/types/adapters/toolClassification.d.ts +1 -0
  13. package/dist/types/adapters/transcriptToMessages.d.ts +3 -2
  14. package/dist/types/code-highlighter.d.ts +6 -0
  15. package/dist/types/components/BranchPickerPopover.d.ts +3 -1
  16. package/dist/types/components/ChatEditor.d.ts +2 -0
  17. package/dist/types/components/ChatPane.d.ts +5 -3
  18. package/dist/types/components/ConversationSearch.d.ts +18 -0
  19. package/dist/types/components/GlobalTurnNavigation.d.ts +3 -1
  20. package/dist/types/components/MessageList.d.ts +10 -2
  21. package/dist/types/components/MessageTimestamp.d.ts +4 -1
  22. package/dist/types/components/SplitView.d.ts +3 -1
  23. package/dist/types/components/WorkspaceSessionProvider.d.ts +2 -0
  24. package/dist/types/components/artifacts/ArtifactPanel.d.ts +18 -1
  25. package/dist/types/components/artifacts/SideTaskPanel.d.ts +5 -1
  26. package/dist/types/components/artifacts/TrajectoryOverview.d.ts +71 -0
  27. package/dist/types/components/artifacts/TurnCallPromptSelect.d.ts +9 -0
  28. package/dist/types/components/artifacts/TurnCallsPanel.d.ts +38 -0
  29. package/dist/types/components/artifacts/TurnOutputs.d.ts +6 -1
  30. package/dist/types/components/artifacts/loadTurnCalls.d.ts +4 -0
  31. package/dist/types/components/channels/channel-editor-state.d.ts +9 -3
  32. package/dist/types/components/conversation-search-i18n.d.ts +6 -0
  33. package/dist/types/components/dialogs/DeleteSessionDialog.d.ts +9 -1
  34. package/dist/types/components/dialogs/GitDialog.d.ts +6 -2
  35. package/dist/types/components/dialogs/GitWorktreesDialog.d.ts +11 -0
  36. package/dist/types/components/managed/ManagedSessionProgress.d.ts +6 -0
  37. package/dist/types/components/managed/ManagedSessionsPage.d.ts +7 -0
  38. package/dist/types/components/managed/java-managed-agent-client.d.ts +140 -0
  39. package/dist/types/components/managed/java-managed-agent-event-projector.d.ts +5 -0
  40. package/dist/types/components/managed/java-managed-agent-provider.d.ts +8 -0
  41. package/dist/types/components/managed/managed-agent-provider.d.ts +77 -0
  42. package/dist/types/components/managed/managed-session-messages.d.ts +4 -0
  43. package/dist/types/components/managed/managed-session-storage.d.ts +7 -0
  44. package/dist/types/components/managed/use-managed-session.d.ts +12 -0
  45. package/dist/types/components/messages/AuthMessage.d.ts +2 -1
  46. package/dist/types/components/messages/LinkifiedText.d.ts +1 -1
  47. package/dist/types/components/messages/ModelManagementSection.d.ts +3 -2
  48. package/dist/types/components/messages/PlanExecutionView.d.ts +14 -66
  49. package/dist/types/components/messages/SettingsMessage.d.ts +2 -2
  50. package/dist/types/components/messages/ToolFilePreviewButton.d.ts +2 -1
  51. package/dist/types/components/messages/ToolGroup.d.ts +3 -0
  52. package/dist/types/components/messages/codeHighlighter.d.ts +7 -0
  53. package/dist/types/components/messages/taskExecutionIndex.d.ts +80 -0
  54. package/dist/types/components/messages/toolFormatting.d.ts +3 -0
  55. package/dist/types/components/panels/EnvironmentPanel.d.ts +2 -1
  56. package/dist/types/components/sidebar/WebShellSidebar.d.ts +12 -3
  57. package/dist/types/components/sidebar/WorkspaceSection.d.ts +8 -1
  58. package/dist/types/components/workflow/SessionWorkflowCockpit.d.ts +8 -1
  59. package/dist/types/components/workflow/SessionWorkflowInspector.d.ts +8 -1
  60. package/dist/types/components/workflow/session-workflow-model.d.ts +9 -1
  61. package/dist/types/customization.d.ts +9 -1
  62. package/dist/types/daemon/session/actions.d.ts +1 -1
  63. package/dist/types/daemon/session/transcript-page-table.d.ts +1 -1
  64. package/dist/types/daemon/session/turn-navigation-store.d.ts +32 -0
  65. package/dist/types/daemon/session/types.d.ts +3 -1
  66. package/dist/types/hooks/useMessageNavigation.d.ts +12 -0
  67. package/dist/types/hooks/useQueuedPrompts.d.ts +4 -1
  68. package/dist/types/hooks/useTranscriptViewport.d.ts +4 -1
  69. package/dist/types/index.d.ts +17 -1
  70. package/dist/types/live/live-presence.d.ts +14 -0
  71. package/dist/types/live/screen-feed-sampler.d.ts +12 -0
  72. package/dist/types/live/useLiveBrowserHost.d.ts +7 -0
  73. package/dist/types/live/useLiveVoice.d.ts +2 -0
  74. package/dist/types/modelManagement.d.ts +16 -0
  75. package/dist/types/navigation.d.ts +37 -0
  76. package/dist/types/trajectory/buildTimeline.d.ts +67 -0
  77. package/dist/types/trajectory/timelineRange.d.ts +27 -0
  78. package/dist/types/trajectory/transcriptPageLoader.d.ts +4 -2
  79. package/dist/types/trajectory/types.d.ts +3 -3
  80. package/dist/types/trajectory/useTrajectoryWindow.d.ts +55 -17
  81. package/dist/types/turnCallsContext.d.ts +12 -0
  82. package/dist/types/utils/navigationUrl.d.ts +21 -0
  83. package/dist/types/utils/popoverRoom.d.ts +22 -0
  84. package/dist/types/utils/sessionPath.d.ts +1 -0
  85. package/package.json +5 -1
@@ -1,13 +1,16 @@
1
+ import { type WebShellModelManagementOptions } from './modelManagement';
1
2
  import './styles/globals.css';
3
+ import { type WebShellMessageNavigationRequest, type WebShellMessageNavigationResult } from './hooks/useMessageNavigation';
2
4
  import { type DaemonProductSessionContext, type DaemonStreamingState } from '@qwen-code/web-shell/daemon-react-sdk';
3
5
  import type { DaemonAgentTrace, DaemonSessionAgentTaskStatus, DaemonTranscriptBlock, DaemonSessionMonitorTaskStatus, DaemonSessionTaskWithWorkflowStatus, DaemonWorkspaceCapability } from '@qwen-code/sdk/daemon';
4
6
  import { type ComposerToolbarAction } from './components/ChatEditor';
5
7
  import { type ToastTone } from './components/ToastHost';
6
8
  import { type EnvironmentAgentTask } from './components/panels/EnvironmentPanel';
7
9
  import { type ModelDialogModel } from './components/dialogs/ModelDialog';
10
+ import type { ManagedAgentProvider } from './components/managed/managed-agent-provider';
8
11
  import type { PaneHeaderActionsRenderer } from './components/ChatPane';
9
12
  import { type SideTaskListItem } from './components/artifacts/ArtifactPanel';
10
- import type { TurnOutputKind, TurnOutputOpenRequest } from './components/artifacts/TurnOutputs';
13
+ import type { ArtifactFilter, TurnOutputKind, TurnOutputOpenRequest } from './components/artifacts/TurnOutputs';
11
14
  import { type WebShellSettingsOptions } from './settings';
12
15
  import { type WebShellShadowDom } from './shadowDom';
13
16
  import { type WebShellSidebarBranding, type WebShellSidebarFooterOptions, type WebShellSidebarWorkspaceOverviewOptions, type WebShellSidebarLockedWorkspace, type WebShellSidebarPrimaryNavOptions, type WebShellSidebarSessionActionsOptions } from './components/sidebar/WebShellSidebar';
@@ -64,6 +67,8 @@ export type SessionChangeEvent = {
64
67
  error?: Error;
65
68
  };
66
69
  export interface WebShellApi {
70
+ /** 按持久化记录 ID 定位当前会话消息,包含尚未渲染的历史。宿主先切换会话。 */
71
+ navigateToMessage: (request: WebShellMessageNavigationRequest) => Promise<WebShellMessageNavigationResult>;
67
72
  /** Open the in-window split view, matching the built-in sidebar button. */
68
73
  openSplitView: () => void;
69
74
  /** Open the Session Overview panel, matching the built-in sidebar button. */
@@ -94,6 +99,8 @@ export type WebShellSlashCommandHandler = (command: WebShellSlashCommand) => boo
94
99
  export interface WebShellProps {
95
100
  /** Native settings-page presentation. Does not restrict commands or daemon access. */
96
101
  settings?: WebShellSettingsOptions;
102
+ /** Model add/delete interactions across WebShell. Not a backend permission policy. */
103
+ modelManagement?: WebShellModelManagementOptions;
97
104
  /** Host-specific label for the Ask User Question free-text choice. */
98
105
  askUserFreeTextLabel?: string;
99
106
  /** Called whenever the attached daemon session or workspace changes. */
@@ -105,6 +112,8 @@ export interface WebShellProps {
105
112
  }) => void;
106
113
  /** Called after a new session is created. Session setup waits up to 30 seconds. */
107
114
  onSessionCreated?: (sessionId: string) => Promise<void> | void;
115
+ /** Explicit Managed Agent backend. Omit to keep the daemon provider unchanged. */
116
+ managedAgentProvider?: ManagedAgentProvider;
108
117
  /** Visual theme for the embedded shell. */
109
118
  theme?: WebShellTheme;
110
119
  /** Called when `/theme` changes the web-shell theme. */
@@ -158,6 +167,8 @@ export interface WebShellProps {
158
167
  header?: WebShellChatHeaderOptions;
159
168
  /** Right extension panel options. */
160
169
  rightPanel?: WebShellRightPanelOptions;
170
+ /** Show the tool-call entry on user messages. Defaults to false. */
171
+ showToolCalls?: boolean;
161
172
  /** Environment information panel options. */
162
173
  environmentPanel?: WebShellEnvironmentPanelOptions;
163
174
  /** Session ids to control the split view; an empty array closes it. */
@@ -173,8 +184,9 @@ export interface WebShellProps {
173
184
  /**
174
185
  * Called instead of the built-in right panel open behavior when a user clicks
175
186
  * a turn output such as review changes, an artifact, or a scheduled task.
187
+ * Return false to use the built-in behavior; true or undefined claims the open.
176
188
  */
177
- onRightPanelOpen?: (request: TurnOutputOpenRequest) => void;
189
+ onRightPanelOpen?: ((request: TurnOutputOpenRequest) => void) | ((request: TurnOutputOpenRequest) => boolean);
178
190
  /** Override file-review links without replacing the other right panels. */
179
191
  onFileReviewOpen?: (request: Extract<TurnOutputOpenRequest, {
180
192
  kind: 'review';
@@ -189,6 +201,7 @@ export interface WebShellProps {
189
201
  * Controls which turn output cards appear below messages. Defaults to all.
190
202
  */
191
203
  messageTurnOutputs?: readonly TurnOutputKind[];
204
+ filterArtifact?: ArtifactFilter;
192
205
  /** Imperative handle for externally opening WebShell surfaces. */
193
206
  shellRef?: React.Ref<WebShellApi>;
194
207
  /**
@@ -362,6 +375,8 @@ export interface WebShellProps {
362
375
  markdownTableMode?: MarkdownTableMode;
363
376
  /** Enable virtual scrolling only when rendered transcript rows exceed this threshold. Defaults to 200. */
364
377
  virtualScrollThreshold?: number;
378
+ /** 会话消息数超过此阈值时显示搜索入口,默认 10。 */
379
+ conversationSearchThreshold?: number;
365
380
  /** Custom Markdown behavior for assistant content only. */
366
381
  markdown?: WebShellMarkdownCustomization;
367
382
  /**
@@ -427,4 +442,4 @@ interface SideTaskCatalogState {
427
442
  export declare function mergeSideTaskCatalog(catalog: SideTaskCatalogState, parentSessionId: string, listedItems: SideTaskListItem[], optimisticIds: ReadonlySet<string>): SideTaskCatalogState;
428
443
  export declare function getEnvironmentAgentTasks(messages: readonly Message[], sessionTasks: readonly DaemonSessionTaskWithWorkflowStatus[]): EnvironmentAgentTask[];
429
444
  export declare function mergeAgentTrace(liveAgents: readonly EnvironmentAgentTask[], trace: DaemonAgentTrace | undefined, now?: number): EnvironmentAgentTask[];
430
- export declare function App({ askUserFreeTextLabel, onSessionIdChange, onSessionInfoChange, onSessionCreated, theme: providedTheme, onThemeChange, onThemeResolved, language: providedLanguage, onLanguageChange, onLanguageResolved, brand: providedBrand, onBrandResolved, className: externalClassName, style: externalStyle, shadowDom, onConnectionChange, onStreamingStateChange, onError, onBugReport, hiddenSlashCommands, slashCommandCategoryOrder, onSlashCommand, builtinAtProviders, atProviders, composerTagIcons, fileUploadEnabled, fileUploadDirectory, artifact, fileDropAction, renderToolHeaderExtra, renderWelcomeHeader, renderWelcomeFooter, mobileWelcomeFooterMiddle, parseUserMessageContent, renderUserMessageContent, renderComposerTag, renderComposerTagTooltip, onComposerTagClick, renderAssistantTurnFooter, assistantFeedback, getAssistantSourcesIcon, sourceReferences, renderComposerToolbarStart, renderComposerToolbarEnd, renderComposerToolbarRight, renderComposerHeader, renderComposerFooter, renderChatHeader, renderFooter, bottomStatusItems, chatMaxWidth, sidebar, settings: settingsPresentation, header, rightPanel, environmentPanel, splitSessionIds: externalSplitSessionIds, onSplitSessionIdsChange, renderPaneHeaderActions, onRightPanelOpen, onFileReviewOpen, onWorkspaceFileOpen, onInsightReportOpen, onContextUsageOpen, messageTurnOutputs, shellRef, composerToolbarActions, mainModelFilter, compactComposerOverlays, autoSubmitSlashCommands, additionalSlashCommands, contextUsageAlwaysVisible, userMessageEditing, onUserMessageEditRequest, cycleModeOnTab, sessionSourceType, composerToolbarAdditionalActions, composerPlaceholders, compactThinking, hostOwnsEditDiffPreview, collapseCompletedTurns, markdownTableMode, virtualScrollThreshold, markdown, loadingPhrases, onAgentTasksChange, onTranscriptChange, onSessionArtifactsChange, onToast, composerRef, onComposerReady, composerInput, composerInputVersion, onSessionChange, onAssistantTurnSettled, prepareSubmit, onSubmitBefore, restartSseOnPrompt, historyPageSize, initialSelectedWorkspaceCwd, lockedWorkspaceCwd, lockedWorkspaceCapability, }?: AppProps): import("react/jsx-runtime").JSX.Element;
445
+ export declare function App({ askUserFreeTextLabel, onSessionIdChange, onSessionInfoChange, onSessionCreated, managedAgentProvider, theme: providedTheme, onThemeChange, onThemeResolved, language: providedLanguage, onLanguageChange, onLanguageResolved, brand: providedBrand, onBrandResolved, className: externalClassName, style: externalStyle, shadowDom, onConnectionChange, onStreamingStateChange, onError, onBugReport, hiddenSlashCommands, slashCommandCategoryOrder, onSlashCommand, builtinAtProviders, atProviders, composerTagIcons, fileUploadEnabled, fileUploadDirectory, artifact, fileDropAction, renderToolHeaderExtra, renderWelcomeHeader, renderWelcomeFooter, mobileWelcomeFooterMiddle, parseUserMessageContent, renderUserMessageContent, renderComposerTag, renderComposerTagTooltip, onComposerTagClick, renderAssistantTurnFooter, assistantFeedback, getAssistantSourcesIcon, sourceReferences, renderComposerToolbarStart, renderComposerToolbarEnd, renderComposerToolbarRight, renderComposerHeader, renderComposerFooter, renderChatHeader, renderFooter, bottomStatusItems, chatMaxWidth, sidebar, settings: settingsPresentation, modelManagement, header, rightPanel, showToolCalls, environmentPanel, splitSessionIds: externalSplitSessionIds, onSplitSessionIdsChange, renderPaneHeaderActions, onRightPanelOpen, onFileReviewOpen, onWorkspaceFileOpen, onInsightReportOpen, onContextUsageOpen, messageTurnOutputs, filterArtifact, shellRef, composerToolbarActions, mainModelFilter, compactComposerOverlays, autoSubmitSlashCommands, additionalSlashCommands, contextUsageAlwaysVisible, userMessageEditing, onUserMessageEditRequest, cycleModeOnTab, sessionSourceType, composerToolbarAdditionalActions, composerPlaceholders, compactThinking, hostOwnsEditDiffPreview, collapseCompletedTurns, markdownTableMode, virtualScrollThreshold, conversationSearchThreshold, markdown, loadingPhrases, onAgentTasksChange, onTranscriptChange, onSessionArtifactsChange, onToast, composerRef, onComposerReady, composerInput, composerInputVersion, onSessionChange, onAssistantTurnSettled, prepareSubmit, onSubmitBefore, restartSseOnPrompt, historyPageSize, initialSelectedWorkspaceCwd, lockedWorkspaceCwd, lockedWorkspaceCapability, }?: AppProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,6 @@
1
+ import type { WebShellProps } from './App';
2
+ import type { TurnOutputOpenRequest } from './components/artifacts/TurnOutputs';
3
+ type Assert<T extends true> = T;
4
+ type OpenHandler = NonNullable<WebShellProps['onRightPanelOpen']>;
5
+ export type AsyncVoidHandler = Assert<((request: TurnOutputOpenRequest) => Promise<void>) extends OpenHandler ? true : false>;
6
+ export {};
@@ -0,0 +1,17 @@
1
+ import './styles/globals.css';
2
+ import { type CSSProperties } from 'react';
3
+ import { type WebShellBrand } from './brandContext';
4
+ import { type JavaManagedAgentProviderOptions } from './components/managed/java-managed-agent-provider';
5
+ import { type WebShellLanguage } from './i18n';
6
+ import { type WebShellTheme } from './themeContext';
7
+ export interface ManagedAgentWebShellProps extends JavaManagedAgentProviderOptions {
8
+ sessionId?: string;
9
+ onSessionChange?: (sessionId: string | undefined) => void;
10
+ language?: WebShellLanguage;
11
+ theme?: WebShellTheme;
12
+ brand?: WebShellBrand;
13
+ className?: string;
14
+ style?: CSSProperties;
15
+ }
16
+ /** Managed-only 产品入口,不创建 daemon workspace/session context。 */
17
+ export declare function ManagedAgentWebShell(props: ManagedAgentWebShellProps): import("react/jsx-runtime").JSX.Element;
@@ -1,4 +1,5 @@
1
1
  import type { ACPToolCall } from './types.js';
2
+ export declare function resolveToolCallName(toolName: string | undefined, rawInput: unknown): string | undefined;
2
3
  export declare function isActiveToolStatus(status: ACPToolCall['status'] | string): boolean;
3
4
  export type TerminalBackgroundAgentStatus = 'completed' | 'failed' | 'cancelled' | 'canceled';
4
5
  export declare function isTerminalBackgroundAgentStatus(status: unknown): status is TerminalBackgroundAgentStatus;
@@ -3,8 +3,8 @@
3
3
  * Copyright 2025 Qwen Team
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import type { DaemonTranscriptBlock } from '@qwen-code/sdk/daemon';
7
- import type { DaemonMessage } from './messageTypes.js';
6
+ import type { DaemonTranscriptBlock, DaemonToolTranscriptBlock } from '@qwen-code/sdk/daemon';
7
+ import type { DaemonMessage, DaemonMessageToolCall } from './messageTypes.js';
8
8
  interface TranscriptMessageLabels {
9
9
  promptCancelled?: string;
10
10
  branchSuccess?: (name: string) => string;
@@ -25,6 +25,7 @@ export declare function isRetryableTurnErrorKind(errorKind: string | undefined):
25
25
  */
26
26
  export declare function assistantBlockRendersAsSystemNotice(block: DaemonTranscriptBlock): boolean;
27
27
  export declare function transcriptBlocksToDaemonMessages(blocks: readonly DaemonTranscriptBlock[], options?: TranscriptMessageOptions): DaemonMessage[];
28
+ export declare function daemonToolBlockToToolCall(block: DaemonToolTranscriptBlock, safeToolProjection: boolean): DaemonMessageToolCall;
28
29
  type ParsedInsight = {
29
30
  type: 'insight_progress';
30
31
  stage: string;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Qwen Team
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export { highlightCode, type CodeHighlightRequest, } from './components/messages/codeHighlighter.js';
@@ -27,6 +27,8 @@ interface BranchPickerPopoverProps {
27
27
  onStatusRefreshed?: (status: DaemonWorkspaceGitStatus) => void;
28
28
  onOpenDiff?: () => void;
29
29
  onOpenCommit?: () => void;
30
+ /** Opens the worktree manager. */
31
+ onOpenWorktrees?: () => void;
30
32
  /** Opens the commit history graph. */
31
33
  onOpenLog?: () => void;
32
34
  children: React.ReactNode;
@@ -71,5 +73,5 @@ export declare function deriveActionHints(t: TranslateFn, data: DaemonGitBranche
71
73
  * re-fetched. Exported for tests.
72
74
  */
73
75
  export declare function listingContradictsStatus(data: DaemonGitBranchesResult, status: DaemonWorkspaceGitStatus): boolean;
74
- export declare function BranchPickerPopover({ open, onOpenChange, workspaceCwd, gitCwd, side, onBranchChanged, status, onStatusRefreshed, onOpenDiff, onOpenCommit, onOpenLog, children, }: BranchPickerPopoverProps): import("react/jsx-runtime").JSX.Element;
76
+ export declare function BranchPickerPopover({ open, onOpenChange, workspaceCwd, gitCwd, side, onBranchChanged, status, onStatusRefreshed, onOpenDiff, onOpenCommit, onOpenWorktrees, onOpenLog, children, }: BranchPickerPopoverProps): import("react/jsx-runtime").JSX.Element;
75
77
  export {};
@@ -57,6 +57,8 @@ interface ChatEditorProps {
57
57
  onOpenGitDiff?: () => void;
58
58
  /** Opens the commit dialog. */
59
59
  onOpenCommit?: () => void;
60
+ /** Opens the worktree manager. */
61
+ onOpenWorktrees?: () => void;
60
62
  /** Opens the commit history graph. */
61
63
  onOpenLog?: () => void;
62
64
  /** Workspace name shown in the pane composer's `workspace` toolbar chip. */
@@ -6,6 +6,7 @@
6
6
  import { type ReactNode } from 'react';
7
7
  import { type DaemonSessionActions } from '@qwen-code/web-shell/daemon-react-sdk';
8
8
  import { type DaemonSessionArtifact, type DaemonSessionMonitorTaskStatus, type DaemonSessionSummary, type DaemonWorkspaceCapability } from '@qwen-code/sdk/daemon';
9
+ import { type WebShellModelManagementOptions } from '../modelManagement';
9
10
  import { type RegisterContextUsageControls } from '../hooks/useContextUsageControls';
10
11
  import type { WebShellSlashCommandHandler } from '../App';
11
12
  import type { TurnOutputKind, TurnOutputOpenRequest } from './artifacts/TurnOutputs';
@@ -27,8 +28,8 @@ export interface ChatPaneProps {
27
28
  onApprovalChange?: (sessionId: string, pending: boolean) => void;
28
29
  /**
29
30
  * The workspace this pane's session lives in. Passed explicitly by the split
30
- * view (which knows it per session) and shown as a composer-toolbar chip on a
31
- * multi-workspace daemon; falls back to the connection's own workspace.
31
+ * view (which knows it per session); falls back to the connection's own
32
+ * workspace.
32
33
  */
33
34
  workspaceCwd?: string;
34
35
  /**
@@ -62,6 +63,7 @@ export interface ChatPaneProps {
62
63
  onImageIngestionNotice?: (tone: 'warning' | 'error', message: string) => void;
63
64
  /** Host slash-command callback shared with the main chat composer. */
64
65
  onSlashCommand?: WebShellSlashCommandHandler;
66
+ modelManagement?: WebShellModelManagementOptions;
65
67
  onOpenGoals?: () => void;
66
68
  onRightPanelOpen?: (request: TurnOutputOpenRequest) => void;
67
69
  onOpenMonitor?: (task: DaemonSessionMonitorTaskStatus, sessionId: string, sessionActions: DaemonSessionActions) => void;
@@ -90,4 +92,4 @@ export interface ChatPaneProps {
90
92
  * state, approvals, and composer, and the browser scopes keyboard focus to the
91
93
  * pane the user clicks into — so there is no cross-pane approval arbitration.
92
94
  */
93
- export declare function ChatPane({ title, sessionSummary, isActive, onApprovalChange, workspaceCwd, renderHeaderActions, onClose, onToggleMaximize, isMaximized, onError, onImageIngestionNotice, onSlashCommand, onOpenGoals, onRightPanelOpen, onOpenMonitor, onPaneArtifactsChange, registerContextUsageControls, onBeforeContextCompress, onOpenContextUsage, messageTurnOutputs, embedded, onFirstPromptAdmitted, reportCatalogTurnCompletion, hidden, voiceUserRevision, voiceWorkspaceRevisions, voiceWorkspaces, sessionWorkflowEnabled, planControlVisible, }: ChatPaneProps): import("react/jsx-runtime").JSX.Element;
95
+ export declare function ChatPane({ title, sessionSummary, isActive, onApprovalChange, workspaceCwd, renderHeaderActions, onClose, onToggleMaximize, isMaximized, onError, onImageIngestionNotice, onSlashCommand, modelManagement, onOpenGoals, onRightPanelOpen, onOpenMonitor, onPaneArtifactsChange, registerContextUsageControls, onBeforeContextCompress, onOpenContextUsage, messageTurnOutputs, embedded, onFirstPromptAdmitted, reportCatalogTurnCompletion, hidden, voiceUserRevision, voiceWorkspaceRevisions, voiceWorkspaces, sessionWorkflowEnabled, planControlVisible, }: ChatPaneProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Qwen Team
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { type RefObject, type ReactNode } from 'react';
7
+ import type { MessageListHandle } from './MessageList';
8
+ interface ConversationSearchProps {
9
+ children?: (trigger: ReactNode) => ReactNode;
10
+ active?: boolean;
11
+ onRestoreFocus?: () => void;
12
+ threshold?: number;
13
+ className?: string;
14
+ messageListRef: RefObject<MessageListHandle | null>;
15
+ registerInteractionBlocker?: () => () => void;
16
+ }
17
+ export declare function ConversationSearch({ children, active, onRestoreFocus, threshold, className, messageListRef, registerInteractionBlocker, }: ConversationSearchProps): import("react/jsx-runtime").JSX.Element;
18
+ export {};
@@ -3,8 +3,10 @@
3
3
  * Copyright 2026 Qwen Team
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
+ import { type ReactNode } from 'react';
6
7
  import type { DaemonTurnNavigationSnapshot, DaemonTurnNavigationStore } from '../daemon/session/turn-navigation-store';
7
- export declare function GlobalTurnNavigation({ state, store, follow, onSelect, }: {
8
+ export declare function GlobalTurnNavigation({ state, store, follow, onSelect, action, }: {
9
+ action?: ReactNode;
8
10
  state: DaemonTurnNavigationSnapshot;
9
11
  store: DaemonTurnNavigationStore;
10
12
  follow?: {
@@ -35,7 +35,8 @@ export interface MessageListProps {
35
35
  * Identity of the session whose transcript `messages` show. Block ids are
36
36
  * per-session ordinals, so changing it resets every session-scoped UI state
37
37
  * (collapse overrides, pagination keep-open, pending page snapshots, the
38
- * scroll anchor) — a direct session switch never renders empty messages.
38
+ * scroll anchor, the settled-stale-message latch) — a direct session switch
39
+ * never renders empty messages.
39
40
  */
40
41
  sessionKey?: string;
41
42
  transcriptBlockCount?: number;
@@ -52,7 +53,11 @@ export interface MessageListProps {
52
53
  transcriptReloadPaused?: boolean;
53
54
  /**
54
55
  * True while the agent is still answering. The newest turn then stays
55
- * expanded and un-collapsible so streaming output is never hidden.
56
+ * expanded and un-collapsible so streaming output is never hidden. When
57
+ * false, stale assistant/thinking/tool-group-thought streaming flags left
58
+ * by a restored replay are settled before render — and stay settled when
59
+ * the session responds again, for as long as their content is unchanged —
60
+ * which is what hosts observe through MarkdownRenderContext.isStreaming.
56
61
  */
57
62
  isResponding?: boolean;
58
63
  welcomeHeader?: ReactNode;
@@ -75,6 +80,7 @@ export interface MessageListProps {
75
80
  */
76
81
  bottomOverlayInset?: number;
77
82
  hideSessionTimeline?: boolean;
83
+ timelineAction?: ReactNode;
78
84
  hideFirstUserMessage?: boolean;
79
85
  firstTurnMetrics?: {
80
86
  durationMs?: number;
@@ -213,6 +219,8 @@ export interface MessageListHandle {
213
219
  * highlight it. Returns false when the message is not in the list.
214
220
  */
215
221
  scrollToMessage: (messageId: string, callId?: string) => boolean;
222
+ /** 定位持久化历史搜索结果;调用方可取消仍在加载的选择。 */
223
+ scrollToSearchHit?: (hit: import('../daemon/session/turn-navigation-store').ConversationSearchHit, isCurrent?: () => boolean) => Promise<boolean | 'cancelled'>;
216
224
  /** Resume bottom-follow mode and scroll to the latest output. */
217
225
  scrollToBottom: (behavior?: ScrollBehavior) => void;
218
226
  }
@@ -13,12 +13,15 @@ interface MessageTimestampProps {
13
13
  /** When set, render an edit action after the copy button. */
14
14
  onEdit?: () => void;
15
15
  editTitle?: string;
16
+ /** When set, render an action that opens this turn's tool-call list. */
17
+ onOpenTurnCalls?: () => void;
18
+ turnCallsTitle?: string;
16
19
  }
17
20
  /**
18
21
  * Wraps a rendered history message and reveals its wall-clock time as a
19
22
  * CSS-only tooltip on hover.
20
23
  */
21
- export declare function MessageTimestamp({ timestamp, hideTimestamp, children, chatMode, toolGroupSpacing, copyText, copyTitle, onEdit, editTitle, }: MessageTimestampProps): import("react/jsx-runtime").JSX.Element;
24
+ export declare function MessageTimestamp({ timestamp, hideTimestamp, children, chatMode, toolGroupSpacing, copyText, copyTitle, onEdit, editTitle, onOpenTurnCalls, turnCallsTitle, }: MessageTimestampProps): import("react/jsx-runtime").JSX.Element;
22
25
  /**
23
26
  * Local-time clock, dropping the date only for same-day timestamps:
24
27
  * - same day → `HH:mm:ss`
@@ -6,6 +6,7 @@
6
6
  import { type DaemonSessionActions } from '@qwen-code/web-shell/daemon-react-sdk';
7
7
  import type { DaemonSessionArtifact, DaemonSessionMonitorTaskStatus, DaemonWorkspaceCapability } from '@qwen-code/sdk/daemon';
8
8
  import type { WebShellSlashCommandHandler } from '../App';
9
+ import type { WebShellModelManagementOptions } from '../modelManagement';
9
10
  import type { RegisterContextUsageControls } from '../hooks/useContextUsageControls';
10
11
  import { type PaneHeaderActionsRenderer } from './ChatPane';
11
12
  import type { TurnOutputKind, TurnOutputOpenRequest } from './artifacts/TurnOutputs';
@@ -34,6 +35,7 @@ export interface SplitViewProps {
34
35
  onError?: (error: unknown, fallback: string) => void;
35
36
  onImageIngestionNotice?: (tone: 'warning' | 'error', message: string) => void;
36
37
  onSlashCommand?: WebShellSlashCommandHandler;
38
+ modelManagement?: WebShellModelManagementOptions;
37
39
  onOpenGoals?: () => void;
38
40
  onRightPanelOpen?: (request: TurnOutputOpenRequest) => void;
39
41
  onOpenMonitor?: (task: DaemonSessionMonitorTaskStatus, sessionId: string, sessionActions: DaemonSessionActions) => void;
@@ -68,4 +70,4 @@ export interface SplitViewProps {
68
70
  * naturally scopes the keyboard to the pane the user clicks into, so panes never
69
71
  * fight over which session an approval or Enter belongs to.
70
72
  */
71
- export declare function SplitView({ sessionIds, showSessionDetails, onPanesChange, onAssistantTurnSettled, onPendingPanesChange, onExit, onError, onImageIngestionNotice, onSlashCommand, onOpenGoals, onRightPanelOpen, onOpenMonitor, onPaneArtifactsChange, registerContextUsageControls, onBeforeContextCompress, onOpenContextUsage, messageTurnOutputs, renderPaneHeaderActions, includeOtherWorkspaces, workspaceCwd, restartSseOnPrompt, historyPageSize, voiceUserRevision, voiceWorkspaceRevisions, voiceWorkspaces, sessionWorkflowEnabled, planControlVisible, }: SplitViewProps): import("react/jsx-runtime").JSX.Element;
73
+ export declare function SplitView({ sessionIds, showSessionDetails, onPanesChange, onAssistantTurnSettled, onPendingPanesChange, onExit, onError, onImageIngestionNotice, onSlashCommand, modelManagement, onOpenGoals, onRightPanelOpen, onOpenMonitor, onPaneArtifactsChange, registerContextUsageControls, onBeforeContextCompress, onOpenContextUsage, messageTurnOutputs, renderPaneHeaderActions, includeOtherWorkspaces, workspaceCwd, restartSseOnPrompt, historyPageSize, voiceUserRevision, voiceWorkspaceRevisions, voiceWorkspaces, sessionWorkflowEnabled, planControlVisible, }: SplitViewProps): import("react/jsx-runtime").JSX.Element;
@@ -1,8 +1,10 @@
1
1
  import { type DaemonProductSessionContext } from '@qwen-code/web-shell/daemon-react-sdk';
2
2
  import { type WebShellProps } from '../App';
3
+ import { type WebShellUrlNavigationOptions } from '../navigation';
3
4
  import { type WebShellLanguage } from '../i18n';
4
5
  import { type WebShellTheme } from '../themeContext';
5
6
  interface WorkspaceSessionProviderProps {
7
+ urlNavigation?: WebShellUrlNavigationOptions;
6
8
  sessionId?: string;
7
9
  workspaceId?: string;
8
10
  workspaceCwd?: string;
@@ -4,6 +4,8 @@ import type { WebShellRightPanelItem } from '../../customization';
4
4
  import { type DaemonSessionOwnerSnapshot, type DaemonSessionActions } from '@qwen-code/web-shell/daemon-react-sdk';
5
5
  import { type TurnOutputFileChange, type TurnOutputOpenRequest, type TurnOutputScheduledTask } from './TurnOutputs';
6
6
  import type { EnvironmentAgentTask } from '../panels/EnvironmentPanel';
7
+ import type { WebShellModelManagementOptions } from '../../modelManagement';
8
+ import type { SessionWorkflowProjection } from '../workflow/session-workflow-model';
7
9
  import type { WebPreviewState } from '../preview/web-preview';
8
10
  import type { TrajectoryPageLoader } from '../../trajectory/useTrajectoryWindow';
9
11
  import type { ContextUsageControls } from '../../hooks/useContextUsageControls';
@@ -169,6 +171,16 @@ export type ArtifactPanelTab = (WebPreviewState & {
169
171
  kind: 'workflow';
170
172
  title: string;
171
173
  sessionId?: string;
174
+ } | {
175
+ id: 'turn_calls';
176
+ kind: 'turn_calls';
177
+ title: string;
178
+ sessionId?: string;
179
+ promptLabel?: string;
180
+ /** Id of the turn's leading user message, whose calls this tab lists. */
181
+ turnId: string;
182
+ recordId?: string;
183
+ promptId?: string;
172
184
  };
173
185
  export interface SideTaskListItem {
174
186
  sessionId: string;
@@ -188,6 +200,7 @@ interface ArtifactPanelProps {
188
200
  loading?: boolean;
189
201
  restoring?: boolean;
190
202
  error?: string | null;
203
+ onSelectTurnCallsPrompt?: (turnId: string, recordId?: string, promptId?: string, promptLabel?: string) => void;
191
204
  onSelectTab: (tabId: string) => void;
192
205
  onCloseTab: (tabId: string) => void;
193
206
  onOpenFilePreview: (change: TurnOutputFileChange, workspaceCwd?: string, workspaceId?: string) => void;
@@ -218,6 +231,7 @@ interface ArtifactPanelProps {
218
231
  }>;
219
232
  onSideTaskCreated?: (tabId: string, sessionId: string) => void;
220
233
  onSideTaskTitleChange?: (tabId: string, title: string, fromFirstPrompt?: boolean) => void;
234
+ onSideTaskInitialPromptRefused?: (tabId: string) => void;
221
235
  onNestedRightPanelOpen?: (request: TurnOutputOpenRequest) => void;
222
236
  onNestedArtifactsChange?: (sessionId: string, artifacts: readonly DaemonSessionArtifact[]) => void;
223
237
  onOpenNestedSubagent?: (tool: ACPToolCall, sessionId: string, workspaceCwd?: string) => void;
@@ -227,10 +241,13 @@ interface ArtifactPanelProps {
227
241
  onOpenWorkflowAgent?: (task: EnvironmentAgentTask) => void;
228
242
  onError?: (error: unknown, fallback: string) => void;
229
243
  sessionWorkflowEnabled?: boolean;
244
+ modelManagement?: WebShellModelManagementOptions;
230
245
  workflow?: {
231
246
  todos: readonly TodoItem[];
232
247
  tools: readonly ACPToolCall[];
233
248
  tasks: readonly DaemonSessionTaskStatus[];
249
+ /** Shared per-render projection; also feeds the cockpit and its graph. */
250
+ projection?: SessionWorkflowProjection;
234
251
  artifacts: readonly DaemonSessionArtifact[];
235
252
  selectedTodoId?: string;
236
253
  onSelectedTodoIdChange: (todoId: string | undefined) => void;
@@ -246,5 +263,5 @@ interface ArtifactPanelProps {
246
263
  fullscreen?: boolean;
247
264
  onToggleFullscreen?: () => void;
248
265
  }
249
- export declare function ArtifactPanel({ contextUsageControls, artifacts, tabs, activeTabId, reviewChanges, selectedReviewPath, panelWidth, workspaceCwd, loading, restoring, error, onSelectTab, onCloseTab, onOpenFilePreview, latestReviewAvailable, onOpenLatestReview, onOpenTerminal, onOpenTrajectory, trajectoryTabId, onOpenWebPreview, onWebPreviewChange, items, sideTaskAvailable, sideTasks, sideTasksLoading, onCreateSideTask, onOpenSideTask, onCreateSideTaskSession, onSideTaskCreated, onSideTaskTitleChange, onNestedRightPanelOpen, onNestedArtifactsChange, onOpenNestedSubagent, agentTasks, agentTraceLoading, agentTraceError, onOpenWorkflowAgent, onError, sessionWorkflowEnabled, workflow, onImageIngestionNotice, deferSubagentMount, onClose, variant, fullscreen, onToggleFullscreen, }: ArtifactPanelProps): import("react/jsx-runtime").JSX.Element;
266
+ export declare function ArtifactPanel({ contextUsageControls, artifacts, tabs, activeTabId, reviewChanges, selectedReviewPath, panelWidth, workspaceCwd, loading, restoring, error, onSelectTab, onSelectTurnCallsPrompt, onCloseTab, onOpenFilePreview, latestReviewAvailable, onOpenLatestReview, onOpenTerminal, onOpenTrajectory, trajectoryTabId, onOpenWebPreview, onWebPreviewChange, items, sideTaskAvailable, sideTasks, sideTasksLoading, onCreateSideTask, onOpenSideTask, onCreateSideTaskSession, onSideTaskCreated, onSideTaskTitleChange, onSideTaskInitialPromptRefused, onNestedRightPanelOpen, onNestedArtifactsChange, onOpenNestedSubagent, agentTasks, agentTraceLoading, agentTraceError, onOpenWorkflowAgent, onError, sessionWorkflowEnabled, modelManagement, workflow, onImageIngestionNotice, deferSubagentMount, onClose, variant, fullscreen, onToggleFullscreen, }: ArtifactPanelProps): import("react/jsx-runtime").JSX.Element;
250
267
  export {};
@@ -1,5 +1,6 @@
1
1
  import type { TurnOutputOpenRequest } from './TurnOutputs';
2
2
  import type { DaemonSessionArtifact } from '@qwen-code/sdk/daemon';
3
+ import { type WebShellModelManagementOptions } from '../../modelManagement';
3
4
  interface SideTaskPanelProps {
4
5
  tabId: string;
5
6
  sessionId?: string;
@@ -18,7 +19,10 @@ interface SideTaskPanelProps {
18
19
  onArtifactsChange?: (sessionId: string, artifacts: readonly DaemonSessionArtifact[]) => void;
19
20
  onError?: (error: unknown, fallback: string) => void;
20
21
  sessionWorkflowEnabled?: boolean;
22
+ modelManagement?: WebShellModelManagementOptions;
21
23
  onImageIngestionNotice?: (tone: 'warning' | 'error', message: string) => void;
24
+ /** Policy refused the stored initial prompt; the parent drops it from the tab. */
25
+ onInitialPromptRefused?: (tabId: string) => void;
22
26
  }
23
- export declare function SideTaskPanel({ tabId, sessionId, parentSessionId, workspaceCwd, title, shouldNameFromFirstPrompt, initialPrompt, createSession, onCreated, onTitleChange, onRightPanelOpen, onArtifactsChange, onError, sessionWorkflowEnabled, onImageIngestionNotice, }: SideTaskPanelProps): import("react/jsx-runtime").JSX.Element;
27
+ export declare function SideTaskPanel({ tabId, sessionId, parentSessionId, workspaceCwd, title, shouldNameFromFirstPrompt, initialPrompt, createSession, onCreated, onTitleChange, onRightPanelOpen, onArtifactsChange, onError, sessionWorkflowEnabled, modelManagement, onImageIngestionNotice, onInitialPromptRefused, }: SideTaskPanelProps): import("react/jsx-runtime").JSX.Element;
24
28
  export {};
@@ -0,0 +1,71 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Qwen Team
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { TimelineMode, TimelineModel, TimelineSpan } from '../../trajectory/buildTimeline';
7
+ import { type TimelineRange } from '../../trajectory/timelineRange';
8
+ /**
9
+ * The strip's height, which never changes. It sits above the table as a flex
10
+ * sibling of the scrolled rows, so any change in its height would move every
11
+ * row the reader is looking at. Loading, empty and drawn states all fill the
12
+ * same box.
13
+ */
14
+ export declare const OVERVIEW_HEIGHT = 64;
15
+ /**
16
+ * How far the pointer has to travel before a press becomes a drag. Below it
17
+ * the press is a click, which selects the span under it — a hand that wobbles
18
+ * a pixel while clicking a 3px bar must not turn the click into a range.
19
+ */
20
+ export declare const DRAG_THRESHOLD_PX = 4;
21
+ export interface TrajectoryOverviewProps {
22
+ model: TimelineModel | undefined;
23
+ /** Shown inside the box when there is no model to draw. */
24
+ notice?: string;
25
+ selectedKey?: string;
26
+ onSelect: (rowKey: string) => void;
27
+ /** Hover text for one span; the table owns how a row is named. */
28
+ describe: (span: TimelineSpan) => string;
29
+ /** The committed time selection, in the model's domain. */
30
+ range?: TimelineRange;
31
+ /**
32
+ * A drag commits a range; a click on empty track, a right click, or any
33
+ * other way of clearing it reports `undefined`.
34
+ */
35
+ onRangeChange: (range: TimelineRange | undefined) => void;
36
+ /**
37
+ * Ask for the other way of laying out time. The mode in force is the
38
+ * model's own, so the strip can never draw one mode under the other's label.
39
+ */
40
+ onModeChange: (mode: TimelineMode) => void;
41
+ }
42
+ /** Percentages as CSS lengths, rounded so tests can name them exactly. */
43
+ export declare function percent(value: number): string;
44
+ /**
45
+ * Percentages of the whole run, for what is drawn inside the zoomable layer.
46
+ *
47
+ * Not rounded like `percent`: these resolve against the layer, which is up to
48
+ * `MAX_ZOOM_RATIO` track widths wide, so any rounding is magnified by the zoom
49
+ * — three decimals was 75px on a long run at the limit, enough to draw a span
50
+ * over the time of its neighbour. Eight decimals is under a thousandth of a
51
+ * pixel at the limit, and fixed notation keeps tiny values from printing as
52
+ * `1e-7`, which CSS would reject.
53
+ */
54
+ export declare function exactPercent(value: number): string;
55
+ /**
56
+ * A point on the axis, as precise as the stretch in view needs.
57
+ *
58
+ * `formatDuration` rounds to a tenth of a second under a minute and to whole
59
+ * seconds above it, which is right for a run's total but not for the ends of
60
+ * a 20ms window: both ends would print the same. The precision here follows
61
+ * the window instead, about a tenth of its length.
62
+ */
63
+ export declare function formatWindowTime(ms: number, windowMs: number): string;
64
+ /**
65
+ * A moment on a real-time axis, as a local clock reading with as many
66
+ * fractional digits as the stretch in view needs: whole seconds for ten
67
+ * seconds and more, then one digit per tenfold narrower window, down to
68
+ * milliseconds.
69
+ */
70
+ export declare function formatClockTime(epochMs: number, windowMs: number, language: string): string;
71
+ export declare function TrajectoryOverview({ model, notice, selectedKey, onSelect, describe, range, onRangeChange, onModeChange, }: TrajectoryOverviewProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,9 @@
1
+ import type { OpenTurnCalls } from '../../turnCallsContext';
2
+ export declare function TurnCallPromptSelect({ recordId, promptId, label, refreshKey, onSelect, onLoadError, }: {
3
+ recordId?: string;
4
+ promptId?: string;
5
+ label?: string;
6
+ refreshKey: number;
7
+ onSelect?: OpenTurnCalls;
8
+ onLoadError: (failed: boolean) => void;
9
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,38 @@
1
+ import type { DaemonToolTranscriptBlock, DaemonTranscriptBlock } from '@qwen-code/sdk/daemon';
2
+ import type { ACPToolCall } from '../../adapters/types';
3
+ import type { TurnOutputOpenRequest } from './TurnOutputs';
4
+ import { type OpenTurnCalls } from '../../turnCallsContext';
5
+ export interface TurnCallRow {
6
+ block: DaemonToolTranscriptBlock;
7
+ /** 0 for a top-level call, 1 for a call made by a sub-agent, and so on. */
8
+ depth: number;
9
+ durationMs?: number;
10
+ startedAt?: number;
11
+ recordedStatus?: string;
12
+ live?: true;
13
+ }
14
+ /**
15
+ * The tool calls one turn made, in execution order, each with its nesting depth.
16
+ *
17
+ * `turnId` is the id of the turn's leading user message, which is also the id of
18
+ * that user's transcript block — the same turn identity the transcript's own
19
+ * per-turn grouping uses. A turn's calls are therefore the tool blocks between
20
+ * that block and the next user block. That keeps the panel working for a turn
21
+ * which is still running, and it does not depend on a per-turn stamp landing on
22
+ * tool blocks.
23
+ *
24
+ * A call whose parent is not part of the turn is treated as top-level rather
25
+ * than guessed into a parent.
26
+ */
27
+ export declare function collectTurnCallRows(blocks: readonly DaemonTranscriptBlock[], turnId: string | undefined, promptId?: string): TurnCallRow[];
28
+ export declare function TurnCallsPanel({ turnId, ownerSessionId, recordId, promptId, promptLabel, onSelectPrompt, workspaceCwd, onOpenFile, onOpenAgent, }: {
29
+ turnId: string;
30
+ ownerSessionId?: string;
31
+ recordId?: string;
32
+ promptId?: string;
33
+ promptLabel?: string;
34
+ onSelectPrompt?: OpenTurnCalls;
35
+ onOpenAgent?: (tool: ACPToolCall, sessionId: string, workspaceCwd?: string) => void;
36
+ workspaceCwd?: string;
37
+ onOpenFile?: (request: TurnOutputOpenRequest) => void;
38
+ }): import("react/jsx-runtime").JSX.Element | null;
@@ -97,7 +97,12 @@ export type TurnOutputOpenRequest = ({
97
97
  /** Session whose transcript produced this output. */
98
98
  sourceSessionId?: string;
99
99
  };
100
+ export type ArtifactFilter = (artifact: DaemonSessionArtifact, context: {
101
+ turnId: string;
102
+ sourceSessionId?: string;
103
+ }) => boolean;
100
104
  interface TurnOutputsProps {
105
+ sourceSessionId?: string;
101
106
  turnId: string;
102
107
  changes: readonly TurnOutputFileChange[];
103
108
  artifacts: readonly DaemonSessionArtifact[];
@@ -109,7 +114,7 @@ interface TurnOutputsProps {
109
114
  onOpenScheduledTask: (task: TurnOutputScheduledTask) => void;
110
115
  onError?: (error: unknown, fallback: string) => void;
111
116
  }
112
- declare function TurnOutputsComponent({ turnId, changes, artifacts, scheduledTasks, workspaceCwd, onOpenRequest, onReviewChanges, onOpenArtifact, onOpenScheduledTask, onError, }: TurnOutputsProps): import("react/jsx-runtime").JSX.Element | null;
117
+ declare function TurnOutputsComponent({ turnId, changes, artifacts: allArtifacts, sourceSessionId, scheduledTasks, workspaceCwd, onOpenRequest, onReviewChanges, onOpenArtifact, onOpenScheduledTask, onError, }: TurnOutputsProps): import("react/jsx-runtime").JSX.Element | null;
113
118
  export declare const TurnOutputs: import("react").MemoExoticComponent<typeof TurnOutputsComponent>;
114
119
  export declare function getArtifactPreviewContent(artifact: DaemonSessionArtifact, changes: readonly TurnOutputFileChange[], workspaceCwd?: string): string | undefined;
115
120
  export declare function getFileChangePreviewContent(change: TurnOutputFileChange): string | undefined;
@@ -0,0 +1,4 @@
1
+ import type { DaemonSessionToolCalls, DaemonToolTranscriptBlock } from '@qwen-code/sdk/daemon';
2
+ import type { TrajectoryToolRow } from '../../trajectory/types';
3
+ export declare function loadTurnCalls(readCalls: () => Promise<DaemonSessionToolCalls>, recordId: string): Promise<TrajectoryToolRow[]>;
4
+ export declare function toolCallDepths(blocks: readonly DaemonToolTranscriptBlock[]): Map<string, number>;
@@ -4,7 +4,9 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import type { DaemonChannelInstanceSnapshot, DaemonChannelSecretUpdate, DaemonChannelTypeDescriptor, DaemonChannelUpsertRequest } from '@qwen-code/sdk/daemon';
7
- export type ChannelSenderPolicy = 'pairing' | 'open' | '';
7
+ export type ChannelPrivatePolicy = 'disabled' | 'allowlist' | 'pairing' | 'open' | '';
8
+ /** `groups["*"].senders`; `''` means the config leaves it unset. */
9
+ export type ChannelGroupSenders = 'open' | 'allowlist' | '';
8
10
  export interface ChannelSecretDraft {
9
11
  operation: DaemonChannelSecretUpdate['operation'];
10
12
  value?: string;
@@ -13,13 +15,17 @@ export interface ChannelEditorDraft {
13
15
  name: string;
14
16
  values: Record<string, string | boolean>;
15
17
  secrets: Record<string, ChannelSecretDraft>;
16
- senderPolicy: ChannelSenderPolicy;
18
+ privatePolicy: ChannelPrivatePolicy;
17
19
  allowedGroupIds: string;
20
+ groupSenders: ChannelGroupSenders;
21
+ groupAllowedUsers: string;
18
22
  }
19
23
  export type ChannelEditorValidationCode = 'required' | 'credential' | 'duplicate' | 'invalid' | 'invalidGroupId' | 'invalidOption' | 'number' | 'outOfRange' | 'policy';
20
24
  export type ChannelEditorValidationErrors = Record<string, ChannelEditorValidationCode>;
21
- export declare function hasDescriptorSenderPolicy(descriptor: DaemonChannelTypeDescriptor): boolean;
25
+ export declare function hasDescriptorPrivatePolicy(descriptor: DaemonChannelTypeDescriptor): boolean;
22
26
  export declare function hasDescriptorGroupPolicy(descriptor: DaemonChannelTypeDescriptor): boolean;
27
+ export declare function defaultGroupSenders(): Exclude<ChannelGroupSenders, ''>;
28
+ export declare function configuredPrivatePolicy(instance?: DaemonChannelInstanceSnapshot): string;
23
29
  export declare function createChannelEditorDraft(descriptor: DaemonChannelTypeDescriptor, instance?: DaemonChannelInstanceSnapshot): ChannelEditorDraft;
24
30
  export declare function validateChannelEditorDraft(descriptor: DaemonChannelTypeDescriptor, draft: ChannelEditorDraft, existingNames: readonly string[]): ChannelEditorValidationErrors;
25
31
  export declare function buildChannelUpsertRequest(descriptor: DaemonChannelTypeDescriptor, draft: ChannelEditorDraft, expectedRevision: string, instance?: DaemonChannelInstanceSnapshot): DaemonChannelUpsertRequest;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Qwen Team
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export declare function useConversationSearchI18n(): (key: string, vars?: Record<string, string | number>) => string;