@datatechsolutions/ui 3.2.1 → 3.3.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 (53) 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.js +115 -115
  4. package/dist/astrlabe/index.mjs +4 -4
  5. package/dist/astrlabe/utils.js +9 -9
  6. package/dist/astrlabe/utils.mjs +2 -2
  7. package/dist/astrlabe/workflow-canvas.js +3 -3
  8. package/dist/astrlabe/workflow-canvas.mjs +2 -2
  9. package/dist/{chunk-QYA53LUF.mjs → chunk-2WXRRQM3.mjs} +21 -4
  10. package/dist/chunk-2WXRRQM3.mjs.map +1 -0
  11. package/dist/{chunk-C3H4FM4A.js → chunk-72SWXOD5.js} +15 -2
  12. package/dist/chunk-72SWXOD5.js.map +1 -0
  13. package/dist/{chunk-H2D2CRTD.mjs → chunk-BR2GAZKG.mjs} +5 -5
  14. package/dist/{chunk-H2D2CRTD.mjs.map → chunk-BR2GAZKG.mjs.map} +1 -1
  15. package/dist/{chunk-NJS2YC3J.js → chunk-DJDZIRM6.js} +12 -2
  16. package/dist/chunk-DJDZIRM6.js.map +1 -0
  17. package/dist/{chunk-5W7L7BT7.mjs → chunk-G7JQ4OCE.mjs} +15 -2
  18. package/dist/chunk-G7JQ4OCE.mjs.map +1 -0
  19. package/dist/{chunk-YIB2YAM5.mjs → chunk-GIQXB3BG.mjs} +3 -3
  20. package/dist/{chunk-YIB2YAM5.mjs.map → chunk-GIQXB3BG.mjs.map} +1 -1
  21. package/dist/{chunk-RL35XATZ.js → chunk-IJAKZHXX.js} +82 -65
  22. package/dist/chunk-IJAKZHXX.js.map +1 -0
  23. package/dist/{chunk-U7XM3N7F.mjs → chunk-LEXBTVGM.mjs} +12 -2
  24. package/dist/chunk-LEXBTVGM.mjs.map +1 -0
  25. package/dist/{chunk-SU3YPWFW.js → chunk-MWPTSBAI.js} +4 -4
  26. package/dist/{chunk-SU3YPWFW.js.map → chunk-MWPTSBAI.js.map} +1 -1
  27. package/dist/{chunk-EFOXN3LC.js → chunk-NJFRJ6YD.js} +279 -19
  28. package/dist/chunk-NJFRJ6YD.js.map +1 -0
  29. package/dist/{chunk-YV72JM4B.mjs → chunk-O6M3KDGT.mjs} +3 -3
  30. package/dist/{chunk-YV72JM4B.mjs.map → chunk-O6M3KDGT.mjs.map} +1 -1
  31. package/dist/{chunk-RGI74SQH.js → chunk-OCELRSLO.js} +4 -4
  32. package/dist/{chunk-RGI74SQH.js.map → chunk-OCELRSLO.js.map} +1 -1
  33. package/dist/{chunk-IRT4T3CU.mjs → chunk-PCYL4MII.mjs} +274 -14
  34. package/dist/chunk-PCYL4MII.mjs.map +1 -0
  35. package/dist/{chunk-Y6AEE56Q.js → chunk-ZL6C2ZAF.js} +29 -29
  36. package/dist/{chunk-Y6AEE56Q.js.map → chunk-ZL6C2ZAF.js.map} +1 -1
  37. package/dist/platform/agents-workspace.js +6 -6
  38. package/dist/platform/agents-workspace.mjs +5 -5
  39. package/dist/platform/index.js +23 -23
  40. package/dist/platform/index.mjs +9 -9
  41. package/dist/platform/pages/index.js +12 -12
  42. package/dist/platform/pages/index.mjs +6 -6
  43. package/dist/platform/workflow-canvas-shell.js +4 -4
  44. package/dist/platform/workflow-canvas-shell.mjs +3 -3
  45. package/package.json +1 -1
  46. package/dist/chunk-5W7L7BT7.mjs.map +0 -1
  47. package/dist/chunk-C3H4FM4A.js.map +0 -1
  48. package/dist/chunk-EFOXN3LC.js.map +0 -1
  49. package/dist/chunk-IRT4T3CU.mjs.map +0 -1
  50. package/dist/chunk-NJS2YC3J.js.map +0 -1
  51. package/dist/chunk-QYA53LUF.mjs.map +0 -1
  52. package/dist/chunk-RL35XATZ.js.map +0 -1
  53. package/dist/chunk-U7XM3N7F.mjs.map +0 -1
