@datatechsolutions/ui 2.11.91 → 2.11.93

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 (137) hide show
  1. package/dist/astrlabe/contracts.d.mts +14 -3
  2. package/dist/astrlabe/contracts.d.ts +14 -3
  3. package/dist/astrlabe/index.d.mts +9 -3
  4. package/dist/astrlabe/index.d.ts +9 -3
  5. package/dist/astrlabe/index.js +120 -116
  6. package/dist/astrlabe/index.mjs +6 -6
  7. package/dist/astrlabe/utils.d.mts +1 -1
  8. package/dist/astrlabe/utils.d.ts +1 -1
  9. package/dist/astrlabe/utils.js +9 -9
  10. package/dist/astrlabe/utils.mjs +2 -2
  11. package/dist/astrlabe/workflow-canvas.d.mts +1 -1
  12. package/dist/astrlabe/workflow-canvas.d.ts +1 -1
  13. package/dist/astrlabe/workflow-canvas.js +5 -5
  14. package/dist/astrlabe/workflow-canvas.mjs +4 -4
  15. package/dist/{chunk-MLAIUJYC.js → chunk-24QKSC74.js} +6 -6
  16. package/dist/{chunk-MLAIUJYC.js.map → chunk-24QKSC74.js.map} +1 -1
  17. package/dist/{chunk-OQDWU6AE.js → chunk-2RDGJXYZ.js} +67 -67
  18. package/dist/{chunk-OQDWU6AE.js.map → chunk-2RDGJXYZ.js.map} +1 -1
  19. package/dist/{chunk-B5NZVS4A.js → chunk-3Z366CVM.js} +69 -69
  20. package/dist/{chunk-B5NZVS4A.js.map → chunk-3Z366CVM.js.map} +1 -1
  21. package/dist/{chunk-GWRJ5L36.js → chunk-43GCSCQA.js} +12 -12
  22. package/dist/{chunk-GWRJ5L36.js.map → chunk-43GCSCQA.js.map} +1 -1
  23. package/dist/{chunk-U4BTEKZT.mjs → chunk-4TY55HGO.mjs} +3 -3
  24. package/dist/{chunk-U4BTEKZT.mjs.map → chunk-4TY55HGO.mjs.map} +1 -1
  25. package/dist/{chunk-WNCPAWLC.mjs → chunk-5W7L7BT7.mjs} +13 -2
  26. package/dist/chunk-5W7L7BT7.mjs.map +1 -0
  27. package/dist/{chunk-7JFAOHZ3.mjs → chunk-6NAZVG2O.mjs} +4 -4
  28. package/dist/{chunk-7JFAOHZ3.mjs.map → chunk-6NAZVG2O.mjs.map} +1 -1
  29. package/dist/{chunk-J4QUCX27.mjs → chunk-A3BFURJB.mjs} +24 -25
  30. package/dist/chunk-A3BFURJB.mjs.map +1 -0
  31. package/dist/{chunk-L5VEY7G4.js → chunk-ARVLVWUC.js} +7 -5
  32. package/dist/chunk-ARVLVWUC.js.map +1 -0
  33. package/dist/{chunk-BVCS7RBR.js → chunk-BUI7BCUN.js} +33 -33
  34. package/dist/{chunk-BVCS7RBR.js.map → chunk-BUI7BCUN.js.map} +1 -1
  35. package/dist/{chunk-C7BI5LQ6.js → chunk-C3H4FM4A.js} +13 -2
  36. package/dist/chunk-C3H4FM4A.js.map +1 -0
  37. package/dist/{chunk-C7KAF363.js → chunk-DB64YDV2.js} +55 -55
  38. package/dist/{chunk-C7KAF363.js.map → chunk-DB64YDV2.js.map} +1 -1
  39. package/dist/{chunk-WIKMIULO.js → chunk-DIMLLLZR.js} +36 -36
  40. package/dist/{chunk-WIKMIULO.js.map → chunk-DIMLLLZR.js.map} +1 -1
  41. package/dist/{chunk-FDSU7GPS.mjs → chunk-DWFLIXES.mjs} +3 -3
  42. package/dist/{chunk-FDSU7GPS.mjs.map → chunk-DWFLIXES.mjs.map} +1 -1
  43. package/dist/{chunk-Y4DNREFH.js → chunk-FZTOP6EE.js} +190 -132
  44. package/dist/chunk-FZTOP6EE.js.map +1 -0
  45. package/dist/{chunk-URMZJ3WF.mjs → chunk-GMZ3PTNK.mjs} +8 -8
  46. package/dist/{chunk-URMZJ3WF.mjs.map → chunk-GMZ3PTNK.mjs.map} +1 -1
  47. package/dist/{chunk-HPIKJS5B.mjs → chunk-HGN5W56D.mjs} +3 -3
  48. package/dist/{chunk-HPIKJS5B.mjs.map → chunk-HGN5W56D.mjs.map} +1 -1
  49. package/dist/{chunk-CBVRUJ7N.mjs → chunk-HUGHELRM.mjs} +65 -8
  50. package/dist/chunk-HUGHELRM.mjs.map +1 -0
  51. package/dist/{chunk-6OWD54HK.mjs → chunk-LKJZGFM4.mjs} +3 -3
  52. package/dist/{chunk-6OWD54HK.mjs.map → chunk-LKJZGFM4.mjs.map} +1 -1
  53. package/dist/{chunk-AP7OWR6S.js → chunk-MEEFOZC4.js} +4 -4
  54. package/dist/{chunk-AP7OWR6S.js.map → chunk-MEEFOZC4.js.map} +1 -1
  55. package/dist/{chunk-CG3P5Z5U.mjs → chunk-MLAXYDEU.mjs} +3 -3
  56. package/dist/{chunk-CG3P5Z5U.mjs.map → chunk-MLAXYDEU.mjs.map} +1 -1
  57. package/dist/{chunk-YMGJ4FZZ.js → chunk-NA57KK4O.js} +4 -4
  58. package/dist/{chunk-YMGJ4FZZ.js.map → chunk-NA57KK4O.js.map} +1 -1
  59. package/dist/{chunk-5UU3RQRB.js → chunk-NJS2YC3J.js} +15 -2
  60. package/dist/chunk-NJS2YC3J.js.map +1 -0
  61. package/dist/{chunk-R5KUEOPU.js → chunk-NYQAEPC7.js} +200 -74
  62. package/dist/chunk-NYQAEPC7.js.map +1 -0
  63. package/dist/{chunk-Q7WGFPGK.mjs → chunk-OLXOBT42.mjs} +4 -4
  64. package/dist/{chunk-Q7WGFPGK.mjs.map → chunk-OLXOBT42.mjs.map} +1 -1
  65. package/dist/{chunk-E32B2MVK.js → chunk-PTGPQJZJ.js} +15 -15
  66. package/dist/{chunk-E32B2MVK.js.map → chunk-PTGPQJZJ.js.map} +1 -1
  67. package/dist/{chunk-OE4Z4FKM.mjs → chunk-PU2KTO4O.mjs} +7 -5
  68. package/dist/chunk-PU2KTO4O.mjs.map +1 -0
  69. package/dist/{chunk-KHAMY7MA.mjs → chunk-RXFAQFE7.mjs} +3 -3
  70. package/dist/{chunk-KHAMY7MA.mjs.map → chunk-RXFAQFE7.mjs.map} +1 -1
  71. package/dist/{chunk-SIBJRWUB.js → chunk-SMKN4ZVB.js} +4 -4
  72. package/dist/{chunk-SIBJRWUB.js.map → chunk-SMKN4ZVB.js.map} +1 -1
  73. package/dist/{chunk-WY3YDQXK.js → chunk-ST3GH5OM.js} +26 -26
  74. package/dist/{chunk-WY3YDQXK.js.map → chunk-ST3GH5OM.js.map} +1 -1
  75. package/dist/{chunk-36G7GAPU.mjs → chunk-TEQYIK2B.mjs} +126 -8
  76. package/dist/chunk-TEQYIK2B.mjs.map +1 -0
  77. package/dist/{chunk-53SRKVKQ.mjs → chunk-U7XM3N7F.mjs} +15 -2
  78. package/dist/chunk-U7XM3N7F.mjs.map +1 -0
  79. package/dist/{chunk-E2ZGFN2H.mjs → chunk-VGSWSQQU.mjs} +4 -4
  80. package/dist/{chunk-E2ZGFN2H.mjs.map → chunk-VGSWSQQU.mjs.map} +1 -1
  81. package/dist/{chunk-SOYGVHPZ.js → chunk-XSBZNPUO.js} +53 -53
  82. package/dist/{chunk-SOYGVHPZ.js.map → chunk-XSBZNPUO.js.map} +1 -1
  83. package/dist/{chunk-IEWFVP42.mjs → chunk-Y3WJAYOY.mjs} +6 -6
  84. package/dist/{chunk-IEWFVP42.mjs.map → chunk-Y3WJAYOY.mjs.map} +1 -1
  85. package/dist/{chunk-VPNZDLR6.mjs → chunk-YEWXDCCI.mjs} +4 -4
  86. package/dist/{chunk-VPNZDLR6.mjs.map → chunk-YEWXDCCI.mjs.map} +1 -1
  87. package/dist/{chunk-256TJHVO.mjs → chunk-ZHUPYX4Q.mjs} +3 -3
  88. package/dist/{chunk-256TJHVO.mjs.map → chunk-ZHUPYX4Q.mjs.map} +1 -1
  89. package/dist/{chunk-YN4IEDE4.js → chunk-ZKUYNCAG.js} +26 -27
  90. package/dist/chunk-ZKUYNCAG.js.map +1 -0
  91. package/dist/{index-AioB90qq.d.mts → index-CoB18TbG.d.ts} +9 -2
  92. package/dist/{index-D5ai0cGZ.d.ts → index-VI9gyJXl.d.mts} +9 -2
  93. package/dist/index.js +747 -747
  94. package/dist/index.mjs +2 -2
  95. package/dist/platform/admin/index.js +11 -11
  96. package/dist/platform/admin/index.mjs +5 -5
  97. package/dist/platform/agents-workspace.js +9 -9
  98. package/dist/platform/agents-workspace.mjs +8 -8
  99. package/dist/platform/app-shell.js +4 -4
  100. package/dist/platform/app-shell.mjs +3 -3
  101. package/dist/platform/auth/index.js +28 -28
  102. package/dist/platform/auth/index.mjs +5 -5
  103. package/dist/platform/billing/index.js +4 -4
  104. package/dist/platform/billing/index.mjs +3 -3
  105. package/dist/platform/impersonation/index.js +4 -4
  106. package/dist/platform/impersonation/index.mjs +3 -3
  107. package/dist/platform/index.d.mts +1 -1
  108. package/dist/platform/index.d.ts +1 -1
  109. package/dist/platform/index.js +101 -101
  110. package/dist/platform/index.mjs +21 -21
  111. package/dist/platform/pages/index.d.mts +3 -3
  112. package/dist/platform/pages/index.d.ts +3 -3
  113. package/dist/platform/pages/index.js +198 -198
  114. package/dist/platform/pages/index.mjs +10 -10
  115. package/dist/platform/settings/index.js +8 -8
  116. package/dist/platform/settings/index.mjs +7 -7
  117. package/dist/platform/workflow-api-client.d.mts +2 -2
  118. package/dist/platform/workflow-api-client.d.ts +2 -2
  119. package/dist/platform/workflow-api-client.js +61 -61
  120. package/dist/platform/workflow-api-client.mjs +1 -1
  121. package/dist/platform/workflow-canvas-shell.js +6 -6
  122. package/dist/platform/workflow-canvas-shell.mjs +5 -5
  123. package/dist/{workflow-api-client-CXN5iaih.d.ts → workflow-api-client-DVLhcpUj.d.ts} +26 -7
  124. package/dist/{workflow-api-client-XU83zq0k.d.mts → workflow-api-client-DpBxHTHr.d.mts} +26 -7
  125. package/package.json +1 -1
  126. package/dist/chunk-36G7GAPU.mjs.map +0 -1
  127. package/dist/chunk-53SRKVKQ.mjs.map +0 -1
  128. package/dist/chunk-5UU3RQRB.js.map +0 -1
  129. package/dist/chunk-C7BI5LQ6.js.map +0 -1
  130. package/dist/chunk-CBVRUJ7N.mjs.map +0 -1
  131. package/dist/chunk-J4QUCX27.mjs.map +0 -1
  132. package/dist/chunk-L5VEY7G4.js.map +0 -1
  133. package/dist/chunk-OE4Z4FKM.mjs.map +0 -1
  134. package/dist/chunk-R5KUEOPU.js.map +0 -1
  135. package/dist/chunk-WNCPAWLC.mjs.map +0 -1
  136. package/dist/chunk-Y4DNREFH.js.map +0 -1
  137. package/dist/chunk-YN4IEDE4.js.map +0 -1
