Skip to content

Commit 11f803f

Browse files
committed
Update backend dependencies and add semantic-kernel
Pinned backend Python dependencies to specific versions, updated several packages to latest releases, and added semantic-kernel to the dependency list. These changes improve reproducibility and compatibility with new features and bug fixes.
2 parents a0246f2 + dcd11c4 commit 11f803f

File tree

8 files changed

+670
-68
lines changed

8 files changed

+670
-68
lines changed

src/backend/pyproject.toml

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,31 +5,31 @@ description = "Add your description here"
55
readme = "README.md"
66
requires-python = ">=3.11"
77
dependencies = [
8-
"agent-framework==1.0.0b6",
9-
"azure-ai-evaluation>=1.5.0",
10-
"azure-ai-inference>=1.0.0b9",
8+
"azure-ai-evaluation==1.11.0",
9+
"azure-ai-inference==1.0.0b9",
1110
"azure-ai-projects==1.0.0",
1211
"azure-ai-agents==1.2.0b2",
13-
"azure-cosmos>=4.9.0",
14-
"azure-identity>=1.21.0",
15-
"azure-monitor-events-extension>=0.1.0",
16-
"azure-monitor-opentelemetry>=1.6.8",
17-
"azure-search-documents>=11.5.2",
18-
"fastapi>=0.115.12",
19-
"openai>=1.75.0",
20-
"opentelemetry-api>=1.31.1",
21-
"opentelemetry-exporter-otlp-proto-grpc>=1.31.1",
22-
"opentelemetry-exporter-otlp-proto-http>=1.31.1",
23-
"opentelemetry-instrumentation-fastapi>=0.52b1",
24-
"opentelemetry-instrumentation-openai>=0.39.2",
25-
"opentelemetry-sdk>=1.31.1",
26-
"pytest>=8.2,<9",
12+
"azure-cosmos==4.9.0",
13+
"azure-identity==1.24.0",
14+
"azure-monitor-events-extension==0.1.0",
15+
"azure-monitor-opentelemetry==1.7.0",
16+
"azure-search-documents==11.5.3",
17+
"fastapi==0.116.1",
18+
"openai==1.105.0",
19+
"opentelemetry-api==1.36.0",
20+
"opentelemetry-exporter-otlp-proto-grpc==1.36.0",
21+
"opentelemetry-exporter-otlp-proto-http==1.36.0",
22+
"opentelemetry-instrumentation-fastapi==0.57b0",
23+
"opentelemetry-instrumentation-openai==0.46.2",
24+
"opentelemetry-sdk==1.36.0",
25+
"pytest==8.4.1",
2726
"pytest-asyncio==0.24.0",
2827
"pytest-cov==5.0.0",
29-
"python-dotenv>=1.1.0",
30-
"python-multipart>=0.0.20",
31-
"uvicorn>=0.34.2",
32-
"pylint-pydantic>=0.3.5",
33-
"pexpect>=4.9.0",
34-
"mcp>=1.13.1",
28+
"python-dotenv==1.1.1",
29+
"python-multipart==0.0.20",
30+
"semantic-kernel==1.35.3",
31+
"uvicorn==0.35.0",
32+
"pylint-pydantic==0.3.5",
33+
"pexpect==4.9.0",
34+
"mcp==1.13.1"
3535
]

src/backend/uv.lock

