@burtson-labs/bandit-engine 2.0.60 → 2.0.61

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.
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  chat_default
3
- } from "./chunk-MFDMM5MS.mjs";
3
+ } from "./chunk-G7U2FNUK.mjs";
4
4
  import "./chunk-ONQMRE2G.mjs";
5
5
  import "./chunk-SRCCNBHF.mjs";
6
6
  import "./chunk-6QTTNYF2.mjs";
@@ -13,4 +13,4 @@ import "./chunk-BJTO5JO5.mjs";
13
13
  export {
14
14
  chat_default as default
15
15
  };
16
- //# sourceMappingURL=chat-NLBCURUN.mjs.map
16
+ //# sourceMappingURL=chat-E23BSMK5.mjs.map
@@ -1695,6 +1695,55 @@ function telemetryEndTurn(outcome) {
1695
1695
  void active?.endTurn(outcome);
1696
1696
  }
1697
1697
 
1698
+ // src/store/engineStore.ts
1699
+ import { create as create2 } from "zustand";
1700
+ var STORAGE_KEY = "bandit.selectedEngine";
1701
+ var readStored = () => {
1702
+ try {
1703
+ return typeof window !== "undefined" ? window.localStorage.getItem(STORAGE_KEY) : null;
1704
+ } catch {
1705
+ return null;
1706
+ }
1707
+ };
1708
+ var useEngineStore = create2((set, get) => ({
1709
+ selectedEngine: readStored(),
1710
+ engines: [],
1711
+ loaded: false,
1712
+ setSelectedEngine: (id) => {
1713
+ set({ selectedEngine: id });
1714
+ try {
1715
+ window.localStorage.setItem(STORAGE_KEY, id);
1716
+ } catch {
1717
+ }
1718
+ },
1719
+ getSelectedEngine: () => get().selectedEngine || usePackageSettingsStore.getState().settings?.defaultModel || "bandit-core",
1720
+ fetchEngines: async () => {
1721
+ const settings = usePackageSettingsStore.getState().settings;
1722
+ const base = settings?.gatewayApiUrl?.replace(/\/$/, "") ?? "";
1723
+ if (!base || settings?.playgroundMode || base.toLowerCase().startsWith("playground://")) {
1724
+ set({ loaded: true });
1725
+ return;
1726
+ }
1727
+ try {
1728
+ const headers = { "Content-Type": "application/json" };
1729
+ const token = authenticationService.getToken();
1730
+ if (token) headers["Authorization"] = `Bearer ${token}`;
1731
+ const res = await fetch(`${base}/models`, { headers });
1732
+ const data = await res.json();
1733
+ if (res.ok && Array.isArray(data?.models)) {
1734
+ set({ engines: data.models, loaded: true });
1735
+ } else {
1736
+ set({ loaded: true });
1737
+ }
1738
+ } catch (error) {
1739
+ debugLogger.error("Failed to fetch engines", {
1740
+ error: error instanceof Error ? error.message : String(error)
1741
+ });
1742
+ set({ loaded: true });
1743
+ }
1744
+ }
1745
+ }));
1746
+
1698
1747
  // src/chat/hooks/useMemoryEnhancer.tsx
1699
1748
  import { lastValueFrom, map as map2 } from "rxjs";
1700
1749
  var MEMORY_LIMIT = 100;
@@ -2747,7 +2796,7 @@ var useAIProvider = ({
2747
2796
  question: pendingQuestion,
2748
2797
  images: pendingImages
2749
2798
  });
2750
- const modelName = usePackageSettingsStore.getState().settings?.defaultModel || "bandit-core:4b-it-qat";
2799
+ const modelName = useEngineStore.getState().getSelectedEngine();
2751
2800
  const CONFIG = modelConfigs[modelName] ?? modelConfigs["bandit-core:4b-it-qat"];
2752
2801
  const base64Images = imageList.map((img) => img.split(",")[1]);
2753
2802
  const latestEntries = history.slice(-CONFIG.historyMessages);
