Make SIF agent workflows non-blocking and guard SSE hangs

This commit is contained in:
ي
2026-03-10 14:05:00 +05:30
parent bc49329ed6
commit 3a88d09af8
4 changed files with 82 additions and 58 deletions

View File

@@ -231,6 +231,22 @@ export class ContentPlanningOrchestrator {
// New approach: stream strategic intelligence data and show status from AI generation SSE
return await new Promise<{ aiInsights: any[]; aiRecommendations: any[] }>(async (resolve) => {
let finished = false;
const complete = (payload: { aiInsights: any[]; aiRecommendations: any[] }) => {
if (finished) return;
finished = true;
resolve(payload);
};
// Hard timeout so the orchestrator never hangs if SSE never emits terminal events.
const hardTimeout = window.setTimeout(() => {
this.updateServiceStatus('aiAnalytics', {
status: 'error',
progress: 0,
message: 'Strategic intelligence timed out'
});
complete({ aiInsights: [], aiRecommendations: [] });
}, 45000);
// 1) Execution status stream (best-effort; ignore if no active strategy)
try {
const currentStrategyId = this.latestDashboardData?.strategies?.[0]?.id;
@@ -280,18 +296,21 @@ export class ContentPlanningOrchestrator {
});
// Map to orchestrator fields if needed
this.notifyDataUpdate({ aiInsights: data.data?.recommendations || [], aiRecommendations: [] });
resolve({ aiInsights: data.data?.recommendations || [], aiRecommendations: [] });
window.clearTimeout(hardTimeout);
complete({ aiInsights: data.data?.recommendations || [], aiRecommendations: [] });
} else if (data.type === 'error') {
this.updateServiceStatus('aiAnalytics', {
status: 'error',
progress: 0,
message: data.message || 'Failed to load strategic intelligence'
});
resolve({ aiInsights: [], aiRecommendations: [] });
window.clearTimeout(hardTimeout);
complete({ aiInsights: [], aiRecommendations: [] });
}
},
() => {
resolve({ aiInsights: [], aiRecommendations: [] });
window.clearTimeout(hardTimeout);
complete({ aiInsights: [], aiRecommendations: [] });
}
);
});