Lines changed: 593 additions & 23 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/frontend/src/components/common/PlanCancellationDialog.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import {
88
DialogBody,
99
DialogActions,
1010
Button,
11+
DialogOpenChangeEvent,
12+
DialogOpenChangeData
1113
} from '@fluentui/react-components';
1214
import { Warning20Regular } from '@fluentui/react-icons';
1315
import "../../styles/Panel.css";
@@ -29,7 +31,7 @@ const PlanCancellationDialog: React.FC<PlanCancellationDialogProps> = ({
2931
loading = false
3032
}) => {
3133
return (
32-
<Dialog open={isOpen} onOpenChange={(_, data) => !data.open && onCancel()}>
34+
<Dialog open={isOpen} onOpenChange={(_: DialogOpenChangeEvent, data: DialogOpenChangeData) => !data.open && onCancel()}>
3335
<DialogSurface>
3436
<DialogBody>
3537
<DialogTitle>

src/frontend/src/components/common/TeamSelector.tsx

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,13 @@ import {
1919
RadioGroup,
2020
Tab,
2121
TabList,
22-
Tooltip
22+
Tooltip,
23+
DialogOpenChangeEvent,
24+
DialogOpenChangeData,
25+
TabValue,
26+
SelectTabEvent,
27+
SelectTabData,
28+
InputOnChangeData
2329
} from '@fluentui/react-components';
2430
import {
2531
ChevronUpDown16Regular,
@@ -474,15 +480,15 @@ const TeamSelector: React.FC<TeamSelectorProps> = ({
474480
size="small"
475481
disabled={true}
476482
className={`${styles.moreButton} ${styles.moreButtonDisabled || ''}`}
477-
onClick={(e) => e.stopPropagation()}
483+
onClick={(e: React.MouseEvent) => e.stopPropagation()}
478484
/>
479485
</Tooltip>
480486
) : (
481487
<Button
482488
icon={<MoreHorizontal20Regular />}
483489
appearance="subtle"
484490
size="small"
485-
onClick={(e) => handleDeleteTeam(team, e)}
491+
onClick={(e: React.MouseEvent) => handleDeleteTeam(team, e)}
486492
className={styles.moreButton}
487493
/>
488494
)}
@@ -492,7 +498,7 @@ const TeamSelector: React.FC<TeamSelectorProps> = ({
492498

493499
return (
494500
<>
495-
<Dialog open={isOpen} onOpenChange={(event, data) => handleOpenChange(data.open)}>
501+
<Dialog open={isOpen} onOpenChange={(event: DialogOpenChangeEvent, data: DialogOpenChangeData) => handleOpenChange(data.open)}>
496502
<DialogTrigger disableButtonEnhancement>
497503
<Button
498504
appearance="subtle"
@@ -527,7 +533,7 @@ const TeamSelector: React.FC<TeamSelectorProps> = ({
527533
<TabList
528534
className={styles.tabList}
529535
selectedValue={activeTab}
530-
onTabSelect={(event, data) => setActiveTab(data.value as string)}
536+
onTabSelect={(event: SelectTabEvent, data: SelectTabData) => setActiveTab(data.value as string)}
531537
>
532538
<Tab
533539
value="teams"
@@ -559,7 +565,7 @@ const TeamSelector: React.FC<TeamSelectorProps> = ({
559565
className={styles.searchInput}
560566
placeholder="Search teams..."
561567
value={searchQuery}
562-
onChange={(e, data) => {
568+
onChange={(e: React.ChangeEvent<HTMLInputElement>, data: InputOnChangeData) => {
563569
console.log('Search changed:', data.value);
564570
setSearchQuery(data.value || '');
565571
}}
@@ -716,7 +722,7 @@ const TeamSelector: React.FC<TeamSelectorProps> = ({
716722
</DialogSurface>
717723
</Dialog>
718724

719-
<Dialog open={deleteConfirmOpen} onOpenChange={(event, data) => setDeleteConfirmOpen(data.open)}>
725+
<Dialog open={deleteConfirmOpen} onOpenChange={(event: DialogOpenChangeEvent, data: DialogOpenChangeData) => setDeleteConfirmOpen(data.open)}>
720726
<DialogSurface className={styles.deleteDialogSurface}>
721727
<DialogContent className={styles.deleteDialogContent}>
722728
<DialogBody className={styles.deleteDialogBody}>

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

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,17 +60,27 @@ const PlanPanelLeft: React.FC<PlanPanelLefProps> = ({
6060
console.log("Loading plans, forceRefresh:", forceRefresh);
6161
setPlansLoading(true);
6262
setPlansError(null);
63-
const plansData = await apiService.getPlans(undefined, forceRefresh);
63+
const plansData = await apiService.getPlans(undefined, !forceRefresh); // Invert forceRefresh for useCache
6464
setPlans(plansData);
65+
66+
// Reset the reload flag after successful load
67+
if (forceRefresh && restReload) {
68+
restReload();
69+
}
6570
} catch (error) {
6671
console.log("Failed to load plans:", error);
6772
setPlansError(
6873
error instanceof Error ? error : new Error("Failed to load plans")
6974
);
75+
76+
// Reset the reload flag even on error to prevent infinite loops
77+
if (forceRefresh && restReload) {
78+
restReload();
79+
}
7080
} finally {
7181
setPlansLoading(false);
7282
}
73-
}, []);
83+
}, [restReload]);
7484

7585

7686
// Fetch plans
@@ -85,7 +95,7 @@ const PlanPanelLeft: React.FC<PlanPanelLefProps> = ({
8595
useEffect(() => {
8696
console.log("Reload tasks changed:", reloadTasks);
8797
if (reloadTasks) {
88-
loadPlansData();
98+
loadPlansData(true); // Force refresh when reloadTasks is true
8999
}
90100
}, [loadPlansData, setUserInfo, reloadTasks]);
91101
useEffect(() => {

src/frontend/src/coral/components/PromptCard.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,14 @@ const PromptCard: React.FC<PromptCardProps> = ({
3737
transition: "background-color 0.2s ease-in-out",
3838
}}
3939
// 🧠 Only apply hover if not disabled
40-
onMouseOver={(e) => {
40+
onMouseOver={(e: React.MouseEvent<HTMLDivElement>) => {
4141
if (!disabled) {
4242
e.currentTarget.style.backgroundColor =
4343
"var(--colorNeutralBackground3Hover)";
4444
e.currentTarget.style.border = "1px solid var(--colorNeutralStroke1)"; // subtle shadow on hover
4545
}
4646
}}
47-
onMouseOut={(e) => {
47+
onMouseOut={(e: React.MouseEvent<HTMLDivElement>) => {
4848
if (!disabled) {
4949
e.currentTarget.style.backgroundColor =
5050
"var(--colorNeutralBackground3)";

src/frontend/src/pages/PlanPage.tsx

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -132,19 +132,36 @@ const PlanPage: React.FC = () => {
132132
// Persist / forward to backend (fire-and-forget with logging)
133133
const agentMessageResponse = PlanDataService.createAgentMessageResponse(agentMessageData, planData, is_final, streaming_message);
134134
console.log('📤 Persisting agent message:', agentMessageResponse);
135-
void apiService.sendAgentMessage(agentMessageResponse)
135+
const sendPromise = apiService.sendAgentMessage(agentMessageResponse)
136136
.then(saved => {
137137
console.log('[agent_message][persisted]', {
138138
agent: agentMessageData.agent,
139139
type: agentMessageData.agent_type,
140140
ts: agentMessageData.timestamp
141141
});
142+
143+
// If this is a final message, refresh the task list after successful persistence
144+
if (is_final) {
145+
// Single refresh with a delay to ensure backend processing is complete
146+
setTimeout(() => {
147+
setReloadLeftList(true);
148+
}, 1000);
149+
}
142150
})
143151
.catch(err => {
144152
console.warn('[agent_message][persist-failed]', err);
153+
// Even if persistence fails, still refresh the task list for final messages
154+
// The local plan data has been updated, so the UI should reflect that
155+
if (is_final) {
156+
setTimeout(() => {
157+
setReloadLeftList(true);
158+
}, 1000);
159+
}
145160
});
146161

147-
}, []);
162+
return sendPromise;
163+
164+
}, [setReloadLeftList]);
148165

149166
const resetPlanVariables = useCallback(() => {
150167
setInput("");
@@ -335,20 +352,17 @@ const PlanPage: React.FC = () => {
335352
setPlanData({ ...planData });
336353
}
337354

355+
// Wait for the agent message to be processed and persisted
356+
// The processAgentMessage function will handle refreshing the task list
338357
processAgentMessage(agentMessageData, planData, is_final, streamingMessageBuffer);
339358

340-
setTimeout(() => {
341-
console.log('✅ Plan completed, refreshing left list');
342-
setReloadLeftList(true);
343-
}, 1000);
344-
345359
}
346360

347361

348362
});
349363

350364
return () => unsubscribe();
351-
}, [scrollToBottom, planData, processAgentMessage, streamingMessageBuffer, setSelectedTeam, setReloadLeftList]);
365+
}, [scrollToBottom, planData, processAgentMessage, streamingMessageBuffer, setSelectedTeam]);
352366

353367
//WebsocketMessageType.AGENT_MESSAGE
354368
useEffect(() => {

src/mcp_server/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ dynamic = ["version"]
1717
dependencies = [
1818
"fastmcp==2.11.3",
1919
"uvicorn[standard]==0.32.1",
20-
"python-dotenv>=1.1.0",
20+
"python-dotenv==1.1.1",
2121
"azure-identity==1.19.0",
2222
"pydantic==2.11.7",
2323
"pydantic-settings==2.6.1",

0 commit comments

Comments
 (0)