@datatechsolutions/ui 2.11.82 → 2.11.83

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.
@@ -2019,6 +2019,176 @@ function parseRow(row) {
2019
2019
  }
2020
2020
  }
2021
2021
  }
2022
+ var STATUS_META = {
2023
+ completed: { color: "emerald", icon: outline.CheckCircleIcon },
2024
+ running: { color: "sky", icon: outline.ArrowPathIcon },
2025
+ failed: { color: "rose", icon: outline.XCircleIcon },
2026
+ pending: { color: "amber", icon: outline.ClockIcon },
2027
+ skipped: { color: "zinc", icon: outline.MinusCircleIcon }
2028
+ };
2029
+ function ExecutionTimelinePanel({
2030
+ entries,
2031
+ labels,
2032
+ selectedNodeId,
2033
+ onSelect
2034
+ }) {
2035
+ const [internalSelected, setInternalSelected] = react.useState(null);
2036
+ const effectiveSelected = selectedNodeId ?? internalSelected;
2037
+ const selected = react.useMemo(
2038
+ () => entries.find((entry) => entry.nodeId === effectiveSelected) ?? entries[0] ?? null,
2039
+ [entries, effectiveSelected]
2040
+ );
2041
+ const handleSelect = (nodeId) => {
2042
+ if (onSelect) onSelect(nodeId);
2043
+ setInternalSelected(nodeId);
2044
+ };
2045
+ if (entries.length === 0) {
2046
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-xl border border-slate-200 bg-slate-50/60 p-6 text-center text-sm text-slate-500 dark:border-slate-700 dark:bg-slate-900/40 dark:text-slate-400", children: labels.empty ?? "\u2014" });
2047
+ }
2048
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-4 lg:grid-cols-12", children: [
2049
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3 lg:col-span-5 xl:col-span-4", children: entries.map((entry, index) => {
2050
+ const meta = STATUS_META[entry.status];
2051
+ const Icon = meta.icon;
2052
+ const isActive = (selected?.nodeId ?? "") === entry.nodeId;
2053
+ return /* @__PURE__ */ jsxRuntime.jsx(
2054
+ "button",
2055
+ {
2056
+ type: "button",
2057
+ onClick: () => handleSelect(entry.nodeId),
2058
+ className: [
2059
+ "w-full text-left rounded-xl border p-4 transition",
2060
+ isActive ? "border-indigo-400/60 bg-indigo-50/70 shadow-md dark:border-indigo-400/40 dark:bg-indigo-500/10" : "border-slate-200/60 bg-white/70 hover:border-indigo-300 hover:shadow-sm dark:border-white/10 dark:bg-white/5 dark:hover:border-indigo-400/30"
2061
+ ].join(" "),
2062
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3", children: [
2063
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center", children: [
2064
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex h-6 w-6 items-center justify-center rounded-full bg-indigo-100 text-xs font-semibold text-indigo-700 dark:bg-indigo-500/20 dark:text-indigo-200", children: index + 1 }),
2065
+ index < entries.length - 1 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mt-1 h-8 w-px bg-slate-200 dark:bg-white/10" })
2066
+ ] }),
2067
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
2068
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-2", children: [
2069
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
2070
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "truncate font-medium text-slate-900 dark:text-white", children: entry.nodeId }),
2071
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs text-slate-500 dark:text-slate-400", children: entry.nodeType })
2072
+ ] }),
2073
+ /* @__PURE__ */ jsxRuntime.jsxs(chunkTUEYBNWL_js.Badge, { color: meta.color, children: [
2074
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "mr-1 h-3 w-3" }),
2075
+ labels[entry.status]
2076
+ ] })
2077
+ ] }),
2078
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 flex items-center gap-3 text-xs text-slate-500 dark:text-slate-400", children: [
2079
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: formatDuration2(entry.durationMs) }),
2080
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\xB7" }),
2081
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: formatTimestamp(entry.startedAt) })
2082
+ ] })
2083
+ ] })
2084
+ ] })
2085
+ },
2086
+ entry.nodeId
2087
+ );
2088
+ }) }),
2089
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "lg:col-span-7 xl:col-span-8", children: selected ? /* @__PURE__ */ jsxRuntime.jsx(NodeInspector, { entry: selected, labels }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-xl border border-slate-200 bg-slate-50/60 p-6 text-center text-sm text-slate-500 dark:border-slate-700 dark:bg-slate-900/40", children: labels.selectNode }) })
2090
+ ] });
2091
+ }
2092
+ function NodeInspector({
2093
+ entry,
2094
+ labels
2095
+ }) {
2096
+ const meta = STATUS_META[entry.status];
2097
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-2xl border border-slate-200 bg-white p-5 shadow-sm dark:border-slate-700 dark:bg-slate-900/40", children: [
2098
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3 flex items-start justify-between gap-2", children: [
2099
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
2100
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "truncate text-base font-semibold text-slate-900 dark:text-white", children: entry.nodeId }),
2101
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-slate-500 dark:text-slate-400", children: entry.nodeType })
2102
+ ] }),
2103
+ /* @__PURE__ */ jsxRuntime.jsx(chunkTUEYBNWL_js.Badge, { color: meta.color, children: labels[entry.status] })
2104
+ ] }),
2105
+ /* @__PURE__ */ jsxRuntime.jsxs("dl", { className: "grid grid-cols-2 gap-3 text-xs text-slate-500 dark:text-slate-400", children: [
2106
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
2107
+ /* @__PURE__ */ jsxRuntime.jsx("dt", { className: "font-semibold", children: labels.started }),
2108
+ /* @__PURE__ */ jsxRuntime.jsx("dd", { className: "mt-0.5 text-slate-700 dark:text-slate-200", children: formatTimestamp(entry.startedAt) })
2109
+ ] }),
2110
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
2111
+ /* @__PURE__ */ jsxRuntime.jsx("dt", { className: "font-semibold", children: labels.completed }),
2112
+ /* @__PURE__ */ jsxRuntime.jsx("dd", { className: "mt-0.5 text-slate-700 dark:text-slate-200", children: formatTimestamp(entry.completedAt) })
2113
+ ] }),
2114
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
2115
+ /* @__PURE__ */ jsxRuntime.jsx("dt", { className: "font-semibold", children: labels.duration }),
2116
+ /* @__PURE__ */ jsxRuntime.jsx("dd", { className: "mt-0.5 text-slate-700 dark:text-slate-200", children: formatDuration2(entry.durationMs) })
2117
+ ] }),
2118
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
2119
+ /* @__PURE__ */ jsxRuntime.jsx("dt", { className: "font-semibold", children: labels.status }),
2120
+ /* @__PURE__ */ jsxRuntime.jsx("dd", { className: "mt-0.5 text-slate-700 dark:text-slate-200", children: labels[entry.status] })
2121
+ ] })
2122
+ ] }),
2123
+ entry.metrics && hasMetrics(entry.metrics) && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-4 rounded-lg border border-indigo-300/50 bg-indigo-50/60 p-3 text-xs dark:border-indigo-400/30 dark:bg-indigo-500/10", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-3 sm:grid-cols-3", children: [
2124
+ entry.metrics.model && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
2125
+ /* @__PURE__ */ jsxRuntime.jsx("dt", { className: "font-semibold text-indigo-700 dark:text-indigo-200", children: labels.model }),
2126
+ /* @__PURE__ */ jsxRuntime.jsxs("dd", { className: "mt-0.5 truncate text-indigo-900 dark:text-indigo-100", children: [
2127
+ entry.metrics.provider ? `${entry.metrics.provider} \xB7 ` : "",
2128
+ entry.metrics.model
2129
+ ] })
2130
+ ] }),
2131
+ (entry.metrics.tokensIn !== void 0 || entry.metrics.tokensOut !== void 0) && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
2132
+ /* @__PURE__ */ jsxRuntime.jsx("dt", { className: "font-semibold text-indigo-700 dark:text-indigo-200", children: labels.tokens }),
2133
+ /* @__PURE__ */ jsxRuntime.jsxs("dd", { className: "mt-0.5 text-indigo-900 dark:text-indigo-100", children: [
2134
+ entry.metrics.tokensIn ?? 0,
2135
+ " in \xB7 ",
2136
+ entry.metrics.tokensOut ?? 0,
2137
+ " out"
2138
+ ] })
2139
+ ] }),
2140
+ entry.metrics.costUsd !== void 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
2141
+ /* @__PURE__ */ jsxRuntime.jsx("dt", { className: "font-semibold text-indigo-700 dark:text-indigo-200", children: labels.cost }),
2142
+ /* @__PURE__ */ jsxRuntime.jsx("dd", { className: "mt-0.5 text-indigo-900 dark:text-indigo-100", children: formatCost(entry.metrics.costUsd) })
2143
+ ] })
2144
+ ] }) }),
2145
+ entry.error && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-4 rounded-lg border border-rose-300/60 bg-rose-50/60 p-3 text-xs dark:border-rose-400/30 dark:bg-rose-500/10", children: [
2146
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 font-semibold text-rose-700 dark:text-rose-300", children: [
2147
+ /* @__PURE__ */ jsxRuntime.jsx(outline.ExclamationTriangleIcon, { className: "h-4 w-4" }),
2148
+ labels.error
2149
+ ] }),
2150
+ /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "mt-2 whitespace-pre-wrap break-words text-rose-800 dark:text-rose-200", children: entry.error })
2151
+ ] }),
2152
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-4 space-y-3", children: [
2153
+ /* @__PURE__ */ jsxRuntime.jsx(JsonBlock, { title: labels.inputs, value: entry.inputs }),
2154
+ /* @__PURE__ */ jsxRuntime.jsx(JsonBlock, { title: labels.outputs, value: entry.outputs })
2155
+ ] })
2156
+ ] });
2157
+ }
2158
+ function JsonBlock({ title, value }) {
2159
+ const hasValue = value && Object.keys(value).length > 0;
2160
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg border border-slate-200/60 bg-slate-50/60 p-3 dark:border-white/10 dark:bg-white/5", children: [
2161
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-1 text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400", children: title }),
2162
+ hasValue ? /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "max-h-72 overflow-auto whitespace-pre text-xs text-slate-800 dark:text-slate-200", children: JSON.stringify(value, null, 2) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs italic text-slate-400 dark:text-slate-500", children: "\u2014" })
2163
+ ] });
2164
+ }
2165
+ function hasMetrics(metrics) {
2166
+ return Boolean(
2167
+ metrics.model || metrics.tokensIn !== void 0 || metrics.tokensOut !== void 0 || metrics.costUsd !== void 0
2168
+ );
2169
+ }
2170
+ function formatDuration2(ms) {
2171
+ if (ms === null) return "\u2014";
2172
+ if (ms < 1e3) return `${ms}ms`;
2173
+ if (ms < 6e4) return `${(ms / 1e3).toFixed(1)}s`;
2174
+ const mins = Math.floor(ms / 6e4);
2175
+ const secs = Math.floor(ms % 6e4 / 1e3);
2176
+ return `${mins}m${secs}s`;
2177
+ }
2178
+ function formatCost(usd) {
2179
+ if (usd === 0) return "$0";
2180
+ if (usd < 0.01) return `$${usd.toFixed(4)}`;
2181
+ if (usd < 1) return `$${usd.toFixed(3)}`;
2182
+ return `$${usd.toFixed(2)}`;
2183
+ }
2184
+ function formatTimestamp(iso) {
2185
+ if (!iso) return "\u2014";
2186
+ return new Date(iso).toLocaleString(void 0, {
2187
+ hour: "2-digit",
2188
+ minute: "2-digit",
2189
+ second: "2-digit"
2190
+ });
2191
+ }
2022
2192
 
