@datatechsolutions/ui 2.11.82 → 2.11.84

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/dist/astrlabe/index.d.mts +2 -2
  2. package/dist/astrlabe/index.d.ts +2 -2
  3. package/dist/astrlabe/index.js +110 -106
  4. package/dist/astrlabe/index.mjs +4 -4
  5. package/dist/astrlabe/workflow-canvas.js +4 -4
  6. package/dist/astrlabe/workflow-canvas.mjs +3 -3
  7. package/dist/chunk-3T2WGL47.js +44 -0
  8. package/dist/chunk-3T2WGL47.js.map +1 -0
  9. package/dist/{chunk-HAZP5J67.mjs → chunk-63AL2RN5.mjs} +187 -17
  10. package/dist/chunk-63AL2RN5.mjs.map +1 -0
  11. package/dist/chunk-64G2HBRQ.mjs +481 -0
  12. package/dist/chunk-64G2HBRQ.mjs.map +1 -0
  13. package/dist/{chunk-J3OYJ44D.mjs → chunk-BH2AU3LG.mjs} +3 -3
  14. package/dist/{chunk-J3OYJ44D.mjs.map → chunk-BH2AU3LG.mjs.map} +1 -1
  15. package/dist/chunk-CCRBT7TA.mjs +941 -0
  16. package/dist/chunk-CCRBT7TA.mjs.map +1 -0
  17. package/dist/chunk-CHLJUSXX.mjs +128 -0
  18. package/dist/chunk-CHLJUSXX.mjs.map +1 -0
  19. package/dist/chunk-CXIQWPBH.js +214 -0
  20. package/dist/chunk-CXIQWPBH.js.map +1 -0
  21. package/dist/chunk-EDE36MKE.mjs +412 -0
  22. package/dist/chunk-EDE36MKE.mjs.map +1 -0
  23. package/dist/{chunk-M7P2TQ6X.js → chunk-EFREXNZB.js} +64 -64
  24. package/dist/{chunk-M7P2TQ6X.js.map → chunk-EFREXNZB.js.map} +1 -1
  25. package/dist/chunk-FAGDZEKM.js +23 -0
  26. package/dist/chunk-FAGDZEKM.js.map +1 -0
  27. package/dist/{chunk-TUEYBNWL.js → chunk-GV6WJCEB.js} +3 -3
  28. package/dist/{chunk-TUEYBNWL.js.map → chunk-GV6WJCEB.js.map} +1 -1
  29. package/dist/chunk-HU3EAHFO.mjs +20 -0
  30. package/dist/chunk-HU3EAHFO.mjs.map +1 -0
  31. package/dist/{chunk-LLFU42KC.mjs → chunk-I6WYV2AN.mjs} +3 -3
  32. package/dist/{chunk-LLFU42KC.mjs.map → chunk-I6WYV2AN.mjs.map} +1 -1
  33. package/dist/chunk-JJWFMKZY.js +132 -0
  34. package/dist/chunk-JJWFMKZY.js.map +1 -0
  35. package/dist/{chunk-K4QJV3GC.js → chunk-L6FVIWAJ.js} +308 -137
  36. package/dist/chunk-L6FVIWAJ.js.map +1 -0
  37. package/dist/chunk-MNQEZL7B.mjs +210 -0
  38. package/dist/chunk-MNQEZL7B.mjs.map +1 -0
  39. package/dist/chunk-SGJ24J2Q.js +943 -0
  40. package/dist/chunk-SGJ24J2Q.js.map +1 -0
  41. package/dist/chunk-SW6TVAIJ.js +418 -0
  42. package/dist/chunk-SW6TVAIJ.js.map +1 -0
  43. package/dist/chunk-SYNVNTLJ.mjs +20 -0
  44. package/dist/chunk-SYNVNTLJ.mjs.map +1 -0
  45. package/dist/chunk-UQXVCVAN.mjs +41 -0
  46. package/dist/chunk-UQXVCVAN.mjs.map +1 -0
  47. package/dist/chunk-WGELLCOZ.js +22 -0
  48. package/dist/chunk-WGELLCOZ.js.map +1 -0
  49. package/dist/chunk-YXPHJ2BQ.js +541 -0
  50. package/dist/chunk-YXPHJ2BQ.js.map +1 -0
  51. package/dist/index.d.mts +3 -47
  52. package/dist/index.d.ts +3 -47
  53. package/dist/index.js +765 -765
  54. package/dist/index.mjs +2 -2
  55. package/dist/navigation-BiWVffAN.d.mts +49 -0
  56. package/dist/navigation-BiWVffAN.d.ts +49 -0
  57. package/dist/platform/agents-workspace.d.mts +19 -0
  58. package/dist/platform/agents-workspace.d.ts +19 -0
  59. package/dist/platform/agents-workspace.js +26 -0
  60. package/dist/platform/agents-workspace.js.map +1 -0
  61. package/dist/platform/agents-workspace.mjs +17 -0
  62. package/dist/platform/agents-workspace.mjs.map +1 -0
  63. package/dist/platform/app-shell.d.mts +58 -0
  64. package/dist/platform/app-shell.d.ts +58 -0
  65. package/dist/platform/app-shell.js +17 -0
  66. package/dist/platform/app-shell.js.map +1 -0
  67. package/dist/platform/app-shell.mjs +8 -0
  68. package/dist/platform/app-shell.mjs.map +1 -0
  69. package/dist/platform/index.d.mts +100 -3
  70. package/dist/platform/index.d.ts +100 -3
  71. package/dist/platform/index.js +499 -28
  72. package/dist/platform/index.js.map +1 -1
  73. package/dist/platform/index.mjs +472 -27
  74. package/dist/platform/index.mjs.map +1 -1
  75. package/dist/platform/pages/index.d.mts +243 -82
  76. package/dist/platform/pages/index.d.ts +243 -82
  77. package/dist/platform/pages/index.js +886 -614
  78. package/dist/platform/pages/index.js.map +1 -1
  79. package/dist/platform/pages/index.mjs +756 -511
  80. package/dist/platform/pages/index.mjs.map +1 -1
  81. package/dist/platform/utils/index.js +18 -56
  82. package/dist/platform/utils/index.js.map +1 -1
  83. package/dist/platform/utils/index.mjs +3 -53
  84. package/dist/platform/utils/index.mjs.map +1 -1
  85. package/dist/platform/workflow-api-client.d.mts +6 -0
  86. package/dist/platform/workflow-api-client.d.ts +6 -0
  87. package/dist/platform/workflow-api-client.js +246 -0
  88. package/dist/platform/workflow-api-client.js.map +1 -0
  89. package/dist/platform/workflow-api-client.mjs +5 -0
  90. package/dist/platform/workflow-api-client.mjs.map +1 -0
  91. package/dist/platform/workflow-canvas-shell.d.mts +18 -0
  92. package/dist/platform/workflow-canvas-shell.d.ts +18 -0
  93. package/dist/platform/workflow-canvas-shell.js +20 -0
  94. package/dist/platform/workflow-canvas-shell.js.map +1 -0
  95. package/dist/platform/workflow-canvas-shell.mjs +11 -0
  96. package/dist/platform/workflow-canvas-shell.mjs.map +1 -0
  97. package/dist/{rule-form-F5jBOeqk.d.mts → rule-form-BYJzyork.d.mts} +50 -1
  98. package/dist/{rule-form-F5jBOeqk.d.ts → rule-form-BYJzyork.d.ts} +50 -1
  99. package/dist/workflow-api-client-C8gPn_D1.d.mts +386 -0
  100. package/dist/workflow-api-client-Dy1Ph8W-.d.ts +386 -0
  101. package/package.json +21 -1
  102. package/dist/chunk-HAZP5J67.mjs.map +0 -1
  103. package/dist/chunk-K4QJV3GC.js.map +0 -1
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkM7P2TQ6X_js = require('./chunk-M7P2TQ6X.js');
5
- var chunkTUEYBNWL_js = require('./chunk-TUEYBNWL.js');
4
+ var chunkEFREXNZB_js = require('./chunk-EFREXNZB.js');
5
+ var chunkGV6WJCEB_js = require('./chunk-GV6WJCEB.js');
6
6
  var chunkYXN2K77G_js = require('./chunk-YXN2K77G.js');
7
7
  var chunkC7BI5LQ6_js = require('./chunk-C7BI5LQ6.js');
8
8
  var react = require('react');
