@datatechsolutions/ui 3.3.0 → 3.5.0

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 (212) hide show
  1. package/dist/astrlabe/index.js +113 -113
  2. package/dist/astrlabe/index.mjs +6 -6
  3. package/dist/astrlabe/workflow-canvas.js +6 -6
  4. package/dist/astrlabe/workflow-canvas.mjs +5 -5
  5. package/dist/brand/index.js +0 -14
  6. package/dist/brand/index.js.map +1 -1
  7. package/dist/brand/index.mjs +0 -14
  8. package/dist/brand/index.mjs.map +1 -1
  9. package/dist/{chunk-2WXRRQM3.mjs → chunk-2MJAHST4.mjs} +554 -516
  10. package/dist/chunk-2MJAHST4.mjs.map +1 -0
  11. package/dist/{chunk-FAGDZEKM.js → chunk-2OZZH2IO.js} +2 -2
  12. package/dist/chunk-2OZZH2IO.js.map +1 -0
  13. package/dist/{chunk-SYNVNTLJ.mjs → chunk-3AY5HIQ6.mjs} +2 -2
  14. package/dist/chunk-3AY5HIQ6.mjs.map +1 -0
  15. package/dist/{chunk-O6M3KDGT.mjs → chunk-3OLYSMI5.mjs} +41 -7
  16. package/dist/chunk-3OLYSMI5.mjs.map +1 -0
  17. package/dist/{chunk-GIQXB3BG.mjs → chunk-4PFU6A2B.mjs} +3 -3
  18. package/dist/{chunk-GIQXB3BG.mjs.map → chunk-4PFU6A2B.mjs.map} +1 -1
  19. package/dist/{chunk-3ZUMJTDT.mjs → chunk-5BEVTOZV.mjs} +4 -5
  20. package/dist/{chunk-3JJWPOK6.js.map → chunk-5BEVTOZV.mjs.map} +1 -1
  21. package/dist/{chunk-3JJWPOK6.js → chunk-5I7F7KZ6.js} +10 -11
  22. package/dist/chunk-5I7F7KZ6.js.map +1 -0
  23. package/dist/{chunk-BR2GAZKG.mjs → chunk-6V3DUBOZ.mjs} +7 -7
  24. package/dist/{chunk-BR2GAZKG.mjs.map → chunk-6V3DUBOZ.mjs.map} +1 -1
  25. package/dist/{chunk-5GDKCFM5.mjs → chunk-6W7VTZG6.mjs} +3 -3
  26. package/dist/{chunk-5GDKCFM5.mjs.map → chunk-6W7VTZG6.mjs.map} +1 -1
  27. package/dist/{chunk-IJAKZHXX.js → chunk-74MHWEDC.js} +684 -645
  28. package/dist/chunk-74MHWEDC.js.map +1 -0
  29. package/dist/{chunk-IRPS5UCS.mjs → chunk-7CEZB3ZD.mjs} +3 -3
  30. package/dist/{chunk-IRPS5UCS.mjs.map → chunk-7CEZB3ZD.mjs.map} +1 -1
  31. package/dist/{chunk-UDDZTTLO.mjs → chunk-7UHV6A4C.mjs} +6 -7
  32. package/dist/chunk-7UHV6A4C.mjs.map +1 -0
  33. package/dist/{chunk-ZM5MVWIT.js → chunk-A7FI4K7Z.js} +5 -6
  34. package/dist/chunk-A7FI4K7Z.js.map +1 -0
  35. package/dist/{chunk-MWPTSBAI.js → chunk-AVM53A3Y.js} +63 -29
  36. package/dist/chunk-AVM53A3Y.js.map +1 -0
  37. package/dist/{chunk-I2NZGVBG.js → chunk-AWDH6WNA.js} +1214 -5396
  38. package/dist/chunk-AWDH6WNA.js.map +1 -0
  39. package/dist/{chunk-ZJPNP2YW.mjs → chunk-BUDZNAKL.mjs} +2 -2
  40. package/dist/chunk-BUDZNAKL.mjs.map +1 -0
  41. package/dist/{chunk-OCELRSLO.js → chunk-BVXATTTA.js} +4 -4
  42. package/dist/{chunk-OCELRSLO.js.map → chunk-BVXATTTA.js.map} +1 -1
  43. package/dist/{chunk-W5OEBO6E.js → chunk-C4NRF2G2.js} +13 -14
  44. package/dist/chunk-C4NRF2G2.js.map +1 -0
  45. package/dist/{chunk-JSNRCYSO.js → chunk-CY2MBKVG.js} +4 -4
  46. package/dist/{chunk-JSNRCYSO.js.map → chunk-CY2MBKVG.js.map} +1 -1
  47. package/dist/{chunk-ZL6C2ZAF.js → chunk-FK3WDELF.js} +67 -67
  48. package/dist/{chunk-ZL6C2ZAF.js.map → chunk-FK3WDELF.js.map} +1 -1
  49. package/dist/{chunk-MVBIAXVN.mjs → chunk-IOEQ2GET.mjs} +14 -11
  50. package/dist/chunk-IOEQ2GET.mjs.map +1 -0
  51. package/dist/{chunk-AOUUZ52N.js → chunk-NCDBNGIB.js} +85 -86
  52. package/dist/chunk-NCDBNGIB.js.map +1 -0
  53. package/dist/{chunk-B67DP7MI.mjs → chunk-NJ5RVWLA.mjs} +4 -4
  54. package/dist/{chunk-B67DP7MI.mjs.map → chunk-NJ5RVWLA.mjs.map} +1 -1
  55. package/dist/{chunk-HDCUWUNH.js → chunk-NKXQYFS7.js} +28 -27
  56. package/dist/chunk-NKXQYFS7.js.map +1 -0
  57. package/dist/{chunk-JN6IL6OH.mjs → chunk-NOHHZ6FM.mjs} +1171 -5316
  58. package/dist/chunk-NOHHZ6FM.mjs.map +1 -0
  59. package/dist/{chunk-PCYL4MII.mjs → chunk-OASC7NYV.mjs} +156 -314
  60. package/dist/chunk-OASC7NYV.mjs.map +1 -0
  61. package/dist/{chunk-RXZNACMI.js → chunk-P43PX75J.js} +33 -33
  62. package/dist/{chunk-RXZNACMI.js.map → chunk-P43PX75J.js.map} +1 -1
  63. package/dist/{chunk-OL73LBX5.mjs → chunk-QLFSJ6HK.mjs} +3 -4
  64. package/dist/chunk-QLFSJ6HK.mjs.map +1 -0
  65. package/dist/{chunk-LEKZUS6N.mjs → chunk-QPSHM2JQ.mjs} +4 -5
  66. package/dist/chunk-QPSHM2JQ.mjs.map +1 -0
  67. package/dist/{chunk-NJFRJ6YD.js → chunk-QSMPKL27.js} +225 -384
  68. package/dist/chunk-QSMPKL27.js.map +1 -0
  69. package/dist/{chunk-ZV5EZXXO.mjs → chunk-RHRJXK5R.mjs} +3 -3
  70. package/dist/{chunk-ZV5EZXXO.mjs.map → chunk-RHRJXK5R.mjs.map} +1 -1
  71. package/dist/{chunk-F54Q2YJY.js → chunk-SY4MUT5V.js} +7 -7
  72. package/dist/{chunk-F54Q2YJY.js.map → chunk-SY4MUT5V.js.map} +1 -1
  73. package/dist/{chunk-5RM6NGZ6.mjs → chunk-UHMAKUON.mjs} +3 -3
  74. package/dist/{chunk-5RM6NGZ6.mjs.map → chunk-UHMAKUON.mjs.map} +1 -1
  75. package/dist/{chunk-TIJJHW2Z.js → chunk-V5VBYOF5.js} +36 -36
  76. package/dist/{chunk-TIJJHW2Z.js.map → chunk-V5VBYOF5.js.map} +1 -1
  77. package/dist/{chunk-KR2X2WHJ.js → chunk-VMGNQFRO.js} +53 -53
  78. package/dist/{chunk-KR2X2WHJ.js.map → chunk-VMGNQFRO.js.map} +1 -1
  79. package/dist/{chunk-HZ4LOVHM.js → chunk-VY52Y5GC.js} +2 -2
  80. package/dist/chunk-VY52Y5GC.js.map +1 -0
  81. package/dist/{chunk-TVMLV675.js → chunk-Z7VY5M4T.js} +98 -95
  82. package/dist/chunk-Z7VY5M4T.js.map +1 -0
  83. package/dist/{chunk-R4TQWXNG.mjs → chunk-ZM2Q2SMC.mjs} +6 -5
  84. package/dist/chunk-ZM2Q2SMC.mjs.map +1 -0
  85. package/dist/index.js +744 -904
  86. package/dist/index.mjs +4 -4
  87. package/dist/platform/admin/index.js +13 -13
  88. package/dist/platform/admin/index.mjs +7 -7
  89. package/dist/platform/agents-workspace.js +9 -9
  90. package/dist/platform/agents-workspace.mjs +8 -8
  91. package/dist/platform/app-shell.js +6 -6
  92. package/dist/platform/app-shell.mjs +5 -5
  93. package/dist/platform/auth/index.js +30 -30
  94. package/dist/platform/auth/index.mjs +7 -7
  95. package/dist/platform/billing/index.js +6 -6
  96. package/dist/platform/billing/index.mjs +5 -5
  97. package/dist/platform/impersonation/index.js +6 -6
  98. package/dist/platform/impersonation/index.mjs +5 -5
  99. package/dist/platform/index.js +102 -4812
  100. package/dist/platform/index.js.map +1 -1
  101. package/dist/platform/index.mjs +24 -4729
  102. package/dist/platform/index.mjs.map +1 -1
  103. package/dist/platform/pages/index.js +320 -204
  104. package/dist/platform/pages/index.js.map +1 -1
  105. package/dist/platform/pages/index.mjs +146 -30
  106. package/dist/platform/pages/index.mjs.map +1 -1
  107. package/dist/platform/rbac.js +2 -2
  108. package/dist/platform/rbac.mjs +1 -1
  109. package/dist/platform/settings/index.js +10 -10
  110. package/dist/platform/settings/index.mjs +9 -9
  111. package/dist/platform/utils/index.js +3 -3
  112. package/dist/platform/utils/index.js.map +1 -1
  113. package/dist/platform/utils/index.mjs +1 -1
  114. package/dist/platform/utils/index.mjs.map +1 -1
  115. package/dist/platform/workflow-api-client.js +62 -62
  116. package/dist/platform/workflow-api-client.mjs +2 -2
  117. package/dist/platform/workflow-canvas-shell.js +7 -7
  118. package/dist/platform/workflow-canvas-shell.mjs +6 -6
  119. package/package.json +15 -5
  120. package/src/styles/liquid-glass.css +283 -2
  121. package/dist/astrlabe/contracts.d.mts +0 -517
  122. package/dist/astrlabe/contracts.d.ts +0 -517
  123. package/dist/astrlabe/graph-node.d.mts +0 -28
  124. package/dist/astrlabe/graph-node.d.ts +0 -28
  125. package/dist/astrlabe/index.d.mts +0 -751
  126. package/dist/astrlabe/index.d.ts +0 -751
  127. package/dist/astrlabe/utils.d.mts +0 -60
  128. package/dist/astrlabe/utils.d.ts +0 -60
  129. package/dist/astrlabe/workflow-canvas.d.mts +0 -69
  130. package/dist/astrlabe/workflow-canvas.d.ts +0 -69
  131. package/dist/astrlabe/workflow-preview-canvas.d.mts +0 -10
  132. package/dist/astrlabe/workflow-preview-canvas.d.ts +0 -10
  133. package/dist/billing-panel-DsHhhJqG.d.mts +0 -18
  134. package/dist/billing-panel-DsHhhJqG.d.ts +0 -18
  135. package/dist/brand/index.d.mts +0 -85
  136. package/dist/brand/index.d.ts +0 -85
  137. package/dist/chunk-2WXRRQM3.mjs.map +0 -1
  138. package/dist/chunk-3ZUMJTDT.mjs.map +0 -1
  139. package/dist/chunk-AOUUZ52N.js.map +0 -1
  140. package/dist/chunk-FAGDZEKM.js.map +0 -1
  141. package/dist/chunk-HDCUWUNH.js.map +0 -1
  142. package/dist/chunk-HZ4LOVHM.js.map +0 -1
  143. package/dist/chunk-I2NZGVBG.js.map +0 -1
  144. package/dist/chunk-IJAKZHXX.js.map +0 -1
  145. package/dist/chunk-JN6IL6OH.mjs.map +0 -1
  146. package/dist/chunk-LEKZUS6N.mjs.map +0 -1
  147. package/dist/chunk-MVBIAXVN.mjs.map +0 -1
  148. package/dist/chunk-MWPTSBAI.js.map +0 -1
  149. package/dist/chunk-NJFRJ6YD.js.map +0 -1
  150. package/dist/chunk-O6M3KDGT.mjs.map +0 -1
  151. package/dist/chunk-OL73LBX5.mjs.map +0 -1
  152. package/dist/chunk-PCYL4MII.mjs.map +0 -1
  153. package/dist/chunk-R4TQWXNG.mjs.map +0 -1
  154. package/dist/chunk-SYNVNTLJ.mjs.map +0 -1
  155. package/dist/chunk-TVMLV675.js.map +0 -1
  156. package/dist/chunk-UDDZTTLO.mjs.map +0 -1
  157. package/dist/chunk-W5OEBO6E.js.map +0 -1
  158. package/dist/chunk-ZJPNP2YW.mjs.map +0 -1
  159. package/dist/chunk-ZM5MVWIT.js.map +0 -1
  160. package/dist/dynamic-island-confirm-BKsZkAEP.d.mts +0 -17
  161. package/dist/dynamic-island-confirm-BKsZkAEP.d.ts +0 -17
  162. package/dist/index-CoB18TbG.d.ts +0 -215
  163. package/dist/index-VI9gyJXl.d.mts +0 -215
  164. package/dist/index.d.mts +0 -5412
  165. package/dist/index.d.ts +0 -5412
  166. package/dist/layout-engine-YZcVr20M.d.mts +0 -19
  167. package/dist/layout-engine-YZcVr20M.d.ts +0 -19
  168. package/dist/lib/i18n-context.d.mts +0 -36
  169. package/dist/lib/i18n-context.d.ts +0 -36
  170. package/dist/lib/router-context.d.mts +0 -35
  171. package/dist/lib/router-context.d.ts +0 -35
  172. package/dist/navigation-BiWVffAN.d.mts +0 -49
  173. package/dist/navigation-BiWVffAN.d.ts +0 -49
  174. package/dist/platform/admin/index.d.mts +0 -17
  175. package/dist/platform/admin/index.d.ts +0 -17
  176. package/dist/platform/agents-workspace.d.mts +0 -19
  177. package/dist/platform/agents-workspace.d.ts +0 -19
  178. package/dist/platform/app-shell.d.mts +0 -58
  179. package/dist/platform/app-shell.d.ts +0 -58
  180. package/dist/platform/auth/index.d.mts +0 -73
  181. package/dist/platform/auth/index.d.ts +0 -73
  182. package/dist/platform/billing/index.d.mts +0 -29
  183. package/dist/platform/billing/index.d.ts +0 -29
  184. package/dist/platform/impersonation/index.d.mts +0 -19
  185. package/dist/platform/impersonation/index.d.ts +0 -19
  186. package/dist/platform/index.d.mts +0 -224
  187. package/dist/platform/index.d.ts +0 -224
  188. package/dist/platform/pages/index.d.mts +0 -432
  189. package/dist/platform/pages/index.d.ts +0 -432
  190. package/dist/platform/rbac.d.mts +0 -41
  191. package/dist/platform/rbac.d.ts +0 -41
  192. package/dist/platform/settings/index.d.mts +0 -31
  193. package/dist/platform/settings/index.d.ts +0 -31
  194. package/dist/platform/telemetry/index.d.mts +0 -51
  195. package/dist/platform/telemetry/index.d.ts +0 -51
  196. package/dist/platform/utils/index.d.mts +0 -32
  197. package/dist/platform/utils/index.d.ts +0 -32
  198. package/dist/platform/windsock-admin-client.d.mts +0 -57
  199. package/dist/platform/windsock-admin-client.d.ts +0 -57
  200. package/dist/platform/workflow-api-client.d.mts +0 -6
  201. package/dist/platform/workflow-api-client.d.ts +0 -6
  202. package/dist/platform/workflow-canvas-shell.d.mts +0 -18
  203. package/dist/platform/workflow-canvas-shell.d.ts +0 -18
  204. package/dist/rule-form-BYJzyork.d.mts +0 -128
  205. package/dist/rule-form-BYJzyork.d.ts +0 -128
  206. package/dist/workflow-api-client-BKD8OfP_.d.ts +0 -468
  207. package/dist/workflow-api-client-DoYj7nHz.d.mts +0 -468
  208. package/dist/workflow-store-o17I6L6A.d.ts +0 -79
  209. package/dist/workflow-store-ppVHdMZi.d.mts +0 -79
  210. package/src/brand/logos/kori-icon.svg +0 -45
  211. package/src/brand/logos/kori-logo-dark.svg +0 -40
  212. package/src/brand/logos/kori-logo.svg +0 -43
