@datatechsolutions/ui 3.2.1 → 3.4.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 (182) hide show
  1. package/dist/astrlabe/contracts.d.mts +31 -3
  2. package/dist/astrlabe/contracts.d.ts +31 -3
  3. package/dist/astrlabe/index.d.mts +22 -30
  4. package/dist/astrlabe/index.d.ts +22 -30
  5. package/dist/astrlabe/index.js +121 -121
  6. package/dist/astrlabe/index.mjs +7 -7
  7. package/dist/astrlabe/utils.js +9 -9
  8. package/dist/astrlabe/utils.mjs +2 -2
  9. package/dist/astrlabe/workflow-canvas.d.mts +6 -69
  10. package/dist/astrlabe/workflow-canvas.d.ts +6 -69
  11. package/dist/astrlabe/workflow-canvas.js +6 -6
  12. package/dist/astrlabe/workflow-canvas.mjs +5 -5
  13. package/dist/brand/index.d.mts +1 -15
  14. package/dist/brand/index.d.ts +1 -15
  15. package/dist/brand/index.js +0 -14
  16. package/dist/brand/index.js.map +1 -1
  17. package/dist/brand/index.mjs +0 -14
  18. package/dist/brand/index.mjs.map +1 -1
  19. package/dist/{chunk-FAGDZEKM.js → chunk-2OZZH2IO.js} +2 -2
  20. package/dist/chunk-2OZZH2IO.js.map +1 -0
  21. package/dist/{chunk-SYNVNTLJ.mjs → chunk-3AY5HIQ6.mjs} +2 -2
  22. package/dist/chunk-3AY5HIQ6.mjs.map +1 -0
  23. package/dist/{chunk-JSNRCYSO.js → chunk-45QAUEYT.js} +4 -4
  24. package/dist/{chunk-JSNRCYSO.js.map → chunk-45QAUEYT.js.map} +1 -1
  25. package/dist/{chunk-B67DP7MI.mjs → chunk-4GDWGWHY.mjs} +4 -4
  26. package/dist/{chunk-B67DP7MI.mjs.map → chunk-4GDWGWHY.mjs.map} +1 -1
  27. package/dist/{chunk-KR2X2WHJ.js → chunk-4ICEQJH4.js} +53 -53
  28. package/dist/{chunk-KR2X2WHJ.js.map → chunk-4ICEQJH4.js.map} +1 -1
  29. package/dist/{chunk-RXZNACMI.js → chunk-6MBWKOPF.js} +33 -33
  30. package/dist/{chunk-RXZNACMI.js.map → chunk-6MBWKOPF.js.map} +1 -1
  31. package/dist/{chunk-C3H4FM4A.js → chunk-72SWXOD5.js} +15 -2
  32. package/dist/chunk-72SWXOD5.js.map +1 -0
  33. package/dist/{chunk-JN6IL6OH.mjs → chunk-AGGOHPMZ.mjs} +1054 -5229
  34. package/dist/chunk-AGGOHPMZ.mjs.map +1 -0
  35. package/dist/{chunk-5GDKCFM5.mjs → chunk-AL73YAV4.mjs} +3 -3
  36. package/dist/{chunk-5GDKCFM5.mjs.map → chunk-AL73YAV4.mjs.map} +1 -1
  37. package/dist/{chunk-ZJPNP2YW.mjs → chunk-BUDZNAKL.mjs} +2 -2
  38. package/dist/chunk-BUDZNAKL.mjs.map +1 -0
  39. package/dist/{chunk-OL73LBX5.mjs → chunk-BW67WFHT.mjs} +3 -4
  40. package/dist/chunk-BW67WFHT.mjs.map +1 -0
  41. package/dist/{chunk-W5OEBO6E.js → chunk-CF7GOUBQ.js} +13 -14
  42. package/dist/chunk-CF7GOUBQ.js.map +1 -0
  43. package/dist/{chunk-IRPS5UCS.mjs → chunk-CUWPLPVY.mjs} +3 -3
  44. package/dist/{chunk-IRPS5UCS.mjs.map → chunk-CUWPLPVY.mjs.map} +1 -1
  45. package/dist/{chunk-NJS2YC3J.js → chunk-DJDZIRM6.js} +12 -2
  46. package/dist/chunk-DJDZIRM6.js.map +1 -0
  47. package/dist/{chunk-RL35XATZ.js → chunk-ERCDMBRT.js} +702 -647
  48. package/dist/chunk-ERCDMBRT.js.map +1 -0
  49. package/dist/{chunk-I2NZGVBG.js → chunk-FSBR4RCK.js} +1101 -5313
  50. package/dist/chunk-FSBR4RCK.js.map +1 -0
  51. package/dist/{chunk-5W7L7BT7.mjs → chunk-G7JQ4OCE.mjs} +15 -2
  52. package/dist/chunk-G7JQ4OCE.mjs.map +1 -0
  53. package/dist/{chunk-5RM6NGZ6.mjs → chunk-IDEM3DYF.mjs} +3 -3
  54. package/dist/{chunk-5RM6NGZ6.mjs.map → chunk-IDEM3DYF.mjs.map} +1 -1
  55. package/dist/{chunk-U7XM3N7F.mjs → chunk-LEXBTVGM.mjs} +12 -2
  56. package/dist/chunk-LEXBTVGM.mjs.map +1 -0
  57. package/dist/{chunk-EFOXN3LC.js → chunk-M7KSEUZR.js} +490 -389
  58. package/dist/chunk-M7KSEUZR.js.map +1 -0
  59. package/dist/{chunk-AOUUZ52N.js → chunk-MO5FBVV3.js} +85 -86
  60. package/dist/chunk-MO5FBVV3.js.map +1 -0
  61. package/dist/{chunk-H2D2CRTD.mjs → chunk-NAFWHJCM.mjs} +8 -8
  62. package/dist/{chunk-H2D2CRTD.mjs.map → chunk-NAFWHJCM.mjs.map} +1 -1
  63. package/dist/{chunk-3JJWPOK6.js → chunk-NCLZKVJK.js} +9 -10
  64. package/dist/chunk-NCLZKVJK.js.map +1 -0
  65. package/dist/{chunk-R4TQWXNG.mjs → chunk-NVQWHJQH.mjs} +6 -5
  66. package/dist/chunk-NVQWHJQH.mjs.map +1 -0
  67. package/dist/{chunk-Y6AEE56Q.js → chunk-PGVZKMOA.js} +69 -69
  68. package/dist/{chunk-Y6AEE56Q.js.map → chunk-PGVZKMOA.js.map} +1 -1
  69. package/dist/{chunk-UDDZTTLO.mjs → chunk-QBFE7ABE.mjs} +6 -7
  70. package/dist/chunk-QBFE7ABE.mjs.map +1 -0
  71. package/dist/{chunk-3ZUMJTDT.mjs → chunk-RFRXS4PC.mjs} +3 -4
  72. package/dist/{chunk-3JJWPOK6.js.map → chunk-RFRXS4PC.mjs.map} +1 -1
  73. package/dist/{chunk-ZV5EZXXO.mjs → chunk-RHRJXK5R.mjs} +3 -3
  74. package/dist/{chunk-ZV5EZXXO.mjs.map → chunk-RHRJXK5R.mjs.map} +1 -1
  75. package/dist/{chunk-SU3YPWFW.js → chunk-RLLP7VQJ.js} +26 -26
  76. package/dist/{chunk-SU3YPWFW.js.map → chunk-RLLP7VQJ.js.map} +1 -1
  77. package/dist/{chunk-YIB2YAM5.mjs → chunk-RLVOG5OQ.mjs} +3 -3
  78. package/dist/{chunk-YIB2YAM5.mjs.map → chunk-RLVOG5OQ.mjs.map} +1 -1
  79. package/dist/{chunk-QYA53LUF.mjs → chunk-SEYUYGER.mjs} +571 -517
  80. package/dist/chunk-SEYUYGER.mjs.map +1 -0
  81. package/dist/{chunk-YV72JM4B.mjs → chunk-SQ4KGLBZ.mjs} +4 -4
  82. package/dist/{chunk-YV72JM4B.mjs.map → chunk-SQ4KGLBZ.mjs.map} +1 -1
  83. package/dist/{chunk-F54Q2YJY.js → chunk-SY4MUT5V.js} +7 -7
  84. package/dist/{chunk-F54Q2YJY.js.map → chunk-SY4MUT5V.js.map} +1 -1
  85. package/dist/{chunk-ZM5MVWIT.js → chunk-TUQLZ4QD.js} +5 -6
  86. package/dist/chunk-TUQLZ4QD.js.map +1 -0
  87. package/dist/{chunk-TVMLV675.js → chunk-UE2RDQIK.js} +98 -95
  88. package/dist/chunk-UE2RDQIK.js.map +1 -0
  89. package/dist/{chunk-HDCUWUNH.js → chunk-UJVDI66K.js} +28 -27
  90. package/dist/chunk-UJVDI66K.js.map +1 -0
  91. package/dist/{chunk-IRT4T3CU.mjs → chunk-VV6SYMPM.mjs} +423 -321
  92. package/dist/chunk-VV6SYMPM.mjs.map +1 -0
  93. package/dist/{chunk-HZ4LOVHM.js → chunk-VY52Y5GC.js} +2 -2
  94. package/dist/chunk-VY52Y5GC.js.map +1 -0
  95. package/dist/{chunk-LEKZUS6N.mjs → chunk-X3GW7UPN.mjs} +4 -5
  96. package/dist/chunk-X3GW7UPN.mjs.map +1 -0
  97. package/dist/{chunk-RGI74SQH.js → chunk-Y2AYFG4E.js} +4 -4
  98. package/dist/{chunk-RGI74SQH.js.map → chunk-Y2AYFG4E.js.map} +1 -1
  99. package/dist/{chunk-TIJJHW2Z.js → chunk-YV7F7IXG.js} +36 -36
  100. package/dist/{chunk-TIJJHW2Z.js.map → chunk-YV7F7IXG.js.map} +1 -1
  101. package/dist/{chunk-MVBIAXVN.mjs → chunk-ZKSDDFHG.mjs} +14 -11
  102. package/dist/chunk-ZKSDDFHG.mjs.map +1 -0
  103. package/dist/{index-VI9gyJXl.d.mts → index-BNRGVAS5.d.mts} +9 -2
  104. package/dist/index-BoebbJ44.d.mts +49 -0
  105. package/dist/index-BoebbJ44.d.ts +49 -0
  106. package/dist/{index-CoB18TbG.d.ts → index-CnCY-b5V.d.ts} +9 -2
  107. package/dist/index.d.mts +399 -548
  108. package/dist/index.d.ts +399 -548
  109. package/dist/index.js +727 -887
  110. package/dist/index.mjs +3 -3
  111. package/dist/platform/admin/index.js +12 -12
  112. package/dist/platform/admin/index.mjs +6 -6
  113. package/dist/platform/agents-workspace.js +10 -10
  114. package/dist/platform/agents-workspace.mjs +9 -9
  115. package/dist/platform/app-shell.js +5 -5
  116. package/dist/platform/app-shell.mjs +4 -4
  117. package/dist/platform/auth/index.js +29 -29
  118. package/dist/platform/auth/index.mjs +6 -6
  119. package/dist/platform/billing/index.js +5 -5
  120. package/dist/platform/billing/index.mjs +4 -4
  121. package/dist/platform/impersonation/index.js +5 -5
  122. package/dist/platform/impersonation/index.mjs +4 -4
  123. package/dist/platform/index.d.mts +3 -39
  124. package/dist/platform/index.d.ts +3 -39
  125. package/dist/platform/index.js +102 -4812
  126. package/dist/platform/index.js.map +1 -1
  127. package/dist/platform/index.mjs +25 -4730
  128. package/dist/platform/index.mjs.map +1 -1
  129. package/dist/platform/pages/index.d.mts +4 -4
  130. package/dist/platform/pages/index.d.ts +4 -4
  131. package/dist/platform/pages/index.js +199 -199
  132. package/dist/platform/pages/index.mjs +11 -11
  133. package/dist/platform/rbac.d.mts +2 -1
  134. package/dist/platform/rbac.d.ts +2 -1
  135. package/dist/platform/rbac.js +2 -2
  136. package/dist/platform/rbac.mjs +1 -1
  137. package/dist/platform/settings/index.js +9 -9
  138. package/dist/platform/settings/index.mjs +8 -8
  139. package/dist/platform/utils/index.js +3 -3
  140. package/dist/platform/utils/index.js.map +1 -1
  141. package/dist/platform/utils/index.mjs +1 -1
  142. package/dist/platform/utils/index.mjs.map +1 -1
  143. package/dist/platform/workflow-api-client.d.mts +2 -2
  144. package/dist/platform/workflow-api-client.d.ts +2 -2
  145. package/dist/platform/workflow-api-client.js +62 -62
  146. package/dist/platform/workflow-api-client.mjs +2 -2
  147. package/dist/platform/workflow-canvas-shell.js +7 -7
  148. package/dist/platform/workflow-canvas-shell.mjs +6 -6
  149. package/dist/{workflow-api-client-DoYj7nHz.d.mts → workflow-api-client-CpFl3WcG.d.mts} +1 -1
  150. package/dist/{workflow-api-client-BKD8OfP_.d.ts → workflow-api-client-uLICOanv.d.ts} +1 -1
  151. package/dist/workflow-canvas--qaYKuMm.d.ts +113 -0
  152. package/dist/workflow-canvas-B80fmD_n.d.mts +113 -0
  153. package/package.json +15 -5
  154. package/src/styles/liquid-glass.css +283 -2
  155. package/dist/chunk-3ZUMJTDT.mjs.map +0 -1
  156. package/dist/chunk-5W7L7BT7.mjs.map +0 -1
  157. package/dist/chunk-AOUUZ52N.js.map +0 -1
  158. package/dist/chunk-C3H4FM4A.js.map +0 -1
  159. package/dist/chunk-EFOXN3LC.js.map +0 -1
  160. package/dist/chunk-FAGDZEKM.js.map +0 -1
  161. package/dist/chunk-HDCUWUNH.js.map +0 -1
  162. package/dist/chunk-HZ4LOVHM.js.map +0 -1
  163. package/dist/chunk-I2NZGVBG.js.map +0 -1
  164. package/dist/chunk-IRT4T3CU.mjs.map +0 -1
  165. package/dist/chunk-JN6IL6OH.mjs.map +0 -1
  166. package/dist/chunk-LEKZUS6N.mjs.map +0 -1
  167. package/dist/chunk-MVBIAXVN.mjs.map +0 -1
  168. package/dist/chunk-NJS2YC3J.js.map +0 -1
  169. package/dist/chunk-OL73LBX5.mjs.map +0 -1
  170. package/dist/chunk-QYA53LUF.mjs.map +0 -1
  171. package/dist/chunk-R4TQWXNG.mjs.map +0 -1
  172. package/dist/chunk-RL35XATZ.js.map +0 -1
  173. package/dist/chunk-SYNVNTLJ.mjs.map +0 -1
  174. package/dist/chunk-TVMLV675.js.map +0 -1
  175. package/dist/chunk-U7XM3N7F.mjs.map +0 -1
  176. package/dist/chunk-UDDZTTLO.mjs.map +0 -1
  177. package/dist/chunk-W5OEBO6E.js.map +0 -1
  178. package/dist/chunk-ZJPNP2YW.mjs.map +0 -1
  179. package/dist/chunk-ZM5MVWIT.js.map +0 -1
  180. package/src/brand/logos/kori-icon.svg +0 -45
  181. package/src/brand/logos/kori-logo-dark.svg +0 -40
  182. package/src/brand/logos/kori-logo.svg +0 -43
