@burtson-labs/bandit-engine 2.0.135 → 2.0.137

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-PWESOU56.mjs";
3
+ } from "./chunk-YPIUO3IS.mjs";
4
4
  import "./chunk-ONQMRE2G.mjs";
5
5
  import "./chunk-BVYSGIWG.mjs";
6
6
  import "./chunk-K2JGFKEB.mjs";
@@ -13,4 +13,4 @@ import "./chunk-BJTO5JO5.mjs";
13
13
  export {
14
14
  chat_default as default
15
15
  };
16
- //# sourceMappingURL=chat-MR4EO6ZD.mjs.map
16
+ //# sourceMappingURL=chat-REZJEBRK.mjs.map
@@ -9776,7 +9776,7 @@ var MCPToolsTabV2_default = MCPToolsTabV2;
9776
9776
 
9777
9777
  // src/management/management.tsx
9778
9778
  import { jsx as jsx14, jsxs as jsxs14 } from "react/jsx-runtime";
9779
- var preloadChatPage = () => import("./chat-MR4EO6ZD.mjs");
9779
+ var preloadChatPage = () => import("./chat-REZJEBRK.mjs");
9780
9780
  var buildCapabilitiesUrl = (gatewayApiUrl) => {
9781
9781
  const trimmed = gatewayApiUrl.replace(/\/$/, "");
9782
9782
  if (trimmed.endsWith("/api")) {
@@ -11149,4 +11149,4 @@ export {
11149
11149
  useGatewayMemory,
11150
11150
  management_default
11151
11151
  };
11152
- //# sourceMappingURL=chunk-A4AFGZMU.mjs.map
11152
+ //# sourceMappingURL=chunk-2L5DC4OI.mjs.map
@@ -1647,6 +1647,8 @@ ${sanitize(
1647
1647
  const hasFeedbackAction = isFeedbackEnabled && isMobile;
1648
1648
  const hasSttAction = isSTTAvailable && !isVoiceModeEnabled;
1649
1649
  const hasVoicePickerAction = isMobile && isTTSAvailable && availableVoices.length > 0;
1650
+ const hasComposeContent = !!inputValue.trim() || pastedImages.length > 0 || fileInputs.length > 0;
1651
+ const showSendButton = streamingActive || hasComposeContent || !isVoiceModeEligible;
1650
1652
  const hasSecondaryActions = isMobile && (hasAttachmentAction || hasMemoryAction || hasFeedbackAction || hasSttAction || hasVoicePickerAction);
1651
1653
  useEffect4(() => {
1652
1654
  if (!isMobile || !hasSecondaryActions) {
@@ -1711,6 +1713,33 @@ ${sanitize(
1711
1713
  if (!hasSttAction) return null;
1712
1714
  return /* @__PURE__ */ jsx9(Box6, { sx: { display: "flex", alignItems: "center" }, children: /* @__PURE__ */ jsx9(transcriber_default, { onTranscriptionCompleted: handleTranscriptionCompleted }) }, key ?? "stt");
1713
1715
  };
1716
+ const renderVoiceModeButton = (key) => /* @__PURE__ */ jsx9(
1717
+ Tooltip2,
1718
+ {
1719
+ title: !isVoiceModeEnabled ? "Enable voice mode" : voiceStatus === "error" ? voiceError || "Voice mode error" : voiceStatus === "processing" ? "Transcribing your speech" : voiceStatus === "recording" ? "Recording - click to stop" : voiceStatus === "initializing" ? "Preparing microphone" : "Listening - click to turn off",
1720
+ children: /* @__PURE__ */ jsx9(
1721
+ IconButton5,
1722
+ {
1723
+ onClick: toggleVoiceMode,
1724
+ sx: {
1725
+ width: sendIconSize,
1726
+ height: sendIconSize,
1727
+ borderRadius: "50%",
1728
+ bgcolor: isVoiceModeEnabled ? alpha3(theme.palette.error.main, theme.palette.mode === "dark" ? 0.45 : 0.3) : fileText,
1729
+ color: isVoiceModeEnabled ? theme.palette.common.white : fileIconBg,
1730
+ boxShadow: isVoiceModeEnabled && voiceStatus === "recording" ? `0 0 0 2px ${alpha3(theme.palette.error.main, 0.25)}` : "none",
1731
+ transform: isVoiceModeEnabled && voiceStatus === "recording" ? "scale(1.05)" : "none",
1732
+ transition: "transform 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease",
1733
+ "&:hover": {
1734
+ bgcolor: isVoiceModeEnabled ? alpha3(theme.palette.error.main, theme.palette.mode === "dark" ? 0.55 : 0.38) : hoverBadgeBackground
1735
+ }
1736
+ },
1737
+ children: !isVoiceModeEnabled ? /* @__PURE__ */ jsx9(GraphicEqIcon, { fontSize: "small" }) : voiceStatus === "processing" || voiceStatus === "initializing" ? /* @__PURE__ */ jsx9(CircularProgress2, { size: 18, sx: { color: theme.palette.common.white } }) : voiceStatus === "error" ? /* @__PURE__ */ jsx9(HearingDisabledIcon, { fontSize: "small", sx: { color: theme.palette.error.light } }) : voiceStatus === "recording" ? /* @__PURE__ */ jsx9(GraphicEqIcon, { fontSize: "small", sx: { color: theme.palette.error.light } }) : /* @__PURE__ */ jsx9(GraphicEqIcon, { fontSize: "small", sx: { color: theme.palette.common.white } })
1738
+ }
1739
+ )
1740
+ },
1741
+ key ?? "voice-mode"
1742
+ );
1714
1743
  const renderVoicePickerButton = (key) => {
1715
1744
  if (!hasVoicePickerAction) return null;
1716
1745
  return /* @__PURE__ */ jsx9(Tooltip2, { title: `Voice: ${selectedVoice ? toTitleCase(selectedVoice.split("-")[1] ?? selectedVoice) : "Default"}`, children: /* @__PURE__ */ jsx9(
@@ -1958,51 +1987,22 @@ ${sanitize(
1958
1987
  minHeight: primaryIconSize
1959
1988
  },
1960
1989
  children: [
1961
- isVoiceModeEligible && /* @__PURE__ */ jsxs6(Fragment5, { children: [
1962
- /* @__PURE__ */ jsx9(
1963
- Tooltip2,
1964
- {
1965
- title: !isVoiceModeEnabled ? "Enable voice mode" : voiceStatus === "error" ? voiceError || "Voice mode error" : voiceStatus === "processing" ? "Transcribing your speech" : voiceStatus === "recording" ? "Recording - click to stop" : voiceStatus === "initializing" ? "Preparing microphone" : "Listening - click to turn off",
1966
- children: /* @__PURE__ */ jsx9(
1967
- IconButton5,
1968
- {
1969
- onClick: toggleVoiceMode,
1970
- sx: {
1971
- width: primaryIconSize,
1972
- height: primaryIconSize,
1973
- borderRadius: "50%",
1974
- bgcolor: isVoiceModeEnabled ? alpha3(theme.palette.error.main, theme.palette.mode === "dark" ? 0.45 : 0.3) : badgeBackground,
1975
- color: isVoiceModeEnabled ? theme.palette.common.white : fileText,
1976
- boxShadow: isVoiceModeEnabled && voiceStatus === "recording" ? `0 0 0 2px ${alpha3(theme.palette.error.main, 0.25)}` : "none",
1977
- transform: isVoiceModeEnabled && voiceStatus === "recording" ? "scale(1.05)" : "none",
1978
- transition: "transform 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease",
1979
- "&:hover": {
1980
- bgcolor: isVoiceModeEnabled ? alpha3(theme.palette.error.main, theme.palette.mode === "dark" ? 0.55 : 0.38) : hoverBadgeBackground
1981
- }
1982
- },
1983
- children: !isVoiceModeEnabled ? /* @__PURE__ */ jsx9(GraphicEqIcon, { fontSize: "small", sx: { color: theme.palette.mode === "dark" ? fileText : theme.palette.text.secondary } }) : voiceStatus === "processing" || voiceStatus === "initializing" ? /* @__PURE__ */ jsx9(CircularProgress2, { size: 18, sx: { color: fileText } }) : voiceStatus === "error" ? /* @__PURE__ */ jsx9(HearingDisabledIcon, { fontSize: "small", sx: { color: theme.palette.error.light } }) : voiceStatus === "recording" ? /* @__PURE__ */ jsx9(GraphicEqIcon, { fontSize: "small", sx: { color: theme.palette.error.light } }) : /* @__PURE__ */ jsx9(GraphicEqIcon, { fontSize: "small", sx: { color: theme.palette.common.white } })
1984
- }
1985
- )
1986
- }
1987
- ),
1988
- !isMobile && isVoiceModeEnabled && /* @__PURE__ */ jsx9(
1989
- Typography3,
1990
- {
1991
- variant: "caption",
1992
- sx: {
1993
- color: voiceStatus === "error" ? theme.palette.error.main : voiceStatus === "processing" ? theme.palette.warning.main : fileText,
1994
- maxWidth: 240,
1995
- overflow: "hidden",
1996
- textOverflow: "ellipsis",
1997
- whiteSpace: "nowrap"
1998
- },
1999
- children: voiceStatus === "error" ? voiceError || "Voice mode unavailable" : voiceStatus === "initializing" ? "Starting voice mode..." : voiceStatus === "recording" ? "Recording..." : voiceStatus === "processing" ? "Transcribing..." : voiceLastTranscript ? `Heard: "${voiceLastTranscript.length > 60 ? `${voiceLastTranscript.slice(0, 57)}...` : voiceLastTranscript}"` : "Listening..."
2000
- }
2001
- )
2002
- ] }),
2003
1990
  !isMobile && renderAttachmentButton("attach-inline"),
2004
1991
  !isMobile && renderMemoryButton("memory-inline"),
2005
- !isMobile && renderSttButton("stt-inline"),
1992
+ !isMobile && isVoiceModeEligible && isVoiceModeEnabled && /* @__PURE__ */ jsx9(
1993
+ Typography3,
1994
+ {
1995
+ variant: "caption",
1996
+ sx: {
1997
+ color: voiceStatus === "error" ? theme.palette.error.main : voiceStatus === "processing" ? theme.palette.warning.main : fileText,
1998
+ maxWidth: 240,
1999
+ overflow: "hidden",
2000
+ textOverflow: "ellipsis",
2001
+ whiteSpace: "nowrap"
2002
+ },
2003
+ children: voiceStatus === "error" ? voiceError || "Voice mode unavailable" : voiceStatus === "initializing" ? "Starting voice mode..." : voiceStatus === "recording" ? "Recording..." : voiceStatus === "processing" ? "Transcribing..." : voiceLastTranscript ? `Heard: "${voiceLastTranscript.length > 60 ? `${voiceLastTranscript.slice(0, 57)}...` : voiceLastTranscript}"` : "Listening..."
2004
+ }
2005
+ ),
2006
2006
  isMobile && hasSecondaryActions && /* @__PURE__ */ jsx9(
2007
2007
  IconButton5,
2008
2008
  {
@@ -2058,7 +2058,9 @@ ${sanitize(
2058
2058
  ),
2059
2059
  /* @__PURE__ */ jsxs6(Box6, { sx: { display: "flex", alignItems: "center", gap: isMobile ? 0.6 : 1 }, children: [
2060
2060
  !isMobile && /* @__PURE__ */ jsx9(engine_picker_default, {}),
2061
- /* @__PURE__ */ jsx9(Tooltip2, { title: isStreaming ? "Stop response" : "Send message", children: /* @__PURE__ */ jsx9("span", { children: /* @__PURE__ */ jsx9(
2061
+ !isMobile && renderSttButton("stt-right"),
2062
+ isVoiceModeEligible && !showSendButton && renderVoiceModeButton("voice-right"),
2063
+ showSendButton && /* @__PURE__ */ jsx9(Tooltip2, { title: isStreaming ? "Stop response" : "Send message", children: /* @__PURE__ */ jsx9("span", { children: /* @__PURE__ */ jsx9(
2062
2064
  IconButton5,
2063
2065
  {
2064
2066
  onClick: isStreaming ? onStop || (() => {
@@ -11250,10 +11252,13 @@ var ChatContent = () => {
11250
11252
  // Claude iOS, where the card runs edge-to-edge vertically and the
11251
11253
  // hairline border keeps the corners legible. Width kept in sync
11252
11254
  // with the drawer in enhanced-mobile-conversations-modal.tsx.
11253
- // Claude iOS geometry: the card drops DOWN by the status-bar inset,
11254
- // so its big rounded top corners are visible below the clock while
11255
- // its bottom slides past the screen edge — no hard bottom line.
11256
- transform: isMobile && mobileConversationsOpen ? "translateX(min(calc(100vw - 56px), 360px)) translateY(calc(max(env(safe-area-inset-top, 0px), 20px) + 12px))" : "none",
11255
+ // iOS-sheet recede (Claude style): the card scales down anchored at
11256
+ // its bottom-left, so the rounded top corners appear inset below the
11257
+ // status area, the bottom stays flush with the screen edge, and the
11258
+ // motion reads as the native sheet-behind effect instead of the
11259
+ // content lurching downward.
11260
+ transform: isMobile && mobileConversationsOpen ? "translateX(min(calc(100vw - 56px), 360px)) scale(0.93)" : "none",
11261
+ transformOrigin: "left bottom",
11257
11262
  borderRadius: isMobile && mobileConversationsOpen ? "36px" : 0,
11258
11263
  // Hairline border so the rounded card reads even when the backdrop
11259
11264
  // is the same near-black as the shell.
@@ -11283,7 +11288,7 @@ var ChatContent = () => {
11283
11288
  sx: (theme) => ({
11284
11289
  position: "absolute",
11285
11290
  inset: isMobile ? "3px" : 0,
11286
- border: `2px solid ${theme.palette.mode === "dark" ? "rgba(255,255,255,0.35)" : "rgba(0,0,0,0.3)"}`,
11291
+ border: `3px solid ${theme.palette.mode === "dark" ? "rgba(255,255,255,0.55)" : "rgba(0,0,0,0.45)"}`,
11287
11292
  borderRadius: isMobile ? "28px" : "inherit",
11288
11293
  zIndex: 1400,
11289
11294
  pointerEvents: "none"
@@ -11567,4 +11572,4 @@ var chat_default = Chat;
11567
11572
  export {
11568
11573
  chat_default
11569
11574
  };
11570
- //# sourceMappingURL=chunk-PWESOU56.mjs.map
11575
+ //# sourceMappingURL=chunk-YPIUO3IS.mjs.map