@@ -5,7 +5,7 @@ var chunkI2NZGVBG_js = require('./chunk-I2NZGVBG.js');
5
5
  var chunkYXN2K77G_js = require('./chunk-YXN2K77G.js');
6
6
  var chunkF54Q2YJY_js = require('./chunk-F54Q2YJY.js');
7
7
  var chunkP4YYEM4B_js = require('./chunk-P4YYEM4B.js');
8
- var chunkC3H4FM4A_js = require('./chunk-C3H4FM4A.js');
8
+ var chunk72SWXOD5_js = require('./chunk-72SWXOD5.js');
9
9
  var react = require('react');
10
10
  var react$1 = require('@xyflow/react');
11
11
  require('@xyflow/react/dist/style.css');
@@ -373,7 +373,9 @@ var LOGIC_NODE_GRADIENTS = {
373
373
  datasource: "from-cyan-500 to-blue-600",
374
374
  model_provider: "from-slate-500 to-gray-600",
375
375
  dashboard_output: "from-fuchsia-500 to-pink-600",
376
- group: "from-slate-400 to-gray-500"
376
+ group: "from-slate-400 to-gray-500",
377
+ audio_input: "from-teal-400 to-cyan-500",
378
+ speech_transcriber: "from-violet-500 to-purple-600"
377
379
  };
