@burtson-labs/bandit-engine 2.0.50 → 2.0.52

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 (37) hide show
  1. package/dist/{chat-CQWZOJH4.mjs → chat-YWYLVKXX.mjs} +5 -5
  2. package/dist/chat-provider.js +254 -22
  3. package/dist/chat-provider.js.map +1 -1
  4. package/dist/chat-provider.mjs +3 -3
  5. package/dist/{chunk-VL3CMSDO.mjs → chunk-37PEP5JK.mjs} +2 -2
  6. package/dist/{chunk-AXFX2HUK.mjs → chunk-M3BEAMCC.mjs} +2 -2
  7. package/dist/{chunk-HKJTRBWC.mjs → chunk-MH7WFWCP.mjs} +34 -3
  8. package/dist/chunk-MH7WFWCP.mjs.map +1 -0
  9. package/dist/{chunk-6WZUQHZT.mjs → chunk-QX6CO7TJ.mjs} +225 -23
  10. package/dist/chunk-QX6CO7TJ.mjs.map +1 -0
  11. package/dist/{chunk-TVF45U7B.mjs → chunk-RSSJADDD.mjs} +3 -3
  12. package/dist/{chunk-Q2N7CCZI.mjs → chunk-TSQCNHOX.mjs} +45 -6
  13. package/dist/chunk-TSQCNHOX.mjs.map +1 -0
  14. package/dist/{chunk-ZTTGERUG.mjs → chunk-Y5N3NSTU.mjs} +459 -180
  15. package/dist/chunk-Y5N3NSTU.mjs.map +1 -0
  16. package/dist/{chunk-KHKWYHXD.mjs → chunk-YZ2HJFPQ.mjs} +2 -2
  17. package/dist/cli.js +1 -1
  18. package/dist/cli.js.map +1 -1
  19. package/dist/index.js +747 -198
  20. package/dist/index.js.map +1 -1
  21. package/dist/index.mjs +8 -8
  22. package/dist/management/management.js +717 -198
  23. package/dist/management/management.js.map +1 -1
  24. package/dist/management/management.mjs +6 -6
  25. package/dist/modals/chat-modal/chat-modal.js +226 -22
  26. package/dist/modals/chat-modal/chat-modal.js.map +1 -1
  27. package/dist/modals/chat-modal/chat-modal.mjs +3 -3
  28. package/package.json +1 -1
  29. package/dist/chunk-6WZUQHZT.mjs.map +0 -1
  30. package/dist/chunk-HKJTRBWC.mjs.map +0 -1
  31. package/dist/chunk-Q2N7CCZI.mjs.map +0 -1
  32. package/dist/chunk-ZTTGERUG.mjs.map +0 -1
  33. /package/dist/{chat-CQWZOJH4.mjs.map → chat-YWYLVKXX.mjs.map} +0 -0
  34. /package/dist/{chunk-VL3CMSDO.mjs.map → chunk-37PEP5JK.mjs.map} +0 -0
  35. /package/dist/{chunk-AXFX2HUK.mjs.map → chunk-M3BEAMCC.mjs.map} +0 -0
  36. /package/dist/{chunk-TVF45U7B.mjs.map → chunk-RSSJADDD.mjs.map} +0 -0
  37. /package/dist/{chunk-KHKWYHXD.mjs.map → chunk-YZ2HJFPQ.mjs.map} +0 -0
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  StreamingMarkdown_default
3
- } from "./chunk-KHKWYHXD.mjs";
3
+ } from "./chunk-YZ2HJFPQ.mjs";
4
4
  import {
5
5
  aiProviderInitService
6
- } from "./chunk-VL3CMSDO.mjs";
6
+ } from "./chunk-37PEP5JK.mjs";
7
7
  import {
8
8
  useMCPToolsStore
9
9
  } from "./chunk-EHNWQ4T3.mjs";
