@pipelex/mthds-ui 0.10.0 → 0.12.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.
@@ -19,7 +19,7 @@ import {
19
19
  toolbarOrientation,
20
20
  toolbarSide,
21
21
  validateGraphSpec
22
- } from "../../chunk-D2ID5Z3Y.js";
22
+ } from "../../chunk-R34J4GFM.js";
23
23
  import {
24
24
  __spreadProps,
25
25
  __spreadValues
@@ -136,6 +136,24 @@ function extractStorageUri(data) {
136
136
  }
137
137
  return null;
138
138
  }
139
+ function extractInnerHtml(data) {
140
+ const fromObject = (obj2) => {
141
+ const value = obj2.inner_html;
142
+ if (typeof value === "string" && value.trim() !== "") return value;
143
+ return null;
144
+ };
145
+ if (!data || typeof data !== "object" || Array.isArray(data)) return null;
146
+ const obj = data;
147
+ const direct = fromObject(obj);
148
+ if (direct != null) return direct;
149
+ for (const value of Object.values(obj)) {
150
+ if (value && typeof value === "object" && !Array.isArray(value)) {
151
+ const nested = fromObject(value);
152
+ if (nested != null) return nested;
153
+ }
154
+ }
155
+ return null;
156
+ }
139
157
  function extractFilename(data) {
140
158
  if (!data || typeof data !== "object") return null;
141
159
  const obj = data;
@@ -245,6 +263,7 @@ function StuffViewer({
245
263
  const httpExternalUrl = React2.useMemo(() => extractUrl(stuff.data), [stuff.data]);
246
264
  const storageUri = React2.useMemo(() => extractStorageUri(stuff.data), [stuff.data]);
247
265
  const filename = React2.useMemo(() => extractFilename(stuff.data), [stuff.data]);
266
+ const innerHtml = React2.useMemo(() => extractInnerHtml(stuff.data), [stuff.data]);
248
267
  const [resolvedStorageUrl, setResolvedStorageUrl] = React2.useState(null);
249
268
  React2.useEffect(() => {
250
269
  setResolvedStorageUrl(null);
@@ -340,6 +359,17 @@ function StuffViewer({
340
359
  }
341
360
  return renderMediaFallback("Image");
342
361
  }
362
+ if (innerHtml != null) {
363
+ return /* @__PURE__ */ jsx(
364
+ "iframe",
365
+ {
366
+ className: "stuff-viewer-html-frame",
367
+ title: stuff.name ? `${stuff.name} preview` : "HTML preview",
368
+ sandbox: "",
369
+ srcDoc: DOMPurify.sanitize(innerHtml, { WHOLE_DOCUMENT: true })
370
+ }
371
+ );
372
+ }
343
373
  if (stuff.dataHtml) {
344
374
  return /* @__PURE__ */ jsx(
345
375
  "div",
@@ -402,7 +432,7 @@ function StuffViewer({
402
432
  } else if (activeTab === "text") {
403
433
  textToCopy = stuff.dataText || jsonString || "";
404
434
  } else {
405
- textToCopy = stuff.dataText || stuff.dataHtml || jsonString || "";
435
+ textToCopy = innerHtml || stuff.dataText || stuff.dataHtml || jsonString || "";
406
436
  }
407
437
  if (!textToCopy) return;
408
438
  if (navigator.clipboard) {
@@ -433,7 +463,7 @@ function StuffViewer({
433
463
  );
434
464
  } else {
435
465
  downloadBlob(
436
- stuff.dataHtml || jsonString || "",
466
+ innerHtml || stuff.dataHtml || jsonString || "",
437
467
  `${stuff.name || "stuff"}.html`,
438
468
  "text/html"
439
469
  );
@@ -825,9 +855,6 @@ function PipeLLMSection({
825
855
  )
826
856
  ] });
827
857
  }
828
- function LLMExecutionData(_props) {
829
- return null;
830
- }
831
858
 
832
859
  // src/graph/react/detail/sections/PipeImgGenDetail.tsx
833
860
  import { Fragment as Fragment2, jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
@@ -872,9 +899,6 @@ function PipeImgGenSection({
872
899
  )
873
900
  ] });
874
901
  }
875
- function ImgGenExecutionData(_props) {
876
- return null;
877
- }
878
902
 
879
903
  // src/graph/react/detail/sections/PipeExtractDetail.tsx
880
904
  import { Fragment as Fragment3, jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
@@ -895,9 +919,6 @@ function PipeExtractSection({
895
919
  /* @__PURE__ */ jsx6(KV, { label: "Image Variable", value: blueprint.image_stuff_name })
896
920
  ] });
897
921
  }
898
- function ExtractExecutionData(_props) {
899
- return null;
900
- }
901
922
 
902
923
  // src/graph/react/detail/sections/PipeSearchDetail.tsx
903
924
  import { Fragment as Fragment4, jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
@@ -926,12 +947,46 @@ function PipeSearchSection({
926
947
  blueprint.exclude_domains && blueprint.exclude_domains.length > 0 && /* @__PURE__ */ jsx7(KV, { label: "Exclude Domains", value: blueprint.exclude_domains.join(", ") })
927
948
  ] });
928
949
  }
929
- function SearchExecutionData(_props) {
930
- return null;
950
+
951
+ // src/graph/react/detail/sections/llmChoice.ts
952
+ var LLM_CHOICE_LABEL_KEYS = ["model", "llm_handle", "handle", "llm_name", "name"];
953
+ function nonEmptyString(value) {
954
+ if (typeof value !== "string") return void 0;
955
+ const trimmed = value.trim();
956
+ return trimmed.length > 0 ? trimmed : void 0;
957
+ }
958
+ function labelFromLlmChoice(choice) {
959
+ if (typeof choice === "string") return nonEmptyString(choice);
960
+ if (choice && typeof choice === "object") {
961
+ for (const key of LLM_CHOICE_LABEL_KEYS) {
962
+ const label = nonEmptyString(choice[key]);
963
+ if (label) return label;
964
+ }
965
+ }
966
+ return void 0;
931
967
  }
932
968
 
933
- // src/graph/react/detail/sections/PipeComposeDetail.tsx
969
+ // src/graph/react/detail/sections/PipeStructureDetail.tsx
934
970
  import { Fragment as Fragment5, jsx as jsx8, jsxs as jsxs8 } from "react/jsx-runtime";
971
+ function PipeStructureSection({
972
+ blueprint,
973
+ executionData
974
+ }) {
975
+ const resolvedModel = executionData == null ? void 0 : executionData.resolved_model;
976
+ const isMultipleOutput = executionData == null ? void 0 : executionData.is_multiple_output;
977
+ const renderedUser = executionData == null ? void 0 : executionData.rendered_user_prompt;
978
+ const modelDisplay = resolvedModel || labelFromLlmChoice(blueprint.llm_choice);
979
+ return /* @__PURE__ */ jsxs8(Fragment5, { children: [
980
+ /* @__PURE__ */ jsx8(KV, { label: "Model", value: modelDisplay }),
981
+ /* @__PURE__ */ jsx8(KV, { label: "Text Variable", value: blueprint.text_input_name }),
982
+ /* @__PURE__ */ jsx8(KV, { label: "Multiple Output", value: isMultipleOutput }),
983
+ /* @__PURE__ */ jsx8(KV, { label: "Output Multiplicity", value: blueprint.output_multiplicity }),
984
+ /* @__PURE__ */ jsx8(PromptToggle, { label: "Prompt", templateText: void 0, renderedText: renderedUser })
985
+ ] });
986
+ }
987
+
988
+ // src/graph/react/detail/sections/PipeComposeDetail.tsx
989
+ import { Fragment as Fragment6, jsx as jsx9, jsxs as jsxs9 } from "react/jsx-runtime";
935
990
  function formatLeafField(field) {
936
991
  var _a, _b;
937
992
  switch (field.method) {
@@ -952,9 +1007,9 @@ function isLongValue(text) {
952
1007
  return text.length > LONG_VALUE_THRESHOLD_CHARS || text.includes("\n");
953
1008
  }
954
1009
  function FieldBlock({ label, value }) {
955
- return /* @__PURE__ */ jsxs8("div", { className: "detail-field-block", children: [
956
- /* @__PURE__ */ jsx8("div", { className: "detail-field-block-label", children: label }),
957
- /* @__PURE__ */ jsx8("div", { className: "detail-field-block-value", children: value })
1010
+ return /* @__PURE__ */ jsxs9("div", { className: "detail-field-block", children: [
1011
+ /* @__PURE__ */ jsx9("div", { className: "detail-field-block-label", children: label }),
1012
+ /* @__PURE__ */ jsx9("div", { className: "detail-field-block-value", children: value })
958
1013
  ] });
959
1014
  }
960
1015
  function ConstructFieldsBlock({
@@ -975,18 +1030,18 @@ function ConstructFieldsBlock({
975
1030
  }
976
1031
  }
977
1032
  const indentStyle = depth > 0 ? { paddingLeft: depth * 12 } : void 0;
978
- return /* @__PURE__ */ jsxs8(Fragment5, { children: [
1033
+ return /* @__PURE__ */ jsxs9(Fragment6, { children: [
979
1034
  leafFields.map(([name, field]) => {
980
1035
  const display = formatLeafField(field);
981
1036
  if (isLongValue(display)) {
982
- return /* @__PURE__ */ jsx8("div", { style: indentStyle, children: /* @__PURE__ */ jsx8(FieldBlock, { label: name, value: display }) }, name);
1037
+ return /* @__PURE__ */ jsx9("div", { style: indentStyle, children: /* @__PURE__ */ jsx9(FieldBlock, { label: name, value: display }) }, name);
983
1038
  }
984
- return /* @__PURE__ */ jsx8("div", { style: indentStyle, children: /* @__PURE__ */ jsx8(KV, { label: name, value: display }) }, name);
1039
+ return /* @__PURE__ */ jsx9("div", { style: indentStyle, children: /* @__PURE__ */ jsx9(KV, { label: name, value: display }) }, name);
985
1040
  }),
986
1041
  templateFields.map(([name, field]) => {
987
1042
  var _a, _b;
988
1043
  const renderedForField = (_a = fieldResolutions == null ? void 0 : fieldResolutions[name]) == null ? void 0 : _a.rendered;
989
- return /* @__PURE__ */ jsx8("div", { style: indentStyle, children: /* @__PURE__ */ jsx8(
1044
+ return /* @__PURE__ */ jsx9("div", { style: indentStyle, children: /* @__PURE__ */ jsx9(
990
1045
  PromptToggle,
991
1046
  {
992
1047
  label: `Template \u2014 ${name}`,
@@ -997,15 +1052,15 @@ function ConstructFieldsBlock({
997
1052
  }),
998
1053
  nestedFields.map(([name, field]) => {
999
1054
  if (!field.nested) return null;
1000
- return /* @__PURE__ */ jsxs8("div", { children: [
1001
- /* @__PURE__ */ jsxs8(
1055
+ return /* @__PURE__ */ jsxs9("div", { children: [
1056
+ /* @__PURE__ */ jsxs9(
1002
1057
  "div",
1003
1058
  {
1004
1059
  className: "detail-nested-header",
1005
1060
  style: depth > 0 ? { paddingLeft: depth * 12 } : void 0,
1006
1061
  children: [
1007
- /* @__PURE__ */ jsx8("span", { className: "detail-nested-header-name", children: name }),
1008
- /* @__PURE__ */ jsxs8("span", { className: "detail-nested-header-meta", children: [
1062
+ /* @__PURE__ */ jsx9("span", { className: "detail-nested-header-name", children: name }),
1063
+ /* @__PURE__ */ jsxs9("span", { className: "detail-nested-header-meta", children: [
1009
1064
  "nested \xB7 ",
1010
1065
  Object.keys(field.nested.fields).length,
1011
1066
  " field",
@@ -1014,7 +1069,7 @@ function ConstructFieldsBlock({
1014
1069
  ]
1015
1070
  }
1016
1071
  ),
1017
- /* @__PURE__ */ jsx8(
1072
+ /* @__PURE__ */ jsx9(
1018
1073
  ConstructFieldsBlock,
1019
1074
  {
1020
1075
  blueprint: field.nested,
@@ -1036,11 +1091,11 @@ function PipeComposeSection({
1036
1091
  const fieldResolutions = (_a = executionData == null ? void 0 : executionData.fields) != null ? _a : null;
1037
1092
  const constructBlueprint = blueprint.construct_blueprint;
1038
1093
  const hasConstruct = constructBlueprint !== null && Object.keys(constructBlueprint.fields).length > 0;
1039
- return /* @__PURE__ */ jsxs8(Fragment5, { children: [
1040
- /* @__PURE__ */ jsx8(KV, { label: "Mode", value: composeMode || (hasConstruct ? "construct" : "template") }),
1041
- /* @__PURE__ */ jsx8(KV, { label: "Category", value: blueprint.category }),
1042
- /* @__PURE__ */ jsx8(KV, { label: "Templating Style", value: blueprint.templating_style }),
1043
- blueprint.template && /* @__PURE__ */ jsx8(
1094
+ return /* @__PURE__ */ jsxs9(Fragment6, { children: [
1095
+ /* @__PURE__ */ jsx9(KV, { label: "Mode", value: composeMode || (hasConstruct ? "construct" : "template") }),
1096
+ /* @__PURE__ */ jsx9(KV, { label: "Category", value: blueprint.category }),
1097
+ /* @__PURE__ */ jsx9(KV, { label: "Templating Style", value: blueprint.templating_style }),
1098
+ blueprint.template && /* @__PURE__ */ jsx9(
1044
1099
  PromptToggle,
1045
1100
  {
1046
1101
  label: "Template",
@@ -1048,9 +1103,9 @@ function PipeComposeSection({
1048
1103
  renderedText
1049
1104
  }
1050
1105
  ),
1051
- hasConstruct && /* @__PURE__ */ jsxs8(Fragment5, { children: [
1052
- /* @__PURE__ */ jsx8("div", { className: "detail-section-label", children: "FIELDS" }),
1053
- /* @__PURE__ */ jsx8(
1106
+ hasConstruct && /* @__PURE__ */ jsxs9(Fragment6, { children: [
1107
+ /* @__PURE__ */ jsx9("div", { className: "detail-section-label", children: "FIELDS" }),
1108
+ /* @__PURE__ */ jsx9(
1054
1109
  ConstructFieldsBlock,
1055
1110
  {
1056
1111
  blueprint: constructBlueprint,
@@ -1061,31 +1116,28 @@ function PipeComposeSection({
1061
1116
  ] })
1062
1117
  ] });
1063
1118
  }
1064
- function ComposeExecutionData(_props) {
1065
- return null;
1066
- }
1067
1119
 
1068
1120
  // src/graph/react/detail/sections/PipeConditionDetail.tsx
1069
- import { Fragment as Fragment6, jsx as jsx9, jsxs as jsxs9 } from "react/jsx-runtime";
1121
+ import { Fragment as Fragment7, jsx as jsx10, jsxs as jsxs10 } from "react/jsx-runtime";
1070
1122
  function PipeConditionSection({
1071
1123
  blueprint,
1072
1124
  executionData
1073
1125
  }) {
1074
1126
  const evaluatedExpression = executionData == null ? void 0 : executionData.evaluated_expression;
1075
1127
  const selectedOutcome = executionData == null ? void 0 : executionData.selected_outcome;
1076
- return /* @__PURE__ */ jsxs9(Fragment6, { children: [
1077
- /* @__PURE__ */ jsx9(PromptBlock, { label: "Expression", text: blueprint.expression }),
1078
- evaluatedExpression && /* @__PURE__ */ jsx9(KV, { label: "Expression Result", value: evaluatedExpression }),
1079
- /* @__PURE__ */ jsxs9("div", { children: [
1080
- /* @__PURE__ */ jsx9("div", { className: "detail-section-label", children: "Outcomes" }),
1081
- Object.entries(blueprint.outcome_map).map(([outcome, pipeCode]) => /* @__PURE__ */ jsxs9(
1128
+ return /* @__PURE__ */ jsxs10(Fragment7, { children: [
1129
+ /* @__PURE__ */ jsx10(PromptBlock, { label: "Expression", text: blueprint.expression }),
1130
+ evaluatedExpression && /* @__PURE__ */ jsx10(KV, { label: "Expression Result", value: evaluatedExpression }),
1131
+ /* @__PURE__ */ jsxs10("div", { children: [
1132
+ /* @__PURE__ */ jsx10("div", { className: "detail-section-label", children: "Outcomes" }),
1133
+ Object.entries(blueprint.outcome_map).map(([outcome, pipeCode]) => /* @__PURE__ */ jsxs10(
1082
1134
  "div",
1083
1135
  {
1084
1136
  className: "detail-kv-row",
1085
1137
  style: selectedOutcome === pipeCode ? { background: "rgba(80,250,123,0.08)" } : void 0,
1086
1138
  children: [
1087
- /* @__PURE__ */ jsx9("span", { className: "detail-kv-key", children: outcome }),
1088
- /* @__PURE__ */ jsx9(
1139
+ /* @__PURE__ */ jsx10("span", { className: "detail-kv-key", children: outcome }),
1140
+ /* @__PURE__ */ jsx10(
1089
1141
  "span",
1090
1142
  {
1091
1143
  className: "detail-kv-value",
@@ -1097,83 +1149,89 @@ function PipeConditionSection({
1097
1149
  },
1098
1150
  outcome
1099
1151
  )),
1100
- /* @__PURE__ */ jsxs9("div", { className: "detail-kv-row", children: [
1101
- /* @__PURE__ */ jsx9("span", { className: "detail-kv-key", children: "default" }),
1102
- /* @__PURE__ */ jsx9("span", { className: "detail-kv-value", children: blueprint.default_outcome })
1152
+ /* @__PURE__ */ jsxs10("div", { className: "detail-kv-row", children: [
1153
+ /* @__PURE__ */ jsx10("span", { className: "detail-kv-key", children: "default" }),
1154
+ /* @__PURE__ */ jsx10("span", { className: "detail-kv-value", children: blueprint.default_outcome })
1103
1155
  ] })
1104
1156
  ] }),
1105
- /* @__PURE__ */ jsx9(KV, { label: "Alias Expression To", value: blueprint.add_alias_from_expression_to })
1157
+ /* @__PURE__ */ jsx10(KV, { label: "Alias Expression To", value: blueprint.add_alias_from_expression_to })
1106
1158
  ] });
1107
1159
  }
1108
- function ConditionExecutionData(_props) {
1109
- return null;
1110
- }
1111
1160
 
1112
1161
  // src/graph/react/detail/sections/PipeSequenceDetail.tsx
1113
- import { jsx as jsx10, jsxs as jsxs10 } from "react/jsx-runtime";
1162
+ import { jsx as jsx11, jsxs as jsxs11 } from "react/jsx-runtime";
1114
1163
  function PipeSequenceSection({
1115
1164
  blueprint
1116
1165
  }) {
1117
- return /* @__PURE__ */ jsxs10("div", { children: [
1118
- /* @__PURE__ */ jsx10("div", { className: "detail-section-label", children: "Steps" }),
1119
- /* @__PURE__ */ jsx10("div", { className: "detail-steps-list", children: blueprint.sequential_sub_pipes.map((step, idx) => /* @__PURE__ */ jsxs10("div", { className: "detail-step-item", children: [
1120
- /* @__PURE__ */ jsx10("span", { className: "detail-step-index", children: idx + 1 }),
1121
- /* @__PURE__ */ jsx10("span", { className: "detail-step-code", children: step.pipe_code }),
1122
- step.output_name && /* @__PURE__ */ jsxs10("span", { className: "detail-io-concept", children: [
1166
+ return /* @__PURE__ */ jsxs11("div", { children: [
1167
+ /* @__PURE__ */ jsx11("div", { className: "detail-section-label", children: "Steps" }),
1168
+ /* @__PURE__ */ jsx11("div", { className: "detail-steps-list", children: blueprint.sequential_sub_pipes.map((step, idx) => /* @__PURE__ */ jsxs11("div", { className: "detail-step-item", children: [
1169
+ /* @__PURE__ */ jsx11("span", { className: "detail-step-index", children: idx + 1 }),
1170
+ /* @__PURE__ */ jsx11("span", { className: "detail-step-code", children: step.pipe_code }),
1171
+ step.output_name && /* @__PURE__ */ jsxs11("span", { className: "detail-io-concept", children: [
1123
1172
  "-> ",
1124
1173
  step.output_name
1125
1174
  ] })
1126
1175
  ] }, idx)) })
1127
1176
  ] });
1128
1177
  }
1129
- function SequenceExecutionData(_props) {
1130
- return null;
1131
- }
1132
1178
 
1133
1179
  // src/graph/react/detail/sections/PipeParallelDetail.tsx
1134
- import { Fragment as Fragment7, jsx as jsx11, jsxs as jsxs11 } from "react/jsx-runtime";
1180
+ import { Fragment as Fragment8, jsx as jsx12, jsxs as jsxs12 } from "react/jsx-runtime";
1135
1181
  function PipeParallelSection({
1136
1182
  blueprint
1137
1183
  }) {
1138
- return /* @__PURE__ */ jsxs11(Fragment7, { children: [
1139
- /* @__PURE__ */ jsxs11("div", { children: [
1140
- /* @__PURE__ */ jsx11("div", { className: "detail-section-label", children: "Branches" }),
1141
- /* @__PURE__ */ jsx11("div", { className: "detail-steps-list", children: blueprint.parallel_sub_pipes.map((branch, idx) => /* @__PURE__ */ jsxs11("div", { className: "detail-step-item", children: [
1142
- /* @__PURE__ */ jsx11("span", { className: "detail-step-code", children: branch.pipe_code }),
1143
- branch.output_name && /* @__PURE__ */ jsxs11("span", { className: "detail-io-concept", children: [
1184
+ return /* @__PURE__ */ jsxs12(Fragment8, { children: [
1185
+ /* @__PURE__ */ jsxs12("div", { children: [
1186
+ /* @__PURE__ */ jsx12("div", { className: "detail-section-label", children: "Branches" }),
1187
+ /* @__PURE__ */ jsx12("div", { className: "detail-steps-list", children: blueprint.parallel_sub_pipes.map((branch, idx) => /* @__PURE__ */ jsxs12("div", { className: "detail-step-item", children: [
1188
+ /* @__PURE__ */ jsx12("span", { className: "detail-step-code", children: branch.pipe_code }),
1189
+ branch.output_name && /* @__PURE__ */ jsxs12("span", { className: "detail-io-concept", children: [
1144
1190
  "-> ",
1145
1191
  branch.output_name
1146
1192
  ] })
1147
1193
  ] }, idx)) })
1148
1194
  ] }),
1149
- /* @__PURE__ */ jsx11(KV, { label: "Add Each Output", value: blueprint.add_each_output }),
1150
- /* @__PURE__ */ jsx11(KV, { label: "Combined Output", value: blueprint.combined_output })
1195
+ /* @__PURE__ */ jsx12(KV, { label: "Add Each Output", value: blueprint.add_each_output }),
1196
+ /* @__PURE__ */ jsx12(KV, { label: "Combined Output", value: blueprint.combined_output })
1151
1197
  ] });
1152
1198
  }
1153
- function ParallelExecutionData(_props) {
1154
- return null;
1155
- }
1156
1199
 
1157
1200
  // src/graph/react/detail/sections/PipeBatchDetail.tsx
1158
- import { Fragment as Fragment8, jsx as jsx12, jsxs as jsxs12 } from "react/jsx-runtime";
1201
+ import { Fragment as Fragment9, jsx as jsx13, jsxs as jsxs13 } from "react/jsx-runtime";
1159
1202
  function PipeBatchSection({
1160
1203
  blueprint,
1161
1204
  executionData
1162
1205
  }) {
1163
1206
  const itemCount = executionData == null ? void 0 : executionData.item_count;
1164
- return /* @__PURE__ */ jsxs12(Fragment8, { children: [
1165
- /* @__PURE__ */ jsx12(KV, { label: "Branch Pipe", value: blueprint.branch_pipe_code }),
1166
- /* @__PURE__ */ jsx12(KV, { label: "Input List Variable", value: blueprint.batch_params.input_list_stuff_name }),
1167
- /* @__PURE__ */ jsx12(KV, { label: "Input Item Variable", value: blueprint.batch_params.input_item_stuff_name }),
1168
- itemCount != null && /* @__PURE__ */ jsx12(KV, { label: "Items Processed", value: itemCount })
1207
+ return /* @__PURE__ */ jsxs13(Fragment9, { children: [
1208
+ /* @__PURE__ */ jsx13(KV, { label: "Branch Pipe", value: blueprint.branch_pipe_code }),
1209
+ /* @__PURE__ */ jsx13(KV, { label: "Input List Variable", value: blueprint.batch_params.input_list_stuff_name }),
1210
+ /* @__PURE__ */ jsx13(KV, { label: "Input Item Variable", value: blueprint.batch_params.input_item_stuff_name }),
1211
+ itemCount != null && /* @__PURE__ */ jsx13(KV, { label: "Items Processed", value: itemCount })
1169
1212
  ] });
1170
1213
  }
1171
- function BatchExecutionData(_props) {
1172
- return null;
1214
+
1215
+ // src/graph/react/detail/sections/executionData.ts
1216
+ var MERGED_EXECUTION_DATA_TYPES = /* @__PURE__ */ new Set([
1217
+ "PipeLLM",
1218
+ "PipeImgGen",
1219
+ "PipeExtract",
1220
+ "PipeSearch",
1221
+ "PipeStructure",
1222
+ "PipeCompose",
1223
+ "PipeSequence",
1224
+ "PipeParallel",
1225
+ "PipeCondition",
1226
+ "PipeBatch"
1227
+ ]);
1228
+ function shouldDumpExecutionData(pipeType, hasBlueprint) {
1229
+ if (MERGED_EXECUTION_DATA_TYPES.has(pipeType)) return !hasBlueprint;
1230
+ return true;
1173
1231
  }
1174
1232
 
1175
1233
  // src/graph/react/detail/PipeDetailPanel.tsx
1176
- import { Fragment as Fragment9, jsx as jsx13, jsxs as jsxs13 } from "react/jsx-runtime";
1234
+ import { Fragment as Fragment10, jsx as jsx14, jsxs as jsxs14 } from "react/jsx-runtime";
1177
1235
  var PIPE_TYPE_BADGES = {
1178
1236
  PipeLLM: "LLM",
1179
1237
  PipeExtract: "Extract",
@@ -1181,6 +1239,7 @@ var PIPE_TYPE_BADGES = {
1181
1239
  PipeImgGen: "ImgGen",
1182
1240
  PipeSearch: "Search",
1183
1241
  PipeFunc: "Func",
1242
+ PipeStructure: "Structure",
1184
1243
  PipeSignature: "Signature",
1185
1244
  PipeSequence: "Seq",
1186
1245
  PipeParallel: "Par",
@@ -1222,17 +1281,17 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1222
1281
  const inputs = (_c = (_b = node.io) == null ? void 0 : _b.inputs) != null ? _c : [];
1223
1282
  const outputs = (_e = (_d = node.io) == null ? void 0 : _d.outputs) != null ? _e : [];
1224
1283
  const description = (_f = blueprint == null ? void 0 : blueprint.description) != null ? _f : node.description;
1225
- return /* @__PURE__ */ jsxs13(Fragment9, { children: [
1226
- /* @__PURE__ */ jsxs13("div", { className: "detail-sticky-header", children: [
1227
- /* @__PURE__ */ jsxs13("div", { className: "detail-header", children: [
1228
- /* @__PURE__ */ jsx13(
1284
+ return /* @__PURE__ */ jsxs14(Fragment10, { children: [
1285
+ /* @__PURE__ */ jsxs14("div", { className: "detail-sticky-header", children: [
1286
+ /* @__PURE__ */ jsxs14("div", { className: "detail-header", children: [
1287
+ /* @__PURE__ */ jsx14(
1229
1288
  "span",
1230
1289
  {
1231
1290
  className: `detail-badge ${isController ? "detail-badge--controller" : "detail-badge--operator"}`,
1232
1291
  children: badge
1233
1292
  }
1234
1293
  ),
1235
- /* @__PURE__ */ jsx13(
1294
+ /* @__PURE__ */ jsx14(
1236
1295
  "span",
1237
1296
  {
1238
1297
  className: `detail-pipe-code ${isController ? "detail-pipe-code--controller" : ""}`,
@@ -1240,56 +1299,63 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1240
1299
  }
1241
1300
  )
1242
1301
  ] }),
1243
- /* @__PURE__ */ jsxs13("div", { className: "detail-status", children: [
1244
- /* @__PURE__ */ jsx13("span", { className: "detail-status-dot", style: { background: statusColor } }),
1245
- /* @__PURE__ */ jsx13("span", { className: "detail-status-label", style: { color: statusColor }, children: status }),
1246
- ((_g = node.timing) == null ? void 0 : _g.duration) != null && /* @__PURE__ */ jsx13("span", { className: "detail-duration", children: formatDuration(node.timing.duration) })
1302
+ /* @__PURE__ */ jsxs14("div", { className: "detail-status", children: [
1303
+ /* @__PURE__ */ jsx14("span", { className: "detail-status-dot", style: { background: statusColor } }),
1304
+ /* @__PURE__ */ jsx14("span", { className: "detail-status-label", style: { color: statusColor }, children: status }),
1305
+ ((_g = node.timing) == null ? void 0 : _g.duration) != null && /* @__PURE__ */ jsx14("span", { className: "detail-duration", children: formatDuration(node.timing.duration) })
1247
1306
  ] }),
1248
- description && /* @__PURE__ */ jsx13("div", { className: "detail-description", children: description }),
1249
- inputs.length > 0 && /* @__PURE__ */ jsxs13("div", { children: [
1250
- /* @__PURE__ */ jsx13("div", { className: "detail-section-label", children: "Inputs" }),
1251
- /* @__PURE__ */ jsx13("div", { className: "detail-io-list", children: inputs.map((input, idx) => /* @__PURE__ */ jsxs13(
1307
+ description && /* @__PURE__ */ jsx14("div", { className: "detail-description", children: description }),
1308
+ inputs.length > 0 && /* @__PURE__ */ jsxs14("div", { children: [
1309
+ /* @__PURE__ */ jsx14("div", { className: "detail-section-label", children: "Inputs" }),
1310
+ /* @__PURE__ */ jsx14("div", { className: "detail-io-list", children: inputs.map((input, idx) => /* @__PURE__ */ jsxs14(
1252
1311
  "div",
1253
1312
  {
1254
1313
  className: "detail-io-pill",
1255
1314
  style: { cursor: input.concept && onConceptClick ? "pointer" : void 0 },
1256
1315
  onClick: () => input.concept && (onConceptClick == null ? void 0 : onConceptClick(input.concept)),
1257
1316
  children: [
1258
- /* @__PURE__ */ jsx13("span", { className: "detail-io-name", children: input.name }),
1259
- input.concept && /* @__PURE__ */ jsx13("span", { className: "detail-io-concept", children: input.concept })
1317
+ /* @__PURE__ */ jsx14("span", { className: "detail-io-name", children: input.name }),
1318
+ input.concept && /* @__PURE__ */ jsx14("span", { className: "detail-io-concept", children: input.concept })
1260
1319
  ]
1261
1320
  },
1262
1321
  idx
1263
1322
  )) })
1264
1323
  ] }),
1265
- outputs.length > 0 && /* @__PURE__ */ jsxs13("div", { children: [
1266
- /* @__PURE__ */ jsx13("div", { className: "detail-section-label", children: "Output" }),
1267
- /* @__PURE__ */ jsx13("div", { className: "detail-io-list", children: outputs.map((output, idx) => /* @__PURE__ */ jsxs13(
1324
+ outputs.length > 0 && /* @__PURE__ */ jsxs14("div", { children: [
1325
+ /* @__PURE__ */ jsx14("div", { className: "detail-section-label", children: "Output" }),
1326
+ /* @__PURE__ */ jsx14("div", { className: "detail-io-list", children: outputs.map((output, idx) => /* @__PURE__ */ jsxs14(
1268
1327
  "div",
1269
1328
  {
1270
1329
  className: "detail-io-pill",
1271
1330
  style: { cursor: output.concept && onConceptClick ? "pointer" : void 0 },
1272
1331
  onClick: () => output.concept && (onConceptClick == null ? void 0 : onConceptClick(output.concept)),
1273
1332
  children: [
1274
- /* @__PURE__ */ jsx13("span", { className: "detail-io-name", children: output.name }),
1275
- output.concept && /* @__PURE__ */ jsx13("span", { className: "detail-io-concept", children: output.concept })
1333
+ /* @__PURE__ */ jsx14("span", { className: "detail-io-name", children: output.name }),
1334
+ output.concept && /* @__PURE__ */ jsx14("span", { className: "detail-io-concept", children: output.concept })
1276
1335
  ]
1277
1336
  },
1278
1337
  idx
1279
1338
  )) })
1280
1339
  ] }),
1281
- (inputs.length > 0 || outputs.length > 0) && /* @__PURE__ */ jsx13("div", { style: { borderTop: "1px solid rgba(255,255,255,0.06)", margin: "4px 0" } })
1340
+ (inputs.length > 0 || outputs.length > 0) && /* @__PURE__ */ jsx14("div", { style: { borderTop: "1px solid rgba(255,255,255,0.06)", margin: "4px 0" } })
1282
1341
  ] }),
1283
- blueprint && /* @__PURE__ */ jsx13(BlueprintSection, { blueprint, executionData: node.execution_data }),
1284
- node.execution_data && Object.keys(node.execution_data).length > 0 && /* @__PURE__ */ jsx13(ExecutionDataSection, { executionData: node.execution_data, pipeType }),
1285
- node.error && /* @__PURE__ */ jsxs13("div", { className: "detail-error", children: [
1286
- /* @__PURE__ */ jsx13("div", { className: "detail-error-type", children: node.error.error_type }),
1287
- /* @__PURE__ */ jsx13("div", { className: "detail-error-message", children: node.error.message }),
1288
- node.error.stack && /* @__PURE__ */ jsx13("div", { className: "detail-error-stack", children: node.error.stack })
1342
+ blueprint && /* @__PURE__ */ jsx14(BlueprintSection, { blueprint, executionData: node.execution_data }),
1343
+ node.execution_data && Object.keys(node.execution_data).length > 0 && /* @__PURE__ */ jsx14(
1344
+ ExecutionDataSection,
1345
+ {
1346
+ executionData: node.execution_data,
1347
+ pipeType,
1348
+ hasBlueprint: !!blueprint
1349
+ }
1350
+ ),
1351
+ node.error && /* @__PURE__ */ jsxs14("div", { className: "detail-error", children: [
1352
+ /* @__PURE__ */ jsx14("div", { className: "detail-error-type", children: node.error.error_type }),
1353
+ /* @__PURE__ */ jsx14("div", { className: "detail-error-message", children: node.error.message }),
1354
+ node.error.stack && /* @__PURE__ */ jsx14("div", { className: "detail-error-stack", children: node.error.stack })
1289
1355
  ] }),
1290
- node.metrics && Object.keys(node.metrics).length > 0 && /* @__PURE__ */ jsxs13("div", { children: [
1291
- /* @__PURE__ */ jsx13("div", { className: "detail-section-label", children: "Metrics" }),
1292
- Object.entries(node.metrics).map(([key, value]) => /* @__PURE__ */ jsx13(
1356
+ node.metrics && Object.keys(node.metrics).length > 0 && /* @__PURE__ */ jsxs14("div", { children: [
1357
+ /* @__PURE__ */ jsx14("div", { className: "detail-section-label", children: "Metrics" }),
1358
+ Object.entries(node.metrics).map(([key, value]) => /* @__PURE__ */ jsx14(
1293
1359
  KV,
1294
1360
  {
1295
1361
  label: key,
@@ -1298,17 +1364,17 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1298
1364
  key
1299
1365
  ))
1300
1366
  ] }),
1301
- node.tags && Object.keys(node.tags).length > 0 && /* @__PURE__ */ jsxs13("div", { children: [
1302
- /* @__PURE__ */ jsx13("div", { className: "detail-section-label", children: "Tags" }),
1303
- /* @__PURE__ */ jsx13("div", { className: "detail-tags", children: Object.entries(node.tags).map(([key, value]) => /* @__PURE__ */ jsxs13("span", { className: "detail-tag", children: [
1304
- /* @__PURE__ */ jsxs13("span", { className: "detail-tag-key", children: [
1367
+ node.tags && Object.keys(node.tags).length > 0 && /* @__PURE__ */ jsxs14("div", { children: [
1368
+ /* @__PURE__ */ jsx14("div", { className: "detail-section-label", children: "Tags" }),
1369
+ /* @__PURE__ */ jsx14("div", { className: "detail-tags", children: Object.entries(node.tags).map(([key, value]) => /* @__PURE__ */ jsxs14("span", { className: "detail-tag", children: [
1370
+ /* @__PURE__ */ jsxs14("span", { className: "detail-tag-key", children: [
1305
1371
  key,
1306
1372
  ": "
1307
1373
  ] }),
1308
- /* @__PURE__ */ jsx13("span", { className: "detail-tag-value", children: value })
1374
+ /* @__PURE__ */ jsx14("span", { className: "detail-tag-value", children: value })
1309
1375
  ] }, key)) })
1310
1376
  ] }),
1311
- !blueprint && /* @__PURE__ */ jsx13("div", { className: "detail-not-available", children: "Blueprint not available" })
1377
+ !blueprint && /* @__PURE__ */ jsx14("div", { className: "detail-not-available", children: "Blueprint not available" })
1312
1378
  ] });
1313
1379
  }
1314
1380
  function BlueprintSection({
@@ -1317,70 +1383,53 @@ function BlueprintSection({
1317
1383
  }) {
1318
1384
  switch (blueprint.type) {
1319
1385
  case "PipeLLM":
1320
- return /* @__PURE__ */ jsx13(PipeLLMSection, { blueprint, executionData });
1386
+ return /* @__PURE__ */ jsx14(PipeLLMSection, { blueprint, executionData });
1321
1387
  case "PipeImgGen":
1322
- return /* @__PURE__ */ jsx13(PipeImgGenSection, { blueprint, executionData });
1388
+ return /* @__PURE__ */ jsx14(PipeImgGenSection, { blueprint, executionData });
1323
1389
  case "PipeCompose":
1324
- return /* @__PURE__ */ jsx13(PipeComposeSection, { blueprint, executionData });
1390
+ return /* @__PURE__ */ jsx14(PipeComposeSection, { blueprint, executionData });
1325
1391
  case "PipeExtract":
1326
- return /* @__PURE__ */ jsx13(PipeExtractSection, { blueprint, executionData });
1392
+ return /* @__PURE__ */ jsx14(PipeExtractSection, { blueprint, executionData });
1327
1393
  case "PipeSearch":
1328
- return /* @__PURE__ */ jsx13(PipeSearchSection, { blueprint, executionData });
1394
+ return /* @__PURE__ */ jsx14(PipeSearchSection, { blueprint, executionData });
1395
+ case "PipeStructure":
1396
+ return /* @__PURE__ */ jsx14(PipeStructureSection, { blueprint, executionData });
1329
1397
  case "PipeSequence":
1330
- return /* @__PURE__ */ jsx13(PipeSequenceSection, { blueprint, executionData });
1398
+ return /* @__PURE__ */ jsx14(PipeSequenceSection, { blueprint, executionData });
1331
1399
  case "PipeParallel":
1332
- return /* @__PURE__ */ jsx13(PipeParallelSection, { blueprint, executionData });
1400
+ return /* @__PURE__ */ jsx14(PipeParallelSection, { blueprint, executionData });
1333
1401
  case "PipeCondition":
1334
- return /* @__PURE__ */ jsx13(PipeConditionSection, { blueprint, executionData });
1402
+ return /* @__PURE__ */ jsx14(PipeConditionSection, { blueprint, executionData });
1335
1403
  case "PipeBatch":
1336
- return /* @__PURE__ */ jsx13(PipeBatchSection, { blueprint, executionData });
1404
+ return /* @__PURE__ */ jsx14(PipeBatchSection, { blueprint, executionData });
1337
1405
  case "PipeFunc":
1338
1406
  return null;
1339
1407
  case "PipeSignature":
1340
- return /* @__PURE__ */ jsx13("div", { className: "detail-not-available", children: "Signature stub \u2014 declared but not yet implemented." });
1408
+ return /* @__PURE__ */ jsx14("div", { className: "detail-not-available", children: "Signature stub \u2014 declared but not yet implemented." });
1341
1409
  default:
1342
1410
  return null;
1343
1411
  }
1344
1412
  }
1345
1413
  function ExecutionDataSection({
1346
1414
  executionData,
1347
- pipeType
1415
+ pipeType,
1416
+ hasBlueprint
1348
1417
  }) {
1349
- switch (pipeType) {
1350
- case "PipeLLM":
1351
- return /* @__PURE__ */ jsx13(LLMExecutionData, { data: executionData });
1352
- case "PipeImgGen":
1353
- return /* @__PURE__ */ jsx13(ImgGenExecutionData, { data: executionData });
1354
- case "PipeExtract":
1355
- return /* @__PURE__ */ jsx13(ExtractExecutionData, { data: executionData });
1356
- case "PipeSearch":
1357
- return /* @__PURE__ */ jsx13(SearchExecutionData, { data: executionData });
1358
- case "PipeCompose":
1359
- return /* @__PURE__ */ jsx13(ComposeExecutionData, { data: executionData });
1360
- case "PipeCondition":
1361
- return /* @__PURE__ */ jsx13(ConditionExecutionData, { data: executionData });
1362
- case "PipeSequence":
1363
- return /* @__PURE__ */ jsx13(SequenceExecutionData, { data: executionData });
1364
- case "PipeParallel":
1365
- return /* @__PURE__ */ jsx13(ParallelExecutionData, { data: executionData });
1366
- case "PipeBatch":
1367
- return /* @__PURE__ */ jsx13(BatchExecutionData, { data: executionData });
1368
- default:
1369
- return /* @__PURE__ */ jsx13(GenericExecutionData, { data: executionData });
1370
- }
1418
+ if (!shouldDumpExecutionData(pipeType, hasBlueprint)) return null;
1419
+ return /* @__PURE__ */ jsx14(GenericExecutionData, { data: executionData });
1371
1420
  }
1372
1421
  function GenericExecutionData({ data }) {
1373
1422
  const entries = Object.entries(data);
1374
1423
  if (entries.length === 0) return null;
1375
- return /* @__PURE__ */ jsxs13(Fragment9, { children: [
1376
- /* @__PURE__ */ jsx13("div", { className: "detail-section-label", children: "Execution" }),
1377
- entries.map(([key, value]) => /* @__PURE__ */ jsx13(KV, { label: key, value: String(value) }, key))
1424
+ return /* @__PURE__ */ jsxs14(Fragment10, { children: [
1425
+ /* @__PURE__ */ jsx14("div", { className: "detail-section-label", children: "Execution" }),
1426
+ entries.map(([key, value]) => /* @__PURE__ */ jsx14(KV, { label: key, value: String(value) }, key))
1378
1427
  ] });
1379
1428
  }
1380
1429
 
1381
1430
  // src/graph/react/detail/ConceptDetailPanel.tsx
1382
1431
  import React7 from "react";
1383
- import { Fragment as Fragment10, jsx as jsx14, jsxs as jsxs14 } from "react/jsx-runtime";
1432
+ import { Fragment as Fragment11, jsx as jsx15, jsxs as jsxs15 } from "react/jsx-runtime";
1384
1433
  function ConceptDetailPanel({
1385
1434
  concept,
1386
1435
  ioData,
@@ -1391,17 +1440,17 @@ function ConceptDetailPanel({
1391
1440
  instanceKey
1392
1441
  }) {
1393
1442
  var _a;
1394
- return /* @__PURE__ */ jsxs14(Fragment10, { children: [
1395
- /* @__PURE__ */ jsxs14("div", { className: "detail-header", children: [
1396
- /* @__PURE__ */ jsx14("span", { className: "detail-concept-code", children: concept.code }),
1397
- /* @__PURE__ */ jsx14("span", { className: "detail-concept-domain", children: concept.domain_code })
1443
+ return /* @__PURE__ */ jsxs15(Fragment11, { children: [
1444
+ /* @__PURE__ */ jsxs15("div", { className: "detail-header", children: [
1445
+ /* @__PURE__ */ jsx15("span", { className: "detail-concept-code", children: concept.code }),
1446
+ /* @__PURE__ */ jsx15("span", { className: "detail-concept-domain", children: concept.domain_code })
1398
1447
  ] }),
1399
- concept.description && /* @__PURE__ */ jsx14("div", { className: "detail-description", children: concept.description }),
1400
- concept.refines && /* @__PURE__ */ jsxs14("div", { className: "detail-refines", children: [
1448
+ concept.description && /* @__PURE__ */ jsx15("div", { className: "detail-description", children: concept.description }),
1449
+ concept.refines && /* @__PURE__ */ jsxs15("div", { className: "detail-refines", children: [
1401
1450
  "refines ",
1402
- /* @__PURE__ */ jsx14("span", { className: "detail-refines-code", children: concept.refines })
1451
+ /* @__PURE__ */ jsx15("span", { className: "detail-refines-code", children: concept.refines })
1403
1452
  ] }),
1404
- /* @__PURE__ */ jsx14(
1453
+ /* @__PURE__ */ jsx15(
1405
1454
  ConceptBody,
1406
1455
  {
1407
1456
  concept,
@@ -1428,10 +1477,10 @@ function ConceptBody({
1428
1477
  const baseId = React7.useId();
1429
1478
  const tabId = (tab) => `${baseId}-tab-${tab}`;
1430
1479
  const panelId = (tab) => `${baseId}-tabpanel-${tab}`;
1431
- const structure = concept.json_schema ? /* @__PURE__ */ jsxs14("div", { children: [
1432
- /* @__PURE__ */ jsx14("div", { className: "detail-section-label", children: "Structure" }),
1433
- /* @__PURE__ */ jsx14(SchemaTable, { schema: concept.json_schema, isDryRun })
1434
- ] }) : /* @__PURE__ */ jsx14("div", { className: "detail-not-available", children: "Schema not available" });
1480
+ const structure = concept.json_schema ? /* @__PURE__ */ jsxs15("div", { children: [
1481
+ /* @__PURE__ */ jsx15("div", { className: "detail-section-label", children: "Structure" }),
1482
+ /* @__PURE__ */ jsx15(SchemaTable, { schema: concept.json_schema, isDryRun })
1483
+ ] }) : /* @__PURE__ */ jsx15("div", { className: "detail-not-available", children: "Schema not available" });
1435
1484
  if (!hasData) return structure;
1436
1485
  const onTabKeyDown = (event) => {
1437
1486
  var _a;
@@ -1454,7 +1503,7 @@ function ConceptBody({
1454
1503
  setActiveTab(next);
1455
1504
  (_a = document.getElementById(tabId(next))) == null ? void 0 : _a.focus();
1456
1505
  };
1457
- const renderTab = (tab, label) => /* @__PURE__ */ jsx14(
1506
+ const renderTab = (tab, label) => /* @__PURE__ */ jsx15(
1458
1507
  "button",
1459
1508
  {
1460
1509
  type: "button",
@@ -1469,12 +1518,12 @@ function ConceptBody({
1469
1518
  children: label
1470
1519
  }
1471
1520
  );
1472
- return /* @__PURE__ */ jsxs14(Fragment10, { children: [
1473
- /* @__PURE__ */ jsxs14("div", { className: "detail-tabs", role: "tablist", "aria-label": "Concept views", children: [
1521
+ return /* @__PURE__ */ jsxs15(Fragment11, { children: [
1522
+ /* @__PURE__ */ jsxs15("div", { className: "detail-tabs", role: "tablist", "aria-label": "Concept views", children: [
1474
1523
  renderTab("data", "Data"),
1475
1524
  renderTab("structure", "Structure")
1476
1525
  ] }),
1477
- /* @__PURE__ */ jsx14("div", { role: "tabpanel", id: panelId(activeTab), "aria-labelledby": tabId(activeTab), children: activeTab === "data" ? /* @__PURE__ */ jsx14(
1526
+ /* @__PURE__ */ jsx15("div", { role: "tabpanel", id: panelId(activeTab), "aria-labelledby": tabId(activeTab), children: activeTab === "data" ? /* @__PURE__ */ jsx15(
1478
1527
  StuffViewer,
1479
1528
  {
1480
1529
  stuff: toStuffViewerData(ioData),
@@ -1493,24 +1542,24 @@ function SchemaTable({
1493
1542
  const properties = schema.properties;
1494
1543
  const required = new Set((_a = schema.required) != null ? _a : []);
1495
1544
  if (!properties || Object.keys(properties).length === 0) {
1496
- return /* @__PURE__ */ jsx14("div", { className: "detail-not-available", children: "No fields defined" });
1545
+ return /* @__PURE__ */ jsx15("div", { className: "detail-not-available", children: "No fields defined" });
1497
1546
  }
1498
1547
  const fields = Object.entries(properties);
1499
1548
  const visibleFields = isDryRun ? fields.filter(([name]) => required.has(name)) : fields;
1500
- return /* @__PURE__ */ jsxs14("table", { className: "detail-schema-table", children: [
1501
- /* @__PURE__ */ jsx14("thead", { children: /* @__PURE__ */ jsxs14("tr", { children: [
1502
- /* @__PURE__ */ jsx14("th", { children: "Field" }),
1503
- /* @__PURE__ */ jsx14("th", { children: "Type" }),
1504
- /* @__PURE__ */ jsx14("th", {}),
1505
- /* @__PURE__ */ jsx14("th", { children: "Description" })
1549
+ return /* @__PURE__ */ jsxs15("table", { className: "detail-schema-table", children: [
1550
+ /* @__PURE__ */ jsx15("thead", { children: /* @__PURE__ */ jsxs15("tr", { children: [
1551
+ /* @__PURE__ */ jsx15("th", { children: "Field" }),
1552
+ /* @__PURE__ */ jsx15("th", { children: "Type" }),
1553
+ /* @__PURE__ */ jsx15("th", {}),
1554
+ /* @__PURE__ */ jsx15("th", { children: "Description" })
1506
1555
  ] }) }),
1507
- /* @__PURE__ */ jsx14("tbody", { children: visibleFields.map(([fieldName, fieldSchema]) => {
1556
+ /* @__PURE__ */ jsx15("tbody", { children: visibleFields.map(([fieldName, fieldSchema]) => {
1508
1557
  var _a2;
1509
- return /* @__PURE__ */ jsxs14("tr", { children: [
1510
- /* @__PURE__ */ jsx14("td", { className: "detail-schema-field", children: fieldName }),
1511
- /* @__PURE__ */ jsx14("td", { className: "detail-schema-type", children: extractType(fieldSchema) }),
1512
- /* @__PURE__ */ jsx14("td", { children: required.has(fieldName) && /* @__PURE__ */ jsx14("span", { className: "detail-schema-required", children: "req" }) }),
1513
- /* @__PURE__ */ jsx14("td", { children: (_a2 = fieldSchema.description) != null ? _a2 : "" })
1558
+ return /* @__PURE__ */ jsxs15("tr", { children: [
1559
+ /* @__PURE__ */ jsx15("td", { className: "detail-schema-field", children: fieldName }),
1560
+ /* @__PURE__ */ jsx15("td", { className: "detail-schema-type", children: extractType(fieldSchema) }),
1561
+ /* @__PURE__ */ jsx15("td", { children: required.has(fieldName) && /* @__PURE__ */ jsx15("span", { className: "detail-schema-required", children: "req" }) }),
1562
+ /* @__PURE__ */ jsx15("td", { children: (_a2 = fieldSchema.description) != null ? _a2 : "" })
1514
1563
  ] }, fieldName);
1515
1564
  }) })
1516
1565
  ] });
@@ -1577,10 +1626,10 @@ function toAppEdges(edges) {
1577
1626
  }
1578
1627
 
1579
1628
  // src/graph/react/viewer/renderLabel.tsx
1580
- import { jsx as jsx15, jsxs as jsxs15 } from "react/jsx-runtime";
1629
+ import { jsx as jsx16, jsxs as jsxs16 } from "react/jsx-runtime";
1581
1630
  function renderLabel(desc) {
1582
1631
  if (desc.kind === "pipe") {
1583
- return /* @__PURE__ */ jsx15(
1632
+ return /* @__PURE__ */ jsx16(
1584
1633
  "div",
1585
1634
  {
1586
1635
  style: {
@@ -1594,7 +1643,7 @@ function renderLabel(desc) {
1594
1643
  minWidth: 0
1595
1644
  },
1596
1645
  title: desc.label,
1597
- children: /* @__PURE__ */ jsx15(
1646
+ children: /* @__PURE__ */ jsx16(
1598
1647
  "span",
1599
1648
  {
1600
1649
  style: {
@@ -1613,7 +1662,7 @@ function renderLabel(desc) {
1613
1662
  }
1614
1663
  );
1615
1664
  }
1616
- return /* @__PURE__ */ jsxs15(
1665
+ return /* @__PURE__ */ jsxs16(
1617
1666
  "div",
1618
1667
  {
1619
1668
  style: {
@@ -1629,7 +1678,7 @@ function renderLabel(desc) {
1629
1678
  },
1630
1679
  title: desc.concept ? `${desc.label}: ${desc.concept}` : desc.label,
1631
1680
  children: [
1632
- /* @__PURE__ */ jsx15(
1681
+ /* @__PURE__ */ jsx16(
1633
1682
  "span",
1634
1683
  {
1635
1684
  style: {
@@ -1645,7 +1694,7 @@ function renderLabel(desc) {
1645
1694
  children: desc.label
1646
1695
  }
1647
1696
  ),
1648
- desc.concept && /* @__PURE__ */ jsx15(
1697
+ desc.concept && /* @__PURE__ */ jsx16(
1649
1698
  "span",
1650
1699
  {
1651
1700
  style: {
@@ -1676,9 +1725,9 @@ function hydrateLabels(nodes) {
1676
1725
 
1677
1726
  // src/graph/react/viewer/GraphToolbar.tsx
1678
1727
  import { Panel } from "@xyflow/react";
1679
- import { Fragment as Fragment11, jsx as jsx16, jsxs as jsxs16 } from "react/jsx-runtime";
1728
+ import { Fragment as Fragment12, jsx as jsx17, jsxs as jsxs17 } from "react/jsx-runtime";
1680
1729
  var REACTFLOW_PANEL_MARGIN = 15;
1681
- var ARROW_RIGHT_ICON = /* @__PURE__ */ jsxs16(
1730
+ var ARROW_RIGHT_ICON = /* @__PURE__ */ jsxs17(
1682
1731
  "svg",
1683
1732
  {
1684
1733
  viewBox: "0 0 24 24",
@@ -1690,12 +1739,12 @@ var ARROW_RIGHT_ICON = /* @__PURE__ */ jsxs16(
1690
1739
  strokeLinecap: "round",
1691
1740
  strokeLinejoin: "round",
1692
1741
  children: [
1693
- /* @__PURE__ */ jsx16("line", { x1: "5", y1: "12", x2: "19", y2: "12" }),
1694
- /* @__PURE__ */ jsx16("polyline", { points: "12 5 19 12 12 19" })
1742
+ /* @__PURE__ */ jsx17("line", { x1: "5", y1: "12", x2: "19", y2: "12" }),
1743
+ /* @__PURE__ */ jsx17("polyline", { points: "12 5 19 12 12 19" })
1695
1744
  ]
1696
1745
  }
1697
1746
  );
1698
- var ARROW_DOWN_ICON = /* @__PURE__ */ jsxs16(
1747
+ var ARROW_DOWN_ICON = /* @__PURE__ */ jsxs17(
1699
1748
  "svg",
1700
1749
  {
1701
1750
  viewBox: "0 0 24 24",
@@ -1707,12 +1756,12 @@ var ARROW_DOWN_ICON = /* @__PURE__ */ jsxs16(
1707
1756
  strokeLinecap: "round",
1708
1757
  strokeLinejoin: "round",
1709
1758
  children: [
1710
- /* @__PURE__ */ jsx16("line", { x1: "12", y1: "5", x2: "12", y2: "19" }),
1711
- /* @__PURE__ */ jsx16("polyline", { points: "19 12 12 19 5 12" })
1759
+ /* @__PURE__ */ jsx17("line", { x1: "12", y1: "5", x2: "12", y2: "19" }),
1760
+ /* @__PURE__ */ jsx17("polyline", { points: "19 12 12 19 5 12" })
1712
1761
  ]
1713
1762
  }
1714
1763
  );
1715
- var MINUS_ICON = /* @__PURE__ */ jsx16(
1764
+ var MINUS_ICON = /* @__PURE__ */ jsx17(
1716
1765
  "svg",
1717
1766
  {
1718
1767
  viewBox: "0 0 24 24",
@@ -1723,10 +1772,10 @@ var MINUS_ICON = /* @__PURE__ */ jsx16(
1723
1772
  strokeWidth: "2",
1724
1773
  strokeLinecap: "round",
1725
1774
  strokeLinejoin: "round",
1726
- children: /* @__PURE__ */ jsx16("line", { x1: "5", y1: "12", x2: "19", y2: "12" })
1775
+ children: /* @__PURE__ */ jsx17("line", { x1: "5", y1: "12", x2: "19", y2: "12" })
1727
1776
  }
1728
1777
  );
1729
- var PLUS_ICON = /* @__PURE__ */ jsxs16(
1778
+ var PLUS_ICON = /* @__PURE__ */ jsxs17(
1730
1779
  "svg",
1731
1780
  {
1732
1781
  viewBox: "0 0 24 24",
@@ -1738,12 +1787,12 @@ var PLUS_ICON = /* @__PURE__ */ jsxs16(
1738
1787
  strokeLinecap: "round",
1739
1788
  strokeLinejoin: "round",
1740
1789
  children: [
1741
- /* @__PURE__ */ jsx16("line", { x1: "12", y1: "5", x2: "12", y2: "19" }),
1742
- /* @__PURE__ */ jsx16("line", { x1: "5", y1: "12", x2: "19", y2: "12" })
1790
+ /* @__PURE__ */ jsx17("line", { x1: "12", y1: "5", x2: "12", y2: "19" }),
1791
+ /* @__PURE__ */ jsx17("line", { x1: "5", y1: "12", x2: "19", y2: "12" })
1743
1792
  ]
1744
1793
  }
1745
1794
  );
1746
- var FIT_VIEW_ICON = /* @__PURE__ */ jsxs16(
1795
+ var FIT_VIEW_ICON = /* @__PURE__ */ jsxs17(
1747
1796
  "svg",
1748
1797
  {
1749
1798
  viewBox: "0 0 24 24",
@@ -1755,14 +1804,14 @@ var FIT_VIEW_ICON = /* @__PURE__ */ jsxs16(
1755
1804
  strokeLinecap: "round",
1756
1805
  strokeLinejoin: "round",
1757
1806
  children: [
1758
- /* @__PURE__ */ jsx16("polyline", { points: "15 3 21 3 21 9" }),
1759
- /* @__PURE__ */ jsx16("polyline", { points: "9 21 3 21 3 15" }),
1760
- /* @__PURE__ */ jsx16("line", { x1: "21", y1: "3", x2: "14", y2: "10" }),
1761
- /* @__PURE__ */ jsx16("line", { x1: "3", y1: "21", x2: "10", y2: "14" })
1807
+ /* @__PURE__ */ jsx17("polyline", { points: "15 3 21 3 21 9" }),
1808
+ /* @__PURE__ */ jsx17("polyline", { points: "9 21 3 21 3 15" }),
1809
+ /* @__PURE__ */ jsx17("line", { x1: "21", y1: "3", x2: "14", y2: "10" }),
1810
+ /* @__PURE__ */ jsx17("line", { x1: "3", y1: "21", x2: "10", y2: "14" })
1762
1811
  ]
1763
1812
  }
1764
1813
  );
1765
- var BOXES_ICON = /* @__PURE__ */ jsxs16(
1814
+ var BOXES_ICON = /* @__PURE__ */ jsxs17(
1766
1815
  "svg",
1767
1816
  {
1768
1817
  viewBox: "0 0 24 24",
@@ -1774,22 +1823,22 @@ var BOXES_ICON = /* @__PURE__ */ jsxs16(
1774
1823
  strokeLinecap: "round",
1775
1824
  strokeLinejoin: "round",
1776
1825
  children: [
1777
- /* @__PURE__ */ jsx16("path", { d: "M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z" }),
1778
- /* @__PURE__ */ jsx16("path", { d: "m7 16.5-4.74-2.85" }),
1779
- /* @__PURE__ */ jsx16("path", { d: "m7 16.5 5-3" }),
1780
- /* @__PURE__ */ jsx16("path", { d: "M7 16.5v5.17" }),
1781
- /* @__PURE__ */ jsx16("path", { d: "M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z" }),
1782
- /* @__PURE__ */ jsx16("path", { d: "m17 16.5-5-3" }),
1783
- /* @__PURE__ */ jsx16("path", { d: "m17 16.5 4.74-2.85" }),
1784
- /* @__PURE__ */ jsx16("path", { d: "M17 16.5v5.17" }),
1785
- /* @__PURE__ */ jsx16("path", { d: "M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z" }),
1786
- /* @__PURE__ */ jsx16("path", { d: "M12 8 7.26 5.15" }),
1787
- /* @__PURE__ */ jsx16("path", { d: "m12 8 4.74-2.85" }),
1788
- /* @__PURE__ */ jsx16("path", { d: "M12 13.5V8" })
1826
+ /* @__PURE__ */ jsx17("path", { d: "M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z" }),
1827
+ /* @__PURE__ */ jsx17("path", { d: "m7 16.5-4.74-2.85" }),
1828
+ /* @__PURE__ */ jsx17("path", { d: "m7 16.5 5-3" }),
1829
+ /* @__PURE__ */ jsx17("path", { d: "M7 16.5v5.17" }),
1830
+ /* @__PURE__ */ jsx17("path", { d: "M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z" }),
1831
+ /* @__PURE__ */ jsx17("path", { d: "m17 16.5-5-3" }),
1832
+ /* @__PURE__ */ jsx17("path", { d: "m17 16.5 4.74-2.85" }),
1833
+ /* @__PURE__ */ jsx17("path", { d: "M17 16.5v5.17" }),
1834
+ /* @__PURE__ */ jsx17("path", { d: "M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z" }),
1835
+ /* @__PURE__ */ jsx17("path", { d: "M12 8 7.26 5.15" }),
1836
+ /* @__PURE__ */ jsx17("path", { d: "m12 8 4.74-2.85" }),
1837
+ /* @__PURE__ */ jsx17("path", { d: "M12 13.5V8" })
1789
1838
  ]
1790
1839
  }
1791
1840
  );
1792
- var FOLD_ALL_ICON = /* @__PURE__ */ jsxs16(
1841
+ var FOLD_ALL_ICON = /* @__PURE__ */ jsxs17(
1793
1842
  "svg",
1794
1843
  {
1795
1844
  viewBox: "0 0 24 24",
@@ -1801,15 +1850,15 @@ var FOLD_ALL_ICON = /* @__PURE__ */ jsxs16(
1801
1850
  strokeLinecap: "round",
1802
1851
  strokeLinejoin: "round",
1803
1852
  children: [
1804
- /* @__PURE__ */ jsx16("rect", { x: "6", y: "6", width: "12", height: "12", rx: "2" }),
1805
- /* @__PURE__ */ jsx16("polyline", { points: "2 2 6 6 2 6" }),
1806
- /* @__PURE__ */ jsx16("polyline", { points: "22 2 18 6 22 6" }),
1807
- /* @__PURE__ */ jsx16("polyline", { points: "2 22 6 18 2 18" }),
1808
- /* @__PURE__ */ jsx16("polyline", { points: "22 22 18 18 22 18" })
1853
+ /* @__PURE__ */ jsx17("rect", { x: "6", y: "6", width: "12", height: "12", rx: "2" }),
1854
+ /* @__PURE__ */ jsx17("polyline", { points: "2 2 6 6 2 6" }),
1855
+ /* @__PURE__ */ jsx17("polyline", { points: "22 2 18 6 22 6" }),
1856
+ /* @__PURE__ */ jsx17("polyline", { points: "2 22 6 18 2 18" }),
1857
+ /* @__PURE__ */ jsx17("polyline", { points: "22 22 18 18 22 18" })
1809
1858
  ]
1810
1859
  }
1811
1860
  );
1812
- var EXPAND_ALL_ICON = /* @__PURE__ */ jsxs16(
1861
+ var EXPAND_ALL_ICON = /* @__PURE__ */ jsxs17(
1813
1862
  "svg",
1814
1863
  {
1815
1864
  viewBox: "0 0 24 24",
@@ -1821,15 +1870,15 @@ var EXPAND_ALL_ICON = /* @__PURE__ */ jsxs16(
1821
1870
  strokeLinecap: "round",
1822
1871
  strokeLinejoin: "round",
1823
1872
  children: [
1824
- /* @__PURE__ */ jsx16("rect", { x: "9", y: "9", width: "6", height: "6", rx: "1" }),
1825
- /* @__PURE__ */ jsx16("polyline", { points: "3 3 7 7 3 7" }),
1826
- /* @__PURE__ */ jsx16("polyline", { points: "21 3 17 7 21 7" }),
1827
- /* @__PURE__ */ jsx16("polyline", { points: "3 21 7 17 3 17" }),
1828
- /* @__PURE__ */ jsx16("polyline", { points: "21 21 17 17 21 17" })
1873
+ /* @__PURE__ */ jsx17("rect", { x: "9", y: "9", width: "6", height: "6", rx: "1" }),
1874
+ /* @__PURE__ */ jsx17("polyline", { points: "3 3 7 7 3 7" }),
1875
+ /* @__PURE__ */ jsx17("polyline", { points: "21 3 17 7 21 7" }),
1876
+ /* @__PURE__ */ jsx17("polyline", { points: "3 21 7 17 3 17" }),
1877
+ /* @__PURE__ */ jsx17("polyline", { points: "21 21 17 17 21 17" })
1829
1878
  ]
1830
1879
  }
1831
1880
  );
1832
- var SUN_ICON = /* @__PURE__ */ jsxs16(
1881
+ var SUN_ICON = /* @__PURE__ */ jsxs17(
1833
1882
  "svg",
1834
1883
  {
1835
1884
  viewBox: "0 0 24 24",
@@ -1841,19 +1890,19 @@ var SUN_ICON = /* @__PURE__ */ jsxs16(
1841
1890
  strokeLinecap: "round",
1842
1891
  strokeLinejoin: "round",
1843
1892
  children: [
1844
- /* @__PURE__ */ jsx16("circle", { cx: "12", cy: "12", r: "4" }),
1845
- /* @__PURE__ */ jsx16("line", { x1: "12", y1: "2", x2: "12", y2: "4" }),
1846
- /* @__PURE__ */ jsx16("line", { x1: "12", y1: "20", x2: "12", y2: "22" }),
1847
- /* @__PURE__ */ jsx16("line", { x1: "4.93", y1: "4.93", x2: "6.34", y2: "6.34" }),
1848
- /* @__PURE__ */ jsx16("line", { x1: "17.66", y1: "17.66", x2: "19.07", y2: "19.07" }),
1849
- /* @__PURE__ */ jsx16("line", { x1: "2", y1: "12", x2: "4", y2: "12" }),
1850
- /* @__PURE__ */ jsx16("line", { x1: "20", y1: "12", x2: "22", y2: "12" }),
1851
- /* @__PURE__ */ jsx16("line", { x1: "4.93", y1: "19.07", x2: "6.34", y2: "17.66" }),
1852
- /* @__PURE__ */ jsx16("line", { x1: "17.66", y1: "6.34", x2: "19.07", y2: "4.93" })
1893
+ /* @__PURE__ */ jsx17("circle", { cx: "12", cy: "12", r: "4" }),
1894
+ /* @__PURE__ */ jsx17("line", { x1: "12", y1: "2", x2: "12", y2: "4" }),
1895
+ /* @__PURE__ */ jsx17("line", { x1: "12", y1: "20", x2: "12", y2: "22" }),
1896
+ /* @__PURE__ */ jsx17("line", { x1: "4.93", y1: "4.93", x2: "6.34", y2: "6.34" }),
1897
+ /* @__PURE__ */ jsx17("line", { x1: "17.66", y1: "17.66", x2: "19.07", y2: "19.07" }),
1898
+ /* @__PURE__ */ jsx17("line", { x1: "2", y1: "12", x2: "4", y2: "12" }),
1899
+ /* @__PURE__ */ jsx17("line", { x1: "20", y1: "12", x2: "22", y2: "12" }),
1900
+ /* @__PURE__ */ jsx17("line", { x1: "4.93", y1: "19.07", x2: "6.34", y2: "17.66" }),
1901
+ /* @__PURE__ */ jsx17("line", { x1: "17.66", y1: "6.34", x2: "19.07", y2: "4.93" })
1853
1902
  ]
1854
1903
  }
1855
1904
  );
1856
- var MOON_ICON = /* @__PURE__ */ jsx16(
1905
+ var MOON_ICON = /* @__PURE__ */ jsx17(
1857
1906
  "svg",
1858
1907
  {
1859
1908
  viewBox: "0 0 24 24",
@@ -1864,10 +1913,10 @@ var MOON_ICON = /* @__PURE__ */ jsx16(
1864
1913
  strokeWidth: "2",
1865
1914
  strokeLinecap: "round",
1866
1915
  strokeLinejoin: "round",
1867
- children: /* @__PURE__ */ jsx16("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" })
1916
+ children: /* @__PURE__ */ jsx17("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" })
1868
1917
  }
1869
1918
  );
1870
- var MONITOR_ICON = /* @__PURE__ */ jsxs16(
1919
+ var MONITOR_ICON = /* @__PURE__ */ jsxs17(
1871
1920
  "svg",
1872
1921
  {
1873
1922
  viewBox: "0 0 24 24",
@@ -1879,9 +1928,9 @@ var MONITOR_ICON = /* @__PURE__ */ jsxs16(
1879
1928
  strokeLinecap: "round",
1880
1929
  strokeLinejoin: "round",
1881
1930
  children: [
1882
- /* @__PURE__ */ jsx16("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2" }),
1883
- /* @__PURE__ */ jsx16("line", { x1: "8", y1: "21", x2: "16", y2: "21" }),
1884
- /* @__PURE__ */ jsx16("line", { x1: "12", y1: "17", x2: "12", y2: "21" })
1931
+ /* @__PURE__ */ jsx17("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2" }),
1932
+ /* @__PURE__ */ jsx17("line", { x1: "8", y1: "21", x2: "16", y2: "21" }),
1933
+ /* @__PURE__ */ jsx17("line", { x1: "12", y1: "17", x2: "12", y2: "21" })
1885
1934
  ]
1886
1935
  }
1887
1936
  );
@@ -1935,8 +1984,8 @@ function GraphToolbar({
1935
1984
  const foldAllSection = onFoldAll || onExpandAll;
1936
1985
  const foldAllTitle = foldAllDisabled ? "Fold all controllers (nothing to fold)" : "Fold all controllers";
1937
1986
  const expandAllTitle = expandAllDisabled ? "Expand all controllers (nothing to expand)" : "Expand all controllers";
1938
- return /* @__PURE__ */ jsx16(Panel, { position, className: "graph-toolbar-panel", style: panelStyle, children: /* @__PURE__ */ jsxs16("div", { className: `graph-toolbar graph-toolbar--${orientation}`, children: [
1939
- onFoldAll && /* @__PURE__ */ jsx16(
1987
+ return /* @__PURE__ */ jsx17(Panel, { position, className: "graph-toolbar-panel", style: panelStyle, children: /* @__PURE__ */ jsxs17("div", { className: `graph-toolbar graph-toolbar--${orientation}`, children: [
1988
+ onFoldAll && /* @__PURE__ */ jsx17(
1940
1989
  "button",
1941
1990
  {
1942
1991
  type: "button",
@@ -1948,7 +1997,7 @@ function GraphToolbar({
1948
1997
  children: FOLD_ALL_ICON
1949
1998
  }
1950
1999
  ),
1951
- onExpandAll && /* @__PURE__ */ jsx16(
2000
+ onExpandAll && /* @__PURE__ */ jsx17(
1952
2001
  "button",
1953
2002
  {
1954
2003
  type: "button",
@@ -1960,8 +2009,8 @@ function GraphToolbar({
1960
2009
  children: EXPAND_ALL_ICON
1961
2010
  }
1962
2011
  ),
1963
- foldAllSection && /* @__PURE__ */ jsx16("div", { className: "graph-toolbar-separator" }),
1964
- /* @__PURE__ */ jsx16(
2012
+ foldAllSection && /* @__PURE__ */ jsx17("div", { className: "graph-toolbar-separator" }),
2013
+ /* @__PURE__ */ jsx17(
1965
2014
  "button",
1966
2015
  {
1967
2016
  type: "button",
@@ -1972,7 +2021,7 @@ function GraphToolbar({
1972
2021
  children: BOXES_ICON
1973
2022
  }
1974
2023
  ),
1975
- /* @__PURE__ */ jsx16(
2024
+ /* @__PURE__ */ jsx17(
1976
2025
  "button",
1977
2026
  {
1978
2027
  type: "button",
@@ -1983,8 +2032,8 @@ function GraphToolbar({
1983
2032
  children: isVertical ? ARROW_RIGHT_ICON : ARROW_DOWN_ICON
1984
2033
  }
1985
2034
  ),
1986
- (onZoomOut || onZoomIn || onFitView) && /* @__PURE__ */ jsx16("div", { className: "graph-toolbar-separator" }),
1987
- onZoomOut && /* @__PURE__ */ jsx16(
2035
+ (onZoomOut || onZoomIn || onFitView) && /* @__PURE__ */ jsx17("div", { className: "graph-toolbar-separator" }),
2036
+ onZoomOut && /* @__PURE__ */ jsx17(
1988
2037
  "button",
1989
2038
  {
1990
2039
  type: "button",
@@ -1995,7 +2044,7 @@ function GraphToolbar({
1995
2044
  children: MINUS_ICON
1996
2045
  }
1997
2046
  ),
1998
- onZoomIn && /* @__PURE__ */ jsx16(
2047
+ onZoomIn && /* @__PURE__ */ jsx17(
1999
2048
  "button",
2000
2049
  {
2001
2050
  type: "button",
@@ -2006,7 +2055,7 @@ function GraphToolbar({
2006
2055
  children: PLUS_ICON
2007
2056
  }
2008
2057
  ),
2009
- onFitView && /* @__PURE__ */ jsx16(
2058
+ onFitView && /* @__PURE__ */ jsx17(
2010
2059
  "button",
2011
2060
  {
2012
2061
  type: "button",
@@ -2017,9 +2066,9 @@ function GraphToolbar({
2017
2066
  children: FIT_VIEW_ICON
2018
2067
  }
2019
2068
  ),
2020
- themeToggleEnabled && /* @__PURE__ */ jsxs16(Fragment11, { children: [
2021
- /* @__PURE__ */ jsx16("div", { className: "graph-toolbar-separator" }),
2022
- /* @__PURE__ */ jsx16(
2069
+ themeToggleEnabled && /* @__PURE__ */ jsxs17(Fragment12, { children: [
2070
+ /* @__PURE__ */ jsx17("div", { className: "graph-toolbar-separator" }),
2071
+ /* @__PURE__ */ jsx17(
2023
2072
  "button",
2024
2073
  {
2025
2074
  type: "button",
@@ -2035,7 +2084,7 @@ function GraphToolbar({
2035
2084
  }
2036
2085
 
2037
2086
  // src/graph/react/nodes/controller/ControllerGroupNode.tsx
2038
- import { jsx as jsx17, jsxs as jsxs17 } from "react/jsx-runtime";
2087
+ import { jsx as jsx18, jsxs as jsxs18 } from "react/jsx-runtime";
2039
2088
  var CONTROLLER_CONFIG = {
2040
2089
  PipeSequence: { badge: "Sequence", icon: "\u2192" },
2041
2090
  PipeParallel: { badge: "Parallel", icon: "//" },
@@ -2057,12 +2106,12 @@ function ControllerGroupNode({ data }) {
2057
2106
  const modifier = getControllerModifier(data.pipeType);
2058
2107
  const isCollapsible = (data.pipeType === "PipeParallel" || data.pipeType === "PipeBatch") && ((_a = data.childCount) != null ? _a : 0) > MAX_VISIBLE_CONTROLLER_CHILDREN;
2059
2108
  const hiddenCount = isCollapsible ? ((_b = data.childCount) != null ? _b : 0) - MAX_VISIBLE_CONTROLLER_CHILDREN : 0;
2060
- return /* @__PURE__ */ jsxs17("div", { className: `controller-group-node ${modifier}`, children: [
2061
- /* @__PURE__ */ jsxs17("div", { className: "controller-group-header", children: [
2062
- /* @__PURE__ */ jsx17("span", { className: "controller-group-icon", children: config.icon }),
2063
- /* @__PURE__ */ jsx17("span", { className: "controller-group-badge", children: config.badge }),
2064
- data.label && /* @__PURE__ */ jsx17("span", { className: "controller-group-label", children: data.label }),
2065
- data.onToggleFold && /* @__PURE__ */ jsx17(
2109
+ return /* @__PURE__ */ jsxs18("div", { className: `controller-group-node ${modifier}`, children: [
2110
+ /* @__PURE__ */ jsxs18("div", { className: "controller-group-header", children: [
2111
+ /* @__PURE__ */ jsx18("span", { className: "controller-group-icon", children: config.icon }),
2112
+ /* @__PURE__ */ jsx18("span", { className: "controller-group-badge", children: config.badge }),
2113
+ data.label && /* @__PURE__ */ jsx18("span", { className: "controller-group-label", children: data.label }),
2114
+ data.onToggleFold && /* @__PURE__ */ jsx18(
2066
2115
  "button",
2067
2116
  {
2068
2117
  type: "button",
@@ -2078,7 +2127,7 @@ function ControllerGroupNode({ data }) {
2078
2127
  }
2079
2128
  )
2080
2129
  ] }),
2081
- isCollapsible && /* @__PURE__ */ jsx17(
2130
+ isCollapsible && /* @__PURE__ */ jsx18(
2082
2131
  "button",
2083
2132
  {
2084
2133
  className: "controller-group-collapse",
@@ -2099,7 +2148,7 @@ import { Handle, Position } from "@xyflow/react";
2099
2148
 
2100
2149
  // src/graph/react/nodes/pipe/PipeCardBase.tsx
2101
2150
  import { useState as useState2 } from "react";
2102
- import { jsx as jsx18, jsxs as jsxs18 } from "react/jsx-runtime";
2151
+ import { jsx as jsx19, jsxs as jsxs19 } from "react/jsx-runtime";
2103
2152
  var PIPE_TYPE_BADGES2 = {
2104
2153
  PipeLLM: "LLM",
2105
2154
  PipeExtract: "Extract",
@@ -2107,6 +2156,7 @@ var PIPE_TYPE_BADGES2 = {
2107
2156
  PipeImgGen: "ImgGen",
2108
2157
  PipeSearch: "Search",
2109
2158
  PipeFunc: "Func",
2159
+ PipeStructure: "Structure",
2110
2160
  PipeSignature: "Signature",
2111
2161
  PipeSequence: "Sequence",
2112
2162
  PipeParallel: "Parallel",
@@ -2148,17 +2198,17 @@ function PipeCardBase({ data, children }) {
2148
2198
  const controllerClass = isController ? " pipe-card--controller" : "";
2149
2199
  const signatureClass = isSignature ? " pipe-card--signature" : "";
2150
2200
  const badgeClass = isController ? "pipe-card-badge pipe-card-badge--controller" : isSignature ? "pipe-card-badge pipe-card-badge--signature" : "pipe-card-badge";
2151
- return /* @__PURE__ */ jsxs18("div", { className: `pipe-card ${dirClass}${controllerClass}${signatureClass}`, children: [
2152
- /* @__PURE__ */ jsxs18("div", { className: "pipe-card-header", children: [
2153
- /* @__PURE__ */ jsx18("span", { className: badgeClass, children: badge }),
2154
- /* @__PURE__ */ jsx18("span", { className: "pipe-card-code", title: data.pipeCode, children: data.pipeCode }),
2155
- /* @__PURE__ */ jsx18(
2201
+ return /* @__PURE__ */ jsxs19("div", { className: `pipe-card ${dirClass}${controllerClass}${signatureClass}`, children: [
2202
+ /* @__PURE__ */ jsxs19("div", { className: "pipe-card-header", children: [
2203
+ /* @__PURE__ */ jsx19("span", { className: badgeClass, children: badge }),
2204
+ /* @__PURE__ */ jsx19("span", { className: "pipe-card-code", title: data.pipeCode, children: data.pipeCode }),
2205
+ /* @__PURE__ */ jsx19(
2156
2206
  "span",
2157
2207
  {
2158
2208
  className: "pipe-card-status",
2159
2209
  style: { color: statusConfig.color },
2160
2210
  title: statusConfig.label,
2161
- children: /* @__PURE__ */ jsx18(
2211
+ children: /* @__PURE__ */ jsx19(
2162
2212
  "span",
2163
2213
  {
2164
2214
  className: `pipe-card-status-dot ${isRunning ? "pipe-card-status-dot--pulse" : ""}`,
@@ -2167,7 +2217,7 @@ function PipeCardBase({ data, children }) {
2167
2217
  )
2168
2218
  }
2169
2219
  ),
2170
- data.onExpand && /* @__PURE__ */ jsx18(
2220
+ data.onExpand && /* @__PURE__ */ jsx19(
2171
2221
  "button",
2172
2222
  {
2173
2223
  type: "button",
@@ -2183,23 +2233,23 @@ function PipeCardBase({ data, children }) {
2183
2233
  }
2184
2234
  )
2185
2235
  ] }),
2186
- data.description && /* @__PURE__ */ jsx18("span", { className: "pipe-card-description", title: data.description, children: data.description }),
2187
- data.inputs.length > 0 && /* @__PURE__ */ jsxs18("div", { className: "pipe-card-io", children: [
2188
- /* @__PURE__ */ jsx18("span", { className: "pipe-card-io-label", children: "INPUTS" }),
2189
- /* @__PURE__ */ jsxs18("div", { className: "pipe-card-io-pills", children: [
2190
- visibleInputs.map((input) => /* @__PURE__ */ jsxs18(
2236
+ data.description && /* @__PURE__ */ jsx19("span", { className: "pipe-card-description", title: data.description, children: data.description }),
2237
+ data.inputs.length > 0 && /* @__PURE__ */ jsxs19("div", { className: "pipe-card-io", children: [
2238
+ /* @__PURE__ */ jsx19("span", { className: "pipe-card-io-label", children: "INPUTS" }),
2239
+ /* @__PURE__ */ jsxs19("div", { className: "pipe-card-io-pills", children: [
2240
+ visibleInputs.map((input) => /* @__PURE__ */ jsxs19(
2191
2241
  "span",
2192
2242
  {
2193
2243
  className: "pipe-card-io-pill",
2194
2244
  title: `${input.name}: ${input.concept}`,
2195
2245
  children: [
2196
- /* @__PURE__ */ jsx18("span", { className: "pipe-card-io-pill-name", children: input.name }),
2197
- /* @__PURE__ */ jsx18("span", { className: "pipe-card-io-pill-concept", children: input.concept })
2246
+ /* @__PURE__ */ jsx19("span", { className: "pipe-card-io-pill-name", children: input.name }),
2247
+ /* @__PURE__ */ jsx19("span", { className: "pipe-card-io-pill-concept", children: input.concept })
2198
2248
  ]
2199
2249
  },
2200
2250
  input.name
2201
2251
  )),
2202
- hasMany && /* @__PURE__ */ jsx18(
2252
+ hasMany && /* @__PURE__ */ jsx19(
2203
2253
  "button",
2204
2254
  {
2205
2255
  className: "pipe-card-io-more",
@@ -2212,16 +2262,16 @@ function PipeCardBase({ data, children }) {
2212
2262
  )
2213
2263
  ] })
2214
2264
  ] }),
2215
- data.outputs.length > 0 && /* @__PURE__ */ jsxs18("div", { className: "pipe-card-io", children: [
2216
- /* @__PURE__ */ jsx18("span", { className: "pipe-card-io-label", children: "OUTPUT" }),
2217
- /* @__PURE__ */ jsx18("div", { className: "pipe-card-io-pills", children: data.outputs.map((output) => /* @__PURE__ */ jsxs18(
2265
+ data.outputs.length > 0 && /* @__PURE__ */ jsxs19("div", { className: "pipe-card-io", children: [
2266
+ /* @__PURE__ */ jsx19("span", { className: "pipe-card-io-label", children: "OUTPUT" }),
2267
+ /* @__PURE__ */ jsx19("div", { className: "pipe-card-io-pills", children: data.outputs.map((output) => /* @__PURE__ */ jsxs19(
2218
2268
  "span",
2219
2269
  {
2220
2270
  className: "pipe-card-io-pill",
2221
2271
  title: `${output.name}: ${output.concept}`,
2222
2272
  children: [
2223
- /* @__PURE__ */ jsx18("span", { className: "pipe-card-io-pill-name", children: output.name }),
2224
- /* @__PURE__ */ jsx18("span", { className: "pipe-card-io-pill-concept", children: output.concept })
2273
+ /* @__PURE__ */ jsx19("span", { className: "pipe-card-io-pill-name", children: output.name }),
2274
+ /* @__PURE__ */ jsx19("span", { className: "pipe-card-io-pill-concept", children: output.concept })
2225
2275
  ]
2226
2276
  },
2227
2277
  output.name
@@ -2239,6 +2289,7 @@ var PIPE_CARD_REGISTRY = {
2239
2289
  PipeImgGen: PipeCardBase,
2240
2290
  PipeSearch: PipeCardBase,
2241
2291
  PipeFunc: PipeCardBase,
2292
+ PipeStructure: PipeCardBase,
2242
2293
  PipeSignature: PipeCardBase,
2243
2294
  PipeSequence: PipeCardBase,
2244
2295
  PipeParallel: PipeCardBase,
@@ -2250,11 +2301,11 @@ function getPipeCardComponent(pipeType) {
2250
2301
  }
2251
2302
 
2252
2303
  // src/graph/react/nodes/pipe/PipeCardNode.tsx
2253
- import { Fragment as Fragment12, jsx as jsx19, jsxs as jsxs19 } from "react/jsx-runtime";
2304
+ import { Fragment as Fragment13, jsx as jsx20, jsxs as jsxs20 } from "react/jsx-runtime";
2254
2305
  function PipeCardNode({ data }) {
2255
2306
  var _a;
2256
2307
  const Card = (_a = getPipeCardComponent(data.pipeType)) != null ? _a : PipeCardBase;
2257
- return /* @__PURE__ */ jsx19(Card, { data });
2308
+ return /* @__PURE__ */ jsx20(Card, { data });
2258
2309
  }
2259
2310
  function PipeCardRFNode({
2260
2311
  data,
@@ -2263,15 +2314,15 @@ function PipeCardRFNode({
2263
2314
  }) {
2264
2315
  const payload = data.pipeCardData;
2265
2316
  if (!payload) return null;
2266
- return /* @__PURE__ */ jsxs19(Fragment12, { children: [
2267
- /* @__PURE__ */ jsx19(Handle, { type: "target", position: targetPosition }),
2268
- /* @__PURE__ */ jsx19(PipeCardNode, { data: payload }),
2269
- /* @__PURE__ */ jsx19(Handle, { type: "source", position: sourcePosition })
2317
+ return /* @__PURE__ */ jsxs20(Fragment13, { children: [
2318
+ /* @__PURE__ */ jsx20(Handle, { type: "target", position: targetPosition }),
2319
+ /* @__PURE__ */ jsx20(PipeCardNode, { data: payload }),
2320
+ /* @__PURE__ */ jsx20(Handle, { type: "source", position: sourcePosition })
2270
2321
  ] });
2271
2322
  }
2272
2323
 
2273
2324
  // src/graph/react/viewer/GraphViewer.tsx
2274
- import { Fragment as Fragment13, jsx as jsx20, jsxs as jsxs20 } from "react/jsx-runtime";
2325
+ import { Fragment as Fragment14, jsx as jsx21, jsxs as jsxs21 } from "react/jsx-runtime";
2275
2326
  var nodeTypes = __spreadProps(__spreadValues({}, controllerNodeTypes), {
2276
2327
  pipeCard: PipeCardRFNode
2277
2328
  });
@@ -2284,7 +2335,7 @@ function StuffNodeDetail({
2284
2335
  onOpenExternally
2285
2336
  }) {
2286
2337
  const conceptInfo = stuffData.concept && graphspec ? resolveConceptRef(graphspec, stuffData.concept) : void 0;
2287
- return /* @__PURE__ */ jsx20(Fragment13, { children: conceptInfo ? /* @__PURE__ */ jsx20(
2338
+ return /* @__PURE__ */ jsx21(Fragment14, { children: conceptInfo ? /* @__PURE__ */ jsx21(
2288
2339
  ConceptDetailPanel,
2289
2340
  {
2290
2341
  concept: conceptInfo,
@@ -2296,7 +2347,7 @@ function StuffNodeDetail({
2296
2347
  }
2297
2348
  ) : (
2298
2349
  /* Fallback: just show the StuffViewer if no concept info */
2299
- /* @__PURE__ */ jsx20(
2350
+ /* @__PURE__ */ jsx21(
2300
2351
  StuffViewer,
2301
2352
  {
2302
2353
  stuff: stuffData,
@@ -2859,13 +2910,13 @@ function GraphViewer(props) {
2859
2910
  expandAllDisabled: foldedControllers.size === 0
2860
2911
  };
2861
2912
  }, [showControllers, allControllerIds, foldedControllers]);
2862
- return /* @__PURE__ */ jsxs20(
2913
+ return /* @__PURE__ */ jsxs21(
2863
2914
  "div",
2864
2915
  {
2865
2916
  ref: containerRef,
2866
2917
  className: `react-flow-container react-flow-container--theme-${resolvedTheme} react-flow-container--mode-${mode}`,
2867
2918
  children: [
2868
- /* @__PURE__ */ jsxs20(
2919
+ /* @__PURE__ */ jsxs21(
2869
2920
  ReactFlow,
2870
2921
  {
2871
2922
  nodes,
@@ -2884,7 +2935,7 @@ function GraphViewer(props) {
2884
2935
  proOptions: { hideAttribution: true },
2885
2936
  panActivationKeyCode: null,
2886
2937
  children: [
2887
- /* @__PURE__ */ jsx20(
2938
+ /* @__PURE__ */ jsx21(
2888
2939
  Background,
2889
2940
  {
2890
2941
  variant: BackgroundVariant.Dots,
@@ -2893,7 +2944,7 @@ function GraphViewer(props) {
2893
2944
  color: "var(--color-bg-dots)"
2894
2945
  }
2895
2946
  ),
2896
- !hideToolbar && /* @__PURE__ */ jsx20(
2947
+ !hideToolbar && /* @__PURE__ */ jsx21(
2897
2948
  GraphToolbar,
2898
2949
  {
2899
2950
  direction,
@@ -2925,7 +2976,7 @@ function GraphViewer(props) {
2925
2976
  ]
2926
2977
  }
2927
2978
  ),
2928
- /* @__PURE__ */ jsxs20(
2979
+ /* @__PURE__ */ jsxs21(
2929
2980
  DetailPanel,
2930
2981
  {
2931
2982
  isOpen: detailOpen,
@@ -2934,14 +2985,14 @@ function GraphViewer(props) {
2934
2985
  isDragging: isPanelDragging,
2935
2986
  onResizeHandleMouseDown: onResizeMouseDown,
2936
2987
  children: [
2937
- conceptOverride ? /* @__PURE__ */ jsx20(ConceptDetailPanel, { concept: conceptOverride }) : selectedSpecNode && graphspec ? /* @__PURE__ */ jsx20(
2988
+ conceptOverride ? /* @__PURE__ */ jsx21(ConceptDetailPanel, { concept: conceptOverride }) : selectedSpecNode && graphspec ? /* @__PURE__ */ jsx21(
2938
2989
  PipeDetailPanel,
2939
2990
  {
2940
2991
  node: selectedSpecNode,
2941
2992
  spec: graphspec,
2942
2993
  onConceptClick: handleConceptClick
2943
2994
  }
2944
- ) : (detailSelection == null ? void 0 : detailSelection.stuffData) ? /* @__PURE__ */ jsx20(
2995
+ ) : (detailSelection == null ? void 0 : detailSelection.stuffData) ? /* @__PURE__ */ jsx21(
2945
2996
  StuffNodeDetail,
2946
2997
  {
2947
2998
  nodeId: detailSelection.nodeId,