Loading…
- ) : ( -+ {errorCount} failure{errorCount === 1 ? '' : 's'} right now +
++ {failRate.toFixed(1)}% fail rate in the last 24h · {activeCount} of {totalCount} workflows active +
+All systems healthy
++ 0 errors · {failRate.toFixed(1)}% fail rate (24h) · {activeCount} of {totalCount} workflows active +
+-
+ {failures.slice(0, 8).map((ex) => {
+ const wf = workflows.find((w) => w.n8n_id === ex.workflow_n8n_id);
+ return (
+
-
+ ++++ + n8n +++ {ex.error_message && ( +
+ {wf?.name ?? ex.workflow_n8n_id} + error + · {timeAgo(ex.started_at)} ++ {ex.error_message} +
+ )} ++ +
+ );
+ })}
+
-
+ {anomalies.map((a, i) => (
+
-
+ {a.kind === 'stale' && (
+ ++ )} + {a.kind === 'burning' && ( +
+ {a.workflow.name} + · + + active but no run in {a.lastRun ? timeAgo(a.lastRun) : 'recorded history'} + + ++ )} + {a.kind === 'stuck' && ( ++ {a.workflow.name} + · + + {a.errorCount}/{a.totalCount} errors (100% fail rate) + + ++ )} ++ + {workflows.find((w) => w.n8n_id === a.execution.workflow_n8n_id)?.name ?? a.execution.workflow_n8n_id} + + · + + "running" for {timeAgo(a.execution.started_at)} (unusually long) + +
+ ))}
+
Loading…
+ ) : workflows.length === 0 ? ( ++ No workflows yet — the poller will sync them within 5 minutes. +
+ ) : ( +-
+ {workflows.map((wf) => {
+ const lastRun = lastRunByWorkflow.get(wf.n8n_id);
+ const isSelected = selected === wf.n8n_id;
+ return (
+
- onSelect(isSelected ? null : wf.n8n_id)}
+ className={cn(
+ 'flex cursor-pointer items-center gap-3 px-4 py-2.5 transition-colors',
+ isSelected && 'bg-accent/10 ring-1 ring-inset ring-accent/30'
+ )}
+ >
+
+ {wf.name} + {lastRun ? ( + {lastRun.status} + ) : ( +never + )} + + {lastRun ? timeAgo(lastRun.started_at) : '—'} + +
+ );
+ })}
+
Loading…
+ ) : executions.length === 0 ? ( ++ No executions synced yet. They appear here within 5 minutes of the poller's first run. +
+ ) : ( +-
+ {executions.slice(0, 50).map((ex) => {
+ const wf = workflows.find((w) => w.n8n_id === ex.workflow_n8n_id);
+ return (
+
-
+ ++
+ ++ + {timeAgo(ex.started_at)} + ++ {wf?.name ?? ex.workflow_n8n_id} ++ {ex.error_message && ex.status === 'error' && ( +{ex.status} ++ {ex.error_message} +
+ )} +
+ );
+ })}
+
+ {it.label} +
++ {it.value} + {it.sub && {it.sub}} +
+{message}
+