diff --git a/packages/vscode-ide-companion/package.json b/packages/vscode-ide-companion/package.json index c29059dc..1fcf35b3 100644 --- a/packages/vscode-ide-companion/package.json +++ b/packages/vscode-ide-companion/package.json @@ -65,16 +65,6 @@ "title": "Qwen Code: Login" } ], - "configuration": { - "title": "Qwen Code", - "properties": { - "qwenCode.useTerminal": { - "type": "boolean", - "default": "false", - "description": "Use terminal to run Qwen Code" - } - } - }, "menus": { "commandPalette": [ { diff --git a/packages/vscode-ide-companion/src/commands/index.ts b/packages/vscode-ide-companion/src/commands/index.ts index 22262752..e75e1bd1 100644 --- a/packages/vscode-ide-companion/src/commands/index.ts +++ b/packages/vscode-ide-companion/src/commands/index.ts @@ -21,24 +21,12 @@ export function registerNewCommands( disposables.push( vscode.commands.registerCommand(openChatCommand, async () => { - const config = vscode.workspace.getConfiguration('qwenCode'); - const useTerminal = config.get('useTerminal', false); - - // Use terminal mode - if (useTerminal) { - await vscode.commands.executeCommand( - runQwenCodeCommand, - vscode.TerminalLocation.Editor, // create a terminal in the editor area, - ); + const providers = getWebViewProviders(); + if (providers.length > 0) { + await providers[providers.length - 1].show(); } else { - // Use WebView mode - const providers = getWebViewProviders(); - if (providers.length > 0) { - await providers[providers.length - 1].show(); - } else { - const provider = createWebViewProvider(); - await provider.show(); - } + const provider = createWebViewProvider(); + await provider.show(); } }), ); diff --git a/packages/vscode-ide-companion/src/diff-manager.ts b/packages/vscode-ide-companion/src/diff-manager.ts index bc14adc0..8abc7315 100644 --- a/packages/vscode-ide-companion/src/diff-manager.ts +++ b/packages/vscode-ide-companion/src/diff-manager.ts @@ -165,48 +165,6 @@ export class DiffManager { const normalizedPath = path.normalize(filePath); const key = this.makeKey(normalizedPath, oldContent, newContent); - // TODO: - // // Suppress entirely when the extension indicates diffs should not be shown - // if (this.shouldSuppress && this.shouldSuppress()) { - // this.log(`showDiff suppressed by policy for ${filePath}`); - // return; - // } - - // // Suppress during timed window - // if (this.suppressUntil && Date.now() < this.suppressUntil) { - // this.log(`showDiff suppressed by timed window for ${filePath}`); - // return; - // } - - // // If permission drawer is currently open, delay to avoid double-open - // if (this.shouldDelay && this.shouldDelay()) { - // if (!this.pendingDelayTimers.has(key)) { - // const timer = setTimeout(() => { - // this.pendingDelayTimers.delete(key); - // // Fire and forget; rely on dedupe below to avoid double focus - // void this.showDiff(filePath, oldContent, newContent); - // }, 300); - // this.pendingDelayTimers.set(key, timer); - // } - // return; - // } - - // // If a diff tab for the same file is already open, update its content instead of opening a new one - // for (const [, diffInfo] of this.diffDocuments.entries()) { - // if (diffInfo.originalFilePath === normalizedPath) { - // // Update left/right contents - // this.diffContentProvider.setContent(diffInfo.leftDocUri, oldContent); - // this.diffContentProvider.setContent(diffInfo.rightDocUri, newContent); - // // Update stored snapshot for future comparisons - // diffInfo.oldContent = oldContent; - // diffInfo.newContent = newContent; - // this.recentlyShown.set(key, Date.now()); - // // Soft focus existing (preserve chat focus) - // await this.focusExistingDiff(normalizedPath); - // return; - // } - // } - // Check if a diff view with the same content already exists if (this.hasExistingDiff(normalizedPath, oldContent, newContent)) { const last = this.recentlyShown.get(key) || 0; diff --git a/packages/vscode-ide-companion/src/services/qwenAgentManager.ts b/packages/vscode-ide-companion/src/services/qwenAgentManager.ts index d8d136c0..271416db 100644 --- a/packages/vscode-ide-companion/src/services/qwenAgentManager.ts +++ b/packages/vscode-ide-companion/src/services/qwenAgentManager.ts @@ -16,7 +16,7 @@ import type { PlanEntry, ToolCallUpdateData, QwenAgentCallbacks, -} from '../types/qwenTypes.js'; +} from '../types/chatTypes.js'; import { QwenConnectionHandler } from '../services/qwenConnectionHandler.js'; import { QwenSessionUpdateHandler } from './qwenSessionUpdateHandler.js'; import { CliContextManager } from '../cli/cliContextManager.js'; diff --git a/packages/vscode-ide-companion/src/services/qwenSessionUpdateHandler.ts b/packages/vscode-ide-companion/src/services/qwenSessionUpdateHandler.ts index db0023e5..dba6180e 100644 --- a/packages/vscode-ide-companion/src/services/qwenSessionUpdateHandler.ts +++ b/packages/vscode-ide-companion/src/services/qwenSessionUpdateHandler.ts @@ -11,7 +11,7 @@ */ import type { AcpSessionUpdate, ApprovalModeValue } from '../types/acpTypes.js'; -import type { QwenAgentCallbacks } from '../types/qwenTypes.js'; +import type { QwenAgentCallbacks } from '../types/chatTypes.js'; /** * Qwen Session Update Handler class diff --git a/packages/vscode-ide-companion/src/types/qwenTypes.ts b/packages/vscode-ide-companion/src/types/chatTypes.ts similarity index 100% rename from packages/vscode-ide-companion/src/types/qwenTypes.ts rename to packages/vscode-ide-companion/src/types/chatTypes.ts diff --git a/packages/vscode-ide-companion/src/webview/App.tsx b/packages/vscode-ide-companion/src/webview/App.tsx index e0e44fae..61d35867 100644 --- a/packages/vscode-ide-companion/src/webview/App.tsx +++ b/packages/vscode-ide-companion/src/webview/App.tsx @@ -31,7 +31,6 @@ import { hasToolCallOutput } from './components/messages/toolcalls/shared/utils. import { EmptyState } from './components/layout/EmptyState.js'; import { type CompletionItem } from '../types/completionItemTypes.js'; import { useCompletionTrigger } from './hooks/useCompletionTrigger.js'; -import { InfoBanner } from './components/layout/InfoBanner.js'; import { ChatHeader } from './components/layout/ChatHeader.js'; import { UserMessage, @@ -43,8 +42,8 @@ import { import { InputForm } from './components/layout/InputForm.js'; import { SessionSelector } from './components/layout/SessionSelector.js'; import { FileIcon, UserIcon } from './components/icons/index.js'; -import type { EditMode } from '../types/qwenTypes.js'; -import type { PlanEntry } from '../types/qwenTypes.js'; +import type { EditMode } from '../types/chatTypes.js'; +import type { PlanEntry } from '../types/chatTypes.js'; export const App: React.FC = () => { const vscode = useVSCode(); @@ -77,16 +76,7 @@ export const App: React.FC = () => { const inputFieldRef = useRef( null, ) as React.RefObject; - // Persist the dismissal of the info banner across webview reloads - // Use VS Code webview state to avoid flicker on first render. - const [showBanner, setShowBanner] = useState(() => { - try { - const state = (vscode.getState?.() as Record) || {}; - return state.infoBannerDismissed !== true; // show unless explicitly dismissed - } catch { - return true; - } - }); + const [editMode, setEditMode] = useState('ask'); const [thinkingEnabled, setThinkingEnabled] = useState(false); const [isComposing, setIsComposing] = useState(false); @@ -691,24 +681,6 @@ export const App: React.FC = () => { )} - { - setShowBanner(false); - // merge with existing webview state so we don't clobber other keys - try { - const prev = (vscode.getState?.() as Record) || {}; - vscode.setState?.({ ...prev, infoBannerDismissed: true }); - } catch { - /* no-op */ - } - }} - onLinkClick={(e) => { - e.preventDefault(); - vscode.postMessage({ type: 'openSettings', data: {} }); - }} - /> - { - console.log('[WebViewProvider] Creating new session in current panel'); - - // Check if terminal mode is enabled - const config = vscode.workspace.getConfiguration('qwenCode'); - const useTerminal = config.get('useTerminal', false); - - if (useTerminal) { - // In terminal mode, execute the runQwenCode command to open a new terminal - try { - await vscode.commands.executeCommand(runQwenCodeCommand); - console.log('[WebViewProvider] Opened new terminal session'); - } catch (_error) { - console.error( - '[WebViewProvider] Failed to open new terminal session:', - _error, - ); - vscode.window.showErrorMessage( - `Failed to open new terminal session: ${_error}`, - ); - } - return; - } - // WebView mode - create new session via agent manager try { const workspaceFolder = vscode.workspace.workspaceFolders?.[0]; diff --git a/packages/vscode-ide-companion/src/webview/components/layout/InfoBanner.tsx b/packages/vscode-ide-companion/src/webview/components/layout/InfoBanner.tsx deleted file mode 100644 index 4aad6534..00000000 --- a/packages/vscode-ide-companion/src/webview/components/layout/InfoBanner.tsx +++ /dev/null @@ -1,109 +0,0 @@ -/** - * @license - * Copyright 2025 Qwen Team - * SPDX-License-Identifier: Apache-2.0 - */ - -import type React from 'react'; -import { TerminalIcon, CloseIcon } from '../icons/index.js'; - -interface InfoBannerProps { - /** - * Whether the banner is visible - */ - visible: boolean; - - /** - * Callback when the banner is dismissed - */ - onDismiss: () => void; - - /** - * Optional: Custom message content (if not provided, uses default) - */ - message?: React.ReactNode; - - /** - * Optional: Custom link text - */ - linkText?: string; - - /** - * Optional: Callback when the link is clicked - */ - onLinkClick?: (e: React.MouseEvent) => void; -} - -export const InfoBanner: React.FC = ({ - visible, - onDismiss, - message, - linkText = 'Switch back in Settings.', - onLinkClick, -}) => { - if (!visible) { - return null; - } - - return ( -
-
- {/* Icon */} - - - {/* Message */} - -
- - {/* Close button */} - -
- ); -}; diff --git a/packages/vscode-ide-companion/src/webview/components/layout/InputForm.tsx b/packages/vscode-ide-companion/src/webview/components/layout/InputForm.tsx index eba3e376..836de2fc 100644 --- a/packages/vscode-ide-companion/src/webview/components/layout/InputForm.tsx +++ b/packages/vscode-ide-companion/src/webview/components/layout/InputForm.tsx @@ -19,7 +19,7 @@ import { } from '../icons/index.js'; import { CompletionMenu } from '../layout/CompletionMenu.js'; import type { CompletionItem } from '../../../types/completionItemTypes.js'; -import type { EditMode } from '../../../types/qwenTypes.js'; +import type { EditMode } from '../../../types/chatTypes.js'; interface InputFormProps { inputText: string; diff --git a/packages/vscode-ide-companion/src/webview/components/messages/toolcalls/UpdatedPlan/UpdatedPlanToolCall.tsx b/packages/vscode-ide-companion/src/webview/components/messages/toolcalls/UpdatedPlan/UpdatedPlanToolCall.tsx index a8373887..70e38bd7 100644 --- a/packages/vscode-ide-companion/src/webview/components/messages/toolcalls/UpdatedPlan/UpdatedPlanToolCall.tsx +++ b/packages/vscode-ide-companion/src/webview/components/messages/toolcalls/UpdatedPlan/UpdatedPlanToolCall.tsx @@ -11,7 +11,7 @@ import type { BaseToolCallProps } from '../shared/types.js'; import type { ToolCallContainerProps } from '../shared/LayoutComponents.js'; import { groupContent, safeTitle } from '../shared/utils.js'; import { CheckboxDisplay } from './CheckboxDisplay.js'; -import type { PlanEntry } from '../../../../../types/qwenTypes.js'; +import type { PlanEntry } from '../../../../../types/chatTypes.js'; type EntryStatus = 'pending' | 'in_progress' | 'completed'; diff --git a/packages/vscode-ide-companion/src/webview/hooks/useToolCalls.ts b/packages/vscode-ide-companion/src/webview/hooks/useToolCalls.ts index faf1cac4..1b994afd 100644 --- a/packages/vscode-ide-companion/src/webview/hooks/useToolCalls.ts +++ b/packages/vscode-ide-companion/src/webview/hooks/useToolCalls.ts @@ -6,7 +6,7 @@ import { useState, useCallback } from 'react'; import type { ToolCallData } from '../components/messages/toolcalls/ToolCall.js'; -import type { ToolCallUpdate } from '../../types/qwenTypes.js'; +import type { ToolCallUpdate } from '../../types/chatTypes.js'; /** * Tool call management Hook diff --git a/packages/vscode-ide-companion/src/webview/hooks/useWebViewMessages.ts b/packages/vscode-ide-companion/src/webview/hooks/useWebViewMessages.ts index e94e1645..1e93891d 100644 --- a/packages/vscode-ide-companion/src/webview/hooks/useWebViewMessages.ts +++ b/packages/vscode-ide-companion/src/webview/hooks/useWebViewMessages.ts @@ -11,8 +11,8 @@ import type { PermissionOption, ToolCall as PermissionToolCall, } from '../components/PermissionDrawer/PermissionRequest.js'; -import type { ToolCallUpdate, EditMode } from '../../types/qwenTypes.js'; -import type { PlanEntry } from '../../types/qwenTypes.js'; +import type { ToolCallUpdate, EditMode } from '../../types/chatTypes.js'; +import type { PlanEntry } from '../../types/chatTypes.js'; interface UseWebViewMessagesProps { // Session management