@pipelex/mthds-ui 0.27.0 → 0.29.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.
@@ -14,15 +14,16 @@ import {
14
14
  resolveConceptRef,
15
15
  resolveIssueTargetNodeId,
16
16
  validateGraphSpec
17
- } from "../../chunk-K3BWHQVX.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-XBHDA3PQ.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-VCO4GZDZ.js";
45
+ } from "../../chunk-3I3ZPYMW.js";
43
46
  import {
44
47
  __spreadProps,
45
48
  __spreadValues
@@ -121,7 +124,7 @@ import {
121
124
  } from "@pipelex/mthds-form/react";
122
125
  import { jsx, jsxs } from "react/jsx-runtime";
123
126
  function StuffResultPanel({
124
- contracts,
127
+ pipeIoContracts,
125
128
  outputForm,
126
129
  inputForm,
127
130
  stuff,
@@ -135,9 +138,9 @@ function StuffResultPanel({
135
138
  const field = React2.useMemo(
136
139
  () => {
137
140
  var _a;
138
- return (_a = fromProducer(contracts, outputForm, producerPipeRef)) != null ? _a : fromConsumer(contracts, inputForm, consumer);
141
+ return (_a = fromProducer(pipeIoContracts, outputForm, producerPipeRef)) != null ? _a : fromConsumer(pipeIoContracts, inputForm, consumer);
139
142
  },
140
- [contracts, outputForm, inputForm, producerPipeRef, consumer]
143
+ [pipeIoContracts, outputForm, inputForm, producerPipeRef, consumer]
141
144
  );
142
145
  if (field) {
143
146
  const panel = /* @__PURE__ */ jsx(StuffViewer, { field, value: stuff.data, name: stuff.name });
@@ -186,6 +189,25 @@ function fromConsumer(contracts, inputForm, consumer) {
186
189
  return buildResultField({ field: node }, slot.json_schema);
187
190
  }
188
191
 
192
+ // src/graph/react/viewer/graphArtifacts.ts
193
+ function graphArtifactsFrom(source) {
194
+ var _a, _b, _c;
195
+ if (source.graph_spec === void 0 || source.graph_spec === null) return null;
196
+ return {
197
+ graphSpec: source.graph_spec,
198
+ pipeIoContracts: (_a = source.pipe_io_contracts) != null ? _a : null,
199
+ outputForm: (_b = source.output_form) != null ? _b : null,
200
+ inputForm: (_c = source.input_form) != null ? _c : null
201
+ };
202
+ }
203
+ function resultDescriptors(graph) {
204
+ const pipeIoContracts = graph == null ? void 0 : graph.pipeIoContracts;
205
+ const outputForm = graph == null ? void 0 : graph.outputForm;
206
+ if (!pipeIoContracts || !outputForm) return null;
207
+ const inputForm = graph == null ? void 0 : graph.inputForm;
208
+ return inputForm ? { pipeIoContracts, outputForm, inputForm } : { pipeIoContracts, outputForm };
209
+ }
210
+
189
211
  // src/graph/react/detail/DetailPanel.tsx
190
212
  import React3 from "react";
191
213
  import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
@@ -993,7 +1015,13 @@ function PipeSequenceSection({
993
1015
  /* @__PURE__ */ jsx12("div", { className: "detail-section-label", children: "Steps" }),
994
1016
  /* @__PURE__ */ jsx12("div", { className: "detail-steps-list", children: blueprint.sequential_sub_pipes.map((step, idx) => /* @__PURE__ */ jsxs12("div", { className: "detail-step-item", children: [
995
1017
  /* @__PURE__ */ jsx12("span", { className: "detail-step-index", children: idx + 1 }),
996
- /* @__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 }),
997
1025
  step.output_name && /* @__PURE__ */ jsxs12("span", { className: "detail-io-concept", children: [
998
1026
  "-> ",
999
1027
  step.output_name
@@ -1038,6 +1066,20 @@ function PipeBatchSection({
1038
1066
  ] });
1039
1067
  }
1040
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
+
1041
1083
  // src/graph/react/detail/sections/executionData.ts
1042
1084
  var MERGED_EXECUTION_DATA_TYPES = /* @__PURE__ */ new Set([
1043
1085
  "PipeLLM",
@@ -1057,7 +1099,7 @@ function shouldDumpExecutionData(pipeType, hasBlueprint) {
1057
1099
  }
1058
1100
 
1059
1101
  // src/graph/react/detail/PipeDetailPanel.tsx
1060
- 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";
1061
1103
  var PIPE_TYPE_BADGES = {
1062
1104
  PipeLLM: "LLM",
1063
1105
  PipeExtract: "Extract",
@@ -1066,11 +1108,14 @@ var PIPE_TYPE_BADGES = {
1066
1108
  PipeSearch: "Search",
1067
1109
  PipeFunc: "Func",
1068
1110
  PipeStructure: "Structure",
1111
+ PipeJudge: "Judge",
1112
+ PipeDocGen: "DocGen",
1069
1113
  PipeSignature: "Signature",
1070
1114
  PipeSequence: "Seq",
1071
1115
  PipeParallel: "Par",
1072
1116
  PipeCondition: "Cond",
1073
- PipeBatch: "Batch"
1117
+ PipeBatch: "Batch",
1118
+ BindingStep: "Binding"
1074
1119
  };
1075
1120
  var CONTROLLER_TYPES = /* @__PURE__ */ new Set([
1076
1121
  "PipeSequence",
@@ -1090,6 +1135,7 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1090
1135
  var _a, _b, _c, _d, _e, _f, _g, _h;
1091
1136
  const pipeType = node.pipe_type;
1092
1137
  const isController = CONTROLLER_TYPES.has(pipeType);
1138
+ const isBinding = isBindingNode(node);
1093
1139
  const isStatic = isStaticGraphSpec(spec);
1094
1140
  const showsGeneratedData = !isStatic && !isDryGraphSpec(spec);
1095
1141
  const badge = PIPE_TYPE_BADGES[pipeType];
@@ -1097,7 +1143,7 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1097
1143
  const statusColor = (_a = STATUS_COLORS[status]) != null ? _a : "#6272a4";
1098
1144
  const blueprint = React6.useMemo(() => {
1099
1145
  var _a2, _b2;
1100
- if (!node.pipe_code || !spec.pipe_registry) return void 0;
1146
+ if (isBinding || !node.pipe_code || !spec.pipe_registry) return void 0;
1101
1147
  const directKey = `${(_b2 = (_a2 = spec.pipeline_ref) == null ? void 0 : _a2.domain) != null ? _b2 : ""}.${node.pipe_code}`;
1102
1148
  const direct = getPipeBlueprint(spec, directKey);
1103
1149
  if (direct) return direct;
@@ -1105,22 +1151,22 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1105
1151
  if (ref.endsWith(`.${node.pipe_code}`)) return pipe;
1106
1152
  }
1107
1153
  return void 0;
1108
- }, [node.pipe_code, spec]);
1154
+ }, [isBinding, node.pipe_code, spec]);
1109
1155
  const [usageExpanded, setUsageExpanded] = React6.useState(false);
1110
1156
  const inputs = (_c = (_b = node.io) == null ? void 0 : _b.inputs) != null ? _c : [];
1111
1157
  const outputs = (_e = (_d = node.io) == null ? void 0 : _d.outputs) != null ? _e : [];
1112
1158
  const description = (_f = blueprint == null ? void 0 : blueprint.description) != null ? _f : node.description;
1113
- return /* @__PURE__ */ jsxs15(Fragment10, { children: [
1114
- /* @__PURE__ */ jsxs15("div", { className: "detail-sticky-header", children: [
1115
- /* @__PURE__ */ jsxs15("div", { className: "detail-header", children: [
1116
- /* @__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(
1117
1163
  "span",
1118
1164
  {
1119
1165
  className: `detail-badge ${isController ? "detail-badge--controller" : "detail-badge--operator"}`,
1120
1166
  children: badge
1121
1167
  }
1122
1168
  ),
1123
- /* @__PURE__ */ jsx15(
1169
+ /* @__PURE__ */ jsx16(
1124
1170
  "span",
1125
1171
  {
1126
1172
  className: `detail-pipe-code ${isController ? "detail-pipe-code--controller" : ""}`,
@@ -1128,11 +1174,11 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1128
1174
  }
1129
1175
  )
1130
1176
  ] }),
1131
- !isStatic && /* @__PURE__ */ jsxs15("div", { className: "detail-status", children: [
1132
- /* @__PURE__ */ jsx15("span", { className: "detail-status-dot", style: { background: statusColor } }),
1133
- /* @__PURE__ */ jsx15("span", { className: "detail-status-label", style: { color: statusColor }, children: status }),
1134
- ((_g = node.timing) == null ? void 0 : _g.duration) != null && /* @__PURE__ */ jsx15("span", { className: "detail-duration", children: formatDuration(node.timing.duration) }),
1135
- 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(
1136
1182
  UsageCostInline,
1137
1183
  {
1138
1184
  usage: node.usage,
@@ -1142,43 +1188,44 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1142
1188
  }
1143
1189
  )
1144
1190
  ] }),
1145
- showsGeneratedData && node.usage && usageExpanded && /* @__PURE__ */ jsx15(UsageDetails, { usage: node.usage, isController }),
1146
- description && /* @__PURE__ */ jsx15("div", { className: "detail-description", children: description }),
1147
- inputs.length > 0 && /* @__PURE__ */ jsxs15("div", { children: [
1148
- /* @__PURE__ */ jsx15("div", { className: "detail-section-label", children: "Inputs" }),
1149
- /* @__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(
1150
1196
  "div",
1151
1197
  {
1152
1198
  className: "detail-io-pill",
1153
1199
  style: { cursor: input.concept && onConceptClick ? "pointer" : void 0 },
1154
1200
  onClick: () => input.concept && (onConceptClick == null ? void 0 : onConceptClick(input.concept)),
1155
1201
  children: [
1156
- /* @__PURE__ */ jsx15("span", { className: "detail-io-name", children: input.name }),
1157
- 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) })
1158
1204
  ]
1159
1205
  },
1160
1206
  idx
1161
1207
  )) })
1162
1208
  ] }),
1163
- outputs.length > 0 && /* @__PURE__ */ jsxs15("div", { children: [
1164
- /* @__PURE__ */ jsx15("div", { className: "detail-section-label", children: "Output" }),
1165
- /* @__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(
1166
1212
  "div",
1167
1213
  {
1168
1214
  className: "detail-io-pill",
1169
1215
  style: { cursor: output.concept && onConceptClick ? "pointer" : void 0 },
1170
1216
  onClick: () => output.concept && (onConceptClick == null ? void 0 : onConceptClick(output.concept)),
1171
1217
  children: [
1172
- /* @__PURE__ */ jsx15("span", { className: "detail-io-name", children: output.name }),
1173
- 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) })
1174
1220
  ]
1175
1221
  },
1176
1222
  idx
1177
1223
  )) })
1178
1224
  ] }),
1179
- (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" } })
1180
1226
  ] }),
1181
- blueprint && /* @__PURE__ */ jsx15(
1227
+ isBinding && /* @__PURE__ */ jsx16(BindingStepSection, { node }),
1228
+ blueprint && /* @__PURE__ */ jsx16(
1182
1229
  BlueprintSection,
1183
1230
  {
1184
1231
  blueprint,
@@ -1187,7 +1234,7 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1187
1234
  modelHandles: node.execution_data
1188
1235
  }
1189
1236
  ),
1190
- 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(
1191
1238
  ExecutionDataSection,
1192
1239
  {
1193
1240
  executionData: node.execution_data,
@@ -1195,14 +1242,14 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1195
1242
  hasBlueprint: !!blueprint
1196
1243
  }
1197
1244
  ),
1198
- node.error && /* @__PURE__ */ jsxs15("div", { className: "detail-error", children: [
1199
- /* @__PURE__ */ jsx15("div", { className: "detail-error-type", children: node.error.error_type }),
1200
- /* @__PURE__ */ jsx15("div", { className: "detail-error-message", children: node.error.message }),
1201
- 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 })
1202
1249
  ] }),
1203
- showsGeneratedData && node.metrics && Object.keys(node.metrics).length > 0 && /* @__PURE__ */ jsxs15("div", { children: [
1204
- /* @__PURE__ */ jsx15("div", { className: "detail-section-label", children: "Metrics" }),
1205
- 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(
1206
1253
  KV,
1207
1254
  {
1208
1255
  label: key,
@@ -1211,17 +1258,17 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1211
1258
  key
1212
1259
  ))
1213
1260
  ] }),
1214
- node.tags && Object.keys(node.tags).length > 0 && /* @__PURE__ */ jsxs15("div", { children: [
1215
- /* @__PURE__ */ jsx15("div", { className: "detail-section-label", children: "Tags" }),
1216
- /* @__PURE__ */ jsx15("div", { className: "detail-tags", children: Object.entries(node.tags).map(([key, value]) => /* @__PURE__ */ jsxs15("span", { className: "detail-tag", children: [
1217
- /* @__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: [
1218
1265
  key,
1219
1266
  ": "
1220
1267
  ] }),
1221
- /* @__PURE__ */ jsx15("span", { className: "detail-tag-value", children: value })
1268
+ /* @__PURE__ */ jsx16("span", { className: "detail-tag-value", children: value })
1222
1269
  ] }, key)) })
1223
1270
  ] }),
1224
- !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" })
1225
1272
  ] });