@@ -1,9 +1,8 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkI2NZGVBG_js = require('./chunk-I2NZGVBG.js');
4
+ var chunkAWDH6WNA_js = require('./chunk-AWDH6WNA.js');
5
5
  var chunkYXN2K77G_js = require('./chunk-YXN2K77G.js');
6
- var chunkF54Q2YJY_js = require('./chunk-F54Q2YJY.js');
7
6
  var chunkP4YYEM4B_js = require('./chunk-P4YYEM4B.js');
8
7
  var chunk72SWXOD5_js = require('./chunk-72SWXOD5.js');
9
8
  var react = require('react');
@@ -1704,7 +1703,7 @@ function DatasourceNodeConfigForm({
1704
1703
  }
1705
1704
  const logo = getDatasourceLogo(selectedDatasourceId, selectedDatasource?.dialect);
1706
1705
  return /* @__PURE__ */ jsxRuntime.jsx(
1707
- chunkI2NZGVBG_js.GlassModal,
1706
+ chunkAWDH6WNA_js.GlassModal,
1708
1707
  {
1709
1708
  open,
1710
1709
  onClose: onCancel,
@@ -1719,8 +1718,8 @@ function DatasourceNodeConfigForm({
1719
1718
  onSectionChange: setActiveSectionId
1720
1719
  },
1721
1720
  footer: readOnly ? void 0 : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-2 px-6 py-3", children: [
1722
- /* @__PURE__ */ jsxRuntime.jsx(chunkI2NZGVBG_js.Button, { outline: true, onClick: onCancel, children: t("cancel") }),
1723
- /* @__PURE__ */ jsxRuntime.jsx(chunkI2NZGVBG_js.Button, { color: "cyan", onClick: handleSave, disabled: !canSave, children: t("save") })
1721
+ /* @__PURE__ */ jsxRuntime.jsx(chunkAWDH6WNA_js.Button, { outline: true, onClick: onCancel, children: t("cancel") }),
1722
+ /* @__PURE__ */ jsxRuntime.jsx(chunkAWDH6WNA_js.Button, { color: "cyan", onClick: handleSave, disabled: !canSave, children: t("save") })
1724
1723
  ] }),
1725
1724
  children: renderSection()
1726
1725
  }
@@ -2058,7 +2057,7 @@ function NodeRunningIndicatorComponent({ nodeId }) {
2058
2057
  borderColor: `rgba(${accentRgb}, 0.55)`,
2059
2058
  boxShadow: `0 0 0 1px rgba(${accentRgb}, 0.16), 0 6px 16px rgba(${accentRgb}, 0.18)`
2060
2059
  },
