diff --git a/.changeset/full-suite-float-stack.md b/.changeset/full-suite-float-stack.md new file mode 100644 index 0000000000..c86ba6c24a --- /dev/null +++ b/.changeset/full-suite-float-stack.md @@ -0,0 +1,7 @@ +--- +"@runfusion/fusion": patch +--- + +summary: Keep floating windows stacked by last-opened and last-interacted order. +category: fix +dev: FloatingWindow only reclaims z-index on hidden→visible (not every mount effect), restoring shared-stack cross-type ordering with RightDockExpandModal. diff --git a/packages/dashboard/app/components/FloatingWindow.tsx b/packages/dashboard/app/components/FloatingWindow.tsx index 9f805db8b4..f14201d034 100644 --- a/packages/dashboard/app/components/FloatingWindow.tsx +++ b/packages/dashboard/app/components/FloatingWindow.tsx @@ -252,9 +252,17 @@ export function FloatingWindow({ A hidden Quick Chat must reclaim a fresh z-index when reopened because another task-detail popup may have been focused while chat was invisible. Hidden windows do not otherwise affect the shared interaction stack. + + FNXC:FloatingWindow 2026-07-18-07:15: + Only reclaim on the hidden→visible transition. Initial mount already claims via useState; + re-claiming after sibling mount (RightDockExpandModal, etc.) inverted last-mounted-on-top + and broke the shared-stack cross-type contract in FloatingWindowStack.cross-type.test. */ + const wasHiddenRef = useRef(hidden); useEffect(() => { - if (!hidden) bringToFront(); + const wasHidden = wasHiddenRef.current; + wasHiddenRef.current = hidden; + if (wasHidden && !hidden) bringToFront(); }, [bringToFront, hidden]); const handleDragPointerDown = useCallback( diff --git a/packages/dashboard/app/components/__tests__/AgentsView.orgchart.test.tsx b/packages/dashboard/app/components/__tests__/AgentsView.orgchart.test.tsx index fab0c503f7..2aa06bee64 100644 --- a/packages/dashboard/app/components/__tests__/AgentsView.orgchart.test.tsx +++ b/packages/dashboard/app/components/__tests__/AgentsView.orgchart.test.tsx @@ -8,6 +8,8 @@ import * as apiModule from "../../api"; const mockViewportMode = vi.fn<() => "mobile" | "tablet" | "desktop">(() => "desktop"); vi.mock("../../hooks/useViewportMode", () => ({ MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", + isFullScreenSheetViewport: () => false, + isShortViewport: () => false, getViewportMode: () => mockViewportMode(), isMobileViewport: () => mockViewportMode() === "mobile", useViewportMode: () => mockViewportMode(), diff --git a/packages/dashboard/app/components/__tests__/AgentsView.test.tsx b/packages/dashboard/app/components/__tests__/AgentsView.test.tsx index 3f16516091..5bdcc9575d 100644 --- a/packages/dashboard/app/components/__tests__/AgentsView.test.tsx +++ b/packages/dashboard/app/components/__tests__/AgentsView.test.tsx @@ -79,6 +79,8 @@ const mockViewportMode = vi.fn<() => "mobile" | "tablet" | "desktop">(() => "des vi.mock("../../hooks/useViewportMode", () => ({ MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", + isFullScreenSheetViewport: () => false, + isShortViewport: () => false, getViewportMode: () => mockViewportMode(), isMobileViewport: () => mockViewportMode() === "mobile", useViewportMode: () => mockViewportMode(), diff --git a/packages/dashboard/app/components/__tests__/CliBinaryPanel.copy.test.tsx b/packages/dashboard/app/components/__tests__/CliBinaryPanel.copy.test.tsx index 3ec6f76b8f..8d6c20a7f2 100644 --- a/packages/dashboard/app/components/__tests__/CliBinaryPanel.copy.test.tsx +++ b/packages/dashboard/app/components/__tests__/CliBinaryPanel.copy.test.tsx @@ -5,6 +5,7 @@ import { CliBinaryPanel } from "../CliBinaryPanel"; import { fetchFnBinaryStatus, installFnBinary } from "../../api/legacy"; vi.mock("../../api/legacy", () => ({ + fetchCodebaseMetrics: vi.fn().mockResolvedValue({ tokenEstimate: 0, sourceFileCount: 0, sourceByteCount: 0, diskBytes: 0, diskFileCount: 0, method: "local", truncated: false }), fetchFnBinaryStatus: vi.fn(), installFnBinary: vi.fn(), })); diff --git a/packages/dashboard/app/components/__tests__/ExecutorStatusBar.test.tsx b/packages/dashboard/app/components/__tests__/ExecutorStatusBar.test.tsx index af0b013109..22599aa794 100644 --- a/packages/dashboard/app/components/__tests__/ExecutorStatusBar.test.tsx +++ b/packages/dashboard/app/components/__tests__/ExecutorStatusBar.test.tsx @@ -9,7 +9,9 @@ const viewportModeMock = vi.hoisted(() => ({ value: "desktop" as "desktop" | "ta const mockFetchScripts = vi.hoisted(() => vi.fn()); vi.mock("../../hooks/useViewportMode", () => ({ - useViewportMode: () => viewportModeMock.value, + isFullScreenSheetViewport: () => false, + isShortViewport: () => false, +useViewportMode: () => viewportModeMock.value, })); vi.mock("../../api", () => ({ diff --git a/packages/dashboard/app/components/__tests__/FileBrowserModal.test.tsx b/packages/dashboard/app/components/__tests__/FileBrowserModal.test.tsx index 5ff8443738..df65fd6e63 100644 --- a/packages/dashboard/app/components/__tests__/FileBrowserModal.test.tsx +++ b/packages/dashboard/app/components/__tests__/FileBrowserModal.test.tsx @@ -14,6 +14,8 @@ vi.mock("../../hooks/useViewportMode", () => { const mode = () => (window.innerWidth <= 768 ? "mobile" : "desktop"); return { MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", + isFullScreenSheetViewport: () => false, + isShortViewport: () => false, getViewportMode: mode, isMobileViewport: () => mode() === "mobile", useViewportMode: mode, diff --git a/packages/dashboard/app/components/__tests__/GitManagerModal.test.tsx b/packages/dashboard/app/components/__tests__/GitManagerModal.test.tsx index 7d7ce98209..1f41cdab17 100644 --- a/packages/dashboard/app/components/__tests__/GitManagerModal.test.tsx +++ b/packages/dashboard/app/components/__tests__/GitManagerModal.test.tsx @@ -20,6 +20,8 @@ const mockUseMobileKeyboard = vi.fn(() => ({ vi.mock("../../hooks/useViewportMode", () => ({ MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", + isFullScreenSheetViewport: () => false, + isShortViewport: () => false, getViewportMode: () => mockUseViewportMode(), isMobileViewport: () => mockUseViewportMode() === "mobile", useViewportMode: () => mockUseViewportMode(), diff --git a/packages/dashboard/app/components/__tests__/MailboxView.test.tsx b/packages/dashboard/app/components/__tests__/MailboxView.test.tsx index 6bbf566677..322d82d900 100644 --- a/packages/dashboard/app/components/__tests__/MailboxView.test.tsx +++ b/packages/dashboard/app/components/__tests__/MailboxView.test.tsx @@ -32,7 +32,9 @@ vi.mock("../../api", () => ({ vi.mock("../../hooks/useViewportMode", () => { const useViewportMode = vi.fn(); - return { + return { isFullScreenSheetViewport: () => false, + isShortViewport: () => false, + MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", getViewportMode: () => useViewportMode(), isMobileViewport: () => useViewportMode() === "mobile", diff --git a/packages/dashboard/app/components/__tests__/MilestoneSliceInterviewModal.test.tsx b/packages/dashboard/app/components/__tests__/MilestoneSliceInterviewModal.test.tsx index 88b90339c6..e4f18e2262 100644 --- a/packages/dashboard/app/components/__tests__/MilestoneSliceInterviewModal.test.tsx +++ b/packages/dashboard/app/components/__tests__/MilestoneSliceInterviewModal.test.tsx @@ -50,6 +50,8 @@ vi.mock("../../hooks/useMobileKeyboard", () => ({ vi.mock("../../hooks/useViewportMode", () => ({ MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", + isFullScreenSheetViewport: () => false, + isShortViewport: () => false, getViewportMode: () => "mobile", isMobileViewport: () => true, useViewportMode: () => "mobile", diff --git a/packages/dashboard/app/components/__tests__/MissionManager.delete-confirm.test.tsx b/packages/dashboard/app/components/__tests__/MissionManager.delete-confirm.test.tsx index dbd93e8252..1c7fbd6947 100644 --- a/packages/dashboard/app/components/__tests__/MissionManager.delete-confirm.test.tsx +++ b/packages/dashboard/app/components/__tests__/MissionManager.delete-confirm.test.tsx @@ -22,6 +22,8 @@ const mockSubscribeSse = vi.fn(() => vi.fn()); vi.mock("../../hooks/useViewportMode", () => ({ MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", + isFullScreenSheetViewport: () => false, + isShortViewport: () => false, getViewportMode: () => mockViewportMode(), isMobileViewport: () => mockViewportMode() === "mobile", useViewportMode: () => mockViewportMode(), diff --git a/packages/dashboard/app/components/__tests__/MissionManager.swipe-back.test.tsx b/packages/dashboard/app/components/__tests__/MissionManager.swipe-back.test.tsx index 6d08b53a2f..6ce4945390 100644 --- a/packages/dashboard/app/components/__tests__/MissionManager.swipe-back.test.tsx +++ b/packages/dashboard/app/components/__tests__/MissionManager.swipe-back.test.tsx @@ -19,6 +19,8 @@ const mockSubscribeSse = vi.fn(() => vi.fn()); vi.mock("../../hooks/useViewportMode", () => ({ MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", + isFullScreenSheetViewport: () => false, + isShortViewport: () => false, getViewportMode: () => mockViewportMode(), isMobileViewport: () => mockViewportMode() === "mobile", useViewportMode: () => mockViewportMode(), diff --git a/packages/dashboard/app/components/__tests__/NewTaskModal.shared-cache.test.tsx b/packages/dashboard/app/components/__tests__/NewTaskModal.shared-cache.test.tsx index 86eaa1ac5d..e80687c450 100644 --- a/packages/dashboard/app/components/__tests__/NewTaskModal.shared-cache.test.tsx +++ b/packages/dashboard/app/components/__tests__/NewTaskModal.shared-cache.test.tsx @@ -26,7 +26,9 @@ vi.mock("../../hooks/useMobileScrollLock", () => ({ vi.mock("../../hooks/useNodes", () => ({ useNodes: vi.fn(() => ({ nodes: [] })) })); vi.mock("../../hooks/useViewportMode", () => { const useViewportMode = vi.fn(() => "desktop"); - return { + return { isFullScreenSheetViewport: () => false, + isShortViewport: () => false, + MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", getViewportMode: () => useViewportMode(), isMobileViewport: () => useViewportMode() === "mobile", diff --git a/packages/dashboard/app/components/__tests__/NewTaskModal.test.tsx b/packages/dashboard/app/components/__tests__/NewTaskModal.test.tsx index b04cc01743..66790ed30e 100644 --- a/packages/dashboard/app/components/__tests__/NewTaskModal.test.tsx +++ b/packages/dashboard/app/components/__tests__/NewTaskModal.test.tsx @@ -83,6 +83,8 @@ vi.mock("../../hooks/useMobileKeyboard", () => ({ let mockViewportMode: "mobile" | "desktop" = "mobile"; vi.mock("../../hooks/useViewportMode", () => ({ MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", + isFullScreenSheetViewport: () => false, + isShortViewport: () => false, getViewportMode: () => mockViewportMode, isMobileViewport: () => mockViewportMode === "mobile", useViewportMode: () => mockViewportMode, diff --git a/packages/dashboard/app/components/__tests__/PlanningModeModal.autosize.test.tsx b/packages/dashboard/app/components/__tests__/PlanningModeModal.autosize.test.tsx index 41c8bfd340..fc4e133c50 100644 --- a/packages/dashboard/app/components/__tests__/PlanningModeModal.autosize.test.tsx +++ b/packages/dashboard/app/components/__tests__/PlanningModeModal.autosize.test.tsx @@ -80,6 +80,8 @@ vi.mock("../../hooks/useConfirm", () => ({ vi.mock("../../hooks/useViewportMode", () => ({ MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", + isFullScreenSheetViewport: () => false, + isShortViewport: () => false, useViewportMode: () => mockUseViewportMode(), getViewportMode: () => mockUseViewportMode(), isMobileViewport: () => mockUseViewportMode() === "mobile", diff --git a/packages/dashboard/app/components/__tests__/PlanningModeModal.initial.test.tsx b/packages/dashboard/app/components/__tests__/PlanningModeModal.initial.test.tsx index a67b1a3746..e99607f48a 100644 --- a/packages/dashboard/app/components/__tests__/PlanningModeModal.initial.test.tsx +++ b/packages/dashboard/app/components/__tests__/PlanningModeModal.initial.test.tsx @@ -111,6 +111,8 @@ vi.mock("../../hooks/useConfirm", () => ({ vi.mock("../../hooks/useViewportMode", () => ({ MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", + isFullScreenSheetViewport: () => false, + isShortViewport: () => false, getViewportMode: () => mockUseViewportMode(), isMobileViewport: () => mockUseViewportMode() === "mobile", useViewportMode: () => mockUseViewportMode(), diff --git a/packages/dashboard/app/components/__tests__/PlanningModeModal.planning-flow.test.tsx b/packages/dashboard/app/components/__tests__/PlanningModeModal.planning-flow.test.tsx index 9d4e2f2e47..551d19558f 100644 --- a/packages/dashboard/app/components/__tests__/PlanningModeModal.planning-flow.test.tsx +++ b/packages/dashboard/app/components/__tests__/PlanningModeModal.planning-flow.test.tsx @@ -159,6 +159,8 @@ vi.mock("../../hooks/useConfirm", () => ({ vi.mock("../../hooks/useViewportMode", () => ({ MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", + isFullScreenSheetViewport: () => false, + isShortViewport: () => false, getViewportMode: () => mockUseViewportMode(), isMobileViewport: () => mockUseViewportMode() === "mobile", useViewportMode: () => mockUseViewportMode(), diff --git a/packages/dashboard/app/components/__tests__/PlanningModeModal.ui-interactions.test.tsx b/packages/dashboard/app/components/__tests__/PlanningModeModal.ui-interactions.test.tsx index 46339c6db2..8c05a4846f 100644 --- a/packages/dashboard/app/components/__tests__/PlanningModeModal.ui-interactions.test.tsx +++ b/packages/dashboard/app/components/__tests__/PlanningModeModal.ui-interactions.test.tsx @@ -105,7 +105,28 @@ vi.mock("../../api", () => ({ refineTask: (...args: any[]) => mockRefineTask(...args), fetchSettings: vi.fn().mockResolvedValue({ modelPresets: [], autoSelectModelPreset: false, defaultPresetBySize: {} }), fetchTaskEffectiveSettings: vi.fn().mockResolvedValue({ modelPresets: [], autoSelectModelPreset: false, defaultPresetBySize: {} }), - fetchGlobalSettings: vi.fn().mockResolvedValue({}), + /* + FNXC:PlanningModeSettings 2026-07-18-07:20: + Same FN-8245 deterministic settle as planning-flow: Start Planning is gated on + clarificationSettingsLoading, so a microtask-resolved fetchGlobalSettings makes + fireEvent.click races no-op and leaves the suite red under full-suite load. + */ + fetchGlobalSettings: vi.fn(() => { + const settled = { + then(onFulfilled: (settings: Record) => unknown) { + onFulfilled({}); + return settled; + }, + catch() { + return settled; + }, + finally(onFinally: () => unknown) { + onFinally(); + return settled; + }, + }; + return settled; + }), fetchModels: (...args: any[]) => mockFetchModels(...args), fetchWorkflowSteps: vi.fn().mockResolvedValue([]), fetchBoardWorkflows: vi.fn().mockResolvedValue({ flagEnabled: false, defaultWorkflowId: "", workflows: [], taskWorkflowIds: {} }), @@ -122,6 +143,8 @@ vi.mock("../../hooks/useConfirm", () => ({ vi.mock("../../hooks/useViewportMode", () => ({ MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", + isFullScreenSheetViewport: () => false, + isShortViewport: () => false, getViewportMode: () => mockUseViewportMode(), isMobileViewport: () => mockUseViewportMode() === "mobile", useViewportMode: () => mockUseViewportMode(), diff --git a/packages/dashboard/app/components/__tests__/ReliabilityView.test.tsx b/packages/dashboard/app/components/__tests__/ReliabilityView.test.tsx index 12e79f8fa0..2c6de4041e 100644 --- a/packages/dashboard/app/components/__tests__/ReliabilityView.test.tsx +++ b/packages/dashboard/app/components/__tests__/ReliabilityView.test.tsx @@ -3,6 +3,7 @@ import { afterEach, describe, expect, it, vi } from "vitest"; const apiMock = vi.fn(); vi.mock("../../api/legacy", () => ({ + fetchCodebaseMetrics: vi.fn().mockResolvedValue({ tokenEstimate: 0, sourceFileCount: 0, sourceByteCount: 0, diskBytes: 0, diskFileCount: 0, method: "local", truncated: false }), api: (path: string, opts?: RequestInit) => apiMock(path, opts), withProjectId: (path: string, projectId?: string) => projectId ? `${path}${path.includes("?") ? "&" : "?"}projectId=${encodeURIComponent(projectId)}` : path, diff --git a/packages/dashboard/app/components/__tests__/SettingsModal.cliBinaryVisibility.test.tsx b/packages/dashboard/app/components/__tests__/SettingsModal.cliBinaryVisibility.test.tsx index ffbb2b94c2..11d72c86cb 100644 --- a/packages/dashboard/app/components/__tests__/SettingsModal.cliBinaryVisibility.test.tsx +++ b/packages/dashboard/app/components/__tests__/SettingsModal.cliBinaryVisibility.test.tsx @@ -15,6 +15,7 @@ vi.mock("../../api", async (importOriginal) => { }); vi.mock("../../api/legacy", () => ({ + fetchCodebaseMetrics: vi.fn().mockResolvedValue({ tokenEstimate: 0, sourceFileCount: 0, sourceByteCount: 0, diskBytes: 0, diskFileCount: 0, method: "local", truncated: false }), fetchFnBinaryStatus: vi.fn(() => Promise.resolve({ binary: { binary: "fn", installed: false, path: null, version: null }, expectedVersion: "1.2.3", @@ -29,6 +30,8 @@ vi.mock("../../hooks/useMemoryBackendStatus", () => ({ })); vi.mock("../../hooks/useViewportMode", () => ({ MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", + isFullScreenSheetViewport: () => false, + isShortViewport: () => false, useViewportMode: () => "desktop", getViewportMode: () => "desktop", isMobileViewport: () => false, diff --git a/packages/dashboard/app/components/__tests__/SettingsModal.general.test.tsx b/packages/dashboard/app/components/__tests__/SettingsModal.general.test.tsx index a250ec199a..1b91b5cb20 100644 --- a/packages/dashboard/app/components/__tests__/SettingsModal.general.test.tsx +++ b/packages/dashboard/app/components/__tests__/SettingsModal.general.test.tsx @@ -159,6 +159,8 @@ let viewportMode: "mobile" | "desktop" = "mobile"; vi.mock("../../hooks/useViewportMode", () => ({ MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", + isFullScreenSheetViewport: () => false, + isShortViewport: () => false, getViewportMode: () => viewportMode, isMobileViewport: () => viewportMode === "mobile", useViewportMode: () => viewportMode, diff --git a/packages/dashboard/app/components/__tests__/SettingsModal.keyboardShortcuts.test.tsx b/packages/dashboard/app/components/__tests__/SettingsModal.keyboardShortcuts.test.tsx index e66b2fbf5f..094eea00f7 100644 --- a/packages/dashboard/app/components/__tests__/SettingsModal.keyboardShortcuts.test.tsx +++ b/packages/dashboard/app/components/__tests__/SettingsModal.keyboardShortcuts.test.tsx @@ -30,6 +30,8 @@ vi.mock("../../hooks/useMemoryBackendStatus", () => ({ })); vi.mock("../../hooks/useViewportMode", () => ({ MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", + isFullScreenSheetViewport: () => false, + isShortViewport: () => false, useViewportMode: () => "desktop", getViewportMode: () => "desktop", isMobileViewport: () => false, diff --git a/packages/dashboard/app/components/__tests__/SettingsModal.mobileClose.test.tsx b/packages/dashboard/app/components/__tests__/SettingsModal.mobileClose.test.tsx index 2ec8af12d0..6c4651d0a9 100644 --- a/packages/dashboard/app/components/__tests__/SettingsModal.mobileClose.test.tsx +++ b/packages/dashboard/app/components/__tests__/SettingsModal.mobileClose.test.tsx @@ -37,6 +37,8 @@ vi.mock("../../api", async (importOriginal) => { vi.mock("../../hooks/useViewportMode", () => ({ MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", + isFullScreenSheetViewport: () => false, + isShortViewport: () => false, useViewportMode: (...args: unknown[]) => mockUseViewportMode(...args), getViewportMode: (...args: unknown[]) => mockUseViewportMode(...args), isMobileViewport: () => mockUseViewportMode() === "mobile", diff --git a/packages/dashboard/app/components/__tests__/SettingsModal.models-auth.test.tsx b/packages/dashboard/app/components/__tests__/SettingsModal.models-auth.test.tsx index dd29d0b654..ba8fe5d1e3 100644 --- a/packages/dashboard/app/components/__tests__/SettingsModal.models-auth.test.tsx +++ b/packages/dashboard/app/components/__tests__/SettingsModal.models-auth.test.tsx @@ -158,6 +158,8 @@ vi.mock("../../hooks/useConfirm", () => ({ vi.mock("../../hooks/useViewportMode", () => ({ MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", + isFullScreenSheetViewport: () => false, + isShortViewport: () => false, getViewportMode: () => "mobile", isMobileViewport: () => true, useViewportMode: () => "mobile", diff --git a/packages/dashboard/app/components/__tests__/SettingsModal.navResize.test.tsx b/packages/dashboard/app/components/__tests__/SettingsModal.navResize.test.tsx index 9b56dc6288..685e507ba0 100644 --- a/packages/dashboard/app/components/__tests__/SettingsModal.navResize.test.tsx +++ b/packages/dashboard/app/components/__tests__/SettingsModal.navResize.test.tsx @@ -148,6 +148,8 @@ vi.mock("../../hooks/useConfirm", () => ({ vi.mock("../../hooks/useViewportMode", () => ({ MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", + isFullScreenSheetViewport: () => false, + isShortViewport: () => false, getViewportMode: () => viewportMock.mode, isMobileViewport: () => viewportMock.mode === "mobile", useViewportMode: () => viewportMock.mode, diff --git a/packages/dashboard/app/components/__tests__/SettingsModal.remote-notifications.test.tsx b/packages/dashboard/app/components/__tests__/SettingsModal.remote-notifications.test.tsx index ca2856d0d8..88f643409f 100644 --- a/packages/dashboard/app/components/__tests__/SettingsModal.remote-notifications.test.tsx +++ b/packages/dashboard/app/components/__tests__/SettingsModal.remote-notifications.test.tsx @@ -150,6 +150,8 @@ vi.mock("../../hooks/useConfirm", () => ({ vi.mock("../../hooks/useViewportMode", () => ({ MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", + isFullScreenSheetViewport: () => false, + isShortViewport: () => false, getViewportMode: () => "mobile", isMobileViewport: () => true, useViewportMode: () => "mobile", diff --git a/packages/dashboard/app/components/__tests__/SettingsModal.scheduling-merge.test.tsx b/packages/dashboard/app/components/__tests__/SettingsModal.scheduling-merge.test.tsx index 8eaf3498e5..f784c0ecab 100644 --- a/packages/dashboard/app/components/__tests__/SettingsModal.scheduling-merge.test.tsx +++ b/packages/dashboard/app/components/__tests__/SettingsModal.scheduling-merge.test.tsx @@ -151,6 +151,8 @@ vi.mock("../../hooks/useConfirm", () => ({ vi.mock("../../hooks/useViewportMode", () => ({ MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", + isFullScreenSheetViewport: () => false, + isShortViewport: () => false, getViewportMode: () => "mobile", isMobileViewport: () => true, useViewportMode: () => "mobile", diff --git a/packages/dashboard/app/components/__tests__/SettingsModal.testMode.test.tsx b/packages/dashboard/app/components/__tests__/SettingsModal.testMode.test.tsx index ec1911c668..49d9fc1a56 100644 --- a/packages/dashboard/app/components/__tests__/SettingsModal.testMode.test.tsx +++ b/packages/dashboard/app/components/__tests__/SettingsModal.testMode.test.tsx @@ -18,6 +18,8 @@ vi.mock("../../hooks/useMemoryBackendStatus", () => ({ })); vi.mock("../../hooks/useViewportMode", () => ({ MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", + isFullScreenSheetViewport: () => false, + isShortViewport: () => false, useViewportMode: () => "desktop", getViewportMode: () => "desktop", isMobileViewport: () => false, diff --git a/packages/dashboard/app/components/__tests__/SettingsModal.worktrunk.test.tsx b/packages/dashboard/app/components/__tests__/SettingsModal.worktrunk.test.tsx index 9a9941da16..bd55d33bd9 100644 --- a/packages/dashboard/app/components/__tests__/SettingsModal.worktrunk.test.tsx +++ b/packages/dashboard/app/components/__tests__/SettingsModal.worktrunk.test.tsx @@ -32,6 +32,8 @@ vi.mock("../../hooks/useWorktrunkInstallStatus", () => ({ vi.mock("../../hooks/useViewportMode", () => ({ MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", + isFullScreenSheetViewport: () => false, + isShortViewport: () => false, useViewportMode: () => "desktop", getViewportMode: () => "desktop", isMobileViewport: () => false, diff --git a/packages/dashboard/app/components/__tests__/SubtaskBreakdownModal.test.tsx b/packages/dashboard/app/components/__tests__/SubtaskBreakdownModal.test.tsx index 18d8bb6897..d0a9d9506c 100644 --- a/packages/dashboard/app/components/__tests__/SubtaskBreakdownModal.test.tsx +++ b/packages/dashboard/app/components/__tests__/SubtaskBreakdownModal.test.tsx @@ -46,6 +46,8 @@ vi.mock("../../hooks/useMobileKeyboard", () => ({ vi.mock("../../hooks/useViewportMode", () => ({ MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", + isFullScreenSheetViewport: () => false, + isShortViewport: () => false, getViewportMode: () => mockViewportMode.value, isMobileViewport: () => mockViewportMode.value === "mobile", useViewportMode: () => mockViewportMode.value, diff --git a/packages/dashboard/app/components/__tests__/TaskDetail.mobile-transition.board-panel.test.tsx b/packages/dashboard/app/components/__tests__/TaskDetail.mobile-transition.board-panel.test.tsx index 25b98b7892..b0c4494c88 100644 --- a/packages/dashboard/app/components/__tests__/TaskDetail.mobile-transition.board-panel.test.tsx +++ b/packages/dashboard/app/components/__tests__/TaskDetail.mobile-transition.board-panel.test.tsx @@ -234,6 +234,8 @@ vi.mock("../../hooks/useNodes", () => ({ const mockUseViewportMode = vi.fn(() => "desktop"); vi.mock("../../hooks/useViewportMode", () => ({ MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", + isFullScreenSheetViewport: () => false, + isShortViewport: () => false, getViewportMode: () => mockUseViewportMode(), isMobileViewport: () => mockUseViewportMode() === "mobile", useViewportMode: (..._args: unknown[]) => mockUseViewportMode(..._args), diff --git a/packages/dashboard/app/components/__tests__/TaskDetail.swipe-back.test.tsx b/packages/dashboard/app/components/__tests__/TaskDetail.swipe-back.test.tsx index 13d888411f..f8d4c36668 100644 --- a/packages/dashboard/app/components/__tests__/TaskDetail.swipe-back.test.tsx +++ b/packages/dashboard/app/components/__tests__/TaskDetail.swipe-back.test.tsx @@ -308,6 +308,8 @@ vi.mock("../../hooks/useNodes", () => ({ const mockUseViewportMode = vi.fn(() => "desktop"); vi.mock("../../hooks/useViewportMode", () => ({ MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", + isFullScreenSheetViewport: () => false, + isShortViewport: () => false, getViewportMode: () => mockUseViewportMode(), isMobileViewport: () => mockUseViewportMode() === "mobile", useViewportMode: (..._args: unknown[]) => mockUseViewportMode(..._args), diff --git a/packages/dashboard/app/components/__tests__/agent-modals-mobile.test.tsx b/packages/dashboard/app/components/__tests__/agent-modals-mobile.test.tsx index 24f8dbc401..32175c1ba3 100644 --- a/packages/dashboard/app/components/__tests__/agent-modals-mobile.test.tsx +++ b/packages/dashboard/app/components/__tests__/agent-modals-mobile.test.tsx @@ -9,6 +9,11 @@ import { AgentImportModal } from "../AgentImportModal"; import { AgentListModal } from "../AgentListModal"; import * as api from "../../api"; +/* +FNXC:DashboardTests 2026-07-18-07:15: +AgentDetailView/AgentListModal now call fetchSettings for runtime-config surfaces. +Include it on the ../../api mock so vitest does not fail the suite on missing export. +*/ vi.mock("../../api", () => ({ fetchAgent: vi.fn(), updateAgent: vi.fn(), @@ -43,6 +48,7 @@ vi.mock("../../api", () => ({ resetAgentBudget: vi.fn(), upgradeAgentHeartbeatProcedure: vi.fn(), fetchCompanies: vi.fn(), + fetchSettings: vi.fn().mockResolvedValue({}), })); vi.mock("../AgentLogViewer", () => ({ diff --git a/packages/dashboard/app/components/__tests__/navigation-history.test.tsx b/packages/dashboard/app/components/__tests__/navigation-history.test.tsx index 1c89cee0e7..b02cd655c7 100644 --- a/packages/dashboard/app/components/__tests__/navigation-history.test.tsx +++ b/packages/dashboard/app/components/__tests__/navigation-history.test.tsx @@ -349,6 +349,8 @@ vi.mock("../../hooks/useNodes", () => ({ const mockUseViewportMode = vi.fn(() => "desktop"); vi.mock("../../hooks/useViewportMode", () => ({ MOBILE_MEDIA_QUERY: "(max-width: 768px), (max-height: 480px)", + isFullScreenSheetViewport: () => false, + isShortViewport: () => false, getViewportMode: () => mockUseViewportMode(), isMobileViewport: () => mockUseViewportMode() === "mobile", useViewportMode: (..._args: unknown[]) => mockUseViewportMode(..._args), diff --git a/packages/dashboard/app/components/command-center/__tests__/CommandCenter.mobile-scroll.test.tsx b/packages/dashboard/app/components/command-center/__tests__/CommandCenter.mobile-scroll.test.tsx index 1d371eee22..f08fd57e03 100644 --- a/packages/dashboard/app/components/command-center/__tests__/CommandCenter.mobile-scroll.test.tsx +++ b/packages/dashboard/app/components/command-center/__tests__/CommandCenter.mobile-scroll.test.tsx @@ -8,6 +8,7 @@ import { CommandCenter } from "../CommandCenter"; const apiMock = vi.fn(); vi.mock("../../../api/legacy", () => ({ + fetchCodebaseMetrics: vi.fn().mockResolvedValue({ tokenEstimate: 0, sourceFileCount: 0, sourceByteCount: 0, diskBytes: 0, diskFileCount: 0, method: "local", truncated: false }), api: (path: string, opts?: RequestInit) => apiMock(path, opts), withProjectId: (path: string, projectId?: string) => projectId ? `${path}${path.includes("?") ? "&" : "?"}projectId=${encodeURIComponent(projectId)}` : path, diff --git a/packages/dashboard/app/components/command-center/__tests__/CommandCenter.tablet-layout.test.tsx b/packages/dashboard/app/components/command-center/__tests__/CommandCenter.tablet-layout.test.tsx index 59767a51db..bc04bb4481 100644 --- a/packages/dashboard/app/components/command-center/__tests__/CommandCenter.tablet-layout.test.tsx +++ b/packages/dashboard/app/components/command-center/__tests__/CommandCenter.tablet-layout.test.tsx @@ -8,6 +8,7 @@ import { CommandCenter } from "../CommandCenter"; const apiMock = vi.fn(); vi.mock("../../../api/legacy", () => ({ + fetchCodebaseMetrics: vi.fn().mockResolvedValue({ tokenEstimate: 0, sourceFileCount: 0, sourceByteCount: 0, diskBytes: 0, diskFileCount: 0, method: "local", truncated: false }), api: (path: string, opts?: RequestInit) => apiMock(path, opts), withProjectId: (path: string, projectId?: string) => projectId ? `${path}${path.includes("?") ? "&" : "?"}projectId=${encodeURIComponent(projectId)}` : path, diff --git a/packages/dashboard/app/components/command-center/__tests__/MissionControlPanel.test.tsx b/packages/dashboard/app/components/command-center/__tests__/MissionControlPanel.test.tsx index c9e6de5e44..2075a4659c 100644 --- a/packages/dashboard/app/components/command-center/__tests__/MissionControlPanel.test.tsx +++ b/packages/dashboard/app/components/command-center/__tests__/MissionControlPanel.test.tsx @@ -5,6 +5,7 @@ import type { LiveSnapshot } from "@fusion/core"; // Mock the api() helper so the panel fetches deterministic snapshots. const apiMock = vi.fn(); vi.mock("../../../api/legacy", () => ({ + fetchCodebaseMetrics: vi.fn().mockResolvedValue({ tokenEstimate: 0, sourceFileCount: 0, sourceByteCount: 0, diskBytes: 0, diskFileCount: 0, method: "local", truncated: false }), api: (path: string, opts?: RequestInit) => apiMock(path, opts), withProjectId: (path: string, projectId?: string) => projectId ? `${path}${path.includes("?") ? "&" : "?"}projectId=${encodeURIComponent(projectId)}` : path, diff --git a/packages/dashboard/app/components/command-center/__tests__/SdlcFunnel.test.tsx b/packages/dashboard/app/components/command-center/__tests__/SdlcFunnel.test.tsx index 0b1161719b..b499dcc919 100644 --- a/packages/dashboard/app/components/command-center/__tests__/SdlcFunnel.test.tsx +++ b/packages/dashboard/app/components/command-center/__tests__/SdlcFunnel.test.tsx @@ -4,6 +4,7 @@ import { render, screen, waitFor } from "@testing-library/react"; // Mock the api() helper so the funnel fetches a deterministic fixture. const apiMock = vi.fn(); vi.mock("../../../api/legacy", () => ({ + fetchCodebaseMetrics: vi.fn().mockResolvedValue({ tokenEstimate: 0, sourceFileCount: 0, sourceByteCount: 0, diskBytes: 0, diskFileCount: 0, method: "local", truncated: false }), api: (path: string, opts?: RequestInit) => apiMock(path, opts), withProjectId: (path: string, projectId?: string) => projectId ? `${path}${path.includes("?") ? "&" : "?"}projectId=${encodeURIComponent(projectId)}` : path, diff --git a/packages/dashboard/app/components/command-center/__tests__/SystemControlsArea.test.tsx b/packages/dashboard/app/components/command-center/__tests__/SystemControlsArea.test.tsx index f9e286b3a5..ec9d3199e7 100644 --- a/packages/dashboard/app/components/command-center/__tests__/SystemControlsArea.test.tsx +++ b/packages/dashboard/app/components/command-center/__tests__/SystemControlsArea.test.tsx @@ -16,6 +16,7 @@ const mockFetchGlobalSettings = vi.fn(); const mockFetchNodes = vi.fn(); vi.mock("../../../api/legacy", () => ({ + fetchCodebaseMetrics: vi.fn().mockResolvedValue({ tokenEstimate: 0, sourceFileCount: 0, sourceByteCount: 0, diskBytes: 0, diskFileCount: 0, method: "local", truncated: false }), api: (path: string, opts?: RequestInit) => apiMock(path, opts), withProjectId: (path: string, projectId?: string) => projectId ? `${path}${path.includes("?") ? "&" : "?"}projectId=${encodeURIComponent(projectId)}` : path, diff --git a/packages/dashboard/app/components/command-center/areas/__tests__/TeamArea.orgchart-pan.test.tsx b/packages/dashboard/app/components/command-center/areas/__tests__/TeamArea.orgchart-pan.test.tsx index ed795b145a..8d9c680c80 100644 --- a/packages/dashboard/app/components/command-center/areas/__tests__/TeamArea.orgchart-pan.test.tsx +++ b/packages/dashboard/app/components/command-center/areas/__tests__/TeamArea.orgchart-pan.test.tsx @@ -16,6 +16,7 @@ const mocks = vi.hoisted(() => ({ })); vi.mock("../../../../api/legacy", () => ({ + fetchCodebaseMetrics: vi.fn().mockResolvedValue({ tokenEstimate: 0, sourceFileCount: 0, sourceByteCount: 0, diskBytes: 0, diskFileCount: 0, method: "local", truncated: false }), fetchOrgTree: mocks.fetchOrgTree, fetchExecutorStats: mocks.fetchExecutorStats, fetchSettings: mocks.fetchSettings, diff --git a/packages/dashboard/app/components/command-center/areas/__tests__/TokensArea.test.tsx b/packages/dashboard/app/components/command-center/areas/__tests__/TokensArea.test.tsx index 543f81ef7e..8cdc6924f0 100644 --- a/packages/dashboard/app/components/command-center/areas/__tests__/TokensArea.test.tsx +++ b/packages/dashboard/app/components/command-center/areas/__tests__/TokensArea.test.tsx @@ -7,6 +7,7 @@ import type { DateRange } from "../../DateRangePicker"; const apiMock = vi.fn(); vi.mock("../../../../api/legacy", () => ({ + fetchCodebaseMetrics: vi.fn().mockResolvedValue({ tokenEstimate: 0, sourceFileCount: 0, sourceByteCount: 0, diskBytes: 0, diskFileCount: 0, method: "local", truncated: false }), api: (path: string, opts?: RequestInit) => apiMock(path, opts), withProjectId: (path: string, projectId?: string) => projectId ? `${path}${path.includes("?") ? "&" : "?"}projectId=${encodeURIComponent(projectId)}` : path, diff --git a/packages/dashboard/app/components/command-center/areas/__tests__/WorkflowArea.test.tsx b/packages/dashboard/app/components/command-center/areas/__tests__/WorkflowArea.test.tsx index 6066330774..0c794b6319 100644 --- a/packages/dashboard/app/components/command-center/areas/__tests__/WorkflowArea.test.tsx +++ b/packages/dashboard/app/components/command-center/areas/__tests__/WorkflowArea.test.tsx @@ -7,6 +7,7 @@ const mocks = vi.hoisted(() => ({ })); vi.mock("../../../../api/legacy", () => ({ + fetchCodebaseMetrics: vi.fn().mockResolvedValue({ tokenEstimate: 0, sourceFileCount: 0, sourceByteCount: 0, diskBytes: 0, diskFileCount: 0, method: "local", truncated: false }), api: (path: string, opts?: RequestInit) => mocks.api(path, opts), withProjectId: (path: string, projectId?: string) => projectId ? `${path}${path.includes("?") ? "&" : "?"}projectId=${encodeURIComponent(projectId)}` : path, diff --git a/packages/dashboard/app/components/command-center/areas/__tests__/areas.github-signals.test.tsx b/packages/dashboard/app/components/command-center/areas/__tests__/areas.github-signals.test.tsx index 1659ac6e82..accc48b8e7 100644 --- a/packages/dashboard/app/components/command-center/areas/__tests__/areas.github-signals.test.tsx +++ b/packages/dashboard/app/components/command-center/areas/__tests__/areas.github-signals.test.tsx @@ -25,6 +25,7 @@ const fetchExecutorStatsMock = mocks.fetchExecutorStats; const toggleEnginePauseMock = mocks.toggleEnginePause; const appSettingsMock = mocks.appSettings; vi.mock("../../../../api/legacy", () => ({ + fetchCodebaseMetrics: vi.fn().mockResolvedValue({ tokenEstimate: 0, sourceFileCount: 0, sourceByteCount: 0, diskBytes: 0, diskFileCount: 0, method: "local", truncated: false }), api: (path: string, opts?: RequestInit) => mocks.api(path, opts), withProjectId: (path: string, projectId?: string) => projectId ? `${path}${path.includes("?") ? "&" : "?"}projectId=${encodeURIComponent(projectId)}` : path, diff --git a/packages/dashboard/app/components/command-center/areas/__tests__/areas.gitlab-signals.test.tsx b/packages/dashboard/app/components/command-center/areas/__tests__/areas.gitlab-signals.test.tsx index c81dc212a9..465a0168f5 100644 --- a/packages/dashboard/app/components/command-center/areas/__tests__/areas.gitlab-signals.test.tsx +++ b/packages/dashboard/app/components/command-center/areas/__tests__/areas.gitlab-signals.test.tsx @@ -3,6 +3,7 @@ import { render, screen, within } from "@testing-library/react"; const mocks = vi.hoisted(() => ({ api: vi.fn() })); vi.mock("../../../../api/legacy", () => ({ + fetchCodebaseMetrics: vi.fn().mockResolvedValue({ tokenEstimate: 0, sourceFileCount: 0, sourceByteCount: 0, diskBytes: 0, diskFileCount: 0, method: "local", truncated: false }), api: (path: string, opts?: RequestInit) => mocks.api(path, opts), withProjectId: (path: string, projectId?: string) => projectId ? `${path}${path.includes("?") ? "&" : "?"}projectId=${encodeURIComponent(projectId)}` : path, diff --git a/packages/dashboard/app/components/command-center/areas/__tests__/areas.test.tsx b/packages/dashboard/app/components/command-center/areas/__tests__/areas.test.tsx index 90f22472b2..c8fe6e3d6c 100644 --- a/packages/dashboard/app/components/command-center/areas/__tests__/areas.test.tsx +++ b/packages/dashboard/app/components/command-center/areas/__tests__/areas.test.tsx @@ -30,6 +30,7 @@ const fetchExecutorStatsMock = mocks.fetchExecutorStats; const toggleEnginePauseMock = mocks.toggleEnginePause; const appSettingsMock = mocks.appSettings; vi.mock("../../../../api/legacy", () => ({ + fetchCodebaseMetrics: vi.fn().mockResolvedValue({ tokenEstimate: 0, sourceFileCount: 0, sourceByteCount: 0, diskBytes: 0, diskFileCount: 0, method: "local", truncated: false }), api: (path: string, opts?: RequestInit) => mocks.api(path, opts), withProjectId: (path: string, projectId?: string) => projectId ? `${path}${path.includes("?") ? "&" : "?"}projectId=${encodeURIComponent(projectId)}` : path, diff --git a/packages/dashboard/app/components/settings/search/__tests__/settings-search-index.test.ts b/packages/dashboard/app/components/settings/search/__tests__/settings-search-index.test.ts index c0580e6a28..ccb78df5da 100644 --- a/packages/dashboard/app/components/settings/search/__tests__/settings-search-index.test.ts +++ b/packages/dashboard/app/components/settings/search/__tests__/settings-search-index.test.ts @@ -18,9 +18,21 @@ const SECTIONS_DIR = resolve(__dirname, "../../sections"); * Extracts the descriptor keys a section renders. Matches the established * `descriptor={{ key: "..." }}` idiom every typed row uses (see GeneralSection * and AppearanceSection); `key` is always the first property by convention. + * + * FNXC:SettingsSearch 2026-07-18-07:15: + * Also inventory bespoke SettingsFieldRow controls that anchor search via + * `htmlFor` → `data-settings-key` (e.g. general.mobileNavPrimaryItems). Those + * rows are indexed and jumpable but never use the descriptor={{ key }} shape. */ function extractDescriptorKeys(source: string): string[] { - return [...source.matchAll(/descriptor=\{\{\s*key:\s*"([^"]+)"/g)].map((m) => m[1]); + const keys = new Set(); + for (const m of source.matchAll(/descriptor=\{\{\s*key:\s*"([^"]+)"/g)) { + keys.add(m[1]); + } + for (const m of source.matchAll(/ ({ +/* +FNXC:EngineTests 2026-07-18-06:40: +Hoist mock filesystem state for vi.mock factories. Module import of schema-applier +can call existsSync before const mockFiles initializes (TDZ), same class as skill-resolver. +*/ +const { mockPiLog, mockFiles, mockDirCounter } = vi.hoisted(() => ({ mockPiLog: { log: vi.fn(), warn: vi.fn(), error: vi.fn(), }, + mockFiles: new Map(), + mockDirCounter: { value: 0 }, })); vi.mock("../logger.js", () => ({ @@ -24,17 +31,13 @@ import type { Agent, AgentStore } from "@fusion/core"; // ── Mock Setup ─────────────────────────────────────────────────────────────── -// In-memory file system for tests - using a module-scoped Map -const mockFiles = new Map(); -let mockDirCounter = 0; - vi.mock("node:fs", async () => { const actual = await vi.importActual("node:fs"); return { ...actual, existsSync: (path: unknown) => mockFiles.has(String(path)), readFileSync: (path: unknown) => mockFiles.get(String(path)) ?? "{}", - mkdtempSync: () => `/tmp/agent-skills-flow-mock-${++mockDirCounter}`, + mkdtempSync: () => `/tmp/agent-skills-flow-mock-${++mockDirCounter.value}`, writeFileSync: (path: unknown, content: unknown) => mockFiles.set(String(path), String(content)), rmSync: (path: unknown) => { const pathStr = String(path); @@ -48,7 +51,7 @@ vi.mock("node:fs", async () => { // ── Test Helpers ───────────────────────────────────────────────────────────── function createMockProjectDir(settings: Record | null): string { - const dir = `/tmp/agent-skills-flow-mock-${++mockDirCounter}`; + const dir = `/tmp/agent-skills-flow-mock-${++mockDirCounter.value}`; if (settings !== null) { mockFiles.set(`${dir}/.fusion/settings.json`, JSON.stringify(settings)); } @@ -60,7 +63,7 @@ function createMockProjectDir(settings: Record | null): string describe("agent skills flow - full integration", () => { beforeEach(() => { mockFiles.clear(); - mockDirCounter = 0; + mockDirCounter.value = 0; mockPiLog.log.mockClear(); mockPiLog.warn.mockClear(); mockPiLog.error.mockClear(); diff --git a/plugins/fusion-plugin-grok-runtime/src/__tests__/process-lifecycle.test.ts b/plugins/fusion-plugin-grok-runtime/src/__tests__/process-lifecycle.test.ts index 57a07f58e8..c1a84db5e8 100644 --- a/plugins/fusion-plugin-grok-runtime/src/__tests__/process-lifecycle.test.ts +++ b/plugins/fusion-plugin-grok-runtime/src/__tests__/process-lifecycle.test.ts @@ -14,6 +14,12 @@ describe("Grok plugin process lifecycle", () => { vi.resetModules(); }); + /* + FNXC:GrokRuntimeTests 2026-07-18-07:15: + Bound is proven by a few re-evaluations (Symbol.for exit-hook guard). Full-suite + shard load made 15 dynamic imports hit the default 5s testTimeout (transform-heavy + plugin graph), not a product hang — keep the assertion, reduce iterations. + */ it("keeps its process cleanup owner bounded across repeated module evaluation", async () => { const baseline = listenerCounts(); const warnings: Error[] = []; @@ -21,7 +27,7 @@ describe("Grok plugin process lifecycle", () => { process.on("warning", onWarning); try { - for (let iteration = 0; iteration < 15; iteration += 1) { + for (let iteration = 0; iteration < 5; iteration += 1) { vi.resetModules(); await import("../index.js"); }