@@ -7049,6 +7098,7 @@ var ChatAppBar = ({
7049
7098
  menuText
7050
7099
  } = theme.palette.chat.appBar;
7051
7100
  const [modelAnchorEl, setModelAnchorEl] = useState12(null);
7101
+ const [engineAnchorEl, setEngineAnchorEl] = useState12(null);
7052
7102
  const [voiceAnchorEl, setVoiceAnchorEl] = useState12(null);
7053
7103
  const [modalOpen, setModalOpen] = useState12(false);
7054
7104
  const [confirmModelChangeOpen, setConfirmModelChangeOpen] = useState12(false);
@@ -7169,6 +7219,14 @@ var ChatAppBar = ({
7169
7219
  const selectedModel = useModelStore((s) => s.selectedModel);
7170
7220
  const currentModel = useModelStore((s) => s.availableModels.find((m) => m.name === selectedModel));
7171
7221
  const currentAvatar = currentModel?.avatarBase64 || modelAvatars[selectedModel] || banditHead;
7222
+ const engines = useEngineStore((s) => s.engines);
7223
+ const selectedEngine = useEngineStore((s) => s.selectedEngine);
7224
+ const effectiveEngineId = selectedEngine || usePackageSettingsStore.getState().settings?.defaultModel || "bandit-core";
7225
+ const currentEngine = engines.find((e) => e.id === effectiveEngineId);
7226
+ const engineLabel = currentEngine?.displayName?.replace(/^Bandit /, "") || "Engine";
7227
+ useEffect11(() => {
7228
+ useEngineStore.getState().fetchEngines();
7229
+ }, []);
7172
7230
  const pendingModelAvatar = useModelStore.getState().availableModels.find((m) => m.name === pendingModel)?.avatarBase64 || modelAvatars[pendingModel || ""] || banditHead;
7173
7231
  const resolvedHomeUrl = preferences.homeUrl?.trim() || packageSettings?.homeUrl?.trim() || "";
7174
7232
  const homeTooltip = (() => {
@@ -7481,6 +7539,84 @@ var ChatAppBar = ({
7481
7539
  )
7482
7540
  }
7483
7541
  ) }),
7542
+ /* @__PURE__ */ jsx13(Tooltip4, { title: `Engine: ${currentEngine?.displayName ?? effectiveEngineId}`, arrow: true, children: /* @__PURE__ */ jsxs10(
7543
+ IconButton9,
7544
+ {
7545
+ onClick: (e) => setEngineAnchorEl(e.currentTarget),
7546
+ sx: pillButtonStyles,
7547
+ "aria-label": `Change base model (engine). Currently ${effectiveEngineId}`,
7548
+ children: [
7549
+ currentEngine?.cloud ? /* @__PURE__ */ jsx13(CloudDoneIcon, { fontSize: "small" }) : /* @__PURE__ */ jsx13(CloudOffIcon, { fontSize: "small" }),
7550
+ /* @__PURE__ */ jsx13(Typography8, { variant: "caption", sx: { ml: 0.75, fontWeight: 600, whiteSpace: "nowrap" }, children: engineLabel })
7551
+ ]
7552
+ }
7553
+ ) }),
7554
+ /* @__PURE__ */ jsxs10(
7555
+ Menu5,
7556
+ {
7557
+ anchorEl: engineAnchorEl,
7558
+ open: Boolean(engineAnchorEl),
7559
+ onClose: () => setEngineAnchorEl(null),
7560
+ transformOrigin: { horizontal: "right", vertical: "top" },
7561
+ anchorOrigin: { horizontal: "right", vertical: "bottom" },
7562
+ children: [
7563
+ /* @__PURE__ */ jsx13(Typography8, { variant: "overline", sx: { px: 2, color: theme.palette.text.secondary }, children: "Engine \xB7 base model" }),
7564
+ engines.length === 0 && /* @__PURE__ */ jsx13(MenuItem5, { disabled: true, children: /* @__PURE__ */ jsx13(Typography8, { variant: "body2", children: "No engines available" }) }),
7565
+ engines.map((engine) => {
7566
+ const badges = [
7567
+ engine.vision && "vision",
7568
+ engine.tools && "tools",
7569
+ engine.thinking && "thinking",
7570
+ engine.cloud && "cloud"
7571
+ ].filter(Boolean);
7572
+ return /* @__PURE__ */ jsxs10(
7573
+ MenuItem5,
7574
+ {
7575
+ selected: engine.id === effectiveEngineId,
7576
+ disabled: !engine.available,
7577
+ onClick: () => {
7578
+ useEngineStore.getState().setSelectedEngine(engine.id);
7579
+ setEngineAnchorEl(null);
7580
+ },
7581
+ sx: {
7582
+ display: "flex",
7583
+ flexDirection: "column",
7584
+ alignItems: "flex-start",
7585
+ gap: 0.5,
7586
+ py: 1,
7587
+ px: 2,
7588
+ maxWidth: 360,
7589
+ whiteSpace: "normal"
7590
+ },
7591
+ children: [
7592
+ /* @__PURE__ */ jsxs10(Box10, { sx: { display: "flex", alignItems: "center", gap: 1, width: "100%" }, children: [
7593
+ /* @__PURE__ */ jsx13(Typography8, { variant: "body2", sx: { fontWeight: 600, flex: 1 }, children: engine.displayName }),
7594
+ engine.id === effectiveEngineId && /* @__PURE__ */ jsx13(Box10, { sx: { width: 8, height: 8, borderRadius: "50%", bgcolor: theme.palette.primary.main } })
7595
+ ] }),
7596
+ /* @__PURE__ */ jsx13(Typography8, { variant: "caption", sx: { color: theme.palette.text.secondary }, children: engine.available ? engine.description : engine.unavailableReason || "Unavailable" }),
7597
+ badges.length > 0 && /* @__PURE__ */ jsx13(Box10, { sx: { display: "flex", gap: 0.5, flexWrap: "wrap", mt: 0.25 }, children: badges.map((b) => /* @__PURE__ */ jsx13(
7598
+ Box10,
7599
+ {
7600
+ sx: {
7601
+ fontSize: "0.65rem",
7602
+ px: 0.75,
7603
+ py: 0.1,
7604
+ borderRadius: 1,
7605
+ bgcolor: theme.palette.primary.main + "22",
7606
+ color: theme.palette.primary.main
7607
+ },
7608
+ children: b
7609
+ },
7610
+ b
7611
+ )) })
7612
+ ]
7613
+ },
7614
+ engine.id
7615
+ );
7616
+ })
7617
+ ]
7618
+ }
7619
+ ),
7484
7620
  /* @__PURE__ */ jsx13(
7485
7621
  Menu5,
7486
7622
  {
@@ -9586,4 +9722,4 @@ var chat_default = Chat;
9586
9722
  export {
9587
9723
  chat_default
9588
9724
  };
9589
- //# sourceMappingURL=chunk-MFDMM5MS.mjs.map
9725
+ //# sourceMappingURL=chunk-G7U2FNUK.mjs.map