378
380
  var LOGIC_NODE_BADGE_COLORS = {
379
381
  start: "bg-green-100 text-green-700 dark:bg-green-500/20 dark:text-green-300",
@@ -398,7 +400,9 @@ var LOGIC_NODE_BADGE_COLORS = {
398
400
  datasource: "bg-cyan-100 text-cyan-700 dark:bg-cyan-500/20 dark:text-cyan-300",
399
401
  model_provider: "bg-slate-100 text-slate-700 dark:bg-slate-500/20 dark:text-slate-300",
400
402
  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"
403
+ group: "bg-slate-100 text-slate-700 dark:bg-slate-500/20 dark:text-slate-300",
404
+ audio_input: "bg-teal-100 text-teal-700 dark:bg-teal-500/20 dark:text-teal-300",
405
+ speech_transcriber: "bg-violet-100 text-violet-700 dark:bg-violet-500/20 dark:text-violet-300"
402
406
  };
403
407
  var LOGIC_NODE_BADGE_SOFT_COLORS = {
404
408
  start: "bg-green-50 text-green-600 dark:bg-green-500/20 dark:text-green-400",
@@ -423,7 +427,9 @@ var LOGIC_NODE_BADGE_SOFT_COLORS = {
423
427
  datasource: "bg-cyan-50 text-cyan-600 dark:bg-cyan-500/20 dark:text-cyan-400",
424
428
  model_provider: "bg-slate-50 text-slate-600 dark:bg-slate-500/20 dark:text-slate-400",
425
429
  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"
430
+ group: "bg-slate-50 text-slate-600 dark:bg-slate-500/20 dark:text-slate-400",
431
+ audio_input: "bg-teal-50 text-teal-600 dark:bg-teal-500/20 dark:text-teal-400",
432
+ speech_transcriber: "bg-violet-50 text-violet-600 dark:bg-violet-500/20 dark:text-violet-400"
427
433
  };
428
434
  var LOGIC_ICON_MAP = {
429
435
  start: outline.PlayIcon,
@@ -448,7 +454,9 @@ var LOGIC_ICON_MAP = {
448
454
  datasource: outline.ServerStackIcon,
449
455
  model_provider: outline.KeyIcon,
450
456
  dashboard_output: outline.ChartBarIcon,
451
- group: outline.RectangleGroupIcon
457
+ group: outline.RectangleGroupIcon,
458
+ audio_input: outline.MicrophoneIcon,
459
+ speech_transcriber: outline.SpeakerWaveIcon
452
460
  };
453
461
  var EXPERIMENTAL_NODE_TYPES = /* @__PURE__ */ new Set([
454
462
  "document_extractor",
@@ -484,7 +492,9 @@ var NODE_BORDER_COLORS = {
484
492
  list_operator: "border-lime-300/50 dark:border-lime-600/50",
485
493
  note: "border-gray-200/50 dark:border-gray-700/50",
486
494
  datasource: "border-cyan-300/50 dark:border-cyan-600/50",
487
- model_provider: "border-slate-300/50 dark:border-slate-600/50"
495
+ model_provider: "border-slate-300/50 dark:border-slate-600/50",
496
+ audio_input: "border-teal-300/50 dark:border-teal-600/50",
497
+ speech_transcriber: "border-violet-300/50 dark:border-violet-600/50"
488
498
  };
489
499
  function getNodeStateClass(selected, nodeType, customBorder) {
490
500
  if (selected) return NODE_SELECTED_CLASS;
@@ -574,7 +584,9 @@ var INSERTABLE_NODES = [
574
584
  { nodeType: "knowledge_base", nameKey: "knowledgeBaseNode", subcategory: "AI" },
575
585
  { nodeType: "answer", nameKey: "answerNode", subcategory: "AI" },
576
586
  { nodeType: "question_classifier", nameKey: "questionClassifierNode", subcategory: "AI" },
577
- { nodeType: "parameter_extractor", nameKey: "parameterExtractorNode", subcategory: "AI" }
587
+ { nodeType: "parameter_extractor", nameKey: "parameterExtractorNode", subcategory: "AI" },
588
+ { nodeType: "audio_input", nameKey: "audioInputNode", subcategory: "AI" },
589
+ { nodeType: "speech_transcriber", nameKey: "speechTranscriberNode", subcategory: "AI" }
578
590
  ];
579
591
  function EdgeInsertPopupComponent({ position, onSelect, onClose }) {
580
592
  const tWorkflow = chunkYXN2K77G_js.useTranslations("agents.workflow");
@@ -2106,7 +2118,7 @@ var AgentFlowNode = react.memo(function AgentFlowNode2({ id, data, selected }) {
2106
2118
  /* @__PURE__ */ jsxRuntime.jsx(NodeCardMeta, { compact: isCompact, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-1.5", children: [
2107
2119
  /* @__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
2120
  (() => {
2109
- const tier = chunkC3H4FM4A_js.getAgentTier(Number(data.agent.elo ?? 0));
2121
+ const tier = chunk72SWXOD5_js.getAgentTier(Number(data.agent.elo ?? 0));
2110
2122
  return /* @__PURE__ */ jsxRuntime.jsx(NodeCardBadge, { className: `rounded-full px-2 py-0.5 text-[10px] font-bold ${tier.pillColor}`, children: tier.key });
2111
2123
  })(),
2112
2124
  /* @__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: [
@@ -3795,6 +3807,90 @@ var GroupFlowNode = react.memo(function GroupFlowNode2({ id, data, selected }) {
3795
3807
  /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "source", position: react$1.Position.Right, id: "right-out", colorClass: "!bg-slate-500" })
3796
3808
  ] });
3797
3809
  });
3810
+ var AudioInputFlowNode = react.memo(function AudioInputFlowNode2({ id, data, selected }) {
3811
+ const { config, label, onDelete, onEdit } = data;
3812
+ const isCompact = data.displayMode === "compact";
3813
+ const urlPreview = config.url ? config.url.slice(0, 32) : "";
3814
+ const formatLabel = config.format && config.format.length > 0 ? config.format : "auto";
3815
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3816
+ /* @__PURE__ */ jsxRuntime.jsx(NodeRunningIndicator, { nodeId: id }),
3817
+ /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "target", position: react$1.Position.Left, id: "left-in", colorClass: "!bg-teal-500" }),
3818
+ /* @__PURE__ */ jsxRuntime.jsxs(
3819
+ NodeInteractiveCard,
3820
+ {
3821
+ nodeId: id,
3822
+ onEdit,
3823
+ compact: isCompact,
3824
+ selected,
3825
+ nodeType: "audio_input",
3826
+ children: [
3827
+ /* @__PURE__ */ jsxRuntime.jsx(
3828
+ NodeCardHeader,
3829
+ {
3830
+ icon: /* @__PURE__ */ jsxRuntime.jsx(NodeIconBubble, { tone: "audio_input", children: /* @__PURE__ */ jsxRuntime.jsx(outline.MicrophoneIcon, { className: "h-5 w-5 text-white" }) }),
3831
+ title: label,
3832
+ description: "Validates an audio source URL for downstream voice nodes",
3833
+ compact: isCompact,
3834
+ iconClassName: ""
3835
+ }
3836
+ ),
3837
+ /* @__PURE__ */ jsxRuntime.jsxs(NodeCardMeta, { compact: isCompact, children: [
3838
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
3839
+ /* @__PURE__ */ jsxRuntime.jsx(NodeCardBadge, { tone: "audio_input", children: "Audio Input" }),
3840
+ /* @__PURE__ */ jsxRuntime.jsx(NodeCardBadge, { tone: "audio_input", soft: true, children: formatLabel }),
3841
+ urlPreview && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-[10px] text-gray-400 dark:text-gray-500", children: urlPreview })
3842
+ ] }),
3843
+ /* @__PURE__ */ jsxRuntime.jsx(NodeCardDeleteAction, { nodeId: id, onDelete })
3844
+ ] })
3845
+ ]
3846
+ }
3847
+ ),
3848
+ /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "source", position: react$1.Position.Right, id: "right-out", colorClass: "!bg-teal-500" })
3849
+ ] });
3850
+ });
3851
+ var SpeechTranscriberFlowNode = react.memo(function SpeechTranscriberFlowNode2({ id, data, selected }) {
3852
+ const { config, label, onDelete, onEdit } = data;
3853
+ const isCompact = data.displayMode === "compact";
3854
+ const model = config.model && config.model.length > 0 ? config.model : "whisper-1";
3855
+ const language = config.language && config.language.length > 0 ? config.language : "auto";
3856
+ const audioRefPreview = config.audioUrl ? config.audioUrl.slice(0, 32) : "";
3857
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3858
+ /* @__PURE__ */ jsxRuntime.jsx(NodeRunningIndicator, { nodeId: id }),
3859
+ /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "target", position: react$1.Position.Left, id: "left-in", colorClass: "!bg-violet-500" }),
3860
+ /* @__PURE__ */ jsxRuntime.jsxs(
3861
+ NodeInteractiveCard,
3862
+ {
3863
+ nodeId: id,
3864
+ onEdit,
3865
+ compact: isCompact,
3866
+ selected,
3867
+ nodeType: "speech_transcriber",
3868
+ children: [
3869
+ /* @__PURE__ */ jsxRuntime.jsx(
3870
+ NodeCardHeader,
3871
+ {
3872
+ icon: /* @__PURE__ */ jsxRuntime.jsx(NodeIconBubble, { tone: "speech_transcriber", children: /* @__PURE__ */ jsxRuntime.jsx(outline.SpeakerWaveIcon, { className: "h-5 w-5 text-white" }) }),
3873
+ title: label,
3874
+ description: "Transcribes audio via OpenAI Whisper-compatible endpoints",
3875
+ compact: isCompact,
3876
+ iconClassName: ""
3877
+ }
3878
+ ),
3879
+ /* @__PURE__ */ jsxRuntime.jsxs(NodeCardMeta, { compact: isCompact, children: [
3880
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
3881
+ /* @__PURE__ */ jsxRuntime.jsx(NodeCardBadge, { tone: "speech_transcriber", children: "Whisper" }),
3882
+ /* @__PURE__ */ jsxRuntime.jsx(NodeCardBadge, { tone: "speech_transcriber", soft: true, children: model }),
3883
+ /* @__PURE__ */ jsxRuntime.jsx(NodeCardBadge, { tone: "speech_transcriber", soft: true, children: language }),
3884
+ audioRefPreview && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-[10px] text-gray-400 dark:text-gray-500", children: audioRefPreview })
3885
+ ] }),
3886
+ /* @__PURE__ */ jsxRuntime.jsx(NodeCardDeleteAction, { nodeId: id, onDelete })
3887
+ ] })
3888
+ ]
3889
+ }
3890
+ ),
3891
+ /* @__PURE__ */ jsxRuntime.jsx(WorkflowHandle, { type: "source", position: react$1.Position.Right, id: "right-out", colorClass: "!bg-violet-500" })
3892
+ ] });
3893
+ });
3798
3894
  function ConfigFormActions({
3799
3895
  cancelLabel,
3800
3896
  saveLabel,
@@ -6246,6 +6342,160 @@ function AgentNodeConfigForm({
6246
6342
  )
6247
6343
  ] });
