feat(FN-3431): add merge error recovery for auto-merge conflicts and compac

Merged work from FN-3479 and FN-3431: adds agent heartbeat monitoring with auto-claim and work settings to the engine, finalizes workflow token styling in the dashboard, aligns LlamaCppProviderCard compact layout spacing, and adds regression tests for both the card component and merge error recovery

Fusion-Task-Id: FN-3431
This commit is contained in:
Fusion
2026-05-05 01:52:25 -07:00
committed by gsxdsm
2 changed files with 84 additions and 2 deletions

View File

@@ -550,10 +550,10 @@ The test config (`vitest.config.ts`) includes `test.css: { include: [/.+/] }` so
### Lazy-Loaded Heavy Views
These 13 views are lazy-loaded via `React.lazy()` to manage bundle size:
These 15 views are lazy-loaded via `React.lazy()` to manage bundle size:
- `AgentsView`, `RoadmapsView`, `NodesView`, `ChatView`, `MemoryView`
- `DevServerView`, `InsightsView`, `DocumentsView`, `SkillsView`
- `DevServerView`, `InsightsView`, `DocumentsView`, `SkillsView`, `ResearchView`, `TodoView`
- `SetupWizardModal`, `PluginManager`, `PiExtensionsManager`, `AgentDetailView`
They are loaded in `App.tsx` / `AppModals.tsx` / `SettingsModal.tsx` / `AgentsView.tsx` with `<Suspense fallback={null}>`.

View File

@@ -0,0 +1,82 @@
import { describe, expect, it } from "vitest";
import { readFileSync } from "node:fs";
import { resolve } from "node:path";
const EXPECTED_DOCUMENTED_VIEWS = new Set([
"AgentsView",
"RoadmapsView",
"NodesView",
"ChatView",
"MemoryView",
"DevServerView",
"InsightsView",
"DocumentsView",
"SkillsView",
"ResearchView",
"TodoView",
"SetupWizardModal",
"PluginManager",
"PiExtensionsManager",
"AgentDetailView",
]);
const EXPECTED_APP_LEVEL_VIEWS = new Set([
"AgentsView",
"DocumentsView",
"InsightsView",
"ResearchView",
"NodesView",
"ChatView",
"RoadmapsView",
"SkillsView",
"MemoryView",
"DevServerView",
"TodoView",
]);
function extractLazyLoadedSection(agentsDoc: string): string {
const match = agentsDoc.match(/### Lazy-Loaded Heavy Views[\s\S]*?(?=\n### |\n---|$)/);
if (!match) {
throw new Error("Lazy-Loaded Heavy Views section not found in AGENTS.md");
}
return match[0];
}
function extractBacktickedNamesFromBullets(section: string): string[] {
return section
.split("\n")
.filter((line) => line.trim().startsWith("- "))
.flatMap((line) => [...line.matchAll(/`([^`]+)`/g)].map((m) => m[1]));
}
function extractAppLazyViews(appSource: string): Set<string> {
const matches = [...appSource.matchAll(/const\s+(\w+)\s*=\s*lazy\(/g)].map((m) => m[1]);
return new Set(matches.map((name) => (name === "_TodoView" ? "TodoView" : name)));
}
describe("AGENTS lazy-loaded views inventory", () => {
it("documents the App-level lazy views accurately and keeps the curated 15-view list in sync", () => {
const agentsDoc = readFileSync(resolve(__dirname, "../../../../AGENTS.md"), "utf-8");
const appSource = readFileSync(resolve(__dirname, "../App.tsx"), "utf-8");
const section = extractLazyLoadedSection(agentsDoc);
const countMatch = section.match(/These\s+(\d+)\s+views\s+are lazy-loaded/);
expect(countMatch).toBeTruthy();
expect(Number(countMatch?.[1])).toBe(15);
const documentedViews = extractBacktickedNamesFromBullets(section);
expect(new Set(documentedViews)).toEqual(EXPECTED_DOCUMENTED_VIEWS);
expect(documentedViews).toHaveLength(15);
expect(section).toContain("`ResearchView`");
expect(section).toContain("`TodoView`");
expect((section.match(/`AgentDetailView`/g) ?? []).length).toBe(1);
const appLevelViews = extractAppLazyViews(appSource);
expect(appLevelViews).toEqual(EXPECTED_APP_LEVEL_VIEWS);
for (const view of appLevelViews) {
expect(EXPECTED_DOCUMENTED_VIEWS.has(view)).toBe(true);
}
});
});