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 */}
)}
{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);