diff --git a/src/ClaudeDev.ts b/src/ClaudeDev.ts index 9fa8aa6..f8fc649 100644 --- a/src/ClaudeDev.ts +++ b/src/ClaudeDev.ts @@ -547,7 +547,7 @@ export class ClaudeDev { } } catch (e) { if ((e as ExecaError).signal === "SIGINT") { - const line = `\nUser exited command early...` + const line = `\nUser exited command...` await this.say("command_output", line) result += line } else { diff --git a/webview-ui/src/components/ChatRow.tsx b/webview-ui/src/components/ChatRow.tsx index 1166874..ed974fa 100644 --- a/webview-ui/src/components/ChatRow.tsx +++ b/webview-ui/src/components/ChatRow.tsx @@ -12,7 +12,8 @@ interface ChatRowProps { syntaxHighlighterStyle: SyntaxHighlighterStyle isExpanded: boolean onToggleExpand: () => void - apiRequestFailedMessage?: string + lastModifiedMessage?: ClaudeMessage + isLast: boolean } const ChatRow: React.FC = ({ @@ -20,15 +21,37 @@ const ChatRow: React.FC = ({ syntaxHighlighterStyle, isExpanded, onToggleExpand, - apiRequestFailedMessage, + lastModifiedMessage, + isLast, }) => { const cost = message.text != null && message.say === "api_req_started" ? JSON.parse(message.text).cost : undefined + const apiRequestFailedMessage = + isLast && lastModifiedMessage?.ask === "api_req_failed" // if request is retried then the latest message is a api_req_retried + ? lastModifiedMessage?.text + : undefined + const isCommandExecuting = + isLast && lastModifiedMessage?.ask === "command" && lastModifiedMessage?.text?.includes(COMMAND_OUTPUT_STRING) const getIconAndTitle = (type: ClaudeAsk | ClaudeSay | undefined): [JSX.Element | null, JSX.Element | null] => { const normalColor = "var(--vscode-foreground)" const errorColor = "var(--vscode-errorForeground)" const successColor = "var(--vscode-testing-iconPassed)" + const ProgressIndicator = ( +
+
+ +
+
+ ) + switch (type) { case "request_limit_reached": return [ @@ -46,9 +69,13 @@ const ChatRow: React.FC = ({ ] case "command": return [ - , + isCommandExecuting ? ( + ProgressIndicator + ) : ( + + ), Claude wants to execute this command: , @@ -71,18 +98,7 @@ const ChatRow: React.FC = ({ className="codicon codicon-error" style={{ color: errorColor, marginBottom: "-1.5px" }}> ) : ( -
-
- -
-
+ ProgressIndicator ), cost ? ( API Request Complete @@ -92,6 +108,13 @@ const ChatRow: React.FC = ({ Making API Request... ), ] + case "followup": + return [ + , + Claude has a question:, + ] default: return [null, null] } diff --git a/webview-ui/src/components/ChatView.tsx b/webview-ui/src/components/ChatView.tsx index b444bda..646e115 100644 --- a/webview-ui/src/components/ChatView.tsx +++ b/webview-ui/src/components/ChatView.tsx @@ -112,7 +112,7 @@ const ChatView = ({ messages, isHidden, vscodeThemeName, showAnnouncement, hideA setTextAreaDisabled(false) setClaudeAsk("command_output") setEnableButtons(true) - setPrimaryButtonText("Exit Command Early") + setPrimaryButtonText("Exit Command") setSecondaryButtonText(undefined) break case "completion_result": @@ -394,11 +394,8 @@ const ChatView = ({ messages, isHidden, vscodeThemeName, showAnnouncement, hideA syntaxHighlighterStyle={syntaxHighlighterStyle} isExpanded={expandedRows[message.ts] || false} onToggleExpand={() => toggleRowExpansion(message.ts)} - apiRequestFailedMessage={ - index === visibleMessages.length - 1 && modifiedMessages.at(-1)?.ask === "api_req_failed" // if request is retried then the latest message is a api_req_retried - ? modifiedMessages.at(-1)?.text - : undefined - } + lastModifiedMessage={modifiedMessages.at(-1)} + isLast={index === visibleMessages.length - 1} /> )} />