diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index e1640d3f2a..f1165f8d67 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -1542,6 +1542,56 @@ export const webviewMessageHandler = async ( } break } + case "submitEditedSubtask": { + // Handle editing of subtask instructions + const currentCline = provider.getCurrentTask() + if (currentCline && message.messageTs && message.editedSubtaskContent) { + // Find the message with the newTask tool + const messageIndex = currentCline.clineMessages.findIndex( + (msg: ClineMessage) => msg.ts === message.messageTs, + ) + + if (messageIndex !== -1) { + const targetMessage = currentCline.clineMessages[messageIndex] + + // Parse the tool content to update it + if (targetMessage.ask === "tool" && targetMessage.text) { + try { + const tool = JSON.parse(targetMessage.text) + if (tool.tool === "newTask") { + // Update the content with the edited subtask instructions + tool.content = message.editedSubtaskContent + + // Update the message with the new content + currentCline.clineMessages[messageIndex].text = JSON.stringify(tool) + + // Save the updated messages + await saveTaskMessages({ + messages: currentCline.clineMessages, + taskId: currentCline.taskId, + globalStoragePath: provider.contextProxy.globalStorageUri.fsPath, + }) + + // Update the UI to reflect the changes + await provider.postStateToWebview() + + // Now approve the subtask with the edited content + // This simulates the user clicking "Approve" after editing + currentCline.handleWebviewAskResponse("yesButtonClicked") + } + } catch (error) { + console.error("Error updating subtask instructions:", error) + vscode.window.showErrorMessage( + t("common:errors.message.error_editing_subtask", { + error: error instanceof Error ? error.message : String(error), + }), + ) + } + } + } + } + break + } case "hasOpenedModeSelector": await updateGlobalState("hasOpenedModeSelector", message.bool ?? true) diff --git a/src/shared/WebviewMessage.ts b/src/shared/WebviewMessage.ts index a2ae6b199d..e2e8226e86 100644 --- a/src/shared/WebviewMessage.ts +++ b/src/shared/WebviewMessage.ts @@ -94,6 +94,7 @@ export interface WebviewMessage { | "deleteMessageConfirm" | "submitEditedMessage" | "editMessageConfirm" + | "submitEditedSubtask" | "enableMcpServerCreation" | "remoteControlEnabled" | "taskSyncEnabled" @@ -181,6 +182,7 @@ export interface WebviewMessage { | "requestClaudeCodeRateLimits" text?: string editedMessageContent?: string + editedSubtaskContent?: string tab?: "settings" | "history" | "mcp" | "modes" | "chat" | "marketplace" | "cloud" disabled?: boolean context?: string diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index e6fd26a380..44f1f05cc5 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -174,6 +174,10 @@ export const ChatRowContent = ({ const [editMode, setEditMode] = useState(mode || "code") const [editImages, setEditImages] = useState([]) + // State for editing subtask instructions + const [isEditingSubtask, setIsEditingSubtask] = useState(false) + const [editedSubtaskContent, setEditedSubtaskContent] = useState("") + // Handle message events for image selection during edit mode useEffect(() => { const handleMessage = (event: MessageEvent) => { @@ -792,6 +796,30 @@ export const ChatRowContent = ({ ) case "newTask": + // Handle edit button click for subtask + const handleEditSubtaskClick = () => { + setIsEditingSubtask(true) + setEditedSubtaskContent(tool.content || "") + } + + // Handle cancel edit for subtask + const handleCancelEditSubtask = () => { + setIsEditingSubtask(false) + setEditedSubtaskContent(tool.content || "") + } + + // Handle save edit for subtask + const handleSaveEditSubtask = () => { + setIsEditingSubtask(false) + // Send edited subtask content to backend + vscode.postMessage({ + type: "submitEditedSubtask", + messageTs: message.ts, + editedSubtaskContent: editedSubtaskContent, + mode: tool.mode, + }) + } + return ( <>
@@ -805,6 +833,7 @@ export const ChatRowContent = ({
- - {t("chat:subtasks.newTaskContent")} +
+ + {t("chat:subtasks.newTaskContent")} +
+ {/* Edit button for subtask instructions */} + {message.type === "ask" && !isStreaming && !isEditingSubtask && ( +
{ + e.stopPropagation() + handleEditSubtaskClick() + }} + title={t("chat:editSubtaskInstructions")} + style={{ + padding: "2px 4px", + borderRadius: "3px", + display: "flex", + alignItems: "center", + gap: "4px", + }}> + +
+ )}
- + {isEditingSubtask ? ( +
+