@burdenoff/fluidgrids-fe-sdk 2026.930.2 → 2026.930.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/{ExecutionDetailPage-RK3KJ46E.js → ExecutionDetailPage-TDE7OEEM.js} +4 -4
  2. package/dist/{ExecutionDetailPage-RK3KJ46E.js.map → ExecutionDetailPage-TDE7OEEM.js.map} +1 -1
  3. package/dist/{ExecutionsListPage-NXINADRN.js → ExecutionsListPage-CJGHZKBU.js} +4 -4
  4. package/dist/{ExecutionsListPage-NXINADRN.js.map → ExecutionsListPage-CJGHZKBU.js.map} +1 -1
  5. package/dist/{WorkflowBuilder-EXHCYJFW.js → WorkflowBuilder-MCBEAHRS.js} +5 -5
  6. package/dist/{WorkflowBuilder-EXHCYJFW.js.map → WorkflowBuilder-MCBEAHRS.js.map} +1 -1
  7. package/dist/{WorkflowsList-AFTTUUHX.js → WorkflowsList-BLTHWPFH.js} +4 -4
  8. package/dist/{WorkflowsList-AFTTUUHX.js.map → WorkflowsList-BLTHWPFH.js.map} +1 -1
  9. package/dist/{chunk-IJSJOTIZ.js → chunk-2GG7H3TG.js} +3 -3
  10. package/dist/{chunk-IJSJOTIZ.js.map → chunk-2GG7H3TG.js.map} +1 -1
  11. package/dist/{chunk-USFSPC6S.js → chunk-37BHUNJW.js} +2 -2
  12. package/dist/chunk-37BHUNJW.js.map +1 -0
  13. package/dist/{chunk-NTJTPYCD.js → chunk-3B5YEXSW.js} +3 -7
  14. package/dist/chunk-3B5YEXSW.js.map +1 -0
  15. package/dist/{chunk-R5ZYOIZG.js → chunk-BNSM27CU.js} +3 -3
  16. package/dist/{chunk-R5ZYOIZG.js.map → chunk-BNSM27CU.js.map} +1 -1
  17. package/dist/{chunk-NHZQE7ZB.js → chunk-JYBARIVZ.js} +3 -3
  18. package/dist/{chunk-NHZQE7ZB.js.map → chunk-JYBARIVZ.js.map} +1 -1
  19. package/dist/{chunk-N7D4IAYM.js → chunk-LZZZNEBI.js} +4 -4
  20. package/dist/{chunk-N7D4IAYM.js.map → chunk-LZZZNEBI.js.map} +1 -1
  21. package/dist/{chunk-C4YEGUY2.js → chunk-OMCLKOFQ.js} +3 -3
  22. package/dist/{chunk-C4YEGUY2.js.map → chunk-OMCLKOFQ.js.map} +1 -1
  23. package/dist/{chunk-GBXVY4MJ.js → chunk-QM4C7YDK.js} +143 -36
  24. package/dist/chunk-QM4C7YDK.js.map +1 -0
  25. package/dist/{chunk-7SX5OWZR.js → chunk-QOZASRIB.js} +20 -3
  26. package/dist/chunk-QOZASRIB.js.map +1 -0
  27. package/dist/{chunk-2FUWCGY6.js → chunk-XH3UV667.js} +43 -6
  28. package/dist/chunk-XH3UV667.js.map +1 -0
  29. package/dist/executions.js +3 -3
  30. package/dist/index.d.ts +2 -2
  31. package/dist/index.js +16 -16
  32. package/dist/index.js.map +1 -1
  33. package/dist/settings.js +2 -2
  34. package/dist/templates.js +3 -3
  35. package/dist/{workflow-builder-DqInt43T.d.ts → workflow-builder-CpdCzzst.d.ts} +2 -0
  36. package/dist/workflow-builder.d.ts +1 -1
  37. package/dist/workflow-builder.js +4 -4
  38. package/dist/workflows-list.js +2 -2
  39. package/package.json +1 -1
  40. package/dist/chunk-2FUWCGY6.js.map +0 -1
  41. package/dist/chunk-7SX5OWZR.js.map +0 -1
  42. package/dist/chunk-GBXVY4MJ.js.map +0 -1
  43. package/dist/chunk-NTJTPYCD.js.map +0 -1
  44. package/dist/chunk-USFSPC6S.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/modules/executions/types/index.ts","../src/modules/executions/components/ExecutionStatusBadge.tsx","../src/modules/executions/store/executionsStore.ts","../src/modules/executions/components/ExecutionFilters.tsx","../src/modules/executions/components/ExecutionStats.tsx","../src/modules/executions/utils/run-display.ts","../src/modules/executions/components/ExecutionTable.tsx","../src/modules/executions/components/ExecutionCards.tsx","../src/modules/executions/components/ExecutionTimeline.tsx","../src/modules/executions/components/NodeTimeline.tsx","../src/modules/executions/components/RunLogViewer.tsx","../src/modules/executions/components/Pagination.tsx","../src/stubs/subscription-stubs.ts","../src/modules/executions/utils/retry.ts","../src/modules/executions/hooks/useExecutions.ts"],"names":["jsxs","jsx","Icon","formatDuration","formatDate","Button","useState","formatTime","useMemo","useCallback","useRef","useEffect","error"],"mappings":"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","file":"chunk-37BHUNJW.js","sourcesContent":["/**\n * Workflow Execution Types\n * Comprehensive type definitions for workflow runs, executions, and node states\n */\n\n// ============================================================================\n// Enums & Status Types\n// ============================================================================\n\nexport type RunStatus =\n | \"PENDING\"\n | \"RUNNING\"\n | \"COMPLETED\"\n | \"FAILED\"\n | \"CANCELLED\"\n | \"WAITING\"\n | \"TERMINATED\";\n\nexport type RunMode = \"TEST\" | \"PRODUCTION\";\n\nexport type NodeStatus =\n | \"PENDING\"\n | \"RUNNING\"\n | \"COMPLETED\"\n | \"FAILED\"\n | \"SKIPPED\"\n | \"DELAYED\"\n | \"CANCELLED\"\n | \"TIMEOUT\"\n | \"WAITING_SUBWORKFLOW\";\n\nexport type ErrorType =\n | \"TIMEOUT\"\n | \"TRANSIENT\"\n | \"DEPENDENCY\"\n | \"AUTHORIZATION\"\n | \"VALIDATION\"\n | \"PERMANENT\"\n | \"UNKNOWN\";\n\n/** Severity of a run log line. */\nexport type RunLogLevel = \"DEBUG\" | \"INFO\" | \"WARN\" | \"ERROR\";\n\n/**\n * Where a run log line came from.\n *\n * `SYSTEM` is the executor narrating the run; `STDOUT`/`STDERR` is output the\n * workflow author's own code produced (a Log node's message, `console.log` or\n * `print` in a Code node, or the node container's stdout). The viewer styles\n * the two differently so \"what the platform did\" reads apart from \"what my\n * workflow printed\".\n */\nexport type RunLogStream = \"SYSTEM\" | \"STDOUT\" | \"STDERR\";\n\n/** One line of a workflow run's execution log. */\nexport interface RunLogLine {\n id: string;\n runId: string;\n /** Null for run-level lines (run started, run completed, ...). */\n nodeId?: string | null;\n nodeStateId?: string | null;\n /** Retry attempt of the node execution that produced this line. */\n attempt: number;\n level: RunLogLevel;\n stream: RunLogStream;\n /** Coarse stage within the node execution (\"node-start\", \"node-stdout\", ...). */\n phase?: string | null;\n message: string;\n data?: unknown;\n truncated: boolean;\n timestamp: string;\n}\n\n// ============================================================================\n// Core Entity Types\n// ============================================================================\n\nexport interface WorkflowRun {\n id: string;\n workflowId: string;\n workflowKey: string;\n version: string;\n triggerNodeId: string;\n triggerData?: unknown;\n status: RunStatus;\n mode?: RunMode;\n context?: unknown;\n triggeredById?: string;\n parentRunId?: string;\n createdAt: string;\n updatedAt: string;\n startedAt?: string;\n completedAt?: string;\n duration?: number;\n errorMessage?: string;\n errorType?: ErrorType;\n totalNodes?: number;\n completedNodes?: number;\n failedNodes?: number;\n skippedNodes?: number;\n progress: number;\n nodeStates?: NodeState[];\n workflow?: {\n id: string;\n name: string;\n description?: string;\n definitionJson?: unknown;\n };\n}\n\nexport interface NodeState {\n id: string;\n runId: string;\n nodeId: string;\n nodeType: string;\n nodeVersion: string;\n status: NodeStatus;\n attemptCount: number;\n inputArgs?: unknown;\n output?: unknown;\n error?: string;\n errorType?: ErrorType;\n startTime?: string;\n endTime?: string;\n duration?: number;\n resumeTime?: string;\n childRunId?: string;\n instanceKey?: string;\n context?: unknown;\n metadata?: unknown;\n}\n\nexport interface ExecutionLog {\n id: string;\n runId: string;\n level: \"DEBUG\" | \"INFO\" | \"WARN\" | \"ERROR\";\n message: string;\n nodeId?: string;\n nodeType?: string;\n timestamp: string;\n metadata?: unknown;\n}\n\n// ============================================================================\n// Filter & Pagination Types\n// ============================================================================\n\nexport interface ExecutionsFilter {\n status: RunStatus | \"all\";\n workflowKey: string;\n dateRange: DateRange;\n search: string;\n triggerType: \"all\" | \"MANUAL\" | \"WEBHOOK\" | \"SCHEDULE\" | \"EVENT\";\n durationMinSeconds: number | null;\n durationMaxSeconds: number | null;\n errorType: ErrorType | \"all\";\n nodeId: string;\n}\n\nexport interface DateRange {\n start: Date | null;\n end: Date | null;\n preset:\n \"today\" | \"yesterday\" | \"7days\" | \"30days\" | \"90days\" | \"custom\" | \"all\";\n}\n\nexport interface ListExecutionsInput {\n limit?: number;\n offset?: number;\n status?: RunStatus;\n workflowKey?: string;\n workspaceId?: string;\n startDate?: string;\n endDate?: string;\n /**\n * Free-text term for the Runs search box. Matches a run id prefix, or a\n * workflow key or name containing it (BOFF-7268).\n */\n search?: string;\n triggerType?: \"MANUAL\" | \"WEBHOOK\" | \"SCHEDULE\" | \"EVENT\";\n durationMinSeconds?: number;\n durationMaxSeconds?: number;\n errorType?: ErrorType;\n nodeId?: string;\n}\n\nexport interface ExecutionsListResponse {\n items: WorkflowRun[];\n total: number;\n hasMore: boolean;\n}\n\n// ============================================================================\n// UI State Types\n// ============================================================================\n\nexport type ExecutionsViewMode = \"table\" | \"timeline\" | \"cards\";\n\nexport interface ExecutionSelection {\n runIds: string[];\n allSelected: boolean;\n}\n\nexport interface ExecutionsPagination {\n page: number;\n pageSize: number;\n total: number;\n}\n\n// ============================================================================\n// Dashboard & Stats Types\n// ============================================================================\n\nexport interface ExecutionStats {\n total: number;\n running: number;\n completed: number;\n failed: number;\n cancelled: number;\n pending: number;\n waiting: number;\n successRate: number;\n avgDuration: number;\n}\n\nexport interface TimeSeriesDataPoint {\n timestamp: string;\n workflowRuns: number;\n successfulRuns: number;\n failedRuns: number;\n cancelledRuns: number;\n nodeExecutions: number;\n totalDuration?: number;\n averageDuration?: number;\n}\n\nexport interface NodeUsageStat {\n nodeType: string;\n totalExecutions: number;\n successCount: number;\n failureCount: number;\n avgExecutionTime: number;\n}\n\n// ============================================================================\n// Action Types\n// ============================================================================\n\nexport type ExecutionAction = \"cancel\" | \"pause\" | \"resume\" | \"retry\" | \"view\";\n\nexport interface BulkExecutionAction {\n action: ExecutionAction;\n runIds: string[];\n}\n\n// ============================================================================\n// Helper Types\n// ============================================================================\n\nexport interface StatusConfig {\n label: string;\n color: string;\n bgColor: string;\n borderColor: string;\n icon: string;\n}\n\nexport const RUN_STATUS_CONFIG: Record<RunStatus, StatusConfig> = {\n PENDING: {\n label: \"Pending\",\n color: \"text-gray-600 dark:text-gray-400\",\n bgColor: \"bg-gray-50 dark:bg-gray-800\",\n borderColor: \"border-gray-200 dark:border-gray-700\",\n icon: \"mdi:clock-outline\",\n },\n RUNNING: {\n label: \"Running\",\n color: \"text-blue-600 dark:text-blue-400\",\n bgColor: \"bg-blue-50 dark:bg-blue-900/20\",\n borderColor: \"border-blue-200 dark:border-blue-800\",\n icon: \"mdi:play-circle-outline\",\n },\n COMPLETED: {\n label: \"Completed\",\n color: \"text-green-600 dark:text-green-400\",\n bgColor: \"bg-green-50 dark:bg-green-900/20\",\n borderColor: \"border-green-200 dark:border-green-800\",\n icon: \"mdi:check-circle-outline\",\n },\n FAILED: {\n label: \"Failed\",\n color: \"text-red-600 dark:text-red-400\",\n bgColor: \"bg-red-50 dark:bg-red-900/20\",\n borderColor: \"border-red-200 dark:border-red-800\",\n icon: \"mdi:alert-circle-outline\",\n },\n CANCELLED: {\n label: \"Cancelled\",\n color: \"text-orange-600 dark:text-orange-400\",\n bgColor: \"bg-orange-50 dark:bg-orange-900/20\",\n borderColor: \"border-orange-200 dark:border-orange-800\",\n icon: \"mdi:cancel\",\n },\n WAITING: {\n label: \"Waiting\",\n color: \"text-purple-600 dark:text-purple-400\",\n bgColor: \"bg-purple-50 dark:bg-purple-900/20\",\n borderColor: \"border-purple-200 dark:border-purple-800\",\n icon: \"mdi:timer-sand\",\n },\n TERMINATED: {\n label: \"Terminated\",\n color: \"text-gray-600 dark:text-gray-400\",\n bgColor: \"bg-gray-50 dark:bg-gray-800\",\n borderColor: \"border-gray-300 dark:border-gray-600\",\n icon: \"mdi:stop-circle-outline\",\n },\n};\n\nexport const NODE_STATUS_CONFIG: Record<NodeStatus, StatusConfig> = {\n PENDING: {\n label: \"Pending\",\n color: \"text-gray-600 dark:text-gray-400\",\n bgColor: \"bg-gray-50 dark:bg-gray-800\",\n borderColor: \"border-gray-200 dark:border-gray-700\",\n icon: \"mdi:clock-outline\",\n },\n RUNNING: {\n label: \"Running\",\n color: \"text-blue-600 dark:text-blue-400\",\n bgColor: \"bg-blue-50 dark:bg-blue-900/20\",\n borderColor: \"border-blue-200 dark:border-blue-800\",\n icon: \"mdi:play-circle-outline\",\n },\n COMPLETED: {\n label: \"Completed\",\n color: \"text-green-600 dark:text-green-400\",\n bgColor: \"bg-green-50 dark:bg-green-900/20\",\n borderColor: \"border-green-200 dark:border-green-800\",\n icon: \"mdi:check-circle-outline\",\n },\n FAILED: {\n label: \"Failed\",\n color: \"text-red-600 dark:text-red-400\",\n bgColor: \"bg-red-50 dark:bg-red-900/20\",\n borderColor: \"border-red-200 dark:border-red-800\",\n icon: \"mdi:alert-circle-outline\",\n },\n SKIPPED: {\n label: \"Skipped\",\n color: \"text-gray-500 dark:text-gray-500\",\n bgColor: \"bg-gray-100 dark:bg-gray-700\",\n borderColor: \"border-gray-200 dark:border-gray-600\",\n icon: \"mdi:skip-next\",\n },\n DELAYED: {\n label: \"Delayed\",\n color: \"text-yellow-600 dark:text-yellow-400\",\n bgColor: \"bg-yellow-50 dark:bg-yellow-900/20\",\n borderColor: \"border-yellow-200 dark:border-yellow-800\",\n icon: \"mdi:clock-alert-outline\",\n },\n CANCELLED: {\n label: \"Cancelled\",\n color: \"text-orange-600 dark:text-orange-400\",\n bgColor: \"bg-orange-50 dark:bg-orange-900/20\",\n borderColor: \"border-orange-200 dark:border-orange-800\",\n icon: \"mdi:cancel\",\n },\n TIMEOUT: {\n label: \"Timeout\",\n color: \"text-red-600 dark:text-red-400\",\n bgColor: \"bg-red-50 dark:bg-red-900/20\",\n borderColor: \"border-red-200 dark:border-red-800\",\n icon: \"mdi:timer-off-outline\",\n },\n WAITING_SUBWORKFLOW: {\n label: \"Waiting\",\n color: \"text-purple-600 dark:text-purple-400\",\n bgColor: \"bg-purple-50 dark:bg-purple-900/20\",\n borderColor: \"border-purple-200 dark:border-purple-800\",\n icon: \"mdi:subdirectory-arrow-right\",\n },\n};\n","import { Icon } from \"@iconify/react\";\nimport type { RunStatus, NodeStatus } from \"../types\";\nimport { RUN_STATUS_CONFIG, NODE_STATUS_CONFIG } from \"../types\";\n\ninterface ExecutionStatusBadgeProps {\n status: RunStatus;\n size?: \"sm\" | \"md\" | \"lg\";\n showIcon?: boolean;\n showLabel?: boolean;\n animated?: boolean;\n}\n\nexport function ExecutionStatusBadge({\n status,\n size = \"md\",\n showIcon = true,\n showLabel = true,\n animated = true,\n}: ExecutionStatusBadgeProps) {\n const config = RUN_STATUS_CONFIG[status];\n\n const sizeClasses = {\n sm: \"px-1.5 py-0.5 text-xs gap-1\",\n md: \"px-2 py-1 text-sm gap-1.5\",\n lg: \"px-3 py-1.5 text-base gap-2\",\n };\n\n const iconSizes = {\n sm: 12,\n md: 14,\n lg: 16,\n };\n\n const isRunning = status === \"RUNNING\";\n\n return (\n <span\n className={`\n inline-flex items-center rounded-full font-medium\n ${config.bgColor} ${config.color} border ${config.borderColor}\n ${sizeClasses[size]}\n ${animated && isRunning ? \"animate-pulse\" : \"\"}\n `}\n >\n {showIcon && (\n <Icon\n icon={config.icon}\n width={iconSizes[size]}\n height={iconSizes[size]}\n className={animated && isRunning ? \"animate-spin\" : \"\"}\n />\n )}\n {showLabel && <span>{config.label}</span>}\n </span>\n );\n}\n\ninterface NodeStatusBadgeProps {\n status: NodeStatus;\n size?: \"sm\" | \"md\" | \"lg\";\n showIcon?: boolean;\n showLabel?: boolean;\n animated?: boolean;\n}\n\nexport function NodeStatusBadge({\n status,\n size = \"md\",\n showIcon = true,\n showLabel = true,\n animated = true,\n}: NodeStatusBadgeProps) {\n const config = NODE_STATUS_CONFIG[status];\n\n const sizeClasses = {\n sm: \"px-1.5 py-0.5 text-xs gap-1\",\n md: \"px-2 py-1 text-sm gap-1.5\",\n lg: \"px-3 py-1.5 text-base gap-2\",\n };\n\n const iconSizes = {\n sm: 12,\n md: 14,\n lg: 16,\n };\n\n const isRunning = status === \"RUNNING\";\n\n return (\n <span\n className={`\n inline-flex items-center rounded-full font-medium\n ${config.bgColor} ${config.color} border ${config.borderColor}\n ${sizeClasses[size]}\n ${animated && isRunning ? \"animate-pulse\" : \"\"}\n `}\n >\n {showIcon && (\n <Icon\n icon={config.icon}\n width={iconSizes[size]}\n height={iconSizes[size]}\n className={animated && isRunning ? \"animate-spin\" : \"\"}\n />\n )}\n {showLabel && <span>{config.label}</span>}\n </span>\n );\n}\n","import { create } from \"zustand\";\nimport type {\n RunStatus,\n ExecutionsFilter,\n ExecutionsViewMode,\n ExecutionSelection,\n ExecutionsPagination,\n DateRange,\n WorkflowRun,\n} from \"../types\";\n\ninterface ExecutionsState {\n // View state\n viewMode: ExecutionsViewMode;\n selectedExecution: WorkflowRun | null;\n expandedRows: Set<string>;\n\n // Selection\n selection: ExecutionSelection;\n\n // Filters\n filter: ExecutionsFilter;\n\n // Pagination\n pagination: ExecutionsPagination;\n\n // UI state\n isFilterPanelOpen: boolean;\n isDetailsPanelOpen: boolean;\n autoRefresh: boolean;\n autoRefreshInterval: number;\n\n // Real-time\n liveRunIds: Set<string>;\n\n // Actions - View\n setViewMode: (mode: ExecutionsViewMode) => void;\n setSelectedExecution: (execution: WorkflowRun | null) => void;\n toggleRowExpanded: (runId: string) => void;\n\n // Actions - Selection\n setSelection: (selection: ExecutionSelection) => void;\n toggleSelectRun: (runId: string) => void;\n selectAll: (runIds: string[]) => void;\n clearSelection: () => void;\n\n // Actions - Filter\n updateFilter: (filter: Partial<ExecutionsFilter>) => void;\n setStatusFilter: (status: RunStatus | \"all\") => void;\n setWorkflowFilter: (workflowKey: string) => void;\n setDateRange: (dateRange: DateRange) => void;\n setSearchQuery: (search: string) => void;\n setTriggerTypeFilter: (triggerType: ExecutionsFilter[\"triggerType\"]) => void;\n setDurationFilter: (\n durationMinSeconds: number | null,\n durationMaxSeconds: number | null,\n ) => void;\n setErrorTypeFilter: (errorType: ExecutionsFilter[\"errorType\"]) => void;\n setNodeFilter: (nodeId: string) => void;\n resetFilters: () => void;\n\n // Actions - Pagination\n setPage: (page: number) => void;\n setPageSize: (pageSize: number) => void;\n setTotal: (total: number) => void;\n\n // Actions - UI\n toggleFilterPanel: () => void;\n toggleDetailsPanel: () => void;\n setAutoRefresh: (enabled: boolean) => void;\n setAutoRefreshInterval: (interval: number) => void;\n\n // Actions - Real-time\n addLiveRun: (runId: string) => void;\n removeLiveRun: (runId: string) => void;\n clearLiveRuns: () => void;\n}\n\nconst defaultFilter: ExecutionsFilter = {\n status: \"all\",\n workflowKey: \"\",\n dateRange: {\n start: null,\n end: null,\n preset: \"all\",\n },\n search: \"\",\n triggerType: \"all\",\n durationMinSeconds: null,\n durationMaxSeconds: null,\n errorType: \"all\",\n nodeId: \"\",\n};\n\nconst defaultPagination: ExecutionsPagination = {\n page: 1,\n pageSize: 25,\n total: 0,\n};\n\nexport const useExecutionsStore = create<ExecutionsState>((set) => ({\n // Initial state\n viewMode: \"table\",\n selectedExecution: null,\n expandedRows: new Set(),\n\n selection: {\n runIds: [],\n allSelected: false,\n },\n\n filter: defaultFilter,\n pagination: defaultPagination,\n\n isFilterPanelOpen: false,\n isDetailsPanelOpen: false,\n autoRefresh: true,\n autoRefreshInterval: 5000,\n\n liveRunIds: new Set(),\n\n // Actions - View\n setViewMode: (mode) => set({ viewMode: mode }),\n\n setSelectedExecution: (execution) =>\n set({\n selectedExecution: execution,\n isDetailsPanelOpen: execution !== null,\n }),\n\n toggleRowExpanded: (runId) =>\n set((state) => {\n const newExpanded = new Set(state.expandedRows);\n if (newExpanded.has(runId)) {\n newExpanded.delete(runId);\n } else {\n newExpanded.add(runId);\n }\n return { expandedRows: newExpanded };\n }),\n\n // Actions - Selection\n setSelection: (selection) => set({ selection }),\n\n toggleSelectRun: (runId) =>\n set((state) => {\n const isSelected = state.selection.runIds.includes(runId);\n const newRunIds = isSelected\n ? state.selection.runIds.filter((id) => id !== runId)\n : [...state.selection.runIds, runId];\n return {\n selection: {\n runIds: newRunIds,\n allSelected: false,\n },\n };\n }),\n\n selectAll: (runIds) =>\n set((state) => ({\n selection: {\n runIds: state.selection.allSelected ? [] : runIds,\n allSelected: !state.selection.allSelected,\n },\n })),\n\n clearSelection: () =>\n set({\n selection: {\n runIds: [],\n allSelected: false,\n },\n }),\n\n // Actions - Filter\n updateFilter: (filterUpdate) =>\n set((state) => ({\n filter: { ...state.filter, ...filterUpdate },\n pagination: { ...state.pagination, page: 1 },\n })),\n\n setStatusFilter: (status) =>\n set((state) => ({\n filter: { ...state.filter, status },\n pagination: { ...state.pagination, page: 1 },\n })),\n\n setWorkflowFilter: (workflowKey) =>\n set((state) => ({\n filter: { ...state.filter, workflowKey },\n pagination: { ...state.pagination, page: 1 },\n })),\n\n setDateRange: (dateRange) =>\n set((state) => ({\n filter: { ...state.filter, dateRange },\n pagination: { ...state.pagination, page: 1 },\n })),\n\n setSearchQuery: (search) =>\n set((state) => ({\n filter: { ...state.filter, search },\n pagination: { ...state.pagination, page: 1 },\n })),\n\n setTriggerTypeFilter: (triggerType) =>\n set((state) => ({\n filter: { ...state.filter, triggerType },\n pagination: { ...state.pagination, page: 1 },\n })),\n\n setDurationFilter: (durationMinSeconds, durationMaxSeconds) =>\n set((state) => ({\n filter: { ...state.filter, durationMinSeconds, durationMaxSeconds },\n pagination: { ...state.pagination, page: 1 },\n })),\n\n setErrorTypeFilter: (errorType) =>\n set((state) => ({\n filter: { ...state.filter, errorType },\n pagination: { ...state.pagination, page: 1 },\n })),\n\n setNodeFilter: (nodeId) =>\n set((state) => ({\n filter: { ...state.filter, nodeId },\n pagination: { ...state.pagination, page: 1 },\n })),\n\n resetFilters: () =>\n set({\n filter: defaultFilter,\n pagination: { ...defaultPagination },\n }),\n\n // Actions - Pagination\n setPage: (page) =>\n set((state) => ({\n pagination: { ...state.pagination, page },\n })),\n\n setPageSize: (pageSize) =>\n set((state) => ({\n pagination: { ...state.pagination, pageSize, page: 1 },\n })),\n\n setTotal: (total) =>\n set((state) => ({\n pagination: { ...state.pagination, total },\n })),\n\n // Actions - UI\n toggleFilterPanel: () =>\n set((state) => ({\n isFilterPanelOpen: !state.isFilterPanelOpen,\n })),\n\n toggleDetailsPanel: () =>\n set((state) => ({\n isDetailsPanelOpen: !state.isDetailsPanelOpen,\n })),\n\n setAutoRefresh: (enabled) => set({ autoRefresh: enabled }),\n\n setAutoRefreshInterval: (interval) => set({ autoRefreshInterval: interval }),\n\n // Actions - Real-time\n addLiveRun: (runId) =>\n set((state) => {\n const newLiveRunIds = new Set(state.liveRunIds);\n newLiveRunIds.add(runId);\n return { liveRunIds: newLiveRunIds };\n }),\n\n removeLiveRun: (runId) =>\n set((state) => {\n const newLiveRunIds = new Set(state.liveRunIds);\n newLiveRunIds.delete(runId);\n return { liveRunIds: newLiveRunIds };\n }),\n\n clearLiveRuns: () => set({ liveRunIds: new Set() }),\n}));\n","import { useState, useCallback } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport { Button } from \"@burdenoff/fe-libs/button\";\nimport { useExecutionsStore } from \"../store/executionsStore\";\nimport type { RunStatus, DateRange, ErrorType } from \"../types\";\nimport { useTr } from \"../../../hooks/useTr\";\n\ninterface ExecutionFiltersProps {\n workflows?: Array<{ workflowKey: string; name: string }>;\n onRefresh?: () => void;\n}\n\nexport function ExecutionFilters({\n workflows = [],\n onRefresh,\n}: ExecutionFiltersProps) {\n const tr = useTr();\n const statusOptions: Array<{ value: RunStatus | \"all\"; label: string }> = [\n {\n value: \"all\",\n label: tr(\n \"fluidgrids.executions.executionFilters.statusAll\",\n \"All Statuses\",\n ),\n },\n {\n value: \"RUNNING\",\n label: tr(\n \"fluidgrids.executions.executionFilters.statusRunning\",\n \"Running\",\n ),\n },\n {\n value: \"COMPLETED\",\n label: tr(\n \"fluidgrids.executions.executionFilters.statusCompleted\",\n \"Completed\",\n ),\n },\n {\n value: \"FAILED\",\n label: tr(\n \"fluidgrids.executions.executionFilters.statusFailed\",\n \"Failed\",\n ),\n },\n {\n value: \"PENDING\",\n label: tr(\n \"fluidgrids.executions.executionFilters.statusPending\",\n \"Pending\",\n ),\n },\n {\n value: \"CANCELLED\",\n label: tr(\n \"fluidgrids.executions.executionFilters.statusCancelled\",\n \"Cancelled\",\n ),\n },\n {\n value: \"WAITING\",\n label: tr(\n \"fluidgrids.executions.executionFilters.statusWaiting\",\n \"Waiting\",\n ),\n },\n {\n value: \"TERMINATED\",\n label: tr(\n \"fluidgrids.executions.executionFilters.statusTerminated\",\n \"Terminated\",\n ),\n },\n ];\n\n const datePresets: Array<{ value: DateRange[\"preset\"]; label: string }> = [\n {\n value: \"all\",\n label: tr(\n \"fluidgrids.executions.executionFilters.dateAllTime\",\n \"All Time\",\n ),\n },\n {\n value: \"today\",\n label: tr(\"fluidgrids.executions.executionFilters.dateToday\", \"Today\"),\n },\n {\n value: \"yesterday\",\n label: tr(\n \"fluidgrids.executions.executionFilters.dateYesterday\",\n \"Yesterday\",\n ),\n },\n {\n value: \"7days\",\n label: tr(\n \"fluidgrids.executions.executionFilters.dateLast7Days\",\n \"Last 7 Days\",\n ),\n },\n {\n value: \"30days\",\n label: tr(\n \"fluidgrids.executions.executionFilters.dateLast30Days\",\n \"Last 30 Days\",\n ),\n },\n {\n value: \"90days\",\n label: tr(\n \"fluidgrids.executions.executionFilters.dateLast90Days\",\n \"Last 90 Days\",\n ),\n },\n {\n value: \"custom\",\n label: tr(\n \"fluidgrids.executions.executionFilters.dateCustomRange\",\n \"Custom Range\",\n ),\n },\n ];\n const {\n filter,\n setStatusFilter,\n setWorkflowFilter,\n setDateRange,\n setSearchQuery,\n setTriggerTypeFilter,\n setDurationFilter,\n setErrorTypeFilter,\n setNodeFilter,\n resetFilters,\n autoRefresh,\n setAutoRefresh,\n } = useExecutionsStore();\n\n const [showCustomDate, setShowCustomDate] = useState(false);\n\n const handleDatePresetChange = useCallback(\n (preset: DateRange[\"preset\"]) => {\n const now = new Date();\n let start: Date | null = null;\n let end: Date | null = null;\n\n switch (preset) {\n case \"today\":\n start = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n end = now;\n break;\n case \"yesterday\":\n start = new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate() - 1,\n );\n end = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n break;\n case \"7days\":\n start = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n end = now;\n break;\n case \"30days\":\n start = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n end = now;\n break;\n case \"90days\":\n start = new Date(now.getTime() - 90 * 24 * 60 * 60 * 1000);\n end = now;\n break;\n case \"custom\":\n setShowCustomDate(true);\n return;\n default:\n start = null;\n end = null;\n }\n\n setShowCustomDate(false);\n setDateRange({ start, end, preset });\n },\n [setDateRange],\n );\n\n const activeFiltersCount = [\n filter.status !== \"all\",\n filter.workflowKey !== \"\",\n filter.dateRange.preset !== \"all\",\n filter.search !== \"\",\n filter.triggerType !== \"all\",\n filter.durationMinSeconds !== null,\n filter.durationMaxSeconds !== null,\n filter.errorType !== \"all\",\n filter.nodeId !== \"\",\n ].filter(Boolean).length;\n\n return (\n <div className=\"space-y-4\">\n {/* Search and Quick Filters Row */}\n <div className=\"flex flex-col sm:flex-row gap-3\">\n {/* Search */}\n <div className=\"relative flex-1\">\n <Icon\n icon=\"mdi:magnify\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 text-text-secondary\"\n width={18}\n />\n <input\n type=\"text\"\n placeholder={tr(\n \"fluidgrids.executions.executionFilters.searchPlaceholder\",\n \"Search by workflow name or run ID...\",\n )}\n value={filter.search}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full pl-[3.25rem] pr-4 py-2 bg-background-secondary border border-border-secondary rounded-lg text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-action-primary-bg focus:border-transparent\"\n />\n {filter.search && (\n <button\n onClick={() => setSearchQuery(\"\")}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-text-secondary hover:text-text-primary\"\n >\n <Icon icon=\"mdi:close\" width={18} />\n </button>\n )}\n </div>\n\n {/* Status Filter */}\n <select\n value={filter.status}\n onChange={(e) => setStatusFilter(e.target.value as RunStatus | \"all\")}\n className=\"px-3 py-2 bg-bg-surface border border-border-default rounded-lg text-text-primary focus:outline-none focus:ring-2 focus:ring-action-primary-bg scheme-normal dark:scheme-dark\"\n >\n {statusOptions.map((option) => (\n <option\n key={option.value}\n value={option.value}\n className=\"bg-bg-surface text-text-primary\"\n >\n {option.label}\n </option>\n ))}\n </select>\n\n {/* Workflow Filter */}\n {workflows.length > 0 && (\n <select\n value={filter.workflowKey}\n onChange={(e) => setWorkflowFilter(e.target.value)}\n className=\"px-3 py-2 bg-bg-surface border border-border-default rounded-lg text-text-primary focus:outline-none focus:ring-2 focus:ring-action-primary-bg max-w-[200px] scheme-normal dark:scheme-dark\"\n >\n <option value=\"\" className=\"bg-bg-surface text-text-primary\">\n {tr(\n \"fluidgrids.executions.executionFilters.allWorkflows\",\n \"All Workflows\",\n )}\n </option>\n {workflows.map((wf) => (\n <option\n key={wf.workflowKey}\n value={wf.workflowKey}\n className=\"bg-bg-surface text-text-primary\"\n >\n {wf.name}\n </option>\n ))}\n </select>\n )}\n\n {/* Date Range */}\n <select\n value={filter.dateRange.preset}\n onChange={(e) =>\n handleDatePresetChange(e.target.value as DateRange[\"preset\"])\n }\n className=\"px-3 py-2 bg-bg-surface border border-border-default rounded-lg text-text-primary focus:outline-none focus:ring-2 focus:ring-action-primary-bg scheme-normal dark:scheme-dark\"\n >\n {datePresets.map((option) => (\n <option\n key={option.value}\n value={option.value}\n className=\"bg-bg-surface text-text-primary\"\n >\n {option.label}\n </option>\n ))}\n </select>\n </div>\n\n {/* Advanced run filters */}\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-5\">\n <select\n aria-label={tr(\n \"fluidgrids.executions.executionFilters.triggerType\",\n \"Trigger type\",\n )}\n value={filter.triggerType}\n onChange={(e) =>\n setTriggerTypeFilter(e.target.value as typeof filter.triggerType)\n }\n className=\"px-3 py-2 bg-bg-surface border border-border-default rounded-lg text-text-primary focus:outline-none focus:ring-2 focus:ring-action-primary-bg scheme-normal dark:scheme-dark\"\n >\n <option value=\"all\">\n {tr(\n \"fluidgrids.executions.executionFilters.allTriggers\",\n \"All trigger types\",\n )}\n </option>\n <option value=\"MANUAL\">\n {tr(\"fluidgrids.executions.executionFilters.manual\", \"Manual\")}\n </option>\n <option value=\"WEBHOOK\">\n {tr(\"fluidgrids.executions.executionFilters.webhook\", \"Webhook\")}\n </option>\n <option value=\"SCHEDULE\">\n {tr(\"fluidgrids.executions.executionFilters.schedule\", \"Schedule\")}\n </option>\n <option value=\"EVENT\">\n {tr(\"fluidgrids.executions.executionFilters.event\", \"Event\")}\n </option>\n </select>\n <select\n aria-label={tr(\n \"fluidgrids.executions.executionFilters.errorType\",\n \"Error type\",\n )}\n value={filter.errorType}\n onChange={(e) =>\n setErrorTypeFilter(e.target.value as ErrorType | \"all\")\n }\n className=\"px-3 py-2 bg-bg-surface border border-border-default rounded-lg text-text-primary focus:outline-none focus:ring-2 focus:ring-action-primary-bg scheme-normal dark:scheme-dark\"\n >\n <option value=\"all\">\n {tr(\n \"fluidgrids.executions.executionFilters.allErrors\",\n \"All error types\",\n )}\n </option>\n {(\n [\n \"TIMEOUT\",\n \"TRANSIENT\",\n \"DEPENDENCY\",\n \"AUTHORIZATION\",\n \"VALIDATION\",\n \"PERMANENT\",\n \"UNKNOWN\",\n ] as ErrorType[]\n ).map((type) => (\n <option key={type} value={type}>\n {type}\n </option>\n ))}\n </select>\n <input\n type=\"text\"\n value={filter.nodeId}\n onChange={(e) => setNodeFilter(e.target.value)}\n placeholder={tr(\n \"fluidgrids.executions.executionFilters.nodePlaceholder\",\n \"Node ID\",\n )}\n aria-label={tr(\n \"fluidgrids.executions.executionFilters.nodeId\",\n \"Node ID\",\n )}\n className=\"px-3 py-2 bg-bg-surface border border-border-default rounded-lg text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-action-primary-bg\"\n />\n <input\n type=\"number\"\n min={0}\n value={filter.durationMinSeconds ?? \"\"}\n onChange={(e) =>\n setDurationFilter(\n e.target.value ? Number(e.target.value) : null,\n filter.durationMaxSeconds,\n )\n }\n placeholder={tr(\n \"fluidgrids.executions.executionFilters.durationMin\",\n \"Min seconds\",\n )}\n aria-label={tr(\n \"fluidgrids.executions.executionFilters.durationMin\",\n \"Minimum duration in seconds\",\n )}\n className=\"px-3 py-2 bg-bg-surface border border-border-default rounded-lg text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-action-primary-bg\"\n />\n <input\n type=\"number\"\n min={0}\n value={filter.durationMaxSeconds ?? \"\"}\n onChange={(e) =>\n setDurationFilter(\n filter.durationMinSeconds,\n e.target.value ? Number(e.target.value) : null,\n )\n }\n placeholder={tr(\n \"fluidgrids.executions.executionFilters.durationMax\",\n \"Max seconds\",\n )}\n aria-label={tr(\n \"fluidgrids.executions.executionFilters.durationMax\",\n \"Maximum duration in seconds\",\n )}\n className=\"px-3 py-2 bg-bg-surface border border-border-default rounded-lg text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-action-primary-bg\"\n />\n </div>\n\n {/* Custom Date Range Inputs */}\n {showCustomDate && (\n <div className=\"flex flex-wrap gap-3 items-center p-3 bg-background-secondary rounded-lg border border-border-secondary\">\n <label className=\"text-sm text-text-secondary\">\n {tr(\"fluidgrids.executions.executionFilters.fromLabel\", \"From:\")}\n </label>\n <input\n type=\"datetime-local\"\n value={filter.dateRange.start?.toISOString().slice(0, 16) ?? \"\"}\n onChange={(e) =>\n setDateRange({\n ...filter.dateRange,\n start: e.target.value ? new Date(e.target.value) : null,\n preset: \"custom\",\n })\n }\n className=\"px-3 py-1.5 bg-background-primary border border-border-secondary rounded text-text-primary text-sm\"\n />\n <label className=\"text-sm text-text-secondary\">\n {tr(\"fluidgrids.executions.executionFilters.toLabel\", \"To:\")}\n </label>\n <input\n type=\"datetime-local\"\n value={filter.dateRange.end?.toISOString().slice(0, 16) ?? \"\"}\n onChange={(e) =>\n setDateRange({\n ...filter.dateRange,\n end: e.target.value ? new Date(e.target.value) : null,\n preset: \"custom\",\n })\n }\n className=\"px-3 py-1.5 bg-background-primary border border-border-secondary rounded text-text-primary text-sm\"\n />\n <button\n onClick={() => setShowCustomDate(false)}\n className=\"text-text-secondary hover:text-text-primary\"\n >\n <Icon icon=\"mdi:close\" width={18} />\n </button>\n </div>\n )}\n\n {/* Actions Row */}\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"flex items-center gap-3\">\n {/* Auto-refresh Toggle */}\n <label className=\"inline-flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={autoRefresh}\n onChange={(e) => setAutoRefresh(e.target.checked)}\n className=\"w-4 h-4 rounded border-border-secondary text-action-primary-bg focus:ring-action-primary-bg\"\n />\n <span className=\"text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.executions.executionFilters.autoRefresh\",\n \"Auto-refresh\",\n )}\n </span>\n </label>\n\n {/* Refresh Button */}\n {onRefresh && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onRefresh}\n className=\"gap-1.5\"\n >\n <Icon icon=\"mdi:refresh\" width={16} />\n {tr(\"fluidgrids.executions.executionFilters.refresh\", \"Refresh\")}\n </Button>\n )}\n </div>\n\n <div className=\"flex items-center gap-3\">\n {/* Active Filters Count */}\n {activeFiltersCount > 0 && (\n <span className=\"text-sm text-text-secondary\">\n {activeFiltersCount} filter{activeFiltersCount > 1 ? \"s\" : \"\"}{\" \"}\n active\n </span>\n )}\n\n {/* Reset Filters */}\n {activeFiltersCount > 0 && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={resetFilters}\n className=\"gap-1.5\"\n >\n <Icon icon=\"mdi:filter-remove\" width={16} />\n {tr(\n \"fluidgrids.executions.executionFilters.clearFilters\",\n \"Clear Filters\",\n )}\n </Button>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { Icon } from \"@iconify/react\";\nimport type { RunStatus } from \"../types\";\nimport { useTr } from \"../../../hooks/useTr\";\n\ninterface StatCardProps {\n label: string;\n value: number | string;\n icon: string;\n color: string;\n trend?: {\n value: number;\n isPositive: boolean;\n };\n onClick?: () => void;\n}\n\nfunction StatCard({\n label,\n value,\n icon,\n color,\n trend,\n onClick,\n}: StatCardProps) {\n return (\n <button\n onClick={onClick}\n disabled={!onClick}\n className={`\n flex flex-col p-4 bg-background-secondary rounded-lg border border-border-secondary\n hover:border-border-primary transition-colors\n ${onClick ? \"cursor-pointer\" : \"cursor-default\"}\n text-left w-full\n `}\n >\n <div className=\"flex items-center justify-between mb-2\">\n <Icon icon={icon} className={color} width={24} />\n {trend && (\n <span\n className={`text-xs font-medium ${\n trend.isPositive\n ? \"text-[var(--color-status-success-text)]\"\n : \"text-[var(--color-status-error-text)]\"\n }`}\n >\n {trend.isPositive ? \"+\" : \"-\"}\n {Math.abs(trend.value)}%\n </span>\n )}\n </div>\n <div className=\"text-2xl font-bold text-text-primary\">{value}</div>\n <div className=\"text-sm text-text-secondary mt-1\">{label}</div>\n </button>\n );\n}\n\ninterface ExecutionStatsProps {\n stats: {\n total: number;\n running: number;\n completed: number;\n failed: number;\n cancelled: number;\n pending: number;\n waiting: number;\n successRate: number;\n avgDuration: number;\n } | null;\n loading?: boolean;\n onFilterByStatus?: (status: RunStatus | \"all\") => void;\n}\n\nexport function ExecutionStats({\n stats,\n loading,\n onFilterByStatus,\n}: ExecutionStatsProps) {\n const tr = useTr();\n\n if (loading) {\n return (\n <div className=\"grid grid-cols-2 sm:grid-cols-4 lg:grid-cols-6 gap-4\">\n {[...Array(6)].map((_, i) => (\n <div\n key={i}\n className=\"h-24 bg-background-secondary rounded-lg border border-border-secondary animate-pulse\"\n />\n ))}\n </div>\n );\n }\n\n if (!stats) {\n return null;\n }\n\n const formatDuration = (seconds: number): string => {\n if (seconds < 60) return `${Math.round(seconds)}s`;\n if (seconds < 3600) return `${Math.round(seconds / 60)}m`;\n return `${Math.round(seconds / 3600)}h`;\n };\n\n return (\n <div className=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-4\">\n <StatCard\n label={tr(\n \"fluidgrids.executions.executionStats.totalRuns\",\n \"Total Runs\",\n )}\n value={stats.total.toLocaleString()}\n icon=\"mdi:play-box-multiple\"\n color=\"text-text-primary\"\n onClick={() => onFilterByStatus?.(\"all\")}\n />\n <StatCard\n label={tr(\"fluidgrids.executions.executionStats.running\", \"Running\")}\n value={stats.running}\n icon=\"mdi:play-circle\"\n color=\"text-[var(--color-status-info-text)]\"\n onClick={() => onFilterByStatus?.(\"RUNNING\")}\n />\n <StatCard\n label={tr(\n \"fluidgrids.executions.executionStats.completed\",\n \"Completed\",\n )}\n value={stats.completed.toLocaleString()}\n icon=\"mdi:check-circle\"\n color=\"text-[var(--color-status-success-text)]\"\n onClick={() => onFilterByStatus?.(\"COMPLETED\")}\n />\n <StatCard\n label={tr(\"fluidgrids.executions.executionStats.failed\", \"Failed\")}\n value={stats.failed}\n icon=\"mdi:alert-circle\"\n color=\"text-[var(--color-status-error-text)]\"\n onClick={() => onFilterByStatus?.(\"FAILED\")}\n />\n <StatCard\n label={tr(\n \"fluidgrids.executions.executionStats.successRate\",\n \"Success Rate\",\n )}\n value={`${(stats.successRate ?? 0).toFixed(1)}%`}\n icon=\"mdi:percent\"\n color=\"text-accent\"\n />\n <StatCard\n label={tr(\n \"fluidgrids.executions.executionStats.avgDuration\",\n \"Avg Duration\",\n )}\n value={formatDuration(stats.avgDuration ?? 0)}\n icon=\"mdi:timer\"\n color=\"text-[var(--color-status-warning-text)]\"\n />\n </div>\n );\n}\n\ninterface ExecutionMiniStatsProps {\n running: number;\n completed: number;\n failed: number;\n}\n\nexport function ExecutionMiniStats({\n running,\n completed,\n failed,\n}: ExecutionMiniStatsProps) {\n const tr = useTr();\n\n return (\n <div className=\"flex items-center gap-4 text-sm\">\n {running > 0 && (\n <span className=\"flex items-center gap-1 text-[var(--color-status-info-text)]\">\n <Icon icon=\"mdi:play-circle\" width={14} className=\"animate-pulse\" />\n {running}{\" \"}\n {tr(\"fluidgrids.executions.executionMiniStats.running\", \"running\")}\n </span>\n )}\n <span className=\"flex items-center gap-1 text-[var(--color-status-success-text)]\">\n <Icon icon=\"mdi:check-circle\" width={14} />\n {completed}\n </span>\n {failed > 0 && (\n <span className=\"flex items-center gap-1 text-[var(--color-status-error-text)]\">\n <Icon icon=\"mdi:alert-circle\" width={14} />\n {failed}\n </span>\n )}\n </div>\n );\n}\n","/**\n * Human-readable display helpers for the Runs screens: version formatting and\n * canvas-nodeId → node label/operation mapping built from the workflow's\n * definitionJson (fetched with the run), so timelines, logs and stat cards can\n * show \"GitHub · searchIssues\" instead of a raw nanoid.\n */\n\nexport interface NodeDisplay {\n label: string;\n operation?: string;\n}\n\n/**\n * Versions are stored as \"v1\"/\"v2\" (legacy: \"1.0.0\"). Render without\n * double-prefixing: \"v1\" stays \"v1\", \"1.0.0\" becomes \"v1.0.0\".\n */\nexport function formatRunVersion(version: string | null | undefined): string {\n if (!version) return \"\";\n return version.startsWith(\"v\") ? version : `v${version}`;\n}\n\ninterface DefinitionNode {\n id?: unknown;\n type?: unknown;\n data?: {\n label?: unknown;\n operation_name?: unknown;\n nodeData?: { name?: unknown };\n };\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\n/**\n * Build a nodeId → display mapping from a workflow definitionJson.\n * Label priority: user-set node label → manifest name → node type.\n * Returns an empty map for missing/malformed definitions (e.g. runs of\n * deleted workflows) — callers fall back to the raw nodeId.\n */\nexport function buildNodeDisplayMap(\n definitionJson: unknown,\n): Record<string, NodeDisplay> {\n const map: Record<string, NodeDisplay> = {};\n const nodes = (\n definitionJson as { data?: { nodes?: DefinitionNode[] } } | null | undefined\n )?.data?.nodes;\n if (!Array.isArray(nodes)) return map;\n\n for (const node of nodes) {\n const id = asString(node?.id);\n if (!id) continue;\n const label =\n asString(node?.data?.label) ??\n asString(node?.data?.nodeData?.name) ??\n asString(node?.type);\n if (!label) continue;\n const operation = asString(node?.data?.operation_name);\n map[id] = {\n label,\n // 'execute' is the internal single-op pseudo-operation — the builder\n // hides it on cards, so the runs screens do too.\n operation: operation === \"execute\" ? undefined : operation,\n };\n }\n return map;\n}\n\n/**\n * \"GitHub · searchIssues\" title for a node, falling back to the raw nodeId\n * when the definition doesn't know this node.\n */\nexport function nodeDisplayTitle(\n display: NodeDisplay | undefined,\n fallback: string,\n): string {\n if (!display) return fallback;\n return display.operation\n ? `${display.label} · ${display.operation}`\n : display.label;\n}\n","import { useMemo } from \"react\";\nimport { useNavigate } from \"react-router\";\nimport { Icon } from \"@iconify/react\";\nimport { Button } from \"@burdenoff/fe-libs/button\";\nimport { ExecutionStatusBadge } from \"./ExecutionStatusBadge\";\nimport { useExecutionsStore } from \"../store/executionsStore\";\nimport { formatRunVersion } from \"../utils/run-display\";\nimport type { WorkflowRun } from \"../types\";\nimport { useTr } from \"../../../hooks/useTr\";\n\ninterface ExecutionTableProps {\n executions: WorkflowRun[];\n /** workflowKey → name fallback while runs lack the workflow relation. */\n workflowNames?: Record<string, string>;\n loading?: boolean;\n onRowClick?: (execution: WorkflowRun) => void;\n onAction?: (\n action: \"cancel\" | \"pause\" | \"resume\" | \"retry\",\n execution: WorkflowRun,\n ) => void;\n}\n\nexport function ExecutionTable({\n executions,\n workflowNames,\n loading,\n onRowClick,\n onAction,\n}: ExecutionTableProps) {\n const tr = useTr();\n const navigate = useNavigate();\n const {\n selection,\n toggleSelectRun,\n selectAll,\n expandedRows,\n toggleRowExpanded,\n } = useExecutionsStore();\n\n const allRunIds = useMemo(() => executions.map((e) => e.id), [executions]);\n\n const formatDuration = (ms?: number): string => {\n if (!ms) return \"-\";\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3600000)\n return `${Math.round(ms / 60000)}m ${Math.round((ms % 60000) / 1000)}s`;\n return `${Math.round(ms / 3600000)}h ${Math.round((ms % 3600000) / 60000)}m`;\n };\n\n const formatDate = (dateStr?: string): string => {\n if (!dateStr) return \"-\";\n const date = new Date(dateStr);\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n\n // Less than 1 minute\n if (diff < 60000)\n return tr(\"fluidgrids.executions.executionTable.justNow\", \"Just now\");\n // Less than 1 hour\n if (diff < 3600000) return `${Math.round(diff / 60000)}m ago`;\n // Less than 24 hours\n if (diff < 86400000) return `${Math.round(diff / 3600000)}h ago`;\n // Less than 7 days\n if (diff < 604800000) return `${Math.round(diff / 86400000)}d ago`;\n\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n };\n\n const getRowActions = (execution: WorkflowRun) => {\n const actions: Array<{\n icon: string;\n label: string;\n action: \"cancel\" | \"pause\" | \"resume\" | \"retry\";\n disabled?: boolean;\n }> = [];\n\n switch (execution.status) {\n case \"RUNNING\":\n actions.push({\n icon: \"mdi:pause\",\n label: tr(\n \"fluidgrids.executions.executionTable.actionPause\",\n \"Pause\",\n ),\n action: \"pause\",\n });\n actions.push({\n icon: \"mdi:stop\",\n label: tr(\n \"fluidgrids.executions.executionTable.actionCancel\",\n \"Cancel\",\n ),\n action: \"cancel\",\n });\n break;\n case \"WAITING\":\n actions.push({\n icon: \"mdi:play\",\n label: tr(\n \"fluidgrids.executions.executionTable.actionResume\",\n \"Resume\",\n ),\n action: \"resume\",\n });\n actions.push({\n icon: \"mdi:stop\",\n label: tr(\n \"fluidgrids.executions.executionTable.actionCancel\",\n \"Cancel\",\n ),\n action: \"cancel\",\n });\n break;\n case \"FAILED\":\n actions.push({\n icon: \"mdi:refresh\",\n label: tr(\n \"fluidgrids.executions.executionTable.actionRetry\",\n \"Retry\",\n ),\n action: \"retry\",\n });\n break;\n case \"PENDING\":\n actions.push({\n icon: \"mdi:stop\",\n label: tr(\n \"fluidgrids.executions.executionTable.actionCancel\",\n \"Cancel\",\n ),\n action: \"cancel\",\n });\n break;\n }\n\n return actions;\n };\n\n if (loading && executions.length === 0) {\n return (\n <div className=\"bg-background-secondary rounded-lg border border-border-secondary overflow-hidden\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[800px]\">\n <thead className=\"bg-background-tertiary border-b border-border-secondary\">\n <tr>\n <th className=\"w-10 px-4 py-3\"></th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase\">\n {tr(\n \"fluidgrids.executions.executionTable.colStatus\",\n \"Status\",\n )}\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase\">\n {tr(\n \"fluidgrids.executions.executionTable.colWorkflow\",\n \"Workflow\",\n )}\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase\">\n {tr(\n \"fluidgrids.executions.executionTable.colRunId\",\n \"Run ID\",\n )}\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase\">\n {tr(\n \"fluidgrids.executions.executionTable.colStarted\",\n \"Started\",\n )}\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase\">\n {tr(\n \"fluidgrids.executions.executionTable.colDuration\",\n \"Duration\",\n )}\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase\">\n {tr(\n \"fluidgrids.executions.executionTable.colProgress\",\n \"Progress\",\n )}\n </th>\n <th className=\"px-4 py-3\"></th>\n </tr>\n </thead>\n <tbody>\n {[...Array(5)].map((_, i) => (\n <tr key={i} className=\"border-b border-border-secondary\">\n <td colSpan={8} className=\"px-4 py-4\">\n <div className=\"h-8 bg-background-tertiary rounded animate-pulse\" />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n }\n\n if (executions.length === 0) {\n return (\n <div className=\"bg-background-secondary rounded-lg border border-border-secondary p-12 text-center\">\n <Icon\n icon=\"mdi:play-box-outline\"\n className=\"mx-auto text-text-secondary mb-4\"\n width={48}\n />\n <h3 className=\"text-lg font-medium text-text-primary mb-2\">\n {tr(\n \"fluidgrids.executions.executionTable.emptyTitle\",\n \"No executions found\",\n )}\n </h3>\n <p className=\"text-text-secondary mb-4\">\n {tr(\n \"fluidgrids.executions.executionTable.emptyDescription\",\n \"There are no workflow executions matching your filters.\",\n )}\n </p>\n <Button variant=\"outline\" onClick={() => navigate(\"../list\")}>\n {tr(\n \"fluidgrids.executions.executionTable.viewWorkflows\",\n \"View Workflows\",\n )}\n </Button>\n </div>\n );\n }\n\n return (\n <div className=\"bg-background-secondary rounded-lg border border-border-secondary overflow-hidden\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[800px]\">\n <thead className=\"bg-background-tertiary border-b border-border-secondary\">\n <tr>\n <th className=\"w-10 px-4 py-3\">\n <input\n type=\"checkbox\"\n checked={selection.allSelected}\n onChange={() => selectAll(allRunIds)}\n className=\"w-4 h-4 rounded border-border-secondary\"\n />\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n {tr(\"fluidgrids.executions.executionTable.colStatus\", \"Status\")}\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n {tr(\n \"fluidgrids.executions.executionTable.colWorkflow\",\n \"Workflow\",\n )}\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n {tr(\"fluidgrids.executions.executionTable.colRunId\", \"Run ID\")}\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n {tr(\n \"fluidgrids.executions.executionTable.colStarted\",\n \"Started\",\n )}\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n {tr(\n \"fluidgrids.executions.executionTable.colDuration\",\n \"Duration\",\n )}\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n {tr(\n \"fluidgrids.executions.executionTable.colProgress\",\n \"Progress\",\n )}\n </th>\n <th className=\"px-4 py-3 w-32\"></th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border-secondary\">\n {executions.map((execution) => {\n const isSelected = selection.runIds.includes(execution.id);\n const isExpanded = expandedRows.has(execution.id);\n const actions = getRowActions(execution);\n\n return (\n <>\n <tr\n key={execution.id}\n className={`\n hover:bg-background-tertiary/50 cursor-pointer transition-colors\n ${isSelected ? \"bg-action-primary-bg/10\" : \"\"}\n `}\n onClick={() => onRowClick?.(execution)}\n >\n <td\n className=\"px-4 py-3\"\n onClick={(e) => e.stopPropagation()}\n >\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={() => toggleSelectRun(execution.id)}\n className=\"w-4 h-4 rounded border-border-secondary\"\n />\n </td>\n <td className=\"px-4 py-3\">\n <ExecutionStatusBadge\n status={execution.status}\n size=\"sm\"\n />\n </td>\n <td className=\"px-4 py-3\">\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium text-text-primary\">\n {execution.workflow?.name ||\n workflowNames?.[execution.workflowKey] ||\n execution.workflowKey}\n </span>\n <span className=\"text-xs text-text-secondary\">\n {formatRunVersion(execution.version)}\n </span>\n </div>\n </td>\n <td className=\"px-4 py-3\">\n <span className=\"text-sm font-mono text-text-secondary\">\n {execution.id.slice(0, 8)}...\n </span>\n </td>\n <td className=\"px-4 py-3\">\n <span className=\"text-sm text-text-secondary\">\n {formatDate(execution.startedAt || execution.createdAt)}\n </span>\n </td>\n <td className=\"px-4 py-3\">\n <span className=\"text-sm text-text-secondary\">\n {formatDuration(execution.duration)}\n </span>\n </td>\n <td className=\"px-4 py-3\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex-1 h-2 bg-background-tertiary rounded-full overflow-hidden max-w-[100px]\">\n <div\n className={`h-full transition-all ${\n execution.status === \"FAILED\"\n ? \"bg-[var(--color-status-error-bg)]\"\n : execution.status === \"COMPLETED\"\n ? \"bg-[var(--color-status-success-bg)]\"\n : \"bg-[var(--color-status-info-bg)]\"\n }`}\n style={{ width: `${execution.progress}%` }}\n />\n </div>\n <span className=\"text-xs text-text-secondary min-w-[45px]\">\n {execution.completedNodes ?? 0}/\n {execution.totalNodes ?? 0}\n </span>\n </div>\n </td>\n <td\n className=\"px-4 py-3\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"flex items-center gap-1\">\n {/* Expand/Collapse */}\n <button\n onClick={() => toggleRowExpanded(execution.id)}\n className=\"p-1.5 rounded hover:bg-background-tertiary text-text-secondary\"\n >\n <Icon\n icon={\n isExpanded ? \"mdi:chevron-up\" : \"mdi:chevron-down\"\n }\n width={18}\n />\n </button>\n\n {/* Quick Actions */}\n {actions.slice(0, 2).map((action) => (\n <button\n key={action.action}\n onClick={() => onAction?.(action.action, execution)}\n className=\"p-1.5 rounded hover:bg-background-tertiary text-text-secondary\"\n title={action.label}\n >\n <Icon icon={action.icon} width={18} />\n </button>\n ))}\n\n {/* View Details */}\n <button\n onClick={() => navigate(`../runs/${execution.id}`)}\n className=\"p-1.5 rounded hover:bg-background-tertiary text-text-secondary\"\n title={tr(\n \"fluidgrids.executions.executionTable.viewDetails\",\n \"View Details\",\n )}\n >\n <Icon icon=\"mdi:arrow-right\" width={18} />\n </button>\n </div>\n </td>\n </tr>\n\n {/* Expanded Row Content */}\n {isExpanded && (\n <tr key={`${execution.id}-expanded`}>\n <td\n colSpan={8}\n className=\"px-4 py-4 bg-background-tertiary/30\"\n >\n <div className=\"grid grid-cols-2 lg:grid-cols-4 gap-4\">\n {/* Trigger Info */}\n <div>\n <div className=\"text-xs text-text-secondary mb-1\">\n {tr(\n \"fluidgrids.executions.executionTable.triggerNode\",\n \"Trigger Node\",\n )}\n </div>\n <div className=\"text-sm text-text-primary font-medium\">\n {execution.triggerNodeId}\n </div>\n </div>\n\n {/* Node Stats */}\n <div>\n <div className=\"text-xs text-text-secondary mb-1\">\n {tr(\n \"fluidgrids.executions.executionTable.nodeStats\",\n \"Node Stats\",\n )}\n </div>\n <div className=\"flex gap-2 text-sm\">\n <span className=\"text-[var(--color-status-success-text)]\">\n {execution.completedNodes ?? 0}{\" \"}\n {tr(\n \"fluidgrids.executions.executionTable.completed\",\n \"completed\",\n )}\n </span>\n {(execution.failedNodes ?? 0) > 0 && (\n <span className=\"text-[var(--color-status-error-text)]\">\n {execution.failedNodes}{\" \"}\n {tr(\n \"fluidgrids.executions.executionTable.failed\",\n \"failed\",\n )}\n </span>\n )}\n {(execution.skippedNodes ?? 0) > 0 && (\n <span className=\"text-tertiary\">\n {execution.skippedNodes}{\" \"}\n {tr(\n \"fluidgrids.executions.executionTable.skipped\",\n \"skipped\",\n )}\n </span>\n )}\n </div>\n </div>\n\n {/* Error Message */}\n {execution.errorMessage && (\n <div className=\"col-span-2\">\n <div className=\"text-xs text-text-secondary mb-1\">\n {tr(\n \"fluidgrids.executions.executionTable.error\",\n \"Error\",\n )}\n </div>\n <div className=\"text-sm text-[var(--color-status-error-text)] bg-[var(--color-status-error-bg-subtle)] p-2 rounded\">\n {execution.errorMessage}\n </div>\n </div>\n )}\n\n {/* Full Run ID */}\n <div>\n <div className=\"text-xs text-text-secondary mb-1\">\n {tr(\n \"fluidgrids.executions.executionTable.fullRunId\",\n \"Full Run ID\",\n )}\n </div>\n <div className=\"text-sm font-mono text-text-secondary break-all\">\n {execution.id}\n </div>\n </div>\n </div>\n </td>\n </tr>\n )}\n </>\n );\n })}\n </tbody>\n </table>\n </div>\n\n {/* Mobile scroll hint */}\n <div className=\"sm:hidden px-4 py-2 bg-background-tertiary border-t border-border-secondary text-xs text-text-secondary text-center\">\n {tr(\n \"fluidgrids.executions.executionTable.swipeHint\",\n \"Swipe to see more columns\",\n )}\n </div>\n </div>\n );\n}\n","/**\n * ExecutionCards — Card-grid view for workflow executions.\n * Displays each execution as a card with status badge, timing info, and progress bar.\n * Used when viewMode is 'cards' in ExecutionsListPage.\n */\nimport { Icon } from \"@iconify/react\";\nimport type { WorkflowRun, RunStatus, ExecutionAction } from \"../types\";\nimport { formatRunVersion } from \"../utils/run-display\";\nimport { RUN_STATUS_CONFIG } from \"../types\";\nimport { ExecutionStatusBadge } from \"./ExecutionStatusBadge\";\nimport { useTr } from \"../../../hooks/useTr\";\n\ninterface ExecutionCardsProps {\n executions: WorkflowRun[];\n /** workflowKey → name fallback while runs lack the workflow relation. */\n workflowNames?: Record<string, string>;\n loading: boolean;\n onCardClick: (execution: WorkflowRun) => void;\n onAction: (action: ExecutionAction, execution: WorkflowRun) => void;\n}\n\nfunction formatDuration(ms?: number): string {\n if (!ms) return \"--\";\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n const mins = Math.floor(ms / 60000);\n const secs = Math.floor((ms % 60000) / 1000);\n return `${mins}m ${secs}s`;\n}\n\nfunction formatRelativeTime(dateStr?: string): string {\n if (!dateStr) return \"--\";\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n if (diffMins < 1) return \"just now\";\n if (diffMins < 60) return `${diffMins}m ago`;\n const diffHours = Math.floor(diffMins / 60);\n if (diffHours < 24) return `${diffHours}h ago`;\n const diffDays = Math.floor(diffHours / 24);\n return `${diffDays}d ago`;\n}\n\nfunction getProgressColor(status: RunStatus): string {\n switch (status) {\n case \"COMPLETED\":\n return \"bg-green-500\";\n case \"FAILED\":\n case \"TERMINATED\":\n return \"bg-red-500\";\n case \"RUNNING\":\n return \"bg-blue-500\";\n case \"CANCELLED\":\n return \"bg-orange-500\";\n default:\n return \"bg-gray-400\";\n }\n}\n\nexport function ExecutionCards({\n executions,\n workflowNames,\n loading,\n onCardClick,\n onAction,\n}: ExecutionCardsProps) {\n const tr = useTr();\n\n if (loading) {\n return (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div\n key={i}\n className=\"rounded-lg border border-border-secondary bg-background-secondary p-4 animate-pulse\"\n >\n <div className=\"flex justify-between mb-3\">\n <div className=\"h-4 bg-background-tertiary rounded w-32\" />\n <div className=\"h-5 bg-background-tertiary rounded-full w-20\" />\n </div>\n <div className=\"h-3 bg-background-tertiary rounded w-48 mb-2\" />\n <div className=\"h-2 bg-background-tertiary rounded w-full mb-3\" />\n <div className=\"flex justify-between\">\n <div className=\"h-3 bg-background-tertiary rounded w-16\" />\n <div className=\"h-3 bg-background-tertiary rounded w-24\" />\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n if (executions.length === 0) {\n return (\n <div className=\"flex flex-col items-center justify-center py-16 text-text-secondary\">\n <Icon\n icon=\"mdi:play-circle-outline\"\n width={48}\n className=\"mb-3 opacity-40\"\n />\n <p className=\"text-lg font-medium\">\n {tr(\n \"fluidgrids.executions.executionCards.emptyTitle\",\n \"No executions found\",\n )}\n </p>\n <p className=\"text-sm mt-1\">\n {tr(\n \"fluidgrids.executions.executionCards.emptyDescription\",\n \"Run a workflow to see results here\",\n )}\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\">\n {executions.map((execution) => {\n const config = RUN_STATUS_CONFIG[execution.status];\n const canCancel =\n execution.status === \"RUNNING\" || execution.status === \"PENDING\";\n const canPause = execution.status === \"RUNNING\";\n\n return (\n <div\n key={execution.id}\n onClick={() => onCardClick(execution)}\n className={`\n rounded-lg border bg-background-secondary p-4 cursor-pointer\n transition-all duration-200 hover:shadow-md hover:border-border-primary\n ${config.borderColor}\n `}\n >\n {/* Header: workflow key + status */}\n <div className=\"flex items-start justify-between mb-3\">\n <div className=\"min-w-0 flex-1 mr-2\">\n <p className=\"text-sm font-semibold text-text-primary truncate\">\n {execution.workflow?.name ||\n workflowNames?.[execution.workflowKey] ||\n execution.workflowKey}\n </p>\n <p className=\"text-xs text-text-tertiary mt-0.5\">\n {formatRunVersion(execution.version)}\n </p>\n </div>\n <ExecutionStatusBadge status={execution.status} size=\"sm\" />\n </div>\n\n {/* Progress bar */}\n <div className=\"mb-3\">\n <div className=\"flex justify-between text-xs text-text-tertiary mb-1\">\n <span>\n {tr(\n \"fluidgrids.executions.executionCards.progressLabel\",\n \"Progress\",\n )}\n </span>\n <span>{Math.round(execution.progress)}%</span>\n </div>\n <div className=\"h-1.5 bg-background-tertiary rounded-full overflow-hidden\">\n <div\n className={`h-full rounded-full transition-all duration-500 ${getProgressColor(execution.status)}`}\n style={{ width: `${Math.min(execution.progress, 100)}%` }}\n />\n </div>\n </div>\n\n {/* Node stats */}\n {(execution.totalNodes ?? 0) > 0 && (\n <div className=\"flex gap-3 text-xs text-text-secondary mb-3\">\n <span className=\"flex items-center gap-1\">\n <Icon\n icon=\"mdi:check-circle\"\n width={12}\n className=\"text-green-500\"\n />\n {execution.completedNodes ?? 0}\n </span>\n <span className=\"flex items-center gap-1\">\n <Icon\n icon=\"mdi:alert-circle\"\n width={12}\n className=\"text-red-500\"\n />\n {execution.failedNodes ?? 0}\n </span>\n <span className=\"flex items-center gap-1\">\n <Icon\n icon=\"mdi:skip-next\"\n width={12}\n className=\"text-gray-400\"\n />\n {execution.skippedNodes ?? 0}\n </span>\n <span className=\"flex items-center gap-1 ml-auto\">\n <Icon icon=\"mdi:sigma\" width={12} />\n {execution.totalNodes}\n </span>\n </div>\n )}\n\n {/* Footer: duration + time */}\n <div className=\"flex items-center justify-between text-xs text-text-tertiary pt-2 border-t border-border-secondary\">\n <span className=\"flex items-center gap-1\">\n <Icon icon=\"mdi:timer-outline\" width={12} />\n {formatDuration(execution.duration ?? undefined)}\n </span>\n <span>\n {formatRelativeTime(execution.startedAt ?? execution.createdAt)}\n </span>\n </div>\n\n {/* Quick actions on hover */}\n {(canCancel || canPause) && (\n <div className=\"flex gap-1 mt-2 pt-2 border-t border-border-secondary\">\n {canPause && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onAction(\"pause\", execution);\n }}\n className=\"flex items-center gap-1 text-xs px-2 py-1 rounded bg-background-tertiary hover:bg-yellow-50 dark:hover:bg-yellow-900/20 text-text-secondary hover:text-yellow-600 transition-colors\"\n >\n <Icon icon=\"mdi:pause\" width={12} />{\" \"}\n {tr(\n \"fluidgrids.executions.executionCards.pauseButton\",\n \"Pause\",\n )}\n </button>\n )}\n {canCancel && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onAction(\"cancel\", execution);\n }}\n className=\"flex items-center gap-1 text-xs px-2 py-1 rounded bg-background-tertiary hover:bg-red-50 dark:hover:bg-red-900/20 text-text-secondary hover:text-red-600 transition-colors\"\n >\n <Icon icon=\"mdi:stop\" width={12} />{\" \"}\n {tr(\n \"fluidgrids.executions.executionCards.cancelButton\",\n \"Cancel\",\n )}\n </button>\n )}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","/**\n * ExecutionTimeline — Chronological timeline view for workflow executions.\n * Displays executions as a vertical timeline with status indicators and duration bars.\n * Used when viewMode is 'timeline' in ExecutionsListPage.\n */\nimport { Icon } from \"@iconify/react\";\nimport type { WorkflowRun, RunStatus, ExecutionAction } from \"../types\";\nimport { ExecutionStatusBadge } from \"./ExecutionStatusBadge\";\nimport { useTr } from \"../../../hooks/useTr\";\n\ninterface ExecutionTimelineProps {\n executions: WorkflowRun[];\n loading: boolean;\n onItemClick: (execution: WorkflowRun) => void;\n onAction: (action: ExecutionAction, execution: WorkflowRun) => void;\n}\n\nfunction formatTime(dateStr?: string): string {\n if (!dateStr) return \"--\";\n return new Date(dateStr).toLocaleTimeString(undefined, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n}\n\nfunction formatDate(dateStr?: string): string {\n if (!dateStr) return \"\";\n return new Date(dateStr).toLocaleDateString(undefined, {\n weekday: \"short\",\n month: \"short\",\n day: \"numeric\",\n });\n}\n\nfunction formatDuration(ms?: number): string {\n if (!ms) return \"--\";\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n const mins = Math.floor(ms / 60000);\n const secs = Math.floor((ms % 60000) / 1000);\n return `${mins}m ${secs}s`;\n}\n\nfunction getStatusDotColor(status: RunStatus): string {\n switch (status) {\n case \"COMPLETED\":\n return \"bg-green-500\";\n case \"FAILED\":\n case \"TERMINATED\":\n return \"bg-red-500\";\n case \"RUNNING\":\n return \"bg-blue-500 animate-pulse\";\n case \"CANCELLED\":\n return \"bg-orange-500\";\n case \"WAITING\":\n return \"bg-purple-500\";\n case \"PENDING\":\n default:\n return \"bg-gray-400\";\n }\n}\n\n/** Group executions by date for timeline sections */\nfunction groupByDate(executions: WorkflowRun[]): Map<string, WorkflowRun[]> {\n const groups = new Map<string, WorkflowRun[]>();\n for (const exec of executions) {\n const dateKey = formatDate(exec.startedAt ?? exec.createdAt);\n if (!groups.has(dateKey)) {\n groups.set(dateKey, []);\n }\n groups.get(dateKey)!.push(exec);\n }\n return groups;\n}\n\nexport function ExecutionTimeline({\n executions,\n loading,\n onItemClick,\n onAction,\n}: ExecutionTimelineProps) {\n const tr = useTr();\n\n if (loading) {\n return (\n <div className=\"space-y-6 pl-8\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"flex gap-4 animate-pulse\">\n <div className=\"w-3 h-3 rounded-full bg-background-tertiary mt-1.5 shrink-0\" />\n <div className=\"flex-1\">\n <div className=\"h-4 bg-background-tertiary rounded w-48 mb-2\" />\n <div className=\"h-3 bg-background-tertiary rounded w-32 mb-1\" />\n <div className=\"h-3 bg-background-tertiary rounded w-24\" />\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n if (executions.length === 0) {\n return (\n <div className=\"flex flex-col items-center justify-center py-16 text-text-secondary\">\n <Icon icon=\"mdi:timeline\" width={48} className=\"mb-3 opacity-40\" />\n <p className=\"text-lg font-medium\">\n {tr(\n \"fluidgrids.executions.executionTimeline.emptyTitle\",\n \"No executions found\",\n )}\n </p>\n <p className=\"text-sm mt-1\">\n {tr(\n \"fluidgrids.executions.executionTimeline.emptyDescription\",\n \"Run a workflow to see the timeline\",\n )}\n </p>\n </div>\n );\n }\n\n const grouped = groupByDate(executions);\n\n return (\n <div className=\"space-y-8\">\n {Array.from(grouped.entries()).map(([dateLabel, dateExecutions]) => (\n <div key={dateLabel}>\n {/* Date header */}\n <div className=\"flex items-center gap-2 mb-4\">\n <Icon\n icon=\"mdi:calendar\"\n width={14}\n className=\"text-text-tertiary\"\n />\n <span className=\"text-xs font-semibold text-text-tertiary uppercase tracking-wider\">\n {dateLabel}\n </span>\n <div className=\"flex-1 h-px bg-border-secondary\" />\n <span className=\"text-xs text-text-tertiary\">\n {dateExecutions.length}{\" \"}\n {tr(\n \"fluidgrids.executions.executionTimeline.runsCountSuffix\",\n \"runs\",\n )}\n </span>\n </div>\n\n {/* Timeline items */}\n <div className=\"relative ml-4\">\n {/* Vertical line */}\n <div className=\"absolute left-[5px] top-0 bottom-0 w-px bg-border-secondary\" />\n\n <div className=\"space-y-4\">\n {dateExecutions.map((execution, idx) => {\n const isLast = idx === dateExecutions.length - 1;\n const canCancel =\n execution.status === \"RUNNING\" ||\n execution.status === \"PENDING\";\n\n return (\n <div\n key={execution.id}\n onClick={() => onItemClick(execution)}\n className=\"relative flex gap-4 cursor-pointer group\"\n >\n {/* Timeline dot */}\n <div className=\"relative z-10 shrink-0 mt-1.5\">\n <div\n className={`w-[11px] h-[11px] rounded-full border-2 border-background-primary ${getStatusDotColor(execution.status)}`}\n />\n </div>\n\n {/* Content */}\n <div\n className={`\n flex-1 rounded-lg border border-border-secondary bg-background-secondary p-3\n transition-all duration-200 group-hover:shadow-sm group-hover:border-border-primary\n ${isLast ? \"\" : \"mb-0\"}\n `}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold text-text-primary truncate\">\n {execution.workflowKey}\n </span>\n <span className=\"text-xs text-text-tertiary\">\n v{execution.version}\n </span>\n </div>\n <div className=\"flex items-center gap-3 mt-1 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <Icon icon=\"mdi:clock-outline\" width={12} />\n {formatTime(\n execution.startedAt ?? execution.createdAt,\n )}\n </span>\n <span className=\"flex items-center gap-1\">\n <Icon icon=\"mdi:timer-outline\" width={12} />\n {formatDuration(execution.duration ?? undefined)}\n </span>\n {(execution.totalNodes ?? 0) > 0 && (\n <span className=\"flex items-center gap-1\">\n <Icon icon=\"mdi:puzzle-outline\" width={12} />\n {execution.completedNodes ?? 0}/\n {execution.totalNodes}{\" \"}\n {tr(\n \"fluidgrids.executions.executionTimeline.nodesCountSuffix\",\n \"nodes\",\n )}\n </span>\n )}\n </div>\n {execution.errorMessage && (\n <p className=\"mt-1.5 text-xs text-red-500 dark:text-red-400 truncate max-w-sm\">\n {execution.errorMessage}\n </p>\n )}\n </div>\n\n <div className=\"flex items-center gap-2 shrink-0\">\n <ExecutionStatusBadge\n status={execution.status}\n size=\"sm\"\n />\n {canCancel && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onAction(\"cancel\", execution);\n }}\n className=\"opacity-0 group-hover:opacity-100 p-1 rounded hover:bg-red-50 dark:hover:bg-red-900/20 text-text-tertiary hover:text-red-600 transition-all\"\n title={tr(\n \"fluidgrids.executions.executionTimeline.cancelTooltip\",\n \"Cancel execution\",\n )}\n >\n <Icon icon=\"mdi:stop\" width={14} />\n </button>\n )}\n </div>\n </div>\n\n {/* Progress bar */}\n {execution.status === \"RUNNING\" && (\n <div className=\"mt-2\">\n <div className=\"h-1 bg-background-tertiary rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-blue-500 rounded-full transition-all duration-500 animate-pulse\"\n style={{\n width: `${Math.min(execution.progress, 100)}%`,\n }}\n />\n </div>\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n ))}\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport { NodeStatusBadge } from \"./ExecutionStatusBadge\";\nimport type { NodeState } from \"../types\";\nimport { nodeDisplayTitle, type NodeDisplay } from \"../utils/run-display\";\nimport { useTr } from \"../../../hooks/useTr\";\n\ninterface NodeTimelineProps {\n nodeStates: NodeState[];\n /** nodeId → label/operation from the workflow definition. */\n nodeDisplay?: Record<string, NodeDisplay>;\n loading?: boolean;\n /** The run's entry point, pinned first — see {@link orderNodesByExecution}. */\n triggerNodeId?: string;\n onRetryNode?: (nodeId: string) => void;\n onViewChildRun?: (childRunId: string) => void;\n}\n\n/**\n * Order nodes the way they actually executed.\n *\n * The trigger node is the run's entry point, but it never goes through the node\n * executor, so its state row has no `startTime`. The previous comparator sent\n * every node without a `startTime` to the end of the list, which displayed the\n * trigger LAST — numbered behind the nodes it had itself started. So it is\n * pinned to the front explicitly.\n *\n * For everything else, fall back to `endTime` when `startTime` is missing so a\n * node that recorded only a completion still lands in the right place. Nodes\n * with neither timestamp genuinely have not run yet (PENDING/SKIPPED) and\n * belong at the end.\n */\nexport function orderNodesByExecution(\n nodeStates: NodeState[],\n triggerNodeId?: string,\n): NodeState[] {\n const rankOf = (node: NodeState): number => {\n const stamp = node.startTime ?? node.endTime;\n return stamp ? new Date(stamp).getTime() : Number.POSITIVE_INFINITY;\n };\n\n return [...nodeStates].sort((a, b) => {\n const aIsTrigger =\n triggerNodeId !== undefined && a.nodeId === triggerNodeId;\n const bIsTrigger =\n triggerNodeId !== undefined && b.nodeId === triggerNodeId;\n if (aIsTrigger !== bIsTrigger) return aIsTrigger ? -1 : 1;\n\n const rankA = rankOf(a);\n const rankB = rankOf(b);\n // Equality also covers two un-run nodes, where subtracting infinities\n // would produce NaN and leave the sort order undefined.\n return rankA === rankB ? 0 : rankA - rankB;\n });\n}\n\nexport function NodeTimeline({\n nodeStates,\n nodeDisplay,\n loading,\n triggerNodeId,\n onRetryNode,\n onViewChildRun,\n}: NodeTimelineProps) {\n const tr = useTr();\n const [expandedNodes, setExpandedNodes] = useState<Set<string>>(new Set());\n const [selectedTab, setSelectedTab] = useState<\"input\" | \"output\">(\"output\");\n\n const toggleNode = (nodeId: string) => {\n setExpandedNodes((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(nodeId)) {\n newSet.delete(nodeId);\n } else {\n newSet.add(nodeId);\n }\n return newSet;\n });\n };\n\n const formatDuration = (ms?: number): string => {\n if (!ms) return \"-\";\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(2)}s`;\n };\n\n const formatTime = (dateStr?: string): string => {\n if (!dateStr) return \"-\";\n const date = new Date(dateStr);\n return date.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n });\n };\n\n // Helper function to safely format JSON data for display\n const formatJsonData = (data: NodeState[\"metadata\"]): string => {\n if (data === null || data === undefined)\n return tr(\"fluidgrids.executions.nodeTimeline.noData\", \"No data\");\n try {\n return JSON.stringify(data, null, 2);\n } catch {\n return tr(\n \"fluidgrids.executions.nodeTimeline.unableToDisplayData\",\n \"Unable to display data\",\n );\n }\n };\n\n // Check if metadata has content\n const hasMetadata = (metadata: NodeState[\"metadata\"]): boolean => {\n if (!metadata || typeof metadata !== \"object\") return false;\n return (\n Object.keys(metadata as Record<string, NodeState[\"metadata\"]>).length > 0\n );\n };\n\n const sortedNodes: NodeState[] = orderNodesByExecution(\n nodeStates,\n triggerNodeId,\n );\n\n if (loading) {\n return (\n <div className=\"space-y-4\">\n {[...Array(4)].map((_, i) => (\n <div key={i} className=\"flex gap-4 animate-pulse\">\n <div className=\"w-8 h-8 bg-background-tertiary rounded-full\" />\n <div className=\"flex-1 h-20 bg-background-tertiary rounded-lg\" />\n </div>\n ))}\n </div>\n );\n }\n\n if (nodeStates.length === 0) {\n return (\n <div className=\"text-center py-8 text-text-secondary\">\n <Icon icon=\"mdi:timeline-outline\" className=\"mx-auto mb-2\" width={32} />\n <p>\n {tr(\n \"fluidgrids.executions.nodeTimeline.emptyState\",\n \"No node executions yet\",\n )}\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"relative\">\n {/* Timeline line */}\n <div className=\"absolute left-4 top-8 bottom-8 w-0.5 bg-border-secondary\" />\n\n <div className=\"space-y-4\">\n {sortedNodes.map((node: NodeState, index: number) => {\n const isExpanded = expandedNodes.has(node.id);\n const nodeError: string | undefined = node.error;\n const hasError = node.status === \"FAILED\" || Boolean(nodeError);\n const isRunning = node.status === \"RUNNING\";\n const isWaitingSubworkflow = node.status === \"WAITING_SUBWORKFLOW\";\n const hasChildRun = Boolean(node.childRunId);\n\n return (\n <div key={node.id} className=\"relative flex gap-4\">\n {/* Timeline dot */}\n <div\n className={`\n relative z-10 w-8 h-8 rounded-full flex items-center justify-center flex-shrink-0\n ${\n node.status === \"COMPLETED\"\n ? \"bg-[var(--color-status-success-bg-subtle)] text-[var(--color-status-success-text)]\"\n : node.status === \"FAILED\"\n ? \"bg-[var(--color-status-error-bg-subtle)] text-[var(--color-status-error-text)]\"\n : node.status === \"RUNNING\"\n ? \"bg-[var(--color-status-info-bg-subtle)] text-[var(--color-status-info-text)]\"\n : node.status === \"SKIPPED\"\n ? \"bg-muted text-tertiary\"\n : \"bg-muted text-tertiary\"\n }\n `}\n >\n <span className=\"text-xs font-bold\">{index + 1}</span>\n {isRunning && (\n <span className=\"absolute inset-0 rounded-full border-2 border-[var(--color-status-info-text)] animate-ping\" />\n )}\n </div>\n\n {/* Node card */}\n <div\n className={`\n flex-1 rounded-lg border transition-all\n ${\n hasError\n ? \"bg-[var(--color-status-error-bg-subtle)] border-[var(--color-status-error-border)]\"\n : isRunning\n ? \"bg-[var(--color-status-info-bg-subtle)] border-[var(--color-status-info-border)]\"\n : \"bg-background-secondary border-border-secondary\"\n }\n `}\n >\n {/* Header */}\n <button\n onClick={() => toggleNode(node.id)}\n className=\"w-full px-4 py-3 flex items-center justify-between text-left\"\n >\n <div className=\"flex items-center gap-3 min-w-0\">\n <div className=\"flex-shrink-0\">\n <NodeStatusBadge\n status={node.status}\n size=\"sm\"\n showLabel={false}\n />\n </div>\n <div className=\"min-w-0\">\n <div\n className=\"font-medium text-text-primary truncate\"\n title={node.nodeId}\n >\n {nodeDisplayTitle(\n nodeDisplay?.[node.nodeId],\n node.nodeId,\n )}\n </div>\n <div className=\"text-xs text-text-secondary\">\n {node.nodeType} v{node.nodeVersion}\n </div>\n </div>\n </div>\n\n <div className=\"flex items-center gap-4 flex-shrink-0\">\n {/* Timing info */}\n <div className=\"text-right text-xs text-text-secondary hidden sm:block\">\n <div>{formatTime(node.startTime)}</div>\n <div>{formatDuration(node.duration)}</div>\n </div>\n\n {/* Sub-workflow indicator */}\n {hasChildRun && (\n <span className=\"px-2 py-0.5 text-xs bg-indigo-100 text-indigo-700 rounded flex items-center gap-1\">\n <Icon icon=\"mdi:sitemap\" width={12} />\n {tr(\n \"fluidgrids.executions.nodeTimeline.subWorkflowBadge\",\n \"Sub-workflow\",\n )}\n </span>\n )}\n\n {/* Waiting for subworkflow indicator */}\n {isWaitingSubworkflow && (\n <span className=\"px-2 py-0.5 text-xs bg-purple-100 text-purple-700 rounded animate-pulse\">\n {tr(\n \"fluidgrids.executions.nodeTimeline.waitingBadge\",\n \"Waiting...\",\n )}\n </span>\n )}\n\n {/* Attempt count */}\n {node.attemptCount > 1 && (\n <span className=\"px-2 py-0.5 text-xs bg-[var(--color-status-warning-bg-subtle)] text-[var(--color-status-warning-text)] rounded\">\n {tr(\n \"fluidgrids.executions.nodeTimeline.attemptLabel\",\n \"Attempt\",\n )}{\" \"}\n {node.attemptCount}\n </span>\n )}\n\n {/* Expand icon */}\n <Icon\n icon={isExpanded ? \"mdi:chevron-up\" : \"mdi:chevron-down\"}\n className=\"text-text-secondary\"\n width={20}\n />\n </div>\n </button>\n\n {/* Expanded content */}\n {isExpanded && (\n <div className=\"px-4 pb-4 border-t border-border-secondary/50\">\n {/* Tabs for Input/Output */}\n <div className=\"flex gap-2 mt-3 mb-3\">\n <button\n onClick={() => setSelectedTab(\"output\")}\n className={`px-3 py-1.5 text-sm rounded ${\n selectedTab === \"output\"\n ? \"bg-action-primary-bg text-white\"\n : \"bg-background-tertiary text-text-secondary\"\n }`}\n >\n {tr(\n \"fluidgrids.executions.nodeTimeline.outputTab\",\n \"Output\",\n )}\n </button>\n <button\n onClick={() => setSelectedTab(\"input\")}\n className={`px-3 py-1.5 text-sm rounded ${\n selectedTab === \"input\"\n ? \"bg-action-primary-bg text-white\"\n : \"bg-background-tertiary text-text-secondary\"\n }`}\n >\n {tr(\n \"fluidgrids.executions.nodeTimeline.inputTab\",\n \"Input\",\n )}\n </button>\n </div>\n\n {/* Data display */}\n <div className=\"bg-background-primary rounded p-3 max-h-64 overflow-auto\">\n <pre className=\"text-xs text-text-primary whitespace-pre-wrap break-words font-mono\">\n {selectedTab === \"output\"\n ? formatJsonData(node.output)\n : formatJsonData(node.inputArgs)}\n </pre>\n </div>\n\n {/* Error display */}\n {node.error && (\n <div className=\"mt-3 p-3 bg-[var(--color-status-error-bg-subtle)] border border-[var(--color-status-error-border)] rounded\">\n <div className=\"flex items-center gap-2 text-[var(--color-status-error-text)] mb-1\">\n <Icon icon=\"mdi:alert-circle\" width={16} />\n <span className=\"font-medium text-sm\">\n {tr(\n \"fluidgrids.executions.nodeTimeline.errorLabel\",\n \"Error\",\n )}\n </span>\n {node.errorType && (\n <span className=\"text-xs bg-[var(--color-status-error-bg)] px-2 py-0.5 rounded\">\n {node.errorType}\n </span>\n )}\n </div>\n <p className=\"text-sm text-[var(--color-status-error-text)]\">\n {node.error}\n </p>\n </div>\n )}\n\n {/* Actions */}\n <div className=\"mt-3 flex justify-end gap-2\">\n {/* Sub-workflow drill-down */}\n {hasChildRun && onViewChildRun && (\n <button\n onClick={() => onViewChildRun(node.childRunId!)}\n className=\"px-3 py-1.5 text-sm bg-indigo-600 text-white rounded hover:bg-indigo-700 flex items-center gap-1.5\"\n >\n <Icon icon=\"mdi:sitemap\" width={16} />\n {tr(\n \"fluidgrids.executions.nodeTimeline.viewSubWorkflowRun\",\n \"View Sub-Workflow Run\",\n )}\n </button>\n )}\n\n {node.status === \"FAILED\" && onRetryNode && (\n <button\n onClick={() => onRetryNode(node.nodeId)}\n className=\"px-3 py-1.5 text-sm bg-action-primary-bg text-white rounded hover:bg-action-primary-bg/90 flex items-center gap-1.5\"\n >\n <Icon icon=\"mdi:refresh\" width={16} />\n {tr(\n \"fluidgrids.executions.nodeTimeline.retryNodeButton\",\n \"Retry Node\",\n )}\n </button>\n )}\n </div>\n\n {/* Metadata */}\n {hasMetadata(node.metadata) && (\n <details className=\"mt-3\">\n <summary className=\"text-xs text-text-secondary cursor-pointer hover:text-text-primary\">\n {tr(\n \"fluidgrids.executions.nodeTimeline.metadataSummary\",\n \"Metadata\",\n )}\n </summary>\n <pre className=\"mt-2 text-xs text-text-secondary bg-background-tertiary p-2 rounded overflow-auto max-h-32\">\n {formatJsonData(node.metadata)}\n </pre>\n </details>\n )}\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","/**\n * RunLogViewer — the run's execution log, shaped like a GitHub Actions job log.\n *\n * Lines are grouped by the node that produced them (a node is this platform's\n * equivalent of an Actions step). A node that finished cleanly is folded away;\n * whatever is running, whatever failed, and the run's own lines are open,\n * because those are what a reader came for. Run-level lines sit in their own\n * group at the top.\n *\n * Deliberately not virtualised: the server caps a run at 10,000 lines and\n * successful groups are folded by default, so the DOM stays small without\n * pulling in a windowing dependency that would fight the collapse behaviour.\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport { Button } from \"@burdenoff/fe-libs/button\";\n\nimport type { NodeState, RunLogLevel, RunLogLine } from \"../types\";\nimport { nodeDisplayTitle, type NodeDisplay } from \"../utils/run-display\";\nimport { useTr } from \"../../../hooks/useTr\";\n\ninterface RunLogViewerProps {\n runId: string;\n lines: RunLogLine[];\n /** Node states, used to label groups and show each node's status. */\n nodeStates: NodeState[];\n /** nodeId → label/operation from the workflow definition. */\n nodeDisplay?: Record<string, NodeDisplay>;\n loading: boolean;\n error: Error | null;\n hasMore: boolean;\n limitReached: boolean;\n /** True while a live subscription is delivering, as opposed to polling. */\n streaming: boolean;\n /** True while the run can still produce more lines. */\n active: boolean;\n minLevel: RunLogLevel | null;\n onMinLevelChange: (level: RunLogLevel | null) => void;\n onLoadMore: () => void;\n}\n\n/** Group of lines belonging to one node execution (or to the run itself). */\ninterface LogGroup {\n key: string;\n nodeId: string | null;\n label: string;\n status?: NodeState[\"status\"];\n lines: RunLogLine[];\n hasError: boolean;\n}\n\nconst LEVEL_ORDER: RunLogLevel[] = [\"DEBUG\", \"INFO\", \"WARN\", \"ERROR\"];\n\n/**\n * Semantic token per level. Raw colours are banned in this codebase, and these\n * are the same status tokens the rest of the run detail page uses, so the log\n * reads as part of the page rather than as an embedded terminal.\n */\nconst LEVEL_TEXT_CLASS: Record<RunLogLevel, string> = {\n DEBUG: \"text-text-secondary\",\n INFO: \"text-text-primary\",\n WARN: \"text-[var(--color-status-warning-text)]\",\n ERROR: \"text-[var(--color-status-error-text)]\",\n};\n\nconst LEVEL_BADGE_CLASS: Record<RunLogLevel, string> = {\n DEBUG: \"bg-muted text-tertiary\",\n INFO: \"bg-[var(--color-status-info-bg)] text-[var(--color-status-info-text)]\",\n WARN: \"bg-[var(--color-status-warning-bg)] text-[var(--color-status-warning-text)]\",\n ERROR:\n \"bg-[var(--color-status-error-bg)] text-[var(--color-status-error-text)]\",\n};\n\nfunction formatTimestamp(iso: string): string {\n const date = new Date(iso);\n const time = date.toLocaleTimeString(\"en-US\", {\n hour12: false,\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n return `${time}.${String(date.getMilliseconds()).padStart(3, \"0\")}`;\n}\n\n/**\n * Split lines into per-node groups, preserving first-seen order.\n *\n * Grouping is by `nodeId` rather than by node STATE id so a retried node keeps\n * one group; the attempt number is shown on the individual lines instead.\n */\nfunction groupLines(\n lines: RunLogLine[],\n nodeStates: NodeState[],\n nodeDisplay?: Record<string, NodeDisplay>,\n): LogGroup[] {\n const byNode = new Map<string, LogGroup>();\n const order: string[] = [];\n\n for (const line of lines) {\n const key = line.nodeId ?? \"__run__\";\n let group = byNode.get(key);\n\n if (!group) {\n const state = line.nodeId\n ? nodeStates.find((ns) => ns.nodeId === line.nodeId)\n : undefined;\n group = {\n key,\n nodeId: line.nodeId ?? null,\n label: line.nodeId\n ? `${nodeDisplayTitle(nodeDisplay?.[line.nodeId], line.nodeId)}${state?.nodeType ? ` · ${state.nodeType}` : \"\"}`\n : \"Run\",\n status: state?.status,\n lines: [],\n hasError: false,\n };\n byNode.set(key, group);\n order.push(key);\n }\n\n group.lines.push(line);\n if (line.level === \"ERROR\") group.hasError = true;\n }\n\n return order.map((key) => byNode.get(key)!);\n}\n\nexport function RunLogViewer({\n runId,\n lines,\n nodeStates,\n nodeDisplay,\n loading,\n error,\n hasMore,\n limitReached,\n streaming,\n active,\n minLevel,\n onMinLevelChange,\n onLoadMore,\n}: RunLogViewerProps): React.ReactElement {\n const tr = useTr();\n const [search, setSearch] = useState(\"\");\n const [showTimestamps, setShowTimestamps] = useState(true);\n const [wrap, setWrap] = useState(true);\n const [follow, setFollow] = useState(true);\n /** Groups the reader explicitly collapsed / expanded; overrides the default. */\n const [collapsed, setCollapsed] = useState<Set<string>>(new Set());\n const [expanded, setExpanded] = useState<Set<string>>(new Set());\n /** Line targeted by a #L<id> deep link, highlighted once scrolled to. */\n const [highlighted, setHighlighted] = useState<string | null>(null);\n\n const scrollRef = useRef<HTMLDivElement>(null);\n const bottomRef = useRef<HTMLDivElement>(null);\n\n const visible = useMemo(() => {\n if (!search.trim()) return lines;\n const needle = search.toLowerCase();\n return lines.filter((line) => line.message.toLowerCase().includes(needle));\n }, [lines, search]);\n\n const groups = useMemo(\n () => groupLines(visible, nodeStates, nodeDisplay),\n [visible, nodeStates, nodeDisplay],\n );\n\n /**\n * Default open/closed state for a group, GitHub-Actions style: a node that\n * finished cleanly is folded away, and the ones a reader actually came for —\n * whatever is running, whatever failed, and the run's own lines — are open.\n *\n * `expanded`/`collapsed` hold only the groups the reader has toggled, so an\n * explicit choice always wins and a node changing status later never yanks a\n * group closed under them.\n */\n const isCollapsed = useCallback(\n (group: LogGroup): boolean => {\n if (collapsed.has(group.key)) return true;\n if (expanded.has(group.key)) return false;\n if (group.nodeId === null) return false;\n return !group.hasError && group.status !== \"RUNNING\";\n },\n [collapsed, expanded],\n );\n\n const toggleGroup = useCallback(\n (key: string, currentlyCollapsed: boolean) => {\n setCollapsed((prev) => {\n const next = new Set(prev);\n if (currentlyCollapsed) next.delete(key);\n else next.add(key);\n return next;\n });\n setExpanded((prev) => {\n const next = new Set(prev);\n if (currentlyCollapsed) next.add(key);\n else next.delete(key);\n return next;\n });\n },\n [],\n );\n\n // Follow mode, GitHub Actions style: keep pinned to the newest line, but\n // disengage the moment the reader scrolls up to look at something.\n useEffect(() => {\n if (!follow) return;\n bottomRef.current?.scrollIntoView({ block: \"end\" });\n }, [visible.length, follow]);\n\n const handleScroll = useCallback(() => {\n const el = scrollRef.current;\n if (!el) return;\n const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 40;\n setFollow(atBottom);\n }, []);\n\n // Deep link: /workflows/runs/<id>#L<lineId> scrolls to and highlights a line,\n // so a log line can be pasted into a ticket or a chat and still be findable.\n useEffect(() => {\n const hash = window.location.hash;\n if (!hash.startsWith(\"#L\")) return;\n const target = hash.slice(2);\n if (!lines.some((line) => line.id === target)) return;\n\n setHighlighted(target);\n setFollow(false);\n // Defer to let the row render before scrolling to it.\n const timer = setTimeout(() => {\n document\n .getElementById(`L${target}`)\n ?.scrollIntoView({ block: \"center\", behavior: \"smooth\" });\n }, 50);\n return () => clearTimeout(timer);\n }, [lines]);\n\n const copyLineLink = useCallback((lineId: string) => {\n const url = `${window.location.origin}${window.location.pathname}#L${lineId}`;\n void navigator.clipboard?.writeText(url);\n setHighlighted(lineId);\n }, []);\n\n /** Download the log as plain text — the same shape a terminal would show. */\n const downloadRaw = useCallback(() => {\n const body = lines\n .map((line) => {\n const node = line.nodeId\n ? ` [${nodeDisplayTitle(nodeDisplay?.[line.nodeId], line.nodeId)}]`\n : \"\";\n return `${line.timestamp} ${line.level.padEnd(5)}${node} ${line.message}`;\n })\n .join(\"\\n\");\n\n const url = URL.createObjectURL(\n new Blob([body], { type: \"text/plain;charset=utf-8\" }),\n );\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = `run-${runId}.log`;\n anchor.click();\n URL.revokeObjectURL(url);\n }, [lines, runId, nodeDisplay]);\n\n if (loading && lines.length === 0) {\n return (\n <div className=\"space-y-2\" data-testid=\"run-log-loading\">\n {[...Array(6)].map((_, i) => (\n <div\n key={i}\n className=\"h-6 bg-background-tertiary rounded animate-pulse\"\n />\n ))}\n </div>\n );\n }\n\n if (error && lines.length === 0) {\n return (\n <div className=\"bg-[var(--color-status-error-bg-subtle)] border border-[var(--color-status-error-border)] rounded-lg p-6 text-center\">\n <Icon\n icon=\"mdi:alert-circle\"\n className=\"mx-auto text-[var(--color-status-error-text)] mb-3\"\n width={32}\n />\n <p className=\"text-[var(--color-status-error-text)]\">{error.message}</p>\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-3\" data-testid=\"run-log-viewer\">\n {/* Toolbar */}\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"relative flex-1 min-w-[200px]\">\n <Icon\n icon=\"mdi:magnify\"\n className=\"absolute left-2 top-1/2 -translate-y-1/2 text-text-secondary\"\n width={16}\n />\n <input\n type=\"search\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={tr(\n \"fluidgrids.executions.runLogViewer.searchPlaceholder\",\n \"Search log\",\n )}\n aria-label={tr(\n \"fluidgrids.executions.runLogViewer.searchAriaLabel\",\n \"Search log\",\n )}\n className=\"w-full pl-8 pr-3 py-1.5 text-sm rounded border border-border-secondary bg-background-primary text-text-primary\"\n />\n </div>\n\n <select\n value={minLevel ?? \"ALL\"}\n onChange={(e) =>\n onMinLevelChange(\n e.target.value === \"ALL\" ? null : (e.target.value as RunLogLevel),\n )\n }\n aria-label={tr(\n \"fluidgrids.executions.runLogViewer.minLevelAriaLabel\",\n \"Minimum log level\",\n )}\n className=\"px-2 py-1.5 text-sm rounded border border-border-secondary bg-background-primary text-text-primary\"\n >\n <option value=\"ALL\">\n {tr(\n \"fluidgrids.executions.runLogViewer.allLevelsOption\",\n \"All levels\",\n )}\n </option>\n {LEVEL_ORDER.map((level) => (\n <option key={level} value={level}>\n {level}{\" \"}\n {tr(\n \"fluidgrids.executions.runLogViewer.andAboveSuffix\",\n \"and above\",\n )}\n </option>\n ))}\n </select>\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setShowTimestamps((v) => !v)}\n aria-pressed={showTimestamps}\n >\n <Icon icon=\"mdi:clock-outline\" className=\"mr-1\" width={16} />\n {tr(\n \"fluidgrids.executions.runLogViewer.timestampsButton\",\n \"Timestamps\",\n )}\n </Button>\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setWrap((v) => !v)}\n aria-pressed={wrap}\n >\n <Icon icon=\"mdi:wrap\" className=\"mr-1\" width={16} />\n {tr(\"fluidgrids.executions.runLogViewer.wrapButton\", \"Wrap\")}\n </Button>\n\n {active && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setFollow((v) => !v)}\n aria-pressed={follow}\n >\n <Icon\n icon={follow ? \"mdi:pause\" : \"mdi:arrow-down-bold\"}\n className=\"mr-1\"\n width={16}\n />\n {follow\n ? tr(\n \"fluidgrids.executions.runLogViewer.followingButton\",\n \"Following\",\n )\n : tr(\"fluidgrids.executions.runLogViewer.followButton\", \"Follow\")}\n </Button>\n )}\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={downloadRaw}\n disabled={lines.length === 0}\n >\n <Icon icon=\"mdi:download\" className=\"mr-1\" width={16} />\n {tr(\"fluidgrids.executions.runLogViewer.rawButton\", \"Raw\")}\n </Button>\n </div>\n\n {/* Status strip */}\n <div className=\"flex flex-wrap items-center gap-3 text-xs text-text-secondary\">\n <span>\n {visible.length}{\" \"}\n {visible.length === 1\n ? tr(\"fluidgrids.executions.runLogViewer.lineCountSingular\", \"line\")\n : tr(\"fluidgrids.executions.runLogViewer.lineCountPlural\", \"lines\")}\n {search.trim() &&\n ` ${tr(\"fluidgrids.executions.runLogViewer.matchingLabel\", \"matching\")} “${search}”`}\n </span>\n {active && (\n <span className=\"flex items-center gap-1\">\n <span\n className={`inline-block w-2 h-2 rounded-full ${\n streaming\n ? \"bg-[var(--color-status-success-bg)]\"\n : \"bg-[var(--color-status-info-bg)]\"\n }`}\n />\n {streaming\n ? tr(\n \"fluidgrids.executions.runLogViewer.streamingIndicator\",\n \"Streaming\",\n )\n : tr(\n \"fluidgrids.executions.runLogViewer.pollingIndicator\",\n \"Polling\",\n )}\n </span>\n )}\n {hasMore && (\n <button\n onClick={onLoadMore}\n className=\"text-action-primary-text hover:underline\"\n >\n {/* Paging runs FORWARD from the oldest line, so there is more of the\n run still to load — not older history behind it. */}\n {tr(\n \"fluidgrids.executions.runLogViewer.loadMoreLines\",\n \"Load more lines\",\n )}\n </button>\n )}\n </div>\n\n {limitReached && (\n <div className=\"px-3 py-2 rounded border border-[var(--color-status-warning-border)] bg-[var(--color-status-warning-bg-subtle)] text-[var(--color-status-warning-text)] text-sm\">\n {tr(\n \"fluidgrids.executions.runLogViewer.limitReachedNotice\",\n \"This run hit its log limit — later lines were dropped. Reduce logging inside loops, or split the workflow into sub-workflows.\",\n )}\n </div>\n )}\n\n {/* Log body */}\n <div\n ref={scrollRef}\n onScroll={handleScroll}\n className=\"max-h-[600px] overflow-auto rounded-lg border border-border-secondary bg-background-primary\"\n >\n {groups.length === 0 ? (\n <div className=\"text-center py-10 text-text-secondary\">\n <Icon\n icon=\"mdi:text-box-outline\"\n className=\"mx-auto mb-2\"\n width={32}\n />\n <p>\n {search.trim()\n ? tr(\n \"fluidgrids.executions.runLogViewer.noSearchMatches\",\n \"No lines match your search\",\n )\n : active\n ? tr(\n \"fluidgrids.executions.runLogViewer.waitingForFirstLine\",\n \"Waiting for the first log line…\",\n )\n : tr(\n \"fluidgrids.executions.runLogViewer.noLogOutput\",\n \"This run produced no log output\",\n )}\n </p>\n </div>\n ) : (\n groups.map((group) => {\n const groupCollapsed = isCollapsed(group);\n return (\n <div\n key={group.key}\n className=\"border-b border-border-secondary last:border-b-0\"\n >\n <button\n onClick={() => toggleGroup(group.key, groupCollapsed)}\n aria-expanded={!groupCollapsed}\n className=\"w-full flex items-center gap-2 px-3 py-2 text-left hover:bg-background-tertiary transition-colors\"\n >\n <Icon\n icon={\n groupCollapsed ? \"mdi:chevron-right\" : \"mdi:chevron-down\"\n }\n width={18}\n className=\"text-text-secondary flex-shrink-0\"\n />\n <span\n className={`text-sm font-medium truncate ${\n group.hasError\n ? \"text-[var(--color-status-error-text)]\"\n : \"text-text-primary\"\n }`}\n >\n {group.label}\n </span>\n {group.status === \"RUNNING\" && (\n <Icon\n icon=\"mdi:loading\"\n className=\"animate-spin text-[var(--color-status-info-text)] flex-shrink-0\"\n width={14}\n />\n )}\n <span className=\"ml-auto text-xs text-text-secondary flex-shrink-0\">\n {group.lines.length}\n </span>\n </button>\n\n {!groupCollapsed && (\n <div className=\"font-mono text-xs\">\n {group.lines.map((line) => (\n <div\n key={line.id}\n id={`L${line.id}`}\n className={`group flex items-start gap-2 px-3 py-0.5 hover:bg-background-tertiary ${\n highlighted === line.id\n ? \"bg-[var(--color-status-info-bg-subtle)]\"\n : \"\"\n }`}\n >\n {showTimestamps && (\n <span className=\"text-text-secondary whitespace-nowrap select-none\">\n {formatTimestamp(line.timestamp)}\n </span>\n )}\n <span\n className={`px-1 rounded uppercase text-[10px] leading-4 font-medium flex-shrink-0 ${LEVEL_BADGE_CLASS[line.level]}`}\n >\n {line.level}\n </span>\n {line.attempt > 1 && (\n <span\n className=\"text-text-secondary flex-shrink-0\"\n title={`${tr(\"fluidgrids.executions.runLogViewer.attemptTooltip\", \"Attempt\")} ${line.attempt}`}\n >\n #{line.attempt}\n </span>\n )}\n <span\n className={`flex-1 ${LEVEL_TEXT_CLASS[line.level]} ${\n wrap\n ? \"whitespace-pre-wrap break-words\"\n : \"whitespace-pre overflow-x-auto\"\n }`}\n >\n {line.message}\n {line.truncated && (\n <span className=\"text-text-secondary\">\n {\" \"}\n {tr(\n \"fluidgrids.executions.runLogViewer.truncatedSuffix\",\n \"(truncated)\",\n )}\n </span>\n )}\n </span>\n <button\n onClick={() => copyLineLink(line.id)}\n title={tr(\n \"fluidgrids.executions.runLogViewer.copyLineLinkTooltip\",\n \"Copy link to this line\",\n )}\n aria-label={tr(\n \"fluidgrids.executions.runLogViewer.copyLineLinkAriaLabel\",\n \"Copy link to this line\",\n )}\n className=\"opacity-0 group-hover:opacity-100 text-text-secondary hover:text-text-primary flex-shrink-0\"\n >\n <Icon icon=\"mdi:link-variant\" width={14} />\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n })\n )}\n <div ref={bottomRef} />\n </div>\n </div>\n );\n}\n","import { Icon } from \"@iconify/react\";\nimport { useExecutionsStore } from \"../store/executionsStore\";\nimport { useTr } from \"../../../hooks/useTr\";\n\ninterface PaginationProps {\n totalItems?: number;\n showPageSize?: boolean;\n}\n\nexport function Pagination({\n totalItems,\n showPageSize = true,\n}: PaginationProps) {\n const tr = useTr();\n const { pagination, setPage, setPageSize } = useExecutionsStore();\n\n const { page, pageSize, total } = pagination;\n const totalPages = Math.ceil((totalItems ?? total) / pageSize);\n const startItem = (page - 1) * pageSize + 1;\n const endItem = Math.min(page * pageSize, totalItems ?? total);\n\n const pageSizeOptions = [10, 25, 50, 100];\n\n const goToPage = (newPage: number) => {\n if (newPage >= 1 && newPage <= totalPages) {\n setPage(newPage);\n }\n };\n\n // Generate page numbers to show\n const getPageNumbers = () => {\n const pages: (number | \"ellipsis\")[] = [];\n const showEllipsisThreshold = 7;\n\n if (totalPages <= showEllipsisThreshold) {\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n pages.push(1);\n\n if (page > 3) {\n pages.push(\"ellipsis\");\n }\n\n const start = Math.max(2, page - 1);\n const end = Math.min(totalPages - 1, page + 1);\n\n for (let i = start; i <= end; i++) {\n pages.push(i);\n }\n\n if (page < totalPages - 2) {\n pages.push(\"ellipsis\");\n }\n\n pages.push(totalPages);\n }\n\n return pages;\n };\n\n if (totalPages <= 1 && !showPageSize) {\n return null;\n }\n\n return (\n <div className=\"flex flex-col sm:flex-row items-center justify-between gap-4 py-4\">\n {/* Results info */}\n <div className=\"text-sm text-text-secondary\">\n {tr(\"fluidgrids.executions.pagination.showingLabel\", \"Showing\")}{\" \"}\n <span className=\"font-medium text-text-primary\">{startItem}</span>{\" \"}\n {tr(\"fluidgrids.executions.pagination.toLabel\", \"to\")}{\" \"}\n <span className=\"font-medium text-text-primary\">{endItem}</span>{\" \"}\n {tr(\"fluidgrids.executions.pagination.ofLabel\", \"of\")}{\" \"}\n <span className=\"font-medium text-text-primary\">\n {totalItems ?? total}\n </span>{\" \"}\n {tr(\"fluidgrids.executions.pagination.resultsLabel\", \"results\")}\n </div>\n\n <div className=\"flex items-center gap-4\">\n {/* Page size selector */}\n {showPageSize && (\n <div className=\"flex items-center gap-2\">\n <label className=\"text-sm text-text-secondary\">\n {tr(\"fluidgrids.executions.pagination.pageSizeLabel\", \"Show\")}\n </label>\n <select\n value={pageSize}\n onChange={(e) => setPageSize(Number(e.target.value))}\n className=\"px-2 py-1 bg-bg-surface border border-border-default rounded text-sm text-text-primary scheme-normal dark:scheme-dark\"\n >\n {pageSizeOptions.map((size) => (\n <option\n key={size}\n value={size}\n className=\"bg-bg-surface text-text-primary\"\n >\n {size}\n </option>\n ))}\n </select>\n </div>\n )}\n\n {/* Page navigation */}\n {totalPages > 1 && (\n <nav className=\"flex items-center gap-1\">\n {/* Previous button */}\n <button\n onClick={() => goToPage(page - 1)}\n disabled={page === 1}\n className=\"p-2 rounded hover:bg-background-tertiary disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n <Icon\n icon=\"mdi:chevron-left\"\n width={20}\n className=\"text-text-secondary\"\n />\n </button>\n\n {/* Page numbers */}\n <div className=\"hidden sm:flex items-center gap-1\">\n {getPageNumbers().map((pageNum, index) =>\n pageNum === \"ellipsis\" ? (\n <span\n key={`ellipsis-${index}`}\n className=\"px-2 text-text-secondary\"\n >\n ...\n </span>\n ) : (\n <button\n key={pageNum}\n onClick={() => goToPage(pageNum)}\n className={`\n min-w-[32px] h-8 px-2 rounded text-sm font-medium\n ${\n pageNum === page\n ? \"bg-action-primary-bg text-white\"\n : \"hover:bg-background-tertiary text-text-secondary\"\n }\n `}\n >\n {pageNum}\n </button>\n ),\n )}\n </div>\n\n {/* Mobile page indicator */}\n <span className=\"sm:hidden px-3 text-sm text-text-secondary\">\n {page} / {totalPages}\n </span>\n\n {/* Next button */}\n <button\n onClick={() => goToPage(page + 1)}\n disabled={page === totalPages}\n className=\"p-2 rounded hover:bg-background-tertiary disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n <Icon\n icon=\"mdi:chevron-right\"\n width={20}\n className=\"text-text-secondary\"\n />\n </button>\n </nav>\n )}\n </div>\n </div>\n );\n}\n","/**\n * Stub document nodes for subscription operations not yet in the supergraph schema.\n * These will be replaced by codegen-generated documents once the subscription\n * fields are added to the gateway schema.\n *\n * See: src/operations/workflows/subscriptions/ and src/operations/executions/subscriptions/\n */\nimport { gql } from \"@apollo/client\";\n\n// Workflow subscription stubs\nexport const NodeStateUpdatedDocument = gql`\n subscription NodeStateUpdated($runId: String!) {\n _empty\n }\n`;\n\nexport const WorkflowCompletedDocument = gql`\n subscription WorkflowCompleted($runId: String!) {\n _empty\n }\n`;\n\nexport const WorkflowErrorDocument = gql`\n subscription WorkflowError($runId: String!) {\n _empty\n }\n`;\n\n// Execution subscription stubs\nexport const ExecutionUpdatedDocument = gql`\n subscription ExecutionUpdated($runId: String!) {\n _empty\n }\n`;\n\nexport const ExecutionNodeStateUpdatedDocument = gql`\n subscription ExecutionNodeStateUpdated($runId: String!) {\n _empty\n }\n`;\n\nexport const ExecutionCompletedDocument = gql`\n subscription ExecutionCompleted($runId: String!) {\n _empty\n }\n`;\n\nexport const ExecutionErrorDocument = gql`\n subscription ExecutionError($runId: String!) {\n _empty\n }\n`;\n","/**\n * Retry semantics for the Runs screens (BOFF-7269).\n *\n * \"Retry\" on a failed run re-runs *that* run: the same pinned workflow version,\n * from the same trigger node, with the same trigger payload. It does not resume\n * or mutate the failed run — a new run is created, so the failed one stays in\n * the list as history.\n *\n * The logic lives here rather than inline in the page so the context rules\n * below are testable and shared by every surface offering a retry.\n */\n\nimport type { WorkflowRun } from \"../types\";\n\n/** The parts of a run a retry needs. */\nexport type RetryableRun = Pick<\n WorkflowRun,\n \"id\" | \"workflowKey\" | \"version\" | \"triggerNodeId\" | \"triggerData\" | \"context\"\n>;\n\n/** Shape of `TriggerWorkflowInput`, without importing the generated bundle. */\nexport interface RetryTriggerInput {\n workflowKey: string;\n version: string;\n triggerNodeId: string;\n triggerData?: unknown;\n context?: Record<string, unknown>;\n}\n\n/**\n * Context keys that describe how the ORIGINAL run was started and must never be\n * replayed:\n *\n * - `isScheduled` makes the backend resolve the ACTIVE version instead of the\n * requested one, so replaying it would silently retry a different version\n * than the one that failed.\n * - `workspaceId` is re-derived from the caller's workspace on every trigger.\n */\nconst NON_REPLAYABLE_CONTEXT_KEYS = [\"isScheduled\", \"workspaceId\"] as const;\n\n/**\n * Build the trigger input that re-runs `run`.\n *\n * Returns `null` when the run cannot be retried, which is the case for older\n * rows that carry no trigger node: without it the backend has no entry point\n * and would reject the mutation.\n */\nexport function buildRetryTriggerInput(\n run: RetryableRun,\n): RetryTriggerInput | null {\n if (!run.workflowKey || !run.version || !run.triggerNodeId) return null;\n\n const context: Record<string, unknown> = {};\n const original = run.context;\n if (original && typeof original === \"object\" && !Array.isArray(original)) {\n for (const [key, value] of Object.entries(\n original as Record<string, unknown>,\n )) {\n if ((NON_REPLAYABLE_CONTEXT_KEYS as readonly string[]).includes(key)) {\n continue;\n }\n context[key] = value;\n }\n }\n // Lineage, so the new run can be traced back to the one the user retried.\n context.retryOfRunId = run.id;\n\n return {\n workflowKey: run.workflowKey,\n version: run.version,\n triggerNodeId: run.triggerNodeId,\n triggerData: run.triggerData ?? undefined,\n context,\n };\n}\n","import { useState, useEffect, useCallback, useMemo, useRef } from \"react\";\nimport { getFluidGridsClient } from \"../../../graphql/client\";\nimport {\n EXECUTIONS_LIST,\n EXECUTION_DETAIL,\n NODE_STATES,\n EXECUTION_LOGS,\n ACTIVE_EXECUTIONS,\n EXECUTION_STATS,\n PAUSE_EXECUTION,\n RESUME_EXECUTION,\n CANCEL_EXECUTION,\n RETRY_NODE,\n TERMINATE_EXECUTION,\n} from \"../graphql/operations\";\nimport type {\n WorkflowRun,\n NodeState,\n ExecutionLog,\n ListExecutionsInput,\n ExecutionsListResponse,\n RunStatus,\n} from \"../types\";\nimport type {\n PauseExecutionMutation,\n ResumeExecutionMutation,\n CancelExecutionMutation,\n RetryNodeMutation,\n TerminateExecutionMutation,\n TriggerWorkflowMutation,\n} from \"../../../generated/operations\";\nimport { TriggerWorkflowDocument as TRIGGER_WORKFLOW } from \"../../../generated/operations\";\nimport { buildRetryTriggerInput, type RetryableRun } from \"../utils/retry\";\nimport { useExecutionsStore } from \"../store/executionsStore\";\nimport {\n REPLAY_WORKFLOW_RUN,\n RETRY_WORKFLOW_RUNS,\n} from \"../../observability/operations\";\nimport type { TriggerResponse } from \"../../observability/types\";\n\nimport { throwIfResultError } from \"../../../graphql/errors\";\n\n// ============================================================================\n// Type Definitions for GraphQL Responses\n// ============================================================================\n\ninterface ExecutionsListData {\n workflowRuns: ExecutionsListResponse;\n}\n\ninterface ExecutionDetailData {\n workflowRun: WorkflowRun | null;\n}\n\ninterface NodeStatesData {\n nodeStates: NodeState[];\n}\n\ninterface ExecutionLogsData {\n workflowExecutionLogs: ExecutionLog[];\n}\n\ninterface ActiveExecutionsData {\n activeWorkflows: Array<{\n runId: string;\n workflowKey: string;\n version: string;\n status: RunStatus;\n startedAt: string;\n duration: number;\n progress: number;\n currentNode?: string;\n }>;\n}\n\ninterface ExecutionStatsData {\n dashboardSummary: {\n runsCountTotal: number;\n runsCompletedCount: number;\n runsFailedCount: number;\n runsRunningCount: number;\n runsPendingCount: number;\n runsCancelledCount: number;\n runsWaitingCount: number;\n runsCompletedLast24h: number;\n runsFailedLast24h: number;\n runsCompletedLast7d: number;\n runsFailedLast7d: number;\n avgWorkflowExecutionTimeSeconds: number;\n workflowSuccessRate: number;\n nodeUsageStats: Array<{\n nodeType: string;\n totalExecutions: number;\n successCount: number;\n failureCount: number;\n avgExecutionTime: number;\n }>;\n recentRuns: WorkflowRun[];\n };\n}\n\n// ============================================================================\n// Hook: useExecutions - List executions with filters\n// ============================================================================\n\nexport function useExecutions(input: ListExecutionsInput = {}) {\n const [executions, setExecutions] = useState<WorkflowRun[]>([]);\n const [total, setTotal] = useState(0);\n const [hasMore, setHasMore] = useState(false);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const inputKey = JSON.stringify(input);\n\n // Monotonic request id: when the input changes rapidly (e.g. a URL workflow\n // filter is applied right after mount), an earlier, less-filtered request can\n // resolve after the latest one. Only the latest request may write state, so\n // stale responses can't clobber the filtered results.\n const reqIdRef = useRef(0);\n\n const fetchData = useCallback(async () => {\n const reqId = ++reqIdRef.current;\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.query<ExecutionsListData>({\n query: EXECUTIONS_LIST,\n variables: { input: JSON.parse(inputKey) },\n fetchPolicy: \"network-only\",\n });\n if (reqId !== reqIdRef.current) return; // superseded by a newer request\n setExecutions(result.data?.workflowRuns?.items ?? []);\n setTotal(result.data?.workflowRuns?.total ?? 0);\n setHasMore(result.data?.workflowRuns?.hasMore ?? false);\n } catch (err) {\n if (reqId !== reqIdRef.current) return;\n setError(err as Error);\n } finally {\n if (reqId === reqIdRef.current) setLoading(false);\n }\n }, [inputKey]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n executions,\n total,\n hasMore,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n// ============================================================================\n// Hook: useExecution - Single execution details\n// ============================================================================\n\nexport function useExecution(id: string | undefined) {\n const [execution, setExecution] = useState<WorkflowRun | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n if (!id) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.query<ExecutionDetailData>({\n query: EXECUTION_DETAIL,\n variables: { id },\n fetchPolicy: \"network-only\",\n });\n setExecution(result.data?.workflowRun ?? null);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [id]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n execution,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n// ============================================================================\n// Hook: useLazyExecution - Fetch execution on demand\n// ============================================================================\n\nexport function useLazyExecution() {\n const [execution, setExecution] = useState<WorkflowRun | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const getExecution = useCallback(async (id: string) => {\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.query<ExecutionDetailData>({\n query: EXECUTION_DETAIL,\n variables: { id },\n fetchPolicy: \"network-only\",\n });\n const data = result.data?.workflowRun ?? null;\n setExecution(data);\n return data;\n } catch (err) {\n setError(err as Error);\n return null;\n } finally {\n setLoading(false);\n }\n }, []);\n\n return {\n getExecution,\n execution,\n loading,\n error,\n };\n}\n\n// ============================================================================\n// Hook: useNodeStates - Node states for a run\n// ============================================================================\n\nexport function useNodeStates(runId: string | undefined) {\n const [nodeStates, setNodeStates] = useState<NodeState[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n if (!runId) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.query<NodeStatesData>({\n query: NODE_STATES,\n variables: { runId },\n fetchPolicy: \"network-only\",\n });\n setNodeStates(result.data?.nodeStates ?? []);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [runId]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n nodeStates,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n// ============================================================================\n// Hook: useExecutionLogs - Execution logs\n// ============================================================================\n\nexport function useExecutionLogs(\n runId: string | undefined,\n limit: number = 100,\n) {\n const [logs, setLogs] = useState<ExecutionLog[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n if (!runId) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.query<ExecutionLogsData>({\n query: EXECUTION_LOGS,\n variables: { runId, limit },\n fetchPolicy: \"network-only\",\n });\n setLogs(result.data?.workflowExecutionLogs ?? []);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [runId, limit]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n logs,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n// ============================================================================\n// Hook: useActiveExecutions - Running workflows\n// ============================================================================\n\nexport function useActiveExecutions(\n options: { limit?: number; userId?: string } = {},\n) {\n const [executions, setExecutions] = useState<\n ActiveExecutionsData[\"activeWorkflows\"]\n >([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const optionsKey = JSON.stringify(options);\n\n const fetchData = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.query<ActiveExecutionsData>({\n query: ACTIVE_EXECUTIONS,\n variables: JSON.parse(optionsKey),\n fetchPolicy: \"network-only\",\n });\n setExecutions(result.data?.activeWorkflows ?? []);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [optionsKey]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n executions,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n// ============================================================================\n// Hook: useExecutionStats - Dashboard statistics\n// ============================================================================\n\nexport function useExecutionStats(\n options: {\n workspaceId?: string;\n tenantId?: string;\n projectId?: string;\n } = {},\n) {\n const [stats, setStats] = useState<\n ExecutionStatsData[\"dashboardSummary\"] | null\n >(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const optionsKey = JSON.stringify(options);\n\n const fetchData = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.query<ExecutionStatsData>({\n query: EXECUTION_STATS,\n variables: JSON.parse(optionsKey),\n fetchPolicy: \"network-only\",\n });\n setStats(result.data?.dashboardSummary ?? null);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [optionsKey]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n stats,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n// ============================================================================\n// Hook: useExecutionActions - Mutations for execution control\n// ============================================================================\n\n/** Outcome of {@link useExecutionActions}'s `retryExecution`. */\nexport type RetryExecutionResult =\n | { ok: true; run: NonNullable<TriggerWorkflowMutation[\"triggerWorkflow\"]> }\n | { ok: false; message: string };\n\nexport function useExecutionActions() {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const pauseExecution = useCallback(async (id: string) => {\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = throwIfResultError(\n await client.mutate<PauseExecutionMutation>({\n mutation: PAUSE_EXECUTION,\n variables: { id },\n }),\n );\n return result.data?.pauseWorkflowRun ?? null;\n } catch (err) {\n setError(err as Error);\n return null;\n } finally {\n setLoading(false);\n }\n }, []);\n\n const resumeExecution = useCallback(async (id: string) => {\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = throwIfResultError(\n await client.mutate<ResumeExecutionMutation>({\n mutation: RESUME_EXECUTION,\n variables: { id },\n }),\n );\n return result.data?.resumeWorkflowRun ?? null;\n } catch (err) {\n setError(err as Error);\n return null;\n } finally {\n setLoading(false);\n }\n }, []);\n\n const cancelExecution = useCallback(async (id: string) => {\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = throwIfResultError(\n await client.mutate<CancelExecutionMutation>({\n mutation: CANCEL_EXECUTION,\n variables: { id },\n }),\n );\n return result.data?.cancelWorkflowRun ?? null;\n } catch (err) {\n setError(err as Error);\n return null;\n } finally {\n setLoading(false);\n }\n }, []);\n\n const retryNode = useCallback(async (runId: string, nodeId: string) => {\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = throwIfResultError(\n await client.mutate<RetryNodeMutation>({\n mutation: RETRY_NODE,\n variables: { id: runId, nodeId },\n }),\n );\n return result.data?.retryNode ?? null;\n } catch (err) {\n setError(err as Error);\n return null;\n } finally {\n setLoading(false);\n }\n }, []);\n\n /**\n * Retry a failed run by starting a NEW run of the same pinned version, from\n * the same trigger node and with the same trigger payload (BOFF-7269).\n *\n * `retryNode` above is a different action: it re-executes ONE node inside an\n * existing run. Retrying from the Runs list has always meant \"run this\n * again\", which needs a new run — the failed one stays in the list as\n * history.\n *\n * Unlike its siblings this returns a tagged result rather than `null`: the\n * caller shows a toast and needs the reason (an exhausted run quota is a\n * common one), which the `error` state cannot provide before the next render.\n */\n const retryExecution = useCallback(\n async (execution: RetryableRun): Promise<RetryExecutionResult> => {\n const input = buildRetryTriggerInput(execution);\n if (!input) {\n const message = \"This run has no trigger node, so it cannot be re-run.\";\n setError(new Error(message));\n return { ok: false, message };\n }\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = throwIfResultError(\n await client.mutate<TriggerWorkflowMutation>({\n mutation: TRIGGER_WORKFLOW,\n variables: { input },\n }),\n );\n const run = result.data?.triggerWorkflow;\n if (!run) {\n const message = \"The workflow did not start.\";\n setError(new Error(message));\n return { ok: false, message };\n }\n return { ok: true, run };\n } catch (err) {\n const error = err as Error;\n setError(error);\n return { ok: false, message: error.message };\n } finally {\n setLoading(false);\n }\n },\n [],\n );\n\n const replayExecution = useCallback(async (runId: string) => {\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = throwIfResultError(\n await client.mutate<{ replayWorkflowRun?: TriggerResponse }>({\n mutation: REPLAY_WORKFLOW_RUN,\n variables: { runId },\n }),\n );\n return result.data?.replayWorkflowRun ?? null;\n } catch (err) {\n setError(err as Error);\n return null;\n } finally {\n setLoading(false);\n }\n }, []);\n\n const retryExecutions = useCallback(async (runIds: string[]) => {\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = throwIfResultError(\n await client.mutate<{ retryWorkflowRuns?: TriggerResponse[] }>({\n mutation: RETRY_WORKFLOW_RUNS,\n variables: { runIds },\n }),\n );\n return result.data?.retryWorkflowRuns ?? [];\n } catch (err) {\n setError(err as Error);\n return [];\n } finally {\n setLoading(false);\n }\n }, []);\n\n const terminateExecution = useCallback(\n async (runId: string, reason?: string) => {\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = throwIfResultError(\n await client.mutate<TerminateExecutionMutation>({\n mutation: TERMINATE_EXECUTION,\n variables: { runId, reason },\n }),\n );\n return result.data?.terminateWorkflow ?? null;\n } catch (err) {\n setError(err as Error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [],\n );\n\n return {\n pauseExecution,\n resumeExecution,\n cancelExecution,\n retryNode,\n retryExecution,\n replayExecution,\n retryExecutions,\n terminateExecution,\n loading,\n error,\n };\n}\n\n// ============================================================================\n// Hook: useExecutionsWithStore - Combined hook with store integration\n// ============================================================================\n\n/** How long typing settles before the Runs search hits the server. */\nexport const EXECUTIONS_SEARCH_DEBOUNCE_MS = 350;\n\nexport function useExecutionsWithStore() {\n const { filter, pagination, setTotal } = useExecutionsStore();\n\n // The search box writes to the store on every keystroke. Debounce before it\n // reaches the query so a typed word is one request, not one per character\n // (BOFF-7268).\n const [debouncedSearch, setDebouncedSearch] = useState(filter.search);\n useEffect(() => {\n const timer = setTimeout(\n () => setDebouncedSearch(filter.search),\n EXECUTIONS_SEARCH_DEBOUNCE_MS,\n );\n return () => clearTimeout(timer);\n }, [filter.search]);\n\n const input = useMemo<ListExecutionsInput>(() => {\n const baseInput: ListExecutionsInput = {\n limit: pagination.pageSize,\n offset: (pagination.page - 1) * pagination.pageSize,\n };\n\n if (filter.status !== \"all\") {\n baseInput.status = filter.status;\n }\n\n if (filter.workflowKey) {\n baseInput.workflowKey = filter.workflowKey;\n }\n\n if (filter.dateRange.start) {\n baseInput.startDate = filter.dateRange.start.toISOString();\n }\n\n if (filter.dateRange.end) {\n baseInput.endDate = filter.dateRange.end.toISOString();\n }\n\n // Send only a real term; the box clears itself by writing \"\", which must\n // mean \"no filter\" rather than \"match the empty string\".\n const term = debouncedSearch.trim();\n if (term) {\n baseInput.search = term;\n }\n\n if (filter.triggerType !== \"all\") {\n baseInput.triggerType = filter.triggerType;\n }\n if (filter.durationMinSeconds !== null) {\n baseInput.durationMinSeconds = filter.durationMinSeconds;\n }\n if (filter.durationMaxSeconds !== null) {\n baseInput.durationMaxSeconds = filter.durationMaxSeconds;\n }\n if (filter.errorType !== \"all\") {\n baseInput.errorType = filter.errorType;\n }\n if (filter.nodeId.trim()) {\n baseInput.nodeId = filter.nodeId.trim();\n }\n\n return baseInput;\n }, [filter, debouncedSearch, pagination.page, pagination.pageSize]);\n\n const result = useExecutions(input);\n\n useEffect(() => {\n if (result.total !== pagination.total) {\n setTotal(result.total);\n }\n }, [result.total, pagination.total, setTotal]);\n\n return result;\n}\n\n// ============================================================================\n// Hook: useAutoRefresh - Auto-refresh executions\n// ============================================================================\n\nexport function useAutoRefresh(\n refetchFn: () => void,\n enabled: boolean = true,\n interval: number = 5000,\n) {\n useEffect(() => {\n if (!enabled) return;\n\n const timer = setInterval(() => {\n refetchFn();\n }, interval);\n\n return () => clearInterval(timer);\n }, [enabled, interval, refetchFn]);\n}\n"]}