2023
2193
  // src/astrlabe/components/rules/types.ts
2024
2194
  var RULE_STATUS_OPTIONS = ["draft", "active", "archived"];
@@ -3304,7 +3474,7 @@ function VersionHistoryPanel({
3304
3474
  loadVersions();
3305
3475
  }
3306
3476
  }, [open, loadVersions]);
3307
- const formatTimestamp2 = react.useCallback((timestamp) => {
3477
+ const formatTimestamp3 = react.useCallback((timestamp) => {
3308
3478
  try {
3309
3479
  const date = new Date(timestamp);
3310
3480
  return new Intl.DateTimeFormat(void 0, {
@@ -3375,7 +3545,7 @@ function VersionHistoryPanel({
3375
3545
  isCurrentVersion && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "rounded-full bg-blue-100 px-2 py-0.5 text-[10px] font-medium text-blue-700 dark:bg-blue-500/20 dark:text-blue-300", children: translations("current") })
3376
3546
  ] }) }),
3377
3547
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-1 text-xs text-gray-500 dark:text-gray-400", children: [
3378
- /* @__PURE__ */ jsxRuntime.jsx("div", { children: formatTimestamp2(version.publishedAt) }),
3548
+ /* @__PURE__ */ jsxRuntime.jsx("div", { children: formatTimestamp3(version.publishedAt) }),
3379
3549
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-0.5", children: [
3380
3550
  translations("publishedBy"),
3381
3551
  ": ",
@@ -3455,7 +3625,7 @@ var STATUS_CONFIG = {
3455
3625
  label: "error"
3456
3626
  }
3457
3627
  };
3458
- function formatDuration2(durationMs) {
3628
+ function formatDuration3(durationMs) {
3459
3629
  if (durationMs < 1e3) {
3460
3630
  return `${durationMs}ms`;
3461
3631
  }
@@ -3549,7 +3719,7 @@ function RunPanel({ open, onClose, onRun, onStop }) {
3549
3719
  ] }),
3550
3720
  result?.error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-0.5 truncate text-xs text-red-500 dark:text-red-400", children: result.error })
3551
3721
  ] }),