1226
1273
  }
1227
1274
  function BlueprintSection({
@@ -1232,7 +1279,7 @@ function BlueprintSection({
1232
1279
  }) {
1233
1280
  switch (blueprint.type) {
1234
1281
  case "PipeLLM":
1235
- return /* @__PURE__ */ jsx15(
1282
+ return /* @__PURE__ */ jsx16(
1236
1283
  PipeLLMSection,
1237
1284
  {
1238
1285
  blueprint,
@@ -1242,7 +1289,7 @@ function BlueprintSection({
1242
1289
  }
1243
1290
  );
1244
1291
  case "PipeImgGen":
1245
- return /* @__PURE__ */ jsx15(
1292
+ return /* @__PURE__ */ jsx16(
1246
1293
  PipeImgGenSection,
1247
1294
  {
1248
1295
  blueprint,
@@ -1252,9 +1299,9 @@ function BlueprintSection({
1252
1299
  }
1253
1300
  );
1254
1301
  case "PipeCompose":
1255
- return /* @__PURE__ */ jsx15(PipeComposeSection, { blueprint, executionData });
1302
+ return /* @__PURE__ */ jsx16(PipeComposeSection, { blueprint, executionData });
1256
1303
  case "PipeExtract":
1257
- return /* @__PURE__ */ jsx15(
1304
+ return /* @__PURE__ */ jsx16(
1258
1305
  PipeExtractSection,
1259
1306
  {
1260
1307
  blueprint,
@@ -1263,7 +1310,7 @@ function BlueprintSection({
1263
1310
  }
1264
1311
  );
1265
1312
  case "PipeSearch":
1266
- return /* @__PURE__ */ jsx15(
1313
+ return /* @__PURE__ */ jsx16(
1267
1314
  PipeSearchSection,
1268
1315
  {
1269
1316
  blueprint,
@@ -1273,7 +1320,7 @@ function BlueprintSection({
1273
1320
  }
1274
1321
  );
1275
1322
  case "PipeStructure":
1276
- return /* @__PURE__ */ jsx15(
1323
+ return /* @__PURE__ */ jsx16(
1277
1324
  PipeStructureSection,
1278
1325
  {
1279
1326
  blueprint,
@@ -1283,17 +1330,17 @@ function BlueprintSection({
1283
1330
  }
1284
1331
  );
1285
1332
  case "PipeSequence":
1286
- return /* @__PURE__ */ jsx15(PipeSequenceSection, { blueprint, executionData });
1333
+ return /* @__PURE__ */ jsx16(PipeSequenceSection, { blueprint, executionData });
1287
1334
  case "PipeParallel":
1288
- return /* @__PURE__ */ jsx15(PipeParallelSection, { blueprint, executionData });
1335
+ return /* @__PURE__ */ jsx16(PipeParallelSection, { blueprint, executionData });
1289
1336
  case "PipeCondition":
1290
- return /* @__PURE__ */ jsx15(PipeConditionSection, { blueprint, executionData });
1337
+ return /* @__PURE__ */ jsx16(PipeConditionSection, { blueprint, executionData });
1291
1338
  case "PipeBatch":
1292
- return /* @__PURE__ */ jsx15(PipeBatchSection, { blueprint, executionData });
1339
+ return /* @__PURE__ */ jsx16(PipeBatchSection, { blueprint, executionData });
1293
1340
  case "PipeFunc":
1294
1341
  return null;
1295
1342
  case "PipeSignature":
1296
- 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." });
1297
1344
  default:
1298
1345
  return null;
1299
1346
  }
@@ -1304,20 +1351,20 @@ function ExecutionDataSection({
1304
1351
  hasBlueprint
1305
1352
  }) {
1306
1353
  if (!shouldDumpExecutionData(pipeType, hasBlueprint)) return null;
1307
- return /* @__PURE__ */ jsx15(GenericExecutionData, { data: executionData });
1354
+ return /* @__PURE__ */ jsx16(GenericExecutionData, { data: executionData });
1308
1355
  }
1309
1356
  function GenericExecutionData({ data }) {
1310
1357
  const entries = Object.entries(data);
1311
1358
  if (entries.length === 0) return null;
1312
- return /* @__PURE__ */ jsxs15(Fragment10, { children: [
1313
- /* @__PURE__ */ jsx15("div", { className: "detail-section-label", children: "Execution" }),
1314
- 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))
1315
1362
  ] });
1316
1363
  }
1317
1364
 
1318
1365
  // src/graph/react/detail/ConceptDetailPanel.tsx
1319
1366
  import React7 from "react";
1320
- 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";
1321
1368
  function ConceptDetailPanel({
1322
1369
  concept,
1323
1370
  ioData,
@@ -1327,18 +1374,18 @@ function ConceptDetailPanel({
1327
1374
  }) {
1328
1375
  var _a;
1329
1376
  const multiplicity = ioData == null ? void 0 : ioData.multiplicity;
1330
- return /* @__PURE__ */ jsxs16(Fragment11, { children: [
1331
- /* @__PURE__ */ jsxs16("div", { className: "detail-header", children: [
1332
- /* @__PURE__ */ jsx16("span", { className: "detail-concept-code", children: concept.code + multiplicitySuffix(multiplicity) }),
1333
- /* @__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 })
1334
1381
  ] }),
1335
- 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` }),
1336
- concept.description && /* @__PURE__ */ jsx16("div", { className: "detail-description", children: concept.description }),
1337
- 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: [
1338
1385
  "refines ",
1339
- /* @__PURE__ */ jsx16("span", { className: "detail-refines-code", children: concept.refines })
1386
+ /* @__PURE__ */ jsx17("span", { className: "detail-refines-code", children: concept.refines })
1340
1387
  ] }),
1341
- /* @__PURE__ */ jsx16(
1388
+ /* @__PURE__ */ jsx17(
1342
1389
  ConceptBody,
1343
1390
  {
1344
1391
  concept,
@@ -1357,10 +1404,10 @@ function ConceptBody({ concept, ioData, isDryRun, renderData }) {
1357
1404
  const baseId = React7.useId();
1358
1405
  const tabId = (tab) => `${baseId}-tab-${tab}`;
1359
1406
  const panelId = (tab) => `${baseId}-tabpanel-${tab}`;
1360
- const structure = concept.json_schema ? /* @__PURE__ */ jsxs16("div", { children: [
1361
- /* @__PURE__ */ jsx16("div", { className: "detail-section-label", children: "Structure" }),
1362
- /* @__PURE__ */ jsx16(SchemaTable, { schema: concept.json_schema })
1363
- ] }) : /* @__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" });
1364
1411
  if (!hasData) return structure;
1365
1412
  const onTabKeyDown = (event) => {
1366
1413
  var _a;
@@ -1383,7 +1430,7 @@ function ConceptBody({ concept, ioData, isDryRun, renderData }) {
1383
1430
  setActiveTab(next);
1384
1431
  (_a = document.getElementById(tabId(next))) == null ? void 0 : _a.focus();
1385
1432
  };
1386
- const renderTab = (tab, label) => /* @__PURE__ */ jsx16(
1433
+ const renderTab = (tab, label) => /* @__PURE__ */ jsx17(
1387
1434
  "button",
1388
1435
  {
1389
1436
  type: "button",
@@ -1398,12 +1445,12 @@ function ConceptBody({ concept, ioData, isDryRun, renderData }) {
1398
1445
  children: label
1399
1446
  }
1400
1447
  );
1401
- return /* @__PURE__ */ jsxs16(Fragment11, { children: [
1402
- /* @__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: [
1403
1450
  renderTab("data", "Data"),
1404
1451
  renderTab("structure", "Structure")
1405
1452
  ] }),
1406
- /* @__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 })
1407
1454
  ] });
1408
1455
  }
1409
1456
  function SchemaTable({ schema }) {
@@ -1411,23 +1458,23 @@ function SchemaTable({ schema }) {
1411
1458
  const properties = schema.properties;
1412
1459
  const required = new Set((_a = schema.required) != null ? _a : []);
1413
1460
  if (!properties || Object.keys(properties).length === 0) {
1414
- 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" });
1415
1462
  }
1416
1463
  const fields = Object.entries(properties);
1417
- return /* @__PURE__ */ jsxs16("table", { className: "detail-schema-table", children: [
1418
- /* @__PURE__ */ jsx16("thead", { children: /* @__PURE__ */ jsxs16("tr", { children: [
1419
- /* @__PURE__ */ jsx16("th", { children: "Field" }),
1420
- /* @__PURE__ */ jsx16("th", { children: "Type" }),
1421
- /* @__PURE__ */ jsx16("th", {}),
1422
- /* @__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" })
1423
1470
  ] }) }),
1424
- /* @__PURE__ */ jsx16("tbody", { children: fields.map(([fieldName, fieldSchema]) => {
1471
+ /* @__PURE__ */ jsx17("tbody", { children: fields.map(([fieldName, fieldSchema]) => {
1425
1472
  var _a2;
1426
- return /* @__PURE__ */ jsxs16("tr", { children: [
1427
- /* @__PURE__ */ jsx16("td", { className: "detail-schema-field", children: fieldName }),
1428
- /* @__PURE__ */ jsx16("td", { className: "detail-schema-type", children: extractType(fieldSchema) }),
1429
- /* @__PURE__ */ jsx16("td", { children: required.has(fieldName) && /* @__PURE__ */ jsx16("span", { className: "detail-schema-required", children: "req" }) }),
1430
- /* @__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 : "" })
1431
1478
  ] }, fieldName);
1432
1479
  }) })
1433
1480
  ] });
@@ -1478,10 +1525,10 @@ function toAppEdges(edges) {
1478
1525
  }
1479
1526
 
1480
1527
  // src/graph/react/viewer/renderLabel.tsx
1481
- import { jsx as jsx17, jsxs as jsxs17 } from "react/jsx-runtime";
1528
+ import { jsx as jsx18, jsxs as jsxs18 } from "react/jsx-runtime";
1482
1529
  function renderLabel(desc) {
1483
1530
  if (desc.kind === "pipe") {
1484
- return /* @__PURE__ */ jsx17(
1531
+ return /* @__PURE__ */ jsx18(
1485
1532
  "div",
1486
1533
  {
1487
1534
  style: {
@@ -1495,7 +1542,7 @@ function renderLabel(desc) {
1495
1542
  minWidth: 0
1496
1543
  },
1497
1544
  title: desc.label,
1498
- children: /* @__PURE__ */ jsx17(
1545
+ children: /* @__PURE__ */ jsx18(
1499
1546
  "span",
1500
1547
  {
1501
1548
  style: {
@@ -1514,7 +1561,7 @@ function renderLabel(desc) {
1514
1561
  }
1515
1562
  );
1516
1563
  }
1517
- return /* @__PURE__ */ jsxs17(
1564
+ return /* @__PURE__ */ jsxs18(
1518
1565
  "div",
1519
1566
  {
1520
1567
  style: {
@@ -1530,7 +1577,7 @@ function renderLabel(desc) {
1530
1577
  },
1531
1578
  title: desc.concept ? `${desc.label}: ${desc.concept}` : desc.label,
1532
1579
  children: [
1533
- /* @__PURE__ */ jsx17(
1580
+ /* @__PURE__ */ jsx18(
1534
1581
  "span",
1535
1582
  {
1536
1583
  style: {
@@ -1546,7 +1593,7 @@ function renderLabel(desc) {
1546
1593
  children: desc.label
1547
1594
  }
1548
1595
  ),
1549
- desc.concept && /* @__PURE__ */ jsx17(
1596
+ desc.concept && /* @__PURE__ */ jsx18(
1550
1597
  "span",
1551
1598
  {
1552
1599
  style: {
@@ -1580,7 +1627,7 @@ import React8 from "react";
1580
1627
  import { Panel } from "@xyflow/react";
1581
1628
 
1582
1629
  // src/graph/react/viewer/ValidationPanel.tsx
1583
- import { jsx as jsx18, jsxs as jsxs18 } from "react/jsx-runtime";
1630
+ import { jsx as jsx19, jsxs as jsxs19 } from "react/jsx-runtime";
1584
1631
  function validationLabel(state, issueCount) {
1585
1632
  const issues = issueCount === 1 ? "1 issue" : `${issueCount} issues`;
1586
1633
  switch (state) {
@@ -1647,7 +1694,7 @@ function ValidationPanel({
1647
1694
  placement,
1648
1695
  id
1649
1696
  }) {
1650
- return /* @__PURE__ */ jsxs18(
1697
+ return /* @__PURE__ */ jsxs19(
1651
1698
  "div",
1652
1699
  {
1653
1700
  id,
@@ -1655,18 +1702,18 @@ function ValidationPanel({
1655
1702
  role: "region",
1656
1703
  "aria-label": "Validation issues",
1657
1704
  children: [
1658
- /* @__PURE__ */ jsx18("div", { className: "graph-validation-panel-header", children: validationLabel(state, issues.length) }),
1659
- 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) => {
1660
1707
  const clickable = onIssueClick !== void 0;
1661
- const meta = (issue.context || issue.file) && /* @__PURE__ */ jsxs18("div", { className: "graph-validation-issue-meta", children: [
1662
- issue.context && /* @__PURE__ */ jsx18("span", { className: "graph-validation-issue-context", children: issue.context }),
1663
- 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 })
1664
1711
  ] });
1665
- return /* @__PURE__ */ jsx18(
1712
+ return /* @__PURE__ */ jsx19(
1666
1713
  "li",
1667
1714
  {
1668
1715
  className: `graph-validation-issue graph-validation-issue--${issue.severity}` + (clickable ? " graph-validation-issue--clickable" : ""),
1669
- children: /* @__PURE__ */ jsxs18(
1716
+ children: /* @__PURE__ */ jsxs19(
1670
1717
  "div",
1671
1718
  {
1672
1719
  className: "graph-validation-issue-body",
@@ -1681,8 +1728,8 @@ function ValidationPanel({
1681
1728
  } : void 0,
1682
1729
  children: [
1683
1730
  meta,
1684
- /* @__PURE__ */ jsx18("div", { className: "graph-validation-issue-message", children: issue.message }),
1685
- 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 })
1686
1733
  ]
1687
1734
  }
1688
1735
  )
@@ -1696,9 +1743,9 @@ function ValidationPanel({
1696
1743
  }
1697
1744
 
1698
1745
  // src/graph/react/viewer/GraphToolbar.tsx
1699
- 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";
1700
1747
  var REACTFLOW_PANEL_MARGIN = 15;
1701
- var ARROW_RIGHT_ICON = /* @__PURE__ */ jsxs19(
1748
+ var ARROW_RIGHT_ICON = /* @__PURE__ */ jsxs20(
1702
1749
  "svg",
1703
1750
  {
1704
1751
  viewBox: "0 0 24 24",
@@ -1710,12 +1757,12 @@ var ARROW_RIGHT_ICON = /* @__PURE__ */ jsxs19(
1710
1757
  strokeLinecap: "round",
1711
1758
  strokeLinejoin: "round",
1712
1759
  children: [
1713
- /* @__PURE__ */ jsx19("line", { x1: "5", y1: "12", x2: "19", y2: "12" }),
1714
- /* @__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" })
1715
1762
  ]
1716
1763
  }
1717
1764
  );
1718
- var ARROW_DOWN_ICON = /* @__PURE__ */ jsxs19(
1765
+ var ARROW_DOWN_ICON = /* @__PURE__ */ jsxs20(
1719
1766
  "svg",
1720
1767
  {
1721
1768
  viewBox: "0 0 24 24",
@@ -1727,12 +1774,12 @@ var ARROW_DOWN_ICON = /* @__PURE__ */ jsxs19(
1727
1774
  strokeLinecap: "round",
1728
1775
  strokeLinejoin: "round",
1729
1776
  children: [
1730
- /* @__PURE__ */ jsx19("line", { x1: "12", y1: "5", x2: "12", y2: "19" }),
1731
- /* @__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" })
1732
1779
  ]
1733
1780
  }
1734
1781
  );
1735
- var MINUS_ICON = /* @__PURE__ */ jsx19(
1782
+ var MINUS_ICON = /* @__PURE__ */ jsx20(
1736
1783
  "svg",
1737
1784
  {
1738
1785
  viewBox: "0 0 24 24",
@@ -1743,10 +1790,10 @@ var MINUS_ICON = /* @__PURE__ */ jsx19(
1743
1790
  strokeWidth: "2",
1744
1791
  strokeLinecap: "round",
1745
1792
  strokeLinejoin: "round",
1746
- 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" })
1747
1794
  }
1748
1795
  );
1749
- var PLUS_ICON = /* @__PURE__ */ jsxs19(
1796
+ var PLUS_ICON = /* @__PURE__ */ jsxs20(
1750
1797
  "svg",
1751
1798
  {
1752
1799
  viewBox: "0 0 24 24",
@@ -1758,12 +1805,12 @@ var PLUS_ICON = /* @__PURE__ */ jsxs19(
1758
1805
  strokeLinecap: "round",
1759
1806
  strokeLinejoin: "round",
1760
1807
  children: [
1761
- /* @__PURE__ */ jsx19("line", { x1: "12", y1: "5", x2: "12", y2: "19" }),
1762
- /* @__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" })
1763
1810
  ]
1764
1811
  }
1765
1812
  );
1766
- var FIT_VIEW_ICON = /* @__PURE__ */ jsxs19(
1813
+ var FIT_VIEW_ICON = /* @__PURE__ */ jsxs20(
1767
1814
  "svg",
1768
1815
  {
1769
1816
  viewBox: "0 0 24 24",
@@ -1775,14 +1822,14 @@ var FIT_VIEW_ICON = /* @__PURE__ */ jsxs19(
1775
1822
  strokeLinecap: "round",
1776
1823
  strokeLinejoin: "round",
1777
1824
  children: [
1778
- /* @__PURE__ */ jsx19("polyline", { points: "15 3 21 3 21 9" }),
1779
- /* @__PURE__ */ jsx19("polyline", { points: "9 21 3 21 3 15" }),
1780
- /* @__PURE__ */ jsx19("line", { x1: "21", y1: "3", x2: "14", y2: "10" }),
1781
- /* @__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" })
1782
1829
  ]
1783
1830
  }
1784
1831
  );
1785
- var BOXES_ICON = /* @__PURE__ */ jsxs19(
1832
+ var BOXES_ICON = /* @__PURE__ */ jsxs20(
1786
1833
  "svg",
1787
1834
  {
1788
1835
  viewBox: "0 0 24 24",
@@ -1794,22 +1841,22 @@ var BOXES_ICON = /* @__PURE__ */ jsxs19(
1794
1841
  strokeLinecap: "round",
1795
1842
  strokeLinejoin: "round",
1796
1843
  children: [
1797
- /* @__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" }),
1798
- /* @__PURE__ */ jsx19("path", { d: "m7 16.5-4.74-2.85" }),
1799
- /* @__PURE__ */ jsx19("path", { d: "m7 16.5 5-3" }),
1800
- /* @__PURE__ */ jsx19("path", { d: "M7 16.5v5.17" }),
1801
- /* @__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" }),
1802
- /* @__PURE__ */ jsx19("path", { d: "m17 16.5-5-3" }),
1803
- /* @__PURE__ */ jsx19("path", { d: "m17 16.5 4.74-2.85" }),
1804
- /* @__PURE__ */ jsx19("path", { d: "M17 16.5v5.17" }),
1805
- /* @__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" }),
1806
- /* @__PURE__ */ jsx19("path", { d: "M12 8 7.26 5.15" }),
1807
- /* @__PURE__ */ jsx19("path", { d: "m12 8 4.74-2.85" }),
1808
- /* @__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" })
1809
1856
  ]
1810
1857
  }
1811
1858
  );
1812
- var FOLD_ALL_ICON = /* @__PURE__ */ jsxs19(
1859
+ var FOLD_ALL_ICON = /* @__PURE__ */ jsxs20(
1813
1860
  "svg",
1814
1861
  {
1815
1862
  viewBox: "0 0 24 24",
@@ -1821,15 +1868,15 @@ var FOLD_ALL_ICON = /* @__PURE__ */ jsxs19(
1821
1868
  strokeLinecap: "round",
1822
1869
  strokeLinejoin: "round",
1823
1870
  children: [
1824
- /* @__PURE__ */ jsx19("rect", { x: "6", y: "6", width: "12", height: "12", rx: "2" }),
1825
- /* @__PURE__ */ jsx19("polyline", { points: "2 2 6 6 2 6" }),
1826
- /* @__PURE__ */ jsx19("polyline", { points: "22 2 18 6 22 6" }),
1827
- /* @__PURE__ */ jsx19("polyline", { points: "2 22 6 18 2 18" }),
1828
- /* @__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" })
1829
1876
  ]
1830
1877
  }
1831
1878
  );
1832
- var EXPAND_ALL_ICON = /* @__PURE__ */ jsxs19(
1879
+ var EXPAND_ALL_ICON = /* @__PURE__ */ jsxs20(
1833
1880
  "svg",
1834
1881
  {
1835
1882
  viewBox: "0 0 24 24",
@@ -1841,15 +1888,15 @@ var EXPAND_ALL_ICON = /* @__PURE__ */ jsxs19(
1841
1888
  strokeLinecap: "round",
1842
1889
  strokeLinejoin: "round",
1843
1890
  children: [
1844
- /* @__PURE__ */ jsx19("rect", { x: "9", y: "9", width: "6", height: "6", rx: "1" }),
1845
- /* @__PURE__ */ jsx19("polyline", { points: "3 3 7 7 3 7" }),
1846
- /* @__PURE__ */ jsx19("polyline", { points: "21 3 17 7 21 7" }),
1847
- /* @__PURE__ */ jsx19("polyline", { points: "3 21 7 17 3 17" }),
1848
- /* @__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" })
1849
1896
  ]
1850
1897
  }
1851
1898
  );
1852
- var SUN_ICON = /* @__PURE__ */ jsxs19(
1899
+ var SUN_ICON = /* @__PURE__ */ jsxs20(
1853
1900
  "svg",
1854
1901
  {
1855
1902
  viewBox: "0 0 24 24",
@@ -1861,19 +1908,19 @@ var SUN_ICON = /* @__PURE__ */ jsxs19(
1861
1908
  strokeLinecap: "round",
1862
1909
  strokeLinejoin: "round",
1863
1910
  children: [
1864
- /* @__PURE__ */ jsx19("circle", { cx: "12", cy: "12", r: "4" }),
1865
- /* @__PURE__ */ jsx19("line", { x1: "12", y1: "2", x2: "12", y2: "4" }),
1866
- /* @__PURE__ */ jsx19("line", { x1: "12", y1: "20", x2: "12", y2: "22" }),
1867
- /* @__PURE__ */ jsx19("line", { x1: "4.93", y1: "4.93", x2: "6.34", y2: "6.34" }),
1868
- /* @__PURE__ */ jsx19("line", { x1: "17.66", y1: "17.66", x2: "19.07", y2: "19.07" }),
1869
- /* @__PURE__ */ jsx19("line", { x1: "2", y1: "12", x2: "4", y2: "12" }),
1870
- /* @__PURE__ */ jsx19("line", { x1: "20", y1: "12", x2: "22", y2: "12" }),
1871
- /* @__PURE__ */ jsx19("line", { x1: "4.93", y1: "19.07", x2: "6.34", y2: "17.66" }),
1872
- /* @__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" })
1873
1920
  ]
1874
1921
  }
1875
1922
  );
1876
- var MOON_ICON = /* @__PURE__ */ jsx19(
1923
+ var MOON_ICON = /* @__PURE__ */ jsx20(
1877
1924
  "svg",
1878
1925
  {
1879
1926
  viewBox: "0 0 24 24",
@@ -1884,10 +1931,10 @@ var MOON_ICON = /* @__PURE__ */ jsx19(
1884
1931
  strokeWidth: "2",
1885
1932
  strokeLinecap: "round",
1886
1933
  strokeLinejoin: "round",
1887
- 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" })
1888
1935
  }
1889
1936
  );
1890
- var MONITOR_ICON = /* @__PURE__ */ jsxs19(
1937
+ var MONITOR_ICON = /* @__PURE__ */ jsxs20(
1891
1938
  "svg",
1892
1939
  {
1893
1940
  viewBox: "0 0 24 24",
@@ -1899,13 +1946,13 @@ var MONITOR_ICON = /* @__PURE__ */ jsxs19(
1899
1946
  strokeLinecap: "round",
1900
1947
  strokeLinejoin: "round",
1901
1948
  children: [
1902
- /* @__PURE__ */ jsx19("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2" }),
1903
- /* @__PURE__ */ jsx19("line", { x1: "8", y1: "21", x2: "16", y2: "21" }),
1904
- /* @__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" })
1905
1952
  ]
1906
1953
  }
1907
1954
  );
1908
- var SPINNER_ICON = /* @__PURE__ */ jsx19(
1955
+ var SPINNER_ICON = /* @__PURE__ */ jsx20(
1909
1956
  "svg",
1910
1957
  {
1911
1958
  className: "graph-toolbar-validation-spin",
@@ -1917,10 +1964,10 @@ var SPINNER_ICON = /* @__PURE__ */ jsx19(
1917
1964
  strokeWidth: "2",
1918
1965
  strokeLinecap: "round",
1919
1966
  strokeLinejoin: "round",
1920
- 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" })
1921
1968
  }
1922
1969
  );
1923
- var CHECK_ICON2 = /* @__PURE__ */ jsx19(
1970
+ var CHECK_ICON2 = /* @__PURE__ */ jsx20(
1924
1971
  "svg",
1925
1972
  {
1926
1973
  viewBox: "0 0 24 24",
@@ -1931,10 +1978,10 @@ var CHECK_ICON2 = /* @__PURE__ */ jsx19(
1931
1978
  strokeWidth: "2",
1932
1979
  strokeLinecap: "round",
1933
1980
  strokeLinejoin: "round",
1934
- children: /* @__PURE__ */ jsx19("polyline", { points: "20 6 9 17 4 12" })
1981
+ children: /* @__PURE__ */ jsx20("polyline", { points: "20 6 9 17 4 12" })
1935
1982
  }
1936
1983
  );
1937
- var X_CIRCLE_ICON = /* @__PURE__ */ jsxs19(
1984
+ var X_CIRCLE_ICON = /* @__PURE__ */ jsxs20(
1938
1985
  "svg",
1939
1986
  {
1940
1987
  viewBox: "0 0 24 24",
@@ -1946,13 +1993,13 @@ var X_CIRCLE_ICON = /* @__PURE__ */ jsxs19(
1946
1993
  strokeLinecap: "round",
1947
1994
  strokeLinejoin: "round",
1948
1995
  children: [
1949
- /* @__PURE__ */ jsx19("circle", { cx: "12", cy: "12", r: "10" }),
1950
- /* @__PURE__ */ jsx19("line", { x1: "15", y1: "9", x2: "9", y2: "15" }),
1951
- /* @__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" })
1952
1999
  ]
1953
2000
  }
1954
2001
  );
1955
- var ALERT_TRIANGLE_ICON = /* @__PURE__ */ jsxs19(
2002
+ var ALERT_TRIANGLE_ICON = /* @__PURE__ */ jsxs20(
1956
2003
  "svg",
1957
2004
  {
1958
2005
  viewBox: "0 0 24 24",
@@ -1964,13 +2011,13 @@ var ALERT_TRIANGLE_ICON = /* @__PURE__ */ jsxs19(
1964
2011
  strokeLinecap: "round",
1965
2012
  strokeLinejoin: "round",
1966
2013
  children: [
1967
- /* @__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" }),
1968
- /* @__PURE__ */ jsx19("line", { x1: "12", y1: "9", x2: "12", y2: "13" }),
1969
- /* @__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" })
1970
2017
  ]
1971
2018
  }
1972
2019
  );
1973
- var INFO_CIRCLE_ICON = /* @__PURE__ */ jsxs19(
2020
+ var INFO_CIRCLE_ICON = /* @__PURE__ */ jsxs20(
1974
2021
  "svg",
1975
2022
  {
1976
2023
  viewBox: "0 0 24 24",
@@ -1982,9 +2029,9 @@ var INFO_CIRCLE_ICON = /* @__PURE__ */ jsxs19(
1982
2029
  strokeLinecap: "round",
1983
2030
  strokeLinejoin: "round",
1984
2031
  children: [
1985
- /* @__PURE__ */ jsx19("circle", { cx: "12", cy: "12", r: "10" }),
1986
- /* @__PURE__ */ jsx19("line", { x1: "12", y1: "16", x2: "12", y2: "12" }),
1987
- /* @__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" })
1988
2035
  ]
1989
2036
  }
1990
2037
  );
@@ -2088,10 +2135,10 @@ function GraphToolbar({
2088
2135
  const foldAllSection = onFoldAll || onExpandAll;
2089
2136
  const foldAllTitle = foldAllDisabled ? "Fold all controllers (nothing to fold)" : "Fold all controllers";
2090
2137
  const expandAllTitle = expandAllDisabled ? "Expand all controllers (nothing to expand)" : "Expand all controllers";
2091
- return /* @__PURE__ */ jsx19(Panel, { position, className: "graph-toolbar-panel", style: panelStyle, children: /* @__PURE__ */ jsxs19("div", { className: `graph-toolbar graph-toolbar--${orientation}`, children: [
2092
- validationState !== void 0 && /* @__PURE__ */ jsxs19(Fragment12, { children: [
2093
- /* @__PURE__ */ jsxs19("div", { className: "graph-toolbar-validation", ref: validationRef, children: [
2094
- /* @__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(
2095
2142
  "button",
2096
2143
  {
2097
2144
  type: "button",
@@ -2104,11 +2151,11 @@ function GraphToolbar({
2104
2151
  "aria-controls": validationPanelId,
2105
2152
  children: [
2106
2153
  validationIcon(validationState),
2107
- 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 })
2108
2155
  ]
2109
2156
  }
2110
2157
  ),
2111
- validationOpen && /* @__PURE__ */ jsx19(
2158
+ validationOpen && /* @__PURE__ */ jsx20(
2112
2159
  ValidationPanel,
2113
2160
  {
2114
2161
  id: validationPanelId,
@@ -2119,9 +2166,9 @@ function GraphToolbar({
2119
2166
  }
2120
2167
  )
2121
2168
  ] }),
2122
- /* @__PURE__ */ jsx19("div", { className: "graph-toolbar-separator" })
2169
+ /* @__PURE__ */ jsx20("div", { className: "graph-toolbar-separator" })
2123
2170
  ] }),
2124
- onFoldAll && /* @__PURE__ */ jsx19(
2171
+ onFoldAll && /* @__PURE__ */ jsx20(
2125
2172
  "button",
2126
2173
  {
2127
2174
  type: "button",
@@ -2133,7 +2180,7 @@ function GraphToolbar({
2133
2180
  children: FOLD_ALL_ICON
2134
2181
  }
2135
2182
  ),
2136
- onExpandAll && /* @__PURE__ */ jsx19(
2183
+ onExpandAll && /* @__PURE__ */ jsx20(
2137
2184
  "button",
2138
2185
  {
2139
2186
  type: "button",
@@ -2145,8 +2192,8 @@ function GraphToolbar({
2145
2192
  children: EXPAND_ALL_ICON
2146
2193
  }
2147
2194
  ),
2148
- foldAllSection && /* @__PURE__ */ jsx19("div", { className: "graph-toolbar-separator" }),
2149
- /* @__PURE__ */ jsx19(
2195
+ foldAllSection && /* @__PURE__ */ jsx20("div", { className: "graph-toolbar-separator" }),
2196
+ /* @__PURE__ */ jsx20(
2150
2197
  "button",
2151
2198
  {
2152
2199
  type: "button",
@@ -2157,7 +2204,7 @@ function GraphToolbar({
2157
2204
  children: BOXES_ICON
2158
2205
  }
2159
2206
  ),
2160
- /* @__PURE__ */ jsx19(
2207
+ /* @__PURE__ */ jsx20(
2161
2208
  "button",
2162
2209
  {
2163
2210
  type: "button",
@@ -2168,8 +2215,8 @@ function GraphToolbar({
2168
2215
  children: isVertical ? ARROW_RIGHT_ICON : ARROW_DOWN_ICON
2169
2216
  }
2170
2217
  ),
2171
- (onZoomOut || onZoomIn || onFitView) && /* @__PURE__ */ jsx19("div", { className: "graph-toolbar-separator" }),
2172
- onZoomOut && /* @__PURE__ */ jsx19(
2218
+ (onZoomOut || onZoomIn || onFitView) && /* @__PURE__ */ jsx20("div", { className: "graph-toolbar-separator" }),
2219
+ onZoomOut && /* @__PURE__ */ jsx20(
2173
2220
  "button",
2174
2221
  {
2175
2222
  type: "button",
@@ -2180,7 +2227,7 @@ function GraphToolbar({
2180
2227
  children: MINUS_ICON
2181
2228
  }
2182
2229
  ),
2183
- onZoomIn && /* @__PURE__ */ jsx19(
2230
+ onZoomIn && /* @__PURE__ */ jsx20(
2184
2231
  "button",
2185
2232
  {
2186
2233
  type: "button",
@@ -2191,7 +2238,7 @@ function GraphToolbar({
2191
2238
  children: PLUS_ICON
2192
2239
  }
2193
2240
  ),
2194
- onFitView && /* @__PURE__ */ jsx19(
2241
+ onFitView && /* @__PURE__ */ jsx20(
2195
2242
  "button",
2196
2243
  {
2197
2244
  type: "button",
@@ -2202,9 +2249,9 @@ function GraphToolbar({
2202
2249
  children: FIT_VIEW_ICON
2203
2250
  }
2204
2251
  ),
2205
- themeToggleEnabled && /* @__PURE__ */ jsxs19(Fragment12, { children: [
2206
- /* @__PURE__ */ jsx19("div", { className: "graph-toolbar-separator" }),
2207
- /* @__PURE__ */ jsx19(
2252
+ themeToggleEnabled && /* @__PURE__ */ jsxs20(Fragment12, { children: [
2253
+ /* @__PURE__ */ jsx20("div", { className: "graph-toolbar-separator" }),
2254
+ /* @__PURE__ */ jsx20(
2208
2255
  "button",
2209
2256
  {
2210
2257
  type: "button",
@@ -2220,7 +2267,7 @@ function GraphToolbar({
2220
2267
  }
2221
2268
 
2222
2269
  // src/graph/react/nodes/NodeValidationBadge.tsx
2223
- import { jsx as jsx20 } from "react/jsx-runtime";
2270
+ import { jsx as jsx21 } from "react/jsx-runtime";
2224
2271
  function NodeValidationBadge({
2225
2272
  validation,
2226
2273
  onClick
@@ -2230,9 +2277,9 @@ function NodeValidationBadge({
2230
2277
  const className = `node-validation-badge node-validation-badge--${validation.severity}`;
2231
2278
  const text = validation.count > 99 ? "99+" : String(validation.count);
2232
2279
  if (!onClick) {
2233
- 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 });
2234
2281
  }
2235
- return /* @__PURE__ */ jsx20(
2282
+ return /* @__PURE__ */ jsx21(
2236
2283
  "button",
2237
2284
  {
2238
2285
  type: "button",
@@ -2252,7 +2299,7 @@ function validationRingClass(validation) {
2252
2299
  }
2253
2300
 
2254
2301
  // src/graph/react/nodes/controller/ControllerGroupNode.tsx
2255
- import { jsx as jsx21, jsxs as jsxs20 } from "react/jsx-runtime";
2302
+ import { jsx as jsx22, jsxs as jsxs21 } from "react/jsx-runtime";
2256
2303
  var CONTROLLER_CONFIG = {
2257
2304
  PipeSequence: { badge: "Sequence", icon: "\u2192" },
2258
2305
  PipeParallel: { badge: "Parallel", icon: "//" },
@@ -2274,12 +2321,12 @@ function ControllerGroupNode({ data }) {
2274
2321
  const modifier = getControllerModifier(data.pipeType);
2275
2322
  const isCollapsible = (data.pipeType === "PipeParallel" || data.pipeType === "PipeBatch") && ((_a = data.childCount) != null ? _a : 0) > MAX_VISIBLE_CONTROLLER_CHILDREN;
2276
2323
  const hiddenCount = isCollapsible ? ((_b = data.childCount) != null ? _b : 0) - MAX_VISIBLE_CONTROLLER_CHILDREN : 0;
2277
- return /* @__PURE__ */ jsxs20("div", { className: `controller-group-node ${modifier}${validationRingClass(data.validation)}`, children: [
2278
- /* @__PURE__ */ jsxs20("div", { className: "controller-group-header", children: [
2279
- /* @__PURE__ */ jsx21("span", { className: "controller-group-icon", children: config.icon }),
2280
- /* @__PURE__ */ jsx21("span", { className: "controller-group-badge", children: config.badge }),
2281
- data.label && /* @__PURE__ */ jsx21("span", { className: "controller-group-label", children: data.label }),
2282
- 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(
2283
2330
  "button",
2284
2331
  {
2285
2332
  type: "button",
@@ -2294,9 +2341,9 @@ function ControllerGroupNode({ data }) {
2294
2341
  children: "\u2921"
2295
2342
  }
2296
2343
  ),
2297
- data.validation && /* @__PURE__ */ jsx21(NodeValidationBadge, { validation: data.validation, onClick: data.onValidationBadgeClick })
2344
+ data.validation && /* @__PURE__ */ jsx22(NodeValidationBadge, { validation: data.validation, onClick: data.onValidationBadgeClick })
2298
2345
  ] }),
2299
- isCollapsible && /* @__PURE__ */ jsx21(
2346
+ isCollapsible && /* @__PURE__ */ jsx22(
2300
2347
  "button",
2301
2348
  {
2302
2349
  className: "controller-group-collapse",
@@ -2317,7 +2364,7 @@ import { Handle, Position } from "@xyflow/react";
2317
2364
 
2318
2365
  // src/graph/react/nodes/pipe/PipeCardBase.tsx
2319
2366
  import { useState as useState2 } from "react";
2320
- import { jsx as jsx22, jsxs as jsxs21 } from "react/jsx-runtime";
2367
+ import { jsx as jsx23, jsxs as jsxs22 } from "react/jsx-runtime";
2321
2368
  var PIPE_TYPE_BADGES2 = {
2322
2369
  PipeLLM: "LLM",
2323
2370
  PipeExtract: "Extract",
@@ -2326,11 +2373,14 @@ var PIPE_TYPE_BADGES2 = {
2326
2373
  PipeSearch: "Search",
2327
2374
  PipeFunc: "Func",
2328
2375
  PipeStructure: "Structure",
2376
+ PipeJudge: "Judge",
2377
+ PipeDocGen: "DocGen",
2329
2378
  PipeSignature: "Signature",
2330
2379
  PipeSequence: "Sequence",
2331
2380
  PipeParallel: "Parallel",
2332
2381
  PipeCondition: "Condition",
2333
- PipeBatch: "Batch"
2382
+ PipeBatch: "Batch",
2383
+ BindingStep: "Binding"
2334
2384
  };
2335
2385
  var CONTROLLER_TYPE_TABLE = {
2336
2386
  PipeSequence: true,
@@ -2360,6 +2410,7 @@ function PipeCardBase({ data, children }) {
2360
2410
  const isRunning = data.status === "running";
2361
2411
  const isController = isControllerType(data.pipeType);
2362
2412
  const isSignature = data.pipeType === "PipeSignature";
2413
+ const isBinding = data.pipeType === BINDING_STEP_TYPE;
2363
2414
  const isStatic = data.graphMode === "static";
2364
2415
  const outcome = isStatic ? (_a = data.tags) == null ? void 0 : _a.outcome : void 0;
2365
2416
  const batchMultiplicity = isStatic ? (_b = data.tags) == null ? void 0 : _b.batch_multiplicity : void 0;
@@ -2370,24 +2421,25 @@ function PipeCardBase({ data, children }) {
2370
2421
  const dirClass = data.direction === "TB" ? "pipe-card--tb" : "pipe-card--lr";
2371
2422
  const controllerClass = isController ? " pipe-card--controller" : "";
2372
2423
  const signatureClass = isSignature ? " pipe-card--signature" : "";
2424
+ const bindingClass = isBinding ? " pipe-card--binding" : "";
2373
2425
  const staticClass = isStatic ? " pipe-card--static" : "";
2374
- 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";
2375
2427
  const ringClass = validationRingClass(data.validation);
2376
- return /* @__PURE__ */ jsxs21(
2428
+ return /* @__PURE__ */ jsxs22(
2377
2429
  "div",
2378
2430
  {
2379
- className: `pipe-card ${dirClass}${controllerClass}${signatureClass}${staticClass}${ringClass}`,
2431
+ className: `pipe-card ${dirClass}${controllerClass}${signatureClass}${bindingClass}${staticClass}${ringClass}`,
2380
2432
  children: [
2381
- /* @__PURE__ */ jsxs21("div", { className: "pipe-card-header", children: [
2382
- /* @__PURE__ */ jsx22("span", { className: badgeClass, children: badge }),
2383
- /* @__PURE__ */ jsx22("span", { className: "pipe-card-code", title: data.pipeCode, children: data.pipeCode }),
2384
- !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(
2385
2437
  "span",
2386
2438
  {
2387
2439
  className: "pipe-card-status",
2388
2440
  style: { color: statusConfig.color },
2389
2441
  title: statusConfig.label,
2390
- children: /* @__PURE__ */ jsx22(
2442
+ children: /* @__PURE__ */ jsx23(
2391
2443
  "span",
2392
2444
  {
2393
2445
  className: `pipe-card-status-dot ${isRunning ? "pipe-card-status-dot--pulse" : ""}`,
@@ -2396,7 +2448,7 @@ function PipeCardBase({ data, children }) {
2396
2448
  )
2397
2449
  }
2398
2450
  ),
2399
- data.onExpand && /* @__PURE__ */ jsx22(
2451
+ data.onExpand && /* @__PURE__ */ jsx23(
2400
2452
  "button",
2401
2453
  {
2402
2454
  type: "button",
@@ -2411,32 +2463,32 @@ function PipeCardBase({ data, children }) {
2411
2463
  children: "\u2922"
2412
2464
  }
2413
2465
  ),
2414
- data.validation && /* @__PURE__ */ jsx22(NodeValidationBadge, { validation: data.validation, onClick: data.onValidationBadgeClick })
2466
+ data.validation && /* @__PURE__ */ jsx23(NodeValidationBadge, { validation: data.validation, onClick: data.onValidationBadgeClick })
2415
2467
  ] }),
2416
- (outcome || batchMultiplicity) && /* @__PURE__ */ jsxs21("div", { className: "pipe-card-annotations", children: [
2417
- 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: [
2418
2470
  "outcome: ",
2419
2471
  outcome
2420
2472
  ] }),
2421
- 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 })
2422
2474
  ] }),
2423
- data.description && /* @__PURE__ */ jsx22("span", { className: "pipe-card-description", title: data.description, children: data.description }),
2424
- data.inputs.length > 0 && /* @__PURE__ */ jsxs21("div", { className: "pipe-card-io", children: [
2425
- /* @__PURE__ */ jsx22("span", { className: "pipe-card-io-label", children: "INPUTS" }),
2426
- /* @__PURE__ */ jsxs21("div", { className: "pipe-card-io-pills", children: [
2427
- 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(
2428
2480
  "span",
2429
2481
  {
2430
2482
  className: "pipe-card-io-pill",
2431
2483
  title: `${input.name}: ${input.concept}`,
2432
2484
  children: [
2433
- /* @__PURE__ */ jsx22("span", { className: "pipe-card-io-pill-name", children: input.name }),
2434
- /* @__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 })
2435
2487
  ]
2436
2488
  },
2437
2489
  input.name
2438
2490
  )),
2439
- hasMany && /* @__PURE__ */ jsx22(
2491
+ hasMany && /* @__PURE__ */ jsx23(
2440
2492
  "button",
2441
2493
  {
2442
2494
  className: "pipe-card-io-more",
@@ -2449,16 +2501,16 @@ function PipeCardBase({ data, children }) {
2449
2501
  )
2450
2502
  ] })
2451
2503
  ] }),
2452
- data.outputs.length > 0 && /* @__PURE__ */ jsxs21("div", { className: "pipe-card-io", children: [
2453
- /* @__PURE__ */ jsx22("span", { className: "pipe-card-io-label", children: "OUTPUT" }),
2454
- /* @__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(
2455
2507
  "span",
2456
2508
  {
2457
2509
  className: "pipe-card-io-pill",
2458
2510
  title: `${output.name}: ${output.concept}`,
2459
2511
  children: [
2460
- /* @__PURE__ */ jsx22("span", { className: "pipe-card-io-pill-name", children: output.name }),
2461
- /* @__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 })
2462
2514
  ]
2463
2515
  },
2464
2516
  output.name
@@ -2479,22 +2531,25 @@ var PIPE_CARD_REGISTRY = {
2479
2531
  PipeSearch: PipeCardBase,
2480
2532
  PipeFunc: PipeCardBase,
2481
2533
  PipeStructure: PipeCardBase,
2534
+ PipeJudge: PipeCardBase,
2535
+ PipeDocGen: PipeCardBase,
2482
2536
  PipeSignature: PipeCardBase,
2483
2537
  PipeSequence: PipeCardBase,
2484
2538
  PipeParallel: PipeCardBase,
2485
2539
  PipeCondition: PipeCardBase,
2486
- PipeBatch: PipeCardBase
2540
+ PipeBatch: PipeCardBase,
2541
+ BindingStep: PipeCardBase
2487
2542
  };
2488
2543
  function getPipeCardComponent(pipeType) {
2489
2544
  return PIPE_CARD_REGISTRY[pipeType];
2490
2545
  }
2491
2546
 
2492
2547
  // src/graph/react/nodes/pipe/PipeCardNode.tsx
2493
- 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";
2494
2549
  function PipeCardNode({ data }) {
2495
2550
  var _a;
2496
2551
  const Card = (_a = getPipeCardComponent(data.pipeType)) != null ? _a : PipeCardBase;
2497
- return /* @__PURE__ */ jsx23(Card, { data });
2552
+ return /* @__PURE__ */ jsx24(Card, { data });
2498
2553
  }
2499
2554
  function PipeCardRFNode({
2500
2555
  data,
@@ -2503,15 +2558,15 @@ function PipeCardRFNode({
2503
2558
  }) {
2504
2559
  const payload = data.pipeCardData;
2505
2560
  if (!payload) return null;
2506
- return /* @__PURE__ */ jsxs22(Fragment13, { children: [
2507
- /* @__PURE__ */ jsx23(Handle, { type: "target", position: targetPosition }),
2508
- /* @__PURE__ */ jsx23(PipeCardNode, { data: payload }),
2509
- /* @__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 })
2510
2565
  ] });
2511
2566
  }
2512
2567
 
2513
2568
  // src/graph/react/viewer/GraphViewer.tsx
2514
- 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";
2515
2570
  var nodeTypes = __spreadProps(__spreadValues({}, controllerNodeTypes), {
2516
2571
  pipeCard: PipeCardRFNode
2517
2572
  });
@@ -2521,10 +2576,8 @@ function StuffNodeDetail({
2521
2576
  producerPipeRef,
2522
2577
  consumer,
2523
2578
  graphspec,
2579
+ artifacts,
2524
2580
  theme,
2525
- contracts,
2526
- outputForm,
2527
- inputForm,
2528
2581
  resolveUrl,
2529
2582
  resolveShareUrl,
2530
2583
  saveFiles,
@@ -2533,19 +2586,17 @@ function StuffNodeDetail({
2533
2586
  var _a;
2534
2587
  const conceptInfo = stuffData.concept && graphspec ? resolveConceptRef(graphspec, stuffData.concept) : void 0;
2535
2588
  const isDryRun = graphSpecMode(graphspec) === GRAPH_SPEC_MODE.DRY;
2536
- const renderData = contracts && outputForm ? () => /* @__PURE__ */ jsx24(
2589
+ const descriptors = resultDescriptors(artifacts);
2590
+ const renderData = descriptors ? () => /* @__PURE__ */ jsx25(
2537
2591
  StuffResultPanel,
2538
- __spreadProps(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadProps(__spreadValues({
2539
- contracts,
2540
- outputForm
2541
- }, inputForm ? { inputForm } : {}), {
2592
+ __spreadProps(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadProps(__spreadValues({}, descriptors), {
2542
2593
  stuff: stuffData
2543
2594
  }), conceptInfo ? { concept: conceptInfo } : {}), producerPipeRef ? { producerPipeRef } : {}), consumer ? { consumer } : {}), resolveUrl ? { resolveUrl } : {}), resolveShareUrl ? { resolveShareUrl } : {}), saveFiles ? { saveFiles } : {}), downloads ? { downloads } : {}), {
2544
2595
  theme
2545
2596
  })
2546
2597
  ) : void 0;
2547
2598
  if (conceptInfo) {
2548
- return /* @__PURE__ */ jsx24(
2599
+ return /* @__PURE__ */ jsx25(
2549
2600
  ConceptDetailPanel,
2550
2601
  {
2551
2602
  concept: conceptInfo,
@@ -2556,8 +2607,8 @@ function StuffNodeDetail({
2556
2607
  }
2557
2608
  );
2558
2609
  }
2559
- if (isDryRun) return /* @__PURE__ */ jsx24("div", { className: "detail-not-available", children: "Dry run data hidden" });
2560
- 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" }) });
2561
2612
  }
2562
2613
  function seedFoldedControllers(mode, controllerIds) {
2563
2614
  if (mode === FOLD_MODE.FOLDED) return new Set(controllerIds);
@@ -2591,6 +2642,7 @@ function applyStatusOverrides(nodes, statusMap) {
2591
2642
  if (node.data.graphMode === "static" || ((_a = node.data.pipeCardData) == null ? void 0 : _a.graphMode) === "static") {
2592
2643
  return node;
2593
2644
  }
2645
+ if (node.data.pipeType === BINDING_STEP_TYPE) return node;
2594
2646
  const pipeCode = node.data.pipeCode;
2595
2647
  if (!pipeCode || !Object.hasOwn(statusMap, pipeCode)) return node;
2596
2648
  const newStatus = statusMap[pipeCode];
@@ -2604,9 +2656,9 @@ function applyStatusOverrides(nodes, statusMap) {
2604
2656
  });
2605
2657
  }
2606
2658
  function GraphViewer(props) {
2607
- var _a, _b, _c;
2659
+ var _a, _b, _c, _d;
2608
2660
  const {
2609
- graphspec: graphspecProp,
2661
+ graph,
2610
2662
  config = DEFAULT_GRAPH_CONFIG,
2611
2663
  initialDirection,
2612
2664
  initialShowControllers,
@@ -2624,9 +2676,6 @@ function GraphViewer(props) {
2624
2676
  onNodeSelect,
2625
2677
  onPaneClick,
2626
2678
  renderDetailExtra,
2627
- contracts,
2628
- outputForm,
2629
- inputForm,
2630
2679
  resolveUrl,
2631
2680
  resolveShareUrl,
2632
2681
  saveFiles,
@@ -2635,6 +2684,7 @@ function GraphViewer(props) {
2635
2684
  validationIssues,
2636
2685
  onValidationIssueClick
2637
2686
  } = props;
2687
+ const graphspecProp = (_a = graph == null ? void 0 : graph.graphSpec) != null ? _a : null;
2638
2688
  const graphspec = React10.useMemo(
2639
2689
  () => graphspecProp === null ? null : validateGraphSpec(graphspecProp),
2640
2690
  [graphspecProp]
@@ -2670,7 +2720,7 @@ function GraphViewer(props) {
2670
2720
  (_a2 = onThemeChangeRef.current) == null ? void 0 : _a2.call(onThemeChangeRef, mode, resolvedTheme);
2671
2721
  }
2672
2722
  }, [mode, resolvedTheme]);
2673
- const effectiveFoldMode = (_b = (_a = initialFoldMode != null ? initialFoldMode : config.foldMode) != null ? _a : DEFAULT_GRAPH_CONFIG.foldMode) != null ? _b : FOLD_MODE.EXPANDED;
2723
+ const effectiveFoldMode = (_c = (_b = initialFoldMode != null ? initialFoldMode : config.foldMode) != null ? _b : DEFAULT_GRAPH_CONFIG.foldMode) != null ? _c : FOLD_MODE.EXPANDED;
2674
2724
  const [showControllers, setShowControllers] = React10.useState(() => {
2675
2725
  var _a2, _b2;
2676
2726
  if (effectiveFoldMode === FOLD_MODE.FOLDED) return true;
@@ -3125,7 +3175,7 @@ function GraphViewer(props) {
3125
3175
  var _a2;
3126
3176
  const nodeData = node.data;
3127
3177
  onNodeSelect == null ? void 0 : onNodeSelect(node.id, nodeData, event);
3128
- if (nodeData.isController || nodeData.isPipe) {
3178
+ if ((nodeData.isController || nodeData.isPipe) && nodeData.pipeType !== BINDING_STEP_TYPE) {
3129
3179
  const code = nodeData.pipeCode || nodeData.labelText;
3130
3180
  if (code && onNavigateToPipe) {
3131
3181
  onNavigateToPipe(code, (_a2 = nodeData.pipeCardData) == null ? void 0 : _a2.status);
@@ -3184,13 +3234,13 @@ function GraphViewer(props) {
3184
3234
  },
3185
3235
  [graphspec]
3186
3236
  );
3187
- 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;
3188
3238
  const detailOpen = detailSelection !== null || conceptOverride !== null;
3189
3239
  const effectiveToolbarPosition = resolveToolbarPosition(
3190
3240
  toolbarPositionProp,
3191
3241
  config.toolbarPosition
3192
3242
  );
3193
- const rawAnalysis = (_c = rawGraphDataRef.current) == null ? void 0 : _c.analysis;
3243
+ const rawAnalysis = (_d = rawGraphDataRef.current) == null ? void 0 : _d.analysis;
3194
3244
  const allControllerIds = rawAnalysis == null ? void 0 : rawAnalysis.controllerNodeIds;
3195
3245
  const foldAllProps = React10.useMemo(() => {
3196
3246
  if (!showControllers || !allControllerIds || allControllerIds.size === 0) {
@@ -3208,13 +3258,13 @@ function GraphViewer(props) {
3208
3258
  expandAllDisabled: foldedControllers.size === 0
3209
3259
  };
3210
3260
  }, [showControllers, allControllerIds, foldedControllers]);
3211
- return /* @__PURE__ */ jsxs23(
3261
+ return /* @__PURE__ */ jsxs24(
3212
3262
  "div",
3213
3263
  {
3214
3264
  ref: containerRef,
3215
3265
  className: `react-flow-container react-flow-container--theme-${resolvedTheme} react-flow-container--mode-${mode}`,
3216
3266
  children: [
3217
- /* @__PURE__ */ jsxs23(
3267
+ /* @__PURE__ */ jsxs24(
3218
3268
  ReactFlow,
3219
3269
  {
3220
3270
  nodes,
@@ -3233,7 +3283,7 @@ function GraphViewer(props) {
3233
3283
  proOptions: { hideAttribution: true },
3234
3284
  panActivationKeyCode: null,
3235
3285
  children: [
3236
- /* @__PURE__ */ jsx24(
3286
+ /* @__PURE__ */ jsx25(
3237
3287
  Background,
3238
3288
  {
3239
3289
  variant: BackgroundVariant.Dots,
@@ -3242,7 +3292,7 @@ function GraphViewer(props) {
3242
3292
  color: "var(--color-bg-dots)"
3243
3293
  }
3244
3294
  ),
3245
- !hideToolbar && /* @__PURE__ */ jsx24(
3295
+ !hideToolbar && /* @__PURE__ */ jsx25(
3246
3296
  GraphToolbar,
3247
3297
  {
3248
3298
  direction,
@@ -3279,7 +3329,7 @@ function GraphViewer(props) {
3279
3329
  ]
3280
3330
  }
3281
3331
  ),
3282
- /* @__PURE__ */ jsxs23(
3332
+ /* @__PURE__ */ jsxs24(
3283
3333
  DetailPanel,
3284
3334
  {
3285
3335
  isOpen: detailOpen,
@@ -3288,14 +3338,14 @@ function GraphViewer(props) {
3288
3338
  isDragging: isPanelDragging,
3289
3339
  onResizeHandleMouseDown: onResizeMouseDown,
3290
3340
  children: [
3291
- conceptOverride ? /* @__PURE__ */ jsx24(ConceptDetailPanel, { concept: conceptOverride }) : selectedSpecNode && graphspec ? /* @__PURE__ */ jsx24(
3341
+ conceptOverride ? /* @__PURE__ */ jsx25(ConceptDetailPanel, { concept: conceptOverride }) : selectedSpecNode && graphspec ? /* @__PURE__ */ jsx25(
3292
3342
  PipeDetailPanel,
3293
3343
  {
3294
3344
  node: selectedSpecNode,
3295
3345
  spec: graphspec,
3296
3346
  onConceptClick: handleConceptClick
3297
3347
  }
3298
- ) : (detailSelection == null ? void 0 : detailSelection.stuffData) ? /* @__PURE__ */ jsx24(
3348
+ ) : (detailSelection == null ? void 0 : detailSelection.stuffData) ? /* @__PURE__ */ jsx25(
3299
3349
  StuffNodeDetail,
3300
3350
  {
3301
3351
  nodeId: detailSelection.nodeId,
@@ -3304,9 +3354,7 @@ function GraphViewer(props) {
3304
3354
  consumer: detailSelection.consumer,
3305
3355
  graphspec,
3306
3356
  theme: resolvedTheme,
3307
- contracts,
3308
- outputForm,
3309
- inputForm,
3357
+ artifacts: graph,
3310
3358
  resolveUrl,
3311
3359
  resolveShareUrl,
3312
3360
  saveFiles,
@@ -3334,8 +3382,10 @@ export {
3334
3382
  applyStatusOverrides,
3335
3383
  controllerNodeTypes,
3336
3384
  detectSystemTheme,
3385
+ graphArtifactsFrom,
3337
3386
  hydrateLabels,
3338
3387
  renderLabel,
3388
+ resultDescriptors,
3339
3389
  toAppEdges,
3340
3390
  toAppNodes,
3341
3391
  useResizable,