@walkeros/explorer 2.0.1 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/AGENT.md +14 -0
  2. package/STYLE.md +246 -136
  3. package/dist/chunk-4AJX6MFW.mjs +573 -0
  4. package/dist/chunk-4AJX6MFW.mjs.map +1 -0
  5. package/dist/components/atoms/button-link.stories.d.ts +1 -3
  6. package/dist/components/atoms/button-link.stories.d.ts.map +1 -1
  7. package/dist/components/atoms/button-link.stories.js +1 -15
  8. package/dist/components/atoms/button-link.stories.js.map +1 -1
  9. package/dist/components/atoms/code.d.ts +32 -1
  10. package/dist/components/atoms/code.d.ts.map +1 -1
  11. package/dist/components/atoms/code.js +103 -14
  12. package/dist/components/atoms/code.js.map +1 -1
  13. package/dist/components/atoms/code.stories.d.ts +0 -7
  14. package/dist/components/atoms/code.stories.d.ts.map +1 -1
  15. package/dist/components/atoms/code.stories.js +0 -34
  16. package/dist/components/atoms/code.stories.js.map +1 -1
  17. package/dist/components/molecules/code-box.d.ts +7 -1
  18. package/dist/components/molecules/code-box.d.ts.map +1 -1
  19. package/dist/components/molecules/code-box.js +74 -6
  20. package/dist/components/molecules/code-box.js.map +1 -1
  21. package/dist/components/molecules/code-box.stories.d.ts +56 -7
  22. package/dist/components/molecules/code-box.stories.d.ts.map +1 -1
  23. package/dist/components/molecules/code-box.stories.js +178 -41
  24. package/dist/components/molecules/code-box.stories.js.map +1 -1
  25. package/dist/components/molecules/code-snippet.stories.d.ts +7 -4
  26. package/dist/components/molecules/code-snippet.stories.d.ts.map +1 -1
  27. package/dist/components/molecules/code-snippet.stories.js +28 -9
  28. package/dist/components/molecules/code-snippet.stories.js.map +1 -1
  29. package/dist/components/molecules/flow-map/FlowMap.stories.d.ts +0 -32
  30. package/dist/components/molecules/flow-map/FlowMap.stories.d.ts.map +1 -1
  31. package/dist/components/molecules/flow-map/FlowMap.stories.js +0 -330
  32. package/dist/components/molecules/flow-map/FlowMap.stories.js.map +1 -1
  33. package/dist/components/molecules/flow-map/FlowMap.transformers.stories.d.ts +0 -16
  34. package/dist/components/molecules/flow-map/FlowMap.transformers.stories.d.ts.map +1 -1
  35. package/dist/components/molecules/flow-map/FlowMap.transformers.stories.js +0 -78
  36. package/dist/components/molecules/flow-map/FlowMap.transformers.stories.js.map +1 -1
  37. package/dist/components/molecules/flow-selector.js +1 -1
  38. package/dist/components/molecules/flow-selector.js.map +1 -1
  39. package/dist/components/molecules/flow-selector.stories.js +4 -4
  40. package/dist/components/molecules/flow-selector.stories.js.map +1 -1
  41. package/dist/components/molecules/preview.d.ts.map +1 -1
  42. package/dist/components/molecules/preview.js +32 -22
  43. package/dist/components/molecules/preview.js.map +1 -1
  44. package/dist/components/molecules/split-button.stories.js +6 -6
  45. package/dist/components/molecules/split-button.stories.js.map +1 -1
  46. package/dist/index.d.cts +200 -34
  47. package/dist/index.d.ts +10 -2
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +13 -1
  50. package/dist/index.js.map +1 -1
  51. package/dist/index.mjs +1388 -337
  52. package/dist/index.mjs.map +1 -1
  53. package/dist/{monaco-types-OLSF6MIE.mjs → monaco-types-KN2DINPW.mjs} +2 -2
  54. package/dist/styles.css +77 -91
  55. package/dist/themes/lighthouse.d.ts.map +1 -1
  56. package/dist/themes/lighthouse.js +1 -0
  57. package/dist/themes/lighthouse.js.map +1 -1
  58. package/dist/themes/palenight.d.ts.map +1 -1
  59. package/dist/themes/palenight.js +1 -0
  60. package/dist/themes/palenight.js.map +1 -1
  61. package/dist/types/intellisense.d.ts +31 -0
  62. package/dist/types/intellisense.d.ts.map +1 -0
  63. package/dist/types/intellisense.js +2 -0
  64. package/dist/types/intellisense.js.map +1 -0
  65. package/dist/utils/format-code.d.ts.map +1 -1
  66. package/dist/utils/format-code.js +11 -2
  67. package/dist/utils/format-code.js.map +1 -1
  68. package/dist/utils/monaco-decorators.d.ts.map +1 -1
  69. package/dist/utils/monaco-decorators.js +2 -0
  70. package/dist/utils/monaco-decorators.js.map +1 -1
  71. package/dist/utils/monaco-intellisense-flow-extractor.d.ts +13 -0
  72. package/dist/utils/monaco-intellisense-flow-extractor.d.ts.map +1 -0
  73. package/dist/utils/monaco-intellisense-flow-extractor.js +161 -0
  74. package/dist/utils/monaco-intellisense-flow-extractor.js.map +1 -0
  75. package/dist/utils/monaco-json-schema.d.ts +24 -0
  76. package/dist/utils/monaco-json-schema.d.ts.map +1 -0
  77. package/dist/utils/monaco-json-schema.js +65 -0
  78. package/dist/utils/monaco-json-schema.js.map +1 -0
  79. package/dist/utils/monaco-schema-contract.d.ts +8 -0
  80. package/dist/utils/monaco-schema-contract.d.ts.map +1 -0
  81. package/dist/utils/monaco-schema-contract.js +73 -0
  82. package/dist/utils/monaco-schema-contract.js.map +1 -0
  83. package/dist/utils/monaco-schema-enrichment.d.ts +26 -0
  84. package/dist/utils/monaco-schema-enrichment.d.ts.map +1 -0
  85. package/dist/utils/monaco-schema-enrichment.js +31 -0
  86. package/dist/utils/monaco-schema-enrichment.js.map +1 -0
  87. package/dist/utils/monaco-schema-flow-setup.d.ts +10 -0
  88. package/dist/utils/monaco-schema-flow-setup.d.ts.map +1 -0
  89. package/dist/utils/monaco-schema-flow-setup.js +201 -0
  90. package/dist/utils/monaco-schema-flow-setup.js.map +1 -0
  91. package/dist/utils/monaco-schema-variables.d.ts +4 -0
  92. package/dist/utils/monaco-schema-variables.d.ts.map +1 -0
  93. package/dist/utils/monaco-schema-variables.js +26 -0
  94. package/dist/utils/monaco-schema-variables.js.map +1 -0
  95. package/dist/utils/monaco-walkeros-completions.d.ts +15 -0
  96. package/dist/utils/monaco-walkeros-completions.d.ts.map +1 -0
  97. package/dist/utils/monaco-walkeros-completions.js +65 -0
  98. package/dist/utils/monaco-walkeros-completions.js.map +1 -0
  99. package/dist/utils/monaco-walkeros-decorations.d.ts +29 -0
  100. package/dist/utils/monaco-walkeros-decorations.d.ts.map +1 -0
  101. package/dist/utils/monaco-walkeros-decorations.js +87 -0
  102. package/dist/utils/monaco-walkeros-decorations.js.map +1 -0
  103. package/dist/utils/monaco-walkeros-markers.d.ts +13 -0
  104. package/dist/utils/monaco-walkeros-markers.d.ts.map +1 -0
  105. package/dist/utils/monaco-walkeros-markers.js +69 -0
  106. package/dist/utils/monaco-walkeros-markers.js.map +1 -0
  107. package/dist/utils/monaco-walkeros-providers.d.ts +19 -0
  108. package/dist/utils/monaco-walkeros-providers.d.ts.map +1 -0
  109. package/dist/utils/monaco-walkeros-providers.js +229 -0
  110. package/dist/utils/monaco-walkeros-providers.js.map +1 -0
  111. package/package.json +1 -1
  112. package/dist/chunk-YKT4D7MG.mjs +0 -3087
  113. package/dist/chunk-YKT4D7MG.mjs.map +0 -1
  114. package/dist/components/molecules/flow-deploy-panel.d.ts +0 -31
  115. package/dist/components/molecules/flow-deploy-panel.d.ts.map +0 -1
  116. package/dist/components/molecules/flow-deploy-panel.js +0 -72
  117. package/dist/components/molecules/flow-deploy-panel.js.map +0 -1
  118. package/dist/components/molecules/flow-deploy-panel.stories.d.ts +0 -40
  119. package/dist/components/molecules/flow-deploy-panel.stories.d.ts.map +0 -1
  120. package/dist/components/molecules/flow-deploy-panel.stories.js +0 -145
  121. package/dist/components/molecules/flow-deploy-panel.stories.js.map +0 -1
  122. /package/dist/{monaco-types-OLSF6MIE.mjs.map → monaco-types-KN2DINPW.mjs.map} +0 -0
package/dist/index.mjs CHANGED
@@ -5,13 +5,14 @@ import {
5
5
  loadPackageTypes,
6
6
  loadTypeLibraryFromURL,
7
7
  registerWalkerOSTypes
8
- } from "./chunk-YKT4D7MG.mjs";
8
+ } from "./chunk-4AJX6MFW.mjs";
9
9
 
10
10
  // src/components/demos/MappingDemo.tsx
11
- import { useState as useState6, useCallback as useCallback5, useEffect as useEffect4 } from "react";
11
+ import { useState as useState6, useCallback as useCallback5, useEffect as useEffect5 } from "react";
12
12
 
13
13
  // src/components/molecules/code-box.tsx
14
- import { useState as useState4, useCallback as useCallback3 } from "react";
14
+ import { useState as useState4, useCallback as useCallback3, useRef as useRef4, useEffect as useEffect3 } from "react";
15
+ import * as monacoNs from "monaco-editor";
15
16
 
16
17
  // src/components/atoms/box.tsx
17
18
  import { useState } from "react";
@@ -302,6 +303,7 @@ var palenightTheme = {
302
303
  "editorStickyScroll.border": "#676E9540",
303
304
  "editorStickyScrollHover.background": "#292d3e",
304
305
  "editorStickyScroll.shadow": "#00000000",
306
+ "editorStickyScrollGutter.background": "#292d3e",
305
307
  // Hover Widgets - Tooltips and hover information
306
308
  "editorHoverWidget.background": "#1e1e2e",
307
309
  "editorHoverWidget.border": "#676E95",
@@ -515,6 +517,7 @@ var lighthouseTheme = {
515
517
  "editorStickyScroll.border": "#E1E4E8",
516
518
  "editorStickyScrollHover.background": "#ffffff",
517
519
  "editorStickyScroll.shadow": "#00000000",
520
+ "editorStickyScrollGutter.background": "#ffffff",
518
521
  // Hover Widgets - Tooltips and hover information
519
522
  "editorHoverWidget.background": "#F6F8FA",
520
523
  "editorHoverWidget.border": "#E1E4E8",
@@ -577,10 +580,14 @@ var DATA_ELB_PATTERNS = [
577
580
  // data-elb (not followed by hyphen)
578
581
  /\bdata-elbaction\b/g,
579
582
  // data-elbaction
583
+ /\bdata-elbactions\b/g,
584
+ // data-elbactions
580
585
  /\bdata-elbglobals\b/g,
581
586
  // data-elbglobals
582
587
  /\bdata-elbcontext\b/g,
583
588
  // data-elbcontext
589
+ /\bdata-elblink\b/g,
590
+ // data-elblink
584
591
  /\bdata-elb-[\w-]+\b/g
585
592
  // data-elb-* (property attributes)
586
593
  ];
@@ -640,6 +647,348 @@ function registerDataElbStyles() {
640
647
  document.head.appendChild(style);
641
648
  }
642
649
 
650
+ // src/utils/monaco-walkeros-decorations.ts
651
+ var REFERENCE_PATTERNS = [
652
+ { type: "variable", regex: /\$var\.(\w*)/g, className: "elb-ref-variable" },
653
+ {
654
+ type: "definition",
655
+ regex: /\$def\.(\w*)/g,
656
+ className: "elb-ref-definition"
657
+ },
658
+ { type: "secret", regex: /\$secret\.(\w*)/g, className: "elb-ref-secret" },
659
+ { type: "env", regex: /\$env\.(\w*)/g, className: "elb-ref-env" },
660
+ { type: "code", regex: /\$code:/g, className: "elb-ref-code" }
661
+ ];
662
+ function findWalkerOSReferences(text) {
663
+ const references = [];
664
+ for (const pattern of REFERENCE_PATTERNS) {
665
+ const regex2 = new RegExp(pattern.regex.source, pattern.regex.flags);
666
+ let match;
667
+ while ((match = regex2.exec(text)) !== null) {
668
+ references.push({
669
+ type: pattern.type,
670
+ name: pattern.type === "code" ? "" : match[1] || "",
671
+ startIndex: match.index,
672
+ endIndex: match.index + match[0].length
673
+ });
674
+ }
675
+ }
676
+ return references;
677
+ }
678
+ function applyWalkerOSDecorations(editorInstance) {
679
+ let decorationIds = [];
680
+ function update() {
681
+ const model = editorInstance.getModel();
682
+ if (!model) return;
683
+ const text = model.getValue();
684
+ const references = findWalkerOSReferences(text);
685
+ const decorations = references.map(
686
+ (ref) => {
687
+ const startPos = model.getPositionAt(ref.startIndex);
688
+ const endPos = model.getPositionAt(ref.endIndex);
689
+ const pattern = REFERENCE_PATTERNS.find((p) => p.type === ref.type);
690
+ return {
691
+ range: {
692
+ startLineNumber: startPos.lineNumber,
693
+ startColumn: startPos.column,
694
+ endLineNumber: endPos.lineNumber,
695
+ endColumn: endPos.column
696
+ },
697
+ options: { inlineClassName: pattern.className }
698
+ };
699
+ }
700
+ );
701
+ decorationIds = editorInstance.deltaDecorations(decorationIds, decorations);
702
+ }
703
+ update();
704
+ const disposable = editorInstance.onDidChangeModelContent(() => update());
705
+ return () => {
706
+ disposable.dispose();
707
+ editorInstance.deltaDecorations(decorationIds, []);
708
+ };
709
+ }
710
+ function registerWalkerOSDecorationStyles() {
711
+ if (typeof document === "undefined") return;
712
+ if (document.getElementById("walkeros-ref-styles")) return;
713
+ const style = document.createElement("style");
714
+ style.id = "walkeros-ref-styles";
715
+ style.textContent = `
716
+ .monaco-editor .elb-ref-variable { color: #89ddff !important; font-style: italic; }
717
+ .monaco-editor .elb-ref-definition { color: #c3e88d !important; font-style: italic; }
718
+ .monaco-editor .elb-ref-secret { color: #ffcb6b !important; font-style: italic; }
719
+ .monaco-editor .elb-ref-env { color: #ffcb6b !important; font-style: italic; }
720
+ .monaco-editor .elb-ref-code { color: #c084fc !important; }
721
+ `;
722
+ document.head.appendChild(style);
723
+ }
724
+
725
+ // src/utils/monaco-walkeros-completions.ts
726
+ function getVariableCompletions(variables) {
727
+ if (!variables || Object.keys(variables).length === 0) return [];
728
+ return Object.entries(variables).map(([name, value]) => ({
729
+ label: `$var.${name}`,
730
+ insertText: `$var.${name}`,
731
+ detail: `= ${JSON.stringify(value)}`,
732
+ documentation: `Variable reference. Resolves to \`${JSON.stringify(value)}\` at runtime.`,
733
+ kind: "variable",
734
+ sortText: "0_var_" + name
735
+ }));
736
+ }
737
+ function getDefinitionCompletions(definitions) {
738
+ if (!definitions || Object.keys(definitions).length === 0) return [];
739
+ return Object.keys(definitions).map((name) => ({
740
+ label: `$def.${name}`,
741
+ insertText: `$def.${name}`,
742
+ detail: "(definition)",
743
+ documentation: `Definition reference. Injects the reusable config fragment "${name}" at runtime.`,
744
+ kind: "reference",
745
+ sortText: "0_def_" + name
746
+ }));
747
+ }
748
+ function getSecretCompletions(secrets) {
749
+ if (!secrets || secrets.length === 0) return [];
750
+ return secrets.map((name) => ({
751
+ label: `$secret.${name}`,
752
+ insertText: `$secret.${name}`,
753
+ detail: "(secret)",
754
+ documentation: "Secret reference. Value is securely injected at runtime. Never stored in config.",
755
+ kind: "secret",
756
+ sortText: "0_secret_" + name
757
+ }));
758
+ }
759
+ function getPackageCompletions(packages, platform) {
760
+ if (!packages || packages.length === 0) return [];
761
+ const filtered = platform ? packages.filter((p) => p.platform === platform) : packages;
762
+ return filtered.map((pkg) => ({
763
+ label: pkg.package,
764
+ insertText: pkg.package,
765
+ detail: `${pkg.type} (${pkg.platform})`,
766
+ documentation: `walkerOS ${pkg.type}: ${pkg.shortName}`,
767
+ kind: "module",
768
+ sortText: "1_pkg_" + pkg.shortName
769
+ }));
770
+ }
771
+ function getStepNameCompletions(stepNames, context) {
772
+ if (!stepNames) return [];
773
+ const names = stepNames.transformers || [];
774
+ return names.map((name) => ({
775
+ label: name,
776
+ insertText: name,
777
+ detail: `transformer (${context} chain)`,
778
+ documentation: `Reference to transformer step "${name}" in this flow config.`,
779
+ kind: "reference",
780
+ sortText: "0_step_" + name
781
+ }));
782
+ }
783
+
784
+ // src/utils/monaco-walkeros-providers.ts
785
+ var contextRegistry = /* @__PURE__ */ new Map();
786
+ var disposables = [];
787
+ var registered = false;
788
+ function setIntelliSenseContext(modelPath, context) {
789
+ contextRegistry.set(modelPath, context);
790
+ }
791
+ function removeIntelliSenseContext(modelPath) {
792
+ contextRegistry.delete(modelPath);
793
+ }
794
+ function registerWalkerOSProviders(monaco) {
795
+ if (registered) return;
796
+ registered = true;
797
+ disposables.push(
798
+ monaco.languages.registerCompletionItemProvider("json", {
799
+ triggerCharacters: ['"', ".", "$"],
800
+ provideCompletionItems(model, position) {
801
+ const modelPath = model.uri.toString();
802
+ const context = contextRegistry.get(modelPath);
803
+ if (!context) return { suggestions: [] };
804
+ const lineContent = model.getLineContent(position.lineNumber);
805
+ const textBeforeCursor = lineContent.substring(0, position.column - 1);
806
+ const entries = [];
807
+ if (textBeforeCursor.includes("$var.") || textBeforeCursor.endsWith('"$var')) {
808
+ entries.push(...getVariableCompletions(context.variables));
809
+ } else if (textBeforeCursor.includes("$def.") || textBeforeCursor.endsWith('"$def')) {
810
+ entries.push(...getDefinitionCompletions(context.definitions));
811
+ } else if (textBeforeCursor.includes("$secret.") || textBeforeCursor.endsWith('"$secret')) {
812
+ entries.push(...getSecretCompletions(context.secrets));
813
+ } else if (isInsideKey(model, position, "package")) {
814
+ entries.push(
815
+ ...getPackageCompletions(context.packages, context.platform)
816
+ );
817
+ } else if (isInsideKey(model, position, "next") || isInsideKey(model, position, "before")) {
818
+ const key = isInsideKey(model, position, "next") ? "next" : "before";
819
+ entries.push(...getStepNameCompletions(context.stepNames, key));
820
+ } else if (textBeforeCursor.endsWith('"$') || textBeforeCursor.endsWith('"')) {
821
+ entries.push(...getVariableCompletions(context.variables));
822
+ entries.push(...getDefinitionCompletions(context.definitions));
823
+ entries.push(...getSecretCompletions(context.secrets));
824
+ }
825
+ const refStartMatch = textBeforeCursor.match(
826
+ /\$(?:var|def|secret|env|code)[.:]?\w*$/
827
+ );
828
+ const word = model.getWordUntilPosition(position);
829
+ const startCol = refStartMatch ? position.column - refStartMatch[0].length : word.startColumn;
830
+ const range = {
831
+ startLineNumber: position.lineNumber,
832
+ endLineNumber: position.lineNumber,
833
+ startColumn: startCol,
834
+ endColumn: position.column
835
+ };
836
+ return {
837
+ suggestions: entries.map((entry) => ({
838
+ label: entry.label,
839
+ insertText: entry.insertText,
840
+ detail: entry.detail,
841
+ documentation: entry.documentation,
842
+ kind: mapCompletionKind(monaco, entry.kind),
843
+ sortText: entry.sortText,
844
+ range
845
+ }))
846
+ };
847
+ }
848
+ })
849
+ );
850
+ disposables.push(
851
+ monaco.languages.registerHoverProvider("json", {
852
+ provideHover(model, position) {
853
+ const modelPath = model.uri.toString();
854
+ const context = contextRegistry.get(modelPath);
855
+ if (!context) return null;
856
+ const lineContent = model.getLineContent(position.lineNumber);
857
+ const col = position.column - 1;
858
+ function matchAtCursor(pattern) {
859
+ const regex2 = new RegExp(pattern.source, "g");
860
+ let m;
861
+ while ((m = regex2.exec(lineContent)) !== null) {
862
+ if (col >= m.index && col <= m.index + m[0].length) return m;
863
+ }
864
+ return null;
865
+ }
866
+ const varMatch = matchAtCursor(/\$var\.(\w+)/);
867
+ if (varMatch && context.variables) {
868
+ const name = varMatch[1];
869
+ if (name in context.variables) {
870
+ const value = context.variables[name];
871
+ return {
872
+ range: {
873
+ startLineNumber: position.lineNumber,
874
+ startColumn: varMatch.index + 1,
875
+ endLineNumber: position.lineNumber,
876
+ endColumn: varMatch.index + varMatch[0].length + 1
877
+ },
878
+ contents: [
879
+ {
880
+ value: `**Variable:** \`$var.${name}\`
881
+
882
+ **Value:** \`${JSON.stringify(value)}\`
883
+
884
+ *Resolved at runtime via variable interpolation*`
885
+ }
886
+ ]
887
+ };
888
+ }
889
+ return {
890
+ contents: [
891
+ {
892
+ value: `**Unknown variable** \`$var.${name}\`
893
+
894
+ Defined variables: ${Object.keys(context.variables).join(", ") || "none"}`
895
+ }
896
+ ]
897
+ };
898
+ }
899
+ const defMatch = matchAtCursor(/\$def\.(\w+)/);
900
+ if (defMatch && context.definitions) {
901
+ const name = defMatch[1];
902
+ if (name in context.definitions) {
903
+ return {
904
+ range: {
905
+ startLineNumber: position.lineNumber,
906
+ startColumn: defMatch.index + 1,
907
+ endLineNumber: position.lineNumber,
908
+ endColumn: defMatch.index + defMatch[0].length + 1
909
+ },
910
+ contents: [
911
+ {
912
+ value: `**Definition:** \`$def.${name}\`
913
+
914
+ *Injects reusable config fragment at runtime*`
915
+ }
916
+ ]
917
+ };
918
+ }
919
+ return {
920
+ contents: [
921
+ {
922
+ value: `**Unknown definition** \`$def.${name}\`
923
+
924
+ Defined: ${Object.keys(context.definitions).join(", ") || "none"}`
925
+ }
926
+ ]
927
+ };
928
+ }
929
+ const secretMatch = matchAtCursor(/\$secret\.(\w+)/);
930
+ if (secretMatch) {
931
+ const name = secretMatch[1];
932
+ if (context.secrets?.includes(name)) {
933
+ return {
934
+ range: {
935
+ startLineNumber: position.lineNumber,
936
+ startColumn: secretMatch.index + 1,
937
+ endLineNumber: position.lineNumber,
938
+ endColumn: secretMatch.index + secretMatch[0].length + 1
939
+ },
940
+ contents: [
941
+ {
942
+ value: `**Secret:** \`$secret.${name}\`
943
+
944
+ *Securely injected at runtime. Value not stored in config.*`
945
+ }
946
+ ]
947
+ };
948
+ }
949
+ return {
950
+ contents: [
951
+ {
952
+ value: `**Unknown secret** \`$secret.${name}\`
953
+
954
+ Available secrets: ${context.secrets?.join(", ") || "none"}`
955
+ }
956
+ ]
957
+ };
958
+ }
959
+ return null;
960
+ }
961
+ })
962
+ );
963
+ }
964
+ function disposeWalkerOSProviders() {
965
+ for (const d of disposables) d.dispose();
966
+ disposables.length = 0;
967
+ registered = false;
968
+ contextRegistry.clear();
969
+ }
970
+ function mapCompletionKind(monaco, kind) {
971
+ switch (kind) {
972
+ case "variable":
973
+ return monaco.languages.CompletionItemKind.Variable;
974
+ case "reference":
975
+ return monaco.languages.CompletionItemKind.Reference;
976
+ case "secret":
977
+ return monaco.languages.CompletionItemKind.Constant;
978
+ case "module":
979
+ return monaco.languages.CompletionItemKind.Module;
980
+ case "property":
981
+ return monaco.languages.CompletionItemKind.Property;
982
+ default:
983
+ return monaco.languages.CompletionItemKind.Text;
984
+ }
985
+ }
986
+ function isInsideKey(model, position, key) {
987
+ const lineContent = model.getLineContent(position.lineNumber);
988
+ const pattern = new RegExp(`"${key}"\\s*:\\s*"`);
989
+ return pattern.test(lineContent);
990
+ }
991
+
643
992
  // src/utils/monaco-formatters.ts
644
993
  import * as prettier from "prettier/standalone";
645
994
  import prettierBabel from "prettier/plugins/babel";
@@ -764,6 +1113,35 @@ function registerFormatters(monacoInstance) {
764
1113
  });
765
1114
  }
