From 9e76cfd44a4759c2faef9ec6df68d2e0d41d1065 Mon Sep 17 00:00:00 2001 From: Dennis Bartlett Date: Tue, 11 Feb 2025 04:26:35 -0600 Subject: [PATCH 1/3] feat: Add SendMessage capability during Mode Switch --- src/core/Cline.ts | 5 ++-- src/core/webview/ClineProvider.ts | 3 ++- src/shared/ChatContent.ts | 4 +++ src/shared/WebviewMessage.ts | 2 ++ src/test/webview/chat-native.test.ts | 27 ++++++++++++++++++- .../src/components/chat/ChatTextArea.tsx | 6 ++++- 6 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 src/shared/ChatContent.ts diff --git a/src/core/Cline.ts b/src/core/Cline.ts index 127960f073..e088f0073b 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -2707,14 +2707,15 @@ export class Cline { this.isAwaitingPlanResponse = false if (this.didRespondToPlanAskBySwitchingMode) { - // await this.say("user_feedback", text ?? "", images) pushToolResult( formatResponse.toolResult( `[The user has switched to ACT MODE, so you may now proceed with the task.]`, images, ), ) - } else { + } + + if (text) { await this.say("user_feedback", text ?? "", images) pushToolResult(formatResponse.toolResult(`\n${text}\n`, images)) } diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 397e11eb80..6fb3f415ab 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -618,7 +618,8 @@ export class ClineProvider implements vscode.WebviewViewProvider { await this.postMessageToWebview({ type: "invoke", invoke: "sendMessage", - text: "[Proceeding with the task...]", + text: message.chatContent?.message || "[Proceeding with the task...]", + images: message.chatContent?.images, }) } else { this.cancelTask() diff --git a/src/shared/ChatContent.ts b/src/shared/ChatContent.ts new file mode 100644 index 0000000000..fe209de363 --- /dev/null +++ b/src/shared/ChatContent.ts @@ -0,0 +1,4 @@ +export interface ChatContent { + message?: string + images?: string[] +} diff --git a/src/shared/WebviewMessage.ts b/src/shared/WebviewMessage.ts index a18a3c405a..447193dd18 100644 --- a/src/shared/WebviewMessage.ts +++ b/src/shared/WebviewMessage.ts @@ -2,6 +2,7 @@ import { ApiConfiguration } from "./api" import { AutoApprovalSettings } from "./AutoApprovalSettings" import { BrowserSettings } from "./BrowserSettings" import { ChatSettings } from "./ChatSettings" +import { ChatContent } from "./ChatContent" export interface WebviewMessage { type: @@ -53,6 +54,7 @@ export interface WebviewMessage { autoApprovalSettings?: AutoApprovalSettings browserSettings?: BrowserSettings chatSettings?: ChatSettings + chatContent?: ChatContent // For toggleToolAutoApprove serverName?: string diff --git a/src/test/webview/chat-native.test.ts b/src/test/webview/chat-native.test.ts index 775af4b7ae..d3fe630a94 100644 --- a/src/test/webview/chat-native.test.ts +++ b/src/test/webview/chat-native.test.ts @@ -28,7 +28,13 @@ describe("Chat Integration Tests", () => { vscode.postMessage({ type: 'newTask', text: message.text }); break; case 'toggleMode': - vscode.postMessage({ type: 'chatSettings', chatSettings: { mode: 'act' } }); + vscode.postMessage({ + type: 'chatSettings', + chatSettings: { mode: 'act' }, + chatContent: { + message: "message test", + } + }); break; case 'invoke': if (message.invoke === 'primaryButtonClick') { @@ -92,6 +98,25 @@ describe("Chat Integration Tests", () => { assert.equal(stateChange.chatSettings.mode, "act") }) + it("should toggle between plan and act modes with messages", async () => { + // Set up state change listener + const stateChangePromise = new Promise((resolve) => { + panel.webview.onDidReceiveMessage((message) => { + if (message.type === "chatSettings") { + resolve(message) + } + }) + }) + + // Trigger mode toggle + await panel.webview.postMessage({ type: "toggleMode" }) + + // Verify mode changed + const stateChange = await stateChangePromise + assert.equal(stateChange.chatSettings.mode, "act") + assert.equal(stateChange.chatContent.message, "message test") + }) + it("should handle tool approval flow", async () => { // Set up approval listener const approvalPromise = new Promise((resolve) => { diff --git a/webview-ui/src/components/chat/ChatTextArea.tsx b/webview-ui/src/components/chat/ChatTextArea.tsx index 0255ef0301..e86697405f 100644 --- a/webview-ui/src/components/chat/ChatTextArea.tsx +++ b/webview-ui/src/components/chat/ChatTextArea.tsx @@ -616,13 +616,17 @@ const ChatTextArea = forwardRef( chatSettings: { mode: newMode, }, + chatContent: { + message: inputValue.trim() ? inputValue : undefined, + images: selectedImages.length > 0 ? selectedImages : undefined, + }, }) // Focus the textarea after mode toggle with slight delay setTimeout(() => { textAreaRef.current?.focus() }, 100) }, changeModeDelay) - }, [chatSettings.mode, showModelSelector, submitApiConfig]) + }, [chatSettings.mode, showModelSelector, submitApiConfig, inputValue, selectedImages]) useShortcut("Meta+Shift+a", onModeToggle, { disableTextInputs: false }) // important that we don't disable the text input here From 8793c2c6c59713775bd07be36865453d69935d2c Mon Sep 17 00:00:00 2001 From: Dennis Bartlett Date: Tue, 11 Feb 2025 04:29:09 -0600 Subject: [PATCH 2/3] fix: ESLint issue in BrowserSession --- src/services/browser/BrowserSession.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/services/browser/BrowserSession.ts b/src/services/browser/BrowserSession.ts index 14b6ecef8b..183979d92a 100644 --- a/src/services/browser/BrowserSession.ts +++ b/src/services/browser/BrowserSession.ts @@ -43,8 +43,9 @@ export class BrowserSession { } const chromeExecutablePath = vscode.workspace.getConfiguration("cline").get("chromeExecutablePath") - if (chromeExecutablePath && !(await fileExistsAtPath(chromeExecutablePath))) + if (chromeExecutablePath && !(await fileExistsAtPath(chromeExecutablePath))) { throw new Error(`Chrome executable not found at path: ${chromeExecutablePath}`) + } const stats: PCRStats = chromeExecutablePath ? { puppeteer: require("puppeteer-core"), executablePath: chromeExecutablePath } : // if chromium doesn't exist, this will download it to path.join(puppeteerDir, ".chromium-browser-snapshots") From 2a894d8cf14b1702765e4ce4d884ed084b502a51 Mon Sep 17 00:00:00 2001 From: Dennis Bartlett Date: Tue, 11 Feb 2025 04:34:43 -0600 Subject: [PATCH 3/3] Add Changeset --- .changeset/silly-cats-appear.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/silly-cats-appear.md diff --git a/.changeset/silly-cats-appear.md b/.changeset/silly-cats-appear.md new file mode 100644 index 0000000000..6e6925a4c9 --- /dev/null +++ b/.changeset/silly-cats-appear.md @@ -0,0 +1,5 @@ +--- +"claude-dev": minor +--- + +Add new ability to send message that is in Input field during Plan/Act Mode Change to Act.