diff --git a/frontend/src/components/LLMResponse.jsx b/frontend/src/components/LLMResponse.jsx index c62b05b..9c0866a 100644 --- a/frontend/src/components/LLMResponse.jsx +++ b/frontend/src/components/LLMResponse.jsx @@ -35,11 +35,8 @@ export default function LLMResponse({ data, onConfirm, isLastMessage }) { {!requiresConfirm && data.tool && data.next === "confirm" && (
- Agent ran tool: {data.tool ?? "Unknown"} + Agent chose tool: {data.tool ?? "Unknown"}
- {/*
- {JSON.stringify(data, null, 2)} -
*/}
)} diff --git a/frontend/src/pages/App.jsx b/frontend/src/pages/App.jsx index 7e9747d..0272253 100644 --- a/frontend/src/pages/App.jsx +++ b/frontend/src/pages/App.jsx @@ -8,9 +8,10 @@ export default function App() { const containerRef = useRef(null); const inputRef = useRef(null); const [conversation, setConversation] = useState([]); + const [lastMessage, setLastMessage] = useState(null); // New state for tracking the last message const [userInput, setUserInput] = useState(""); const [loading, setLoading] = useState(false); - const [done, setDone] = useState(true); // New `done` state + const [done, setDone] = useState(true); useEffect(() => { // Poll /get-conversation-history every 0.5 seconds @@ -19,16 +20,22 @@ export default function App() { const res = await fetch("http://127.0.0.1:8000/get-conversation-history"); if (res.ok) { const data = await res.json(); - // Update conversation - setConversation(data.messages || []); + const newConversation = data.messages || []; + setConversation(newConversation); - if (data.messages && data.messages.length > 0) { - const lastMessage = data.messages[data.messages.length - 1]; - setLoading(lastMessage.actor !== "agent"); - setDone(lastMessage.response.next === "done"); + if (newConversation.length > 0) { + const lastMsg = newConversation[newConversation.length - 1]; + setLoading(lastMsg.actor !== "agent"); + setDone(lastMsg.response.next === "done"); + + // Only scroll if the last message changes + if (!lastMessage || lastMsg.response.response !== lastMessage.response.response) { + setLastMessage(lastMsg); // Update the last message + } } else { setLoading(false); - setDone(true); // Default to `done` if no messages + setDone(true); + setLastMessage(null); // Clear last message if no messages } } } catch (err) { @@ -37,12 +44,24 @@ export default function App() { }, POLL_INTERVAL); return () => clearInterval(intervalId); - }, []); + }, [lastMessage]); + + useEffect(() => { + if (containerRef.current && lastMessage) { + containerRef.current.scrollTop = containerRef.current.scrollHeight; + } + }, [lastMessage]); // Scroll only when the last message changes + + useEffect(() => { + if (inputRef.current) { + inputRef.current.focus(); // Ensure the input box retains focus + } + }, [userInput, loading, done]); const handleSendMessage = async () => { if (!userInput.trim()) return; try { - setLoading(true); // Mark as loading + setLoading(true); await fetch( `http://127.0.0.1:8000/send-prompt?prompt=${encodeURIComponent(userInput)}`, { method: "POST" } @@ -71,6 +90,7 @@ export default function App() { { method: "POST" } ); setConversation([]); // Clear local state + setLastMessage(null); // Reset last message } catch (err) { console.error("Error ending chat:", err); } @@ -82,58 +102,44 @@ export default function App() { } }; - useEffect(() => { - if (containerRef.current) { - containerRef.current.scrollTop = containerRef.current.scrollHeight; - } - }, [conversation, loading, done]); - - useEffect(() => { - if (inputRef.current) { - inputRef.current.focus(); // Ensure the input box retains focus - } - }, [userInput, loading, done]); // Add other dependencies if necessary - - return (
- - - {/* Centered content, but no manual bottom margin */} -
-
- {/* Scrollable chat area */} -
+ + + {/* Centered content, but no manual bottom margin */} +
+
+ {/* Scrollable chat area */} +
- {done && ( -
- Chat ended + {done && ( +
+ Chat ended +
+ )} +
+
- )} -
-
-
- {/* Floating Input Section */} - {/* Fixed bottom input */} -
+ {/* Fixed bottom input */} +
setUserInput(e.target.value)} @@ -143,7 +149,7 @@ export default function App() {
); -} \ No newline at end of file +}