766
1115
 
1116
+ // src/utils/monaco-json-schema.ts
1117
+ import { json } from "monaco-editor";
1118
+ var schemaRegistry = /* @__PURE__ */ new Map();
1119
+ var idCounter = 0;
1120
+ function generateModelPath() {
1121
+ return `inmemory://walkeros/json-${++idCounter}.json`;
1122
+ }
1123
+ function registerJsonSchema(modelPath, schema) {
1124
+ schemaRegistry.set(modelPath, {
1125
+ uri: `schema://walkeros/${modelPath}`,
1126
+ fileMatch: [modelPath],
1127
+ schema
1128
+ });
1129
+ applySchemas();
1130
+ }
1131
+ function unregisterJsonSchema(modelPath) {
1132
+ schemaRegistry.delete(modelPath);
1133
+ applySchemas();
1134
+ }
1135
+ function applySchemas() {
1136
+ json.jsonDefaults.setDiagnosticsOptions({
1137
+ validate: true,
1138
+ schemaValidation: "error",
1139
+ schemaRequest: "ignore",
1140
+ enableSchemaRequest: false,
1141
+ schemas: Array.from(schemaRegistry.values())
1142
+ });
1143
+ }
1144
+
767
1145
  // src/hooks/useMonacoHeight.ts
768
1146
  import { useState as useState2, useRef as useRef2, useCallback } from "react";
