@pipelex/mthds-ui 0.15.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-O62372BD.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-YC7TW3BW.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, isDryRun })
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),
@@ -1554,32 +1786,28 @@ function ConceptBody({
1554
1786
  ) : structure })
1555
1787
  ] });
1556
1788
  }
1557
- function SchemaTable({
1558
- schema,
1559
- isDryRun
1560
- }) {
1789
+ function SchemaTable({ schema }) {
1561
1790
  var _a;
1562
1791
  const properties = schema.properties;
1563
1792
  const required = new Set((_a = schema.required) != null ? _a : []);
1564
1793
  if (!properties || Object.keys(properties).length === 0) {
1565
- 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" });
1566
1795
  }
1567
1796
  const fields = Object.entries(properties);
1568
- const visibleFields = isDryRun ? fields.filter(([name]) => required.has(name)) : fields;
1569
- return /* @__PURE__ */ jsxs15("table", { className: "detail-schema-table", children: [
1570
- /* @__PURE__ */ jsx15("thead", { children: /* @__PURE__ */ jsxs15("tr", { children: [
1571
- /* @__PURE__ */ jsx15("th", { children: "Field" }),
1572
- /* @__PURE__ */ jsx15("th", { children: "Type" }),
1573
- /* @__PURE__ */ jsx15("th", {}),
1574
- /* @__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" })
1575
1803
  ] }) }),
1576
- /* @__PURE__ */ jsx15("tbody", { children: visibleFields.map(([fieldName, fieldSchema]) => {
1804
+ /* @__PURE__ */ jsx16("tbody", { children: fields.map(([fieldName, fieldSchema]) => {
1577
1805
  var _a2;
1578
- return /* @__PURE__ */ jsxs15("tr", { children: [
1579
- /* @__PURE__ */ jsx15("td", { className: "detail-schema-field", children: fieldName }),
1580
- /* @__PURE__ */ jsx15("td", { className: "detail-schema-type", children: extractType(fieldSchema) }),
1581
- /* @__PURE__ */ jsx15("td", { children: required.has(fieldName) && /* @__PURE__ */ jsx15("span", { className: "detail-schema-required", children: "req" }) }),
1582
- /* @__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 : "" })
1583
1811
  ] }, fieldName);
1584
1812
  }) })
1585
1813
  ] });
@@ -1646,10 +1874,10 @@ function toAppEdges(edges) {
1646
1874
  }
1647
1875
 
1648
1876
  // src/graph/react/viewer/renderLabel.tsx
1649
- import { jsx as jsx16, jsxs as jsxs16 } from "react/jsx-runtime";
1877
+ import { jsx as jsx17, jsxs as jsxs17 } from "react/jsx-runtime";
1650
1878
  function renderLabel(desc) {
1651
1879
  if (desc.kind === "pipe") {
1652
- return /* @__PURE__ */ jsx16(
1880
+ return /* @__PURE__ */ jsx17(
1653
1881
  "div",
1654
1882
  {
1655
1883
  style: {
@@ -1663,7 +1891,7 @@ function renderLabel(desc) {
1663
1891
  minWidth: 0
1664
1892
  },
1665
1893
  title: desc.label,
1666
- children: /* @__PURE__ */ jsx16(
1894
+ children: /* @__PURE__ */ jsx17(
1667
1895
  "span",
1668
1896
  {
1669
1897
  style: {
@@ -1682,7 +1910,7 @@ function renderLabel(desc) {
1682
1910
  }
1683
1911
  );
1684
1912
  }
1685
- return /* @__PURE__ */ jsxs16(
1913
+ return /* @__PURE__ */ jsxs17(
1686
1914
  "div",
1687
1915
  {
1688
1916
  style: {
@@ -1698,7 +1926,7 @@ function renderLabel(desc) {
1698
1926
  },
1699
1927
  title: desc.concept ? `${desc.label}: ${desc.concept}` : desc.label,
1700
1928
  children: [
1701
- /* @__PURE__ */ jsx16(
1929
+ /* @__PURE__ */ jsx17(
1702
1930
  "span",
1703
1931
  {
1704
1932
  style: {
@@ -1714,7 +1942,7 @@ function renderLabel(desc) {
1714
1942
  children: desc.label
1715
1943
  }
1716
1944
  ),
1717
- desc.concept && /* @__PURE__ */ jsx16(
1945
+ desc.concept && /* @__PURE__ */ jsx17(
1718
1946
  "span",
1719
1947
  {
1720
1948
  style: {
@@ -1748,7 +1976,7 @@ import React8 from "react";
1748
1976
  import { Panel } from "@xyflow/react";
1749
1977
 
1750
1978
  // src/graph/react/viewer/ValidationPanel.tsx
1751
- import { jsx as jsx17, jsxs as jsxs17 } from "react/jsx-runtime";
1979
+ import { jsx as jsx18, jsxs as jsxs18 } from "react/jsx-runtime";
1752
1980
  function validationLabel(state, issueCount) {
1753
1981
  const issues = issueCount === 1 ? "1 issue" : `${issueCount} issues`;
1754
1982
  switch (state) {
@@ -1811,7 +2039,7 @@ function ValidationPanel({
1811
2039
  placement,
1812
2040
  id
1813
2041
  }) {
1814
- return /* @__PURE__ */ jsxs17(
2042
+ return /* @__PURE__ */ jsxs18(
1815
2043
  "div",
1816
2044
  {
1817
2045
  id,
@@ -1819,18 +2047,18 @@ function ValidationPanel({
1819
2047
  role: "region",
1820
2048
  "aria-label": "Validation issues",
1821
2049
  children: [
1822
- /* @__PURE__ */ jsx17("div", { className: "graph-validation-panel-header", children: validationLabel(state, issues.length) }),
1823
- 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) => {
1824
2052
  const clickable = onIssueClick !== void 0;
1825
- const meta = (issue.context || issue.file) && /* @__PURE__ */ jsxs17("div", { className: "graph-validation-issue-meta", children: [
1826
- issue.context && /* @__PURE__ */ jsx17("span", { className: "graph-validation-issue-context", children: issue.context }),
1827
- 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 })
1828
2056
  ] });
1829
- return /* @__PURE__ */ jsx17(
2057
+ return /* @__PURE__ */ jsx18(
1830
2058
  "li",
1831
2059
  {
1832
2060
  className: `graph-validation-issue graph-validation-issue--${issue.severity}` + (clickable ? " graph-validation-issue--clickable" : ""),
1833
- children: /* @__PURE__ */ jsxs17(
2061
+ children: /* @__PURE__ */ jsxs18(
1834
2062
  "div",
1835
2063
  {
1836
2064
  className: "graph-validation-issue-body",
@@ -1845,8 +2073,8 @@ function ValidationPanel({
1845
2073
  } : void 0,
1846
2074
  children: [
1847
2075
  meta,
1848
- /* @__PURE__ */ jsx17("div", { className: "graph-validation-issue-message", children: issue.message }),
1849
- 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 })
1850
2078
  ]
1851
2079
  }
1852
2080
  )
@@ -1860,9 +2088,9 @@ function ValidationPanel({
1860
2088
  }
1861
2089
 
1862
2090
  // src/graph/react/viewer/GraphToolbar.tsx
1863
- 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";
1864
2092
  var REACTFLOW_PANEL_MARGIN = 15;
1865
- var ARROW_RIGHT_ICON = /* @__PURE__ */ jsxs18(
2093
+ var ARROW_RIGHT_ICON = /* @__PURE__ */ jsxs19(
1866
2094
  "svg",
1867
2095
  {
1868
2096
  viewBox: "0 0 24 24",
@@ -1874,12 +2102,12 @@ var ARROW_RIGHT_ICON = /* @__PURE__ */ jsxs18(
1874
2102
  strokeLinecap: "round",
1875
2103
  strokeLinejoin: "round",
1876
2104
  children: [
1877
- /* @__PURE__ */ jsx18("line", { x1: "5", y1: "12", x2: "19", y2: "12" }),
1878
- /* @__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" })
1879
2107
  ]
1880
2108
  }
1881
2109
  );
1882
- var ARROW_DOWN_ICON = /* @__PURE__ */ jsxs18(
2110
+ var ARROW_DOWN_ICON = /* @__PURE__ */ jsxs19(
1883
2111
  "svg",
1884
2112
  {
1885
2113
  viewBox: "0 0 24 24",
@@ -1891,12 +2119,12 @@ var ARROW_DOWN_ICON = /* @__PURE__ */ jsxs18(
1891
2119
  strokeLinecap: "round",
1892
2120
  strokeLinejoin: "round",
1893
2121
  children: [
1894
- /* @__PURE__ */ jsx18("line", { x1: "12", y1: "5", x2: "12", y2: "19" }),
1895
- /* @__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" })
1896
2124
  ]
1897
2125
  }
1898
2126
  );
1899
- var MINUS_ICON = /* @__PURE__ */ jsx18(
2127
+ var MINUS_ICON = /* @__PURE__ */ jsx19(
1900
2128
  "svg",
1901
2129
  {
1902
2130
  viewBox: "0 0 24 24",
@@ -1907,10 +2135,10 @@ var MINUS_ICON = /* @__PURE__ */ jsx18(
1907
2135
  strokeWidth: "2",
1908
2136
  strokeLinecap: "round",
1909
2137
  strokeLinejoin: "round",
1910
- 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" })
1911
2139
  }
1912
2140
  );
1913
- var PLUS_ICON = /* @__PURE__ */ jsxs18(
2141
+ var PLUS_ICON = /* @__PURE__ */ jsxs19(
1914
2142
  "svg",
1915
2143
  {
1916
2144
  viewBox: "0 0 24 24",
@@ -1922,12 +2150,12 @@ var PLUS_ICON = /* @__PURE__ */ jsxs18(
1922
2150
  strokeLinecap: "round",
1923
2151
  strokeLinejoin: "round",
1924
2152
  children: [
1925
- /* @__PURE__ */ jsx18("line", { x1: "12", y1: "5", x2: "12", y2: "19" }),
1926
- /* @__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" })
1927
2155
  ]
1928
2156
  }
1929
2157
  );
1930
- var FIT_VIEW_ICON = /* @__PURE__ */ jsxs18(
2158
+ var FIT_VIEW_ICON = /* @__PURE__ */ jsxs19(
1931
2159
  "svg",
1932
2160
  {
1933
2161
  viewBox: "0 0 24 24",
@@ -1939,14 +2167,14 @@ var FIT_VIEW_ICON = /* @__PURE__ */ jsxs18(
1939
2167
  strokeLinecap: "round",
1940
2168
  strokeLinejoin: "round",
1941
2169
  children: [
1942
- /* @__PURE__ */ jsx18("polyline", { points: "15 3 21 3 21 9" }),
1943
- /* @__PURE__ */ jsx18("polyline", { points: "9 21 3 21 3 15" }),
1944
- /* @__PURE__ */ jsx18("line", { x1: "21", y1: "3", x2: "14", y2: "10" }),
1945
- /* @__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" })
1946
2174
  ]
1947
2175
  }
1948
2176
  );
1949
- var BOXES_ICON = /* @__PURE__ */ jsxs18(
2177
+ var BOXES_ICON = /* @__PURE__ */ jsxs19(
1950
2178
  "svg",
1951
2179
  {
1952
2180
  viewBox: "0 0 24 24",
@@ -1958,22 +2186,22 @@ var BOXES_ICON = /* @__PURE__ */ jsxs18(
1958
2186
  strokeLinecap: "round",
1959
2187
  strokeLinejoin: "round",
1960
2188
  children: [
1961
- /* @__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" }),
1962
- /* @__PURE__ */ jsx18("path", { d: "m7 16.5-4.74-2.85" }),
1963
- /* @__PURE__ */ jsx18("path", { d: "m7 16.5 5-3" }),
1964
- /* @__PURE__ */ jsx18("path", { d: "M7 16.5v5.17" }),
1965
- /* @__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" }),
1966
- /* @__PURE__ */ jsx18("path", { d: "m17 16.5-5-3" }),
1967
- /* @__PURE__ */ jsx18("path", { d: "m17 16.5 4.74-2.85" }),
1968
- /* @__PURE__ */ jsx18("path", { d: "M17 16.5v5.17" }),
1969
- /* @__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" }),
1970
- /* @__PURE__ */ jsx18("path", { d: "M12 8 7.26 5.15" }),
1971
- /* @__PURE__ */ jsx18("path", { d: "m12 8 4.74-2.85" }),
1972
- /* @__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" })
1973
2201
  ]
1974
2202
  }
1975
2203
  );
1976
- var FOLD_ALL_ICON = /* @__PURE__ */ jsxs18(
2204
+ var FOLD_ALL_ICON = /* @__PURE__ */ jsxs19(
1977
2205
  "svg",
1978
2206
  {
1979
2207
  viewBox: "0 0 24 24",
@@ -1985,15 +2213,15 @@ var FOLD_ALL_ICON = /* @__PURE__ */ jsxs18(
1985
2213
  strokeLinecap: "round",
1986
2214
  strokeLinejoin: "round",
1987
2215
  children: [
1988
- /* @__PURE__ */ jsx18("rect", { x: "6", y: "6", width: "12", height: "12", rx: "2" }),
1989
- /* @__PURE__ */ jsx18("polyline", { points: "2 2 6 6 2 6" }),
1990
- /* @__PURE__ */ jsx18("polyline", { points: "22 2 18 6 22 6" }),
1991
- /* @__PURE__ */ jsx18("polyline", { points: "2 22 6 18 2 18" }),
1992
- /* @__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" })
1993
2221
  ]
1994
2222
  }
1995
2223
  );
1996
- var EXPAND_ALL_ICON = /* @__PURE__ */ jsxs18(
2224
+ var EXPAND_ALL_ICON = /* @__PURE__ */ jsxs19(
1997
2225
  "svg",
1998
2226
  {
1999
2227
  viewBox: "0 0 24 24",
@@ -2005,15 +2233,15 @@ var EXPAND_ALL_ICON = /* @__PURE__ */ jsxs18(
2005
2233
  strokeLinecap: "round",
2006
2234
  strokeLinejoin: "round",
2007
2235
  children: [
2008
- /* @__PURE__ */ jsx18("rect", { x: "9", y: "9", width: "6", height: "6", rx: "1" }),
2009
- /* @__PURE__ */ jsx18("polyline", { points: "3 3 7 7 3 7" }),
2010
- /* @__PURE__ */ jsx18("polyline", { points: "21 3 17 7 21 7" }),
2011
- /* @__PURE__ */ jsx18("polyline", { points: "3 21 7 17 3 17" }),
2012
- /* @__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" })
2013
2241
  ]
2014
2242
  }
2015
2243
  );
2016
- var SUN_ICON = /* @__PURE__ */ jsxs18(
2244
+ var SUN_ICON = /* @__PURE__ */ jsxs19(
2017
2245
  "svg",
2018
2246
  {
2019
2247
  viewBox: "0 0 24 24",
@@ -2025,19 +2253,19 @@ var SUN_ICON = /* @__PURE__ */ jsxs18(
2025
2253
  strokeLinecap: "round",
2026
2254
  strokeLinejoin: "round",
2027
2255
  children: [
2028
- /* @__PURE__ */ jsx18("circle", { cx: "12", cy: "12", r: "4" }),
2029
- /* @__PURE__ */ jsx18("line", { x1: "12", y1: "2", x2: "12", y2: "4" }),
2030
- /* @__PURE__ */ jsx18("line", { x1: "12", y1: "20", x2: "12", y2: "22" }),
2031
- /* @__PURE__ */ jsx18("line", { x1: "4.93", y1: "4.93", x2: "6.34", y2: "6.34" }),
2032
- /* @__PURE__ */ jsx18("line", { x1: "17.66", y1: "17.66", x2: "19.07", y2: "19.07" }),
2033
- /* @__PURE__ */ jsx18("line", { x1: "2", y1: "12", x2: "4", y2: "12" }),
2034
- /* @__PURE__ */ jsx18("line", { x1: "20", y1: "12", x2: "22", y2: "12" }),
2035
- /* @__PURE__ */ jsx18("line", { x1: "4.93", y1: "19.07", x2: "6.34", y2: "17.66" }),
2036
- /* @__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" })
2037
2265
  ]
2038
2266
  }
2039
2267
  );
2040
- var MOON_ICON = /* @__PURE__ */ jsx18(
2268
+ var MOON_ICON = /* @__PURE__ */ jsx19(
2041
2269
  "svg",
2042
2270
  {
2043
2271
  viewBox: "0 0 24 24",
@@ -2048,10 +2276,10 @@ var MOON_ICON = /* @__PURE__ */ jsx18(
2048
2276
  strokeWidth: "2",
2049
2277
  strokeLinecap: "round",
2050
2278
  strokeLinejoin: "round",
2051
- 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" })
2052
2280
  }
2053
2281
  );
2054
- var MONITOR_ICON = /* @__PURE__ */ jsxs18(
2282
+ var MONITOR_ICON = /* @__PURE__ */ jsxs19(
2055
2283
  "svg",
2056
2284
  {
2057
2285
  viewBox: "0 0 24 24",
@@ -2063,13 +2291,13 @@ var MONITOR_ICON = /* @__PURE__ */ jsxs18(
2063
2291
  strokeLinecap: "round",
2064
2292
  strokeLinejoin: "round",
2065
2293
  children: [
2066
- /* @__PURE__ */ jsx18("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2" }),
2067
- /* @__PURE__ */ jsx18("line", { x1: "8", y1: "21", x2: "16", y2: "21" }),
2068
- /* @__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" })
2069
2297
  ]
2070
2298
  }
2071
2299
  );
2072
- var SPINNER_ICON = /* @__PURE__ */ jsx18(
2300
+ var SPINNER_ICON = /* @__PURE__ */ jsx19(
2073
2301
  "svg",
2074
2302
  {
2075
2303
  className: "graph-toolbar-validation-spin",
@@ -2081,10 +2309,10 @@ var SPINNER_ICON = /* @__PURE__ */ jsx18(
2081
2309
  strokeWidth: "2",
2082
2310
  strokeLinecap: "round",
2083
2311
  strokeLinejoin: "round",
2084
- 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" })
2085
2313
  }
2086
2314
  );
2087
- var CHECK_ICON2 = /* @__PURE__ */ jsx18(
2315
+ var CHECK_ICON2 = /* @__PURE__ */ jsx19(
2088
2316
  "svg",
2089
2317
  {
2090
2318
  viewBox: "0 0 24 24",
@@ -2095,10 +2323,10 @@ var CHECK_ICON2 = /* @__PURE__ */ jsx18(
2095
2323
  strokeWidth: "2",
2096
2324
  strokeLinecap: "round",
2097
2325
  strokeLinejoin: "round",
2098
- children: /* @__PURE__ */ jsx18("polyline", { points: "20 6 9 17 4 12" })
2326
+ children: /* @__PURE__ */ jsx19("polyline", { points: "20 6 9 17 4 12" })
2099
2327
  }
2100
2328
  );
2101
- var X_CIRCLE_ICON = /* @__PURE__ */ jsxs18(
2329
+ var X_CIRCLE_ICON = /* @__PURE__ */ jsxs19(
2102
2330
  "svg",
2103
2331
  {
2104
2332
  viewBox: "0 0 24 24",
@@ -2110,13 +2338,13 @@ var X_CIRCLE_ICON = /* @__PURE__ */ jsxs18(
2110
2338
  strokeLinecap: "round",
2111
2339
  strokeLinejoin: "round",
2112
2340
  children: [
2113
- /* @__PURE__ */ jsx18("circle", { cx: "12", cy: "12", r: "10" }),
2114
- /* @__PURE__ */ jsx18("line", { x1: "15", y1: "9", x2: "9", y2: "15" }),
2115
- /* @__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" })
2116
2344
  ]
2117
2345
  }
2118
2346
  );
2119
- var ALERT_TRIANGLE_ICON = /* @__PURE__ */ jsxs18(
2347
+ var ALERT_TRIANGLE_ICON = /* @__PURE__ */ jsxs19(
2120
2348
  "svg",
2121
2349
  {
2122
2350
  viewBox: "0 0 24 24",
@@ -2128,9 +2356,9 @@ var ALERT_TRIANGLE_ICON = /* @__PURE__ */ jsxs18(
2128
2356
  strokeLinecap: "round",
2129
2357
  strokeLinejoin: "round",
2130
2358
  children: [
2131
- /* @__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" }),
2132
- /* @__PURE__ */ jsx18("line", { x1: "12", y1: "9", x2: "12", y2: "13" }),
2133
- /* @__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" })
2134
2362
  ]
2135
2363
  }
2136
2364
  );
@@ -2232,10 +2460,10 @@ function GraphToolbar({
2232
2460
  const foldAllSection = onFoldAll || onExpandAll;
2233
2461
  const foldAllTitle = foldAllDisabled ? "Fold all controllers (nothing to fold)" : "Fold all controllers";
2234
2462
  const expandAllTitle = expandAllDisabled ? "Expand all controllers (nothing to expand)" : "Expand all controllers";
2235
- return /* @__PURE__ */ jsx18(Panel, { position, className: "graph-toolbar-panel", style: panelStyle, children: /* @__PURE__ */ jsxs18("div", { className: `graph-toolbar graph-toolbar--${orientation}`, children: [
2236
- validationState !== void 0 && /* @__PURE__ */ jsxs18(Fragment12, { children: [
2237
- /* @__PURE__ */ jsxs18("div", { className: "graph-toolbar-validation", ref: validationRef, children: [
2238
- /* @__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(
2239
2467
  "button",
2240
2468
  {
2241
2469
  type: "button",
@@ -2248,11 +2476,11 @@ function GraphToolbar({
2248
2476
  "aria-controls": validationPanelId,
2249
2477
  children: [
2250
2478
  validationIcon(validationState),
2251
- 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 })
2252
2480
  ]
2253
2481
  }
2254
2482
  ),
2255
- validationOpen && /* @__PURE__ */ jsx18(
2483
+ validationOpen && /* @__PURE__ */ jsx19(
2256
2484
  ValidationPanel,
2257
2485
  {
2258
2486
  id: validationPanelId,
@@ -2263,9 +2491,9 @@ function GraphToolbar({
2263
2491
  }
2264
2492
  )
2265
2493
  ] }),
2266
- /* @__PURE__ */ jsx18("div", { className: "graph-toolbar-separator" })
2494
+ /* @__PURE__ */ jsx19("div", { className: "graph-toolbar-separator" })
2267
2495
  ] }),
2268
- onFoldAll && /* @__PURE__ */ jsx18(
2496
+ onFoldAll && /* @__PURE__ */ jsx19(
2269
2497
  "button",
2270
2498
  {
2271
2499
  type: "button",
@@ -2277,7 +2505,7 @@ function GraphToolbar({
2277
2505
  children: FOLD_ALL_ICON
2278
2506
  }
2279
2507
  ),
2280
- onExpandAll && /* @__PURE__ */ jsx18(
2508
+ onExpandAll && /* @__PURE__ */ jsx19(
2281
2509
  "button",
2282
2510
  {
2283
2511
  type: "button",
@@ -2289,8 +2517,8 @@ function GraphToolbar({
2289
2517
  children: EXPAND_ALL_ICON
2290
2518
  }
2291
2519
  ),
2292
- foldAllSection && /* @__PURE__ */ jsx18("div", { className: "graph-toolbar-separator" }),
2293
- /* @__PURE__ */ jsx18(
2520
+ foldAllSection && /* @__PURE__ */ jsx19("div", { className: "graph-toolbar-separator" }),
2521
+ /* @__PURE__ */ jsx19(
2294
2522
  "button",
2295
2523
  {
2296
2524
  type: "button",
@@ -2301,7 +2529,7 @@ function GraphToolbar({
2301
2529
  children: BOXES_ICON
2302
2530
  }
2303
2531
  ),
2304
- /* @__PURE__ */ jsx18(
2532
+ /* @__PURE__ */ jsx19(
2305
2533
  "button",
2306
2534
  {
2307
2535
  type: "button",
@@ -2312,8 +2540,8 @@ function GraphToolbar({
2312
2540
  children: isVertical ? ARROW_RIGHT_ICON : ARROW_DOWN_ICON
2313
2541
  }
2314
2542
  ),
2315
- (onZoomOut || onZoomIn || onFitView) && /* @__PURE__ */ jsx18("div", { className: "graph-toolbar-separator" }),
2316
- onZoomOut && /* @__PURE__ */ jsx18(
2543
+ (onZoomOut || onZoomIn || onFitView) && /* @__PURE__ */ jsx19("div", { className: "graph-toolbar-separator" }),
2544
+ onZoomOut && /* @__PURE__ */ jsx19(
2317
2545
  "button",
2318
2546
  {
2319
2547
  type: "button",
@@ -2324,7 +2552,7 @@ function GraphToolbar({
2324
2552
  children: MINUS_ICON
2325
2553
  }
2326
2554
  ),
2327
- onZoomIn && /* @__PURE__ */ jsx18(
2555
+ onZoomIn && /* @__PURE__ */ jsx19(
2328
2556
  "button",
2329
2557
  {
2330
2558
  type: "button",
@@ -2335,7 +2563,7 @@ function GraphToolbar({
2335
2563
  children: PLUS_ICON
2336
2564
  }
2337
2565
  ),
2338
- onFitView && /* @__PURE__ */ jsx18(
2566
+ onFitView && /* @__PURE__ */ jsx19(
2339
2567
  "button",
2340
2568
  {
2341
2569
  type: "button",
@@ -2346,9 +2574,9 @@ function GraphToolbar({
2346
2574
  children: FIT_VIEW_ICON
2347
2575
  }
2348
2576
  ),
2349
- themeToggleEnabled && /* @__PURE__ */ jsxs18(Fragment12, { children: [
2350
- /* @__PURE__ */ jsx18("div", { className: "graph-toolbar-separator" }),
2351
- /* @__PURE__ */ jsx18(
2577
+ themeToggleEnabled && /* @__PURE__ */ jsxs19(Fragment12, { children: [
2578
+ /* @__PURE__ */ jsx19("div", { className: "graph-toolbar-separator" }),
2579
+ /* @__PURE__ */ jsx19(
2352
2580
  "button",
2353
2581
  {
2354
2582
  type: "button",
@@ -2364,7 +2592,7 @@ function GraphToolbar({
2364
2592
  }
2365
2593
 
2366
2594
  // src/graph/react/nodes/NodeValidationBadge.tsx
2367
- import { jsx as jsx19 } from "react/jsx-runtime";
2595
+ import { jsx as jsx20 } from "react/jsx-runtime";
2368
2596
  function NodeValidationBadge({
2369
2597
  validation,
2370
2598
  onClick
@@ -2374,9 +2602,9 @@ function NodeValidationBadge({
2374
2602
  const className = `node-validation-badge node-validation-badge--${validation.severity}`;
2375
2603
  const text = validation.count > 99 ? "99+" : String(validation.count);
2376
2604
  if (!onClick) {
2377
- 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 });
2378
2606
  }
2379
- return /* @__PURE__ */ jsx19(
2607
+ return /* @__PURE__ */ jsx20(
2380
2608
  "button",
2381
2609
  {
2382
2610
  type: "button",
@@ -2396,7 +2624,7 @@ function validationRingClass(validation) {
2396
2624
  }
2397
2625
 
2398
2626
  // src/graph/react/nodes/controller/ControllerGroupNode.tsx
2399
- import { jsx as jsx20, jsxs as jsxs19 } from "react/jsx-runtime";
2627
+ import { jsx as jsx21, jsxs as jsxs20 } from "react/jsx-runtime";
2400
2628
  var CONTROLLER_CONFIG = {
2401
2629
  PipeSequence: { badge: "Sequence", icon: "\u2192" },
2402
2630
  PipeParallel: { badge: "Parallel", icon: "//" },
@@ -2418,12 +2646,12 @@ function ControllerGroupNode({ data }) {
2418
2646
  const modifier = getControllerModifier(data.pipeType);
2419
2647
  const isCollapsible = (data.pipeType === "PipeParallel" || data.pipeType === "PipeBatch") && ((_a = data.childCount) != null ? _a : 0) > MAX_VISIBLE_CONTROLLER_CHILDREN;
2420
2648
  const hiddenCount = isCollapsible ? ((_b = data.childCount) != null ? _b : 0) - MAX_VISIBLE_CONTROLLER_CHILDREN : 0;
2421
- return /* @__PURE__ */ jsxs19("div", { className: `controller-group-node ${modifier}${validationRingClass(data.validation)}`, children: [
2422
- /* @__PURE__ */ jsxs19("div", { className: "controller-group-header", children: [
2423
- /* @__PURE__ */ jsx20("span", { className: "controller-group-icon", children: config.icon }),
2424
- /* @__PURE__ */ jsx20("span", { className: "controller-group-badge", children: config.badge }),
2425
- data.label && /* @__PURE__ */ jsx20("span", { className: "controller-group-label", children: data.label }),
2426
- 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(
2427
2655
  "button",
2428
2656
  {
2429
2657
  type: "button",
@@ -2438,9 +2666,9 @@ function ControllerGroupNode({ data }) {
2438
2666
  children: "\u2921"
2439
2667
  }
2440
2668
  ),
2441
- data.validation && /* @__PURE__ */ jsx20(NodeValidationBadge, { validation: data.validation, onClick: data.onValidationBadgeClick })
2669
+ data.validation && /* @__PURE__ */ jsx21(NodeValidationBadge, { validation: data.validation, onClick: data.onValidationBadgeClick })
2442
2670
  ] }),
2443
- isCollapsible && /* @__PURE__ */ jsx20(
2671
+ isCollapsible && /* @__PURE__ */ jsx21(
2444
2672
  "button",
2445
2673
  {
2446
2674
  className: "controller-group-collapse",
@@ -2461,7 +2689,7 @@ import { Handle, Position } from "@xyflow/react";
2461
2689
 
2462
2690
  // src/graph/react/nodes/pipe/PipeCardBase.tsx
2463
2691
  import { useState as useState2 } from "react";
2464
- import { jsx as jsx21, jsxs as jsxs20 } from "react/jsx-runtime";
2692
+ import { jsx as jsx22, jsxs as jsxs21 } from "react/jsx-runtime";
2465
2693
  var PIPE_TYPE_BADGES2 = {
2466
2694
  PipeLLM: "LLM",
2467
2695
  PipeExtract: "Extract",
@@ -2517,21 +2745,21 @@ function PipeCardBase({ data, children }) {
2517
2745
  const staticClass = isStatic ? " pipe-card--static" : "";
2518
2746
  const badgeClass = isController ? "pipe-card-badge pipe-card-badge--controller" : isSignature ? "pipe-card-badge pipe-card-badge--signature" : "pipe-card-badge";
2519
2747
  const ringClass = validationRingClass(data.validation);
2520
- return /* @__PURE__ */ jsxs20(
2748
+ return /* @__PURE__ */ jsxs21(
2521
2749
  "div",
2522
2750
  {
2523
2751
  className: `pipe-card ${dirClass}${controllerClass}${signatureClass}${staticClass}${ringClass}`,
2524
2752
  children: [
2525
- /* @__PURE__ */ jsxs20("div", { className: "pipe-card-header", children: [
2526
- /* @__PURE__ */ jsx21("span", { className: badgeClass, children: badge }),
2527
- /* @__PURE__ */ jsx21("span", { className: "pipe-card-code", title: data.pipeCode, children: data.pipeCode }),
2528
- !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(
2529
2757
  "span",
2530
2758
  {
2531
2759
  className: "pipe-card-status",
2532
2760
  style: { color: statusConfig.color },
2533
2761
  title: statusConfig.label,
2534
- children: /* @__PURE__ */ jsx21(
2762
+ children: /* @__PURE__ */ jsx22(
2535
2763
  "span",
2536
2764
  {
2537
2765
  className: `pipe-card-status-dot ${isRunning ? "pipe-card-status-dot--pulse" : ""}`,
@@ -2540,7 +2768,7 @@ function PipeCardBase({ data, children }) {
2540
2768
  )
2541
2769
  }
2542
2770
  ),
2543
- data.onExpand && /* @__PURE__ */ jsx21(
2771
+ data.onExpand && /* @__PURE__ */ jsx22(
2544
2772
  "button",
2545
2773
  {
2546
2774
  type: "button",
@@ -2555,32 +2783,32 @@ function PipeCardBase({ data, children }) {
2555
2783
  children: "\u2922"
2556
2784
  }
2557
2785
  ),
2558
- data.validation && /* @__PURE__ */ jsx21(NodeValidationBadge, { validation: data.validation, onClick: data.onValidationBadgeClick })
2786
+ data.validation && /* @__PURE__ */ jsx22(NodeValidationBadge, { validation: data.validation, onClick: data.onValidationBadgeClick })
2559
2787
  ] }),
2560
- (outcome || batchMultiplicity) && /* @__PURE__ */ jsxs20("div", { className: "pipe-card-annotations", children: [
2561
- 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: [
2562
2790
  "outcome: ",
2563
2791
  outcome
2564
2792
  ] }),
2565
- 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 })
2566
2794
  ] }),
2567
- data.description && /* @__PURE__ */ jsx21("span", { className: "pipe-card-description", title: data.description, children: data.description }),
2568
- data.inputs.length > 0 && /* @__PURE__ */ jsxs20("div", { className: "pipe-card-io", children: [
2569
- /* @__PURE__ */ jsx21("span", { className: "pipe-card-io-label", children: "INPUTS" }),
2570
- /* @__PURE__ */ jsxs20("div", { className: "pipe-card-io-pills", children: [
2571
- 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(
2572
2800
  "span",
2573
2801
  {
2574
2802
  className: "pipe-card-io-pill",
2575
2803
  title: `${input.name}: ${input.concept}`,
2576
2804
  children: [
2577
- /* @__PURE__ */ jsx21("span", { className: "pipe-card-io-pill-name", children: input.name }),
2578
- /* @__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 })
2579
2807
  ]
2580
2808
  },
2581
2809
  input.name
2582
2810
  )),
2583
- hasMany && /* @__PURE__ */ jsx21(
2811
+ hasMany && /* @__PURE__ */ jsx22(
2584
2812
  "button",
2585
2813
  {
2586
2814
  className: "pipe-card-io-more",
@@ -2593,16 +2821,16 @@ function PipeCardBase({ data, children }) {
2593
2821
  )
2594
2822
  ] })
2595
2823
  ] }),
2596
- data.outputs.length > 0 && /* @__PURE__ */ jsxs20("div", { className: "pipe-card-io", children: [
2597
- /* @__PURE__ */ jsx21("span", { className: "pipe-card-io-label", children: "OUTPUT" }),
2598
- /* @__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(
2599
2827
  "span",
2600
2828
  {
2601
2829
  className: "pipe-card-io-pill",
2602
2830
  title: `${output.name}: ${output.concept}`,
2603
2831
  children: [
2604
- /* @__PURE__ */ jsx21("span", { className: "pipe-card-io-pill-name", children: output.name }),
2605
- /* @__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 })
2606
2834
  ]
2607
2835
  },
2608
2836
  output.name
@@ -2634,11 +2862,11 @@ function getPipeCardComponent(pipeType) {
2634
2862
  }
2635
2863
 
2636
2864
  // src/graph/react/nodes/pipe/PipeCardNode.tsx
2637
- 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";
2638
2866
  function PipeCardNode({ data }) {
2639
2867
  var _a;
2640
2868
  const Card = (_a = getPipeCardComponent(data.pipeType)) != null ? _a : PipeCardBase;
2641
- return /* @__PURE__ */ jsx22(Card, { data });
2869
+ return /* @__PURE__ */ jsx23(Card, { data });
2642
2870
  }
2643
2871
  function PipeCardRFNode({
2644
2872
  data,
@@ -2647,15 +2875,15 @@ function PipeCardRFNode({
2647
2875
  }) {
2648
2876
  const payload = data.pipeCardData;
2649
2877
  if (!payload) return null;
2650
- return /* @__PURE__ */ jsxs21(Fragment13, { children: [
2651
- /* @__PURE__ */ jsx22(Handle, { type: "target", position: targetPosition }),
2652
- /* @__PURE__ */ jsx22(PipeCardNode, { data: payload }),
2653
- /* @__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 })
2654
2882
  ] });
2655
2883
  }
2656
2884
 
2657
2885
  // src/graph/react/viewer/GraphViewer.tsx
2658
- 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";
2659
2887
  var nodeTypes = __spreadProps(__spreadValues({}, controllerNodeTypes), {
2660
2888
  pipeCard: PipeCardRFNode
2661
2889
  });
@@ -2669,7 +2897,7 @@ function StuffNodeDetail({
2669
2897
  }) {
2670
2898
  const conceptInfo = stuffData.concept && graphspec ? resolveConceptRef(graphspec, stuffData.concept) : void 0;
2671
2899
  const isDryRun = graphSpecMode(graphspec) === GRAPH_SPEC_MODE.DRY;
2672
- return /* @__PURE__ */ jsx23(Fragment14, { children: conceptInfo ? /* @__PURE__ */ jsx23(
2900
+ return /* @__PURE__ */ jsx24(Fragment14, { children: conceptInfo ? /* @__PURE__ */ jsx24(
2673
2901
  ConceptDetailPanel,
2674
2902
  {
2675
2903
  concept: conceptInfo,
@@ -2680,9 +2908,9 @@ function StuffNodeDetail({
2680
2908
  canEmbedPdf,
2681
2909
  onOpenExternally
2682
2910
  }
2683
- ) : 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" }) : (
2684
2912
  /* Fallback: just show the StuffViewer if no concept info */
2685
- /* @__PURE__ */ jsx23(
2913
+ /* @__PURE__ */ jsx24(
2686
2914
  StuffViewer,
2687
2915
  {
2688
2916
  stuff: stuffData,
@@ -3338,13 +3566,13 @@ function GraphViewer(props) {
3338
3566
  expandAllDisabled: foldedControllers.size === 0
3339
3567
  };
3340
3568
  }, [showControllers, allControllerIds, foldedControllers]);
3341
- return /* @__PURE__ */ jsxs22(
3569
+ return /* @__PURE__ */ jsxs23(
3342
3570
  "div",
3343
3571
  {
3344
3572
  ref: containerRef,
3345
3573
  className: `react-flow-container react-flow-container--theme-${resolvedTheme} react-flow-container--mode-${mode}`,
3346
3574
  children: [
3347
- /* @__PURE__ */ jsxs22(
3575
+ /* @__PURE__ */ jsxs23(
3348
3576
  ReactFlow,
3349
3577
  {
3350
3578
  nodes,
@@ -3363,7 +3591,7 @@ function GraphViewer(props) {
3363
3591
  proOptions: { hideAttribution: true },
3364
3592
  panActivationKeyCode: null,
3365
3593
  children: [
3366
- /* @__PURE__ */ jsx23(
3594
+ /* @__PURE__ */ jsx24(
3367
3595
  Background,
3368
3596
  {
3369
3597
  variant: BackgroundVariant.Dots,
@@ -3372,7 +3600,7 @@ function GraphViewer(props) {
3372
3600
  color: "var(--color-bg-dots)"
3373
3601
  }
3374
3602
  ),
3375
- !hideToolbar && /* @__PURE__ */ jsx23(
3603
+ !hideToolbar && /* @__PURE__ */ jsx24(
3376
3604
  GraphToolbar,
3377
3605
  {
3378
3606
  direction,
@@ -3409,7 +3637,7 @@ function GraphViewer(props) {
3409
3637
  ]
3410
3638
  }
3411
3639
  ),
3412
- /* @__PURE__ */ jsxs22(
3640
+ /* @__PURE__ */ jsxs23(
3413
3641
  DetailPanel,
3414
3642
  {
3415
3643
  isOpen: detailOpen,
@@ -3418,14 +3646,14 @@ function GraphViewer(props) {
3418
3646
  isDragging: isPanelDragging,
3419
3647
  onResizeHandleMouseDown: onResizeMouseDown,
3420
3648
  children: [
3421
- conceptOverride ? /* @__PURE__ */ jsx23(ConceptDetailPanel, { concept: conceptOverride }) : selectedSpecNode && graphspec ? /* @__PURE__ */ jsx23(
3649
+ conceptOverride ? /* @__PURE__ */ jsx24(ConceptDetailPanel, { concept: conceptOverride }) : selectedSpecNode && graphspec ? /* @__PURE__ */ jsx24(
3422
3650
  PipeDetailPanel,
3423
3651
  {
3424
3652
  node: selectedSpecNode,
3425
3653
  spec: graphspec,
3426
3654
  onConceptClick: handleConceptClick
3427
3655
  }
3428
- ) : (detailSelection == null ? void 0 : detailSelection.stuffData) ? /* @__PURE__ */ jsx23(
3656
+ ) : (detailSelection == null ? void 0 : detailSelection.stuffData) ? /* @__PURE__ */ jsx24(
3429
3657
  StuffNodeDetail,
3430
3658
  {
3431
3659
  nodeId: detailSelection.nodeId,