diff --git a/packages/dashboard/app/components/command-center/__tests__/CommandCenterControls.test.tsx b/packages/dashboard/app/components/command-center/__tests__/CommandCenterControls.test.tsx
index 56f0b8ac7f..5246da2b18 100644
--- a/packages/dashboard/app/components/command-center/__tests__/CommandCenterControls.test.tsx
+++ b/packages/dashboard/app/components/command-center/__tests__/CommandCenterControls.test.tsx
@@ -16,15 +16,6 @@ const legacyMocks = vi.hoisted(() => ({
updateSettings: vi.fn(),
fetchGlobalConcurrency: vi.fn(),
updateGlobalConcurrency: vi.fn(),
- /*
- FNXC:OrgPortability 2026-07-18-13:05:
- FN-8284 mounts OrgPortabilityControls inside CommandCenterControls; that card imports
- withProjectId + api from legacy. Partial mocks must re-export both or every controls
- suite fails with "No withProjectId export".
- */
- api: vi.fn().mockResolvedValue({ revisions: [] }),
- withProjectId: (path: string, projectId?: string) =>
- projectId ? `${path}?projectId=${projectId}` : path,
}));
vi.mock("../../../api/legacy", () => legacyMocks);
@@ -107,6 +98,12 @@ describe("CommandCenterControls concurrency markers", () => {
document.body.innerHTML = "";
});
+ it("keeps organization portability out of Overview controls", () => {
+ renderControls();
+
+ expect(screen.queryByTestId("cc-controls-org-portability")).not.toBeInTheDocument();
+ });
+
it("keeps the Theme card's compact dropdown interactive", () => {
const { onColorThemeChange } = renderControls();
const themeCard = screen.getByTestId("cc-controls-theme");
diff --git a/packages/dashboard/app/components/command-center/areas/TeamArea.tsx b/packages/dashboard/app/components/command-center/areas/TeamArea.tsx
index 601f9be35e..43cfaf4438 100644
--- a/packages/dashboard/app/components/command-center/areas/TeamArea.tsx
+++ b/packages/dashboard/app/components/command-center/areas/TeamArea.tsx
@@ -18,6 +18,7 @@ import { Bar, type BarDatum } from "../charts/Bar";
import { Sparkline } from "../charts/Sparkline";
import { PieChart } from "../charts/recharts";
import { resolveOrgChartLayoutMode, type OrgChartLayoutMode } from "../../agentsOrgChartLayout";
+import { OrgPortabilityControls } from "../OrgPortabilityControls";
import { AreaShell } from "./AreaShell";
import { useAnalyticsArea } from "./useAnalyticsArea";
import { formatCost, formatCount } from "./areaShared";
@@ -178,6 +179,7 @@ export function TeamArea({
globalPaused,
enginePaused,
toggleEnginePause,
+ refresh,
} = useAppSettings(projectId);
/*
FNXC:CommandCenter 2026-06-22-00:00:
@@ -596,6 +598,12 @@ export function TeamArea({
+ {/*
+ FNXC:CommandCenter 2026-07-18-18:18:
+ FN-8351 moves organization export/import and configuration rollback portability from Overview controls into the Team tab. Keep the existing project and settings-refresh contract unchanged so all card operations retain their established wiring.
+ */}
+
+
({
+ api: vi.fn(),
+ fetchOrgTree: vi.fn(),
+ fetchExecutorStats: vi.fn(),
+ fetchSettings: vi.fn(),
+ updateSettings: vi.fn(),
+ refresh: vi.fn(),
+ toggleEnginePause: vi.fn(),
+ useAnalyticsArea: vi.fn(),
+}));
+
+vi.mock("../../../../api/legacy", () => ({
+ api: (...args: unknown[]) => mocks.api(...args),
+ withProjectId: (path: string, projectId?: string) => projectId ? `${path}?projectId=${projectId}` : path,
+ fetchOrgTree: mocks.fetchOrgTree,
+ fetchExecutorStats: mocks.fetchExecutorStats,
+ fetchSettings: mocks.fetchSettings,
+ updateSettings: mocks.updateSettings,
+}));
+
+vi.mock("../../../../hooks/useAppSettings", () => ({
+ useAppSettings: () => ({
+ globalPaused: false,
+ enginePaused: false,
+ toggleEnginePause: mocks.toggleEnginePause,
+ refresh: mocks.refresh,
+ }),
+}));
+
+vi.mock("../useAnalyticsArea", () => ({
+ useAnalyticsArea: mocks.useAnalyticsArea,
+}));
+
+const range: DateRange = { from: "2026-06-08", to: null, preset: "7d" };
+
+describe("TeamArea organization portability", () => {
+ beforeEach(() => {
+ vi.clearAllMocks();
+ mocks.api.mockResolvedValue({ revisions: [] });
+ mocks.fetchOrgTree.mockResolvedValue([]);
+ mocks.fetchExecutorStats.mockResolvedValue({ globalPause: false, enginePaused: false, maxConcurrent: 2 });
+ mocks.fetchSettings.mockResolvedValue({ heartbeatMultiplier: 1 });
+ mocks.updateSettings.mockResolvedValue({});
+ mocks.refresh.mockResolvedValue(undefined);
+ mocks.useAnalyticsArea.mockReturnValue({ data: null, isLoading: false, error: null });
+ });
+
+ afterEach(cleanup);
+
+ it("renders the org export control in the Team tab", async () => {
+ render(
+
+
+ ,
+ );
+
+ expect(await screen.findByTestId("cc-controls-org-portability")).toBeTruthy();
+ expect(screen.getByRole("button", { name: "Export org bundle" })).toBeTruthy();
+ });
+});