feat(FN-1569): add mission validation telemetry APIs and UI

- Emit fix-feature mission events and forward validator telemetry through mission execution
- Add core and dashboard API types plus a validation telemetry route in mission-routes
- Update SSE mission event handling so validation telemetry updates stream reliably to clients
- Add telemetry surfaces in MissionManager with corresponding mission-specific UI styling
- Expand MissionManager and mission e2e test coverage for validation telemetry flows
This commit is contained in:
Fusion
2026-04-16 23:33:05 -07:00
committed by gsxdsm
parent c0e68f21d8
commit 0d94bc39df
11 changed files with 1242 additions and 78 deletions

View File

@@ -1,5 +1,15 @@
import type { Request, Response } from "express";
import type { TaskStore, MissionStore, PluginStore, PluginInstallation, PluginState, AgentStore, MessageStore } from "@fusion/core";
import type {
TaskStore,
MissionStore,
PluginStore,
PluginInstallation,
PluginState,
AgentStore,
MessageStore,
MissionValidatorRun,
FixFeatureCreatedPayload,
} from "@fusion/core";
import type { AiSessionStore } from "./ai-session-store.js";
let activeConnections = 0;
@@ -289,6 +299,18 @@ export function createSSE(
send(`event: milestone:validation:updated\ndata: ${JSON.stringify(data)}\n\n`);
};
const onValidatorRunStarted = (run: MissionValidatorRun) => {
send(`event: validator-run:started\ndata: ${JSON.stringify(run)}\n\n`);
};
const onValidatorRunCompleted = (run: MissionValidatorRun) => {
send(`event: validator-run:completed\ndata: ${JSON.stringify(run)}\n\n`);
};
const onFixFeatureCreated = (payload: FixFeatureCreatedPayload) => {
send(`event: fix-feature:created\ndata: ${JSON.stringify(payload)}\n\n`);
};
const onAiSessionUpdated = (data: any) => {
send(`event: ai_session:updated\ndata: ${JSON.stringify(data)}\n\n`);
};
@@ -402,6 +424,9 @@ export function createSSE(
missionStore.off("assertion:unlinked", onAssertionUnlinked);
missionStore.off("mission:event", onMissionEvent);
missionStore.off("milestone:validation:updated", onMilestoneValidationUpdated);
missionStore.off("validator-run:started", onValidatorRunStarted);
missionStore.off("validator-run:completed", onValidatorRunCompleted);
missionStore.off("fix-feature:created", onFixFeatureCreated);
}
if (aiSessionStore) {
aiSessionStore.off("ai_session:updated", onAiSessionUpdated);
@@ -459,6 +484,9 @@ export function createSSE(
missionStore.on("assertion:unlinked", onAssertionUnlinked);
missionStore.on("mission:event", onMissionEvent);
missionStore.on("milestone:validation:updated", onMilestoneValidationUpdated);
missionStore.on("validator-run:started", onValidatorRunStarted);
missionStore.on("validator-run:completed", onValidatorRunCompleted);
missionStore.on("fix-feature:created", onFixFeatureCreated);
}
if (aiSessionStore) {