@@ -1,11 +1,10 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkI2NZGVBG_js = require('./chunk-I2NZGVBG.js');
4
+ var chunkFSBR4RCK_js = require('./chunk-FSBR4RCK.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
- var chunkC3H4FM4A_js = require('./chunk-C3H4FM4A.js');
7
+ var chunk72SWXOD5_js = require('./chunk-72SWXOD5.js');
9
8
  var react = require('react');
10
9
  var react$1 = require('@xyflow/react');
11
10
  require('@xyflow/react/dist/style.css');
@@ -373,7 +372,9 @@ var LOGIC_NODE_GRADIENTS = {
373
372
  datasource: "from-cyan-500 to-blue-600",
374
373
  model_provider: "from-slate-500 to-gray-600",
375
374
  dashboard_output: "from-fuchsia-500 to-pink-600",
376
- group: "from-slate-400 to-gray-500"
375
+ group: "from-slate-400 to-gray-500",
376
+ audio_input: "from-teal-400 to-cyan-500",
377
+ speech_transcriber: "from-violet-500 to-purple-600"
377
378
  };
378
379
  var LOGIC_NODE_BADGE_COLORS = {
379
380
  start: "bg-green-100 text-green-700 dark:bg-green-500/20 dark:text-green-300",
@@ -398,7 +399,9 @@ var LOGIC_NODE_BADGE_COLORS = {
398
399
  datasource: "bg-cyan-100 text-cyan-700 dark:bg-cyan-500/20 dark:text-cyan-300",
399
400
  model_provider: "bg-slate-100 text-slate-700 dark:bg-slate-500/20 dark:text-slate-300",
400
401
  dashboard_output: "bg-fuchsia-100 text-fuchsia-700 dark:bg-fuchsia-500/20 dark:text-fuchsia-300",
401
- group: "bg-slate-100 text-slate-700 dark:bg-slate-500/20 dark:text-slate-300"
402
+ group: "bg-slate-100 text-slate-700 dark:bg-slate-500/20 dark:text-slate-300",
403
+ audio_input: "bg-teal-100 text-teal-700 dark:bg-teal-500/20 dark:text-teal-300",
404
+ speech_transcriber: "bg-violet-100 text-violet-700 dark:bg-violet-500/20 dark:text-violet-300"
402
405
  };
403
406
  var LOGIC_NODE_BADGE_SOFT_COLORS = {
404
407
  start: "bg-green-50 text-green-600 dark:bg-green-500/20 dark:text-green-400",
@@ -423,7 +426,9 @@ var LOGIC_NODE_BADGE_SOFT_COLORS = {
423
426
  datasource: "bg-cyan-50 text-cyan-600 dark:bg-cyan-500/20 dark:text-cyan-400",
424
427
  model_provider: "bg-slate-50 text-slate-600 dark:bg-slate-500/20 dark:text-slate-400",
425
428
  dashboard_output: "bg-fuchsia-50 text-fuchsia-600 dark:bg-fuchsia-500/20 dark:text-fuchsia-400",
426
- group: "bg-slate-50 text-slate-600 dark:bg-slate-500/20 dark:text-slate-400"
429
+ group: "bg-slate-50 text-slate-600 dark:bg-slate-500/20 dark:text-slate-400",
430
+ audio_input: "bg-teal-50 text-teal-600 dark:bg-teal-500/20 dark:text-teal-400",
431
+ speech_transcriber: "bg-violet-50 text-violet-600 dark:bg-violet-500/20 dark:text-violet-400"
427
432
  };
428
433
  var LOGIC_ICON_MAP = {
429
434
  start: outline.PlayIcon,
@@ -448,7 +453,9 @@ var LOGIC_ICON_MAP = {
448
453
  datasource: outline.ServerStackIcon,
449
454
  model_provider: outline.KeyIcon,
450
455
  dashboard_output: outline.ChartBarIcon,
451
- group: outline.RectangleGroupIcon
456
+ group: outline.RectangleGroupIcon,
457
+ audio_input: outline.MicrophoneIcon,
458
+ speech_transcriber: outline.SpeakerWaveIcon
452
459
  };
453
460
  var EXPERIMENTAL_NODE_TYPES = /* @__PURE__ */ new Set([
454
461
  "document_extractor",
@@ -484,7 +491,9 @@ var NODE_BORDER_COLORS = {
484
491
  list_operator: "border-lime-300/50 dark:border-lime-600/50",
485
492
  note: "border-gray-200/50 dark:border-gray-700/50",
486
493
  datasource: "border-cyan-300/50 dark:border-cyan-600/50",
487
- model_provider: "border-slate-300/50 dark:border-slate-600/50"
494
+ model_provider: "border-slate-300/50 dark:border-slate-600/50",
495
+ audio_input: "border-teal-300/50 dark:border-teal-600/50",
496
+ speech_transcriber: "border-violet-300/50 dark:border-violet-600/50"
488
497
  };
489
498
  function getNodeStateClass(selected, nodeType, customBorder) {
490
499
  if (selected) return NODE_SELECTED_CLASS;
@@ -574,7 +583,9 @@ var INSERTABLE_NODES = [
574
583
  { nodeType: "knowledge_base", nameKey: "knowledgeBaseNode", subcategory: "AI" },
575
584
  { nodeType: "answer", nameKey: "answerNode", subcategory: "AI" },
576
585
  { nodeType: "question_classifier", nameKey: "questionClassifierNode", subcategory: "AI" },
577
- { nodeType: "parameter_extractor", nameKey: "parameterExtractorNode", subcategory: "AI" }
586
+ { nodeType: "parameter_extractor", nameKey: "parameterExtractorNode", subcategory: "AI" },
587
+ { nodeType: "audio_input", nameKey: "audioInputNode", subcategory: "AI" },
588
+ { nodeType: "speech_transcriber", nameKey: "speechTranscriberNode", subcategory: "AI" }
578
589
  ];
579
590
  function EdgeInsertPopupComponent({ position, onSelect, onClose }) {
580
591
  const tWorkflow = chunkYXN2K77G_js.useTranslations("agents.workflow");
@@ -1692,7 +1703,7 @@ function DatasourceNodeConfigForm({
1692
1703
  }
1693
1704
  const logo = getDatasourceLogo(selectedDatasourceId, selectedDatasource?.dialect);
1694
1705
  return /* @__PURE__ */ jsxRuntime.jsx(
1695
- chunkI2NZGVBG_js.GlassModal,
1706
+ chunkFSBR4RCK_js.GlassModal,
1696
1707
  {
1697
1708
  open,
1698
1709
  onClose: onCancel,
@@ -1707,8 +1718,8 @@ function DatasourceNodeConfigForm({
1707
1718
  onSectionChange: setActiveSectionId
1708
1719
  },
1709
1720
  footer: readOnly ? void 0 : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-2 px-6 py-3", children: [
1710
- /* @__PURE__ */ jsxRuntime.jsx(chunkI2NZGVBG_js.Button, { outline: true, onClick: onCancel, children: t("cancel") }),
1711
- /* @__PURE__ */ jsxRuntime.jsx(chunkI2NZGVBG_js.Button, { color: "cyan", onClick: handleSave, disabled: !canSave, children: t("save") })
1721
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFSBR4RCK_js.Button, { outline: true, onClick: onCancel, children: t("cancel") }),
1722
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFSBR4RCK_js.Button, { color: "cyan", onClick: handleSave, disabled: !canSave, children: t("save") })
1712
1723
  ] }),
1713
1724
  children: renderSection()
1714
1725
  }
@@ -2046,7 +2057,7 @@ function NodeRunningIndicatorComponent({ nodeId }) {
2046
2057
  borderColor: `rgba(${accentRgb}, 0.55)`,
2047
2058
  boxShadow: `0 0 0 1px rgba(${accentRgb}, 0.16), 0 6px 16px rgba(${accentRgb}, 0.18)`
2048
2059
  },
2049
- 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: [
2050
2061
  /* @__PURE__ */ jsxRuntime.jsx("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
2051
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" })
2052
2063
  ] })
@@ -2106,7 +2117,7 @@ var AgentFlowNode = react.memo(function AgentFlowNode2({ id, data, selected }) {
2106
2117
  /* @__PURE__ */ jsxRuntime.jsx(NodeCardMeta, { compact: isCompact, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-1.5", children: [
2107
2118
  /* @__PURE__ */ jsxRuntime.jsx(NodeCardBadge, { className: "rounded-full bg-indigo-100 px-2 py-0.5 text-[10px] font-semibold text-indigo-700 dark:bg-indigo-500/20 dark:text-indigo-300", children: "Agent" }),
2108
2119
  (() => {
2109
- const tier = chunkC3H4FM4A_js.getAgentTier(Number(data.agent.elo ?? 0));
2120
+ const tier = chunk72SWXOD5_js.getAgentTier(Number(data.agent.elo ?? 0));
2110
2121
  return /* @__PURE__ */ jsxRuntime.jsx(NodeCardBadge, { className: `rounded-full px-2 py-0.5 text-[10px] font-bold ${tier.pillColor}`, children: tier.key });
2111
2122
  })(),
2112
2123
  /* @__PURE__ */ jsxRuntime.jsxs(NodeCardBadge, { className: `inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[10px] font-medium ${frameworkMeta.badgeColor}`, children: [
@@ -2215,7 +2226,7 @@ var AgentToolFlowNode = react.memo(function AgentToolFlowNode2({ id, data, selec
2215
2226
  event.stopPropagation();
2216
2227
  },
2217
2228
  children: /* @__PURE__ */ jsxRuntime.jsx(
2218
- chunkI2NZGVBG_js.ToggleSwitch,
2229
+ chunkFSBR4RCK_js.ToggleSwitch,
2219
2230
  {
2220
2231
  checked: Boolean(agentTool.enabled),
2221
2232
  onChange: () => data.onToggle?.(agentTool),
@@ -2323,7 +2334,7 @@ var ToolFlowNode = react.memo(function ToolFlowNode2({ id, data, selected }) {
2323
2334
  event.preventDefault();
2324
2335
  },
2325
2336
  children: /* @__PURE__ */ jsxRuntime.jsx(
2326
- chunkI2NZGVBG_js.ToggleSwitch,
2337
+ chunkFSBR4RCK_js.ToggleSwitch,
2327
2338
  {
2328
2339
  checked: Boolean(tool.enabled),
2329
2340
  onChange: () => onToggle(tool),
@@ -2475,7 +2486,7 @@ var RuleFlowNode = react.memo(function RuleFlowNode2({ id, data, selected }) {
2475
2486
  event.preventDefault();
2476
2487
  },
2477
2488
  children: /* @__PURE__ */ jsxRuntime.jsx(
2478
- chunkI2NZGVBG_js.ToggleSwitch,
2489
+ chunkFSBR4RCK_js.ToggleSwitch,
2479
2490
  {
2480
2491
  checked: Boolean(rule.enabled),
2481
2492
  onChange: () => onToggle(rule),
@@ -3475,7 +3486,7 @@ var DatasourceFlowNode = react.memo(function DatasourceFlowNode2({ id, data, sel
3475
3486
  event.preventDefault();
3476
3487
  },
3477
3488
  children: /* @__PURE__ */ jsxRuntime.jsx(
3478
- chunkI2NZGVBG_js.ToggleSwitch,
3489
+ chunkFSBR4RCK_js.ToggleSwitch,
3479
3490
  {
3480
3491
  checked: true,
3481
3492
  onChange: () => {
@@ -3531,92 +3542,6 @@ var DatasourceFlowNode = react.memo(function DatasourceFlowNode2({ id, data, sel
3531
3542
  /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "source", position: react$1.Position.Right, id: "right-out", colorClass: "!bg-cyan-400" })
3532
3543
  ] });
3533
3544
  });
3534
- var SI = (slug, color) => `https://cdn.simpleicons.org/${slug}/${color}`;
3535
- var PROVIDER_LOGOS = {
3536
- aws_bedrock: "https://www.svgrepo.com/show/448266/aws.svg",
3537
- openai_api: "https://www.svgrepo.com/show/306500/openai.svg",
3538
- google_vertex: SI("googlegemini", "8E75B2"),
3539
- azure_openai: SI("microsoftazure", "0078D4"),
3540
- anthropic_api: SI("anthropic", "D4A27F"),
3541
- groq: SI("groq", "000000"),
3542
- mistral: SI("mistralai", "FF7000"),
3543
- huggingface: SI("huggingface", "FFD21E"),
3544
- ollama: SI("ollama", "FFFFFF")
3545
- };
3546
- var PROVIDER_TYPE_LABELS = {
3547
- aws_bedrock: "AWS Bedrock",
3548
- openai_api: "OpenAI API",
3549
- google_vertex: "Google Vertex AI",
3550
- azure_openai: "Azure OpenAI",
3551
- anthropic_api: "Anthropic API",
3552
- groq: "Groq Cloud",
3553
- mistral: "Mistral AI",
3554
- huggingface: "Hugging Face",
3555
- ollama: "Ollama (Local)",
3556
- custom: "Custom"
3557
- };
3558
- var ModelProviderFlowNode = react.memo(function ModelProviderFlowNode2({ id, data, selected }) {
3559
- const config = data.config;
3560
- const isCompact = data.displayMode === "compact";
3561
- if (!config) {
3562
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3563
- /* @__PURE__ */ jsxRuntime.jsx(NodeRunningIndicator, { nodeId: id }),
3564
- /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "target", position: react$1.Position.Left, id: "left-in", colorClass: "!bg-gray-400 dark:!bg-gray-500" }),
3565
- /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "target", position: react$1.Position.Top, id: "top-in", colorClass: "!bg-gray-400 dark:!bg-gray-500" }),
3566
- /* @__PURE__ */ jsxRuntime.jsx(NodeCard, { variant: "error", nodeType: "model_provider", width: "w-[280px]", children: /* @__PURE__ */ jsxRuntime.jsx(
3567
- NodeCardHeader,
3568
- {
3569
- icon: /* @__PURE__ */ jsxRuntime.jsx(outline.ExclamationTriangleIcon, { className: "h-6 w-6 text-white" }),
3570
- title: data.label || "Model Provider",
3571
- description: "Not configured",
3572
- iconClassName: "flex h-11 w-11 items-center justify-center rounded-xl bg-gradient-to-br from-amber-400 to-orange-500 shadow-lg"
3573
- }
3574
- ) }),
3575
- /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "source", position: react$1.Position.Right, id: "right-out", colorClass: "!bg-slate-500" }),
3576
- /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "source", position: react$1.Position.Bottom, id: "bottom-out", colorClass: "!bg-slate-500" })
3577
- ] });
3578
- }
3579
- const providerLabel = PROVIDER_TYPE_LABELS[config.providerType] ?? config.providerType;
3580
- const displayName = config.name || providerLabel;
3581
- const regionLabel = config.region ? config.region : void 0;
3582
- const isConfigured = !!(config.credentialRef || config.apiKeyRef);
3583
- const logo = PROVIDER_LOGOS[config.providerType];
3584
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3585
- /* @__PURE__ */ jsxRuntime.jsx(NodeRunningIndicator, { nodeId: id }),
3586
- /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "target", position: react$1.Position.Left, id: "left-in", colorClass: "!bg-gray-400 dark:!bg-gray-500" }),
3587
- /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "target", position: react$1.Position.Top, id: "top-in", colorClass: "!bg-gray-400 dark:!bg-gray-500" }),
3588
- /* @__PURE__ */ jsxRuntime.jsx(
3589
- "button",
3590
- {
3591
- type: "button",
3592
- onClick: () => data.onEdit?.(id),
3593
- className: "w-full text-left",
3594
- children: /* @__PURE__ */ jsxRuntime.jsxs(NodeCard, { compact: isCompact, selected, nodeType: "model_provider", width: "w-[280px]", children: [
3595
- /* @__PURE__ */ jsxRuntime.jsx(
3596
- NodeCardHeader,
3597
- {
3598
- 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" }),
3599
- title: displayName,
3600
- description: providerLabel,
3601
- 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"}`
3602
- }
3603
- ),
3604
- /* @__PURE__ */ jsxRuntime.jsx(NodeCardMeta, { compact: isCompact, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-1.5", children: [
3605
- /* @__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 }),
3606
- 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 }),
3607
- /* @__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" }),
3608
- 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: [
3609
- config.modelFilter.length,
3610
- " models"
3611
- ] })
3612
- ] }) })
3613
- ] })
3614
- }
3615
- ),
3616
- /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "source", position: react$1.Position.Right, id: "right-out", colorClass: "!bg-slate-500" }),
3617
- /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "source", position: react$1.Position.Bottom, id: "bottom-out", colorClass: "!bg-slate-500" })
3618
- ] });
3619
- });
3620
3545
  var GROUP_COLORS = {
3621
3546
  indigo: {
3622
3547
  border: "border-indigo-300/50 dark:border-indigo-600/50",
@@ -3795,6 +3720,130 @@ var GroupFlowNode = react.memo(function GroupFlowNode2({ id, data, selected }) {
3795
3720
  /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "source", position: react$1.Position.Right, id: "right-out", colorClass: "!bg-slate-500" })
3796
3721
  ] });
3797
3722
  });
3723
+ var AudioInputFlowNode = react.memo(function AudioInputFlowNode2({ id, data, selected }) {
3724
+ const { config, label, onDelete, onEdit } = data;
3725
+ const isCompact = data.displayMode === "compact";
3726
+ const urlPreview = config.url ? config.url.slice(0, 32) : "";
3727
+ const formatLabel = config.format && config.format.length > 0 ? config.format : "auto";
3728
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3729
+ /* @__PURE__ */ jsxRuntime.jsx(NodeRunningIndicator, { nodeId: id }),
3730
+ /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "target", position: react$1.Position.Left, id: "left-in", colorClass: "!bg-teal-500" }),
3731
+ /* @__PURE__ */ jsxRuntime.jsxs(
3732
+ NodeInteractiveCard,
3733
+ {
3734
+ nodeId: id,
3735
+ onEdit,
3736
+ compact: isCompact,
3737
+ selected,
3738
+ nodeType: "audio_input",
3739
+ children: [
3740
+ /* @__PURE__ */ jsxRuntime.jsx(
3741
+ NodeCardHeader,
3742
+ {
3743
+ icon: /* @__PURE__ */ jsxRuntime.jsx(NodeIconBubble, { tone: "audio_input", children: /* @__PURE__ */ jsxRuntime.jsx(outline.MicrophoneIcon, { className: "h-5 w-5 text-white" }) }),
3744
+ title: label,
3745
+ description: "Validates an audio source URL for downstream voice nodes",
3746
+ compact: isCompact,
3747
+ iconClassName: ""
3748
+ }
3749
+ ),
3750
+ /* @__PURE__ */ jsxRuntime.jsxs(NodeCardMeta, { compact: isCompact, children: [
3751
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
3752
+ /* @__PURE__ */ jsxRuntime.jsx(NodeCardBadge, { tone: "audio_input", children: "Audio Input" }),
3753
+ /* @__PURE__ */ jsxRuntime.jsx(NodeCardBadge, { tone: "audio_input", soft: true, children: formatLabel }),
3754
+ urlPreview && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-[10px] text-gray-400 dark:text-gray-500", children: urlPreview })
3755
+ ] }),
3756
+ /* @__PURE__ */ jsxRuntime.jsx(NodeCardDeleteAction, { nodeId: id, onDelete })
3757
+ ] })
3758
+ ]
3759
+ }
3760
+ ),
3761
+ /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "source", position: react$1.Position.Right, id: "right-out", colorClass: "!bg-teal-500" })
3762
+ ] });
3763
+ });
3764
+ var SpeechTranscriberFlowNode = react.memo(function SpeechTranscriberFlowNode2({ id, data, selected }) {
3765
+ const { config, label, onDelete, onEdit } = data;
3766
+ const isCompact = data.displayMode === "compact";
3767
+ const model = config.model && config.model.length > 0 ? config.model : "whisper-1";
3768
+ const language = config.language && config.language.length > 0 ? config.language : "auto";
3769
+ const audioRefPreview = config.audioUrl ? config.audioUrl.slice(0, 32) : "";
3770
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3771
+ /* @__PURE__ */ jsxRuntime.jsx(NodeRunningIndicator, { nodeId: id }),
3772
+ /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "target", position: react$1.Position.Left, id: "left-in", colorClass: "!bg-violet-500" }),
3773
+ /* @__PURE__ */ jsxRuntime.jsxs(
3774
+ NodeInteractiveCard,
3775
+ {
3776
+ nodeId: id,
3777
+ onEdit,
3778
+ compact: isCompact,
3779
+ selected,
3780
+ nodeType: "speech_transcriber",
3781
+ children: [
3782
+ /* @__PURE__ */ jsxRuntime.jsx(
3783
+ NodeCardHeader,
3784
+ {
3785
+ icon: /* @__PURE__ */ jsxRuntime.jsx(NodeIconBubble, { tone: "speech_transcriber", children: /* @__PURE__ */ jsxRuntime.jsx(outline.SpeakerWaveIcon, { className: "h-5 w-5 text-white" }) }),
3786
+ title: label,
3787
+ description: "Transcribes audio via OpenAI Whisper-compatible endpoints",
3788
+ compact: isCompact,
3789
+ iconClassName: ""
3790
+ }
3791
+ ),
3792
+ /* @__PURE__ */ jsxRuntime.jsxs(NodeCardMeta, { compact: isCompact, children: [
3793
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
3794
+ /* @__PURE__ */ jsxRuntime.jsx(NodeCardBadge, { tone: "speech_transcriber", children: "Whisper" }),
3795
+ /* @__PURE__ */ jsxRuntime.jsx(NodeCardBadge, { tone: "speech_transcriber", soft: true, children: model }),
3796
+ /* @__PURE__ */ jsxRuntime.jsx(NodeCardBadge, { tone: "speech_transcriber", soft: true, children: language }),
3797
+ audioRefPreview && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-[10px] text-gray-400 dark:text-gray-500", children: audioRefPreview })
3798
+ ] }),
3799
+ /* @__PURE__ */ jsxRuntime.jsx(NodeCardDeleteAction, { nodeId: id, onDelete })
3800
+ ] })
3801
+ ]
3802
+ }
3803
+ ),
3804
+ /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "source", position: react$1.Position.Right, id: "right-out", colorClass: "!bg-violet-500" })
3805
+ ] });
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
+ });
3798
3847
  function ConfigFormActions({
3799
3848
  cancelLabel,
3800
3849
  saveLabel,
@@ -3803,8 +3852,8 @@ function ConfigFormActions({
3803
3852
  saveDisabled = false
3804
3853
  }) {
3805
3854
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-2 border-t border-gray-200 pt-4 dark:border-gray-700", children: [
3806
- /* @__PURE__ */ jsxRuntime.jsx(chunkI2NZGVBG_js.Button, { type: "button", outline: true, onClick: onCancel, children: cancelLabel }),
3807
- /* @__PURE__ */ jsxRuntime.jsx(chunkI2NZGVBG_js.Button, { type: "button", onClick: onSave, disabled: saveDisabled, children: saveLabel })
3855
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFSBR4RCK_js.Button, { type: "button", outline: true, onClick: onCancel, children: cancelLabel }),
3856
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFSBR4RCK_js.Button, { type: "button", onClick: onSave, disabled: saveDisabled, children: saveLabel })
3808
3857
  ] });