@@ -71,7 +71,7 @@ function OutputSchemaBuilder({ value, onChange, depth = 0 }) {
71
71
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-xl border border-dashed border-slate-300 bg-slate-50/40 p-4 text-center dark:border-slate-700 dark:bg-slate-900/30", children: [
72
72
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-3 text-xs text-slate-500 dark:text-slate-400", children: "No schema yet \u2014 agent text is exposed as a raw string. Add a schema to enforce structured output." }),
73
73
  /* @__PURE__ */ jsxRuntime.jsx(
74
- chunkTUEYBNWL_js.Button,
74
+ chunkGV6WJCEB_js.Button,
75
75
  {
76
76
  type: "button",
77
77
  outline: true,
@@ -135,7 +135,7 @@ function OutputSchemaBuilder({ value, onChange, depth = 0 }) {
135
135
  },
136
136
  index
137
137
  )),
138
- /* @__PURE__ */ jsxRuntime.jsx(chunkTUEYBNWL_js.Button, { type: "button", outline: true, onClick: addField, children: "+ Add field" })
138
+ /* @__PURE__ */ jsxRuntime.jsx(chunkGV6WJCEB_js.Button, { type: "button", outline: true, onClick: addField, children: "+ Add field" })
139
139
  ] })
140
140
  ] });
141
141
  }
