Skip to content

Commit 6ebf6ff

Browse files
committed
Improve plan chat UI and team selection handling
Standardizes chat input placeholder text and refines color logic in PlanChatBody. Adds selected team state management to PlanPage and ensures left panel reloads after plan completion. Updates PlanDataService to improve parsing of user clarification responses. Enhances PlanPanelLeft to reload plans when tasks change and improves user info handling.
1 parent 3a7351d commit 6ebf6ff

File tree

4 files changed

+40
-15
lines changed

4 files changed

+40
-15
lines changed

src/frontend/src/components/content/PlanChatBody.tsx

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,7 @@ const PlanChatBody: React.FC<SimplifiedPlanChatProps> = ({
4141
onChange={setInput}
4242
onEnter={() => OnChatSubmit(input)}
4343
disabledChat={submittingChatDisableInput}
44-
placeholder={
45-
waitingForPlan
46-
? "Creating plan..."
47-
: "Type your message here..."
48-
}
44+
placeholder="Type your message here..."
4945
style={{
5046
fontSize: '16px',
5147
borderRadius: '8px',
@@ -68,7 +64,7 @@ const PlanChatBody: React.FC<SimplifiedPlanChatProps> = ({
6864
backgroundColor: 'transparent',
6965
border: 'none',
7066
color: (submittingChatDisableInput || !input.trim())
71-
? 'var(--colorNeutralForegroundDisabled)'
67+
? 'var(--colorNeutralForegroundDisabled)'
7268
: 'var(--colorBrandForeground1)',
7369
flexShrink: 0,
7470
}}

src/frontend/src/components/content/PlanPanelLeft.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,13 @@ const PlanPanelLeft: React.FC<PlanPanelLefProps> = ({
7979
setUserInfo(getUserInfoGlobal());
8080
}, [loadPlansData, setUserInfo]);
8181

82+
83+
useEffect(() => {
84+
console.log("Reload tasks changed:", reloadTasks);
85+
if (reloadTasks) {
86+
loadPlansData();
87+
}
88+
}, [loadPlansData, setUserInfo, reloadTasks]);
8289
useEffect(() => {
8390
if (plans) {
8491
const { inProgress, completed } =
@@ -215,7 +222,7 @@ const PlanPanelLeft: React.FC<PlanPanelLefProps> = ({
215222
<div style={{ display: 'flex', flexDirection: 'column', gap: '12px', width: '100%' }}>
216223
{/* User Card */}
217224
<PanelUserCard
218-
name={userInfo ? userInfo.user_first_last_name : "Guest"}
225+
name={userInfo?.user_first_last_name || "Guest"}
219226
// alias={userInfo ? userInfo.user_email : ""}
220227
size={32}
221228
/>

src/frontend/src/pages/PlanPage.tsx

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { useCallback, useEffect, useRef, useState, useMemo } from "react"
22
import { useParams, useNavigate } from "react-router-dom";
33
import { Spinner, Text } from "@fluentui/react-components";
44
import { PlanDataService } from "../services/PlanDataService";
5-
import { ProcessedPlanData, WebsocketMessageType, MPlanData, AgentMessageData, AgentMessageType, ParsedUserClarification, AgentType, PlanStatus, FinalMessage } from "../models";
5+
import { ProcessedPlanData, WebsocketMessageType, MPlanData, AgentMessageData, AgentMessageType, ParsedUserClarification, AgentType, PlanStatus, FinalMessage, TeamConfig } from "../models";
66
import PlanChat from "../components/content/PlanChat";
77
import PlanPanelRight from "../components/content/PlanPanelRight";
88
import PlanPanelLeft from "../components/content/PlanPanelLeft";
@@ -48,6 +48,7 @@ const PlanPage: React.FC = () => {
4848
const [showProcessingPlanSpinner, setShowProcessingPlanSpinner] = useState<boolean>(false);
4949
const [showApprovalButtons, setShowApprovalButtons] = useState<boolean>(true);
5050
const [continueWithWebsocketFlow, setContinueWithWebsocketFlow] = useState<boolean>(false);
51+
const [selectedTeam, setSelectedTeam] = useState<TeamConfig | null>(null);
5152
// WebSocket connection state
5253
const [wsConnected, setWsConnected] = useState<boolean>(false);
5354
const [streamingMessages, setStreamingMessages] = useState<StreamingPlanUpdate[]>([]);
@@ -261,6 +262,7 @@ const PlanPage: React.FC = () => {
261262
setShowBufferingText(true);
262263
setShowProcessingPlanSpinner(false);
263264
setAgentMessages(prev => [...prev, agentMessageData]);
265+
setSelectedTeam(planData?.team || null);
264266
scrollToBottom();
265267
// Persist the agent message
266268
const is_final = true;
@@ -270,13 +272,19 @@ const PlanPage: React.FC = () => {
270272
}
271273

272274
processAgentMessage(agentMessageData, planData, is_final, streamingMessageBuffer);
275+
276+
setTimeout(() => {
277+
console.log('✅ Plan completed, refreshing left list');
278+
setReloadLeftList(true);
279+
}, 1000);
280+
273281
}
274282

275283

276284
});
277285

278286
return () => unsubscribe();
279-
}, [scrollToBottom, planData, processAgentMessage, streamingMessageBuffer]);
287+
}, [scrollToBottom, planData, processAgentMessage, streamingMessageBuffer, setSelectedTeam, setReloadLeftList]);
280288

281289
//WebsocketMessageType.AGENT_MESSAGE
282290
useEffect(() => {
@@ -591,7 +599,7 @@ const PlanPage: React.FC = () => {
591599
onTeamSelect={() => { }}
592600
onTeamUpload={async () => { }}
593601
isHomePage={false}
594-
selectedTeam={null}
602+
selectedTeam={selectedTeam}
595603
/>
596604

597605
<Content>

src/frontend/src/services/PlanDataService.tsx

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -893,16 +893,30 @@ export class PlanDataService {
893893
}
894894

895895
// Capture the inside of UserClarificationResponse(...)
896-
const outerMatch = line.match(/Human clarification:\s*UserClarificationResponse\((.*?)\)/s);
896+
const outerMatch = line.match(/Human clarification:\s*UserClarificationResponse\((.*)\)$/s);
897897
if (!outerMatch) return line;
898898

899899
const inner = outerMatch[1];
900900

901-
// Find answer= '...' | "..."
902-
const answerMatch = inner.match(/answer=(?:"((?:\\.|[^"])*)"|'((?:\\.|[^'])*)')/);
903-
if (!answerMatch) return line;
901+
// Find answer= '...' | "..." - Updated regex to handle the full content properly
902+
const answerMatch = inner.match(/answer='([^']*(?:''[^']*)*)'/);
903+
if (!answerMatch) {
904+
// Try double quotes if single quotes don't work
905+
const doubleQuoteMatch = inner.match(/answer="([^"]*(?:""[^"]*)*)"/);
906+
if (!doubleQuoteMatch) return line;
904907

905-
let answer = answerMatch[1] ?? answerMatch[2] ?? '';
908+
let answer = doubleQuoteMatch[1];
909+
answer = answer
910+
.replace(/\\n/g, '\n')
911+
.replace(/\\'/g, "'")
912+
.replace(/\\"/g, '"')
913+
.replace(/\\\\/g, '\\')
914+
.trim();
915+
916+
return `Human clarification: ${answer}`;
917+
}
918+
919+
let answer = answerMatch[1];
906920
// Unescape common sequences
907921
answer = answer
908922
.replace(/\\n/g, '\n')

0 commit comments

Comments
 (0)