@datatechsolutions/ui 2.11.92 → 2.11.93

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +39 -58
  2. package/dist/astrlabe/contracts.d.mts +14 -3
  3. package/dist/astrlabe/contracts.d.ts +14 -3
  4. package/dist/astrlabe/index.d.mts +9 -3
  5. package/dist/astrlabe/index.d.ts +9 -3
  6. package/dist/astrlabe/index.js +118 -114
  7. package/dist/astrlabe/index.mjs +4 -4
  8. package/dist/astrlabe/utils.d.mts +1 -1
  9. package/dist/astrlabe/utils.d.ts +1 -1
  10. package/dist/astrlabe/utils.js +9 -9
  11. package/dist/astrlabe/utils.mjs +2 -2
  12. package/dist/astrlabe/workflow-canvas.d.mts +1 -1
  13. package/dist/astrlabe/workflow-canvas.d.ts +1 -1
  14. package/dist/astrlabe/workflow-canvas.js +3 -3
  15. package/dist/astrlabe/workflow-canvas.mjs +2 -2
  16. package/dist/{chunk-FUVJHNNI.js → chunk-3Z366CVM.js} +29 -29
  17. package/dist/{chunk-FUVJHNNI.js.map → chunk-3Z366CVM.js.map} +1 -1
  18. package/dist/{chunk-WNCPAWLC.mjs → chunk-5W7L7BT7.mjs} +13 -2
  19. package/dist/chunk-5W7L7BT7.mjs.map +1 -0
  20. package/dist/{chunk-C7BI5LQ6.js → chunk-C3H4FM4A.js} +13 -2
  21. package/dist/chunk-C3H4FM4A.js.map +1 -0
  22. package/dist/{chunk-SFVSDGNF.js → chunk-FZTOP6EE.js} +113 -55
  23. package/dist/chunk-FZTOP6EE.js.map +1 -0
  24. package/dist/{chunk-WI663467.mjs → chunk-GMZ3PTNK.mjs} +5 -5
  25. package/dist/{chunk-WI663467.mjs.map → chunk-GMZ3PTNK.mjs.map} +1 -1
  26. package/dist/{chunk-3PKG4KFY.mjs → chunk-HUGHELRM.mjs} +64 -7
  27. package/dist/chunk-HUGHELRM.mjs.map +1 -0
  28. package/dist/{chunk-5UU3RQRB.js → chunk-NJS2YC3J.js} +15 -2
  29. package/dist/chunk-NJS2YC3J.js.map +1 -0
  30. package/dist/{chunk-XXYDLYIT.js → chunk-NYQAEPC7.js} +138 -12
  31. package/dist/chunk-NYQAEPC7.js.map +1 -0
  32. package/dist/{chunk-RELMVNNR.mjs → chunk-OLXOBT42.mjs} +3 -3
  33. package/dist/{chunk-RELMVNNR.mjs.map → chunk-OLXOBT42.mjs.map} +1 -1
  34. package/dist/{chunk-MZAS6TG4.mjs → chunk-RXFAQFE7.mjs} +3 -3
  35. package/dist/{chunk-MZAS6TG4.mjs.map → chunk-RXFAQFE7.mjs.map} +1 -1
  36. package/dist/{chunk-DADFESAQ.js → chunk-SMKN4ZVB.js} +4 -4
  37. package/dist/{chunk-DADFESAQ.js.map → chunk-SMKN4ZVB.js.map} +1 -1
  38. package/dist/{chunk-TBPWMPZU.js → chunk-ST3GH5OM.js} +4 -4
  39. package/dist/{chunk-TBPWMPZU.js.map → chunk-ST3GH5OM.js.map} +1 -1
  40. package/dist/{chunk-3SUFSAP6.mjs → chunk-TEQYIK2B.mjs} +125 -7
  41. package/dist/chunk-TEQYIK2B.mjs.map +1 -0
  42. package/dist/{chunk-53SRKVKQ.mjs → chunk-U7XM3N7F.mjs} +15 -2
  43. package/dist/chunk-U7XM3N7F.mjs.map +1 -0
  44. package/dist/{index-AioB90qq.d.mts → index-CoB18TbG.d.ts} +9 -2
  45. package/dist/{index-D5ai0cGZ.d.ts → index-VI9gyJXl.d.mts} +9 -2
  46. package/dist/platform/agents-workspace.js +6 -6
  47. package/dist/platform/agents-workspace.mjs +5 -5
  48. package/dist/platform/index.d.mts +1 -1
  49. package/dist/platform/index.d.ts +1 -1
  50. package/dist/platform/index.js +17 -17
  51. package/dist/platform/index.mjs +8 -8
  52. package/dist/platform/pages/index.d.mts +3 -3
  53. package/dist/platform/pages/index.d.ts +3 -3
  54. package/dist/platform/pages/index.js +12 -12
  55. package/dist/platform/pages/index.mjs +6 -6
  56. package/dist/platform/workflow-api-client.d.mts +2 -2
  57. package/dist/platform/workflow-api-client.d.ts +2 -2
  58. package/dist/platform/workflow-canvas-shell.js +4 -4
  59. package/dist/platform/workflow-canvas-shell.mjs +3 -3
  60. package/dist/{workflow-api-client-zVtc8FIl.d.ts → workflow-api-client-DVLhcpUj.d.ts} +1 -1
  61. package/dist/{workflow-api-client-wLoap-tt.d.mts → workflow-api-client-DpBxHTHr.d.mts} +1 -1
  62. package/package.json +1 -1
  63. package/dist/chunk-3PKG4KFY.mjs.map +0 -1
  64. package/dist/chunk-3SUFSAP6.mjs.map +0 -1
  65. package/dist/chunk-53SRKVKQ.mjs.map +0 -1
  66. package/dist/chunk-5UU3RQRB.js.map +0 -1
  67. package/dist/chunk-C7BI5LQ6.js.map +0 -1
  68. package/dist/chunk-SFVSDGNF.js.map +0 -1
  69. package/dist/chunk-WNCPAWLC.mjs.map +0 -1
  70. package/dist/chunk-XXYDLYIT.js.map +0 -1
