@burdenoff/fluidgrids-fe-sdk 2026.510.105

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 (68) hide show
  1. package/README.md +149 -0
  2. package/dist/ExecutionDetailPage-3EVS3WEC.js +6 -0
  3. package/dist/ExecutionDetailPage-3EVS3WEC.js.map +1 -0
  4. package/dist/ExecutionsListPage-NH2JLL2D.js +8 -0
  5. package/dist/ExecutionsListPage-NH2JLL2D.js.map +1 -0
  6. package/dist/TemplateConfigurationModal-UJAGRE7X.js +258 -0
  7. package/dist/TemplateConfigurationModal-UJAGRE7X.js.map +1 -0
  8. package/dist/TemplateDetailPanel-UXH6KPCH.js +172 -0
  9. package/dist/TemplateDetailPanel-UXH6KPCH.js.map +1 -0
  10. package/dist/WorkflowBuilder-BMKFLHVE.js +15 -0
  11. package/dist/WorkflowBuilder-BMKFLHVE.js.map +1 -0
  12. package/dist/WorkflowsList-CLI32VRE.js +8 -0
  13. package/dist/WorkflowsList-CLI32VRE.js.map +1 -0
  14. package/dist/chunk-4FFPGQD3.js +584 -0
  15. package/dist/chunk-4FFPGQD3.js.map +1 -0
  16. package/dist/chunk-5BDQNSP3.js +107 -0
  17. package/dist/chunk-5BDQNSP3.js.map +1 -0
  18. package/dist/chunk-6PHBYAEG.js +11494 -0
  19. package/dist/chunk-6PHBYAEG.js.map +1 -0
  20. package/dist/chunk-BQXHJIER.js +45 -0
  21. package/dist/chunk-BQXHJIER.js.map +1 -0
  22. package/dist/chunk-BXDSTMUA.js +8848 -0
  23. package/dist/chunk-BXDSTMUA.js.map +1 -0
  24. package/dist/chunk-CGKBAJMM.js +292 -0
  25. package/dist/chunk-CGKBAJMM.js.map +1 -0
  26. package/dist/chunk-FGYVIXQ7.js +979 -0
  27. package/dist/chunk-FGYVIXQ7.js.map +1 -0
  28. package/dist/chunk-G7B4SYFM.js +22 -0
  29. package/dist/chunk-G7B4SYFM.js.map +1 -0
  30. package/dist/chunk-GSJOLO3A.js +251 -0
  31. package/dist/chunk-GSJOLO3A.js.map +1 -0
  32. package/dist/chunk-GSS5PHRL.js +386 -0
  33. package/dist/chunk-GSS5PHRL.js.map +1 -0
  34. package/dist/chunk-GY66IQWN.js +524 -0
  35. package/dist/chunk-GY66IQWN.js.map +1 -0
  36. package/dist/chunk-LUGJJ7LL.js +297 -0
  37. package/dist/chunk-LUGJJ7LL.js.map +1 -0
  38. package/dist/chunk-NDJSUC4W.js +155 -0
  39. package/dist/chunk-NDJSUC4W.js.map +1 -0
  40. package/dist/chunk-UOCR65PI.js +262 -0
  41. package/dist/chunk-UOCR65PI.js.map +1 -0
  42. package/dist/chunk-WD52O45G.js +2015 -0
  43. package/dist/chunk-WD52O45G.js.map +1 -0
  44. package/dist/chunk-WWU2O2SR.js +52 -0
  45. package/dist/chunk-WWU2O2SR.js.map +1 -0
  46. package/dist/chunk-XQP33UJR.js +57 -0
  47. package/dist/chunk-XQP33UJR.js.map +1 -0
  48. package/dist/chunk-Z54K22LP.js +82 -0
  49. package/dist/chunk-Z54K22LP.js.map +1 -0
  50. package/dist/client-AMUUS7VE.js +3 -0
  51. package/dist/client-AMUUS7VE.js.map +1 -0
  52. package/dist/config-E4E7M6IN.js +3 -0
  53. package/dist/config-E4E7M6IN.js.map +1 -0
  54. package/dist/global-client-OW43ZRDR.js +3 -0
  55. package/dist/global-client-OW43ZRDR.js.map +1 -0
  56. package/dist/global-operations-WPTEYCJM.js +3 -0
  57. package/dist/global-operations-WPTEYCJM.js.map +1 -0
  58. package/dist/index.d.ts +56706 -0
  59. package/dist/index.js +6564 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/styles.css +139 -0
  62. package/dist/template-input-applicator-657KE4DM.js +3 -0
  63. package/dist/template-input-applicator-657KE4DM.js.map +1 -0
  64. package/dist/useImportWorkflowTemplate-2HS5D2OP.js +11 -0
  65. package/dist/useImportWorkflowTemplate-2HS5D2OP.js.map +1 -0
  66. package/dist/useTemplateDetail-NK63V3PC.js +6 -0
  67. package/dist/useTemplateDetail-NK63V3PC.js.map +1 -0
  68. package/package.json +148 -0