3552
- result?.durationMs !== void 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-shrink-0 text-xs text-gray-500 dark:text-gray-400", children: formatDuration2(result.durationMs) })
3722
+ result?.durationMs !== void 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-shrink-0 text-xs text-gray-500 dark:text-gray-400", children: formatDuration3(result.durationMs) })
3553
3723
  ]
3554
3724
  },
3555
3725
  node.id
@@ -3950,12 +4120,12 @@ var STATUS_STYLES = {
3950
4120
  error: { icon: outline.ExclamationCircleIcon, colorClass: "text-red-500" },
3951
4121
  skipped: { icon: outline.ClockIcon, colorClass: "text-gray-400" }
3952
4122
  };
3953
- function formatDuration3(durationMs) {
4123
+ function formatDuration4(durationMs) {
3954
4124
  if (durationMs === null) return "\u2014";
3955
4125
  if (durationMs < 1e3) return `${durationMs}ms`;
3956
4126
  return `${(durationMs / 1e3).toFixed(1)}s`;
3957
4127
  }
3958
- function formatTimestamp(timestamp) {
4128
+ function formatTimestamp2(timestamp) {
3959
4129
  const date = new Date(timestamp);
3960
4130
  return date.toLocaleTimeString(void 0, { hour: "2-digit", minute: "2-digit", second: "2-digit" });
3961
4131
  }
@@ -4012,7 +4182,7 @@ function PreviewPanel({ open, onClose, workflowId, loadRuns }) {
4012
4182
  /* @__PURE__ */ jsxRuntime.jsx(StatusIcon, { className: `h-3.5 w-3.5 ${statusStyle.colorClass}` }),
4013
4183
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-gray-700 dark:text-gray-300", children: nodeId.slice(0, 8) })
4014
4184
  ] }),