@@ -158,7 +158,7 @@ function FieldEditor({
158
158
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-xl border border-slate-200 bg-slate-50/60 p-3 dark:border-slate-700 dark:bg-slate-900/40", children: [
159
159
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-[1fr_140px_auto_auto] items-end gap-2", children: [
160
160
  /* @__PURE__ */ jsxRuntime.jsx(
161
- chunkTUEYBNWL_js.FormInput,
161
+ chunkGV6WJCEB_js.FormInput,
162
162
  {
163
163
  label: "Name",
164
164
  value: field.name,
@@ -167,7 +167,7 @@ function FieldEditor({
167
167
  }
168
168
  ),
169
169
  /* @__PURE__ */ jsxRuntime.jsx(
170
- chunkTUEYBNWL_js.FormSelect,
170
+ chunkGV6WJCEB_js.FormSelect,
171
171
  {
172
172
  label: "Type",
173
173
  value: field.type,
@@ -187,10 +187,10 @@ function FieldEditor({
187
187
  ),
188
188
  "Required"
189
189
  ] }),
190
- /* @__PURE__ */ jsxRuntime.jsx(chunkTUEYBNWL_js.Button, { type: "button", plain: true, onClick: onRemove, children: "Remove" })
190
+ /* @__PURE__ */ jsxRuntime.jsx(chunkGV6WJCEB_js.Button, { type: "button", plain: true, onClick: onRemove, children: "Remove" })
191
191
  ] }),
192
192
  /* @__PURE__ */ jsxRuntime.jsx(
193
- chunkTUEYBNWL_js.FormInput,
193
+ chunkGV6WJCEB_js.FormInput,
194
194
  {
195
195
  label: "Description (optional)",
196
196
  value: field.description,
@@ -283,7 +283,7 @@ function OutputCard({ label, value }) {
283
283
  function AgentProfileHeader({ agent, models, t, selectedModelId, setSelectedModelId, selectedFramework, temperature, setTemperature, elo, setElo, onChanged }) {
284
284
  const modelName = models.find((model) => model.id === selectedModelId)?.name ?? selectedModelId ?? "\u2014";
285
285
  const avatarUrl = agent.avatar;
286
- const frameworkMeta = chunkM7P2TQ6X_js.getFrameworkMeta(selectedFramework);
286
+ const frameworkMeta = chunkEFREXNZB_js.getFrameworkMeta(selectedFramework);
287
287
  const tierInfo = getEloTier(elo);
288
288
  const difficultyConfig = {
289
289
  beginner: { color: "bg-cyan-100 text-cyan-700 dark:bg-cyan-900/30 dark:text-cyan-400", labelKey: "agentDrawer.tierBeginner" },
@@ -559,13 +559,13 @@ function AgentCapabilityCard({ elo, setElo, models, selectedModelId, setSelected
559
559
  ] });
560
560
  }
561
561
  function ConfigTab({ models, t, selectedModelId, setSelectedModelId, selectedFramework, setSelectedFramework, markDirty, connectedProviderTypes }) {
562
- const frameworkKeys = Object.keys(chunkM7P2TQ6X_js.FRAMEWORK_META);
562
+ const frameworkKeys = Object.keys(chunkEFREXNZB_js.FRAMEWORK_META);
563
563
  const hasProviderConstraints = connectedProviderTypes.length > 0;
564
- const compatibleModels = chunkM7P2TQ6X_js.getCompatibleModels(models, selectedFramework);
564
+ const compatibleModels = chunkEFREXNZB_js.getCompatibleModels(models, selectedFramework);
565
565
  const handleFrameworkChange = react.useCallback((newFramework) => {
566
566
  setSelectedFramework(newFramework);
567
- if (!chunkM7P2TQ6X_js.isModelCompatibleWithFramework(selectedModelId, newFramework)) {
568
- const compatible = chunkM7P2TQ6X_js.getCompatibleModels(models, newFramework);
567
+ if (!chunkEFREXNZB_js.isModelCompatibleWithFramework(selectedModelId, newFramework)) {
568
+ const compatible = chunkEFREXNZB_js.getCompatibleModels(models, newFramework);
569
569
  if (compatible.length > 0) {
570
570
  setSelectedModelId(compatible[0].id);
571
571
  }
@@ -576,10 +576,10 @@ function ConfigTab({ models, t, selectedModelId, setSelectedModelId, selectedFra
576
576
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
577
577
  /* @__PURE__ */ jsxRuntime.jsx("label", { className: "mb-2 block text-xs font-medium text-gray-500 dark:text-gray-400", children: t("agentDrawer.framework") }),
578
578
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1.5", children: frameworkKeys.map((key) => {
579
- const meta = chunkM7P2TQ6X_js.FRAMEWORK_META[key];
579
+ const meta = chunkEFREXNZB_js.FRAMEWORK_META[key];
580
580
  const isSelected = key === selectedFramework;
581
- const compatCount = chunkM7P2TQ6X_js.getCompatibleModels(models, key).length;
582
- const isCompatibleWithProviders = !hasProviderConstraints || chunkM7P2TQ6X_js.isFrameworkCompatibleWithProviders(key, connectedProviderTypes);
581
+ const compatCount = chunkEFREXNZB_js.getCompatibleModels(models, key).length;
582
+ const isCompatibleWithProviders = !hasProviderConstraints || chunkEFREXNZB_js.isFrameworkCompatibleWithProviders(key, connectedProviderTypes);
583
583
  return /* @__PURE__ */ jsxRuntime.jsxs(
584
584
  "button",
585
585
  {
@@ -611,7 +611,7 @@ function ConfigTab({ models, t, selectedModelId, setSelectedModelId, selectedFra
611
611
  ] }),
612
612
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-2 gap-2", children: models.map((model) => {
613
613
  const isSelected = model.id === selectedModelId;
614
- const isCompatible = chunkM7P2TQ6X_js.isModelCompatibleWithFramework(model.id, selectedFramework);
614
+ const isCompatible = chunkEFREXNZB_js.isModelCompatibleWithFramework(model.id, selectedFramework);
615
615
  const { IconComponent, color, providerLabel } = getModelIcon(model.id);
616
616
  return /* @__PURE__ */ jsxRuntime.jsxs(
617
617
  "button",
@@ -735,7 +735,7 @@ function PromptTab({
735
735
  ] });
736
736
  }
737
737
  function ResultsTab({ agentId, t }) {
738
- const nodeResults = chunkM7P2TQ6X_js.useWorkflowStore((state) => state.nodeResults);
738
+ const nodeResults = chunkEFREXNZB_js.useWorkflowStore((state) => state.nodeResults);
739
739
  const agentResult = react.useMemo(() => {
740
740
  return nodeResults[agentId] ?? null;
741
741
  }, [nodeResults, agentId]);
@@ -825,10 +825,10 @@ function ModelsTab({ modelProviders, selectedProviderId, onSelectProvider, model
825
825
  const providerModels = modelsByProvider.find((p) => p.provider.id === selectedProviderId);
826
826
  if (!providerModels || providerModels.models.length === 0) return /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-gray-400 dark:text-gray-500", children: t("agentDrawer.noModelsForProvider") });
827
827
  const compatibleModels = providerModels.models.filter(
828
- (m) => chunkM7P2TQ6X_js.isModelCompatibleWithFramework(m.id, agentFramework)
828
+ (m) => chunkEFREXNZB_js.isModelCompatibleWithFramework(m.id, agentFramework)
829
829
  );
830
830
  const incompatibleModels = providerModels.models.filter(
831
- (m) => !chunkM7P2TQ6X_js.isModelCompatibleWithFramework(m.id, agentFramework)
831
+ (m) => !chunkEFREXNZB_js.isModelCompatibleWithFramework(m.id, agentFramework)
832
832
  );
833
833
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
834
834
  /* @__PURE__ */ jsxRuntime.jsx("label", { className: "mb-2 block text-xs font-medium text-gray-500 dark:text-gray-400", children: t("agentDrawer.selectModel") }),
@@ -901,7 +901,7 @@ function ToolsTab({ agentTools, enabledToolIds, onToggle, agentFramework, t }) {
901
901
  ] }),
902
902
  tool.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "truncate text-[10px] text-gray-400 dark:text-gray-500", children: tool.description }),
903
903
  tool.compatibleFrameworks && tool.compatibleFrameworks.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1 flex flex-wrap gap-0.5", children: tool.compatibleFrameworks.map((framework) => {
904
- const meta = chunkM7P2TQ6X_js.getFrameworkMeta(framework);
904
+ const meta = chunkEFREXNZB_js.getFrameworkMeta(framework);
905
905
  const isCurrentFw = framework === agentFramework;
906
906
  return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: `inline-flex items-center gap-0.5 rounded px-1.5 py-0.5 text-[8px] font-medium ${isCurrentFw ? meta.badgeColor : "bg-gray-100 text-gray-500 dark:bg-white/5 dark:text-gray-400"}`, children: [
907
907
  /* @__PURE__ */ jsxRuntime.jsx(meta.IconComponent, { className: "h-2.5 w-2.5" }),
@@ -918,7 +918,7 @@ function ToolsTab({ agentTools, enabledToolIds, onToggle, agentFramework, t }) {
918
918
  event.stopPropagation();
919
919
  },
920
920
  children: /* @__PURE__ */ jsxRuntime.jsx(
921
- chunkTUEYBNWL_js.ToggleSwitch,
921
+ chunkGV6WJCEB_js.ToggleSwitch,
922
922
  {
923
923
  checked: isEnabled,
924
924
  onChange: () => onToggle(tool.agentToolId),
@@ -1077,9 +1077,9 @@ function AdvancedTab({
1077
1077
  }
1078
1078
  function AgentModal({ onSaved, onPersist }) {
1079
1079
  const t = chunkYXN2K77G_js.useTranslations("agents.workflow");
1080
- const activeModal = chunkM7P2TQ6X_js.useModalStore((s) => s.activeModal);
1081
- const agentData = chunkM7P2TQ6X_js.useModalStore((s) => s.agentData);
1082
- const closeModal = chunkM7P2TQ6X_js.useModalStore((s) => s.closeModal);
1080
+ const activeModal = chunkEFREXNZB_js.useModalStore((s) => s.activeModal);
1081
+ const agentData = chunkEFREXNZB_js.useModalStore((s) => s.agentData);
1082
+ const closeModal = chunkEFREXNZB_js.useModalStore((s) => s.closeModal);
1083
1083
  const open = activeModal === "agent";
1084
1084
  const agent = agentData?.agent ?? null;
1085
1085
  const models = agentData?.models ?? [];
@@ -1241,7 +1241,7 @@ function AgentModal({ onSaved, onPersist }) {
1241
1241
  )
1242
1242
  ] });
1243
1243
  return /* @__PURE__ */ jsxRuntime.jsxs(
1244
- chunkTUEYBNWL_js.GlassModal,
1244
+ chunkGV6WJCEB_js.GlassModal,
1245
1245
  {
1246
1246
  open,
1247
1247
  onClose: handleClose,
@@ -1429,7 +1429,7 @@ function SubworkflowModal({ onSaved, onMaximize }) {
1429
1429
  const markDirty = useSubworkflowStore((s) => s.markDirty);
1430
1430
  const markSaved = useSubworkflowStore((s) => s.markSaved);
1431
1431
  const closeModal = useSubworkflowStore((s) => s.closeModal);
1432
- const agentBehind = chunkM7P2TQ6X_js.useModalStore((s) => s.activeModal === "agent" ? s.agentData?.agent?.name : null);
1432
+ const agentBehind = chunkEFREXNZB_js.useModalStore((s) => s.activeModal === "agent" ? s.agentData?.agent?.name : null);
1433
1433
  const isCreateMode = !tool?.toolId;
1434
1434
  const initialGraph = react.useMemo(() => {
1435
1435
  const config = tool?.config;
@@ -1458,9 +1458,9 @@ function SubworkflowModal({ onSaved, onMaximize }) {
1458
1458
  }, [tool, onSaved, name, category, description, timeoutMs, latestGraphRef, markSaved]);
1459
1459
  if (!tool) return null;
1460
1460
  const categoryKey = category ?? "external";
1461
- const gradient = tool.color ?? chunkM7P2TQ6X_js.CATEGORY_COLORS[categoryKey] ?? chunkM7P2TQ6X_js.CATEGORY_COLORS.external;
1462
- const categoryPill = chunkM7P2TQ6X_js.CATEGORY_PILL_COLORS[categoryKey] ?? chunkM7P2TQ6X_js.CATEGORY_PILL_COLORS.external;
1463
- const IconComponent = chunkM7P2TQ6X_js.ICON_MAP[tool.icon ?? ""] ?? outline.ArrowPathRoundedSquareIcon;
1461
+ const gradient = tool.color ?? chunkEFREXNZB_js.CATEGORY_COLORS[categoryKey] ?? chunkEFREXNZB_js.CATEGORY_COLORS.external;
1462
+ const categoryPill = chunkEFREXNZB_js.CATEGORY_PILL_COLORS[categoryKey] ?? chunkEFREXNZB_js.CATEGORY_PILL_COLORS.external;
1463
+ const IconComponent = chunkEFREXNZB_js.ICON_MAP[tool.icon ?? ""] ?? outline.ArrowPathRoundedSquareIcon;
1464
1464
  const graph = latestGraphRef.current;
1465
1465
  const startNode = graph.nodes.find((n) => n.type === "start");
1466
1466
  const endNode = graph.nodes.find((n) => n.type === "end");
@@ -1493,7 +1493,7 @@ function SubworkflowModal({ onSaved, onMaximize }) {
1493
1493
  ] })
1494
1494
  ] });
1495
1495
  return /* @__PURE__ */ jsxRuntime.jsx(
1496
- chunkTUEYBNWL_js.GlassModal,
1496
+ chunkGV6WJCEB_js.GlassModal,
1497
1497
  {
1498
1498
  open,
1499
1499
  onClose: closeModal,
@@ -1525,7 +1525,7 @@ function SubworkflowModal({ onSaved, onMaximize }) {
1525
1525
  {
1526
1526
  type: "button",
1527
1527
  onClick: () => setCategory(cat),
1528
- className: `rounded-full px-2 py-1 text-[9px] font-semibold transition-all ${cat === category ? `${chunkM7P2TQ6X_js.CATEGORY_PILL_COLORS[cat] ?? chunkM7P2TQ6X_js.CATEGORY_PILL_COLORS.external} ring-1 ring-current/20` : "bg-white/30 text-gray-500 hover:bg-white/50 dark:bg-white/5 dark:text-gray-400"}`,
1528
+ className: `rounded-full px-2 py-1 text-[9px] font-semibold transition-all ${cat === category ? `${chunkEFREXNZB_js.CATEGORY_PILL_COLORS[cat] ?? chunkEFREXNZB_js.CATEGORY_PILL_COLORS.external} ring-1 ring-current/20` : "bg-white/30 text-gray-500 hover:bg-white/50 dark:bg-white/5 dark:text-gray-400"}`,
1529
1529
  children: cat
1530
1530
  },
1531
1531
  cat
@@ -1612,7 +1612,7 @@ function SubworkflowModal({ onSaved, onMaximize }) {
1612
1612
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-auto" })
1613
1613
  ] }),
1614
1614
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(
1615
- chunkM7P2TQ6X_js.WorkflowCanvas,
1615
+ chunkEFREXNZB_js.WorkflowCanvas,
1616
1616
  {
1617
1617
  initialGraph,
1618
1618
  agents: [],
@@ -1628,9 +1628,9 @@ function SubworkflowModal({ onSaved, onMaximize }) {
1628
1628
  }
1629
1629
  function PipelineSettingsModal({ onSave }) {
1630
1630
  const t = chunkYXN2K77G_js.useTranslations("agents.workflow");
1631
- const activeModal = chunkM7P2TQ6X_js.useModalStore((s) => s.activeModal);
1632
- const data = chunkM7P2TQ6X_js.useModalStore((s) => s.pipelineSettingsData);
1633
- const closeModal = chunkM7P2TQ6X_js.useModalStore((s) => s.closeModal);
1631
+ const activeModal = chunkEFREXNZB_js.useModalStore((s) => s.activeModal);
1632
+ const data = chunkEFREXNZB_js.useModalStore((s) => s.pipelineSettingsData);
1633
+ const closeModal = chunkEFREXNZB_js.useModalStore((s) => s.closeModal);
1634
1634
  const open = activeModal === "pipeline-settings";
1635
1635
  const [nameValue, setNameValue] = react.useState("");
1636
1636
  const [descriptionValue, setDescriptionValue] = react.useState("");
@@ -1692,7 +1692,7 @@ function PipelineSettingsModal({ onSave }) {
1692
1692
  }
1693
1693
  ),
1694
1694
  /* @__PURE__ */ jsxRuntime.jsxs(
1695
- chunkTUEYBNWL_js.Button,
1695
+ chunkGV6WJCEB_js.Button,
1696
1696
  {
1697
1697
  type: "submit",
1698
1698
  form: "pipeline-settings-form",
@@ -1707,7 +1707,7 @@ function PipelineSettingsModal({ onSave }) {
1707
1707
  )
1708
1708
  ] });
1709
1709
  return /* @__PURE__ */ jsxRuntime.jsx(
1710
- chunkTUEYBNWL_js.GlassModal,
1710
+ chunkGV6WJCEB_js.GlassModal,
1711
1711
  {
1712
1712
  open,
1713
1713
  onClose: closeModal,
@@ -1721,7 +1721,7 @@ function PipelineSettingsModal({ onSave }) {
1721
1721
  onSubmit: handleSubmit,
1722
1722
  children: /* @__PURE__ */ jsxRuntime.jsxs("form", { id: "pipeline-settings-form", onSubmit: handleSubmit, className: "space-y-5", children: [
1723
1723
  /* @__PURE__ */ jsxRuntime.jsx(
1724
- chunkTUEYBNWL_js.FormInput,
1724
+ chunkGV6WJCEB_js.FormInput,
1725
1725
  {
1726
1726
  label: t("pipelineName"),
1727
1727
  value: nameValue,
@@ -1731,7 +1731,7 @@ function PipelineSettingsModal({ onSave }) {
1731
1731
  }
1732
1732
  ),
1733
1733
  /* @__PURE__ */ jsxRuntime.jsx(
1734
- chunkTUEYBNWL_js.FormTextarea,
1734
+ chunkGV6WJCEB_js.FormTextarea,
1735
1735
  {
1736
1736
  label: t("pipelineDescription"),
1737
1737
  value: descriptionValue,
@@ -1742,7 +1742,7 @@ function PipelineSettingsModal({ onSave }) {
1742
1742
  ),
1743
1743
  lifecycleAvailable && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1744
1744
  /* @__PURE__ */ jsxRuntime.jsx(
1745
- chunkTUEYBNWL_js.FormInput,
1745
+ chunkGV6WJCEB_js.FormInput,
1746
1746
  {
1747
1747
  label: t("pipelineSlug", { _: "Slug" }),
1748
1748
  value: slugValue,
@@ -1869,7 +1869,7 @@ function RunReplayModal({
1869
1869
  }
1870
1870
  ),
1871
1871
  /* @__PURE__ */ jsxRuntime.jsxs(
1872
- chunkTUEYBNWL_js.Button,
1872
+ chunkGV6WJCEB_js.Button,
1873
1873
  {
1874
1874
  type: "submit",
1875
1875
  form: "run-replay-form",
@@ -1884,7 +1884,7 @@ function RunReplayModal({
1884
1884
  ] })
1885
1885
  ] });
1886
1886
  return /* @__PURE__ */ jsxRuntime.jsx(
1887
- chunkTUEYBNWL_js.GlassModal,
1887
+ chunkGV6WJCEB_js.GlassModal,
1888
1888
  {
1889
1889
  open,
1890
1890
  onClose,
@@ -1958,7 +1958,7 @@ function RowEditor({
1958
1958
  ]
1959
1959
  }
1960
1960
  ) : isJson ? /* @__PURE__ */ jsxRuntime.jsx(
1961
- chunkTUEYBNWL_js.FormTextarea,
1961
+ chunkGV6WJCEB_js.FormTextarea,
1962
1962
  {
1963
1963
  value: row.value,
1964
1964
  onValueChange: (v) => onChange({ value: v }),
@@ -1966,7 +1966,7 @@ function RowEditor({
1966
1966
  className: "font-mono"
1967
1967
  }
1968
1968
  ) : /* @__PURE__ */ jsxRuntime.jsx(
1969
- chunkTUEYBNWL_js.FormInput,
1969
+ chunkGV6WJCEB_js.FormInput,
1970
1970
  {
1971
1971
  type: row.kind === "number" ? "number" : "text",
1972
1972
  value: row.value,
@@ -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(chunkGV6WJCEB_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(chunkGV6WJCEB_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"];
@@ -2100,7 +2270,7 @@ function RuleConditionBuilder({ value, onChange, depth = 0 }) {
2100
2270
  };
2101
2271
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3 rounded-xl border border-slate-200 bg-slate-50/60 p-3 dark:border-slate-700 dark:bg-slate-900/40", children: [
2102
2272
  /* @__PURE__ */ jsxRuntime.jsx(
2103
- chunkTUEYBNWL_js.FormSelect,
2273
+ chunkGV6WJCEB_js.FormSelect,
2104
2274
  {
2105
2275
  label: "Operator",
2106
2276
  value: value.operator,
@@ -2123,7 +2293,7 @@ function SimpleEditor({
2123
2293
  const isTruthy = value.operator === "truthy";
2124
2294
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: [
2125
2295
  /* @__PURE__ */ jsxRuntime.jsx(
2126
- chunkTUEYBNWL_js.FormInput,
2296
+ chunkGV6WJCEB_js.FormInput,
2127
2297
  {
2128
2298
  label: "Field",
2129
2299
  hint: "Dotted reference into the variable pool \u2014 e.g. `parse-pricing.margin`, `inputs.fuelType`",
@@ -2133,7 +2303,7 @@ function SimpleEditor({
2133
2303
  }
2134
2304
  ),
2135
2305
  !isTruthy && /* @__PURE__ */ jsxRuntime.jsx(
2136
- chunkTUEYBNWL_js.FormInput,
2306
+ chunkGV6WJCEB_js.FormInput,
2137
2307
  {
2138
2308
  label: "Value",
2139
2309
  hint: "Literal. Numeric operators coerce via `as f64`.",
@@ -2149,7 +2319,7 @@ function ThresholdEditor({
2149
2319
  }) {
2150
2320
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-3", children: [
2151
2321
  /* @__PURE__ */ jsxRuntime.jsx(
2152
- chunkTUEYBNWL_js.FormInput,
2322
+ chunkGV6WJCEB_js.FormInput,
2153
2323
  {
2154
2324
  label: "Field",
2155
2325
  value: value.field ?? "",
@@ -2158,7 +2328,7 @@ function ThresholdEditor({
2158
2328
  }
2159
2329
  ),
2160
2330
  /* @__PURE__ */ jsxRuntime.jsx(
2161
- chunkTUEYBNWL_js.FormSelect,
2331
+ chunkGV6WJCEB_js.FormSelect,
2162
2332
  {
2163
2333
  label: "Direction",
2164
2334
  value: value.comparison ?? "gte",
@@ -2172,7 +2342,7 @@ function ThresholdEditor({
2172
2342
  }
2173
2343
  ),
2174
2344
  /* @__PURE__ */ jsxRuntime.jsx(
2175
- chunkTUEYBNWL_js.FormInput,
2345
+ chunkGV6WJCEB_js.FormInput,
2176
2346
  {
2177
2347
  label: "Threshold",
2178
2348
  type: "number",
@@ -2189,7 +2359,7 @@ function RegexEditor({
2189
2359
  }) {
2190
2360
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: [
2191
2361
  /* @__PURE__ */ jsxRuntime.jsx(
2192
- chunkTUEYBNWL_js.FormInput,
2362
+ chunkGV6WJCEB_js.FormInput,
2193
2363
  {
2194
2364
  label: "Field",
2195
2365
  value: value.field ?? "",
@@ -2198,7 +2368,7 @@ function RegexEditor({
2198
2368
  }
2199
2369
  ),
2200
2370
  /* @__PURE__ */ jsxRuntime.jsx(
2201
- chunkTUEYBNWL_js.FormInput,
2371
+ chunkGV6WJCEB_js.FormInput,
2202
2372
  {
2203
2373
  label: "Pattern",
2204
2374
  hint: "Rust regex syntax \u2014 `(?i)` etc. supported.",
@@ -2226,7 +2396,7 @@ function TimeWindowEditor({
2226
2396
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
2227
2397
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: [
2228
2398
  /* @__PURE__ */ jsxRuntime.jsx(
2229
- chunkTUEYBNWL_js.FormSelect,
2399
+ chunkGV6WJCEB_js.FormSelect,
2230
2400
  {
2231
2401
  label: "Timezone",
2232
2402
  value: value.timezone ?? "UTC",
@@ -2235,7 +2405,7 @@ function TimeWindowEditor({
2235
2405
  }
2236
2406
  ),
2237
2407
  /* @__PURE__ */ jsxRuntime.jsx(
2238
- chunkTUEYBNWL_js.FormInput,
2408
+ chunkGV6WJCEB_js.FormInput,
2239
2409
  {
2240
2410
  label: "Timestamp field (optional)",
2241
2411
  hint: "Pulls a timestamp from the pool. Leave blank to use the run's wall-clock.",
@@ -2248,7 +2418,7 @@ function TimeWindowEditor({
2248
2418
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
2249
2419
  windows.map((win, index) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-[1fr_1fr_auto] items-end gap-2 rounded-lg border border-slate-200 p-2 dark:border-slate-700", children: [
2250
2420
  /* @__PURE__ */ jsxRuntime.jsx(
2251
- chunkTUEYBNWL_js.FormInput,
2421
+ chunkGV6WJCEB_js.FormInput,
2252
2422
  {
2253
2423
  label: `Start (hour)`,
2254
2424
  type: "number",
@@ -2259,7 +2429,7 @@ function TimeWindowEditor({
2259
2429
  }
2260
2430
  ),
2261
2431
  /* @__PURE__ */ jsxRuntime.jsx(
2262
- chunkTUEYBNWL_js.FormInput,
2432
+ chunkGV6WJCEB_js.FormInput,
2263
2433
  {
2264
2434
  label: `End (hour)`,
2265
2435
  type: "number",
@@ -2269,9 +2439,9 @@ function TimeWindowEditor({
2269
2439
  onValueChange: (raw) => update(index, { endHour: clampHour(raw, 24) })
2270
2440
  }
2271
2441
  ),
2272
- /* @__PURE__ */ jsxRuntime.jsx(chunkTUEYBNWL_js.Button, { type: "button", plain: true, onClick: () => remove(index), children: "Remove" })
2442
+ /* @__PURE__ */ jsxRuntime.jsx(chunkGV6WJCEB_js.Button, { type: "button", plain: true, onClick: () => remove(index), children: "Remove" })
2273
2443
  ] }, index)),
2274
- /* @__PURE__ */ jsxRuntime.jsx(chunkTUEYBNWL_js.Button, { type: "button", outline: true, onClick: add, children: "+ Add window" })
2444
+ /* @__PURE__ */ jsxRuntime.jsx(chunkGV6WJCEB_js.Button, { type: "button", outline: true, onClick: add, children: "+ Add window" })
2275
2445
  ] })
2276
2446
  ] });
2277
2447
  }
@@ -2294,7 +2464,7 @@ function BooleanGroupEditor({
2294
2464
  });
2295
2465
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
2296
2466
  /* @__PURE__ */ jsxRuntime.jsx(
2297
- chunkTUEYBNWL_js.FormSelect,
2467
+ chunkGV6WJCEB_js.FormSelect,
2298
2468
  {
2299
2469
  label: "Combinator",
2300
2470
  value: value.combinator ?? "and",
@@ -2312,9 +2482,9 @@ function BooleanGroupEditor({
2312
2482
  depth
2313
2483
  }
2314
2484
  ),
2315
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-2 text-right", children: /* @__PURE__ */ jsxRuntime.jsx(chunkTUEYBNWL_js.Button, { type: "button", plain: true, onClick: () => remove(index), children: "Remove operand" }) })
2485
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-2 text-right", children: /* @__PURE__ */ jsxRuntime.jsx(chunkGV6WJCEB_js.Button, { type: "button", plain: true, onClick: () => remove(index), children: "Remove operand" }) })
2316
2486
  ] }, index)),
2317
- /* @__PURE__ */ jsxRuntime.jsx(chunkTUEYBNWL_js.Button, { type: "button", outline: true, onClick: add, children: "+ Add operand" })
2487
+ /* @__PURE__ */ jsxRuntime.jsx(chunkGV6WJCEB_js.Button, { type: "button", outline: true, onClick: add, children: "+ Add operand" })
2318
2488
  ] })
2319
2489
  ] });
2320
2490
  }
@@ -2350,7 +2520,7 @@ function RuleActionBuilder({ value, onChange }) {
2350
2520
  };
2351
2521
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3 rounded-xl border border-slate-200 bg-slate-50/60 p-3 dark:border-slate-700 dark:bg-slate-900/40", children: [
2352
2522
  /* @__PURE__ */ jsxRuntime.jsx(
2353
- chunkTUEYBNWL_js.FormSelect,
2523
+ chunkGV6WJCEB_js.FormSelect,
2354
2524
  {
2355
2525
  label: "Action type",
2356
2526
  value: type,
@@ -2360,7 +2530,7 @@ function RuleActionBuilder({ value, onChange }) {
2360
2530
  ),
2361
2531
  type === "adjust_price" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: [
2362
2532
  /* @__PURE__ */ jsxRuntime.jsx(
2363
- chunkTUEYBNWL_js.FormInput,
2533
+ chunkGV6WJCEB_js.FormInput,
2364
2534
  {
2365
2535
  label: "Multiplier",
2366
2536
  type: "number",
@@ -2370,7 +2540,7 @@ function RuleActionBuilder({ value, onChange }) {
2370
2540
  }
2371
2541
  ),
2372
2542
  /* @__PURE__ */ jsxRuntime.jsx(
2373
- chunkTUEYBNWL_js.FormInput,
2543
+ chunkGV6WJCEB_js.FormInput,
2374
2544
  {
2375
2545
  label: "Reason code",
2376
2546
  value: stringParam(params.reason),
@@ -2380,7 +2550,7 @@ function RuleActionBuilder({ value, onChange }) {
2380
2550
  )
2381
2551
  ] }),
2382
2552
  type === "enforce_min_margin" && /* @__PURE__ */ jsxRuntime.jsx(
2383
- chunkTUEYBNWL_js.FormInput,
2553
+ chunkGV6WJCEB_js.FormInput,
2384
2554
  {
2385
2555
  label: "Floor (fraction, e.g. 0.08)",
2386
2556
  type: "number",
@@ -2390,7 +2560,7 @@ function RuleActionBuilder({ value, onChange }) {
2390
2560
  }
2391
2561
  ),
2392
2562
  type === "realign_to_competitor" && /* @__PURE__ */ jsxRuntime.jsx(
2393
- chunkTUEYBNWL_js.FormInput,
2563
+ chunkGV6WJCEB_js.FormInput,
2394
2564
  {
2395
2565
  label: "Tolerance (fraction)",
2396
2566
  type: "number",
@@ -2400,7 +2570,7 @@ function RuleActionBuilder({ value, onChange }) {
2400
2570
  }
2401
2571
  ),
2402
2572
  type === "request_manager_approval" && /* @__PURE__ */ jsxRuntime.jsx(
2403
- chunkTUEYBNWL_js.FormInput,
2573
+ chunkGV6WJCEB_js.FormInput,
2404
2574
  {
2405
2575
  label: "Approval limit (fraction)",
2406
2576
  type: "number",
@@ -2410,7 +2580,7 @@ function RuleActionBuilder({ value, onChange }) {
2410
2580
  }
2411
2581
  ),
2412
2582
  type === "round_to" && /* @__PURE__ */ jsxRuntime.jsx(
2413
- chunkTUEYBNWL_js.FormInput,
2583
+ chunkGV6WJCEB_js.FormInput,
2414
2584
  {
2415
2585
  label: "Step (e.g. 0.009)",
2416
2586
  type: "number",
@@ -2421,7 +2591,7 @@ function RuleActionBuilder({ value, onChange }) {
2421
2591
  ),
2422
2592
  type === "alert" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: [
2423
2593
  /* @__PURE__ */ jsxRuntime.jsx(
2424
- chunkTUEYBNWL_js.FormInput,
2594
+ chunkGV6WJCEB_js.FormInput,
2425
2595
  {
2426
2596
  label: "Channel",
2427
2597
  value: stringParam(params.channel),
@@ -2430,7 +2600,7 @@ function RuleActionBuilder({ value, onChange }) {
2430
2600
  }
2431
2601
  ),
2432
2602
  /* @__PURE__ */ jsxRuntime.jsx(
2433
- chunkTUEYBNWL_js.FormInput,
2603
+ chunkGV6WJCEB_js.FormInput,
2434
2604
  {
2435
2605
  label: "Severity",
2436
2606
  value: stringParam(params.severity),
@@ -2468,7 +2638,7 @@ function CustomParamsEditor({
2468
2638
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
2469
2639
  entries.map(([key, value], index) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-[1fr_1fr_auto] items-end gap-2", children: [
2470
2640
  /* @__PURE__ */ jsxRuntime.jsx(
2471
- chunkTUEYBNWL_js.FormInput,
2641
+ chunkGV6WJCEB_js.FormInput,
2472
2642
  {
2473
2643
  label: "Key",
2474
2644
  value: key,
@@ -2476,16 +2646,16 @@ function CustomParamsEditor({
2476
2646
  }
2477
2647
  ),
2478
2648
  /* @__PURE__ */ jsxRuntime.jsx(
2479
- chunkTUEYBNWL_js.FormInput,
2649
+ chunkGV6WJCEB_js.FormInput,
2480
2650
  {
2481
2651
  label: "Value",
2482
2652
  value: String(value ?? ""),
2483
2653
  onValueChange: (raw) => update(index, key, raw)
2484
2654
  }
2485
2655
  ),
2486
- /* @__PURE__ */ jsxRuntime.jsx(chunkTUEYBNWL_js.Button, { type: "button", plain: true, onClick: () => remove(index), children: "Remove" })
2656
+ /* @__PURE__ */ jsxRuntime.jsx(chunkGV6WJCEB_js.Button, { type: "button", plain: true, onClick: () => remove(index), children: "Remove" })
2487
2657
  ] }, index)),
2488
- /* @__PURE__ */ jsxRuntime.jsx(chunkTUEYBNWL_js.Button, { type: "button", outline: true, onClick: add, children: "+ Add param" })
2658
+ /* @__PURE__ */ jsxRuntime.jsx(chunkGV6WJCEB_js.Button, { type: "button", outline: true, onClick: add, children: "+ Add param" })
2489
2659
  ] });
2490
2660
  }
2491
2661
  function numberParam(value, fallback) {
@@ -2515,9 +2685,9 @@ function RuleForm({ value, onChange }) {
2515
2685
  );
2516
2686
  const update = (key, v) => onChange({ ...value, [key]: v });
2517
2687
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-5", children: [
2518
- /* @__PURE__ */ jsxRuntime.jsxs(chunkTUEYBNWL_js.FormGrid, { children: [
2688
+ /* @__PURE__ */ jsxRuntime.jsxs(chunkGV6WJCEB_js.FormGrid, { children: [
2519
2689
  /* @__PURE__ */ jsxRuntime.jsx(
2520
- chunkTUEYBNWL_js.FormInput,
2690
+ chunkGV6WJCEB_js.FormInput,
2521
2691
  {
2522
2692
  label: "Name",
2523
2693
  required: true,
@@ -2526,7 +2696,7 @@ function RuleForm({ value, onChange }) {
2526
2696
  }
2527
2697
  ),
2528
2698
  /* @__PURE__ */ jsxRuntime.jsx(
2529
- chunkTUEYBNWL_js.FormInput,
2699
+ chunkGV6WJCEB_js.FormInput,
2530
2700
  {
2531
2701
  label: "Priority",
2532
2702
  type: "number",
@@ -2536,7 +2706,7 @@ function RuleForm({ value, onChange }) {
2536
2706
  }
2537
2707
  ),
2538
2708
  /* @__PURE__ */ jsxRuntime.jsx(
2539
- chunkTUEYBNWL_js.FormSelect,
2709
+ chunkGV6WJCEB_js.FormSelect,
2540
2710
  {
2541
2711
  label: "Enabled",
2542
2712
  value: value.enabled ? "true" : "false",
@@ -2548,7 +2718,7 @@ function RuleForm({ value, onChange }) {
2548
2718
  }
2549
2719
  ),
2550
2720
  /* @__PURE__ */ jsxRuntime.jsx(
2551
- chunkTUEYBNWL_js.FormTextarea,
2721
+ chunkGV6WJCEB_js.FormTextarea,
2552
2722
  {
2553
2723
  label: "Description",
2554
2724
  rows: 2,
@@ -2560,7 +2730,7 @@ function RuleForm({ value, onChange }) {
2560
2730
  /* @__PURE__ */ jsxRuntime.jsxs("section", { children: [
2561
2731
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-2 flex items-center justify-between", children: [
2562
2732
  /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-sm font-semibold text-slate-700 dark:text-slate-200", children: "Condition" }),
2563
- /* @__PURE__ */ jsxRuntime.jsx(chunkTUEYBNWL_js.Badge, { color: "indigo", children: value.condition.operator })
2733
+ /* @__PURE__ */ jsxRuntime.jsx(chunkGV6WJCEB_js.Badge, { color: "indigo", children: value.condition.operator })
2564
2734
  ] }),
2565
2735
  /* @__PURE__ */ jsxRuntime.jsx(
2566
2736
  RuleConditionBuilder,
@@ -2573,7 +2743,7 @@ function RuleForm({ value, onChange }) {
2573
2743
  /* @__PURE__ */ jsxRuntime.jsxs("section", { children: [
2574
2744
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-2 flex items-center justify-between", children: [
2575
2745
  /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-sm font-semibold text-slate-700 dark:text-slate-200", children: "Action on match" }),
2576
- /* @__PURE__ */ jsxRuntime.jsx(chunkTUEYBNWL_js.Badge, { color: "fuchsia", children: value.action.type })
2746
+ /* @__PURE__ */ jsxRuntime.jsx(chunkGV6WJCEB_js.Badge, { color: "fuchsia", children: value.action.type })
2577
2747
  ] }),
2578
2748
  /* @__PURE__ */ jsxRuntime.jsx(
2579
2749
  RuleActionBuilder,
@@ -2595,7 +2765,7 @@ function RuleForm({ value, onChange }) {
2595
2765
  ),
2596
2766
  showAdvanced && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2", children: [
2597
2767
  /* @__PURE__ */ jsxRuntime.jsx(
2598
- chunkTUEYBNWL_js.FormInput,
2768
+ chunkGV6WJCEB_js.FormInput,
2599
2769
  {
2600
2770
  label: "Valid from (ISO 8601)",
2601
2771
  type: "datetime-local",
@@ -2604,7 +2774,7 @@ function RuleForm({ value, onChange }) {
2604
2774
  }
2605
2775
  ),
2606
2776
  /* @__PURE__ */ jsxRuntime.jsx(
2607
- chunkTUEYBNWL_js.FormInput,
2777
+ chunkGV6WJCEB_js.FormInput,
2608
2778
  {
2609
2779
  label: "Valid until (ISO 8601)",
2610
2780
  type: "datetime-local",
@@ -2613,7 +2783,7 @@ function RuleForm({ value, onChange }) {
2613
2783
  }
2614
2784
  ),
2615
2785
  /* @__PURE__ */ jsxRuntime.jsx(
2616
- chunkTUEYBNWL_js.FormSelect,
2786
+ chunkGV6WJCEB_js.FormSelect,
2617
2787
  {
2618
2788
  label: "Status",
2619
2789
  value: value.status ?? "active",
@@ -2622,7 +2792,7 @@ function RuleForm({ value, onChange }) {
2622
2792
  }
2623
2793
  ),
2624
2794
  /* @__PURE__ */ jsxRuntime.jsx(
2625
- chunkTUEYBNWL_js.FormInput,
2795
+ chunkGV6WJCEB_js.FormInput,
2626
2796
  {
2627
2797
  label: "Tags (comma-separated)",
2628
2798
  value: (value.tags ?? []).join(", "),
@@ -2806,8 +2976,8 @@ function CollapsibleSection({ title, icon, colorClass, defaultOpen = true, count
2806
2976
  ] });
2807
2977
  }
2808
2978
  function LogicNodeItemCard({ item, translationFunction }) {
2809
- const IconComponent = chunkM7P2TQ6X_js.LOGIC_ICON_MAP[item.nodeType];
2810
- const gradient = chunkM7P2TQ6X_js.LOGIC_NODE_GRADIENTS[item.nodeType] ?? "from-gray-400 to-gray-500";
2979
+ const IconComponent = chunkEFREXNZB_js.LOGIC_ICON_MAP[item.nodeType];
2980
+ const gradient = chunkEFREXNZB_js.LOGIC_NODE_GRADIENTS[item.nodeType] ?? "from-gray-400 to-gray-500";
2811
2981
  const defaultConfig = chunkC7BI5LQ6_js.createDefaultLogicNodeConfig(item.nodeType);
2812
2982
  const configJson = defaultConfig ? JSON.stringify(defaultConfig) : void 0;
2813
2983
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -2988,7 +3158,7 @@ function NodePalette({ agents, tools, agentTools = [], rules, entities = [], mod
2988
3158
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "truncate text-[10px] text-gray-400 dark:text-gray-500", children: tool.category })
2989
3159
  ] }),
2990
3160
  /* @__PURE__ */ jsxRuntime.jsx(
2991
- chunkTUEYBNWL_js.ToggleSwitch,
3161
+ chunkGV6WJCEB_js.ToggleSwitch,
2992
3162
  {
2993
3163
  checked: Boolean(tool.enabled),
2994
3164
  onChange: () => {
@@ -3029,7 +3199,7 @@ function NodePalette({ agents, tools, agentTools = [], rules, entities = [], mod
3029
3199
  ] })
3030
3200
  ] }),
3031
3201
  /* @__PURE__ */ jsxRuntime.jsx(
3032
- chunkTUEYBNWL_js.ToggleSwitch,
3202
+ chunkGV6WJCEB_js.ToggleSwitch,
3033
3203
  {
3034
3204
  checked: Boolean(rule.enabled),
3035
3205
  onChange: () => {
@@ -3065,8 +3235,8 @@ function NodePalette({ agents, tools, agentTools = [], rules, entities = [], mod
3065
3235
  limit: entity.defaultLimit
3066
3236
  });
3067
3237
  const dsLogo = getDatasourceLogo(entity.id);
3068
- const EntityIcon = chunkM7P2TQ6X_js.getEntityIcon(entity.id);
3069
- const entityGradient = chunkM7P2TQ6X_js.getEntityGradient(entity.id);
3238
+ const EntityIcon = chunkEFREXNZB_js.getEntityIcon(entity.id);
3239
+ const entityGradient = chunkEFREXNZB_js.getEntityGradient(entity.id);
3070
3240
  return /* @__PURE__ */ jsxRuntime.jsxs(
3071
3241
  "div",
3072
3242
  {
@@ -3086,7 +3256,7 @@ function NodePalette({ agents, tools, agentTools = [], rules, entities = [], mod
3086
3256
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
3087
3257
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "rounded-full bg-slate-100 px-1.5 py-0.5 text-[9px] font-medium text-slate-600 dark:bg-white/10 dark:text-slate-300", children: "Read only" }),
3088
3258
  /* @__PURE__ */ jsxRuntime.jsx(
3089
- chunkTUEYBNWL_js.ToggleSwitch,
3259
+ chunkGV6WJCEB_js.ToggleSwitch,
3090
3260
  {
3091
3261
  checked: true,
3092
3262
  onChange: () => {
@@ -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
  }
@@ -3464,9 +3634,9 @@ function formatDuration2(durationMs) {
3464
3634
  }
3465
3635
  function RunPanel({ open, onClose, onRun, onStop }) {
3466
3636
  const translations = chunkYXN2K77G_js.useTranslations("agents.workflow.runPanel");
3467
- const nodes = chunkM7P2TQ6X_js.useWorkflowStore((state) => state.nodes);
3468
- const isRunning = chunkM7P2TQ6X_js.useWorkflowStore((state) => state.isRunning);
3469
- const nodeResults = chunkM7P2TQ6X_js.useWorkflowStore((state) => state.nodeResults);
3637
+ const nodes = chunkEFREXNZB_js.useWorkflowStore((state) => state.nodes);
3638
+ const isRunning = chunkEFREXNZB_js.useWorkflowStore((state) => state.isRunning);
3639
+ const nodeResults = chunkEFREXNZB_js.useWorkflowStore((state) => state.nodeResults);
3470
3640
  const startNode = nodes.find((node) => node.type === "start");
3471
3641
  const hasEndNode = nodes.some((node) => node.type === "end");
3472
3642
  const hasValidStartConfig = Boolean(
@@ -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
@@ -3754,8 +3924,8 @@ function inferVariables(config, nodeType) {
3754
3924
  }
3755
3925
  function VariableInspector({ open, onClose }) {
3756
3926
  const translations = chunkYXN2K77G_js.useTranslations("agents.workflow.variableInspector");
3757
- const nodes = chunkM7P2TQ6X_js.useWorkflowStore((state) => state.nodes);
3758
- const edges = chunkM7P2TQ6X_js.useWorkflowStore((state) => state.edges);
3927
+ const nodes = chunkEFREXNZB_js.useWorkflowStore((state) => state.nodes);
3928
+ const edges = chunkEFREXNZB_js.useWorkflowStore((state) => state.edges);
3759
3929
  const [expandedNodes, setExpandedNodes] = react.useState(/* @__PURE__ */ new Set());
3760
3930
  const toggleNodeExpansion = react.useCallback((nodeId) => {
3761
3931
  setExpandedNodes((current) => {
@@ -3817,8 +3987,8 @@ function VariableInspector({ open, onClose }) {
3817
3987
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-sm text-gray-500 dark:text-gray-400", children: translations("noNodes") })
3818
3988
  ] }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "divide-y divide-gray-100 dark:divide-gray-800", children: nodeVariableEntries.map((entry) => {
3819
3989
  const isExpanded = expandedNodes.has(entry.nodeId);
3820
- const IconComponent = chunkM7P2TQ6X_js.LOGIC_ICON_MAP[entry.nodeType];
3821
- const gradient = chunkM7P2TQ6X_js.LOGIC_NODE_GRADIENTS[entry.nodeType] ?? "from-gray-400 to-gray-500";
3990
+ const IconComponent = chunkEFREXNZB_js.LOGIC_ICON_MAP[entry.nodeType];
3991
+ const gradient = chunkEFREXNZB_js.LOGIC_NODE_GRADIENTS[entry.nodeType] ?? "from-gray-400 to-gray-500";
3822
3992
  const inputVariables = entry.variables.filter((variable) => variable.direction === "input");
3823
3993
  const outputVariables = entry.variables.filter((variable) => variable.direction === "output");
3824
3994
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-testid": `variable-node-${entry.nodeId}`, children: [
@@ -3884,7 +4054,7 @@ function RunInputDialog({
3884
4054
  onRun
3885
4055
  }) {
3886
4056
  const t = chunkYXN2K77G_js.useTranslations("agents.workflow.runInputDialog");
3887
- const nodes = chunkM7P2TQ6X_js.useWorkflowStore((state) => state.nodes);
4057
+ const nodes = chunkEFREXNZB_js.useWorkflowStore((state) => state.nodes);
3888
4058
  const [values, setValues] = react.useState({});
3889
4059
  const inputVariableNames = react.useMemo(() => {
3890
4060
  const storeStartNode = nodes.find((node) => node.type === "start");
@@ -3911,7 +4081,7 @@ function RunInputDialog({
3911
4081
  }, [onClose]);
3912
4082
  if (!open) return null;
3913
4083
  return /* @__PURE__ */ jsxRuntime.jsxs(
3914
- chunkTUEYBNWL_js.GlassModal,
4084
+ chunkGV6WJCEB_js.GlassModal,
3915
4085
  {
3916
4086
  open,
3917
4087
  onClose: handleClose,
@@ -3922,7 +4092,7 @@ function RunInputDialog({
3922
4092
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: inputVariableNames.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-center text-sm text-gray-500 dark:text-gray-400", children: t("noInputs") }) : inputVariableNames.map((variableName) => /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
3923
4093
  /* @__PURE__ */ jsxRuntime.jsx("label", { className: "mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300", children: variableName }),
3924
4094
  /* @__PURE__ */ jsxRuntime.jsx(
3925
- chunkTUEYBNWL_js.Input,
4095
+ chunkGV6WJCEB_js.Input,
3926
4096
  {
3927
4097
  value: values[variableName] ?? "",
3928
4098
  onChange: (event) => handleValueChange(variableName, event.target.value),
@@ -3931,8 +4101,8 @@ function RunInputDialog({
3931
4101
  )
3932
4102
  ] }, variableName)) }),
3933
4103
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-4 flex items-center justify-end gap-2", children: [
3934
- /* @__PURE__ */ jsxRuntime.jsx(chunkTUEYBNWL_js.Button, { size: "sm", plain: true, onClick: handleClose, children: t("cancel") }),
3935
- /* @__PURE__ */ jsxRuntime.jsxs(chunkTUEYBNWL_js.Button, { size: "sm", gradient: true, onClick: handleSubmit, children: [
4104
+ /* @__PURE__ */ jsxRuntime.jsx(chunkGV6WJCEB_js.Button, { size: "sm", plain: true, onClick: handleClose, children: t("cancel") }),
4105
+ /* @__PURE__ */ jsxRuntime.jsxs(chunkGV6WJCEB_js.Button, { size: "sm", gradient: true, onClick: handleSubmit, children: [
3936
4106
  /* @__PURE__ */ jsxRuntime.jsx(outline.PlayIcon, { className: "h-3.5 w-3.5", "data-slot": "icon" }),
3937
4107
  t("run")
3938
4108
  ] })
@@ -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
  }
@@ -3965,8 +4135,8 @@ function PreviewPanel({ open, onClose, workflowId, loadRuns }) {
3965
4135
  const [isLoadingRuns, setIsLoadingRuns] = react.useState(false);
3966
4136
  const [selectedRun, setSelectedRun] = react.useState(null);
3967
4137
  const [selectedNode, setSelectedNode] = react.useState(null);
3968
- const isRunning = chunkM7P2TQ6X_js.useWorkflowStore((state) => state.isRunning);
3969
- const nodeResults = chunkM7P2TQ6X_js.useWorkflowStore((state) => state.nodeResults);
4138
+ const isRunning = chunkEFREXNZB_js.useWorkflowStore((state) => state.isRunning);
4139
+ const nodeResults = chunkEFREXNZB_js.useWorkflowStore((state) => state.nodeResults);
3970
4140
  const refreshRuns = react.useCallback(async () => {
3971
4141
  setIsLoadingRuns(true);
3972
4142
  try {
@@ -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
@@ -4122,7 +4292,7 @@ var AutoSaveWorkspace = react.memo(function AutoSaveWorkspace2({
4122
4292
  onAutoSaveGraph(graph);
4123
4293
  }, [onAutoSaveGraph, onGraphSnapshot]);
4124
4294
  return /* @__PURE__ */ jsxRuntime.jsx(
4125
- chunkM7P2TQ6X_js.Workspace,
4295
+ chunkEFREXNZB_js.Workspace,
4126
4296
  {
4127
4297
  ...workspaceProps,
4128
4298
  onGraphChange: handleGraphChange
@@ -4130,7 +4300,7 @@ var AutoSaveWorkspace = react.memo(function AutoSaveWorkspace2({
4130
4300
  );
4131
4301
  });
4132
4302
  function DynamicIslandConfirm2(props) {
4133
- return /* @__PURE__ */ jsxRuntime.jsx(chunkTUEYBNWL_js.DynamicIslandConfirm, { ...props });
4303
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkGV6WJCEB_js.DynamicIslandConfirm, { ...props });
4134
4304
  }
4135
4305
  var JSON_PREVIEW_LINE_LIMIT = 50;
4136
4306
  function DslExportModal({ open, onClose, workflow, graph }) {
@@ -4184,7 +4354,7 @@ function DslExportModal({ open, onClose, workflow, graph }) {
4184
4354
  }, [jsonString, workflow.name, workflow.version]);
4185
4355
  if (!open) return null;
4186
4356
  return /* @__PURE__ */ jsxRuntime.jsx(
4187
- chunkTUEYBNWL_js.GlassModal,
4357
+ chunkGV6WJCEB_js.GlassModal,
4188
4358
  {
4189
4359
  open,
4190
4360
  onClose,
@@ -4226,7 +4396,7 @@ function DslExportModal({ open, onClose, workflow, graph }) {
4226
4396
  ] }),
4227
4397
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-3 border-t border-gray-200 px-1 py-4 dark:border-gray-700", children: [
4228
4398
  /* @__PURE__ */ jsxRuntime.jsx(
4229
- chunkTUEYBNWL_js.Button,
4399
+ chunkGV6WJCEB_js.Button,
4230
4400
  {
4231
4401
  type: "button",
4232
4402
  onClick: handleCopyToClipboard,
@@ -4243,7 +4413,7 @@ function DslExportModal({ open, onClose, workflow, graph }) {
4243
4413
  }
4244
4414
  ),
4245
4415
  /* @__PURE__ */ jsxRuntime.jsxs(
4246
- chunkTUEYBNWL_js.Button,
4416
+ chunkGV6WJCEB_js.Button,
4247
4417
  {
4248
4418
  type: "button",
4249
4419
  onClick: handleDownloadJson,
@@ -4402,7 +4572,7 @@ function DslImportModal({ open, onClose, onImport }) {
4402
4572
  }, []);
4403
4573
  if (!open) return null;
4404
4574
  return /* @__PURE__ */ jsxRuntime.jsx(
4405
- chunkTUEYBNWL_js.GlassModal,
4575
+ chunkGV6WJCEB_js.GlassModal,
4406
4576
  {
4407
4577
  open,
4408
4578
  onClose,
@@ -4442,7 +4612,7 @@ function DslImportModal({ open, onClose, onImport }) {
4442
4612
  ) : /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-testid": "import-validation-result", children: [
4443
4613
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-4 flex items-center justify-between", children: [
4444
4614
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-medium text-gray-700 dark:text-gray-300", children: fileName }),
4445
- /* @__PURE__ */ jsxRuntime.jsx(chunkTUEYBNWL_js.Button, { type: "button", plain: true, size: "sm", onClick: handleReset, children: translations("chooseAnother") })
4615
+ /* @__PURE__ */ jsxRuntime.jsx(chunkGV6WJCEB_js.Button, { type: "button", plain: true, size: "sm", onClick: handleReset, children: translations("chooseAnother") })
4446
4616
  ] }),
4447
4617
  validationResult.isValid ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-lg border border-green-200 bg-green-50 p-4 dark:border-green-800 dark:bg-green-900/20", children: [
4448
4618
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
@@ -4470,9 +4640,9 @@ function DslImportModal({ open, onClose, onImport }) {
4470
4640
  ] })
4471
4641
  ] }) }),
4472
4642
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-3 border-t border-gray-200 px-1 py-4 dark:border-gray-700", children: [
4473
- /* @__PURE__ */ jsxRuntime.jsx(chunkTUEYBNWL_js.Button, { type: "button", onClick: onClose, outline: true, size: "sm", "data-testid": "import-cancel-button", children: translations("cancel") }),
4643
+ /* @__PURE__ */ jsxRuntime.jsx(chunkGV6WJCEB_js.Button, { type: "button", onClick: onClose, outline: true, size: "sm", "data-testid": "import-cancel-button", children: translations("cancel") }),
4474
4644
  /* @__PURE__ */ jsxRuntime.jsxs(
4475
- chunkTUEYBNWL_js.Button,
4645
+ chunkGV6WJCEB_js.Button,
4476
4646
  {
4477
4647
  type: "button",
4478
4648
  onClick: handleImport,
@@ -4493,14 +4663,14 @@ function DslImportModal({ open, onClose, onImport }) {
4493
4663
  }
4494
4664
 
4495
4665
  // src/astrlabe/store/selectors.ts
4496
- var useCanUndo = () => chunkM7P2TQ6X_js.useWorkflowStore((state) => state.past.length > 0);
4497
- var useCanRedo = () => chunkM7P2TQ6X_js.useWorkflowStore((state) => state.future.length > 0);
4498
- var useHasCopied = () => chunkM7P2TQ6X_js.useWorkflowStore((state) => state.clipboard !== null);
4499
- var useContextMenu = () => chunkM7P2TQ6X_js.useWorkflowStore((state) => state.contextMenu);
4500
- var useEditingNodeId = () => chunkM7P2TQ6X_js.useWorkflowStore((state) => state.editingNodeId);
4501
- var useSelectedNodeCount = () => chunkM7P2TQ6X_js.useWorkflowStore((state) => state.nodes.filter((node) => node.selected).length);
4502
- var useIsRunning = () => chunkM7P2TQ6X_js.useWorkflowStore((state) => state.isRunning);
4503
- var useNodeResults = () => chunkM7P2TQ6X_js.useWorkflowStore((state) => state.nodeResults);
4666
+ var useCanUndo = () => chunkEFREXNZB_js.useWorkflowStore((state) => state.past.length > 0);
4667
+ var useCanRedo = () => chunkEFREXNZB_js.useWorkflowStore((state) => state.future.length > 0);
4668
+ var useHasCopied = () => chunkEFREXNZB_js.useWorkflowStore((state) => state.clipboard !== null);
4669
+ var useContextMenu = () => chunkEFREXNZB_js.useWorkflowStore((state) => state.contextMenu);
4670
+ var useEditingNodeId = () => chunkEFREXNZB_js.useWorkflowStore((state) => state.editingNodeId);
4671
+ var useSelectedNodeCount = () => chunkEFREXNZB_js.useWorkflowStore((state) => state.nodes.filter((node) => node.selected).length);
4672
+ var useIsRunning = () => chunkEFREXNZB_js.useWorkflowStore((state) => state.isRunning);
4673
+ var useNodeResults = () => chunkEFREXNZB_js.useWorkflowStore((state) => state.nodeResults);
4504
4674
  var DEFAULT_MAX_HISTORY = 50;
4505
4675
  function useUndoRedo(nodes, edges, setNodes, setEdges, maxHistory = DEFAULT_MAX_HISTORY) {
4506
4676
  const pastRef = react.useRef([]);
@@ -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-L6FVIWAJ.js.map
4996
+ //# sourceMappingURL=chunk-L6FVIWAJ.js.map