@pipelex/mthds-ui 0.28.0 → 0.29.1

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.
@@ -14,15 +14,16 @@ import {
14
14
  resolveConceptRef,
15
15
  resolveIssueTargetNodeId,
16
16
  validateGraphSpec
17
- } from "../../chunk-I7Z5TTQI.js";
17
+ } from "../../chunk-ZTXSDTVF.js";
18
18
  import {
19
19
  parsePipeRef
20
20
  } from "../../chunk-2N65P32H.js";
21
21
  import {
22
22
  DEFAULT_GRAPH_CONFIG,
23
23
  getPaletteForTheme
24
- } from "../../chunk-7WJYQHYF.js";
24
+ } from "../../chunk-Y46574OW.js";
25
25
  import {
26
+ BINDING_STEP_TYPE,
26
27
  EDGE_TYPE,
27
28
  FOLD_MODE,
28
29
  GRAPH_DIRECTION,
@@ -32,6 +33,8 @@ import {
32
33
  TOOLBAR_POSITION,
33
34
  VALIDATION_STATE,
34
35
  graphSpecMode,
36
+ isBindingNode,
37
+ isBindingStepSpec,
35
38
  isDryGraphSpec,
36
39
  isPluralMultiplicity,
37
40
  isStaticGraphSpec,
@@ -39,7 +42,7 @@ import {
39
42
  stuffDigestFromId,
40
43
  toolbarOrientation,
41
44
  toolbarSide
42
- } from "../../chunk-AE7AA5XC.js";
45
+ } from "../../chunk-3I3ZPYMW.js";
43
46
  import {
44
47
  __spreadProps,
45
48
  __spreadValues
@@ -1012,7 +1015,13 @@ function PipeSequenceSection({
1012
1015
  /* @__PURE__ */ jsx12("div", { className: "detail-section-label", children: "Steps" }),
1013
1016
  /* @__PURE__ */ jsx12("div", { className: "detail-steps-list", children: blueprint.sequential_sub_pipes.map((step, idx) => /* @__PURE__ */ jsxs12("div", { className: "detail-step-item", children: [
1014
1017
  /* @__PURE__ */ jsx12("span", { className: "detail-step-index", children: idx + 1 }),
1015
- /* @__PURE__ */ jsx12("span", { className: "detail-step-code", children: step.pipe_code }),
1018
+ isBindingStepSpec(step) ? (
1019
+ // A binding step runs no pipe: it names the path it binds.
1020
+ /* @__PURE__ */ jsxs12("span", { className: "detail-step-code", title: "Binding step", children: [
1021
+ "from ",
1022
+ step.from_path
1023
+ ] })
1024
+ ) : /* @__PURE__ */ jsx12("span", { className: "detail-step-code", children: step.pipe_code }),
1016
1025
  step.output_name && /* @__PURE__ */ jsxs12("span", { className: "detail-io-concept", children: [
1017
1026
  "-> ",
1018
1027
  step.output_name
@@ -1057,6 +1066,20 @@ function PipeBatchSection({
1057
1066
  ] });
1058
1067
  }
1059
1068
 
1069
+ // src/graph/react/detail/sections/BindingStepDetail.tsx
1070
+ import { jsx as jsx15, jsxs as jsxs15 } from "react/jsx-runtime";
1071
+ function BindingStepSection({ node }) {
1072
+ var _a, _b;
1073
+ const executionData = (_a = node.execution_data) != null ? _a : {};
1074
+ const fromPath = typeof executionData.from === "string" ? executionData.from : node.pipe_code;
1075
+ const result = typeof executionData.result === "string" ? executionData.result : (_b = node.io.outputs[0]) == null ? void 0 : _b.name;
1076
+ return /* @__PURE__ */ jsxs15("div", { children: [
1077
+ /* @__PURE__ */ jsx15("div", { className: "detail-section-label", children: "Binding" }),
1078
+ /* @__PURE__ */ jsx15(KV, { label: "From", value: fromPath }),
1079
+ /* @__PURE__ */ jsx15(KV, { label: "Result", value: result })
1080
+ ] });
1081
+ }
1082
+
1060
1083
  // src/graph/react/detail/sections/executionData.ts
1061
1084
  var MERGED_EXECUTION_DATA_TYPES = /* @__PURE__ */ new Set([
1062
1085
  "PipeLLM",
@@ -1076,7 +1099,7 @@ function shouldDumpExecutionData(pipeType, hasBlueprint) {
1076
1099
  }
1077
1100
 
1078
1101
  // src/graph/react/detail/PipeDetailPanel.tsx
1079
- import { Fragment as Fragment10, jsx as jsx15, jsxs as jsxs15 } from "react/jsx-runtime";
1102
+ import { Fragment as Fragment10, jsx as jsx16, jsxs as jsxs16 } from "react/jsx-runtime";
1080
1103
  var PIPE_TYPE_BADGES = {
1081
1104
  PipeLLM: "LLM",
1082
1105
  PipeExtract: "Extract",
@@ -1085,11 +1108,14 @@ var PIPE_TYPE_BADGES = {
1085
1108
  PipeSearch: "Search",
1086
1109
  PipeFunc: "Func",
1087
1110
  PipeStructure: "Structure",
1111
+ PipeJudge: "Judge",
1112
+ PipeDocGen: "DocGen",
1088
1113
  PipeSignature: "Signature",
1089
1114
  PipeSequence: "Seq",
1090
1115
  PipeParallel: "Par",
1091
1116
  PipeCondition: "Cond",
1092
- PipeBatch: "Batch"
1117
+ PipeBatch: "Batch",
1118
+ BindingStep: "Binding"
1093
1119
  };
1094
1120
  var CONTROLLER_TYPES = /* @__PURE__ */ new Set([
1095
1121
  "PipeSequence",
@@ -1109,6 +1135,7 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1109
1135
  var _a, _b, _c, _d, _e, _f, _g, _h;
1110
1136
  const pipeType = node.pipe_type;
1111
1137
  const isController = CONTROLLER_TYPES.has(pipeType);
1138
+ const isBinding = isBindingNode(node);
1112
1139
  const isStatic = isStaticGraphSpec(spec);
1113
1140
  const showsGeneratedData = !isStatic && !isDryGraphSpec(spec);
1114
1141
  const badge = PIPE_TYPE_BADGES[pipeType];
@@ -1116,7 +1143,7 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1116
1143
  const statusColor = (_a = STATUS_COLORS[status]) != null ? _a : "#6272a4";
1117
1144
  const blueprint = React6.useMemo(() => {
1118
1145
  var _a2, _b2;
1119
- if (!node.pipe_code || !spec.pipe_registry) return void 0;
1146
+ if (isBinding || !node.pipe_code || !spec.pipe_registry) return void 0;
1120
1147
  const directKey = `${(_b2 = (_a2 = spec.pipeline_ref) == null ? void 0 : _a2.domain) != null ? _b2 : ""}.${node.pipe_code}`;
1121
1148
  const direct = getPipeBlueprint(spec, directKey);
1122
1149
  if (direct) return direct;
@@ -1124,22 +1151,22 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1124
1151
  if (ref.endsWith(`.${node.pipe_code}`)) return pipe;
1125
1152
  }
1126
1153
  return void 0;
1127
- }, [node.pipe_code, spec]);
1154
+ }, [isBinding, node.pipe_code, spec]);
1128
1155
  const [usageExpanded, setUsageExpanded] = React6.useState(false);
1129
1156
  const inputs = (_c = (_b = node.io) == null ? void 0 : _b.inputs) != null ? _c : [];
1130
1157
  const outputs = (_e = (_d = node.io) == null ? void 0 : _d.outputs) != null ? _e : [];
1131
1158
  const description = (_f = blueprint == null ? void 0 : blueprint.description) != null ? _f : node.description;
1132
- return /* @__PURE__ */ jsxs15(Fragment10, { children: [
1133
- /* @__PURE__ */ jsxs15("div", { className: "detail-sticky-header", children: [
1134
- /* @__PURE__ */ jsxs15("div", { className: "detail-header", children: [
1135
- /* @__PURE__ */ jsx15(
1159
+ return /* @__PURE__ */ jsxs16(Fragment10, { children: [
1160
+ /* @__PURE__ */ jsxs16("div", { className: "detail-sticky-header", children: [
1161
+ /* @__PURE__ */ jsxs16("div", { className: "detail-header", children: [
1162
+ /* @__PURE__ */ jsx16(
1136
1163
  "span",
1137
1164
  {
1138
1165
  className: `detail-badge ${isController ? "detail-badge--controller" : "detail-badge--operator"}`,
1139
1166
  children: badge
1140
1167
  }
1141
1168
  ),
1142
- /* @__PURE__ */ jsx15(
1169
+ /* @__PURE__ */ jsx16(
1143
1170
  "span",
1144
1171
  {
1145
1172
  className: `detail-pipe-code ${isController ? "detail-pipe-code--controller" : ""}`,
@@ -1147,11 +1174,11 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1147
1174
  }
1148
1175
  )
1149
1176
  ] }),
1150
- !isStatic && /* @__PURE__ */ jsxs15("div", { className: "detail-status", children: [
1151
- /* @__PURE__ */ jsx15("span", { className: "detail-status-dot", style: { background: statusColor } }),
1152
- /* @__PURE__ */ jsx15("span", { className: "detail-status-label", style: { color: statusColor }, children: status }),
1153
- ((_g = node.timing) == null ? void 0 : _g.duration) != null && /* @__PURE__ */ jsx15("span", { className: "detail-duration", children: formatDuration(node.timing.duration) }),
1154
- showsGeneratedData && node.usage && /* @__PURE__ */ jsx15(
1177
+ !isStatic && /* @__PURE__ */ jsxs16("div", { className: "detail-status", children: [
1178
+ /* @__PURE__ */ jsx16("span", { className: "detail-status-dot", style: { background: statusColor } }),
1179
+ /* @__PURE__ */ jsx16("span", { className: "detail-status-label", style: { color: statusColor }, children: status }),
1180
+ ((_g = node.timing) == null ? void 0 : _g.duration) != null && /* @__PURE__ */ jsx16("span", { className: "detail-duration", children: formatDuration(node.timing.duration) }),
1181
+ showsGeneratedData && node.usage && /* @__PURE__ */ jsx16(
1155
1182
  UsageCostInline,
1156
1183
  {
1157
1184
  usage: node.usage,
@@ -1161,43 +1188,44 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1161
1188
  }
1162
1189
  )
1163
1190
  ] }),
1164
- showsGeneratedData && node.usage && usageExpanded && /* @__PURE__ */ jsx15(UsageDetails, { usage: node.usage, isController }),
1165
- description && /* @__PURE__ */ jsx15("div", { className: "detail-description", children: description }),
1166
- inputs.length > 0 && /* @__PURE__ */ jsxs15("div", { children: [
1167
- /* @__PURE__ */ jsx15("div", { className: "detail-section-label", children: "Inputs" }),
1168
- /* @__PURE__ */ jsx15("div", { className: "detail-io-list", children: inputs.map((input, idx) => /* @__PURE__ */ jsxs15(
1191
+ showsGeneratedData && node.usage && usageExpanded && /* @__PURE__ */ jsx16(UsageDetails, { usage: node.usage, isController }),
1192
+ description && /* @__PURE__ */ jsx16("div", { className: "detail-description", children: description }),
1193
+ inputs.length > 0 && /* @__PURE__ */ jsxs16("div", { children: [
1194
+ /* @__PURE__ */ jsx16("div", { className: "detail-section-label", children: "Inputs" }),
1195
+ /* @__PURE__ */ jsx16("div", { className: "detail-io-list", children: inputs.map((input, idx) => /* @__PURE__ */ jsxs16(
1169
1196
  "div",
1170
1197
  {
1171
1198
  className: "detail-io-pill",
1172
1199
  style: { cursor: input.concept && onConceptClick ? "pointer" : void 0 },
1173
1200
  onClick: () => input.concept && (onConceptClick == null ? void 0 : onConceptClick(input.concept)),
1174
1201
  children: [
1175
- /* @__PURE__ */ jsx15("span", { className: "detail-io-name", children: input.name }),
1176
- input.concept && /* @__PURE__ */ jsx15("span", { className: "detail-io-concept", children: input.concept + multiplicitySuffix(input.multiplicity) })
1202
+ /* @__PURE__ */ jsx16("span", { className: "detail-io-name", children: input.name }),
1203
+ input.concept && /* @__PURE__ */ jsx16("span", { className: "detail-io-concept", children: input.concept + multiplicitySuffix(input.multiplicity) })
1177
1204
  ]
1178
1205
  },
1179
1206
  idx
1180
1207
  )) })
1181
1208
  ] }),
1182
- outputs.length > 0 && /* @__PURE__ */ jsxs15("div", { children: [
1183
- /* @__PURE__ */ jsx15("div", { className: "detail-section-label", children: "Output" }),
1184
- /* @__PURE__ */ jsx15("div", { className: "detail-io-list", children: outputs.map((output, idx) => /* @__PURE__ */ jsxs15(
1209
+ outputs.length > 0 && /* @__PURE__ */ jsxs16("div", { children: [
1210
+ /* @__PURE__ */ jsx16("div", { className: "detail-section-label", children: "Output" }),
1211
+ /* @__PURE__ */ jsx16("div", { className: "detail-io-list", children: outputs.map((output, idx) => /* @__PURE__ */ jsxs16(
1185
1212
  "div",
1186
1213
  {
1187
1214
  className: "detail-io-pill",
1188
1215
  style: { cursor: output.concept && onConceptClick ? "pointer" : void 0 },
1189
1216
  onClick: () => output.concept && (onConceptClick == null ? void 0 : onConceptClick(output.concept)),
1190
1217
  children: [
1191
- /* @__PURE__ */ jsx15("span", { className: "detail-io-name", children: output.name }),
1192
- output.concept && /* @__PURE__ */ jsx15("span", { className: "detail-io-concept", children: output.concept + multiplicitySuffix(output.multiplicity) })
1218
+ /* @__PURE__ */ jsx16("span", { className: "detail-io-name", children: output.name }),
1219
+ output.concept && /* @__PURE__ */ jsx16("span", { className: "detail-io-concept", children: output.concept + multiplicitySuffix(output.multiplicity) })
1193
1220
  ]
1194
1221
  },
1195
1222
  idx
1196
1223
  )) })
1197
1224
  ] }),
1198
- (inputs.length > 0 || outputs.length > 0) && /* @__PURE__ */ jsx15("div", { style: { borderTop: "1px solid rgba(255,255,255,0.06)", margin: "4px 0" } })
1225
+ (inputs.length > 0 || outputs.length > 0) && /* @__PURE__ */ jsx16("div", { style: { borderTop: "1px solid rgba(255,255,255,0.06)", margin: "4px 0" } })
1199
1226
  ] }),
1200
- blueprint && /* @__PURE__ */ jsx15(
1227
+ isBinding && /* @__PURE__ */ jsx16(BindingStepSection, { node }),
1228
+ blueprint && /* @__PURE__ */ jsx16(
1201
1229
  BlueprintSection,
1202
1230
  {
1203
1231
  blueprint,
@@ -1206,7 +1234,7 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1206
1234
  modelHandles: node.execution_data
1207
1235
  }
1208
1236
  ),
1209
- showsGeneratedData && node.execution_data && Object.keys(node.execution_data).length > 0 && /* @__PURE__ */ jsx15(
1237
+ showsGeneratedData && !isBinding && node.execution_data && Object.keys(node.execution_data).length > 0 && /* @__PURE__ */ jsx16(
1210
1238
  ExecutionDataSection,
1211
1239
  {
1212
1240
  executionData: node.execution_data,
@@ -1214,14 +1242,14 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1214
1242
  hasBlueprint: !!blueprint
1215
1243
  }
1216
1244
  ),
1217
- node.error && /* @__PURE__ */ jsxs15("div", { className: "detail-error", children: [
1218
- /* @__PURE__ */ jsx15("div", { className: "detail-error-type", children: node.error.error_type }),
1219
- /* @__PURE__ */ jsx15("div", { className: "detail-error-message", children: node.error.message }),
1220
- node.error.stack && /* @__PURE__ */ jsx15("div", { className: "detail-error-stack", children: node.error.stack })
1245
+ node.error && /* @__PURE__ */ jsxs16("div", { className: "detail-error", children: [
1246
+ /* @__PURE__ */ jsx16("div", { className: "detail-error-type", children: node.error.error_type }),
1247
+ /* @__PURE__ */ jsx16("div", { className: "detail-error-message", children: node.error.message }),
1248
+ node.error.stack && /* @__PURE__ */ jsx16("div", { className: "detail-error-stack", children: node.error.stack })
1221
1249
  ] }),
1222
- showsGeneratedData && node.metrics && Object.keys(node.metrics).length > 0 && /* @__PURE__ */ jsxs15("div", { children: [
1223
- /* @__PURE__ */ jsx15("div", { className: "detail-section-label", children: "Metrics" }),
1224
- Object.entries(node.metrics).map(([key, value]) => /* @__PURE__ */ jsx15(
1250
+ showsGeneratedData && node.metrics && Object.keys(node.metrics).length > 0 && /* @__PURE__ */ jsxs16("div", { children: [
1251
+ /* @__PURE__ */ jsx16("div", { className: "detail-section-label", children: "Metrics" }),
1252
+ Object.entries(node.metrics).map(([key, value]) => /* @__PURE__ */ jsx16(
1225
1253
  KV,
1226
1254
  {
1227
1255
  label: key,
@@ -1230,17 +1258,17 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1230
1258
  key
1231
1259
  ))
1232
1260
  ] }),
1233
- node.tags && Object.keys(node.tags).length > 0 && /* @__PURE__ */ jsxs15("div", { children: [
1234
- /* @__PURE__ */ jsx15("div", { className: "detail-section-label", children: "Tags" }),
1235
- /* @__PURE__ */ jsx15("div", { className: "detail-tags", children: Object.entries(node.tags).map(([key, value]) => /* @__PURE__ */ jsxs15("span", { className: "detail-tag", children: [
1236
- /* @__PURE__ */ jsxs15("span", { className: "detail-tag-key", children: [
1261
+ node.tags && Object.keys(node.tags).length > 0 && /* @__PURE__ */ jsxs16("div", { children: [
1262
+ /* @__PURE__ */ jsx16("div", { className: "detail-section-label", children: "Tags" }),
1263
+ /* @__PURE__ */ jsx16("div", { className: "detail-tags", children: Object.entries(node.tags).map(([key, value]) => /* @__PURE__ */ jsxs16("span", { className: "detail-tag", children: [
1264
+ /* @__PURE__ */ jsxs16("span", { className: "detail-tag-key", children: [
1237
1265
  key,
1238
1266
  ": "
1239
1267
  ] }),
1240
- /* @__PURE__ */ jsx15("span", { className: "detail-tag-value", children: value })
1268
+ /* @__PURE__ */ jsx16("span", { className: "detail-tag-value", children: value })
1241
1269
  ] }, key)) })
1242
1270
  ] }),
1243
- !blueprint && /* @__PURE__ */ jsx15("div", { className: "detail-not-available", children: "Blueprint not available" })
1271
+ !blueprint && !isBinding && /* @__PURE__ */ jsx16("div", { className: "detail-not-available", children: "Blueprint not available" })
1244
1272
  ] });
1245
1273
  }
1246
1274
  function BlueprintSection({
@@ -1251,7 +1279,7 @@ function BlueprintSection({
1251
1279
  }) {
1252
1280
  switch (blueprint.type) {
1253
1281
  case "PipeLLM":
1254
- return /* @__PURE__ */ jsx15(
1282
+ return /* @__PURE__ */ jsx16(
1255
1283
  PipeLLMSection,
1256
1284
  {
1257
1285
  blueprint,
@@ -1261,7 +1289,7 @@ function BlueprintSection({
1261
1289
  }
1262
1290
  );
1263
1291
  case "PipeImgGen":
1264
- return /* @__PURE__ */ jsx15(
1292
+ return /* @__PURE__ */ jsx16(
1265
1293
  PipeImgGenSection,
1266
1294
  {
1267
1295
  blueprint,
@@ -1271,9 +1299,9 @@ function BlueprintSection({
1271
1299
  }
1272
1300
  );
1273
1301
  case "PipeCompose":
1274
- return /* @__PURE__ */ jsx15(PipeComposeSection, { blueprint, executionData });
1302
+ return /* @__PURE__ */ jsx16(PipeComposeSection, { blueprint, executionData });
1275
1303
  case "PipeExtract":
1276
- return /* @__PURE__ */ jsx15(
1304
+ return /* @__PURE__ */ jsx16(
1277
1305
  PipeExtractSection,
1278
1306
  {
1279
1307
  blueprint,
@@ -1282,7 +1310,7 @@ function BlueprintSection({
1282
1310
  }
1283
1311
  );
1284
1312
  case "PipeSearch":
1285
- return /* @__PURE__ */ jsx15(
1313
+ return /* @__PURE__ */ jsx16(
1286
1314
  PipeSearchSection,
1287
1315
  {
1288
1316
  blueprint,
@@ -1292,7 +1320,7 @@ function BlueprintSection({
1292
1320
  }
1293
1321
  );
1294
1322
  case "PipeStructure":
1295
- return /* @__PURE__ */ jsx15(
1323
+ return /* @__PURE__ */ jsx16(
1296
1324
  PipeStructureSection,
1297
1325
  {
1298
1326
  blueprint,
@@ -1302,17 +1330,17 @@ function BlueprintSection({
1302
1330
  }
1303
1331
  );
1304
1332
  case "PipeSequence":
1305
- return /* @__PURE__ */ jsx15(PipeSequenceSection, { blueprint, executionData });
1333
+ return /* @__PURE__ */ jsx16(PipeSequenceSection, { blueprint, executionData });
1306
1334
  case "PipeParallel":
1307
- return /* @__PURE__ */ jsx15(PipeParallelSection, { blueprint, executionData });
1335
+ return /* @__PURE__ */ jsx16(PipeParallelSection, { blueprint, executionData });
1308
1336
  case "PipeCondition":
1309
- return /* @__PURE__ */ jsx15(PipeConditionSection, { blueprint, executionData });
1337
+ return /* @__PURE__ */ jsx16(PipeConditionSection, { blueprint, executionData });
1310
1338
  case "PipeBatch":
1311
- return /* @__PURE__ */ jsx15(PipeBatchSection, { blueprint, executionData });
1339
+ return /* @__PURE__ */ jsx16(PipeBatchSection, { blueprint, executionData });
1312
1340
  case "PipeFunc":
1313
1341
  return null;
1314
1342
  case "PipeSignature":
1315
- return /* @__PURE__ */ jsx15("div", { className: "detail-not-available", children: "Signature stub \u2014 declared but not yet implemented." });
1343
+ return /* @__PURE__ */ jsx16("div", { className: "detail-not-available", children: "Signature stub \u2014 declared but not yet implemented." });
1316
1344
  default:
1317
1345
  return null;
1318
1346
  }
@@ -1323,20 +1351,20 @@ function ExecutionDataSection({
1323
1351
  hasBlueprint
1324
1352
  }) {
1325
1353
  if (!shouldDumpExecutionData(pipeType, hasBlueprint)) return null;
1326
- return /* @__PURE__ */ jsx15(GenericExecutionData, { data: executionData });
1354
+ return /* @__PURE__ */ jsx16(GenericExecutionData, { data: executionData });
1327
1355
  }
1328
1356
  function GenericExecutionData({ data }) {
1329
1357
  const entries = Object.entries(data);
1330
1358
  if (entries.length === 0) return null;
1331
- return /* @__PURE__ */ jsxs15(Fragment10, { children: [
1332
- /* @__PURE__ */ jsx15("div", { className: "detail-section-label", children: "Execution" }),
1333
- entries.map(([key, value]) => /* @__PURE__ */ jsx15(KV, { label: key, value: String(value) }, key))
1359
+ return /* @__PURE__ */ jsxs16(Fragment10, { children: [
1360
+ /* @__PURE__ */ jsx16("div", { className: "detail-section-label", children: "Execution" }),
1361
+ entries.map(([key, value]) => /* @__PURE__ */ jsx16(KV, { label: key, value: String(value) }, key))
1334
1362
  ] });
1335
1363
  }
1336
1364
 
1337
1365
  // src/graph/react/detail/ConceptDetailPanel.tsx
1338
1366
  import React7 from "react";
1339
- import { Fragment as Fragment11, jsx as jsx16, jsxs as jsxs16 } from "react/jsx-runtime";
1367
+ import { Fragment as Fragment11, jsx as jsx17, jsxs as jsxs17 } from "react/jsx-runtime";
1340
1368
  function ConceptDetailPanel({
1341
1369
  concept,
1342
1370
  ioData,
@@ -1346,18 +1374,18 @@ function ConceptDetailPanel({
1346
1374
  }) {
1347
1375
  var _a;
1348
1376
  const multiplicity = ioData == null ? void 0 : ioData.multiplicity;
1349
- return /* @__PURE__ */ jsxs16(Fragment11, { children: [
1350
- /* @__PURE__ */ jsxs16("div", { className: "detail-header", children: [
1351
- /* @__PURE__ */ jsx16("span", { className: "detail-concept-code", children: concept.code + multiplicitySuffix(multiplicity) }),
1352
- /* @__PURE__ */ jsx16("span", { className: "detail-concept-domain", children: concept.domain_code })
1377
+ return /* @__PURE__ */ jsxs17(Fragment11, { children: [
1378
+ /* @__PURE__ */ jsxs17("div", { className: "detail-header", children: [
1379
+ /* @__PURE__ */ jsx17("span", { className: "detail-concept-code", children: concept.code + multiplicitySuffix(multiplicity) }),
1380
+ /* @__PURE__ */ jsx17("span", { className: "detail-concept-domain", children: concept.domain_code })
1353
1381
  ] }),
1354
- isPluralMultiplicity(multiplicity) && /* @__PURE__ */ jsx16("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` }),
1355
- concept.description && /* @__PURE__ */ jsx16("div", { className: "detail-description", children: concept.description }),
1356
- concept.refines && /* @__PURE__ */ jsxs16("div", { className: "detail-refines", children: [
1382
+ 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` }),
1383
+ concept.description && /* @__PURE__ */ jsx17("div", { className: "detail-description", children: concept.description }),
1384
+ concept.refines && /* @__PURE__ */ jsxs17("div", { className: "detail-refines", children: [
1357
1385
  "refines ",
1358
- /* @__PURE__ */ jsx16("span", { className: "detail-refines-code", children: concept.refines })
1386
+ /* @__PURE__ */ jsx17("span", { className: "detail-refines-code", children: concept.refines })
1359
1387
  ] }),
1360
- /* @__PURE__ */ jsx16(
1388
+ /* @__PURE__ */ jsx17(
1361
1389
  ConceptBody,
1362
1390
  {
1363
1391
  concept,
@@ -1376,10 +1404,10 @@ function ConceptBody({ concept, ioData, isDryRun, renderData }) {
1376
1404
  const baseId = React7.useId();
1377
1405
  const tabId = (tab) => `${baseId}-tab-${tab}`;
1378
1406
  const panelId = (tab) => `${baseId}-tabpanel-${tab}`;
1379
- const structure = concept.json_schema ? /* @__PURE__ */ jsxs16("div", { children: [
1380
- /* @__PURE__ */ jsx16("div", { className: "detail-section-label", children: "Structure" }),
1381
- /* @__PURE__ */ jsx16(SchemaTable, { schema: concept.json_schema })
1382
- ] }) : /* @__PURE__ */ jsx16("div", { className: "detail-not-available", children: "Schema not available" });
1407
+ const structure = concept.json_schema ? /* @__PURE__ */ jsxs17("div", { children: [
1408
+ /* @__PURE__ */ jsx17("div", { className: "detail-section-label", children: "Structure" }),
1409
+ /* @__PURE__ */ jsx17(SchemaTable, { schema: concept.json_schema })
1410
+ ] }) : /* @__PURE__ */ jsx17("div", { className: "detail-not-available", children: "Schema not available" });
1383
1411
  if (!hasData) return structure;
1384
1412
  const onTabKeyDown = (event) => {
1385
1413
  var _a;
@@ -1402,7 +1430,7 @@ function ConceptBody({ concept, ioData, isDryRun, renderData }) {
1402
1430
  setActiveTab(next);
1403
1431
  (_a = document.getElementById(tabId(next))) == null ? void 0 : _a.focus();
1404
1432
  };
1405
- const renderTab = (tab, label) => /* @__PURE__ */ jsx16(
1433
+ const renderTab = (tab, label) => /* @__PURE__ */ jsx17(
1406
1434
  "button",
1407
1435
  {
1408
1436
  type: "button",
@@ -1417,12 +1445,12 @@ function ConceptBody({ concept, ioData, isDryRun, renderData }) {
1417
1445
  children: label
1418
1446
  }
1419
1447
  );
1420
- return /* @__PURE__ */ jsxs16(Fragment11, { children: [
1421
- /* @__PURE__ */ jsxs16("div", { className: "detail-tabs", role: "tablist", "aria-label": "Concept views", children: [
1448
+ return /* @__PURE__ */ jsxs17(Fragment11, { children: [
1449
+ /* @__PURE__ */ jsxs17("div", { className: "detail-tabs", role: "tablist", "aria-label": "Concept views", children: [
1422
1450
  renderTab("data", "Data"),
1423
1451
  renderTab("structure", "Structure")
1424
1452
  ] }),
1425
- /* @__PURE__ */ jsx16("div", { role: "tabpanel", id: panelId(activeTab), "aria-labelledby": tabId(activeTab), children: activeTab === "data" ? dataView : structure })
1453
+ /* @__PURE__ */ jsx17("div", { role: "tabpanel", id: panelId(activeTab), "aria-labelledby": tabId(activeTab), children: activeTab === "data" ? dataView : structure })
1426
1454
  ] });
1427
1455
  }
1428
1456
  function SchemaTable({ schema }) {
@@ -1430,23 +1458,23 @@ function SchemaTable({ schema }) {
1430
1458
  const properties = schema.properties;
1431
1459
  const required = new Set((_a = schema.required) != null ? _a : []);
1432
1460
  if (!properties || Object.keys(properties).length === 0) {
1433
- return /* @__PURE__ */ jsx16("div", { className: "detail-not-available", children: "No fields defined" });
1461
+ return /* @__PURE__ */ jsx17("div", { className: "detail-not-available", children: "No fields defined" });
1434
1462
  }
1435
1463
  const fields = Object.entries(properties);
1436
- return /* @__PURE__ */ jsxs16("table", { className: "detail-schema-table", children: [
1437
- /* @__PURE__ */ jsx16("thead", { children: /* @__PURE__ */ jsxs16("tr", { children: [
1438
- /* @__PURE__ */ jsx16("th", { children: "Field" }),
1439
- /* @__PURE__ */ jsx16("th", { children: "Type" }),
1440
- /* @__PURE__ */ jsx16("th", {}),
1441
- /* @__PURE__ */ jsx16("th", { children: "Description" })
1464
+ return /* @__PURE__ */ jsxs17("table", { className: "detail-schema-table", children: [
1465
+ /* @__PURE__ */ jsx17("thead", { children: /* @__PURE__ */ jsxs17("tr", { children: [
1466
+ /* @__PURE__ */ jsx17("th", { children: "Field" }),
1467
+ /* @__PURE__ */ jsx17("th", { children: "Type" }),
1468
+ /* @__PURE__ */ jsx17("th", {}),
1469
+ /* @__PURE__ */ jsx17("th", { children: "Description" })
1442
1470
  ] }) }),
1443
- /* @__PURE__ */ jsx16("tbody", { children: fields.map(([fieldName, fieldSchema]) => {
1471
+ /* @__PURE__ */ jsx17("tbody", { children: fields.map(([fieldName, fieldSchema]) => {
1444
1472
  var _a2;
1445
- return /* @__PURE__ */ jsxs16("tr", { children: [
1446
- /* @__PURE__ */ jsx16("td", { className: "detail-schema-field", children: fieldName }),
1447
- /* @__PURE__ */ jsx16("td", { className: "detail-schema-type", children: extractType(fieldSchema) }),
1448
- /* @__PURE__ */ jsx16("td", { children: required.has(fieldName) && /* @__PURE__ */ jsx16("span", { className: "detail-schema-required", children: "req" }) }),
1449
- /* @__PURE__ */ jsx16("td", { children: (_a2 = fieldSchema.description) != null ? _a2 : "" })
1473
+ return /* @__PURE__ */ jsxs17("tr", { children: [
1474
+ /* @__PURE__ */ jsx17("td", { className: "detail-schema-field", children: fieldName }),
1475
+ /* @__PURE__ */ jsx17("td", { className: "detail-schema-type", children: extractType(fieldSchema) }),
1476
+ /* @__PURE__ */ jsx17("td", { children: required.has(fieldName) && /* @__PURE__ */ jsx17("span", { className: "detail-schema-required", children: "req" }) }),
1477
+ /* @__PURE__ */ jsx17("td", { children: (_a2 = fieldSchema.description) != null ? _a2 : "" })
1450
1478
  ] }, fieldName);
1451
1479
  }) })
1452
1480
  ] });
@@ -1497,10 +1525,10 @@ function toAppEdges(edges) {
1497
1525
  }
1498
1526
 
1499
1527
  // src/graph/react/viewer/renderLabel.tsx
1500
- import { jsx as jsx17, jsxs as jsxs17 } from "react/jsx-runtime";
1528
+ import { jsx as jsx18, jsxs as jsxs18 } from "react/jsx-runtime";
1501
1529
  function renderLabel(desc) {
1502
1530
  if (desc.kind === "pipe") {
1503
- return /* @__PURE__ */ jsx17(
1531
+ return /* @__PURE__ */ jsx18(
1504
1532
  "div",
1505
1533
  {
1506
1534
  style: {
@@ -1514,7 +1542,7 @@ function renderLabel(desc) {
1514
1542
  minWidth: 0
1515
1543
  },
1516
1544
  title: desc.label,
1517
- children: /* @__PURE__ */ jsx17(
1545
+ children: /* @__PURE__ */ jsx18(
1518
1546
  "span",
1519
1547
  {
1520
1548
  style: {
@@ -1533,7 +1561,7 @@ function renderLabel(desc) {
1533
1561
  }
1534
1562
  );
1535
1563
  }
1536
- return /* @__PURE__ */ jsxs17(
1564
+ return /* @__PURE__ */ jsxs18(
1537
1565
  "div",
1538
1566
  {
1539
1567
  style: {
@@ -1549,7 +1577,7 @@ function renderLabel(desc) {
1549
1577
  },
1550
1578
  title: desc.concept ? `${desc.label}: ${desc.concept}` : desc.label,
1551
1579
  children: [
1552
- /* @__PURE__ */ jsx17(
1580
+ /* @__PURE__ */ jsx18(
1553
1581
  "span",
1554
1582
  {
1555
1583
  style: {
@@ -1565,7 +1593,7 @@ function renderLabel(desc) {
1565
1593
  children: desc.label
1566
1594
  }
1567
1595
  ),
1568
- desc.concept && /* @__PURE__ */ jsx17(
1596
+ desc.concept && /* @__PURE__ */ jsx18(
1569
1597
  "span",
1570
1598
  {
1571
1599
  style: {
@@ -1599,7 +1627,7 @@ import React8 from "react";
1599
1627
  import { Panel } from "@xyflow/react";
1600
1628
 
1601
1629
  // src/graph/react/viewer/ValidationPanel.tsx
1602
- import { jsx as jsx18, jsxs as jsxs18 } from "react/jsx-runtime";
1630
+ import { jsx as jsx19, jsxs as jsxs19 } from "react/jsx-runtime";
1603
1631
  function validationLabel(state, issueCount) {
1604
1632
  const issues = issueCount === 1 ? "1 issue" : `${issueCount} issues`;
1605
1633
  switch (state) {
@@ -1666,7 +1694,7 @@ function ValidationPanel({
1666
1694
  placement,
1667
1695
  id
1668
1696
  }) {
1669
- return /* @__PURE__ */ jsxs18(
1697
+ return /* @__PURE__ */ jsxs19(
1670
1698
  "div",
1671
1699
  {
1672
1700
  id,
@@ -1674,18 +1702,18 @@ function ValidationPanel({
1674
1702
  role: "region",
1675
1703
  "aria-label": "Validation issues",
1676
1704
  children: [
1677
- /* @__PURE__ */ jsx18("div", { className: "graph-validation-panel-header", children: validationLabel(state, issues.length) }),
1678
- issues.length === 0 ? /* @__PURE__ */ jsx18("div", { className: "graph-validation-empty", children: validationEmptyText(state) }) : /* @__PURE__ */ jsx18("ul", { className: "graph-validation-issues", role: "list", children: issues.map((issue, index) => {
1705
+ /* @__PURE__ */ jsx19("div", { className: "graph-validation-panel-header", children: validationLabel(state, issues.length) }),
1706
+ 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) => {
1679
1707
  const clickable = onIssueClick !== void 0;
1680
- const meta = (issue.context || issue.file) && /* @__PURE__ */ jsxs18("div", { className: "graph-validation-issue-meta", children: [
1681
- issue.context && /* @__PURE__ */ jsx18("span", { className: "graph-validation-issue-context", children: issue.context }),
1682
- issue.file && /* @__PURE__ */ jsx18("span", { className: "graph-validation-issue-file", children: issue.file })
1708
+ const meta = (issue.context || issue.file) && /* @__PURE__ */ jsxs19("div", { className: "graph-validation-issue-meta", children: [
1709
+ issue.context && /* @__PURE__ */ jsx19("span", { className: "graph-validation-issue-context", children: issue.context }),
1710
+ issue.file && /* @__PURE__ */ jsx19("span", { className: "graph-validation-issue-file", children: issue.file })
1683
1711
  ] });
1684
- return /* @__PURE__ */ jsx18(
1712
+ return /* @__PURE__ */ jsx19(
1685
1713
  "li",
1686
1714
  {
1687
1715
  className: `graph-validation-issue graph-validation-issue--${issue.severity}` + (clickable ? " graph-validation-issue--clickable" : ""),
1688
- children: /* @__PURE__ */ jsxs18(
1716
+ children: /* @__PURE__ */ jsxs19(
1689
1717
  "div",
1690
1718
  {
1691
1719
  className: "graph-validation-issue-body",
@@ -1700,8 +1728,8 @@ function ValidationPanel({
1700
1728
  } : void 0,
1701
1729
  children: [
1702
1730
  meta,
1703
- /* @__PURE__ */ jsx18("div", { className: "graph-validation-issue-message", children: issue.message }),
1704
- issue.suggestedFix && /* @__PURE__ */ jsx18("div", { className: "graph-validation-issue-fix", children: issue.suggestedFix })
1731
+ /* @__PURE__ */ jsx19("div", { className: "graph-validation-issue-message", children: issue.message }),
1732
+ issue.suggestedFix && /* @__PURE__ */ jsx19("div", { className: "graph-validation-issue-fix", children: issue.suggestedFix })
1705
1733
  ]
1706
1734
  }
1707
1735
  )
@@ -1715,9 +1743,9 @@ function ValidationPanel({
1715
1743
  }
1716
1744
 
1717
1745
  // src/graph/react/viewer/GraphToolbar.tsx
1718
- import { Fragment as Fragment12, jsx as jsx19, jsxs as jsxs19 } from "react/jsx-runtime";
1746
+ import { Fragment as Fragment12, jsx as jsx20, jsxs as jsxs20 } from "react/jsx-runtime";
1719
1747
  var REACTFLOW_PANEL_MARGIN = 15;
1720
- var ARROW_RIGHT_ICON = /* @__PURE__ */ jsxs19(
1748
+ var ARROW_RIGHT_ICON = /* @__PURE__ */ jsxs20(
1721
1749
  "svg",
1722
1750
  {
1723
1751
  viewBox: "0 0 24 24",
@@ -1729,12 +1757,12 @@ var ARROW_RIGHT_ICON = /* @__PURE__ */ jsxs19(
1729
1757
  strokeLinecap: "round",
1730
1758
  strokeLinejoin: "round",
1731
1759
  children: [
1732
- /* @__PURE__ */ jsx19("line", { x1: "5", y1: "12", x2: "19", y2: "12" }),
1733
- /* @__PURE__ */ jsx19("polyline", { points: "12 5 19 12 12 19" })
1760
+ /* @__PURE__ */ jsx20("line", { x1: "5", y1: "12", x2: "19", y2: "12" }),
1761
+ /* @__PURE__ */ jsx20("polyline", { points: "12 5 19 12 12 19" })
1734
1762
  ]
1735
1763
  }
1736
1764
  );
1737
- var ARROW_DOWN_ICON = /* @__PURE__ */ jsxs19(
1765
+ var ARROW_DOWN_ICON = /* @__PURE__ */ jsxs20(
1738
1766
  "svg",
1739
1767
  {
1740
1768
  viewBox: "0 0 24 24",
@@ -1746,12 +1774,12 @@ var ARROW_DOWN_ICON = /* @__PURE__ */ jsxs19(
1746
1774
  strokeLinecap: "round",
1747
1775
  strokeLinejoin: "round",
1748
1776
  children: [
1749
- /* @__PURE__ */ jsx19("line", { x1: "12", y1: "5", x2: "12", y2: "19" }),
1750
- /* @__PURE__ */ jsx19("polyline", { points: "19 12 12 19 5 12" })
1777
+ /* @__PURE__ */ jsx20("line", { x1: "12", y1: "5", x2: "12", y2: "19" }),
1778
+ /* @__PURE__ */ jsx20("polyline", { points: "19 12 12 19 5 12" })
1751
1779
  ]
1752
1780
  }
1753
1781
  );
1754
- var MINUS_ICON = /* @__PURE__ */ jsx19(
1782
+ var MINUS_ICON = /* @__PURE__ */ jsx20(
1755
1783
  "svg",
1756
1784
  {
1757
1785
  viewBox: "0 0 24 24",
@@ -1762,10 +1790,10 @@ var MINUS_ICON = /* @__PURE__ */ jsx19(
1762
1790
  strokeWidth: "2",
1763
1791
  strokeLinecap: "round",
1764
1792
  strokeLinejoin: "round",
1765
- children: /* @__PURE__ */ jsx19("line", { x1: "5", y1: "12", x2: "19", y2: "12" })
1793
+ children: /* @__PURE__ */ jsx20("line", { x1: "5", y1: "12", x2: "19", y2: "12" })
1766
1794
  }
1767
1795
  );
1768
- var PLUS_ICON = /* @__PURE__ */ jsxs19(
1796
+ var PLUS_ICON = /* @__PURE__ */ jsxs20(
1769
1797
  "svg",
1770
1798
  {
1771
1799
  viewBox: "0 0 24 24",
@@ -1777,12 +1805,12 @@ var PLUS_ICON = /* @__PURE__ */ jsxs19(
1777
1805
  strokeLinecap: "round",
1778
1806
  strokeLinejoin: "round",
1779
1807
  children: [
1780
- /* @__PURE__ */ jsx19("line", { x1: "12", y1: "5", x2: "12", y2: "19" }),
1781
- /* @__PURE__ */ jsx19("line", { x1: "5", y1: "12", x2: "19", y2: "12" })
1808
+ /* @__PURE__ */ jsx20("line", { x1: "12", y1: "5", x2: "12", y2: "19" }),
1809
+ /* @__PURE__ */ jsx20("line", { x1: "5", y1: "12", x2: "19", y2: "12" })
1782
1810
  ]
1783
1811
  }
1784
1812
  );
1785
- var FIT_VIEW_ICON = /* @__PURE__ */ jsxs19(
1813
+ var FIT_VIEW_ICON = /* @__PURE__ */ jsxs20(
1786
1814
  "svg",
1787
1815
  {
1788
1816
  viewBox: "0 0 24 24",
@@ -1794,14 +1822,14 @@ var FIT_VIEW_ICON = /* @__PURE__ */ jsxs19(
1794
1822
  strokeLinecap: "round",
1795
1823
  strokeLinejoin: "round",
1796
1824
  children: [
1797
- /* @__PURE__ */ jsx19("polyline", { points: "15 3 21 3 21 9" }),
1798
- /* @__PURE__ */ jsx19("polyline", { points: "9 21 3 21 3 15" }),
1799
- /* @__PURE__ */ jsx19("line", { x1: "21", y1: "3", x2: "14", y2: "10" }),
1800
- /* @__PURE__ */ jsx19("line", { x1: "3", y1: "21", x2: "10", y2: "14" })
1825
+ /* @__PURE__ */ jsx20("polyline", { points: "15 3 21 3 21 9" }),
1826
+ /* @__PURE__ */ jsx20("polyline", { points: "9 21 3 21 3 15" }),
1827
+ /* @__PURE__ */ jsx20("line", { x1: "21", y1: "3", x2: "14", y2: "10" }),
1828
+ /* @__PURE__ */ jsx20("line", { x1: "3", y1: "21", x2: "10", y2: "14" })
1801
1829
  ]
1802
1830
  }
1803
1831
  );
1804
- var BOXES_ICON = /* @__PURE__ */ jsxs19(
1832
+ var BOXES_ICON = /* @__PURE__ */ jsxs20(
1805
1833
  "svg",
1806
1834
  {
1807
1835
  viewBox: "0 0 24 24",
@@ -1813,22 +1841,22 @@ var BOXES_ICON = /* @__PURE__ */ jsxs19(
1813
1841
  strokeLinecap: "round",
1814
1842
  strokeLinejoin: "round",
1815
1843
  children: [
1816
- /* @__PURE__ */ jsx19("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" }),
1817
- /* @__PURE__ */ jsx19("path", { d: "m7 16.5-4.74-2.85" }),
1818
- /* @__PURE__ */ jsx19("path", { d: "m7 16.5 5-3" }),
1819
- /* @__PURE__ */ jsx19("path", { d: "M7 16.5v5.17" }),
1820
- /* @__PURE__ */ jsx19("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" }),
1821
- /* @__PURE__ */ jsx19("path", { d: "m17 16.5-5-3" }),
1822
- /* @__PURE__ */ jsx19("path", { d: "m17 16.5 4.74-2.85" }),
1823
- /* @__PURE__ */ jsx19("path", { d: "M17 16.5v5.17" }),
1824
- /* @__PURE__ */ jsx19("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" }),
1825
- /* @__PURE__ */ jsx19("path", { d: "M12 8 7.26 5.15" }),
1826
- /* @__PURE__ */ jsx19("path", { d: "m12 8 4.74-2.85" }),
1827
- /* @__PURE__ */ jsx19("path", { d: "M12 13.5V8" })
1844
+ /* @__PURE__ */ jsx20("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" }),
1845
+ /* @__PURE__ */ jsx20("path", { d: "m7 16.5-4.74-2.85" }),
1846
+ /* @__PURE__ */ jsx20("path", { d: "m7 16.5 5-3" }),
1847
+ /* @__PURE__ */ jsx20("path", { d: "M7 16.5v5.17" }),
1848
+ /* @__PURE__ */ jsx20("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" }),
1849
+ /* @__PURE__ */ jsx20("path", { d: "m17 16.5-5-3" }),
1850
+ /* @__PURE__ */ jsx20("path", { d: "m17 16.5 4.74-2.85" }),
1851
+ /* @__PURE__ */ jsx20("path", { d: "M17 16.5v5.17" }),
1852
+ /* @__PURE__ */ jsx20("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" }),
1853
+ /* @__PURE__ */ jsx20("path", { d: "M12 8 7.26 5.15" }),
1854
+ /* @__PURE__ */ jsx20("path", { d: "m12 8 4.74-2.85" }),
1855
+ /* @__PURE__ */ jsx20("path", { d: "M12 13.5V8" })
1828
1856
  ]
1829
1857
  }
1830
1858
  );
1831
- var FOLD_ALL_ICON = /* @__PURE__ */ jsxs19(
1859
+ var FOLD_ALL_ICON = /* @__PURE__ */ jsxs20(
1832
1860
  "svg",
1833
1861
  {
1834
1862
  viewBox: "0 0 24 24",
@@ -1840,15 +1868,15 @@ var FOLD_ALL_ICON = /* @__PURE__ */ jsxs19(
1840
1868
  strokeLinecap: "round",
1841
1869
  strokeLinejoin: "round",
1842
1870
  children: [
1843
- /* @__PURE__ */ jsx19("rect", { x: "6", y: "6", width: "12", height: "12", rx: "2" }),
1844
- /* @__PURE__ */ jsx19("polyline", { points: "2 2 6 6 2 6" }),
1845
- /* @__PURE__ */ jsx19("polyline", { points: "22 2 18 6 22 6" }),
1846
- /* @__PURE__ */ jsx19("polyline", { points: "2 22 6 18 2 18" }),
1847
- /* @__PURE__ */ jsx19("polyline", { points: "22 22 18 18 22 18" })
1871
+ /* @__PURE__ */ jsx20("rect", { x: "6", y: "6", width: "12", height: "12", rx: "2" }),
1872
+ /* @__PURE__ */ jsx20("polyline", { points: "2 2 6 6 2 6" }),
1873
+ /* @__PURE__ */ jsx20("polyline", { points: "22 2 18 6 22 6" }),
1874
+ /* @__PURE__ */ jsx20("polyline", { points: "2 22 6 18 2 18" }),
1875
+ /* @__PURE__ */ jsx20("polyline", { points: "22 22 18 18 22 18" })
1848
1876
  ]
1849
1877
  }
1850
1878
  );
1851
- var EXPAND_ALL_ICON = /* @__PURE__ */ jsxs19(
1879
+ var EXPAND_ALL_ICON = /* @__PURE__ */ jsxs20(
1852
1880
  "svg",
1853
1881
  {
1854
1882
  viewBox: "0 0 24 24",
@@ -1860,15 +1888,15 @@ var EXPAND_ALL_ICON = /* @__PURE__ */ jsxs19(
1860
1888
  strokeLinecap: "round",
1861
1889
  strokeLinejoin: "round",
1862
1890
  children: [
1863
- /* @__PURE__ */ jsx19("rect", { x: "9", y: "9", width: "6", height: "6", rx: "1" }),
1864
- /* @__PURE__ */ jsx19("polyline", { points: "3 3 7 7 3 7" }),
1865
- /* @__PURE__ */ jsx19("polyline", { points: "21 3 17 7 21 7" }),
1866
- /* @__PURE__ */ jsx19("polyline", { points: "3 21 7 17 3 17" }),
1867
- /* @__PURE__ */ jsx19("polyline", { points: "21 21 17 17 21 17" })
1891
+ /* @__PURE__ */ jsx20("rect", { x: "9", y: "9", width: "6", height: "6", rx: "1" }),
1892
+ /* @__PURE__ */ jsx20("polyline", { points: "3 3 7 7 3 7" }),
1893
+ /* @__PURE__ */ jsx20("polyline", { points: "21 3 17 7 21 7" }),
1894
+ /* @__PURE__ */ jsx20("polyline", { points: "3 21 7 17 3 17" }),
1895
+ /* @__PURE__ */ jsx20("polyline", { points: "21 21 17 17 21 17" })
1868
1896
  ]
1869
1897
  }
1870
1898
  );
1871
- var SUN_ICON = /* @__PURE__ */ jsxs19(
1899
+ var SUN_ICON = /* @__PURE__ */ jsxs20(
1872
1900
  "svg",
1873
1901
  {
1874
1902
  viewBox: "0 0 24 24",
@@ -1880,19 +1908,19 @@ var SUN_ICON = /* @__PURE__ */ jsxs19(
1880
1908
  strokeLinecap: "round",
1881
1909
  strokeLinejoin: "round",
1882
1910
  children: [
1883
- /* @__PURE__ */ jsx19("circle", { cx: "12", cy: "12", r: "4" }),
1884
- /* @__PURE__ */ jsx19("line", { x1: "12", y1: "2", x2: "12", y2: "4" }),
1885
- /* @__PURE__ */ jsx19("line", { x1: "12", y1: "20", x2: "12", y2: "22" }),
1886
- /* @__PURE__ */ jsx19("line", { x1: "4.93", y1: "4.93", x2: "6.34", y2: "6.34" }),
1887
- /* @__PURE__ */ jsx19("line", { x1: "17.66", y1: "17.66", x2: "19.07", y2: "19.07" }),
1888
- /* @__PURE__ */ jsx19("line", { x1: "2", y1: "12", x2: "4", y2: "12" }),
1889
- /* @__PURE__ */ jsx19("line", { x1: "20", y1: "12", x2: "22", y2: "12" }),
1890
- /* @__PURE__ */ jsx19("line", { x1: "4.93", y1: "19.07", x2: "6.34", y2: "17.66" }),
1891
- /* @__PURE__ */ jsx19("line", { x1: "17.66", y1: "6.34", x2: "19.07", y2: "4.93" })
1911
+ /* @__PURE__ */ jsx20("circle", { cx: "12", cy: "12", r: "4" }),
1912
+ /* @__PURE__ */ jsx20("line", { x1: "12", y1: "2", x2: "12", y2: "4" }),
1913
+ /* @__PURE__ */ jsx20("line", { x1: "12", y1: "20", x2: "12", y2: "22" }),
1914
+ /* @__PURE__ */ jsx20("line", { x1: "4.93", y1: "4.93", x2: "6.34", y2: "6.34" }),
1915
+ /* @__PURE__ */ jsx20("line", { x1: "17.66", y1: "17.66", x2: "19.07", y2: "19.07" }),
1916
+ /* @__PURE__ */ jsx20("line", { x1: "2", y1: "12", x2: "4", y2: "12" }),
1917
+ /* @__PURE__ */ jsx20("line", { x1: "20", y1: "12", x2: "22", y2: "12" }),
1918
+ /* @__PURE__ */ jsx20("line", { x1: "4.93", y1: "19.07", x2: "6.34", y2: "17.66" }),
1919
+ /* @__PURE__ */ jsx20("line", { x1: "17.66", y1: "6.34", x2: "19.07", y2: "4.93" })
1892
1920
  ]
1893
1921
  }
1894
1922
  );
1895
- var MOON_ICON = /* @__PURE__ */ jsx19(
1923
+ var MOON_ICON = /* @__PURE__ */ jsx20(
1896
1924
  "svg",
1897
1925
  {
1898
1926
  viewBox: "0 0 24 24",
@@ -1903,10 +1931,10 @@ var MOON_ICON = /* @__PURE__ */ jsx19(
1903
1931
  strokeWidth: "2",
1904
1932
  strokeLinecap: "round",
1905
1933
  strokeLinejoin: "round",
1906
- children: /* @__PURE__ */ jsx19("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" })
1934
+ children: /* @__PURE__ */ jsx20("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" })
1907
1935
  }
1908
1936
  );
1909
- var MONITOR_ICON = /* @__PURE__ */ jsxs19(
1937
+ var MONITOR_ICON = /* @__PURE__ */ jsxs20(
1910
1938
  "svg",
1911
1939
  {
1912
1940
  viewBox: "0 0 24 24",
@@ -1918,13 +1946,13 @@ var MONITOR_ICON = /* @__PURE__ */ jsxs19(
1918
1946
  strokeLinecap: "round",
1919
1947
  strokeLinejoin: "round",
1920
1948
  children: [
1921
- /* @__PURE__ */ jsx19("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2" }),
1922
- /* @__PURE__ */ jsx19("line", { x1: "8", y1: "21", x2: "16", y2: "21" }),
1923
- /* @__PURE__ */ jsx19("line", { x1: "12", y1: "17", x2: "12", y2: "21" })
1949
+ /* @__PURE__ */ jsx20("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2" }),
1950
+ /* @__PURE__ */ jsx20("line", { x1: "8", y1: "21", x2: "16", y2: "21" }),
1951
+ /* @__PURE__ */ jsx20("line", { x1: "12", y1: "17", x2: "12", y2: "21" })
1924
1952
  ]
1925
1953
  }
1926
1954
  );
1927
- var SPINNER_ICON = /* @__PURE__ */ jsx19(
1955
+ var SPINNER_ICON = /* @__PURE__ */ jsx20(
1928
1956
  "svg",
1929
1957
  {
1930
1958
  className: "graph-toolbar-validation-spin",
@@ -1936,10 +1964,10 @@ var SPINNER_ICON = /* @__PURE__ */ jsx19(
1936
1964
  strokeWidth: "2",
1937
1965
  strokeLinecap: "round",
1938
1966
  strokeLinejoin: "round",
1939
- children: /* @__PURE__ */ jsx19("path", { d: "M21 12a9 9 0 1 1-6.219-8.56" })
1967
+ children: /* @__PURE__ */ jsx20("path", { d: "M21 12a9 9 0 1 1-6.219-8.56" })
1940
1968
  }
1941
1969
  );
1942
- var CHECK_ICON2 = /* @__PURE__ */ jsx19(
1970
+ var CHECK_ICON2 = /* @__PURE__ */ jsx20(
1943
1971
  "svg",
1944
1972
  {
1945
1973
  viewBox: "0 0 24 24",
@@ -1950,10 +1978,10 @@ var CHECK_ICON2 = /* @__PURE__ */ jsx19(
1950
1978
  strokeWidth: "2",
1951
1979
  strokeLinecap: "round",
1952
1980
  strokeLinejoin: "round",
1953
- children: /* @__PURE__ */ jsx19("polyline", { points: "20 6 9 17 4 12" })
1981
+ children: /* @__PURE__ */ jsx20("polyline", { points: "20 6 9 17 4 12" })
1954
1982
  }
1955
1983
  );
1956
- var X_CIRCLE_ICON = /* @__PURE__ */ jsxs19(
1984
+ var X_CIRCLE_ICON = /* @__PURE__ */ jsxs20(
1957
1985
  "svg",
1958
1986
  {
1959
1987
  viewBox: "0 0 24 24",
@@ -1965,13 +1993,13 @@ var X_CIRCLE_ICON = /* @__PURE__ */ jsxs19(
1965
1993
  strokeLinecap: "round",
1966
1994
  strokeLinejoin: "round",
1967
1995
  children: [
1968
- /* @__PURE__ */ jsx19("circle", { cx: "12", cy: "12", r: "10" }),
1969
- /* @__PURE__ */ jsx19("line", { x1: "15", y1: "9", x2: "9", y2: "15" }),
1970
- /* @__PURE__ */ jsx19("line", { x1: "9", y1: "9", x2: "15", y2: "15" })
1996
+ /* @__PURE__ */ jsx20("circle", { cx: "12", cy: "12", r: "10" }),
1997
+ /* @__PURE__ */ jsx20("line", { x1: "15", y1: "9", x2: "9", y2: "15" }),
1998
+ /* @__PURE__ */ jsx20("line", { x1: "9", y1: "9", x2: "15", y2: "15" })
1971
1999
  ]
1972
2000
  }
1973
2001
  );
1974
- var ALERT_TRIANGLE_ICON = /* @__PURE__ */ jsxs19(
2002
+ var ALERT_TRIANGLE_ICON = /* @__PURE__ */ jsxs20(
1975
2003
  "svg",
1976
2004
  {
1977
2005
  viewBox: "0 0 24 24",
@@ -1983,13 +2011,13 @@ var ALERT_TRIANGLE_ICON = /* @__PURE__ */ jsxs19(
1983
2011
  strokeLinecap: "round",
1984
2012
  strokeLinejoin: "round",
1985
2013
  children: [
1986
- /* @__PURE__ */ jsx19("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" }),
1987
- /* @__PURE__ */ jsx19("line", { x1: "12", y1: "9", x2: "12", y2: "13" }),
1988
- /* @__PURE__ */ jsx19("line", { x1: "12", y1: "17", x2: "12.01", y2: "17" })
2014
+ /* @__PURE__ */ jsx20("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" }),
2015
+ /* @__PURE__ */ jsx20("line", { x1: "12", y1: "9", x2: "12", y2: "13" }),
2016
+ /* @__PURE__ */ jsx20("line", { x1: "12", y1: "17", x2: "12.01", y2: "17" })
1989
2017
  ]
1990
2018
  }
1991
2019
  );
1992
- var INFO_CIRCLE_ICON = /* @__PURE__ */ jsxs19(
2020
+ var INFO_CIRCLE_ICON = /* @__PURE__ */ jsxs20(
1993
2021
  "svg",
1994
2022
  {
1995
2023
  viewBox: "0 0 24 24",
@@ -2001,9 +2029,9 @@ var INFO_CIRCLE_ICON = /* @__PURE__ */ jsxs19(
2001
2029
  strokeLinecap: "round",
2002
2030
  strokeLinejoin: "round",
2003
2031
  children: [
2004
- /* @__PURE__ */ jsx19("circle", { cx: "12", cy: "12", r: "10" }),
2005
- /* @__PURE__ */ jsx19("line", { x1: "12", y1: "16", x2: "12", y2: "12" }),
2006
- /* @__PURE__ */ jsx19("line", { x1: "12", y1: "8", x2: "12.01", y2: "8" })
2032
+ /* @__PURE__ */ jsx20("circle", { cx: "12", cy: "12", r: "10" }),
2033
+ /* @__PURE__ */ jsx20("line", { x1: "12", y1: "16", x2: "12", y2: "12" }),
2034
+ /* @__PURE__ */ jsx20("line", { x1: "12", y1: "8", x2: "12.01", y2: "8" })
2007
2035
  ]
2008
2036
  }
2009
2037
  );
@@ -2107,10 +2135,10 @@ function GraphToolbar({
2107
2135
  const foldAllSection = onFoldAll || onExpandAll;
2108
2136
  const foldAllTitle = foldAllDisabled ? "Fold all controllers (nothing to fold)" : "Fold all controllers";
2109
2137
  const expandAllTitle = expandAllDisabled ? "Expand all controllers (nothing to expand)" : "Expand all controllers";
2110
- return /* @__PURE__ */ jsx19(Panel, { position, className: "graph-toolbar-panel", style: panelStyle, children: /* @__PURE__ */ jsxs19("div", { className: `graph-toolbar graph-toolbar--${orientation}`, children: [
2111
- validationState !== void 0 && /* @__PURE__ */ jsxs19(Fragment12, { children: [
2112
- /* @__PURE__ */ jsxs19("div", { className: "graph-toolbar-validation", ref: validationRef, children: [
2113
- /* @__PURE__ */ jsxs19(
2138
+ return /* @__PURE__ */ jsx20(Panel, { position, className: "graph-toolbar-panel", style: panelStyle, children: /* @__PURE__ */ jsxs20("div", { className: `graph-toolbar graph-toolbar--${orientation}`, children: [
2139
+ validationState !== void 0 && /* @__PURE__ */ jsxs20(Fragment12, { children: [
2140
+ /* @__PURE__ */ jsxs20("div", { className: "graph-toolbar-validation", ref: validationRef, children: [
2141
+ /* @__PURE__ */ jsxs20(
2114
2142
  "button",
2115
2143
  {
2116
2144
  type: "button",
@@ -2123,11 +2151,11 @@ function GraphToolbar({
2123
2151
  "aria-controls": validationPanelId,
2124
2152
  children: [
2125
2153
  validationIcon(validationState),
2126
- validationIssues.length > 0 && /* @__PURE__ */ jsx19("span", { className: "graph-toolbar-validation-badge", children: validationIssues.length > 99 ? "99+" : validationIssues.length })
2154
+ validationIssues.length > 0 && /* @__PURE__ */ jsx20("span", { className: "graph-toolbar-validation-badge", children: validationIssues.length > 99 ? "99+" : validationIssues.length })
2127
2155
  ]
2128
2156
  }
2129
2157
  ),
2130
- validationOpen && /* @__PURE__ */ jsx19(
2158
+ validationOpen && /* @__PURE__ */ jsx20(
2131
2159
  ValidationPanel,
2132
2160
  {
2133
2161
  id: validationPanelId,
@@ -2138,9 +2166,9 @@ function GraphToolbar({
2138
2166
  }
2139
2167
  )
2140
2168
  ] }),
2141
- /* @__PURE__ */ jsx19("div", { className: "graph-toolbar-separator" })
2169
+ /* @__PURE__ */ jsx20("div", { className: "graph-toolbar-separator" })
2142
2170
  ] }),
2143
- onFoldAll && /* @__PURE__ */ jsx19(
2171
+ onFoldAll && /* @__PURE__ */ jsx20(
2144
2172
  "button",
2145
2173
  {
2146
2174
  type: "button",
@@ -2152,7 +2180,7 @@ function GraphToolbar({
2152
2180
  children: FOLD_ALL_ICON
2153
2181
  }
2154
2182
  ),
2155
- onExpandAll && /* @__PURE__ */ jsx19(
2183
+ onExpandAll && /* @__PURE__ */ jsx20(
2156
2184
  "button",
2157
2185
  {
2158
2186
  type: "button",
@@ -2164,8 +2192,8 @@ function GraphToolbar({
2164
2192
  children: EXPAND_ALL_ICON
2165
2193
  }
2166
2194
  ),
2167
- foldAllSection && /* @__PURE__ */ jsx19("div", { className: "graph-toolbar-separator" }),
2168
- /* @__PURE__ */ jsx19(
2195
+ foldAllSection && /* @__PURE__ */ jsx20("div", { className: "graph-toolbar-separator" }),
2196
+ /* @__PURE__ */ jsx20(
2169
2197
  "button",
2170
2198
  {
2171
2199
  type: "button",
@@ -2176,7 +2204,7 @@ function GraphToolbar({
2176
2204
  children: BOXES_ICON
2177
2205
  }
2178
2206
  ),
2179
- /* @__PURE__ */ jsx19(
2207
+ /* @__PURE__ */ jsx20(
2180
2208
  "button",
2181
2209
  {
2182
2210
  type: "button",
@@ -2187,8 +2215,8 @@ function GraphToolbar({
2187
2215
  children: isVertical ? ARROW_RIGHT_ICON : ARROW_DOWN_ICON
2188
2216
  }
2189
2217
  ),
2190
- (onZoomOut || onZoomIn || onFitView) && /* @__PURE__ */ jsx19("div", { className: "graph-toolbar-separator" }),
2191
- onZoomOut && /* @__PURE__ */ jsx19(
2218
+ (onZoomOut || onZoomIn || onFitView) && /* @__PURE__ */ jsx20("div", { className: "graph-toolbar-separator" }),
2219
+ onZoomOut && /* @__PURE__ */ jsx20(
2192
2220
  "button",
2193
2221
  {
2194
2222
  type: "button",
@@ -2199,7 +2227,7 @@ function GraphToolbar({
2199
2227
  children: MINUS_ICON
2200
2228
  }
2201
2229
  ),
2202
- onZoomIn && /* @__PURE__ */ jsx19(
2230
+ onZoomIn && /* @__PURE__ */ jsx20(
2203
2231
  "button",
2204
2232
  {
2205
2233
  type: "button",
@@ -2210,7 +2238,7 @@ function GraphToolbar({
2210
2238
  children: PLUS_ICON
2211
2239
  }
2212
2240
  ),
2213
- onFitView && /* @__PURE__ */ jsx19(
2241
+ onFitView && /* @__PURE__ */ jsx20(
2214
2242
  "button",
2215
2243
  {
2216
2244
  type: "button",
@@ -2221,9 +2249,9 @@ function GraphToolbar({
2221
2249
  children: FIT_VIEW_ICON
2222
2250
  }
2223
2251
  ),
2224
- themeToggleEnabled && /* @__PURE__ */ jsxs19(Fragment12, { children: [
2225
- /* @__PURE__ */ jsx19("div", { className: "graph-toolbar-separator" }),
2226
- /* @__PURE__ */ jsx19(
2252
+ themeToggleEnabled && /* @__PURE__ */ jsxs20(Fragment12, { children: [
2253
+ /* @__PURE__ */ jsx20("div", { className: "graph-toolbar-separator" }),
2254
+ /* @__PURE__ */ jsx20(
2227
2255
  "button",
2228
2256
  {
2229
2257
  type: "button",
@@ -2239,7 +2267,7 @@ function GraphToolbar({
2239
2267
  }
2240
2268
 
2241
2269
  // src/graph/react/nodes/NodeValidationBadge.tsx
2242
- import { jsx as jsx20 } from "react/jsx-runtime";
2270
+ import { jsx as jsx21 } from "react/jsx-runtime";
2243
2271
  function NodeValidationBadge({
2244
2272
  validation,
2245
2273
  onClick
@@ -2249,9 +2277,9 @@ function NodeValidationBadge({
2249
2277
  const className = `node-validation-badge node-validation-badge--${validation.severity}`;
2250
2278
  const text = validation.count > 99 ? "99+" : String(validation.count);
2251
2279
  if (!onClick) {
2252
- return /* @__PURE__ */ jsx20("span", { className, title: tooltip, "aria-label": label, children: text });
2280
+ return /* @__PURE__ */ jsx21("span", { className, title: tooltip, "aria-label": label, children: text });
2253
2281
  }
2254
- return /* @__PURE__ */ jsx20(
2282
+ return /* @__PURE__ */ jsx21(
2255
2283
  "button",
2256
2284
  {
2257
2285
  type: "button",
@@ -2271,7 +2299,7 @@ function validationRingClass(validation) {
2271
2299
  }
2272
2300
 
2273
2301
  // src/graph/react/nodes/controller/ControllerGroupNode.tsx
2274
- import { jsx as jsx21, jsxs as jsxs20 } from "react/jsx-runtime";
2302
+ import { jsx as jsx22, jsxs as jsxs21 } from "react/jsx-runtime";
2275
2303
  var CONTROLLER_CONFIG = {
2276
2304
  PipeSequence: { badge: "Sequence", icon: "\u2192" },
2277
2305
  PipeParallel: { badge: "Parallel", icon: "//" },
@@ -2293,12 +2321,12 @@ function ControllerGroupNode({ data }) {
2293
2321
  const modifier = getControllerModifier(data.pipeType);
2294
2322
  const isCollapsible = (data.pipeType === "PipeParallel" || data.pipeType === "PipeBatch") && ((_a = data.childCount) != null ? _a : 0) > MAX_VISIBLE_CONTROLLER_CHILDREN;
2295
2323
  const hiddenCount = isCollapsible ? ((_b = data.childCount) != null ? _b : 0) - MAX_VISIBLE_CONTROLLER_CHILDREN : 0;
2296
- return /* @__PURE__ */ jsxs20("div", { className: `controller-group-node ${modifier}${validationRingClass(data.validation)}`, children: [
2297
- /* @__PURE__ */ jsxs20("div", { className: "controller-group-header", children: [
2298
- /* @__PURE__ */ jsx21("span", { className: "controller-group-icon", children: config.icon }),
2299
- /* @__PURE__ */ jsx21("span", { className: "controller-group-badge", children: config.badge }),
2300
- data.label && /* @__PURE__ */ jsx21("span", { className: "controller-group-label", children: data.label }),
2301
- data.onToggleFold && /* @__PURE__ */ jsx21(
2324
+ return /* @__PURE__ */ jsxs21("div", { className: `controller-group-node ${modifier}${validationRingClass(data.validation)}`, children: [
2325
+ /* @__PURE__ */ jsxs21("div", { className: "controller-group-header", children: [
2326
+ /* @__PURE__ */ jsx22("span", { className: "controller-group-icon", children: config.icon }),
2327
+ /* @__PURE__ */ jsx22("span", { className: "controller-group-badge", children: config.badge }),
2328
+ data.label && /* @__PURE__ */ jsx22("span", { className: "controller-group-label", children: data.label }),
2329
+ data.onToggleFold && /* @__PURE__ */ jsx22(
2302
2330
  "button",
2303
2331
  {
2304
2332
  type: "button",
@@ -2313,9 +2341,9 @@ function ControllerGroupNode({ data }) {
2313
2341
  children: "\u2921"
2314
2342
  }
2315
2343
  ),
2316
- data.validation && /* @__PURE__ */ jsx21(NodeValidationBadge, { validation: data.validation, onClick: data.onValidationBadgeClick })
2344
+ data.validation && /* @__PURE__ */ jsx22(NodeValidationBadge, { validation: data.validation, onClick: data.onValidationBadgeClick })
2317
2345
  ] }),
2318
- isCollapsible && /* @__PURE__ */ jsx21(
2346
+ isCollapsible && /* @__PURE__ */ jsx22(
2319
2347
  "button",
2320
2348
  {
2321
2349
  className: "controller-group-collapse",
@@ -2336,7 +2364,7 @@ import { Handle, Position } from "@xyflow/react";
2336
2364
 
2337
2365
  // src/graph/react/nodes/pipe/PipeCardBase.tsx
2338
2366
  import { useState as useState2 } from "react";
2339
- import { jsx as jsx22, jsxs as jsxs21 } from "react/jsx-runtime";
2367
+ import { jsx as jsx23, jsxs as jsxs22 } from "react/jsx-runtime";
2340
2368
  var PIPE_TYPE_BADGES2 = {
2341
2369
  PipeLLM: "LLM",
2342
2370
  PipeExtract: "Extract",
@@ -2345,11 +2373,14 @@ var PIPE_TYPE_BADGES2 = {
2345
2373
  PipeSearch: "Search",
2346
2374
  PipeFunc: "Func",
2347
2375
  PipeStructure: "Structure",
2376
+ PipeJudge: "Judge",
2377
+ PipeDocGen: "DocGen",
2348
2378
  PipeSignature: "Signature",
2349
2379
  PipeSequence: "Sequence",
2350
2380
  PipeParallel: "Parallel",
2351
2381
  PipeCondition: "Condition",
2352
- PipeBatch: "Batch"
2382
+ PipeBatch: "Batch",
2383
+ BindingStep: "Binding"
2353
2384
  };
2354
2385
  var CONTROLLER_TYPE_TABLE = {
2355
2386
  PipeSequence: true,
@@ -2379,6 +2410,7 @@ function PipeCardBase({ data, children }) {
2379
2410
  const isRunning = data.status === "running";
2380
2411
  const isController = isControllerType(data.pipeType);
2381
2412
  const isSignature = data.pipeType === "PipeSignature";
2413
+ const isBinding = data.pipeType === BINDING_STEP_TYPE;
2382
2414
  const isStatic = data.graphMode === "static";
2383
2415
  const outcome = isStatic ? (_a = data.tags) == null ? void 0 : _a.outcome : void 0;
2384
2416
  const batchMultiplicity = isStatic ? (_b = data.tags) == null ? void 0 : _b.batch_multiplicity : void 0;
@@ -2389,24 +2421,25 @@ function PipeCardBase({ data, children }) {
2389
2421
  const dirClass = data.direction === "TB" ? "pipe-card--tb" : "pipe-card--lr";
2390
2422
  const controllerClass = isController ? " pipe-card--controller" : "";
2391
2423
  const signatureClass = isSignature ? " pipe-card--signature" : "";
2424
+ const bindingClass = isBinding ? " pipe-card--binding" : "";
2392
2425
  const staticClass = isStatic ? " pipe-card--static" : "";
2393
- const badgeClass = isController ? "pipe-card-badge pipe-card-badge--controller" : isSignature ? "pipe-card-badge pipe-card-badge--signature" : "pipe-card-badge";
2426
+ 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";
2394
2427
  const ringClass = validationRingClass(data.validation);
2395
- return /* @__PURE__ */ jsxs21(
2428
+ return /* @__PURE__ */ jsxs22(
2396
2429
  "div",
2397
2430
  {
2398
- className: `pipe-card ${dirClass}${controllerClass}${signatureClass}${staticClass}${ringClass}`,
2431
+ className: `pipe-card ${dirClass}${controllerClass}${signatureClass}${bindingClass}${staticClass}${ringClass}`,
2399
2432
  children: [
2400
- /* @__PURE__ */ jsxs21("div", { className: "pipe-card-header", children: [
2401
- /* @__PURE__ */ jsx22("span", { className: badgeClass, children: badge }),
2402
- /* @__PURE__ */ jsx22("span", { className: "pipe-card-code", title: data.pipeCode, children: data.pipeCode }),
2403
- !isStatic && /* @__PURE__ */ jsx22(
2433
+ /* @__PURE__ */ jsxs22("div", { className: "pipe-card-header", children: [
2434
+ /* @__PURE__ */ jsx23("span", { className: badgeClass, children: badge }),
2435
+ /* @__PURE__ */ jsx23("span", { className: "pipe-card-code", title: data.pipeCode, children: data.pipeCode }),
2436
+ !isStatic && /* @__PURE__ */ jsx23(
2404
2437
  "span",
2405
2438
  {
2406
2439
  className: "pipe-card-status",
2407
2440
  style: { color: statusConfig.color },
2408
2441
  title: statusConfig.label,
2409
- children: /* @__PURE__ */ jsx22(
2442
+ children: /* @__PURE__ */ jsx23(
2410
2443
  "span",
2411
2444
  {
2412
2445
  className: `pipe-card-status-dot ${isRunning ? "pipe-card-status-dot--pulse" : ""}`,
@@ -2415,7 +2448,7 @@ function PipeCardBase({ data, children }) {
2415
2448
  )
2416
2449
  }
2417
2450
  ),
2418
- data.onExpand && /* @__PURE__ */ jsx22(
2451
+ data.onExpand && /* @__PURE__ */ jsx23(
2419
2452
  "button",
2420
2453
  {
2421
2454
  type: "button",
@@ -2430,32 +2463,32 @@ function PipeCardBase({ data, children }) {
2430
2463
  children: "\u2922"
2431
2464
  }
2432
2465
  ),
2433
- data.validation && /* @__PURE__ */ jsx22(NodeValidationBadge, { validation: data.validation, onClick: data.onValidationBadgeClick })
2466
+ data.validation && /* @__PURE__ */ jsx23(NodeValidationBadge, { validation: data.validation, onClick: data.onValidationBadgeClick })
2434
2467
  ] }),
2435
- (outcome || batchMultiplicity) && /* @__PURE__ */ jsxs21("div", { className: "pipe-card-annotations", children: [
2436
- outcome && /* @__PURE__ */ jsxs21("span", { className: "pipe-card-annotation pipe-card-annotation--outcome", children: [
2468
+ (outcome || batchMultiplicity) && /* @__PURE__ */ jsxs22("div", { className: "pipe-card-annotations", children: [
2469
+ outcome && /* @__PURE__ */ jsxs22("span", { className: "pipe-card-annotation pipe-card-annotation--outcome", children: [
2437
2470
  "outcome: ",
2438
2471
  outcome
2439
2472
  ] }),
2440
- batchMultiplicity && /* @__PURE__ */ jsx22("span", { className: "pipe-card-annotation pipe-card-annotation--batch", children: batchMultiplicity })
2473
+ batchMultiplicity && /* @__PURE__ */ jsx23("span", { className: "pipe-card-annotation pipe-card-annotation--batch", children: batchMultiplicity })
2441
2474
  ] }),
2442
- data.description && /* @__PURE__ */ jsx22("span", { className: "pipe-card-description", title: data.description, children: data.description }),
2443
- data.inputs.length > 0 && /* @__PURE__ */ jsxs21("div", { className: "pipe-card-io", children: [
2444
- /* @__PURE__ */ jsx22("span", { className: "pipe-card-io-label", children: "INPUTS" }),
2445
- /* @__PURE__ */ jsxs21("div", { className: "pipe-card-io-pills", children: [
2446
- visibleInputs.map((input) => /* @__PURE__ */ jsxs21(
2475
+ data.description && /* @__PURE__ */ jsx23("span", { className: "pipe-card-description", title: data.description, children: data.description }),
2476
+ data.inputs.length > 0 && /* @__PURE__ */ jsxs22("div", { className: "pipe-card-io", children: [
2477
+ /* @__PURE__ */ jsx23("span", { className: "pipe-card-io-label", children: "INPUTS" }),
2478
+ /* @__PURE__ */ jsxs22("div", { className: "pipe-card-io-pills", children: [
2479
+ visibleInputs.map((input) => /* @__PURE__ */ jsxs22(
2447
2480
  "span",
2448
2481
  {
2449
2482
  className: "pipe-card-io-pill",
2450
2483
  title: `${input.name}: ${input.concept}`,
2451
2484
  children: [
2452
- /* @__PURE__ */ jsx22("span", { className: "pipe-card-io-pill-name", children: input.name }),
2453
- /* @__PURE__ */ jsx22("span", { className: "pipe-card-io-pill-concept", children: input.concept })
2485
+ /* @__PURE__ */ jsx23("span", { className: "pipe-card-io-pill-name", children: input.name }),
2486
+ /* @__PURE__ */ jsx23("span", { className: "pipe-card-io-pill-concept", children: input.concept })
2454
2487
  ]
2455
2488
  },
2456
2489
  input.name
2457
2490
  )),
2458
- hasMany && /* @__PURE__ */ jsx22(
2491
+ hasMany && /* @__PURE__ */ jsx23(
2459
2492
  "button",
2460
2493
  {
2461
2494
  className: "pipe-card-io-more",
@@ -2468,16 +2501,16 @@ function PipeCardBase({ data, children }) {
2468
2501
  )
2469
2502
  ] })
2470
2503
  ] }),
2471
- data.outputs.length > 0 && /* @__PURE__ */ jsxs21("div", { className: "pipe-card-io", children: [
2472
- /* @__PURE__ */ jsx22("span", { className: "pipe-card-io-label", children: "OUTPUT" }),
2473
- /* @__PURE__ */ jsx22("div", { className: "pipe-card-io-pills", children: data.outputs.map((output) => /* @__PURE__ */ jsxs21(
2504
+ data.outputs.length > 0 && /* @__PURE__ */ jsxs22("div", { className: "pipe-card-io", children: [
2505
+ /* @__PURE__ */ jsx23("span", { className: "pipe-card-io-label", children: "OUTPUT" }),
2506
+ /* @__PURE__ */ jsx23("div", { className: "pipe-card-io-pills", children: data.outputs.map((output) => /* @__PURE__ */ jsxs22(
2474
2507
  "span",
2475
2508
  {
2476
2509
  className: "pipe-card-io-pill",
2477
2510
  title: `${output.name}: ${output.concept}`,
2478
2511
  children: [
2479
- /* @__PURE__ */ jsx22("span", { className: "pipe-card-io-pill-name", children: output.name }),
2480
- /* @__PURE__ */ jsx22("span", { className: "pipe-card-io-pill-concept", children: output.concept })
2512
+ /* @__PURE__ */ jsx23("span", { className: "pipe-card-io-pill-name", children: output.name }),
2513
+ /* @__PURE__ */ jsx23("span", { className: "pipe-card-io-pill-concept", children: output.concept })
2481
2514
  ]
2482
2515
  },
2483
2516
  output.name
@@ -2498,22 +2531,25 @@ var PIPE_CARD_REGISTRY = {
2498
2531
  PipeSearch: PipeCardBase,
2499
2532
  PipeFunc: PipeCardBase,
2500
2533
  PipeStructure: PipeCardBase,
2534
+ PipeJudge: PipeCardBase,
2535
+ PipeDocGen: PipeCardBase,
2501
2536
  PipeSignature: PipeCardBase,
2502
2537
  PipeSequence: PipeCardBase,
2503
2538
  PipeParallel: PipeCardBase,
2504
2539
  PipeCondition: PipeCardBase,
2505
- PipeBatch: PipeCardBase
2540
+ PipeBatch: PipeCardBase,
2541
+ BindingStep: PipeCardBase
2506
2542
  };
2507
2543
  function getPipeCardComponent(pipeType) {
2508
2544
  return PIPE_CARD_REGISTRY[pipeType];
2509
2545
  }
2510
2546
 
2511
2547
  // src/graph/react/nodes/pipe/PipeCardNode.tsx
2512
- import { Fragment as Fragment13, jsx as jsx23, jsxs as jsxs22 } from "react/jsx-runtime";
2548
+ import { Fragment as Fragment13, jsx as jsx24, jsxs as jsxs23 } from "react/jsx-runtime";
2513
2549
  function PipeCardNode({ data }) {
2514
2550
  var _a;
2515
2551
  const Card = (_a = getPipeCardComponent(data.pipeType)) != null ? _a : PipeCardBase;
2516
- return /* @__PURE__ */ jsx23(Card, { data });
2552
+ return /* @__PURE__ */ jsx24(Card, { data });
2517
2553
  }
2518
2554
  function PipeCardRFNode({
2519
2555
  data,
@@ -2522,15 +2558,15 @@ function PipeCardRFNode({
2522
2558
  }) {
2523
2559
  const payload = data.pipeCardData;
2524
2560
  if (!payload) return null;
2525
- return /* @__PURE__ */ jsxs22(Fragment13, { children: [
2526
- /* @__PURE__ */ jsx23(Handle, { type: "target", position: targetPosition }),
2527
- /* @__PURE__ */ jsx23(PipeCardNode, { data: payload }),
2528
- /* @__PURE__ */ jsx23(Handle, { type: "source", position: sourcePosition })
2561
+ return /* @__PURE__ */ jsxs23(Fragment13, { children: [
2562
+ /* @__PURE__ */ jsx24(Handle, { type: "target", position: targetPosition }),
2563
+ /* @__PURE__ */ jsx24(PipeCardNode, { data: payload }),
2564
+ /* @__PURE__ */ jsx24(Handle, { type: "source", position: sourcePosition })
2529
2565
  ] });
2530
2566
  }
2531
2567
 
2532
2568
  // src/graph/react/viewer/GraphViewer.tsx
2533
- import { Fragment as Fragment14, jsx as jsx24, jsxs as jsxs23 } from "react/jsx-runtime";
2569
+ import { Fragment as Fragment14, jsx as jsx25, jsxs as jsxs24 } from "react/jsx-runtime";
2534
2570
  var nodeTypes = __spreadProps(__spreadValues({}, controllerNodeTypes), {
2535
2571
  pipeCard: PipeCardRFNode
2536
2572
  });
@@ -2551,7 +2587,7 @@ function StuffNodeDetail({
2551
2587
  const conceptInfo = stuffData.concept && graphspec ? resolveConceptRef(graphspec, stuffData.concept) : void 0;
2552
2588
  const isDryRun = graphSpecMode(graphspec) === GRAPH_SPEC_MODE.DRY;
2553
2589
  const descriptors = resultDescriptors(artifacts);
2554
- const renderData = descriptors ? () => /* @__PURE__ */ jsx24(
2590
+ const renderData = descriptors ? () => /* @__PURE__ */ jsx25(
2555
2591
  StuffResultPanel,
2556
2592
  __spreadProps(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadProps(__spreadValues({}, descriptors), {
2557
2593
  stuff: stuffData
@@ -2560,7 +2596,7 @@ function StuffNodeDetail({
2560
2596
  })
2561
2597
  ) : void 0;
2562
2598
  if (conceptInfo) {
2563
- return /* @__PURE__ */ jsx24(
2599
+ return /* @__PURE__ */ jsx25(
2564
2600
  ConceptDetailPanel,
2565
2601
  {
2566
2602
  concept: conceptInfo,
@@ -2571,8 +2607,8 @@ function StuffNodeDetail({
2571
2607
  }
2572
2608
  );
2573
2609
  }
2574
- if (isDryRun) return /* @__PURE__ */ jsx24("div", { className: "detail-not-available", children: "Dry run data hidden" });
2575
- return /* @__PURE__ */ jsx24(Fragment14, { children: (_a = renderData == null ? void 0 : renderData()) != null ? _a : /* @__PURE__ */ jsx24("div", { className: "detail-not-available", children: "No data" }) });
2610
+ if (isDryRun) return /* @__PURE__ */ jsx25("div", { className: "detail-not-available", children: "Dry run data hidden" });
2611
+ return /* @__PURE__ */ jsx25(Fragment14, { children: (_a = renderData == null ? void 0 : renderData()) != null ? _a : /* @__PURE__ */ jsx25("div", { className: "detail-not-available", children: "No data" }) });
2576
2612
  }
2577
2613
  function seedFoldedControllers(mode, controllerIds) {
2578
2614
  if (mode === FOLD_MODE.FOLDED) return new Set(controllerIds);
@@ -2606,6 +2642,7 @@ function applyStatusOverrides(nodes, statusMap) {
2606
2642
  if (node.data.graphMode === "static" || ((_a = node.data.pipeCardData) == null ? void 0 : _a.graphMode) === "static") {
2607
2643
  return node;
2608
2644
  }
2645
+ if (node.data.pipeType === BINDING_STEP_TYPE) return node;
2609
2646
  const pipeCode = node.data.pipeCode;
2610
2647
  if (!pipeCode || !Object.hasOwn(statusMap, pipeCode)) return node;
2611
2648
  const newStatus = statusMap[pipeCode];
@@ -3138,7 +3175,7 @@ function GraphViewer(props) {
3138
3175
  var _a2;
3139
3176
  const nodeData = node.data;
3140
3177
  onNodeSelect == null ? void 0 : onNodeSelect(node.id, nodeData, event);
3141
- if (nodeData.isController || nodeData.isPipe) {
3178
+ if ((nodeData.isController || nodeData.isPipe) && nodeData.pipeType !== BINDING_STEP_TYPE) {
3142
3179
  const code = nodeData.pipeCode || nodeData.labelText;
3143
3180
  if (code && onNavigateToPipe) {
3144
3181
  onNavigateToPipe(code, (_a2 = nodeData.pipeCardData) == null ? void 0 : _a2.status);
@@ -3197,7 +3234,7 @@ function GraphViewer(props) {
3197
3234
  },
3198
3235
  [graphspec]
3199
3236
  );
3200
- const selectedSpecNode = (detailSelection == null ? void 0 : detailSelection.kind) === "pipe" && graphspec ? graphspec.nodes.find((n) => n.pipe_code === detailSelection.nodeData.pipeCode) : void 0;
3237
+ const selectedSpecNode = (detailSelection == null ? void 0 : detailSelection.kind) === "pipe" && graphspec ? graphspec.nodes.find((n) => n.id === detailSelection.nodeId) : void 0;
3201
3238
  const detailOpen = detailSelection !== null || conceptOverride !== null;
3202
3239
  const effectiveToolbarPosition = resolveToolbarPosition(
3203
3240
  toolbarPositionProp,
@@ -3221,13 +3258,13 @@ function GraphViewer(props) {
3221
3258
  expandAllDisabled: foldedControllers.size === 0
3222
3259
  };
3223
3260
  }, [showControllers, allControllerIds, foldedControllers]);
3224
- return /* @__PURE__ */ jsxs23(
3261
+ return /* @__PURE__ */ jsxs24(
3225
3262
  "div",
3226
3263
  {
3227
3264
  ref: containerRef,
3228
3265
  className: `react-flow-container react-flow-container--theme-${resolvedTheme} react-flow-container--mode-${mode}`,
3229
3266
  children: [
3230
- /* @__PURE__ */ jsxs23(
3267
+ /* @__PURE__ */ jsxs24(
3231
3268
  ReactFlow,
3232
3269
  {
3233
3270
  nodes,
@@ -3246,7 +3283,7 @@ function GraphViewer(props) {
3246
3283
  proOptions: { hideAttribution: true },
3247
3284
  panActivationKeyCode: null,
3248
3285
  children: [
3249
- /* @__PURE__ */ jsx24(
3286
+ /* @__PURE__ */ jsx25(
3250
3287
  Background,
3251
3288
  {
3252
3289
  variant: BackgroundVariant.Dots,
@@ -3255,7 +3292,7 @@ function GraphViewer(props) {
3255
3292
  color: "var(--color-bg-dots)"
3256
3293
  }
3257
3294
  ),
3258
- !hideToolbar && /* @__PURE__ */ jsx24(
3295
+ !hideToolbar && /* @__PURE__ */ jsx25(
3259
3296
  GraphToolbar,
3260
3297
  {
3261
3298
  direction,
@@ -3292,7 +3329,7 @@ function GraphViewer(props) {
3292
3329
  ]
3293
3330
  }
3294
3331
  ),
3295
- /* @__PURE__ */ jsxs23(
3332
+ /* @__PURE__ */ jsxs24(
3296
3333
  DetailPanel,
3297
3334
  {
3298
3335
  isOpen: detailOpen,
@@ -3301,14 +3338,14 @@ function GraphViewer(props) {
3301
3338
  isDragging: isPanelDragging,
3302
3339
  onResizeHandleMouseDown: onResizeMouseDown,
3303
3340
  children: [
3304
- conceptOverride ? /* @__PURE__ */ jsx24(ConceptDetailPanel, { concept: conceptOverride }) : selectedSpecNode && graphspec ? /* @__PURE__ */ jsx24(
3341
+ conceptOverride ? /* @__PURE__ */ jsx25(ConceptDetailPanel, { concept: conceptOverride }) : selectedSpecNode && graphspec ? /* @__PURE__ */ jsx25(
3305
3342
  PipeDetailPanel,
3306
3343
  {
3307
3344
  node: selectedSpecNode,
3308
3345
  spec: graphspec,
3309
3346
  onConceptClick: handleConceptClick
3310
3347
  }
3311
- ) : (detailSelection == null ? void 0 : detailSelection.stuffData) ? /* @__PURE__ */ jsx24(
3348
+ ) : (detailSelection == null ? void 0 : detailSelection.stuffData) ? /* @__PURE__ */ jsx25(
3312
3349
  StuffNodeDetail,
3313
3350
  {
3314
3351
  nodeId: detailSelection.nodeId,