@burdenoff/fluidgrids-fe-sdk 2026.1007.5 → 2026.1008.2
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.
- package/dist/ExecutionDetailPage-HPAU7U3E.js +12 -0
- package/dist/{ExecutionDetailPage-3QKAXLHE.js.map → ExecutionDetailPage-HPAU7U3E.js.map} +1 -1
- package/dist/ExecutionsListPage-TLXVEIRK.js +11 -0
- package/dist/{ExecutionsListPage-KZLKLSSC.js.map → ExecutionsListPage-TLXVEIRK.js.map} +1 -1
- package/dist/{WorkflowBuilder-B3VBBZVG.js → WorkflowBuilder-YJLWNBT3.js} +7 -7
- package/dist/{WorkflowBuilder-B3VBBZVG.js.map → WorkflowBuilder-YJLWNBT3.js.map} +1 -1
- package/dist/WorkflowsList-YSZWXFMZ.js +14 -0
- package/dist/{WorkflowsList-3Q7SSUYR.js.map → WorkflowsList-YSZWXFMZ.js.map} +1 -1
- package/dist/{chunk-GKSXZFDY.js → chunk-2C6CUHM3.js} +4 -4
- package/dist/{chunk-GKSXZFDY.js.map → chunk-2C6CUHM3.js.map} +1 -1
- package/dist/{chunk-ZLYJKIKG.js → chunk-2ORIFA6I.js} +3 -3
- package/dist/{chunk-ZLYJKIKG.js.map → chunk-2ORIFA6I.js.map} +1 -1
- package/dist/chunk-F2BBRTLB.js +204 -0
- package/dist/chunk-F2BBRTLB.js.map +1 -0
- package/dist/{chunk-FKOUPL6Z.js → chunk-FAPYERDO.js} +3 -3
- package/dist/{chunk-FKOUPL6Z.js.map → chunk-FAPYERDO.js.map} +1 -1
- package/dist/{chunk-5TITRVCU.js → chunk-I2766GDR.js} +4 -4
- package/dist/{chunk-5TITRVCU.js.map → chunk-I2766GDR.js.map} +1 -1
- package/dist/{chunk-G3RPRMP5.js → chunk-IOV4YPQU.js} +4 -4
- package/dist/{chunk-G3RPRMP5.js.map → chunk-IOV4YPQU.js.map} +1 -1
- package/dist/{chunk-RJPBWDZM.js → chunk-KIJDG6MG.js} +5 -5
- package/dist/{chunk-RJPBWDZM.js.map → chunk-KIJDG6MG.js.map} +1 -1
- package/dist/{chunk-LW722GAN.js → chunk-LVKUOMLJ.js} +5 -4
- package/dist/chunk-LVKUOMLJ.js.map +1 -0
- package/dist/{chunk-SJORR3EX.js → chunk-NG32SZ75.js} +5 -153
- package/dist/chunk-NG32SZ75.js.map +1 -0
- package/dist/{chunk-2DN6NTKM.js → chunk-W73HBP7B.js} +5 -5
- package/dist/{chunk-2DN6NTKM.js.map → chunk-W73HBP7B.js.map} +1 -1
- package/dist/{chunk-IVWSTICA.js → chunk-W7APOU2R.js} +19 -10
- package/dist/chunk-W7APOU2R.js.map +1 -0
- package/dist/{chunk-67CQSSWO.js → chunk-WKALLY4E.js} +4 -4
- package/dist/{chunk-67CQSSWO.js.map → chunk-WKALLY4E.js.map} +1 -1
- package/dist/{chunk-5A7GP6O7.js → chunk-WNFZXH3Z.js} +3 -3
- package/dist/{chunk-5A7GP6O7.js.map → chunk-WNFZXH3Z.js.map} +1 -1
- package/dist/{chunk-BNSM27CU.js → chunk-WXNDAONY.js} +3 -3
- package/dist/{chunk-BNSM27CU.js.map → chunk-WXNDAONY.js.map} +1 -1
- package/dist/{chunk-ZZRRG37Q.js → chunk-WYQ4OBES.js} +3 -3
- package/dist/{chunk-ZZRRG37Q.js.map → chunk-WYQ4OBES.js.map} +1 -1
- package/dist/{chunk-5BDQNSP3.js → chunk-ZBMMEE5U.js} +6 -4
- package/dist/chunk-ZBMMEE5U.js.map +1 -0
- package/dist/client-YFAZ23OL.js +3 -0
- package/dist/{client-AMUUS7VE.js.map → client-YFAZ23OL.js.map} +1 -1
- package/dist/{config-5UMLMALY.js → config-YHUOLDAL.js} +3 -3
- package/dist/{config-5UMLMALY.js.map → config-YHUOLDAL.js.map} +1 -1
- package/dist/executions.js +6 -6
- package/dist/history.js +4 -4
- package/dist/index.d.ts +1 -0
- package/dist/index.js +23 -23
- package/dist/nodes.js +2 -2
- package/dist/observability.js +3 -3
- package/dist/settings.js +3 -3
- package/dist/templates.js +5 -5
- package/dist/workflow-builder.js +6 -6
- package/dist/workflows-list.js +4 -4
- package/package.json +1 -1
- package/dist/ExecutionDetailPage-3QKAXLHE.js +0 -12
- package/dist/ExecutionsListPage-KZLKLSSC.js +0 -11
- package/dist/WorkflowsList-3Q7SSUYR.js +0 -14
- package/dist/chunk-5BDQNSP3.js.map +0 -1
- package/dist/chunk-IVWSTICA.js.map +0 -1
- package/dist/chunk-LW722GAN.js.map +0 -1
- package/dist/chunk-SJORR3EX.js.map +0 -1
- package/dist/chunk-U4AJLVHA.js +0 -52
- package/dist/chunk-U4AJLVHA.js.map +0 -1
- package/dist/client-AMUUS7VE.js +0 -3
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { create } from 'zustand';
|
|
2
|
+
|
|
3
|
+
var defaultFilter = {
|
|
4
|
+
status: "all",
|
|
5
|
+
workflowKey: "",
|
|
6
|
+
dateRange: {
|
|
7
|
+
start: null,
|
|
8
|
+
end: null,
|
|
9
|
+
preset: "all"
|
|
10
|
+
},
|
|
11
|
+
search: "",
|
|
12
|
+
triggerType: "all",
|
|
13
|
+
durationMinSeconds: null,
|
|
14
|
+
durationMaxSeconds: null,
|
|
15
|
+
errorType: "all",
|
|
16
|
+
nodeId: ""
|
|
17
|
+
};
|
|
18
|
+
var defaultPagination = {
|
|
19
|
+
page: 1,
|
|
20
|
+
pageSize: 25,
|
|
21
|
+
total: 0
|
|
22
|
+
};
|
|
23
|
+
var useExecutionsStore = create((set) => ({
|
|
24
|
+
// Initial state
|
|
25
|
+
viewMode: "table",
|
|
26
|
+
selectedExecution: null,
|
|
27
|
+
expandedRows: /* @__PURE__ */ new Set(),
|
|
28
|
+
selection: {
|
|
29
|
+
runIds: [],
|
|
30
|
+
allSelected: false
|
|
31
|
+
},
|
|
32
|
+
filter: defaultFilter,
|
|
33
|
+
pagination: defaultPagination,
|
|
34
|
+
isFilterPanelOpen: false,
|
|
35
|
+
isDetailsPanelOpen: false,
|
|
36
|
+
autoRefresh: true,
|
|
37
|
+
autoRefreshInterval: 5e3,
|
|
38
|
+
liveRunIds: /* @__PURE__ */ new Set(),
|
|
39
|
+
// Actions - View
|
|
40
|
+
setViewMode: (mode) => set({ viewMode: mode }),
|
|
41
|
+
setSelectedExecution: (execution) => set({
|
|
42
|
+
selectedExecution: execution,
|
|
43
|
+
isDetailsPanelOpen: execution !== null
|
|
44
|
+
}),
|
|
45
|
+
toggleRowExpanded: (runId) => set((state) => {
|
|
46
|
+
const newExpanded = new Set(state.expandedRows);
|
|
47
|
+
if (newExpanded.has(runId)) {
|
|
48
|
+
newExpanded.delete(runId);
|
|
49
|
+
} else {
|
|
50
|
+
newExpanded.add(runId);
|
|
51
|
+
}
|
|
52
|
+
return { expandedRows: newExpanded };
|
|
53
|
+
}),
|
|
54
|
+
// Actions - Selection
|
|
55
|
+
setSelection: (selection) => set({ selection }),
|
|
56
|
+
toggleSelectRun: (runId) => set((state) => {
|
|
57
|
+
const isSelected = state.selection.runIds.includes(runId);
|
|
58
|
+
const newRunIds = isSelected ? state.selection.runIds.filter((id) => id !== runId) : [...state.selection.runIds, runId];
|
|
59
|
+
return {
|
|
60
|
+
selection: {
|
|
61
|
+
runIds: newRunIds,
|
|
62
|
+
allSelected: false
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
}),
|
|
66
|
+
selectAll: (runIds) => set((state) => ({
|
|
67
|
+
selection: {
|
|
68
|
+
runIds: state.selection.allSelected ? [] : runIds,
|
|
69
|
+
allSelected: !state.selection.allSelected
|
|
70
|
+
}
|
|
71
|
+
})),
|
|
72
|
+
clearSelection: () => set({
|
|
73
|
+
selection: {
|
|
74
|
+
runIds: [],
|
|
75
|
+
allSelected: false
|
|
76
|
+
}
|
|
77
|
+
}),
|
|
78
|
+
// Actions - Filter
|
|
79
|
+
updateFilter: (filterUpdate) => set((state) => ({
|
|
80
|
+
filter: { ...state.filter, ...filterUpdate },
|
|
81
|
+
pagination: { ...state.pagination, page: 1 }
|
|
82
|
+
})),
|
|
83
|
+
setStatusFilter: (status) => set((state) => ({
|
|
84
|
+
filter: { ...state.filter, status },
|
|
85
|
+
pagination: { ...state.pagination, page: 1 }
|
|
86
|
+
})),
|
|
87
|
+
setWorkflowFilter: (workflowKey) => set((state) => ({
|
|
88
|
+
filter: { ...state.filter, workflowKey },
|
|
89
|
+
pagination: { ...state.pagination, page: 1 }
|
|
90
|
+
})),
|
|
91
|
+
setDateRange: (dateRange) => set((state) => ({
|
|
92
|
+
filter: { ...state.filter, dateRange },
|
|
93
|
+
pagination: { ...state.pagination, page: 1 }
|
|
94
|
+
})),
|
|
95
|
+
setSearchQuery: (search) => set((state) => ({
|
|
96
|
+
filter: { ...state.filter, search },
|
|
97
|
+
pagination: { ...state.pagination, page: 1 }
|
|
98
|
+
})),
|
|
99
|
+
setTriggerTypeFilter: (triggerType) => set((state) => ({
|
|
100
|
+
filter: { ...state.filter, triggerType },
|
|
101
|
+
pagination: { ...state.pagination, page: 1 }
|
|
102
|
+
})),
|
|
103
|
+
setDurationFilter: (durationMinSeconds, durationMaxSeconds) => set((state) => ({
|
|
104
|
+
filter: { ...state.filter, durationMinSeconds, durationMaxSeconds },
|
|
105
|
+
pagination: { ...state.pagination, page: 1 }
|
|
106
|
+
})),
|
|
107
|
+
setErrorTypeFilter: (errorType) => set((state) => ({
|
|
108
|
+
filter: { ...state.filter, errorType },
|
|
109
|
+
pagination: { ...state.pagination, page: 1 }
|
|
110
|
+
})),
|
|
111
|
+
setNodeFilter: (nodeId) => set((state) => ({
|
|
112
|
+
filter: { ...state.filter, nodeId },
|
|
113
|
+
pagination: { ...state.pagination, page: 1 }
|
|
114
|
+
})),
|
|
115
|
+
resetFilters: () => set({
|
|
116
|
+
filter: defaultFilter,
|
|
117
|
+
pagination: { ...defaultPagination }
|
|
118
|
+
}),
|
|
119
|
+
// Actions - Pagination
|
|
120
|
+
setPage: (page) => set((state) => ({
|
|
121
|
+
pagination: { ...state.pagination, page }
|
|
122
|
+
})),
|
|
123
|
+
setPageSize: (pageSize) => set((state) => ({
|
|
124
|
+
pagination: { ...state.pagination, pageSize, page: 1 }
|
|
125
|
+
})),
|
|
126
|
+
setTotal: (total) => set((state) => ({
|
|
127
|
+
pagination: { ...state.pagination, total }
|
|
128
|
+
})),
|
|
129
|
+
// Actions - UI
|
|
130
|
+
toggleFilterPanel: () => set((state) => ({
|
|
131
|
+
isFilterPanelOpen: !state.isFilterPanelOpen
|
|
132
|
+
})),
|
|
133
|
+
toggleDetailsPanel: () => set((state) => ({
|
|
134
|
+
isDetailsPanelOpen: !state.isDetailsPanelOpen
|
|
135
|
+
})),
|
|
136
|
+
setAutoRefresh: (enabled) => set({ autoRefresh: enabled }),
|
|
137
|
+
setAutoRefreshInterval: (interval) => set({ autoRefreshInterval: interval }),
|
|
138
|
+
// Actions - Real-time
|
|
139
|
+
addLiveRun: (runId) => set((state) => {
|
|
140
|
+
const newLiveRunIds = new Set(state.liveRunIds);
|
|
141
|
+
newLiveRunIds.add(runId);
|
|
142
|
+
return { liveRunIds: newLiveRunIds };
|
|
143
|
+
}),
|
|
144
|
+
removeLiveRun: (runId) => set((state) => {
|
|
145
|
+
const newLiveRunIds = new Set(state.liveRunIds);
|
|
146
|
+
newLiveRunIds.delete(runId);
|
|
147
|
+
return { liveRunIds: newLiveRunIds };
|
|
148
|
+
}),
|
|
149
|
+
clearLiveRuns: () => set({ liveRunIds: /* @__PURE__ */ new Set() })
|
|
150
|
+
}));
|
|
151
|
+
|
|
152
|
+
// src/config/index.ts
|
|
153
|
+
var runtimeConfig = {
|
|
154
|
+
apiGatewayUrl: "",
|
|
155
|
+
workspaceId: ""
|
|
156
|
+
};
|
|
157
|
+
var config = new Proxy({}, {
|
|
158
|
+
get(_, prop) {
|
|
159
|
+
return runtimeConfig[prop];
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
function getFluidGridsConfig() {
|
|
163
|
+
return { ...runtimeConfig };
|
|
164
|
+
}
|
|
165
|
+
function setFluidGridsConfig(newConfig) {
|
|
166
|
+
runtimeConfig = { ...runtimeConfig, ...newConfig };
|
|
167
|
+
}
|
|
168
|
+
function resetFluidGridsConfig() {
|
|
169
|
+
useExecutionsStore.setState(useExecutionsStore.getInitialState(), true);
|
|
170
|
+
runtimeConfig = {
|
|
171
|
+
apiGatewayUrl: "",
|
|
172
|
+
workspaceId: ""
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
function normalizeOrigin(origin) {
|
|
176
|
+
return origin.replace(/\/$/, "");
|
|
177
|
+
}
|
|
178
|
+
function validateTrustedOrigin(trustedOrigins) {
|
|
179
|
+
if (typeof window === "undefined" || !trustedOrigins?.length) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
const currentOrigin = normalizeOrigin(window.location.origin);
|
|
183
|
+
const allowedOrigins = trustedOrigins.map(normalizeOrigin);
|
|
184
|
+
if (!allowedOrigins.includes(currentOrigin)) {
|
|
185
|
+
throw new Error(
|
|
186
|
+
`FluidGrids SDK blocked untrusted origin: ${currentOrigin}`
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
function getGraphQLEndpoint(baseUrl) {
|
|
191
|
+
const url = baseUrl || runtimeConfig.apiGatewayUrl;
|
|
192
|
+
if (!url) {
|
|
193
|
+
throw new Error("FluidGrids SDK requires apiGatewayUrl to be configured");
|
|
194
|
+
}
|
|
195
|
+
const normalizedBase = url.endsWith("/") ? url.slice(0, -1) : url;
|
|
196
|
+
if (normalizedBase.endsWith("/graphql")) {
|
|
197
|
+
return normalizedBase;
|
|
198
|
+
}
|
|
199
|
+
return `${normalizedBase}/workspaces/graphql`;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export { config, getFluidGridsConfig, getGraphQLEndpoint, resetFluidGridsConfig, setFluidGridsConfig, useExecutionsStore, validateTrustedOrigin };
|
|
203
|
+
//# sourceMappingURL=chunk-F2BBRTLB.js.map
|
|
204
|
+
//# sourceMappingURL=chunk-F2BBRTLB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/modules/executions/store/executionsStore.ts","../src/config/index.ts"],"names":[],"mappings":"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","file":"chunk-F2BBRTLB.js","sourcesContent":["import { create } from \"zustand\";\nimport type {\n RunStatus,\n ExecutionsFilter,\n ExecutionsViewMode,\n ExecutionSelection,\n ExecutionsPagination,\n DateRange,\n WorkflowRun,\n} from \"../types\";\n\ninterface ExecutionsState {\n // View state\n viewMode: ExecutionsViewMode;\n selectedExecution: WorkflowRun | null;\n expandedRows: Set<string>;\n\n // Selection\n selection: ExecutionSelection;\n\n // Filters\n filter: ExecutionsFilter;\n\n // Pagination\n pagination: ExecutionsPagination;\n\n // UI state\n isFilterPanelOpen: boolean;\n isDetailsPanelOpen: boolean;\n autoRefresh: boolean;\n autoRefreshInterval: number;\n\n // Real-time\n liveRunIds: Set<string>;\n\n // Actions - View\n setViewMode: (mode: ExecutionsViewMode) => void;\n setSelectedExecution: (execution: WorkflowRun | null) => void;\n toggleRowExpanded: (runId: string) => void;\n\n // Actions - Selection\n setSelection: (selection: ExecutionSelection) => void;\n toggleSelectRun: (runId: string) => void;\n selectAll: (runIds: string[]) => void;\n clearSelection: () => void;\n\n // Actions - Filter\n updateFilter: (filter: Partial<ExecutionsFilter>) => void;\n setStatusFilter: (status: RunStatus | \"all\") => void;\n setWorkflowFilter: (workflowKey: string) => void;\n setDateRange: (dateRange: DateRange) => void;\n setSearchQuery: (search: string) => void;\n setTriggerTypeFilter: (triggerType: ExecutionsFilter[\"triggerType\"]) => void;\n setDurationFilter: (\n durationMinSeconds: number | null,\n durationMaxSeconds: number | null,\n ) => void;\n setErrorTypeFilter: (errorType: ExecutionsFilter[\"errorType\"]) => void;\n setNodeFilter: (nodeId: string) => void;\n resetFilters: () => void;\n\n // Actions - Pagination\n setPage: (page: number) => void;\n setPageSize: (pageSize: number) => void;\n setTotal: (total: number) => void;\n\n // Actions - UI\n toggleFilterPanel: () => void;\n toggleDetailsPanel: () => void;\n setAutoRefresh: (enabled: boolean) => void;\n setAutoRefreshInterval: (interval: number) => void;\n\n // Actions - Real-time\n addLiveRun: (runId: string) => void;\n removeLiveRun: (runId: string) => void;\n clearLiveRuns: () => void;\n}\n\nconst defaultFilter: ExecutionsFilter = {\n status: \"all\",\n workflowKey: \"\",\n dateRange: {\n start: null,\n end: null,\n preset: \"all\",\n },\n search: \"\",\n triggerType: \"all\",\n durationMinSeconds: null,\n durationMaxSeconds: null,\n errorType: \"all\",\n nodeId: \"\",\n};\n\nconst defaultPagination: ExecutionsPagination = {\n page: 1,\n pageSize: 25,\n total: 0,\n};\n\nexport const useExecutionsStore = create<ExecutionsState>((set) => ({\n // Initial state\n viewMode: \"table\",\n selectedExecution: null,\n expandedRows: new Set(),\n\n selection: {\n runIds: [],\n allSelected: false,\n },\n\n filter: defaultFilter,\n pagination: defaultPagination,\n\n isFilterPanelOpen: false,\n isDetailsPanelOpen: false,\n autoRefresh: true,\n autoRefreshInterval: 5000,\n\n liveRunIds: new Set(),\n\n // Actions - View\n setViewMode: (mode) => set({ viewMode: mode }),\n\n setSelectedExecution: (execution) =>\n set({\n selectedExecution: execution,\n isDetailsPanelOpen: execution !== null,\n }),\n\n toggleRowExpanded: (runId) =>\n set((state) => {\n const newExpanded = new Set(state.expandedRows);\n if (newExpanded.has(runId)) {\n newExpanded.delete(runId);\n } else {\n newExpanded.add(runId);\n }\n return { expandedRows: newExpanded };\n }),\n\n // Actions - Selection\n setSelection: (selection) => set({ selection }),\n\n toggleSelectRun: (runId) =>\n set((state) => {\n const isSelected = state.selection.runIds.includes(runId);\n const newRunIds = isSelected\n ? state.selection.runIds.filter((id) => id !== runId)\n : [...state.selection.runIds, runId];\n return {\n selection: {\n runIds: newRunIds,\n allSelected: false,\n },\n };\n }),\n\n selectAll: (runIds) =>\n set((state) => ({\n selection: {\n runIds: state.selection.allSelected ? [] : runIds,\n allSelected: !state.selection.allSelected,\n },\n })),\n\n clearSelection: () =>\n set({\n selection: {\n runIds: [],\n allSelected: false,\n },\n }),\n\n // Actions - Filter\n updateFilter: (filterUpdate) =>\n set((state) => ({\n filter: { ...state.filter, ...filterUpdate },\n pagination: { ...state.pagination, page: 1 },\n })),\n\n setStatusFilter: (status) =>\n set((state) => ({\n filter: { ...state.filter, status },\n pagination: { ...state.pagination, page: 1 },\n })),\n\n setWorkflowFilter: (workflowKey) =>\n set((state) => ({\n filter: { ...state.filter, workflowKey },\n pagination: { ...state.pagination, page: 1 },\n })),\n\n setDateRange: (dateRange) =>\n set((state) => ({\n filter: { ...state.filter, dateRange },\n pagination: { ...state.pagination, page: 1 },\n })),\n\n setSearchQuery: (search) =>\n set((state) => ({\n filter: { ...state.filter, search },\n pagination: { ...state.pagination, page: 1 },\n })),\n\n setTriggerTypeFilter: (triggerType) =>\n set((state) => ({\n filter: { ...state.filter, triggerType },\n pagination: { ...state.pagination, page: 1 },\n })),\n\n setDurationFilter: (durationMinSeconds, durationMaxSeconds) =>\n set((state) => ({\n filter: { ...state.filter, durationMinSeconds, durationMaxSeconds },\n pagination: { ...state.pagination, page: 1 },\n })),\n\n setErrorTypeFilter: (errorType) =>\n set((state) => ({\n filter: { ...state.filter, errorType },\n pagination: { ...state.pagination, page: 1 },\n })),\n\n setNodeFilter: (nodeId) =>\n set((state) => ({\n filter: { ...state.filter, nodeId },\n pagination: { ...state.pagination, page: 1 },\n })),\n\n resetFilters: () =>\n set({\n filter: defaultFilter,\n pagination: { ...defaultPagination },\n }),\n\n // Actions - Pagination\n setPage: (page) =>\n set((state) => ({\n pagination: { ...state.pagination, page },\n })),\n\n setPageSize: (pageSize) =>\n set((state) => ({\n pagination: { ...state.pagination, pageSize, page: 1 },\n })),\n\n setTotal: (total) =>\n set((state) => ({\n pagination: { ...state.pagination, total },\n })),\n\n // Actions - UI\n toggleFilterPanel: () =>\n set((state) => ({\n isFilterPanelOpen: !state.isFilterPanelOpen,\n })),\n\n toggleDetailsPanel: () =>\n set((state) => ({\n isDetailsPanelOpen: !state.isDetailsPanelOpen,\n })),\n\n setAutoRefresh: (enabled) => set({ autoRefresh: enabled }),\n\n setAutoRefreshInterval: (interval) => set({ autoRefreshInterval: interval }),\n\n // Actions - Real-time\n addLiveRun: (runId) =>\n set((state) => {\n const newLiveRunIds = new Set(state.liveRunIds);\n newLiveRunIds.add(runId);\n return { liveRunIds: newLiveRunIds };\n }),\n\n removeLiveRun: (runId) =>\n set((state) => {\n const newLiveRunIds = new Set(state.liveRunIds);\n newLiveRunIds.delete(runId);\n return { liveRunIds: newLiveRunIds };\n }),\n\n clearLiveRuns: () => set({ liveRunIds: new Set() }),\n}));\n","import { useExecutionsStore } from \"../modules/executions/store/executionsStore\";\n/**\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 /**\n * @deprecated Never read. Share/Embed links used to be built from this\n * value, which no host ever set, so they shipped as `undefined/...`\n * (BOFF-7753). Kept only so existing host configs still type-check.\n */\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 // Executions contain user data; never carry selections or filters into another host/session.\n useExecutionsStore.setState(useExecutionsStore.getInitialState(), true);\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"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useDataSinks, useDataSinkData, useInsightsData, useRunReplayActions } from './chunk-
|
|
1
|
+
import { useDataSinks, useDataSinkData, useInsightsData, useRunReplayActions } from './chunk-WNFZXH3Z.js';
|
|
2
2
|
import { useTr } from './chunk-7YWBH2A5.js';
|
|
3
3
|
import { useState, useMemo, useEffect } from 'react';
|
|
4
4
|
import { Icon } from '@iconify/react';
|
|
@@ -749,5 +749,5 @@ function ErrorAnalyticsPage() {
|
|
|
749
749
|
}
|
|
750
750
|
|
|
751
751
|
export { DataSinkDashboardPage, ErrorAnalyticsPage, InsightsPage };
|
|
752
|
-
//# sourceMappingURL=chunk-
|
|
753
|
-
//# sourceMappingURL=chunk-
|
|
752
|
+
//# sourceMappingURL=chunk-FAPYERDO.js.map
|
|
753
|
+
//# sourceMappingURL=chunk-FAPYERDO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/modules/observability/utils.ts","../src/modules/observability/pages/DataSinkDashboardPage.tsx","../src/modules/observability/pages/InsightsPage.tsx"],"names":["jsxs","jsx","Icon","useState","useMemo","Button"],"mappings":"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","file":"chunk-FKOUPL6Z.js","sourcesContent":["import type { FailedRun, NodeUsageStat } from \"./types\";\n\nexport interface ErrorBreakdownEntry {\n key: string;\n count: number;\n}\n\nexport interface WorkflowFailureEntry {\n workflowKey: string;\n label: string;\n count: number;\n}\n\nexport function percentage(value: number, total: number): number {\n if (total <= 0) return 0;\n return Math.round((value / total) * 1000) / 10;\n}\n\nexport function getFailureBreakdown(\n runs: readonly FailedRun[],\n): ErrorBreakdownEntry[] {\n const counts = new Map<string, number>();\n for (const run of runs) {\n const key = run.errorType || \"UNKNOWN\";\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n return [...counts.entries()]\n .map(([key, count]) => ({ key, count }))\n .sort((a, b) => b.count - a.count || a.key.localeCompare(b.key));\n}\n\nexport function getTopFailingWorkflows(\n runs: readonly FailedRun[],\n): WorkflowFailureEntry[] {\n const counts = new Map<string, WorkflowFailureEntry>();\n for (const run of runs) {\n const current = counts.get(run.workflowKey);\n if (current) {\n current.count += 1;\n } else {\n counts.set(run.workflowKey, {\n workflowKey: run.workflowKey,\n label: run.workflow?.name || run.workflowKey,\n count: 1,\n });\n }\n }\n return [...counts.values()].sort(\n (a, b) => b.count - a.count || a.label.localeCompare(b.label),\n );\n}\n\nexport function getTopFailingNodes(\n nodeUsageStats: readonly NodeUsageStat[],\n): NodeUsageStat[] {\n return [...nodeUsageStats]\n .filter((stat) => stat.failureCount > 0)\n .sort(\n (a, b) =>\n b.failureCount - a.failureCount || a.nodeType.localeCompare(b.nodeType),\n );\n}\n\nexport function formatDuration(seconds: number | null | undefined): string {\n if (seconds === null || seconds === undefined || !Number.isFinite(seconds)) {\n return \"—\";\n }\n if (seconds < 1) return `${Math.round(seconds * 1000)}ms`;\n if (seconds < 60) return `${seconds.toFixed(1)}s`;\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = Math.round(seconds % 60);\n return `${minutes}m ${remainingSeconds}s`;\n}\n\nexport function formatBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return \"—\";\n if (bytes < 1024) return `${bytes} B`;\n const units = [\"KB\", \"MB\", \"GB\", \"TB\"];\n let value = bytes / 1024;\n let unit = units[0];\n for (let i = 1; i < units.length && value >= 1024; i += 1) {\n value /= 1024;\n unit = units[i];\n }\n return `${value.toFixed(value >= 10 ? 0 : 1)} ${unit}`;\n}\n\nexport function prettyJson(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2) ?? \"null\";\n } catch {\n return String(value);\n }\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport { Button } from \"@burdenoff/fe-libs/button\";\nimport { Input } from \"@burdenoff/fe-libs/ui\";\nimport { useTr } from \"../../../hooks/useTr\";\nimport { useDataSinkData, useDataSinks } from \"../hooks/useObservability\";\nimport { formatBytes, prettyJson } from \"../utils\";\nimport type { DataSinkSummary } from \"../types\";\n\nfunction valueLabel(value: unknown): string {\n if (value === null || value === undefined) return \"—\";\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n}\n\nfunction DataPreview({ value }: { value: unknown }) {\n const tr = useTr();\n if (Array.isArray(value)) {\n const rows = value.filter(\n (item): item is Record<string, unknown> =>\n Boolean(item) && typeof item === \"object\" && !Array.isArray(item),\n );\n if (rows.length > 0) {\n const keys = [...new Set(rows.flatMap((row) => Object.keys(row)))].slice(\n 0,\n 12,\n );\n return (\n <div className=\"overflow-x-auto rounded-lg border border-border-secondary\">\n <table className=\"min-w-full text-left text-sm\">\n <thead className=\"bg-background-tertiary text-xs uppercase text-text-secondary\">\n <tr>\n {keys.map((key) => (\n <th\n key={key}\n className=\"whitespace-nowrap px-3 py-2 font-medium\"\n >\n {key}\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border-secondary\">\n {rows.slice(0, 50).map((row, index) => (\n <tr key={index} className=\"text-text-primary\">\n {keys.map((key) => (\n <td key={key} className=\"max-w-xs truncate px-3 py-2\">\n {valueLabel(row[key])}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n {rows.length > 50 && (\n <p className=\"border-t border-border-secondary px-3 py-2 text-xs text-text-secondary\">\n {tr(\n \"fluidgrids.dataSinks.previewLimit\",\n \"Showing the first 50 rows\",\n )}\n </p>\n )}\n </div>\n );\n }\n }\n return (\n <pre className=\"max-h-[28rem] overflow-auto rounded-lg border border-border-secondary bg-background-primary p-4 text-xs text-text-primary\">\n {prettyJson(value)}\n </pre>\n );\n}\n\nfunction SinkCard({\n sink,\n selected,\n onSelect,\n}: {\n sink: DataSinkSummary;\n selected: boolean;\n onSelect: () => void;\n}) {\n const tr = useTr();\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n className={`w-full rounded-lg border p-4 text-left transition-colors ${selected ? \"border-action-primary-bg bg-action-primary-bg/10\" : \"border-border-secondary bg-background-secondary hover:border-action-primary-bg/60\"}`}\n aria-pressed={selected}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium text-text-primary\">\n {sink.name || sink.key}\n </p>\n <p className=\"mt-1 truncate font-mono text-xs text-text-secondary\">\n {sink.key}\n </p>\n </div>\n <span className=\"shrink-0 rounded-full bg-background-tertiary px-2 py-0.5 text-xs text-text-secondary\">\n {sink.status}\n </span>\n </div>\n <div className=\"mt-3 flex items-center justify-between text-xs text-text-secondary\">\n <span>{formatBytes(sink.sizeBytes)}</span>\n <span>\n {sink.linkedWorkflowCount}{\" \"}\n {tr(\"fluidgrids.dataSinks.workflows\", \"workflows\")}\n </span>\n </div>\n </button>\n );\n}\n\nexport function DataSinkDashboardPage() {\n const tr = useTr();\n const [search, setSearch] = useState(\"\");\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const { sinks, totalCount, loading, error, refetch } = useDataSinks(search);\n const selectedSink = useMemo(\n () => sinks.find((sink) => sink.id === selectedId) ?? sinks[0] ?? null,\n [selectedId, sinks],\n );\n const {\n sinkData,\n loading: dataLoading,\n error: dataError,\n refetch: refetchData,\n } = useDataSinkData(selectedSink);\n\n useEffect(() => {\n if (selectedSink && selectedSink.id !== selectedId)\n setSelectedId(selectedSink.id);\n }, [selectedId, selectedSink]);\n\n const payload = sinkData?.extracted ?? sinkData?.raw;\n const totalBytes = sinks.reduce((total, sink) => total + sink.sizeBytes, 0);\n\n return (\n <div className=\"min-h-screen bg-background-primary p-4 sm:p-6\">\n <header className=\"mb-6 flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {tr(\"fluidgrids.dataSinks.kicker\", \"BigConsole data\")}\n </p>\n <h1 className=\"mt-1 text-2xl font-semibold text-text-primary sm:text-3xl\">\n {tr(\"fluidgrids.dataSinks.title\", \"DataSink dashboard\")}\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.dataSinks.subtitle\",\n \"Inspect workflow-produced data and its freshness without leaving FluidGrids.\",\n )}\n </p>\n </div>\n <Button\n variant=\"outline\"\n onClick={() => void refetch()}\n disabled={loading}\n >\n <Icon icon=\"mdi:refresh\" className=\"mr-1\" width={16} />\n {tr(\"fluidgrids.dataSinks.refresh\", \"Refresh\")}\n </Button>\n </header>\n\n <section className=\"mb-6 grid gap-4 sm:grid-cols-3\">\n <div className=\"rounded-xl border border-border-secondary bg-background-secondary p-4\">\n <p className=\"text-sm text-text-secondary\">\n {tr(\"fluidgrids.dataSinks.totalSinks\", \"DataSinks\")}\n </p>\n <p className=\"mt-2 text-2xl font-semibold text-text-primary\">\n {totalCount}\n </p>\n </div>\n <div className=\"rounded-xl border border-border-secondary bg-background-secondary p-4\">\n <p className=\"text-sm text-text-secondary\">\n {tr(\"fluidgrids.dataSinks.activeSinks\", \"Active sinks\")}\n </p>\n <p className=\"mt-2 text-2xl font-semibold text-status-success-text\">\n {sinks.filter((sink) => sink.isActive).length}\n </p>\n </div>\n <div className=\"rounded-xl border border-border-secondary bg-background-secondary p-4\">\n <p className=\"text-sm text-text-secondary\">\n {tr(\"fluidgrids.dataSinks.totalStorage\", \"Visible storage\")}\n </p>\n <p className=\"mt-2 text-2xl font-semibold text-text-primary\">\n {formatBytes(totalBytes)}\n </p>\n </div>\n </section>\n\n {error && (\n <div\n role=\"alert\"\n className=\"mb-6 rounded-lg border border-status-error-border bg-status-error-bg-subtle p-4 text-sm text-status-error-text\"\n >\n {error.message}\n </div>\n )}\n <div className=\"grid gap-6 xl:grid-cols-[22rem_minmax(0,1fr)]\">\n <aside className=\"space-y-3\">\n <Input\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n placeholder={tr(\n \"fluidgrids.dataSinks.search\",\n \"Search by name or key\",\n )}\n aria-label={tr(\n \"fluidgrids.dataSinks.search\",\n \"Search by name or key\",\n )}\n />\n {loading && sinks.length === 0 && (\n <p className=\"p-4 text-sm text-text-secondary\">\n {tr(\"fluidgrids.dataSinks.loading\", \"Loading DataSinks…\")}\n </p>\n )}\n {!loading && sinks.length === 0 && (\n <div className=\"rounded-lg border border-dashed border-border-secondary p-6 text-center text-sm text-text-secondary\">\n {tr(\"fluidgrids.dataSinks.empty\", \"No active DataSinks found.\")}\n </div>\n )}\n {sinks.map((sink) => (\n <SinkCard\n key={sink.id}\n sink={sink}\n selected={sink.id === selectedSink?.id}\n onSelect={() => setSelectedId(sink.id)}\n />\n ))}\n </aside>\n\n <main className=\"min-w-0 rounded-xl border border-border-secondary bg-background-secondary p-5\">\n {!selectedSink && (\n <div className=\"flex min-h-64 flex-col items-center justify-center text-center\">\n <Icon\n icon=\"mdi:database-outline\"\n className=\"mb-3 text-text-secondary\"\n width={40}\n />\n <p className=\"font-medium text-text-primary\">\n {tr(\"fluidgrids.dataSinks.selectTitle\", \"Select a DataSink\")}\n </p>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.dataSinks.selectDescription\",\n \"Choose a sink to inspect its latest payload.\",\n )}\n </p>\n </div>\n )}\n {selectedSink && (\n <>\n <div className=\"mb-5 flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"min-w-0\">\n <h2 className=\"truncate text-lg font-semibold text-text-primary\">\n {selectedSink.name || selectedSink.key}\n </h2>\n <p className=\"mt-1 font-mono text-xs text-text-secondary\">\n {selectedSink.key} ·{\" \"}\n {tr(\"fluidgrids.dataSinks.updated\", \"Updated\")}{\" \"}\n {new Date(selectedSink.lastRefreshedAt).toLocaleString()}\n </p>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => void refetchData()}\n disabled={dataLoading}\n >\n <Icon\n icon=\"mdi:database-refresh-outline\"\n className=\"mr-1\"\n width={16}\n />\n {tr(\"fluidgrids.dataSinks.refreshPayload\", \"Refresh payload\")}\n </Button>\n </div>\n {dataError && (\n <div\n role=\"alert\"\n className=\"mb-4 rounded-lg border border-status-error-border bg-status-error-bg-subtle p-3 text-sm text-status-error-text\"\n >\n {dataError.message}\n </div>\n )}\n {dataLoading && !sinkData && (\n <div className=\"h-64 animate-pulse rounded-lg bg-background-primary\" />\n )}\n {!dataLoading && sinkData && (\n <>\n <div className=\"mb-4 flex flex-wrap gap-3 text-xs text-text-secondary\">\n <span>\n {sinkData.cached\n ? tr(\"fluidgrids.dataSinks.cached\", \"Cached\")\n : tr(\"fluidgrids.dataSinks.fresh\", \"Fresh\")}\n </span>\n <span>v{sinkData.version}</span>\n {sinkData.totalCount !== null &&\n sinkData.totalCount !== undefined && (\n <span>{sinkData.totalCount} rows</span>\n )}\n </div>\n <DataPreview value={payload} />\n </>\n )}\n </>\n )}\n </main>\n </div>\n </div>\n );\n}\n","import { useMemo, useState } from \"react\";\nimport { useNavigate } from \"react-router\";\nimport { Icon } from \"@iconify/react\";\nimport { toast } from \"sonner\";\nimport { Button } from \"@burdenoff/fe-libs/button\";\nimport { useTr } from \"../../../hooks/useTr\";\nimport {\n useInsightsData,\n useRunReplayActions,\n} from \"../hooks/useObservability\";\nimport {\n formatDuration,\n getFailureBreakdown,\n getTopFailingNodes,\n getTopFailingWorkflows,\n percentage,\n} from \"../utils\";\nimport type { DashboardSummary, FailedRun } from \"../types\";\n\nfunction normalizedRate(summary: DashboardSummary): number {\n const supplied = summary.workflowSuccessRate;\n if (supplied !== null && supplied !== undefined) {\n return supplied <= 1 ? supplied * 100 : supplied;\n }\n const finished = summary.runsCompletedCount + summary.runsFailedCount;\n return percentage(summary.runsCompletedCount, finished);\n}\n\nfunction MetricCard({\n icon,\n label,\n value,\n detail,\n tone = \"text-text-primary\",\n}: {\n icon: string;\n label: string;\n value: string;\n detail?: string;\n tone?: string;\n}) {\n return (\n <div className=\"rounded-xl border border-border-secondary bg-background-secondary p-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Icon icon={icon} width={18} />\n <span>{label}</span>\n </div>\n <p className={`mt-3 text-2xl font-semibold ${tone}`}>{value}</p>\n {detail && <p className=\"mt-1 text-xs text-text-secondary\">{detail}</p>}\n </div>\n );\n}\n\nfunction LoadingState() {\n return (\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\" aria-busy=\"true\">\n {[1, 2, 3, 4].map((item) => (\n <div\n key={item}\n className=\"h-28 animate-pulse rounded-xl border border-border-secondary bg-background-secondary\"\n />\n ))}\n </div>\n );\n}\n\nexport interface InsightsPageProps {\n showErrors?: boolean;\n}\n\nexport function InsightsPage({ showErrors = false }: InsightsPageProps) {\n const tr = useTr();\n const navigate = useNavigate();\n const { summary, failedRuns, loading, error, refetch } = useInsightsData();\n const { retryMany, loading: retryLoading } = useRunReplayActions();\n const [activeTab, setActiveTab] = useState<\"overview\" | \"errors\">(\n showErrors ? \"errors\" : \"overview\",\n );\n\n const failureBreakdown = useMemo(\n () => getFailureBreakdown(failedRuns),\n [failedRuns],\n );\n const topWorkflows = useMemo(\n () => getTopFailingWorkflows(failedRuns).slice(0, 8),\n [failedRuns],\n );\n const topNodes = useMemo(\n () => getTopFailingNodes(summary?.nodeUsageStats ?? []).slice(0, 8),\n [summary?.nodeUsageStats],\n );\n\n const retry = async (run: FailedRun) => {\n const retried = await retryMany([run.id]);\n if (retried.length === 0) {\n toast.error(\n tr(\"fluidgrids.insights.retryFailed\", \"Could not retry the failed run\"),\n );\n return;\n }\n toast.success(\n tr(\"fluidgrids.insights.retryStarted\", \"A new run was started\"),\n );\n navigate(`../runs/${retried[0].runId}`);\n };\n\n if (error) {\n return (\n <div className=\"min-h-screen bg-background-primary p-4 sm:p-6\">\n <div\n className=\"rounded-lg border border-status-error-border bg-status-error-bg-subtle p-5 text-status-error-text\"\n role=\"alert\"\n >\n <p className=\"font-medium\">\n {tr(\"fluidgrids.insights.loadError\", \"Could not load insights\")}\n </p>\n <p className=\"mt-1 text-sm\">{error.message}</p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-3\"\n onClick={() => void refetch()}\n >\n {tr(\"fluidgrids.insights.retryLoad\", \"Try again\")}\n </Button>\n </div>\n </div>\n );\n }\n\n const successRate = summary ? normalizedRate(summary) : 0;\n const failureRate = summary\n ? percentage(summary.runsFailedCount, summary.runsCountTotal)\n : 0;\n const commonError = failureBreakdown[0];\n\n return (\n <div className=\"min-h-screen bg-background-primary p-4 sm:p-6\">\n <header className=\"mb-6 flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {tr(\"fluidgrids.insights.period\", \"Last 30 days\")}\n </p>\n <h1 className=\"mt-1 text-2xl font-semibold text-text-primary sm:text-3xl\">\n {tr(\"fluidgrids.insights.title\", \"Workflow insights\")}\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.insights.subtitle\",\n \"Understand workflow health, failures, and the nodes that need attention.\",\n )}\n </p>\n </div>\n <Button\n variant=\"outline\"\n onClick={() => void refetch()}\n disabled={loading}\n >\n <Icon icon=\"mdi:refresh\" className=\"mr-1\" width={16} />\n {tr(\"fluidgrids.insights.refresh\", \"Refresh\")}\n </Button>\n </header>\n\n <div\n className=\"mb-6 flex gap-1 border-b border-border-secondary\"\n role=\"tablist\"\n >\n <button\n role=\"tab\"\n aria-selected={activeTab === \"overview\"}\n onClick={() => {\n setActiveTab(\"overview\");\n if (showErrors) navigate(\"../insights\");\n }}\n className={`border-b-2 px-3 py-2 text-sm ${activeTab === \"overview\" ? \"border-action-primary-bg text-text-primary\" : \"border-transparent text-text-secondary\"}`}\n >\n {tr(\"fluidgrids.insights.overviewTab\", \"Overview\")}\n </button>\n <button\n role=\"tab\"\n aria-selected={activeTab === \"errors\"}\n onClick={() => {\n setActiveTab(\"errors\");\n if (!showErrors) navigate(\"../insights/errors\");\n }}\n className={`border-b-2 px-3 py-2 text-sm ${activeTab === \"errors\" ? \"border-action-primary-bg text-text-primary\" : \"border-transparent text-text-secondary\"}`}\n >\n {tr(\"fluidgrids.insights.errorsTab\", \"Error analytics\")}\n </button>\n </div>\n\n {loading && !summary ? (\n <LoadingState />\n ) : activeTab === \"overview\" && summary ? (\n <OverviewContent\n summary={summary}\n successRate={successRate}\n failureRate={failureRate}\n topWorkflows={topWorkflows}\n topNodes={topNodes}\n tr={tr}\n />\n ) : (\n <ErrorContent\n summary={summary}\n failedRuns={failedRuns}\n failureBreakdown={failureBreakdown}\n commonError={commonError}\n retry={retry}\n retryLoading={retryLoading}\n tr={tr}\n />\n )}\n </div>\n );\n}\n\nfunction OverviewContent({\n summary,\n successRate,\n failureRate,\n topWorkflows,\n topNodes,\n tr,\n}: {\n summary: DashboardSummary;\n successRate: number;\n failureRate: number;\n topWorkflows: ReturnType<typeof getTopFailingWorkflows>;\n topNodes: ReturnType<typeof getTopFailingNodes>;\n tr: ReturnType<typeof useTr>;\n}) {\n const totalDuration =\n summary.runsCompletedCount * (summary.avgWorkflowExecutionTimeSeconds ?? 0);\n return (\n <div className=\"space-y-6\">\n <section\n className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\"\n aria-label={tr(\"fluidgrids.insights.healthLabel\", \"Workflow health\")}\n >\n <MetricCard\n icon=\"mdi:chart-line\"\n label={tr(\"fluidgrids.insights.successRate\", \"Success rate\")}\n value={`${successRate.toFixed(1)}%`}\n detail={`${summary.runsCompletedCount.toLocaleString()} completed runs`}\n tone=\"text-status-success-text\"\n />\n <MetricCard\n icon=\"mdi:clock-outline\"\n label={tr(\"fluidgrids.insights.avgDuration\", \"Average duration\")}\n value={formatDuration(summary.avgWorkflowExecutionTimeSeconds)}\n detail={`${summary.runsCountTotal.toLocaleString()} total runs`}\n />\n <MetricCard\n icon=\"mdi:alert-circle-outline\"\n label={tr(\"fluidgrids.insights.failedRuns\", \"Failed runs\")}\n value={summary.runsFailedCount.toLocaleString()}\n detail={`${failureRate.toFixed(1)}% of all runs`}\n tone=\"text-status-error-text\"\n />\n <MetricCard\n icon=\"mdi:timer-play-outline\"\n label={tr(\n \"fluidgrids.insights.timeProcessed\",\n \"Execution time processed\",\n )}\n value={formatDuration(totalDuration)}\n detail={tr(\n \"fluidgrids.insights.timeProcessedDetail\",\n \"Based on completed runs; time-saved baselines are not configured.\",\n )}\n />\n </section>\n\n <section className=\"grid gap-6 lg:grid-cols-2\">\n <InsightList\n title={tr(\n \"fluidgrids.insights.topFailingWorkflows\",\n \"Top failing workflows\",\n )}\n empty={tr(\n \"fluidgrids.insights.noFailedWorkflows\",\n \"No failed workflows in this period.\",\n )}\n >\n {topWorkflows.map((workflow) => (\n <div key={workflow.workflowKey} className=\"flex items-center gap-3\">\n <span className=\"min-w-0 flex-1 truncate text-sm text-text-primary\">\n {workflow.label}\n </span>\n <div className=\"h-2 w-28 overflow-hidden rounded-full bg-background-tertiary\">\n <div\n className=\"h-full rounded-full bg-status-error-bg\"\n style={{\n width: `${Math.max(8, percentage(workflow.count, topWorkflows[0]?.count ?? 1))}%`,\n }}\n />\n </div>\n <span className=\"w-8 text-right text-sm font-medium text-text-secondary\">\n {workflow.count}\n </span>\n </div>\n ))}\n </InsightList>\n <InsightList\n title={tr(\"fluidgrids.insights.topFailingNodes\", \"Top failing nodes\")}\n empty={tr(\n \"fluidgrids.insights.noFailedNodes\",\n \"No node failures in this period.\",\n )}\n >\n {topNodes.map((node) => (\n <div key={node.nodeType} className=\"flex items-center gap-3\">\n <span className=\"min-w-0 flex-1 truncate text-sm text-text-primary\">\n {node.nodeType}\n </span>\n <div className=\"h-2 w-28 overflow-hidden rounded-full bg-background-tertiary\">\n <div\n className=\"h-full rounded-full bg-status-warning-bg\"\n style={{\n width: `${Math.max(8, percentage(node.failureCount, topNodes[0]?.failureCount ?? 1))}%`,\n }}\n />\n </div>\n <span className=\"w-8 text-right text-sm font-medium text-text-secondary\">\n {node.failureCount}\n </span>\n </div>\n ))}\n </InsightList>\n </section>\n </div>\n );\n}\n\nfunction InsightList({\n title,\n empty,\n children,\n}: {\n title: string;\n empty: string;\n children: React.ReactNode;\n}) {\n const hasChildren = Array.isArray(children)\n ? children.length > 0\n : Boolean(children);\n return (\n <section className=\"rounded-xl border border-border-secondary bg-background-secondary p-5\">\n <h2 className=\"mb-4 text-base font-semibold text-text-primary\">\n {title}\n </h2>\n {hasChildren ? (\n <div className=\"space-y-3\">{children}</div>\n ) : (\n <p className=\"text-sm text-text-secondary\">{empty}</p>\n )}\n </section>\n );\n}\n\nfunction ErrorContent({\n summary,\n failedRuns,\n failureBreakdown,\n commonError,\n retry,\n retryLoading,\n tr,\n}: {\n summary: DashboardSummary | null;\n failedRuns: FailedRun[];\n failureBreakdown: ReturnType<typeof getFailureBreakdown>;\n commonError?: { key: string; count: number };\n retry: (run: FailedRun) => Promise<void>;\n retryLoading: boolean;\n tr: ReturnType<typeof useTr>;\n}) {\n return (\n <div className=\"space-y-6\">\n <section className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <MetricCard\n icon=\"mdi:alert-outline\"\n label={tr(\"fluidgrids.insights.failureRate\", \"Failure rate\")}\n value={`${summary ? percentage(summary.runsFailedCount, summary.runsCountTotal).toFixed(1) : \"0.0\"}%`}\n tone=\"text-status-error-text\"\n />\n <MetricCard\n icon=\"mdi:counter\"\n label={tr(\"fluidgrids.insights.failureCount\", \"Failures captured\")}\n value={failedRuns.length.toLocaleString()}\n detail={\n summary\n ? `${summary.runsFailedCount.toLocaleString()} total recorded`\n : undefined\n }\n />\n <MetricCard\n icon=\"mdi:alert-decagram-outline\"\n label={tr(\"fluidgrids.insights.commonError\", \"Most common error\")}\n value={commonError?.key ?? \"—\"}\n detail={commonError ? `${commonError.count} occurrences` : undefined}\n />\n <MetricCard\n icon=\"mdi:repeat\"\n label={tr(\n \"fluidgrids.insights.recoveredByRetry\",\n \"Recovered by retry\",\n )}\n value=\"—\"\n detail={tr(\n \"fluidgrids.insights.retryBaselineMissing\",\n \"Retry recovery baseline is not exposed by the service yet.\",\n )}\n tone=\"text-text-secondary\"\n />\n </section>\n <section className=\"grid gap-6 lg:grid-cols-[minmax(0,1fr)_minmax(0,1.4fr)]\">\n <div className=\"rounded-xl border border-border-secondary bg-background-secondary p-5\">\n <h2 className=\"mb-4 text-base font-semibold text-text-primary\">\n {tr(\"fluidgrids.insights.errorsByType\", \"Errors by type\")}\n </h2>\n <div className=\"space-y-3\">\n {failureBreakdown.length === 0 && (\n <p className=\"text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.insights.noErrors\",\n \"No errors in this period.\",\n )}\n </p>\n )}\n {failureBreakdown.map((entry) => (\n <div key={entry.key} className=\"flex items-center gap-3\">\n <span className=\"w-28 truncate text-sm text-text-secondary\">\n {entry.key}\n </span>\n <div className=\"h-2 flex-1 overflow-hidden rounded-full bg-background-tertiary\">\n <div\n className=\"h-full rounded-full bg-status-error-bg\"\n style={{\n width: `${Math.max(8, percentage(entry.count, failureBreakdown[0]?.count ?? 1))}%`,\n }}\n />\n </div>\n <span className=\"w-8 text-right text-sm font-medium text-text-primary\">\n {entry.count}\n </span>\n </div>\n ))}\n </div>\n </div>\n <div className=\"rounded-xl border border-border-secondary bg-background-secondary p-5\">\n <div className=\"mb-4 flex items-center justify-between gap-3\">\n <h2 className=\"text-base font-semibold text-text-primary\">\n {tr(\"fluidgrids.insights.recentFailures\", \"Recent failures\")}\n </h2>\n <span className=\"text-xs text-text-secondary\">\n {tr(\n \"fluidgrids.insights.sampleNote\",\n \"Showing the latest 100 failures\",\n )}\n </span>\n </div>\n <div className=\"divide-y divide-border-secondary\">\n {failedRuns.length === 0 && (\n <p className=\"py-3 text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.insights.noRecentFailures\",\n \"No recent failures.\",\n )}\n </p>\n )}\n {failedRuns.slice(0, 12).map((run) => (\n <div\n key={run.id}\n className=\"flex flex-col gap-2 py-3 sm:flex-row sm:items-center sm:gap-4\"\n >\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-text-primary\">\n {run.errorMessage || run.errorType || \"Workflow failed\"}\n </p>\n <p className=\"mt-0.5 truncate text-xs text-text-secondary\">\n {run.workflow?.name || run.workflowKey} ·{\" \"}\n {run.id.slice(0, 10)} · {formatDuration(run.duration)}\n </p>\n </div>\n <span className=\"rounded-full bg-status-error-bg-subtle px-2 py-1 text-xs text-status-error-text\">\n {run.errorType || \"UNKNOWN\"}\n </span>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => void retry(run)}\n disabled={retryLoading}\n >\n {tr(\"fluidgrids.insights.retry\", \"Retry\")}\n </Button>\n </div>\n ))}\n </div>\n </div>\n </section>\n </div>\n );\n}\n\nexport function ErrorAnalyticsPage() {\n return <InsightsPage showErrors />;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/modules/observability/utils.ts","../src/modules/observability/pages/DataSinkDashboardPage.tsx","../src/modules/observability/pages/InsightsPage.tsx"],"names":["jsxs","jsx","Icon","useState","useMemo","Button"],"mappings":"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","file":"chunk-FAPYERDO.js","sourcesContent":["import type { FailedRun, NodeUsageStat } from \"./types\";\n\nexport interface ErrorBreakdownEntry {\n key: string;\n count: number;\n}\n\nexport interface WorkflowFailureEntry {\n workflowKey: string;\n label: string;\n count: number;\n}\n\nexport function percentage(value: number, total: number): number {\n if (total <= 0) return 0;\n return Math.round((value / total) * 1000) / 10;\n}\n\nexport function getFailureBreakdown(\n runs: readonly FailedRun[],\n): ErrorBreakdownEntry[] {\n const counts = new Map<string, number>();\n for (const run of runs) {\n const key = run.errorType || \"UNKNOWN\";\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n return [...counts.entries()]\n .map(([key, count]) => ({ key, count }))\n .sort((a, b) => b.count - a.count || a.key.localeCompare(b.key));\n}\n\nexport function getTopFailingWorkflows(\n runs: readonly FailedRun[],\n): WorkflowFailureEntry[] {\n const counts = new Map<string, WorkflowFailureEntry>();\n for (const run of runs) {\n const current = counts.get(run.workflowKey);\n if (current) {\n current.count += 1;\n } else {\n counts.set(run.workflowKey, {\n workflowKey: run.workflowKey,\n label: run.workflow?.name || run.workflowKey,\n count: 1,\n });\n }\n }\n return [...counts.values()].sort(\n (a, b) => b.count - a.count || a.label.localeCompare(b.label),\n );\n}\n\nexport function getTopFailingNodes(\n nodeUsageStats: readonly NodeUsageStat[],\n): NodeUsageStat[] {\n return [...nodeUsageStats]\n .filter((stat) => stat.failureCount > 0)\n .sort(\n (a, b) =>\n b.failureCount - a.failureCount || a.nodeType.localeCompare(b.nodeType),\n );\n}\n\nexport function formatDuration(seconds: number | null | undefined): string {\n if (seconds === null || seconds === undefined || !Number.isFinite(seconds)) {\n return \"—\";\n }\n if (seconds < 1) return `${Math.round(seconds * 1000)}ms`;\n if (seconds < 60) return `${seconds.toFixed(1)}s`;\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = Math.round(seconds % 60);\n return `${minutes}m ${remainingSeconds}s`;\n}\n\nexport function formatBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return \"—\";\n if (bytes < 1024) return `${bytes} B`;\n const units = [\"KB\", \"MB\", \"GB\", \"TB\"];\n let value = bytes / 1024;\n let unit = units[0];\n for (let i = 1; i < units.length && value >= 1024; i += 1) {\n value /= 1024;\n unit = units[i];\n }\n return `${value.toFixed(value >= 10 ? 0 : 1)} ${unit}`;\n}\n\nexport function prettyJson(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2) ?? \"null\";\n } catch {\n return String(value);\n }\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport { Button } from \"@burdenoff/fe-libs/button\";\nimport { Input } from \"@burdenoff/fe-libs/ui\";\nimport { useTr } from \"../../../hooks/useTr\";\nimport { useDataSinkData, useDataSinks } from \"../hooks/useObservability\";\nimport { formatBytes, prettyJson } from \"../utils\";\nimport type { DataSinkSummary } from \"../types\";\n\nfunction valueLabel(value: unknown): string {\n if (value === null || value === undefined) return \"—\";\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n}\n\nfunction DataPreview({ value }: { value: unknown }) {\n const tr = useTr();\n if (Array.isArray(value)) {\n const rows = value.filter(\n (item): item is Record<string, unknown> =>\n Boolean(item) && typeof item === \"object\" && !Array.isArray(item),\n );\n if (rows.length > 0) {\n const keys = [...new Set(rows.flatMap((row) => Object.keys(row)))].slice(\n 0,\n 12,\n );\n return (\n <div className=\"overflow-x-auto rounded-lg border border-border-secondary\">\n <table className=\"min-w-full text-left text-sm\">\n <thead className=\"bg-background-tertiary text-xs uppercase text-text-secondary\">\n <tr>\n {keys.map((key) => (\n <th\n key={key}\n className=\"whitespace-nowrap px-3 py-2 font-medium\"\n >\n {key}\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border-secondary\">\n {rows.slice(0, 50).map((row, index) => (\n <tr key={index} className=\"text-text-primary\">\n {keys.map((key) => (\n <td key={key} className=\"max-w-xs truncate px-3 py-2\">\n {valueLabel(row[key])}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n {rows.length > 50 && (\n <p className=\"border-t border-border-secondary px-3 py-2 text-xs text-text-secondary\">\n {tr(\n \"fluidgrids.dataSinks.previewLimit\",\n \"Showing the first 50 rows\",\n )}\n </p>\n )}\n </div>\n );\n }\n }\n return (\n <pre className=\"max-h-[28rem] overflow-auto rounded-lg border border-border-secondary bg-background-primary p-4 text-xs text-text-primary\">\n {prettyJson(value)}\n </pre>\n );\n}\n\nfunction SinkCard({\n sink,\n selected,\n onSelect,\n}: {\n sink: DataSinkSummary;\n selected: boolean;\n onSelect: () => void;\n}) {\n const tr = useTr();\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n className={`w-full rounded-lg border p-4 text-left transition-colors ${selected ? \"border-action-primary-bg bg-action-primary-bg/10\" : \"border-border-secondary bg-background-secondary hover:border-action-primary-bg/60\"}`}\n aria-pressed={selected}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium text-text-primary\">\n {sink.name || sink.key}\n </p>\n <p className=\"mt-1 truncate font-mono text-xs text-text-secondary\">\n {sink.key}\n </p>\n </div>\n <span className=\"shrink-0 rounded-full bg-background-tertiary px-2 py-0.5 text-xs text-text-secondary\">\n {sink.status}\n </span>\n </div>\n <div className=\"mt-3 flex items-center justify-between text-xs text-text-secondary\">\n <span>{formatBytes(sink.sizeBytes)}</span>\n <span>\n {sink.linkedWorkflowCount}{\" \"}\n {tr(\"fluidgrids.dataSinks.workflows\", \"workflows\")}\n </span>\n </div>\n </button>\n );\n}\n\nexport function DataSinkDashboardPage() {\n const tr = useTr();\n const [search, setSearch] = useState(\"\");\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const { sinks, totalCount, loading, error, refetch } = useDataSinks(search);\n const selectedSink = useMemo(\n () => sinks.find((sink) => sink.id === selectedId) ?? sinks[0] ?? null,\n [selectedId, sinks],\n );\n const {\n sinkData,\n loading: dataLoading,\n error: dataError,\n refetch: refetchData,\n } = useDataSinkData(selectedSink);\n\n useEffect(() => {\n if (selectedSink && selectedSink.id !== selectedId)\n setSelectedId(selectedSink.id);\n }, [selectedId, selectedSink]);\n\n const payload = sinkData?.extracted ?? sinkData?.raw;\n const totalBytes = sinks.reduce((total, sink) => total + sink.sizeBytes, 0);\n\n return (\n <div className=\"min-h-screen bg-background-primary p-4 sm:p-6\">\n <header className=\"mb-6 flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {tr(\"fluidgrids.dataSinks.kicker\", \"BigConsole data\")}\n </p>\n <h1 className=\"mt-1 text-2xl font-semibold text-text-primary sm:text-3xl\">\n {tr(\"fluidgrids.dataSinks.title\", \"DataSink dashboard\")}\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.dataSinks.subtitle\",\n \"Inspect workflow-produced data and its freshness without leaving FluidGrids.\",\n )}\n </p>\n </div>\n <Button\n variant=\"outline\"\n onClick={() => void refetch()}\n disabled={loading}\n >\n <Icon icon=\"mdi:refresh\" className=\"mr-1\" width={16} />\n {tr(\"fluidgrids.dataSinks.refresh\", \"Refresh\")}\n </Button>\n </header>\n\n <section className=\"mb-6 grid gap-4 sm:grid-cols-3\">\n <div className=\"rounded-xl border border-border-secondary bg-background-secondary p-4\">\n <p className=\"text-sm text-text-secondary\">\n {tr(\"fluidgrids.dataSinks.totalSinks\", \"DataSinks\")}\n </p>\n <p className=\"mt-2 text-2xl font-semibold text-text-primary\">\n {totalCount}\n </p>\n </div>\n <div className=\"rounded-xl border border-border-secondary bg-background-secondary p-4\">\n <p className=\"text-sm text-text-secondary\">\n {tr(\"fluidgrids.dataSinks.activeSinks\", \"Active sinks\")}\n </p>\n <p className=\"mt-2 text-2xl font-semibold text-status-success-text\">\n {sinks.filter((sink) => sink.isActive).length}\n </p>\n </div>\n <div className=\"rounded-xl border border-border-secondary bg-background-secondary p-4\">\n <p className=\"text-sm text-text-secondary\">\n {tr(\"fluidgrids.dataSinks.totalStorage\", \"Visible storage\")}\n </p>\n <p className=\"mt-2 text-2xl font-semibold text-text-primary\">\n {formatBytes(totalBytes)}\n </p>\n </div>\n </section>\n\n {error && (\n <div\n role=\"alert\"\n className=\"mb-6 rounded-lg border border-status-error-border bg-status-error-bg-subtle p-4 text-sm text-status-error-text\"\n >\n {error.message}\n </div>\n )}\n <div className=\"grid gap-6 xl:grid-cols-[22rem_minmax(0,1fr)]\">\n <aside className=\"space-y-3\">\n <Input\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n placeholder={tr(\n \"fluidgrids.dataSinks.search\",\n \"Search by name or key\",\n )}\n aria-label={tr(\n \"fluidgrids.dataSinks.search\",\n \"Search by name or key\",\n )}\n />\n {loading && sinks.length === 0 && (\n <p className=\"p-4 text-sm text-text-secondary\">\n {tr(\"fluidgrids.dataSinks.loading\", \"Loading DataSinks…\")}\n </p>\n )}\n {!loading && sinks.length === 0 && (\n <div className=\"rounded-lg border border-dashed border-border-secondary p-6 text-center text-sm text-text-secondary\">\n {tr(\"fluidgrids.dataSinks.empty\", \"No active DataSinks found.\")}\n </div>\n )}\n {sinks.map((sink) => (\n <SinkCard\n key={sink.id}\n sink={sink}\n selected={sink.id === selectedSink?.id}\n onSelect={() => setSelectedId(sink.id)}\n />\n ))}\n </aside>\n\n <main className=\"min-w-0 rounded-xl border border-border-secondary bg-background-secondary p-5\">\n {!selectedSink && (\n <div className=\"flex min-h-64 flex-col items-center justify-center text-center\">\n <Icon\n icon=\"mdi:database-outline\"\n className=\"mb-3 text-text-secondary\"\n width={40}\n />\n <p className=\"font-medium text-text-primary\">\n {tr(\"fluidgrids.dataSinks.selectTitle\", \"Select a DataSink\")}\n </p>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.dataSinks.selectDescription\",\n \"Choose a sink to inspect its latest payload.\",\n )}\n </p>\n </div>\n )}\n {selectedSink && (\n <>\n <div className=\"mb-5 flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"min-w-0\">\n <h2 className=\"truncate text-lg font-semibold text-text-primary\">\n {selectedSink.name || selectedSink.key}\n </h2>\n <p className=\"mt-1 font-mono text-xs text-text-secondary\">\n {selectedSink.key} ·{\" \"}\n {tr(\"fluidgrids.dataSinks.updated\", \"Updated\")}{\" \"}\n {new Date(selectedSink.lastRefreshedAt).toLocaleString()}\n </p>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => void refetchData()}\n disabled={dataLoading}\n >\n <Icon\n icon=\"mdi:database-refresh-outline\"\n className=\"mr-1\"\n width={16}\n />\n {tr(\"fluidgrids.dataSinks.refreshPayload\", \"Refresh payload\")}\n </Button>\n </div>\n {dataError && (\n <div\n role=\"alert\"\n className=\"mb-4 rounded-lg border border-status-error-border bg-status-error-bg-subtle p-3 text-sm text-status-error-text\"\n >\n {dataError.message}\n </div>\n )}\n {dataLoading && !sinkData && (\n <div className=\"h-64 animate-pulse rounded-lg bg-background-primary\" />\n )}\n {!dataLoading && sinkData && (\n <>\n <div className=\"mb-4 flex flex-wrap gap-3 text-xs text-text-secondary\">\n <span>\n {sinkData.cached\n ? tr(\"fluidgrids.dataSinks.cached\", \"Cached\")\n : tr(\"fluidgrids.dataSinks.fresh\", \"Fresh\")}\n </span>\n <span>v{sinkData.version}</span>\n {sinkData.totalCount !== null &&\n sinkData.totalCount !== undefined && (\n <span>{sinkData.totalCount} rows</span>\n )}\n </div>\n <DataPreview value={payload} />\n </>\n )}\n </>\n )}\n </main>\n </div>\n </div>\n );\n}\n","import { useMemo, useState } from \"react\";\nimport { useNavigate } from \"react-router\";\nimport { Icon } from \"@iconify/react\";\nimport { toast } from \"sonner\";\nimport { Button } from \"@burdenoff/fe-libs/button\";\nimport { useTr } from \"../../../hooks/useTr\";\nimport {\n useInsightsData,\n useRunReplayActions,\n} from \"../hooks/useObservability\";\nimport {\n formatDuration,\n getFailureBreakdown,\n getTopFailingNodes,\n getTopFailingWorkflows,\n percentage,\n} from \"../utils\";\nimport type { DashboardSummary, FailedRun } from \"../types\";\n\nfunction normalizedRate(summary: DashboardSummary): number {\n const supplied = summary.workflowSuccessRate;\n if (supplied !== null && supplied !== undefined) {\n return supplied <= 1 ? supplied * 100 : supplied;\n }\n const finished = summary.runsCompletedCount + summary.runsFailedCount;\n return percentage(summary.runsCompletedCount, finished);\n}\n\nfunction MetricCard({\n icon,\n label,\n value,\n detail,\n tone = \"text-text-primary\",\n}: {\n icon: string;\n label: string;\n value: string;\n detail?: string;\n tone?: string;\n}) {\n return (\n <div className=\"rounded-xl border border-border-secondary bg-background-secondary p-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Icon icon={icon} width={18} />\n <span>{label}</span>\n </div>\n <p className={`mt-3 text-2xl font-semibold ${tone}`}>{value}</p>\n {detail && <p className=\"mt-1 text-xs text-text-secondary\">{detail}</p>}\n </div>\n );\n}\n\nfunction LoadingState() {\n return (\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\" aria-busy=\"true\">\n {[1, 2, 3, 4].map((item) => (\n <div\n key={item}\n className=\"h-28 animate-pulse rounded-xl border border-border-secondary bg-background-secondary\"\n />\n ))}\n </div>\n );\n}\n\nexport interface InsightsPageProps {\n showErrors?: boolean;\n}\n\nexport function InsightsPage({ showErrors = false }: InsightsPageProps) {\n const tr = useTr();\n const navigate = useNavigate();\n const { summary, failedRuns, loading, error, refetch } = useInsightsData();\n const { retryMany, loading: retryLoading } = useRunReplayActions();\n const [activeTab, setActiveTab] = useState<\"overview\" | \"errors\">(\n showErrors ? \"errors\" : \"overview\",\n );\n\n const failureBreakdown = useMemo(\n () => getFailureBreakdown(failedRuns),\n [failedRuns],\n );\n const topWorkflows = useMemo(\n () => getTopFailingWorkflows(failedRuns).slice(0, 8),\n [failedRuns],\n );\n const topNodes = useMemo(\n () => getTopFailingNodes(summary?.nodeUsageStats ?? []).slice(0, 8),\n [summary?.nodeUsageStats],\n );\n\n const retry = async (run: FailedRun) => {\n const retried = await retryMany([run.id]);\n if (retried.length === 0) {\n toast.error(\n tr(\"fluidgrids.insights.retryFailed\", \"Could not retry the failed run\"),\n );\n return;\n }\n toast.success(\n tr(\"fluidgrids.insights.retryStarted\", \"A new run was started\"),\n );\n navigate(`../runs/${retried[0].runId}`);\n };\n\n if (error) {\n return (\n <div className=\"min-h-screen bg-background-primary p-4 sm:p-6\">\n <div\n className=\"rounded-lg border border-status-error-border bg-status-error-bg-subtle p-5 text-status-error-text\"\n role=\"alert\"\n >\n <p className=\"font-medium\">\n {tr(\"fluidgrids.insights.loadError\", \"Could not load insights\")}\n </p>\n <p className=\"mt-1 text-sm\">{error.message}</p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-3\"\n onClick={() => void refetch()}\n >\n {tr(\"fluidgrids.insights.retryLoad\", \"Try again\")}\n </Button>\n </div>\n </div>\n );\n }\n\n const successRate = summary ? normalizedRate(summary) : 0;\n const failureRate = summary\n ? percentage(summary.runsFailedCount, summary.runsCountTotal)\n : 0;\n const commonError = failureBreakdown[0];\n\n return (\n <div className=\"min-h-screen bg-background-primary p-4 sm:p-6\">\n <header className=\"mb-6 flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {tr(\"fluidgrids.insights.period\", \"Last 30 days\")}\n </p>\n <h1 className=\"mt-1 text-2xl font-semibold text-text-primary sm:text-3xl\">\n {tr(\"fluidgrids.insights.title\", \"Workflow insights\")}\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.insights.subtitle\",\n \"Understand workflow health, failures, and the nodes that need attention.\",\n )}\n </p>\n </div>\n <Button\n variant=\"outline\"\n onClick={() => void refetch()}\n disabled={loading}\n >\n <Icon icon=\"mdi:refresh\" className=\"mr-1\" width={16} />\n {tr(\"fluidgrids.insights.refresh\", \"Refresh\")}\n </Button>\n </header>\n\n <div\n className=\"mb-6 flex gap-1 border-b border-border-secondary\"\n role=\"tablist\"\n >\n <button\n role=\"tab\"\n aria-selected={activeTab === \"overview\"}\n onClick={() => {\n setActiveTab(\"overview\");\n if (showErrors) navigate(\"../insights\");\n }}\n className={`border-b-2 px-3 py-2 text-sm ${activeTab === \"overview\" ? \"border-action-primary-bg text-text-primary\" : \"border-transparent text-text-secondary\"}`}\n >\n {tr(\"fluidgrids.insights.overviewTab\", \"Overview\")}\n </button>\n <button\n role=\"tab\"\n aria-selected={activeTab === \"errors\"}\n onClick={() => {\n setActiveTab(\"errors\");\n if (!showErrors) navigate(\"../insights/errors\");\n }}\n className={`border-b-2 px-3 py-2 text-sm ${activeTab === \"errors\" ? \"border-action-primary-bg text-text-primary\" : \"border-transparent text-text-secondary\"}`}\n >\n {tr(\"fluidgrids.insights.errorsTab\", \"Error analytics\")}\n </button>\n </div>\n\n {loading && !summary ? (\n <LoadingState />\n ) : activeTab === \"overview\" && summary ? (\n <OverviewContent\n summary={summary}\n successRate={successRate}\n failureRate={failureRate}\n topWorkflows={topWorkflows}\n topNodes={topNodes}\n tr={tr}\n />\n ) : (\n <ErrorContent\n summary={summary}\n failedRuns={failedRuns}\n failureBreakdown={failureBreakdown}\n commonError={commonError}\n retry={retry}\n retryLoading={retryLoading}\n tr={tr}\n />\n )}\n </div>\n );\n}\n\nfunction OverviewContent({\n summary,\n successRate,\n failureRate,\n topWorkflows,\n topNodes,\n tr,\n}: {\n summary: DashboardSummary;\n successRate: number;\n failureRate: number;\n topWorkflows: ReturnType<typeof getTopFailingWorkflows>;\n topNodes: ReturnType<typeof getTopFailingNodes>;\n tr: ReturnType<typeof useTr>;\n}) {\n const totalDuration =\n summary.runsCompletedCount * (summary.avgWorkflowExecutionTimeSeconds ?? 0);\n return (\n <div className=\"space-y-6\">\n <section\n className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\"\n aria-label={tr(\"fluidgrids.insights.healthLabel\", \"Workflow health\")}\n >\n <MetricCard\n icon=\"mdi:chart-line\"\n label={tr(\"fluidgrids.insights.successRate\", \"Success rate\")}\n value={`${successRate.toFixed(1)}%`}\n detail={`${summary.runsCompletedCount.toLocaleString()} completed runs`}\n tone=\"text-status-success-text\"\n />\n <MetricCard\n icon=\"mdi:clock-outline\"\n label={tr(\"fluidgrids.insights.avgDuration\", \"Average duration\")}\n value={formatDuration(summary.avgWorkflowExecutionTimeSeconds)}\n detail={`${summary.runsCountTotal.toLocaleString()} total runs`}\n />\n <MetricCard\n icon=\"mdi:alert-circle-outline\"\n label={tr(\"fluidgrids.insights.failedRuns\", \"Failed runs\")}\n value={summary.runsFailedCount.toLocaleString()}\n detail={`${failureRate.toFixed(1)}% of all runs`}\n tone=\"text-status-error-text\"\n />\n <MetricCard\n icon=\"mdi:timer-play-outline\"\n label={tr(\n \"fluidgrids.insights.timeProcessed\",\n \"Execution time processed\",\n )}\n value={formatDuration(totalDuration)}\n detail={tr(\n \"fluidgrids.insights.timeProcessedDetail\",\n \"Based on completed runs; time-saved baselines are not configured.\",\n )}\n />\n </section>\n\n <section className=\"grid gap-6 lg:grid-cols-2\">\n <InsightList\n title={tr(\n \"fluidgrids.insights.topFailingWorkflows\",\n \"Top failing workflows\",\n )}\n empty={tr(\n \"fluidgrids.insights.noFailedWorkflows\",\n \"No failed workflows in this period.\",\n )}\n >\n {topWorkflows.map((workflow) => (\n <div key={workflow.workflowKey} className=\"flex items-center gap-3\">\n <span className=\"min-w-0 flex-1 truncate text-sm text-text-primary\">\n {workflow.label}\n </span>\n <div className=\"h-2 w-28 overflow-hidden rounded-full bg-background-tertiary\">\n <div\n className=\"h-full rounded-full bg-status-error-bg\"\n style={{\n width: `${Math.max(8, percentage(workflow.count, topWorkflows[0]?.count ?? 1))}%`,\n }}\n />\n </div>\n <span className=\"w-8 text-right text-sm font-medium text-text-secondary\">\n {workflow.count}\n </span>\n </div>\n ))}\n </InsightList>\n <InsightList\n title={tr(\"fluidgrids.insights.topFailingNodes\", \"Top failing nodes\")}\n empty={tr(\n \"fluidgrids.insights.noFailedNodes\",\n \"No node failures in this period.\",\n )}\n >\n {topNodes.map((node) => (\n <div key={node.nodeType} className=\"flex items-center gap-3\">\n <span className=\"min-w-0 flex-1 truncate text-sm text-text-primary\">\n {node.nodeType}\n </span>\n <div className=\"h-2 w-28 overflow-hidden rounded-full bg-background-tertiary\">\n <div\n className=\"h-full rounded-full bg-status-warning-bg\"\n style={{\n width: `${Math.max(8, percentage(node.failureCount, topNodes[0]?.failureCount ?? 1))}%`,\n }}\n />\n </div>\n <span className=\"w-8 text-right text-sm font-medium text-text-secondary\">\n {node.failureCount}\n </span>\n </div>\n ))}\n </InsightList>\n </section>\n </div>\n );\n}\n\nfunction InsightList({\n title,\n empty,\n children,\n}: {\n title: string;\n empty: string;\n children: React.ReactNode;\n}) {\n const hasChildren = Array.isArray(children)\n ? children.length > 0\n : Boolean(children);\n return (\n <section className=\"rounded-xl border border-border-secondary bg-background-secondary p-5\">\n <h2 className=\"mb-4 text-base font-semibold text-text-primary\">\n {title}\n </h2>\n {hasChildren ? (\n <div className=\"space-y-3\">{children}</div>\n ) : (\n <p className=\"text-sm text-text-secondary\">{empty}</p>\n )}\n </section>\n );\n}\n\nfunction ErrorContent({\n summary,\n failedRuns,\n failureBreakdown,\n commonError,\n retry,\n retryLoading,\n tr,\n}: {\n summary: DashboardSummary | null;\n failedRuns: FailedRun[];\n failureBreakdown: ReturnType<typeof getFailureBreakdown>;\n commonError?: { key: string; count: number };\n retry: (run: FailedRun) => Promise<void>;\n retryLoading: boolean;\n tr: ReturnType<typeof useTr>;\n}) {\n return (\n <div className=\"space-y-6\">\n <section className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <MetricCard\n icon=\"mdi:alert-outline\"\n label={tr(\"fluidgrids.insights.failureRate\", \"Failure rate\")}\n value={`${summary ? percentage(summary.runsFailedCount, summary.runsCountTotal).toFixed(1) : \"0.0\"}%`}\n tone=\"text-status-error-text\"\n />\n <MetricCard\n icon=\"mdi:counter\"\n label={tr(\"fluidgrids.insights.failureCount\", \"Failures captured\")}\n value={failedRuns.length.toLocaleString()}\n detail={\n summary\n ? `${summary.runsFailedCount.toLocaleString()} total recorded`\n : undefined\n }\n />\n <MetricCard\n icon=\"mdi:alert-decagram-outline\"\n label={tr(\"fluidgrids.insights.commonError\", \"Most common error\")}\n value={commonError?.key ?? \"—\"}\n detail={commonError ? `${commonError.count} occurrences` : undefined}\n />\n <MetricCard\n icon=\"mdi:repeat\"\n label={tr(\n \"fluidgrids.insights.recoveredByRetry\",\n \"Recovered by retry\",\n )}\n value=\"—\"\n detail={tr(\n \"fluidgrids.insights.retryBaselineMissing\",\n \"Retry recovery baseline is not exposed by the service yet.\",\n )}\n tone=\"text-text-secondary\"\n />\n </section>\n <section className=\"grid gap-6 lg:grid-cols-[minmax(0,1fr)_minmax(0,1.4fr)]\">\n <div className=\"rounded-xl border border-border-secondary bg-background-secondary p-5\">\n <h2 className=\"mb-4 text-base font-semibold text-text-primary\">\n {tr(\"fluidgrids.insights.errorsByType\", \"Errors by type\")}\n </h2>\n <div className=\"space-y-3\">\n {failureBreakdown.length === 0 && (\n <p className=\"text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.insights.noErrors\",\n \"No errors in this period.\",\n )}\n </p>\n )}\n {failureBreakdown.map((entry) => (\n <div key={entry.key} className=\"flex items-center gap-3\">\n <span className=\"w-28 truncate text-sm text-text-secondary\">\n {entry.key}\n </span>\n <div className=\"h-2 flex-1 overflow-hidden rounded-full bg-background-tertiary\">\n <div\n className=\"h-full rounded-full bg-status-error-bg\"\n style={{\n width: `${Math.max(8, percentage(entry.count, failureBreakdown[0]?.count ?? 1))}%`,\n }}\n />\n </div>\n <span className=\"w-8 text-right text-sm font-medium text-text-primary\">\n {entry.count}\n </span>\n </div>\n ))}\n </div>\n </div>\n <div className=\"rounded-xl border border-border-secondary bg-background-secondary p-5\">\n <div className=\"mb-4 flex items-center justify-between gap-3\">\n <h2 className=\"text-base font-semibold text-text-primary\">\n {tr(\"fluidgrids.insights.recentFailures\", \"Recent failures\")}\n </h2>\n <span className=\"text-xs text-text-secondary\">\n {tr(\n \"fluidgrids.insights.sampleNote\",\n \"Showing the latest 100 failures\",\n )}\n </span>\n </div>\n <div className=\"divide-y divide-border-secondary\">\n {failedRuns.length === 0 && (\n <p className=\"py-3 text-sm text-text-secondary\">\n {tr(\n \"fluidgrids.insights.noRecentFailures\",\n \"No recent failures.\",\n )}\n </p>\n )}\n {failedRuns.slice(0, 12).map((run) => (\n <div\n key={run.id}\n className=\"flex flex-col gap-2 py-3 sm:flex-row sm:items-center sm:gap-4\"\n >\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-text-primary\">\n {run.errorMessage || run.errorType || \"Workflow failed\"}\n </p>\n <p className=\"mt-0.5 truncate text-xs text-text-secondary\">\n {run.workflow?.name || run.workflowKey} ·{\" \"}\n {run.id.slice(0, 10)} · {formatDuration(run.duration)}\n </p>\n </div>\n <span className=\"rounded-full bg-status-error-bg-subtle px-2 py-1 text-xs text-status-error-text\">\n {run.errorType || \"UNKNOWN\"}\n </span>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => void retry(run)}\n disabled={retryLoading}\n >\n {tr(\"fluidgrids.insights.retry\", \"Retry\")}\n </Button>\n </div>\n ))}\n </div>\n </div>\n </section>\n </div>\n );\n}\n\nexport function ErrorAnalyticsPage() {\n return <InsightsPage showErrors />;\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { FluidGridsProvider, Card, FluidGridsMark } from './chunk-
|
|
1
|
+
import { FluidGridsProvider, Card, FluidGridsMark } from './chunk-W7APOU2R.js';
|
|
2
2
|
import { Input } from './chunk-P5PKRQAO.js';
|
|
3
3
|
import { Button } from './chunk-DBOMRIP5.js';
|
|
4
4
|
import { cn } from './chunk-3ZYUGTIT.js';
|
|
5
|
-
import { useWorkflowDefinition } from './chunk-
|
|
5
|
+
import { useWorkflowDefinition } from './chunk-2C6CUHM3.js';
|
|
6
6
|
import { useFlowStore } from './chunk-3B5YEXSW.js';
|
|
7
7
|
import { useTr } from './chunk-7YWBH2A5.js';
|
|
8
8
|
import { useState, useRef, useEffect, useCallback } from 'react';
|
|
@@ -540,5 +540,5 @@ function WorkflowSearchRedirect() {
|
|
|
540
540
|
}
|
|
541
541
|
|
|
542
542
|
export { WorkflowBuilder, WorkflowBuilderCore, WorkflowSearchRedirect };
|
|
543
|
-
//# sourceMappingURL=chunk-
|
|
544
|
-
//# sourceMappingURL=chunk-
|
|
543
|
+
//# sourceMappingURL=chunk-I2766GDR.js.map
|
|
544
|
+
//# sourceMappingURL=chunk-I2766GDR.js.map
|