6248
6344
  }
6345
+ var AUDIO_FORMATS = ["auto", "mp3", "wav", "m4a", "webm", "ogg", "flac", "mp4", "mpga"];
6346
+ function AudioInputNodeConfigForm({ config, onSave, onCancel }) {
6347
+ const t = chunkYXN2K77G_js.useTranslations("agents.workflow.audioInputNodeConfig");
6348
+ const [url, setUrl] = react.useState(config.url ?? "");
6349
+ const [format, setFormat] = react.useState(config.format && config.format.length > 0 ? config.format : "auto");
6350
+ const handleSave = () => {
6351
+ onSave({
6352
+ ...config,
6353
+ url,
6354
+ format: format === "auto" ? void 0 : format
6355
+ });
6356
+ };
6357
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
6358
+ /* @__PURE__ */ jsxRuntime.jsx(
6359
+ chunkI2NZGVBG_js.FormInput,
6360
+ {
6361
+ type: "text",
6362
+ label: t("urlLabel"),
6363
+ value: url,
6364
+ onValueChange: setUrl,
6365
+ placeholder: t("urlPlaceholder")
6366
+ }
6367
+ ),
6368
+ /* @__PURE__ */ jsxRuntime.jsx(
6369
+ chunkI2NZGVBG_js.FormSelect,
6370
+ {
6371
+ label: t("formatLabel"),
6372
+ value: format,
6373
+ onValueChange: setFormat,
6374
+ options: AUDIO_FORMATS.map((option) => ({ value: option, label: option }))
6375
+ }
6376
+ ),
6377
+ /* @__PURE__ */ jsxRuntime.jsx(
6378
+ ConfigFormActions,
6379
+ {
6380
+ cancelLabel: t("cancel"),
6381
+ saveLabel: t("save"),
6382
+ onCancel,
6383
+ onSave: handleSave
6384
+ }
6385
+ )
6386
+ ] });
6387
+ }
6388
+ var RESPONSE_FORMATS = [
6389
+ "verbose_json",
6390
+ "json",
6391
+ "text"
6392
+ ];
6393
+ function SpeechTranscriberNodeConfigForm({ config, onSave, onCancel }) {
6394
+ const t = chunkYXN2K77G_js.useTranslations("agents.workflow.speechTranscriberNodeConfig");
6395
+ const [audioUrl, setAudioUrl] = react.useState(config.audioUrl ?? "");
6396
+ const [model, setModel] = react.useState(config.model ?? "whisper-1");
6397
+ const [language, setLanguage] = react.useState(config.language ?? "");
6398
+ const [prompt, setPrompt] = react.useState(config.prompt ?? "");
6399
+ const [responseFormat, setResponseFormat] = react.useState(
6400
+ config.responseFormat ?? "verbose_json"
6401
+ );
6402
+ const [endpoint, setEndpoint] = react.useState(config.endpoint ?? "");
6403
+ const [timeoutMs, setTimeoutMs] = react.useState(config.timeoutMs ?? 12e4);
6404
+ const handleSave = () => {
6405
+ onSave({
6406
+ ...config,
6407
+ audioUrl,
6408
+ model: model.trim() || void 0,
6409
+ language: language.trim() || void 0,
6410
+ prompt: prompt.trim() || void 0,
6411
+ responseFormat,
6412
+ endpoint: endpoint.trim() || void 0,
6413
+ timeoutMs
6414
+ });
6415
+ };
6416
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
6417
+ /* @__PURE__ */ jsxRuntime.jsx(
6418
+ chunkI2NZGVBG_js.FormInput,
6419
+ {
6420
+ type: "text",
6421
+ label: t("audioUrlLabel"),
6422
+ value: audioUrl,
6423
+ onValueChange: setAudioUrl,
6424
+ placeholder: t("audioUrlPlaceholder")
6425
+ }
6426
+ ),
6427
+ /* @__PURE__ */ jsxRuntime.jsx(
6428
+ chunkI2NZGVBG_js.FormInput,
6429
+ {
6430
+ type: "text",
6431
+ label: t("modelLabel"),
6432
+ value: model,
6433
+ onValueChange: setModel,
6434
+ placeholder: "whisper-1"
6435
+ }
6436
+ ),
6437
+ /* @__PURE__ */ jsxRuntime.jsx(
6438
+ chunkI2NZGVBG_js.FormInput,
6439
+ {
6440
+ type: "text",
6441
+ label: t("languageLabel"),
6442
+ value: language,
6443
+ onValueChange: setLanguage,
6444
+ placeholder: t("languagePlaceholder")
6445
+ }
6446
+ ),
6447
+ /* @__PURE__ */ jsxRuntime.jsx(
6448
+ chunkI2NZGVBG_js.FormTextarea,
6449
+ {
6450
+ label: t("promptLabel"),
6451
+ value: prompt,
6452
+ onValueChange: setPrompt,
6453
+ placeholder: t("promptPlaceholder"),
6454
+ rows: 3
6455
+ }
6456
+ ),
6457
+ /* @__PURE__ */ jsxRuntime.jsx(
6458
+ chunkI2NZGVBG_js.FormSelect,
6459
+ {
6460
+ label: t("responseFormatLabel"),
6461
+ value: responseFormat,
6462
+ onValueChange: (value) => setResponseFormat(value),
6463
+ options: RESPONSE_FORMATS.map((value) => ({ value, label: value }))
6464
+ }
6465
+ ),
6466
+ /* @__PURE__ */ jsxRuntime.jsx(
6467
+ chunkI2NZGVBG_js.FormInput,
6468
+ {
6469
+ type: "text",
6470
+ label: t("endpointLabel"),
6471
+ value: endpoint,
6472
+ onValueChange: setEndpoint,
6473
+ placeholder: t("endpointPlaceholder")
6474
+ }
6475
+ ),
6476
+ /* @__PURE__ */ jsxRuntime.jsx(
6477
+ chunkI2NZGVBG_js.FormInput,
6478
+ {
6479
+ type: "number",
6480
+ label: t("timeoutLabel"),
6481
+ value: String(timeoutMs),
6482
+ onValueChange: (value) => setTimeoutMs(Number(value)),
6483
+ min: 1e3,
6484
+ max: 6e5,
6485
+ step: 1e3
6486
+ }
6487
+ ),
6488
+ /* @__PURE__ */ jsxRuntime.jsx(
6489
+ ConfigFormActions,
6490
+ {
6491
+ cancelLabel: t("cancel"),
6492
+ saveLabel: t("save"),
6493
+ onCancel,
6494
+ onSave: handleSave
6495
+ }
6496
+ )
6497
+ ] });
6498
+ }
6249
6499
  var NODE_TITLE_KEYS = {
6250
6500
  start: "startNodeConfig",
6251
6501
  end: "endNodeConfig",
@@ -6269,7 +6519,9 @@ var NODE_TITLE_KEYS = {
6269
6519
  group: "groupNodeConfig",
6270
6520
  model_provider: "modelProviderNodeConfig",
6271
6521
  rule: "ruleNodeConfig",
6272
- agent: "agentNodeConfig"
6522
+ agent: "agentNodeConfig",
6523
+ audio_input: "audioInputNodeConfig",
6524
+ speech_transcriber: "speechTranscriberNodeConfig"
6273
6525
  };
6274
6526
  function LogicNodeModal({ onSave, entities = [], datasources = [], onLoadTables, onLoadSchema }) {
6275
6527
  const t = chunkYXN2K77G_js.useTranslations("agents.workflow");
@@ -6336,6 +6588,10 @@ function LogicNodeModal({ onSave, entities = [], datasources = [], onLoadTables,
6336
6588
  return /* @__PURE__ */ jsxRuntime.jsx(RuleNodeConfigForm, { config, onSave: handleSave, onCancel: closeModal });
6337
6589
  case "agent":
6338
6590
  return /* @__PURE__ */ jsxRuntime.jsx(AgentNodeConfigForm, { config, onSave: handleSave, onCancel: closeModal });
6591
+ case "audio_input":
6592
+ return /* @__PURE__ */ jsxRuntime.jsx(AudioInputNodeConfigForm, { config, onSave: handleSave, onCancel: closeModal });
6593
+ case "speech_transcriber":
6594
+ return /* @__PURE__ */ jsxRuntime.jsx(SpeechTranscriberNodeConfigForm, { config, onSave: handleSave, onCancel: closeModal });
6339
6595
  default:
6340
6596
  return null;
6341
6597
  }
@@ -6719,7 +6975,9 @@ var BUILT_IN_NODE_TYPES = {
6719
6975
  note: NoteFlowNode,
6720
6976
  datasource: DatasourceFlowNode,
6721
6977
  model_provider: ModelProviderFlowNode,
6722
- group: GroupFlowNode
6978
+ group: GroupFlowNode,
6979
+ audio_input: AudioInputFlowNode,
6980
+ speech_transcriber: SpeechTranscriberFlowNode
6723
6981
  };
6724
6982
  var ALL_LOGIC_NODE_TYPES = [
6725
6983
  "start",
@@ -6745,7 +7003,9 @@ var ALL_LOGIC_NODE_TYPES = [
6745
7003
  "entity",
6746
7004
  "datasource",
6747
7005
  "model_provider",
6748
- "group"
7006
+ "group",
7007
+ "audio_input",
7008
+ "speech_transcriber"
6749
7009
  ];
6750
7010
  function isLogicNodeType(nodeType) {
6751
7011
  return ALL_LOGIC_NODE_TYPES.includes(nodeType);
@@ -7083,7 +7343,7 @@ function WorkflowCanvasInner({
7083
7343
  };
7084
7344
  }
7085
7345
  if (isLogicNodeType(savedNode.type)) {
7086
- const config = savedNode.data.config ?? chunkC3H4FM4A_js.createDefaultLogicNodeConfig(savedNode.type);
7346
+ const config = savedNode.data.config ?? chunk72SWXOD5_js.createDefaultLogicNodeConfig(savedNode.type);
7087
7347
  if (config) {
7088
7348
  const baseNode = {
7089
7349
  id: savedNode.id,
@@ -7262,7 +7522,7 @@ function WorkflowCanvasInner({
7262
7522
  }
7263
7523
  storeTakeSnapshot();
7264
7524
  const isTB = direction === "TB";
7265
- const repositionedNodes = chunkC3H4FM4A_js.applyDagreLayout(nodes, edges, direction).map((node) => ({
7525
+ const repositionedNodes = chunk72SWXOD5_js.applyDagreLayout(nodes, edges, direction).map((node) => ({
7266
7526
  ...node,
7267
7527
  sourcePosition: isTB ? react$1.Position.Bottom : react$1.Position.Right,
7268
7528
  targetPosition: isTB ? react$1.Position.Top : react$1.Position.Left
@@ -7391,7 +7651,7 @@ function WorkflowCanvasInner({
7391
7651
  }, [storePaste]);
7392
7652
  const contextMenuAddNote = react.useCallback((flowPosition) => {
7393
7653
  storeTakeSnapshot();
7394
- const noteConfig = chunkC3H4FM4A_js.createDefaultLogicNodeConfig("note");
7654
+ const noteConfig = chunk72SWXOD5_js.createDefaultLogicNodeConfig("note");
7395
7655
  const noteNode = {
7396
7656
  id: crypto.randomUUID(),
7397
7657
  type: "note",
@@ -7902,7 +8162,7 @@ function WorkflowCanvasInner({
7902
8162
  };
7903
8163
  setNodes((currentNodes) => [...currentNodes, newNode]);
7904
8164
  } else if (nodeType === "group") {
7905
- const groupConfig = configRaw ? JSON.parse(configRaw) : chunkC3H4FM4A_js.createDefaultLogicNodeConfig("group");
8165
+ const groupConfig = configRaw ? JSON.parse(configRaw) : chunk72SWXOD5_js.createDefaultLogicNodeConfig("group");
7906
8166
  if (!groupConfig) return;
7907
8167
  const newNode = {
7908
8168
  id: newNodeId,
@@ -7919,7 +8179,7 @@ function WorkflowCanvasInner({
7919
8179
  };
7920
8180
  setNodes((currentNodes) => [...currentNodes, newNode]);
7921
8181
  } else if (isLogicNodeType(nodeType)) {
7922
- const config = configRaw ? JSON.parse(configRaw) : chunkC3H4FM4A_js.createDefaultLogicNodeConfig(nodeType);
8182
+ const config = configRaw ? JSON.parse(configRaw) : chunk72SWXOD5_js.createDefaultLogicNodeConfig(nodeType);
7923
8183
  if (!config) return;
7924
8184
  const newNode = {
7925
8185
  id: newNodeId,
@@ -8057,7 +8317,7 @@ function WorkflowCanvasInner({
8057
8317
  (edgeId, nodeType, position) => {
8058
8318
  if (!isLogicNodeType(nodeType)) return;
8059
8319
  storeTakeSnapshot();
8060
- const config = chunkC3H4FM4A_js.createDefaultLogicNodeConfig(nodeType);
8320
+ const config = chunk72SWXOD5_js.createDefaultLogicNodeConfig(nodeType);
8061
8321
  if (!config) return;
8062
8322
  const newNodeId = crypto.randomUUID();
8063
8323
  const newNode = {
@@ -8565,5 +8825,5 @@ exports.useModalStore = useModalStore;
8565
8825
  exports.useWorkflowBuilderClient = useWorkflowBuilderClient;
8566
8826
  exports.useWorkflowBuilderClientOptional = useWorkflowBuilderClientOptional;
8567
8827
  exports.useWorkflowStore = useWorkflowStore;
8568
- //# sourceMappingURL=chunk-EFOXN3LC.js.map
8569
- //# sourceMappingURL=chunk-EFOXN3LC.js.map
8828
+ //# sourceMappingURL=chunk-NJFRJ6YD.js.map
8829
+ //# sourceMappingURL=chunk-NJFRJ6YD.js.map