@@ -1,15 +1,57 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkXXYDLYIT_js = require('./chunk-XXYDLYIT.js');
4
+ var chunkNYQAEPC7_js = require('./chunk-NYQAEPC7.js');
5
5
  var chunkZKUYNCAG_js = require('./chunk-ZKUYNCAG.js');
6
6
  var chunkYXN2K77G_js = require('./chunk-YXN2K77G.js');
7
- var chunkC7BI5LQ6_js = require('./chunk-C7BI5LQ6.js');
7
+ var chunkC3H4FM4A_js = require('./chunk-C3H4FM4A.js');
8
8
  var react = require('react');
9
+ var react$1 = require('@xyflow/react');
9
10
  var outline = require('@heroicons/react/24/outline');
10
11
  var jsxRuntime = require('react/jsx-runtime');
11
12
  var zustand = require('zustand');
12
13
 
14
+ var S3WriteFlowNode = react.memo(function S3WriteFlowNode2({ id, data, selected }) {
15
+ const t = chunkYXN2K77G_js.useTranslations("agents.workflow");
16
+ const { config, label, onDelete, onEdit } = data;
17
+ const isCompact = data.displayMode === "compact";
18
+ const keyPreview = config.key ? config.key.slice(0, 30) : "";
19
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
20
+ /* @__PURE__ */ jsxRuntime.jsx(chunkNYQAEPC7_js.NodeRunningIndicator, { nodeId: id }),
21
+ /* @__PURE__ */ jsxRuntime.jsx(chunkNYQAEPC7_js.WorkflowHandle, { type: "target", position: react$1.Position.Left, id: "left-in", colorClass: "!bg-cyan-500" }),
22
+ /* @__PURE__ */ jsxRuntime.jsxs(
23
+ chunkNYQAEPC7_js.NodeInteractiveCard,
24
+ {
25
+ nodeId: id,
26
+ onEdit,
27
+ compact: isCompact,
28
+ selected,
29
+ nodeType: "s3_write",
30
+ children: [
31
+ /* @__PURE__ */ jsxRuntime.jsx(
32
+ chunkNYQAEPC7_js.NodeCardHeader,
33
+ {
34
+ icon: /* @__PURE__ */ jsxRuntime.jsx(chunkNYQAEPC7_js.NodeIconBubble, { tone: "s3_write", children: /* @__PURE__ */ jsxRuntime.jsx(outline.CloudArrowUpIcon, { className: "h-5 w-5 text-white" }) }),
35
+ title: label,
36
+ description: t("s3WriteNodeDescription"),
37
+ compact: isCompact,
38
+ iconClassName: ""
39
+ }
40
+ ),
41
+ /* @__PURE__ */ jsxRuntime.jsxs(chunkNYQAEPC7_js.NodeCardMeta, { compact: isCompact, children: [
42
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
43
+ /* @__PURE__ */ jsxRuntime.jsx(chunkNYQAEPC7_js.NodeCardBadge, { tone: "s3_write", children: t("s3WriteNode") }),
44
+ config.bucket && /* @__PURE__ */ jsxRuntime.jsx(chunkNYQAEPC7_js.NodeCardBadge, { tone: "s3_write", soft: true, children: config.bucket }),
45
+ keyPreview && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-[10px] text-gray-400 dark:text-gray-500", children: keyPreview })
46
+ ] }),
47
+ /* @__PURE__ */ jsxRuntime.jsx(chunkNYQAEPC7_js.NodeCardDeleteAction, { nodeId: id, onDelete })
48
+ ] })
49
+ ]
50
+ }
51
+ ),
52
+ /* @__PURE__ */ jsxRuntime.jsx(chunkNYQAEPC7_js.WorkflowHandle, { type: "source", position: react$1.Position.Right, id: "right-out", colorClass: "!bg-cyan-500" })
53
+ ] });
54
+ });
13
55
  function AnthropicModelIcon({ className }) {
14
56
  return /* @__PURE__ */ jsxRuntime.jsx("svg", { role: "img", viewBox: "0 0 24 24", fill: "currentColor", className, "aria-label": "Anthropic", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M17.3041 3.541h-3.6718l6.696 16.918H24Zm-10.6082 0L0 20.459h3.7442l1.3693-3.5527h7.0052l1.3693 3.5528h3.7442L10.5363 3.5409Zm-.3712 10.2232 2.2914-5.9456 2.2914 5.9456Z" }) });
15
57
  }
@@ -283,7 +325,7 @@ function OutputCard({ label, value }) {
283
325
  function AgentProfileHeader({ agent, models, t, selectedModelId, setSelectedModelId, selectedFramework, temperature, setTemperature, elo, setElo, onChanged }) {
284
326
  const modelName = models.find((model) => model.id === selectedModelId)?.name ?? selectedModelId ?? "\u2014";
285
327
  const avatarUrl = agent.avatar;
286
- const frameworkMeta = chunkXXYDLYIT_js.getFrameworkMeta(selectedFramework);
328
+ const frameworkMeta = chunkNYQAEPC7_js.getFrameworkMeta(selectedFramework);
287
329
  const tierInfo = getEloTier(elo);
288
330
  const difficultyConfig = {
289
331
  beginner: { color: "bg-cyan-100 text-cyan-700 dark:bg-cyan-900/30 dark:text-cyan-400", labelKey: "agentDrawer.tierBeginner" },
@@ -559,13 +601,13 @@ function AgentCapabilityCard({ elo, setElo, models, selectedModelId, setSelected
559
601
  ] });
560
602
  }
561
603
  function ConfigTab({ models, t, selectedModelId, setSelectedModelId, selectedFramework, setSelectedFramework, markDirty, connectedProviderTypes }) {
562
- const frameworkKeys = Object.keys(chunkXXYDLYIT_js.FRAMEWORK_META);
604
+ const frameworkKeys = Object.keys(chunkNYQAEPC7_js.FRAMEWORK_META);
563
605
  const hasProviderConstraints = connectedProviderTypes.length > 0;
564
- const compatibleModels = chunkXXYDLYIT_js.getCompatibleModels(models, selectedFramework);
606
+ const compatibleModels = chunkNYQAEPC7_js.getCompatibleModels(models, selectedFramework);
565
607
  const handleFrameworkChange = react.useCallback((newFramework) => {
566
608
  setSelectedFramework(newFramework);
567
- if (!chunkXXYDLYIT_js.isModelCompatibleWithFramework(selectedModelId, newFramework)) {
568
- const compatible = chunkXXYDLYIT_js.getCompatibleModels(models, newFramework);
609
+ if (!chunkNYQAEPC7_js.isModelCompatibleWithFramework(selectedModelId, newFramework)) {
610
+ const compatible = chunkNYQAEPC7_js.getCompatibleModels(models, newFramework);
569
611
  if (compatible.length > 0) {
570
612
  setSelectedModelId(compatible[0].id);
571
613
  }
@@ -576,10 +618,10 @@ function ConfigTab({ models, t, selectedModelId, setSelectedModelId, selectedFra
576
618
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
577
619
  /* @__PURE__ */ jsxRuntime.jsx("label", { className: "mb-2 block text-xs font-medium text-gray-500 dark:text-gray-400", children: t("agentDrawer.framework") }),
578
620
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1.5", children: frameworkKeys.map((key) => {
579
- const meta = chunkXXYDLYIT_js.FRAMEWORK_META[key];
621
+ const meta = chunkNYQAEPC7_js.FRAMEWORK_META[key];
580
622
  const isSelected = key === selectedFramework;
581
- const compatCount = chunkXXYDLYIT_js.getCompatibleModels(models, key).length;
582
- const isCompatibleWithProviders = !hasProviderConstraints || chunkXXYDLYIT_js.isFrameworkCompatibleWithProviders(key, connectedProviderTypes);
623
+ const compatCount = chunkNYQAEPC7_js.getCompatibleModels(models, key).length;
624
+ const isCompatibleWithProviders = !hasProviderConstraints || chunkNYQAEPC7_js.isFrameworkCompatibleWithProviders(key, connectedProviderTypes);
583
625
  return /* @__PURE__ */ jsxRuntime.jsxs(
584
626
  "button",
585
627
  {
@@ -611,7 +653,7 @@ function ConfigTab({ models, t, selectedModelId, setSelectedModelId, selectedFra
611
653
  ] }),
612
654
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-2 gap-2", children: models.map((model) => {
613
655
  const isSelected = model.id === selectedModelId;
614
- const isCompatible = chunkXXYDLYIT_js.isModelCompatibleWithFramework(model.id, selectedFramework);
656
+ const isCompatible = chunkNYQAEPC7_js.isModelCompatibleWithFramework(model.id, selectedFramework);
615
657
  const { IconComponent, color, providerLabel } = getModelIcon(model.id);
616
658
  return /* @__PURE__ */ jsxRuntime.jsxs(
617
659
  "button",
@@ -735,7 +777,7 @@ function PromptTab({
735
777
  ] });
736
778
  }
737
779
  function ResultsTab({ agentId, t }) {
738
- const nodeResults = chunkXXYDLYIT_js.useWorkflowStore((state) => state.nodeResults);
780
+ const nodeResults = chunkNYQAEPC7_js.useWorkflowStore((state) => state.nodeResults);
739
781
  const agentResult = react.useMemo(() => {
740
782
  return nodeResults[agentId] ?? null;
741
783
  }, [nodeResults, agentId]);
@@ -825,10 +867,10 @@ function ModelsTab({ modelProviders, selectedProviderId, onSelectProvider, model
825
867
  const providerModels = modelsByProvider.find((p) => p.provider.id === selectedProviderId);
826
868
  if (!providerModels || providerModels.models.length === 0) return /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-gray-400 dark:text-gray-500", children: t("agentDrawer.noModelsForProvider") });
827
869
  const compatibleModels = providerModels.models.filter(
828
- (m) => chunkXXYDLYIT_js.isModelCompatibleWithFramework(m.id, agentFramework)
870
+ (m) => chunkNYQAEPC7_js.isModelCompatibleWithFramework(m.id, agentFramework)
829
871
  );
830
872
  const incompatibleModels = providerModels.models.filter(
831
- (m) => !chunkXXYDLYIT_js.isModelCompatibleWithFramework(m.id, agentFramework)
873
+ (m) => !chunkNYQAEPC7_js.isModelCompatibleWithFramework(m.id, agentFramework)
832
874
  );
833
875
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
834
876
  /* @__PURE__ */ jsxRuntime.jsx("label", { className: "mb-2 block text-xs font-medium text-gray-500 dark:text-gray-400", children: t("agentDrawer.selectModel") }),
@@ -901,7 +943,7 @@ function ToolsTab({ agentTools, enabledToolIds, onToggle, agentFramework, t }) {
901
943
  ] }),
902
944
  tool.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "truncate text-[10px] text-gray-400 dark:text-gray-500", children: tool.description }),
903
945
  tool.compatibleFrameworks && tool.compatibleFrameworks.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1 flex flex-wrap gap-0.5", children: tool.compatibleFrameworks.map((framework) => {
904
- const meta = chunkXXYDLYIT_js.getFrameworkMeta(framework);
946
+ const meta = chunkNYQAEPC7_js.getFrameworkMeta(framework);
905
947
  const isCurrentFw = framework === agentFramework;
906
948
  return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: `inline-flex items-center gap-0.5 rounded px-1.5 py-0.5 text-[8px] font-medium ${isCurrentFw ? meta.badgeColor : "bg-gray-100 text-gray-500 dark:bg-white/5 dark:text-gray-400"}`, children: [
907
949
  /* @__PURE__ */ jsxRuntime.jsx(meta.IconComponent, { className: "h-2.5 w-2.5" }),
@@ -1077,9 +1119,9 @@ function AdvancedTab({
1077
1119
  }
1078
1120
  function AgentModal({ onSaved, onPersist }) {
1079
1121
  const t = chunkYXN2K77G_js.useTranslations("agents.workflow");
1080
- const activeModal = chunkXXYDLYIT_js.useModalStore((s) => s.activeModal);
1081
- const agentData = chunkXXYDLYIT_js.useModalStore((s) => s.agentData);
1082
- const closeModal = chunkXXYDLYIT_js.useModalStore((s) => s.closeModal);
1122
+ const activeModal = chunkNYQAEPC7_js.useModalStore((s) => s.activeModal);
1123
+ const agentData = chunkNYQAEPC7_js.useModalStore((s) => s.agentData);
1124
+ const closeModal = chunkNYQAEPC7_js.useModalStore((s) => s.closeModal);
1083
1125
  const open = activeModal === "agent";
1084
1126
  const agent = agentData?.agent ?? null;
1085
1127
  const models = agentData?.models ?? [];
@@ -1429,7 +1471,7 @@ function SubworkflowModal({ onSaved, onMaximize }) {
1429
1471
  const markDirty = useSubworkflowStore((s) => s.markDirty);
1430
1472
  const markSaved = useSubworkflowStore((s) => s.markSaved);
1431
1473
  const closeModal = useSubworkflowStore((s) => s.closeModal);
1432
- const agentBehind = chunkXXYDLYIT_js.useModalStore((s) => s.activeModal === "agent" ? s.agentData?.agent?.name : null);
1474
+ const agentBehind = chunkNYQAEPC7_js.useModalStore((s) => s.activeModal === "agent" ? s.agentData?.agent?.name : null);
1433
1475
  const isCreateMode = !tool?.toolId;
1434
1476
  const initialGraph = react.useMemo(() => {
1435
1477
  const config = tool?.config;
@@ -1458,9 +1500,9 @@ function SubworkflowModal({ onSaved, onMaximize }) {
1458
1500
  }, [tool, onSaved, name, category, description, timeoutMs, latestGraphRef, markSaved]);
1459
1501
  if (!tool) return null;
1460
1502
  const categoryKey = category ?? "external";
1461
- const gradient = tool.color ?? chunkXXYDLYIT_js.CATEGORY_COLORS[categoryKey] ?? chunkXXYDLYIT_js.CATEGORY_COLORS.external;
1462
- const categoryPill = chunkXXYDLYIT_js.CATEGORY_PILL_COLORS[categoryKey] ?? chunkXXYDLYIT_js.CATEGORY_PILL_COLORS.external;
1463
- const IconComponent = chunkXXYDLYIT_js.ICON_MAP[tool.icon ?? ""] ?? outline.ArrowPathRoundedSquareIcon;
1503
+ const gradient = tool.color ?? chunkNYQAEPC7_js.CATEGORY_COLORS[categoryKey] ?? chunkNYQAEPC7_js.CATEGORY_COLORS.external;
1504
+ const categoryPill = chunkNYQAEPC7_js.CATEGORY_PILL_COLORS[categoryKey] ?? chunkNYQAEPC7_js.CATEGORY_PILL_COLORS.external;
1505
+ const IconComponent = chunkNYQAEPC7_js.ICON_MAP[tool.icon ?? ""] ?? outline.ArrowPathRoundedSquareIcon;
1464
1506
  const graph = latestGraphRef.current;
1465
1507
  const startNode = graph.nodes.find((n) => n.type === "start");
1466
1508
  const endNode = graph.nodes.find((n) => n.type === "end");
@@ -1525,7 +1567,7 @@ function SubworkflowModal({ onSaved, onMaximize }) {
1525
1567
  {
1526
1568
  type: "button",
1527
1569
  onClick: () => setCategory(cat),
1528
- className: `rounded-full px-2 py-1 text-[9px] font-semibold transition-all ${cat === category ? `${chunkXXYDLYIT_js.CATEGORY_PILL_COLORS[cat] ?? chunkXXYDLYIT_js.CATEGORY_PILL_COLORS.external} ring-1 ring-current/20` : "bg-white/30 text-gray-500 hover:bg-white/50 dark:bg-white/5 dark:text-gray-400"}`,
1570
+ className: `rounded-full px-2 py-1 text-[9px] font-semibold transition-all ${cat === category ? `${chunkNYQAEPC7_js.CATEGORY_PILL_COLORS[cat] ?? chunkNYQAEPC7_js.CATEGORY_PILL_COLORS.external} ring-1 ring-current/20` : "bg-white/30 text-gray-500 hover:bg-white/50 dark:bg-white/5 dark:text-gray-400"}`,
1529
1571
  children: cat
1530
1572
  },
1531
1573
  cat
@@ -1612,7 +1654,7 @@ function SubworkflowModal({ onSaved, onMaximize }) {
1612
1654
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-auto" })
1613
1655
  ] }),
1614
1656
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(
1615
- chunkXXYDLYIT_js.WorkflowCanvas,
1657
+ chunkNYQAEPC7_js.WorkflowCanvas,
1616
1658
  {
1617
1659
  initialGraph,
1618
1660
  agents: [],
@@ -1628,9 +1670,9 @@ function SubworkflowModal({ onSaved, onMaximize }) {
1628
1670
  }
1629
1671
  function PipelineSettingsModal({ onSave }) {
1630
1672
  const t = chunkYXN2K77G_js.useTranslations("agents.workflow");
1631
- const activeModal = chunkXXYDLYIT_js.useModalStore((s) => s.activeModal);
1632
- const data = chunkXXYDLYIT_js.useModalStore((s) => s.pipelineSettingsData);
1633
- const closeModal = chunkXXYDLYIT_js.useModalStore((s) => s.closeModal);
1673
+ const activeModal = chunkNYQAEPC7_js.useModalStore((s) => s.activeModal);
1674
+ const data = chunkNYQAEPC7_js.useModalStore((s) => s.pipelineSettingsData);
1675
+ const closeModal = chunkNYQAEPC7_js.useModalStore((s) => s.closeModal);
1634
1676
  const open = activeModal === "pipeline-settings";
1635
1677
  const [nameValue, setNameValue] = react.useState("");
1636
1678
  const [descriptionValue, setDescriptionValue] = react.useState("");
@@ -2894,6 +2936,7 @@ var LOGIC_NODE_ITEMS = [
2894
2936
  // Data Processing
2895
2937
  { nodeType: "code", nameKey: "codeNode", descriptionKey: "codeNodeDescription", subcategory: "data_processing" },
2896
2938
  { nodeType: "http_request", nameKey: "httpRequestNode", descriptionKey: "httpRequestNodeDescription", subcategory: "data_processing" },
2939
+ { nodeType: "s3_write", nameKey: "s3WriteNode", descriptionKey: "s3WriteNodeDescription", subcategory: "data_processing" },
2897
2940
  { nodeType: "template_transform", nameKey: "templateTransformNode", descriptionKey: "templateTransformNodeDescription", subcategory: "data_processing" },
2898
2941
  { nodeType: "variable_assigner", nameKey: "variableAssignerNode", descriptionKey: "variableAssignerNodeDescription", subcategory: "data_processing" },
2899
2942
  { nodeType: "variable_aggregator", nameKey: "variableAggregatorNode", descriptionKey: "variableAggregatorNodeDescription", subcategory: "data_processing" },
@@ -2976,9 +3019,9 @@ function CollapsibleSection({ title, icon, colorClass, defaultOpen = true, count
2976
3019
  ] });
2977
3020
  }
2978
3021
  function LogicNodeItemCard({ item, translationFunction }) {
2979
- const IconComponent = chunkXXYDLYIT_js.LOGIC_ICON_MAP[item.nodeType];
2980
- const gradient = chunkXXYDLYIT_js.LOGIC_NODE_GRADIENTS[item.nodeType] ?? "from-gray-400 to-gray-500";
2981
- const defaultConfig = chunkC7BI5LQ6_js.createDefaultLogicNodeConfig(item.nodeType);
3022
+ const IconComponent = chunkNYQAEPC7_js.LOGIC_ICON_MAP[item.nodeType];
3023
+ const gradient = chunkNYQAEPC7_js.LOGIC_NODE_GRADIENTS[item.nodeType] ?? "from-gray-400 to-gray-500";
3024
+ const defaultConfig = chunkC3H4FM4A_js.createDefaultLogicNodeConfig(item.nodeType);
2982
3025
  const configJson = defaultConfig ? JSON.stringify(defaultConfig) : void 0;
2983
3026
  return /* @__PURE__ */ jsxRuntime.jsxs(
2984
3027
  "div",
@@ -3048,7 +3091,7 @@ function NodePalette({ agents, tools, agentTools = [], rules, entities = [], mod
3048
3091
  [entityTypes, normalizedQuery]
3049
3092
  );
3050
3093
  const filteredLogicItems = react.useMemo(() => {
3051
- const visibleByDefault = LOGIC_NODE_ITEMS.filter((item) => !chunkXXYDLYIT_js.EXPERIMENTAL_NODE_TYPES.has(item.nodeType));
3094
+ const visibleByDefault = LOGIC_NODE_ITEMS.filter((item) => !chunkNYQAEPC7_js.EXPERIMENTAL_NODE_TYPES.has(item.nodeType));
3052
3095
  if (!normalizedQuery) return visibleByDefault;
3053
3096
  return visibleByDefault.filter(
3054
3097
  (item) => t(item.nameKey).toLowerCase().includes(normalizedQuery) || t(item.descriptionKey).toLowerCase().includes(normalizedQuery)
@@ -3112,7 +3155,7 @@ function NodePalette({ agents, tools, agentTools = [], rules, entities = [], mod
3112
3155
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5", children: [
3113
3156
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "truncate text-xs font-medium text-gray-900 dark:text-white", children: agent.name }),
3114
3157
  (() => {
3115
- const tier = chunkC7BI5LQ6_js.getAgentTier(Number(agent.elo ?? 0));
3158
+ const tier = chunkC3H4FM4A_js.getAgentTier(Number(agent.elo ?? 0));
3116
3159
  return /* @__PURE__ */ jsxRuntime.jsx("span", { className: `shrink-0 rounded-full px-1.5 py-px text-[8px] font-bold ${tier.pillColor}`, children: t(`agentDrawer.tier${tier.key.charAt(0).toUpperCase()}${tier.key.slice(1)}`) });
3117
3160
  })()
3118
3161
  ] }),
@@ -3222,8 +3265,8 @@ function NodePalette({ agents, tools, agentTools = [], rules, entities = [], mod
3222
3265
  limit: entity.defaultLimit
3223
3266
  });
3224
3267
  const dsLogo = getDatasourceLogo(entity.id);
3225
- const EntityIcon = chunkXXYDLYIT_js.getEntityIcon(entity.id);
3226
- const entityGradient = chunkXXYDLYIT_js.getEntityGradient(entity.id);
3268
+ const EntityIcon = chunkNYQAEPC7_js.getEntityIcon(entity.id);
3269
+ const entityGradient = chunkNYQAEPC7_js.getEntityGradient(entity.id);
3227
3270
  return /* @__PURE__ */ jsxRuntime.jsxs(
3228
3271
  "div",
3229
3272
  {
@@ -3621,9 +3664,9 @@ function formatDuration3(durationMs) {
3621
3664
  }
3622
3665
  function RunPanel({ open, onClose, onRun, onStop }) {
3623
3666
  const translations = chunkYXN2K77G_js.useTranslations("agents.workflow.runPanel");
3624
- const nodes = chunkXXYDLYIT_js.useWorkflowStore((state) => state.nodes);
3625
- const isRunning = chunkXXYDLYIT_js.useWorkflowStore((state) => state.isRunning);
3626
- const nodeResults = chunkXXYDLYIT_js.useWorkflowStore((state) => state.nodeResults);
3667
+ const nodes = chunkNYQAEPC7_js.useWorkflowStore((state) => state.nodes);
3668
+ const isRunning = chunkNYQAEPC7_js.useWorkflowStore((state) => state.isRunning);
3669
+ const nodeResults = chunkNYQAEPC7_js.useWorkflowStore((state) => state.nodeResults);
3627
3670
  const startNode = nodes.find((node) => node.type === "start");
3628
3671
  const hasEndNode = nodes.some((node) => node.type === "end");
3629
3672
  const hasValidStartConfig = Boolean(
@@ -3806,6 +3849,20 @@ function inferVariables(config, nodeType) {
3806
3849
  variables.push({ name: "body", direction: "input", variableType: "string" });
3807
3850
  }
3808
3851
  break;
3852
+ case "s3_write":
3853
+ variables.push({ name: "key", direction: "input", variableType: "string" });
3854
+ if (config.sourceUrl) {
3855
+ variables.push({ name: "sourceUrl", direction: "input", variableType: "string" });
3856
+ }
3857
+ if (config.body) {
3858
+ variables.push({ name: "body", direction: "input", variableType: "string" });
3859
+ }
3860
+ variables.push({ name: "bucket", direction: "output", variableType: "string" });
3861
+ variables.push({ name: "key", direction: "output", variableType: "string" });
3862
+ variables.push({ name: "size", direction: "output", variableType: "number" });
3863
+ variables.push({ name: "etag", direction: "output", variableType: "string" });
3864
+ variables.push({ name: "contentType", direction: "output", variableType: "string" });
3865
+ break;
3809
3866
  case "template_transform":
3810
3867
  variables.push({ name: "template", direction: "input", variableType: "string" });
3811
3868
  if (config.outputVariable) {
@@ -3911,8 +3968,8 @@ function inferVariables(config, nodeType) {
3911
3968
  }
3912
3969
  function VariableInspector({ open, onClose }) {
3913
3970
  const translations = chunkYXN2K77G_js.useTranslations("agents.workflow.variableInspector");
3914
- const nodes = chunkXXYDLYIT_js.useWorkflowStore((state) => state.nodes);
3915
- const edges = chunkXXYDLYIT_js.useWorkflowStore((state) => state.edges);
3971
+ const nodes = chunkNYQAEPC7_js.useWorkflowStore((state) => state.nodes);
3972
+ const edges = chunkNYQAEPC7_js.useWorkflowStore((state) => state.edges);
3916
3973
  const [expandedNodes, setExpandedNodes] = react.useState(/* @__PURE__ */ new Set());
3917
3974
  const toggleNodeExpansion = react.useCallback((nodeId) => {
3918
3975
  setExpandedNodes((current) => {
@@ -3974,8 +4031,8 @@ function VariableInspector({ open, onClose }) {
3974
4031
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-sm text-gray-500 dark:text-gray-400", children: translations("noNodes") })
3975
4032
  ] }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "divide-y divide-gray-100 dark:divide-gray-800", children: nodeVariableEntries.map((entry) => {
3976
4033
  const isExpanded = expandedNodes.has(entry.nodeId);
3977
- const IconComponent = chunkXXYDLYIT_js.LOGIC_ICON_MAP[entry.nodeType];
3978
- const gradient = chunkXXYDLYIT_js.LOGIC_NODE_GRADIENTS[entry.nodeType] ?? "from-gray-400 to-gray-500";
4034
+ const IconComponent = chunkNYQAEPC7_js.LOGIC_ICON_MAP[entry.nodeType];
4035
+ const gradient = chunkNYQAEPC7_js.LOGIC_NODE_GRADIENTS[entry.nodeType] ?? "from-gray-400 to-gray-500";
3979
4036
  const inputVariables = entry.variables.filter((variable) => variable.direction === "input");
3980
4037
  const outputVariables = entry.variables.filter((variable) => variable.direction === "output");
3981
4038
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-testid": `variable-node-${entry.nodeId}`, children: [
@@ -4041,7 +4098,7 @@ function RunInputDialog({
4041
4098
  onRun
4042
4099
  }) {
4043
4100
  const t = chunkYXN2K77G_js.useTranslations("agents.workflow.runInputDialog");
4044
- const nodes = chunkXXYDLYIT_js.useWorkflowStore((state) => state.nodes);
4101
+ const nodes = chunkNYQAEPC7_js.useWorkflowStore((state) => state.nodes);
4045
4102
  const [values, setValues] = react.useState({});
4046
4103
  const inputVariableNames = react.useMemo(() => {
4047
4104
  const storeStartNode = nodes.find((node) => node.type === "start");
@@ -4122,8 +4179,8 @@ function PreviewPanel({ open, onClose, workflowId, loadRuns }) {
4122
4179
  const [isLoadingRuns, setIsLoadingRuns] = react.useState(false);
4123
4180
  const [selectedRun, setSelectedRun] = react.useState(null);
4124
4181
  const [selectedNode, setSelectedNode] = react.useState(null);
4125
- const isRunning = chunkXXYDLYIT_js.useWorkflowStore((state) => state.isRunning);
4126
- const nodeResults = chunkXXYDLYIT_js.useWorkflowStore((state) => state.nodeResults);
4182
+ const isRunning = chunkNYQAEPC7_js.useWorkflowStore((state) => state.isRunning);
4183
+ const nodeResults = chunkNYQAEPC7_js.useWorkflowStore((state) => state.nodeResults);
4127
4184
  const refreshRuns = react.useCallback(async () => {
4128
4185
  setIsLoadingRuns(true);
4129
4186
  try {
@@ -4279,7 +4336,7 @@ var AutoSaveWorkspace = react.memo(function AutoSaveWorkspace2({
4279
4336
  onAutoSaveGraph(graph);
4280
4337
  }, [onAutoSaveGraph, onGraphSnapshot]);
4281
4338
  return /* @__PURE__ */ jsxRuntime.jsx(
4282
- chunkXXYDLYIT_js.Workspace,
4339
+ chunkNYQAEPC7_js.Workspace,
4283
4340
  {
4284
4341
  ...workspaceProps,
4285
4342
  onGraphChange: handleGraphChange
@@ -4650,14 +4707,14 @@ function DslImportModal({ open, onClose, onImport }) {
4650
4707
  }
4651
4708
 
4652
4709
  // src/astrlabe/store/selectors.ts
4653
- var useCanUndo = () => chunkXXYDLYIT_js.useWorkflowStore((state) => state.past.length > 0);
4654
- var useCanRedo = () => chunkXXYDLYIT_js.useWorkflowStore((state) => state.future.length > 0);
4655
- var useHasCopied = () => chunkXXYDLYIT_js.useWorkflowStore((state) => state.clipboard !== null);
4656
- var useContextMenu = () => chunkXXYDLYIT_js.useWorkflowStore((state) => state.contextMenu);
4657
- var useEditingNodeId = () => chunkXXYDLYIT_js.useWorkflowStore((state) => state.editingNodeId);
4658
- var useSelectedNodeCount = () => chunkXXYDLYIT_js.useWorkflowStore((state) => state.nodes.filter((node) => node.selected).length);
4659
- var useIsRunning = () => chunkXXYDLYIT_js.useWorkflowStore((state) => state.isRunning);
4660
- var useNodeResults = () => chunkXXYDLYIT_js.useWorkflowStore((state) => state.nodeResults);
4710
+ var useCanUndo = () => chunkNYQAEPC7_js.useWorkflowStore((state) => state.past.length > 0);
4711
+ var useCanRedo = () => chunkNYQAEPC7_js.useWorkflowStore((state) => state.future.length > 0);
4712
+ var useHasCopied = () => chunkNYQAEPC7_js.useWorkflowStore((state) => state.clipboard !== null);
4713
+ var useContextMenu = () => chunkNYQAEPC7_js.useWorkflowStore((state) => state.contextMenu);
4714
+ var useEditingNodeId = () => chunkNYQAEPC7_js.useWorkflowStore((state) => state.editingNodeId);
4715
+ var useSelectedNodeCount = () => chunkNYQAEPC7_js.useWorkflowStore((state) => state.nodes.filter((node) => node.selected).length);
4716
+ var useIsRunning = () => chunkNYQAEPC7_js.useWorkflowStore((state) => state.isRunning);
4717
+ var useNodeResults = () => chunkNYQAEPC7_js.useWorkflowStore((state) => state.nodeResults);
4661
4718
  var DEFAULT_MAX_HISTORY = 50;
4662
4719
  function useUndoRedo(nodes, edges, setNodes, setEdges, maxHistory = DEFAULT_MAX_HISTORY) {
4663
4720
  const pastRef = react.useRef([]);
@@ -4955,6 +5012,7 @@ exports.RuleForm = RuleForm;
4955
5012
  exports.RunInputDialog = RunInputDialog;
4956
5013
  exports.RunPanel = RunPanel;
4957
5014
  exports.RunReplayModal = RunReplayModal;
5015
+ exports.S3WriteFlowNode = S3WriteFlowNode;
4958
5016
  exports.SaveStatusBadge = SaveStatusBadge;
4959
5017
  exports.SubworkflowModal = SubworkflowModal;
4960
5018
  exports.TIMEZONE_OPTIONS = TIMEZONE_OPTIONS;
@@ -4979,5 +5037,5 @@ exports.useNodeResults = useNodeResults;
4979
5037
  exports.useSelectedNodeCount = useSelectedNodeCount;
4980
5038
  exports.useSubworkflowStore = useSubworkflowStore;
4981
5039
  exports.useUndoRedo = useUndoRedo;
4982
- //# sourceMappingURL=chunk-SFVSDGNF.js.map
4983
- //# sourceMappingURL=chunk-SFVSDGNF.js.map
5040
+ //# sourceMappingURL=chunk-FZTOP6EE.js.map
5041
+ //# sourceMappingURL=chunk-FZTOP6EE.js.map