10
10
  import {
11
11
  chat_modal_default
12
- } from "./chunk-TVF45U7B.mjs";
12
+ } from "./chunk-RSSJADDD.mjs";
13
13
  import {
14
14
  DocumentCard_default,
15
15
  banditDarkTheme,
@@ -17,7 +17,7 @@ import {
17
17
  predefinedThemes,
18
18
  useNotificationService,
19
19
  useVoiceStore
20
- } from "./chunk-AXFX2HUK.mjs";
20
+ } from "./chunk-M3BEAMCC.mjs";
21
21
  import {
22
22
  authenticationService,
23
23
  brandingService_default,
@@ -30,7 +30,7 @@ import {
30
30
  useFeatures,
31
31
  useKnowledgeStore2 as useKnowledgeStore,
32
32
  useVectorStore
33
- } from "./chunk-6WZUQHZT.mjs";
33
+ } from "./chunk-QX6CO7TJ.mjs";
34
34
  import {
35
35
  indexedDBService_default,
36
36
  models,
@@ -95,6 +95,7 @@ import {
95
95
  Tab,
96
96
  Alert as Alert2,
97
97
  Chip,
98
+ Collapse,
98
99
  GlobalStyles
99
100
  } from "@mui/material";
100
101
  import useMediaQuery from "@mui/material/useMediaQuery";
@@ -500,6 +501,7 @@ var PersonalitiesTab = ({
500
501
  const [deleteDialogOpen, setDeleteDialogOpen] = useState2(false);
501
502
  const [personalityToDelete, setPersonalityToDelete] = useState2(null);
502
503
  const [clickedChips, setClickedChips] = useState2(/* @__PURE__ */ new Set());
504
+ const [showTemplateHelp, setShowTemplateHelp] = useState2(false);
503
505
  const [cropperOpen, setCropperOpen] = useState2(false);
504
506
  const [selectedImageFile, setSelectedImageFile] = useState2(null);
505
507
  const promptTemplates = [
@@ -753,28 +755,15 @@ var PersonalitiesTab = ({
753
755
  }
754
756
  }
755
757
  ),
756
- /* @__PURE__ */ jsxs2(Box2, { sx: {
757
- height: "100%",
758
- overflow: "auto",
759
- p: { xs: 1.5, sm: 2 },
760
- // Hide scrollbars while keeping scroll functionality
761
- scrollbarWidth: "none",
762
- // Firefox
763
- "&::-webkit-scrollbar": {
764
- display: "none"
765
- // Chrome, Safari, Edge
766
- },
767
- "-ms-overflow-style": "none"
768
- // IE and Edge
769
- }, children: [
758
+ /* @__PURE__ */ jsxs2(Box2, { sx: { p: { xs: 1, sm: 2 } }, children: [
770
759
  /* @__PURE__ */ jsxs2(Box2, { sx: {
771
760
  display: "flex",
772
761
  flexDirection: { xs: "column", md: "row" },
773
762
  alignItems: { xs: "flex-start", md: "center" },
774
763
  justifyContent: "space-between",
775
- mb: { xs: 2, md: 3 },
764
+ mb: { xs: 1.25, md: 3 },
776
765
  flexWrap: "wrap",
777
- gap: { xs: 1.5, md: 2 }
766
+ gap: { xs: 1, md: 2 }
778
767
  }, children: [
779
768
  /* @__PURE__ */ jsxs2(Box2, { sx: {
780
769
  display: "flex",
@@ -804,8 +793,8 @@ var PersonalitiesTab = ({
804
793
  backgroundClip: "text",
805
794
  WebkitBackgroundClip: "text",
806
795
  WebkitTextFillColor: "transparent",
807
- mb: 0.5,
808
- fontSize: { xs: "1.55rem", sm: "1.75rem" }
796
+ mb: { xs: 0.25, sm: 0.5 },
797
+ fontSize: { xs: "1.35rem", sm: "1.75rem" }
809
798
  },
810
799
  children: "Quick Start Templates"
811
800
  }
@@ -830,12 +819,40 @@ var PersonalitiesTab = ({
830
819
  color: "white",
831
820
  fontWeight: 600,
832
821
  animation: "pulse 2s infinite",
833
- alignSelf: { xs: "flex-start", md: "center" }
822
+ alignSelf: { xs: "flex-start", md: "center" },
823
+ display: { xs: "none", md: "inline-flex" }
834
824
  }
835
825
  }
836
826
  )
837
827
  ] }),
838
- /* @__PURE__ */ jsx2(
828
+ isMobile ? /* @__PURE__ */ jsxs2(
829
+ Box2,
830
+ {
831
+ sx: {
832
+ mb: 1.75,
833
+ borderRadius: 2,
834
+ border: "1px solid rgba(25, 118, 210, 0.2)",
835
+ background: "linear-gradient(135deg, rgba(25, 118, 210, 0.05) 0%, rgba(66, 165, 245, 0.05) 100%)",
836
+ px: 1.25,
837
+ py: 1
838
+ },
839
+ children: [
840
+ /* @__PURE__ */ jsxs2(Box2, { sx: { display: "flex", alignItems: "center", justifyContent: "space-between", gap: 1 }, children: [
841
+ /* @__PURE__ */ jsx2(Typography2, { variant: "body2", sx: { fontWeight: 600, color: "primary.main", fontSize: "0.82rem" }, children: "Tap any template to pre-fill your form" }),
842
+ /* @__PURE__ */ jsx2(
843
+ Button2,
844
+ {
845
+ size: "small",
846
+ onClick: () => setShowTemplateHelp((prev) => !prev),
847
+ sx: { minWidth: "auto", px: 1, fontSize: "0.72rem", whiteSpace: "nowrap" },
848
+ children: showTemplateHelp ? "Hide" : "Details"
849
+ }
850
+ )
851
+ ] }),
852
+ /* @__PURE__ */ jsx2(Collapse, { in: showTemplateHelp, children: /* @__PURE__ */ jsx2(Typography2, { variant: "body2", sx: { color: "text.secondary", fontSize: "0.8rem", lineHeight: 1.4, mt: 0.75 }, children: "Choose a setup you like, then tweak name, tone, and prompt details in the Create/Edit tab." }) })
853
+ ]
854
+ }
855
+ ) : /* @__PURE__ */ jsx2(
839
856
  Alert2,
840
857
  {
841
858
  severity: "info",
@@ -861,17 +878,19 @@ var PersonalitiesTab = ({
861
878
  Card,
862
879
  {
863
880
  sx: {
864
- mb: { xs: 3, md: 4 },
881
+ mb: { xs: 2, md: 4 },
865
882
  background: "linear-gradient(135deg, #1976d2 0%, #42a5f5 100%)",
866
883
  border: "2px solid transparent",
867
- borderRadius: 3,
884
+ borderRadius: { xs: 2.25, sm: 3 },
868
885
  cursor: "pointer",
869
886
  transition: "all 0.3s cubic-bezier(0.4, 0, 0.2, 1)",
870
887
  position: "relative",
871
888
  overflow: "hidden",
872
- "&:hover": {
873
- transform: "translateY(-4px) scale(1.02)",
874
- boxShadow: "0 12px 40px rgba(25, 118, 210, 0.3)"
889
+ ...isMobile ? {} : {
890
+ "&:hover": {
891
+ transform: "translateY(-4px) scale(1.02)",
892
+ boxShadow: "0 12px 40px rgba(25, 118, 210, 0.3)"
893
+ }
875
894
  },
876
895
  "&::before": {
877
896
  content: '""',
@@ -896,41 +915,70 @@ var PersonalitiesTab = ({
896
915
  setPersonalityTabIndex(1);
897
916
  },
898
917
  children: /* @__PURE__ */ jsxs2(CardContent, { sx: {
899
- p: { xs: 3, sm: 4 },
918
+ p: { xs: 1.75, sm: 4 },
900
919
  color: "white",
901
- textAlign: "center",
920
+ textAlign: { xs: "left", sm: "center" },
902
921
  position: "relative",
903
- zIndex: 1
922
+ zIndex: 1,
923
+ display: "flex",
924
+ flexDirection: { xs: "row", sm: "column" },
925
+ alignItems: { xs: "center", sm: "center" },
926
+ gap: { xs: 1.25, sm: 0 }
904
927
  }, children: [
905
928
  /* @__PURE__ */ jsx2(Box2, { sx: {
906
929
  display: "flex",
907
930
  alignItems: "center",
908
931
  justifyContent: "center",
909
932
  fontSize: 0,
910
- mb: { xs: 1.5, sm: 2 }
911
- }, children: /* @__PURE__ */ jsx2(AutoAwesomeIcon, { sx: { fontSize: { xs: 36, sm: 44 }, color: "common.white", filter: "drop-shadow(0 4px 12px rgba(0,0,0,0.25))" } }) }),
912
- /* @__PURE__ */ jsx2(
913
- Typography2,
914
- {
915
- variant: "h5",
916
- sx: {
917
- fontWeight: 700,
918
- mb: { xs: 0.75, sm: 1 },
919
- textShadow: "0 2px 4px rgba(0,0,0,0.2)"
920
- },
921
- children: "Create from Scratch"
922
- }
923
- ),
924
- /* @__PURE__ */ jsx2(
925
- Typography2,
933
+ mb: { xs: 0, sm: 2 },
934
+ flexShrink: 0
935
+ }, children: /* @__PURE__ */ jsx2(AutoAwesomeIcon, { sx: { fontSize: { xs: 28, sm: 44 }, color: "common.white", filter: "drop-shadow(0 4px 12px rgba(0,0,0,0.25))" } }) }),
936
+ /* @__PURE__ */ jsxs2(Box2, { sx: { flex: 1, minWidth: 0 }, children: [
937
+ /* @__PURE__ */ jsx2(
938
+ Typography2,
939
+ {
940
+ variant: "h5",
941
+ sx: {
942
+ fontWeight: 700,
943
+ mb: { xs: 0.25, sm: 1 },
944
+ textShadow: "0 2px 4px rgba(0,0,0,0.2)",
945
+ fontSize: { xs: "1.1rem", sm: "1.75rem" }
946
+ },
947
+ children: "Create from Scratch"
948
+ }
949
+ ),
950
+ /* @__PURE__ */ jsx2(
951
+ Typography2,
952
+ {
953
+ variant: "body1",
954
+ sx: {
955
+ opacity: 0.9,
956
+ fontWeight: 500,
957
+ textShadow: "0 1px 2px rgba(0,0,0,0.2)",
958
+ fontSize: { xs: "0.8rem", sm: "1rem" },
959
+ lineHeight: { xs: 1.3, sm: 1.5 },
960
+ display: "-webkit-box",
961
+ WebkitLineClamp: { xs: 2, sm: "unset" },
962
+ WebkitBoxOrient: "vertical",
963
+ overflow: "hidden"
964
+ },
965
+ children: "Start with a blank canvas and build your perfect AI personality"
966
+ }
967
+ )
968
+ ] }),
969
+ isMobile && /* @__PURE__ */ jsx2(
970
+ Chip,
926
971
  {
927
- variant: "body1",
972
+ label: "Start",
973
+ size: "small",
928
974
  sx: {
929
- opacity: 0.9,
930
- fontWeight: 500,
931
- textShadow: "0 1px 2px rgba(0,0,0,0.2)"
932
- },
933
- children: "Start with a blank canvas and build your perfect AI personality"
975
+ backgroundColor: "rgba(255,255,255,0.2)",
976
+ color: "common.white",
977
+ border: "1px solid rgba(255,255,255,0.45)",
978
+ fontWeight: 600,
979
+ height: 28,
980
+ flexShrink: 0
981
+ }
934
982
  }
935
983
  )
936
984
  ] })
@@ -945,7 +993,7 @@ var PersonalitiesTab = ({
945
993
  lg: "repeat(4, 1fr)",
946
994
  xl: "repeat(4, 1fr)"
947
995
  },
948
- gap: { xs: 2, sm: 2.5, md: 3 },
996
+ gap: { xs: 1.25, sm: 2.5, md: 3 },
949
997
  alignItems: "stretch"
950
998
  }, children: promptTemplates.map((template, index) => /* @__PURE__ */ jsx2(
951
999
  Card,
@@ -958,7 +1006,7 @@ var PersonalitiesTab = ({
958
1006
  border: "1px solid",
959
1007
  borderColor: "rgba(255,255,255,0.1)",
960
1008
  borderRadius: 3,
961
- minHeight: { xs: "auto", md: "280px" },
1009
+ minHeight: { xs: "200px", md: "280px" },
962
1010
  display: "flex",
963
1011
  flexDirection: "column",
964
1012
  overflow: "hidden",
@@ -976,19 +1024,21 @@ var PersonalitiesTab = ({
976
1024
  opacity: 0,
977
1025
  transition: "opacity 0.3s ease"
978
1026
  },
979
- "&:hover": {
980
- transform: "translateY(-8px) scale(1.02)",
981
- boxShadow: "0 20px 40px rgba(0,0,0,0.15)",
982
- borderColor: "primary.main",
983
- "&::before": {
984
- opacity: 1
985
- },
986
- "& .template-icon": {
987
- transform: "scale(1.1) rotate(5deg)"
988
- },
989
- "& .template-chip": {
990
- transform: "translateY(-2px)",
991
- boxShadow: "0 4px 12px rgba(0,0,0,0.2)"
1027
+ ...isMobile ? {} : {
1028
+ "&:hover": {
1029
+ transform: "translateY(-8px) scale(1.02)",
1030
+ boxShadow: "0 20px 40px rgba(0,0,0,0.15)",
1031
+ borderColor: "primary.main",
1032
+ "&::before": {
1033
+ opacity: 1
1034
+ },
1035
+ "& .template-icon": {
1036
+ transform: "scale(1.1) rotate(5deg)"
1037
+ },
1038
+ "& .template-chip": {
1039
+ transform: "translateY(-2px)",
1040
+ boxShadow: "0 4px 12px rgba(0,0,0,0.2)"
1041
+ }
992
1042
  }
993
1043
  },
994
1044
  "&:active": {
@@ -997,7 +1047,7 @@ var PersonalitiesTab = ({
997
1047
  },
998
1048
  onClick: () => handleTemplateSelect(template),
999
1049
  children: /* @__PURE__ */ jsxs2(CardContent, { sx: {
1000
- p: { xs: 2.5, sm: 3 },
1050
+ p: { xs: 2, sm: 3 },
1001
1051
  display: "flex",
1002
1052
  flexDirection: "column",
1003
1053
  height: "100%",
@@ -1007,7 +1057,7 @@ var PersonalitiesTab = ({
1007
1057
  /* @__PURE__ */ jsxs2(Box2, { sx: {
1008
1058
  display: "flex",
1009
1059
  alignItems: "center",
1010
- mb: { xs: 2, md: 2.5 },
1060
+ mb: { xs: 1.25, md: 2.5 },
1011
1061
  minHeight: { xs: "auto", md: "60px" }
1012
1062
  }, children: [
1013
1063
  /* @__PURE__ */ jsx2(
@@ -1016,9 +1066,9 @@ var PersonalitiesTab = ({
1016
1066
  src: template.avatar,
1017
1067
  alt: template.name,
1018
1068
  sx: {
1019
- width: { xs: 48, sm: 56, md: 60 },
1020
- height: { xs: 48, sm: 56, md: 60 },
1021
- mr: { xs: 1.5, md: 2 },
1069
+ width: { xs: 40, sm: 56, md: 60 },
1070
+ height: { xs: 40, sm: 56, md: 60 },
1071
+ mr: { xs: 1.2, md: 2 },
1022
1072
  transition: "transform 0.3s cubic-bezier(0.4, 0, 0.2, 1)",
1023
1073
  boxShadow: "0 4px 12px rgba(0,0,0,0.15)",
1024
1074
  border: "2px solid rgba(255,255,255,0.8)"
@@ -1072,10 +1122,10 @@ var PersonalitiesTab = ({
1072
1122
  lineHeight: 1.5,
1073
1123
  fontSize: { xs: "0.82rem", sm: "0.85rem", md: "0.875rem" },
1074
1124
  display: "-webkit-box",
1075
- WebkitLineClamp: 4,
1125
+ WebkitLineClamp: { xs: 2, sm: 4 },
1076
1126
  WebkitBoxOrient: "vertical",
1077
1127
  overflow: "hidden",
1078
- mb: { xs: 1.5, md: 2 },
1128
+ mb: { xs: 1.25, md: 2 },
1079
1129
  minHeight: { xs: "auto", md: "84px" }
1080
1130
  },
1081
1131
  children: template.description
@@ -1112,7 +1162,7 @@ var PersonalitiesTab = ({
1112
1162
  },
1113
1163
  index
1114
1164
  )) }),
1115
- /* @__PURE__ */ jsxs2(
1165
+ !isMobile && /* @__PURE__ */ jsxs2(
1116
1166
  Alert2,
1117
1167
  {
1118
1168
  severity: "info",
@@ -1126,20 +1176,7 @@ var PersonalitiesTab = ({
1126
1176
  )
1127
1177
  ] })
1128
1178
  ] });
1129
- const renderCreateEditTab = () => /* @__PURE__ */ jsxs2(Box2, { sx: {
1130
- height: "100%",
1131
- overflow: "auto",
1132
- p: { xs: 1.5, sm: 2 },
1133
- // Hide scrollbars while keeping scroll functionality
1134
- scrollbarWidth: "none",
1135
- // Firefox
1136
- "&::-webkit-scrollbar": {
1137
- display: "none"
1138
- // Chrome, Safari, Edge
1139
- },
1140
- "-ms-overflow-style": "none"
1141
- // IE and Edge
1142
- }, children: [
1179
+ const renderCreateEditTab = () => /* @__PURE__ */ jsxs2(Box2, { sx: { p: { xs: 1.5, sm: 2 } }, children: [
1143
1180
  /* @__PURE__ */ jsxs2(Box2, { sx: { mb: { xs: 2.5, md: 4 } }, children: [
1144
1181
  /* @__PURE__ */ jsx2(
1145
1182
  Typography2,
@@ -1609,6 +1646,9 @@ var PersonalitiesTab = ({
1609
1646
  Box2,
1610
1647
  {
1611
1648
  sx: {
1649
+ position: { xs: "sticky", sm: "static" },
1650
+ bottom: { xs: 10, sm: "auto" },
1651
+ zIndex: { xs: 5, sm: "auto" },
1612
1652
  display: "flex",
1613
1653
  flexDirection: { xs: "column", sm: "row" },
1614
1654
  gap: { xs: 1.5, sm: 2 },
@@ -1616,8 +1656,15 @@ var PersonalitiesTab = ({
1616
1656
  // Changed from flex-end to flex-start
1617
1657
  mr: { xs: 0, sm: 10 },
1618
1658
  // Add right margin to avoid FAB
1619
- mb: { xs: 8, sm: 2 }
1659
+ mb: { xs: 8, sm: 2 },
1620
1660
  // Add bottom margin on mobile for FAB clearance
1661
+ mt: { xs: 1.5, sm: 0 },
1662
+ p: { xs: 1.1, sm: 0 },
1663
+ borderRadius: { xs: 2, sm: 0 },
1664
+ border: { xs: "1px solid", sm: "none" },
1665
+ borderColor: { xs: "divider", sm: "transparent" },
1666
+ bgcolor: { xs: "background.paper", sm: "transparent" },
1667
+ boxShadow: { xs: 3, sm: "none" }
1621
1668
  },
1622
1669
  children: [
1623
1670
  /* @__PURE__ */ jsx2(
@@ -1645,20 +1692,7 @@ var PersonalitiesTab = ({
1645
1692
  }
1646
1693
  )
1647
1694
  ] });
1648
- const renderManageTab = () => /* @__PURE__ */ jsxs2(Box2, { sx: {
1649
- height: "100%",
1650
- overflow: "auto",
1651
- p: { xs: 1.5, sm: 2 },
1652
- // Hide scrollbars while keeping scroll functionality
1653
- scrollbarWidth: "none",
1654
- // Firefox
1655
- "&::-webkit-scrollbar": {
1656
- display: "none"
1657
- // Chrome, Safari, Edge
1658
- },
1659
- "-ms-overflow-style": "none"
1660
- // IE and Edge
1661
- }, children: [
1695
+ const renderManageTab = () => /* @__PURE__ */ jsxs2(Box2, { sx: { p: { xs: 1.5, sm: 2 } }, children: [
1662
1696
  /* @__PURE__ */ jsxs2(
1663
1697
  Box2,
1664
1698
  {
@@ -1907,7 +1941,7 @@ var PersonalitiesTab = ({
1907
1941
  ] })
1908
1942
  ] })
1909
1943
  ] });
1910
- return /* @__PURE__ */ jsxs2(Box2, { sx: { height: "100%", display: "flex", flexDirection: "column" }, children: [
1944
+ return /* @__PURE__ */ jsxs2(Box2, { sx: { display: "flex", flexDirection: "column" }, children: [
1911
1945
  /* @__PURE__ */ jsxs2(
1912
1946
  Box2,
1913
1947
  {
@@ -2033,7 +2067,7 @@ var PersonalitiesTab = ({
2033
2067
  ]
2034
2068
  }
2035
2069
  ) }),
2036
- /* @__PURE__ */ jsxs2(Box2, { sx: { flex: 1, overflow: "hidden" }, children: [
2070
+ /* @__PURE__ */ jsxs2(Box2, { sx: { minHeight: 0 }, children: [
2037
2071
  personalityTabIndex === 0 && renderTemplatesTab(),
2038
2072
  personalityTabIndex === 1 && renderCreateEditTab(),
2039
2073
  personalityTabIndex === 2 && renderManageTab()
@@ -5957,6 +5991,7 @@ import AddIcon from "@mui/icons-material/Add";
5957
5991
  import ArchiveIcon from "@mui/icons-material/Archive";
5958
5992
  import DeleteIcon3 from "@mui/icons-material/Delete";
5959
5993
  import DescriptionIcon2 from "@mui/icons-material/Description";
5994
+ import FolderOpenIcon from "@mui/icons-material/FolderOpen";
5960
5995
  import GroupIcon2 from "@mui/icons-material/Group";
5961
5996
  import PersonIcon2 from "@mui/icons-material/Person";
5962
5997
  import PublishIcon from "@mui/icons-material/Publish";
@@ -6229,6 +6264,22 @@ var archiveSeedPack = async (sid) => {
6229
6264
  throw error;
6230
6265
  }
6231
6266
  };
6267
+ var deleteSeedPack = async (sid) => {
6268
+ const url = buildUrl(`/seed-packs/${encodeURIComponent(sid)}`);
6269
+ try {
6270
+ const response = await fetch(url, { method: "DELETE", headers: buildHeaders() });
6271
+ if (response.status === 204) {
6272
+ return;
6273
+ }
6274
+ await handleJsonResponse(response, "Failed to delete seed pack");
6275
+ } catch (error) {
6276
+ debugLogger.error("seedPackService: failed to delete seed pack", {
6277
+ sid,
6278
+ error: error instanceof Error ? error.message : String(error)
6279
+ });
6280
+ throw error;
6281
+ }
6282
+ };
6232
6283
 
6233
6284
  // src/management/components/SeedPacksTab.tsx
6234
6285
  import { jsx as jsx8, jsxs as jsxs8 } from "react/jsx-runtime";
@@ -6264,10 +6315,23 @@ var getPreviewSnippet = (content) => {
6264
6315
  }
6265
6316
  return trimmed.length > 120 ? `${trimmed.slice(0, 120)}...` : trimmed;
6266
6317
  };
6318
+ var getImportedFileKey = (file) => (file.relativePath ?? file.name).toLowerCase();
6319
+ var isMarkdownFileName = (name) => {
6320
+ const lower = name.toLowerCase();
6321
+ return lower.endsWith(".md") || lower.endsWith(".markdown");
6322
+ };
6323
+ var getWebkitRelativePath = (file) => {
6324
+ const relativePath = file.webkitRelativePath;
6325
+ if (!relativePath) {
6326
+ return void 0;
6327
+ }
6328
+ const trimmed = relativePath.trim().replace(/^\/+/, "");
6329
+ return trimmed.length > 0 ? trimmed : void 0;
6330
+ };
6267
6331
  var mergeMarkdownFiles = (existing, incoming) => {
6268
6332
  const next = [...existing];
6269
6333
  incoming.forEach((file) => {
6270
- const index = next.findIndex((item) => item.name === file.name);
6334
+ const index = next.findIndex((item) => getImportedFileKey(item) === getImportedFileKey(file));
6271
6335
  if (index >= 0) {
6272
6336
  next[index] = file;
6273
6337
  } else {
@@ -6279,17 +6343,22 @@ var mergeMarkdownFiles = (existing, incoming) => {
6279
6343
  var buildMarkdownContent = (files) => {
6280
6344
  return files.map((file) => file.content.trim()).filter((content) => content.length > 0).join("\n\n---\n\n");
6281
6345
  };
6282
- var readMarkdownFiles = async (files) => {
6346
+ var readMarkdownFiles = async (files, source = "local") => {
6283
6347
  const list = Array.from(files);
6284
- const markdownFiles = list.filter((file) => file.name.toLowerCase().endsWith(".md"));
6348
+ const markdownFiles = list.filter((file) => isMarkdownFileName(file.name));
6285
6349
  const imported = await Promise.all(
6286
- markdownFiles.map(async (file) => ({
6287
- id: `${file.name}-${file.lastModified}`,
6288
- name: file.name,
6289
- size: file.size,
6290
- content: await file.text(),
6291
- lastModified: file.lastModified
6292
- }))
6350
+ markdownFiles.map(async (file) => {
6351
+ const relativePath = getWebkitRelativePath(file);
6352
+ return {
6353
+ id: `${source}-${relativePath ?? file.name}-${file.lastModified}-${file.size}`,
6354
+ name: file.name,
6355
+ size: file.size,
6356
+ content: await file.text(),
6357
+ lastModified: file.lastModified,
6358
+ relativePath,
6359
+ source
6360
+ };
6361
+ })
6293
6362
  );
6294
6363
  return { imported, skipped: list.length - markdownFiles.length };
6295
6364
  };
@@ -6405,7 +6474,7 @@ var SeedPackFileCard = ({ file, onPreview, onRemove, isReadOnly }) => /* @__PURE
6405
6474
  )
6406
6475
  }
6407
6476
  ),
6408
- /* @__PURE__ */ jsx8(Tooltip2, { title: file.name, arrow: true, children: /* @__PURE__ */ jsx8(
6477
+ /* @__PURE__ */ jsx8(Tooltip2, { title: file.relativePath ?? file.name, arrow: true, children: /* @__PURE__ */ jsx8(
6409
6478
  Typography8,
6410
6479
  {
6411
6480
  variant: "body2",
@@ -6422,6 +6491,21 @@ var SeedPackFileCard = ({ file, onPreview, onRemove, isReadOnly }) => /* @__PURE
6422
6491
  children: file.name
6423
6492
  }
6424
6493
  ) }),
6494
+ file.relativePath && file.relativePath !== file.name && /* @__PURE__ */ jsx8(Tooltip2, { title: file.relativePath, arrow: true, children: /* @__PURE__ */ jsx8(
6495
+ Typography8,
6496
+ {
6497
+ variant: "caption",
6498
+ color: "text.secondary",
6499
+ sx: {
6500
+ display: "block",
6501
+ whiteSpace: "nowrap",
6502
+ overflow: "hidden",
6503
+ textOverflow: "ellipsis",
6504
+ mb: 1
6505
+ },
6506
+ children: file.relativePath
6507
+ }
6508
+ ) }),
6425
6509
  /* @__PURE__ */ jsxs8(
6426
6510
  Box8,
6427
6511
  {
@@ -6438,7 +6522,7 @@ var SeedPackFileCard = ({ file, onPreview, onRemove, isReadOnly }) => /* @__PURE
6438
6522
  Chip6,
6439
6523
  {
6440
6524
  icon: /* @__PURE__ */ jsx8(PersonIcon2, { sx: { fontSize: "0.9rem !important" } }),
6441
- label: "Local",
6525
+ label: file.source === "azure-wiki" ? "Azure Wiki" : "Local",
6442
6526
  size: "small",
6443
6527
  sx: {
6444
6528
  bgcolor: "#388e3c20",
@@ -6527,16 +6611,20 @@ var SeedPacksTab = () => {
6527
6611
  const [createImportedFiles, setCreateImportedFiles] = useState9([]);
6528
6612
  const [previewFile, setPreviewFile] = useState9(null);
6529
6613
  const fileInputRef = useRef5(null);
6614
+ const wikiFolderInputRef = useRef5(null);
6530
6615
  const createFileInputRef = useRef5(null);
6616
+ const createWikiFolderInputRef = useRef5(null);
6531
6617
  const [isLoadingList, setIsLoadingList] = useState9(false);
6532
6618
  const [isLoadingDetail, setIsLoadingDetail] = useState9(false);
6533
6619
  const [isSaving, setIsSaving] = useState9(false);
6534
6620
  const [isPublishing, setIsPublishing] = useState9(false);
6535
6621
  const [isArchiving, setIsArchiving] = useState9(false);
6622
+ const [isDeleting, setIsDeleting] = useState9(false);
6536
6623
  const [isCreating, setIsCreating] = useState9(false);
6537
6624
  const [createDialogOpen, setCreateDialogOpen] = useState9(false);
6538
6625
  const [publishDialogOpen, setPublishDialogOpen] = useState9(false);
6539
6626
  const [archiveDialogOpen, setArchiveDialogOpen] = useState9(false);
6627
+ const [deleteDialogOpen, setDeleteDialogOpen] = useState9(false);
6540
6628
  const [newPackName, setNewPackName] = useState9("");
6541
6629
  const [newPackDescription, setNewPackDescription] = useState9("");
6542
6630
  const [newPackTags, setNewPackTags] = useState9("");
@@ -6641,26 +6729,37 @@ var SeedPacksTab = () => {
6641
6729
  void loadSeedPackDetail(selectedSid);
6642
6730
  }
6643
6731
  }, [selectedSid, loadSeedPackDetail]);
6732
+ useEffect6(() => {
6733
+ const setDirectoryUploadAttributes = (input) => {
6734
+ if (!input) {
6735
+ return;
6736
+ }
6737
+ input.setAttribute("webkitdirectory", "");
6738
+ input.setAttribute("directory", "");
6739
+ };
6740
+ setDirectoryUploadAttributes(wikiFolderInputRef.current);
6741
+ setDirectoryUploadAttributes(createWikiFolderInputRef.current);
6742
+ }, [selectedSeedPack, createDialogOpen]);
6644
6743
  const handleSelectPack = (pack) => {
6645
6744
  setSelectedSid(pack.sid);
6646
6745
  setSelectedSeedPack(pack);
6647
6746
  hydrateDraft(pack);
6648
6747
  };
6649
6748
  const handleImportFiles = useCallback6(
6650
- async (files) => {
6749
+ async (files, source = "local") => {
6651
6750
  if (!files || files.length === 0) {
6652
6751
  return;
6653
6752
  }
6654
- const { imported, skipped } = await readMarkdownFiles(files);
6753
+ const { imported, skipped } = await readMarkdownFiles(files, source);
6655
6754
  if (skipped > 0) {
6656
- showSnackbar("Only .md files are supported for seed packs.", "error");
6755
+ showSnackbar("Only .md and .markdown files are supported for seed packs.", "error");
6657
6756
  }
6658
6757
  if (imported.length === 0) {
6659
6758
  return;
6660
6759
  }
6661
6760
  try {
6662
6761
  const newlyAdded = imported.filter(
6663
- (file) => !importedFiles.some((existing) => existing.name === file.name)
6762
+ (file) => !importedFiles.some((existing) => getImportedFileKey(existing) === getImportedFileKey(file))
6664
6763
  );
6665
6764
  setImportedFiles((prev) => mergeMarkdownFiles(prev, imported));
6666
6765
  const combined = buildMarkdownContent(newlyAdded);
@@ -6675,8 +6774,9 @@ ${combined}` : combined;
6675
6774
  return { ...prev, content: nextContent };
6676
6775
  });
6677
6776
  }
6777
+ const importLabel = source === "azure-wiki" ? "from Azure DevOps wiki folder into the editor" : "into the editor";
6678
6778
  showSnackbar(
6679
- `Imported ${imported.length} markdown file${imported.length === 1 ? "" : "s"} into the editor.`,
6779
+ `Imported ${imported.length} markdown file${imported.length === 1 ? "" : "s"} ${importLabel}.`,
6680
6780
  "success"
6681
6781
  );
6682
6782
  } catch (error) {
@@ -6690,7 +6790,14 @@ ${combined}` : combined;
6690
6790
  );
6691
6791
  const handleFileInputChange = useCallback6(
6692
6792
  async (event) => {
6693
- await handleImportFiles(event.target.files);
6793
+ await handleImportFiles(event.target.files, "local");
6794
+ event.target.value = "";
6795
+ },
6796
+ [handleImportFiles]
6797
+ );
6798
+ const handleWikiFolderInputChange = useCallback6(
6799
+ async (event) => {
6800
+ await handleImportFiles(event.target.files, "azure-wiki");
6694
6801
  event.target.value = "";
6695
6802
  },
6696
6803
  [handleImportFiles]
@@ -6699,20 +6806,21 @@ ${combined}` : combined;
6699
6806
  setImportedFiles((prev) => prev.filter((file) => file.id !== id));
6700
6807
  }, []);
6701
6808
  const handleCreateImportFiles = useCallback6(
6702
- async (files) => {
6809
+ async (files, source = "local") => {
6703
6810
  if (!files || files.length === 0) {
6704
6811
  return;
6705
6812
  }
6706
- const { imported, skipped } = await readMarkdownFiles(files);
6813
+ const { imported, skipped } = await readMarkdownFiles(files, source);
6707
6814
  if (skipped > 0) {
6708
- showSnackbar("Only .md files are supported for seed packs.", "error");
6815
+ showSnackbar("Only .md and .markdown files are supported for seed packs.", "error");
6709
6816
  }
6710
6817
  if (imported.length === 0) {
6711
6818
  return;
6712
6819
  }
6713
6820
  setCreateImportedFiles((prev) => mergeMarkdownFiles(prev, imported));
6821
+ const importLabel = source === "azure-wiki" ? "from Azure DevOps wiki folder for this seed pack" : "for this seed pack";
6714
6822
  showSnackbar(
6715
- `Imported ${imported.length} markdown file${imported.length === 1 ? "" : "s"} for this seed pack.`,
6823
+ `Imported ${imported.length} markdown file${imported.length === 1 ? "" : "s"} ${importLabel}.`,
6716
6824
  "success"
6717
6825
  );
6718
6826
  },
@@ -6720,7 +6828,14 @@ ${combined}` : combined;
6720
6828
  );
6721
6829
  const handleCreateFileInputChange = useCallback6(
6722
6830
  async (event) => {
6723
- await handleCreateImportFiles(event.target.files);
6831
+ await handleCreateImportFiles(event.target.files, "local");
6832
+ event.target.value = "";
6833
+ },
6834
+ [handleCreateImportFiles]
6835
+ );
6836
+ const handleCreateWikiFolderInputChange = useCallback6(
6837
+ async (event) => {
6838
+ await handleCreateImportFiles(event.target.files, "azure-wiki");
6724
6839
  event.target.value = "";
6725
6840
  },
6726
6841
  [handleCreateImportFiles]
@@ -6865,6 +6980,34 @@ ${combined}` : combined;
6865
6980
  setIsArchiving(false);
6866
6981
  }
6867
6982
  };
6983
+ const handleDelete = async () => {
6984
+ if (!selectedSeedPack) {
6985
+ return;
6986
+ }
6987
+ const deletingSid = selectedSeedPack.sid;
6988
+ const deletingName = selectedSeedPack.name;
6989
+ setDeleteDialogOpen(false);
6990
+ setIsDeleting(true);
6991
+ try {
6992
+ await deleteSeedPack(deletingSid);
6993
+ setSelectedSid(null);
6994
+ setSelectedSeedPack(null);
6995
+ setDraft({ name: "", description: "", content: "" });
6996
+ setTagsInput("");
6997
+ setImportedFiles([]);
6998
+ setPreviewFile(null);
6999
+ await refreshSeedPacks();
7000
+ showSnackbar(`Deleted seed pack "${deletingName}".`, "success");
7001
+ } catch (error) {
7002
+ showSnackbar("Failed to delete seed pack.", "error");
7003
+ debugLogger.error("SeedPacksTab: failed to delete seed pack", {
7004
+ sid: deletingSid,
7005
+ error: error instanceof Error ? error.message : String(error)
7006
+ });
7007
+ } finally {
7008
+ setIsDeleting(false);
7009
+ }
7010
+ };
6868
7011
  const previewContent = draft.content.trim().length > 0 ? draft.content : "Preview will appear here as you type.";
6869
7012
  const selectedStatus = selectedSeedPack?.status ?? "draft";
6870
7013
  const statusChip = getStatusChip(selectedStatus);
@@ -7066,32 +7209,56 @@ ${combined}` : combined;
7066
7209
  sx: { mb: 1 },
7067
7210
  children: [
7068
7211
  /* @__PURE__ */ jsx8(Typography8, { variant: "subtitle2", children: "Markdown content" }),
7212
+ /* @__PURE__ */ jsxs8(Stack3, { direction: { xs: "column", sm: "row" }, spacing: 1, children: [
7213
+ /* @__PURE__ */ jsx8(
7214
+ Button7,
7215
+ {
7216
+ size: "small",
7217
+ variant: "outlined",
7218
+ startIcon: /* @__PURE__ */ jsx8(UploadFileIcon2, {}),
7219
+ onClick: () => fileInputRef.current?.click(),
7220
+ disabled: isReadOnly,
7221
+ children: "Import .md"
7222
+ }
7223
+ ),
7224
+ /* @__PURE__ */ jsx8(
7225
+ Button7,
7226
+ {
7227
+ size: "small",
7228
+ variant: "outlined",
7229
+ startIcon: /* @__PURE__ */ jsx8(FolderOpenIcon, {}),
7230
+ onClick: () => wikiFolderInputRef.current?.click(),
7231
+ disabled: isReadOnly,
7232
+ children: "Import wiki folder"
7233
+ }
7234
+ )
7235
+ ] }),
7069
7236
  /* @__PURE__ */ jsx8(
7070
- Button7,
7237
+ "input",
7071
7238
  {
7072
- size: "small",
7073
- variant: "outlined",
7074
- startIcon: /* @__PURE__ */ jsx8(UploadFileIcon2, {}),
7075
- onClick: () => fileInputRef.current?.click(),
7076
- disabled: isReadOnly,
7077
- children: "Import .md"
7239
+ ref: fileInputRef,
7240
+ type: "file",
7241
+ accept: ".md,.markdown,text/markdown",
7242
+ multiple: true,
7243
+ onChange: handleFileInputChange,
7244
+ style: { display: "none" }
7078
7245
  }
7079
7246
  ),
7080
7247
  /* @__PURE__ */ jsx8(
7081
7248
  "input",
7082
7249
  {
7083
- ref: fileInputRef,
7250
+ ref: wikiFolderInputRef,
7084
7251
  type: "file",
7085
- accept: ".md",
7252
+ accept: ".md,.markdown,text/markdown",
7086
7253
  multiple: true,
7087
- onChange: handleFileInputChange,
7254
+ onChange: handleWikiFolderInputChange,
7088
7255
  style: { display: "none" }
7089
7256
  }
7090
7257
  )
7091
7258
  ]
7092
7259
  }
7093
7260
  ),
7094
- /* @__PURE__ */ jsx8(Typography8, { variant: "caption", color: "text.secondary", sx: { mb: 1, display: "block" }, children: "Paste or import markdown files. Imports copy content into the editor." }),
7261
+ /* @__PURE__ */ jsx8(Typography8, { variant: "caption", color: "text.secondary", sx: { mb: 1, display: "block" }, children: "Paste or import markdown files. Use folder import for Azure DevOps wiki clones." }),
7095
7262
  /* @__PURE__ */ jsx8(
7096
7263
  TextField5,
7097
7264
  {
@@ -7190,6 +7357,17 @@ ${combined}` : combined;
7190
7357
  disabled: isReadOnly || isArchiving,
7191
7358
  children: isArchiving ? "Archiving..." : "Archive"
7192
7359
  }
7360
+ ),
7361
+ /* @__PURE__ */ jsx8(
7362
+ Button7,
7363
+ {
7364
+ variant: "text",
7365
+ color: "error",
7366
+ startIcon: /* @__PURE__ */ jsx8(DeleteIcon3, {}),
7367
+ onClick: () => setDeleteDialogOpen(true),
7368
+ disabled: isDeleting,
7369
+ children: isDeleting ? "Deleting..." : "Delete"
7370
+ }
7193
7371
  )
7194
7372
  ] })
7195
7373
  ] })
@@ -7239,26 +7417,50 @@ ${combined}` : combined;
7239
7417
  ),
7240
7418
  /* @__PURE__ */ jsx8(Divider, {}),
7241
7419
  /* @__PURE__ */ jsxs8(Stack3, { direction: { xs: "column", sm: "row" }, spacing: 1, alignItems: "center", children: [
7420
+ /* @__PURE__ */ jsxs8(Stack3, { direction: { xs: "column", sm: "row" }, spacing: 1, children: [
7421
+ /* @__PURE__ */ jsx8(
7422
+ Button7,
7423
+ {
7424
+ size: "small",
7425
+ variant: "outlined",
7426
+ startIcon: /* @__PURE__ */ jsx8(UploadFileIcon2, {}),
7427
+ onClick: () => createFileInputRef.current?.click(),
7428
+ disabled: !canManage,
7429
+ children: "Import .md files"
7430
+ }
7431
+ ),
7432
+ /* @__PURE__ */ jsx8(
7433
+ Button7,
7434
+ {
7435
+ size: "small",
7436
+ variant: "outlined",
7437
+ startIcon: /* @__PURE__ */ jsx8(FolderOpenIcon, {}),
7438
+ onClick: () => createWikiFolderInputRef.current?.click(),
7439
+ disabled: !canManage,
7440
+ children: "Import wiki folder"
7441
+ }
7442
+ )
7443
+ ] }),
7444
+ /* @__PURE__ */ jsx8(Typography8, { variant: "caption", color: "text.secondary", children: "Optional. Local files or cloned Azure DevOps wiki folders are merged into draft content." }),
7242
7445
  /* @__PURE__ */ jsx8(
7243
- Button7,
7446
+ "input",
7244
7447
  {
7245
- size: "small",
7246
- variant: "outlined",
7247
- startIcon: /* @__PURE__ */ jsx8(UploadFileIcon2, {}),
7248
- onClick: () => createFileInputRef.current?.click(),
7249
- disabled: !canManage,
7250
- children: "Import .md files"
7448
+ ref: createFileInputRef,
7449
+ type: "file",
7450
+ accept: ".md,.markdown,text/markdown",
7451
+ multiple: true,
7452
+ onChange: handleCreateFileInputChange,
7453
+ style: { display: "none" }
7251
7454
  }
7252
7455
  ),
7253
- /* @__PURE__ */ jsx8(Typography8, { variant: "caption", color: "text.secondary", children: "Optional. Files are merged into the draft content." }),
7254
7456
  /* @__PURE__ */ jsx8(
7255
7457
  "input",
7256
7458
  {
7257
- ref: createFileInputRef,
7459
+ ref: createWikiFolderInputRef,
7258
7460
  type: "file",
7259
- accept: ".md",
7461
+ accept: ".md,.markdown,text/markdown",
7260
7462
  multiple: true,
7261
- onChange: handleCreateFileInputChange,
7463
+ onChange: handleCreateWikiFolderInputChange,
7262
7464
  style: { display: "none" }
7263
7465
  }
7264
7466
  )
@@ -7323,6 +7525,21 @@ ${combined}` : combined;
7323
7525
  /* @__PURE__ */ jsx8(Button7, { variant: "contained", color: "error", onClick: handleArchive, disabled: isArchiving, children: isArchiving ? "Archiving..." : "Archive" })
7324
7526
  ] })
7325
7527
  ] }),
7528
+ /* @__PURE__ */ jsxs8(Dialog6, { open: deleteDialogOpen, onClose: () => setDeleteDialogOpen(false), maxWidth: "sm", fullWidth: true, children: [
7529
+ /* @__PURE__ */ jsx8(DialogTitle5, { children: "Delete seed pack" }),
7530
+ /* @__PURE__ */ jsxs8(DialogContent6, { children: [
7531
+ /* @__PURE__ */ jsxs8(DialogContentText3, { children: [
7532
+ 'Delete "',
7533
+ selectedSeedPack?.name ?? "this seed pack",
7534
+ '" permanently from this scope. Published versions and draft content will no longer be available.'
7535
+ ] }),
7536
+ /* @__PURE__ */ jsx8(Alert7, { severity: "warning", sx: { mt: 2 }, children: "This action cannot be undone." })
7537
+ ] }),
7538
+ /* @__PURE__ */ jsxs8(DialogActions5, { children: [
7539
+ /* @__PURE__ */ jsx8(Button7, { onClick: () => setDeleteDialogOpen(false), children: "Cancel" }),
7540
+ /* @__PURE__ */ jsx8(Button7, { variant: "contained", color: "error", onClick: handleDelete, disabled: isDeleting, children: isDeleting ? "Deleting..." : "Delete" })
7541
+ ] })
7542
+ ] }),
7326
7543
  /* @__PURE__ */ jsxs8(
7327
7544
  Dialog6,
7328
7545
  {
@@ -8103,15 +8320,7 @@ var StorageTab = ({ currentTheme }) => {
8103
8320
  ] }) })
8104
8321
  ] }),
8105
8322
  /* @__PURE__ */ jsx10(Typography9, { variant: "h6", gutterBottom: true, sx: { mb: 2, fontWeight: 600, color: "text.primary" }, children: "Storage Categories" }),
8106
- /* @__PURE__ */ jsx10(Box10, { sx: {
8107
- maxHeight: "60vh",
8108
- overflow: "auto",
8109
- "&::-webkit-scrollbar": {
8110
- display: "none"
8111
- },
8112
- msOverflowStyle: "none",
8113
- scrollbarWidth: "none"
8114
- }, children: storageCategories.length === 0 ? /* @__PURE__ */ jsxs10(Alert8, { severity: "info", sx: { mt: 2 }, children: [
8323
+ /* @__PURE__ */ jsx10(Box10, { children: storageCategories.length === 0 ? /* @__PURE__ */ jsxs10(Alert8, { severity: "info", sx: { mt: 2 }, children: [
8115
8324
  /* @__PURE__ */ jsx10(Typography9, { variant: "body2", children: "No storage data found. This could mean:" }),
8116
8325
  /* @__PURE__ */ jsxs10(Typography9, { variant: "body2", component: "ul", sx: { mt: 1, pl: 2 }, children: [
8117
8326
  /* @__PURE__ */ jsx10("li", { children: "All databases are empty" }),
@@ -9286,7 +9495,7 @@ var MCPToolsTabV2_default = MCPToolsTabV2;
9286
9495
 
9287
9496
  // src/management/management.tsx
9288
9497
  import { jsx as jsx13, jsxs as jsxs13 } from "react/jsx-runtime";
9289
- var preloadChatPage = () => import("./chat-CQWZOJH4.mjs");
9498
+ var preloadChatPage = () => import("./chat-YWYLVKXX.mjs");
9290
9499
  var buildCapabilitiesUrl = (gatewayApiUrl) => {
9291
9500
  const trimmed = gatewayApiUrl.replace(/\/$/, "");
9292
9501
  if (trimmed.endsWith("/api")) {
@@ -9341,7 +9550,7 @@ var Management = () => {
9341
9550
  const [modalOpen, setModalOpen] = useState14(false);
9342
9551
  const banditHead = "https://cdn.burtson.ai/images/bandit-head.png";
9343
9552
  const [fabLogo, setFabLogo] = useState14(banditHead);
9344
- const [tabIndex, setTabIndex] = useState14(0);
9553
+ const [tabIndex, setTabIndex] = useState14(4);
9345
9554
  const [logoFile, setLogoFile] = useState14(null);
9346
9555
  const [logoBase64, setLogoBase64] = useState14(null);
9347
9556
  const [brandingText, setBrandingText] = useState14("");
@@ -10054,7 +10263,6 @@ var Management = () => {
10054
10263
  }
10055
10264
  });
10056
10265
  }, [theme]);
10057
- if (!brandingLoaded) return null;
10058
10266
  const allNavTabs = [
10059
10267
  {
10060
10268
  label: "Personalities",
@@ -10111,6 +10319,18 @@ var Management = () => {
10111
10319
  }
10112
10320
  return true;
10113
10321
  });
10322
+ const preferredDefaultTabIndex = navTabs.findIndex((tab) => tab.label === "Preferences");
10323
+ const defaultTabIndex = preferredDefaultTabIndex >= 0 ? preferredDefaultTabIndex : 0;
10324
+ useEffect11(() => {
10325
+ setTabIndex((current) => {
10326
+ if (current < 0 || current >= navTabs.length) {
10327
+ return defaultTabIndex;
10328
+ }
10329
+ return current;
10330
+ });
10331
+ }, [navTabs.length, defaultTabIndex]);
10332
+ const mobileQuickTabs = navTabs.slice(0, 5);
10333
+ const hasMobileOverflowTabs = navTabs.length > mobileQuickTabs.length;
10114
10334
  const navigationContent = /* @__PURE__ */ jsxs13(
10115
10335
  Box13,
10116
10336
  {
@@ -10267,6 +10487,7 @@ var Management = () => {
10267
10487
  ]
10268
10488
  }
10269
10489
  );
10490
+ if (!brandingLoaded) return null;
10270
10491
  return /* @__PURE__ */ jsxs13(ThemeProvider, { theme: currentTheme, children: [
10271
10492
  /* @__PURE__ */ jsx13(CssBaseline, {}),
10272
10493
  /* @__PURE__ */ jsxs13(
@@ -10287,7 +10508,7 @@ var Management = () => {
10287
10508
  {
10288
10509
  sx: {
10289
10510
  width: "100%",
10290
- height: 64,
10511
+ minHeight: 64,
10291
10512
  display: "flex",
10292
10513
  alignItems: "center",
10293
10514
  justifyContent: "space-between",
@@ -10370,6 +10591,73 @@ var Management = () => {
10370
10591
  ]
10371
10592
  }
10372
10593
  ),
10594
+ isMobile && /* @__PURE__ */ jsxs13(
10595
+ Box13,
10596
+ {
10597
+ sx: {
10598
+ width: "100%",
10599
+ display: "flex",
10600
+ gap: 1,
10601
+ px: 1.5,
10602
+ py: 1,
10603
+ overflowX: "auto",
10604
+ borderBottom: (theme2) => `1px solid ${theme2.palette.divider}`,
10605
+ bgcolor: (theme2) => theme2.palette.mode === "dark" ? "rgba(24,28,40,0.95)" : "rgba(255,255,255,0.95)",
10606
+ backdropFilter: "blur(12px)"
10607
+ },
10608
+ children: [
10609
+ mobileQuickTabs.map((tab) => {
10610
+ const quickTabIndex = navTabs.findIndex((navTab) => navTab.label === tab.label);
10611
+ const selected = tabIndex === quickTabIndex;
10612
+ return /* @__PURE__ */ jsx13(
10613
+ Button10,
10614
+ {
10615
+ size: "small",
10616
+ onClick: () => setTabIndex(quickTabIndex),
10617
+ sx: {
10618
+ flexShrink: 0,
10619
+ textTransform: "none",
10620
+ borderRadius: 999,
10621
+ px: 1.5,
10622
+ py: 0.6,
10623
+ minHeight: 32,
10624
+ fontSize: "0.78rem",
10625
+ fontWeight: selected ? 700 : 600,
10626
+ bgcolor: selected ? (theme2) => theme2.palette.mode === "dark" ? "rgba(25,118,210,0.2)" : "rgba(25,118,210,0.12)" : "transparent",
10627
+ color: selected ? "primary.main" : "text.secondary",
10628
+ border: (theme2) => selected ? `1px solid ${theme2.palette.primary.main}66` : `1px solid ${alpha2(theme2.palette.divider, 0.45)}`,
10629
+ "&:hover": {
10630
+ bgcolor: (theme2) => theme2.palette.mode === "dark" ? "rgba(25,118,210,0.16)" : "rgba(25,118,210,0.1)"
10631
+ }
10632
+ },
10633
+ children: tab.label
10634
+ },
10635
+ tab.label
10636
+ );
10637
+ }),
10638
+ hasMobileOverflowTabs && /* @__PURE__ */ jsx13(
10639
+ Button10,
10640
+ {
10641
+ size: "small",
10642
+ onClick: () => setSidebarOpen(true),
10643
+ sx: {
10644
+ flexShrink: 0,
10645
+ textTransform: "none",
10646
+ borderRadius: 999,
10647
+ px: 1.5,
10648
+ py: 0.6,
10649
+ minHeight: 32,
10650
+ fontSize: "0.78rem",
10651
+ fontWeight: 600,
10652
+ color: "text.secondary",
10653
+ border: (theme2) => `1px dashed ${alpha2(theme2.palette.divider, 0.6)}`
10654
+ },
10655
+ children: "More"
10656
+ }
10657
+ )
10658
+ ]
10659
+ }
10660
+ ),
10373
10661
  isMobile ? /* @__PURE__ */ jsx13(
10374
10662
  SwipeableDrawer,
10375
10663
  {
@@ -10422,26 +10710,17 @@ var Management = () => {
10422
10710
  flex: 1,
10423
10711
  p: { xs: 1, sm: 3, md: 4 },
10424
10712
  overflowY: "auto",
10425
- height: isMobile ? "auto" : "100vh",
10713
+ overflowX: "hidden",
10426
10714
  maxWidth: "100vw",
10427
10715
  minWidth: 0,
10716
+ minHeight: 0,
10428
10717
  display: "flex",
10429
10718
  flexDirection: "column",
10430
10719
  bgcolor: "background.default",
10431
10720
  ml: isMobile ? 0 : "280px",
10432
10721
  // Fixed left margin only on desktop
10433
10722
  mt: 0,
10434
- transition: "margin-left 0.2s",
10435
- overflow: "auto",
10436
- // Hide scrollbars while keeping scroll functionality
10437
- scrollbarWidth: "none",
10438
- // Firefox
10439
- "&::-webkit-scrollbar": {
10440
- display: "none"
10441
- // Chrome, Safari, Edge
10442
- },
10443
- "-ms-overflow-style": "none"
10444
- // IE and Edge
10723
+ transition: "margin-left 0.2s"
10445
10724
  },
10446
10725
  children: [
10447
10726
  navTabs[tabIndex]?.label === "Personalities" && /* @__PURE__ */ jsx13(
@@ -10561,4 +10840,4 @@ export {
10561
10840
  useGatewayMemory,
10562
10841
  management_default
10563
10842
  };
10564
- //# sourceMappingURL=chunk-ZTTGERUG.mjs.map
10843
+ //# sourceMappingURL=chunk-Y5N3NSTU.mjs.map