4015
- result.durationMs !== void 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-gray-400", children: formatDuration3(result.durationMs) })
4185
+ result.durationMs !== void 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-gray-400", children: formatDuration4(result.durationMs) })
4016
4186
  ] }, nodeId);
4017
4187
  }) })
4018
4188
  ] }),
@@ -4028,7 +4198,7 @@ function PreviewPanel({ open, onClose, workflowId, loadRuns }) {
4028
4198
  ] }),
4029
4199
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between", children: [
4030
4200
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-gray-500", children: t("duration") }),
4031
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-gray-700 dark:text-gray-300", children: formatDuration3(selectedNode.durationMs) })
4201
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-gray-700 dark:text-gray-300", children: formatDuration4(selectedNode.durationMs) })
4032
4202
  ] }),
4033
4203
  selectedNode.error && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
4034
4204
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-red-500", children: t("error") }),
@@ -4065,9 +4235,9 @@ function PreviewPanel({ open, onClose, workflowId, loadRuns }) {
4065
4235
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
4066
4236
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
4067
4237
  /* @__PURE__ */ jsxRuntime.jsx(StatusIcon, { className: `h-3.5 w-3.5 ${statusStyle.colorClass}` }),
4068
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-medium text-gray-900 dark:text-white", children: formatTimestamp(run.createdAt) })
4238
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-medium text-gray-900 dark:text-white", children: formatTimestamp2(run.createdAt) })
4069
4239
  ] }),
