feat(client): remove demo mission fallback

This commit is contained in:
baiyanyun
2026-06-08 18:19:36 +08:00
parent 820b1b6f13
commit e4652ace1c
6 changed files with 162 additions and 232 deletions

View File

@@ -1,11 +1,4 @@
import { useEffect, useMemo, useState } from 'react';
import {
buildDemoFlowEvents,
buildDemoPlanMessages,
buildDemoRuns,
buildDemoTasks,
getDemoMissions,
} from '@/pages/digital/demoScenario';
import {
displayBackendMessage,
displayBusinessText,
@@ -310,25 +303,20 @@ export default function FlowDetailPanel({ mission, onClose }: FlowDetailPanelPro
getPlanMessages(planId),
]).then(([tasksResult, flowResult, messagesResult]) => {
if (cancelled) return;
const demoMission = getDemoMissions().find((item) => item.id === planId);
const fallbackTasks = demoMission ? buildDemoTasks([demoMission]) : [];
const fallbackRuns = fallbackTasks.length > 0 ? buildDemoRuns(fallbackTasks) : [];
if (tasksResult.status === 'fulfilled') {
setTasks(tasksResult.value.tasks && tasksResult.value.tasks.length > 0 ? tasksResult.value.tasks : fallbackTasks);
setRuns(tasksResult.value.runs && tasksResult.value.runs.length > 0 ? tasksResult.value.runs : fallbackRuns);
setTasks(tasksResult.value.tasks ?? []);
setRuns(tasksResult.value.runs ?? []);
} else {
setTasks(fallbackTasks);
setRuns(fallbackRuns);
setTasks([]);
setRuns([]);
}
if (flowResult.status === 'fulfilled' && flowResult.value?.events && flowResult.value.events.length > 0) {
setFlow(flowResult.value);
} else {
setFlow(demoMission ? { events: buildDemoFlowEvents(demoMission) } as FlowResponse : null);
setFlow(null);
}
if (messagesResult.status === 'fulfilled' && messagesResult.value.messages.length > 0) {
setSessionMessages(messagesResult.value.messages);
} else if (demoMission) {
setSessionMessages(buildDemoPlanMessages(demoMission));
} else {
setSessionMessages([]);
}
@@ -361,18 +349,11 @@ export default function FlowDetailPanel({ mission, onClose }: FlowDetailPanelPro
if (data.messages && data.messages.length > 0) {
setSessionMessages(data.messages);
} else {
const demoMission = getDemoMissions().find((item) => item.id === planId);
setSessionMessages(demoMission ? buildDemoPlanMessages(demoMission) : []);
setSessionMessages([]);
}
} catch (err) {
const demoMission = getDemoMissions().find((item) => item.id === planId);
if (demoMission) {
setSessionMessages(buildDemoPlanMessages(demoMission));
setSessionError(null);
} else {
setSessionMessages([]);
setSessionError(err instanceof Error ? err.message : '读取会话失败');
}
setSessionMessages([]);
setSessionError(err instanceof Error ? err.message : '读取会话失败');
} finally {
setSessionLoading(false);
}

View File

@@ -7,11 +7,6 @@ import { adaptMissions, type Mission } from '@/lib/consoleDataAdapter';
import { getDebugPlans, governanceCommand, searchDebugPlans } from '@/lib/api';
import type { GovernanceCommandKind, GovernanceCommandResponse } from '@/types/api';
import { t } from '@/lib/i18n';
import {
completeDemoMissionOnce,
getDemoMissions,
runDemoMissionOnce,
} from './demoScenario';
import { domSafeId } from './navigation';
const REQUIRED_MISSION_IDS = [
@@ -275,7 +270,6 @@ export default function MissionCenter({
const [showAllDates, setShowAllDates] = useState(false);
const [runningMissionId, setRunningMissionId] = useState<string | null>(null);
const [runningAll, setRunningAll] = useState(false);
const [demoMode, setDemoMode] = useState(false);
const [actionError, setActionError] = useState<string | null>(null);
const [recentMissionId, setRecentMissionId] = useState<string | null>(null);
const [missionNotice, setMissionNotice] = useState<MissionNotice | null>(null);
@@ -324,23 +318,17 @@ export default function MissionCenter({
const orderedPlans = [...recentPlans, ...requiredPlans];
if (orderedPlans.length > 0) {
const nextMissions = adaptMissions(orderedPlans);
setDemoMode(false);
setMissions(nextMissions);
return nextMissions;
} else {
const demoMissions = getDemoMissions();
setDemoMode(true);
setMissions(demoMissions);
return demoMissions;
}
setMissions([]);
return [];
} catch (err) {
if (!mountedRef.current) return [];
console.error('[MissionCenter] fetch failed:', err);
const demoMissions = getDemoMissions();
setDemoMode(true);
setMissions(demoMissions);
setError(false);
return demoMissions;
setMissions([]);
setError(true);
return [];
} finally {
if (mountedRef.current) setLoading(false);
}
@@ -393,23 +381,9 @@ export default function MissionCenter({
setRunningMissionId(mission.id);
setError(false);
setActionError(null);
if (demoMode || !mission.sourceIds.planId) {
setMissions((current) => runDemoMissionOnce(current, mission.id));
setSelected((current) => {
if (current?.id !== mission.id) return current;
const next = runDemoMissionOnce([current], mission.id);
return next[0] ?? current;
});
window.setTimeout(() => {
if (!mountedRef.current) return;
setMissions((current) => completeDemoMissionOnce(current, mission.id));
setSelected((current) => {
if (current?.id !== mission.id) return current;
const next = completeDemoMissionOnce([current], mission.id);
return next[0] ?? current;
});
setRunningMissionId(null);
}, 1200);
if (!mission.sourceIds.planId) {
setActionError('当前任务没有 qimingclaw Plan 记录,无法委托执行。');
setRunningMissionId(null);
return;
}
try {
@@ -450,14 +424,15 @@ export default function MissionCenter({
} finally {
setRunningMissionId(null);
}
}, [demoMode, fetchMissions, focusMission]);
}, [fetchMissions, focusMission]);
const restartMission = useCallback(async (mission: Mission) => {
setRunningMissionId(mission.id);
setError(false);
setActionError(null);
if (demoMode || !mission.sourceIds.planId) {
await runMission(mission);
if (!mission.sourceIds.planId) {
setActionError('当前任务没有 qimingclaw Plan 记录,无法重新执行。');
setRunningMissionId(null);
return;
}
try {
@@ -489,7 +464,7 @@ export default function MissionCenter({
} finally {
setRunningMissionId(null);
}
}, [demoMode, fetchMissions, focusMission, runMission]);
}, [fetchMissions, focusMission]);
const selectedDate = dateFilter || todayDateKey();
const filteredByDate = dedupeMissionsForDate(
@@ -506,27 +481,6 @@ export default function MissionCenter({
if (runnableMissions.length === 0) return;
setRunningAll(true);
setError(false);
if (demoMode) {
let delay = 0;
for (const mission of runnableMissions.slice(0, 4)) {
window.setTimeout(() => {
if (!mountedRef.current) return;
setRunningMissionId(mission.id);
setMissions((current) => runDemoMissionOnce(current, mission.id));
}, delay);
delay += 400;
window.setTimeout(() => {
if (!mountedRef.current) return;
setMissions((current) => completeDemoMissionOnce(current, mission.id));
}, delay + 900);
}
window.setTimeout(() => {
if (!mountedRef.current) return;
setRunningMissionId(null);
setRunningAll(false);
}, delay + 1200);
return;
}
try {
for (const mission of runnableMissions) {
setRunningMissionId(mission.id);
@@ -542,7 +496,7 @@ export default function MissionCenter({
setRunningMissionId(null);
setRunningAll(false);
}
}, [demoMode, fetchMissions, runnableMissions]);
}, [fetchMissions, runnableMissions]);
const filtered = filter === 'all'
? filteredByDate
@@ -587,11 +541,6 @@ export default function MissionCenter({
<button onClick={fetchMissions} className="de-btn-secondary de-btn-sm">{t('console.action.refresh')}</button>
</CardTitleBar>
<div className="de-card-body">
{demoMode && (
<div className="de-schedule-result de-schedule-result--success" style={{ marginBottom: 12 }}>
qimingclaw
</div>
)}
{actionError && (
<div className="de-schedule-result de-schedule-result--error" style={{ marginBottom: 12 }}>
{actionError}