@pipelex/mthds-ui 0.16.0 → 0.17.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.
@@ -15,7 +15,7 @@ import {
15
15
  resolveConceptRef,
16
16
  resolveIssueTargetNodeId,
17
17
  validateGraphSpec
18
- } from "../../chunk-UDA2XA23.js";
18
+ } from "../../chunk-CQTAXK76.js";
19
19
  import {
20
20
  EDGE_TYPE,
21
21
  FOLD_MODE,
@@ -31,7 +31,7 @@ import {
31
31
  stuffDigestFromId,
32
32
  toolbarOrientation,
33
33
  toolbarSide
34
- } from "../../chunk-HURB2U53.js";
34
+ } from "../../chunk-3XFIKUSZ.js";
35
35
  import {
36
36
  __spreadProps,
37
37
  __spreadValues
@@ -799,12 +799,173 @@ function PromptToggle({
799
799
  )
800
800
  ] });
801
801
  }
802
+ function ModelRows({
803
+ modelsRan,
804
+ authored,
805
+ handle,
806
+ label = "Model"
807
+ }) {
808
+ const ran = modelsRan != null ? modelsRan : [];
809
+ const ranLabels = ran.map(
810
+ (entry) => ran.length > 1 ? `${entry.inference_model_name} (${entry.inference_calls})` : entry.inference_model_name
811
+ );
812
+ const chain = [];
813
+ for (const rung of [authored, handle, ...ranLabels]) {
814
+ if (rung && rung !== chain[chain.length - 1]) chain.push(rung);
815
+ }
816
+ if (chain.length === 0) return null;
817
+ return /* @__PURE__ */ jsxs3("div", { className: "detail-kv-row", children: [
818
+ /* @__PURE__ */ jsx3("span", { className: "detail-kv-key", children: label }),
819
+ /* @__PURE__ */ jsx3("span", { className: "detail-kv-value detail-model-value", children: chain.map((rung, index) => /* @__PURE__ */ jsx3("span", { className: index === 0 ? void 0 : "detail-model-resolved", children: rung }, rung)) })
820
+ ] });
821
+ }
822
+
823
+ // src/graph/usageFormat.ts
824
+ function scopeUsage(usage, scope) {
825
+ if (scope === "subtree") {
826
+ return {
827
+ scope,
828
+ inferenceCalls: usage.subtree_inference_calls,
829
+ ratedInferenceCalls: usage.subtree_rated_inference_calls,
830
+ nbTokensByCategory: usage.subtree_nb_tokens_by_category,
831
+ totalTokens: usage.subtree_total_tokens,
832
+ cost: usage.subtree_cost,
833
+ costInput: usage.subtree_cost_input,
834
+ costOutput: usage.subtree_cost_output,
835
+ models: usage.subtree_by_model
836
+ };
837
+ }
838
+ return {
839
+ scope,
840
+ inferenceCalls: usage.inference_calls,
841
+ ratedInferenceCalls: usage.rated_inference_calls,
842
+ nbTokensByCategory: usage.nb_tokens_by_category,
843
+ totalTokens: usage.total_tokens,
844
+ cost: usage.cost,
845
+ costInput: usage.cost_input,
846
+ costOutput: usage.cost_output,
847
+ models: usage.by_model
848
+ };
849
+ }
850
+ function usageState(scoped) {
851
+ if (scoped.inferenceCalls === 0) return "ran-nothing";
852
+ if (scoped.cost === null) return "unrated";
853
+ if (scoped.ratedInferenceCalls < scoped.inferenceCalls) return "partial";
854
+ return "rated";
855
+ }
856
+ function formatCost(cost) {
857
+ if (cost > 0 && cost < 1e-4) return "<$0.0001";
858
+ return `$${cost.toFixed(4)}`;
859
+ }
860
+ function hasRealTokenCounts(scoped) {
861
+ return scoped.models.length > 0 && scoped.models.every((entry) => entry.model_type === "llm");
862
+ }
863
+
864
+ // src/graph/react/detail/sections/UsageSection.tsx
865
+ import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
866
+ function usageHeadlineScope(usage, isController) {
867
+ return scopeUsage(usage, isController ? "subtree" : "own");
868
+ }
869
+ function costText(scoped) {
870
+ var _a;
871
+ const state = usageState(scoped);
872
+ if (state === "ran-nothing" || state === "unrated") return null;
873
+ const cost = formatCost((_a = scoped.cost) != null ? _a : 0);
874
+ return state === "partial" ? `\u2265 ${cost}` : cost;
875
+ }
876
+ function costTitle(scoped, isController) {
877
+ const scopeWord = isController ? "This pipe and everything below it" : "This pipe";
878
+ const state = usageState(scoped);
879
+ if (state === "partial") {
880
+ return `${scopeWord}: only ${scoped.ratedInferenceCalls} of ${scoped.inferenceCalls} calls were priced, so this is a lower bound. Click for details.`;
881
+ }
882
+ return `${scopeWord}: ${scoped.inferenceCalls} inference call(s). Click for the breakdown.`;
883
+ }
884
+ function Chevron({ open }) {
885
+ return /* @__PURE__ */ jsx4(
886
+ "svg",
887
+ {
888
+ className: `detail-usage-chevron ${open ? "detail-usage-chevron--open" : ""}`,
889
+ width: "10",
890
+ height: "10",
891
+ viewBox: "0 0 24 24",
892
+ fill: "none",
893
+ stroke: "currentColor",
894
+ strokeWidth: "2.5",
895
+ strokeLinecap: "round",
896
+ strokeLinejoin: "round",
897
+ "aria-hidden": "true",
898
+ children: /* @__PURE__ */ jsx4("polyline", { points: "6 9 12 15 18 9" })
899
+ }
900
+ );
901
+ }
902
+ function UsageCostInline({
903
+ usage,
904
+ isController,
905
+ expanded,
906
+ onToggle
907
+ }) {
908
+ const scoped = usageHeadlineScope(usage, isController);
909
+ const text = costText(scoped);
910
+ if (text === null) return null;
911
+ return /* @__PURE__ */ jsxs4(
912
+ "button",
913
+ {
914
+ type: "button",
915
+ className: "detail-usage-inline",
916
+ "aria-expanded": expanded,
917
+ onClick: onToggle,
918
+ title: costTitle(scoped, isController),
919
+ children: [
920
+ /* @__PURE__ */ jsx4("span", { className: "detail-usage-value", children: text }),
921
+ /* @__PURE__ */ jsx4(Chevron, { open: expanded })
922
+ ]
923
+ }
924
+ );
925
+ }
926
+ var PAIRED_CATEGORIES = /* @__PURE__ */ new Set(["input", "output"]);
927
+ function extraCategories(nbTokensByCategory) {
928
+ return Object.entries(nbTokensByCategory).filter(([category, nbTokens]) => !PAIRED_CATEGORIES.has(category) && nbTokens > 0).sort(([a], [b]) => a.localeCompare(b));
929
+ }
930
+ function UsageColumn({ scoped, label }) {
931
+ var _a, _b, _c;
932
+ const showsTokens = hasRealTokenCounts(scoped);
933
+ const isPriced = scoped.cost !== null;
934
+ const nbTokensInput = (_a = scoped.nbTokensByCategory.input) != null ? _a : 0;
935
+ const nbTokensOutput = (_b = scoped.nbTokensByCategory.output) != null ? _b : 0;
936
+ return /* @__PURE__ */ jsxs4("div", { children: [
937
+ /* @__PURE__ */ jsx4("div", { className: "detail-section-label", children: label }),
938
+ /* @__PURE__ */ jsx4(KV, { label: "inference calls", value: scoped.inferenceCalls }),
939
+ /* @__PURE__ */ jsx4(KV, { label: "priced calls", value: scoped.ratedInferenceCalls }),
940
+ showsTokens && /* @__PURE__ */ jsx4(KV, { label: "input tokens", value: nbTokensInput.toLocaleString() }),
941
+ isPriced && scoped.costInput !== null && /* @__PURE__ */ jsx4(KV, { label: "input cost", value: formatCost(scoped.costInput) }),
942
+ showsTokens && /* @__PURE__ */ jsx4(KV, { label: "output tokens", value: nbTokensOutput.toLocaleString() }),
943
+ isPriced && scoped.costOutput !== null && /* @__PURE__ */ jsx4(KV, { label: "output cost", value: formatCost(scoped.costOutput) }),
944
+ showsTokens && /* @__PURE__ */ jsx4(KV, { label: "total tokens", value: scoped.totalTokens.toLocaleString() }),
945
+ /* @__PURE__ */ jsx4(KV, { label: "total cost", value: isPriced ? formatCost((_c = scoped.cost) != null ? _c : 0) : "not priced" }),
946
+ showsTokens && extraCategories(scoped.nbTokensByCategory).map(([category, nbTokens]) => /* @__PURE__ */ jsx4(KV, { label: `tokens \xB7 ${category}`, value: nbTokens.toLocaleString() }, category))
947
+ ] });
948
+ }
949
+ function UsageDetails({
950
+ usage,
951
+ isController
952
+ }) {
953
+ const own = scopeUsage(usage, "own");
954
+ const subtree = scopeUsage(usage, "subtree");
955
+ const showsSubtree = isController || subtree.inferenceCalls !== own.inferenceCalls;
956
+ return /* @__PURE__ */ jsxs4("div", { className: "detail-usage-details", children: [
957
+ /* @__PURE__ */ jsx4(UsageColumn, { scoped: own, label: isController ? "This pipe itself" : "Usage" }),
958
+ showsSubtree && /* @__PURE__ */ jsx4(UsageColumn, { scoped: subtree, label: "This pipe and everything below it" })
959
+ ] });
960
+ }
802
961
 
803
962
  // src/graph/react/detail/sections/PipeLLMDetail.tsx
