feat(FN-4360): complete Step 4 — wire reliability view and nav

Fusion-Task-Id: FN-4360
Fusion-Task-Lineage: 50e17cef-29b0-4adc-aa1c-bffdebe4b43c
This commit is contained in:
Fusion
2026-05-13 22:15:24 -07:00
committed by gsxdsm
parent e2dc8997bf
commit 3418fbab1d
3 changed files with 27 additions and 2 deletions

View File

@@ -100,6 +100,7 @@ const ChatView = lazy(() => import("./components/ChatView").then((m) => ({ defau
const SkillsView = lazy(() => import("./components/SkillsView").then((m) => ({ default: m.SkillsView })));
const MemoryView = lazy(() => import("./components/MemoryView").then((m) => ({ default: m.MemoryView })));
const ReliabilityView = lazy(() => import("./components/ReliabilityView").then((m) => ({ default: m.ReliabilityView })));
const DevServerView = lazy(() => import("./components/DevServerView").then((m) => ({ default: m.DevServerView })));
const _TodoView = lazy(() => import("./components/TodoView").then((m) => ({ default: m.TodoView })));
const StashRecoveryView = lazy(() => import("./components/StashRecoveryView").then((m) => ({ default: m.StashRecoveryView })));
@@ -126,6 +127,7 @@ function prefetchLazyViews() {
void import("./components/SkillsView");
void import("./components/MemoryView");
void import("./components/ReliabilityView");
void import("./components/DevServerView");
void import("./components/TodoView");
void import("./components/StashRecoveryView");
@@ -1490,6 +1492,16 @@ function AppInner() {
);
}
if (taskView === "reliability") {
return (
<PageErrorBoundary>
<Suspense fallback={null}>
<ReliabilityView />
</Suspense>
</PageErrorBoundary>
);
}
if (taskView === "devserver" || taskView === "dev-server") {
if (!settingsLoaded || !devServerEnabled) {
return null;

View File

@@ -1182,7 +1182,7 @@ export function Header({
<>
<button
ref={viewOverflowTriggerRef}
className={`view-toggle-btn${["research", "skills", "insights", "memory", "dev-server", "devserver", "graph", "stash-recovery"].includes(view) || (experimentalFeatures?.evalsView && view === "evals") || (todosEnabled && todosOpen) || isPluginViewId(view) ? " active" : ""}`}
className={`view-toggle-btn${["research", "skills", "insights", "memory", "reliability", "dev-server", "devserver", "graph", "stash-recovery"].includes(view) || (experimentalFeatures?.evalsView && view === "evals") || (todosEnabled && todosOpen) || isPluginViewId(view) ? " active" : ""}`}
onClick={() => setIsViewOverflowOpen((prev) => !prev)}
title="More views"
aria-label="More views"
@@ -1284,6 +1284,18 @@ export function Header({
<span>Memory</span>
</button>
)}
<button
className={`view-toggle-overflow-item${view === "reliability" ? " active" : ""}`}
onClick={() => {
onChangeView("reliability");
setIsViewOverflowOpen(false);
}}
role="menuitem"
data-testid="view-overflow-reliability"
>
<Activity size={14} />
<span>Reliability</span>
</button>
{experimentalFeatures?.devServerView && (
<button
className={`view-toggle-overflow-item${view === "dev-server" || view === "devserver" ? " active" : ""}`}

View File

@@ -5,7 +5,7 @@ import { getScopedItem, setScopedItem } from "../utils/projectStorage";
import { getPluginViewId, isPluginViewId, isPluginViewRegistered } from "../plugins/pluginViewRegistry";
export type ViewMode = "overview" | "project";
export type BuiltInTaskView = "board" | "list" | "graph" | "agents" | "missions" | "chat" | "documents" | "research" | "evals" | "skills" | "mailbox" | "insights" | "memory" | "devserver" | "dev-server" | "stash-recovery";
export type BuiltInTaskView = "board" | "list" | "graph" | "agents" | "missions" | "chat" | "documents" | "research" | "evals" | "skills" | "mailbox" | "insights" | "memory" | "reliability" | "devserver" | "dev-server" | "stash-recovery";
export type PluginTaskView = `plugin:${string}:${string}`;
export type TaskView = BuiltInTaskView | PluginTaskView;
@@ -24,6 +24,7 @@ const BUILT_IN_TASK_VIEWS: readonly BuiltInTaskView[] = [
"mailbox",
"insights",
"memory",
"reliability",
"devserver",
"dev-server",
"stash-recovery",