4070
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] text-gray-400", children: formatDuration3(run.totalDurationMs) })
4240
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] text-gray-400", children: formatDuration4(run.totalDurationMs) })
4071
4241
  ] }),
4072
4242
  run.error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 truncate text-[10px] text-red-500", children: run.error })
4073
4243
  ]
@@ -4091,7 +4261,7 @@ function PreviewPanel({ open, onClose, workflowId, loadRuns }) {
4091
4261
  /* @__PURE__ */ jsxRuntime.jsx(NodeStatusIcon, { className: `h-3 w-3 ${nodeStatusStyle.colorClass}` }),
4092
4262
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-gray-700 dark:text-gray-300", children: nodeResult.nodeType })
4093
4263
  ] }),
4094
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] text-gray-400", children: formatDuration3(nodeResult.durationMs) })
4264
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] text-gray-400", children: formatDuration4(nodeResult.durationMs) })
4095
4265
  ]
4096
4266
  },
4097
4267
  nodeResult.nodeId
@@ -4785,6 +4955,7 @@ exports.AutoSaveWorkspace = AutoSaveWorkspace;
4785
4955
  exports.DslExportModal = DslExportModal;
4786
4956
  exports.DslImportModal = DslImportModal;
4787
4957
  exports.DynamicIslandConfirm = DynamicIslandConfirm2;
4958
+ exports.ExecutionTimelinePanel = ExecutionTimelinePanel;
4788
4959
  exports.MetaLlamaIcon = MetaLlamaIcon;
4789
4960
  exports.NodePalette = NodePalette;
4790
4961
  exports.OutputSchemaBuilder = OutputSchemaBuilder;
@@ -4821,5 +4992,5 @@ exports.useNodeResults = useNodeResults;
4821
4992
  exports.useSelectedNodeCount = useSelectedNodeCount;
4822
4993
  exports.useSubworkflowStore = useSubworkflowStore;
4823
4994
  exports.useUndoRedo = useUndoRedo;
4824
- //# sourceMappingURL=chunk-K4QJV3GC.js.map
4825
- //# sourceMappingURL=chunk-K4QJV3GC.js.map
4995
+ //# sourceMappingURL=chunk-JFWZHROG.js.map
4996
+ //# sourceMappingURL=chunk-JFWZHROG.js.map