804
- import { Fragment, jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
963
+ import { Fragment, jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
805
964
  function PipeLLMSection({
806
965
  blueprint,
807
- executionData
966
+ executionData,
967
+ modelsRan,
968
+ modelHandles
808
969
  }) {
809
970
  var _a, _b, _c, _d, _e;
810
971
  const spec = blueprint.llm_prompt_spec;
@@ -812,44 +973,54 @@ function PipeLLMSection({
812
973
  const hasDocRefs = spec.user_document_references && spec.user_document_references.length > 0;
813
974
  const hasSysImageRefs = spec.system_image_references && spec.system_image_references.length > 0;
814
975
  const hasSysDocRefs = spec.system_document_references && spec.system_document_references.length > 0;
815
- const resolvedModel = executionData == null ? void 0 : executionData.resolved_model;
816
- const resolvedModelForObject = executionData == null ? void 0 : executionData.resolved_model_for_object;
976
+ const resolvedModel = modelHandles == null ? void 0 : modelHandles.resolved_model;
977
+ const resolvedModelForObject = modelHandles == null ? void 0 : modelHandles.resolved_model_for_object;
817
978
  const renderedSystem = executionData == null ? void 0 : executionData.rendered_system_prompt;
818
979
  const renderedUser = executionData == null ? void 0 : executionData.rendered_user_prompt;
819
980
  const structuringPath = executionData == null ? void 0 : executionData.structuring_path;
820
981
  const isMultipleOutput = executionData == null ? void 0 : executionData.is_multiple_output;
821
- const modelDisplay = resolvedModel || ((_a = blueprint.llm_choices) == null ? void 0 : _a.for_text);
822
- const modelForObjectDisplay = resolvedModelForObject || ((_b = blueprint.llm_choices) == null ? void 0 : _b.for_object);
823
- return /* @__PURE__ */ jsxs4(Fragment, { children: [
824
- /* @__PURE__ */ jsx4(KV, { label: "Model", value: modelDisplay }),
825
- modelForObjectDisplay && modelForObjectDisplay !== modelDisplay && /* @__PURE__ */ jsx4(KV, { label: "Model (object)", value: modelForObjectDisplay }),
826
- /* @__PURE__ */ jsx4(KV, { label: "Structuring", value: structuringPath || blueprint.structuring_method }),
827
- /* @__PURE__ */ jsx4(KV, { label: "Multiple Output", value: isMultipleOutput }),
828
- /* @__PURE__ */ jsx4(KV, { label: "Output Multiplicity", value: blueprint.output_multiplicity }),
829
- /* @__PURE__ */ jsx4(KV, { label: "Prompt Category", value: (_c = spec.prompt_blueprint) == null ? void 0 : _c.category }),
830
- hasImageRefs && /* @__PURE__ */ jsx4(KV, { label: "User Image Refs", value: `${spec.user_image_references.length} references` }),
831
- hasDocRefs && /* @__PURE__ */ jsx4(
982
+ const authoredModel = (_a = blueprint.llm_choices) == null ? void 0 : _a.for_text;
983
+ const authoredModelForObject = (_b = blueprint.llm_choices) == null ? void 0 : _b.for_object;
984
+ const hasDistinctObjectRequest = Boolean(
985
+ authoredModelForObject && authoredModelForObject !== authoredModel
986
+ );
987
+ return /* @__PURE__ */ jsxs5(Fragment, { children: [
988
+ /* @__PURE__ */ jsx5(ModelRows, { modelsRan, authored: authoredModel, handle: resolvedModel }),
989
+ hasDistinctObjectRequest && /* @__PURE__ */ jsx5(
990
+ ModelRows,
991
+ {
992
+ authored: authoredModelForObject,
993
+ handle: resolvedModelForObject,
994
+ label: "Model (object)"
995
+ }
996
+ ),
997
+ /* @__PURE__ */ jsx5(KV, { label: "Structuring", value: structuringPath || blueprint.structuring_method }),
998
+ /* @__PURE__ */ jsx5(KV, { label: "Multiple Output", value: isMultipleOutput }),
999
+ /* @__PURE__ */ jsx5(KV, { label: "Output Multiplicity", value: blueprint.output_multiplicity }),
1000
+ /* @__PURE__ */ jsx5(KV, { label: "Prompt Category", value: (_c = spec.prompt_blueprint) == null ? void 0 : _c.category }),
1001
+ hasImageRefs && /* @__PURE__ */ jsx5(KV, { label: "User Image Refs", value: `${spec.user_image_references.length} references` }),
1002
+ hasDocRefs && /* @__PURE__ */ jsx5(
832
1003
  KV,
833
1004
  {
834
1005
  label: "User Document Refs",
835
1006
  value: `${spec.user_document_references.length} references`
836
1007
  }
837
1008
  ),
838
- hasSysImageRefs && /* @__PURE__ */ jsx4(
1009
+ hasSysImageRefs && /* @__PURE__ */ jsx5(
839
1010
  KV,
840
1011
  {
841
1012
  label: "System Image Refs",
842
1013
  value: `${spec.system_image_references.length} references`
843
1014
  }
844
1015
  ),
845
- hasSysDocRefs && /* @__PURE__ */ jsx4(
1016
+ hasSysDocRefs && /* @__PURE__ */ jsx5(
846
1017
  KV,
847
1018
  {
848
1019
  label: "System Document Refs",
849
1020
  value: `${spec.system_document_references.length} references`
850
1021
  }
851
1022
  ),
852
- /* @__PURE__ */ jsx4(
1023
+ /* @__PURE__ */ jsx5(
853
1024
  PromptToggle,
854
1025
  {
855
1026
  label: "System Prompt",
@@ -857,7 +1028,7 @@ function PipeLLMSection({
857
1028
  renderedText: renderedSystem
858
1029
  }
859
1030
  ),
860
- /* @__PURE__ */ jsx4(
1031
+ /* @__PURE__ */ jsx5(
861
1032
  PromptToggle,
862
1033
  {
863
1034
  label: "Prompt",
@@ -869,19 +1040,21 @@ function PipeLLMSection({
869
1040
  }
870
1041
 
871
1042
  // src/graph/react/detail/sections/PipeImgGenDetail.tsx
872
- import { Fragment as Fragment2, jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
1043
+ import { Fragment as Fragment2, jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
873
1044
  function PipeImgGenSection({
874
1045
  blueprint,
875
- executionData
1046
+ executionData,
1047
+ modelsRan,
1048
+ modelHandles
876
1049
  }) {
877
1050
  var _a, _b, _c;
878
1051
  const spec = blueprint.img_gen_prompt_blueprint;
879
- const resolvedModel = executionData == null ? void 0 : executionData.resolved_model;
1052
+ const resolvedModel = modelHandles == null ? void 0 : modelHandles.resolved_model;
880
1053
  const renderedPrompt = executionData == null ? void 0 : executionData.rendered_prompt;
881
1054
  const renderedNegative = executionData == null ? void 0 : executionData.rendered_negative_prompt;
882
- return /* @__PURE__ */ jsxs5(Fragment2, { children: [
883
- /* @__PURE__ */ jsx5(KV, { label: "Model", value: resolvedModel || blueprint.img_gen_choice }),
884
- /* @__PURE__ */ jsx5(
1055
+ return /* @__PURE__ */ jsxs6(Fragment2, { children: [
1056
+ /* @__PURE__ */ jsx6(ModelRows, { modelsRan, authored: blueprint.img_gen_choice, handle: resolvedModel }),
1057
+ /* @__PURE__ */ jsx6(
885
1058
  PromptToggle,
886
1059
  {
887
1060
  label: "Prompt",
@@ -889,7 +1062,7 @@ function PipeImgGenSection({
889
1062
  renderedText: renderedPrompt
890
1063
  }
891
1064
  ),
892
- /* @__PURE__ */ jsx5(
1065
+ /* @__PURE__ */ jsx6(
893
1066
  PromptToggle,
894
1067
  {
895
1068
  label: "Negative Prompt",
@@ -897,12 +1070,12 @@ function PipeImgGenSection({
897
1070
  renderedText: renderedNegative
898
1071
  }
899
1072
  ),
900
- /* @__PURE__ */ jsx5(KV, { label: "Aspect Ratio", value: blueprint.aspect_ratio }),
901
- /* @__PURE__ */ jsx5(KV, { label: "Output Format", value: blueprint.output_format }),
902
- /* @__PURE__ */ jsx5(KV, { label: "Background", value: blueprint.background }),
903
- /* @__PURE__ */ jsx5(KV, { label: "Is Raw", value: blueprint.is_raw }),
904
- /* @__PURE__ */ jsx5(KV, { label: "Seed", value: blueprint.seed }),
905
- /* @__PURE__ */ jsx5(
1073
+ /* @__PURE__ */ jsx6(KV, { label: "Aspect Ratio", value: blueprint.aspect_ratio }),
1074
+ /* @__PURE__ */ jsx6(KV, { label: "Output Format", value: blueprint.output_format }),
1075
+ /* @__PURE__ */ jsx6(KV, { label: "Background", value: blueprint.background }),
1076
+ /* @__PURE__ */ jsx6(KV, { label: "Is Raw", value: blueprint.is_raw }),
1077
+ /* @__PURE__ */ jsx6(KV, { label: "Seed", value: blueprint.seed }),
1078
+ /* @__PURE__ */ jsx6(
906
1079
  KV,
907
1080
  {
908
1081
  label: "Images",
@@ -913,36 +1086,39 @@ function PipeImgGenSection({
913
1086
  }
914
1087
 
915
1088
  // src/graph/react/detail/sections/PipeExtractDetail.tsx
916
- import { Fragment as Fragment3, jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
1089
+ import { Fragment as Fragment3, jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
917
1090
  function PipeExtractSection({
918
1091
  blueprint,
919
- executionData
1092
+ modelsRan,
1093
+ modelHandles
920
1094
  }) {
921
- const resolvedModel = executionData == null ? void 0 : executionData.resolved_model;
922
- return /* @__PURE__ */ jsxs6(Fragment3, { children: [
923
- /* @__PURE__ */ jsx6(KV, { label: "Model", value: resolvedModel || blueprint.extract_choice }),
924
- /* @__PURE__ */ jsx6(KV, { label: "Document Variable", value: blueprint.document_stuff_name }),
925
- /* @__PURE__ */ jsx6(KV, { label: "Caption Images", value: blueprint.should_caption_images }),
926
- /* @__PURE__ */ jsx6(KV, { label: "Max Page Images", value: blueprint.max_page_images }),
927
- /* @__PURE__ */ jsx6(KV, { label: "Include Page Views", value: blueprint.should_include_page_views }),
928
- /* @__PURE__ */ jsx6(KV, { label: "Page Views DPI", value: blueprint.page_views_dpi }),
929
- /* @__PURE__ */ jsx6(KV, { label: "Render JS", value: blueprint.render_js }),
930
- /* @__PURE__ */ jsx6(KV, { label: "Include Raw HTML", value: blueprint.include_raw_html }),
931
- /* @__PURE__ */ jsx6(KV, { label: "Image Variable", value: blueprint.image_stuff_name })
1095
+ const resolvedModel = modelHandles == null ? void 0 : modelHandles.resolved_model;
1096
+ return /* @__PURE__ */ jsxs7(Fragment3, { children: [
1097
+ /* @__PURE__ */ jsx7(ModelRows, { modelsRan, authored: blueprint.extract_choice, handle: resolvedModel }),
1098
+ /* @__PURE__ */ jsx7(KV, { label: "Document Variable", value: blueprint.document_stuff_name }),
1099
+ /* @__PURE__ */ jsx7(KV, { label: "Caption Images", value: blueprint.should_caption_images }),
1100
+ /* @__PURE__ */ jsx7(KV, { label: "Max Page Images", value: blueprint.max_page_images }),
1101
+ /* @__PURE__ */ jsx7(KV, { label: "Include Page Views", value: blueprint.should_include_page_views }),
1102
+ /* @__PURE__ */ jsx7(KV, { label: "Page Views DPI", value: blueprint.page_views_dpi }),
1103
+ /* @__PURE__ */ jsx7(KV, { label: "Render JS", value: blueprint.render_js }),
1104
+ /* @__PURE__ */ jsx7(KV, { label: "Include Raw HTML", value: blueprint.include_raw_html }),
1105
+ /* @__PURE__ */ jsx7(KV, { label: "Image Variable", value: blueprint.image_stuff_name })
932
1106
  ] });
933
1107
  }
934
1108
 
935
1109
  // src/graph/react/detail/sections/PipeSearchDetail.tsx
936
- import { Fragment as Fragment4, jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
1110
+ import { Fragment as Fragment4, jsx as jsx8, jsxs as jsxs8 } from "react/jsx-runtime";
937
1111
  function PipeSearchSection({
938
1112
  blueprint,
939
- executionData
1113
+ executionData,
1114
+ modelsRan,
1115
+ modelHandles
940
1116
  }) {
941
- const resolvedModel = executionData == null ? void 0 : executionData.resolved_model;
1117
+ const resolvedModel = modelHandles == null ? void 0 : modelHandles.resolved_model;
942
1118
  const renderedQuery = executionData == null ? void 0 : executionData.rendered_query;
943
- return /* @__PURE__ */ jsxs7(Fragment4, { children: [
944
- /* @__PURE__ */ jsx7(KV, { label: "Model", value: resolvedModel || blueprint.search_choice }),
945
- /* @__PURE__ */ jsx7(
1119
+ return /* @__PURE__ */ jsxs8(Fragment4, { children: [
1120
+ /* @__PURE__ */ jsx8(ModelRows, { modelsRan, authored: blueprint.search_choice, handle: resolvedModel }),
1121
+ /* @__PURE__ */ jsx8(
946
1122
  PromptToggle,
947
1123
  {
948
1124
  label: "Search Query",
@@ -950,13 +1126,13 @@ function PipeSearchSection({
950
1126
  renderedText: renderedQuery
951
1127
  }
952
1128
  ),
953
- /* @__PURE__ */ jsx7(KV, { label: "Max Results", value: blueprint.max_results_override }),
954
- /* @__PURE__ */ jsx7(KV, { label: "Include Images", value: blueprint.include_images_override }),
955
- /* @__PURE__ */ jsx7(KV, { label: "Structured Output", value: blueprint.is_structured_output }),
956
- /* @__PURE__ */ jsx7(KV, { label: "From Date", value: blueprint.from_date }),
957
- /* @__PURE__ */ jsx7(KV, { label: "To Date", value: blueprint.to_date }),
958
- blueprint.include_domains && blueprint.include_domains.length > 0 && /* @__PURE__ */ jsx7(KV, { label: "Include Domains", value: blueprint.include_domains.join(", ") }),
959
- blueprint.exclude_domains && blueprint.exclude_domains.length > 0 && /* @__PURE__ */ jsx7(KV, { label: "Exclude Domains", value: blueprint.exclude_domains.join(", ") })
1129
+ /* @__PURE__ */ jsx8(KV, { label: "Max Results", value: blueprint.max_results_override }),
1130
+ /* @__PURE__ */ jsx8(KV, { label: "Include Images", value: blueprint.include_images_override }),
1131
+ /* @__PURE__ */ jsx8(KV, { label: "Structured Output", value: blueprint.is_structured_output }),
1132
+ /* @__PURE__ */ jsx8(KV, { label: "From Date", value: blueprint.from_date }),
1133
+ /* @__PURE__ */ jsx8(KV, { label: "To Date", value: blueprint.to_date }),
1134
+ blueprint.include_domains && blueprint.include_domains.length > 0 && /* @__PURE__ */ jsx8(KV, { label: "Include Domains", value: blueprint.include_domains.join(", ") }),
1135
+ blueprint.exclude_domains && blueprint.exclude_domains.length > 0 && /* @__PURE__ */ jsx8(KV, { label: "Exclude Domains", value: blueprint.exclude_domains.join(", ") })
960
1136
  ] });
961
1137
  }
962
1138
 
@@ -979,26 +1155,28 @@ function labelFromLlmChoice(choice) {
979
1155
  }
980
1156
 
981
1157
  // src/graph/react/detail/sections/PipeStructureDetail.tsx
982
- import { Fragment as Fragment5, jsx as jsx8, jsxs as jsxs8 } from "react/jsx-runtime";
1158
+ import { Fragment as Fragment5, jsx as jsx9, jsxs as jsxs9 } from "react/jsx-runtime";
983
1159
  function PipeStructureSection({
984
1160
  blueprint,
985
- executionData
1161
+ executionData,
1162
+ modelsRan,
1163
+ modelHandles
986
1164
  }) {
987
- const resolvedModel = executionData == null ? void 0 : executionData.resolved_model;
1165
+ const resolvedModel = modelHandles == null ? void 0 : modelHandles.resolved_model;
988
1166
  const isMultipleOutput = executionData == null ? void 0 : executionData.is_multiple_output;
989
1167
  const renderedUser = executionData == null ? void 0 : executionData.rendered_user_prompt;
990
- const modelDisplay = resolvedModel || labelFromLlmChoice(blueprint.llm_choice);
991
- return /* @__PURE__ */ jsxs8(Fragment5, { children: [
992
- /* @__PURE__ */ jsx8(KV, { label: "Model", value: modelDisplay }),
993
- /* @__PURE__ */ jsx8(KV, { label: "Text Variable", value: blueprint.text_input_name }),
994
- /* @__PURE__ */ jsx8(KV, { label: "Multiple Output", value: isMultipleOutput }),
995
- /* @__PURE__ */ jsx8(KV, { label: "Output Multiplicity", value: blueprint.output_multiplicity }),
996
- /* @__PURE__ */ jsx8(PromptToggle, { label: "Prompt", templateText: void 0, renderedText: renderedUser })
1168
+ const authoredModel = labelFromLlmChoice(blueprint.llm_choice);
1169
+ return /* @__PURE__ */ jsxs9(Fragment5, { children: [
1170
+ /* @__PURE__ */ jsx9(ModelRows, { modelsRan, authored: authoredModel, handle: resolvedModel }),
1171
+ /* @__PURE__ */ jsx9(KV, { label: "Text Variable", value: blueprint.text_input_name }),
1172
+ /* @__PURE__ */ jsx9(KV, { label: "Multiple Output", value: isMultipleOutput }),
1173
+ /* @__PURE__ */ jsx9(KV, { label: "Output Multiplicity", value: blueprint.output_multiplicity }),
1174
+ /* @__PURE__ */ jsx9(PromptToggle, { label: "Prompt", templateText: void 0, renderedText: renderedUser })
997
1175
  ] });
998
1176
  }
999
1177
 
1000
1178
  // src/graph/react/detail/sections/PipeComposeDetail.tsx
1001
- import { Fragment as Fragment6, jsx as jsx9, jsxs as jsxs9 } from "react/jsx-runtime";
1179
+ import { Fragment as Fragment6, jsx as jsx10, jsxs as jsxs10 } from "react/jsx-runtime";
1002
1180
  function formatLeafField(field) {
1003
1181
  var _a, _b;
1004
1182
  switch (field.method) {
@@ -1019,9 +1197,9 @@ function isLongValue(text) {
1019
1197
  return text.length > LONG_VALUE_THRESHOLD_CHARS || text.includes("\n");
1020
1198
  }
1021
1199
  function FieldBlock({ label, value }) {
1022
- return /* @__PURE__ */ jsxs9("div", { className: "detail-field-block", children: [
1023
- /* @__PURE__ */ jsx9("div", { className: "detail-field-block-label", children: label }),
1024
- /* @__PURE__ */ jsx9("div", { className: "detail-field-block-value", children: value })
1200
+ return /* @__PURE__ */ jsxs10("div", { className: "detail-field-block", children: [
1201
+ /* @__PURE__ */ jsx10("div", { className: "detail-field-block-label", children: label }),
1202
+ /* @__PURE__ */ jsx10("div", { className: "detail-field-block-value", children: value })
1025
1203
  ] });
1026
1204
  }
1027
1205
  function ConstructFieldsBlock({
@@ -1042,18 +1220,18 @@ function ConstructFieldsBlock({
1042
1220
  }
1043
1221
  }
1044
1222
  const indentStyle = depth > 0 ? { paddingLeft: depth * 12 } : void 0;
1045
- return /* @__PURE__ */ jsxs9(Fragment6, { children: [
1223
+ return /* @__PURE__ */ jsxs10(Fragment6, { children: [
1046
1224
  leafFields.map(([name, field]) => {
1047
1225
  const display = formatLeafField(field);
1048
1226
  if (isLongValue(display)) {
1049
- return /* @__PURE__ */ jsx9("div", { style: indentStyle, children: /* @__PURE__ */ jsx9(FieldBlock, { label: name, value: display }) }, name);
1227
+ return /* @__PURE__ */ jsx10("div", { style: indentStyle, children: /* @__PURE__ */ jsx10(FieldBlock, { label: name, value: display }) }, name);
1050
1228
  }
1051
- return /* @__PURE__ */ jsx9("div", { style: indentStyle, children: /* @__PURE__ */ jsx9(KV, { label: name, value: display }) }, name);
1229
+ return /* @__PURE__ */ jsx10("div", { style: indentStyle, children: /* @__PURE__ */ jsx10(KV, { label: name, value: display }) }, name);
1052
1230
  }),
1053
1231
  templateFields.map(([name, field]) => {
1054
1232
  var _a, _b;
1055
1233
  const renderedForField = (_a = fieldResolutions == null ? void 0 : fieldResolutions[name]) == null ? void 0 : _a.rendered;
1056
- return /* @__PURE__ */ jsx9("div", { style: indentStyle, children: /* @__PURE__ */ jsx9(
1234
+ return /* @__PURE__ */ jsx10("div", { style: indentStyle, children: /* @__PURE__ */ jsx10(
1057
1235
  PromptToggle,
1058
1236
  {
1059
1237
  label: `Template \u2014 ${name}`,
@@ -1064,15 +1242,15 @@ function ConstructFieldsBlock({
1064
1242
  }),
1065
1243
  nestedFields.map(([name, field]) => {
1066
1244
  if (!field.nested) return null;
1067
- return /* @__PURE__ */ jsxs9("div", { children: [
1068
- /* @__PURE__ */ jsxs9(
1245
+ return /* @__PURE__ */ jsxs10("div", { children: [
1246
+ /* @__PURE__ */ jsxs10(
1069
1247
  "div",
1070
1248
  {
1071
1249
  className: "detail-nested-header",
1072
1250
  style: depth > 0 ? { paddingLeft: depth * 12 } : void 0,
1073
1251
  children: [
1074
- /* @__PURE__ */ jsx9("span", { className: "detail-nested-header-name", children: name }),
1075
- /* @__PURE__ */ jsxs9("span", { className: "detail-nested-header-meta", children: [
1252
+ /* @__PURE__ */ jsx10("span", { className: "detail-nested-header-name", children: name }),
1253
+ /* @__PURE__ */ jsxs10("span", { className: "detail-nested-header-meta", children: [
1076
1254
  "nested \xB7 ",
1077
1255
  Object.keys(field.nested.fields).length,
1078
1256
  " field",
@@ -1081,7 +1259,7 @@ function ConstructFieldsBlock({
1081
1259
  ]
1082
1260
  }
1083
1261
  ),
1084
- /* @__PURE__ */ jsx9(
1262
+ /* @__PURE__ */ jsx10(
1085
1263
  ConstructFieldsBlock,
1086
1264
  {
1087
1265
  blueprint: field.nested,
@@ -1103,11 +1281,11 @@ function PipeComposeSection({
1103
1281
  const fieldResolutions = (_a = executionData == null ? void 0 : executionData.fields) != null ? _a : null;
1104
1282
  const constructBlueprint = blueprint.construct_blueprint;
1105
1283
  const hasConstruct = constructBlueprint !== null && Object.keys(constructBlueprint.fields).length > 0;
1106
- return /* @__PURE__ */ jsxs9(Fragment6, { children: [
1107
- /* @__PURE__ */ jsx9(KV, { label: "Mode", value: composeMode || (hasConstruct ? "construct" : "template") }),
1108
- /* @__PURE__ */ jsx9(KV, { label: "Category", value: blueprint.category }),
1109
- /* @__PURE__ */ jsx9(KV, { label: "Templating Style", value: blueprint.templating_style }),
1110
- blueprint.template && /* @__PURE__ */ jsx9(
1284
+ return /* @__PURE__ */ jsxs10(Fragment6, { children: [
1285
+ /* @__PURE__ */ jsx10(KV, { label: "Mode", value: composeMode || (hasConstruct ? "construct" : "template") }),
1286
+ /* @__PURE__ */ jsx10(KV, { label: "Category", value: blueprint.category }),
1287
+ /* @__PURE__ */ jsx10(KV, { label: "Templating Style", value: blueprint.templating_style }),
1288
+ blueprint.template && /* @__PURE__ */ jsx10(
1111
1289
  PromptToggle,
1112
1290
  {
1113
1291
  label: "Template",
@@ -1115,9 +1293,9 @@ function PipeComposeSection({
1115
1293
  renderedText
1116
1294
  }
1117
1295
  ),
1118
- hasConstruct && /* @__PURE__ */ jsxs9(Fragment6, { children: [
1119
- /* @__PURE__ */ jsx9("div", { className: "detail-section-label", children: "FIELDS" }),
1120
- /* @__PURE__ */ jsx9(
1296
+ hasConstruct && /* @__PURE__ */ jsxs10(Fragment6, { children: [
1297
+ /* @__PURE__ */ jsx10("div", { className: "detail-section-label", children: "FIELDS" }),
1298
+ /* @__PURE__ */ jsx10(
1121
1299
  ConstructFieldsBlock,
1122
1300
  {
1123
1301
  blueprint: constructBlueprint,
@@ -1130,26 +1308,26 @@ function PipeComposeSection({
1130
1308
  }
1131
1309
 
1132
1310
  // src/graph/react/detail/sections/PipeConditionDetail.tsx
1133
- import { Fragment as Fragment7, jsx as jsx10, jsxs as jsxs10 } from "react/jsx-runtime";
1311
+ import { Fragment as Fragment7, jsx as jsx11, jsxs as jsxs11 } from "react/jsx-runtime";
1134
1312
  function PipeConditionSection({
1135
1313
  blueprint,
1136
1314
  executionData
1137
1315
  }) {
1138
1316
  const evaluatedExpression = executionData == null ? void 0 : executionData.evaluated_expression;
1139
1317
  const selectedOutcome = executionData == null ? void 0 : executionData.selected_outcome;
1140
- return /* @__PURE__ */ jsxs10(Fragment7, { children: [
1141
- /* @__PURE__ */ jsx10(PromptBlock, { label: "Expression", text: blueprint.expression }),
1142
- evaluatedExpression && /* @__PURE__ */ jsx10(KV, { label: "Expression Result", value: evaluatedExpression }),
1143
- /* @__PURE__ */ jsxs10("div", { children: [
1144
- /* @__PURE__ */ jsx10("div", { className: "detail-section-label", children: "Outcomes" }),
1145
- Object.entries(blueprint.outcome_map).map(([outcome, pipeCode]) => /* @__PURE__ */ jsxs10(
1318
+ return /* @__PURE__ */ jsxs11(Fragment7, { children: [
1319
+ /* @__PURE__ */ jsx11(PromptBlock, { label: "Expression", text: blueprint.expression }),
1320
+ evaluatedExpression && /* @__PURE__ */ jsx11(KV, { label: "Expression Result", value: evaluatedExpression }),
1321
+ /* @__PURE__ */ jsxs11("div", { children: [
1322
+ /* @__PURE__ */ jsx11("div", { className: "detail-section-label", children: "Outcomes" }),
1323
+ Object.entries(blueprint.outcome_map).map(([outcome, pipeCode]) => /* @__PURE__ */ jsxs11(
1146
1324
  "div",
1147
1325
  {
1148
1326
  className: "detail-kv-row",
1149
1327
  style: selectedOutcome === pipeCode ? { background: "rgba(80,250,123,0.08)" } : void 0,
1150
1328
  children: [
1151
- /* @__PURE__ */ jsx10("span", { className: "detail-kv-key", children: outcome }),
1152
- /* @__PURE__ */ jsx10(
1329
+ /* @__PURE__ */ jsx11("span", { className: "detail-kv-key", children: outcome }),
1330
+ /* @__PURE__ */ jsx11(
1153
1331
  "span",
1154
1332
  {
1155
1333
  className: "detail-kv-value",
@@ -1161,26 +1339,26 @@ function PipeConditionSection({
1161
1339
  },
1162
1340
  outcome
1163
1341
  )),
1164
- /* @__PURE__ */ jsxs10("div", { className: "detail-kv-row", children: [
1165
- /* @__PURE__ */ jsx10("span", { className: "detail-kv-key", children: "default" }),
1166
- /* @__PURE__ */ jsx10("span", { className: "detail-kv-value", children: blueprint.default_outcome })
1342
+ /* @__PURE__ */ jsxs11("div", { className: "detail-kv-row", children: [
1343
+ /* @__PURE__ */ jsx11("span", { className: "detail-kv-key", children: "default" }),
1344
+ /* @__PURE__ */ jsx11("span", { className: "detail-kv-value", children: blueprint.default_outcome })
1167
1345
  ] })
1168
1346
  ] }),
1169
- /* @__PURE__ */ jsx10(KV, { label: "Alias Expression To", value: blueprint.add_alias_from_expression_to })
1347
+ /* @__PURE__ */ jsx11(KV, { label: "Alias Expression To", value: blueprint.add_alias_from_expression_to })
1170
1348
  ] });
1171
1349
  }
1172
1350
 
1173
1351
  // src/graph/react/detail/sections/PipeSequenceDetail.tsx
1174
- import { jsx as jsx11, jsxs as jsxs11 } from "react/jsx-runtime";
1352
+ import { jsx as jsx12, jsxs as jsxs12 } from "react/jsx-runtime";
1175
1353
  function PipeSequenceSection({
1176
1354
  blueprint
1177
1355
  }) {
1178
- return /* @__PURE__ */ jsxs11("div", { children: [
1179
- /* @__PURE__ */ jsx11("div", { className: "detail-section-label", children: "Steps" }),
1180
- /* @__PURE__ */ jsx11("div", { className: "detail-steps-list", children: blueprint.sequential_sub_pipes.map((step, idx) => /* @__PURE__ */ jsxs11("div", { className: "detail-step-item", children: [
1181
- /* @__PURE__ */ jsx11("span", { className: "detail-step-index", children: idx + 1 }),
1182
- /* @__PURE__ */ jsx11("span", { className: "detail-step-code", children: step.pipe_code }),
1183
- step.output_name && /* @__PURE__ */ jsxs11("span", { className: "detail-io-concept", children: [
1356
+ return /* @__PURE__ */ jsxs12("div", { children: [
1357
+ /* @__PURE__ */ jsx12("div", { className: "detail-section-label", children: "Steps" }),
1358
+ /* @__PURE__ */ jsx12("div", { className: "detail-steps-list", children: blueprint.sequential_sub_pipes.map((step, idx) => /* @__PURE__ */ jsxs12("div", { className: "detail-step-item", children: [
1359
+ /* @__PURE__ */ jsx12("span", { className: "detail-step-index", children: idx + 1 }),
1360
+ /* @__PURE__ */ jsx12("span", { className: "detail-step-code", children: step.pipe_code }),
1361
+ step.output_name && /* @__PURE__ */ jsxs12("span", { className: "detail-io-concept", children: [
1184
1362
  "-> ",
1185
1363
  step.output_name
1186
1364
  ] })
@@ -1189,38 +1367,38 @@ function PipeSequenceSection({
1189
1367
  }
1190
1368
 
1191
1369
  // src/graph/react/detail/sections/PipeParallelDetail.tsx
1192
- import { Fragment as Fragment8, jsx as jsx12, jsxs as jsxs12 } from "react/jsx-runtime";
1370
+ import { Fragment as Fragment8, jsx as jsx13, jsxs as jsxs13 } from "react/jsx-runtime";
1193
1371
  function PipeParallelSection({
1194
1372
  blueprint
1195
1373
  }) {
1196
- return /* @__PURE__ */ jsxs12(Fragment8, { children: [
1197
- /* @__PURE__ */ jsxs12("div", { children: [
1198
- /* @__PURE__ */ jsx12("div", { className: "detail-section-label", children: "Branches" }),
1199
- /* @__PURE__ */ jsx12("div", { className: "detail-steps-list", children: blueprint.parallel_sub_pipes.map((branch, idx) => /* @__PURE__ */ jsxs12("div", { className: "detail-step-item", children: [
1200
- /* @__PURE__ */ jsx12("span", { className: "detail-step-code", children: branch.pipe_code }),
1201
- branch.output_name && /* @__PURE__ */ jsxs12("span", { className: "detail-io-concept", children: [
1374
+ return /* @__PURE__ */ jsxs13(Fragment8, { children: [
1375
+ /* @__PURE__ */ jsxs13("div", { children: [
1376
+ /* @__PURE__ */ jsx13("div", { className: "detail-section-label", children: "Branches" }),
1377
+ /* @__PURE__ */ jsx13("div", { className: "detail-steps-list", children: blueprint.parallel_sub_pipes.map((branch, idx) => /* @__PURE__ */ jsxs13("div", { className: "detail-step-item", children: [
1378
+ /* @__PURE__ */ jsx13("span", { className: "detail-step-code", children: branch.pipe_code }),
1379
+ branch.output_name && /* @__PURE__ */ jsxs13("span", { className: "detail-io-concept", children: [
1202
1380
  "-> ",
1203
1381
  branch.output_name
1204
1382
  ] })
1205
1383
  ] }, idx)) })
1206
1384
  ] }),
1207
- /* @__PURE__ */ jsx12(KV, { label: "Add Each Output", value: blueprint.add_each_output }),
1208
- /* @__PURE__ */ jsx12(KV, { label: "Combined Output", value: blueprint.combined_output })
1385
+ /* @__PURE__ */ jsx13(KV, { label: "Add Each Output", value: blueprint.add_each_output }),
1386
+ /* @__PURE__ */ jsx13(KV, { label: "Combined Output", value: blueprint.combined_output })
1209
1387
  ] });
1210
1388
  }
1211
1389
 
1212
1390
  // src/graph/react/detail/sections/PipeBatchDetail.tsx
1213
- import { Fragment as Fragment9, jsx as jsx13, jsxs as jsxs13 } from "react/jsx-runtime";
1391
+ import { Fragment as Fragment9, jsx as jsx14, jsxs as jsxs14 } from "react/jsx-runtime";
1214
1392
  function PipeBatchSection({
1215
1393
  blueprint,
1216
1394
  executionData
1217
1395
  }) {
1218
1396
  const itemCount = executionData == null ? void 0 : executionData.item_count;
1219
- return /* @__PURE__ */ jsxs13(Fragment9, { children: [
1220
- /* @__PURE__ */ jsx13(KV, { label: "Branch Pipe", value: blueprint.branch_pipe_code }),
1221
- /* @__PURE__ */ jsx13(KV, { label: "Input List Variable", value: blueprint.batch_params.input_list_stuff_name }),
1222
- /* @__PURE__ */ jsx13(KV, { label: "Input Item Variable", value: blueprint.batch_params.input_item_stuff_name }),
1223
- itemCount != null && /* @__PURE__ */ jsx13(KV, { label: "Items Processed", value: itemCount })
1397
+ return /* @__PURE__ */ jsxs14(Fragment9, { children: [
1398
+ /* @__PURE__ */ jsx14(KV, { label: "Branch Pipe", value: blueprint.branch_pipe_code }),
1399
+ /* @__PURE__ */ jsx14(KV, { label: "Input List Variable", value: blueprint.batch_params.input_list_stuff_name }),
1400
+ /* @__PURE__ */ jsx14(KV, { label: "Input Item Variable", value: blueprint.batch_params.input_item_stuff_name }),
1401
+ itemCount != null && /* @__PURE__ */ jsx14(KV, { label: "Items Processed", value: itemCount })
1224
1402
  ] });
1225
1403
  }
1226
1404
 
@@ -1243,7 +1421,7 @@ function shouldDumpExecutionData(pipeType, hasBlueprint) {
1243
1421
  }
1244
1422
 
1245
1423
  // src/graph/react/detail/PipeDetailPanel.tsx
1246
- import { Fragment as Fragment10, jsx as jsx14, jsxs as jsxs14 } from "react/jsx-runtime";
1424
+ import { Fragment as Fragment10, jsx as jsx15, jsxs as jsxs15 } from "react/jsx-runtime";
1247
1425
  var PIPE_TYPE_BADGES = {
1248
1426
  PipeLLM: "LLM",
1249
1427
  PipeExtract: "Extract",
@@ -1273,7 +1451,7 @@ var STATUS_COLORS = {
1273
1451
  canceled: "#6272a4"
1274
1452
  };
1275
1453
  function PipeDetailPanel({ node, spec, onConceptClick }) {
1276
- var _a, _b, _c, _d, _e, _f, _g;
1454
+ var _a, _b, _c, _d, _e, _f, _g, _h;
1277
1455
  const pipeType = node.pipe_type;
1278
1456
  const isController = CONTROLLER_TYPES.has(pipeType);
1279
1457
  const isStatic = isStaticGraphSpec(spec);
@@ -1292,20 +1470,21 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1292
1470
  }
1293
1471
  return void 0;
1294
1472
  }, [node.pipe_code, spec]);
1473
+ const [usageExpanded, setUsageExpanded] = React6.useState(false);
1295
1474
  const inputs = (_c = (_b = node.io) == null ? void 0 : _b.inputs) != null ? _c : [];
1296
1475
  const outputs = (_e = (_d = node.io) == null ? void 0 : _d.outputs) != null ? _e : [];
1297
1476
  const description = (_f = blueprint == null ? void 0 : blueprint.description) != null ? _f : node.description;
1298
- return /* @__PURE__ */ jsxs14(Fragment10, { children: [
1299
- /* @__PURE__ */ jsxs14("div", { className: "detail-sticky-header", children: [
1300
- /* @__PURE__ */ jsxs14("div", { className: "detail-header", children: [
1301
- /* @__PURE__ */ jsx14(
1477
+ return /* @__PURE__ */ jsxs15(Fragment10, { children: [
1478
+ /* @__PURE__ */ jsxs15("div", { className: "detail-sticky-header", children: [
1479
+ /* @__PURE__ */ jsxs15("div", { className: "detail-header", children: [
1480
+ /* @__PURE__ */ jsx15(
1302
1481
  "span",
1303
1482
  {
1304
1483
  className: `detail-badge ${isController ? "detail-badge--controller" : "detail-badge--operator"}`,
1305
1484
  children: badge
1306
1485
  }
1307
1486
  ),
1308
- /* @__PURE__ */ jsx14(
1487
+ /* @__PURE__ */ jsx15(
1309
1488
  "span",
1310
1489
  {
1311
1490
  className: `detail-pipe-code ${isController ? "detail-pipe-code--controller" : ""}`,
@@ -1313,54 +1492,66 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1313
1492
  }
1314
1493
  )
1315
1494
  ] }),
1316
- !isStatic && /* @__PURE__ */ jsxs14("div", { className: "detail-status", children: [
1317
- /* @__PURE__ */ jsx14("span", { className: "detail-status-dot", style: { background: statusColor } }),
1318
- /* @__PURE__ */ jsx14("span", { className: "detail-status-label", style: { color: statusColor }, children: status }),
1319
- ((_g = node.timing) == null ? void 0 : _g.duration) != null && /* @__PURE__ */ jsx14("span", { className: "detail-duration", children: formatDuration(node.timing.duration) })
1495
+ !isStatic && /* @__PURE__ */ jsxs15("div", { className: "detail-status", children: [
1496
+ /* @__PURE__ */ jsx15("span", { className: "detail-status-dot", style: { background: statusColor } }),
1497
+ /* @__PURE__ */ jsx15("span", { className: "detail-status-label", style: { color: statusColor }, children: status }),
1498
+ ((_g = node.timing) == null ? void 0 : _g.duration) != null && /* @__PURE__ */ jsx15("span", { className: "detail-duration", children: formatDuration(node.timing.duration) }),
1499
+ showsGeneratedData && node.usage && /* @__PURE__ */ jsx15(
1500
+ UsageCostInline,
1501
+ {
1502
+ usage: node.usage,
1503
+ isController,
1504
+ expanded: usageExpanded,
1505
+ onToggle: () => setUsageExpanded((value) => !value)
1506
+ }
1507
+ )
1320
1508
  ] }),
1321
- description && /* @__PURE__ */ jsx14("div", { className: "detail-description", children: description }),
1322
- inputs.length > 0 && /* @__PURE__ */ jsxs14("div", { children: [
1323
- /* @__PURE__ */ jsx14("div", { className: "detail-section-label", children: "Inputs" }),
1324
- /* @__PURE__ */ jsx14("div", { className: "detail-io-list", children: inputs.map((input, idx) => /* @__PURE__ */ jsxs14(
1509
+ showsGeneratedData && node.usage && usageExpanded && /* @__PURE__ */ jsx15(UsageDetails, { usage: node.usage, isController }),
1510
+ description && /* @__PURE__ */ jsx15("div", { className: "detail-description", children: description }),
1511
+ inputs.length > 0 && /* @__PURE__ */ jsxs15("div", { children: [
1512
+ /* @__PURE__ */ jsx15("div", { className: "detail-section-label", children: "Inputs" }),
1513
+ /* @__PURE__ */ jsx15("div", { className: "detail-io-list", children: inputs.map((input, idx) => /* @__PURE__ */ jsxs15(
1325
1514
  "div",
1326
1515
  {
1327
1516
  className: "detail-io-pill",
1328
1517
  style: { cursor: input.concept && onConceptClick ? "pointer" : void 0 },
1329
1518
  onClick: () => input.concept && (onConceptClick == null ? void 0 : onConceptClick(input.concept)),
1330
1519
  children: [
1331
- /* @__PURE__ */ jsx14("span", { className: "detail-io-name", children: input.name }),
1332
- input.concept && /* @__PURE__ */ jsx14("span", { className: "detail-io-concept", children: input.concept })
1520
+ /* @__PURE__ */ jsx15("span", { className: "detail-io-name", children: input.name }),
1521
+ input.concept && /* @__PURE__ */ jsx15("span", { className: "detail-io-concept", children: input.concept })
1333
1522
  ]
1334
1523
  },
1335
1524
  idx
1336
1525
  )) })
1337
1526
  ] }),
1338
- outputs.length > 0 && /* @__PURE__ */ jsxs14("div", { children: [
1339
- /* @__PURE__ */ jsx14("div", { className: "detail-section-label", children: "Output" }),
1340
- /* @__PURE__ */ jsx14("div", { className: "detail-io-list", children: outputs.map((output, idx) => /* @__PURE__ */ jsxs14(
1527
+ outputs.length > 0 && /* @__PURE__ */ jsxs15("div", { children: [
1528
+ /* @__PURE__ */ jsx15("div", { className: "detail-section-label", children: "Output" }),
1529
+ /* @__PURE__ */ jsx15("div", { className: "detail-io-list", children: outputs.map((output, idx) => /* @__PURE__ */ jsxs15(
1341
1530
  "div",
1342
1531
  {
1343
1532
  className: "detail-io-pill",
1344
1533
  style: { cursor: output.concept && onConceptClick ? "pointer" : void 0 },
1345
1534
  onClick: () => output.concept && (onConceptClick == null ? void 0 : onConceptClick(output.concept)),
1346
1535
  children: [
1347
- /* @__PURE__ */ jsx14("span", { className: "detail-io-name", children: output.name }),
1348
- output.concept && /* @__PURE__ */ jsx14("span", { className: "detail-io-concept", children: output.concept })
1536
+ /* @__PURE__ */ jsx15("span", { className: "detail-io-name", children: output.name }),
1537
+ output.concept && /* @__PURE__ */ jsx15("span", { className: "detail-io-concept", children: output.concept })
1349
1538
  ]
1350
1539
  },
1351
1540
  idx
1352
1541
  )) })
1353
1542
  ] }),
1354
- (inputs.length > 0 || outputs.length > 0) && /* @__PURE__ */ jsx14("div", { style: { borderTop: "1px solid rgba(255,255,255,0.06)", margin: "4px 0" } })
1543
+ (inputs.length > 0 || outputs.length > 0) && /* @__PURE__ */ jsx15("div", { style: { borderTop: "1px solid rgba(255,255,255,0.06)", margin: "4px 0" } })
1355
1544
  ] }),
1356
- blueprint && /* @__PURE__ */ jsx14(
1545
+ blueprint && /* @__PURE__ */ jsx15(
1357
1546
  BlueprintSection,
1358
1547
  {
1359
1548
  blueprint,
1360
- executionData: showsGeneratedData ? node.execution_data : void 0
1549
+ executionData: showsGeneratedData ? node.execution_data : void 0,
1550
+ modelsRan: showsGeneratedData ? (_h = node.usage) == null ? void 0 : _h.by_model : void 0,
1551
+ modelHandles: node.execution_data
1361
1552
  }
1362
1553
  ),
1363
- showsGeneratedData && node.execution_data && Object.keys(node.execution_data).length > 0 && /* @__PURE__ */ jsx14(
1554
+ showsGeneratedData && node.execution_data && Object.keys(node.execution_data).length > 0 && /* @__PURE__ */ jsx15(
1364
1555
  ExecutionDataSection,
1365
1556
  {
1366
1557
  executionData: node.execution_data,
@@ -1368,14 +1559,14 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1368
1559
  hasBlueprint: !!blueprint
1369
1560
  }
1370
1561
  ),
1371
- node.error && /* @__PURE__ */ jsxs14("div", { className: "detail-error", children: [
1372
- /* @__PURE__ */ jsx14("div", { className: "detail-error-type", children: node.error.error_type }),
1373
- /* @__PURE__ */ jsx14("div", { className: "detail-error-message", children: node.error.message }),
1374
- node.error.stack && /* @__PURE__ */ jsx14("div", { className: "detail-error-stack", children: node.error.stack })
1562
+ node.error && /* @__PURE__ */ jsxs15("div", { className: "detail-error", children: [
1563
+ /* @__PURE__ */ jsx15("div", { className: "detail-error-type", children: node.error.error_type }),
1564
+ /* @__PURE__ */ jsx15("div", { className: "detail-error-message", children: node.error.message }),
1565
+ node.error.stack && /* @__PURE__ */ jsx15("div", { className: "detail-error-stack", children: node.error.stack })
1375
1566
  ] }),
1376
- showsGeneratedData && node.metrics && Object.keys(node.metrics).length > 0 && /* @__PURE__ */ jsxs14("div", { children: [
1377
- /* @__PURE__ */ jsx14("div", { className: "detail-section-label", children: "Metrics" }),
1378
- Object.entries(node.metrics).map(([key, value]) => /* @__PURE__ */ jsx14(
1567
+ showsGeneratedData && node.metrics && Object.keys(node.metrics).length > 0 && /* @__PURE__ */ jsxs15("div", { children: [
1568
+ /* @__PURE__ */ jsx15("div", { className: "detail-section-label", children: "Metrics" }),
1569
+ Object.entries(node.metrics).map(([key, value]) => /* @__PURE__ */ jsx15(
1379
1570
  KV,
1380
1571
  {
1381
1572
  label: key,
@@ -1384,48 +1575,89 @@ function PipeDetailPanel({ node, spec, onConceptClick }) {
1384
1575
  key
1385
1576
  ))
1386
1577
  ] }),
1387
- node.tags && Object.keys(node.tags).length > 0 && /* @__PURE__ */ jsxs14("div", { children: [
1388
- /* @__PURE__ */ jsx14("div", { className: "detail-section-label", children: "Tags" }),
1389
- /* @__PURE__ */ jsx14("div", { className: "detail-tags", children: Object.entries(node.tags).map(([key, value]) => /* @__PURE__ */ jsxs14("span", { className: "detail-tag", children: [
1390
- /* @__PURE__ */ jsxs14("span", { className: "detail-tag-key", children: [
1578
+ node.tags && Object.keys(node.tags).length > 0 && /* @__PURE__ */ jsxs15("div", { children: [
1579
+ /* @__PURE__ */ jsx15("div", { className: "detail-section-label", children: "Tags" }),
1580
+ /* @__PURE__ */ jsx15("div", { className: "detail-tags", children: Object.entries(node.tags).map(([key, value]) => /* @__PURE__ */ jsxs15("span", { className: "detail-tag", children: [
1581
+ /* @__PURE__ */ jsxs15("span", { className: "detail-tag-key", children: [
1391
1582
  key,
1392
1583
  ": "
1393
1584
  ] }),
1394
- /* @__PURE__ */ jsx14("span", { className: "detail-tag-value", children: value })
1585
+ /* @__PURE__ */ jsx15("span", { className: "detail-tag-value", children: value })
1395
1586
  ] }, key)) })
1396
1587
  ] }),
1397
- !blueprint && /* @__PURE__ */ jsx14("div", { className: "detail-not-available", children: "Blueprint not available" })
1588
+ !blueprint && /* @__PURE__ */ jsx15("div", { className: "detail-not-available", children: "Blueprint not available" })
1398
1589
  ] });
1399
1590
  }
1400
1591
  function BlueprintSection({
1401
1592
  blueprint,
1402
- executionData
1593
+ executionData,
1594
+ modelsRan,
1595
+ modelHandles
1403
1596
  }) {
1404
1597
  switch (blueprint.type) {
1405
1598
  case "PipeLLM":
1406
- return /* @__PURE__ */ jsx14(PipeLLMSection, { blueprint, executionData });
1599
+ return /* @__PURE__ */ jsx15(
1600
+ PipeLLMSection,
1601
+ {
1602
+ blueprint,
1603
+ executionData,
1604
+ modelsRan,
1605
+ modelHandles
1606
+ }
1607
+ );
1407
1608
  case "PipeImgGen":
1408
- return /* @__PURE__ */ jsx14(PipeImgGenSection, { blueprint, executionData });
1609
+ return /* @__PURE__ */ jsx15(
1610
+ PipeImgGenSection,
1611
+ {
1612
+ blueprint,
1613
+ executionData,
1614
+ modelsRan,
1615
+ modelHandles
1616
+ }
1617
+ );
1409
1618
  case "PipeCompose":
1410
- return /* @__PURE__ */ jsx14(PipeComposeSection, { blueprint, executionData });
1619
+ return /* @__PURE__ */ jsx15(PipeComposeSection, { blueprint, executionData });
1411
1620
  case "PipeExtract":
1412
- return /* @__PURE__ */ jsx14(PipeExtractSection, { blueprint, executionData });
1621
+ return /* @__PURE__ */ jsx15(
1622
+ PipeExtractSection,
1623
+ {
1624
+ blueprint,
1625
+ modelsRan,
1626
+ modelHandles
1627
+ }
1628
+ );
1413
1629
  case "PipeSearch":
1414
- return /* @__PURE__ */ jsx14(PipeSearchSection, { blueprint, executionData });
1630
+ return /* @__PURE__ */ jsx15(
1631
+ PipeSearchSection,
1632
+ {
1633
+ blueprint,
1634
+ executionData,
1635
+ modelsRan,
1636
+ modelHandles
1637
+ }
1638
+ );
1415
1639
  case "PipeStructure":
1416
- return /* @__PURE__ */ jsx14(PipeStructureSection, { blueprint, executionData });
1640
+ return /* @__PURE__ */ jsx15(
1641
+ PipeStructureSection,
1642
+ {
1643
+ blueprint,
1644
+ executionData,
1645
+ modelsRan,
1646
+ modelHandles
1647
+ }
1648
+ );
1417
1649
  case "PipeSequence":
1418
- return /* @__PURE__ */ jsx14(PipeSequenceSection, { blueprint, executionData });
1650
+ return /* @__PURE__ */ jsx15(PipeSequenceSection, { blueprint, executionData });
1419
1651
  case "PipeParallel":
1420
- return /* @__PURE__ */ jsx14(PipeParallelSection, { blueprint, executionData });
1652
+ return /* @__PURE__ */ jsx15(PipeParallelSection, { blueprint, executionData });
1421
1653
  case "PipeCondition":
1422
- return /* @__PURE__ */ jsx14(PipeConditionSection, { blueprint, executionData });
1654
+ return /* @__PURE__ */ jsx15(PipeConditionSection, { blueprint, executionData });
1423
1655
  case "PipeBatch":
1424
- return /* @__PURE__ */ jsx14(PipeBatchSection, { blueprint, executionData });
1656
+ return /* @__PURE__ */ jsx15(PipeBatchSection, { blueprint, executionData });
1425
1657
  case "PipeFunc":
1426
1658
  return null;
1427
1659
  case "PipeSignature":
1428
- return /* @__PURE__ */ jsx14("div", { className: "detail-not-available", children: "Signature stub \u2014 declared but not yet implemented." });
1660
+ return /* @__PURE__ */ jsx15("div", { className: "detail-not-available", children: "Signature stub \u2014 declared but not yet implemented." });
1429
1661
  default:
1430
1662
  return null;
1431
1663
  }
@@ -1436,20 +1668,20 @@ function ExecutionDataSection({
1436
1668
  hasBlueprint
1437
1669
  }) {
1438
1670
  if (!shouldDumpExecutionData(pipeType, hasBlueprint)) return null;
1439
- return /* @__PURE__ */ jsx14(GenericExecutionData, { data: executionData });
1671
+ return /* @__PURE__ */ jsx15(GenericExecutionData, { data: executionData });
1440
1672
  }
1441
1673
  function GenericExecutionData({ data }) {
1442
1674
  const entries = Object.entries(data);
1443
1675
  if (entries.length === 0) return null;
1444
- return /* @__PURE__ */ jsxs14(Fragment10, { children: [
1445
- /* @__PURE__ */ jsx14("div", { className: "detail-section-label", children: "Execution" }),
1446
- entries.map(([key, value]) => /* @__PURE__ */ jsx14(KV, { label: key, value: String(value) }, key))
1676
+ return /* @__PURE__ */ jsxs15(Fragment10, { children: [
1677
+ /* @__PURE__ */ jsx15("div", { className: "detail-section-label", children: "Execution" }),
1678
+ entries.map(([key, value]) => /* @__PURE__ */ jsx15(KV, { label: key, value: String(value) }, key))
1447
1679
  ] });
1448
1680
  }
1449
1681
 
1450
1682
  // src/graph/react/detail/ConceptDetailPanel.tsx
1451
1683
  import React7 from "react";
1452
- import { Fragment as Fragment11, jsx as jsx15, jsxs as jsxs15 } from "react/jsx-runtime";
1684
+ import { Fragment as Fragment11, jsx as jsx16, jsxs as jsxs16 } from "react/jsx-runtime";
1453
1685
  function ConceptDetailPanel({
1454
1686
  concept,
1455
1687
  ioData,
@@ -1460,17 +1692,17 @@ function ConceptDetailPanel({
1460
1692
  instanceKey
1461
1693
  }) {
1462
1694
  var _a;
1463
- return /* @__PURE__ */ jsxs15(Fragment11, { children: [
1464
- /* @__PURE__ */ jsxs15("div", { className: "detail-header", children: [
1465
- /* @__PURE__ */ jsx15("span", { className: "detail-concept-code", children: concept.code }),
1466
- /* @__PURE__ */ jsx15("span", { className: "detail-concept-domain", children: concept.domain_code })
1695
+ return /* @__PURE__ */ jsxs16(Fragment11, { children: [
1696
+ /* @__PURE__ */ jsxs16("div", { className: "detail-header", children: [
1697
+ /* @__PURE__ */ jsx16("span", { className: "detail-concept-code", children: concept.code }),
1698
+ /* @__PURE__ */ jsx16("span", { className: "detail-concept-domain", children: concept.domain_code })
1467
1699
  ] }),
1468
- concept.description && /* @__PURE__ */ jsx15("div", { className: "detail-description", children: concept.description }),
1469
- concept.refines && /* @__PURE__ */ jsxs15("div", { className: "detail-refines", children: [
1700
+ concept.description && /* @__PURE__ */ jsx16("div", { className: "detail-description", children: concept.description }),
1701
+ concept.refines && /* @__PURE__ */ jsxs16("div", { className: "detail-refines", children: [
1470
1702
  "refines ",
1471
- /* @__PURE__ */ jsx15("span", { className: "detail-refines-code", children: concept.refines })
1703
+ /* @__PURE__ */ jsx16("span", { className: "detail-refines-code", children: concept.refines })
1472
1704
  ] }),
1473
- /* @__PURE__ */ jsx15(
1705
+ /* @__PURE__ */ jsx16(
1474
1706
  ConceptBody,
1475
1707
  {
1476
1708
  concept,
@@ -1497,10 +1729,10 @@ function ConceptBody({
1497
1729
  const baseId = React7.useId();
1498
1730
  const tabId = (tab) => `${baseId}-tab-${tab}`;
1499
1731
  const panelId = (tab) => `${baseId}-tabpanel-${tab}`;
1500
- const structure = concept.json_schema ? /* @__PURE__ */ jsxs15("div", { children: [
1501
- /* @__PURE__ */ jsx15("div", { className: "detail-section-label", children: "Structure" }),
1502
- /* @__PURE__ */ jsx15(SchemaTable, { schema: concept.json_schema })
1503
- ] }) : /* @__PURE__ */ jsx15("div", { className: "detail-not-available", children: "Schema not available" });
1732
+ const structure = concept.json_schema ? /* @__PURE__ */ jsxs16("div", { children: [
1733
+ /* @__PURE__ */ jsx16("div", { className: "detail-section-label", children: "Structure" }),
1734
+ /* @__PURE__ */ jsx16(SchemaTable, { schema: concept.json_schema })
1735
+ ] }) : /* @__PURE__ */ jsx16("div", { className: "detail-not-available", children: "Schema not available" });
1504
1736
  if (!hasData) return structure;
1505
1737
  const onTabKeyDown = (event) => {
1506
1738
  var _a;
@@ -1523,7 +1755,7 @@ function ConceptBody({
1523
1755
  setActiveTab(next);
1524
1756
  (_a = document.getElementById(tabId(next))) == null ? void 0 : _a.focus();
1525
1757
  };
1526
- const renderTab = (tab, label) => /* @__PURE__ */ jsx15(
1758
+ const renderTab = (tab, label) => /* @__PURE__ */ jsx16(
1527
1759
  "button",
1528
1760
  {
1529
1761
  type: "button",
@@ -1538,12 +1770,12 @@ function ConceptBody({
1538
1770
  children: label
1539
1771
  }
1540
1772
  );
1541
- return /* @__PURE__ */ jsxs15(Fragment11, { children: [
1542
- /* @__PURE__ */ jsxs15("div", { className: "detail-tabs", role: "tablist", "aria-label": "Concept views", children: [
1773
+ return /* @__PURE__ */ jsxs16(Fragment11, { children: [
1774
+ /* @__PURE__ */ jsxs16("div", { className: "detail-tabs", role: "tablist", "aria-label": "Concept views", children: [
1543
1775
  renderTab("data", "Data"),
1544
1776
  renderTab("structure", "Structure")
1545
1777
  ] }),
1546
- /* @__PURE__ */ jsx15("div", { role: "tabpanel", id: panelId(activeTab), "aria-labelledby": tabId(activeTab), children: activeTab === "data" ? /* @__PURE__ */ jsx15(
1778
+ /* @__PURE__ */ jsx16("div", { role: "tabpanel", id: panelId(activeTab), "aria-labelledby": tabId(activeTab), children: activeTab === "data" ? /* @__PURE__ */ jsx16(
1547
1779
  StuffViewer,
1548
1780
  {
1549
1781
  stuff: toStuffViewerData(ioData),
@@ -1559,23 +1791,23 @@ function SchemaTable({ schema }) {
1559
1791
  const properties = schema.properties;
1560
1792
  const required = new Set((_a = schema.required) != null ? _a : []);
1561
1793
  if (!properties || Object.keys(properties).length === 0) {
1562
- return /* @__PURE__ */ jsx15("div", { className: "detail-not-available", children: "No fields defined" });
1794
+ return /* @__PURE__ */ jsx16("div", { className: "detail-not-available", children: "No fields defined" });
1563
1795
  }
1564
1796
  const fields = Object.entries(properties);
1565
- return /* @__PURE__ */ jsxs15("table", { className: "detail-schema-table", children: [
1566
- /* @__PURE__ */ jsx15("thead", { children: /* @__PURE__ */ jsxs15("tr", { children: [
1567
- /* @__PURE__ */ jsx15("th", { children: "Field" }),
1568
- /* @__PURE__ */ jsx15("th", { children: "Type" }),
1569
- /* @__PURE__ */ jsx15("th", {}),
1570
- /* @__PURE__ */ jsx15("th", { children: "Description" })
1797
+ return /* @__PURE__ */ jsxs16("table", { className: "detail-schema-table", children: [
1798
+ /* @__PURE__ */ jsx16("thead", { children: /* @__PURE__ */ jsxs16("tr", { children: [
1799
+ /* @__PURE__ */ jsx16("th", { children: "Field" }),
1800
+ /* @__PURE__ */ jsx16("th", { children: "Type" }),
1801
+ /* @__PURE__ */ jsx16("th", {}),
1802
+ /* @__PURE__ */ jsx16("th", { children: "Description" })
1571
1803
  ] }) }),
1572
- /* @__PURE__ */ jsx15("tbody", { children: fields.map(([fieldName, fieldSchema]) => {
1804
+ /* @__PURE__ */ jsx16("tbody", { children: fields.map(([fieldName, fieldSchema]) => {
1573
1805
  var _a2;
1574
- return /* @__PURE__ */ jsxs15("tr", { children: [
1575
- /* @__PURE__ */ jsx15("td", { className: "detail-schema-field", children: fieldName }),
1576
- /* @__PURE__ */ jsx15("td", { className: "detail-schema-type", children: extractType(fieldSchema) }),
1577
- /* @__PURE__ */ jsx15("td", { children: required.has(fieldName) && /* @__PURE__ */ jsx15("span", { className: "detail-schema-required", children: "req" }) }),
1578
- /* @__PURE__ */ jsx15("td", { children: (_a2 = fieldSchema.description) != null ? _a2 : "" })
1806
+ return /* @__PURE__ */ jsxs16("tr", { children: [
1807
+ /* @__PURE__ */ jsx16("td", { className: "detail-schema-field", children: fieldName }),
1808
+ /* @__PURE__ */ jsx16("td", { className: "detail-schema-type", children: extractType(fieldSchema) }),
1809
+ /* @__PURE__ */ jsx16("td", { children: required.has(fieldName) && /* @__PURE__ */ jsx16("span", { className: "detail-schema-required", children: "req" }) }),
1810
+ /* @__PURE__ */ jsx16("td", { children: (_a2 = fieldSchema.description) != null ? _a2 : "" })
1579
1811
  ] }, fieldName);
1580
1812
  }) })
1581
1813
  ] });
@@ -1642,10 +1874,10 @@ function toAppEdges(edges) {
1642
1874
  }
1643
1875
 
1644
1876
  // src/graph/react/viewer/renderLabel.tsx
1645
- import { jsx as jsx16, jsxs as jsxs16 } from "react/jsx-runtime";
1877
+ import { jsx as jsx17, jsxs as jsxs17 } from "react/jsx-runtime";
1646
1878
  function renderLabel(desc) {
1647
1879
  if (desc.kind === "pipe") {
1648
- return /* @__PURE__ */ jsx16(
1880
+ return /* @__PURE__ */ jsx17(
1649
1881
  "div",
1650
1882
  {
1651
1883
  style: {
@@ -1659,7 +1891,7 @@ function renderLabel(desc) {
1659
1891
  minWidth: 0
1660
1892
  },
1661
1893
  title: desc.label,
1662
- children: /* @__PURE__ */ jsx16(
1894
+ children: /* @__PURE__ */ jsx17(
1663
1895
  "span",
1664
1896
  {
1665
1897
  style: {
@@ -1678,7 +1910,7 @@ function renderLabel(desc) {
1678
1910
  }
1679
1911
  );
1680
1912
  }
1681
- return /* @__PURE__ */ jsxs16(
1913
+ return /* @__PURE__ */ jsxs17(
1682
1914
  "div",
1683
1915
  {
1684
1916
  style: {
@@ -1694,7 +1926,7 @@ function renderLabel(desc) {
1694
1926
  },
1695
1927
  title: desc.concept ? `${desc.label}: ${desc.concept}` : desc.label,
1696
1928
  children: [
1697
- /* @__PURE__ */ jsx16(
1929
+ /* @__PURE__ */ jsx17(
1698
1930
  "span",
1699
1931
  {
1700
1932
  style: {
@@ -1710,7 +1942,7 @@ function renderLabel(desc) {
1710
1942
  children: desc.label
1711
1943
  }
1712
1944
  ),
1713
- desc.concept && /* @__PURE__ */ jsx16(
1945
+ desc.concept && /* @__PURE__ */ jsx17(
1714
1946
  "span",
1715
1947
  {
1716
1948
  style: {
@@ -1744,7 +1976,7 @@ import React8 from "react";
1744
1976
  import { Panel } from "@xyflow/react";
1745
1977
 
1746
1978
  // src/graph/react/viewer/ValidationPanel.tsx
1747
- import { jsx as jsx17, jsxs as jsxs17 } from "react/jsx-runtime";
1979
+ import { jsx as jsx18, jsxs as jsxs18 } from "react/jsx-runtime";
1748
1980
  function validationLabel(state, issueCount) {
1749
1981
  const issues = issueCount === 1 ? "1 issue" : `${issueCount} issues`;
1750
1982
  switch (state) {
@@ -1807,7 +2039,7 @@ function ValidationPanel({
1807
2039
  placement,
1808
2040
  id
1809
2041
  }) {
1810
- return /* @__PURE__ */ jsxs17(
2042
+ return /* @__PURE__ */ jsxs18(
1811
2043
  "div",
1812
2044
  {
1813
2045
  id,
@@ -1815,18 +2047,18 @@ function ValidationPanel({
1815
2047
  role: "region",
1816
2048
  "aria-label": "Validation issues",
1817
2049
  children: [
1818
- /* @__PURE__ */ jsx17("div", { className: "graph-validation-panel-header", children: validationLabel(state, issues.length) }),
1819
- issues.length === 0 ? /* @__PURE__ */ jsx17("div", { className: "graph-validation-empty", children: validationEmptyText(state) }) : /* @__PURE__ */ jsx17("ul", { className: "graph-validation-issues", role: "list", children: issues.map((issue, index) => {
2050
+ /* @__PURE__ */ jsx18("div", { className: "graph-validation-panel-header", children: validationLabel(state, issues.length) }),
2051
+ 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) => {
1820
2052
  const clickable = onIssueClick !== void 0;
1821
- const meta = (issue.context || issue.file) && /* @__PURE__ */ jsxs17("div", { className: "graph-validation-issue-meta", children: [
1822
- issue.context && /* @__PURE__ */ jsx17("span", { className: "graph-validation-issue-context", children: issue.context }),
1823
- issue.file && /* @__PURE__ */ jsx17("span", { className: "graph-validation-issue-file", children: issue.file })
2053
+ const meta = (issue.context || issue.file) && /* @__PURE__ */ jsxs18("div", { className: "graph-validation-issue-meta", children: [
2054
+ issue.context && /* @__PURE__ */ jsx18("span", { className: "graph-validation-issue-context", children: issue.context }),
2055
+ issue.file && /* @__PURE__ */ jsx18("span", { className: "graph-validation-issue-file", children: issue.file })
1824
2056
  ] });
1825
- return /* @__PURE__ */ jsx17(
2057
+ return /* @__PURE__ */ jsx18(
1826
2058
  "li",
1827
2059
  {
1828
2060
  className: `graph-validation-issue graph-validation-issue--${issue.severity}` + (clickable ? " graph-validation-issue--clickable" : ""),
1829
- children: /* @__PURE__ */ jsxs17(
2061
+ children: /* @__PURE__ */ jsxs18(
1830
2062
  "div",
1831
2063
  {
1832
2064
  className: "graph-validation-issue-body",
@@ -1841,8 +2073,8 @@ function ValidationPanel({
1841
2073
  } : void 0,
1842
2074
  children: [
1843
2075
  meta,
1844
- /* @__PURE__ */ jsx17("div", { className: "graph-validation-issue-message", children: issue.message }),
1845
- issue.suggestedFix && /* @__PURE__ */ jsx17("div", { className: "graph-validation-issue-fix", children: issue.suggestedFix })
2076
+ /* @__PURE__ */ jsx18("div", { className: "graph-validation-issue-message", children: issue.message }),
2077
+ issue.suggestedFix && /* @__PURE__ */ jsx18("div", { className: "graph-validation-issue-fix", children: issue.suggestedFix })
1846
2078
  ]
1847
2079
  }
1848
2080
  )
@@ -1856,9 +2088,9 @@ function ValidationPanel({
1856
2088
  }
1857
2089
 
1858
2090
  // src/graph/react/viewer/GraphToolbar.tsx
1859
- import { Fragment as Fragment12, jsx as jsx18, jsxs as jsxs18 } from "react/jsx-runtime";
2091
+ import { Fragment as Fragment12, jsx as jsx19, jsxs as jsxs19 } from "react/jsx-runtime";
1860
2092
  var REACTFLOW_PANEL_MARGIN = 15;
1861
- var ARROW_RIGHT_ICON = /* @__PURE__ */ jsxs18(
2093
+ var ARROW_RIGHT_ICON = /* @__PURE__ */ jsxs19(
1862
2094
  "svg",
1863
2095
  {
1864
2096
  viewBox: "0 0 24 24",
@@ -1870,12 +2102,12 @@ var ARROW_RIGHT_ICON = /* @__PURE__ */ jsxs18(
1870
2102
  strokeLinecap: "round",
1871
2103
  strokeLinejoin: "round",
1872
2104
  children: [
1873
- /* @__PURE__ */ jsx18("line", { x1: "5", y1: "12", x2: "19", y2: "12" }),
1874
- /* @__PURE__ */ jsx18("polyline", { points: "12 5 19 12 12 19" })
2105
+ /* @__PURE__ */ jsx19("line", { x1: "5", y1: "12", x2: "19", y2: "12" }),
2106
+ /* @__PURE__ */ jsx19("polyline", { points: "12 5 19 12 12 19" })
1875
2107
  ]
1876
2108
  }
1877
2109
  );
1878
- var ARROW_DOWN_ICON = /* @__PURE__ */ jsxs18(
2110
+ var ARROW_DOWN_ICON = /* @__PURE__ */ jsxs19(
1879
2111
  "svg",
1880
2112
  {
1881
2113
  viewBox: "0 0 24 24",
@@ -1887,12 +2119,12 @@ var ARROW_DOWN_ICON = /* @__PURE__ */ jsxs18(
1887
2119
  strokeLinecap: "round",
1888
2120
  strokeLinejoin: "round",
1889
2121
  children: [
1890
- /* @__PURE__ */ jsx18("line", { x1: "12", y1: "5", x2: "12", y2: "19" }),
1891
- /* @__PURE__ */ jsx18("polyline", { points: "19 12 12 19 5 12" })
2122
+ /* @__PURE__ */ jsx19("line", { x1: "12", y1: "5", x2: "12", y2: "19" }),
2123
+ /* @__PURE__ */ jsx19("polyline", { points: "19 12 12 19 5 12" })
1892
2124
  ]
1893
2125
  }
1894
2126
  );
1895
- var MINUS_ICON = /* @__PURE__ */ jsx18(
2127
+ var MINUS_ICON = /* @__PURE__ */ jsx19(
1896
2128
  "svg",
1897
2129
  {
1898
2130
  viewBox: "0 0 24 24",
@@ -1903,10 +2135,10 @@ var MINUS_ICON = /* @__PURE__ */ jsx18(
1903
2135
  strokeWidth: "2",
1904
2136
  strokeLinecap: "round",
1905
2137
  strokeLinejoin: "round",
1906
- children: /* @__PURE__ */ jsx18("line", { x1: "5", y1: "12", x2: "19", y2: "12" })
2138
+ children: /* @__PURE__ */ jsx19("line", { x1: "5", y1: "12", x2: "19", y2: "12" })
1907
2139
  }
1908
2140
  );
1909
- var PLUS_ICON = /* @__PURE__ */ jsxs18(
2141
+ var PLUS_ICON = /* @__PURE__ */ jsxs19(
1910
2142
  "svg",
1911
2143
  {
1912
2144
  viewBox: "0 0 24 24",
@@ -1918,12 +2150,12 @@ var PLUS_ICON = /* @__PURE__ */ jsxs18(
1918
2150
  strokeLinecap: "round",
1919
2151
  strokeLinejoin: "round",
1920
2152
  children: [
1921
- /* @__PURE__ */ jsx18("line", { x1: "12", y1: "5", x2: "12", y2: "19" }),
1922
- /* @__PURE__ */ jsx18("line", { x1: "5", y1: "12", x2: "19", y2: "12" })
2153
+ /* @__PURE__ */ jsx19("line", { x1: "12", y1: "5", x2: "12", y2: "19" }),
2154
+ /* @__PURE__ */ jsx19("line", { x1: "5", y1: "12", x2: "19", y2: "12" })
1923
2155
  ]
1924
2156
  }
1925
2157
  );
1926
- var FIT_VIEW_ICON = /* @__PURE__ */ jsxs18(
2158
+ var FIT_VIEW_ICON = /* @__PURE__ */ jsxs19(
1927
2159
  "svg",
1928
2160
  {
1929
2161
  viewBox: "0 0 24 24",
@@ -1935,14 +2167,14 @@ var FIT_VIEW_ICON = /* @__PURE__ */ jsxs18(
1935
2167
  strokeLinecap: "round",
1936
2168
  strokeLinejoin: "round",
1937
2169
  children: [
1938
- /* @__PURE__ */ jsx18("polyline", { points: "15 3 21 3 21 9" }),
1939
- /* @__PURE__ */ jsx18("polyline", { points: "9 21 3 21 3 15" }),
1940
- /* @__PURE__ */ jsx18("line", { x1: "21", y1: "3", x2: "14", y2: "10" }),
1941
- /* @__PURE__ */ jsx18("line", { x1: "3", y1: "21", x2: "10", y2: "14" })
2170
+ /* @__PURE__ */ jsx19("polyline", { points: "15 3 21 3 21 9" }),
2171
+ /* @__PURE__ */ jsx19("polyline", { points: "9 21 3 21 3 15" }),
2172
+ /* @__PURE__ */ jsx19("line", { x1: "21", y1: "3", x2: "14", y2: "10" }),
2173
+ /* @__PURE__ */ jsx19("line", { x1: "3", y1: "21", x2: "10", y2: "14" })
1942
2174
  ]
1943
2175
  }
1944
2176
  );
1945
- var BOXES_ICON = /* @__PURE__ */ jsxs18(
2177
+ var BOXES_ICON = /* @__PURE__ */ jsxs19(
1946
2178
  "svg",
1947
2179
  {
1948
2180
  viewBox: "0 0 24 24",
@@ -1954,22 +2186,22 @@ var BOXES_ICON = /* @__PURE__ */ jsxs18(
1954
2186
  strokeLinecap: "round",
1955
2187
  strokeLinejoin: "round",
1956
2188
  children: [
1957
- /* @__PURE__ */ jsx18("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" }),
1958
- /* @__PURE__ */ jsx18("path", { d: "m7 16.5-4.74-2.85" }),
1959
- /* @__PURE__ */ jsx18("path", { d: "m7 16.5 5-3" }),
1960
- /* @__PURE__ */ jsx18("path", { d: "M7 16.5v5.17" }),
1961
- /* @__PURE__ */ jsx18("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" }),
1962
- /* @__PURE__ */ jsx18("path", { d: "m17 16.5-5-3" }),
1963
- /* @__PURE__ */ jsx18("path", { d: "m17 16.5 4.74-2.85" }),
1964
- /* @__PURE__ */ jsx18("path", { d: "M17 16.5v5.17" }),
1965
- /* @__PURE__ */ jsx18("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" }),
1966
- /* @__PURE__ */ jsx18("path", { d: "M12 8 7.26 5.15" }),
1967
- /* @__PURE__ */ jsx18("path", { d: "m12 8 4.74-2.85" }),
1968
- /* @__PURE__ */ jsx18("path", { d: "M12 13.5V8" })
2189
+ /* @__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" }),
2190
+ /* @__PURE__ */ jsx19("path", { d: "m7 16.5-4.74-2.85" }),
2191
+ /* @__PURE__ */ jsx19("path", { d: "m7 16.5 5-3" }),
2192
+ /* @__PURE__ */ jsx19("path", { d: "M7 16.5v5.17" }),
2193
+ /* @__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" }),
2194
+ /* @__PURE__ */ jsx19("path", { d: "m17 16.5-5-3" }),
2195
+ /* @__PURE__ */ jsx19("path", { d: "m17 16.5 4.74-2.85" }),
2196
+ /* @__PURE__ */ jsx19("path", { d: "M17 16.5v5.17" }),
2197
+ /* @__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" }),
2198
+ /* @__PURE__ */ jsx19("path", { d: "M12 8 7.26 5.15" }),
2199
+ /* @__PURE__ */ jsx19("path", { d: "m12 8 4.74-2.85" }),
2200
+ /* @__PURE__ */ jsx19("path", { d: "M12 13.5V8" })
1969
2201
  ]
1970
2202
  }
1971
2203
  );
1972
- var FOLD_ALL_ICON = /* @__PURE__ */ jsxs18(
2204
+ var FOLD_ALL_ICON = /* @__PURE__ */ jsxs19(
1973
2205
  "svg",
1974
2206
  {
1975
2207
  viewBox: "0 0 24 24",
@@ -1981,15 +2213,15 @@ var FOLD_ALL_ICON = /* @__PURE__ */ jsxs18(
1981
2213
  strokeLinecap: "round",
1982
2214
  strokeLinejoin: "round",
1983
2215
  children: [
1984
- /* @__PURE__ */ jsx18("rect", { x: "6", y: "6", width: "12", height: "12", rx: "2" }),
1985
- /* @__PURE__ */ jsx18("polyline", { points: "2 2 6 6 2 6" }),
1986
- /* @__PURE__ */ jsx18("polyline", { points: "22 2 18 6 22 6" }),
1987
- /* @__PURE__ */ jsx18("polyline", { points: "2 22 6 18 2 18" }),
1988
- /* @__PURE__ */ jsx18("polyline", { points: "22 22 18 18 22 18" })
2216
+ /* @__PURE__ */ jsx19("rect", { x: "6", y: "6", width: "12", height: "12", rx: "2" }),
2217
+ /* @__PURE__ */ jsx19("polyline", { points: "2 2 6 6 2 6" }),
2218
+ /* @__PURE__ */ jsx19("polyline", { points: "22 2 18 6 22 6" }),
2219
+ /* @__PURE__ */ jsx19("polyline", { points: "2 22 6 18 2 18" }),
2220
+ /* @__PURE__ */ jsx19("polyline", { points: "22 22 18 18 22 18" })
1989
2221
  ]
1990
2222
  }
1991
2223
  );
1992
- var EXPAND_ALL_ICON = /* @__PURE__ */ jsxs18(
2224
+ var EXPAND_ALL_ICON = /* @__PURE__ */ jsxs19(
1993
2225
  "svg",
1994
2226
  {
1995
2227
  viewBox: "0 0 24 24",
@@ -2001,15 +2233,15 @@ var EXPAND_ALL_ICON = /* @__PURE__ */ jsxs18(
2001
2233
  strokeLinecap: "round",
2002
2234
  strokeLinejoin: "round",
2003
2235
  children: [
2004
- /* @__PURE__ */ jsx18("rect", { x: "9", y: "9", width: "6", height: "6", rx: "1" }),
2005
- /* @__PURE__ */ jsx18("polyline", { points: "3 3 7 7 3 7" }),
2006
- /* @__PURE__ */ jsx18("polyline", { points: "21 3 17 7 21 7" }),
2007
- /* @__PURE__ */ jsx18("polyline", { points: "3 21 7 17 3 17" }),
2008
- /* @__PURE__ */ jsx18("polyline", { points: "21 21 17 17 21 17" })
2236
+ /* @__PURE__ */ jsx19("rect", { x: "9", y: "9", width: "6", height: "6", rx: "1" }),
2237
+ /* @__PURE__ */ jsx19("polyline", { points: "3 3 7 7 3 7" }),
2238
+ /* @__PURE__ */ jsx19("polyline", { points: "21 3 17 7 21 7" }),
2239
+ /* @__PURE__ */ jsx19("polyline", { points: "3 21 7 17 3 17" }),
2240
+ /* @__PURE__ */ jsx19("polyline", { points: "21 21 17 17 21 17" })
2009
2241
  ]
2010
2242
  }
2011
2243
  );
2012
- var SUN_ICON = /* @__PURE__ */ jsxs18(
2244
+ var SUN_ICON = /* @__PURE__ */ jsxs19(
2013
2245
  "svg",
2014
2246
  {
2015
2247
  viewBox: "0 0 24 24",
@@ -2021,19 +2253,19 @@ var SUN_ICON = /* @__PURE__ */ jsxs18(
2021
2253
  strokeLinecap: "round",
2022
2254
  strokeLinejoin: "round",
2023
2255
  children: [
2024
- /* @__PURE__ */ jsx18("circle", { cx: "12", cy: "12", r: "4" }),
2025
- /* @__PURE__ */ jsx18("line", { x1: "12", y1: "2", x2: "12", y2: "4" }),
2026
- /* @__PURE__ */ jsx18("line", { x1: "12", y1: "20", x2: "12", y2: "22" }),
2027
- /* @__PURE__ */ jsx18("line", { x1: "4.93", y1: "4.93", x2: "6.34", y2: "6.34" }),
2028
- /* @__PURE__ */ jsx18("line", { x1: "17.66", y1: "17.66", x2: "19.07", y2: "19.07" }),
2029
- /* @__PURE__ */ jsx18("line", { x1: "2", y1: "12", x2: "4", y2: "12" }),
2030
- /* @__PURE__ */ jsx18("line", { x1: "20", y1: "12", x2: "22", y2: "12" }),
2031
- /* @__PURE__ */ jsx18("line", { x1: "4.93", y1: "19.07", x2: "6.34", y2: "17.66" }),
2032
- /* @__PURE__ */ jsx18("line", { x1: "17.66", y1: "6.34", x2: "19.07", y2: "4.93" })
2256
+ /* @__PURE__ */ jsx19("circle", { cx: "12", cy: "12", r: "4" }),
2257
+ /* @__PURE__ */ jsx19("line", { x1: "12", y1: "2", x2: "12", y2: "4" }),
2258
+ /* @__PURE__ */ jsx19("line", { x1: "12", y1: "20", x2: "12", y2: "22" }),
2259
+ /* @__PURE__ */ jsx19("line", { x1: "4.93", y1: "4.93", x2: "6.34", y2: "6.34" }),
2260
+ /* @__PURE__ */ jsx19("line", { x1: "17.66", y1: "17.66", x2: "19.07", y2: "19.07" }),
2261
+ /* @__PURE__ */ jsx19("line", { x1: "2", y1: "12", x2: "4", y2: "12" }),
2262
+ /* @__PURE__ */ jsx19("line", { x1: "20", y1: "12", x2: "22", y2: "12" }),
2263
+ /* @__PURE__ */ jsx19("line", { x1: "4.93", y1: "19.07", x2: "6.34", y2: "17.66" }),
2264
+ /* @__PURE__ */ jsx19("line", { x1: "17.66", y1: "6.34", x2: "19.07", y2: "4.93" })
2033
2265
  ]
2034
2266
  }
2035
2267
  );
2036
- var MOON_ICON = /* @__PURE__ */ jsx18(
2268
+ var MOON_ICON = /* @__PURE__ */ jsx19(
2037
2269
  "svg",
2038
2270
  {
2039
2271
  viewBox: "0 0 24 24",
@@ -2044,10 +2276,10 @@ var MOON_ICON = /* @__PURE__ */ jsx18(
2044
2276
  strokeWidth: "2",
2045
2277
  strokeLinecap: "round",
2046
2278
  strokeLinejoin: "round",
2047
- children: /* @__PURE__ */ jsx18("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" })
2279
+ children: /* @__PURE__ */ jsx19("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" })
2048
2280
  }
2049
2281
  );
2050
- var MONITOR_ICON = /* @__PURE__ */ jsxs18(
2282
+ var MONITOR_ICON = /* @__PURE__ */ jsxs19(
2051
2283
  "svg",
2052
2284
  {
2053
2285
  viewBox: "0 0 24 24",
@@ -2059,13 +2291,13 @@ var MONITOR_ICON = /* @__PURE__ */ jsxs18(
2059
2291
  strokeLinecap: "round",
2060
2292
  strokeLinejoin: "round",
2061
2293
  children: [
2062
- /* @__PURE__ */ jsx18("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2" }),
2063
- /* @__PURE__ */ jsx18("line", { x1: "8", y1: "21", x2: "16", y2: "21" }),
2064
- /* @__PURE__ */ jsx18("line", { x1: "12", y1: "17", x2: "12", y2: "21" })
2294
+ /* @__PURE__ */ jsx19("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2" }),
2295
+ /* @__PURE__ */ jsx19("line", { x1: "8", y1: "21", x2: "16", y2: "21" }),
2296
+ /* @__PURE__ */ jsx19("line", { x1: "12", y1: "17", x2: "12", y2: "21" })
2065
2297
  ]
2066
2298
  }
2067
2299
  );
2068
- var SPINNER_ICON = /* @__PURE__ */ jsx18(
2300
+ var SPINNER_ICON = /* @__PURE__ */ jsx19(
2069
2301
  "svg",
2070
2302
  {
2071
2303
  className: "graph-toolbar-validation-spin",
@@ -2077,10 +2309,10 @@ var SPINNER_ICON = /* @__PURE__ */ jsx18(
2077
2309
  strokeWidth: "2",
2078
2310
  strokeLinecap: "round",
2079
2311
  strokeLinejoin: "round",
2080
- children: /* @__PURE__ */ jsx18("path", { d: "M21 12a9 9 0 1 1-6.219-8.56" })
2312
+ children: /* @__PURE__ */ jsx19("path", { d: "M21 12a9 9 0 1 1-6.219-8.56" })
2081
2313
  }
2082
2314
  );
2083
- var CHECK_ICON2 = /* @__PURE__ */ jsx18(
2315
+ var CHECK_ICON2 = /* @__PURE__ */ jsx19(
2084
2316
  "svg",
2085
2317
  {
2086
2318
  viewBox: "0 0 24 24",
@@ -2091,10 +2323,10 @@ var CHECK_ICON2 = /* @__PURE__ */ jsx18(
2091
2323
  strokeWidth: "2",
2092
2324
  strokeLinecap: "round",
2093
2325
  strokeLinejoin: "round",
2094
- children: /* @__PURE__ */ jsx18("polyline", { points: "20 6 9 17 4 12" })
2326
+ children: /* @__PURE__ */ jsx19("polyline", { points: "20 6 9 17 4 12" })
2095
2327
  }
2096
2328
  );
2097
- var X_CIRCLE_ICON = /* @__PURE__ */ jsxs18(
2329
+ var X_CIRCLE_ICON = /* @__PURE__ */ jsxs19(
2098
2330
  "svg",
2099
2331
  {
2100
2332
  viewBox: "0 0 24 24",
@@ -2106,13 +2338,13 @@ var X_CIRCLE_ICON = /* @__PURE__ */ jsxs18(
2106
2338
  strokeLinecap: "round",
2107
2339
  strokeLinejoin: "round",
2108
2340
  children: [
2109
- /* @__PURE__ */ jsx18("circle", { cx: "12", cy: "12", r: "10" }),
2110
- /* @__PURE__ */ jsx18("line", { x1: "15", y1: "9", x2: "9", y2: "15" }),
2111
- /* @__PURE__ */ jsx18("line", { x1: "9", y1: "9", x2: "15", y2: "15" })
2341
+ /* @__PURE__ */ jsx19("circle", { cx: "12", cy: "12", r: "10" }),
2342
+ /* @__PURE__ */ jsx19("line", { x1: "15", y1: "9", x2: "9", y2: "15" }),
2343
+ /* @__PURE__ */ jsx19("line", { x1: "9", y1: "9", x2: "15", y2: "15" })
2112
2344
  ]
2113
2345
  }
2114
2346
  );
2115
- var ALERT_TRIANGLE_ICON = /* @__PURE__ */ jsxs18(
2347
+ var ALERT_TRIANGLE_ICON = /* @__PURE__ */ jsxs19(
2116
2348
  "svg",
2117
2349
  {
2118
2350
  viewBox: "0 0 24 24",
@@ -2124,9 +2356,9 @@ var ALERT_TRIANGLE_ICON = /* @__PURE__ */ jsxs18(
2124
2356
  strokeLinecap: "round",
2125
2357
  strokeLinejoin: "round",
2126
2358
  children: [
2127
- /* @__PURE__ */ jsx18("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" }),
2128
- /* @__PURE__ */ jsx18("line", { x1: "12", y1: "9", x2: "12", y2: "13" }),
2129
- /* @__PURE__ */ jsx18("line", { x1: "12", y1: "17", x2: "12.01", y2: "17" })
2359
+ /* @__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" }),
2360
+ /* @__PURE__ */ jsx19("line", { x1: "12", y1: "9", x2: "12", y2: "13" }),
2361
+ /* @__PURE__ */ jsx19("line", { x1: "12", y1: "17", x2: "12.01", y2: "17" })
2130
2362
  ]
2131
2363
  }
2132
2364
  );
@@ -2228,10 +2460,10 @@ function GraphToolbar({
2228
2460
  const foldAllSection = onFoldAll || onExpandAll;
2229
2461
  const foldAllTitle = foldAllDisabled ? "Fold all controllers (nothing to fold)" : "Fold all controllers";
2230
2462
  const expandAllTitle = expandAllDisabled ? "Expand all controllers (nothing to expand)" : "Expand all controllers";
2231
- return /* @__PURE__ */ jsx18(Panel, { position, className: "graph-toolbar-panel", style: panelStyle, children: /* @__PURE__ */ jsxs18("div", { className: `graph-toolbar graph-toolbar--${orientation}`, children: [
2232
- validationState !== void 0 && /* @__PURE__ */ jsxs18(Fragment12, { children: [
2233
- /* @__PURE__ */ jsxs18("div", { className: "graph-toolbar-validation", ref: validationRef, children: [
2234
- /* @__PURE__ */ jsxs18(
2463
+ return /* @__PURE__ */ jsx19(Panel, { position, className: "graph-toolbar-panel", style: panelStyle, children: /* @__PURE__ */ jsxs19("div", { className: `graph-toolbar graph-toolbar--${orientation}`, children: [
2464
+ validationState !== void 0 && /* @__PURE__ */ jsxs19(Fragment12, { children: [
2465
+ /* @__PURE__ */ jsxs19("div", { className: "graph-toolbar-validation", ref: validationRef, children: [
2466
+ /* @__PURE__ */ jsxs19(
2235
2467
  "button",
2236
2468
  {
2237
2469
  type: "button",
@@ -2244,11 +2476,11 @@ function GraphToolbar({
2244
2476
  "aria-controls": validationPanelId,
2245
2477
  children: [
2246
2478
  validationIcon(validationState),
2247
- validationIssues.length > 0 && /* @__PURE__ */ jsx18("span", { className: "graph-toolbar-validation-badge", children: validationIssues.length > 99 ? "99+" : validationIssues.length })
2479
+ validationIssues.length > 0 && /* @__PURE__ */ jsx19("span", { className: "graph-toolbar-validation-badge", children: validationIssues.length > 99 ? "99+" : validationIssues.length })
2248
2480
  ]
2249
2481
  }
2250
2482
  ),
2251
- validationOpen && /* @__PURE__ */ jsx18(
2483
+ validationOpen && /* @__PURE__ */ jsx19(
2252
2484
  ValidationPanel,
2253
2485
  {
2254
2486
  id: validationPanelId,
@@ -2259,9 +2491,9 @@ function GraphToolbar({
2259
2491
  }
2260
2492
  )
2261
2493
  ] }),
2262
- /* @__PURE__ */ jsx18("div", { className: "graph-toolbar-separator" })
2494
+ /* @__PURE__ */ jsx19("div", { className: "graph-toolbar-separator" })
2263
2495
  ] }),
2264
- onFoldAll && /* @__PURE__ */ jsx18(
2496
+ onFoldAll && /* @__PURE__ */ jsx19(
2265
2497
  "button",
2266
2498
  {
2267
2499
  type: "button",
@@ -2273,7 +2505,7 @@ function GraphToolbar({
2273
2505
  children: FOLD_ALL_ICON
2274
2506
  }
2275
2507
  ),
2276
- onExpandAll && /* @__PURE__ */ jsx18(
2508
+ onExpandAll && /* @__PURE__ */ jsx19(
2277
2509
  "button",
2278
2510
  {
2279
2511
  type: "button",
@@ -2285,8 +2517,8 @@ function GraphToolbar({
2285
2517
  children: EXPAND_ALL_ICON
2286
2518
  }
2287
2519
  ),
2288
- foldAllSection && /* @__PURE__ */ jsx18("div", { className: "graph-toolbar-separator" }),
2289
- /* @__PURE__ */ jsx18(
2520
+ foldAllSection && /* @__PURE__ */ jsx19("div", { className: "graph-toolbar-separator" }),
2521
+ /* @__PURE__ */ jsx19(
2290
2522
  "button",
2291
2523
  {
2292
2524
  type: "button",
@@ -2297,7 +2529,7 @@ function GraphToolbar({
2297
2529
  children: BOXES_ICON
2298
2530
  }
2299
2531
  ),
2300
- /* @__PURE__ */ jsx18(
2532
+ /* @__PURE__ */ jsx19(
2301
2533
  "button",
2302
2534
  {
2303
2535
  type: "button",
@@ -2308,8 +2540,8 @@ function GraphToolbar({
2308
2540
  children: isVertical ? ARROW_RIGHT_ICON : ARROW_DOWN_ICON
2309
2541
  }
2310
2542
  ),
2311
- (onZoomOut || onZoomIn || onFitView) && /* @__PURE__ */ jsx18("div", { className: "graph-toolbar-separator" }),
2312
- onZoomOut && /* @__PURE__ */ jsx18(
2543
+ (onZoomOut || onZoomIn || onFitView) && /* @__PURE__ */ jsx19("div", { className: "graph-toolbar-separator" }),
2544
+ onZoomOut && /* @__PURE__ */ jsx19(
2313
2545
  "button",
2314
2546
  {
2315
2547
  type: "button",
@@ -2320,7 +2552,7 @@ function GraphToolbar({
2320
2552
  children: MINUS_ICON
2321
2553
  }
2322
2554
  ),
2323
- onZoomIn && /* @__PURE__ */ jsx18(
2555
+ onZoomIn && /* @__PURE__ */ jsx19(
2324
2556
  "button",
2325
2557
  {
2326
2558
  type: "button",
@@ -2331,7 +2563,7 @@ function GraphToolbar({
2331
2563
  children: PLUS_ICON
2332
2564
  }
2333
2565
  ),
2334
- onFitView && /* @__PURE__ */ jsx18(
2566
+ onFitView && /* @__PURE__ */ jsx19(
2335
2567
  "button",
2336
2568
  {
2337
2569
  type: "button",
@@ -2342,9 +2574,9 @@ function GraphToolbar({
2342
2574
  children: FIT_VIEW_ICON
2343
2575
  }
2344
2576
  ),
2345
- themeToggleEnabled && /* @__PURE__ */ jsxs18(Fragment12, { children: [
2346
- /* @__PURE__ */ jsx18("div", { className: "graph-toolbar-separator" }),
2347
- /* @__PURE__ */ jsx18(
2577
+ themeToggleEnabled && /* @__PURE__ */ jsxs19(Fragment12, { children: [
2578
+ /* @__PURE__ */ jsx19("div", { className: "graph-toolbar-separator" }),
2579
+ /* @__PURE__ */ jsx19(
2348
2580
  "button",
2349
2581
  {
2350
2582
  type: "button",
@@ -2360,7 +2592,7 @@ function GraphToolbar({
2360
2592
  }
2361
2593
 
2362
2594
  // src/graph/react/nodes/NodeValidationBadge.tsx
2363
- import { jsx as jsx19 } from "react/jsx-runtime";
2595
+ import { jsx as jsx20 } from "react/jsx-runtime";
2364
2596
  function NodeValidationBadge({
2365
2597
  validation,
2366
2598
  onClick
@@ -2370,9 +2602,9 @@ function NodeValidationBadge({
2370
2602
  const className = `node-validation-badge node-validation-badge--${validation.severity}`;
2371
2603
  const text = validation.count > 99 ? "99+" : String(validation.count);
2372
2604
  if (!onClick) {
2373
- return /* @__PURE__ */ jsx19("span", { className, title: tooltip, "aria-label": label, children: text });
2605
+ return /* @__PURE__ */ jsx20("span", { className, title: tooltip, "aria-label": label, children: text });
2374
2606
  }
2375
- return /* @__PURE__ */ jsx19(
2607
+ return /* @__PURE__ */ jsx20(
2376
2608
  "button",
2377
2609
  {
2378
2610
  type: "button",
@@ -2392,7 +2624,7 @@ function validationRingClass(validation) {
2392
2624
  }
2393
2625
 
2394
2626
  // src/graph/react/nodes/controller/ControllerGroupNode.tsx
2395
- import { jsx as jsx20, jsxs as jsxs19 } from "react/jsx-runtime";
2627
+ import { jsx as jsx21, jsxs as jsxs20 } from "react/jsx-runtime";
2396
2628
  var CONTROLLER_CONFIG = {
2397
2629
  PipeSequence: { badge: "Sequence", icon: "\u2192" },
2398
2630
  PipeParallel: { badge: "Parallel", icon: "//" },
@@ -2414,12 +2646,12 @@ function ControllerGroupNode({ data }) {
2414
2646
  const modifier = getControllerModifier(data.pipeType);
2415
2647
  const isCollapsible = (data.pipeType === "PipeParallel" || data.pipeType === "PipeBatch") && ((_a = data.childCount) != null ? _a : 0) > MAX_VISIBLE_CONTROLLER_CHILDREN;
2416
2648
  const hiddenCount = isCollapsible ? ((_b = data.childCount) != null ? _b : 0) - MAX_VISIBLE_CONTROLLER_CHILDREN : 0;
2417
- return /* @__PURE__ */ jsxs19("div", { className: `controller-group-node ${modifier}${validationRingClass(data.validation)}`, children: [
2418
- /* @__PURE__ */ jsxs19("div", { className: "controller-group-header", children: [
2419
- /* @__PURE__ */ jsx20("span", { className: "controller-group-icon", children: config.icon }),
2420
- /* @__PURE__ */ jsx20("span", { className: "controller-group-badge", children: config.badge }),
2421
- data.label && /* @__PURE__ */ jsx20("span", { className: "controller-group-label", children: data.label }),
2422
- data.onToggleFold && /* @__PURE__ */ jsx20(
2649
+ return /* @__PURE__ */ jsxs20("div", { className: `controller-group-node ${modifier}${validationRingClass(data.validation)}`, children: [
2650
+ /* @__PURE__ */ jsxs20("div", { className: "controller-group-header", children: [
2651
+ /* @__PURE__ */ jsx21("span", { className: "controller-group-icon", children: config.icon }),
2652
+ /* @__PURE__ */ jsx21("span", { className: "controller-group-badge", children: config.badge }),
2653
+ data.label && /* @__PURE__ */ jsx21("span", { className: "controller-group-label", children: data.label }),
2654
+ data.onToggleFold && /* @__PURE__ */ jsx21(
2423
2655
  "button",
2424
2656
  {
2425
2657
  type: "button",
@@ -2434,9 +2666,9 @@ function ControllerGroupNode({ data }) {
2434
2666
  children: "\u2921"
2435
2667
  }
2436
2668
  ),
2437
- data.validation && /* @__PURE__ */ jsx20(NodeValidationBadge, { validation: data.validation, onClick: data.onValidationBadgeClick })
2669
+ data.validation && /* @__PURE__ */ jsx21(NodeValidationBadge, { validation: data.validation, onClick: data.onValidationBadgeClick })
2438
2670
  ] }),
2439
- isCollapsible && /* @__PURE__ */ jsx20(
2671
+ isCollapsible && /* @__PURE__ */ jsx21(
2440
2672
  "button",
2441
2673
  {
2442
2674
  className: "controller-group-collapse",
@@ -2457,7 +2689,7 @@ import { Handle, Position } from "@xyflow/react";
2457
2689
 
2458
2690
  // src/graph/react/nodes/pipe/PipeCardBase.tsx
2459
2691
  import { useState as useState2 } from "react";
2460
- import { jsx as jsx21, jsxs as jsxs20 } from "react/jsx-runtime";
2692
+ import { jsx as jsx22, jsxs as jsxs21 } from "react/jsx-runtime";
2461
2693
  var PIPE_TYPE_BADGES2 = {
2462
2694
  PipeLLM: "LLM",
2463
2695
  PipeExtract: "Extract",
@@ -2513,21 +2745,21 @@ function PipeCardBase({ data, children }) {
2513
2745
  const staticClass = isStatic ? " pipe-card--static" : "";
2514
2746
  const badgeClass = isController ? "pipe-card-badge pipe-card-badge--controller" : isSignature ? "pipe-card-badge pipe-card-badge--signature" : "pipe-card-badge";
2515
2747
  const ringClass = validationRingClass(data.validation);
2516
- return /* @__PURE__ */ jsxs20(
2748
+ return /* @__PURE__ */ jsxs21(
2517
2749
  "div",
2518
2750
  {
2519
2751
  className: `pipe-card ${dirClass}${controllerClass}${signatureClass}${staticClass}${ringClass}`,
2520
2752
  children: [
2521
- /* @__PURE__ */ jsxs20("div", { className: "pipe-card-header", children: [
2522
- /* @__PURE__ */ jsx21("span", { className: badgeClass, children: badge }),
2523
- /* @__PURE__ */ jsx21("span", { className: "pipe-card-code", title: data.pipeCode, children: data.pipeCode }),
2524
- !isStatic && /* @__PURE__ */ jsx21(
2753
+ /* @__PURE__ */ jsxs21("div", { className: "pipe-card-header", children: [
2754
+ /* @__PURE__ */ jsx22("span", { className: badgeClass, children: badge }),
2755
+ /* @__PURE__ */ jsx22("span", { className: "pipe-card-code", title: data.pipeCode, children: data.pipeCode }),
2756
+ !isStatic && /* @__PURE__ */ jsx22(
2525
2757
  "span",
2526
2758
  {
2527
2759
  className: "pipe-card-status",
2528
2760
  style: { color: statusConfig.color },
2529
2761
  title: statusConfig.label,
2530
- children: /* @__PURE__ */ jsx21(
2762
+ children: /* @__PURE__ */ jsx22(
2531
2763
  "span",
2532
2764
  {
2533
2765
  className: `pipe-card-status-dot ${isRunning ? "pipe-card-status-dot--pulse" : ""}`,
@@ -2536,7 +2768,7 @@ function PipeCardBase({ data, children }) {
2536
2768
  )
2537
2769
  }
2538
2770
  ),
2539
- data.onExpand && /* @__PURE__ */ jsx21(
2771
+ data.onExpand && /* @__PURE__ */ jsx22(
2540
2772
  "button",
2541
2773
  {
2542
2774
  type: "button",
@@ -2551,32 +2783,32 @@ function PipeCardBase({ data, children }) {
2551
2783
  children: "\u2922"
2552
2784
  }
2553
2785
  ),
2554
- data.validation && /* @__PURE__ */ jsx21(NodeValidationBadge, { validation: data.validation, onClick: data.onValidationBadgeClick })
2786
+ data.validation && /* @__PURE__ */ jsx22(NodeValidationBadge, { validation: data.validation, onClick: data.onValidationBadgeClick })
2555
2787
  ] }),
2556
- (outcome || batchMultiplicity) && /* @__PURE__ */ jsxs20("div", { className: "pipe-card-annotations", children: [
2557
- outcome && /* @__PURE__ */ jsxs20("span", { className: "pipe-card-annotation pipe-card-annotation--outcome", children: [
2788
+ (outcome || batchMultiplicity) && /* @__PURE__ */ jsxs21("div", { className: "pipe-card-annotations", children: [
2789
+ outcome && /* @__PURE__ */ jsxs21("span", { className: "pipe-card-annotation pipe-card-annotation--outcome", children: [
2558
2790
  "outcome: ",
2559
2791
  outcome
2560
2792
  ] }),
2561
- batchMultiplicity && /* @__PURE__ */ jsx21("span", { className: "pipe-card-annotation pipe-card-annotation--batch", children: batchMultiplicity })
2793
+ batchMultiplicity && /* @__PURE__ */ jsx22("span", { className: "pipe-card-annotation pipe-card-annotation--batch", children: batchMultiplicity })
2562
2794
  ] }),
2563
- data.description && /* @__PURE__ */ jsx21("span", { className: "pipe-card-description", title: data.description, children: data.description }),
2564
- data.inputs.length > 0 && /* @__PURE__ */ jsxs20("div", { className: "pipe-card-io", children: [
2565
- /* @__PURE__ */ jsx21("span", { className: "pipe-card-io-label", children: "INPUTS" }),
2566
- /* @__PURE__ */ jsxs20("div", { className: "pipe-card-io-pills", children: [
2567
- visibleInputs.map((input) => /* @__PURE__ */ jsxs20(
2795
+ data.description && /* @__PURE__ */ jsx22("span", { className: "pipe-card-description", title: data.description, children: data.description }),
2796
+ data.inputs.length > 0 && /* @__PURE__ */ jsxs21("div", { className: "pipe-card-io", children: [
2797
+ /* @__PURE__ */ jsx22("span", { className: "pipe-card-io-label", children: "INPUTS" }),
2798
+ /* @__PURE__ */ jsxs21("div", { className: "pipe-card-io-pills", children: [
2799
+ visibleInputs.map((input) => /* @__PURE__ */ jsxs21(
2568
2800
  "span",
2569
2801
  {
2570
2802
  className: "pipe-card-io-pill",
2571
2803
  title: `${input.name}: ${input.concept}`,
2572
2804
  children: [
2573
- /* @__PURE__ */ jsx21("span", { className: "pipe-card-io-pill-name", children: input.name }),
2574
- /* @__PURE__ */ jsx21("span", { className: "pipe-card-io-pill-concept", children: input.concept })
2805
+ /* @__PURE__ */ jsx22("span", { className: "pipe-card-io-pill-name", children: input.name }),
2806
+ /* @__PURE__ */ jsx22("span", { className: "pipe-card-io-pill-concept", children: input.concept })
2575
2807
  ]
2576
2808
  },
2577
2809
  input.name
2578
2810
  )),
2579
- hasMany && /* @__PURE__ */ jsx21(
2811
+ hasMany && /* @__PURE__ */ jsx22(
2580
2812
  "button",
2581
2813
  {
2582
2814
  className: "pipe-card-io-more",
@@ -2589,16 +2821,16 @@ function PipeCardBase({ data, children }) {
2589
2821
  )
2590
2822
  ] })
2591
2823
  ] }),
2592
- data.outputs.length > 0 && /* @__PURE__ */ jsxs20("div", { className: "pipe-card-io", children: [
2593
- /* @__PURE__ */ jsx21("span", { className: "pipe-card-io-label", children: "OUTPUT" }),
2594
- /* @__PURE__ */ jsx21("div", { className: "pipe-card-io-pills", children: data.outputs.map((output) => /* @__PURE__ */ jsxs20(
2824
+ data.outputs.length > 0 && /* @__PURE__ */ jsxs21("div", { className: "pipe-card-io", children: [
2825
+ /* @__PURE__ */ jsx22("span", { className: "pipe-card-io-label", children: "OUTPUT" }),
2826
+ /* @__PURE__ */ jsx22("div", { className: "pipe-card-io-pills", children: data.outputs.map((output) => /* @__PURE__ */ jsxs21(
2595
2827
  "span",
2596
2828
  {
2597
2829
  className: "pipe-card-io-pill",
2598
2830
  title: `${output.name}: ${output.concept}`,
2599
2831
  children: [
2600
- /* @__PURE__ */ jsx21("span", { className: "pipe-card-io-pill-name", children: output.name }),
2601
- /* @__PURE__ */ jsx21("span", { className: "pipe-card-io-pill-concept", children: output.concept })
2832
+ /* @__PURE__ */ jsx22("span", { className: "pipe-card-io-pill-name", children: output.name }),
2833
+ /* @__PURE__ */ jsx22("span", { className: "pipe-card-io-pill-concept", children: output.concept })
2602
2834
  ]
2603
2835
  },
2604
2836
  output.name
@@ -2630,11 +2862,11 @@ function getPipeCardComponent(pipeType) {
2630
2862
  }
2631
2863
 
2632
2864
  // src/graph/react/nodes/pipe/PipeCardNode.tsx
2633
- import { Fragment as Fragment13, jsx as jsx22, jsxs as jsxs21 } from "react/jsx-runtime";
2865
+ import { Fragment as Fragment13, jsx as jsx23, jsxs as jsxs22 } from "react/jsx-runtime";
2634
2866
  function PipeCardNode({ data }) {
2635
2867
  var _a;
2636
2868
  const Card = (_a = getPipeCardComponent(data.pipeType)) != null ? _a : PipeCardBase;
2637
- return /* @__PURE__ */ jsx22(Card, { data });
2869
+ return /* @__PURE__ */ jsx23(Card, { data });
2638
2870
  }
2639
2871
  function PipeCardRFNode({
2640
2872
  data,
@@ -2643,15 +2875,15 @@ function PipeCardRFNode({
2643
2875
  }) {
2644
2876
  const payload = data.pipeCardData;
2645
2877
  if (!payload) return null;
2646
- return /* @__PURE__ */ jsxs21(Fragment13, { children: [
2647
- /* @__PURE__ */ jsx22(Handle, { type: "target", position: targetPosition }),
2648
- /* @__PURE__ */ jsx22(PipeCardNode, { data: payload }),
2649
- /* @__PURE__ */ jsx22(Handle, { type: "source", position: sourcePosition })
2878
+ return /* @__PURE__ */ jsxs22(Fragment13, { children: [
2879
+ /* @__PURE__ */ jsx23(Handle, { type: "target", position: targetPosition }),
2880
+ /* @__PURE__ */ jsx23(PipeCardNode, { data: payload }),
2881
+ /* @__PURE__ */ jsx23(Handle, { type: "source", position: sourcePosition })
2650
2882
  ] });
2651
2883
  }
2652
2884
 
2653
2885
  // src/graph/react/viewer/GraphViewer.tsx
2654
- import { Fragment as Fragment14, jsx as jsx23, jsxs as jsxs22 } from "react/jsx-runtime";
2886
+ import { Fragment as Fragment14, jsx as jsx24, jsxs as jsxs23 } from "react/jsx-runtime";
2655
2887
  var nodeTypes = __spreadProps(__spreadValues({}, controllerNodeTypes), {
2656
2888
  pipeCard: PipeCardRFNode
2657
2889
  });
@@ -2665,7 +2897,7 @@ function StuffNodeDetail({
2665
2897
  }) {
2666
2898
  const conceptInfo = stuffData.concept && graphspec ? resolveConceptRef(graphspec, stuffData.concept) : void 0;
2667
2899
  const isDryRun = graphSpecMode(graphspec) === GRAPH_SPEC_MODE.DRY;
2668
- return /* @__PURE__ */ jsx23(Fragment14, { children: conceptInfo ? /* @__PURE__ */ jsx23(
2900
+ return /* @__PURE__ */ jsx24(Fragment14, { children: conceptInfo ? /* @__PURE__ */ jsx24(
2669
2901
  ConceptDetailPanel,
2670
2902
  {
2671
2903
  concept: conceptInfo,
@@ -2676,9 +2908,9 @@ function StuffNodeDetail({
2676
2908
  canEmbedPdf,
2677
2909
  onOpenExternally
2678
2910
  }
2679
- ) : isDryRun ? /* @__PURE__ */ jsx23("div", { className: "detail-not-available", children: "Dry run data hidden" }) : (
2911
+ ) : isDryRun ? /* @__PURE__ */ jsx24("div", { className: "detail-not-available", children: "Dry run data hidden" }) : (
2680
2912
  /* Fallback: just show the StuffViewer if no concept info */
2681
- /* @__PURE__ */ jsx23(
2913
+ /* @__PURE__ */ jsx24(
2682
2914
  StuffViewer,
2683
2915
  {
2684
2916
  stuff: stuffData,
@@ -3334,13 +3566,13 @@ function GraphViewer(props) {
3334
3566
  expandAllDisabled: foldedControllers.size === 0
3335
3567
  };
3336
3568
  }, [showControllers, allControllerIds, foldedControllers]);
3337
- return /* @__PURE__ */ jsxs22(
3569
+ return /* @__PURE__ */ jsxs23(
3338
3570
  "div",
3339
3571
  {
3340
3572
  ref: containerRef,
3341
3573
  className: `react-flow-container react-flow-container--theme-${resolvedTheme} react-flow-container--mode-${mode}`,
3342
3574
  children: [
3343
- /* @__PURE__ */ jsxs22(
3575
+ /* @__PURE__ */ jsxs23(
3344
3576
  ReactFlow,
3345
3577
  {
3346
3578
  nodes,
@@ -3359,7 +3591,7 @@ function GraphViewer(props) {
3359
3591
  proOptions: { hideAttribution: true },
3360
3592
  panActivationKeyCode: null,
3361
3593
  children: [
3362
- /* @__PURE__ */ jsx23(
3594
+ /* @__PURE__ */ jsx24(
3363
3595
  Background,
3364
3596
  {
3365
3597
  variant: BackgroundVariant.Dots,
@@ -3368,7 +3600,7 @@ function GraphViewer(props) {
3368
3600
  color: "var(--color-bg-dots)"
3369
3601
  }
3370
3602
  ),
3371
- !hideToolbar && /* @__PURE__ */ jsx23(
3603
+ !hideToolbar && /* @__PURE__ */ jsx24(
3372
3604
  GraphToolbar,
3373
3605
  {
3374
3606
  direction,
@@ -3405,7 +3637,7 @@ function GraphViewer(props) {
3405
3637
  ]
3406
3638
  }
3407
3639
  ),
3408
- /* @__PURE__ */ jsxs22(
3640
+ /* @__PURE__ */ jsxs23(
3409
3641
  DetailPanel,
3410
3642
  {
3411
3643
  isOpen: detailOpen,
@@ -3414,14 +3646,14 @@ function GraphViewer(props) {
3414
3646
  isDragging: isPanelDragging,
3415
3647
  onResizeHandleMouseDown: onResizeMouseDown,
3416
3648
  children: [
3417
- conceptOverride ? /* @__PURE__ */ jsx23(ConceptDetailPanel, { concept: conceptOverride }) : selectedSpecNode && graphspec ? /* @__PURE__ */ jsx23(
3649
+ conceptOverride ? /* @__PURE__ */ jsx24(ConceptDetailPanel, { concept: conceptOverride }) : selectedSpecNode && graphspec ? /* @__PURE__ */ jsx24(
3418
3650
  PipeDetailPanel,
3419
3651
  {
3420
3652
  node: selectedSpecNode,
3421
3653
  spec: graphspec,
3422
3654
  onConceptClick: handleConceptClick
3423
3655
  }
3424
- ) : (detailSelection == null ? void 0 : detailSelection.stuffData) ? /* @__PURE__ */ jsx23(
3656
+ ) : (detailSelection == null ? void 0 : detailSelection.stuffData) ? /* @__PURE__ */ jsx24(
3425
3657
  StuffNodeDetail,
3426
3658
  {
3427
3659
  nodeId: detailSelection.nodeId,