3809
3858
  }
3810
3859
  var COLOR_CLASSES = {
@@ -4051,7 +4100,7 @@ function IfElseNodeConfigForm({ config, onSave, onCancel }) {
4051
4100
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3 flex items-center justify-between", children: [
4052
4101
  /* @__PURE__ */ jsxRuntime.jsx("label", { className: "text-sm font-medium text-gray-700 dark:text-gray-300", children: t("conditionsLabel") }),
4053
4102
  /* @__PURE__ */ jsxRuntime.jsx(
4054
- chunkI2NZGVBG_js.Button,
4103
+ chunkFSBR4RCK_js.Button,
4055
4104
  {
4056
4105
  type: "button",
4057
4106
  onClick: handleAddCondition,
@@ -4062,7 +4111,7 @@ function IfElseNodeConfigForm({ config, onSave, onCancel }) {
4062
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: [
4063
4112
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid flex-1 grid-cols-3 gap-2", children: [
4064
4113
  /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(
4065
- chunkI2NZGVBG_js.FormInput,
4114
+ chunkFSBR4RCK_js.FormInput,
4066
4115
  {
4067
4116
  type: "text",
4068
4117
  label: t("variableLabel"),
@@ -4073,7 +4122,7 @@ function IfElseNodeConfigForm({ config, onSave, onCancel }) {
4073
4122
  }
4074
4123
  ) }),
4075
4124
  /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(
4076
- chunkI2NZGVBG_js.FormSelect,
4125
+ chunkFSBR4RCK_js.FormSelect,
4077
4126
  {
4078
4127
  label: t("operatorLabel"),
4079
4128
  value: condition.operator,
@@ -4083,7 +4132,7 @@ function IfElseNodeConfigForm({ config, onSave, onCancel }) {
4083
4132
  }
4084
4133
  ) }),
4085
4134
  /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(
4086
- chunkI2NZGVBG_js.FormInput,
4135
+ chunkFSBR4RCK_js.FormInput,
4087
4136
  {
4088
4137
  type: "text",
4089
4138
  label: t("valueLabel"),
@@ -4095,7 +4144,7 @@ function IfElseNodeConfigForm({ config, onSave, onCancel }) {
4095
4144
  ) })
4096
4145
  ] }),
4097
4146
  conditions.length > 1 && /* @__PURE__ */ jsxRuntime.jsx(
4098
- chunkI2NZGVBG_js.IconButton,
4147
+ chunkFSBR4RCK_js.IconButton,
4099
4148
  {
4100
4149
  onClick: () => handleRemoveCondition(index),
4101
4150
  icon: /* @__PURE__ */ jsxRuntime.jsx(outline.TrashIcon, { className: "h-4 w-4" }),
@@ -4467,7 +4516,7 @@ function HttpRequestNodeConfigForm({ config, onSave, onCancel }) {
4467
4516
  };
4468
4517
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
4469
4518
  /* @__PURE__ */ jsxRuntime.jsx(
4470
- chunkI2NZGVBG_js.FormSelect,
4519
+ chunkFSBR4RCK_js.FormSelect,
4471
4520
  {
4472
4521
  label: t("methodLabel"),
4473
4522
  value: method,
@@ -4476,7 +4525,7 @@ function HttpRequestNodeConfigForm({ config, onSave, onCancel }) {
4476
4525
  }
4477
4526
  ),
4478
4527
  /* @__PURE__ */ jsxRuntime.jsx(
4479
- chunkI2NZGVBG_js.FormInput,
4528
+ chunkFSBR4RCK_js.FormInput,
4480
4529
  {
4481
4530
  type: "text",
4482
4531
  label: t("urlLabel"),
@@ -4489,7 +4538,7 @@ function HttpRequestNodeConfigForm({ config, onSave, onCancel }) {
4489
4538
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-2 flex items-center justify-between", children: [
4490
4539
  /* @__PURE__ */ jsxRuntime.jsx("label", { className: "text-sm font-medium text-gray-700 dark:text-gray-300", children: t("headersLabel") }),
4491
4540
  /* @__PURE__ */ jsxRuntime.jsx(
4492
- chunkI2NZGVBG_js.Button,
4541
+ chunkFSBR4RCK_js.Button,
4493
4542
  {
4494
4543
  type: "button",
4495
4544
  onClick: handleAddHeader,
@@ -4499,7 +4548,7 @@ function HttpRequestNodeConfigForm({ config, onSave, onCancel }) {
4499
4548
  ] }),
4500
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: [
4501
4550
  /* @__PURE__ */ jsxRuntime.jsx(
4502
- chunkI2NZGVBG_js.FormInput,
4551
+ chunkFSBR4RCK_js.FormInput,
4503
4552
  {
4504
4553
  type: "text",
4505
4554
  value: entry.key,
@@ -4509,7 +4558,7 @@ function HttpRequestNodeConfigForm({ config, onSave, onCancel }) {
4509
4558
  }
4510
4559
  ),
4511
4560
  /* @__PURE__ */ jsxRuntime.jsx(
4512
- chunkI2NZGVBG_js.FormInput,
4561
+ chunkFSBR4RCK_js.FormInput,
4513
4562
  {
4514
4563
  type: "text",
4515
4564
  value: entry.value,
@@ -4519,7 +4568,7 @@ function HttpRequestNodeConfigForm({ config, onSave, onCancel }) {
4519
4568
  }
4520
4569
  ),
4521
4570
  /* @__PURE__ */ jsxRuntime.jsx(
4522
- chunkI2NZGVBG_js.IconButton,
4571
+ chunkFSBR4RCK_js.IconButton,
4523
4572
  {
4524
4573
  onClick: () => handleRemoveHeader(index),
4525
4574
  icon: /* @__PURE__ */ jsxRuntime.jsx(outline.TrashIcon, { className: "h-4 w-4" }),
@@ -4531,7 +4580,7 @@ function HttpRequestNodeConfigForm({ config, onSave, onCancel }) {
4531
4580
  ] }, index)) })
4532
4581
  ] }),
4533
4582
  method !== "GET" && /* @__PURE__ */ jsxRuntime.jsx(
4534
- chunkI2NZGVBG_js.FormTextarea,
4583
+ chunkFSBR4RCK_js.FormTextarea,
4535
4584
  {
4536
4585
  label: t("bodyLabel"),
4537
4586
  value: body,
@@ -4542,7 +4591,7 @@ function HttpRequestNodeConfigForm({ config, onSave, onCancel }) {
4542
4591
  }
4543
4592
  ),
4544
4593
  /* @__PURE__ */ jsxRuntime.jsx(
4545
- chunkI2NZGVBG_js.FormInput,
4594
+ chunkFSBR4RCK_js.FormInput,
4546
4595
  {
4547
4596
  type: "number",
4548
4597
  label: t("timeoutLabel"),
@@ -4554,7 +4603,7 @@ function HttpRequestNodeConfigForm({ config, onSave, onCancel }) {
4554
4603
  }
4555
4604
  ),
4556
4605
  /* @__PURE__ */ jsxRuntime.jsx(
4557
- chunkI2NZGVBG_js.FormSelect,
4606
+ chunkFSBR4RCK_js.FormSelect,
4558
4607
  {
4559
4608
  label: t("parseResponseLabel"),
4560
4609
  value: parseResponse,
@@ -4599,7 +4648,7 @@ function S3WriteNodeConfigForm({ config, onSave, onCancel }) {
4599
4648
  };
4600
4649
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
4601
4650
  /* @__PURE__ */ jsxRuntime.jsx(
4602
- chunkI2NZGVBG_js.FormInput,
4651
+ chunkFSBR4RCK_js.FormInput,
4603
4652
  {
4604
4653
  type: "text",
4605
4654
  label: t("bucketLabel"),
@@ -4609,7 +4658,7 @@ function S3WriteNodeConfigForm({ config, onSave, onCancel }) {
4609
4658
  }
4610
4659
  ),
4611
4660
  /* @__PURE__ */ jsxRuntime.jsx(
4612
- chunkI2NZGVBG_js.FormInput,
4661
+ chunkFSBR4RCK_js.FormInput,
4613
4662
  {
4614
4663
  type: "text",
4615
4664
  label: t("keyLabel"),
@@ -4620,7 +4669,7 @@ function S3WriteNodeConfigForm({ config, onSave, onCancel }) {
4620
4669
  ),
4621
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") }),
4622
4671
  /* @__PURE__ */ jsxRuntime.jsx(
4623
- chunkI2NZGVBG_js.FormInput,
4672
+ chunkFSBR4RCK_js.FormInput,
4624
4673
  {
4625
4674
  type: "text",
4626
4675
  label: t("sourceUrlLabel"),
@@ -4630,7 +4679,7 @@ function S3WriteNodeConfigForm({ config, onSave, onCancel }) {
4630
4679
  }
4631
4680
  ),
4632
4681
  /* @__PURE__ */ jsxRuntime.jsx(
4633
- chunkI2NZGVBG_js.FormTextarea,
4682
+ chunkFSBR4RCK_js.FormTextarea,
4634
4683
  {
4635
4684
  label: t("bodyLabel"),
4636
4685
  value: body,
@@ -4641,7 +4690,7 @@ function S3WriteNodeConfigForm({ config, onSave, onCancel }) {
4641
4690
  }
4642
4691
  ),
4643
4692
  /* @__PURE__ */ jsxRuntime.jsx(
4644
- chunkI2NZGVBG_js.FormInput,
4693
+ chunkFSBR4RCK_js.FormInput,
4645
4694
  {
4646
4695
  type: "text",
4647
4696
  label: t("contentTypeLabel"),
@@ -4651,7 +4700,7 @@ function S3WriteNodeConfigForm({ config, onSave, onCancel }) {
4651
4700
  }
4652
4701
  ),
4653
4702
  /* @__PURE__ */ jsxRuntime.jsx(
4654
- chunkI2NZGVBG_js.FormInput,
4703
+ chunkFSBR4RCK_js.FormInput,
4655
4704
  {
4656
4705
  type: "number",
4657
4706
  label: t("timeoutLabel"),
@@ -4662,7 +4711,7 @@ function S3WriteNodeConfigForm({ config, onSave, onCancel }) {
4662
4711
  }
4663
4712
  ),
4664
4713
  /* @__PURE__ */ jsxRuntime.jsx(
4665
- chunkI2NZGVBG_js.FormInput,
4714
+ chunkFSBR4RCK_js.FormInput,
4666
4715
  {
4667
4716
  type: "text",
4668
4717
  label: t("connectionIdLabel"),
@@ -4691,7 +4740,7 @@ function TemplateTransformNodeConfigForm({ config, onSave, onCancel }) {
4691
4740
  };
4692
4741
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
4693
4742
  /* @__PURE__ */ jsxRuntime.jsx(
4694
- chunkI2NZGVBG_js.FormTextarea,
4743
+ chunkFSBR4RCK_js.FormTextarea,
4695
4744
  {
4696
4745
  label: t("templateLabel"),
4697
4746
  value: template,
@@ -4702,7 +4751,7 @@ function TemplateTransformNodeConfigForm({ config, onSave, onCancel }) {
4702
4751
  }
4703
4752
  ),
4704
4753
  /* @__PURE__ */ jsxRuntime.jsx(
4705
- chunkI2NZGVBG_js.FormInput,
4754
+ chunkFSBR4RCK_js.FormInput,
4706
4755
  {
4707
4756
  type: "text",
4708
4757
  label: t("outputVariableLabel"),
@@ -4731,7 +4780,7 @@ function IterationNodeConfigForm({ config, onSave, onCancel }) {
4731
4780
  };
4732
4781
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
4733
4782
  /* @__PURE__ */ jsxRuntime.jsx(
4734
- chunkI2NZGVBG_js.FormInput,
4783
+ chunkFSBR4RCK_js.FormInput,
4735
4784
  {
4736
4785
  type: "text",
4737
4786
  label: t("iteratorVariableLabel"),
@@ -4741,7 +4790,7 @@ function IterationNodeConfigForm({ config, onSave, onCancel }) {
4741
4790
  }
4742
4791
  ),
4743
4792
  /* @__PURE__ */ jsxRuntime.jsx(
4744
- chunkI2NZGVBG_js.FormInput,
4793
+ chunkFSBR4RCK_js.FormInput,
4745
4794
  {
4746
4795
  type: "number",
4747
4796
  label: t("maxIterationsLabel"),
@@ -4772,7 +4821,7 @@ function KnowledgeBaseNodeConfigForm({ config, onSave, onCancel }) {
4772
4821
  };
4773
4822
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
4774
4823
  /* @__PURE__ */ jsxRuntime.jsx(
4775
- chunkI2NZGVBG_js.FormInput,
4824
+ chunkFSBR4RCK_js.FormInput,
4776
4825
  {
4777
4826
  type: "text",
4778
4827
  label: t("sourceIdLabel"),
@@ -4782,7 +4831,7 @@ function KnowledgeBaseNodeConfigForm({ config, onSave, onCancel }) {
4782
4831
  }
4783
4832
  ),
4784
4833
  /* @__PURE__ */ jsxRuntime.jsx(
4785
- chunkI2NZGVBG_js.FormInput,
4834
+ chunkFSBR4RCK_js.FormInput,
4786
4835
  {
4787
4836
  type: "number",
4788
4837
  label: t("topKLabel"),
@@ -4793,7 +4842,7 @@ function KnowledgeBaseNodeConfigForm({ config, onSave, onCancel }) {
4793
4842
  }
4794
4843
  ),
4795
4844
  /* @__PURE__ */ jsxRuntime.jsx(
4796
- chunkI2NZGVBG_js.FormInput,
4845
+ chunkFSBR4RCK_js.FormInput,
4797
4846
  {
4798
4847
  type: "number",
4799
4848
  label: t("similarityThresholdLabel"),
@@ -4824,7 +4873,7 @@ function AnswerNodeConfigForm({ config, onSave, onCancel }) {
4824
4873
  };
4825
4874
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
4826
4875
  /* @__PURE__ */ jsxRuntime.jsx(
4827
- chunkI2NZGVBG_js.FormTextarea,
4876
+ chunkFSBR4RCK_js.FormTextarea,
4828
4877
  {
4829
4878
  label: t("outputTemplateLabel"),
4830
4879
  hint: t("outputTemplateHelp"),
@@ -5258,7 +5307,7 @@ function VariableAggregatorNodeConfigForm({ config, onSave, onCancel }) {
5258
5307
  }
5259
5308
  ),
5260
5309
  /* @__PURE__ */ jsxRuntime.jsx(
5261
- chunkI2NZGVBG_js.FormInput,
5310
+ chunkFSBR4RCK_js.FormInput,
5262
5311
  {
5263
5312
  type: "text",
5264
5313
  label: t("outputVariableLabel"),
@@ -5268,7 +5317,7 @@ function VariableAggregatorNodeConfigForm({ config, onSave, onCancel }) {
5268
5317
  }
5269
5318
  ),
5270
5319
  /* @__PURE__ */ jsxRuntime.jsx(
5271
- chunkI2NZGVBG_js.FormSelect,
5320
+ chunkFSBR4RCK_js.FormSelect,
5272
5321
  {
5273
5322
  label: t("aggregationModeLabel"),
5274
5323
  value: aggregationMode,
@@ -5301,7 +5350,7 @@ function DocumentExtractorNodeConfigForm({ config, onSave, onCancel }) {
5301
5350
  };
5302
5351
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
5303
5352
  /* @__PURE__ */ jsxRuntime.jsx(
5304
- chunkI2NZGVBG_js.FormSelect,
5353
+ chunkFSBR4RCK_js.FormSelect,
5305
5354
  {
5306
5355
  label: t("extractionModeLabel"),
5307
5356
  value: extractionMode,
@@ -5310,7 +5359,7 @@ function DocumentExtractorNodeConfigForm({ config, onSave, onCancel }) {
5310
5359
  }
5311
5360
  ),
5312
5361
  /* @__PURE__ */ jsxRuntime.jsx(
5313
- chunkI2NZGVBG_js.FormInput,
5362
+ chunkFSBR4RCK_js.FormInput,
5314
5363
  {
5315
5364
  type: "text",
5316
5365
  label: t("outputVariableLabel"),
@@ -5487,7 +5536,7 @@ function IterationStartNodeConfigForm({ config, onSave, onCancel }) {
5487
5536
  };
5488
5537
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
5489
5538
  /* @__PURE__ */ jsxRuntime.jsx(
5490
- chunkI2NZGVBG_js.FormInput,
5539
+ chunkFSBR4RCK_js.FormInput,
5491
5540
  {
5492
5541
  type: "text",
5493
5542
  label: t("iteratorVariableLabel"),
@@ -5497,7 +5546,7 @@ function IterationStartNodeConfigForm({ config, onSave, onCancel }) {
5497
5546
  }
5498
5547
  ),
5499
5548
  /* @__PURE__ */ jsxRuntime.jsx(
5500
- chunkI2NZGVBG_js.FormInput,
5549
+ chunkFSBR4RCK_js.FormInput,
5501
5550
  {
5502
5551
  type: "text",
5503
5552
  label: t("itemVariableLabel"),
@@ -5507,7 +5556,7 @@ function IterationStartNodeConfigForm({ config, onSave, onCancel }) {
5507
5556
  }
5508
5557
  ),
5509
5558
  /* @__PURE__ */ jsxRuntime.jsx(
5510
- chunkI2NZGVBG_js.FormInput,
5559
+ chunkFSBR4RCK_js.FormInput,
5511
5560
  {
5512
5561
  type: "text",
5513
5562
  label: t("indexVariableLabel"),
@@ -5779,7 +5828,7 @@ function GroupNodeConfigForm({ config, onSave, onCancel }) {
5779
5828
  };
5780
5829
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
5781
5830
  /* @__PURE__ */ jsxRuntime.jsx(
5782
- chunkI2NZGVBG_js.FormInput,
5831
+ chunkFSBR4RCK_js.FormInput,
5783
5832
  {
5784
5833
  type: "text",
5785
5834
  label: translations("labelField"),
@@ -5789,7 +5838,7 @@ function GroupNodeConfigForm({ config, onSave, onCancel }) {
5789
5838
  }
5790
5839
  ),
5791
5840
  /* @__PURE__ */ jsxRuntime.jsx(
5792
- chunkI2NZGVBG_js.FormTextarea,
5841
+ chunkFSBR4RCK_js.FormTextarea,
5793
5842
  {
5794
5843
  label: translations("descriptionField"),
5795
5844
  value: description,
@@ -5823,215 +5872,6 @@ function GroupNodeConfigForm({ config, onSave, onCancel }) {
5823
5872
  )
5824
5873
  ] });
5825
5874
  }
5826
- var catalogCache = null;
5827
- var catalogPromise = null;
5828
- async function loadCatalog() {
5829
- if (catalogCache) return catalogCache;
5830
- if (!catalogPromise) {
5831
- catalogPromise = chunkF54Q2YJY_js.listModelProviderCatalog().then((rows) => {
5832
- catalogCache = rows;
5833
- return rows;
5834
- });
5835
- }
5836
- return catalogPromise;
5837
- }
5838
- var ENDPOINT_SLUGS = /* @__PURE__ */ new Set(["custom", "azure_openai", "ollama"]);
5839
- function ModelProviderNodeConfigForm({ config, onSave, onCancel }) {
5840
- const t = chunkYXN2K77G_js.useTranslations("agents.workflow.modelProviderNodeConfig");
5841
- const [catalog, setCatalog] = react.useState(catalogCache);
5842
- const [catalogError, setCatalogError] = react.useState(null);
5843
- const [providerType, setProviderType] = react.useState(config.providerType);
5844
- const [name, setName] = react.useState(config.name ?? "");
5845
- const [region, setRegion] = react.useState(config.region ?? "");
5846
- const [endpoint, setEndpoint] = react.useState(config.endpoint ?? "");
5847
- const [credentialRef, setCredentialRef] = react.useState(config.credentialRef ?? "");
5848
- const [apiKeyRef, setApiKeyRef] = react.useState(config.apiKeyRef ?? "");
5849
- const [selectedFamilies, setSelectedFamilies] = react.useState(/* @__PURE__ */ new Set());
5850
- react.useEffect(() => {
5851
- let cancelled = false;
5852
- if (catalog) return;
5853
- void loadCatalog().then((rows) => {
5854
- if (cancelled) return;
5855
- setCatalog(rows);
5856
- }).catch((error) => {
5857
- if (cancelled) return;
5858
- const message = error instanceof Error ? error.message : "Failed to load provider catalog";
5859
- setCatalogError(message);
5860
- });
5861
- return () => {
5862
- cancelled = true;
5863
- };
5864
- }, [catalog]);
5865
- const currentProvider = react.useMemo(() => {
5866
- if (!catalog) return void 0;
5867
- return catalog.find((entry) => entry.slug === providerType);
5868
- }, [catalog, providerType]);
5869
- const families = currentProvider?.families ?? [];
5870
- const regions = Array.isArray(currentProvider?.regions) ? currentProvider.regions : [];
5871
- const showRegion = regions.length > 0;
5872
- const showEndpoint = ENDPOINT_SLUGS.has(providerType);
5873
- const authType = currentProvider?.authType ?? null;
5874
- const showApiKey = authType === "api_key";
5875
- const showCredentialRef = authType === "iam_role";
5876
- react.useEffect(() => {
5877
- if (!currentProvider) return;
5878
- setSelectedFamilies((previous) => {
5879
- if (previous.size > 0) return previous;
5880
- const filter = new Set(config.modelFilter ?? []);
5881
- const next = /* @__PURE__ */ new Set();
5882
- for (const family of currentProvider.families) {
5883
- if (filter.size === 0 || family.modelIds.some((id) => filter.has(id))) {
5884
- next.add(family.id);
5885
- }
5886
- }
5887
- return next;
5888
- });
5889
- }, [currentProvider, config.modelFilter]);
5890
- const handleToggleFamily = (familyId) => {
5891
- setSelectedFamilies((previous) => {
5892
- const next = new Set(previous);
5893
- if (next.has(familyId)) next.delete(familyId);
5894
- else next.add(familyId);
5895
- return next;
5896
- });
5897
- };
5898
- const handleProviderChange = (value) => {
5899
- const newType = value;
5900
- setProviderType(newType);
5901
- setRegion("");
5902
- const next = catalog?.find((entry) => entry.slug === newType);
5903
- setSelectedFamilies(new Set((next?.families ?? []).map((family) => family.id)));
5904
- };
5905
- const handleSave = () => {
5906
- const modelFilter = families.filter((family) => selectedFamilies.has(family.id)).flatMap((family) => family.modelIds);
5907
- onSave({
5908
- ...config,
5909
- providerType,
5910
- name: name.trim() || void 0,
5911
- region: region || void 0,
5912
- endpoint: endpoint.trim() || void 0,
5913
- credentialRef: credentialRef.trim() || void 0,
5914
- apiKeyRef: apiKeyRef.trim() || void 0,
5915
- modelFilter
5916
- });
5917
- };
5918
- if (catalogError) {
5919
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
5920
- /* @__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 }),
5921
- /* @__PURE__ */ jsxRuntime.jsx(
5922
- ConfigFormActions,
5923
- {
5924
- cancelLabel: t("cancel"),
5925
- saveLabel: t("save"),
5926
- onCancel,
5927
- onSave: handleSave,
5928
- saveDisabled: true
5929
- }
5930
- )
5931
- ] });
5932
- }
5933
- if (!catalog) {
5934
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-4 h-32" });
5935
- }
5936
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
5937
- /* @__PURE__ */ jsxRuntime.jsx(
5938
- chunkI2NZGVBG_js.FormInput,
5939
- {
5940
- type: "text",
5941
- label: t("nameLabel"),
5942
- value: name,
5943
- onValueChange: setName,
5944
- placeholder: t("namePlaceholder")
5945
- }
5946
- ),
5947
- /* @__PURE__ */ jsxRuntime.jsx(
5948
- chunkI2NZGVBG_js.FormSelect,
5949
- {
5950
- label: t("providerTypeLabel"),
5951
- value: providerType,
5952
- onValueChange: handleProviderChange,
5953
- options: catalog.filter((entry) => entry.enabled).map((entry) => ({ value: entry.slug, label: entry.name }))
5954
- }
5955
- ),
5956
- showRegion && /* @__PURE__ */ jsxRuntime.jsx(
5957
- chunkI2NZGVBG_js.FormSelect,
5958
- {
5959
- label: t("regionLabel"),
5960
- value: region,
5961
- onValueChange: setRegion,
5962
- options: [
5963
- { value: "", label: t("selectRegion") },
5964
- ...regions.map((value) => ({ value, label: value }))
5965
- ]
5966
- }
5967
- ),
5968
- showEndpoint && /* @__PURE__ */ jsxRuntime.jsx(
5969
- chunkI2NZGVBG_js.FormInput,
5970
- {
5971
- type: "text",
5972
- label: t("endpointLabel"),
5973
- value: endpoint,
5974
- onValueChange: setEndpoint,
5975
- placeholder: providerType === "ollama" ? "http://localhost:11434" : t("endpointPlaceholder")
5976
- }
5977
- ),
5978
- showApiKey && /* @__PURE__ */ jsxRuntime.jsx(
5979
- chunkI2NZGVBG_js.FormInput,
5980
- {
5981
- type: "password",
5982
- label: t("apiKeyLabel"),
5983
- value: apiKeyRef,
5984
- onValueChange: setApiKeyRef,
5985
- placeholder: t("apiKeyPlaceholder")
5986
- }
5987
- ),
5988
- showCredentialRef && /* @__PURE__ */ jsxRuntime.jsx(
5989
- chunkI2NZGVBG_js.FormInput,
5990
- {
5991
- type: "text",
5992
- label: t("credentialRefLabel"),
5993
- value: credentialRef,
5994
- onValueChange: setCredentialRef,
5995
- placeholder: providerType === "aws_bedrock" ? "arn:aws:iam::role/bedrock-role" : t("credentialRefPlaceholder")
5996
- }
5997
- ),
5998
- families.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
5999
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: "mb-2 block text-sm font-medium text-gray-700 dark:text-gray-300", children: t("modelFamiliesLabel") }),
6000
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-1.5", children: families.map((family) => {
6001
- const isSelected = selectedFamilies.has(family.id);
6002
- return /* @__PURE__ */ jsxRuntime.jsxs(
6003
- "button",
6004
- {
6005
- type: "button",
6006
- onClick: () => handleToggleFamily(family.id),
6007
- 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"}`,
6008
- children: [
6009
- /* @__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" }) }) }),
6010
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
6011
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-medium text-gray-900 dark:text-white", children: family.name }),
6012
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ml-2 text-[10px] text-gray-400 dark:text-gray-500", children: [
6013
- family.modelIds.length,
6014
- " models"
6015
- ] })
6016
- ] })
6017
- ]
6018
- },
6019
- family.id
6020
- );
6021
- }) })
6022
- ] }),
6023
- /* @__PURE__ */ jsxRuntime.jsx(
6024
- ConfigFormActions,
6025
- {
6026
- cancelLabel: t("cancel"),
6027
- saveLabel: t("save"),
6028
- onCancel,
6029
- onSave: handleSave,
6030
- saveDisabled: !providerType
6031
- }
6032
- )
6033
- ] });
6034
- }
6035
5875
  function RuleNodeConfigForm({ config, onSave, onCancel, availableRules }) {
6036
5876
  const t = chunkYXN2K77G_js.useTranslations("agents.workflow.ruleNodeConfig");
6037
5877
  const [ruleId, setRuleId] = react.useState(config.ruleId ?? "");
@@ -6056,7 +5896,7 @@ function RuleNodeConfigForm({ config, onSave, onCancel, availableRules }) {
6056
5896
  ]
6057
5897
  }
6058
5898
  ) : /* @__PURE__ */ jsxRuntime.jsx(
6059
- chunkI2NZGVBG_js.FormInput,
5899
+ chunkFSBR4RCK_js.FormInput,
6060
5900
  {
6061
5901
  type: "text",
6062
5902
  value: ruleId,
@@ -6072,7 +5912,7 @@ function RuleNodeConfigForm({ config, onSave, onCancel, availableRules }) {
6072
5912
  ] }),
6073
5913
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
6074
5914
  /* @__PURE__ */ jsxRuntime.jsx(
6075
- chunkI2NZGVBG_js.FormInput,
5915
+ chunkFSBR4RCK_js.FormInput,
6076
5916
  {
6077
5917
  type: "number",
6078
5918
  label: t("priorityLabel", { _: "Priority" }),
@@ -6144,7 +5984,7 @@ function AgentNodeConfigForm({
6144
5984
  }));
6145
5985
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
6146
5986
  agentOptions.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
6147
- chunkI2NZGVBG_js.FormSelect,
5987
+ chunkFSBR4RCK_js.FormSelect,
6148
5988
  {
6149
5989
  label: t("agentLabel", { _: "Agent" }),
6150
5990
  value: agentId,
@@ -6152,7 +5992,7 @@ function AgentNodeConfigForm({
6152
5992
  options: [{ value: "", label: t("agentPickPrompt", { _: "Choose an agent\u2026" }) }, ...agentOptions]
6153
5993
  }
6154
5994
  ) : /* @__PURE__ */ jsxRuntime.jsx(
6155
- chunkI2NZGVBG_js.FormInput,
5995
+ chunkFSBR4RCK_js.FormInput,
6156
5996
  {
6157
5997
  type: "text",
6158
5998
  label: t("agentIdLabel", { _: "Agent ID" }),
@@ -6162,7 +6002,7 @@ function AgentNodeConfigForm({
6162
6002
  }
6163
6003
  ),
6164
6004
  connOptions.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
6165
- chunkI2NZGVBG_js.FormSelect,
6005
+ chunkFSBR4RCK_js.FormSelect,
6166
6006
  {
6167
6007
  label: t("connectionLabel", { _: "Model provider connection" }),
6168
6008
  value: connectionId,
@@ -6170,7 +6010,7 @@ function AgentNodeConfigForm({
6170
6010
  options: [{ value: "", label: t("connectionPickPrompt", { _: "Inline model (no connection)" }) }, ...connOptions]
6171
6011
  }
6172
6012
  ) : /* @__PURE__ */ jsxRuntime.jsx(
6173
- chunkI2NZGVBG_js.FormInput,
6013
+ chunkFSBR4RCK_js.FormInput,
6174
6014
  {
6175
6015
  type: "text",
6176
6016
  label: t("connectionIdLabel", { _: "Connection ID" }),
@@ -6180,7 +6020,7 @@ function AgentNodeConfigForm({
6180
6020
  }
6181
6021
  ),
6182
6022
  /* @__PURE__ */ jsxRuntime.jsx(
6183
- chunkI2NZGVBG_js.FormInput,
6023
+ chunkFSBR4RCK_js.FormInput,
6184
6024
  {
6185
6025
  type: "text",
6186
6026
  label: t("modelIdLabel", { _: "Model override (optional)" }),
@@ -6190,7 +6030,7 @@ function AgentNodeConfigForm({
6190
6030
  }
6191
6031
  ),
6192
6032
  /* @__PURE__ */ jsxRuntime.jsx(
6193
- chunkI2NZGVBG_js.FormTextarea,
6033
+ chunkFSBR4RCK_js.FormTextarea,
6194
6034
  {
6195
6035
  label: t("systemPromptLabel", { _: "System prompt" }),
6196
6036
  value: systemPrompt,
@@ -6200,7 +6040,7 @@ function AgentNodeConfigForm({
6200
6040
  }
6201
6041
  ),
6202
6042
  /* @__PURE__ */ jsxRuntime.jsx(
6203
- chunkI2NZGVBG_js.FormTextarea,
6043
+ chunkFSBR4RCK_js.FormTextarea,
6204
6044
  {
6205
6045
  label: t("userPromptLabel", { _: "User prompt" }),
6206
6046
  value: userPrompt,
@@ -6211,7 +6051,7 @@ function AgentNodeConfigForm({
6211
6051
  ),
6212
6052
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
6213
6053
  /* @__PURE__ */ jsxRuntime.jsx(
6214
- chunkI2NZGVBG_js.FormInput,
6054
+ chunkFSBR4RCK_js.FormInput,
6215
6055
  {
6216
6056
  type: "number",
6217
6057
  label: t("maxTokensLabel", { _: "Max output tokens" }),
@@ -6223,7 +6063,7 @@ function AgentNodeConfigForm({
6223
6063
  }
6224
6064
  ),
6225
6065
  /* @__PURE__ */ jsxRuntime.jsx(
6226
- chunkI2NZGVBG_js.FormInput,
6066
+ chunkFSBR4RCK_js.FormInput,
6227
6067
  {
6228
6068
  type: "number",
6229
6069
  label: t("temperatureLabel", { _: "Temperature" }),
@@ -6246,6 +6086,247 @@ function AgentNodeConfigForm({
6246
6086
  )
6247
6087
  ] });
6248
6088
  }
6089
+ var AUDIO_FORMATS = ["auto", "mp3", "wav", "m4a", "webm", "ogg", "flac", "mp4", "mpga"];
6090
+ function AudioInputNodeConfigForm({ config, onSave, onCancel }) {
6091
+ const t = chunkYXN2K77G_js.useTranslations("agents.workflow.audioInputNodeConfig");
6092
+ const [url, setUrl] = react.useState(config.url ?? "");
6093
+ const [format, setFormat] = react.useState(config.format && config.format.length > 0 ? config.format : "auto");
6094
+ const handleSave = () => {
6095
+ onSave({
6096
+ ...config,
6097
+ url,
6098
+ format: format === "auto" ? void 0 : format
6099
+ });
6100
+ };
6101
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
6102
+ /* @__PURE__ */ jsxRuntime.jsx(
6103
+ chunkFSBR4RCK_js.FormInput,
6104
+ {
6105
+ type: "text",
6106
+ label: t("urlLabel"),
6107
+ value: url,
6108
+ onValueChange: setUrl,
6109
+ placeholder: t("urlPlaceholder")
6110
+ }
6111
+ ),
6112
+ /* @__PURE__ */ jsxRuntime.jsx(
6113
+ chunkFSBR4RCK_js.FormSelect,
6114
+ {
6115
+ label: t("formatLabel"),
6116
+ value: format,
6117
+ onValueChange: setFormat,
6118
+ options: AUDIO_FORMATS.map((option) => ({ value: option, label: option }))
6119
+ }
6120
+ ),
6121
+ /* @__PURE__ */ jsxRuntime.jsx(
6122
+ ConfigFormActions,
6123
+ {
6124
+ cancelLabel: t("cancel"),
6125
+ saveLabel: t("save"),
6126
+ onCancel,
6127
+ onSave: handleSave
6128
+ }
6129
+ )
6130
+ ] });
6131
+ }
6132
+ var RESPONSE_FORMATS = [
6133
+ "verbose_json",
6134
+ "json",
6135
+ "text"
6136
+ ];
6137
+ function SpeechTranscriberNodeConfigForm({ config, onSave, onCancel }) {
6138
+ const t = chunkYXN2K77G_js.useTranslations("agents.workflow.speechTranscriberNodeConfig");
6139
+ const [audioUrl, setAudioUrl] = react.useState(config.audioUrl ?? "");
6140
+ const [model, setModel] = react.useState(config.model ?? "whisper-1");
6141
+ const [language, setLanguage] = react.useState(config.language ?? "");
6142
+ const [prompt, setPrompt] = react.useState(config.prompt ?? "");
6143
+ const [responseFormat, setResponseFormat] = react.useState(
6144
+ config.responseFormat ?? "verbose_json"
6145
+ );
6146
+ const [endpoint, setEndpoint] = react.useState(config.endpoint ?? "");
6147
+ const [timeoutMs, setTimeoutMs] = react.useState(config.timeoutMs ?? 12e4);
6148
+ const handleSave = () => {
6149
+ onSave({
6150
+ ...config,
6151
+ audioUrl,
6152
+ model: model.trim() || void 0,
6153
+ language: language.trim() || void 0,
6154
+ prompt: prompt.trim() || void 0,
6155
+ responseFormat,
6156
+ endpoint: endpoint.trim() || void 0,
6157
+ timeoutMs
6158
+ });
6159
+ };
6160
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
6161
+ /* @__PURE__ */ jsxRuntime.jsx(
6162
+ chunkFSBR4RCK_js.FormInput,
6163
+ {
6164
+ type: "text",
6165
+ label: t("audioUrlLabel"),
6166
+ value: audioUrl,
6167
+ onValueChange: setAudioUrl,
6168
+ placeholder: t("audioUrlPlaceholder")
6169
+ }
6170
+ ),
6171
+ /* @__PURE__ */ jsxRuntime.jsx(
6172
+ chunkFSBR4RCK_js.FormInput,
6173
+ {
6174
+ type: "text",
6175
+ label: t("modelLabel"),
6176
+ value: model,
6177
+ onValueChange: setModel,
6178
+ placeholder: "whisper-1"
6179
+ }
6180
+ ),
6181
+ /* @__PURE__ */ jsxRuntime.jsx(
6182
+ chunkFSBR4RCK_js.FormInput,
6183
+ {
6184
+ type: "text",
6185
+ label: t("languageLabel"),
6186
+ value: language,
6187
+ onValueChange: setLanguage,
6188
+ placeholder: t("languagePlaceholder")
6189
+ }
6190
+ ),
6191
+ /* @__PURE__ */ jsxRuntime.jsx(
6192
+ chunkFSBR4RCK_js.FormTextarea,
6193
+ {
6194
+ label: t("promptLabel"),
6195
+ value: prompt,
6196
+ onValueChange: setPrompt,
6197
+ placeholder: t("promptPlaceholder"),
6198
+ rows: 3
6199
+ }
6200
+ ),
6201
+ /* @__PURE__ */ jsxRuntime.jsx(
6202
+ chunkFSBR4RCK_js.FormSelect,
6203
+ {
6204
+ label: t("responseFormatLabel"),
6205
+ value: responseFormat,
6206
+ onValueChange: (value) => setResponseFormat(value),
6207
+ options: RESPONSE_FORMATS.map((value) => ({ value, label: value }))
6208
+ }
6209
+ ),
6210
+ /* @__PURE__ */ jsxRuntime.jsx(
6211
+ chunkFSBR4RCK_js.FormInput,
6212
+ {
6213
+ type: "text",
6214
+ label: t("endpointLabel"),
6215
+ value: endpoint,
6216
+ onValueChange: setEndpoint,
6217
+ placeholder: t("endpointPlaceholder")
6218
+ }
6219
+ ),
6220
+ /* @__PURE__ */ jsxRuntime.jsx(
6221
+ chunkFSBR4RCK_js.FormInput,
6222
+ {
6223
+ type: "number",
6224
+ label: t("timeoutLabel"),
6225
+ value: String(timeoutMs),
6226
+ onValueChange: (value) => setTimeoutMs(Number(value)),
6227
+ min: 1e3,
6228
+ max: 6e5,
6229
+ step: 1e3
6230
+ }
6231
+ ),
6232
+ /* @__PURE__ */ jsxRuntime.jsx(
6233
+ ConfigFormActions,
6234
+ {
6235
+ cancelLabel: t("cancel"),
6236
+ saveLabel: t("save"),
6237
+ onCancel,
6238
+ onSave: handleSave
6239
+ }
6240
+ )
6241
+ ] });
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
+ }
6249
6330
  var NODE_TITLE_KEYS = {
6250
6331
  start: "startNodeConfig",
6251
6332
  end: "endNodeConfig",
@@ -6267,9 +6348,11 @@ var NODE_TITLE_KEYS = {
6267
6348
  entity: "entityNodeConfig",
6268
6349
  datasource: "datasourceNodeConfig",
6269
6350
  group: "groupNodeConfig",
6270
- model_provider: "modelProviderNodeConfig",
6271
6351
  rule: "ruleNodeConfig",
6272
- agent: "agentNodeConfig"
6352
+ agent: "agentNodeConfig",
6353
+ audio_input: "audioInputNodeConfig",
6354
+ speech_transcriber: "speechTranscriberNodeConfig",
6355
+ dashboard_output: "dashboardOutputNodeConfig"
6273
6356
  };
6274
6357
  function LogicNodeModal({ onSave, entities = [], datasources = [], onLoadTables, onLoadSchema }) {
6275
6358
  const t = chunkYXN2K77G_js.useTranslations("agents.workflow");
@@ -6330,19 +6413,27 @@ function LogicNodeModal({ onSave, entities = [], datasources = [], onLoadTables,
6330
6413
  return /* @__PURE__ */ jsxRuntime.jsx(EntityNodeConfigForm, { config, entities, onSave: handleSave, onCancel: closeModal });
6331
6414
  case "group":
6332
6415
  return /* @__PURE__ */ jsxRuntime.jsx(GroupNodeConfigForm, { config, onSave: handleSave, onCancel: closeModal });
6333
- case "model_provider":
6334
- 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.
6335
6420
  case "rule":
6336
6421
  return /* @__PURE__ */ jsxRuntime.jsx(RuleNodeConfigForm, { config, onSave: handleSave, onCancel: closeModal });
6337
6422
  case "agent":
6338
6423
  return /* @__PURE__ */ jsxRuntime.jsx(AgentNodeConfigForm, { config, onSave: handleSave, onCancel: closeModal });
6424
+ case "audio_input":
6425
+ return /* @__PURE__ */ jsxRuntime.jsx(AudioInputNodeConfigForm, { config, onSave: handleSave, onCancel: closeModal });
6426
+ case "speech_transcriber":
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 });
6339
6430
  default:
6340
6431
  return null;
6341
6432
  }
6342
6433
  };
6343
6434
  const isExperimental = isExperimentalNodeType(config.type);
6344
6435
  return /* @__PURE__ */ jsxRuntime.jsxs(
6345
- chunkI2NZGVBG_js.GlassModal,
6436
+ chunkFSBR4RCK_js.GlassModal,
6346
6437
  {
6347
6438
  open,
6348
6439
  onClose: closeModal,
@@ -6413,7 +6504,7 @@ function NodeContextMenu({ position, targetId, onClose, onEdit, onDuplicate, onC
6413
6504
  }
6414
6505
  ];
6415
6506
  return /* @__PURE__ */ jsxRuntime.jsx(
6416
- chunkI2NZGVBG_js.ContextMenu,
6507
+ chunkFSBR4RCK_js.ContextMenu,
6417
6508
  {
6418
6509
  position,
6419
6510
  onClose,
@@ -6470,7 +6561,7 @@ function PanelContextMenu({ position, onClose, onPaste, onSelectAll, onFitView,
6470
6561
  }
6471
6562
  ];
6472
6563
  return /* @__PURE__ */ jsxRuntime.jsx(
6473
- chunkI2NZGVBG_js.ContextMenu,
6564
+ chunkFSBR4RCK_js.ContextMenu,
6474
6565
  {
6475
6566
  position,
6476
6567
  onClose,
@@ -6617,7 +6708,7 @@ function SelectionContextMenu({
6617
6708
  }
6618
6709
  ];
6619
6710
  return /* @__PURE__ */ jsxRuntime.jsx(
6620
- chunkI2NZGVBG_js.ContextMenu,
6711
+ chunkFSBR4RCK_js.ContextMenu,
6621
6712
  {
6622
6713
  position,
6623
6714
  onClose,
@@ -6718,8 +6809,14 @@ var BUILT_IN_NODE_TYPES = {
6718
6809
  iteration_start: IterationStartFlowNode,
6719
6810
  note: NoteFlowNode,
6720
6811
  datasource: DatasourceFlowNode,
6721
- model_provider: ModelProviderFlowNode,
6722
- group: GroupFlowNode
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.
6816
+ group: GroupFlowNode,
6817
+ audio_input: AudioInputFlowNode,
6818
+ speech_transcriber: SpeechTranscriberFlowNode,
6819
+ dashboard_output: DashboardOutputFlowNode
6723
6820
  };
6724
6821
  var ALL_LOGIC_NODE_TYPES = [
6725
6822
  "start",
@@ -6744,8 +6841,10 @@ var ALL_LOGIC_NODE_TYPES = [
6744
6841
  "rule",
6745
6842
  "entity",
6746
6843
  "datasource",
6747
- "model_provider",
6748
- "group"
6844
+ "group",
6845
+ "audio_input",
6846
+ "speech_transcriber",
6847
+ "dashboard_output"
6749
6848
  ];
6750
6849
  function isLogicNodeType(nodeType) {
6751
6850
  return ALL_LOGIC_NODE_TYPES.includes(nodeType);
@@ -6769,6 +6868,7 @@ var AUTO_SAVE_DEBOUNCE_MS = 2e3;
6769
6868
  function WorkflowCanvasInner({
6770
6869
  agents,
6771
6870
  models,
6871
+ modelProviders = [],
6772
6872
  tools,
6773
6873
  agentTools = [],
6774
6874
  rules,
@@ -6803,7 +6903,9 @@ function WorkflowCanvasInner({
6803
6903
  openAgentModalAction(
6804
6904
  { agentId: "", name: "", order: 0, enabled: true, temperature: 0.7, maxTokens: 4096 },
6805
6905
  models,
6806
- true
6906
+ true,
6907
+ agentTools,
6908
+ modelProviders
6807
6909
  );
6808
6910
  }
6809
6911
  }, [isCreatingAgent]);
@@ -6950,7 +7052,7 @@ function WorkflowCanvasInner({
6950
7052
  providerName: models.find((m) => m.id === agent.modelId)?.provider,
6951
7053
  onSelect: () => {
6952
7054
  setSelectedAgentId(agent.agentId);
6953
- openAgentModalAction(agent, models, false, agentTools);
7055
+ openAgentModalAction(agent, models, false, agentTools, modelProviders);
6954
7056
  },
6955
7057
  onRemoveFromCanvas: handleRemoveNodeFromCanvas
6956
7058
  }
@@ -7083,7 +7185,7 @@ function WorkflowCanvasInner({
7083
7185
  };
7084
7186
  }
7085
7187
  if (isLogicNodeType(savedNode.type)) {
7086
- const config = savedNode.data.config ?? chunkC3H4FM4A_js.createDefaultLogicNodeConfig(savedNode.type);
7188
+ const config = savedNode.data.config ?? chunk72SWXOD5_js.createDefaultLogicNodeConfig(savedNode.type);
7087
7189
  if (config) {
7088
7190
  const baseNode = {
7089
7191
  id: savedNode.id,
@@ -7262,7 +7364,7 @@ function WorkflowCanvasInner({
7262
7364
  }
7263
7365
  storeTakeSnapshot();
7264
7366
  const isTB = direction === "TB";
7265
- const repositionedNodes = chunkC3H4FM4A_js.applyDagreLayout(nodes, edges, direction).map((node) => ({
7367
+ const repositionedNodes = chunk72SWXOD5_js.applyDagreLayout(nodes, edges, direction).map((node) => ({
7266
7368
  ...node,
7267
7369
  sourcePosition: isTB ? react$1.Position.Bottom : react$1.Position.Right,
7268
7370
  targetPosition: isTB ? react$1.Position.Top : react$1.Position.Left
@@ -7333,7 +7435,7 @@ function WorkflowCanvasInner({
7333
7435
  const agent = targetNode.data?.agent;
7334
7436
  if (agent) {
7335
7437
  setSelectedAgentId(agent.agentId ?? agent.id ?? null);
7336
- openAgentModalAction(agent, models, false, agentTools);
7438
+ openAgentModalAction(agent, models, false, agentTools, modelProviders);
7337
7439
  }
7338
7440
  } else if (targetNode.type === "tool") {
7339
7441
  const tool = targetNode.data?.tool;
@@ -7391,7 +7493,7 @@ function WorkflowCanvasInner({
7391
7493
  }, [storePaste]);
7392
7494
  const contextMenuAddNote = react.useCallback((flowPosition) => {
7393
7495
  storeTakeSnapshot();
7394
- const noteConfig = chunkC3H4FM4A_js.createDefaultLogicNodeConfig("note");
7496
+ const noteConfig = chunk72SWXOD5_js.createDefaultLogicNodeConfig("note");
7395
7497
  const noteNode = {
7396
7498
  id: crypto.randomUUID(),
7397
7499
  type: "note",
@@ -7832,7 +7934,7 @@ function WorkflowCanvasInner({
7832
7934
  selected: false,
7833
7935
  onSelect: () => {
7834
7936
  setSelectedAgentId(agent.agentId);
7835
- openAgentModalAction(agent, models, false, agentTools);
7937
+ openAgentModalAction(agent, models, false, agentTools, modelProviders);
7836
7938
  },
7837
7939
  onRemoveFromCanvas: handleRemoveNodeFromCanvas
7838
7940
  }
@@ -7902,7 +8004,7 @@ function WorkflowCanvasInner({
7902
8004
  };
7903
8005
  setNodes((currentNodes) => [...currentNodes, newNode]);
7904
8006
  } else if (nodeType === "group") {
7905
- const groupConfig = configRaw ? JSON.parse(configRaw) : chunkC3H4FM4A_js.createDefaultLogicNodeConfig("group");
8007
+ const groupConfig = configRaw ? JSON.parse(configRaw) : chunk72SWXOD5_js.createDefaultLogicNodeConfig("group");
7906
8008
  if (!groupConfig) return;
7907
8009
  const newNode = {
7908
8010
  id: newNodeId,
@@ -7919,7 +8021,7 @@ function WorkflowCanvasInner({
7919
8021
  };
7920
8022
  setNodes((currentNodes) => [...currentNodes, newNode]);
7921
8023
  } else if (isLogicNodeType(nodeType)) {
7922
- const config = configRaw ? JSON.parse(configRaw) : chunkC3H4FM4A_js.createDefaultLogicNodeConfig(nodeType);
8024
+ const config = configRaw ? JSON.parse(configRaw) : chunk72SWXOD5_js.createDefaultLogicNodeConfig(nodeType);
7923
8025
  if (!config) return;
7924
8026
  const newNode = {
7925
8027
  id: newNodeId,
@@ -8057,7 +8159,7 @@ function WorkflowCanvasInner({
8057
8159
  (edgeId, nodeType, position) => {
8058
8160
  if (!isLogicNodeType(nodeType)) return;
8059
8161
  storeTakeSnapshot();
8060
- const config = chunkC3H4FM4A_js.createDefaultLogicNodeConfig(nodeType);
8162
+ const config = chunk72SWXOD5_js.createDefaultLogicNodeConfig(nodeType);
8061
8163
  if (!config) return;
8062
8164
  const newNodeId = crypto.randomUUID();
8063
8165
  const newNode = {
@@ -8521,7 +8623,6 @@ exports.LangChainIcon = LangChainIcon;
8521
8623
  exports.ListOperatorFlowNode = ListOperatorFlowNode;
8522
8624
  exports.LogicNodeModal = LogicNodeModal;
8523
8625
  exports.MINIMAP_NODE_COLORS = MINIMAP_NODE_COLORS;
8524
- exports.ModelProviderFlowNode = ModelProviderFlowNode;
8525
8626
  exports.NODE_EXECUTION_ACCENT_COLORS = NODE_EXECUTION_ACCENT_COLORS;
8526
8627
  exports.NodeCard = NodeCard;
8527
8628
  exports.NodeCardBadge = NodeCardBadge;
@@ -8565,5 +8666,5 @@ exports.useModalStore = useModalStore;
8565
8666
  exports.useWorkflowBuilderClient = useWorkflowBuilderClient;
8566
8667
  exports.useWorkflowBuilderClientOptional = useWorkflowBuilderClientOptional;
8567
8668
  exports.useWorkflowStore = useWorkflowStore;
8568
- //# sourceMappingURL=chunk-EFOXN3LC.js.map
8569
- //# sourceMappingURL=chunk-EFOXN3LC.js.map
8669
+ //# sourceMappingURL=chunk-M7KSEUZR.js.map
8670
+ //# sourceMappingURL=chunk-M7KSEUZR.js.map