@@ -1,15 +1,57 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkR5KUEOPU_js = require('./chunk-R5KUEOPU.js');
5
- var chunkYN4IEDE4_js = require('./chunk-YN4IEDE4.js');
4
+ var chunkNYQAEPC7_js = require('./chunk-NYQAEPC7.js');
5
+ var chunkZKUYNCAG_js = require('./chunk-ZKUYNCAG.js');
6
6
  var chunkYXN2K77G_js = require('./chunk-YXN2K77G.js');
7
- var chunkC7BI5LQ6_js = require('./chunk-C7BI5LQ6.js');
7
+ var chunkC3H4FM4A_js = require('./chunk-C3H4FM4A.js');
8
8
  var react = require('react');
9
+ var react$1 = require('@xyflow/react');
9
10
  var outline = require('@heroicons/react/24/outline');
10
11
  var jsxRuntime = require('react/jsx-runtime');
11
12
  var zustand = require('zustand');
12
13
 
14
+ var S3WriteFlowNode = react.memo(function S3WriteFlowNode2({ id, data, selected }) {
15
+ const t = chunkYXN2K77G_js.useTranslations("agents.workflow");
16
+ const { config, label, onDelete, onEdit } = data;
17
+ const isCompact = data.displayMode === "compact";
18
+ const keyPreview = config.key ? config.key.slice(0, 30) : "";
19
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
20
+ /* @__PURE__ */ jsxRuntime.jsx(chunkNYQAEPC7_js.NodeRunningIndicator, { nodeId: id }),
21
+ /* @__PURE__ */ jsxRuntime.jsx(chunkNYQAEPC7_js.WorkflowHandle, { type: "target", position: react$1.Position.Left, id: "left-in", colorClass: "!bg-cyan-500" }),
22
+ /* @__PURE__ */ jsxRuntime.jsxs(
23
+ chunkNYQAEPC7_js.NodeInteractiveCard,
24
+ {
25
+ nodeId: id,
26
+ onEdit,
27
+ compact: isCompact,
28
+ selected,
29
+ nodeType: "s3_write",
30
+ children: [
31
+ /* @__PURE__ */ jsxRuntime.jsx(
32
+ chunkNYQAEPC7_js.NodeCardHeader,
33
+ {
34
+ icon: /* @__PURE__ */ jsxRuntime.jsx(chunkNYQAEPC7_js.NodeIconBubble, { tone: "s3_write", children: /* @__PURE__ */ jsxRuntime.jsx(outline.CloudArrowUpIcon, { className: "h-5 w-5 text-white" }) }),
35
+ title: label,
36
+ description: t("s3WriteNodeDescription"),
37
+ compact: isCompact,
38
+ iconClassName: ""
39
+ }
40
+ ),
41
+ /* @__PURE__ */ jsxRuntime.jsxs(chunkNYQAEPC7_js.NodeCardMeta, { compact: isCompact, children: [
42
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
43
+ /* @__PURE__ */ jsxRuntime.jsx(chunkNYQAEPC7_js.NodeCardBadge, { tone: "s3_write", children: t("s3WriteNode") }),
44
+ config.bucket && /* @__PURE__ */ jsxRuntime.jsx(chunkNYQAEPC7_js.NodeCardBadge, { tone: "s3_write", soft: true, children: config.bucket }),
45
+ keyPreview && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-[10px] text-gray-400 dark:text-gray-500", children: keyPreview })
46
+ ] }),
47
+ /* @__PURE__ */ jsxRuntime.jsx(chunkNYQAEPC7_js.NodeCardDeleteAction, { nodeId: id, onDelete })
48
+ ] })
49
+ ]
50
+ }
51
+ ),
52
+ /* @__PURE__ */ jsxRuntime.jsx(chunkNYQAEPC7_js.WorkflowHandle, { type: "source", position: react$1.Position.Right, id: "right-out", colorClass: "!bg-cyan-500" })
53
+ ] });
54
+ });
13
55
  function AnthropicModelIcon({ className }) {
14
56
  return /* @__PURE__ */ jsxRuntime.jsx("svg", { role: "img", viewBox: "0 0 24 24", fill: "currentColor", className, "aria-label": "Anthropic", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M17.3041 3.541h-3.6718l6.696 16.918H24Zm-10.6082 0L0 20.459h3.7442l1.3693-3.5527h7.0052l1.3693 3.5528h3.7442L10.5363 3.5409Zm-.3712 10.2232 2.2914-5.9456 2.2914 5.9456Z" }) });
15
57
  }
@@ -71,7 +113,7 @@ function OutputSchemaBuilder({ value, onChange, depth = 0 }) {
71
113
  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
114
  /* @__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
115
  /* @__PURE__ */ jsxRuntime.jsx(
74
- chunkYN4IEDE4_js.Button,
116
+ chunkZKUYNCAG_js.Button,
75
117
  {
76
118
  type: "button",
77
119
  outline: true,
@@ -135,7 +177,7 @@ function OutputSchemaBuilder({ value, onChange, depth = 0 }) {
135
177
  },
136
178
  index
137
179
  )),
138
- /* @__PURE__ */ jsxRuntime.jsx(chunkYN4IEDE4_js.Button, { type: "button", outline: true, onClick: addField, children: "+ Add field" })
180
+ /* @__PURE__ */ jsxRuntime.jsx(chunkZKUYNCAG_js.Button, { type: "button", outline: true, onClick: addField, children: "+ Add field" })
139
181
  ] })
140
182
  ] });
141
183
  }
