@pipelex/mthds-ui 0.30.1 → 0.32.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.
@@ -13,22 +13,22 @@ import {
13
13
  findStuffByDigest,
14
14
  fitRoute,
15
15
  getLayoutedElements,
16
- getPipeBlueprint,
17
16
  resolveConceptRef,
18
17
  resolveGraphStyle,
19
18
  resolveIssueTargetNodeId,
19
+ resolveNodeBlueprint,
20
20
  resolveStyleMenu,
21
21
  roundedPolylinePath,
22
22
  routeLabelCenter,
23
23
  validateGraphSpec
24
- } from "../../chunk-3BXB6HSF.js";
24
+ } from "../../chunk-T5Y7KNCZ.js";
25
25
  import {
26
26
  parsePipeRef
27
27
  } from "../../chunk-2N65P32H.js";
28
28
  import {
29
29
  DEFAULT_GRAPH_CONFIG,
30
30
  getPaletteForTheme
31
- } from "../../chunk-GAOBB3UT.js";
31
+ } from "../../chunk-K2C5FU4W.js";
32
32
  import {
33
33
  BINDING_STEP_TYPE,
34
34
  EDGE_TYPE,
@@ -55,7 +55,7 @@ import {
55
55
  stuffDigestFromId,
56
56
  toolbarOrientation,
57
57
  toolbarSide
58
- } from "../../chunk-PJTYQURQ.js";
58
+ } from "../../chunk-TMZ2JR2J.js";
59
59
  import {
60
60
  __spreadProps,
61
61
  __spreadValues
@@ -477,20 +477,52 @@ function ModelRows({
477
477
  handle,
478
478
  label = "Model"
479
479
  }) {
480
+ var _a, _b, _c;
480
481
  const ran = modelsRan != null ? modelsRan : [];
481
- const ranLabels = ran.map(
482
- (entry) => ran.length > 1 ? `${entry.inference_model_name} (${entry.inference_calls})` : entry.inference_model_name
483
- );
484
- const chain = [];
485
- for (const rung of [authored, handle, ...ranLabels]) {
486
- if (rung && rung !== chain[chain.length - 1]) chain.push(rung);
482
+ const nameCounts = /* @__PURE__ */ new Map();
483
+ for (const entry of ran) {
484
+ nameCounts.set(
485
+ entry.inference_model_name,
486
+ ((_a = nameCounts.get(entry.inference_model_name)) != null ? _a : 0) + 1
487
+ );
488
+ }
489
+ const ranRungs = ran.map((entry, index) => {
490
+ var _a2;
491
+ const name = ((_a2 = nameCounts.get(entry.inference_model_name)) != null ? _a2 : 0) > 1 ? `${entry.inference_model_name} \xB7 ${modelTypeLabel(entry.model_type)}` : entry.inference_model_name;
492
+ return {
493
+ key: `ran-${index}`,
494
+ text: ran.length > 1 ? `${name} (${entry.inference_calls})` : name
495
+ };
496
+ });
497
+ const requested = [];
498
+ const requestedRungs = [
499
+ { key: "authored", text: authored != null ? authored : "" },
500
+ { key: "handle", text: handle != null ? handle : "" }
501
+ ];
502
+ for (const rung of requestedRungs) {
503
+ if (rung.text && rung.text !== ((_b = requested[requested.length - 1]) == null ? void 0 : _b.text)) requested.push(rung);
487
504
  }
505
+ if (ranRungs.length > 0 && ((_c = requested[requested.length - 1]) == null ? void 0 : _c.text) === ranRungs[0].text) {
506
+ requested.pop();
507
+ }
508
+ const chain = [...requested, ...ranRungs];
488
509
  if (chain.length === 0) return null;
489
510
  return /* @__PURE__ */ jsxs3("div", { className: "detail-kv-row", children: [
490
511
  /* @__PURE__ */ jsx3("span", { className: "detail-kv-key", children: label }),
491
- /* @__PURE__ */ jsx3("span", { className: "detail-kv-value detail-model-value", children: chain.map((rung, index) => /* @__PURE__ */ jsx3("span", { className: index === 0 ? void 0 : "detail-model-resolved", children: rung }, rung)) })
512
+ /* @__PURE__ */ jsx3("span", { className: "detail-kv-value detail-model-value", children: chain.map((rung, index) => /* @__PURE__ */ jsx3("span", { className: index === 0 ? void 0 : "detail-model-resolved", children: rung.text }, rung.key)) })
492
513
  ] });
493
514
  }
515
+ var MODEL_TYPE_LABELS = {
516
+ llm: "LLM",
517
+ extract: "extraction",
518
+ img_gen: "image generation",
519
+ search: "search",
520
+ judgment: "judgment"
521
+ };
522
+ function modelTypeLabel(modelType) {
523
+ var _a;
524
+ return (_a = MODEL_TYPE_LABELS[modelType]) != null ? _a : modelType.replaceAll("_", " ");
525
+ }
494
526
 
495
527
  // src/graph/usageFormat.ts
496
528
  function scopeUsage(usage, scope) {
@@ -529,8 +561,9 @@ function formatCost(cost) {
529
561
  if (cost > 0 && cost < 1e-4) return "<$0.0001";
530
562
  return `$${cost.toFixed(4)}`;
531
563
  }
564
+ var TOKEN_BILLED_MODEL_TYPES = /* @__PURE__ */ new Set(["llm", "judgment"]);
532
565
  function hasRealTokenCounts(scoped) {
533
- return scoped.models.length > 0 && scoped.models.every((entry) => entry.model_type === "llm");
566
+ return scoped.models.length > 0 && scoped.models.every((entry) => TOKEN_BILLED_MODEL_TYPES.has(entry.model_type));
534
567
  }
535
568
 
536
569
  // src/graph/react/detail/sections/UsageSection.tsx
@@ -979,27 +1012,74 @@ function PipeComposeSection({
979
1012
  ] });
980
1013
  }
981
1014
 
982
- // src/graph/react/detail/sections/PipeConditionDetail.tsx
1015
+ // src/graph/react/detail/sections/PipeDocGenDetail.tsx
983
1016
  import { Fragment as Fragment7, jsx as jsx11, jsxs as jsxs11 } from "react/jsx-runtime";
1017
+ var DOC_GEN_SOURCE_LABELS = {
1018
+ layout: "auto-layout",
1019
+ html: "HTML template",
1020
+ template_file: "template file"
1021
+ };
1022
+ function declaredSource(blueprint) {
1023
+ if (blueprint.template == null && blueprint.template_file == null) return "layout";
1024
+ if (blueprint.template != null || blueprint.doc_gen_format === "pdf") return "html";
1025
+ return "template_file";
1026
+ }
1027
+ function nonEmpty(value) {
1028
+ return typeof value === "string" && value.trim() !== "" ? value : void 0;
1029
+ }
1030
+ function PipeDocGenSection({
1031
+ blueprint,
1032
+ executionData,
1033
+ modelsRan,
1034
+ modelHandles
1035
+ }) {
1036
+ var _a, _b, _c;
1037
+ const format = nonEmpty(blueprint.doc_gen_format);
1038
+ const authoredEngine = labelFromLlmChoice(blueprint.doc_gen_choice);
1039
+ const resolvedEngine = nonEmpty(modelHandles == null ? void 0 : modelHandles.resolved_model);
1040
+ const hasEngine = !!authoredEngine || !!resolvedEngine || ((_a = modelsRan == null ? void 0 : modelsRan.length) != null ? _a : 0) > 0;
1041
+ const source = (_b = nonEmpty(modelHandles == null ? void 0 : modelHandles.source)) != null ? _b : declaredSource(blueprint);
1042
+ const renderedFilename = nonEmpty(executionData == null ? void 0 : executionData.filename);
1043
+ return /* @__PURE__ */ jsxs11(Fragment7, { children: [
1044
+ /* @__PURE__ */ jsx11(KV, { label: "Format", value: format == null ? void 0 : format.toUpperCase() }),
1045
+ hasEngine ? /* @__PURE__ */ jsx11(
1046
+ ModelRows,
1047
+ {
1048
+ label: "Engine",
1049
+ modelsRan,
1050
+ authored: authoredEngine,
1051
+ handle: resolvedEngine
1052
+ }
1053
+ ) : /* @__PURE__ */ jsx11(KV, { label: "Engine", value: "deck default" }),
1054
+ /* @__PURE__ */ jsx11(KV, { label: "Source", value: (_c = DOC_GEN_SOURCE_LABELS[source]) != null ? _c : source }),
1055
+ /* @__PURE__ */ jsx11(KV, { label: "Template File", value: blueprint.template_file }),
1056
+ /* @__PURE__ */ jsx11(KV, { label: "File Name", value: blueprint.filename }),
1057
+ renderedFilename && renderedFilename !== blueprint.filename && /* @__PURE__ */ jsx11(KV, { label: "Stored As", value: renderedFilename }),
1058
+ blueprint.template && /* @__PURE__ */ jsx11(PromptToggle, { label: "Template", templateText: blueprint.template, renderedText: null })
1059
+ ] });
1060
+ }
1061
+
1062
+ // src/graph/react/detail/sections/PipeConditionDetail.tsx
1063
+ import { Fragment as Fragment8, jsx as jsx12, jsxs as jsxs12 } from "react/jsx-runtime";
984
1064
  function PipeConditionSection({
985
1065
  blueprint,
986
1066
  executionData
987
1067
  }) {
988
1068
  const evaluatedExpression = executionData == null ? void 0 : executionData.evaluated_expression;
989
1069
  const selectedOutcome = executionData == null ? void 0 : executionData.selected_outcome;
990
- return /* @__PURE__ */ jsxs11(Fragment7, { children: [
991
- /* @__PURE__ */ jsx11(PromptBlock, { label: "Expression", text: blueprint.expression }),
992
- evaluatedExpression && /* @__PURE__ */ jsx11(KV, { label: "Expression Result", value: evaluatedExpression }),
993
- /* @__PURE__ */ jsxs11("div", { children: [
994
- /* @__PURE__ */ jsx11("div", { className: "detail-section-label", children: "Outcomes" }),
995
- Object.entries(blueprint.outcome_map).map(([outcome, pipeCode]) => /* @__PURE__ */ jsxs11(
1070
+ return /* @__PURE__ */ jsxs12(Fragment8, { children: [
1071
+ /* @__PURE__ */ jsx12(PromptBlock, { label: "Expression", text: blueprint.expression }),
1072
+ evaluatedExpression && /* @__PURE__ */ jsx12(KV, { label: "Expression Result", value: evaluatedExpression }),
1073
+ /* @__PURE__ */ jsxs12("div", { children: [
1074
+ /* @__PURE__ */ jsx12("div", { className: "detail-section-label", children: "Outcomes" }),
1075
+ Object.entries(blueprint.outcome_map).map(([outcome, pipeCode]) => /* @__PURE__ */ jsxs12(
996
1076
  "div",
997
1077
  {
998
1078
  className: "detail-kv-row",
999
1079
  style: selectedOutcome === pipeCode ? { background: "rgba(80,250,123,0.08)" } : void 0,
1000
1080
  children: [
1001
- /* @__PURE__ */ jsx11("span", { className: "detail-kv-key", children: outcome }),
1002
- /* @__PURE__ */ jsx11(
1081
+ /* @__PURE__ */ jsx12("span", { className: "detail-kv-key", children: outcome }),
1082
+ /* @__PURE__ */ jsx12(
1003
1083
  "span",
1004
1084
  {
1005
1085
  className: "detail-kv-value",
@@ -1011,32 +1091,32 @@ function PipeConditionSection({
1011
1091
  },
1012
1092
  outcome
1013
1093
  )),
1014
- /* @__PURE__ */ jsxs11("div", { className: "detail-kv-row", children: [
1015
- /* @__PURE__ */ jsx11("span", { className: "detail-kv-key", children: "default" }),
1016
- /* @__PURE__ */ jsx11("span", { className: "detail-kv-value", children: blueprint.default_outcome })
1094
+ /* @__PURE__ */ jsxs12("div", { className: "detail-kv-row", children: [
1095
+ /* @__PURE__ */ jsx12("span", { className: "detail-kv-key", children: "default" }),
1096
+ /* @__PURE__ */ jsx12("span", { className: "detail-kv-value", children: blueprint.default_outcome })
1017
1097
  ] })
1018
1098
  ] }),
1019
- /* @__PURE__ */ jsx11(KV, { label: "Alias Expression To", value: blueprint.add_alias_from_expression_to })
1099
+ /* @__PURE__ */ jsx12(KV, { label: "Alias Expression To", value: blueprint.add_alias_from_expression_to })
1020
1100
  ] });
1021
1101
  }
1022
1102
 
1023
1103
  // src/graph/react/detail/sections/PipeSequenceDetail.tsx
1024
- import { jsx as jsx12, jsxs as jsxs12 } from "react/jsx-runtime";
1104
+ import { jsx as jsx13, jsxs as jsxs13 } from "react/jsx-runtime";
1025
1105
  function PipeSequenceSection({
1026
1106
  blueprint
1027
1107
  }) {
1028
- return /* @__PURE__ */ jsxs12("div", { children: [
1029
- /* @__PURE__ */ jsx12("div", { className: "detail-section-label", children: "Steps" }),
1030
- /* @__PURE__ */ jsx12("div", { className: "detail-steps-list", children: blueprint.sequential_sub_pipes.map((step, idx) => /* @__PURE__ */ jsxs12("div", { className: "detail-step-item", children: [
1031
- /* @__PURE__ */ jsx12("span", { className: "detail-step-index", children: idx + 1 }),
1108
+ return /* @__PURE__ */ jsxs13("div", { children: [
1109
+ /* @__PURE__ */ jsx13("div", { className: "detail-section-label", children: "Steps" }),
1110
+ /* @__PURE__ */ jsx13("div", { className: "detail-steps-list", children: blueprint.sequential_sub_pipes.map((step, idx) => /* @__PURE__ */ jsxs13("div", { className: "detail-step-item", children: [
1111
+ /* @__PURE__ */ jsx13("span", { className: "detail-step-index", children: idx + 1 }),
1032
1112
  isBindingStepSpec(step) ? (
1033
1113
  // A binding step runs no pipe: it names the path it binds.
1034
- /* @__PURE__ */ jsxs12("span", { className: "detail-step-code", title: "Binding step", children: [
1114
+ /* @__PURE__ */ jsxs13("span", { className: "detail-step-code", title: "Binding step", children: [
1035
1115
  "from ",
1036
1116
  step.from_path
1037
1117
  ] })
1038
- ) : /* @__PURE__ */ jsx12("span", { className: "detail-step-code", children: step.pipe_code }),
1039
- step.output_name && /* @__PURE__ */ jsxs12("span", { className: "detail-io-concept", children: [
1118
+ ) : /* @__PURE__ */ jsx13("span", { className: "detail-step-code", children: step.pipe_code }),
1119
+ step.output_name && /* @__PURE__ */ jsxs13("span", { className: "detail-io-concept", children: [
1040
1120
  "-> ",
1041
1121
  step.output_name
1042
1122
  ] })
@@ -1045,52 +1125,52 @@ function PipeSequenceSection({
1045
1125
  }
1046
1126
 
1047
1127
  // src/graph/react/detail/sections/PipeParallelDetail.tsx
1048
- import { Fragment as Fragment8, jsx as jsx13, jsxs as jsxs13 } from "react/jsx-runtime";
1128
+ import { Fragment as Fragment9, jsx as jsx14, jsxs as jsxs14 } from "react/jsx-runtime";
1049
1129
  function PipeParallelSection({
1050
1130
  blueprint
1051
1131
  }) {
1052
- return /* @__PURE__ */ jsxs13(Fragment8, { children: [
1053
- /* @__PURE__ */ jsxs13("div", { children: [
1054
- /* @__PURE__ */ jsx13("div", { className: "detail-section-label", children: "Branches" }),
1055
- /* @__PURE__ */ jsx13("div", { className: "detail-steps-list", children: blueprint.parallel_sub_pipes.map((branch, idx) => /* @__PURE__ */ jsxs13("div", { className: "detail-step-item", children: [
1056
- /* @__PURE__ */ jsx13("span", { className: "detail-step-code", children: branch.pipe_code }),
1057
- branch.output_name && /* @__PURE__ */ jsxs13("span", { className: "detail-io-concept", children: [
1132
+ return /* @__PURE__ */ jsxs14(Fragment9, { children: [
1133
+ /* @__PURE__ */ jsxs14("div", { children: [
1134
+ /* @__PURE__ */ jsx14("div", { className: "detail-section-label", children: "Branches" }),
1135
+ /* @__PURE__ */ jsx14("div", { className: "detail-steps-list", children: blueprint.parallel_sub_pipes.map((branch, idx) => /* @__PURE__ */ jsxs14("div", { className: "detail-step-item", children: [
1136
+ /* @__PURE__ */ jsx14("span", { className: "detail-step-code", children: branch.pipe_code }),
1137
+ branch.output_name && /* @__PURE__ */ jsxs14("span", { className: "detail-io-concept", children: [
1058
1138
  "-> ",
1059
1139
  branch.output_name
1060
1140
  ] })
1061
1141
  ] }, idx)) })
1062
1142
  ] }),
1063
- /* @__PURE__ */ jsx13(KV, { label: "Add Each Output", value: blueprint.add_each_output }),
1064
- /* @__PURE__ */ jsx13(KV, { label: "Combined Output", value: blueprint.combined_output })
1143
+ /* @__PURE__ */ jsx14(KV, { label: "Add Each Output", value: blueprint.add_each_output }),
1144
+ /* @__PURE__ */ jsx14(KV, { label: "Combined Output", value: blueprint.combined_output })
1065
1145
  ] });
1066
1146
  }
1067
1147
 
1068
1148
  // src/graph/react/detail/sections/PipeBatchDetail.tsx
1069
- import { Fragment as Fragment9, jsx as jsx14, jsxs as jsxs14 } from "react/jsx-runtime";
1149
+ import { Fragment as Fragment10, jsx as jsx15, jsxs as jsxs15 } from "react/jsx-runtime";
1070
1150
  function PipeBatchSection({
1071
1151
  blueprint,
1072
1152
  executionData
1073
1153
  }) {
1074
1154
  const itemCount = executionData == null ? void 0 : executionData.item_count;
1075
- return /* @__PURE__ */ jsxs14(Fragment9, { children: [
1076
- /* @__PURE__ */ jsx14(KV, { label: "Branch Pipe", value: blueprint.branch_pipe_code }),
1077
- /* @__PURE__ */ jsx14(KV, { label: "Input List Variable", value: blueprint.batch_params.input_list_stuff_name }),
1078
- /* @__PURE__ */ jsx14(KV, { label: "Input Item Variable", value: blueprint.batch_params.input_item_stuff_name }),
1079
- itemCount != null && /* @__PURE__ */ jsx14(KV, { label: "Items Processed", value: itemCount })
1155
+ return /* @__PURE__ */ jsxs15(Fragment10, { children: [
1156
+ /* @__PURE__ */ jsx15(KV, { label: "Branch Pipe", value: blueprint.branch_pipe_code }),
1157
+ /* @__PURE__ */ jsx15(KV, { label: "Input List Variable", value: blueprint.batch_params.input_list_stuff_name }),
1158
+ /* @__PURE__ */ jsx15(KV, { label: "Input Item Variable", value: blueprint.batch_params.input_item_stuff_name }),
1159
+ itemCount != null && /* @__PURE__ */ jsx15(KV, { label: "Items Processed", value: itemCount })
1080
1160
  ] });
1081
1161
  }
1082
1162
 
1083
1163
  // src/graph/react/detail/sections/BindingStepDetail.tsx
1084
- import { jsx as jsx15, jsxs as jsxs15 } from "react/jsx-runtime";
1164
+ import { jsx as jsx16, jsxs as jsxs16 } from "react/jsx-runtime";
1085
1165
  function BindingStepSection({ node }) {
1086
1166
  var _a, _b;
1087
1167
  const executionData = (_a = node.execution_data) != null ? _a : {};
1088
1168
  const fromPath = typeof executionData.from === "string" ? executionData.from : node.pipe_code;
1089
1169
  const result = typeof executionData.result === "string" ? executionData.result : (_b = node.io.outputs[0]) == null ? void 0 : _b.name;
1090
- return /* @__PURE__ */ jsxs15("div", { children: [
1091
- /* @__PURE__ */ jsx15("div", { className: "detail-section-label", children: "Binding" }),
1092
- /* @__PURE__ */ jsx15(KV, { label: "From", value: fromPath }),
1093
- /* @__PURE__ */ jsx15(KV, { label: "Result", value: result })
1170
+ return /* @__PURE__ */ jsxs16("div", { children: [
1171
+ /* @__PURE__ */ jsx16("div", { className: "detail-section-label", children: "Binding" }),
1172
+ /* @__PURE__ */ jsx16(KV, { label: "From", value: fromPath }),
1173
+ /* @__PURE__ */ jsx16(KV, { label: "Result", value: result })
1094
1174
  ] });
1095
1175
  }
1096
1176
 
@@ -1102,18 +1182,27 @@ var MERGED_EXECUTION_DATA_TYPES = /* @__PURE__ */ new Set([
1102
1182
  "PipeSearch",
1103
1183
  "PipeStructure",
1104
1184
  "PipeCompose",
1185
+ "PipeDocGen",
1105
1186
  "PipeSequence",
1106
1187
  "PipeParallel",
1107
1188
  "PipeCondition",
1108
1189
  "PipeBatch"
1109
1190
  ]);
1191
+ var UNDUMPED_EXECUTION_DATA_KEYS = {
1192
+ PipeDocGen: /* @__PURE__ */ new Set(["url"])
1193
+ };
1110
1194
  function shouldDumpExecutionData(pipeType, hasBlueprint) {
1111
1195
  if (MERGED_EXECUTION_DATA_TYPES.has(pipeType)) return !hasBlueprint;
1112
1196
  return true;
1113
1197
  }
1198
+ function dumpableExecutionData(pipeType, executionData) {
1199
+ const undumped = UNDUMPED_EXECUTION_DATA_KEYS[pipeType];
1200
+ const entries = Object.entries(executionData);
1201
+ return undumped ? entries.filter(([key]) => !undumped.has(key)) : entries;
1202
+ }
1114
1203
 
1115
1204
  // src/graph/react/detail/PipeDetailPanel.tsx
1116
- import { Fragment as Fragment10, jsx as jsx16, jsxs as jsxs16 } from "react/jsx-runtime";
1205
+ import { Fragment as Fragment11, jsx as jsx17, jsxs as jsxs17 } from "react/jsx-runtime";
1117
1206
  var PIPE_TYPE_BADGES = {
1118
1207
  PipeLLM: "LLM",
1119
1208
  PipeExtract: "Extract",
@@ -1155,32 +1244,22 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1155
1244
  const badge = PIPE_TYPE_BADGES[pipeType];
1156
1245
  const status = node.status;
1157
1246
  const statusColor = (_a = STATUS_COLORS[status]) != null ? _a : "#6272a4";
1158
- const blueprint = React6.useMemo(() => {
1159
- var _a2, _b2;
1160
- if (isBinding || !node.pipe_code || !spec.pipe_registry) return void 0;
1161
- const directKey = `${(_b2 = (_a2 = spec.pipeline_ref) == null ? void 0 : _a2.domain) != null ? _b2 : ""}.${node.pipe_code}`;
1162
- const direct = getPipeBlueprint(spec, directKey);
1163
- if (direct) return direct;
1164
- for (const [ref, pipe] of Object.entries(spec.pipe_registry)) {
1165
- if (ref.endsWith(`.${node.pipe_code}`)) return pipe;
1166
- }
1167
- return void 0;
1168
- }, [isBinding, node.pipe_code, spec]);
1247
+ const blueprint = React6.useMemo(() => resolveNodeBlueprint(spec, node), [spec, node]);
1169
1248
  const [usageExpanded, setUsageExpanded] = React6.useState(false);
1170
1249
  const inputs = (_c = (_b = node.io) == null ? void 0 : _b.inputs) != null ? _c : [];
1171
1250
  const outputs = (_e = (_d = node.io) == null ? void 0 : _d.outputs) != null ? _e : [];
1172
1251
  const description = (_f = blueprint == null ? void 0 : blueprint.description) != null ? _f : node.description;
1173
- return /* @__PURE__ */ jsxs16(Fragment10, { children: [
1174
- /* @__PURE__ */ jsxs16("div", { className: "detail-sticky-header", children: [
1175
- /* @__PURE__ */ jsxs16("div", { className: "detail-header", children: [
1176
- /* @__PURE__ */ jsx16(
1252
+ return /* @__PURE__ */ jsxs17(Fragment11, { children: [
1253
+ /* @__PURE__ */ jsxs17("div", { className: "detail-sticky-header", children: [
1254
+ /* @__PURE__ */ jsxs17("div", { className: "detail-header", children: [
1255
+ /* @__PURE__ */ jsx17(
1177
1256
  "span",
1178
1257
  {
1179
1258
  className: `detail-badge ${isController ? "detail-badge--controller" : "detail-badge--operator"}`,
1180
1259
  children: badge
1181
1260
  }
1182
1261
  ),
1183
- /* @__PURE__ */ jsx16(
1262
+ /* @__PURE__ */ jsx17(
1184
1263
  "span",
1185
1264
  {
1186
1265
  className: `detail-pipe-code ${isController ? "detail-pipe-code--controller" : ""}`,
@@ -1188,11 +1267,11 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1188
1267
  }
1189
1268
  )
1190
1269
  ] }),
1191
- !isStatic && /* @__PURE__ */ jsxs16("div", { className: "detail-status", children: [
1192
- /* @__PURE__ */ jsx16("span", { className: "detail-status-dot", style: { background: statusColor } }),
1193
- /* @__PURE__ */ jsx16("span", { className: "detail-status-label", style: { color: statusColor }, children: status }),
1194
- ((_g = node.timing) == null ? void 0 : _g.duration) != null && /* @__PURE__ */ jsx16("span", { className: "detail-duration", children: formatDuration(node.timing.duration) }),
1195
- showsGeneratedData && node.usage && /* @__PURE__ */ jsx16(
1270
+ !isStatic && /* @__PURE__ */ jsxs17("div", { className: "detail-status", children: [
1271
+ /* @__PURE__ */ jsx17("span", { className: "detail-status-dot", style: { background: statusColor } }),
1272
+ /* @__PURE__ */ jsx17("span", { className: "detail-status-label", style: { color: statusColor }, children: status }),
1273
+ ((_g = node.timing) == null ? void 0 : _g.duration) != null && /* @__PURE__ */ jsx17("span", { className: "detail-duration", children: formatDuration(node.timing.duration) }),
1274
+ showsGeneratedData && node.usage && /* @__PURE__ */ jsx17(
1196
1275
  UsageCostInline,
1197
1276
  {
1198
1277
  usage: node.usage,
@@ -1202,44 +1281,44 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1202
1281
  }
1203
1282
  )
1204
1283
  ] }),
1205
- showsGeneratedData && node.usage && usageExpanded && /* @__PURE__ */ jsx16(UsageDetails, { usage: node.usage, isController }),
1206
- description && /* @__PURE__ */ jsx16("div", { className: "detail-description", children: description }),
1207
- inputs.length > 0 && /* @__PURE__ */ jsxs16("div", { children: [
1208
- /* @__PURE__ */ jsx16("div", { className: "detail-section-label", children: "Inputs" }),
1209
- /* @__PURE__ */ jsx16("div", { className: "detail-io-list", children: inputs.map((input, idx) => /* @__PURE__ */ jsxs16(
1284
+ showsGeneratedData && node.usage && usageExpanded && /* @__PURE__ */ jsx17(UsageDetails, { usage: node.usage, isController }),
1285
+ description && /* @__PURE__ */ jsx17("div", { className: "detail-description", children: description }),
1286
+ inputs.length > 0 && /* @__PURE__ */ jsxs17("div", { children: [
1287
+ /* @__PURE__ */ jsx17("div", { className: "detail-section-label", children: "Inputs" }),
1288
+ /* @__PURE__ */ jsx17("div", { className: "detail-io-list", children: inputs.map((input, idx) => /* @__PURE__ */ jsxs17(
1210
1289
  "div",
1211
1290
  {
1212
1291
  className: "detail-io-pill",
1213
1292
  style: { cursor: input.concept && onConceptClick ? "pointer" : void 0 },
1214
1293
  onClick: () => input.concept && (onConceptClick == null ? void 0 : onConceptClick(input.concept)),
1215
1294
  children: [
1216
- /* @__PURE__ */ jsx16("span", { className: "detail-io-name", children: input.name }),
1217
- input.concept && /* @__PURE__ */ jsx16("span", { className: "detail-io-concept", children: input.concept + multiplicitySuffix(input.multiplicity) })
1295
+ /* @__PURE__ */ jsx17("span", { className: "detail-io-name", children: input.name }),
1296
+ input.concept && /* @__PURE__ */ jsx17("span", { className: "detail-io-concept", children: input.concept + multiplicitySuffix(input.multiplicity) })
1218
1297
  ]
1219
1298
  },
1220
1299
  idx
1221
1300
  )) })
1222
1301
  ] }),
1223
- outputs.length > 0 && /* @__PURE__ */ jsxs16("div", { children: [
1224
- /* @__PURE__ */ jsx16("div", { className: "detail-section-label", children: "Output" }),
1225
- /* @__PURE__ */ jsx16("div", { className: "detail-io-list", children: outputs.map((output, idx) => /* @__PURE__ */ jsxs16(
1302
+ outputs.length > 0 && /* @__PURE__ */ jsxs17("div", { children: [
1303
+ /* @__PURE__ */ jsx17("div", { className: "detail-section-label", children: "Output" }),
1304
+ /* @__PURE__ */ jsx17("div", { className: "detail-io-list", children: outputs.map((output, idx) => /* @__PURE__ */ jsxs17(
1226
1305
  "div",
1227
1306
  {
1228
1307
  className: "detail-io-pill",
1229
1308
  style: { cursor: output.concept && onConceptClick ? "pointer" : void 0 },
1230
1309
  onClick: () => output.concept && (onConceptClick == null ? void 0 : onConceptClick(output.concept)),
1231
1310
  children: [
1232
- /* @__PURE__ */ jsx16("span", { className: "detail-io-name", children: output.name }),
1233
- output.concept && /* @__PURE__ */ jsx16("span", { className: "detail-io-concept", children: output.concept + multiplicitySuffix(output.multiplicity) })
1311
+ /* @__PURE__ */ jsx17("span", { className: "detail-io-name", children: output.name }),
1312
+ output.concept && /* @__PURE__ */ jsx17("span", { className: "detail-io-concept", children: output.concept + multiplicitySuffix(output.multiplicity) })
1234
1313
  ]
1235
1314
  },
1236
1315
  idx
1237
1316
  )) })
1238
1317
  ] }),
1239
- (inputs.length > 0 || outputs.length > 0) && /* @__PURE__ */ jsx16("div", { style: { borderTop: "1px solid rgba(255,255,255,0.06)", margin: "4px 0" } })
1318
+ (inputs.length > 0 || outputs.length > 0) && /* @__PURE__ */ jsx17("div", { style: { borderTop: "1px solid rgba(255,255,255,0.06)", margin: "4px 0" } })
1240
1319
  ] }),
1241
- isBinding && /* @__PURE__ */ jsx16(BindingStepSection, { node }),
1242
- blueprint && /* @__PURE__ */ jsx16(
1320
+ isBinding && /* @__PURE__ */ jsx17(BindingStepSection, { node }),
1321
+ blueprint && /* @__PURE__ */ jsx17(
1243
1322
  BlueprintSection,
1244
1323
  {
1245
1324
  blueprint,
@@ -1248,7 +1327,7 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1248
1327
  modelHandles: node.execution_data
1249
1328
  }
1250
1329
  ),
1251
- showsGeneratedData && !isBinding && node.execution_data && Object.keys(node.execution_data).length > 0 && /* @__PURE__ */ jsx16(
1330
+ showsGeneratedData && !isBinding && node.execution_data && Object.keys(node.execution_data).length > 0 && /* @__PURE__ */ jsx17(
1252
1331
  ExecutionDataSection,
1253
1332
  {
1254
1333
  executionData: node.execution_data,
@@ -1256,14 +1335,14 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1256
1335
  hasBlueprint: !!blueprint
1257
1336
  }
1258
1337
  ),
1259
- node.error && /* @__PURE__ */ jsxs16("div", { className: "detail-error", children: [
1260
- /* @__PURE__ */ jsx16("div", { className: "detail-error-type", children: node.error.error_type }),
1261
- /* @__PURE__ */ jsx16("div", { className: "detail-error-message", children: node.error.message }),
1262
- node.error.stack && /* @__PURE__ */ jsx16("div", { className: "detail-error-stack", children: node.error.stack })
1338
+ node.error && /* @__PURE__ */ jsxs17("div", { className: "detail-error", children: [
1339
+ /* @__PURE__ */ jsx17("div", { className: "detail-error-type", children: node.error.error_type }),
1340
+ /* @__PURE__ */ jsx17("div", { className: "detail-error-message", children: node.error.message }),
1341
+ node.error.stack && /* @__PURE__ */ jsx17("div", { className: "detail-error-stack", children: node.error.stack })
1263
1342
  ] }),
1264
- showsGeneratedData && node.metrics && Object.keys(node.metrics).length > 0 && /* @__PURE__ */ jsxs16("div", { children: [
1265
- /* @__PURE__ */ jsx16("div", { className: "detail-section-label", children: "Metrics" }),
1266
- Object.entries(node.metrics).map(([key, value]) => /* @__PURE__ */ jsx16(
1343
+ showsGeneratedData && node.metrics && Object.keys(node.metrics).length > 0 && /* @__PURE__ */ jsxs17("div", { children: [
1344
+ /* @__PURE__ */ jsx17("div", { className: "detail-section-label", children: "Metrics" }),
1345
+ Object.entries(node.metrics).map(([key, value]) => /* @__PURE__ */ jsx17(
1267
1346
  KV,
1268
1347
  {
1269
1348
  label: key,
@@ -1272,17 +1351,17 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1272
1351
  key
1273
1352
  ))
1274
1353
  ] }),
1275
- node.tags && Object.keys(node.tags).length > 0 && /* @__PURE__ */ jsxs16("div", { children: [
1276
- /* @__PURE__ */ jsx16("div", { className: "detail-section-label", children: "Tags" }),
1277
- /* @__PURE__ */ jsx16("div", { className: "detail-tags", children: Object.entries(node.tags).map(([key, value]) => /* @__PURE__ */ jsxs16("span", { className: "detail-tag", children: [
1278
- /* @__PURE__ */ jsxs16("span", { className: "detail-tag-key", children: [
1354
+ node.tags && Object.keys(node.tags).length > 0 && /* @__PURE__ */ jsxs17("div", { children: [
1355
+ /* @__PURE__ */ jsx17("div", { className: "detail-section-label", children: "Tags" }),
1356
+ /* @__PURE__ */ jsx17("div", { className: "detail-tags", children: Object.entries(node.tags).map(([key, value]) => /* @__PURE__ */ jsxs17("span", { className: "detail-tag", children: [
1357
+ /* @__PURE__ */ jsxs17("span", { className: "detail-tag-key", children: [
1279
1358
  key,
1280
1359
  ": "
1281
1360
  ] }),
1282
- /* @__PURE__ */ jsx16("span", { className: "detail-tag-value", children: value })
1361
+ /* @__PURE__ */ jsx17("span", { className: "detail-tag-value", children: value })
1283
1362
  ] }, key)) })
1284
1363
  ] }),
1285
- !blueprint && !isBinding && /* @__PURE__ */ jsx16("div", { className: "detail-not-available", children: "Blueprint not available" })
1364
+ !blueprint && !isBinding && /* @__PURE__ */ jsx17("div", { className: "detail-not-available", children: "Blueprint not available" })
1286
1365
  ] });
1287
1366
  }
1288
1367
  function BlueprintSection({
@@ -1293,7 +1372,7 @@ function BlueprintSection({
1293
1372
  }) {
1294
1373
  switch (blueprint.type) {
1295
1374
  case "PipeLLM":
1296
- return /* @__PURE__ */ jsx16(
1375
+ return /* @__PURE__ */ jsx17(
1297
1376
  PipeLLMSection,
1298
1377
  {
1299
1378
  blueprint,
@@ -1303,7 +1382,7 @@ function BlueprintSection({
1303
1382
  }
1304
1383
  );
1305
1384
  case "PipeImgGen":
1306
- return /* @__PURE__ */ jsx16(
1385
+ return /* @__PURE__ */ jsx17(
1307
1386
  PipeImgGenSection,
1308
1387
  {
1309
1388
  blueprint,
@@ -1313,9 +1392,19 @@ function BlueprintSection({
1313
1392
  }
1314
1393
  );
1315
1394
  case "PipeCompose":
1316
- return /* @__PURE__ */ jsx16(PipeComposeSection, { blueprint, executionData });
1395
+ return /* @__PURE__ */ jsx17(PipeComposeSection, { blueprint, executionData });
1396
+ case "PipeDocGen":
1397
+ return /* @__PURE__ */ jsx17(
1398
+ PipeDocGenSection,
1399
+ {
1400
+ blueprint,
1401
+ executionData,
1402
+ modelsRan,
1403
+ modelHandles
1404
+ }
1405
+ );
1317
1406
  case "PipeExtract":
1318
- return /* @__PURE__ */ jsx16(
1407
+ return /* @__PURE__ */ jsx17(
1319
1408
  PipeExtractSection,
1320
1409
  {
1321
1410
  blueprint,
@@ -1324,7 +1413,7 @@ function BlueprintSection({
1324
1413
  }
1325
1414
  );
1326
1415
  case "PipeSearch":
1327
- return /* @__PURE__ */ jsx16(
1416
+ return /* @__PURE__ */ jsx17(
1328
1417
  PipeSearchSection,
1329
1418
  {
1330
1419
  blueprint,
@@ -1334,7 +1423,7 @@ function BlueprintSection({
1334
1423
  }
1335
1424
  );
1336
1425
  case "PipeStructure":
1337
- return /* @__PURE__ */ jsx16(
1426
+ return /* @__PURE__ */ jsx17(
1338
1427
  PipeStructureSection,
1339
1428
  {
1340
1429
  blueprint,
@@ -1344,19 +1433,24 @@ function BlueprintSection({
1344
1433
  }
1345
1434
  );
1346
1435
  case "PipeSequence":
1347
- return /* @__PURE__ */ jsx16(PipeSequenceSection, { blueprint, executionData });
1436
+ return /* @__PURE__ */ jsx17(PipeSequenceSection, { blueprint, executionData });
1348
1437
  case "PipeParallel":
1349
- return /* @__PURE__ */ jsx16(PipeParallelSection, { blueprint, executionData });
1438
+ return /* @__PURE__ */ jsx17(PipeParallelSection, { blueprint, executionData });
1350
1439
  case "PipeCondition":
1351
- return /* @__PURE__ */ jsx16(PipeConditionSection, { blueprint, executionData });
1440
+ return /* @__PURE__ */ jsx17(PipeConditionSection, { blueprint, executionData });
1352
1441
  case "PipeBatch":
1353
- return /* @__PURE__ */ jsx16(PipeBatchSection, { blueprint, executionData });
1442
+ return /* @__PURE__ */ jsx17(PipeBatchSection, { blueprint, executionData });
1354
1443
  case "PipeFunc":
1355
1444
  return null;
1445
+ case "PipeJudge":
1446
+ return null;
1356
1447
  case "PipeSignature":
1357
- return /* @__PURE__ */ jsx16("div", { className: "detail-not-available", children: "Signature stub \u2014 declared but not yet implemented." });
1358
- default:
1448
+ return /* @__PURE__ */ jsx17("div", { className: "detail-not-available", children: "Signature stub \u2014 declared but not yet implemented." });
1449
+ default: {
1450
+ const _unhandled = blueprint;
1451
+ void _unhandled;
1359
1452
  return null;
1453
+ }
1360
1454
  }
1361
1455
  }
1362
1456
  function ExecutionDataSection({
@@ -1365,20 +1459,19 @@ function ExecutionDataSection({
1365
1459
  hasBlueprint
1366
1460
  }) {
1367
1461
  if (!shouldDumpExecutionData(pipeType, hasBlueprint)) return null;
1368
- return /* @__PURE__ */ jsx16(GenericExecutionData, { data: executionData });
1462
+ return /* @__PURE__ */ jsx17(GenericExecutionData, { entries: dumpableExecutionData(pipeType, executionData) });
1369
1463
  }
1370
- function GenericExecutionData({ data }) {
1371
- const entries = Object.entries(data);
1464
+ function GenericExecutionData({ entries }) {
1372
1465
  if (entries.length === 0) return null;
1373
- return /* @__PURE__ */ jsxs16(Fragment10, { children: [
1374
- /* @__PURE__ */ jsx16("div", { className: "detail-section-label", children: "Execution" }),
1375
- entries.map(([key, value]) => /* @__PURE__ */ jsx16(KV, { label: key, value: String(value) }, key))
1466
+ return /* @__PURE__ */ jsxs17(Fragment11, { children: [
1467
+ /* @__PURE__ */ jsx17("div", { className: "detail-section-label", children: "Execution" }),
1468
+ entries.map(([key, value]) => /* @__PURE__ */ jsx17(KV, { label: key, value: String(value) }, key))
1376
1469
  ] });
1377
1470
  }
1378
1471
 
1379
1472
  // src/graph/react/detail/ConceptDetailPanel.tsx
1380
1473
  import React7 from "react";
1381
- import { Fragment as Fragment11, jsx as jsx17, jsxs as jsxs17 } from "react/jsx-runtime";
1474
+ import { Fragment as Fragment12, jsx as jsx18, jsxs as jsxs18 } from "react/jsx-runtime";
1382
1475
  function ConceptDetailPanel({
1383
1476
  concept,
1384
1477
  ioData,
@@ -1388,18 +1481,18 @@ function ConceptDetailPanel({
1388
1481
  }) {
1389
1482
  var _a;
1390
1483
  const multiplicity = ioData == null ? void 0 : ioData.multiplicity;
1391
- return /* @__PURE__ */ jsxs17(Fragment11, { children: [
1392
- /* @__PURE__ */ jsxs17("div", { className: "detail-header", children: [
1393
- /* @__PURE__ */ jsx17("span", { className: "detail-concept-code", children: concept.code + multiplicitySuffix(multiplicity) }),
1394
- /* @__PURE__ */ jsx17("span", { className: "detail-concept-domain", children: concept.domain_code })
1484
+ return /* @__PURE__ */ jsxs18(Fragment12, { children: [
1485
+ /* @__PURE__ */ jsxs18("div", { className: "detail-header", children: [
1486
+ /* @__PURE__ */ jsx18("span", { className: "detail-concept-code", children: concept.code + multiplicitySuffix(multiplicity) }),
1487
+ /* @__PURE__ */ jsx18("span", { className: "detail-concept-domain", children: concept.domain_code })
1395
1488
  ] }),
1396
- isPluralMultiplicity(multiplicity) && /* @__PURE__ */ jsx17("div", { className: "detail-multiplicity", children: multiplicity === true ? `A variable-length list of ${concept.code} items` : `A fixed-length list of exactly ${multiplicity} ${concept.code} items` }),
1397
- concept.description && /* @__PURE__ */ jsx17("div", { className: "detail-description", children: concept.description }),
1398
- concept.refines && /* @__PURE__ */ jsxs17("div", { className: "detail-refines", children: [
1489
+ isPluralMultiplicity(multiplicity) && /* @__PURE__ */ jsx18("div", { className: "detail-multiplicity", children: multiplicity === true ? `A variable-length list of ${concept.code} items` : `A fixed-length list of exactly ${multiplicity} ${concept.code} items` }),
1490
+ concept.description && /* @__PURE__ */ jsx18("div", { className: "detail-description", children: concept.description }),
1491
+ concept.refines && /* @__PURE__ */ jsxs18("div", { className: "detail-refines", children: [
1399
1492
  "refines ",
1400
- /* @__PURE__ */ jsx17("span", { className: "detail-refines-code", children: concept.refines })
1493
+ /* @__PURE__ */ jsx18("span", { className: "detail-refines-code", children: concept.refines })
1401
1494
  ] }),
1402
- /* @__PURE__ */ jsx17(
1495
+ /* @__PURE__ */ jsx18(
1403
1496
  ConceptBody,
1404
1497
  {
1405
1498
  concept,
@@ -1418,10 +1511,10 @@ function ConceptBody({ concept, ioData, isDryRun, renderData }) {
1418
1511
  const baseId = React7.useId();
1419
1512
  const tabId = (tab) => `${baseId}-tab-${tab}`;
1420
1513
  const panelId = (tab) => `${baseId}-tabpanel-${tab}`;
1421
- const structure = concept.json_schema ? /* @__PURE__ */ jsxs17("div", { children: [
1422
- /* @__PURE__ */ jsx17("div", { className: "detail-section-label", children: "Structure" }),
1423
- /* @__PURE__ */ jsx17(SchemaTable, { schema: concept.json_schema })
1424
- ] }) : /* @__PURE__ */ jsx17("div", { className: "detail-not-available", children: "Schema not available" });
1514
+ const structure = concept.json_schema ? /* @__PURE__ */ jsxs18("div", { children: [
1515
+ /* @__PURE__ */ jsx18("div", { className: "detail-section-label", children: "Structure" }),
1516
+ /* @__PURE__ */ jsx18(SchemaTable, { schema: concept.json_schema })
1517
+ ] }) : /* @__PURE__ */ jsx18("div", { className: "detail-not-available", children: "Schema not available" });
1425
1518
  if (!hasData) return structure;
1426
1519
  const onTabKeyDown = (event) => {
1427
1520
  var _a;
@@ -1444,7 +1537,7 @@ function ConceptBody({ concept, ioData, isDryRun, renderData }) {
1444
1537
  setActiveTab(next);
1445
1538
  (_a = document.getElementById(tabId(next))) == null ? void 0 : _a.focus();
1446
1539
  };
1447
- const renderTab = (tab, label) => /* @__PURE__ */ jsx17(
1540
+ const renderTab = (tab, label) => /* @__PURE__ */ jsx18(
1448
1541
  "button",
1449
1542
  {
1450
1543
  type: "button",
@@ -1459,12 +1552,12 @@ function ConceptBody({ concept, ioData, isDryRun, renderData }) {
1459
1552
  children: label
1460
1553
  }
1461
1554
  );
1462
- return /* @__PURE__ */ jsxs17(Fragment11, { children: [
1463
- /* @__PURE__ */ jsxs17("div", { className: "detail-tabs", role: "tablist", "aria-label": "Concept views", children: [
1555
+ return /* @__PURE__ */ jsxs18(Fragment12, { children: [
1556
+ /* @__PURE__ */ jsxs18("div", { className: "detail-tabs", role: "tablist", "aria-label": "Concept views", children: [
1464
1557
  renderTab("data", "Data"),
1465
1558
  renderTab("structure", "Structure")
1466
1559
  ] }),
1467
- /* @__PURE__ */ jsx17("div", { role: "tabpanel", id: panelId(activeTab), "aria-labelledby": tabId(activeTab), children: activeTab === "data" ? dataView : structure })
1560
+ /* @__PURE__ */ jsx18("div", { role: "tabpanel", id: panelId(activeTab), "aria-labelledby": tabId(activeTab), children: activeTab === "data" ? dataView : structure })
1468
1561
  ] });
1469
1562
  }
1470
1563
  function SchemaTable({ schema }) {
@@ -1472,23 +1565,23 @@ function SchemaTable({ schema }) {
1472
1565
  const properties = schema.properties;
1473
1566
  const required = new Set((_a = schema.required) != null ? _a : []);
1474
1567
  if (!properties || Object.keys(properties).length === 0) {
1475
- return /* @__PURE__ */ jsx17("div", { className: "detail-not-available", children: "No fields defined" });
1568
+ return /* @__PURE__ */ jsx18("div", { className: "detail-not-available", children: "No fields defined" });
1476
1569
  }
1477
1570
  const fields = Object.entries(properties);
1478
- return /* @__PURE__ */ jsxs17("table", { className: "detail-schema-table", children: [
1479
- /* @__PURE__ */ jsx17("thead", { children: /* @__PURE__ */ jsxs17("tr", { children: [
1480
- /* @__PURE__ */ jsx17("th", { children: "Field" }),
1481
- /* @__PURE__ */ jsx17("th", { children: "Type" }),
1482
- /* @__PURE__ */ jsx17("th", {}),
1483
- /* @__PURE__ */ jsx17("th", { children: "Description" })
1571
+ return /* @__PURE__ */ jsxs18("table", { className: "detail-schema-table", children: [
1572
+ /* @__PURE__ */ jsx18("thead", { children: /* @__PURE__ */ jsxs18("tr", { children: [
1573
+ /* @__PURE__ */ jsx18("th", { children: "Field" }),
1574
+ /* @__PURE__ */ jsx18("th", { children: "Type" }),
1575
+ /* @__PURE__ */ jsx18("th", {}),
1576
+ /* @__PURE__ */ jsx18("th", { children: "Description" })
1484
1577
  ] }) }),
1485
- /* @__PURE__ */ jsx17("tbody", { children: fields.map(([fieldName, fieldSchema]) => {
1578
+ /* @__PURE__ */ jsx18("tbody", { children: fields.map(([fieldName, fieldSchema]) => {
1486
1579
  var _a2;
1487
- return /* @__PURE__ */ jsxs17("tr", { children: [
1488
- /* @__PURE__ */ jsx17("td", { className: "detail-schema-field", children: fieldName }),
1489
- /* @__PURE__ */ jsx17("td", { className: "detail-schema-type", children: extractType(fieldSchema) }),
1490
- /* @__PURE__ */ jsx17("td", { children: required.has(fieldName) && /* @__PURE__ */ jsx17("span", { className: "detail-schema-required", children: "req" }) }),
1491
- /* @__PURE__ */ jsx17("td", { children: (_a2 = fieldSchema.description) != null ? _a2 : "" })
1580
+ return /* @__PURE__ */ jsxs18("tr", { children: [
1581
+ /* @__PURE__ */ jsx18("td", { className: "detail-schema-field", children: fieldName }),
1582
+ /* @__PURE__ */ jsx18("td", { className: "detail-schema-type", children: extractType(fieldSchema) }),
1583
+ /* @__PURE__ */ jsx18("td", { children: required.has(fieldName) && /* @__PURE__ */ jsx18("span", { className: "detail-schema-required", children: "req" }) }),
1584
+ /* @__PURE__ */ jsx18("td", { children: (_a2 = fieldSchema.description) != null ? _a2 : "" })
1492
1585
  ] }, fieldName);
1493
1586
  }) })
1494
1587
  ] });
@@ -1539,10 +1632,10 @@ function toAppEdges(edges) {
1539
1632
  }
1540
1633
 
1541
1634
  // src/graph/react/viewer/renderLabel.tsx
1542
- import { jsx as jsx18, jsxs as jsxs18 } from "react/jsx-runtime";
1635
+ import { jsx as jsx19, jsxs as jsxs19 } from "react/jsx-runtime";
1543
1636
  function renderLabel(desc) {
1544
1637
  if (desc.kind === "pipe") {
1545
- return /* @__PURE__ */ jsx18(
1638
+ return /* @__PURE__ */ jsx19(
1546
1639
  "div",
1547
1640
  {
1548
1641
  style: {
@@ -1556,7 +1649,7 @@ function renderLabel(desc) {
1556
1649
  minWidth: 0
1557
1650
  },
1558
1651
  title: desc.label,
1559
- children: /* @__PURE__ */ jsx18(
1652
+ children: /* @__PURE__ */ jsx19(
1560
1653
  "span",
1561
1654
  {
1562
1655
  style: {
@@ -1575,7 +1668,7 @@ function renderLabel(desc) {
1575
1668
  }
1576
1669
  );
1577
1670
  }
1578
- return /* @__PURE__ */ jsxs18(
1671
+ return /* @__PURE__ */ jsxs19(
1579
1672
  "div",
1580
1673
  {
1581
1674
  style: {
@@ -1591,7 +1684,7 @@ function renderLabel(desc) {
1591
1684
  },
1592
1685
  title: desc.concept ? `${desc.label}: ${desc.concept}` : desc.label,
1593
1686
  children: [
1594
- /* @__PURE__ */ jsx18(
1687
+ /* @__PURE__ */ jsx19(
1595
1688
  "span",
1596
1689
  {
1597
1690
  style: {
@@ -1607,7 +1700,7 @@ function renderLabel(desc) {
1607
1700
  children: desc.label
1608
1701
  }
1609
1702
  ),
1610
- desc.concept && /* @__PURE__ */ jsx18(
1703
+ desc.concept && /* @__PURE__ */ jsx19(
1611
1704
  "span",
1612
1705
  {
1613
1706
  style: {
@@ -1641,7 +1734,7 @@ import React10 from "react";
1641
1734
  import { Panel } from "@xyflow/react";
1642
1735
 
1643
1736
  // src/graph/react/viewer/ValidationPanel.tsx
1644
- import { jsx as jsx19, jsxs as jsxs19 } from "react/jsx-runtime";
1737
+ import { jsx as jsx20, jsxs as jsxs20 } from "react/jsx-runtime";
1645
1738
  function validationLabel(state, issueCount) {
1646
1739
  const issues = issueCount === 1 ? "1 issue" : `${issueCount} issues`;
1647
1740
  switch (state) {
@@ -1708,7 +1801,7 @@ function ValidationPanel({
1708
1801
  placement,
1709
1802
  id
1710
1803
  }) {
1711
- return /* @__PURE__ */ jsxs19(
1804
+ return /* @__PURE__ */ jsxs20(
1712
1805
  "div",
1713
1806
  {
1714
1807
  id,
@@ -1716,18 +1809,18 @@ function ValidationPanel({
1716
1809
  role: "region",
1717
1810
  "aria-label": "Validation issues",
1718
1811
  children: [
1719
- /* @__PURE__ */ jsx19("div", { className: "graph-validation-panel-header", children: validationLabel(state, issues.length) }),
1720
- issues.length === 0 ? /* @__PURE__ */ jsx19("div", { className: "graph-validation-empty", children: validationEmptyText(state) }) : /* @__PURE__ */ jsx19("ul", { className: "graph-validation-issues", role: "list", children: issues.map((issue, index) => {
1812
+ /* @__PURE__ */ jsx20("div", { className: "graph-validation-panel-header", children: validationLabel(state, issues.length) }),
1813
+ issues.length === 0 ? /* @__PURE__ */ jsx20("div", { className: "graph-validation-empty", children: validationEmptyText(state) }) : /* @__PURE__ */ jsx20("ul", { className: "graph-validation-issues", role: "list", children: issues.map((issue, index) => {
1721
1814
  const clickable = onIssueClick !== void 0;
1722
- const meta = (issue.context || issue.file) && /* @__PURE__ */ jsxs19("div", { className: "graph-validation-issue-meta", children: [
1723
- issue.context && /* @__PURE__ */ jsx19("span", { className: "graph-validation-issue-context", children: issue.context }),
1724
- issue.file && /* @__PURE__ */ jsx19("span", { className: "graph-validation-issue-file", children: issue.file })
1815
+ const meta = (issue.context || issue.file) && /* @__PURE__ */ jsxs20("div", { className: "graph-validation-issue-meta", children: [
1816
+ issue.context && /* @__PURE__ */ jsx20("span", { className: "graph-validation-issue-context", children: issue.context }),
1817
+ issue.file && /* @__PURE__ */ jsx20("span", { className: "graph-validation-issue-file", children: issue.file })
1725
1818
  ] });
1726
- return /* @__PURE__ */ jsx19(
1819
+ return /* @__PURE__ */ jsx20(
1727
1820
  "li",
1728
1821
  {
1729
1822
  className: `graph-validation-issue graph-validation-issue--${issue.severity}` + (clickable ? " graph-validation-issue--clickable" : ""),
1730
- children: /* @__PURE__ */ jsxs19(
1823
+ children: /* @__PURE__ */ jsxs20(
1731
1824
  "div",
1732
1825
  {
1733
1826
  className: "graph-validation-issue-body",
@@ -1742,8 +1835,8 @@ function ValidationPanel({
1742
1835
  } : void 0,
1743
1836
  children: [
1744
1837
  meta,
1745
- /* @__PURE__ */ jsx19("div", { className: "graph-validation-issue-message", children: issue.message }),
1746
- issue.suggestedFix && /* @__PURE__ */ jsx19("div", { className: "graph-validation-issue-fix", children: issue.suggestedFix })
1838
+ /* @__PURE__ */ jsx20("div", { className: "graph-validation-issue-message", children: issue.message }),
1839
+ issue.suggestedFix && /* @__PURE__ */ jsx20("div", { className: "graph-validation-issue-fix", children: issue.suggestedFix })
1747
1840
  ]
1748
1841
  }
1749
1842
  )
@@ -1785,7 +1878,7 @@ function usePopoverDismiss(open, wrapperRef, onDismiss) {
1785
1878
  }
1786
1879
 
1787
1880
  // src/graph/react/viewer/StyleMenu.tsx
1788
- import { jsx as jsx20, jsxs as jsxs20 } from "react/jsx-runtime";
1881
+ import { jsx as jsx21, jsxs as jsxs21 } from "react/jsx-runtime";
1789
1882
  var ICON_PROPS = {
1790
1883
  viewBox: "0 0 24 24",
1791
1884
  width: 14,
@@ -1798,22 +1891,22 @@ var ICON_PROPS = {
1798
1891
  };
1799
1892
  var STYLE_ICONS = {
1800
1893
  // Cards with their rows: every pipe with its slots.
1801
- [GRAPH_STYLE.DETAILED]: /* @__PURE__ */ jsxs20("svg", __spreadProps(__spreadValues({}, ICON_PROPS), { children: [
1802
- /* @__PURE__ */ jsx20("rect", { x: "3", y: "3", width: "7", height: "7", rx: "1" }),
1803
- /* @__PURE__ */ jsx20("rect", { x: "3", y: "14", width: "7", height: "7", rx: "1" }),
1804
- /* @__PURE__ */ jsx20("line", { x1: "14", y1: "4", x2: "21", y2: "4" }),
1805
- /* @__PURE__ */ jsx20("line", { x1: "14", y1: "9", x2: "21", y2: "9" }),
1806
- /* @__PURE__ */ jsx20("line", { x1: "14", y1: "15", x2: "21", y2: "15" }),
1807
- /* @__PURE__ */ jsx20("line", { x1: "14", y1: "20", x2: "21", y2: "20" })
1894
+ [GRAPH_STYLE.DETAILED]: /* @__PURE__ */ jsxs21("svg", __spreadProps(__spreadValues({}, ICON_PROPS), { children: [
1895
+ /* @__PURE__ */ jsx21("rect", { x: "3", y: "3", width: "7", height: "7", rx: "1" }),
1896
+ /* @__PURE__ */ jsx21("rect", { x: "3", y: "14", width: "7", height: "7", rx: "1" }),
1897
+ /* @__PURE__ */ jsx21("line", { x1: "14", y1: "4", x2: "21", y2: "4" }),
1898
+ /* @__PURE__ */ jsx21("line", { x1: "14", y1: "9", x2: "21", y2: "9" }),
1899
+ /* @__PURE__ */ jsx21("line", { x1: "14", y1: "15", x2: "21", y2: "15" }),
1900
+ /* @__PURE__ */ jsx21("line", { x1: "14", y1: "20", x2: "21", y2: "20" })
1808
1901
  ] })),
1809
1902
  // Two steps and the arrow between them: a flowchart.
1810
- [GRAPH_STYLE.SIMPLE]: /* @__PURE__ */ jsxs20("svg", __spreadProps(__spreadValues({}, ICON_PROPS), { children: [
1811
- /* @__PURE__ */ jsx20("rect", { x: "3", y: "3", width: "8", height: "8", rx: "2" }),
1812
- /* @__PURE__ */ jsx20("path", { d: "M7 11v4a2 2 0 0 0 2 2h4" }),
1813
- /* @__PURE__ */ jsx20("rect", { x: "13", y: "13", width: "8", height: "8", rx: "2" })
1903
+ [GRAPH_STYLE.SIMPLE]: /* @__PURE__ */ jsxs21("svg", __spreadProps(__spreadValues({}, ICON_PROPS), { children: [
1904
+ /* @__PURE__ */ jsx21("rect", { x: "3", y: "3", width: "8", height: "8", rx: "2" }),
1905
+ /* @__PURE__ */ jsx21("path", { d: "M7 11v4a2 2 0 0 0 2 2h4" }),
1906
+ /* @__PURE__ */ jsx21("rect", { x: "13", y: "13", width: "8", height: "8", rx: "2" })
1814
1907
  ] }))
1815
1908
  };
1816
- var CHECK_ICON2 = /* @__PURE__ */ jsx20("svg", __spreadProps(__spreadValues({}, ICON_PROPS), { children: /* @__PURE__ */ jsx20("polyline", { points: "20 6 9 17 4 12" }) }));
1909
+ var CHECK_ICON2 = /* @__PURE__ */ jsx21("svg", __spreadProps(__spreadValues({}, ICON_PROPS), { children: /* @__PURE__ */ jsx21("polyline", { points: "20 6 9 17 4 12" }) }));
1817
1910
  function graphStyleIcon(style) {
1818
1911
  return STYLE_ICONS[style];
1819
1912
  }
@@ -1878,8 +1971,8 @@ function StyleMenu({ value, options, onChange, placement }) {
1878
1971
  if (style !== value) onChange(style);
1879
1972
  };
1880
1973
  const label = styleMenuLabel(value);
1881
- return /* @__PURE__ */ jsxs20("div", { className: "graph-toolbar-style", ref: wrapperRef, children: [
1882
- /* @__PURE__ */ jsx20(
1974
+ return /* @__PURE__ */ jsxs21("div", { className: "graph-toolbar-style", ref: wrapperRef, children: [
1975
+ /* @__PURE__ */ jsx21(
1883
1976
  "button",
1884
1977
  {
1885
1978
  ref: buttonRef,
@@ -1900,7 +1993,7 @@ function StyleMenu({ value, options, onChange, placement }) {
1900
1993
  children: graphStyleIcon(value)
1901
1994
  }
1902
1995
  ),
1903
- open && /* @__PURE__ */ jsx20(
1996
+ open && /* @__PURE__ */ jsx21(
1904
1997
  "div",
1905
1998
  {
1906
1999
  id: menuId,
@@ -1911,7 +2004,7 @@ function StyleMenu({ value, options, onChange, placement }) {
1911
2004
  children: options.map((style, index) => {
1912
2005
  const descriptor = GRAPH_STYLES[style];
1913
2006
  const checked = style === value;
1914
- return /* @__PURE__ */ jsxs20(
2007
+ return /* @__PURE__ */ jsxs21(
1915
2008
  "button",
1916
2009
  {
1917
2010
  ref: (el) => {
@@ -1924,12 +2017,12 @@ function StyleMenu({ value, options, onChange, placement }) {
1924
2017
  className: `graph-style-menu-item${checked ? " graph-style-menu-item--checked" : ""}`,
1925
2018
  onClick: () => choose(style),
1926
2019
  children: [
1927
- /* @__PURE__ */ jsx20("span", { className: "graph-style-menu-icon", "aria-hidden": "true", children: graphStyleIcon(style) }),
1928
- /* @__PURE__ */ jsxs20("span", { className: "graph-style-menu-text", children: [
1929
- /* @__PURE__ */ jsx20("span", { className: "graph-style-menu-name", children: descriptor.name }),
1930
- /* @__PURE__ */ jsx20("span", { className: "graph-style-menu-description", children: descriptor.description })
2020
+ /* @__PURE__ */ jsx21("span", { className: "graph-style-menu-icon", "aria-hidden": "true", children: graphStyleIcon(style) }),
2021
+ /* @__PURE__ */ jsxs21("span", { className: "graph-style-menu-text", children: [
2022
+ /* @__PURE__ */ jsx21("span", { className: "graph-style-menu-name", children: descriptor.name }),
2023
+ /* @__PURE__ */ jsx21("span", { className: "graph-style-menu-description", children: descriptor.description })
1931
2024
  ] }),
1932
- /* @__PURE__ */ jsx20("span", { className: "graph-style-menu-check", "aria-hidden": "true", children: checked ? CHECK_ICON2 : null })
2025
+ /* @__PURE__ */ jsx21("span", { className: "graph-style-menu-check", "aria-hidden": "true", children: checked ? CHECK_ICON2 : null })
1933
2026
  ]
1934
2027
  },
1935
2028
  style
@@ -1941,9 +2034,9 @@ function StyleMenu({ value, options, onChange, placement }) {
1941
2034
  }
1942
2035
 
1943
2036
  // src/graph/react/viewer/GraphToolbar.tsx
1944
- import { Fragment as Fragment12, jsx as jsx21, jsxs as jsxs21 } from "react/jsx-runtime";
2037
+ import { Fragment as Fragment13, jsx as jsx22, jsxs as jsxs22 } from "react/jsx-runtime";
1945
2038
  var REACTFLOW_PANEL_MARGIN = 15;
1946
- var ARROW_RIGHT_ICON = /* @__PURE__ */ jsxs21(
2039
+ var ARROW_RIGHT_ICON = /* @__PURE__ */ jsxs22(
1947
2040
  "svg",
1948
2041
  {
1949
2042
  viewBox: "0 0 24 24",
@@ -1955,12 +2048,12 @@ var ARROW_RIGHT_ICON = /* @__PURE__ */ jsxs21(
1955
2048
  strokeLinecap: "round",
1956
2049
  strokeLinejoin: "round",
1957
2050
  children: [
1958
- /* @__PURE__ */ jsx21("line", { x1: "5", y1: "12", x2: "19", y2: "12" }),
1959
- /* @__PURE__ */ jsx21("polyline", { points: "12 5 19 12 12 19" })
2051
+ /* @__PURE__ */ jsx22("line", { x1: "5", y1: "12", x2: "19", y2: "12" }),
2052
+ /* @__PURE__ */ jsx22("polyline", { points: "12 5 19 12 12 19" })
1960
2053
  ]
1961
2054
  }
1962
2055
  );
1963
- var ARROW_DOWN_ICON = /* @__PURE__ */ jsxs21(
2056
+ var ARROW_DOWN_ICON = /* @__PURE__ */ jsxs22(
1964
2057
  "svg",
1965
2058
  {
1966
2059
  viewBox: "0 0 24 24",
@@ -1972,12 +2065,12 @@ var ARROW_DOWN_ICON = /* @__PURE__ */ jsxs21(
1972
2065
  strokeLinecap: "round",
1973
2066
  strokeLinejoin: "round",
1974
2067
  children: [
1975
- /* @__PURE__ */ jsx21("line", { x1: "12", y1: "5", x2: "12", y2: "19" }),
1976
- /* @__PURE__ */ jsx21("polyline", { points: "19 12 12 19 5 12" })
2068
+ /* @__PURE__ */ jsx22("line", { x1: "12", y1: "5", x2: "12", y2: "19" }),
2069
+ /* @__PURE__ */ jsx22("polyline", { points: "19 12 12 19 5 12" })
1977
2070
  ]
1978
2071
  }
1979
2072
  );
1980
- var MINUS_ICON = /* @__PURE__ */ jsx21(
2073
+ var MINUS_ICON = /* @__PURE__ */ jsx22(
1981
2074
  "svg",
1982
2075
  {
1983
2076
  viewBox: "0 0 24 24",
@@ -1988,10 +2081,10 @@ var MINUS_ICON = /* @__PURE__ */ jsx21(
1988
2081
  strokeWidth: "2",
1989
2082
  strokeLinecap: "round",
1990
2083
  strokeLinejoin: "round",
1991
- children: /* @__PURE__ */ jsx21("line", { x1: "5", y1: "12", x2: "19", y2: "12" })
2084
+ children: /* @__PURE__ */ jsx22("line", { x1: "5", y1: "12", x2: "19", y2: "12" })
1992
2085
  }
1993
2086
  );
1994
- var PLUS_ICON = /* @__PURE__ */ jsxs21(
2087
+ var PLUS_ICON = /* @__PURE__ */ jsxs22(
1995
2088
  "svg",
1996
2089
  {
1997
2090
  viewBox: "0 0 24 24",
@@ -2003,12 +2096,12 @@ var PLUS_ICON = /* @__PURE__ */ jsxs21(
2003
2096
  strokeLinecap: "round",
2004
2097
  strokeLinejoin: "round",
2005
2098
  children: [
2006
- /* @__PURE__ */ jsx21("line", { x1: "12", y1: "5", x2: "12", y2: "19" }),
2007
- /* @__PURE__ */ jsx21("line", { x1: "5", y1: "12", x2: "19", y2: "12" })
2099
+ /* @__PURE__ */ jsx22("line", { x1: "12", y1: "5", x2: "12", y2: "19" }),
2100
+ /* @__PURE__ */ jsx22("line", { x1: "5", y1: "12", x2: "19", y2: "12" })
2008
2101
  ]
2009
2102
  }
2010
2103
  );
2011
- var FIT_VIEW_ICON = /* @__PURE__ */ jsxs21(
2104
+ var FIT_VIEW_ICON = /* @__PURE__ */ jsxs22(
2012
2105
  "svg",
2013
2106
  {
2014
2107
  viewBox: "0 0 24 24",
@@ -2020,14 +2113,14 @@ var FIT_VIEW_ICON = /* @__PURE__ */ jsxs21(
2020
2113
  strokeLinecap: "round",
2021
2114
  strokeLinejoin: "round",
2022
2115
  children: [
2023
- /* @__PURE__ */ jsx21("polyline", { points: "15 3 21 3 21 9" }),
2024
- /* @__PURE__ */ jsx21("polyline", { points: "9 21 3 21 3 15" }),
2025
- /* @__PURE__ */ jsx21("line", { x1: "21", y1: "3", x2: "14", y2: "10" }),
2026
- /* @__PURE__ */ jsx21("line", { x1: "3", y1: "21", x2: "10", y2: "14" })
2116
+ /* @__PURE__ */ jsx22("polyline", { points: "15 3 21 3 21 9" }),
2117
+ /* @__PURE__ */ jsx22("polyline", { points: "9 21 3 21 3 15" }),
2118
+ /* @__PURE__ */ jsx22("line", { x1: "21", y1: "3", x2: "14", y2: "10" }),
2119
+ /* @__PURE__ */ jsx22("line", { x1: "3", y1: "21", x2: "10", y2: "14" })
2027
2120
  ]
2028
2121
  }
2029
2122
  );
2030
- var BOXES_ICON = /* @__PURE__ */ jsxs21(
2123
+ var BOXES_ICON = /* @__PURE__ */ jsxs22(
2031
2124
  "svg",
2032
2125
  {
2033
2126
  viewBox: "0 0 24 24",
@@ -2039,22 +2132,22 @@ var BOXES_ICON = /* @__PURE__ */ jsxs21(
2039
2132
  strokeLinecap: "round",
2040
2133
  strokeLinejoin: "round",
2041
2134
  children: [
2042
- /* @__PURE__ */ jsx21("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" }),
2043
- /* @__PURE__ */ jsx21("path", { d: "m7 16.5-4.74-2.85" }),
2044
- /* @__PURE__ */ jsx21("path", { d: "m7 16.5 5-3" }),
2045
- /* @__PURE__ */ jsx21("path", { d: "M7 16.5v5.17" }),
2046
- /* @__PURE__ */ jsx21("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" }),
2047
- /* @__PURE__ */ jsx21("path", { d: "m17 16.5-5-3" }),
2048
- /* @__PURE__ */ jsx21("path", { d: "m17 16.5 4.74-2.85" }),
2049
- /* @__PURE__ */ jsx21("path", { d: "M17 16.5v5.17" }),
2050
- /* @__PURE__ */ jsx21("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" }),
2051
- /* @__PURE__ */ jsx21("path", { d: "M12 8 7.26 5.15" }),
2052
- /* @__PURE__ */ jsx21("path", { d: "m12 8 4.74-2.85" }),
2053
- /* @__PURE__ */ jsx21("path", { d: "M12 13.5V8" })
2135
+ /* @__PURE__ */ jsx22("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" }),
2136
+ /* @__PURE__ */ jsx22("path", { d: "m7 16.5-4.74-2.85" }),
2137
+ /* @__PURE__ */ jsx22("path", { d: "m7 16.5 5-3" }),
2138
+ /* @__PURE__ */ jsx22("path", { d: "M7 16.5v5.17" }),
2139
+ /* @__PURE__ */ jsx22("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" }),
2140
+ /* @__PURE__ */ jsx22("path", { d: "m17 16.5-5-3" }),
2141
+ /* @__PURE__ */ jsx22("path", { d: "m17 16.5 4.74-2.85" }),
2142
+ /* @__PURE__ */ jsx22("path", { d: "M17 16.5v5.17" }),
2143
+ /* @__PURE__ */ jsx22("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" }),
2144
+ /* @__PURE__ */ jsx22("path", { d: "M12 8 7.26 5.15" }),
2145
+ /* @__PURE__ */ jsx22("path", { d: "m12 8 4.74-2.85" }),
2146
+ /* @__PURE__ */ jsx22("path", { d: "M12 13.5V8" })
2054
2147
  ]
2055
2148
  }
2056
2149
  );
2057
- var FOLD_ALL_ICON = /* @__PURE__ */ jsxs21(
2150
+ var FOLD_ALL_ICON = /* @__PURE__ */ jsxs22(
2058
2151
  "svg",
2059
2152
  {
2060
2153
  viewBox: "0 0 24 24",
@@ -2066,15 +2159,15 @@ var FOLD_ALL_ICON = /* @__PURE__ */ jsxs21(
2066
2159
  strokeLinecap: "round",
2067
2160
  strokeLinejoin: "round",
2068
2161
  children: [
2069
- /* @__PURE__ */ jsx21("rect", { x: "6", y: "6", width: "12", height: "12", rx: "2" }),
2070
- /* @__PURE__ */ jsx21("polyline", { points: "2 2 6 6 2 6" }),
2071
- /* @__PURE__ */ jsx21("polyline", { points: "22 2 18 6 22 6" }),
2072
- /* @__PURE__ */ jsx21("polyline", { points: "2 22 6 18 2 18" }),
2073
- /* @__PURE__ */ jsx21("polyline", { points: "22 22 18 18 22 18" })
2162
+ /* @__PURE__ */ jsx22("rect", { x: "6", y: "6", width: "12", height: "12", rx: "2" }),
2163
+ /* @__PURE__ */ jsx22("polyline", { points: "2 2 6 6 2 6" }),
2164
+ /* @__PURE__ */ jsx22("polyline", { points: "22 2 18 6 22 6" }),
2165
+ /* @__PURE__ */ jsx22("polyline", { points: "2 22 6 18 2 18" }),
2166
+ /* @__PURE__ */ jsx22("polyline", { points: "22 22 18 18 22 18" })
2074
2167
  ]
2075
2168
  }
2076
2169
  );
2077
- var EXPAND_ALL_ICON = /* @__PURE__ */ jsxs21(
2170
+ var EXPAND_ALL_ICON = /* @__PURE__ */ jsxs22(
2078
2171
  "svg",
2079
2172
  {
2080
2173
  viewBox: "0 0 24 24",
@@ -2086,15 +2179,15 @@ var EXPAND_ALL_ICON = /* @__PURE__ */ jsxs21(
2086
2179
  strokeLinecap: "round",
2087
2180
  strokeLinejoin: "round",
2088
2181
  children: [
2089
- /* @__PURE__ */ jsx21("rect", { x: "9", y: "9", width: "6", height: "6", rx: "1" }),
2090
- /* @__PURE__ */ jsx21("polyline", { points: "3 3 7 7 3 7" }),
2091
- /* @__PURE__ */ jsx21("polyline", { points: "21 3 17 7 21 7" }),
2092
- /* @__PURE__ */ jsx21("polyline", { points: "3 21 7 17 3 17" }),
2093
- /* @__PURE__ */ jsx21("polyline", { points: "21 21 17 17 21 17" })
2182
+ /* @__PURE__ */ jsx22("rect", { x: "9", y: "9", width: "6", height: "6", rx: "1" }),
2183
+ /* @__PURE__ */ jsx22("polyline", { points: "3 3 7 7 3 7" }),
2184
+ /* @__PURE__ */ jsx22("polyline", { points: "21 3 17 7 21 7" }),
2185
+ /* @__PURE__ */ jsx22("polyline", { points: "3 21 7 17 3 17" }),
2186
+ /* @__PURE__ */ jsx22("polyline", { points: "21 21 17 17 21 17" })
2094
2187
  ]
2095
2188
  }
2096
2189
  );
2097
- var SUN_ICON = /* @__PURE__ */ jsxs21(
2190
+ var SUN_ICON = /* @__PURE__ */ jsxs22(
2098
2191
  "svg",
2099
2192
  {
2100
2193
  viewBox: "0 0 24 24",
@@ -2106,19 +2199,19 @@ var SUN_ICON = /* @__PURE__ */ jsxs21(
2106
2199
  strokeLinecap: "round",
2107
2200
  strokeLinejoin: "round",
2108
2201
  children: [
2109
- /* @__PURE__ */ jsx21("circle", { cx: "12", cy: "12", r: "4" }),
2110
- /* @__PURE__ */ jsx21("line", { x1: "12", y1: "2", x2: "12", y2: "4" }),
2111
- /* @__PURE__ */ jsx21("line", { x1: "12", y1: "20", x2: "12", y2: "22" }),
2112
- /* @__PURE__ */ jsx21("line", { x1: "4.93", y1: "4.93", x2: "6.34", y2: "6.34" }),
2113
- /* @__PURE__ */ jsx21("line", { x1: "17.66", y1: "17.66", x2: "19.07", y2: "19.07" }),
2114
- /* @__PURE__ */ jsx21("line", { x1: "2", y1: "12", x2: "4", y2: "12" }),
2115
- /* @__PURE__ */ jsx21("line", { x1: "20", y1: "12", x2: "22", y2: "12" }),
2116
- /* @__PURE__ */ jsx21("line", { x1: "4.93", y1: "19.07", x2: "6.34", y2: "17.66" }),
2117
- /* @__PURE__ */ jsx21("line", { x1: "17.66", y1: "6.34", x2: "19.07", y2: "4.93" })
2202
+ /* @__PURE__ */ jsx22("circle", { cx: "12", cy: "12", r: "4" }),
2203
+ /* @__PURE__ */ jsx22("line", { x1: "12", y1: "2", x2: "12", y2: "4" }),
2204
+ /* @__PURE__ */ jsx22("line", { x1: "12", y1: "20", x2: "12", y2: "22" }),
2205
+ /* @__PURE__ */ jsx22("line", { x1: "4.93", y1: "4.93", x2: "6.34", y2: "6.34" }),
2206
+ /* @__PURE__ */ jsx22("line", { x1: "17.66", y1: "17.66", x2: "19.07", y2: "19.07" }),
2207
+ /* @__PURE__ */ jsx22("line", { x1: "2", y1: "12", x2: "4", y2: "12" }),
2208
+ /* @__PURE__ */ jsx22("line", { x1: "20", y1: "12", x2: "22", y2: "12" }),
2209
+ /* @__PURE__ */ jsx22("line", { x1: "4.93", y1: "19.07", x2: "6.34", y2: "17.66" }),
2210
+ /* @__PURE__ */ jsx22("line", { x1: "17.66", y1: "6.34", x2: "19.07", y2: "4.93" })
2118
2211
  ]
2119
2212
  }
2120
2213
  );
2121
- var MOON_ICON = /* @__PURE__ */ jsx21(
2214
+ var MOON_ICON = /* @__PURE__ */ jsx22(
2122
2215
  "svg",
2123
2216
  {
2124
2217
  viewBox: "0 0 24 24",
@@ -2129,10 +2222,10 @@ var MOON_ICON = /* @__PURE__ */ jsx21(
2129
2222
  strokeWidth: "2",
2130
2223
  strokeLinecap: "round",
2131
2224
  strokeLinejoin: "round",
2132
- children: /* @__PURE__ */ jsx21("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" })
2225
+ children: /* @__PURE__ */ jsx22("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" })
2133
2226
  }
2134
2227
  );
2135
- var MONITOR_ICON = /* @__PURE__ */ jsxs21(
2228
+ var MONITOR_ICON = /* @__PURE__ */ jsxs22(
2136
2229
  "svg",
2137
2230
  {
2138
2231
  viewBox: "0 0 24 24",
@@ -2144,13 +2237,13 @@ var MONITOR_ICON = /* @__PURE__ */ jsxs21(
2144
2237
  strokeLinecap: "round",
2145
2238
  strokeLinejoin: "round",
2146
2239
  children: [
2147
- /* @__PURE__ */ jsx21("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2" }),
2148
- /* @__PURE__ */ jsx21("line", { x1: "8", y1: "21", x2: "16", y2: "21" }),
2149
- /* @__PURE__ */ jsx21("line", { x1: "12", y1: "17", x2: "12", y2: "21" })
2240
+ /* @__PURE__ */ jsx22("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2" }),
2241
+ /* @__PURE__ */ jsx22("line", { x1: "8", y1: "21", x2: "16", y2: "21" }),
2242
+ /* @__PURE__ */ jsx22("line", { x1: "12", y1: "17", x2: "12", y2: "21" })
2150
2243
  ]
2151
2244
  }
2152
2245
  );
2153
- var SPINNER_ICON = /* @__PURE__ */ jsx21(
2246
+ var SPINNER_ICON = /* @__PURE__ */ jsx22(
2154
2247
  "svg",
2155
2248
  {
2156
2249
  className: "graph-toolbar-validation-spin",
@@ -2162,10 +2255,10 @@ var SPINNER_ICON = /* @__PURE__ */ jsx21(
2162
2255
  strokeWidth: "2",
2163
2256
  strokeLinecap: "round",
2164
2257
  strokeLinejoin: "round",
2165
- children: /* @__PURE__ */ jsx21("path", { d: "M21 12a9 9 0 1 1-6.219-8.56" })
2258
+ children: /* @__PURE__ */ jsx22("path", { d: "M21 12a9 9 0 1 1-6.219-8.56" })
2166
2259
  }
2167
2260
  );
2168
- var CHECK_ICON3 = /* @__PURE__ */ jsx21(
2261
+ var CHECK_ICON3 = /* @__PURE__ */ jsx22(
2169
2262
  "svg",
2170
2263
  {
2171
2264
  viewBox: "0 0 24 24",
@@ -2176,10 +2269,10 @@ var CHECK_ICON3 = /* @__PURE__ */ jsx21(
2176
2269
  strokeWidth: "2",
2177
2270
  strokeLinecap: "round",
2178
2271
  strokeLinejoin: "round",
2179
- children: /* @__PURE__ */ jsx21("polyline", { points: "20 6 9 17 4 12" })
2272
+ children: /* @__PURE__ */ jsx22("polyline", { points: "20 6 9 17 4 12" })
2180
2273
  }
2181
2274
  );
2182
- var X_CIRCLE_ICON = /* @__PURE__ */ jsxs21(
2275
+ var X_CIRCLE_ICON = /* @__PURE__ */ jsxs22(
2183
2276
  "svg",
2184
2277
  {
2185
2278
  viewBox: "0 0 24 24",
@@ -2191,13 +2284,13 @@ var X_CIRCLE_ICON = /* @__PURE__ */ jsxs21(
2191
2284
  strokeLinecap: "round",
2192
2285
  strokeLinejoin: "round",
2193
2286
  children: [
2194
- /* @__PURE__ */ jsx21("circle", { cx: "12", cy: "12", r: "10" }),
2195
- /* @__PURE__ */ jsx21("line", { x1: "15", y1: "9", x2: "9", y2: "15" }),
2196
- /* @__PURE__ */ jsx21("line", { x1: "9", y1: "9", x2: "15", y2: "15" })
2287
+ /* @__PURE__ */ jsx22("circle", { cx: "12", cy: "12", r: "10" }),
2288
+ /* @__PURE__ */ jsx22("line", { x1: "15", y1: "9", x2: "9", y2: "15" }),
2289
+ /* @__PURE__ */ jsx22("line", { x1: "9", y1: "9", x2: "15", y2: "15" })
2197
2290
  ]
2198
2291
  }
2199
2292
  );
2200
- var ALERT_TRIANGLE_ICON = /* @__PURE__ */ jsxs21(
2293
+ var ALERT_TRIANGLE_ICON = /* @__PURE__ */ jsxs22(
2201
2294
  "svg",
2202
2295
  {
2203
2296
  viewBox: "0 0 24 24",
@@ -2209,13 +2302,13 @@ var ALERT_TRIANGLE_ICON = /* @__PURE__ */ jsxs21(
2209
2302
  strokeLinecap: "round",
2210
2303
  strokeLinejoin: "round",
2211
2304
  children: [
2212
- /* @__PURE__ */ jsx21("path", { d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z" }),
2213
- /* @__PURE__ */ jsx21("line", { x1: "12", y1: "9", x2: "12", y2: "13" }),
2214
- /* @__PURE__ */ jsx21("line", { x1: "12", y1: "17", x2: "12.01", y2: "17" })
2305
+ /* @__PURE__ */ jsx22("path", { d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z" }),
2306
+ /* @__PURE__ */ jsx22("line", { x1: "12", y1: "9", x2: "12", y2: "13" }),
2307
+ /* @__PURE__ */ jsx22("line", { x1: "12", y1: "17", x2: "12.01", y2: "17" })
2215
2308
  ]
2216
2309
  }
2217
2310
  );
2218
- var INFO_CIRCLE_ICON = /* @__PURE__ */ jsxs21(
2311
+ var INFO_CIRCLE_ICON = /* @__PURE__ */ jsxs22(
2219
2312
  "svg",
2220
2313
  {
2221
2314
  viewBox: "0 0 24 24",
@@ -2227,9 +2320,9 @@ var INFO_CIRCLE_ICON = /* @__PURE__ */ jsxs21(
2227
2320
  strokeLinecap: "round",
2228
2321
  strokeLinejoin: "round",
2229
2322
  children: [
2230
- /* @__PURE__ */ jsx21("circle", { cx: "12", cy: "12", r: "10" }),
2231
- /* @__PURE__ */ jsx21("line", { x1: "12", y1: "16", x2: "12", y2: "12" }),
2232
- /* @__PURE__ */ jsx21("line", { x1: "12", y1: "8", x2: "12.01", y2: "8" })
2323
+ /* @__PURE__ */ jsx22("circle", { cx: "12", cy: "12", r: "10" }),
2324
+ /* @__PURE__ */ jsx22("line", { x1: "12", y1: "16", x2: "12", y2: "12" }),
2325
+ /* @__PURE__ */ jsx22("line", { x1: "12", y1: "8", x2: "12.01", y2: "8" })
2233
2326
  ]
2234
2327
  }
2235
2328
  );
@@ -2320,10 +2413,10 @@ function GraphToolbar({
2320
2413
  const foldAllSection = onFoldAll || onExpandAll;
2321
2414
  const foldAllTitle = foldAllDisabled ? "Fold all controllers (nothing to fold)" : "Fold all controllers";
2322
2415
  const expandAllTitle = expandAllDisabled ? "Expand all controllers (nothing to expand)" : "Expand all controllers";
2323
- return /* @__PURE__ */ jsx21(Panel, { position, className: "graph-toolbar-panel", style: panelStyle, children: /* @__PURE__ */ jsxs21("div", { className: `graph-toolbar graph-toolbar--${orientation}`, children: [
2324
- validationState !== void 0 && /* @__PURE__ */ jsxs21(Fragment12, { children: [
2325
- /* @__PURE__ */ jsxs21("div", { className: "graph-toolbar-validation", ref: validationRef, children: [
2326
- /* @__PURE__ */ jsxs21(
2416
+ return /* @__PURE__ */ jsx22(Panel, { position, className: "graph-toolbar-panel", style: panelStyle, children: /* @__PURE__ */ jsxs22("div", { className: `graph-toolbar graph-toolbar--${orientation}`, children: [
2417
+ validationState !== void 0 && /* @__PURE__ */ jsxs22(Fragment13, { children: [
2418
+ /* @__PURE__ */ jsxs22("div", { className: "graph-toolbar-validation", ref: validationRef, children: [
2419
+ /* @__PURE__ */ jsxs22(
2327
2420
  "button",
2328
2421
  {
2329
2422
  type: "button",
@@ -2336,11 +2429,11 @@ function GraphToolbar({
2336
2429
  "aria-controls": validationPanelId,
2337
2430
  children: [
2338
2431
  validationIcon(validationState),
2339
- validationIssues.length > 0 && /* @__PURE__ */ jsx21("span", { className: "graph-toolbar-validation-badge", children: validationIssues.length > 99 ? "99+" : validationIssues.length })
2432
+ validationIssues.length > 0 && /* @__PURE__ */ jsx22("span", { className: "graph-toolbar-validation-badge", children: validationIssues.length > 99 ? "99+" : validationIssues.length })
2340
2433
  ]
2341
2434
  }
2342
2435
  ),
2343
- validationOpen && /* @__PURE__ */ jsx21(
2436
+ validationOpen && /* @__PURE__ */ jsx22(
2344
2437
  ValidationPanel,
2345
2438
  {
2346
2439
  id: validationPanelId,
@@ -2351,10 +2444,10 @@ function GraphToolbar({
2351
2444
  }
2352
2445
  )
2353
2446
  ] }),
2354
- /* @__PURE__ */ jsx21("div", { className: "graph-toolbar-separator" })
2447
+ /* @__PURE__ */ jsx22("div", { className: "graph-toolbar-separator" })
2355
2448
  ] }),
2356
- styleMenuEnabled && /* @__PURE__ */ jsxs21(Fragment12, { children: [
2357
- /* @__PURE__ */ jsx21(
2449
+ styleMenuEnabled && /* @__PURE__ */ jsxs22(Fragment13, { children: [
2450
+ /* @__PURE__ */ jsx22(
2358
2451
  StyleMenu,
2359
2452
  {
2360
2453
  value: graphStyle,
@@ -2363,9 +2456,9 @@ function GraphToolbar({
2363
2456
  placement: validationPanelPlacement(position)
2364
2457
  }
2365
2458
  ),
2366
- /* @__PURE__ */ jsx21("div", { className: "graph-toolbar-separator" })
2459
+ /* @__PURE__ */ jsx22("div", { className: "graph-toolbar-separator" })
2367
2460
  ] }),
2368
- onFoldAll && /* @__PURE__ */ jsx21(
2461
+ onFoldAll && /* @__PURE__ */ jsx22(
2369
2462
  "button",
2370
2463
  {
2371
2464
  type: "button",
@@ -2377,7 +2470,7 @@ function GraphToolbar({
2377
2470
  children: FOLD_ALL_ICON
2378
2471
  }
2379
2472
  ),
2380
- onExpandAll && /* @__PURE__ */ jsx21(
2473
+ onExpandAll && /* @__PURE__ */ jsx22(
2381
2474
  "button",
2382
2475
  {
2383
2476
  type: "button",
@@ -2389,8 +2482,8 @@ function GraphToolbar({
2389
2482
  children: EXPAND_ALL_ICON
2390
2483
  }
2391
2484
  ),
2392
- foldAllSection && /* @__PURE__ */ jsx21("div", { className: "graph-toolbar-separator" }),
2393
- onShowControllersChange && /* @__PURE__ */ jsx21(
2485
+ foldAllSection && /* @__PURE__ */ jsx22("div", { className: "graph-toolbar-separator" }),
2486
+ onShowControllersChange && /* @__PURE__ */ jsx22(
2394
2487
  "button",
2395
2488
  {
2396
2489
  type: "button",
@@ -2401,7 +2494,7 @@ function GraphToolbar({
2401
2494
  children: BOXES_ICON
2402
2495
  }
2403
2496
  ),
2404
- /* @__PURE__ */ jsx21(
2497
+ /* @__PURE__ */ jsx22(
2405
2498
  "button",
2406
2499
  {
2407
2500
  type: "button",
@@ -2412,8 +2505,8 @@ function GraphToolbar({
2412
2505
  children: isVertical ? ARROW_RIGHT_ICON : ARROW_DOWN_ICON
2413
2506
  }
2414
2507
  ),
2415
- (onZoomOut || onZoomIn || onFitView) && /* @__PURE__ */ jsx21("div", { className: "graph-toolbar-separator" }),
2416
- onZoomOut && /* @__PURE__ */ jsx21(
2508
+ (onZoomOut || onZoomIn || onFitView) && /* @__PURE__ */ jsx22("div", { className: "graph-toolbar-separator" }),
2509
+ onZoomOut && /* @__PURE__ */ jsx22(
2417
2510
  "button",
2418
2511
  {
2419
2512
  type: "button",
@@ -2424,7 +2517,7 @@ function GraphToolbar({
2424
2517
  children: MINUS_ICON
2425
2518
  }
2426
2519
  ),
2427
- onZoomIn && /* @__PURE__ */ jsx21(
2520
+ onZoomIn && /* @__PURE__ */ jsx22(
2428
2521
  "button",
2429
2522
  {
2430
2523
  type: "button",
@@ -2435,7 +2528,7 @@ function GraphToolbar({
2435
2528
  children: PLUS_ICON
2436
2529
  }
2437
2530
  ),
2438
- onFitView && /* @__PURE__ */ jsx21(
2531
+ onFitView && /* @__PURE__ */ jsx22(
2439
2532
  "button",
2440
2533
  {
2441
2534
  type: "button",
@@ -2446,9 +2539,9 @@ function GraphToolbar({
2446
2539
  children: FIT_VIEW_ICON
2447
2540
  }
2448
2541
  ),
2449
- themeToggleEnabled && /* @__PURE__ */ jsxs21(Fragment12, { children: [
2450
- /* @__PURE__ */ jsx21("div", { className: "graph-toolbar-separator" }),
2451
- /* @__PURE__ */ jsx21(
2542
+ themeToggleEnabled && /* @__PURE__ */ jsxs22(Fragment13, { children: [
2543
+ /* @__PURE__ */ jsx22("div", { className: "graph-toolbar-separator" }),
2544
+ /* @__PURE__ */ jsx22(
2452
2545
  "button",
2453
2546
  {
2454
2547
  type: "button",
@@ -2464,7 +2557,7 @@ function GraphToolbar({
2464
2557
  }
2465
2558
 
2466
2559
  // src/graph/react/nodes/NodeValidationBadge.tsx
2467
- import { jsx as jsx22 } from "react/jsx-runtime";
2560
+ import { jsx as jsx23 } from "react/jsx-runtime";
2468
2561
  function NodeValidationBadge({
2469
2562
  validation,
2470
2563
  onClick
@@ -2474,9 +2567,9 @@ function NodeValidationBadge({
2474
2567
  const className = `node-validation-badge node-validation-badge--${validation.severity}`;
2475
2568
  const text = validation.count > 99 ? "99+" : String(validation.count);
2476
2569
  if (!onClick) {
2477
- return /* @__PURE__ */ jsx22("span", { className, title: tooltip, "aria-label": label, children: text });
2570
+ return /* @__PURE__ */ jsx23("span", { className, title: tooltip, "aria-label": label, children: text });
2478
2571
  }
2479
- return /* @__PURE__ */ jsx22(
2572
+ return /* @__PURE__ */ jsx23(
2480
2573
  "button",
2481
2574
  {
2482
2575
  type: "button",
@@ -2496,7 +2589,7 @@ function validationRingClass(validation) {
2496
2589
  }
2497
2590
 
2498
2591
  // src/graph/react/nodes/controller/ControllerGroupNode.tsx
2499
- import { jsx as jsx23, jsxs as jsxs22 } from "react/jsx-runtime";
2592
+ import { jsx as jsx24, jsxs as jsxs23 } from "react/jsx-runtime";
2500
2593
  var CONTROLLER_CONFIG = {
2501
2594
  PipeSequence: { badge: "Sequence", icon: "\u2192" },
2502
2595
  PipeParallel: { badge: "Parallel", icon: "//" },
@@ -2518,12 +2611,12 @@ function ControllerGroupNode({ data }) {
2518
2611
  const modifier = getControllerModifier(data.pipeType);
2519
2612
  const isCollapsible = (data.pipeType === "PipeParallel" || data.pipeType === "PipeBatch") && ((_a = data.childCount) != null ? _a : 0) > MAX_VISIBLE_CONTROLLER_CHILDREN;
2520
2613
  const hiddenCount = isCollapsible ? ((_b = data.childCount) != null ? _b : 0) - MAX_VISIBLE_CONTROLLER_CHILDREN : 0;
2521
- return /* @__PURE__ */ jsxs22("div", { className: `controller-group-node ${modifier}${validationRingClass(data.validation)}`, children: [
2522
- /* @__PURE__ */ jsxs22("div", { className: "controller-group-header", children: [
2523
- /* @__PURE__ */ jsx23("span", { className: "controller-group-icon", children: config.icon }),
2524
- /* @__PURE__ */ jsx23("span", { className: "controller-group-badge", children: config.badge }),
2525
- data.label && /* @__PURE__ */ jsx23("span", { className: "controller-group-label", children: data.label }),
2526
- data.onToggleFold && /* @__PURE__ */ jsx23(
2614
+ return /* @__PURE__ */ jsxs23("div", { className: `controller-group-node ${modifier}${validationRingClass(data.validation)}`, children: [
2615
+ /* @__PURE__ */ jsxs23("div", { className: "controller-group-header", children: [
2616
+ /* @__PURE__ */ jsx24("span", { className: "controller-group-icon", children: config.icon }),
2617
+ /* @__PURE__ */ jsx24("span", { className: "controller-group-badge", children: config.badge }),
2618
+ data.label && /* @__PURE__ */ jsx24("span", { className: "controller-group-label", children: data.label }),
2619
+ data.onToggleFold && /* @__PURE__ */ jsx24(
2527
2620
  "button",
2528
2621
  {
2529
2622
  type: "button",
@@ -2538,9 +2631,9 @@ function ControllerGroupNode({ data }) {
2538
2631
  children: "\u2921"
2539
2632
  }
2540
2633
  ),
2541
- data.validation && /* @__PURE__ */ jsx23(NodeValidationBadge, { validation: data.validation, onClick: data.onValidationBadgeClick })
2634
+ data.validation && /* @__PURE__ */ jsx24(NodeValidationBadge, { validation: data.validation, onClick: data.onValidationBadgeClick })
2542
2635
  ] }),
2543
- isCollapsible && /* @__PURE__ */ jsx23(
2636
+ isCollapsible && /* @__PURE__ */ jsx24(
2544
2637
  "button",
2545
2638
  {
2546
2639
  className: "controller-group-collapse",
@@ -2561,7 +2654,7 @@ import { Handle, Position } from "@xyflow/react";
2561
2654
 
2562
2655
  // src/graph/react/nodes/pipe/PipeCardBase.tsx
2563
2656
  import { useState as useState2 } from "react";
2564
- import { jsx as jsx24, jsxs as jsxs23 } from "react/jsx-runtime";
2657
+ import { jsx as jsx25, jsxs as jsxs24 } from "react/jsx-runtime";
2565
2658
  var PIPE_TYPE_BADGES2 = {
2566
2659
  PipeLLM: "LLM",
2567
2660
  PipeExtract: "Extract",
@@ -2622,21 +2715,22 @@ function PipeCardBase({ data, children }) {
2622
2715
  const staticClass = isStatic ? " pipe-card--static" : "";
2623
2716
  const badgeClass = isController ? "pipe-card-badge pipe-card-badge--controller" : isSignature ? "pipe-card-badge pipe-card-badge--signature" : isBinding ? "pipe-card-badge pipe-card-badge--binding" : "pipe-card-badge";
2624
2717
  const ringClass = validationRingClass(data.validation);
2625
- return /* @__PURE__ */ jsxs23(
2718
+ return /* @__PURE__ */ jsxs24(
2626
2719
  "div",
2627
2720
  {
2628
2721
  className: `pipe-card ${dirClass}${controllerClass}${signatureClass}${bindingClass}${staticClass}${ringClass}`,
2629
2722
  children: [
2630
- /* @__PURE__ */ jsxs23("div", { className: "pipe-card-header", children: [
2631
- /* @__PURE__ */ jsx24("span", { className: badgeClass, children: badge }),
2632
- /* @__PURE__ */ jsx24("span", { className: "pipe-card-code", title: data.pipeCode, children: data.pipeCode }),
2633
- !isStatic && /* @__PURE__ */ jsx24(
2723
+ /* @__PURE__ */ jsxs24("div", { className: "pipe-card-header", children: [
2724
+ /* @__PURE__ */ jsx25("span", { className: badgeClass, children: badge }),
2725
+ data.docGenFormat && /* @__PURE__ */ jsx25("span", { className: "pipe-card-format", title: `Document format: ${data.docGenFormat}`, children: data.docGenFormat.toUpperCase() }),
2726
+ /* @__PURE__ */ jsx25("span", { className: "pipe-card-code", title: data.pipeCode, children: data.pipeCode }),
2727
+ !isStatic && /* @__PURE__ */ jsx25(
2634
2728
  "span",
2635
2729
  {
2636
2730
  className: "pipe-card-status",
2637
2731
  style: { color: statusConfig.color },
2638
2732
  title: statusConfig.label,
2639
- children: /* @__PURE__ */ jsx24(
2733
+ children: /* @__PURE__ */ jsx25(
2640
2734
  "span",
2641
2735
  {
2642
2736
  className: `pipe-card-status-dot ${isRunning ? "pipe-card-status-dot--pulse" : ""}`,
@@ -2645,7 +2739,7 @@ function PipeCardBase({ data, children }) {
2645
2739
  )
2646
2740
  }
2647
2741
  ),
2648
- data.onExpand && /* @__PURE__ */ jsx24(
2742
+ data.onExpand && /* @__PURE__ */ jsx25(
2649
2743
  "button",
2650
2744
  {
2651
2745
  type: "button",
@@ -2660,32 +2754,32 @@ function PipeCardBase({ data, children }) {
2660
2754
  children: "\u2922"
2661
2755
  }
2662
2756
  ),
2663
- data.validation && /* @__PURE__ */ jsx24(NodeValidationBadge, { validation: data.validation, onClick: data.onValidationBadgeClick })
2757
+ data.validation && /* @__PURE__ */ jsx25(NodeValidationBadge, { validation: data.validation, onClick: data.onValidationBadgeClick })
2664
2758
  ] }),
2665
- (outcome || batchMultiplicity) && /* @__PURE__ */ jsxs23("div", { className: "pipe-card-annotations", children: [
2666
- outcome && /* @__PURE__ */ jsxs23("span", { className: "pipe-card-annotation pipe-card-annotation--outcome", children: [
2759
+ (outcome || batchMultiplicity) && /* @__PURE__ */ jsxs24("div", { className: "pipe-card-annotations", children: [
2760
+ outcome && /* @__PURE__ */ jsxs24("span", { className: "pipe-card-annotation pipe-card-annotation--outcome", children: [
2667
2761
  "outcome: ",
2668
2762
  outcome
2669
2763
  ] }),
2670
- batchMultiplicity && /* @__PURE__ */ jsx24("span", { className: "pipe-card-annotation pipe-card-annotation--batch", children: batchMultiplicity })
2764
+ batchMultiplicity && /* @__PURE__ */ jsx25("span", { className: "pipe-card-annotation pipe-card-annotation--batch", children: batchMultiplicity })
2671
2765
  ] }),
2672
- data.description && /* @__PURE__ */ jsx24("span", { className: "pipe-card-description", title: data.description, children: data.description }),
2673
- data.inputs.length > 0 && /* @__PURE__ */ jsxs23("div", { className: "pipe-card-io", children: [
2674
- /* @__PURE__ */ jsx24("span", { className: "pipe-card-io-label", children: "INPUTS" }),
2675
- /* @__PURE__ */ jsxs23("div", { className: "pipe-card-io-pills", children: [
2676
- visibleInputs.map((input) => /* @__PURE__ */ jsxs23(
2766
+ data.description && /* @__PURE__ */ jsx25("span", { className: "pipe-card-description", title: data.description, children: data.description }),
2767
+ data.inputs.length > 0 && /* @__PURE__ */ jsxs24("div", { className: "pipe-card-io", children: [
2768
+ /* @__PURE__ */ jsx25("span", { className: "pipe-card-io-label", children: "INPUTS" }),
2769
+ /* @__PURE__ */ jsxs24("div", { className: "pipe-card-io-pills", children: [
2770
+ visibleInputs.map((input) => /* @__PURE__ */ jsxs24(
2677
2771
  "span",
2678
2772
  {
2679
2773
  className: "pipe-card-io-pill",
2680
2774
  title: `${input.name}: ${input.concept}`,
2681
2775
  children: [
2682
- /* @__PURE__ */ jsx24("span", { className: "pipe-card-io-pill-name", children: input.name }),
2683
- /* @__PURE__ */ jsx24("span", { className: "pipe-card-io-pill-concept", children: input.concept })
2776
+ /* @__PURE__ */ jsx25("span", { className: "pipe-card-io-pill-name", children: input.name }),
2777
+ /* @__PURE__ */ jsx25("span", { className: "pipe-card-io-pill-concept", children: input.concept })
2684
2778
  ]
2685
2779
  },
2686
2780
  input.name
2687
2781
  )),
2688
- hasMany && /* @__PURE__ */ jsx24(
2782
+ hasMany && /* @__PURE__ */ jsx25(
2689
2783
  "button",
2690
2784
  {
2691
2785
  className: "pipe-card-io-more",
@@ -2698,16 +2792,16 @@ function PipeCardBase({ data, children }) {
2698
2792
  )
2699
2793
  ] })
2700
2794
  ] }),
2701
- data.outputs.length > 0 && /* @__PURE__ */ jsxs23("div", { className: "pipe-card-io", children: [
2702
- /* @__PURE__ */ jsx24("span", { className: "pipe-card-io-label", children: "OUTPUT" }),
2703
- /* @__PURE__ */ jsx24("div", { className: "pipe-card-io-pills", children: data.outputs.map((output) => /* @__PURE__ */ jsxs23(
2795
+ data.outputs.length > 0 && /* @__PURE__ */ jsxs24("div", { className: "pipe-card-io", children: [
2796
+ /* @__PURE__ */ jsx25("span", { className: "pipe-card-io-label", children: "OUTPUT" }),
2797
+ /* @__PURE__ */ jsx25("div", { className: "pipe-card-io-pills", children: data.outputs.map((output) => /* @__PURE__ */ jsxs24(
2704
2798
  "span",
2705
2799
  {
2706
2800
  className: "pipe-card-io-pill",
2707
2801
  title: `${output.name}: ${output.concept}`,
2708
2802
  children: [
2709
- /* @__PURE__ */ jsx24("span", { className: "pipe-card-io-pill-name", children: output.name }),
2710
- /* @__PURE__ */ jsx24("span", { className: "pipe-card-io-pill-concept", children: output.concept })
2803
+ /* @__PURE__ */ jsx25("span", { className: "pipe-card-io-pill-name", children: output.name }),
2804
+ /* @__PURE__ */ jsx25("span", { className: "pipe-card-io-pill-concept", children: output.concept })
2711
2805
  ]
2712
2806
  },
2713
2807
  output.name
@@ -2742,11 +2836,11 @@ function getPipeCardComponent(pipeType) {
2742
2836
  }
2743
2837
 
2744
2838
  // src/graph/react/nodes/pipe/PipeCardNode.tsx
2745
- import { Fragment as Fragment13, jsx as jsx25, jsxs as jsxs24 } from "react/jsx-runtime";
2839
+ import { Fragment as Fragment14, jsx as jsx26, jsxs as jsxs25 } from "react/jsx-runtime";
2746
2840
  function PipeCardNode({ data }) {
2747
2841
  var _a;
2748
2842
  const Card = (_a = getPipeCardComponent(data.pipeType)) != null ? _a : PipeCardBase;
2749
- return /* @__PURE__ */ jsx25(Card, { data });
2843
+ return /* @__PURE__ */ jsx26(Card, { data });
2750
2844
  }
2751
2845
  function PipeCardRFNode({
2752
2846
  data,
@@ -2755,16 +2849,16 @@ function PipeCardRFNode({
2755
2849
  }) {
2756
2850
  const payload = data.pipeCardData;
2757
2851
  if (!payload) return null;
2758
- return /* @__PURE__ */ jsxs24(Fragment13, { children: [
2759
- /* @__PURE__ */ jsx25(Handle, { type: "target", position: targetPosition }),
2760
- /* @__PURE__ */ jsx25(PipeCardNode, { data: payload }),
2761
- /* @__PURE__ */ jsx25(Handle, { type: "source", position: sourcePosition })
2852
+ return /* @__PURE__ */ jsxs25(Fragment14, { children: [
2853
+ /* @__PURE__ */ jsx26(Handle, { type: "target", position: targetPosition }),
2854
+ /* @__PURE__ */ jsx26(PipeCardNode, { data: payload }),
2855
+ /* @__PURE__ */ jsx26(Handle, { type: "source", position: sourcePosition })
2762
2856
  ] });
2763
2857
  }
2764
2858
 
2765
2859
  // src/graph/react/styles/simple/SimpleNodes.tsx
2766
2860
  import { Handle as Handle2, Position as Position2 } from "@xyflow/react";
2767
- import { Fragment as Fragment14, jsx as jsx26, jsxs as jsxs25 } from "react/jsx-runtime";
2861
+ import { Fragment as Fragment15, jsx as jsx27, jsxs as jsxs26 } from "react/jsx-runtime";
2768
2862
  var ICON_PROPS2 = {
2769
2863
  viewBox: "0 0 24 24",
2770
2864
  fill: "none",
@@ -2775,90 +2869,90 @@ var ICON_PROPS2 = {
2775
2869
  "aria-hidden": true
2776
2870
  };
2777
2871
  function Icon({ size = 13, children }) {
2778
- return /* @__PURE__ */ jsx26("svg", __spreadProps(__spreadValues({}, ICON_PROPS2), { width: size, height: size, children }));
2872
+ return /* @__PURE__ */ jsx27("svg", __spreadProps(__spreadValues({}, ICON_PROPS2), { width: size, height: size, children }));
2779
2873
  }
2780
2874
  var CATEGORY_ICONS = {
2781
- ai: /* @__PURE__ */ jsxs25(Fragment14, { children: [
2782
- /* @__PURE__ */ jsx26("path", { d: "M9.94 15.5a2 2 0 0 0-1.44-1.44l-6.13-1.58a.5.5 0 0 1 0-.96L8.5 9.94A2 2 0 0 0 9.94 8.5l1.58-6.14a.5.5 0 0 1 .96 0l1.58 6.14a2 2 0 0 0 1.44 1.44l6.14 1.58a.5.5 0 0 1 0 .96l-6.14 1.58a2 2 0 0 0-1.44 1.44l-1.58 6.13a.5.5 0 0 1-.96 0z" }),
2783
- /* @__PURE__ */ jsx26("path", { d: "M20 3v4" }),
2784
- /* @__PURE__ */ jsx26("path", { d: "M22 5h-4" })
2875
+ ai: /* @__PURE__ */ jsxs26(Fragment15, { children: [
2876
+ /* @__PURE__ */ jsx27("path", { d: "M9.94 15.5a2 2 0 0 0-1.44-1.44l-6.13-1.58a.5.5 0 0 1 0-.96L8.5 9.94A2 2 0 0 0 9.94 8.5l1.58-6.14a.5.5 0 0 1 .96 0l1.58 6.14a2 2 0 0 0 1.44 1.44l6.14 1.58a.5.5 0 0 1 0 .96l-6.14 1.58a2 2 0 0 0-1.44 1.44l-1.58 6.13a.5.5 0 0 1-.96 0z" }),
2877
+ /* @__PURE__ */ jsx27("path", { d: "M20 3v4" }),
2878
+ /* @__PURE__ */ jsx27("path", { d: "M22 5h-4" })
2785
2879
  ] }),
2786
- extract: /* @__PURE__ */ jsxs25(Fragment14, { children: [
2787
- /* @__PURE__ */ jsx26("path", { d: "M3 7V5a2 2 0 0 1 2-2h2" }),
2788
- /* @__PURE__ */ jsx26("path", { d: "M17 3h2a2 2 0 0 1 2 2v2" }),
2789
- /* @__PURE__ */ jsx26("path", { d: "M21 17v2a2 2 0 0 1-2 2h-2" }),
2790
- /* @__PURE__ */ jsx26("path", { d: "M7 21H5a2 2 0 0 1-2-2v-2" }),
2791
- /* @__PURE__ */ jsx26("path", { d: "M7 8h8" }),
2792
- /* @__PURE__ */ jsx26("path", { d: "M7 12h10" }),
2793
- /* @__PURE__ */ jsx26("path", { d: "M7 16h6" })
2880
+ extract: /* @__PURE__ */ jsxs26(Fragment15, { children: [
2881
+ /* @__PURE__ */ jsx27("path", { d: "M3 7V5a2 2 0 0 1 2-2h2" }),
2882
+ /* @__PURE__ */ jsx27("path", { d: "M17 3h2a2 2 0 0 1 2 2v2" }),
2883
+ /* @__PURE__ */ jsx27("path", { d: "M21 17v2a2 2 0 0 1-2 2h-2" }),
2884
+ /* @__PURE__ */ jsx27("path", { d: "M7 21H5a2 2 0 0 1-2-2v-2" }),
2885
+ /* @__PURE__ */ jsx27("path", { d: "M7 8h8" }),
2886
+ /* @__PURE__ */ jsx27("path", { d: "M7 12h10" }),
2887
+ /* @__PURE__ */ jsx27("path", { d: "M7 16h6" })
2794
2888
  ] }),
2795
- image: /* @__PURE__ */ jsxs25(Fragment14, { children: [
2796
- /* @__PURE__ */ jsx26("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }),
2797
- /* @__PURE__ */ jsx26("circle", { cx: "9", cy: "9", r: "2" }),
2798
- /* @__PURE__ */ jsx26("path", { d: "m21 15-3.09-3.09a2 2 0 0 0-2.82 0L6 21" })
2889
+ image: /* @__PURE__ */ jsxs26(Fragment15, { children: [
2890
+ /* @__PURE__ */ jsx27("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }),
2891
+ /* @__PURE__ */ jsx27("circle", { cx: "9", cy: "9", r: "2" }),
2892
+ /* @__PURE__ */ jsx27("path", { d: "m21 15-3.09-3.09a2 2 0 0 0-2.82 0L6 21" })
2799
2893
  ] }),
2800
- search: /* @__PURE__ */ jsxs25(Fragment14, { children: [
2801
- /* @__PURE__ */ jsx26("circle", { cx: "11", cy: "11", r: "8" }),
2802
- /* @__PURE__ */ jsx26("path", { d: "m21 21-4.3-4.3" })
2894
+ search: /* @__PURE__ */ jsxs26(Fragment15, { children: [
2895
+ /* @__PURE__ */ jsx27("circle", { cx: "11", cy: "11", r: "8" }),
2896
+ /* @__PURE__ */ jsx27("path", { d: "m21 21-4.3-4.3" })
2803
2897
  ] }),
2804
- code: /* @__PURE__ */ jsxs25(Fragment14, { children: [
2805
- /* @__PURE__ */ jsx26("polyline", { points: "16 18 22 12 16 6" }),
2806
- /* @__PURE__ */ jsx26("polyline", { points: "8 6 2 12 8 18" })
2898
+ code: /* @__PURE__ */ jsxs26(Fragment15, { children: [
2899
+ /* @__PURE__ */ jsx27("polyline", { points: "16 18 22 12 16 6" }),
2900
+ /* @__PURE__ */ jsx27("polyline", { points: "8 6 2 12 8 18" })
2807
2901
  ] }),
2808
- template: /* @__PURE__ */ jsxs25(Fragment14, { children: [
2809
- /* @__PURE__ */ jsx26("path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z" }),
2810
- /* @__PURE__ */ jsx26("path", { d: "M14 2v4a2 2 0 0 0 2 2h4" }),
2811
- /* @__PURE__ */ jsx26("path", { d: "M16 13H8" }),
2812
- /* @__PURE__ */ jsx26("path", { d: "M16 17H8" })
2902
+ template: /* @__PURE__ */ jsxs26(Fragment15, { children: [
2903
+ /* @__PURE__ */ jsx27("path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z" }),
2904
+ /* @__PURE__ */ jsx27("path", { d: "M14 2v4a2 2 0 0 0 2 2h4" }),
2905
+ /* @__PURE__ */ jsx27("path", { d: "M16 13H8" }),
2906
+ /* @__PURE__ */ jsx27("path", { d: "M16 17H8" })
2813
2907
  ] }),
2814
- document: /* @__PURE__ */ jsxs25(Fragment14, { children: [
2815
- /* @__PURE__ */ jsx26("path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z" }),
2816
- /* @__PURE__ */ jsx26("path", { d: "M14 2v4a2 2 0 0 0 2 2h4" }),
2817
- /* @__PURE__ */ jsx26("path", { d: "M12 18v-6" }),
2818
- /* @__PURE__ */ jsx26("path", { d: "m9 15 3 3 3-3" })
2908
+ document: /* @__PURE__ */ jsxs26(Fragment15, { children: [
2909
+ /* @__PURE__ */ jsx27("path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z" }),
2910
+ /* @__PURE__ */ jsx27("path", { d: "M14 2v4a2 2 0 0 0 2 2h4" }),
2911
+ /* @__PURE__ */ jsx27("path", { d: "M12 18v-6" }),
2912
+ /* @__PURE__ */ jsx27("path", { d: "m9 15 3 3 3-3" })
2819
2913
  ] }),
2820
- judge: /* @__PURE__ */ jsxs25(Fragment14, { children: [
2821
- /* @__PURE__ */ jsx26("path", { d: "m16 16 3-8 3 8c-.87.65-1.92 1-3 1s-2.13-.35-3-1Z" }),
2822
- /* @__PURE__ */ jsx26("path", { d: "m2 16 3-8 3 8c-.87.65-1.92 1-3 1s-2.13-.35-3-1Z" }),
2823
- /* @__PURE__ */ jsx26("path", { d: "M7 21h10" }),
2824
- /* @__PURE__ */ jsx26("path", { d: "M12 3v18" }),
2825
- /* @__PURE__ */ jsx26("path", { d: "M3 7h2c2 0 5-1 7-2 2 1 5 2 7 2h2" })
2914
+ judge: /* @__PURE__ */ jsxs26(Fragment15, { children: [
2915
+ /* @__PURE__ */ jsx27("path", { d: "m16 16 3-8 3 8c-.87.65-1.92 1-3 1s-2.13-.35-3-1Z" }),
2916
+ /* @__PURE__ */ jsx27("path", { d: "m2 16 3-8 3 8c-.87.65-1.92 1-3 1s-2.13-.35-3-1Z" }),
2917
+ /* @__PURE__ */ jsx27("path", { d: "M7 21h10" }),
2918
+ /* @__PURE__ */ jsx27("path", { d: "M12 3v18" }),
2919
+ /* @__PURE__ */ jsx27("path", { d: "M3 7h2c2 0 5-1 7-2 2 1 5 2 7 2h2" })
2826
2920
  ] }),
2827
- planned: /* @__PURE__ */ jsx26("circle", { cx: "12", cy: "12", r: "9", strokeDasharray: "3 3" }),
2828
- steps: /* @__PURE__ */ jsxs25(Fragment14, { children: [
2829
- /* @__PURE__ */ jsx26("path", { d: "m12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83Z" }),
2830
- /* @__PURE__ */ jsx26("path", { d: "m22 17.65-9.17 4.16a2 2 0 0 1-1.66 0L2 17.65" }),
2831
- /* @__PURE__ */ jsx26("path", { d: "m22 12.65-9.17 4.16a2 2 0 0 1-1.66 0L2 12.65" })
2921
+ planned: /* @__PURE__ */ jsx27("circle", { cx: "12", cy: "12", r: "9", strokeDasharray: "3 3" }),
2922
+ steps: /* @__PURE__ */ jsxs26(Fragment15, { children: [
2923
+ /* @__PURE__ */ jsx27("path", { d: "m12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83Z" }),
2924
+ /* @__PURE__ */ jsx27("path", { d: "m22 17.65-9.17 4.16a2 2 0 0 1-1.66 0L2 17.65" }),
2925
+ /* @__PURE__ */ jsx27("path", { d: "m22 12.65-9.17 4.16a2 2 0 0 1-1.66 0L2 12.65" })
2832
2926
  ] }),
2833
- parallel: /* @__PURE__ */ jsxs25(Fragment14, { children: [
2834
- /* @__PURE__ */ jsx26("path", { d: "M16 3h5v5" }),
2835
- /* @__PURE__ */ jsx26("path", { d: "M8 3H3v5" }),
2836
- /* @__PURE__ */ jsx26("path", { d: "M12 22v-8.3a4 4 0 0 0-1.17-2.87L3 3" }),
2837
- /* @__PURE__ */ jsx26("path", { d: "m15 9 6-6" })
2927
+ parallel: /* @__PURE__ */ jsxs26(Fragment15, { children: [
2928
+ /* @__PURE__ */ jsx27("path", { d: "M16 3h5v5" }),
2929
+ /* @__PURE__ */ jsx27("path", { d: "M8 3H3v5" }),
2930
+ /* @__PURE__ */ jsx27("path", { d: "M12 22v-8.3a4 4 0 0 0-1.17-2.87L3 3" }),
2931
+ /* @__PURE__ */ jsx27("path", { d: "m15 9 6-6" })
2838
2932
  ] }),
2839
- decision: /* @__PURE__ */ jsx26("path", { d: "M12 2 22 12 12 22 2 12Z" }),
2840
- repeat: /* @__PURE__ */ jsxs25(Fragment14, { children: [
2841
- /* @__PURE__ */ jsx26("path", { d: "m17 2 4 4-4 4" }),
2842
- /* @__PURE__ */ jsx26("path", { d: "M3 11v-1a4 4 0 0 1 4-4h14" }),
2843
- /* @__PURE__ */ jsx26("path", { d: "m7 22-4-4 4-4" }),
2844
- /* @__PURE__ */ jsx26("path", { d: "M21 13v1a4 4 0 0 1-4 4H3" })
2933
+ decision: /* @__PURE__ */ jsx27("path", { d: "M12 2 22 12 12 22 2 12Z" }),
2934
+ repeat: /* @__PURE__ */ jsxs26(Fragment15, { children: [
2935
+ /* @__PURE__ */ jsx27("path", { d: "m17 2 4 4-4 4" }),
2936
+ /* @__PURE__ */ jsx27("path", { d: "M3 11v-1a4 4 0 0 1 4-4h14" }),
2937
+ /* @__PURE__ */ jsx27("path", { d: "m7 22-4-4 4-4" }),
2938
+ /* @__PURE__ */ jsx27("path", { d: "M21 13v1a4 4 0 0 1-4 4H3" })
2845
2939
  ] }),
2846
- pick: /* @__PURE__ */ jsxs25(Fragment14, { children: [
2847
- /* @__PURE__ */ jsx26("polyline", { points: "15 10 20 15 15 20" }),
2848
- /* @__PURE__ */ jsx26("path", { d: "M4 4v7a4 4 0 0 0 4 4h12" })
2940
+ pick: /* @__PURE__ */ jsxs26(Fragment15, { children: [
2941
+ /* @__PURE__ */ jsx27("polyline", { points: "15 10 20 15 15 20" }),
2942
+ /* @__PURE__ */ jsx27("path", { d: "M4 4v7a4 4 0 0 0 4 4h12" })
2849
2943
  ] })
2850
2944
  };
2851
- var EXPAND_ICON2 = /* @__PURE__ */ jsxs25(Icon, { size: 12, children: [
2852
- /* @__PURE__ */ jsx26("polyline", { points: "15 3 21 3 21 9" }),
2853
- /* @__PURE__ */ jsx26("polyline", { points: "9 21 3 21 3 15" }),
2854
- /* @__PURE__ */ jsx26("line", { x1: "21", y1: "3", x2: "14", y2: "10" }),
2855
- /* @__PURE__ */ jsx26("line", { x1: "3", y1: "21", x2: "10", y2: "14" })
2945
+ var EXPAND_ICON2 = /* @__PURE__ */ jsxs26(Icon, { size: 12, children: [
2946
+ /* @__PURE__ */ jsx27("polyline", { points: "15 3 21 3 21 9" }),
2947
+ /* @__PURE__ */ jsx27("polyline", { points: "9 21 3 21 3 15" }),
2948
+ /* @__PURE__ */ jsx27("line", { x1: "21", y1: "3", x2: "14", y2: "10" }),
2949
+ /* @__PURE__ */ jsx27("line", { x1: "3", y1: "21", x2: "10", y2: "14" })
2856
2950
  ] });
2857
- var COLLAPSE_ICON2 = /* @__PURE__ */ jsxs25(Icon, { size: 12, children: [
2858
- /* @__PURE__ */ jsx26("polyline", { points: "4 14 10 14 10 20" }),
2859
- /* @__PURE__ */ jsx26("polyline", { points: "20 10 14 10 14 4" }),
2860
- /* @__PURE__ */ jsx26("line", { x1: "14", y1: "10", x2: "21", y2: "3" }),
2861
- /* @__PURE__ */ jsx26("line", { x1: "3", y1: "21", x2: "10", y2: "14" })
2951
+ var COLLAPSE_ICON2 = /* @__PURE__ */ jsxs26(Icon, { size: 12, children: [
2952
+ /* @__PURE__ */ jsx27("polyline", { points: "4 14 10 14 10 20" }),
2953
+ /* @__PURE__ */ jsx27("polyline", { points: "20 10 14 10 14 4" }),
2954
+ /* @__PURE__ */ jsx27("line", { x1: "14", y1: "10", x2: "21", y2: "3" }),
2955
+ /* @__PURE__ */ jsx27("line", { x1: "3", y1: "21", x2: "10", y2: "14" })
2862
2956
  ] });
2863
2957
  var STATUS_LABELS = {
2864
2958
  succeeded: "Done",
@@ -2869,25 +2963,25 @@ var STATUS_LABELS = {
2869
2963
  canceled: "Canceled"
2870
2964
  };
2871
2965
  var STATUS_ICONS = {
2872
- succeeded: /* @__PURE__ */ jsx26("polyline", { points: "20 6 9 17 4 12" }),
2873
- failed: /* @__PURE__ */ jsxs25(Fragment14, { children: [
2874
- /* @__PURE__ */ jsx26("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
2875
- /* @__PURE__ */ jsx26("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
2966
+ succeeded: /* @__PURE__ */ jsx27("polyline", { points: "20 6 9 17 4 12" }),
2967
+ failed: /* @__PURE__ */ jsxs26(Fragment15, { children: [
2968
+ /* @__PURE__ */ jsx27("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
2969
+ /* @__PURE__ */ jsx27("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
2876
2970
  ] }),
2877
- running: /* @__PURE__ */ jsx26("path", { d: "M21 12a9 9 0 1 1-6.22-8.56" }),
2878
- scheduled: /* @__PURE__ */ jsx26("circle", { cx: "12", cy: "12", r: "8" }),
2879
- skipped: /* @__PURE__ */ jsx26("line", { x1: "5", y1: "12", x2: "19", y2: "12" }),
2880
- canceled: /* @__PURE__ */ jsx26("line", { x1: "5", y1: "12", x2: "19", y2: "12" })
2971
+ running: /* @__PURE__ */ jsx27("path", { d: "M21 12a9 9 0 1 1-6.22-8.56" }),
2972
+ scheduled: /* @__PURE__ */ jsx27("circle", { cx: "12", cy: "12", r: "8" }),
2973
+ skipped: /* @__PURE__ */ jsx27("line", { x1: "5", y1: "12", x2: "19", y2: "12" }),
2974
+ canceled: /* @__PURE__ */ jsx27("line", { x1: "5", y1: "12", x2: "19", y2: "12" })
2881
2975
  };
2882
2976
  function StatusMark({ status, graphMode }) {
2883
2977
  if (graphMode === "static") return null;
2884
- return /* @__PURE__ */ jsx26(
2978
+ return /* @__PURE__ */ jsx27(
2885
2979
  "span",
2886
2980
  {
2887
2981
  className: `simple-status simple-status--${status}`,
2888
2982
  title: STATUS_LABELS[status],
2889
2983
  "aria-label": STATUS_LABELS[status],
2890
- children: /* @__PURE__ */ jsx26(Icon, { size: 11, children: STATUS_ICONS[status] })
2984
+ children: /* @__PURE__ */ jsx27(Icon, { size: 11, children: STATUS_ICONS[status] })
2891
2985
  }
2892
2986
  );
2893
2987
  }
@@ -2896,17 +2990,17 @@ function Handles({
2896
2990
  targetPosition = Position2.Left,
2897
2991
  children
2898
2992
  }) {
2899
- return /* @__PURE__ */ jsxs25(Fragment14, { children: [
2900
- /* @__PURE__ */ jsx26(Handle2, { type: "target", position: targetPosition, className: "simple-handle" }),
2993
+ return /* @__PURE__ */ jsxs26(Fragment15, { children: [
2994
+ /* @__PURE__ */ jsx27(Handle2, { type: "target", position: targetPosition, className: "simple-handle" }),
2901
2995
  children,
2902
- /* @__PURE__ */ jsx26(Handle2, { type: "source", position: sourcePosition, className: "simple-handle" })
2996
+ /* @__PURE__ */ jsx27(Handle2, { type: "source", position: sourcePosition, className: "simple-handle" })
2903
2997
  ] });
2904
2998
  }
2905
2999
  function ValidationMark({
2906
3000
  validation,
2907
3001
  onClick
2908
3002
  }) {
2909
- return validation ? /* @__PURE__ */ jsx26(NodeValidationBadge, { validation, onClick }) : null;
3003
+ return validation ? /* @__PURE__ */ jsx27(NodeValidationBadge, { validation, onClick }) : null;
2910
3004
  }
2911
3005
  function payloadOf(data, kinds) {
2912
3006
  const simple = data.simple;
@@ -2917,25 +3011,37 @@ function SimpleStepNode({ data, sourcePosition, targetPosition }) {
2917
3011
  const step = payloadOf(data, ["step"]);
2918
3012
  if (!step) return null;
2919
3013
  const statusClass = step.graphMode !== "static" ? ` simple-step--${step.status}` : "";
2920
- return /* @__PURE__ */ jsx26(Handles, { sourcePosition, targetPosition, children: /* @__PURE__ */ jsxs25(
3014
+ return /* @__PURE__ */ jsx27(Handles, { sourcePosition, targetPosition, children: /* @__PURE__ */ jsxs26(
2921
3015
  "div",
2922
3016
  {
2923
3017
  className: `simple-step simple-step--${step.category}${statusClass}${validationRingClass(data.validation)}`,
2924
3018
  children: [
2925
- /* @__PURE__ */ jsxs25("div", { className: "simple-step-header", children: [
2926
- /* @__PURE__ */ jsxs25("span", { className: "simple-step-category", children: [
2927
- /* @__PURE__ */ jsx26(Icon, { children: CATEGORY_ICONS[step.category] }),
3019
+ /* @__PURE__ */ jsxs26("div", { className: "simple-step-header", children: [
3020
+ /* @__PURE__ */ jsxs26("span", { className: "simple-step-category", children: [
3021
+ /* @__PURE__ */ jsx27(Icon, { children: CATEGORY_ICONS[step.category] }),
2928
3022
  STEP_CATEGORY_WORDS[step.category]
2929
3023
  ] }),
2930
- /* @__PURE__ */ jsx26(StatusMark, { status: step.status, graphMode: step.graphMode }),
2931
- /* @__PURE__ */ jsx26(ValidationMark, { validation: data.validation, onClick: data.onValidationBadgeClick })
3024
+ /* @__PURE__ */ jsx27(StatusMark, { status: step.status, graphMode: step.graphMode }),
3025
+ /* @__PURE__ */ jsx27(ValidationMark, { validation: data.validation, onClick: data.onValidationBadgeClick })
2932
3026
  ] }),
2933
- /* @__PURE__ */ jsx26("div", { className: "simple-step-title", title: step.title, children: step.title }),
2934
- step.forEach && /* @__PURE__ */ jsxs25("span", { className: "simple-step-foreach", children: [
2935
- /* @__PURE__ */ jsx26(Icon, { size: 11, children: CATEGORY_ICONS.repeat }),
3027
+ /* @__PURE__ */ jsx27(
3028
+ "div",
3029
+ {
3030
+ className: "simple-step-title",
3031
+ title: step.title,
3032
+ style: {
3033
+ fontSize: step.titleFit.fontPx,
3034
+ lineHeight: `${step.titleFit.lineHeightPx}px`,
3035
+ WebkitLineClamp: step.titleFit.maxLines
3036
+ },
3037
+ children: step.title
3038
+ }
3039
+ ),
3040
+ step.forEach && /* @__PURE__ */ jsxs26("span", { className: "simple-step-foreach", children: [
3041
+ /* @__PURE__ */ jsx27(Icon, { size: 11, children: CATEGORY_ICONS.repeat }),
2936
3042
  step.forEach
2937
3043
  ] }),
2938
- step.innerStepCount !== void 0 && /* @__PURE__ */ jsxs25(
3044
+ step.innerStepCount !== void 0 && /* @__PURE__ */ jsxs26(
2939
3045
  "button",
2940
3046
  {
2941
3047
  type: "button",
@@ -2959,24 +3065,24 @@ function SimpleStepNode({ data, sourcePosition, targetPosition }) {
2959
3065
  }
2960
3066
  var DOCUMENT_PATH = "M1 1 H99 V84 C80 98 62 74 44 86 C28 96 14 96 1 88 Z";
2961
3067
  function DocumentShape({ className }) {
2962
- return /* @__PURE__ */ jsx26("svg", { className, viewBox: "0 0 100 100", preserveAspectRatio: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx26("path", { d: DOCUMENT_PATH, vectorEffect: "non-scaling-stroke" }) });
3068
+ return /* @__PURE__ */ jsx27("svg", { className, viewBox: "0 0 100 100", preserveAspectRatio: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx27("path", { d: DOCUMENT_PATH, vectorEffect: "non-scaling-stroke" }) });
2963
3069
  }
2964
3070
  function SimpleTerminalNode({ data, sourcePosition, targetPosition }) {
2965
3071
  const terminal = payloadOf(data, ["input", "output"]);
2966
3072
  if (!terminal) return null;
2967
- return /* @__PURE__ */ jsx26(Handles, { sourcePosition, targetPosition, children: /* @__PURE__ */ jsxs25(
3073
+ return /* @__PURE__ */ jsx27(Handles, { sourcePosition, targetPosition, children: /* @__PURE__ */ jsxs26(
2968
3074
  "div",
2969
3075
  {
2970
3076
  className: `simple-terminal simple-terminal--${terminal.kind}${terminal.isList ? " simple-terminal--list" : ""}`,
2971
3077
  children: [
2972
- terminal.isList && /* @__PURE__ */ jsxs25(Fragment14, { children: [
2973
- /* @__PURE__ */ jsx26(DocumentShape, { className: "simple-terminal-shape simple-terminal-shape--back2" }),
2974
- /* @__PURE__ */ jsx26(DocumentShape, { className: "simple-terminal-shape simple-terminal-shape--back1" })
3078
+ terminal.isList && /* @__PURE__ */ jsxs26(Fragment15, { children: [
3079
+ /* @__PURE__ */ jsx27(DocumentShape, { className: "simple-terminal-shape simple-terminal-shape--back2" }),
3080
+ /* @__PURE__ */ jsx27(DocumentShape, { className: "simple-terminal-shape simple-terminal-shape--back1" })
2975
3081
  ] }),
2976
- /* @__PURE__ */ jsx26(DocumentShape, { className: "simple-terminal-shape" }),
2977
- /* @__PURE__ */ jsxs25("div", { className: "simple-terminal-text", children: [
2978
- /* @__PURE__ */ jsx26("span", { className: "simple-terminal-title", title: terminal.title, children: terminal.title }),
2979
- terminal.subtitle && /* @__PURE__ */ jsx26("span", { className: "simple-terminal-subtitle", children: terminal.subtitle })
3082
+ /* @__PURE__ */ jsx27(DocumentShape, { className: "simple-terminal-shape" }),
3083
+ /* @__PURE__ */ jsxs26("div", { className: "simple-terminal-text", children: [
3084
+ /* @__PURE__ */ jsx27("span", { className: "simple-terminal-title", title: terminal.title, children: terminal.title }),
3085
+ terminal.subtitle && /* @__PURE__ */ jsx27("span", { className: "simple-terminal-subtitle", children: terminal.subtitle })
2980
3086
  ] })
2981
3087
  ]
2982
3088
  }
@@ -2986,35 +3092,35 @@ function SimpleDecisionNode({ data, sourcePosition, targetPosition }) {
2986
3092
  const decision = payloadOf(data, ["decision"]);
2987
3093
  if (!decision) return null;
2988
3094
  const statusClass = decision.graphMode !== "static" ? ` simple-decision--${decision.status}` : "";
2989
- return /* @__PURE__ */ jsx26(Handles, { sourcePosition, targetPosition, children: /* @__PURE__ */ jsxs25("div", { className: `simple-decision${statusClass}${validationRingClass(data.validation)}`, children: [
2990
- /* @__PURE__ */ jsx26(
3095
+ return /* @__PURE__ */ jsx27(Handles, { sourcePosition, targetPosition, children: /* @__PURE__ */ jsxs26("div", { className: `simple-decision${statusClass}${validationRingClass(data.validation)}`, children: [
3096
+ /* @__PURE__ */ jsx27(
2991
3097
  "svg",
2992
3098
  {
2993
3099
  className: "simple-decision-shape",
2994
3100
  viewBox: "0 0 100 100",
2995
3101
  preserveAspectRatio: "none",
2996
3102
  "aria-hidden": "true",
2997
- children: /* @__PURE__ */ jsx26("path", { d: "M50 1 L99 50 L50 99 L1 50 Z", vectorEffect: "non-scaling-stroke" })
3103
+ children: /* @__PURE__ */ jsx27("path", { d: "M50 1 L99 50 L50 99 L1 50 Z", vectorEffect: "non-scaling-stroke" })
2998
3104
  }
2999
3105
  ),
3000
- /* @__PURE__ */ jsx26("div", { className: "simple-decision-text", title: decision.title, children: decision.title }),
3001
- /* @__PURE__ */ jsxs25("div", { className: "simple-decision-marks", children: [
3002
- /* @__PURE__ */ jsx26(StatusMark, { status: decision.status, graphMode: decision.graphMode }),
3003
- /* @__PURE__ */ jsx26(ValidationMark, { validation: data.validation, onClick: data.onValidationBadgeClick })
3106
+ /* @__PURE__ */ jsx27("div", { className: "simple-decision-text", title: decision.title, children: decision.title }),
3107
+ /* @__PURE__ */ jsxs26("div", { className: "simple-decision-marks", children: [
3108
+ /* @__PURE__ */ jsx27(StatusMark, { status: decision.status, graphMode: decision.graphMode }),
3109
+ /* @__PURE__ */ jsx27(ValidationMark, { validation: data.validation, onClick: data.onValidationBadgeClick })
3004
3110
  ] })
3005
3111
  ] }) });
3006
3112
  }
3007
3113
  function SimpleFrameNode({ data }) {
3008
3114
  const frame = payloadOf(data, ["frame"]);
3009
3115
  if (!frame) return null;
3010
- return /* @__PURE__ */ jsx26("div", { className: `simple-frame${validationRingClass(data.validation)}`, children: /* @__PURE__ */ jsxs25("div", { className: "simple-frame-header", children: [
3011
- /* @__PURE__ */ jsxs25("span", { className: "simple-frame-title", children: [
3012
- /* @__PURE__ */ jsx26(Icon, { size: 12, children: CATEGORY_ICONS.repeat }),
3116
+ return /* @__PURE__ */ jsx27("div", { className: `simple-frame${validationRingClass(data.validation)}`, children: /* @__PURE__ */ jsxs26("div", { className: "simple-frame-header", children: [
3117
+ /* @__PURE__ */ jsxs26("span", { className: "simple-frame-title", children: [
3118
+ /* @__PURE__ */ jsx27(Icon, { size: 12, children: CATEGORY_ICONS.repeat }),
3013
3119
  frame.title
3014
3120
  ] }),
3015
- /* @__PURE__ */ jsx26(StatusMark, { status: frame.status, graphMode: frame.graphMode }),
3016
- /* @__PURE__ */ jsx26(ValidationMark, { validation: data.validation, onClick: data.onValidationBadgeClick }),
3017
- frame.onFold && /* @__PURE__ */ jsx26(
3121
+ /* @__PURE__ */ jsx27(StatusMark, { status: frame.status, graphMode: frame.graphMode }),
3122
+ /* @__PURE__ */ jsx27(ValidationMark, { validation: data.validation, onClick: data.onValidationBadgeClick }),
3123
+ frame.onFold && /* @__PURE__ */ jsx27(
3018
3124
  "button",
3019
3125
  {
3020
3126
  type: "button",
@@ -3040,7 +3146,7 @@ var simpleNodeTypes = {
3040
3146
 
3041
3147
  // src/graph/react/edges/RoutedEdge.tsx
3042
3148
  import { BaseEdge, getSmoothStepPath } from "@xyflow/react";
3043
- import { jsx as jsx27 } from "react/jsx-runtime";
3149
+ import { jsx as jsx28 } from "react/jsx-runtime";
3044
3150
  function RoutedEdge({
3045
3151
  id,
3046
3152
  sourceX,
@@ -3080,7 +3186,7 @@ function RoutedEdge({
3080
3186
  borderRadius: 8
3081
3187
  });
3082
3188
  }
3083
- return /* @__PURE__ */ jsx27(
3189
+ return /* @__PURE__ */ jsx28(
3084
3190
  BaseEdge,
3085
3191
  {
3086
3192
  id,
@@ -3102,7 +3208,7 @@ function RoutedEdge({
3102
3208
  }
3103
3209
 
3104
3210
  // src/graph/react/viewer/GraphViewer.tsx
3105
- import { Fragment as Fragment15, jsx as jsx28, jsxs as jsxs26 } from "react/jsx-runtime";
3211
+ import { Fragment as Fragment16, jsx as jsx29, jsxs as jsxs27 } from "react/jsx-runtime";
3106
3212
  var nodeTypes = __spreadValues(__spreadProps(__spreadValues({}, controllerNodeTypes), {
3107
3213
  pipeCard: PipeCardRFNode
3108
3214
  }), simpleNodeTypes);
@@ -3124,7 +3230,7 @@ function StuffNodeDetail({
3124
3230
  const conceptInfo = stuffData.concept && graphspec ? resolveConceptRef(graphspec, stuffData.concept) : void 0;
3125
3231
  const isDryRun = graphSpecMode(graphspec) === GRAPH_SPEC_MODE.DRY;
3126
3232
  const descriptors = resultDescriptors(artifacts);
3127
- const renderData = descriptors ? () => /* @__PURE__ */ jsx28(
3233
+ const renderData = descriptors ? () => /* @__PURE__ */ jsx29(
3128
3234
  StuffResultPanel,
3129
3235
  __spreadProps(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadProps(__spreadValues({}, descriptors), {
3130
3236
  stuff: stuffData
@@ -3133,7 +3239,7 @@ function StuffNodeDetail({
3133
3239
  })
3134
3240
  ) : void 0;
3135
3241
  if (conceptInfo) {
3136
- return /* @__PURE__ */ jsx28(
3242
+ return /* @__PURE__ */ jsx29(
3137
3243
  ConceptDetailPanel,
3138
3244
  {
3139
3245
  concept: conceptInfo,
@@ -3144,8 +3250,8 @@ function StuffNodeDetail({
3144
3250
  }
3145
3251
  );
3146
3252
  }
3147
- if (isDryRun) return /* @__PURE__ */ jsx28("div", { className: "detail-not-available", children: "Dry run data hidden" });
3148
- return /* @__PURE__ */ jsx28(Fragment15, { children: (_a = renderData == null ? void 0 : renderData()) != null ? _a : /* @__PURE__ */ jsx28("div", { className: "detail-not-available", children: "No data" }) });
3253
+ if (isDryRun) return /* @__PURE__ */ jsx29("div", { className: "detail-not-available", children: "Dry run data hidden" });
3254
+ return /* @__PURE__ */ jsx29(Fragment16, { children: (_a = renderData == null ? void 0 : renderData()) != null ? _a : /* @__PURE__ */ jsx29("div", { className: "detail-not-available", children: "No data" }) });
3149
3255
  }
3150
3256
  function seedFoldedControllers(mode, controllerIds) {
3151
3257
  if (mode === FOLD_MODE.FOLDED) return new Set(controllerIds);
@@ -3858,13 +3964,13 @@ function GraphViewer(props) {
3858
3964
  };
3859
3965
  }, [foldControlsAvailable, allControllerIds, foldedControllers, markReaderFolds]);
3860
3966
  const styleMenuOptions = React12.useMemo(() => resolveStyleMenu(styleMenu), [styleMenu]);
3861
- return /* @__PURE__ */ jsxs26(
3967
+ return /* @__PURE__ */ jsxs27(
3862
3968
  "div",
3863
3969
  {
3864
3970
  ref: containerRef,
3865
3971
  className: `react-flow-container react-flow-container--theme-${resolvedTheme} react-flow-container--mode-${mode}`,
3866
3972
  children: [
3867
- /* @__PURE__ */ jsxs26(
3973
+ /* @__PURE__ */ jsxs27(
3868
3974
  ReactFlow,
3869
3975
  {
3870
3976
  nodes,
@@ -3884,7 +3990,7 @@ function GraphViewer(props) {
3884
3990
  proOptions: { hideAttribution: true },
3885
3991
  panActivationKeyCode: null,
3886
3992
  children: [
3887
- /* @__PURE__ */ jsx28(
3993
+ /* @__PURE__ */ jsx29(
3888
3994
  Background,
3889
3995
  {
3890
3996
  variant: BackgroundVariant.Dots,
@@ -3893,7 +3999,7 @@ function GraphViewer(props) {
3893
3999
  color: "var(--color-bg-dots)"
3894
4000
  }
3895
4001
  ),
3896
- !hideToolbar && /* @__PURE__ */ jsx28(
4002
+ !hideToolbar && /* @__PURE__ */ jsx29(
3897
4003
  GraphToolbar,
3898
4004
  {
3899
4005
  direction,
@@ -3933,7 +4039,7 @@ function GraphViewer(props) {
3933
4039
  ]
3934
4040
  }
3935
4041
  ),
3936
- /* @__PURE__ */ jsxs26(
4042
+ /* @__PURE__ */ jsxs27(
3937
4043
  DetailPanel,
3938
4044
  {
3939
4045
  isOpen: detailOpen,
@@ -3942,14 +4048,14 @@ function GraphViewer(props) {
3942
4048
  isDragging: isPanelDragging,
3943
4049
  onResizeHandleMouseDown: onResizeMouseDown,
3944
4050
  children: [
3945
- conceptOverride ? /* @__PURE__ */ jsx28(ConceptDetailPanel, { concept: conceptOverride }) : selectedSpecNode && graphspec ? /* @__PURE__ */ jsx28(
4051
+ conceptOverride ? /* @__PURE__ */ jsx29(ConceptDetailPanel, { concept: conceptOverride }) : selectedSpecNode && graphspec ? /* @__PURE__ */ jsx29(
3946
4052
  PipeDetailPanel,
3947
4053
  {
3948
4054
  node: selectedSpecNode,
3949
4055
  spec: graphspec,
3950
4056
  onConceptClick: handleConceptClick
3951
4057
  }
3952
- ) : (detailSelection == null ? void 0 : detailSelection.stuffData) ? /* @__PURE__ */ jsx28(
4058
+ ) : (detailSelection == null ? void 0 : detailSelection.stuffData) ? /* @__PURE__ */ jsx29(
3953
4059
  StuffNodeDetail,
3954
4060
  {
3955
4061
  nodeId: detailSelection.nodeId,