2061
- children: /* @__PURE__ */ jsxRuntime.jsxs("svg", { className: "h-3 w-3 animate-spin", style: { color: accentColor }, viewBox: "0 0 24 24", fill: "none", children: [
2060
+ children: /* @__PURE__ */ jsxRuntime.jsxs("svg", { className: "h-3 w-3 animate-spin motion-reduce:animate-none", style: { color: accentColor }, viewBox: "0 0 24 24", fill: "none", children: [
2062
2061
  /* @__PURE__ */ jsxRuntime.jsx("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
2063
2062
  /* @__PURE__ */ jsxRuntime.jsx("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" })
2064
2063
  ] })
@@ -2227,7 +2226,7 @@ var AgentToolFlowNode = react.memo(function AgentToolFlowNode2({ id, data, selec
2227
2226
  event.stopPropagation();
2228
2227
  },
2229
2228
  children: /* @__PURE__ */ jsxRuntime.jsx(
2230
- chunkI2NZGVBG_js.ToggleSwitch,
2229
+ chunkAWDH6WNA_js.ToggleSwitch,
2231
2230
  {
2232
2231
  checked: Boolean(agentTool.enabled),
2233
2232
  onChange: () => data.onToggle?.(agentTool),
@@ -2335,7 +2334,7 @@ var ToolFlowNode = react.memo(function ToolFlowNode2({ id, data, selected }) {
2335
2334
  event.preventDefault();
2336
2335
  },
2337
2336
  children: /* @__PURE__ */ jsxRuntime.jsx(
2338
- chunkI2NZGVBG_js.ToggleSwitch,
2337
+ chunkAWDH6WNA_js.ToggleSwitch,
2339
2338
  {
2340
2339
  checked: Boolean(tool.enabled),
2341
2340
  onChange: () => onToggle(tool),
@@ -2487,7 +2486,7 @@ var RuleFlowNode = react.memo(function RuleFlowNode2({ id, data, selected }) {
2487
2486
  event.preventDefault();
2488
2487
  },
2489
2488
  children: /* @__PURE__ */ jsxRuntime.jsx(
2490
- chunkI2NZGVBG_js.ToggleSwitch,
2489
+ chunkAWDH6WNA_js.ToggleSwitch,
2491
2490
  {
2492
2491
  checked: Boolean(rule.enabled),
2493
2492
  onChange: () => onToggle(rule),
@@ -3487,7 +3486,7 @@ var DatasourceFlowNode = react.memo(function DatasourceFlowNode2({ id, data, sel
3487
3486
  event.preventDefault();
3488
3487
  },
3489
3488
  children: /* @__PURE__ */ jsxRuntime.jsx(
3490
- chunkI2NZGVBG_js.ToggleSwitch,
3489
+ chunkAWDH6WNA_js.ToggleSwitch,
3491
3490
  {
3492
3491
  checked: true,
3493
3492
  onChange: () => {
@@ -3543,92 +3542,6 @@ var DatasourceFlowNode = react.memo(function DatasourceFlowNode2({ id, data, sel
3543
3542
  /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "source", position: react$1.Position.Right, id: "right-out", colorClass: "!bg-cyan-400" })
3544
3543
  ] });
3545
3544
  });
3546
- var SI = (slug, color) => `https://cdn.simpleicons.org/${slug}/${color}`;
3547
- var PROVIDER_LOGOS = {
3548
- aws_bedrock: "https://www.svgrepo.com/show/448266/aws.svg",
3549
- openai_api: "https://www.svgrepo.com/show/306500/openai.svg",
3550
- google_vertex: SI("googlegemini", "8E75B2"),
3551
- azure_openai: SI("microsoftazure", "0078D4"),
3552
- anthropic_api: SI("anthropic", "D4A27F"),
3553
- groq: SI("groq", "000000"),
3554
- mistral: SI("mistralai", "FF7000"),
3555
- huggingface: SI("huggingface", "FFD21E"),
3556
- ollama: SI("ollama", "FFFFFF")
3557
- };
3558
- var PROVIDER_TYPE_LABELS = {
3559
- aws_bedrock: "AWS Bedrock",
3560
- openai_api: "OpenAI API",
3561
- google_vertex: "Google Vertex AI",
3562
- azure_openai: "Azure OpenAI",
3563
- anthropic_api: "Anthropic API",
3564
- groq: "Groq Cloud",
3565
- mistral: "Mistral AI",
3566
- huggingface: "Hugging Face",
3567
- ollama: "Ollama (Local)",
3568
- custom: "Custom"
3569
- };
3570
- var ModelProviderFlowNode = react.memo(function ModelProviderFlowNode2({ id, data, selected }) {
3571
- const config = data.config;
3572
- const isCompact = data.displayMode === "compact";
3573
- if (!config) {
3574
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3575
- /* @__PURE__ */ jsxRuntime.jsx(NodeRunningIndicator, { nodeId: id }),
3576
- /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "target", position: react$1.Position.Left, id: "left-in", colorClass: "!bg-gray-400 dark:!bg-gray-500" }),
3577
- /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "target", position: react$1.Position.Top, id: "top-in", colorClass: "!bg-gray-400 dark:!bg-gray-500" }),
3578
- /* @__PURE__ */ jsxRuntime.jsx(NodeCard, { variant: "error", nodeType: "model_provider", width: "w-[280px]", children: /* @__PURE__ */ jsxRuntime.jsx(
3579
- NodeCardHeader,
3580
- {
3581
- icon: /* @__PURE__ */ jsxRuntime.jsx(outline.ExclamationTriangleIcon, { className: "h-6 w-6 text-white" }),
3582
- title: data.label || "Model Provider",
3583
- description: "Not configured",
3584
- iconClassName: "flex h-11 w-11 items-center justify-center rounded-xl bg-gradient-to-br from-amber-400 to-orange-500 shadow-lg"
3585
- }
3586
- ) }),
3587
- /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "source", position: react$1.Position.Right, id: "right-out", colorClass: "!bg-slate-500" }),
3588
- /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "source", position: react$1.Position.Bottom, id: "bottom-out", colorClass: "!bg-slate-500" })
3589
- ] });
3590
- }
3591
- const providerLabel = PROVIDER_TYPE_LABELS[config.providerType] ?? config.providerType;
3592
- const displayName = config.name || providerLabel;
3593
- const regionLabel = config.region ? config.region : void 0;
3594
- const isConfigured = !!(config.credentialRef || config.apiKeyRef);
3595
- const logo = PROVIDER_LOGOS[config.providerType];
3596
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3597
- /* @__PURE__ */ jsxRuntime.jsx(NodeRunningIndicator, { nodeId: id }),
3598
- /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "target", position: react$1.Position.Left, id: "left-in", colorClass: "!bg-gray-400 dark:!bg-gray-500" }),
3599
- /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "target", position: react$1.Position.Top, id: "top-in", colorClass: "!bg-gray-400 dark:!bg-gray-500" }),
3600
- /* @__PURE__ */ jsxRuntime.jsx(
3601
- "button",
3602
- {
3603
- type: "button",
3604
- onClick: () => data.onEdit?.(id),
3605
- className: "w-full text-left",
3606
- children: /* @__PURE__ */ jsxRuntime.jsxs(NodeCard, { compact: isCompact, selected, nodeType: "model_provider", width: "w-[280px]", children: [
3607
- /* @__PURE__ */ jsxRuntime.jsx(
3608
- NodeCardHeader,
3609
- {
3610
- icon: logo ? /* @__PURE__ */ jsxRuntime.jsx("img", { src: logo, alt: providerLabel, className: "h-6 w-6 object-contain", loading: "lazy" }) : /* @__PURE__ */ jsxRuntime.jsx(outline.KeyIcon, { className: "h-6 w-6 text-white" }),
3611
- title: displayName,
3612
- description: providerLabel,
3613
- iconClassName: `flex h-11 w-11 items-center justify-center rounded-xl shadow-lg ${logo ? "bg-white/10 dark:bg-white/5 p-2" : "bg-gradient-to-br from-slate-600 to-slate-700 p-1.5"}`
3614
- }
3615
- ),
3616
- /* @__PURE__ */ jsxRuntime.jsx(NodeCardMeta, { compact: isCompact, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-1.5", children: [
3617
- /* @__PURE__ */ jsxRuntime.jsx(NodeCardBadge, { className: "rounded-full bg-slate-100 px-2 py-0.5 text-[10px] font-semibold text-slate-700 dark:bg-slate-500/20 dark:text-slate-300", children: providerLabel }),
3618
- regionLabel && /* @__PURE__ */ jsxRuntime.jsx(NodeCardBadge, { className: "rounded-full bg-gray-100 px-2 py-0.5 text-[10px] font-medium text-gray-600 dark:bg-white/10 dark:text-gray-300", children: regionLabel }),
3619
- /* @__PURE__ */ jsxRuntime.jsx(NodeCardBadge, { className: `rounded-full px-2 py-0.5 text-[10px] font-medium ${isConfigured ? "bg-green-100 text-green-700 dark:bg-green-500/20 dark:text-green-300" : "bg-amber-100 text-amber-700 dark:bg-amber-500/20 dark:text-amber-300"}`, children: isConfigured ? "Configured" : "Setup needed" }),
3620
- config.modelFilter && config.modelFilter.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(NodeCardBadge, { className: "rounded-full bg-gray-100 px-2 py-0.5 text-[10px] font-medium text-gray-600 dark:bg-white/10 dark:text-gray-300", children: [
3621
- config.modelFilter.length,
3622
- " models"
3623
- ] })
3624
- ] }) })
3625
- ] })
3626
- }
3627
- ),
3628
- /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "source", position: react$1.Position.Right, id: "right-out", colorClass: "!bg-slate-500" }),
3629
- /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "source", position: react$1.Position.Bottom, id: "bottom-out", colorClass: "!bg-slate-500" })
3630
- ] });
3631
- });
3632
3545
  var GROUP_COLORS = {
3633
3546
  indigo: {
3634
3547
  border: "border-indigo-300/50 dark:border-indigo-600/50",
@@ -3891,6 +3804,46 @@ var SpeechTranscriberFlowNode = react.memo(function SpeechTranscriberFlowNode2({
3891
3804
  /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "source", position: react$1.Position.Right, id: "right-out", colorClass: "!bg-violet-500" })
3892
3805
  ] });
3893
3806
  });
3807
+ var DashboardOutputFlowNode = react.memo(function DashboardOutputFlowNode2({ id, data, selected }) {
3808
+ const t = chunkYXN2K77G_js.useTranslations("agents.workflow");
3809
+ const { config, label, onDelete, onEdit } = data;
3810
+ const isCompact = data.displayMode === "compact";
3811
+ const source = config?.dashboardFrom ? `\u2190 ${config.dashboardFrom}` : config?.dashboard ? "inline" : "unset";
3812
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3813
+ /* @__PURE__ */ jsxRuntime.jsx(NodeRunningIndicator, { nodeId: id }),
3814
+ /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "target", position: react$1.Position.Left, id: "left-in", colorClass: "!bg-fuchsia-500" }),
3815
+ /* @__PURE__ */ jsxRuntime.jsxs(
3816
+ NodeInteractiveCard,
3817
+ {
3818
+ nodeId: id,
3819
+ onEdit,
3820
+ compact: isCompact,
3821
+ selected,
3822
+ nodeType: "dashboard_output",
3823
+ width: "w-[260px]",
3824
+ children: [
3825
+ /* @__PURE__ */ jsxRuntime.jsx(
3826
+ NodeCardHeader,
3827
+ {
3828
+ icon: /* @__PURE__ */ jsxRuntime.jsx(NodeIconBubble, { tone: "dashboard_output", children: /* @__PURE__ */ jsxRuntime.jsx(outline.ChartBarIcon, { className: "h-5 w-5 text-white" }) }),
3829
+ title: label,
3830
+ description: t("dashboardOutputNodeDescription"),
3831
+ compact: isCompact,
3832
+ iconClassName: ""
3833
+ }
3834
+ ),
3835
+ /* @__PURE__ */ jsxRuntime.jsxs(NodeCardMeta, { compact: isCompact, children: [
3836
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
3837
+ /* @__PURE__ */ jsxRuntime.jsx(NodeCardBadge, { tone: "dashboard_output", children: t("dashboardOutputNode") }),
3838
+ /* @__PURE__ */ jsxRuntime.jsx(NodeCardBadge, { tone: "dashboard_output", soft: true, children: source })
3839
+ ] }),
3840
+ /* @__PURE__ */ jsxRuntime.jsx(NodeCardDeleteAction, { nodeId: id, onDelete })
3841
+ ] })
3842
+ ]
3843
+ }
3844
+ )
3845
+ ] });
3846
+ });
3894
3847
  function ConfigFormActions({
3895
3848
  cancelLabel,
3896
3849
  saveLabel,
@@ -3899,8 +3852,8 @@ function ConfigFormActions({
3899
3852
  saveDisabled = false
3900
3853
  }) {
3901
3854
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-2 border-t border-gray-200 pt-4 dark:border-gray-700", children: [
3902
- /* @__PURE__ */ jsxRuntime.jsx(chunkI2NZGVBG_js.Button, { type: "button", outline: true, onClick: onCancel, children: cancelLabel }),
3903
- /* @__PURE__ */ jsxRuntime.jsx(chunkI2NZGVBG_js.Button, { type: "button", onClick: onSave, disabled: saveDisabled, children: saveLabel })
3855
+ /* @__PURE__ */ jsxRuntime.jsx(chunkAWDH6WNA_js.Button, { type: "button", outline: true, onClick: onCancel, children: cancelLabel }),
3856
+ /* @__PURE__ */ jsxRuntime.jsx(chunkAWDH6WNA_js.Button, { type: "button", onClick: onSave, disabled: saveDisabled, children: saveLabel })
3904
3857
  ] });