@@ -158,7 +200,7 @@ function FieldEditor({
158
200
  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
201
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-[1fr_140px_auto_auto] items-end gap-2", children: [
160
202
  /* @__PURE__ */ jsxRuntime.jsx(
161
- chunkYN4IEDE4_js.FormInput,
203
+ chunkZKUYNCAG_js.FormInput,
162
204
  {
163
205
  label: "Name",
164
206
  value: field.name,
@@ -167,7 +209,7 @@ function FieldEditor({
167
209
  }
168
210
  ),
169
211
  /* @__PURE__ */ jsxRuntime.jsx(
170
- chunkYN4IEDE4_js.FormSelect,
212
+ chunkZKUYNCAG_js.FormSelect,
171
213
  {
172
214
  label: "Type",
173
215
  value: field.type,
@@ -187,10 +229,10 @@ function FieldEditor({
187
229
  ),
188
230
  "Required"
189
231
  ] }),
190
- /* @__PURE__ */ jsxRuntime.jsx(chunkYN4IEDE4_js.Button, { type: "button", plain: true, onClick: onRemove, children: "Remove" })
232
+ /* @__PURE__ */ jsxRuntime.jsx(chunkZKUYNCAG_js.Button, { type: "button", plain: true, onClick: onRemove, children: "Remove" })
191
233
  ] }),
192
234
  /* @__PURE__ */ jsxRuntime.jsx(
193
- chunkYN4IEDE4_js.FormInput,
235
+ chunkZKUYNCAG_js.FormInput,
194
236
  {
195
237
  label: "Description (optional)",
196
238
  value: field.description,
@@ -283,7 +325,7 @@ function OutputCard({ label, value }) {
283
325
  function AgentProfileHeader({ agent, models, t, selectedModelId, setSelectedModelId, selectedFramework, temperature, setTemperature, elo, setElo, onChanged }) {
284
326
  const modelName = models.find((model) => model.id === selectedModelId)?.name ?? selectedModelId ?? "\u2014";
285
327
  const avatarUrl = agent.avatar;
286
- const frameworkMeta = chunkR5KUEOPU_js.getFrameworkMeta(selectedFramework);
328
+ const frameworkMeta = chunkNYQAEPC7_js.getFrameworkMeta(selectedFramework);
287
329
  const tierInfo = getEloTier(elo);
288
330
  const difficultyConfig = {
289
331
  beginner: { color: "bg-cyan-100 text-cyan-700 dark:bg-cyan-900/30 dark:text-cyan-400", labelKey: "agentDrawer.tierBeginner" },
@@ -559,13 +601,13 @@ function AgentCapabilityCard({ elo, setElo, models, selectedModelId, setSelected
559
601
  ] });
560
602
  }
561
603
  function ConfigTab({ models, t, selectedModelId, setSelectedModelId, selectedFramework, setSelectedFramework, markDirty, connectedProviderTypes }) {
562
- const frameworkKeys = Object.keys(chunkR5KUEOPU_js.FRAMEWORK_META);
604
+ const frameworkKeys = Object.keys(chunkNYQAEPC7_js.FRAMEWORK_META);
563
605
  const hasProviderConstraints = connectedProviderTypes.length > 0;
564
- const compatibleModels = chunkR5KUEOPU_js.getCompatibleModels(models, selectedFramework);
606
+ const compatibleModels = chunkNYQAEPC7_js.getCompatibleModels(models, selectedFramework);
565
607
  const handleFrameworkChange = react.useCallback((newFramework) => {
566
608
  setSelectedFramework(newFramework);
567
- if (!chunkR5KUEOPU_js.isModelCompatibleWithFramework(selectedModelId, newFramework)) {
568
- const compatible = chunkR5KUEOPU_js.getCompatibleModels(models, newFramework);
609
+ if (!chunkNYQAEPC7_js.isModelCompatibleWithFramework(selectedModelId, newFramework)) {
610
+ const compatible = chunkNYQAEPC7_js.getCompatibleModels(models, newFramework);
569
611
  if (compatible.length > 0) {
570
612
  setSelectedModelId(compatible[0].id);
571
613
  }
@@ -576,10 +618,10 @@ function ConfigTab({ models, t, selectedModelId, setSelectedModelId, selectedFra
576
618
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
577
619
  /* @__PURE__ */ jsxRuntime.jsx("label", { className: "mb-2 block text-xs font-medium text-gray-500 dark:text-gray-400", children: t("agentDrawer.framework") }),
578
620
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1.5", children: frameworkKeys.map((key) => {
579
- const meta = chunkR5KUEOPU_js.FRAMEWORK_META[key];
621
+ const meta = chunkNYQAEPC7_js.FRAMEWORK_META[key];
580
622
  const isSelected = key === selectedFramework;
581
- const compatCount = chunkR5KUEOPU_js.getCompatibleModels(models, key).length;
582
- const isCompatibleWithProviders = !hasProviderConstraints || chunkR5KUEOPU_js.isFrameworkCompatibleWithProviders(key, connectedProviderTypes);
623
+ const compatCount = chunkNYQAEPC7_js.getCompatibleModels(models, key).length;
624
+ const isCompatibleWithProviders = !hasProviderConstraints || chunkNYQAEPC7_js.isFrameworkCompatibleWithProviders(key, connectedProviderTypes);
583
625
  return /* @__PURE__ */ jsxRuntime.jsxs(
584
626
  "button",
585
627
  {
@@ -611,7 +653,7 @@ function ConfigTab({ models, t, selectedModelId, setSelectedModelId, selectedFra
611
653
  ] }),
612
654
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-2 gap-2", children: models.map((model) => {
613
655
  const isSelected = model.id === selectedModelId;
614
- const isCompatible = chunkR5KUEOPU_js.isModelCompatibleWithFramework(model.id, selectedFramework);
656
+ const isCompatible = chunkNYQAEPC7_js.isModelCompatibleWithFramework(model.id, selectedFramework);
615
657
  const { IconComponent, color, providerLabel } = getModelIcon(model.id);
616
658
  return /* @__PURE__ */ jsxRuntime.jsxs(
617
659
  "button",
@@ -735,7 +777,7 @@ function PromptTab({
735
777
  ] });
736
778
  }
737
779
  function ResultsTab({ agentId, t }) {
738
- const nodeResults = chunkR5KUEOPU_js.useWorkflowStore((state) => state.nodeResults);
780
+ const nodeResults = chunkNYQAEPC7_js.useWorkflowStore((state) => state.nodeResults);
739
781
  const agentResult = react.useMemo(() => {
740
782
  return nodeResults[agentId] ?? null;
741
783
  }, [nodeResults, agentId]);
@@ -825,10 +867,10 @@ function ModelsTab({ modelProviders, selectedProviderId, onSelectProvider, model
825
867
  const providerModels = modelsByProvider.find((p) => p.provider.id === selectedProviderId);
826
868
  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
869
  const compatibleModels = providerModels.models.filter(
828
- (m) => chunkR5KUEOPU_js.isModelCompatibleWithFramework(m.id, agentFramework)
870
+ (m) => chunkNYQAEPC7_js.isModelCompatibleWithFramework(m.id, agentFramework)
829
871
  );
830
872
  const incompatibleModels = providerModels.models.filter(
831
- (m) => !chunkR5KUEOPU_js.isModelCompatibleWithFramework(m.id, agentFramework)
873
+ (m) => !chunkNYQAEPC7_js.isModelCompatibleWithFramework(m.id, agentFramework)
832
874
  );
833
875
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
834
876
  /* @__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 +943,7 @@ function ToolsTab({ agentTools, enabledToolIds, onToggle, agentFramework, t }) {
901
943
  ] }),
902
944
  tool.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "truncate text-[10px] text-gray-400 dark:text-gray-500", children: tool.description }),
903
945
  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 = chunkR5KUEOPU_js.getFrameworkMeta(framework);
946
+ const meta = chunkNYQAEPC7_js.getFrameworkMeta(framework);
905
947
  const isCurrentFw = framework === agentFramework;
906
948
  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
949
  /* @__PURE__ */ jsxRuntime.jsx(meta.IconComponent, { className: "h-2.5 w-2.5" }),
@@ -918,7 +960,7 @@ function ToolsTab({ agentTools, enabledToolIds, onToggle, agentFramework, t }) {
918
960
  event.stopPropagation();
919
961
  },
920
962
  children: /* @__PURE__ */ jsxRuntime.jsx(
921
- chunkYN4IEDE4_js.ToggleSwitch,
963
+ chunkZKUYNCAG_js.ToggleSwitch,
922
964
  {
923
965
  checked: isEnabled,
924
966
  onChange: () => onToggle(tool.agentToolId),
@@ -1077,9 +1119,9 @@ function AdvancedTab({
1077
1119
  }
1078
1120
  function AgentModal({ onSaved, onPersist }) {
1079
1121
  const t = chunkYXN2K77G_js.useTranslations("agents.workflow");
1080
- const activeModal = chunkR5KUEOPU_js.useModalStore((s) => s.activeModal);
1081
- const agentData = chunkR5KUEOPU_js.useModalStore((s) => s.agentData);
1082
- const closeModal = chunkR5KUEOPU_js.useModalStore((s) => s.closeModal);
1122
+ const activeModal = chunkNYQAEPC7_js.useModalStore((s) => s.activeModal);
1123
+ const agentData = chunkNYQAEPC7_js.useModalStore((s) => s.agentData);
1124
+ const closeModal = chunkNYQAEPC7_js.useModalStore((s) => s.closeModal);
1083
1125
  const open = activeModal === "agent";
1084
1126
  const agent = agentData?.agent ?? null;
1085
1127
  const models = agentData?.models ?? [];
@@ -1241,7 +1283,7 @@ function AgentModal({ onSaved, onPersist }) {
1241
1283
  )
1242
1284
  ] });
1243
1285
  return /* @__PURE__ */ jsxRuntime.jsxs(
1244
- chunkYN4IEDE4_js.GlassModal,
1286
+ chunkZKUYNCAG_js.GlassModal,
1245
1287
  {
1246
1288
  open,
1247
1289
  onClose: handleClose,
@@ -1429,7 +1471,7 @@ function SubworkflowModal({ onSaved, onMaximize }) {
1429
1471
  const markDirty = useSubworkflowStore((s) => s.markDirty);
1430
1472
  const markSaved = useSubworkflowStore((s) => s.markSaved);
1431
1473
  const closeModal = useSubworkflowStore((s) => s.closeModal);
1432
- const agentBehind = chunkR5KUEOPU_js.useModalStore((s) => s.activeModal === "agent" ? s.agentData?.agent?.name : null);
1474
+ const agentBehind = chunkNYQAEPC7_js.useModalStore((s) => s.activeModal === "agent" ? s.agentData?.agent?.name : null);
1433
1475
  const isCreateMode = !tool?.toolId;
1434
1476
  const initialGraph = react.useMemo(() => {
1435
1477
  const config = tool?.config;
@@ -1458,9 +1500,9 @@ function SubworkflowModal({ onSaved, onMaximize }) {
1458
1500
  }, [tool, onSaved, name, category, description, timeoutMs, latestGraphRef, markSaved]);
1459
1501
  if (!tool) return null;
1460
1502
  const categoryKey = category ?? "external";
1461
- const gradient = tool.color ?? chunkR5KUEOPU_js.CATEGORY_COLORS[categoryKey] ?? chunkR5KUEOPU_js.CATEGORY_COLORS.external;
1462
- const categoryPill = chunkR5KUEOPU_js.CATEGORY_PILL_COLORS[categoryKey] ?? chunkR5KUEOPU_js.CATEGORY_PILL_COLORS.external;
1463
- const IconComponent = chunkR5KUEOPU_js.ICON_MAP[tool.icon ?? ""] ?? outline.ArrowPathRoundedSquareIcon;
1503
+ const gradient = tool.color ?? chunkNYQAEPC7_js.CATEGORY_COLORS[categoryKey] ?? chunkNYQAEPC7_js.CATEGORY_COLORS.external;
1504
+ const categoryPill = chunkNYQAEPC7_js.CATEGORY_PILL_COLORS[categoryKey] ?? chunkNYQAEPC7_js.CATEGORY_PILL_COLORS.external;
1505
+ const IconComponent = chunkNYQAEPC7_js.ICON_MAP[tool.icon ?? ""] ?? outline.ArrowPathRoundedSquareIcon;
1464
1506
  const graph = latestGraphRef.current;
1465
1507
  const startNode = graph.nodes.find((n) => n.type === "start");
1466
1508
  const endNode = graph.nodes.find((n) => n.type === "end");
@@ -1493,7 +1535,7 @@ function SubworkflowModal({ onSaved, onMaximize }) {
1493
1535
  ] })
1494
1536
  ] });
1495
1537
  return /* @__PURE__ */ jsxRuntime.jsx(
1496
- chunkYN4IEDE4_js.GlassModal,
1538
+ chunkZKUYNCAG_js.GlassModal,
1497
1539
  {
1498
1540
  open,
1499
1541
  onClose: closeModal,
@@ -1525,7 +1567,7 @@ function SubworkflowModal({ onSaved, onMaximize }) {
1525
1567
  {
1526
1568
  type: "button",
1527
1569
  onClick: () => setCategory(cat),
1528
- className: `rounded-full px-2 py-1 text-[9px] font-semibold transition-all ${cat === category ? `${chunkR5KUEOPU_js.CATEGORY_PILL_COLORS[cat] ?? chunkR5KUEOPU_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"}`,
1570
+ className: `rounded-full px-2 py-1 text-[9px] font-semibold transition-all ${cat === category ? `${chunkNYQAEPC7_js.CATEGORY_PILL_COLORS[cat] ?? chunkNYQAEPC7_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
1571
  children: cat
1530
1572
  },
1531
1573
  cat
@@ -1612,7 +1654,7 @@ function SubworkflowModal({ onSaved, onMaximize }) {
1612
1654
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-auto" })
1613
1655
  ] }),
1614
1656
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(
1615
- chunkR5KUEOPU_js.WorkflowCanvas,
1657
+ chunkNYQAEPC7_js.WorkflowCanvas,
1616
1658
  {
1617
1659
  initialGraph,
1618
1660
  agents: [],
@@ -1628,9 +1670,9 @@ function SubworkflowModal({ onSaved, onMaximize }) {
1628
1670
  }
1629
1671
  function PipelineSettingsModal({ onSave }) {
1630
1672
  const t = chunkYXN2K77G_js.useTranslations("agents.workflow");
1631
- const activeModal = chunkR5KUEOPU_js.useModalStore((s) => s.activeModal);
1632
- const data = chunkR5KUEOPU_js.useModalStore((s) => s.pipelineSettingsData);
1633
- const closeModal = chunkR5KUEOPU_js.useModalStore((s) => s.closeModal);
1673
+ const activeModal = chunkNYQAEPC7_js.useModalStore((s) => s.activeModal);
1674
+ const data = chunkNYQAEPC7_js.useModalStore((s) => s.pipelineSettingsData);
1675
+ const closeModal = chunkNYQAEPC7_js.useModalStore((s) => s.closeModal);
1634
1676
  const open = activeModal === "pipeline-settings";
1635
1677
  const [nameValue, setNameValue] = react.useState("");
1636
1678
  const [descriptionValue, setDescriptionValue] = react.useState("");
@@ -1692,7 +1734,7 @@ function PipelineSettingsModal({ onSave }) {
1692
1734
  }
1693
1735
  ),
1694
1736
  /* @__PURE__ */ jsxRuntime.jsxs(
1695
- chunkYN4IEDE4_js.Button,
1737
+ chunkZKUYNCAG_js.Button,
1696
1738
  {
1697
1739
  type: "submit",
1698
1740
  form: "pipeline-settings-form",
@@ -1707,7 +1749,7 @@ function PipelineSettingsModal({ onSave }) {
1707
1749
  )
1708
1750
  ] });
1709
1751
  return /* @__PURE__ */ jsxRuntime.jsx(
1710
- chunkYN4IEDE4_js.GlassModal,
1752
+ chunkZKUYNCAG_js.GlassModal,
1711
1753
  {
1712
1754
  open,
1713
1755
  onClose: closeModal,
@@ -1721,7 +1763,7 @@ function PipelineSettingsModal({ onSave }) {
1721
1763
  onSubmit: handleSubmit,
1722
1764
  children: /* @__PURE__ */ jsxRuntime.jsxs("form", { id: "pipeline-settings-form", onSubmit: handleSubmit, className: "space-y-5", children: [
1723
1765
  /* @__PURE__ */ jsxRuntime.jsx(
1724
- chunkYN4IEDE4_js.FormInput,
1766
+ chunkZKUYNCAG_js.FormInput,
1725
1767
  {
1726
1768
  label: t("pipelineName"),
1727
1769
  value: nameValue,
@@ -1731,7 +1773,7 @@ function PipelineSettingsModal({ onSave }) {
1731
1773
  }
1732
1774
  ),
1733
1775
  /* @__PURE__ */ jsxRuntime.jsx(
1734
- chunkYN4IEDE4_js.FormTextarea,
1776
+ chunkZKUYNCAG_js.FormTextarea,
1735
1777
  {
1736
1778
  label: t("pipelineDescription"),
1737
1779
  value: descriptionValue,
@@ -1742,7 +1784,7 @@ function PipelineSettingsModal({ onSave }) {
1742
1784
  ),
1743
1785
  lifecycleAvailable && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1744
1786
  /* @__PURE__ */ jsxRuntime.jsx(
1745
- chunkYN4IEDE4_js.FormInput,
1787
+ chunkZKUYNCAG_js.FormInput,
1746
1788
  {
1747
1789
  label: t("pipelineSlug", { _: "Slug" }),
1748
1790
  value: slugValue,
@@ -1869,7 +1911,7 @@ function RunReplayModal({
1869
1911
  }
1870
1912
  ),
1871
1913
  /* @__PURE__ */ jsxRuntime.jsxs(
1872
- chunkYN4IEDE4_js.Button,
1914
+ chunkZKUYNCAG_js.Button,
1873
1915
  {
1874
1916
  type: "submit",
1875
1917
  form: "run-replay-form",
@@ -1884,7 +1926,7 @@ function RunReplayModal({
1884
1926
  ] })
1885
1927
  ] });
1886
1928
  return /* @__PURE__ */ jsxRuntime.jsx(
1887
- chunkYN4IEDE4_js.GlassModal,
1929
+ chunkZKUYNCAG_js.GlassModal,
1888
1930
  {
1889
1931
  open,
1890
1932
  onClose,
@@ -1958,7 +2000,7 @@ function RowEditor({
1958
2000
  ]
1959
2001
  }
1960
2002
  ) : isJson ? /* @__PURE__ */ jsxRuntime.jsx(
1961
- chunkYN4IEDE4_js.FormTextarea,
2003
+ chunkZKUYNCAG_js.FormTextarea,
1962
2004
  {
1963
2005
  value: row.value,
1964
2006
  onValueChange: (v) => onChange({ value: v }),
@@ -1966,7 +2008,7 @@ function RowEditor({
1966
2008
  className: "font-mono"
1967
2009
  }
1968
2010
  ) : /* @__PURE__ */ jsxRuntime.jsx(
1969
- chunkYN4IEDE4_js.FormInput,
2011
+ chunkZKUYNCAG_js.FormInput,
1970
2012
  {
1971
2013
  type: row.kind === "number" ? "number" : "text",
1972
2014
  value: row.value,
@@ -2070,7 +2112,7 @@ function ExecutionTimelinePanel({
2070
2112
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "truncate font-medium text-slate-900 dark:text-white", children: entry.nodeId }),
2071
2113
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs text-slate-500 dark:text-slate-400", children: entry.nodeType })
2072
2114
  ] }),
2073
- /* @__PURE__ */ jsxRuntime.jsxs(chunkYN4IEDE4_js.Badge, { color: meta.color, children: [
2115
+ /* @__PURE__ */ jsxRuntime.jsxs(chunkZKUYNCAG_js.Badge, { color: meta.color, children: [
2074
2116
  /* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "mr-1 h-3 w-3" }),
2075
2117
  labels[entry.status]
2076
2118
  ] })
@@ -2100,7 +2142,7 @@ function NodeInspector({
2100
2142
  /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "truncate text-base font-semibold text-slate-900 dark:text-white", children: entry.nodeId }),
2101
2143
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-slate-500 dark:text-slate-400", children: entry.nodeType })
2102
2144
  ] }),
2103
- /* @__PURE__ */ jsxRuntime.jsx(chunkYN4IEDE4_js.Badge, { color: meta.color, children: labels[entry.status] })
2145
+ /* @__PURE__ */ jsxRuntime.jsx(chunkZKUYNCAG_js.Badge, { color: meta.color, children: labels[entry.status] })
2104
2146
  ] }),
2105
2147
  /* @__PURE__ */ jsxRuntime.jsxs("dl", { className: "grid grid-cols-2 gap-3 text-xs text-slate-500 dark:text-slate-400", children: [
2106
2148
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
@@ -2270,7 +2312,7 @@ function RuleConditionBuilder({ value, onChange, depth = 0 }) {
2270
2312
  };
2271
2313
  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: [
2272
2314
  /* @__PURE__ */ jsxRuntime.jsx(
2273
- chunkYN4IEDE4_js.FormSelect,
2315
+ chunkZKUYNCAG_js.FormSelect,
2274
2316
  {
2275
2317
  label: "Operator",
2276
2318
  value: value.operator,
@@ -2293,7 +2335,7 @@ function SimpleEditor({
2293
2335
  const isTruthy = value.operator === "truthy";
2294
2336
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: [
2295
2337
  /* @__PURE__ */ jsxRuntime.jsx(
2296
- chunkYN4IEDE4_js.FormInput,
2338
+ chunkZKUYNCAG_js.FormInput,
2297
2339
  {
2298
2340
  label: "Field",
2299
2341
  hint: "Dotted reference into the variable pool \u2014 e.g. `parse-pricing.margin`, `inputs.fuelType`",
@@ -2303,7 +2345,7 @@ function SimpleEditor({
2303
2345
  }
2304
2346
  ),
2305
2347
  !isTruthy && /* @__PURE__ */ jsxRuntime.jsx(
2306
- chunkYN4IEDE4_js.FormInput,
2348
+ chunkZKUYNCAG_js.FormInput,
2307
2349
  {
2308
2350
  label: "Value",
2309
2351
  hint: "Literal. Numeric operators coerce via `as f64`.",
@@ -2319,7 +2361,7 @@ function ThresholdEditor({
2319
2361
  }) {
2320
2362
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-3", children: [
2321
2363
  /* @__PURE__ */ jsxRuntime.jsx(
2322
- chunkYN4IEDE4_js.FormInput,
2364
+ chunkZKUYNCAG_js.FormInput,
2323
2365
  {
2324
2366
  label: "Field",
2325
2367
  value: value.field ?? "",
@@ -2328,7 +2370,7 @@ function ThresholdEditor({
2328
2370
  }
2329
2371
  ),
2330
2372
  /* @__PURE__ */ jsxRuntime.jsx(
2331
- chunkYN4IEDE4_js.FormSelect,
2373
+ chunkZKUYNCAG_js.FormSelect,
2332
2374
  {
2333
2375
  label: "Direction",
2334
2376
  value: value.comparison ?? "gte",
@@ -2342,7 +2384,7 @@ function ThresholdEditor({
2342
2384
  }
2343
2385
  ),
2344
2386
  /* @__PURE__ */ jsxRuntime.jsx(
2345
- chunkYN4IEDE4_js.FormInput,
2387
+ chunkZKUYNCAG_js.FormInput,
2346
2388
  {
2347
2389
  label: "Threshold",
2348
2390
  type: "number",
@@ -2359,7 +2401,7 @@ function RegexEditor({
2359
2401
  }) {
2360
2402
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: [
2361
2403
  /* @__PURE__ */ jsxRuntime.jsx(
2362
- chunkYN4IEDE4_js.FormInput,
2404
+ chunkZKUYNCAG_js.FormInput,
2363
2405
  {
2364
2406
  label: "Field",
2365
2407
  value: value.field ?? "",
@@ -2368,7 +2410,7 @@ function RegexEditor({
2368
2410
  }
2369
2411
  ),
2370
2412
  /* @__PURE__ */ jsxRuntime.jsx(
2371
- chunkYN4IEDE4_js.FormInput,
2413
+ chunkZKUYNCAG_js.FormInput,
2372
2414
  {
2373
2415
  label: "Pattern",
2374
2416
  hint: "Rust regex syntax \u2014 `(?i)` etc. supported.",
@@ -2396,7 +2438,7 @@ function TimeWindowEditor({
2396
2438
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
2397
2439
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: [
2398
2440
  /* @__PURE__ */ jsxRuntime.jsx(
2399
- chunkYN4IEDE4_js.FormSelect,
2441
+ chunkZKUYNCAG_js.FormSelect,
2400
2442
  {
2401
2443
  label: "Timezone",
2402
2444
  value: value.timezone ?? "UTC",
@@ -2405,7 +2447,7 @@ function TimeWindowEditor({
2405
2447
  }
2406
2448
  ),
2407
2449
  /* @__PURE__ */ jsxRuntime.jsx(
2408
- chunkYN4IEDE4_js.FormInput,
2450
+ chunkZKUYNCAG_js.FormInput,
2409
2451
  {
2410
2452
  label: "Timestamp field (optional)",
2411
2453
  hint: "Pulls a timestamp from the pool. Leave blank to use the run's wall-clock.",
@@ -2418,7 +2460,7 @@ function TimeWindowEditor({
2418
2460
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
2419
2461
  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: [
2420
2462
  /* @__PURE__ */ jsxRuntime.jsx(
2421
- chunkYN4IEDE4_js.FormInput,
2463
+ chunkZKUYNCAG_js.FormInput,
2422
2464
  {
2423
2465
  label: `Start (hour)`,
2424
2466
  type: "number",
@@ -2429,7 +2471,7 @@ function TimeWindowEditor({
2429
2471
  }
2430
2472
  ),
2431
2473
  /* @__PURE__ */ jsxRuntime.jsx(
2432
- chunkYN4IEDE4_js.FormInput,
2474
+ chunkZKUYNCAG_js.FormInput,
2433
2475
  {
2434
2476
  label: `End (hour)`,
2435
2477
  type: "number",
@@ -2439,9 +2481,9 @@ function TimeWindowEditor({
2439
2481
  onValueChange: (raw) => update(index, { endHour: clampHour(raw, 24) })
2440
2482
  }
2441
2483
  ),
2442
- /* @__PURE__ */ jsxRuntime.jsx(chunkYN4IEDE4_js.Button, { type: "button", plain: true, onClick: () => remove(index), children: "Remove" })
2484
+ /* @__PURE__ */ jsxRuntime.jsx(chunkZKUYNCAG_js.Button, { type: "button", plain: true, onClick: () => remove(index), children: "Remove" })
2443
2485
  ] }, index)),
2444
- /* @__PURE__ */ jsxRuntime.jsx(chunkYN4IEDE4_js.Button, { type: "button", outline: true, onClick: add, children: "+ Add window" })
2486
+ /* @__PURE__ */ jsxRuntime.jsx(chunkZKUYNCAG_js.Button, { type: "button", outline: true, onClick: add, children: "+ Add window" })
2445
2487
  ] })
2446
2488
  ] });
2447
2489
  }
@@ -2464,7 +2506,7 @@ function BooleanGroupEditor({
2464
2506
  });
2465
2507
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
2466
2508
  /* @__PURE__ */ jsxRuntime.jsx(
2467
- chunkYN4IEDE4_js.FormSelect,
2509
+ chunkZKUYNCAG_js.FormSelect,
2468
2510
  {
2469
2511
  label: "Combinator",
2470
2512
  value: value.combinator ?? "and",
@@ -2482,9 +2524,9 @@ function BooleanGroupEditor({
2482
2524
  depth
2483
2525
  }
2484
2526
  ),
2485
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-2 text-right", children: /* @__PURE__ */ jsxRuntime.jsx(chunkYN4IEDE4_js.Button, { type: "button", plain: true, onClick: () => remove(index), children: "Remove operand" }) })
2527
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-2 text-right", children: /* @__PURE__ */ jsxRuntime.jsx(chunkZKUYNCAG_js.Button, { type: "button", plain: true, onClick: () => remove(index), children: "Remove operand" }) })
2486
2528
  ] }, index)),
2487
- /* @__PURE__ */ jsxRuntime.jsx(chunkYN4IEDE4_js.Button, { type: "button", outline: true, onClick: add, children: "+ Add operand" })
2529
+ /* @__PURE__ */ jsxRuntime.jsx(chunkZKUYNCAG_js.Button, { type: "button", outline: true, onClick: add, children: "+ Add operand" })
2488
2530
  ] })
2489
2531
  ] });
2490
2532
  }
@@ -2520,7 +2562,7 @@ function RuleActionBuilder({ value, onChange }) {
2520
2562
  };
2521
2563
  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: [
2522
2564
  /* @__PURE__ */ jsxRuntime.jsx(
2523
- chunkYN4IEDE4_js.FormSelect,
2565
+ chunkZKUYNCAG_js.FormSelect,
2524
2566
  {
2525
2567
  label: "Action type",
2526
2568
  value: type,
@@ -2530,7 +2572,7 @@ function RuleActionBuilder({ value, onChange }) {
2530
2572
  ),
2531
2573
  type === "adjust_price" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: [
2532
2574
  /* @__PURE__ */ jsxRuntime.jsx(
2533
- chunkYN4IEDE4_js.FormInput,
2575
+ chunkZKUYNCAG_js.FormInput,
2534
2576
  {
2535
2577
  label: "Multiplier",
2536
2578
  type: "number",
@@ -2540,7 +2582,7 @@ function RuleActionBuilder({ value, onChange }) {
2540
2582
  }
2541
2583
  ),
2542
2584
  /* @__PURE__ */ jsxRuntime.jsx(
2543
- chunkYN4IEDE4_js.FormInput,
2585
+ chunkZKUYNCAG_js.FormInput,
2544
2586
  {
2545
2587
  label: "Reason code",
2546
2588
  value: stringParam(params.reason),
@@ -2550,7 +2592,7 @@ function RuleActionBuilder({ value, onChange }) {
2550
2592
  )
2551
2593
  ] }),
2552
2594
  type === "enforce_min_margin" && /* @__PURE__ */ jsxRuntime.jsx(
2553
- chunkYN4IEDE4_js.FormInput,
2595
+ chunkZKUYNCAG_js.FormInput,
2554
2596
  {
2555
2597
  label: "Floor (fraction, e.g. 0.08)",
2556
2598
  type: "number",
@@ -2560,7 +2602,7 @@ function RuleActionBuilder({ value, onChange }) {
2560
2602
  }
2561
2603
  ),
2562
2604
  type === "realign_to_competitor" && /* @__PURE__ */ jsxRuntime.jsx(
2563
- chunkYN4IEDE4_js.FormInput,
2605
+ chunkZKUYNCAG_js.FormInput,
2564
2606
  {
2565
2607
  label: "Tolerance (fraction)",
2566
2608
  type: "number",
@@ -2570,7 +2612,7 @@ function RuleActionBuilder({ value, onChange }) {
2570
2612
  }
2571
2613
  ),
2572
2614
  type === "request_manager_approval" && /* @__PURE__ */ jsxRuntime.jsx(
2573
- chunkYN4IEDE4_js.FormInput,
2615
+ chunkZKUYNCAG_js.FormInput,
2574
2616
  {
2575
2617
  label: "Approval limit (fraction)",
2576
2618
  type: "number",
@@ -2580,7 +2622,7 @@ function RuleActionBuilder({ value, onChange }) {
2580
2622
  }
2581
2623
  ),
2582
2624
  type === "round_to" && /* @__PURE__ */ jsxRuntime.jsx(
2583
- chunkYN4IEDE4_js.FormInput,
2625
+ chunkZKUYNCAG_js.FormInput,
2584
2626
  {
2585
2627
  label: "Step (e.g. 0.009)",
2586
2628
  type: "number",
@@ -2591,7 +2633,7 @@ function RuleActionBuilder({ value, onChange }) {
2591
2633
  ),
2592
2634
  type === "alert" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: [
2593
2635
  /* @__PURE__ */ jsxRuntime.jsx(
2594
- chunkYN4IEDE4_js.FormInput,
2636
+ chunkZKUYNCAG_js.FormInput,
2595
2637
  {
2596
2638
  label: "Channel",
2597
2639
  value: stringParam(params.channel),
@@ -2600,7 +2642,7 @@ function RuleActionBuilder({ value, onChange }) {
2600
2642
  }
2601
2643
  ),
2602
2644
  /* @__PURE__ */ jsxRuntime.jsx(
2603
- chunkYN4IEDE4_js.FormInput,
2645
+ chunkZKUYNCAG_js.FormInput,
2604
2646
  {
2605
2647
  label: "Severity",
2606
2648
  value: stringParam(params.severity),
@@ -2638,7 +2680,7 @@ function CustomParamsEditor({
2638
2680
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
2639
2681
  entries.map(([key, value], index) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-[1fr_1fr_auto] items-end gap-2", children: [
2640
2682
  /* @__PURE__ */ jsxRuntime.jsx(
2641
- chunkYN4IEDE4_js.FormInput,
2683
+ chunkZKUYNCAG_js.FormInput,
2642
2684
  {
2643
2685
  label: "Key",
2644
2686
  value: key,
@@ -2646,16 +2688,16 @@ function CustomParamsEditor({
2646
2688
  }
2647
2689
  ),
2648
2690
  /* @__PURE__ */ jsxRuntime.jsx(
2649
- chunkYN4IEDE4_js.FormInput,
2691
+ chunkZKUYNCAG_js.FormInput,
2650
2692
  {
2651
2693
  label: "Value",
2652
2694
  value: String(value ?? ""),
2653
2695
  onValueChange: (raw) => update(index, key, raw)
2654
2696
  }
2655
2697
  ),
2656
- /* @__PURE__ */ jsxRuntime.jsx(chunkYN4IEDE4_js.Button, { type: "button", plain: true, onClick: () => remove(index), children: "Remove" })
2698
+ /* @__PURE__ */ jsxRuntime.jsx(chunkZKUYNCAG_js.Button, { type: "button", plain: true, onClick: () => remove(index), children: "Remove" })
2657
2699
  ] }, index)),
2658
- /* @__PURE__ */ jsxRuntime.jsx(chunkYN4IEDE4_js.Button, { type: "button", outline: true, onClick: add, children: "+ Add param" })
2700
+ /* @__PURE__ */ jsxRuntime.jsx(chunkZKUYNCAG_js.Button, { type: "button", outline: true, onClick: add, children: "+ Add param" })
2659
2701
  ] });
2660
2702
  }
2661
2703
  function numberParam(value, fallback) {
@@ -2685,9 +2727,9 @@ function RuleForm({ value, onChange }) {
2685
2727
  );
2686
2728
  const update = (key, v) => onChange({ ...value, [key]: v });
2687
2729
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-5", children: [
2688
- /* @__PURE__ */ jsxRuntime.jsxs(chunkYN4IEDE4_js.FormGrid, { children: [
2730
+ /* @__PURE__ */ jsxRuntime.jsxs(chunkZKUYNCAG_js.FormGrid, { children: [
2689
2731
  /* @__PURE__ */ jsxRuntime.jsx(
2690
- chunkYN4IEDE4_js.FormInput,
2732
+ chunkZKUYNCAG_js.FormInput,
2691
2733
  {
2692
2734
  label: "Name",
2693
2735
  required: true,
@@ -2696,7 +2738,7 @@ function RuleForm({ value, onChange }) {
2696
2738
  }
2697
2739
  ),
2698
2740
  /* @__PURE__ */ jsxRuntime.jsx(
2699
- chunkYN4IEDE4_js.FormInput,
2741
+ chunkZKUYNCAG_js.FormInput,
2700
2742
  {
2701
2743
  label: "Priority",
2702
2744
  type: "number",
@@ -2706,7 +2748,7 @@ function RuleForm({ value, onChange }) {
2706
2748
  }
2707
2749
  ),
2708
2750
  /* @__PURE__ */ jsxRuntime.jsx(
2709
- chunkYN4IEDE4_js.FormSelect,
2751
+ chunkZKUYNCAG_js.FormSelect,
2710
2752
  {
2711
2753
  label: "Enabled",
2712
2754
  value: value.enabled ? "true" : "false",
@@ -2718,7 +2760,7 @@ function RuleForm({ value, onChange }) {
2718
2760
  }
2719
2761
  ),
2720
2762
  /* @__PURE__ */ jsxRuntime.jsx(
2721
- chunkYN4IEDE4_js.FormTextarea,
2763
+ chunkZKUYNCAG_js.FormTextarea,
2722
2764
  {
2723
2765
  label: "Description",
2724
2766
  rows: 2,
@@ -2730,7 +2772,7 @@ function RuleForm({ value, onChange }) {
2730
2772
  /* @__PURE__ */ jsxRuntime.jsxs("section", { children: [
2731
2773
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-2 flex items-center justify-between", children: [
2732
2774
  /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-sm font-semibold text-slate-700 dark:text-slate-200", children: "Condition" }),
2733
- /* @__PURE__ */ jsxRuntime.jsx(chunkYN4IEDE4_js.Badge, { color: "indigo", children: value.condition.operator })
2775
+ /* @__PURE__ */ jsxRuntime.jsx(chunkZKUYNCAG_js.Badge, { color: "indigo", children: value.condition.operator })
2734
2776
  ] }),
2735
2777
  /* @__PURE__ */ jsxRuntime.jsx(
2736
2778
  RuleConditionBuilder,
@@ -2743,7 +2785,7 @@ function RuleForm({ value, onChange }) {
2743
2785
  /* @__PURE__ */ jsxRuntime.jsxs("section", { children: [
2744
2786
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-2 flex items-center justify-between", children: [
2745
2787
  /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-sm font-semibold text-slate-700 dark:text-slate-200", children: "Action on match" }),
2746
- /* @__PURE__ */ jsxRuntime.jsx(chunkYN4IEDE4_js.Badge, { color: "fuchsia", children: value.action.type })
2788
+ /* @__PURE__ */ jsxRuntime.jsx(chunkZKUYNCAG_js.Badge, { color: "fuchsia", children: value.action.type })
2747
2789
  ] }),
2748
2790
  /* @__PURE__ */ jsxRuntime.jsx(
2749
2791
  RuleActionBuilder,
@@ -2765,7 +2807,7 @@ function RuleForm({ value, onChange }) {
2765
2807
  ),
2766
2808
  showAdvanced && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2", children: [
2767
2809
  /* @__PURE__ */ jsxRuntime.jsx(
2768
- chunkYN4IEDE4_js.FormInput,
2810
+ chunkZKUYNCAG_js.FormInput,
2769
2811
  {
2770
2812
  label: "Valid from (ISO 8601)",
2771
2813
  type: "datetime-local",
@@ -2774,7 +2816,7 @@ function RuleForm({ value, onChange }) {
2774
2816
  }
2775
2817
  ),
2776
2818
  /* @__PURE__ */ jsxRuntime.jsx(
2777
- chunkYN4IEDE4_js.FormInput,
2819
+ chunkZKUYNCAG_js.FormInput,
2778
2820
  {
2779
2821
  label: "Valid until (ISO 8601)",
2780
2822
  type: "datetime-local",
@@ -2783,7 +2825,7 @@ function RuleForm({ value, onChange }) {
2783
2825
  }
2784
2826
  ),
2785
2827
  /* @__PURE__ */ jsxRuntime.jsx(
2786
- chunkYN4IEDE4_js.FormSelect,
2828
+ chunkZKUYNCAG_js.FormSelect,
2787
2829
  {
2788
2830
  label: "Status",
2789
2831
  value: value.status ?? "active",
@@ -2792,7 +2834,7 @@ function RuleForm({ value, onChange }) {
2792
2834
  }
2793
2835
  ),
2794
2836
  /* @__PURE__ */ jsxRuntime.jsx(
2795
- chunkYN4IEDE4_js.FormInput,
2837
+ chunkZKUYNCAG_js.FormInput,
2796
2838
  {
2797
2839
  label: "Tags (comma-separated)",
2798
2840
  value: (value.tags ?? []).join(", "),
@@ -2894,6 +2936,7 @@ var LOGIC_NODE_ITEMS = [
2894
2936
  // Data Processing
2895
2937
  { nodeType: "code", nameKey: "codeNode", descriptionKey: "codeNodeDescription", subcategory: "data_processing" },
2896
2938
  { nodeType: "http_request", nameKey: "httpRequestNode", descriptionKey: "httpRequestNodeDescription", subcategory: "data_processing" },
2939
+ { nodeType: "s3_write", nameKey: "s3WriteNode", descriptionKey: "s3WriteNodeDescription", subcategory: "data_processing" },
2897
2940
  { nodeType: "template_transform", nameKey: "templateTransformNode", descriptionKey: "templateTransformNodeDescription", subcategory: "data_processing" },
2898
2941
  { nodeType: "variable_assigner", nameKey: "variableAssignerNode", descriptionKey: "variableAssignerNodeDescription", subcategory: "data_processing" },
2899
2942
  { nodeType: "variable_aggregator", nameKey: "variableAggregatorNode", descriptionKey: "variableAggregatorNodeDescription", subcategory: "data_processing" },
@@ -2976,9 +3019,9 @@ function CollapsibleSection({ title, icon, colorClass, defaultOpen = true, count
2976
3019
  ] });
2977
3020
  }
2978
3021
  function LogicNodeItemCard({ item, translationFunction }) {
2979
- const IconComponent = chunkR5KUEOPU_js.LOGIC_ICON_MAP[item.nodeType];
2980
- const gradient = chunkR5KUEOPU_js.LOGIC_NODE_GRADIENTS[item.nodeType] ?? "from-gray-400 to-gray-500";
2981
- const defaultConfig = chunkC7BI5LQ6_js.createDefaultLogicNodeConfig(item.nodeType);
3022
+ const IconComponent = chunkNYQAEPC7_js.LOGIC_ICON_MAP[item.nodeType];
3023
+ const gradient = chunkNYQAEPC7_js.LOGIC_NODE_GRADIENTS[item.nodeType] ?? "from-gray-400 to-gray-500";
3024
+ const defaultConfig = chunkC3H4FM4A_js.createDefaultLogicNodeConfig(item.nodeType);
2982
3025
  const configJson = defaultConfig ? JSON.stringify(defaultConfig) : void 0;
2983
3026
  return /* @__PURE__ */ jsxRuntime.jsxs(
2984
3027
  "div",
@@ -3048,7 +3091,7 @@ function NodePalette({ agents, tools, agentTools = [], rules, entities = [], mod
3048
3091
  [entityTypes, normalizedQuery]
3049
3092
  );
3050
3093
  const filteredLogicItems = react.useMemo(() => {
3051
- const visibleByDefault = LOGIC_NODE_ITEMS.filter((item) => !chunkR5KUEOPU_js.EXPERIMENTAL_NODE_TYPES.has(item.nodeType));
3094
+ const visibleByDefault = LOGIC_NODE_ITEMS.filter((item) => !chunkNYQAEPC7_js.EXPERIMENTAL_NODE_TYPES.has(item.nodeType));
3052
3095
  if (!normalizedQuery) return visibleByDefault;
3053
3096
  return visibleByDefault.filter(
3054
3097
  (item) => t(item.nameKey).toLowerCase().includes(normalizedQuery) || t(item.descriptionKey).toLowerCase().includes(normalizedQuery)
@@ -3112,7 +3155,7 @@ function NodePalette({ agents, tools, agentTools = [], rules, entities = [], mod
3112
3155
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5", children: [
3113
3156
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "truncate text-xs font-medium text-gray-900 dark:text-white", children: agent.name }),
3114
3157
  (() => {
3115
- const tier = chunkC7BI5LQ6_js.getAgentTier(Number(agent.elo ?? 0));
3158
+ const tier = chunkC3H4FM4A_js.getAgentTier(Number(agent.elo ?? 0));
3116
3159
  return /* @__PURE__ */ jsxRuntime.jsx("span", { className: `shrink-0 rounded-full px-1.5 py-px text-[8px] font-bold ${tier.pillColor}`, children: t(`agentDrawer.tier${tier.key.charAt(0).toUpperCase()}${tier.key.slice(1)}`) });
3117
3160
  })()
3118
3161
  ] }),
@@ -3145,7 +3188,7 @@ function NodePalette({ agents, tools, agentTools = [], rules, entities = [], mod
3145
3188
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "truncate text-[10px] text-gray-400 dark:text-gray-500", children: tool.category })
3146
3189
  ] }),
3147
3190
  /* @__PURE__ */ jsxRuntime.jsx(
3148
- chunkYN4IEDE4_js.ToggleSwitch,
3191
+ chunkZKUYNCAG_js.ToggleSwitch,
3149
3192
  {
3150
3193
  checked: Boolean(tool.enabled),
3151
3194
  onChange: () => {
@@ -3186,7 +3229,7 @@ function NodePalette({ agents, tools, agentTools = [], rules, entities = [], mod
3186
3229
  ] })
3187
3230
  ] }),
3188
3231
  /* @__PURE__ */ jsxRuntime.jsx(
3189
- chunkYN4IEDE4_js.ToggleSwitch,
3232
+ chunkZKUYNCAG_js.ToggleSwitch,
3190
3233
  {
3191
3234
  checked: Boolean(rule.enabled),
3192
3235
  onChange: () => {
@@ -3222,8 +3265,8 @@ function NodePalette({ agents, tools, agentTools = [], rules, entities = [], mod
3222
3265
  limit: entity.defaultLimit
3223
3266
  });
3224
3267
  const dsLogo = getDatasourceLogo(entity.id);
3225
- const EntityIcon = chunkR5KUEOPU_js.getEntityIcon(entity.id);
3226
- const entityGradient = chunkR5KUEOPU_js.getEntityGradient(entity.id);
3268
+ const EntityIcon = chunkNYQAEPC7_js.getEntityIcon(entity.id);
3269
+ const entityGradient = chunkNYQAEPC7_js.getEntityGradient(entity.id);
3227
3270
  return /* @__PURE__ */ jsxRuntime.jsxs(
3228
3271
  "div",
3229
3272
  {
@@ -3243,7 +3286,7 @@ function NodePalette({ agents, tools, agentTools = [], rules, entities = [], mod
3243
3286
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
3244
3287
  /* @__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" }),
3245
3288
  /* @__PURE__ */ jsxRuntime.jsx(
3246
- chunkYN4IEDE4_js.ToggleSwitch,
3289
+ chunkZKUYNCAG_js.ToggleSwitch,
3247
3290
  {
3248
3291
  checked: true,
3249
3292
  onChange: () => {
@@ -3621,9 +3664,9 @@ function formatDuration3(durationMs) {
3621
3664
  }
3622
3665
  function RunPanel({ open, onClose, onRun, onStop }) {
3623
3666
  const translations = chunkYXN2K77G_js.useTranslations("agents.workflow.runPanel");
3624
- const nodes = chunkR5KUEOPU_js.useWorkflowStore((state) => state.nodes);
3625
- const isRunning = chunkR5KUEOPU_js.useWorkflowStore((state) => state.isRunning);
3626
- const nodeResults = chunkR5KUEOPU_js.useWorkflowStore((state) => state.nodeResults);
3667
+ const nodes = chunkNYQAEPC7_js.useWorkflowStore((state) => state.nodes);
3668
+ const isRunning = chunkNYQAEPC7_js.useWorkflowStore((state) => state.isRunning);
3669
+ const nodeResults = chunkNYQAEPC7_js.useWorkflowStore((state) => state.nodeResults);
3627
3670
  const startNode = nodes.find((node) => node.type === "start");
3628
3671
  const hasEndNode = nodes.some((node) => node.type === "end");
3629
3672
  const hasValidStartConfig = Boolean(
@@ -3806,6 +3849,20 @@ function inferVariables(config, nodeType) {
3806
3849
  variables.push({ name: "body", direction: "input", variableType: "string" });
3807
3850
  }
3808
3851
  break;
3852
+ case "s3_write":
3853
+ variables.push({ name: "key", direction: "input", variableType: "string" });
3854
+ if (config.sourceUrl) {
3855
+ variables.push({ name: "sourceUrl", direction: "input", variableType: "string" });
3856
+ }
3857
+ if (config.body) {
3858
+ variables.push({ name: "body", direction: "input", variableType: "string" });
3859
+ }
3860
+ variables.push({ name: "bucket", direction: "output", variableType: "string" });
3861
+ variables.push({ name: "key", direction: "output", variableType: "string" });
3862
+ variables.push({ name: "size", direction: "output", variableType: "number" });
3863
+ variables.push({ name: "etag", direction: "output", variableType: "string" });
3864
+ variables.push({ name: "contentType", direction: "output", variableType: "string" });
3865
+ break;
3809
3866
  case "template_transform":
3810
3867
  variables.push({ name: "template", direction: "input", variableType: "string" });
3811
3868
  if (config.outputVariable) {
@@ -3911,8 +3968,8 @@ function inferVariables(config, nodeType) {
3911
3968
  }
3912
3969
  function VariableInspector({ open, onClose }) {
3913
3970
  const translations = chunkYXN2K77G_js.useTranslations("agents.workflow.variableInspector");
3914
- const nodes = chunkR5KUEOPU_js.useWorkflowStore((state) => state.nodes);
3915
- const edges = chunkR5KUEOPU_js.useWorkflowStore((state) => state.edges);
3971
+ const nodes = chunkNYQAEPC7_js.useWorkflowStore((state) => state.nodes);
3972
+ const edges = chunkNYQAEPC7_js.useWorkflowStore((state) => state.edges);
3916
3973
  const [expandedNodes, setExpandedNodes] = react.useState(/* @__PURE__ */ new Set());
3917
3974
  const toggleNodeExpansion = react.useCallback((nodeId) => {
3918
3975
  setExpandedNodes((current) => {
@@ -3974,8 +4031,8 @@ function VariableInspector({ open, onClose }) {
3974
4031
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-sm text-gray-500 dark:text-gray-400", children: translations("noNodes") })
3975
4032
  ] }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "divide-y divide-gray-100 dark:divide-gray-800", children: nodeVariableEntries.map((entry) => {
3976
4033
  const isExpanded = expandedNodes.has(entry.nodeId);
3977
- const IconComponent = chunkR5KUEOPU_js.LOGIC_ICON_MAP[entry.nodeType];
3978
- const gradient = chunkR5KUEOPU_js.LOGIC_NODE_GRADIENTS[entry.nodeType] ?? "from-gray-400 to-gray-500";
4034
+ const IconComponent = chunkNYQAEPC7_js.LOGIC_ICON_MAP[entry.nodeType];
4035
+ const gradient = chunkNYQAEPC7_js.LOGIC_NODE_GRADIENTS[entry.nodeType] ?? "from-gray-400 to-gray-500";
3979
4036
  const inputVariables = entry.variables.filter((variable) => variable.direction === "input");
3980
4037
  const outputVariables = entry.variables.filter((variable) => variable.direction === "output");
3981
4038
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-testid": `variable-node-${entry.nodeId}`, children: [
@@ -4041,7 +4098,7 @@ function RunInputDialog({
4041
4098
  onRun
4042
4099
  }) {
4043
4100
  const t = chunkYXN2K77G_js.useTranslations("agents.workflow.runInputDialog");
4044
- const nodes = chunkR5KUEOPU_js.useWorkflowStore((state) => state.nodes);
4101
+ const nodes = chunkNYQAEPC7_js.useWorkflowStore((state) => state.nodes);
4045
4102
  const [values, setValues] = react.useState({});
4046
4103
  const inputVariableNames = react.useMemo(() => {
4047
4104
  const storeStartNode = nodes.find((node) => node.type === "start");
@@ -4068,7 +4125,7 @@ function RunInputDialog({
4068
4125
  }, [onClose]);
4069
4126
  if (!open) return null;
4070
4127
  return /* @__PURE__ */ jsxRuntime.jsxs(
4071
- chunkYN4IEDE4_js.GlassModal,
4128
+ chunkZKUYNCAG_js.GlassModal,
4072
4129
  {
4073
4130
  open,
4074
4131
  onClose: handleClose,
@@ -4079,7 +4136,7 @@ function RunInputDialog({
4079
4136
  /* @__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: [
4080
4137
  /* @__PURE__ */ jsxRuntime.jsx("label", { className: "mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300", children: variableName }),
4081
4138
  /* @__PURE__ */ jsxRuntime.jsx(
4082
- chunkYN4IEDE4_js.Input,
4139
+ chunkZKUYNCAG_js.Input,
4083
4140
  {
4084
4141
  value: values[variableName] ?? "",
4085
4142
  onChange: (event) => handleValueChange(variableName, event.target.value),
@@ -4088,8 +4145,8 @@ function RunInputDialog({
4088
4145
  )
4089
4146
  ] }, variableName)) }),
4090
4147
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-4 flex items-center justify-end gap-2", children: [
4091
- /* @__PURE__ */ jsxRuntime.jsx(chunkYN4IEDE4_js.Button, { size: "sm", plain: true, onClick: handleClose, children: t("cancel") }),
4092
- /* @__PURE__ */ jsxRuntime.jsxs(chunkYN4IEDE4_js.Button, { size: "sm", gradient: true, onClick: handleSubmit, children: [
4148
+ /* @__PURE__ */ jsxRuntime.jsx(chunkZKUYNCAG_js.Button, { size: "sm", plain: true, onClick: handleClose, children: t("cancel") }),
4149
+ /* @__PURE__ */ jsxRuntime.jsxs(chunkZKUYNCAG_js.Button, { size: "sm", gradient: true, onClick: handleSubmit, children: [
4093
4150
  /* @__PURE__ */ jsxRuntime.jsx(outline.PlayIcon, { className: "h-3.5 w-3.5", "data-slot": "icon" }),
4094
4151
  t("run")
4095
4152
  ] })
@@ -4122,8 +4179,8 @@ function PreviewPanel({ open, onClose, workflowId, loadRuns }) {
4122
4179
  const [isLoadingRuns, setIsLoadingRuns] = react.useState(false);
4123
4180
  const [selectedRun, setSelectedRun] = react.useState(null);
4124
4181
  const [selectedNode, setSelectedNode] = react.useState(null);
4125
- const isRunning = chunkR5KUEOPU_js.useWorkflowStore((state) => state.isRunning);
4126
- const nodeResults = chunkR5KUEOPU_js.useWorkflowStore((state) => state.nodeResults);
4182
+ const isRunning = chunkNYQAEPC7_js.useWorkflowStore((state) => state.isRunning);
4183
+ const nodeResults = chunkNYQAEPC7_js.useWorkflowStore((state) => state.nodeResults);
4127
4184
  const refreshRuns = react.useCallback(async () => {
4128
4185
  setIsLoadingRuns(true);
4129
4186
  try {
@@ -4279,7 +4336,7 @@ var AutoSaveWorkspace = react.memo(function AutoSaveWorkspace2({
4279
4336
  onAutoSaveGraph(graph);
4280
4337
  }, [onAutoSaveGraph, onGraphSnapshot]);
4281
4338
  return /* @__PURE__ */ jsxRuntime.jsx(
4282
- chunkR5KUEOPU_js.Workspace,
4339
+ chunkNYQAEPC7_js.Workspace,
4283
4340
  {
4284
4341
  ...workspaceProps,
4285
4342
  onGraphChange: handleGraphChange
@@ -4287,7 +4344,7 @@ var AutoSaveWorkspace = react.memo(function AutoSaveWorkspace2({
4287
4344
  );
4288
4345
  });
4289
4346
  function DynamicIslandConfirm2(props) {
4290
- return /* @__PURE__ */ jsxRuntime.jsx(chunkYN4IEDE4_js.DynamicIslandConfirm, { ...props });
4347
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkZKUYNCAG_js.DynamicIslandConfirm, { ...props });
4291
4348
  }
4292
4349
  var JSON_PREVIEW_LINE_LIMIT = 50;
4293
4350
  function DslExportModal({ open, onClose, workflow, graph }) {
@@ -4341,7 +4398,7 @@ function DslExportModal({ open, onClose, workflow, graph }) {
4341
4398
  }, [jsonString, workflow.name, workflow.version]);
4342
4399
  if (!open) return null;
4343
4400
  return /* @__PURE__ */ jsxRuntime.jsx(
4344
- chunkYN4IEDE4_js.GlassModal,
4401
+ chunkZKUYNCAG_js.GlassModal,
4345
4402
  {
4346
4403
  open,
4347
4404
  onClose,
@@ -4383,7 +4440,7 @@ function DslExportModal({ open, onClose, workflow, graph }) {
4383
4440
  ] }),
4384
4441
  /* @__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: [
4385
4442
  /* @__PURE__ */ jsxRuntime.jsx(
4386
- chunkYN4IEDE4_js.Button,
4443
+ chunkZKUYNCAG_js.Button,
4387
4444
  {
4388
4445
  type: "button",
4389
4446
  onClick: handleCopyToClipboard,
@@ -4400,7 +4457,7 @@ function DslExportModal({ open, onClose, workflow, graph }) {
4400
4457
  }
4401
4458
  ),
4402
4459
  /* @__PURE__ */ jsxRuntime.jsxs(
4403
- chunkYN4IEDE4_js.Button,
4460
+ chunkZKUYNCAG_js.Button,
4404
4461
  {
4405
4462
  type: "button",
4406
4463
  onClick: handleDownloadJson,
@@ -4559,7 +4616,7 @@ function DslImportModal({ open, onClose, onImport }) {
4559
4616
  }, []);
4560
4617
  if (!open) return null;
4561
4618
  return /* @__PURE__ */ jsxRuntime.jsx(
4562
- chunkYN4IEDE4_js.GlassModal,
4619
+ chunkZKUYNCAG_js.GlassModal,
4563
4620
  {
4564
4621
  open,
4565
4622
  onClose,
@@ -4599,7 +4656,7 @@ function DslImportModal({ open, onClose, onImport }) {
4599
4656
  ) : /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-testid": "import-validation-result", children: [
4600
4657
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-4 flex items-center justify-between", children: [
4601
4658
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-medium text-gray-700 dark:text-gray-300", children: fileName }),
4602
- /* @__PURE__ */ jsxRuntime.jsx(chunkYN4IEDE4_js.Button, { type: "button", plain: true, size: "sm", onClick: handleReset, children: translations("chooseAnother") })
4659
+ /* @__PURE__ */ jsxRuntime.jsx(chunkZKUYNCAG_js.Button, { type: "button", plain: true, size: "sm", onClick: handleReset, children: translations("chooseAnother") })
4603
4660
  ] }),
4604
4661
  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: [
4605
4662
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
@@ -4627,9 +4684,9 @@ function DslImportModal({ open, onClose, onImport }) {
4627
4684
  ] })
4628
4685
  ] }) }),
4629
4686
  /* @__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: [
4630
- /* @__PURE__ */ jsxRuntime.jsx(chunkYN4IEDE4_js.Button, { type: "button", onClick: onClose, outline: true, size: "sm", "data-testid": "import-cancel-button", children: translations("cancel") }),
4687
+ /* @__PURE__ */ jsxRuntime.jsx(chunkZKUYNCAG_js.Button, { type: "button", onClick: onClose, outline: true, size: "sm", "data-testid": "import-cancel-button", children: translations("cancel") }),
4631
4688
  /* @__PURE__ */ jsxRuntime.jsxs(
4632
- chunkYN4IEDE4_js.Button,
4689
+ chunkZKUYNCAG_js.Button,
4633
4690
  {
4634
4691
  type: "button",
4635
4692
  onClick: handleImport,
@@ -4650,14 +4707,14 @@ function DslImportModal({ open, onClose, onImport }) {
4650
4707
  }
4651
4708
 
4652
4709
  // src/astrlabe/store/selectors.ts
4653
- var useCanUndo = () => chunkR5KUEOPU_js.useWorkflowStore((state) => state.past.length > 0);
4654
- var useCanRedo = () => chunkR5KUEOPU_js.useWorkflowStore((state) => state.future.length > 0);
4655
- var useHasCopied = () => chunkR5KUEOPU_js.useWorkflowStore((state) => state.clipboard !== null);
4656
- var useContextMenu = () => chunkR5KUEOPU_js.useWorkflowStore((state) => state.contextMenu);
4657
- var useEditingNodeId = () => chunkR5KUEOPU_js.useWorkflowStore((state) => state.editingNodeId);
4658
- var useSelectedNodeCount = () => chunkR5KUEOPU_js.useWorkflowStore((state) => state.nodes.filter((node) => node.selected).length);
4659
- var useIsRunning = () => chunkR5KUEOPU_js.useWorkflowStore((state) => state.isRunning);
4660
- var useNodeResults = () => chunkR5KUEOPU_js.useWorkflowStore((state) => state.nodeResults);
4710
+ var useCanUndo = () => chunkNYQAEPC7_js.useWorkflowStore((state) => state.past.length > 0);
4711
+ var useCanRedo = () => chunkNYQAEPC7_js.useWorkflowStore((state) => state.future.length > 0);
4712
+ var useHasCopied = () => chunkNYQAEPC7_js.useWorkflowStore((state) => state.clipboard !== null);
4713
+ var useContextMenu = () => chunkNYQAEPC7_js.useWorkflowStore((state) => state.contextMenu);
4714
+ var useEditingNodeId = () => chunkNYQAEPC7_js.useWorkflowStore((state) => state.editingNodeId);
4715
+ var useSelectedNodeCount = () => chunkNYQAEPC7_js.useWorkflowStore((state) => state.nodes.filter((node) => node.selected).length);
4716
+ var useIsRunning = () => chunkNYQAEPC7_js.useWorkflowStore((state) => state.isRunning);
4717
+ var useNodeResults = () => chunkNYQAEPC7_js.useWorkflowStore((state) => state.nodeResults);
4661
4718
  var DEFAULT_MAX_HISTORY = 50;
4662
4719
  function useUndoRedo(nodes, edges, setNodes, setEdges, maxHistory = DEFAULT_MAX_HISTORY) {
4663
4720
  const pastRef = react.useRef([]);
@@ -4955,6 +5012,7 @@ exports.RuleForm = RuleForm;
4955
5012
  exports.RunInputDialog = RunInputDialog;
4956
5013
  exports.RunPanel = RunPanel;
4957
5014
  exports.RunReplayModal = RunReplayModal;
5015
+ exports.S3WriteFlowNode = S3WriteFlowNode;
4958
5016
  exports.SaveStatusBadge = SaveStatusBadge;
4959
5017
  exports.SubworkflowModal = SubworkflowModal;
4960
5018
  exports.TIMEZONE_OPTIONS = TIMEZONE_OPTIONS;
@@ -4979,5 +5037,5 @@ exports.useNodeResults = useNodeResults;
4979
5037
  exports.useSelectedNodeCount = useSelectedNodeCount;
4980
5038
  exports.useSubworkflowStore = useSubworkflowStore;
4981
5039
  exports.useUndoRedo = useUndoRedo;
4982
- //# sourceMappingURL=chunk-Y4DNREFH.js.map
4983
- //# sourceMappingURL=chunk-Y4DNREFH.js.map
5040
+ //# sourceMappingURL=chunk-FZTOP6EE.js.map
5041
+ //# sourceMappingURL=chunk-FZTOP6EE.js.map