feat(FN-3834): short-circuit no-op merges and auto-finalize review tasks

Merged FN-3834 to add a no-op merge recovery flow to the merger, including a branch-ahead detector, short-circuit logic to exclude no-op merges from the mergeable sweep, and finalization of no-op review tasks — backed by substantial test coverage across merger and self-healing modules.

Fusion-Task-Id: FN-3834
This commit is contained in:
Fusion
2026-05-11 03:44:10 -07:00
committed by gsxdsm
parent 59a5777251
commit 161bfa9571
10 changed files with 494 additions and 9 deletions

View File

@@ -702,6 +702,8 @@
gap: var(--space-sm);
align-items: center;
flex-wrap: nowrap;
container-type: inline-size;
container-name: agent-card-actions;
}
.agent-card-actions .btn {
@@ -718,8 +720,10 @@
padding: var(--space-xs) var(--space-sm);
}
.agents-split-sidebar .agent-card-actions .agent-card-action-label {
display: none;
@container agent-card-actions (max-width: calc(var(--space-2xl) * 9)) {
.agents-split-sidebar .agent-card-actions .agent-card-action-label {
display: none;
}
}
.agent-card-details-btn {

View File

@@ -1,6 +1,6 @@
import "./AgentsView.css";
import { useState, useEffect, useCallback, useRef, useMemo, useId, lazy, Suspense, type CSSProperties } from "react";
import { Plus, Play, Pause, Activity, Trash2, RefreshCw, Bot, List, ChevronRight, Filter, Upload, Network, SlidersHorizontal, ZoomIn, ZoomOut, Minimize2 } from "lucide-react";
import { Plus, Play, Pause, Activity, Trash2, RefreshCw, Bot, List, ChevronRight, Filter, Upload, Network, SlidersHorizontal, ZoomIn, ZoomOut, Minimize2, Info } from "lucide-react";
import type { Agent, AgentCapability, AgentOnboardingSummary, AgentState, OrgTreeNode } from "../api";
import { updateAgent, updateAgentState, deleteAgent, startAgentRun, fetchOrgTree, fetchSettings, updateSettings } from "../api";
@@ -1445,7 +1445,7 @@ export function AgentsView({ addToast, projectId, onOpenTaskLogs, agentOnboardin
title={`View details for ${agent.name}`}
aria-label={`View details for ${agent.name}`}
>
<ChevronRight size={14} /> <span className="agent-card-action-label">Details</span>
<Info size={14} /> <span className="agent-card-action-label">Details</span>
</button>
{(agent.state === "idle" || agent.state === "paused") && (
<button

View File

@@ -658,6 +658,14 @@ describe("AgentsView", () => {
expect(detailsButton.querySelector("svg")).toBeTruthy();
});
it("hides split-sidebar action labels only within an agent-card-actions container query", () => {
const css = loadAllAppCss();
expect(css).not.toContain(".agents-split-sidebar .agent-card-actions .agent-card-action-label {\n display: none;\n}");
expect(css).toContain("@container agent-card-actions (max-width: calc(var(--space-2xl) * 9))");
expect(css).toContain(".agents-split-sidebar .agent-card-actions .agent-card-action-label {\n display: none;\n }");
});
it("opens matching detail view when clicking View Details button", async () => {
render(<AgentsView addToast={mockAddToast} />);