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