@@ -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/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/Pagination.tsx","../src/stubs/subscription-stubs.ts","../src/modules/executions/hooks/useExecutions.ts"],"names":["jsxs","jsx","Icon","formatDuration","formatDate","Button","useState","formatTime","useCallback","useMemo"],"mappings":"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","file":"chunk-WD52O45G.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 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// ============================================================================\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 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 };\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}\n\nexport interface DateRange {\n start: Date | null;\n end: Date | null;\n preset:\n | \"today\"\n | \"yesterday\"\n | \"7days\"\n | \"30days\"\n | \"90days\"\n | \"custom\"\n | \"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\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 =\n | \"cancel\"\n | \"pause\"\n | \"resume\"\n | \"retry\"\n | \"view\"\n | \"delete\";\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 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};\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 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 } from \"../types\";\n\nconst STATUS_OPTIONS: Array<{ value: RunStatus | \"all\"; label: string }> = [\n { value: \"all\", label: \"All Statuses\" },\n { value: \"RUNNING\", label: \"Running\" },\n { value: \"COMPLETED\", label: \"Completed\" },\n { value: \"FAILED\", label: \"Failed\" },\n { value: \"PENDING\", label: \"Pending\" },\n { value: \"CANCELLED\", label: \"Cancelled\" },\n { value: \"WAITING\", label: \"Waiting\" },\n { value: \"TERMINATED\", label: \"Terminated\" },\n];\n\nconst DATE_PRESETS: Array<{ value: DateRange[\"preset\"]; label: string }> = [\n { value: \"all\", label: \"All Time\" },\n { value: \"today\", label: \"Today\" },\n { value: \"yesterday\", label: \"Yesterday\" },\n { value: \"7days\", label: \"Last 7 Days\" },\n { value: \"30days\", label: \"Last 30 Days\" },\n { value: \"90days\", label: \"Last 90 Days\" },\n { value: \"custom\", label: \"Custom Range\" },\n];\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 {\n filter,\n setStatusFilter,\n setWorkflowFilter,\n setDateRange,\n setSearchQuery,\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(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=\"Search by workflow name or run ID...\"\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-background-secondary border border-border-secondary rounded-lg text-text-primary focus:outline-none focus:ring-2 focus:ring-action-primary-bg\"\n >\n {STATUS_OPTIONS.map((option) => (\n <option key={option.value} value={option.value}>\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-background-secondary border border-border-secondary rounded-lg text-text-primary focus:outline-none focus:ring-2 focus:ring-action-primary-bg max-w-[200px]\"\n >\n <option value=\"\">All Workflows</option>\n {workflows.map((wf) => (\n <option key={wf.workflowKey} value={wf.workflowKey}>\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-background-secondary border border-border-secondary rounded-lg text-text-primary focus:outline-none focus:ring-2 focus:ring-action-primary-bg\"\n >\n {DATE_PRESETS.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\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\">From:</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\">To:</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\">Auto-refresh</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 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 Clear Filters\n </Button>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { Icon } from \"@iconify/react\";\nimport type { RunStatus } from \"../types\";\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 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=\"Total Runs\"\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=\"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=\"Completed\"\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=\"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=\"Success Rate\"\n value={`${(stats.successRate ?? 0).toFixed(1)}%`}\n icon=\"mdi:percent\"\n color=\"text-accent\"\n />\n <StatCard\n label=\"Avg Duration\"\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 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} 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","import { useMemo } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport { Icon } from \"@iconify/react\";\nimport { Button } from \"@burdenoff/fe-libs/button\";\nimport { ExecutionStatusBadge } from \"./ExecutionStatusBadge\";\nimport { useExecutionsStore } from \"../store/executionsStore\";\nimport type { WorkflowRun } from \"../types\";\n\ninterface ExecutionTableProps {\n executions: WorkflowRun[];\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 loading,\n onRowClick,\n onAction,\n}: ExecutionTableProps) {\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) return \"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({ icon: \"mdi:pause\", label: \"Pause\", action: \"pause\" });\n actions.push({ icon: \"mdi:stop\", label: \"Cancel\", action: \"cancel\" });\n break;\n case \"WAITING\":\n actions.push({ icon: \"mdi:play\", label: \"Resume\", action: \"resume\" });\n actions.push({ icon: \"mdi:stop\", label: \"Cancel\", action: \"cancel\" });\n break;\n case \"FAILED\":\n actions.push({ icon: \"mdi:refresh\", label: \"Retry\", action: \"retry\" });\n break;\n case \"PENDING\":\n actions.push({ icon: \"mdi:stop\", label: \"Cancel\", action: \"cancel\" });\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 Status\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase\">\n Workflow\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase\">\n Run ID\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase\">\n Started\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase\">\n Duration\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase\">\n Progress\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 No executions found\n </h3>\n <p className=\"text-text-secondary mb-4\">\n There are no workflow executions matching your filters.\n </p>\n <Button variant=\"outline\" onClick={() => navigate(\"../list\")}>\n View Workflows\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 Status\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Workflow\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Run ID\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Started\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Duration\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Progress\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 || execution.workflowKey}\n </span>\n <span className=\"text-xs text-text-secondary\">\n v{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=\"View Details\"\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 Trigger Node\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 Node Stats\n </div>\n <div className=\"flex gap-2 text-sm\">\n <span className=\"text-[var(--color-status-success-text)]\">\n {execution.completedNodes ?? 0} completed\n </span>\n {(execution.failedNodes ?? 0) > 0 && (\n <span className=\"text-[var(--color-status-error-text)]\">\n {execution.failedNodes} failed\n </span>\n )}\n {(execution.skippedNodes ?? 0) > 0 && (\n <span className=\"text-tertiary\">\n {execution.skippedNodes} skipped\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 Error\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 Full Run ID\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 Swipe to see more columns\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 { RUN_STATUS_CONFIG } from \"../types\";\nimport { ExecutionStatusBadge } from \"./ExecutionStatusBadge\";\n\ninterface ExecutionCardsProps {\n executions: WorkflowRun[];\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 loading,\n onCardClick,\n onAction,\n}: ExecutionCardsProps) {\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\">No executions found</p>\n <p className=\"text-sm mt-1\">Run a workflow to see results here</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.workflowKey}\n </p>\n <p className=\"text-xs text-text-tertiary mt-0.5\">\n v{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>Progress</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} /> Pause\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} /> Cancel\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 { RUN_STATUS_CONFIG } from \"../types\";\nimport { ExecutionStatusBadge } from \"./ExecutionStatusBadge\";\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 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\">No executions found</p>\n <p className=\"text-sm mt-1\">Run a workflow to see the timeline</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} runs\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} nodes\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=\"Cancel execution\"\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\";\n\ninterface NodeTimelineProps {\n nodeStates: NodeState[];\n loading?: boolean;\n onRetryNode?: (nodeId: string) => void;\n onViewChildRun?: (childRunId: string) => void;\n}\n\nexport function NodeTimeline({\n nodeStates,\n loading,\n onRetryNode,\n onViewChildRun,\n}: NodeTimelineProps) {\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) return \"No data\";\n try {\n return JSON.stringify(data, null, 2);\n } catch {\n return \"Unable to display data\";\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[] = [...nodeStates].sort((a, b) => {\n if (!a.startTime && !b.startTime) return 0;\n if (!a.startTime) return 1;\n if (!b.startTime) return -1;\n return new Date(a.startTime).getTime() - new Date(b.startTime).getTime();\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>No node executions yet</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 className=\"font-medium text-text-primary truncate\">\n {node.nodeId}\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 Sub-workflow\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 Waiting...\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 Attempt {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 Output\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 Input\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\">Error</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 View Sub-Workflow Run\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 Retry Node\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 Metadata\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","import { Icon } from \"@iconify/react\";\nimport { useExecutionsStore } from \"../store/executionsStore\";\n\ninterface PaginationProps {\n totalItems?: number;\n showPageSize?: boolean;\n}\n\nexport function Pagination({\n totalItems,\n showPageSize = true,\n}: PaginationProps) {\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 Showing{\" \"}\n <span className=\"font-medium text-text-primary\">{startItem}</span> to{\" \"}\n <span className=\"font-medium text-text-primary\">{endItem}</span> of{\" \"}\n <span className=\"font-medium text-text-primary\">\n {totalItems ?? total}\n </span>{\" \"}\n 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\">Show</label>\n <select\n value={pageSize}\n onChange={(e) => setPageSize(Number(e.target.value))}\n className=\"px-2 py-1 bg-background-secondary border border-border-secondary rounded text-sm text-text-primary\"\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\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","import { useState, useEffect, useCallback, useMemo } 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} from \"../../../generated/operations\";\nimport { useExecutionsStore } from \"../store/executionsStore\";\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 const fetchData = useCallback(async () => {\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 setExecutions(result.data?.workflowRuns?.items ?? []);\n setTotal(result.data?.workflowRuns?.total ?? 0);\n setHasMore(result.data?.workflowRuns?.hasMore ?? false);\n } catch (err) {\n setError(err as Error);\n } finally {\n 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\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 = await client.mutate<PauseExecutionMutation>({\n mutation: PAUSE_EXECUTION,\n variables: { id },\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 = await client.mutate<ResumeExecutionMutation>({\n mutation: RESUME_EXECUTION,\n variables: { id },\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 = await client.mutate<CancelExecutionMutation>({\n mutation: CANCEL_EXECUTION,\n variables: { id },\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 = await client.mutate<RetryNodeMutation>({\n mutation: RETRY_NODE,\n variables: { id: runId, nodeId },\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 const terminateExecution = useCallback(\n async (runId: string, reason?: string) => {\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.mutate<TerminateExecutionMutation>({\n mutation: TERMINATE_EXECUTION,\n variables: { runId, reason },\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 terminateExecution,\n loading,\n error,\n };\n}\n\n// ============================================================================\n// Hook: useExecutionsWithStore - Combined hook with store integration\n// ============================================================================\n\nexport function useExecutionsWithStore() {\n const { filter, pagination, setTotal } = useExecutionsStore();\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 return baseInput;\n }, [filter, 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"]}
@@ -0,0 +1,52 @@
1
+ // src/config/index.ts
2
+ var runtimeConfig = {
3
+ apiGatewayUrl: "",
4
+ workspaceId: ""
5
+ };
6
+ var config = new Proxy({}, {
7
+ get(_, prop) {
8
+ return runtimeConfig[prop];
9
+ }
10
+ });
11
+ function getFluidGridsConfig() {
12
+ return { ...runtimeConfig };
13
+ }
14
+ function setFluidGridsConfig(newConfig) {
15
+ runtimeConfig = { ...runtimeConfig, ...newConfig };
16
+ }
17
+ function resetFluidGridsConfig() {
18
+ runtimeConfig = {
19
+ apiGatewayUrl: "",
20
+ workspaceId: ""
21
+ };
22
+ }
23
+ function normalizeOrigin(origin) {
24
+ return origin.replace(/\/$/, "");
25
+ }
26
+ function validateTrustedOrigin(trustedOrigins) {
27
+ if (typeof window === "undefined" || !trustedOrigins?.length) {
28
+ return;
29
+ }
30
+ const currentOrigin = normalizeOrigin(window.location.origin);
31
+ const allowedOrigins = trustedOrigins.map(normalizeOrigin);
32
+ if (!allowedOrigins.includes(currentOrigin)) {
33
+ throw new Error(
34
+ `FluidGrids SDK blocked untrusted origin: ${currentOrigin}`
35
+ );
36
+ }
37
+ }
38
+ function getGraphQLEndpoint(baseUrl) {
39
+ const url = baseUrl || runtimeConfig.apiGatewayUrl;
40
+ if (!url) {
41
+ throw new Error("FluidGrids SDK requires apiGatewayUrl to be configured");
42
+ }
43
+ const normalizedBase = url.endsWith("/") ? url.slice(0, -1) : url;
44
+ if (normalizedBase.endsWith("/graphql")) {
45
+ return normalizedBase;
46
+ }
47
+ return `${normalizedBase}/workspaces/graphql`;
48
+ }
49
+
50
+ export { config, getFluidGridsConfig, getGraphQLEndpoint, resetFluidGridsConfig, setFluidGridsConfig, validateTrustedOrigin };
51
+ //# sourceMappingURL=chunk-WWU2O2SR.js.map
52
+ //# sourceMappingURL=chunk-WWU2O2SR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/index.ts"],"names":[],"mappings":";AAkDA,IAAI,aAAA,GAAkC;AAAA,EACpC,aAAA,EAAe,EAAA;AAAA,EACf,WAAA,EAAa;AACf,CAAA;AAKO,IAAM,MAAA,GAAS,IAAI,KAAA,CAAM,EAAC,EAAuB;AAAA,EACtD,GAAA,CAAI,GAAG,IAAA,EAA8B;AACnC,IAAA,OAAO,cAAc,IAAI,CAAA;AAAA,EAC3B;AACF,CAAC;AAKM,SAAS,mBAAA,GAAwC;AACtD,EAAA,OAAO,EAAE,GAAG,aAAA,EAAc;AAC5B;AAKO,SAAS,oBACd,SAAA,EACM;AACN,EAAA,aAAA,GAAgB,EAAE,GAAG,aAAA,EAAe,GAAG,SAAA,EAAU;AACnD;AAKO,SAAS,qBAAA,GAA8B;AAC5C,EAAA,aAAA,GAAgB;AAAA,IACd,aAAA,EAAe,EAAA;AAAA,IACf,WAAA,EAAa;AAAA,GACf;AACF;AAEA,SAAS,gBAAgB,MAAA,EAAwB;AAC/C,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACjC;AAEO,SAAS,sBAAsB,cAAA,EAAiC;AACrE,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,gBAAgB,MAAA,EAAQ;AAC5D,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA;AAC5D,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,GAAA,CAAI,eAAe,CAAA;AAEzD,EAAA,IAAI,CAAC,cAAA,CAAe,QAAA,CAAS,aAAa,CAAA,EAAG;AAC3C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,4CAA4C,aAAa,CAAA;AAAA,KAC3D;AAAA,EACF;AACF;AAKO,SAAS,mBAAmB,OAAA,EAA0B;AAC3D,EAAA,MAAM,GAAA,GAAM,WAAW,aAAA,CAAc,aAAA;AACrC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,EAC1E;AACA,EAAA,MAAM,cAAA,GAAiB,IAAI,QAAA,CAAS,GAAG,IAAI,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AAC9D,EAAA,IAAI,cAAA,CAAe,QAAA,CAAS,UAAU,CAAA,EAAG;AACvC,IAAA,OAAO,cAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAG,cAAc,CAAA,mBAAA,CAAA;AAC1B","file":"chunk-WWU2O2SR.js","sourcesContent":["/**\n * Configuration module for FluidGrids SDK\n */\n\n/** Result passed to the onWorkflowSaved callback after a successful save */\nexport interface WorkflowSavedResult {\n /** Database row ID of the saved workflow definition */\n dbId: string;\n /** Human-readable workflow key (e.g., \"github_user_profile\") */\n workflowKey: string;\n /** Semantic version string (e.g., \"v1\", \"v2\") */\n version: string;\n /** Display name of the workflow */\n name: string;\n /** Optional description */\n description?: string;\n /** What kind of save operation occurred */\n operation: \"created\" | \"updated\" | \"versioned\";\n}\n\nexport interface FluidGridsConfig {\n /** GraphQL endpoint URL (workspace gateway) */\n apiGatewayUrl: string;\n /** GraphQL endpoint URL (global gateway) */\n globalApiUrl?: string;\n /** Auth token for API calls */\n authToken?: string;\n /** Current workspace ID */\n workspaceId: string;\n /** Current tenant ID */\n tenantId?: string;\n /** Organization ID */\n organizationId?: string;\n /** Frontend URL for share/embed links */\n fluidgridFrontendUrl?: string;\n /** Product ID for workflow isolation (e.g., 'bigconsole', 'botlit', 'fluidgrids') */\n productId?: string;\n /** Product name for display purposes */\n productName?: string;\n /** Optional allowlist for host origins embedding the SDK */\n trustedOrigins?: string[];\n /**\n * Callback invoked after a workflow is successfully saved to wspace-workflow-svc.\n * Host apps (BigConsole, Botlit) can use this to sync metadata to their own backends.\n * Errors thrown by this callback are caught and logged — they never block the save.\n */\n onWorkflowSaved?: (result: WorkflowSavedResult) => void | Promise<void>;\n}\n\n// Default configuration\nlet runtimeConfig: FluidGridsConfig = {\n apiGatewayUrl: \"\",\n workspaceId: \"\",\n};\n\n/**\n * Get current configuration via proxy for live access\n */\nexport const config = new Proxy({} as FluidGridsConfig, {\n get(_, prop: keyof FluidGridsConfig) {\n return runtimeConfig[prop];\n },\n});\n\n/**\n * Get the full configuration object\n */\nexport function getFluidGridsConfig(): FluidGridsConfig {\n return { ...runtimeConfig };\n}\n\n/**\n * Set runtime configuration\n */\nexport function setFluidGridsConfig(\n newConfig: Partial<FluidGridsConfig>,\n): void {\n runtimeConfig = { ...runtimeConfig, ...newConfig };\n}\n\n/**\n * Reset configuration to defaults\n */\nexport function resetFluidGridsConfig(): void {\n runtimeConfig = {\n apiGatewayUrl: \"\",\n workspaceId: \"\",\n };\n}\n\nfunction normalizeOrigin(origin: string): string {\n return origin.replace(/\\/$/, \"\");\n}\n\nexport function validateTrustedOrigin(trustedOrigins?: string[]): void {\n if (typeof window === \"undefined\" || !trustedOrigins?.length) {\n return;\n }\n\n const currentOrigin = normalizeOrigin(window.location.origin);\n const allowedOrigins = trustedOrigins.map(normalizeOrigin);\n\n if (!allowedOrigins.includes(currentOrigin)) {\n throw new Error(\n `FluidGrids SDK blocked untrusted origin: ${currentOrigin}`,\n );\n }\n}\n\n/**\n * Get the GraphQL endpoint URL\n */\nexport function getGraphQLEndpoint(baseUrl?: string): string {\n const url = baseUrl || runtimeConfig.apiGatewayUrl;\n if (!url) {\n throw new Error(\"FluidGrids SDK requires apiGatewayUrl to be configured\");\n }\n const normalizedBase = url.endsWith(\"/\") ? url.slice(0, -1) : url;\n if (normalizedBase.endsWith(\"/graphql\")) {\n return normalizedBase;\n }\n return `${normalizedBase}/workspaces/graphql`;\n}\n"]}
@@ -0,0 +1,57 @@
1
+ // src/utils/template-input-applicator.ts
2
+ function deepClone(obj) {
3
+ if (typeof structuredClone === "function") {
4
+ return structuredClone(obj);
5
+ }
6
+ return JSON.parse(JSON.stringify(obj));
7
+ }
8
+ function applyTemplateInputs(definitionJson, inputs) {
9
+ if (!inputs || Object.keys(inputs).length === 0) {
10
+ return definitionJson;
11
+ }
12
+ const cloned = deepClone(definitionJson);
13
+ return walkAndReplace(cloned, inputs);
14
+ }
15
+ function walkAndReplace(obj, inputs) {
16
+ if (typeof obj === "string") {
17
+ return replaceVariables(obj, inputs);
18
+ }
19
+ if (Array.isArray(obj)) {
20
+ return obj.map((item) => walkAndReplace(item, inputs));
21
+ }
22
+ if (obj !== null && typeof obj === "object") {
23
+ const result = {};
24
+ for (const [key, value] of Object.entries(obj)) {
25
+ result[key] = walkAndReplace(value, inputs);
26
+ }
27
+ return result;
28
+ }
29
+ return obj;
30
+ }
31
+ function replaceVariables(str, inputs) {
32
+ return str.replace(/\$\{([^}]+)\}/g, (_match, expression) => {
33
+ const trimmed = expression.trim();
34
+ const fallbackMatch = trimmed.match(/^(\w+)\s*\|\|\s*['"]?(.+?)['"]?$/);
35
+ if (fallbackMatch) {
36
+ const varName = fallbackMatch[1];
37
+ const fallback = fallbackMatch[2];
38
+ if (varName in inputs) {
39
+ return String(inputs[varName]);
40
+ }
41
+ return fallback;
42
+ }
43
+ if (trimmed in inputs) {
44
+ return String(inputs[trimmed]);
45
+ }
46
+ return _match;
47
+ });
48
+ }
49
+ function generateWorkflowKey(name) {
50
+ const slug = name.toLowerCase().replace(/[→→]/g, "").replace(/[^a-z0-9\s-]/g, "").replace(/\s+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "").slice(0, 50);
51
+ const suffix = Math.random().toString(36).slice(2, 8);
52
+ return `${slug}-${suffix}`;
53
+ }
54
+
55
+ export { applyTemplateInputs, deepClone, generateWorkflowKey };
56
+ //# sourceMappingURL=chunk-XQP33UJR.js.map
57
+ //# sourceMappingURL=chunk-XQP33UJR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/template-input-applicator.ts"],"names":[],"mappings":";AAYO,SAAS,UAAa,GAAA,EAAW;AACtC,EAAA,IAAI,OAAO,oBAAoB,UAAA,EAAY;AACzC,IAAA,OAAO,gBAAgB,GAAG,CAAA;AAAA,EAC5B;AACA,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AACvC;AAyBO,SAAS,mBAAA,CACd,gBACA,MAAA,EACG;AACH,EAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,KAAK,MAAM,CAAA,CAAE,WAAW,CAAA,EAAG;AAC/C,IAAA,OAAO,cAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,UAAU,cAAc,CAAA;AACvC,EAAA,OAAO,cAAA,CAAe,QAAQ,MAAM,CAAA;AACtC;AAMA,SAAS,cAAA,CACP,KACA,MAAA,EACS;AACT,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,OAAO,gBAAA,CAAiB,KAAK,MAAM,CAAA;AAAA,EACrC;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,IAAA,OAAO,IAAI,GAAA,CAAI,CAAC,SAAS,cAAA,CAAe,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,EACvD;AAEA,EAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,OAAO,GAAA,KAAQ,QAAA,EAAU;AAC3C,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAA8B,CAAA,EAAG;AACzE,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,cAAA,CAAe,KAAA,EAAO,MAAM,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,OAAO,GAAA;AACT;AASA,SAAS,gBAAA,CACP,KACA,MAAA,EACQ;AAER,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,gBAAA,EAAkB,CAAC,QAAQ,UAAA,KAAuB;AACnE,IAAA,MAAM,OAAA,GAAU,WAAW,IAAA,EAAK;AAGhC,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,KAAA,CAAM,kCAAkC,CAAA;AACtE,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,MAAM,OAAA,GAAU,cAAc,CAAC,CAAA;AAC/B,MAAA,MAAM,QAAA,GAAW,cAAc,CAAC,CAAA;AAChC,MAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,QAAA,OAAO,MAAA,CAAO,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,MAC/B;AACA,MAAA,OAAO,QAAA;AAAA,IACT;AAGA,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,OAAO,MAAA,CAAO,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,IAC/B;AAGA,IAAA,OAAO,MAAA;AAAA,EACT,CAAC,CAAA;AACH;AASO,SAAS,oBAAoB,IAAA,EAAsB;AACxD,EAAA,MAAM,IAAA,GAAO,IAAA,CACV,WAAA,EAAY,CACZ,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,CACnB,OAAA,CAAQ,eAAA,EAAiB,EAAE,CAAA,CAC3B,OAAA,CAAQ,QAAQ,GAAG,CAAA,CACnB,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAClB,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,CACpB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAEd,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACpD,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAC1B","file":"chunk-XQP33UJR.js","sourcesContent":["/**\n * Template Input Applicator\n *\n * Walks a workflow definitionJson and replaces ${variableName} placeholders\n * with user-provided values. Used during template import to apply\n * user-configurable inputs before creating the workflow.\n */\n\n/**\n * Deep-clone an object using structured clone.\n * Falls back to JSON parse/stringify for environments without structuredClone.\n */\nexport function deepClone<T>(obj: T): T {\n if (typeof structuredClone === \"function\") {\n return structuredClone(obj);\n }\n return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * Apply template input values to a definitionJson by replacing\n * ${variableName} placeholders in string values throughout the object tree.\n *\n * @param definitionJson - The workflow definition JSON to process\n * @param inputs - Map of variable names to user-provided values\n * @returns A new definitionJson with placeholders replaced\n *\n * @example\n * ```ts\n * const definition = {\n * nodes: [{\n * data: { url: \"${slack_webhook_url}\", message: \"Hello ${name}\" }\n * }]\n * };\n * const result = applyTemplateInputs(definition, {\n * slack_webhook_url: \"https://hooks.slack.com/...\",\n * name: \"World\"\n * });\n * // result.nodes[0].data.url === \"https://hooks.slack.com/...\"\n * // result.nodes[0].data.message === \"Hello World\"\n * ```\n */\nexport function applyTemplateInputs<T>(\n definitionJson: T,\n inputs: Record<string, string | number>,\n): T {\n if (!inputs || Object.keys(inputs).length === 0) {\n return definitionJson;\n }\n\n const cloned = deepClone(definitionJson);\n return walkAndReplace(cloned, inputs) as T;\n}\n\n/**\n * Recursively walk an object/array and replace ${variableName} placeholders\n * in string values.\n */\nfunction walkAndReplace(\n obj: unknown,\n inputs: Record<string, string | number>,\n): unknown {\n if (typeof obj === \"string\") {\n return replaceVariables(obj, inputs);\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => walkAndReplace(item, inputs));\n }\n\n if (obj !== null && typeof obj === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n result[key] = walkAndReplace(value, inputs);\n }\n return result;\n }\n\n // Primitives (number, boolean, null, undefined) — return as-is\n return obj;\n}\n\n/**\n * Replace ${variableName} patterns in a string with provided values.\n *\n * Supports:\n * - ${variableName} — standard replacement\n * - ${variableName || 'default'} — fallback to default if variable not provided\n */\nfunction replaceVariables(\n str: string,\n inputs: Record<string, string | number>,\n): string {\n // Match ${variableName} or ${variableName || 'default value'}\n return str.replace(/\\$\\{([^}]+)\\}/g, (_match, expression: string) => {\n const trimmed = expression.trim();\n\n // Check for fallback syntax: ${variable || 'default'}\n const fallbackMatch = trimmed.match(/^(\\w+)\\s*\\|\\|\\s*['\"]?(.+?)['\"]?$/);\n if (fallbackMatch) {\n const varName = fallbackMatch[1];\n const fallback = fallbackMatch[2];\n if (varName in inputs) {\n return String(inputs[varName]);\n }\n return fallback;\n }\n\n // Simple variable replacement: ${variable}\n if (trimmed in inputs) {\n return String(inputs[trimmed]);\n }\n\n // Variable not found — leave placeholder as-is\n return _match;\n });\n}\n\n/**\n * Generate a URL-safe workflow key from a template name.\n *\n * @example\n * generateWorkflowKey(\"Webhook → Slack Notification\")\n * // => \"webhook-slack-notification-a3f2b1\"\n */\nexport function generateWorkflowKey(name: string): string {\n const slug = name\n .toLowerCase()\n .replace(/[→→]/g, \"\") // Remove arrow characters\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n .slice(0, 50);\n\n const suffix = Math.random().toString(36).slice(2, 8);\n return `${slug}-${suffix}`;\n}\n"]}