3905
3858
  }
3906
3859
  var COLOR_CLASSES = {
@@ -4147,7 +4100,7 @@ function IfElseNodeConfigForm({ config, onSave, onCancel }) {
4147
4100
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3 flex items-center justify-between", children: [
4148
4101
  /* @__PURE__ */ jsxRuntime.jsx("label", { className: "text-sm font-medium text-gray-700 dark:text-gray-300", children: t("conditionsLabel") }),
4149
4102
  /* @__PURE__ */ jsxRuntime.jsx(
4150
- chunkI2NZGVBG_js.Button,
4103
+ chunkAWDH6WNA_js.Button,
4151
4104
  {
4152
4105
  type: "button",
4153
4106
  onClick: handleAddCondition,
@@ -4158,7 +4111,7 @@ function IfElseNodeConfigForm({ config, onSave, onCancel }) {
4158
4111
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: conditions.map((condition, index) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-2 rounded-lg border border-gray-200 bg-gray-50 p-3 dark:border-gray-700 dark:bg-gray-800/50", children: [
4159
4112
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid flex-1 grid-cols-3 gap-2", children: [
4160
4113
  /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(
4161
- chunkI2NZGVBG_js.FormInput,
4114
+ chunkAWDH6WNA_js.FormInput,
4162
4115
  {
4163
4116
  type: "text",
4164
4117
  label: t("variableLabel"),
@@ -4169,7 +4122,7 @@ function IfElseNodeConfigForm({ config, onSave, onCancel }) {
4169
4122
  }
4170
4123
  ) }),
4171
4124
  /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(
4172
- chunkI2NZGVBG_js.FormSelect,
4125
+ chunkAWDH6WNA_js.FormSelect,
4173
4126
  {
4174
4127
  label: t("operatorLabel"),
4175
4128
  value: condition.operator,
@@ -4179,7 +4132,7 @@ function IfElseNodeConfigForm({ config, onSave, onCancel }) {
4179
4132
  }
4180
4133
  ) }),
4181
4134
  /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(
4182
- chunkI2NZGVBG_js.FormInput,
4135
+ chunkAWDH6WNA_js.FormInput,
4183
4136
  {
4184
4137
  type: "text",
4185
4138
  label: t("valueLabel"),
@@ -4191,7 +4144,7 @@ function IfElseNodeConfigForm({ config, onSave, onCancel }) {
4191
4144
  ) })
4192
4145
  ] }),
4193
4146
  conditions.length > 1 && /* @__PURE__ */ jsxRuntime.jsx(
4194
- chunkI2NZGVBG_js.IconButton,
4147
+ chunkAWDH6WNA_js.IconButton,
4195
4148
  {
4196
4149
  onClick: () => handleRemoveCondition(index),
4197
4150
  icon: /* @__PURE__ */ jsxRuntime.jsx(outline.TrashIcon, { className: "h-4 w-4" }),
@@ -4563,7 +4516,7 @@ function HttpRequestNodeConfigForm({ config, onSave, onCancel }) {
4563
4516
  };
4564
4517
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
4565
4518
  /* @__PURE__ */ jsxRuntime.jsx(
4566
- chunkI2NZGVBG_js.FormSelect,
4519
+ chunkAWDH6WNA_js.FormSelect,
4567
4520
  {
4568
4521
  label: t("methodLabel"),
4569
4522
  value: method,
@@ -4572,7 +4525,7 @@ function HttpRequestNodeConfigForm({ config, onSave, onCancel }) {
4572
4525
  }
4573
4526
  ),
4574
4527
  /* @__PURE__ */ jsxRuntime.jsx(
4575
- chunkI2NZGVBG_js.FormInput,
4528
+ chunkAWDH6WNA_js.FormInput,
4576
4529
  {
4577
4530
  type: "text",
4578
4531
  label: t("urlLabel"),
@@ -4585,7 +4538,7 @@ function HttpRequestNodeConfigForm({ config, onSave, onCancel }) {
4585
4538
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-2 flex items-center justify-between", children: [
4586
4539
  /* @__PURE__ */ jsxRuntime.jsx("label", { className: "text-sm font-medium text-gray-700 dark:text-gray-300", children: t("headersLabel") }),
4587
4540
  /* @__PURE__ */ jsxRuntime.jsx(
4588
- chunkI2NZGVBG_js.Button,
4541
+ chunkAWDH6WNA_js.Button,
4589
4542
  {
4590
4543
  type: "button",
4591
4544
  onClick: handleAddHeader,
@@ -4595,7 +4548,7 @@ function HttpRequestNodeConfigForm({ config, onSave, onCancel }) {
4595
4548
  ] }),
4596
4549
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-2", children: headerEntries.map((entry, index) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
4597
4550
  /* @__PURE__ */ jsxRuntime.jsx(
4598
- chunkI2NZGVBG_js.FormInput,
4551
+ chunkAWDH6WNA_js.FormInput,
4599
4552
  {
4600
4553
  type: "text",
4601
4554
  value: entry.key,
@@ -4605,7 +4558,7 @@ function HttpRequestNodeConfigForm({ config, onSave, onCancel }) {
4605
4558
  }
4606
4559
  ),
4607
4560
  /* @__PURE__ */ jsxRuntime.jsx(
4608
- chunkI2NZGVBG_js.FormInput,
4561
+ chunkAWDH6WNA_js.FormInput,
4609
4562
  {
4610
4563
  type: "text",
4611
4564
  value: entry.value,
@@ -4615,7 +4568,7 @@ function HttpRequestNodeConfigForm({ config, onSave, onCancel }) {
4615
4568
  }
4616
4569
  ),
4617
4570
  /* @__PURE__ */ jsxRuntime.jsx(
4618
- chunkI2NZGVBG_js.IconButton,
4571
+ chunkAWDH6WNA_js.IconButton,
4619
4572
  {
4620
4573
  onClick: () => handleRemoveHeader(index),
4621
4574
  icon: /* @__PURE__ */ jsxRuntime.jsx(outline.TrashIcon, { className: "h-4 w-4" }),
@@ -4627,7 +4580,7 @@ function HttpRequestNodeConfigForm({ config, onSave, onCancel }) {
4627
4580
  ] }, index)) })
4628
4581
  ] }),
4629
4582
  method !== "GET" && /* @__PURE__ */ jsxRuntime.jsx(
4630
- chunkI2NZGVBG_js.FormTextarea,
4583
+ chunkAWDH6WNA_js.FormTextarea,
4631
4584
  {
4632
4585
  label: t("bodyLabel"),
4633
4586
  value: body,
@@ -4638,7 +4591,7 @@ function HttpRequestNodeConfigForm({ config, onSave, onCancel }) {
4638
4591
  }
4639
4592
  ),
4640
4593
  /* @__PURE__ */ jsxRuntime.jsx(
4641
- chunkI2NZGVBG_js.FormInput,
4594
+ chunkAWDH6WNA_js.FormInput,
4642
4595
  {
4643
4596
  type: "number",
4644
4597
  label: t("timeoutLabel"),
@@ -4650,7 +4603,7 @@ function HttpRequestNodeConfigForm({ config, onSave, onCancel }) {
4650
4603
  }
4651
4604
  ),
4652
4605
  /* @__PURE__ */ jsxRuntime.jsx(
4653
- chunkI2NZGVBG_js.FormSelect,
4606
+ chunkAWDH6WNA_js.FormSelect,
4654
4607
  {
4655
4608
  label: t("parseResponseLabel"),
4656
4609
  value: parseResponse,
@@ -4695,7 +4648,7 @@ function S3WriteNodeConfigForm({ config, onSave, onCancel }) {
4695
4648
  };
4696
4649
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
4697
4650
  /* @__PURE__ */ jsxRuntime.jsx(
4698
- chunkI2NZGVBG_js.FormInput,
4651
+ chunkAWDH6WNA_js.FormInput,
4699
4652
  {
4700
4653
  type: "text",
4701
4654
  label: t("bucketLabel"),
@@ -4705,7 +4658,7 @@ function S3WriteNodeConfigForm({ config, onSave, onCancel }) {
4705
4658
  }
4706
4659
  ),
4707
4660
  /* @__PURE__ */ jsxRuntime.jsx(
4708
- chunkI2NZGVBG_js.FormInput,
4661
+ chunkAWDH6WNA_js.FormInput,
4709
4662
  {
4710
4663
  type: "text",
4711
4664
  label: t("keyLabel"),
@@ -4716,7 +4669,7 @@ function S3WriteNodeConfigForm({ config, onSave, onCancel }) {
4716
4669
  ),
4717
4670
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border border-cyan-200/40 bg-cyan-50/40 px-3 py-2 text-[11px] text-cyan-900 dark:border-cyan-500/30 dark:bg-cyan-500/10 dark:text-cyan-100", children: t("sourceOrBodyHint") }),
4718
4671
  /* @__PURE__ */ jsxRuntime.jsx(
4719
- chunkI2NZGVBG_js.FormInput,
4672
+ chunkAWDH6WNA_js.FormInput,
4720
4673
  {
4721
4674
  type: "text",
4722
4675
  label: t("sourceUrlLabel"),
@@ -4726,7 +4679,7 @@ function S3WriteNodeConfigForm({ config, onSave, onCancel }) {
4726
4679
  }
4727
4680
  ),
4728
4681
  /* @__PURE__ */ jsxRuntime.jsx(
4729
- chunkI2NZGVBG_js.FormTextarea,
4682
+ chunkAWDH6WNA_js.FormTextarea,
4730
4683
  {
4731
4684
  label: t("bodyLabel"),
4732
4685
  value: body,
@@ -4737,7 +4690,7 @@ function S3WriteNodeConfigForm({ config, onSave, onCancel }) {
4737
4690
  }
4738
4691
  ),
4739
4692
  /* @__PURE__ */ jsxRuntime.jsx(
4740
- chunkI2NZGVBG_js.FormInput,
4693
+ chunkAWDH6WNA_js.FormInput,
4741
4694
  {
4742
4695
  type: "text",
4743
4696
  label: t("contentTypeLabel"),
@@ -4747,7 +4700,7 @@ function S3WriteNodeConfigForm({ config, onSave, onCancel }) {
4747
4700
  }
4748
4701
  ),
4749
4702
  /* @__PURE__ */ jsxRuntime.jsx(
4750
- chunkI2NZGVBG_js.FormInput,
4703
+ chunkAWDH6WNA_js.FormInput,
4751
4704
  {
4752
4705
  type: "number",
4753
4706
  label: t("timeoutLabel"),
@@ -4758,7 +4711,7 @@ function S3WriteNodeConfigForm({ config, onSave, onCancel }) {
4758
4711
  }
4759
4712
  ),
4760
4713
  /* @__PURE__ */ jsxRuntime.jsx(
4761
- chunkI2NZGVBG_js.FormInput,
4714
+ chunkAWDH6WNA_js.FormInput,
4762
4715
  {
4763
4716
  type: "text",
4764
4717
  label: t("connectionIdLabel"),
@@ -4787,7 +4740,7 @@ function TemplateTransformNodeConfigForm({ config, onSave, onCancel }) {
4787
4740
  };
4788
4741
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
4789
4742
  /* @__PURE__ */ jsxRuntime.jsx(
4790
- chunkI2NZGVBG_js.FormTextarea,
4743
+ chunkAWDH6WNA_js.FormTextarea,
4791
4744
  {
4792
4745
  label: t("templateLabel"),
4793
4746
  value: template,
@@ -4798,7 +4751,7 @@ function TemplateTransformNodeConfigForm({ config, onSave, onCancel }) {
4798
4751
  }
4799
4752
  ),
4800
4753
  /* @__PURE__ */ jsxRuntime.jsx(
4801
- chunkI2NZGVBG_js.FormInput,
4754
+ chunkAWDH6WNA_js.FormInput,
4802
4755
  {
4803
4756
  type: "text",
4804
4757
  label: t("outputVariableLabel"),
@@ -4827,7 +4780,7 @@ function IterationNodeConfigForm({ config, onSave, onCancel }) {
4827
4780
  };
4828
4781
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
4829
4782
  /* @__PURE__ */ jsxRuntime.jsx(
4830
- chunkI2NZGVBG_js.FormInput,
4783
+ chunkAWDH6WNA_js.FormInput,
4831
4784
  {
4832
4785
  type: "text",
4833
4786
  label: t("iteratorVariableLabel"),
@@ -4837,7 +4790,7 @@ function IterationNodeConfigForm({ config, onSave, onCancel }) {
4837
4790
  }
4838
4791
  ),
4839
4792
  /* @__PURE__ */ jsxRuntime.jsx(
4840
- chunkI2NZGVBG_js.FormInput,
4793
+ chunkAWDH6WNA_js.FormInput,
4841
4794
  {
4842
4795
  type: "number",
4843
4796
  label: t("maxIterationsLabel"),
@@ -4868,7 +4821,7 @@ function KnowledgeBaseNodeConfigForm({ config, onSave, onCancel }) {
4868
4821
  };
4869
4822
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
4870
4823
  /* @__PURE__ */ jsxRuntime.jsx(
4871
- chunkI2NZGVBG_js.FormInput,
4824
+ chunkAWDH6WNA_js.FormInput,
4872
4825
  {
4873
4826
  type: "text",
4874
4827
  label: t("sourceIdLabel"),
@@ -4878,7 +4831,7 @@ function KnowledgeBaseNodeConfigForm({ config, onSave, onCancel }) {
4878
4831
  }
4879
4832
  ),
4880
4833
  /* @__PURE__ */ jsxRuntime.jsx(
4881
- chunkI2NZGVBG_js.FormInput,
4834
+ chunkAWDH6WNA_js.FormInput,
4882
4835
  {
4883
4836
  type: "number",
4884
4837
  label: t("topKLabel"),
@@ -4889,7 +4842,7 @@ function KnowledgeBaseNodeConfigForm({ config, onSave, onCancel }) {
4889
4842
  }
4890
4843
  ),
4891
4844
  /* @__PURE__ */ jsxRuntime.jsx(
4892
- chunkI2NZGVBG_js.FormInput,
4845
+ chunkAWDH6WNA_js.FormInput,
4893
4846
  {
4894
4847
  type: "number",
4895
4848
  label: t("similarityThresholdLabel"),
@@ -4920,7 +4873,7 @@ function AnswerNodeConfigForm({ config, onSave, onCancel }) {
4920
4873
  };
4921
4874
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
4922
4875
  /* @__PURE__ */ jsxRuntime.jsx(
4923
- chunkI2NZGVBG_js.FormTextarea,
4876
+ chunkAWDH6WNA_js.FormTextarea,
4924
4877
  {
4925
4878
  label: t("outputTemplateLabel"),
4926
4879
  hint: t("outputTemplateHelp"),
@@ -5354,7 +5307,7 @@ function VariableAggregatorNodeConfigForm({ config, onSave, onCancel }) {
5354
5307
  }
5355
5308
  ),
5356
5309
  /* @__PURE__ */ jsxRuntime.jsx(
5357
- chunkI2NZGVBG_js.FormInput,
5310
+ chunkAWDH6WNA_js.FormInput,
5358
5311
  {
5359
5312
  type: "text",
5360
5313
  label: t("outputVariableLabel"),
@@ -5364,7 +5317,7 @@ function VariableAggregatorNodeConfigForm({ config, onSave, onCancel }) {
5364
5317
  }
5365
5318
  ),
5366
5319
  /* @__PURE__ */ jsxRuntime.jsx(
5367
- chunkI2NZGVBG_js.FormSelect,
5320
+ chunkAWDH6WNA_js.FormSelect,
5368
5321
  {
5369
5322
  label: t("aggregationModeLabel"),
5370
5323
  value: aggregationMode,
@@ -5397,7 +5350,7 @@ function DocumentExtractorNodeConfigForm({ config, onSave, onCancel }) {
5397
5350
  };
5398
5351
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
5399
5352
  /* @__PURE__ */ jsxRuntime.jsx(
5400
- chunkI2NZGVBG_js.FormSelect,
5353
+ chunkAWDH6WNA_js.FormSelect,
5401
5354
  {
5402
5355
  label: t("extractionModeLabel"),
5403
5356
  value: extractionMode,
@@ -5406,7 +5359,7 @@ function DocumentExtractorNodeConfigForm({ config, onSave, onCancel }) {
5406
5359
  }
5407
5360
  ),
5408
5361
  /* @__PURE__ */ jsxRuntime.jsx(
5409
- chunkI2NZGVBG_js.FormInput,
5362
+ chunkAWDH6WNA_js.FormInput,
5410
5363
  {
5411
5364
  type: "text",
5412
5365
  label: t("outputVariableLabel"),
@@ -5583,7 +5536,7 @@ function IterationStartNodeConfigForm({ config, onSave, onCancel }) {
5583
5536
  };
5584
5537
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
5585
5538
  /* @__PURE__ */ jsxRuntime.jsx(
5586
- chunkI2NZGVBG_js.FormInput,
5539
+ chunkAWDH6WNA_js.FormInput,
5587
5540
  {
5588
5541
  type: "text",
5589
5542
  label: t("iteratorVariableLabel"),
@@ -5593,7 +5546,7 @@ function IterationStartNodeConfigForm({ config, onSave, onCancel }) {
5593
5546
  }
5594
5547
  ),
5595
5548
  /* @__PURE__ */ jsxRuntime.jsx(
5596
- chunkI2NZGVBG_js.FormInput,
5549
+ chunkAWDH6WNA_js.FormInput,
5597
5550
  {
5598
5551
  type: "text",
5599
5552
  label: t("itemVariableLabel"),
@@ -5603,7 +5556,7 @@ function IterationStartNodeConfigForm({ config, onSave, onCancel }) {
5603
5556
  }
5604
5557
  ),
5605
5558
  /* @__PURE__ */ jsxRuntime.jsx(
5606
- chunkI2NZGVBG_js.FormInput,
5559
+ chunkAWDH6WNA_js.FormInput,
5607
5560
  {
5608
5561
  type: "text",
5609
5562
  label: t("indexVariableLabel"),
@@ -5875,7 +5828,7 @@ function GroupNodeConfigForm({ config, onSave, onCancel }) {
5875
5828
  };
5876
5829
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
5877
5830
  /* @__PURE__ */ jsxRuntime.jsx(
5878
- chunkI2NZGVBG_js.FormInput,
5831
+ chunkAWDH6WNA_js.FormInput,
5879
5832
  {
5880
5833
  type: "text",
5881
5834
  label: translations("labelField"),
@@ -5885,7 +5838,7 @@ function GroupNodeConfigForm({ config, onSave, onCancel }) {
5885
5838
  }
5886
5839
  ),
5887
5840
  /* @__PURE__ */ jsxRuntime.jsx(
5888
- chunkI2NZGVBG_js.FormTextarea,
5841
+ chunkAWDH6WNA_js.FormTextarea,
5889
5842
  {
5890
5843
  label: translations("descriptionField"),
5891
5844
  value: description,
@@ -5919,215 +5872,6 @@ function GroupNodeConfigForm({ config, onSave, onCancel }) {
5919
5872
  )
5920
5873
  ] });
5921
5874
  }
5922
- var catalogCache = null;
5923
- var catalogPromise = null;
5924
- async function loadCatalog() {
5925
- if (catalogCache) return catalogCache;
5926
- if (!catalogPromise) {
5927
- catalogPromise = chunkF54Q2YJY_js.listModelProviderCatalog().then((rows) => {
5928
- catalogCache = rows;
5929
- return rows;
5930
- });
5931
- }
5932
- return catalogPromise;
5933
- }
5934
- var ENDPOINT_SLUGS = /* @__PURE__ */ new Set(["custom", "azure_openai", "ollama"]);
5935
- function ModelProviderNodeConfigForm({ config, onSave, onCancel }) {
5936
- const t = chunkYXN2K77G_js.useTranslations("agents.workflow.modelProviderNodeConfig");
5937
- const [catalog, setCatalog] = react.useState(catalogCache);
5938
- const [catalogError, setCatalogError] = react.useState(null);
5939
- const [providerType, setProviderType] = react.useState(config.providerType);
5940
- const [name, setName] = react.useState(config.name ?? "");
5941
- const [region, setRegion] = react.useState(config.region ?? "");
5942
- const [endpoint, setEndpoint] = react.useState(config.endpoint ?? "");
5943
- const [credentialRef, setCredentialRef] = react.useState(config.credentialRef ?? "");
5944
- const [apiKeyRef, setApiKeyRef] = react.useState(config.apiKeyRef ?? "");
5945
- const [selectedFamilies, setSelectedFamilies] = react.useState(/* @__PURE__ */ new Set());
5946
- react.useEffect(() => {
5947
- let cancelled = false;
5948
- if (catalog) return;
5949
- void loadCatalog().then((rows) => {
5950
- if (cancelled) return;
5951
- setCatalog(rows);
5952
- }).catch((error) => {
5953
- if (cancelled) return;
5954
- const message = error instanceof Error ? error.message : "Failed to load provider catalog";
5955
- setCatalogError(message);
5956
- });
5957
- return () => {
5958
- cancelled = true;
5959
- };
5960
- }, [catalog]);
5961
- const currentProvider = react.useMemo(() => {
5962
- if (!catalog) return void 0;
5963
- return catalog.find((entry) => entry.slug === providerType);
5964
- }, [catalog, providerType]);
5965
- const families = currentProvider?.families ?? [];
5966
- const regions = Array.isArray(currentProvider?.regions) ? currentProvider.regions : [];
5967
- const showRegion = regions.length > 0;
5968
- const showEndpoint = ENDPOINT_SLUGS.has(providerType);
5969
- const authType = currentProvider?.authType ?? null;
5970
- const showApiKey = authType === "api_key";
5971
- const showCredentialRef = authType === "iam_role";
5972
- react.useEffect(() => {
5973
- if (!currentProvider) return;
5974
- setSelectedFamilies((previous) => {
5975
- if (previous.size > 0) return previous;
5976
- const filter = new Set(config.modelFilter ?? []);
5977
- const next = /* @__PURE__ */ new Set();
5978
- for (const family of currentProvider.families) {
5979
- if (filter.size === 0 || family.modelIds.some((id) => filter.has(id))) {
5980
- next.add(family.id);
5981
- }
5982
- }
5983
- return next;
5984
- });
5985
- }, [currentProvider, config.modelFilter]);
5986
- const handleToggleFamily = (familyId) => {
5987
- setSelectedFamilies((previous) => {
5988
- const next = new Set(previous);
5989
- if (next.has(familyId)) next.delete(familyId);
5990
- else next.add(familyId);
5991
- return next;
5992
- });
5993
- };
5994
- const handleProviderChange = (value) => {
5995
- const newType = value;
5996
- setProviderType(newType);
5997
- setRegion("");
5998
- const next = catalog?.find((entry) => entry.slug === newType);
5999
- setSelectedFamilies(new Set((next?.families ?? []).map((family) => family.id)));
6000
- };
6001
- const handleSave = () => {
6002
- const modelFilter = families.filter((family) => selectedFamilies.has(family.id)).flatMap((family) => family.modelIds);
6003
- onSave({
6004
- ...config,
6005
- providerType,
6006
- name: name.trim() || void 0,
6007
- region: region || void 0,
6008
- endpoint: endpoint.trim() || void 0,
6009
- credentialRef: credentialRef.trim() || void 0,
6010
- apiKeyRef: apiKeyRef.trim() || void 0,
6011
- modelFilter
6012
- });
6013
- };
6014
- if (catalogError) {
6015
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
6016
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border border-red-200 bg-red-50 p-3 text-sm text-red-900 dark:border-red-500/30 dark:bg-red-500/10 dark:text-red-200", children: catalogError }),
6017
- /* @__PURE__ */ jsxRuntime.jsx(
6018
- ConfigFormActions,
6019
- {
6020
- cancelLabel: t("cancel"),
6021
- saveLabel: t("save"),
6022
- onCancel,
6023
- onSave: handleSave,
6024
- saveDisabled: true
6025
- }
6026
- )
6027
- ] });
6028
- }
6029
- if (!catalog) {
6030
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-4 h-32" });
6031
- }
6032
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
6033
- /* @__PURE__ */ jsxRuntime.jsx(
6034
- chunkI2NZGVBG_js.FormInput,
6035
- {
6036
- type: "text",
6037
- label: t("nameLabel"),
6038
- value: name,
6039
- onValueChange: setName,
6040
- placeholder: t("namePlaceholder")
6041
- }
6042
- ),
6043
- /* @__PURE__ */ jsxRuntime.jsx(
6044
- chunkI2NZGVBG_js.FormSelect,
6045
- {
6046
- label: t("providerTypeLabel"),
6047
- value: providerType,
6048
- onValueChange: handleProviderChange,
6049
- options: catalog.filter((entry) => entry.enabled).map((entry) => ({ value: entry.slug, label: entry.name }))
6050
- }
6051
- ),
6052
- showRegion && /* @__PURE__ */ jsxRuntime.jsx(
6053
- chunkI2NZGVBG_js.FormSelect,
6054
- {
6055
- label: t("regionLabel"),
6056
- value: region,
6057
- onValueChange: setRegion,
6058
- options: [
6059
- { value: "", label: t("selectRegion") },
6060
- ...regions.map((value) => ({ value, label: value }))
6061
- ]
6062
- }
6063
- ),
6064
- showEndpoint && /* @__PURE__ */ jsxRuntime.jsx(
6065
- chunkI2NZGVBG_js.FormInput,
6066
- {
6067
- type: "text",
6068
- label: t("endpointLabel"),
6069
- value: endpoint,
6070
- onValueChange: setEndpoint,
6071
- placeholder: providerType === "ollama" ? "http://localhost:11434" : t("endpointPlaceholder")
6072
- }
6073
- ),
6074
- showApiKey && /* @__PURE__ */ jsxRuntime.jsx(
6075
- chunkI2NZGVBG_js.FormInput,
6076
- {
6077
- type: "password",
6078
- label: t("apiKeyLabel"),
6079
- value: apiKeyRef,
6080
- onValueChange: setApiKeyRef,
6081
- placeholder: t("apiKeyPlaceholder")
6082
- }
6083
- ),
6084
- showCredentialRef && /* @__PURE__ */ jsxRuntime.jsx(
6085
- chunkI2NZGVBG_js.FormInput,
6086
- {
6087
- type: "text",
6088
- label: t("credentialRefLabel"),
6089
- value: credentialRef,
6090
- onValueChange: setCredentialRef,
6091
- placeholder: providerType === "aws_bedrock" ? "arn:aws:iam::role/bedrock-role" : t("credentialRefPlaceholder")
6092
- }
6093
- ),
6094
- families.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
6095
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: "mb-2 block text-sm font-medium text-gray-700 dark:text-gray-300", children: t("modelFamiliesLabel") }),
6096
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-1.5", children: families.map((family) => {
6097
- const isSelected = selectedFamilies.has(family.id);
6098
- return /* @__PURE__ */ jsxRuntime.jsxs(
6099
- "button",
6100
- {
6101
- type: "button",
6102
- onClick: () => handleToggleFamily(family.id),
6103
- className: `flex w-full items-center gap-3 rounded-lg border px-3 py-2 text-left transition-all ${isSelected ? "border-indigo-500/30 bg-indigo-50/50 dark:border-indigo-400/20 dark:bg-indigo-500/5" : "border-gray-200/50 hover:border-gray-300 dark:border-white/10 dark:hover:border-white/20"}`,
6104
- children: [
6105
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: `flex h-4 w-4 shrink-0 items-center justify-center rounded ${isSelected ? "bg-indigo-500 text-white" : "border border-gray-300 dark:border-gray-600"}`, children: isSelected && /* @__PURE__ */ jsxRuntime.jsx("svg", { className: "h-3 w-3", viewBox: "0 0 20 20", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { fillRule: "evenodd", d: "M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z", clipRule: "evenodd" }) }) }),
6106
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
6107
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-medium text-gray-900 dark:text-white", children: family.name }),
6108
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ml-2 text-[10px] text-gray-400 dark:text-gray-500", children: [
6109
- family.modelIds.length,
6110
- " models"
6111
- ] })
6112
- ] })
6113
- ]
6114
- },
6115
- family.id
6116
- );
6117
- }) })
6118
- ] }),
6119
- /* @__PURE__ */ jsxRuntime.jsx(
6120
- ConfigFormActions,
6121
- {
6122
- cancelLabel: t("cancel"),
6123
- saveLabel: t("save"),
6124
- onCancel,
6125
- onSave: handleSave,
6126
- saveDisabled: !providerType
6127
- }
6128
- )
6129
- ] });
6130
- }
6131
5875
  function RuleNodeConfigForm({ config, onSave, onCancel, availableRules }) {
6132
5876
  const t = chunkYXN2K77G_js.useTranslations("agents.workflow.ruleNodeConfig");
6133
5877
  const [ruleId, setRuleId] = react.useState(config.ruleId ?? "");
@@ -6152,7 +5896,7 @@ function RuleNodeConfigForm({ config, onSave, onCancel, availableRules }) {
6152
5896
  ]
6153
5897
  }
6154
5898
  ) : /* @__PURE__ */ jsxRuntime.jsx(
6155
- chunkI2NZGVBG_js.FormInput,
5899
+ chunkAWDH6WNA_js.FormInput,
6156
5900
  {
6157
5901
  type: "text",
6158
5902
  value: ruleId,
@@ -6168,7 +5912,7 @@ function RuleNodeConfigForm({ config, onSave, onCancel, availableRules }) {
6168
5912
  ] }),
6169
5913
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
6170
5914
  /* @__PURE__ */ jsxRuntime.jsx(
6171
- chunkI2NZGVBG_js.FormInput,
5915
+ chunkAWDH6WNA_js.FormInput,
6172
5916
  {
6173
5917
  type: "number",
6174
5918
  label: t("priorityLabel", { _: "Priority" }),
@@ -6240,7 +5984,7 @@ function AgentNodeConfigForm({
6240
5984
  }));
6241
5985
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
6242
5986
  agentOptions.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
6243
- chunkI2NZGVBG_js.FormSelect,
5987
+ chunkAWDH6WNA_js.FormSelect,
6244
5988
  {
6245
5989
  label: t("agentLabel", { _: "Agent" }),
6246
5990
  value: agentId,
@@ -6248,7 +5992,7 @@ function AgentNodeConfigForm({
6248
5992
  options: [{ value: "", label: t("agentPickPrompt", { _: "Choose an agent\u2026" }) }, ...agentOptions]
6249
5993
  }
6250
5994
  ) : /* @__PURE__ */ jsxRuntime.jsx(
6251
- chunkI2NZGVBG_js.FormInput,
5995
+ chunkAWDH6WNA_js.FormInput,
6252
5996
  {
6253
5997
  type: "text",
6254
5998
  label: t("agentIdLabel", { _: "Agent ID" }),
@@ -6258,7 +6002,7 @@ function AgentNodeConfigForm({
6258
6002
  }
6259
6003
  ),
6260
6004
  connOptions.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
6261
- chunkI2NZGVBG_js.FormSelect,
6005
+ chunkAWDH6WNA_js.FormSelect,
6262
6006
  {
6263
6007
  label: t("connectionLabel", { _: "Model provider connection" }),
6264
6008
  value: connectionId,
@@ -6266,7 +6010,7 @@ function AgentNodeConfigForm({
6266
6010
  options: [{ value: "", label: t("connectionPickPrompt", { _: "Inline model (no connection)" }) }, ...connOptions]
6267
6011
  }
6268
6012
  ) : /* @__PURE__ */ jsxRuntime.jsx(
6269
- chunkI2NZGVBG_js.FormInput,
6013
+ chunkAWDH6WNA_js.FormInput,
6270
6014
  {
6271
6015
  type: "text",
6272
6016
  label: t("connectionIdLabel", { _: "Connection ID" }),
@@ -6276,7 +6020,7 @@ function AgentNodeConfigForm({
6276
6020
  }
6277
6021
  ),
6278
6022
  /* @__PURE__ */ jsxRuntime.jsx(
6279
- chunkI2NZGVBG_js.FormInput,
6023
+ chunkAWDH6WNA_js.FormInput,
6280
6024
  {
6281
6025
  type: "text",
6282
6026
  label: t("modelIdLabel", { _: "Model override (optional)" }),
@@ -6286,7 +6030,7 @@ function AgentNodeConfigForm({
6286
6030
  }
6287
6031
  ),
6288
6032
  /* @__PURE__ */ jsxRuntime.jsx(
6289
- chunkI2NZGVBG_js.FormTextarea,
6033
+ chunkAWDH6WNA_js.FormTextarea,
6290
6034
  {
6291
6035
  label: t("systemPromptLabel", { _: "System prompt" }),
6292
6036
  value: systemPrompt,
@@ -6296,7 +6040,7 @@ function AgentNodeConfigForm({
6296
6040
  }
6297
6041
  ),
6298
6042
  /* @__PURE__ */ jsxRuntime.jsx(
6299
- chunkI2NZGVBG_js.FormTextarea,
6043
+ chunkAWDH6WNA_js.FormTextarea,
6300
6044
  {
6301
6045
  label: t("userPromptLabel", { _: "User prompt" }),
6302
6046
  value: userPrompt,
@@ -6307,7 +6051,7 @@ function AgentNodeConfigForm({
6307
6051
  ),
6308
6052
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
6309
6053
  /* @__PURE__ */ jsxRuntime.jsx(
6310
- chunkI2NZGVBG_js.FormInput,
6054
+ chunkAWDH6WNA_js.FormInput,
6311
6055
  {
6312
6056
  type: "number",
6313
6057
  label: t("maxTokensLabel", { _: "Max output tokens" }),
@@ -6319,7 +6063,7 @@ function AgentNodeConfigForm({
6319
6063
  }
6320
6064
  ),
6321
6065
  /* @__PURE__ */ jsxRuntime.jsx(
6322
- chunkI2NZGVBG_js.FormInput,
6066
+ chunkAWDH6WNA_js.FormInput,
6323
6067
  {
6324
6068
  type: "number",
6325
6069
  label: t("temperatureLabel", { _: "Temperature" }),
@@ -6356,7 +6100,7 @@ function AudioInputNodeConfigForm({ config, onSave, onCancel }) {
6356
6100
  };
6357
6101
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
6358
6102
  /* @__PURE__ */ jsxRuntime.jsx(
6359
- chunkI2NZGVBG_js.FormInput,
6103
+ chunkAWDH6WNA_js.FormInput,
6360
6104
  {
6361
6105
  type: "text",
6362
6106
  label: t("urlLabel"),
@@ -6366,7 +6110,7 @@ function AudioInputNodeConfigForm({ config, onSave, onCancel }) {
6366
6110
  }
6367
6111
  ),
6368
6112
  /* @__PURE__ */ jsxRuntime.jsx(
6369
- chunkI2NZGVBG_js.FormSelect,
6113
+ chunkAWDH6WNA_js.FormSelect,
6370
6114
  {
6371
6115
  label: t("formatLabel"),
6372
6116
  value: format,
@@ -6415,7 +6159,7 @@ function SpeechTranscriberNodeConfigForm({ config, onSave, onCancel }) {
6415
6159
  };
6416
6160
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
6417
6161
  /* @__PURE__ */ jsxRuntime.jsx(
6418
- chunkI2NZGVBG_js.FormInput,
6162
+ chunkAWDH6WNA_js.FormInput,
6419
6163
  {
6420
6164
  type: "text",
6421
6165
  label: t("audioUrlLabel"),
@@ -6425,7 +6169,7 @@ function SpeechTranscriberNodeConfigForm({ config, onSave, onCancel }) {
6425
6169
  }
6426
6170
  ),
6427
6171
  /* @__PURE__ */ jsxRuntime.jsx(
6428
- chunkI2NZGVBG_js.FormInput,
6172
+ chunkAWDH6WNA_js.FormInput,
6429
6173
  {
6430
6174
  type: "text",
6431
6175
  label: t("modelLabel"),
@@ -6435,7 +6179,7 @@ function SpeechTranscriberNodeConfigForm({ config, onSave, onCancel }) {
6435
6179
  }
6436
6180
  ),
6437
6181
  /* @__PURE__ */ jsxRuntime.jsx(
6438
- chunkI2NZGVBG_js.FormInput,
6182
+ chunkAWDH6WNA_js.FormInput,
6439
6183
  {
6440
6184
  type: "text",
6441
6185
  label: t("languageLabel"),
@@ -6445,7 +6189,7 @@ function SpeechTranscriberNodeConfigForm({ config, onSave, onCancel }) {
6445
6189
  }
6446
6190
  ),
6447
6191
  /* @__PURE__ */ jsxRuntime.jsx(
6448
- chunkI2NZGVBG_js.FormTextarea,
6192
+ chunkAWDH6WNA_js.FormTextarea,
6449
6193
  {
6450
6194
  label: t("promptLabel"),
6451
6195
  value: prompt,
@@ -6455,7 +6199,7 @@ function SpeechTranscriberNodeConfigForm({ config, onSave, onCancel }) {
6455
6199
  }
6456
6200
  ),
6457
6201
  /* @__PURE__ */ jsxRuntime.jsx(
6458
- chunkI2NZGVBG_js.FormSelect,
6202
+ chunkAWDH6WNA_js.FormSelect,
6459
6203
  {
6460
6204
  label: t("responseFormatLabel"),
6461
6205
  value: responseFormat,
@@ -6464,7 +6208,7 @@ function SpeechTranscriberNodeConfigForm({ config, onSave, onCancel }) {
6464
6208
  }
6465
6209
  ),
6466
6210
  /* @__PURE__ */ jsxRuntime.jsx(
6467
- chunkI2NZGVBG_js.FormInput,
6211
+ chunkAWDH6WNA_js.FormInput,
6468
6212
  {
6469
6213
  type: "text",
6470
6214
  label: t("endpointLabel"),
@@ -6474,7 +6218,7 @@ function SpeechTranscriberNodeConfigForm({ config, onSave, onCancel }) {
6474
6218
  }
6475
6219
  ),
6476
6220
  /* @__PURE__ */ jsxRuntime.jsx(
6477
- chunkI2NZGVBG_js.FormInput,
6221
+ chunkAWDH6WNA_js.FormInput,
6478
6222
  {
6479
6223
  type: "number",
6480
6224
  label: t("timeoutLabel"),
@@ -6496,6 +6240,93 @@ function SpeechTranscriberNodeConfigForm({ config, onSave, onCancel }) {
6496
6240
  )
6497
6241
  ] });
6498
6242
  }
6243
+ function DashboardOutputNodeConfigForm({ config, onSave, onCancel }) {
6244
+ const t = chunkYXN2K77G_js.useTranslations("agents.workflow.dashboardOutputNodeConfig");
6245
+ const initialMode = config.dashboard ? "inline" : "reference";
6246
+ const [mode, setMode] = react.useState(initialMode);
6247
+ const [dashboardFrom, setDashboardFrom] = react.useState(config.dashboardFrom ?? "");
6248
+ const [inlineJson, setInlineJson] = react.useState(
6249
+ config.dashboard ? JSON.stringify(config.dashboard, null, 2) : ""
6250
+ );
6251
+ const [parseError, setParseError] = react.useState(null);
6252
+ const handleSave = () => {
6253
+ if (mode === "reference") {
6254
+ const trimmed = dashboardFrom.trim();
6255
+ onSave({ type: "dashboard_output", dashboardFrom: trimmed });
6256
+ return;
6257
+ }
6258
+ try {
6259
+ const parsed = inlineJson.trim() ? JSON.parse(inlineJson) : {};
6260
+ setParseError(null);
6261
+ onSave({ type: "dashboard_output", dashboard: parsed });
6262
+ } catch (error) {
6263
+ setParseError(error instanceof Error ? error.message : String(error));
6264
+ }
6265
+ };
6266
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
6267
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-gray-500 dark:text-gray-400", children: t("description") }),
6268
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-2", children: [
6269
+ /* @__PURE__ */ jsxRuntime.jsx(
6270
+ "button",
6271
+ {
6272
+ type: "button",
6273
+ onClick: () => setMode("reference"),
6274
+ className: `flex-1 rounded-lg border px-3 py-2 text-xs font-medium transition-colors ${mode === "reference" ? "border-fuchsia-500 bg-fuchsia-500/10 text-fuchsia-700 dark:text-fuchsia-300" : "border-gray-200 bg-white text-gray-600 hover:border-fuchsia-300 dark:border-white/10 dark:bg-white/5 dark:text-gray-300"}`,
6275
+ children: t("modeReference")
6276
+ }
6277
+ ),
6278
+ /* @__PURE__ */ jsxRuntime.jsx(
6279
+ "button",
6280
+ {
6281
+ type: "button",
6282
+ onClick: () => setMode("inline"),
6283
+ className: `flex-1 rounded-lg border px-3 py-2 text-xs font-medium transition-colors ${mode === "inline" ? "border-fuchsia-500 bg-fuchsia-500/10 text-fuchsia-700 dark:text-fuchsia-300" : "border-gray-200 bg-white text-gray-600 hover:border-fuchsia-300 dark:border-white/10 dark:bg-white/5 dark:text-gray-300"}`,
6284
+ children: t("modeInline")
6285
+ }
6286
+ )
6287
+ ] }),
6288
+ mode === "reference" ? /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
6289
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300", children: t("referenceLabel") }),
6290
+ /* @__PURE__ */ jsxRuntime.jsx(
6291
+ "input",
6292
+ {
6293
+ type: "text",
6294
+ value: dashboardFrom,
6295
+ onChange: (event) => setDashboardFrom(event.target.value),
6296
+ placeholder: t("referencePlaceholder"),
6297
+ className: "w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm font-mono text-gray-900 placeholder:text-gray-400 focus:border-fuchsia-500 focus:outline-none focus:ring-1 focus:ring-fuchsia-500 dark:border-white/10 dark:bg-white/5 dark:text-white"
6298
+ }
6299
+ ),
6300
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-[10px] text-gray-500 dark:text-gray-400", children: t("referenceHelp") })
6301
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
6302
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300", children: t("inlineLabel") }),
6303
+ /* @__PURE__ */ jsxRuntime.jsx(
6304
+ "textarea",
6305
+ {
6306
+ value: inlineJson,
6307
+ onChange: (event) => setInlineJson(event.target.value),
6308
+ placeholder: '{\\n "kpis": [],\\n "charts": [],\\n "tables": []\\n}',
6309
+ rows: 12,
6310
+ className: "w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-xs font-mono text-gray-900 placeholder:text-gray-400 focus:border-fuchsia-500 focus:outline-none focus:ring-1 focus:ring-fuchsia-500 dark:border-white/10 dark:bg-white/5 dark:text-white"
6311
+ }
6312
+ ),
6313
+ parseError ? /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "mt-1 text-[10px] font-medium text-red-600 dark:text-red-400", children: [
6314
+ t("parseError"),
6315
+ ": ",
6316
+ parseError
6317
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-[10px] text-gray-500 dark:text-gray-400", children: t("inlineHelp") })
6318
+ ] }),
6319
+ /* @__PURE__ */ jsxRuntime.jsx(
6320
+ ConfigFormActions,
6321
+ {
6322
+ cancelLabel: t("cancel"),
6323
+ saveLabel: t("save"),
6324
+ onCancel,
6325
+ onSave: handleSave
6326
+ }
6327
+ )
6328
+ ] });
6329
+ }
6499
6330
  var NODE_TITLE_KEYS = {
6500
6331
  start: "startNodeConfig",
6501
6332
  end: "endNodeConfig",
@@ -6517,11 +6348,11 @@ var NODE_TITLE_KEYS = {
6517
6348
  entity: "entityNodeConfig",
6518
6349
  datasource: "datasourceNodeConfig",
6519
6350
  group: "groupNodeConfig",
6520
- model_provider: "modelProviderNodeConfig",
6521
6351
  rule: "ruleNodeConfig",
6522
6352
  agent: "agentNodeConfig",
6523
6353
  audio_input: "audioInputNodeConfig",
6524
- speech_transcriber: "speechTranscriberNodeConfig"
6354
+ speech_transcriber: "speechTranscriberNodeConfig",
6355
+ dashboard_output: "dashboardOutputNodeConfig"
6525
6356
  };
6526
6357
  function LogicNodeModal({ onSave, entities = [], datasources = [], onLoadTables, onLoadSchema }) {
6527
6358
  const t = chunkYXN2K77G_js.useTranslations("agents.workflow");
@@ -6582,8 +6413,10 @@ function LogicNodeModal({ onSave, entities = [], datasources = [], onLoadTables,
6582
6413
  return /* @__PURE__ */ jsxRuntime.jsx(EntityNodeConfigForm, { config, entities, onSave: handleSave, onCancel: closeModal });
6583
6414
  case "group":
6584
6415
  return /* @__PURE__ */ jsxRuntime.jsx(GroupNodeConfigForm, { config, onSave: handleSave, onCancel: closeModal });
6585
- case "model_provider":
6586
- return /* @__PURE__ */ jsxRuntime.jsx(ModelProviderNodeConfigForm, { config, onSave: handleSave, onCancel: closeModal });
6416
+ // model_provider was removed from the canvas — providers are
6417
+ // now account-level credentials configured in Settings, not
6418
+ // draggable nodes. Any legacy graph that still has a
6419
+ // model_provider node falls through to default → no edit form.
6587
6420
  case "rule":
6588
6421
  return /* @__PURE__ */ jsxRuntime.jsx(RuleNodeConfigForm, { config, onSave: handleSave, onCancel: closeModal });
6589
6422
  case "agent":
@@ -6592,13 +6425,15 @@ function LogicNodeModal({ onSave, entities = [], datasources = [], onLoadTables,
6592
6425
  return /* @__PURE__ */ jsxRuntime.jsx(AudioInputNodeConfigForm, { config, onSave: handleSave, onCancel: closeModal });
6593
6426
  case "speech_transcriber":
6594
6427
  return /* @__PURE__ */ jsxRuntime.jsx(SpeechTranscriberNodeConfigForm, { config, onSave: handleSave, onCancel: closeModal });
6428
+ case "dashboard_output":
6429
+ return /* @__PURE__ */ jsxRuntime.jsx(DashboardOutputNodeConfigForm, { config, onSave: handleSave, onCancel: closeModal });
6595
6430
  default:
6596
6431
  return null;
6597
6432
  }
6598
6433
  };
6599
6434
  const isExperimental = isExperimentalNodeType(config.type);
6600
6435
  return /* @__PURE__ */ jsxRuntime.jsxs(
6601
- chunkI2NZGVBG_js.GlassModal,
6436
+ chunkAWDH6WNA_js.GlassModal,
6602
6437
  {
6603
6438
  open,
6604
6439
  onClose: closeModal,
@@ -6669,7 +6504,7 @@ function NodeContextMenu({ position, targetId, onClose, onEdit, onDuplicate, onC
6669
6504
  }
6670
6505
  ];
6671
6506
  return /* @__PURE__ */ jsxRuntime.jsx(
6672
- chunkI2NZGVBG_js.ContextMenu,
6507
+ chunkAWDH6WNA_js.ContextMenu,
6673
6508
  {
6674
6509
  position,
6675
6510
  onClose,
@@ -6726,7 +6561,7 @@ function PanelContextMenu({ position, onClose, onPaste, onSelectAll, onFitView,
6726
6561
  }
6727
6562
  ];
6728
6563
  return /* @__PURE__ */ jsxRuntime.jsx(
6729
- chunkI2NZGVBG_js.ContextMenu,
6564
+ chunkAWDH6WNA_js.ContextMenu,
6730
6565
  {
6731
6566
  position,
6732
6567
  onClose,
@@ -6873,7 +6708,7 @@ function SelectionContextMenu({
6873
6708
  }
6874
6709
  ];
6875
6710
  return /* @__PURE__ */ jsxRuntime.jsx(
6876
- chunkI2NZGVBG_js.ContextMenu,
6711
+ chunkAWDH6WNA_js.ContextMenu,
6877
6712
  {
6878
6713
  position,
6879
6714
  onClose,
@@ -6974,10 +6809,14 @@ var BUILT_IN_NODE_TYPES = {
6974
6809
  iteration_start: IterationStartFlowNode,
6975
6810
  note: NoteFlowNode,
6976
6811
  datasource: DatasourceFlowNode,
6977
- model_provider: ModelProviderFlowNode,
6812
+ // model_provider removed from canvas — providers are now
6813
+ // account-level credentials (configured in Settings), not draggable
6814
+ // nodes. Agents reference the provider via the `Models` tab in the
6815
+ // agent modal. See agent-modal.tsx + n8n/Dify patterns.
6978
6816
  group: GroupFlowNode,
6979
6817
  audio_input: AudioInputFlowNode,
6980
- speech_transcriber: SpeechTranscriberFlowNode
6818
+ speech_transcriber: SpeechTranscriberFlowNode,
6819
+ dashboard_output: DashboardOutputFlowNode
6981
6820
  };
6982
6821
  var ALL_LOGIC_NODE_TYPES = [
6983
6822
  "start",
@@ -7002,10 +6841,10 @@ var ALL_LOGIC_NODE_TYPES = [
7002
6841
  "rule",
7003
6842
  "entity",
7004
6843
  "datasource",
7005
- "model_provider",
7006
6844
  "group",
7007
6845
  "audio_input",
7008
- "speech_transcriber"
6846
+ "speech_transcriber",
6847
+ "dashboard_output"
7009
6848
  ];
7010
6849
  function isLogicNodeType(nodeType) {
7011
6850
  return ALL_LOGIC_NODE_TYPES.includes(nodeType);
@@ -7029,6 +6868,7 @@ var AUTO_SAVE_DEBOUNCE_MS = 2e3;
7029
6868
  function WorkflowCanvasInner({
7030
6869
  agents,
7031
6870
  models,
6871
+ modelProviders = [],
7032
6872
  tools,
7033
6873
  agentTools = [],
7034
6874
  rules,
@@ -7063,7 +6903,9 @@ function WorkflowCanvasInner({
7063
6903
  openAgentModalAction(
7064
6904
  { agentId: "", name: "", order: 0, enabled: true, temperature: 0.7, maxTokens: 4096 },
7065
6905
  models,
7066
- true
6906
+ true,
6907
+ agentTools,
6908
+ modelProviders
7067
6909
  );
7068
6910
  }
7069
6911
  }, [isCreatingAgent]);
@@ -7210,7 +7052,7 @@ function WorkflowCanvasInner({
7210
7052
  providerName: models.find((m) => m.id === agent.modelId)?.provider,
7211
7053
  onSelect: () => {
7212
7054
  setSelectedAgentId(agent.agentId);
7213
- openAgentModalAction(agent, models, false, agentTools);
7055
+ openAgentModalAction(agent, models, false, agentTools, modelProviders);
7214
7056
  },
7215
7057
  onRemoveFromCanvas: handleRemoveNodeFromCanvas
7216
7058
  }
@@ -7593,7 +7435,7 @@ function WorkflowCanvasInner({
7593
7435
  const agent = targetNode.data?.agent;
7594
7436
  if (agent) {
7595
7437
  setSelectedAgentId(agent.agentId ?? agent.id ?? null);
7596
- openAgentModalAction(agent, models, false, agentTools);
7438
+ openAgentModalAction(agent, models, false, agentTools, modelProviders);
7597
7439
  }
7598
7440
  } else if (targetNode.type === "tool") {
7599
7441
  const tool = targetNode.data?.tool;
@@ -8092,7 +7934,7 @@ function WorkflowCanvasInner({
8092
7934
  selected: false,
8093
7935
  onSelect: () => {
8094
7936
  setSelectedAgentId(agent.agentId);
8095
- openAgentModalAction(agent, models, false, agentTools);
7937
+ openAgentModalAction(agent, models, false, agentTools, modelProviders);
8096
7938
  },
8097
7939
  onRemoveFromCanvas: handleRemoveNodeFromCanvas
8098
7940
  }
@@ -8781,7 +8623,6 @@ exports.LangChainIcon = LangChainIcon;
8781
8623
  exports.ListOperatorFlowNode = ListOperatorFlowNode;
8782
8624
  exports.LogicNodeModal = LogicNodeModal;
8783
8625
  exports.MINIMAP_NODE_COLORS = MINIMAP_NODE_COLORS;
8784
- exports.ModelProviderFlowNode = ModelProviderFlowNode;
8785
8626
  exports.NODE_EXECUTION_ACCENT_COLORS = NODE_EXECUTION_ACCENT_COLORS;
8786
8627
  exports.NodeCard = NodeCard;
8787
8628
  exports.NodeCardBadge = NodeCardBadge;
@@ -8825,5 +8666,5 @@ exports.useModalStore = useModalStore;
8825
8666
  exports.useWorkflowBuilderClient = useWorkflowBuilderClient;
8826
8667
  exports.useWorkflowBuilderClientOptional = useWorkflowBuilderClientOptional;
8827
8668
  exports.useWorkflowStore = useWorkflowStore;
8828
- //# sourceMappingURL=chunk-NJFRJ6YD.js.map
8829
- //# sourceMappingURL=chunk-NJFRJ6YD.js.map
8669
+ //# sourceMappingURL=chunk-QSMPKL27.js.map
8670
+ //# sourceMappingURL=chunk-QSMPKL27.js.map