diff --git a/ai-hub/app/core/services/utils/code_change.py b/ai-hub/app/core/services/utils/code_change.py index c6b4569..32a7b2e 100644 --- a/ai-hub/app/core/services/utils/code_change.py +++ b/ai-hub/app/core/services/utils/code_change.py @@ -302,9 +302,9 @@ self._parse_input_data() self.reasoning = review_reasoning # Recursively call process to execute the new plan - await self.process(websocket, round=round+1, title=f"**Round [{round+1} out of {self.max_round}] AI-Generated Post Review Execution Plan:**") + await self.process(websocket, round=round+1, title=f"**Round {round+1} of {self.max_round}: AI's Refined Execution Plan:**") return else: - await self._handle_thinking_log(websocket, f"After {self.max_round} rounds of review, the code still needs further review. Stop it here.") + await self._handle_thinking_log(websocket, f"The code still requires more review after {self.max_round} rounds, so we're stopping the automated process here.") await self._post_process(websocket=websocket) diff --git a/ui/client-app/src/components/ChatArea.css b/ui/client-app/src/components/ChatArea.css index 312e7ae..7481fed 100644 --- a/ui/client-app/src/components/ChatArea.css +++ b/ui/client-app/src/components/ChatArea.css @@ -1,3 +1,5 @@ .chat-area-fixed-height { height: calc(100vh - 72px); /* Subtract input + padding */ } + + \ No newline at end of file diff --git a/ui/client-app/src/components/ChatArea.js b/ui/client-app/src/components/ChatArea.js index b897700..1b5b4c6 100644 --- a/ui/client-app/src/components/ChatArea.js +++ b/ui/client-app/src/components/ChatArea.js @@ -15,6 +15,13 @@ } }; + const handleKeyDown = (e) => { + if (e.key === 'Enter' && !e.shiftKey) { + e.preventDefault(); + handleSendMessage(e); + } + }; + // Scroll chat to bottom on new message useEffect(() => { if (chatScrollRef.current) { @@ -32,15 +39,15 @@ {/* Sticky Input */}
- setInputValue(e.target.value)} + onKeyDown={handleKeyDown} disabled={isProcessing} className="flex-grow p-3 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-indigo-500" placeholder={isProcessing ? "AI is thinking..." : "Type a message..."} - /> + >
)} {message.text} + {message.isPureAnswer && ( +
+ {/* Horizontal line */} +
+
+ {/* Copy Icon - positioned above the bottom line */} + +
+
+ )} {message.code_changes && ( )} diff --git a/ui/client-app/src/components/Controls.js b/ui/client-app/src/components/Controls.js deleted file mode 100644 index 23d960b..0000000 --- a/ui/client-app/src/components/Controls.js +++ /dev/null @@ -1,57 +0,0 @@ -// src/components/Controls.js -import React from "react"; -import { FaMicrophone, FaRegStopCircle } from "react-icons/fa"; - -const Controls = ({ - status, - isBusy, - isRecording, - isAutoMode, - isAutoListening, - onMicClick, - onToggleAutoMode, -}) => { - const micButtonColorClass = isRecording - ? "bg-red-600 hover:bg-red-700 active:bg-red-800" - : "bg-indigo-600 hover:bg-indigo-700 active:bg-indigo-800"; - - const micButtonState = - isAutoMode && isAutoListening ? isAutoListening : isRecording; - - return ( -
-
- {status} -
-
- - -
- -
-
-
- ); -}; - -export default Controls; \ No newline at end of file diff --git a/ui/client-app/src/components/InteractionLog.js b/ui/client-app/src/components/InteractionLog.js index 4d2f31f..9ecb6ea 100644 --- a/ui/client-app/src/components/InteractionLog.js +++ b/ui/client-app/src/components/InteractionLog.js @@ -54,7 +54,7 @@
{ + const micButtonColorClass = isRecording + ? "bg-red-600 hover:bg-red-700 active:bg-red-800" + : "bg-indigo-600 hover:bg-indigo-700 active:bg-indigo-800"; + + const micButtonState = + isAutoMode && isAutoListening ? isAutoListening : isRecording; + + return ( +
+
+ {status} +
+
+ + +
+ +
+
+
+ ); +}; + +export default Controls; \ No newline at end of file diff --git a/ui/client-app/src/hooks/useCodeAssistant.js b/ui/client-app/src/hooks/useCodeAssistant.js index 5d922a8..0cd4324 100644 --- a/ui/client-app/src/hooks/useCodeAssistant.js +++ b/ui/client-app/src/hooks/useCodeAssistant.js @@ -22,6 +22,7 @@ console.log("Received chat message:", message); setChatHistory((prev) => [...prev, { isUser: false, + isPureAnswer: true, text: message.content, dicision: message.dicision, reasoning: message.reasoning @@ -33,12 +34,17 @@ console.log("Received code change:", message); setChatHistory((prev) => [...prev, { isUser: false, + isPureAnswer: false, text: message.content, code_changes: message.code_changes, steps: message.steps, reasoning: message.reasoning }]); if (message.done === true){ + setThinkingProcess((prev) => [...prev,{ + type: "system", + message: "AI processing is complete" + }]) setIsProcessing(false); } else{ setIsProcessing(true); @@ -50,7 +56,6 @@ setThinkingProcess((prev) => [...prev, { type: "remote", message: message.content, - round: message.round }]); }, []); diff --git a/ui/client-app/src/pages/VoiceChatPage.js b/ui/client-app/src/pages/VoiceChatPage.js index 0648634..42572f0 100644 --- a/ui/client-app/src/pages/VoiceChatPage.js +++ b/ui/client-app/src/pages/VoiceChatPage.js @@ -1,7 +1,7 @@ import React, { useState, useRef, useEffect, useCallback } from "react"; import useVoiceChat from "../hooks/useVoiceChat"; import ChatWindow from "../components/ChatWindow"; -import Controls from "../components/Controls"; +import Controls from "../components/VoiceControls"; const VoiceChatPage = ({ Icon }) => { const chatContainerRef = useRef(null);