769
1147
  function useMonacoHeight({
@@ -804,19 +1182,19 @@ function useMonacoHeight({
804
1182
  }
805
1183
  }, [enabled, minHeight, maxHeight, onHeightChange]);
806
1184
  const setEditor = useCallback(
807
- (editor) => {
1185
+ (editor2) => {
808
1186
  if (updateTimeoutRef.current) {
809
1187
  clearTimeout(updateTimeoutRef.current);
810
1188
  updateTimeoutRef.current = null;
811
1189
  }
812
- editorRef.current = editor;
813
- if (!enabled || !editor) {
1190
+ editorRef.current = editor2;
1191
+ if (!enabled || !editor2) {
814
1192
  setHeight(defaultHeight);
815
1193
  previousHeightRef.current = defaultHeight;
816
1194
  return;
817
1195
  }
818
1196
  setTimeout(() => updateHeight(), 50);
819
- const disposable = editor.onDidContentSizeChange(() => {
1197
+ const disposable = editor2.onDidContentSizeChange(() => {
820
1198
  if (updateTimeoutRef.current) {
821
1199
  clearTimeout(updateTimeoutRef.current);
822
1200
  }
@@ -825,7 +1203,7 @@ function useMonacoHeight({
825
1203
  updateTimeoutRef.current = null;
826
1204
  }, 150);
827
1205
  });
828
- editor.__heightDisposable = disposable;
1206
+ editor2.__heightDisposable = disposable;
829
1207
  },
830
1208
  [enabled, defaultHeight, updateHeight]
831
1209
  );
@@ -840,6 +1218,7 @@ function Code({
840
1218
  onChange,
841
1219
  disabled = false,
842
1220
  lineNumbers = false,
1221
+ minimap = false,
843
1222
  folding = false,
844
1223
  wordWrap = false,
845
1224
  className,
@@ -849,11 +1228,15 @@ function Code({
849
1228
  fontSize = 13,
850
1229
  packages,
851
1230
  sticky = true,
852
- ide = false
1231
+ ide = false,
1232
+ jsonSchema,
1233
+ intellisenseContext,
1234
+ validate,
1235
+ onMarkerCounts
853
1236
  }) {
854
1237
  const [isMounted, setIsMounted] = useState3(false);
855
1238
  const [monacoTheme, setMonacoTheme] = useState3("vs-light");
856
- const decorationsCleanupRef = useRef3(null);
1239
+ const decorationsCleanupRef = useRef3([]);
857
1240
  const monacoRef = useRef3(null);
858
1241
  const editorRef = useRef3(null);
859
1242
  const containerRef = useRef3(null);
@@ -928,12 +1311,12 @@ function Code({
928
1311
  };
929
1312
  }, [isMounted, getDataTheme]);
930
1313
  useEffect2(() => {
931
- const editor = editorRef.current;
1314
+ const editor2 = editorRef.current;
932
1315
  const container = containerRef.current;
933
- if (!editor || !container) return;
1316
+ if (!editor2 || !container) return;
934
1317
  const resizeObserver = new ResizeObserver(() => {
935
1318
  requestAnimationFrame(() => {
936
- editor.layout();
1319
+ editor2.layout();
937
1320
  });
938
1321
  });
939
1322
  resizeObserver.observe(container);
@@ -941,6 +1324,35 @@ function Code({
941
1324
  resizeObserver.disconnect();
942
1325
  };
943
1326
  }, []);
1327
+ const modelPathRef = useRef3(null);
1328
+ const intellisenseContextRef = useRef3(intellisenseContext);
1329
+ intellisenseContextRef.current = intellisenseContext;
1330
+ const validateRef = useRef3(validate);
1331
+ validateRef.current = validate;
1332
+ const onMarkerCountsRef = useRef3(onMarkerCounts);
1333
+ onMarkerCountsRef.current = onMarkerCounts;
1334
+ if ((jsonSchema || intellisenseContext) && !modelPathRef.current) {
1335
+ modelPathRef.current = generateModelPath();
1336
+ }
1337
+ useEffect2(() => {
1338
+ if (!jsonSchema || !modelPathRef.current) return;
1339
+ registerJsonSchema(modelPathRef.current, jsonSchema);
1340
+ return () => {
1341
+ if (modelPathRef.current) {
1342
+ unregisterJsonSchema(modelPathRef.current);
1343
+ }
1344
+ };
1345
+ }, [jsonSchema]);
1346
+ useEffect2(() => {
1347
+ if (intellisenseContext && modelPathRef.current) {
1348
+ setIntelliSenseContext(modelPathRef.current, intellisenseContext);
1349
+ return () => {
1350
+ if (modelPathRef.current) {
1351
+ removeIntelliSenseContext(modelPathRef.current);
1352
+ }
1353
+ };
1354
+ }
1355
+ }, [intellisenseContext]);
944
1356
  const handleChange = (value) => {
945
1357
  if (onChange && value !== void 0) {
946
1358
  onChange(value);
@@ -948,15 +1360,11 @@ function Code({
948
1360
  };
949
1361
  const handleBeforeMount = async (monaco) => {
950
1362
  monacoRef.current = monaco;
951
- if (beforeMount) {
952
- beforeMount(monaco);
953
- return;
954
- }
955
1363
  registerAllThemes(monaco);
956
1364
  registerFormatters(monaco);
957
1365
  if (packages && packages.length > 0) {
958
1366
  registerWalkerOSTypes(monaco);
959
- const { loadPackageTypes: loadPackageTypes2 } = await import("./monaco-types-OLSF6MIE.mjs");
1367
+ const { loadPackageTypes: loadPackageTypes2 } = await import("./monaco-types-KN2DINPW.mjs");
960
1368
  for (const pkg of packages) {
961
1369
  if (pkg !== "@walkeros/core") {
962
1370
  await loadPackageTypes2(monaco, { package: pkg }).catch(() => {
@@ -968,6 +1376,12 @@ function Code({
968
1376
  const isDark = dataTheme === "dark" || dataTheme === null && window.matchMedia("(prefers-color-scheme: dark)").matches;
969
1377
  const themeName = isDark ? "elbTheme-dark" : "elbTheme-light";
970
1378
  monaco.editor.setTheme(themeName);
1379
+ if (language === "json") {
1380
+ registerWalkerOSProviders(monaco);
1381
+ }
1382
+ if (beforeMount) {
1383
+ beforeMount(monaco);
1384
+ }
971
1385
  };
972
1386
  const MonacoEditor = Editor;
973
1387
  const handleEditorMount = (monacoEditor) => {
@@ -976,11 +1390,54 @@ function Code({
976
1390
  registerEditor(monacoEditor);
977
1391
  }
978
1392
  if (language === "html" && monacoRef.current) {
979
- decorationsCleanupRef.current = applyDataElbDecorations(
980
- monacoEditor,
981
- monacoRef.current
1393
+ decorationsCleanupRef.current.push(
1394
+ applyDataElbDecorations(monacoEditor, monacoRef.current)
1395
+ );
1396
+ }
1397
+ if (language === "json") {
1398
+ registerWalkerOSDecorationStyles();
1399
+ decorationsCleanupRef.current.push(
1400
+ applyWalkerOSDecorations(monacoEditor)
982
1401
  );
983
1402
  }
1403
+ if (validateRef.current && monacoRef.current) {
1404
+ const monacoInstance = monacoRef.current;
1405
+ let validateTimer;
1406
+ const runValidation = () => {
1407
+ const model = monacoEditor.getModel();
1408
+ if (!model) return;
1409
+ const text = model.getValue();
1410
+ const fn = validateRef.current;
1411
+ if (!fn) return;
1412
+ const result = fn(text);
1413
+ const allIssues = [...result.errors, ...result.warnings];
1414
+ monacoInstance.editor.setModelMarkers(
1415
+ model,
1416
+ "validate",
1417
+ allIssues.map((issue) => ({
1418
+ severity: issue.severity === "error" ? 8 : 4,
1419
+ message: issue.message,
1420
+ startLineNumber: issue.line,
1421
+ startColumn: issue.column,
1422
+ endLineNumber: issue.endLine ?? issue.line,
1423
+ endColumn: issue.endColumn ?? issue.column + 1
1424
+ }))
1425
+ );
1426
+ onMarkerCountsRef.current?.({
1427
+ errors: result.errors.length,
1428
+ warnings: result.warnings.length
1429
+ });
1430
+ };
1431
+ runValidation();
1432
+ const validateDisposable = monacoEditor.onDidChangeModelContent(() => {
1433
+ clearTimeout(validateTimer);
1434
+ validateTimer = setTimeout(runValidation, 300);
1435
+ });
1436
+ decorationsCleanupRef.current.push(() => {
1437
+ clearTimeout(validateTimer);
1438
+ validateDisposable.dispose();
1439
+ });
1440
+ }
984
1441
  requestAnimationFrame(() => {
985
1442
  monacoEditor.layout();
986
1443
  });
@@ -990,9 +1447,10 @@ function Code({
990
1447
  };
991
1448
  useEffect2(() => {
992
1449
  return () => {
993
- if (decorationsCleanupRef.current) {
994
- decorationsCleanupRef.current();
1450
+ for (const cleanup of decorationsCleanupRef.current) {
1451
+ cleanup();
995
1452
  }
1453
+ decorationsCleanupRef.current = [];
996
1454
  };
997
1455
  }, []);
998
1456
  const monacoHeight = autoHeight || gridContext?.enabled ? `${calculatedHeight}px` : "100%";
@@ -1008,10 +1466,11 @@ function Code({
1008
1466
  beforeMount: handleBeforeMount,
1009
1467
  onMount: handleEditorMount,
1010
1468
  theme: monacoTheme,
1469
+ path: modelPathRef.current || void 0,
1011
1470
  options: {
1012
1471
  readOnly: disabled || !onChange,
1013
1472
  readOnlyMessage: { value: "" },
1014
- minimap: { enabled: false },
1473
+ minimap: { enabled: minimap },
1015
1474
  fontSize,
1016
1475
  lineHeight: Math.round(fontSize * 1.5),
1017
1476
  padding: 0,
@@ -1030,8 +1489,8 @@ function Code({
1030
1489
  fixedOverflowWidgets: true,
1031
1490
  overviewRulerLanes: 0,
1032
1491
  renderLineHighlight: "none",
1033
- renderValidationDecorations: ide ? "editable" : "off",
1034
- hover: { enabled: ide },
1492
+ renderValidationDecorations: ide || jsonSchema ? "editable" : "off",
1493
+ hover: { enabled: ide || !!jsonSchema || !!intellisenseContext },
1035
1494
  "semanticHighlighting.enabled": ide,
1036
1495
  showDeprecated: ide,
1037
1496
  showUnused: ide,
@@ -1065,8 +1524,7 @@ function Code({
1065
1524
  // Don't select line when clicking line numbers
1066
1525
  wordBasedSuggestions: "off",
1067
1526
  // Reduce auto-completion interference
1068
- quickSuggestions: false,
1069
- // Disable quick suggestions popup
1527
+ quickSuggestions: jsonSchema || intellisenseContext ? { strings: true, other: true, comments: false } : false,
1070
1528
  stickyScroll: { enabled: sticky }
1071
1529
  }
1072
1530
  }
@@ -1074,7 +1532,7 @@ function Code({
1074
1532
  }
1075
1533
 
1076
1534
  // src/components/molecules/code-box.tsx
1077
- import { Fragment, jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
1535
+ import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
1078
1536
  function CodeBox({
1079
1537
  // Code props (single code mode)
1080
1538
  code,
@@ -1094,8 +1552,11 @@ function CodeBox({
1094
1552
  // Visual
1095
1553
  showTrafficLights = false,
1096
1554
  // Actions
1097
- showCopy = false,
1555
+ showCopy = true,
1098
1556
  showFormat = false,
1557
+ showSettings = false,
1558
+ // Validation
1559
+ onValidationIssues,
1099
1560
  // Layout
1100
1561
  footer,
1101
1562
  height,
@@ -1103,7 +1564,29 @@ function CodeBox({
1103
1564
  className,
1104
1565
  ...codeProps
1105
1566
  }) {
1567
+ const { onMount: userOnMount, ...restCodeProps } = codeProps;
1106
1568
  const [copied, setCopied] = useState4(false);
1569
+ const [showSettingsPanel, setShowSettingsPanel] = useState4(false);
1570
+ const [settings, setSettings] = useState4({
1571
+ lineNumbers: false,
1572
+ minimap: false,
1573
+ wordWrap: false,
1574
+ sticky: true
1575
+ });
1576
+ const settingsRef = useRef4(null);
1577
+ const [markerCounts, setMarkerCounts] = useState4({ errors: 0, warnings: 0 });
1578
+ const editorInstanceRef = useRef4(null);
1579
+ const lastJumpIndexRef = useRef4({ errors: -1, warnings: -1 });
1580
+ useEffect3(() => {
1581
+ if (!showSettingsPanel) return;
1582
+ const handleClickOutside = (e) => {
1583
+ if (settingsRef.current && !settingsRef.current.contains(e.target)) {
1584
+ setShowSettingsPanel(false);
1585
+ }
1586
+ };
1587
+ document.addEventListener("mousedown", handleClickOutside);
1588
+ return () => document.removeEventListener("mousedown", handleClickOutside);
1589
+ }, [showSettingsPanel]);
1107
1590
  const [currentTabId, setCurrentTabId] = useState4(
1108
1591
  controlledActiveTab ?? defaultTab ?? tabs?.[0]?.id ?? ""
1109
1592
  );
@@ -1136,7 +1619,103 @@ function CodeBox({
1136
1619
  } catch (e) {
1137
1620
  }
1138
1621
  };
1139
- const actions = /* @__PURE__ */ jsxs3(Fragment, { children: [
1622
+ const handleEditorMount = useCallback3(
1623
+ (monacoEditor) => {
1624
+ editorInstanceRef.current = monacoEditor;
1625
+ userOnMount?.(monacoEditor);
1626
+ },
1627
+ [userOnMount]
1628
+ );
1629
+ const handleMarkerCounts = useCallback3(
1630
+ (counts) => {
1631
+ setMarkerCounts(counts);
1632
+ lastJumpIndexRef.current = { errors: -1, warnings: -1 };
1633
+ onValidationIssues?.(counts);
1634
+ },
1635
+ [onValidationIssues]
1636
+ );
1637
+ const jumpToMarker = useCallback3((severity) => {
1638
+ const ed = editorInstanceRef.current;
1639
+ if (!ed) return;
1640
+ const model = ed.getModel();
1641
+ if (!model) return;
1642
+ const severityValue = severity === "error" ? 8 : 4;
1643
+ const markers = monacoNs.editor.getModelMarkers({ resource: model.uri }).filter((m) => m.severity === severityValue).sort(
1644
+ (a, b) => a.startLineNumber - b.startLineNumber || a.startColumn - b.startColumn
1645
+ );
1646
+ if (markers.length === 0) return;
1647
+ const key = severity === "error" ? "errors" : "warnings";
1648
+ const nextIndex = (lastJumpIndexRef.current[key] + 1) % markers.length;
1649
+ lastJumpIndexRef.current[key] = nextIndex;
1650
+ const marker = markers[nextIndex];
1651
+ ed.revealLineInCenter(marker.startLineNumber);
1652
+ ed.setPosition({
1653
+ lineNumber: marker.startLineNumber,
1654
+ column: marker.startColumn
1655
+ });
1656
+ ed.focus();
1657
+ }, []);
1658
+ const settingsProps = {
1659
+ lineNumbers: settings.lineNumbers,
1660
+ minimap: settings.minimap,
1661
+ wordWrap: settings.wordWrap,
1662
+ sticky: settings.sticky
1663
+ };
1664
+ const actions = /* @__PURE__ */ jsxs3("div", { style: { display: "flex", gap: "4px", alignItems: "center" }, children: [
1665
+ markerCounts.errors > 0 && /* @__PURE__ */ jsxs3(
1666
+ "button",
1667
+ {
1668
+ className: "elb-codebox-marker-badge elb-codebox-marker-badge--error",
1669
+ onClick: () => jumpToMarker("error"),
1670
+ title: `${markerCounts.errors} error${markerCounts.errors !== 1 ? "s" : ""} \u2014 click to jump`,
1671
+ children: [
1672
+ /* @__PURE__ */ jsxs3(
1673
+ "svg",
1674
+ {
1675
+ width: "14",
1676
+ height: "14",
1677
+ viewBox: "0 0 24 24",
1678
+ fill: "none",
1679
+ stroke: "currentColor",
1680
+ strokeWidth: "2",
1681
+ children: [
1682
+ /* @__PURE__ */ jsx4("circle", { cx: "12", cy: "12", r: "10" }),
1683
+ /* @__PURE__ */ jsx4("line", { x1: "15", y1: "9", x2: "9", y2: "15" }),
1684
+ /* @__PURE__ */ jsx4("line", { x1: "9", y1: "9", x2: "15", y2: "15" })
1685
+ ]
1686
+ }
1687
+ ),
1688
+ /* @__PURE__ */ jsx4("span", { children: markerCounts.errors })
1689
+ ]
1690
+ }
1691
+ ),
1692
+ markerCounts.warnings > 0 && /* @__PURE__ */ jsxs3(
1693
+ "button",
1694
+ {
1695
+ className: "elb-codebox-marker-badge elb-codebox-marker-badge--warning",
1696
+ onClick: () => jumpToMarker("warning"),
1697
+ title: `${markerCounts.warnings} warning${markerCounts.warnings !== 1 ? "s" : ""} \u2014 click to jump`,
1698
+ children: [
1699
+ /* @__PURE__ */ jsxs3(
1700
+ "svg",
1701
+ {
1702
+ width: "14",
1703
+ height: "14",
1704
+ viewBox: "0 0 24 24",
1705
+ fill: "none",
1706
+ stroke: "currentColor",
1707
+ strokeWidth: "2",
1708
+ children: [
1709
+ /* @__PURE__ */ jsx4("path", { d: "M12 3L2 21h20L12 3z" }),
1710
+ /* @__PURE__ */ jsx4("line", { x1: "12", y1: "9", x2: "12", y2: "13" }),
1711
+ /* @__PURE__ */ jsx4("line", { x1: "12", y1: "17", x2: "12.01", y2: "17" })
1712
+ ]
1713
+ }
1714
+ ),
1715
+ /* @__PURE__ */ jsx4("span", { children: markerCounts.warnings })
1716
+ ]
1717
+ }
1718
+ ),
1140
1719
  showFormat && !disabled && currentLanguage === "json" && /* @__PURE__ */ jsx4(
1141
1720
  "button",
1142
1721
  {
@@ -1155,8 +1734,10 @@ function CodeBox({
1155
1734
  strokeLinecap: "round",
1156
1735
  strokeLinejoin: "round",
1157
1736
  children: [
1158
- /* @__PURE__ */ jsx4("polyline", { points: "16 18 22 12 16 6" }),
1159
- /* @__PURE__ */ jsx4("polyline", { points: "8 6 2 12 8 18" })
1737
+ /* @__PURE__ */ jsx4("line", { x1: "3", y1: "5", x2: "16", y2: "5" }),
1738
+ /* @__PURE__ */ jsx4("line", { x1: "7", y1: "10", x2: "20", y2: "10" }),
1739
+ /* @__PURE__ */ jsx4("line", { x1: "7", y1: "15", x2: "18", y2: "15" }),
1740
+ /* @__PURE__ */ jsx4("line", { x1: "3", y1: "20", x2: "12", y2: "20" })
1160
1741
  ]
1161
1742
  }
1162
1743
  )
@@ -1199,7 +1780,80 @@ function CodeBox({
1199
1780
  }
1200
1781
  )
1201
1782
  }
1202
- )
1783
+ ),
1784
+ showSettings && /* @__PURE__ */ jsxs3("div", { ref: settingsRef, style: { position: "relative" }, children: [
1785
+ /* @__PURE__ */ jsx4(
1786
+ "button",
1787
+ {
1788
+ className: `elb-explorer-btn${showSettingsPanel ? " active" : ""}`,
1789
+ onClick: () => setShowSettingsPanel(!showSettingsPanel),
1790
+ title: "Editor settings",
1791
+ children: /* @__PURE__ */ jsxs3(
1792
+ "svg",
1793
+ {
1794
+ width: "14",
1795
+ height: "14",
1796
+ viewBox: "0 0 24 24",
1797
+ fill: "none",
1798
+ stroke: "currentColor",
1799
+ strokeWidth: "2",
1800
+ strokeLinecap: "round",
1801
+ strokeLinejoin: "round",
1802
+ children: [
1803
+ /* @__PURE__ */ jsx4("circle", { cx: "12", cy: "12", r: "3" }),
1804
+ /* @__PURE__ */ jsx4("path", { d: "M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z" })
1805
+ ]
1806
+ }
1807
+ )
1808
+ }
1809
+ ),
1810
+ showSettingsPanel && /* @__PURE__ */ jsxs3("div", { className: "elb-codebox-settings", children: [
1811
+ /* @__PURE__ */ jsxs3("label", { className: "elb-codebox-settings-option", children: [
1812
+ /* @__PURE__ */ jsx4(
1813
+ "input",
1814
+ {
1815
+ type: "checkbox",
1816
+ checked: settings.lineNumbers,
1817
+ onChange: () => setSettings((s) => ({ ...s, lineNumbers: !s.lineNumbers }))
1818
+ }
1819
+ ),
1820
+ "Line numbers"
1821
+ ] }),
1822
+ /* @__PURE__ */ jsxs3("label", { className: "elb-codebox-settings-option", children: [
1823
+ /* @__PURE__ */ jsx4(
1824
+ "input",
1825
+ {
1826
+ type: "checkbox",
1827
+ checked: settings.minimap,
1828
+ onChange: () => setSettings((s) => ({ ...s, minimap: !s.minimap }))
1829
+ }
1830
+ ),
1831
+ "Minimap"
1832
+ ] }),
1833
+ /* @__PURE__ */ jsxs3("label", { className: "elb-codebox-settings-option", children: [
1834
+ /* @__PURE__ */ jsx4(
1835
+ "input",
1836
+ {
1837
+ type: "checkbox",
1838
+ checked: settings.wordWrap,
1839
+ onChange: () => setSettings((s) => ({ ...s, wordWrap: !s.wordWrap }))
1840
+ }
1841
+ ),
1842
+ "Word wrap"
1843
+ ] }),
1844
+ /* @__PURE__ */ jsxs3("label", { className: "elb-codebox-settings-option", children: [
1845
+ /* @__PURE__ */ jsx4(
1846
+ "input",
1847
+ {
1848
+ type: "checkbox",
1849
+ checked: settings.sticky,
1850
+ onChange: () => setSettings((s) => ({ ...s, sticky: !s.sticky }))
1851
+ }
1852
+ ),
1853
+ "Sticky scroll"
1854
+ ] })
1855
+ ] })
1856
+ ] })
1203
1857
  ] });
1204
1858
  const autoHeightClass = autoHeight ? "elb-box--auto-height" : "";
1205
1859
  const boxClassName = `${autoHeightClass} ${className || ""}`.trim();
@@ -1214,7 +1868,10 @@ function CodeBox({
1214
1868
  onChange,
1215
1869
  disabled,
1216
1870
  autoHeight,
1217
- ...codeProps
1871
+ onMount: handleEditorMount,
1872
+ onMarkerCounts: handleMarkerCounts,
1873
+ ...restCodeProps,
1874
+ ...settingsProps
1218
1875
  }
1219
1876
  )
1220
1877
  }));
@@ -1241,7 +1898,10 @@ function CodeBox({
1241
1898
  onChange,
1242
1899
  disabled,
1243
1900
  autoHeight,
1244
- ...codeProps
1901
+ onMount: handleEditorMount,
1902
+ onMarkerCounts: handleMarkerCounts,
1903
+ ...restCodeProps,
1904
+ ...settingsProps
1245
1905
  }
1246
1906
  )
1247
1907
  }
@@ -1250,9 +1910,9 @@ function CodeBox({
1250
1910
 
1251
1911
  // src/components/atoms/grid.tsx
1252
1912
  import {
1253
- useRef as useRef4,
1913
+ useRef as useRef5,
1254
1914
  useState as useState5,
1255
- useEffect as useEffect3,
1915
+ useEffect as useEffect4,
1256
1916
  useCallback as useCallback4,
1257
1917
  useMemo
1258
1918
  } from "react";
@@ -1267,11 +1927,11 @@ function Grid({
1267
1927
  showScrollButtons = true,
1268
1928
  className = ""
1269
1929
  }) {
1270
- const gridRef = useRef4(null);
1930
+ const gridRef = useRef5(null);
1271
1931
  const [canScrollLeft, setCanScrollLeft] = useState5(false);
1272
1932
  const [canScrollRight, setCanScrollRight] = useState5(false);
1273
1933
  const [boxHeights, setBoxHeights] = useState5(/* @__PURE__ */ new Map());
1274
- const boxIdCounter = useRef4(0);
1934
+ const boxIdCounter = useRef5(0);
1275
1935
  const getBoxId = useCallback4(() => boxIdCounter.current++, []);
1276
1936
  const registerBox = useCallback4((id, height) => {
1277
1937
  setBoxHeights((prev) => {
@@ -1344,7 +2004,7 @@ function Grid({
1344
2004
  const scrollAmount = gridRef.current.clientWidth * 0.8;
1345
2005
  gridRef.current.scrollBy({ left: scrollAmount, behavior: "smooth" });
1346
2006
  };
1347
- useEffect3(() => {
2007
+ useEffect4(() => {
1348
2008
  const el = gridRef.current;
1349
2009
  if (!el || !showScrollButtons) return;
1350
2010
  updateScrollState();
@@ -1407,7 +2067,7 @@ function MappingDemo({
1407
2067
  );
1408
2068
  }
1409
2069
  }, [input, config, fn]);
1410
- useEffect4(() => {
2070
+ useEffect5(() => {
1411
2071
  const timeoutId = setTimeout(updateOutput, 500);
1412
2072
  return () => clearTimeout(timeoutId);
1413
2073
  }, [updateOutput]);
@@ -1448,7 +2108,7 @@ function MappingDemo({
1448
2108
  }
1449
2109
 
1450
2110
  // src/components/demos/MappingCode.tsx
1451
- import { useState as useState7, useCallback as useCallback6, useEffect as useEffect5 } from "react";
2111
+ import { useState as useState7, useCallback as useCallback6, useEffect as useEffect6 } from "react";
1452
2112
  import { getMappingEvent, getMappingValue, createEvent } from "@walkeros/core";
1453
2113
  import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
1454
2114
  function MappingCode({
@@ -1481,7 +2141,7 @@ function MappingCode({
1481
2141
  );
1482
2142
  }
1483
2143
  }, [input, config]);
1484
- useEffect5(() => {
2144
+ useEffect6(() => {
1485
2145
  const timeoutId = setTimeout(executeCode, 500);
1486
2146
  return () => clearTimeout(timeoutId);
1487
2147
  }, [executeCode]);
@@ -1500,7 +2160,7 @@ function MappingCode({
1500
2160
  }
1501
2161
 
1502
2162
  // src/components/demos/DestinationDemo.tsx
1503
- import { useState as useState8, useCallback as useCallback7, useEffect as useEffect6 } from "react";
2163
+ import { useState as useState8, useCallback as useCallback7, useEffect as useEffect7 } from "react";
1504
2164
  import {
1505
2165
  createEvent as createEvent2,
1506
2166
  tryCatchAsync,
@@ -1629,7 +2289,7 @@ function DestinationDemo({
1629
2289
  (error) => setOutput(`Error: ${error}`)
1630
2290
  )();
1631
2291
  }, [eventInput, mappingInput, destination, settings, generic, fn]);
1632
- useEffect6(() => {
2292
+ useEffect7(() => {
1633
2293
  const timeoutId = setTimeout(executeDestination, 500);
1634
2294
  return () => clearTimeout(timeoutId);
1635
2295
  }, [executeDestination]);
@@ -1670,7 +2330,7 @@ function DestinationDemo({
1670
2330
  }
1671
2331
 
1672
2332
  // src/components/demos/DestinationInitDemo.tsx
1673
- import { useState as useState9, useCallback as useCallback8, useEffect as useEffect7 } from "react";
2333
+ import { useState as useState9, useCallback as useCallback8, useEffect as useEffect8 } from "react";
1674
2334
  import { tryCatchAsync as tryCatchAsync2 } from "@walkeros/core";
1675
2335
  import { startFlow as startFlow2 } from "@walkeros/collector";
1676
2336
  import { jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
@@ -1711,7 +2371,7 @@ function DestinationInitDemo({
1711
2371
  (error) => setOutput(`Error: ${error}`)
1712
2372
  )();
1713
2373
  }, [settingsInput, destination]);
1714
- useEffect7(() => {
2374
+ useEffect8(() => {
1715
2375
  const timeoutId = setTimeout(executeInit, 500);
1716
2376
  return () => clearTimeout(timeoutId);
1717
2377
  }, [executeInit]);
@@ -1743,15 +2403,15 @@ function DestinationInitDemo({
1743
2403
  // src/components/demos/PromotionPlayground.tsx
1744
2404
  import {
1745
2405
  useState as useState12,
1746
- useEffect as useEffect9,
1747
- useRef as useRef6,
2406
+ useEffect as useEffect10,
2407
+ useRef as useRef7,
1748
2408
  useCallback as useCallback10,
1749
2409
  useMemo as useMemo3
1750
2410
  } from "react";
1751
2411
  import { startFlow as startFlow3 } from "@walkeros/collector";
1752
2412
 
1753
2413
  // src/components/molecules/preview.tsx
1754
- import { useState as useState10, useEffect as useEffect8, useRef as useRef5, useCallback as useCallback9 } from "react";
2414
+ import { useState as useState10, useEffect as useEffect9, useRef as useRef6, useCallback as useCallback9 } from "react";
1755
2415
  import {
1756
2416
  sourceBrowser
1757
2417
  } from "@walkeros/web-source-browser";
@@ -1790,11 +2450,11 @@ function Preview({
1790
2450
  label = "Preview"
1791
2451
  }) {
1792
2452
  const [highlights, setHighlights] = useState10(/* @__PURE__ */ new Set());
1793
- const iframeRef = useRef5(null);
1794
- const updateTimeoutRef = useRef5(void 0);
1795
- const elbRef = useRef5(elb);
1796
- const sourceRef = useRef5(null);
1797
- useEffect8(() => {
2453
+ const iframeRef = useRef6(null);
2454
+ const updateTimeoutRef = useRef6(void 0);
2455
+ const elbRef = useRef6(elb);
2456
+ const sourceRef = useRef6(null);
2457
+ useEffect9(() => {
1798
2458
  elbRef.current = elb;
1799
2459
  }, [elb]);
1800
2460
  const toggleHighlight = (type) => {
@@ -1822,7 +2482,7 @@ function Preview({
1822
2482
  },
1823
2483
  []
1824
2484
  );
1825
- useEffect8(() => {
2485
+ useEffect9(() => {
1826
2486
  if (updateTimeoutRef.current) {
1827
2487
  clearTimeout(updateTimeoutRef.current);
1828
2488
  }
@@ -1907,7 +2567,9 @@ function Preview({
1907
2567
  setTimeout(async () => {
1908
2568
  if (sourceRef.current) {
1909
2569
  try {
1910
- await sourceRef.current.destroy?.();
2570
+ await sourceRef.current.instance.destroy?.(
2571
+ sourceRef.current.destroyContext
2572
+ );
1911
2573
  } catch {
1912
2574
  }
1913
2575
  }
@@ -1932,34 +2594,44 @@ function Preview({
1932
2594
  ok: true,
1933
2595
  destination: {}
1934
2596
  });
1935
- const source = await sourceBrowser({
2597
+ const config = {
2598
+ settings: {
2599
+ pageview: false,
2600
+ prefix: "data-elb",
2601
+ elb: "elb",
2602
+ elbLayer: "elbLayer",
2603
+ // Use body as scope - trigger.ts compares `scope !== document` against
2604
+ // main page's document, so iframe.contentDocument fails the Element cast
2605
+ scope: iframe.contentDocument.body
2606
+ }
2607
+ };
2608
+ const env = {
2609
+ elb: elbRef.current,
2610
+ push: noopPush,
2611
+ command: async () => ({ ok: true, destination: {} }),
2612
+ logger: noopLogger,
2613
+ window: iframe.contentWindow,
2614
+ document: iframe.contentDocument
2615
+ };
2616
+ const instance = await sourceBrowser({
1936
2617
  id: "preview",
1937
2618
  collector: {},
1938
2619
  // Not used when elb is provided directly
1939
2620
  logger: noopLogger,
1940
2621
  setIngest: async () => {
1941
2622
  },
1942
- config: {
1943
- settings: {
1944
- pageview: false,
1945
- prefix: "data-elb",
1946
- elb: "elb",
1947
- elbLayer: "elbLayer",
1948
- // Use body as scope - trigger.ts compares `scope !== document` against
1949
- // main page's document, so iframe.contentDocument fails the Element cast
1950
- scope: iframe.contentDocument.body
1951
- }
1952
- },
1953
- env: {
1954
- elb: elbRef.current,
1955
- push: noopPush,
1956
- command: async () => ({ ok: true, destination: {} }),
1957
- logger: noopLogger,
1958
- window: iframe.contentWindow,
1959
- document: iframe.contentDocument
1960
- }
2623
+ config,
2624
+ env
1961
2625
  });
1962
- sourceRef.current = source;
2626
+ sourceRef.current = {
2627
+ instance,
2628
+ destroyContext: {
2629
+ id: "preview",
2630
+ config,
2631
+ env,
2632
+ logger: noopLogger
2633
+ }
2634
+ };
1963
2635
  } catch {
1964
2636
  }
1965
2637
  }, 50);
@@ -1970,7 +2642,7 @@ function Preview({
1970
2642
  clearTimeout(updateTimeoutRef.current);
1971
2643
  }
1972
2644
  if (sourceRef.current) {
1973
- sourceRef.current.destroy?.();
2645
+ sourceRef.current.instance.destroy?.(sourceRef.current.destroyContext);
1974
2646
  }
1975
2647
  };
1976
2648
  }, [html, css, highlights, autoMarkProperties, elb]);
@@ -2428,11 +3100,11 @@ function PromotionPlayground({
2428
3100
  const [outputString, setOutputString] = useState12(
2429
3101
  "// Click elements in the preview to see function call"
2430
3102
  );
2431
- const collectorRef = useRef6(null);
2432
- const elbRef = useRef6(null);
2433
- const lastEventRef = useRef6(null);
3103
+ const collectorRef = useRef7(null);
3104
+ const elbRef = useRef7(null);
3105
+ const lastEventRef = useRef7(null);
2434
3106
  const [isReady, setIsReady] = useState12(false);
2435
- useEffect9(() => {
3107
+ useEffect10(() => {
2436
3108
  let mounted = true;
2437
3109
  const init = async () => {
2438
3110
  try {
@@ -2558,7 +3230,7 @@ function PromotionPlayground({
2558
3230
  }
2559
3231
 
2560
3232
  // src/components/organisms/live-code.tsx
2561
- import { useState as useState13, useEffect as useEffect10, useCallback as useCallback11 } from "react";
3233
+ import { useState as useState13, useEffect as useEffect11, useCallback as useCallback11 } from "react";
2562
3234
  import { debounce, isString, tryCatchAsync as tryCatchAsync3 } from "@walkeros/core";
2563
3235
 
2564
3236
  // src/utils/format-code.ts
@@ -2572,15 +3244,21 @@ async function formatCode(code, language) {
2572
3244
  let formatted;
2573
3245
  switch (language) {
2574
3246
  case "javascript":
2575
- case "js":
2576
- formatted = await prettier2.format(code, {
3247
+ case "js": {
3248
+ const isBareObject = code.trimStart().startsWith("{") && code.includes("\n");
3249
+ const input = isBareObject ? `(${code})` : code;
3250
+ formatted = await prettier2.format(input, {
2577
3251
  parser: "babel",
2578
3252
  plugins: [prettierBabel2, prettierEstree2],
2579
3253
  semi: true,
2580
3254
  singleQuote: true,
2581
3255
  trailingComma: "all"
2582
3256
  });
3257
+ if (isBareObject) {
3258
+ formatted = formatted.replace(/^\(/, "").replace(/\);?\s*$/, "");
3259
+ }
2583
3260
  break;
3261
+ }
2584
3262
  case "typescript":
2585
3263
  case "ts":
2586
3264
  case "tsx":
@@ -2648,13 +3326,13 @@ function LiveCode({
2648
3326
  const [input, setInput] = useState13(formatValue(initInput));
2649
3327
  const [config, setConfig] = useState13(formatValue(initConfig));
2650
3328
  const [output, setOutput] = useState13([formatValue(initOutput)]);
2651
- useEffect10(() => {
3329
+ useEffect11(() => {
2652
3330
  if (format3 && initInput) {
2653
3331
  const rawInput = formatValue(initInput);
2654
3332
  formatCode(rawInput, language).then(setInput);
2655
3333
  }
2656
3334
  }, [initInput, language, format3]);
2657
- useEffect10(() => {
3335
+ useEffect11(() => {
2658
3336
  if (format3 && initConfig) {
2659
3337
  const rawConfig = formatValue(initConfig);
2660
3338
  formatCode(rawConfig, language).then(setConfig);
@@ -2681,7 +3359,7 @@ function LiveCode({
2681
3359
  ),
2682
3360
  [fn, log]
2683
3361
  );
2684
- useEffect10(() => {
3362
+ useEffect11(() => {
2685
3363
  updateOutput(input, config, options || {});
2686
3364
  }, [input, config, options, updateOutput]);
2687
3365
  return /* @__PURE__ */ jsxs10(Grid, { columns: 3, className, rowHeight, children: [
@@ -2720,7 +3398,7 @@ function LiveCode({
2720
3398
  }
2721
3399
 
2722
3400
  // src/components/organisms/collector-box.tsx
2723
- import { useState as useState14, useEffect as useEffect11 } from "react";
3401
+ import { useState as useState14, useEffect as useEffect12 } from "react";
2724
3402
  import { startFlow as startFlow4 } from "@walkeros/collector";
2725
3403
  import { jsx as jsx17 } from "react/jsx-runtime";
2726
3404
  function CollectorBox({
@@ -2733,7 +3411,7 @@ function CollectorBox({
2733
3411
  const [output, setOutput] = useState14(
2734
3412
  "// Click elements in the preview to see function call"
2735
3413
  );
2736
- useEffect11(() => {
3414
+ useEffect12(() => {
2737
3415
  (async () => {
2738
3416
  try {
2739
3417
  const eventObj = JSON.parse(event);
@@ -2777,10 +3455,10 @@ function CollectorBox({
2777
3455
  import { useState as useState36, useMemo as useMemo6, useCallback as useCallback18 } from "react";
2778
3456
 
2779
3457
  // src/components/organisms/config-editor/config-editor-tabs.tsx
2780
- import { useEffect as useEffect24, useState as useState35, useMemo as useMemo5 } from "react";
3458
+ import { useEffect as useEffect25, useState as useState35, useMemo as useMemo5 } from "react";
2781
3459
 
2782
3460
  // src/hooks/useMappingState.ts
2783
- import { useState as useState15, useCallback as useCallback12, useRef as useRef7 } from "react";
3461
+ import { useState as useState15, useCallback as useCallback12, useRef as useRef8 } from "react";
2784
3462
 
2785
3463
  // src/utils/mapping-path.ts
2786
3464
  function getValueAtPath(obj, path) {
@@ -2865,7 +3543,7 @@ function getParentPath(path) {
2865
3543
  // src/hooks/useMappingState.ts
2866
3544
  function useMappingState(initialMapping, onChange) {
2867
3545
  const [config, setConfig] = useState15(initialMapping);
2868
- const isCallingOnChange = useRef7(false);
3546
+ const isCallingOnChange = useRef8(false);
2869
3547
  const updateConfig = useCallback12(
2870
3548
  (newConfig) => {
2871
3549
  setConfig(newConfig);
@@ -3235,14 +3913,14 @@ function detectNodeType(value, path, structure, schemas) {
3235
3913
  const schema = propertyDef && schemas ? resolveSchema(path.slice(propertyDefIndex), propertyDef, schemas) : void 0;
3236
3914
  if (schema) {
3237
3915
  const primitiveType = typeof value;
3238
- const isPrimitive = primitiveType === "string" || primitiveType === "number" || primitiveType === "boolean" || value === void 0 || value === null;
3916
+ const isPrimitive2 = primitiveType === "string" || primitiveType === "number" || primitiveType === "boolean" || value === void 0 || value === null;
3239
3917
  if (schema.type === "boolean" && (primitiveType === "boolean" || value === void 0 || value === null)) {
3240
3918
  return "boolean";
3241
3919
  }
3242
- if (schema.enum && Array.isArray(schema.enum) && schema.enum.length > 0 && isPrimitive) {
3920
+ if (schema.enum && Array.isArray(schema.enum) && schema.enum.length > 0 && isPrimitive2) {
3243
3921
  return "enum";
3244
3922
  }
3245
- if ((schema.type === "string" || schema.type === "number") && isPrimitive) {
3923
+ if ((schema.type === "string" || schema.type === "number") && isPrimitive2) {
3246
3924
  return "primitive";
3247
3925
  }
3248
3926
  if (schema.type === "array") {
@@ -3648,7 +4326,7 @@ function useTreeState(initialExpanded = [[]]) {
3648
4326
  }
3649
4327
 
3650
4328
  // src/components/atoms/mapping-breadcrumb.tsx
3651
- import { Fragment as Fragment2, jsx as jsx18, jsxs as jsxs11 } from "react/jsx-runtime";
4329
+ import { Fragment, jsx as jsx18, jsxs as jsxs11 } from "react/jsx-runtime";
3652
4330
  function MappingBreadcrumb({
3653
4331
  segments,
3654
4332
  onNavigate,
@@ -3667,7 +4345,7 @@ function MappingBreadcrumb({
3667
4345
  "li",
3668
4346
  {
3669
4347
  className: "elb-mapping-breadcrumb-item",
3670
- children: isClickable ? /* @__PURE__ */ jsxs11(Fragment2, { children: [
4348
+ children: isClickable ? /* @__PURE__ */ jsxs11(Fragment, { children: [
3671
4349
  /* @__PURE__ */ jsx18(
3672
4350
  "button",
3673
4351
  {
@@ -3696,7 +4374,7 @@ function MappingBreadcrumb({
3696
4374
  }
3697
4375
 
3698
4376
  // src/components/atoms/mapping-confirm-button.tsx
3699
- import { useState as useState18, useEffect as useEffect12, useRef as useRef8 } from "react";
4377
+ import { useState as useState18, useEffect as useEffect13, useRef as useRef9 } from "react";
3700
4378
  import { jsx as jsx19 } from "react/jsx-runtime";
3701
4379
  var TrashIcon = () => /* @__PURE__ */ jsx19(
3702
4380
  "svg",
@@ -3723,8 +4401,8 @@ function MappingConfirmButton({
3723
4401
  className = ""
3724
4402
  }) {
3725
4403
  const [isConfirming, setIsConfirming] = useState18(false);
3726
- const buttonRef = useRef8(null);
3727
- useEffect12(() => {
4404
+ const buttonRef = useRef9(null);
4405
+ useEffect13(() => {
3728
4406
  if (!isConfirming) return;
3729
4407
  const handleClickOutside = (e) => {
3730
4408
  if (buttonRef.current && !buttonRef.current.contains(e.target)) {
@@ -3869,7 +4547,7 @@ function MappingNavigationHeader({
3869
4547
  }
3870
4548
 
3871
4549
  // src/components/molecules/config-tree-sidebar.tsx
3872
- import { useState as useState19, useRef as useRef9, useEffect as useEffect13 } from "react";
4550
+ import { useState as useState19, useRef as useRef10, useEffect as useEffect14 } from "react";
3873
4551
 
3874
4552
  // src/components/atoms/mapping-input.tsx
3875
4553
  import { jsx as jsx21 } from "react/jsx-runtime";
@@ -3992,14 +4670,14 @@ function ConfigTreeNodeComponent({
3992
4670
  const [isAddingAction, setIsAddingAction] = useState19(false);
3993
4671
  const [newActionName, setNewActionName] = useState19("");
3994
4672
  const [actionExists, setActionExists] = useState19(false);
3995
- const inputRef = useRef9(null);
4673
+ const inputRef = useRef10(null);
3996
4674
  const isEntityNode = node.type === "entity" && node.path.length === 2 && node.path[0] === "mapping";
3997
- useEffect13(() => {
4675
+ useEffect14(() => {
3998
4676
  if (isAddingAction && inputRef.current) {
3999
4677
  inputRef.current.focus();
4000
4678
  }
4001
4679
  }, [isAddingAction]);
4002
- useEffect13(() => {
4680
+ useEffect14(() => {
4003
4681
  if (isEntityNode && newActionName) {
4004
4682
  const exists = node.children?.some((child) => child.label === newActionName) ?? false;
4005
4683
  setActionExists(exists);
@@ -4166,13 +4844,13 @@ function ConfigTreeSidebar({
4166
4844
  const [isAddingEntity, setIsAddingEntity] = useState19(false);
4167
4845
  const [newEntityName, setNewEntityName] = useState19("");
4168
4846
  const [entityExists, setEntityExists] = useState19(false);
4169
- const entityInputRef = useRef9(null);
4170
- useEffect13(() => {
4847
+ const entityInputRef = useRef10(null);
4848
+ useEffect14(() => {
4171
4849
  if (isAddingEntity && entityInputRef.current) {
4172
4850
  entityInputRef.current.focus();
4173
4851
  }
4174
4852
  }, [isAddingEntity]);
4175
- useEffect13(() => {
4853
+ useEffect14(() => {
4176
4854
  if (newEntityName) {
4177
4855
  const mappingNode = tree.find((node) => node.key === "mapping");
4178
4856
  const exists = mappingNode?.children?.some((child) => child.label === newEntityName) ?? false;
@@ -4313,7 +4991,7 @@ function ConfigTreeSidebar({
4313
4991
  }
4314
4992
 
4315
4993
  // src/components/molecules/mapping-entity-pane.tsx
4316
- import { useState as useState20, useEffect as useEffect14 } from "react";
4994
+ import { useState as useState20, useEffect as useEffect15 } from "react";
4317
4995
 
4318
4996
  // src/components/atoms/pane-header.tsx
4319
4997
  import { jsx as jsx24, jsxs as jsxs15 } from "react/jsx-runtime";
@@ -4419,7 +5097,7 @@ function MappingEntityPane({
4419
5097
  const entity = path[0];
4420
5098
  const entityConfig = mappingState.actions.getValue([entity]);
4421
5099
  const actions = entityConfig && typeof entityConfig === "object" ? Object.keys(entityConfig).sort() : [];
4422
- useEffect14(() => {
5100
+ useEffect15(() => {
4423
5101
  if (newActionName) {
4424
5102
  const exists = actions.includes(newActionName);
4425
5103
  setActionExists(exists);
@@ -5411,7 +6089,7 @@ function MappingKeyPaneView({
5411
6089
  }
5412
6090
 
5413
6091
  // src/components/molecules/mapping-function-pane-base.tsx
5414
- import { useState as useState22, useEffect as useEffect15 } from "react";
6092
+ import { useState as useState22, useEffect as useEffect16 } from "react";
5415
6093
 
5416
6094
  // src/utils/code-normalizer.ts
5417
6095
  function normalizeCode(code) {
@@ -5434,7 +6112,7 @@ function MappingFunctionPaneBase({
5434
6112
  const value = mappingState.actions.getValue(path);
5435
6113
  const initialCode = typeof value === "string" ? value : defaultCode;
5436
6114
  const [code, setCode] = useState22(initialCode);
5437
- useEffect15(() => {
6115
+ useEffect16(() => {
5438
6116
  const currentValue = mappingState.actions.getValue(path);
5439
6117
  const newCode = typeof currentValue === "string" ? currentValue : defaultCode;
5440
6118
  setCode(newCode);
@@ -5513,7 +6191,7 @@ function MappingFunctionPaneBase({
5513
6191
  }
5514
6192
 
5515
6193
  // src/components/molecules/mapping-condition-pane-view.tsx
5516
- import { Fragment as Fragment3, jsx as jsx35 } from "react/jsx-runtime";
6194
+ import { Fragment as Fragment2, jsx as jsx35 } from "react/jsx-runtime";
5517
6195
  var DEFAULT_CONDITION = `(
5518
6196
  value: WalkerOS.DeepPartialEvent | unknown,
5519
6197
  mapping: Mapping.Value,
@@ -5558,15 +6236,15 @@ var HELP_SECTIONS = [
5558
6236
  examples: [
5559
6237
  {
5560
6238
  label: "Only for high-value orders:",
5561
- code: /* @__PURE__ */ jsx35(Fragment3, { children: "(value) => value.data?.total > 100" })
6239
+ code: /* @__PURE__ */ jsx35(Fragment2, { children: "(value) => value.data?.total > 100" })
5562
6240
  },
5563
6241
  {
5564
6242
  label: "Only for specific user segment:",
5565
- code: /* @__PURE__ */ jsx35(Fragment3, { children: "(value) => value.user?.segment === 'premium'" })
6243
+ code: /* @__PURE__ */ jsx35(Fragment2, { children: "(value) => value.user?.segment === 'premium'" })
5566
6244
  },
5567
6245
  {
5568
6246
  label: "Only during business hours:",
5569
- code: /* @__PURE__ */ jsx35(Fragment3, { children: "() => new Date().getHours() >= 9 && new Date().getHours() < 17" })
6247
+ code: /* @__PURE__ */ jsx35(Fragment2, { children: "() => new Date().getHours() >= 9 && new Date().getHours() < 17" })
5570
6248
  }
5571
6249
  ]
5572
6250
  }
@@ -5586,7 +6264,7 @@ function MappingConditionPaneView(props) {
5586
6264
  }
5587
6265
 
5588
6266
  // src/components/molecules/mapping-fn-pane-view.tsx
5589
- import { Fragment as Fragment4, jsx as jsx36, jsxs as jsxs26 } from "react/jsx-runtime";
6267
+ import { Fragment as Fragment3, jsx as jsx36, jsxs as jsxs26 } from "react/jsx-runtime";
5590
6268
  var DEFAULT_FN = `(
5591
6269
  value: WalkerOS.DeepPartialEvent | unknown,
5592
6270
  mapping: Mapping.Value,
@@ -5637,11 +6315,11 @@ var HELP_SECTIONS2 = [
5637
6315
  examples: [
5638
6316
  {
5639
6317
  label: "Extract nested property:",
5640
- code: /* @__PURE__ */ jsx36(Fragment4, { children: "(value) => value.data?.product?.id" })
6318
+ code: /* @__PURE__ */ jsx36(Fragment3, { children: "(value) => value.data?.product?.id" })
5641
6319
  },
5642
6320
  {
5643
6321
  label: "Format currency:",
5644
- code: /* @__PURE__ */ jsxs26(Fragment4, { children: [
6322
+ code: /* @__PURE__ */ jsxs26(Fragment3, { children: [
5645
6323
  "(value) => {",
5646
6324
  "\n",
5647
6325
  " ",
@@ -5655,11 +6333,11 @@ var HELP_SECTIONS2 = [
5655
6333
  },
5656
6334
  {
5657
6335
  label: "Combine multiple fields:",
5658
- code: /* @__PURE__ */ jsx36(Fragment4, { children: "(value) => `${value.data?.firstName} ${value.data?.lastName}`" })
6336
+ code: /* @__PURE__ */ jsx36(Fragment3, { children: "(value) => `${value.data?.firstName} ${value.data?.lastName}`" })
5659
6337
  },
5660
6338
  {
5661
6339
  label: "Conditional transformation with consent:",
5662
- code: /* @__PURE__ */ jsxs26(Fragment4, { children: [
6340
+ code: /* @__PURE__ */ jsxs26(Fragment3, { children: [
5663
6341
  "(value, mapping, options) => {",
5664
6342
  "\n",
5665
6343
  " ",
@@ -5679,7 +6357,7 @@ var HELP_SECTIONS2 = [
5679
6357
  },
5680
6358
  {
5681
6359
  label: "Use collector for context:",
5682
- code: /* @__PURE__ */ jsxs26(Fragment4, { children: [
6360
+ code: /* @__PURE__ */ jsxs26(Fragment3, { children: [
5683
6361
  "(value, mapping, options) => {",
5684
6362
  "\n",
5685
6363
  " ",
@@ -5718,7 +6396,7 @@ function MappingFnPaneView(props) {
5718
6396
  }
5719
6397
 
5720
6398
  // src/components/molecules/mapping-validate-pane-view.tsx
5721
- import { Fragment as Fragment5, jsx as jsx37, jsxs as jsxs27 } from "react/jsx-runtime";
6399
+ import { Fragment as Fragment4, jsx as jsx37, jsxs as jsxs27 } from "react/jsx-runtime";
5722
6400
  var DEFAULT_VALIDATE = `(
5723
6401
  value: unknown
5724
6402
  ): boolean | Promise<boolean> => {
@@ -5758,19 +6436,19 @@ var HELP_SECTIONS3 = [
5758
6436
  examples: [
5759
6437
  {
5760
6438
  label: "Exclude empty values:",
5761
- code: /* @__PURE__ */ jsx37(Fragment5, { children: "(value) => value !== undefined && value !== null && value !== ''" })
6439
+ code: /* @__PURE__ */ jsx37(Fragment4, { children: "(value) => value !== undefined && value !== null && value !== ''" })
5762
6440
  },
5763
6441
  {
5764
6442
  label: "Only include valid email addresses:",
5765
- code: /* @__PURE__ */ jsx37(Fragment5, { children: "(value) => typeof value === 'string' && /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)" })
6443
+ code: /* @__PURE__ */ jsx37(Fragment4, { children: "(value) => typeof value === 'string' && /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)" })
5766
6444
  },
5767
6445
  {
5768
6446
  label: "Only include positive numbers:",
5769
- code: /* @__PURE__ */ jsx37(Fragment5, { children: "(value) => typeof value === 'number' && value > 0" })
6447
+ code: /* @__PURE__ */ jsx37(Fragment4, { children: "(value) => typeof value === 'number' && value > 0" })
5770
6448
  },
5771
6449
  {
5772
6450
  label: "Validate URL format:",
5773
- code: /* @__PURE__ */ jsxs27(Fragment5, { children: [
6451
+ code: /* @__PURE__ */ jsxs27(Fragment4, { children: [
5774
6452
  "(value) => {",
5775
6453
  "\n",
5776
6454
  " ",
@@ -5796,7 +6474,7 @@ var HELP_SECTIONS3 = [
5796
6474
  },
5797
6475
  {
5798
6476
  label: "Exclude specific values:",
5799
- code: /* @__PURE__ */ jsx37(Fragment5, { children: "(value) => !['test', 'localhost', 'example.com'].includes(value)" })
6477
+ code: /* @__PURE__ */ jsx37(Fragment4, { children: "(value) => !['test', 'localhost', 'example.com'].includes(value)" })
5800
6478
  }
5801
6479
  ]
5802
6480
  }
@@ -5909,7 +6587,7 @@ function validateValue(value, schema) {
5909
6587
  }
5910
6588
 
5911
6589
  // src/components/molecules/mapping-name-pane-view.tsx
5912
- import { Fragment as Fragment6, jsx as jsx38, jsxs as jsxs28 } from "react/jsx-runtime";
6590
+ import { Fragment as Fragment5, jsx as jsx38, jsxs as jsxs28 } from "react/jsx-runtime";
5913
6591
  function MappingNamePaneView({
5914
6592
  path,
5915
6593
  mappingState,
@@ -5953,7 +6631,7 @@ function MappingNamePaneView({
5953
6631
  ),
5954
6632
  /* @__PURE__ */ jsxs28("div", { className: "elb-mapping-pane-hint", children: [
5955
6633
  uiSchema?.["ui:help"] || "This string will be sent to the destination instead of the default entity-action name. Leave empty to use default.",
5956
- hasError && validationResult.error && /* @__PURE__ */ jsxs28(Fragment6, { children: [
6634
+ hasError && validationResult.error && /* @__PURE__ */ jsxs28(Fragment5, { children: [
5957
6635
  /* @__PURE__ */ jsx38("br", {}),
5958
6636
  /* @__PURE__ */ jsxs28("span", { style: { color: "var(--color-button-danger)" }, children: [
5959
6637
  "\u26A0 ",
@@ -5989,7 +6667,7 @@ function MappingNamePaneView({
5989
6667
  }
5990
6668
 
5991
6669
  // src/components/molecules/mapping-batch-pane-view.tsx
5992
- import { Fragment as Fragment7, jsx as jsx39, jsxs as jsxs29 } from "react/jsx-runtime";
6670
+ import { Fragment as Fragment6, jsx as jsx39, jsxs as jsxs29 } from "react/jsx-runtime";
5993
6671
  function MappingBatchPaneView({
5994
6672
  path,
5995
6673
  mappingState,
@@ -6038,7 +6716,7 @@ function MappingBatchPaneView({
6038
6716
  ),
6039
6717
  /* @__PURE__ */ jsxs29("div", { className: "elb-mapping-pane-hint", children: [
6040
6718
  uiSchema?.["ui:help"] || "Events will be collected and sent in batches. Use time (ms) for timed batches or count for event-based batches. Leave empty to disable batching.",
6041
- hasError && validationResult.error && /* @__PURE__ */ jsxs29(Fragment7, { children: [
6719
+ hasError && validationResult.error && /* @__PURE__ */ jsxs29(Fragment6, { children: [
6042
6720
  /* @__PURE__ */ jsx39("br", {}),
6043
6721
  /* @__PURE__ */ jsxs29("span", { style: { color: "var(--color-button-danger)" }, children: [
6044
6722
  "\u26A0 ",
@@ -6664,7 +7342,7 @@ function MappingBooleanWidget(props) {
6664
7342
  }
6665
7343
 
6666
7344
  // src/components/atoms/mapping-consent.tsx
6667
- import { useState as useState26, useEffect as useEffect16 } from "react";
7345
+ import { useState as useState26, useEffect as useEffect17 } from "react";
6668
7346
 
6669
7347
  // src/components/atoms/mapping-collapsible.tsx
6670
7348
  import { useState as useState25 } from "react";
@@ -6986,7 +7664,7 @@ function MappingConsentWidget(props) {
6986
7664
  const title = schema?.title || "Consent";
6987
7665
  const description = schema?.description;
6988
7666
  const [isExpanded, setIsExpanded] = useState26(hasConsent);
6989
- useEffect16(() => {
7667
+ useEffect17(() => {
6990
7668
  setIsExpanded(hasConsent);
6991
7669
  }, [hasConsent]);
6992
7670
  const handleAddConsent = () => {
@@ -7068,10 +7746,10 @@ function MappingConsentWidget(props) {
7068
7746
  }
7069
7747
 
7070
7748
  // src/components/atoms/mapping-value.tsx
7071
- import React15, { useState as useState27, useEffect as useEffect17 } from "react";
7749
+ import React15, { useState as useState27, useEffect as useEffect18 } from "react";
7072
7750
 
7073
7751
  // src/components/atoms/field-header.tsx
7074
- import { Fragment as Fragment8, jsx as jsx51, jsxs as jsxs41 } from "react/jsx-runtime";
7752
+ import { Fragment as Fragment7, jsx as jsx51, jsxs as jsxs41 } from "react/jsx-runtime";
7075
7753
  function FieldHeader({
7076
7754
  title,
7077
7755
  description,
@@ -7090,7 +7768,7 @@ function FieldHeader({
7090
7768
  action
7091
7769
  ] });
7092
7770
  }
7093
- return /* @__PURE__ */ jsxs41(Fragment8, { children: [
7771
+ return /* @__PURE__ */ jsxs41(Fragment7, { children: [
7094
7772
  /* @__PURE__ */ jsxs41("label", { className: "elb-rjsf-label", children: [
7095
7773
  title,
7096
7774
  required && /* @__PURE__ */ jsx51("span", { className: "elb-rjsf-required", children: " *" })
@@ -7148,7 +7826,7 @@ function MappingValueWidget(props) {
7148
7826
  const [selectedType, setSelectedType] = useState27(getCurrentType);
7149
7827
  const userSelectedTypeRef = React15.useRef(false);
7150
7828
  const prevValueRef = React15.useRef(value);
7151
- useEffect17(() => {
7829
+ useEffect18(() => {
7152
7830
  const prevType = typeof prevValueRef.current;
7153
7831
  const currentType = typeof value;
7154
7832
  const isMajorTypeChange = prevType !== currentType || value === void 0 && prevValueRef.current !== void 0 || value !== void 0 && prevValueRef.current === void 0;
@@ -7995,7 +8673,7 @@ function MappingValidateField(props) {
7995
8673
  }
7996
8674
 
7997
8675
  // src/components/atoms/mapping-data.tsx
7998
- import { useState as useState29, useEffect as useEffect18, useRef as useRef10, useCallback as useCallback15 } from "react";
8676
+ import { useState as useState29, useEffect as useEffect19, useRef as useRef11, useCallback as useCallback15 } from "react";
7999
8677
 
8000
8678
  // src/schemas/value-config-schema.ts
8001
8679
  var valueConfigSchema = {
@@ -8237,8 +8915,8 @@ function MappingDataWidget(props) {
8237
8915
  const description = schema?.description;
8238
8916
  const [showForm, setShowForm] = useState29(hasData);
8239
8917
  const [isExpanded, setIsExpanded] = useState29(hasData);
8240
- const prevValueRef = useRef10(value);
8241
- useEffect18(() => {
8918
+ const prevValueRef = useRef11(value);
8919
+ useEffect19(() => {
8242
8920
  const newHasData = value && typeof value === "object" && Object.keys(value).length > 0;
8243
8921
  setShowForm(!!newHasData);
8244
8922
  setIsExpanded(!!newHasData);
@@ -8321,7 +8999,7 @@ function MappingDataField(props) {
8321
8999
  }
8322
9000
 
8323
9001
  // src/components/atoms/mapping-settings.tsx
8324
- import { useState as useState30, useEffect as useEffect19, useRef as useRef11, useCallback as useCallback16 } from "react";
9002
+ import { useState as useState30, useEffect as useEffect20, useRef as useRef12, useCallback as useCallback16 } from "react";
8325
9003
  import { jsx as jsx67, jsxs as jsxs51 } from "react/jsx-runtime";
8326
9004
  function MappingSettingsWidget(props) {
8327
9005
  const {
@@ -8343,8 +9021,8 @@ function MappingSettingsWidget(props) {
8343
9021
  const hasSchema = destinationSchema && destinationSchema.properties && Object.keys(destinationSchema.properties).length > 0;
8344
9022
  const [showForm, setShowForm] = useState30(hasSettings);
8345
9023
  const [isExpanded, setIsExpanded] = useState30(hasSettings);
8346
- const prevValueRef = useRef11(value);
8347
- useEffect19(() => {
9024
+ const prevValueRef = useRef12(value);
9025
+ useEffect20(() => {
8348
9026
  const newHasSettings = value && typeof value === "object" && Object.keys(value).length > 0;
8349
9027
  setShowForm(!!newHasSettings);
8350
9028
  setIsExpanded(!!newHasSettings);
@@ -8502,7 +9180,7 @@ function MappingObjectExplorerField(props) {
8502
9180
  }
8503
9181
 
8504
9182
  // src/components/molecules/mapping-map-field.tsx
8505
- import { useState as useState31, useEffect as useEffect20, useRef as useRef12 } from "react";
9183
+ import { useState as useState31, useEffect as useEffect21, useRef as useRef13 } from "react";
8506
9184
 
8507
9185
  // src/components/atoms/mapping-map-entry.tsx
8508
9186
  import { jsx as jsx70, jsxs as jsxs52 } from "react/jsx-runtime";
@@ -8632,15 +9310,15 @@ function MappingMapField(props) {
8632
9310
  );
8633
9311
  const hasEntries = entries.length > 0;
8634
9312
  const [isExpanded, setIsExpanded] = useState31(hasEntries);
8635
- const prevFormDataRef = useRef12(formData);
8636
- useEffect20(() => {
9313
+ const prevFormDataRef = useRef13(formData);
9314
+ useEffect21(() => {
8637
9315
  if (prevFormDataRef.current === formData) {
8638
9316
  return;
8639
9317
  }
8640
9318
  prevFormDataRef.current = formData;
8641
9319
  setEntries(objectToEntries(formData));
8642
9320
  }, [formData]);
8643
- useEffect20(() => {
9321
+ useEffect21(() => {
8644
9322
  setIsExpanded(hasEntries);
8645
9323
  }, [hasEntries]);
8646
9324
  const duplicateKeys = /* @__PURE__ */ new Set();
@@ -8727,7 +9405,7 @@ function MappingMapField(props) {
8727
9405
  }
8728
9406
 
8729
9407
  // src/components/molecules/mapping-set-field.tsx
8730
- import { useState as useState32, useEffect as useEffect21, useRef as useRef13 } from "react";
9408
+ import { useState as useState32, useEffect as useEffect22, useRef as useRef14 } from "react";
8731
9409
 
8732
9410
  // src/components/atoms/mapping-set-entry.tsx
8733
9411
  import { jsx as jsx72, jsxs as jsxs54 } from "react/jsx-runtime";
@@ -8861,8 +9539,8 @@ function MappingSetField(props) {
8861
9539
  );
8862
9540
  const hasEntries = entries.length > 0;
8863
9541
  const [isExpanded, setIsExpanded] = useState32(hasEntries);
8864
- const prevFormDataRef = useRef13(formData);
8865
- useEffect21(() => {
9542
+ const prevFormDataRef = useRef14(formData);
9543
+ useEffect22(() => {
8866
9544
  if (prevFormDataRef.current === formData) {
8867
9545
  return;
8868
9546
  }
@@ -8885,7 +9563,7 @@ function MappingSetField(props) {
8885
9563
  });
8886
9564
  setEntries(newEntries);
8887
9565
  }, [formData]);
8888
- useEffect21(() => {
9566
+ useEffect22(() => {
8889
9567
  setIsExpanded(hasEntries);
8890
9568
  }, [hasEntries]);
8891
9569
  const handleEntriesChange = (newEntries) => {
@@ -9008,7 +9686,7 @@ function MappingSetField(props) {
9008
9686
  }
9009
9687
 
9010
9688
  // src/components/molecules/mapping-loop-field.tsx
9011
- import { useState as useState33, useEffect as useEffect22, useRef as useRef14 } from "react";
9689
+ import { useState as useState33, useEffect as useEffect23, useRef as useRef15 } from "react";
9012
9690
  import { jsx as jsx74, jsxs as jsxs56 } from "react/jsx-runtime";
9013
9691
  function MappingLoopField(props) {
9014
9692
  const { formData, onChange, schema, disabled, readonly } = props;
@@ -9033,8 +9711,8 @@ function MappingLoopField(props) {
9033
9711
  );
9034
9712
  const [transform, setTransform] = useState33(() => parseFormData(formData)[1]);
9035
9713
  const [isExpanded, setIsExpanded] = useState33(false);
9036
- const prevFormDataRef = useRef14(formData);
9037
- useEffect22(() => {
9714
+ const prevFormDataRef = useRef15(formData);
9715
+ useEffect23(() => {
9038
9716
  if (prevFormDataRef.current === formData) {
9039
9717
  return;
9040
9718
  }
@@ -9408,7 +10086,7 @@ function MappingMapPaneViewRJSF({
9408
10086
  }
9409
10087
 
9410
10088
  // src/components/atoms/mapping-enum-select.tsx
9411
- import { useState as useState34, useRef as useRef15, useEffect as useEffect23 } from "react";
10089
+ import { useState as useState34, useRef as useRef16, useEffect as useEffect24 } from "react";
9412
10090
  import { jsx as jsx78, jsxs as jsxs58 } from "react/jsx-runtime";
9413
10091
  function MappingEnumSelect({
9414
10092
  value,
@@ -9422,19 +10100,19 @@ function MappingEnumSelect({
9422
10100
  const [highlightedIndex, setHighlightedIndex] = useState34(0);
9423
10101
  const [inputValue, setInputValue] = useState34(String(value || ""));
9424
10102
  const [hasTyped, setHasTyped] = useState34(false);
9425
- const containerRef = useRef15(null);
9426
- const inputRef = useRef15(null);
9427
- const dropdownRef = useRef15(null);
9428
- useEffect23(() => {
10103
+ const containerRef = useRef16(null);
10104
+ const inputRef = useRef16(null);
10105
+ const dropdownRef = useRef16(null);
10106
+ useEffect24(() => {
9429
10107
  setInputValue(String(value || ""));
9430
10108
  setHasTyped(false);
9431
10109
  }, [value]);
9432
- useEffect23(() => {
10110
+ useEffect24(() => {
9433
10111
  if (isOpen) {
9434
10112
  setHighlightedIndex(0);
9435
10113
  }
9436
10114
  }, [isOpen]);
9437
- useEffect23(() => {
10115
+ useEffect24(() => {
9438
10116
  const handleClickOutside = (event) => {
9439
10117
  if (containerRef.current && !containerRef.current.contains(event.target)) {
9440
10118
  setIsOpen(false);
@@ -9448,7 +10126,7 @@ function MappingEnumSelect({
9448
10126
  return () => document.removeEventListener("mousedown", handleClickOutside);
9449
10127
  }
9450
10128
  }, [isOpen, hasTyped, inputValue, onChange, type]);
9451
- useEffect23(() => {
10129
+ useEffect24(() => {
9452
10130
  if (isOpen && dropdownRef.current && dropdownRef.current.children[highlightedIndex]) {
9453
10131
  const highlighted = dropdownRef.current.children[highlightedIndex];
9454
10132
  if (highlighted) {
@@ -9654,7 +10332,7 @@ function MappingBooleanPaneView({
9654
10332
  }
9655
10333
 
9656
10334
  // src/components/molecules/mapping-primitive-pane-view.tsx
9657
- import { Fragment as Fragment9, jsx as jsx81, jsxs as jsxs61 } from "react/jsx-runtime";
10335
+ import { Fragment as Fragment8, jsx as jsx81, jsxs as jsxs61 } from "react/jsx-runtime";
9658
10336
  function MappingPrimitivePaneView({
9659
10337
  path,
9660
10338
  mappingState,
@@ -9708,11 +10386,11 @@ function MappingPrimitivePaneView({
9708
10386
  /* @__PURE__ */ jsxs61("div", { className: "elb-mapping-pane-hint", children: [
9709
10387
  "Current type: ",
9710
10388
  /* @__PURE__ */ jsx81("strong", { children: typeof value }),
9711
- uiSchema?.["ui:help"] && /* @__PURE__ */ jsxs61(Fragment9, { children: [
10389
+ uiSchema?.["ui:help"] && /* @__PURE__ */ jsxs61(Fragment8, { children: [
9712
10390
  /* @__PURE__ */ jsx81("br", {}),
9713
10391
  uiSchema["ui:help"]
9714
10392
  ] }),
9715
- hasError && validationResult.error && /* @__PURE__ */ jsxs61(Fragment9, { children: [
10393
+ hasError && validationResult.error && /* @__PURE__ */ jsxs61(Fragment8, { children: [
9716
10394
  /* @__PURE__ */ jsx81("br", {}),
9717
10395
  /* @__PURE__ */ jsxs61("span", { style: { color: "var(--color-button-danger)" }, children: [
9718
10396
  "\u26A0 ",
@@ -10393,7 +11071,7 @@ function buildValueChildren(value, basePath, schemas, structure) {
10393
11071
  }
10394
11072
 
10395
11073
  // src/components/organisms/config-editor/config-editor-tabs.tsx
10396
- import { Fragment as Fragment10, jsx as jsx85, jsxs as jsxs65 } from "react/jsx-runtime";
11074
+ import { Fragment as Fragment9, jsx as jsx85, jsxs as jsxs65 } from "react/jsx-runtime";
10397
11075
  function ConfigEditorTabs({
10398
11076
  config,
10399
11077
  onChange,
@@ -10452,7 +11130,7 @@ function ConfigEditorTabs({
10452
11130
  } catch (e) {
10453
11131
  }
10454
11132
  };
10455
- useEffect24(() => {
11133
+ useEffect25(() => {
10456
11134
  if (navigation.navigationHistory.length === 0) {
10457
11135
  navigation.switchToTab("");
10458
11136
  if (initialNavigationState && initialNavigationState.currentPath.length > 0) {
@@ -10463,7 +11141,7 @@ function ConfigEditorTabs({
10463
11141
  }
10464
11142
  }
10465
11143
  }, []);
10466
- useEffect24(() => {
11144
+ useEffect25(() => {
10467
11145
  if (onNavigationStateChange && activeTab) {
10468
11146
  onNavigationStateChange({
10469
11147
  currentPath: activeTab.path,
@@ -10474,7 +11152,7 @@ function ConfigEditorTabs({
10474
11152
  });
10475
11153
  }
10476
11154
  }, [activeTab, treeState.expandedPaths, onNavigationStateChange]);
10477
- useEffect24(() => {
11155
+ useEffect25(() => {
10478
11156
  if (activeTab && activeTab.path.length > 0) {
10479
11157
  for (let i = 1; i <= activeTab.path.length; i++) {
10480
11158
  const pathToExpand = activeTab.path.slice(0, i);
@@ -10492,7 +11170,7 @@ function ConfigEditorTabs({
10492
11170
  className: `elb-mapping-editor-tabs elb-mapping-editor-tabs--responsive ${className}`,
10493
11171
  "data-layout": "responsive",
10494
11172
  children: [
10495
- showTree && /* @__PURE__ */ jsxs65(Fragment10, { children: [
11173
+ showTree && /* @__PURE__ */ jsxs65(Fragment9, { children: [
10496
11174
  /* @__PURE__ */ jsx85(
10497
11175
  "div",
10498
11176
  {
@@ -10694,7 +11372,7 @@ function ConfigEditor(props) {
10694
11372
  }
10695
11373
 
10696
11374
  // node_modules/@iconify/react/dist/iconify.js
10697
- import { createElement, forwardRef, useState as useState37, useEffect as useEffect25 } from "react";
11375
+ import { createElement, forwardRef, useState as useState37, useEffect as useEffect26 } from "react";
10698
11376
  function getIconsTree(data, names) {
10699
11377
  const icons = data.icons;
10700
11378
  const aliases = data.aliases || /* @__PURE__ */ Object.create(null);
@@ -11292,9 +11970,9 @@ function updateCallbacks(storage2) {
11292
11970
  });
11293
11971
  }
11294
11972
  }
11295
- var idCounter = 0;
11973
+ var idCounter2 = 0;
11296
11974
  function storeCallback(callback, icons, pendingSources) {
11297
- const id = idCounter++;
11975
+ const id = idCounter2++;
11298
11976
  const abort = removeCallback.bind(null, pendingSources, id);
11299
11977
  if (!icons.pending.length) return abort;
11300
11978
  const item = {
@@ -12058,11 +12736,11 @@ function IconComponent(props) {
12058
12736
  }
12059
12737
  }
12060
12738
  }
12061
- useEffect25(() => {
12739
+ useEffect26(() => {
12062
12740
  setMounted(true);
12063
12741
  return cleanup;
12064
12742
  }, []);
12065
- useEffect25(() => {
12743
+ useEffect26(() => {
12066
12744
  if (mounted) {
12067
12745
  updateState();
12068
12746
  }
@@ -15168,7 +15846,7 @@ function FlowSectionBox({ section }) {
15168
15846
  }
15169
15847
 
15170
15848
  // src/components/molecules/code-snippet.tsx
15171
- import { useState as useState38, useEffect as useEffect26 } from "react";
15849
+ import { useState as useState38, useEffect as useEffect27 } from "react";
15172
15850
  import { jsx as jsx89 } from "react/jsx-runtime";
15173
15851
  function CodeSnippet(props) {
15174
15852
  const {
@@ -15184,7 +15862,7 @@ function CodeSnippet(props) {
15184
15862
  } = props;
15185
15863
  const snippetClassName = `elb-code-snippet ${className || ""}`.trim();
15186
15864
  const [formattedCode, setFormattedCode] = useState38(code);
15187
- useEffect26(() => {
15865
+ useEffect27(() => {
15188
15866
  if (format3 && code) {
15189
15867
  formatCode(code, language).then(setFormattedCode);
15190
15868
  } else {
@@ -15208,9 +15886,9 @@ function CodeSnippet(props) {
15208
15886
  }
15209
15887
 
15210
15888
  // src/components/molecules/flow-map/FlowMap.tsx
15211
- import React23, { useEffect as useEffect27, useRef as useRef16 } from "react";
15889
+ import React23, { useEffect as useEffect28, useRef as useRef17 } from "react";
15212
15890
  import rough from "roughjs";
15213
- import { Fragment as Fragment11, jsx as jsx90, jsxs as jsxs67 } from "react/jsx-runtime";
15891
+ import { Fragment as Fragment10, jsx as jsx90, jsxs as jsxs67 } from "react/jsx-runtime";
15214
15892
  function RoughRect({
15215
15893
  x,
15216
15894
  y,
@@ -15219,8 +15897,8 @@ function RoughRect({
15219
15897
  fill,
15220
15898
  stroke
15221
15899
  }) {
15222
- const ref = useRef16(null);
15223
- useEffect27(() => {
15900
+ const ref = useRef17(null);
15901
+ useEffect28(() => {
15224
15902
  if (!ref.current) return;
15225
15903
  const svg = ref.current.ownerSVGElement;
15226
15904
  if (!svg) return;
@@ -15259,8 +15937,8 @@ function RoughCircle({
15259
15937
  fill,
15260
15938
  stroke
15261
15939
  }) {
15262
- const ref = useRef16(null);
15263
- useEffect27(() => {
15940
+ const ref = useRef17(null);
15941
+ useEffect28(() => {
15264
15942
  if (!ref.current) return;
15265
15943
  const svg = ref.current.ownerSVGElement;
15266
15944
  if (!svg) return;
@@ -15317,8 +15995,8 @@ function RoughArrow({
15317
15995
  arrowSize = 8,
15318
15996
  centerY
15319
15997
  }) {
15320
- const ref = useRef16(null);
15321
- useEffect27(() => {
15998
+ const ref = useRef17(null);
15999
+ useEffect28(() => {
15322
16000
  if (!ref.current) return;
15323
16001
  const svg = ref.current.ownerSVGElement;
15324
16002
  if (!svg) return;
@@ -15654,7 +16332,7 @@ function FlowMap({
15654
16332
  return aIdx - bIdx;
15655
16333
  }
15656
16334
  );
15657
- const containerRef = useRef16(null);
16335
+ const containerRef = useRef17(null);
15658
16336
  const hasDescription = stageBefore?.description || sourceEntries.some(([, s]) => s.description) || preTransformerList.some((p) => p.config.description) || collector?.description || postTransformerList.some((p) => p.config.description) || destinationEntries.some(([, d]) => d.description) || stageAfter?.description || destinationEntries.some(([, d]) => d.after?.description);
15659
16337
  const hasLink = stageBefore?.link !== false || sourceEntries.some(([, s]) => s.link !== false) || preTransformerList.some((p) => p.config.link !== false) || collector?.link !== false || postTransformerList.some((p) => p.config.link !== false) || destinationEntries.some(([, d]) => d.link !== false) || stageAfter?.link !== false || destinationEntries.some(([, d]) => d.after?.link !== false);
15660
16338
  const stageMarkerPositions = [
@@ -15995,7 +16673,7 @@ function FlowMap({
15995
16673
  }
15996
16674
  return collectorPos;
15997
16675
  };
15998
- return /* @__PURE__ */ jsxs67(Fragment11, { children: [
16676
+ return /* @__PURE__ */ jsxs67(Fragment10, { children: [
15999
16677
  !stageBefore && sourceEntries.length === 1 && /* @__PURE__ */ jsx90(
16000
16678
  RoughArrow,
16001
16679
  {
@@ -16174,7 +16852,7 @@ function FlowMap({
16174
16852
  const fromY = collectorCenterY;
16175
16853
  const toY = firstPostPos.y + boxHeight / 2;
16176
16854
  const offset = withReturn ? ARROW_OFFSET : 0;
16177
- return /* @__PURE__ */ jsxs67(Fragment11, { children: [
16855
+ return /* @__PURE__ */ jsxs67(Fragment10, { children: [
16178
16856
  /* @__PURE__ */ jsx90(
16179
16857
  RoughArrow,
16180
16858
  {
@@ -16241,7 +16919,7 @@ function FlowMap({
16241
16919
  const stageHighlight = config?.highlight !== false;
16242
16920
  const labelY = text ? pos.y + pos.height * 0.28 : pos.y + pos.height / 2;
16243
16921
  const linkUrl = link === false ? null : typeof link === "string" ? link : defaultLink;
16244
- const stageContent = /* @__PURE__ */ jsxs67(Fragment11, { children: [
16922
+ const stageContent = /* @__PURE__ */ jsxs67(Fragment10, { children: [
16245
16923
  /* @__PURE__ */ jsx90(
16246
16924
  RoughRect,
16247
16925
  {
@@ -16795,7 +17473,7 @@ function Spinner({ size = "md", className = "" }) {
16795
17473
  }
16796
17474
 
16797
17475
  // src/components/atoms/submit-button.tsx
16798
- import { Fragment as Fragment12, jsx as jsx97, jsxs as jsxs72 } from "react/jsx-runtime";
17476
+ import { Fragment as Fragment11, jsx as jsx97, jsxs as jsxs72 } from "react/jsx-runtime";
16799
17477
  function SubmitButton({
16800
17478
  children,
16801
17479
  loadingText,
@@ -16815,7 +17493,7 @@ function SubmitButton({
16815
17493
  disabled: isDisabled,
16816
17494
  onClick,
16817
17495
  className: `elb-submit-button elb-submit-button--${variant} ${fullWidth ? "elb-submit-button--full-width" : ""} ${loading ? "elb-submit-button--loading" : ""} ${className}`.trim(),
16818
- children: loading ? /* @__PURE__ */ jsxs72(Fragment12, { children: [
17496
+ children: loading ? /* @__PURE__ */ jsxs72(Fragment11, { children: [
16819
17497
  /* @__PURE__ */ jsx97(Spinner, { size: "sm", className: "elb-submit-button__spinner" }),
16820
17498
  /* @__PURE__ */ jsx97("span", { children: loadingText ?? children })
16821
17499
  ] }) : children
@@ -16880,8 +17558,8 @@ function ConfigFormCard({
16880
17558
  }
16881
17559
 
16882
17560
  // src/components/molecules/split-button.tsx
16883
- import { useState as useState40, useRef as useRef17, useEffect as useEffect28, useCallback as useCallback19 } from "react";
16884
- import { Fragment as Fragment13, jsx as jsx100, jsxs as jsxs75 } from "react/jsx-runtime";
17561
+ import { useState as useState40, useRef as useRef18, useEffect as useEffect29, useCallback as useCallback19 } from "react";
17562
+ import { Fragment as Fragment12, jsx as jsx100, jsxs as jsxs75 } from "react/jsx-runtime";
16885
17563
  function SplitButton({
16886
17564
  children,
16887
17565
  onClick,
@@ -16893,7 +17571,7 @@ function SplitButton({
16893
17571
  className = ""
16894
17572
  }) {
16895
17573
  const [open, setOpen] = useState40(false);
16896
- const ref = useRef17(null);
17574
+ const ref = useRef18(null);
16897
17575
  const isDisabled = disabled || loading;
16898
17576
  const handleClickOutside = useCallback19((e) => {
16899
17577
  if (ref.current && !ref.current.contains(e.target)) {
@@ -16903,7 +17581,7 @@ function SplitButton({
16903
17581
  const handleKeyDown = useCallback19((e) => {
16904
17582
  if (e.key === "Escape") setOpen(false);
16905
17583
  }, []);
16906
- useEffect28(() => {
17584
+ useEffect29(() => {
16907
17585
  if (open) {
16908
17586
  document.addEventListener("mousedown", handleClickOutside);
16909
17587
  document.addEventListener("keydown", handleKeyDown);
@@ -16929,7 +17607,7 @@ function SplitButton({
16929
17607
  children: loading ? loadingText ?? children : children
16930
17608
  }
16931
17609
  ),
16932
- actions.length > 0 && /* @__PURE__ */ jsxs75(Fragment13, { children: [
17610
+ actions.length > 0 && /* @__PURE__ */ jsxs75(Fragment12, { children: [
16933
17611
  /* @__PURE__ */ jsx100(
16934
17612
  "button",
16935
17613
  {
@@ -16985,9 +17663,9 @@ import { jsx as jsx101, jsxs as jsxs76 } from "react/jsx-runtime";
16985
17663
  var STATUS_DOT = {
16986
17664
  active: "elb-flow-selector__dot--active",
16987
17665
  published: "elb-flow-selector__dot--active",
16988
- bundling: "elb-flow-selector__dot--deploying",
16989
17666
  deploying: "elb-flow-selector__dot--deploying",
16990
- failed: "elb-flow-selector__dot--failed"
17667
+ failed: "elb-flow-selector__dot--failed",
17668
+ stopped: "elb-flow-selector__dot--failed"
16991
17669
  };
16992
17670
  function FlowSelector({
16993
17671
  flows,
@@ -17018,117 +17696,6 @@ function FlowSelector({
17018
17696
  }) });
17019
17697
  }
17020
17698
 
17021
- // src/components/molecules/flow-deploy-panel.tsx
17022
- import { Fragment as Fragment14, jsx as jsx102, jsxs as jsxs77 } from "react/jsx-runtime";
17023
- function statusLabel(status) {
17024
- switch (status) {
17025
- case "active":
17026
- return "Active";
17027
- case "published":
17028
- return "Published";
17029
- case "bundling":
17030
- case "deploying":
17031
- return "Deploying...";
17032
- case "failed":
17033
- return "Failed";
17034
- default:
17035
- return status;
17036
- }
17037
- }
17038
- function statusDotClass(status) {
17039
- switch (status) {
17040
- case "active":
17041
- case "published":
17042
- return "elb-flow-deploy-panel__dot--active";
17043
- case "bundling":
17044
- case "deploying":
17045
- return "elb-flow-deploy-panel__dot--deploying";
17046
- case "failed":
17047
- return "elb-flow-deploy-panel__dot--failed";
17048
- default:
17049
- return "";
17050
- }
17051
- }
17052
- function primaryLabel(deployment, flowName, multipleFlows) {
17053
- const name = multipleFlows ? ` "${flowName}"` : "";
17054
- if (!deployment) return `Deploy${name}`;
17055
- switch (deployment.status) {
17056
- case "failed":
17057
- return `Retry${name}`;
17058
- case "active":
17059
- case "published":
17060
- return `Redeploy${name}`;
17061
- default:
17062
- return `Deploy${name}`;
17063
- }
17064
- }
17065
- function FlowDeployPanel({
17066
- flowName,
17067
- platform,
17068
- deployment,
17069
- deploying = false,
17070
- error,
17071
- hasUnsavedChanges = false,
17072
- multipleFlows = false,
17073
- onDeploy,
17074
- onDeleteDeployment,
17075
- onDownloadFlow,
17076
- onBundle,
17077
- className = ""
17078
- }) {
17079
- const isDeploying = deploying || deployment?.status === "bundling" || deployment?.status === "deploying";
17080
- const bundleExt = platform === "server" ? ".mjs" : ".js";
17081
- const actions = [
17082
- {
17083
- key: "download",
17084
- label: "Download Flow (.json)",
17085
- onClick: onDownloadFlow
17086
- },
17087
- { key: "bundle", label: `Bundle (${bundleExt})`, onClick: onBundle }
17088
- ];
17089
- return /* @__PURE__ */ jsxs77("div", { className: `elb-flow-deploy-panel ${className}`, children: [
17090
- /* @__PURE__ */ jsx102("div", { className: "elb-flow-deploy-panel__status", children: deployment ? /* @__PURE__ */ jsxs77(Fragment14, { children: [
17091
- /* @__PURE__ */ jsx102(
17092
- "span",
17093
- {
17094
- className: `elb-flow-deploy-panel__dot ${statusDotClass(deployment.status)}`
17095
- }
17096
- ),
17097
- /* @__PURE__ */ jsx102("span", { className: "elb-flow-deploy-panel__status-text", children: statusLabel(deployment.status) }),
17098
- deployment.createdAt && /* @__PURE__ */ jsx102("span", { className: "elb-flow-deploy-panel__time", children: new Date(deployment.createdAt).toLocaleString() })
17099
- ] }) : /* @__PURE__ */ jsxs77(Fragment14, { children: [
17100
- /* @__PURE__ */ jsx102("span", { className: "elb-flow-deploy-panel__dot" }),
17101
- /* @__PURE__ */ jsx102("span", { className: "elb-flow-deploy-panel__status-text", children: "Not deployed" })
17102
- ] }) }),
17103
- hasUnsavedChanges && deployment && (deployment.status === "active" || deployment.status === "published") && /* @__PURE__ */ jsx102("div", { className: "elb-flow-deploy-panel__warning", children: "Config changed since last deploy" }),
17104
- deployment?.publicUrl && /* @__PURE__ */ jsx102("div", { className: "elb-flow-deploy-panel__endpoint", children: /* @__PURE__ */ jsx102("code", { className: "elb-flow-deploy-panel__url", children: deployment.publicUrl }) }),
17105
- deployment?.containerUrl && /* @__PURE__ */ jsx102("div", { className: "elb-flow-deploy-panel__endpoint", children: /* @__PURE__ */ jsx102("code", { className: "elb-flow-deploy-panel__url", children: deployment.containerUrl }) }),
17106
- (error || deployment?.errorMessage) && /* @__PURE__ */ jsx102("div", { className: "elb-flow-deploy-panel__error", children: error || deployment?.errorMessage }),
17107
- /* @__PURE__ */ jsxs77("div", { className: "elb-flow-deploy-panel__actions", children: [
17108
- /* @__PURE__ */ jsx102(
17109
- SplitButton,
17110
- {
17111
- onClick: onDeploy,
17112
- actions,
17113
- loading: isDeploying,
17114
- loadingText: "Deploying...",
17115
- disabled: isDeploying,
17116
- children: primaryLabel(deployment, flowName, multipleFlows)
17117
- }
17118
- ),
17119
- deployment && deployment.status !== "bundling" && deployment.status !== "deploying" && /* @__PURE__ */ jsx102(
17120
- "button",
17121
- {
17122
- type: "button",
17123
- className: "elb-flow-deploy-panel__delete",
17124
- onClick: onDeleteDeployment,
17125
- children: "Delete deployment"
17126
- }
17127
- )
17128
- ] })
17129
- ] });
17130
- }
17131
-
17132
17699
  // src/schemas/config-structures/destination-config.ts
17133
17700
  var DESTINATION_CONFIG_STRUCTURE = {
17134
17701
  type: "object",
@@ -17215,13 +17782,13 @@ var DESTINATION_CONFIG_STRUCTURE = {
17215
17782
  };
17216
17783
 
17217
17784
  // src/components/atoms/footer.tsx
17218
- import { jsx as jsx103 } from "react/jsx-runtime";
17785
+ import { jsx as jsx102 } from "react/jsx-runtime";
17219
17786
  function Footer({ children, className = "" }) {
17220
- return /* @__PURE__ */ jsx103("div", { className: `elb-explorer-footer ${className}`, children });
17787
+ return /* @__PURE__ */ jsx102("div", { className: `elb-explorer-footer ${className}`, children });
17221
17788
  }
17222
17789
 
17223
17790
  // src/components/atoms/button-link.tsx
17224
- import { jsx as jsx104 } from "react/jsx-runtime";
17791
+ import { jsx as jsx103 } from "react/jsx-runtime";
17225
17792
  function ButtonLink({
17226
17793
  variant = "default",
17227
17794
  size = "md",
@@ -17234,9 +17801,9 @@ function ButtonLink({
17234
17801
  const baseClass = "elb-button-link";
17235
17802
  const classes = `${baseClass} ${baseClass}-${variant} ${baseClass}-${size} ${className}`.trim();
17236
17803
  if (href && !disabled) {
17237
- return /* @__PURE__ */ jsx104("a", { href, className: classes, children });
17804
+ return /* @__PURE__ */ jsx103("a", { href, className: classes, children });
17238
17805
  }
17239
- return /* @__PURE__ */ jsx104(
17806
+ return /* @__PURE__ */ jsx103(
17240
17807
  "button",
17241
17808
  {
17242
17809
  type: "button",
@@ -17249,24 +17816,24 @@ function ButtonLink({
17249
17816
  }
17250
17817
 
17251
17818
  // src/components/atoms/panel-hints.tsx
17252
- import { jsx as jsx105, jsxs as jsxs78 } from "react/jsx-runtime";
17819
+ import { jsx as jsx104, jsxs as jsxs77 } from "react/jsx-runtime";
17253
17820
  function PanelHints({
17254
17821
  title = "Common patterns",
17255
17822
  hints,
17256
17823
  className = ""
17257
17824
  }) {
17258
- return /* @__PURE__ */ jsxs78("div", { className: `elb-panel-hints ${className}`, children: [
17259
- title && /* @__PURE__ */ jsx105("div", { className: "elb-panel-hints-title", children: title }),
17260
- /* @__PURE__ */ jsx105("ul", { className: "elb-panel-hints-list", children: hints.map((hint, index) => /* @__PURE__ */ jsxs78("li", { className: "elb-panel-hints-item", children: [
17261
- /* @__PURE__ */ jsx105("code", { className: "elb-panel-hints-code", children: hint.code }),
17262
- /* @__PURE__ */ jsx105("span", { className: "elb-panel-hints-desc", children: hint.description })
17825
+ return /* @__PURE__ */ jsxs77("div", { className: `elb-panel-hints ${className}`, children: [
17826
+ title && /* @__PURE__ */ jsx104("div", { className: "elb-panel-hints-title", children: title }),
17827
+ /* @__PURE__ */ jsx104("ul", { className: "elb-panel-hints-list", children: hints.map((hint, index) => /* @__PURE__ */ jsxs77("li", { className: "elb-panel-hints-item", children: [
17828
+ /* @__PURE__ */ jsx104("code", { className: "elb-panel-hints-code", children: hint.code }),
17829
+ /* @__PURE__ */ jsx104("span", { className: "elb-panel-hints-desc", children: hint.description })
17263
17830
  ] }, index)) })
17264
17831
  ] });
17265
17832
  }
17266
17833
 
17267
17834
  // src/components/atoms/form-input.tsx
17268
17835
  import { useId as useId2 } from "react";
17269
- import { jsx as jsx106 } from "react/jsx-runtime";
17836
+ import { jsx as jsx105 } from "react/jsx-runtime";
17270
17837
  function FormInput({
17271
17838
  value,
17272
17839
  onChange,
@@ -17285,7 +17852,7 @@ function FormInput({
17285
17852
  const inputId = id ?? generatedId;
17286
17853
  const hasError = Boolean(error);
17287
17854
  const errorMessage = typeof error === "string" ? error : void 0;
17288
- return /* @__PURE__ */ jsx106(
17855
+ return /* @__PURE__ */ jsx105(
17289
17856
  FormField,
17290
17857
  {
17291
17858
  label,
@@ -17293,7 +17860,7 @@ function FormInput({
17293
17860
  error: errorMessage,
17294
17861
  required,
17295
17862
  className,
17296
- children: /* @__PURE__ */ jsx106(
17863
+ children: /* @__PURE__ */ jsx105(
17297
17864
  "input",
17298
17865
  {
17299
17866
  id: inputId,
@@ -17352,7 +17919,7 @@ function MDXProvider(properties) {
17352
17919
 
17353
17920
  // src/components/atoms/mdx-code.tsx
17354
17921
  import { Children } from "react";
17355
- import { jsx as jsx107 } from "react/jsx-runtime";
17922
+ import { jsx as jsx106 } from "react/jsx-runtime";
17356
17923
  var MDXCode = ({
17357
17924
  className,
17358
17925
  children
@@ -17366,7 +17933,7 @@ var MDXCode = ({
17366
17933
  return false;
17367
17934
  });
17368
17935
  if (!hasClassName || !hasNewlines) {
17369
- return /* @__PURE__ */ jsx107("code", { className: "elb-code-inline", children });
17936
+ return /* @__PURE__ */ jsx106("code", { className: "elb-code-inline", children });
17370
17937
  }
17371
17938
  const mdxLanguage = className.replace(/^language-/, "");
17372
17939
  const languageMap = {
@@ -17381,7 +17948,7 @@ var MDXCode = ({
17381
17948
  };
17382
17949
  const monacoLanguage = languageMap[mdxLanguage] || mdxLanguage;
17383
17950
  const code = childrenArray.map((child) => typeof child === "string" ? child : "").join("").trim();
17384
- return /* @__PURE__ */ jsx107(
17951
+ return /* @__PURE__ */ jsx106(
17385
17952
  CodeBox,
17386
17953
  {
17387
17954
  code,
@@ -17395,7 +17962,7 @@ var MDXCode = ({
17395
17962
  };
17396
17963
 
17397
17964
  // src/providers/MDXProvider.tsx
17398
- import { jsx as jsx108 } from "react/jsx-runtime";
17965
+ import { jsx as jsx107 } from "react/jsx-runtime";
17399
17966
  var MDXProvider2 = ({ children }) => {
17400
17967
  const components = {
17401
17968
  // Markdown element mappings
@@ -17407,14 +17974,14 @@ var MDXProvider2 = ({ children }) => {
17407
17974
  DestinationInitDemo,
17408
17975
  DestinationDemo
17409
17976
  };
17410
- return /* @__PURE__ */ jsx108(MDXProvider, { components, children });
17977
+ return /* @__PURE__ */ jsx107(MDXProvider, { components, children });
17411
17978
  };
17412
17979
 
17413
17980
  // src/hooks/useDropdown.ts
17414
- import { useState as useState41, useRef as useRef18, useEffect as useEffect29, useCallback as useCallback20 } from "react";
17981
+ import { useState as useState41, useRef as useRef19, useEffect as useEffect30, useCallback as useCallback20 } from "react";
17415
17982
  function useDropdown() {
17416
17983
  const [isOpen, setIsOpen] = useState41(false);
17417
- const containerRef = useRef18(null);
17984
+ const containerRef = useRef19(null);
17418
17985
  const toggle = useCallback20(() => {
17419
17986
  setIsOpen((prev) => !prev);
17420
17987
  }, []);
@@ -17424,7 +17991,7 @@ function useDropdown() {
17424
17991
  const close = useCallback20(() => {
17425
17992
  setIsOpen(false);
17426
17993
  }, []);
17427
- useEffect29(() => {
17994
+ useEffect30(() => {
17428
17995
  if (!isOpen) return;
17429
17996
  function handleClickOutside(event) {
17430
17997
  if (containerRef.current && !containerRef.current.contains(event.target)) {
@@ -17434,7 +18001,7 @@ function useDropdown() {
17434
18001
  document.addEventListener("mousedown", handleClickOutside);
17435
18002
  return () => document.removeEventListener("mousedown", handleClickOutside);
17436
18003
  }, [isOpen]);
17437
- useEffect29(() => {
18004
+ useEffect30(() => {
17438
18005
  if (!isOpen) return;
17439
18006
  function handleEscape(event) {
17440
18007
  if (event.key === "Escape") {
@@ -17452,6 +18019,474 @@ function useDropdown() {
17452
18019
  containerRef
17453
18020
  };
17454
18021
  }
18022
+
18023
+ // src/utils/monaco-schema-enrichment.ts
18024
+ function enrichSchema(baseSchema, enrichments) {
18025
+ const schema = JSON.parse(JSON.stringify(baseSchema));
18026
+ for (const [path, extensions] of Object.entries(enrichments)) {
18027
+ const target = path === "" ? schema : getNestedObject(schema, path);
18028
+ if (target && typeof target === "object") {
18029
+ Object.assign(target, extensions);
18030
+ }
18031
+ }
18032
+ return schema;
18033
+ }
18034
+ function getNestedObject(obj, path) {
18035
+ const keys = path.split(".");
18036
+ let current = obj;
18037
+ for (const key of keys) {
18038
+ if (current && typeof current === "object" && key in current) {
18039
+ current = current[key];
18040
+ } else {
18041
+ return void 0;
18042
+ }
18043
+ }
18044
+ return current;
18045
+ }
18046
+
18047
+ // src/utils/monaco-schema-flow-setup.ts
18048
+ function enrichFlowSetupSchema(baseSchema) {
18049
+ const schema = JSON.parse(JSON.stringify(baseSchema));
18050
+ if (!schema.anyOf?.[0]?.properties) return schema;
18051
+ const root = schema.anyOf[0];
18052
+ const props = root.properties;
18053
+ const flowConfig = props.flows?.additionalProperties?.properties;
18054
+ if (props.version) {
18055
+ props.version.markdownDescription = 'Schema version number. Must be `1` for the current format.\n\n```json\n"version": 1\n```';
18056
+ }
18057
+ if (props.$schema) {
18058
+ props.$schema.markdownDescription = 'JSON Schema URI for IDE validation.\n\n```json\n"$schema": "https://walkeros.io/schema/flow/v1.json"\n```';
18059
+ }
18060
+ if (props.include) {
18061
+ props.include.markdownDescription = 'Folders to include in the bundle output.\n\n```json\n"include": ["./src", "./lib"]\n```';
18062
+ }
18063
+ if (props.variables) {
18064
+ props.variables.markdownDescription = 'Shared variables for `$var.name` interpolation across all flows.\n\n```json\n"variables": {\n "measurementId": "G-XXXXXXXXXX",\n "debug": false\n}\n```\n\nReference in any config value: `"$var.measurementId"`';
18065
+ props.variables.defaultSnippets = [
18066
+ {
18067
+ label: "Add variable",
18068
+ description: "New key-value variable",
18069
+ body: { "${1:name}": "${2:value}" }
18070
+ }
18071
+ ];
18072
+ }
18073
+ if (props.definitions) {
18074
+ props.definitions.markdownDescription = 'Reusable configuration fragments for `$def.name` references.\n\n```json\n"definitions": {\n "gaConfig": {\n "measurementId": "$var.trackingId"\n }\n}\n```\n\nReference in any config: `"$def.gaConfig"`';
18075
+ props.definitions.defaultSnippets = [
18076
+ {
18077
+ label: "Add definition",
18078
+ description: "New reusable config fragment",
18079
+ body: { "${1:name}": { "${2:key}": "${3:value}" } }
18080
+ }
18081
+ ];
18082
+ }
18083
+ if (props.flows) {
18084
+ props.flows.markdownDescription = 'Flow configurations keyed by name. Each flow defines a complete event pipeline.\n\n```json\n"flows": {\n "myFlow": {\n "web": {},\n "sources": { ... },\n "destinations": { ... }\n }\n}\n```';
18085
+ props.flows.defaultSnippets = [
18086
+ {
18087
+ label: "Web flow (basic)",
18088
+ description: "Minimal web flow with browser source",
18089
+ body: {
18090
+ "${1:myFlow}": {
18091
+ web: {},
18092
+ sources: {
18093
+ browser: { package: "@walkeros/web-source-browser" }
18094
+ },
18095
+ destinations: {}
18096
+ }
18097
+ }
18098
+ },
18099
+ {
18100
+ label: "Server flow (basic)",
18101
+ description: "Minimal server flow with Express source",
18102
+ body: {
18103
+ "${1:myFlow}": {
18104
+ server: {},
18105
+ sources: {
18106
+ express: { package: "@walkeros/server-source-express" }
18107
+ },
18108
+ destinations: {}
18109
+ }
18110
+ }
18111
+ },
18112
+ {
18113
+ label: "Web + GA4 flow",
18114
+ description: "Web flow with browser source and GA4 destination",
18115
+ body: {
18116
+ "${1:myFlow}": {
18117
+ web: {},
18118
+ sources: {
18119
+ browser: { package: "@walkeros/web-source-browser" }
18120
+ },
18121
+ destinations: {
18122
+ ga4: {
18123
+ package: "@walkeros/web-destination-ga4",
18124
+ config: {
18125
+ measurementId: "$var.${2:measurementId}"
18126
+ }
18127
+ }
18128
+ }
18129
+ }
18130
+ }
18131
+ }
18132
+ ];
18133
+ }
18134
+ if (flowConfig) {
18135
+ if (flowConfig.sources) {
18136
+ flowConfig.sources.markdownDescription = 'Source configurations for data capture, keyed by step name.\n\n```json\n"sources": {\n "browser": { "package": "@walkeros/web-source-browser" }\n}\n```';
18137
+ flowConfig.sources.defaultSnippets = [
18138
+ {
18139
+ label: "Add web source",
18140
+ description: "Browser source for web tracking",
18141
+ body: {
18142
+ "${1:browser}": {
18143
+ package: "@walkeros/web-source-browser"
18144
+ }
18145
+ }
18146
+ },
18147
+ {
18148
+ label: "Add server source",
18149
+ description: "Express source for server tracking",
18150
+ body: {
18151
+ "${1:express}": {
18152
+ package: "@walkeros/server-source-express"
18153
+ }
18154
+ }
18155
+ }
18156
+ ];
18157
+ }
18158
+ if (flowConfig.destinations) {
18159
+ flowConfig.destinations.markdownDescription = 'Destination configurations for data output, keyed by step name.\n\n```json\n"destinations": {\n "ga4": {\n "package": "@walkeros/web-destination-ga4",\n "config": { "measurementId": "$var.trackingId" }\n }\n}\n```';
18160
+ flowConfig.destinations.defaultSnippets = [
18161
+ {
18162
+ label: "Add GA4 destination",
18163
+ description: "Google Analytics 4 destination",
18164
+ body: {
18165
+ "${1:ga4}": {
18166
+ package: "@walkeros/web-destination-ga4",
18167
+ config: {
18168
+ measurementId: "$var.${2:measurementId}"
18169
+ }
18170
+ }
18171
+ }
18172
+ },
18173
+ {
18174
+ label: "Add custom destination",
18175
+ description: "Custom destination with inline code",
18176
+ body: {
18177
+ "${1:custom}": {
18178
+ code: {
18179
+ push: "$code:(event) => { ${2:// handle event} }"
18180
+ }
18181
+ }
18182
+ }
18183
+ }
18184
+ ];
18185
+ }
18186
+ if (flowConfig.transformers) {
18187
+ flowConfig.transformers.markdownDescription = 'Transformer configurations for event transformation, keyed by step name.\n\n```json\n"transformers": {\n "validator": {\n "code": { "push": "$code:(event) => event" }\n }\n}\n```';
18188
+ flowConfig.transformers.defaultSnippets = [
18189
+ {
18190
+ label: "Add transformer",
18191
+ description: "Inline transformer with code",
18192
+ body: {
18193
+ "${1:transformer}": {
18194
+ code: {
18195
+ push: "$code:(event) => { ${2:return event;} }"
18196
+ }
18197
+ }
18198
+ }
18199
+ }
18200
+ ];
18201
+ }
18202
+ if (flowConfig.web) {
18203
+ flowConfig.web.markdownDescription = 'Web platform configuration (browser-based). Mutually exclusive with `server`.\n\n```json\n"web": {\n "windowCollector": "collector",\n "windowElb": "elb"\n}\n```';
18204
+ }
18205
+ if (flowConfig.server) {
18206
+ flowConfig.server.markdownDescription = 'Server platform configuration (Node.js). Mutually exclusive with `web`.\n\n```json\n"server": {}\n```';
18207
+ }
18208
+ }
18209
+ return schema;
18210
+ }
18211
+
18212
+ // src/utils/monaco-schema-contract.ts
18213
+ function getEnrichedContractSchema() {
18214
+ return {
18215
+ type: "object",
18216
+ markdownDescription: 'walkerOS Data Contract. Defines entity\u2192action schemas for event validation.\n\n```json\n{\n "$tagging": 1,\n "page": {\n "view": {\n "type": "object",\n "properties": {\n "title": { "type": "string" }\n }\n }\n }\n}\n```',
18217
+ properties: {
18218
+ $tagging: {
18219
+ type: "number",
18220
+ markdownDescription: 'Contract version number. Increment when making breaking changes.\n\n```json\n"$tagging": 1\n```'
18221
+ }
18222
+ },
18223
+ additionalProperties: {
18224
+ type: "object",
18225
+ markdownDescription: "Entity name. Contains action\u2192schema mappings.",
18226
+ additionalProperties: {
18227
+ type: "object",
18228
+ markdownDescription: 'Action schema (JSON Schema). Defines valid event data for this entity+action.\n\n```json\n{\n "type": "object",\n "properties": {\n "name": { "type": "string" },\n "price": { "type": "number" }\n },\n "required": ["name"]\n}\n```',
18229
+ defaultSnippets: [
18230
+ {
18231
+ label: "Object schema",
18232
+ description: "Schema with typed properties",
18233
+ body: {
18234
+ type: "object",
18235
+ properties: {
18236
+ "${1:name}": { type: "${2:string}" }
18237
+ }
18238
+ }
18239
+ }
18240
+ ]
18241
+ },
18242
+ defaultSnippets: [
18243
+ {
18244
+ label: "Add action",
18245
+ description: "Action with event data schema",
18246
+ body: {
18247
+ "${1:action}": {
18248
+ type: "object",
18249
+ properties: {
18250
+ "${2:property}": { type: "${3:string}" }
18251
+ }
18252
+ }
18253
+ }
18254
+ }
18255
+ ]
18256
+ },
18257
+ defaultSnippets: [
18258
+ {
18259
+ label: "Entity with action",
18260
+ description: "New entity with one action and properties",
18261
+ body: {
18262
+ "${1:entity}": {
18263
+ "${2:action}": {
18264
+ type: "object",
18265
+ properties: {
18266
+ "${3:property}": { type: "${4:string}" }
18267
+ }
18268
+ }
18269
+ }
18270
+ }
18271
+ }
18272
+ ]
18273
+ };
18274
+ }
18275
+
18276
+ // src/utils/monaco-schema-variables.ts
18277
+ function getVariablesSchema() {
18278
+ return {
18279
+ type: "object",
18280
+ markdownDescription: 'Flow variables for `$var.name` interpolation. Values must be string, number, or boolean.\n\n```json\n{\n "measurementId": "G-XXXXXXXXXX",\n "debug": false,\n "batchSize": 10\n}\n```\n\nReference in any config value: `"$var.measurementId"`',
18281
+ additionalProperties: {
18282
+ oneOf: [{ type: "string" }, { type: "number" }, { type: "boolean" }]
18283
+ },
18284
+ defaultSnippets: [
18285
+ {
18286
+ label: "Add string variable",
18287
+ body: { "${1:name}": "${2:value}" }
18288
+ },
18289
+ {
18290
+ label: "Add boolean variable",
18291
+ body: { "${1:name}": "${2|true,false|}" }
18292
+ },
18293
+ {
18294
+ label: "Add number variable",
18295
+ body: { "${1:name}": 0 }
18296
+ }
18297
+ ]
18298
+ };
18299
+ }
18300
+
18301
+ // src/utils/monaco-walkeros-markers.ts
18302
+ function validateWalkerOSReferences(text, context) {
18303
+ const issues = [];
18304
+ if (context.variables) {
18305
+ const varRegex = /\$var\.(\w+)/g;
18306
+ let match;
18307
+ while ((match = varRegex.exec(text)) !== null) {
18308
+ if (!(match[1] in context.variables)) {
18309
+ issues.push({
18310
+ message: `Unknown variable "$var.${match[1]}". Defined variables: ${Object.keys(context.variables).join(", ") || "none"}`,
18311
+ severity: "warning",
18312
+ startIndex: match.index,
18313
+ endIndex: match.index + match[0].length
18314
+ });
18315
+ }
18316
+ }
18317
+ }
18318
+ if (context.definitions) {
18319
+ const defRegex = /\$def\.(\w+)/g;
18320
+ let match;
18321
+ while ((match = defRegex.exec(text)) !== null) {
18322
+ if (!(match[1] in context.definitions)) {
18323
+ issues.push({
18324
+ message: `Unknown definition "$def.${match[1]}". Defined: ${Object.keys(context.definitions).join(", ") || "none"}`,
18325
+ severity: "warning",
18326
+ startIndex: match.index,
18327
+ endIndex: match.index + match[0].length
18328
+ });
18329
+ }
18330
+ }
18331
+ }
18332
+ if (context.secrets) {
18333
+ const secretRegex = /\$secret\.(\w+)/g;
18334
+ let match;
18335
+ while ((match = secretRegex.exec(text)) !== null) {
18336
+ if (!context.secrets.includes(match[1])) {
18337
+ issues.push({
18338
+ message: `Unknown secret "$secret.${match[1]}". Available: ${context.secrets.join(", ") || "none"}`,
18339
+ severity: "warning",
18340
+ startIndex: match.index,
18341
+ endIndex: match.index + match[0].length
18342
+ });
18343
+ }
18344
+ }
18345
+ }
18346
+ if (context.stepNames?.transformers) {
18347
+ const nextRegex = /"(?:next|before)"\s*:\s*"(\w+)"/g;
18348
+ let match;
18349
+ while ((match = nextRegex.exec(text)) !== null) {
18350
+ if (!context.stepNames.transformers.includes(match[1])) {
18351
+ issues.push({
18352
+ message: `Unknown transformer "${match[1]}". Available: ${context.stepNames.transformers.join(", ") || "none"}`,
18353
+ severity: "warning",
18354
+ startIndex: match.index,
18355
+ endIndex: match.index + match[0].length
18356
+ });
18357
+ }
18358
+ }
18359
+ }
18360
+ return issues;
18361
+ }
18362
+
18363
+ // src/utils/monaco-intellisense-flow-extractor.ts
18364
+ function extractFlowIntelliSenseContext(json2) {
18365
+ let parsed;
18366
+ try {
18367
+ parsed = JSON.parse(json2);
18368
+ } catch {
18369
+ return {};
18370
+ }
18371
+ if (!isFlowSetup(parsed)) return {};
18372
+ const variables = {};
18373
+ const definitions = {};
18374
+ const sources = [];
18375
+ const destinations = [];
18376
+ const transformers = [];
18377
+ const packages = [];
18378
+ const contractEntities = [];
18379
+ let platform;
18380
+ mergeVars(variables, parsed.variables);
18381
+ mergeDefs(definitions, parsed.definitions);
18382
+ extractContract(contractEntities, parsed.contract);
18383
+ for (const config of Object.values(parsed.flows)) {
18384
+ if (!isObject(config)) continue;
18385
+ if (!platform) {
18386
+ if ("web" in config) platform = "web";
18387
+ else if ("server" in config) platform = "server";
18388
+ }
18389
+ mergeVars(variables, config.variables);
18390
+ mergeDefs(definitions, config.definitions);
18391
+ extractContract(contractEntities, config.contract);
18392
+ if (isObject(config.sources)) {
18393
+ for (const [name, ref] of Object.entries(config.sources)) {
18394
+ sources.push(name);
18395
+ if (isObject(ref)) {
18396
+ mergeVars(variables, ref.variables);
18397
+ mergeDefs(definitions, ref.definitions);
18398
+ if (typeof ref.package === "string") {
18399
+ packages.push({
18400
+ package: ref.package,
18401
+ shortName: name,
18402
+ type: "source",
18403
+ platform: platform || "web"
18404
+ });
18405
+ }
18406
+ }
18407
+ }
18408
+ }
18409
+ if (isObject(config.destinations)) {
18410
+ for (const [name, ref] of Object.entries(config.destinations)) {
18411
+ destinations.push(name);
18412
+ if (isObject(ref)) {
18413
+ mergeVars(variables, ref.variables);
18414
+ mergeDefs(definitions, ref.definitions);
18415
+ if (typeof ref.package === "string") {
18416
+ packages.push({
18417
+ package: ref.package,
18418
+ shortName: name,
18419
+ type: "destination",
18420
+ platform: platform || "web"
18421
+ });
18422
+ }
18423
+ }
18424
+ }
18425
+ }
18426
+ if (isObject(config.transformers)) {
18427
+ for (const [name, ref] of Object.entries(config.transformers)) {
18428
+ transformers.push(name);
18429
+ if (isObject(ref)) {
18430
+ mergeVars(variables, ref.variables);
18431
+ mergeDefs(definitions, ref.definitions);
18432
+ if (typeof ref.package === "string") {
18433
+ packages.push({
18434
+ package: ref.package,
18435
+ shortName: name,
18436
+ type: "transformer",
18437
+ platform: platform || "web"
18438
+ });
18439
+ }
18440
+ }
18441
+ }
18442
+ }
18443
+ }
18444
+ const result = {
18445
+ variables,
18446
+ definitions,
18447
+ stepNames: { sources, destinations, transformers }
18448
+ };
18449
+ if (platform) result.platform = platform;
18450
+ if (packages.length > 0) result.packages = packages;
18451
+ if (contractEntities.length > 0) result.contract = contractEntities;
18452
+ return result;
18453
+ }
18454
+ function isObject(v) {
18455
+ return typeof v === "object" && v !== null && !Array.isArray(v);
18456
+ }
18457
+ function isFlowSetup(v) {
18458
+ return isObject(v) && "version" in v && "flows" in v && isObject(v.flows);
18459
+ }
18460
+ function isPrimitive(v) {
18461
+ return typeof v === "string" || typeof v === "number" || typeof v === "boolean";
18462
+ }
18463
+ function mergeVars(target, source) {
18464
+ if (!isObject(source)) return;
18465
+ for (const [k, v] of Object.entries(source)) {
18466
+ if (isPrimitive(v)) target[k] = v;
18467
+ }
18468
+ }
18469
+ function mergeDefs(target, source) {
18470
+ if (!isObject(source)) return;
18471
+ for (const [k, v] of Object.entries(source)) {
18472
+ target[k] = v;
18473
+ }
18474
+ }
18475
+ function extractContract(target, contract) {
18476
+ if (!isObject(contract)) return;
18477
+ for (const [key, value] of Object.entries(contract)) {
18478
+ if (key.startsWith("$") || !isObject(value)) continue;
18479
+ const existing = target.find((e) => e.entity === key);
18480
+ const actions = Object.keys(value);
18481
+ if (existing) {
18482
+ for (const a of actions) {
18483
+ if (!existing.actions.includes(a)) existing.actions.push(a);
18484
+ }
18485
+ } else {
18486
+ target.push({ entity: key, actions });
18487
+ }
18488
+ }
18489
+ }
17455
18490
  export {
17456
18491
  Alert,
17457
18492
  ArchitectureFlow,
@@ -17474,7 +18509,6 @@ export {
17474
18509
  Dropdown,
17475
18510
  DropdownDivider,
17476
18511
  DropdownItem,
17477
- FlowDeployPanel,
17478
18512
  FlowMap,
17479
18513
  FlowSelector,
17480
18514
  Footer,
@@ -17497,9 +18531,11 @@ export {
17497
18531
  Preview,
17498
18532
  PromotionPlayground,
17499
18533
  PropertyTable,
18534
+ REFERENCE_PATTERNS,
17500
18535
  Spinner,
17501
18536
  SplitButton,
17502
18537
  SubmitButton,
18538
+ applyWalkerOSDecorations,
17503
18539
  captureDestinationPush,
17504
18540
  cn,
17505
18541
  createCaptureFn,
@@ -17507,16 +18543,31 @@ export {
17507
18543
  createGtagDestination,
17508
18544
  createPlausibleDestination,
17509
18545
  createRawCapture,
18546
+ disposeWalkerOSProviders,
18547
+ enrichFlowSetupSchema,
18548
+ enrichSchema,
18549
+ extractFlowIntelliSenseContext,
18550
+ findWalkerOSReferences,
17510
18551
  formatCapturedCalls,
18552
+ generateModelPath,
18553
+ getEnrichedContractSchema,
18554
+ getVariablesSchema,
17511
18555
  initializeMonacoTypes,
17512
18556
  lighthouseTheme,
17513
18557
  loadPackageTypes,
17514
18558
  loadTypeLibraryFromURL,
17515
18559
  palenightTheme,
17516
18560
  registerAllThemes,
18561
+ registerJsonSchema,
17517
18562
  registerLighthouseTheme,
17518
18563
  registerPalenightTheme,
18564
+ registerWalkerOSDecorationStyles,
18565
+ registerWalkerOSProviders,
17519
18566
  registerWalkerOSTypes,
17520
- useDropdown
18567
+ removeIntelliSenseContext,
18568
+ setIntelliSenseContext,
18569
+ unregisterJsonSchema,
18570
+ useDropdown,
18571
+ validateWalkerOSReferences
17521
18572
  };
17522
18573
  //# sourceMappingURL=index.mjs.map