-
-
-
- {
- removeMessage()
- }}
- >
-
-
-
-
- Delete
-
-
-
-
-
-
-
-
-
-
-
- Metadata
-
-
-
-
-
- Message Metadata
-
-
-
-
- Close
-
-
-
-
-
-
-
- {item.isLastMessage && (
+
+
+
{
+ removeMessage()
+ }}
>
-
+
- Regenerate
+ Delete
- )}
+
+
+
+
+
+
+
+
+
+ Metadata
+
+
+
+
+
+ Message Metadata
+
+
+
+
+ Close
+
+
+
+
+
+
+
+ {item.isLastMessage && (
+
+
+
+
+
+
+
+ Regenerate
+
+
+ )}
+
diff --git a/web-app/src/containers/TokenSpeedIndicator.tsx b/web-app/src/containers/TokenSpeedIndicator.tsx
index b1dfb841c..5309d890c 100644
--- a/web-app/src/containers/TokenSpeedIndicator.tsx
+++ b/web-app/src/containers/TokenSpeedIndicator.tsx
@@ -1,19 +1,28 @@
-import { IconBrandSpeedtest } from '@tabler/icons-react'
+import { useAppState } from '@/hooks/useAppState'
+import { Gauge } from 'lucide-react'
interface TokenSpeedIndicatorProps {
metadata?: Record
+ streaming?: boolean
}
export const TokenSpeedIndicator = ({
- metadata
+ metadata,
+ streaming,
}: TokenSpeedIndicatorProps) => {
- const persistedTokenSpeed = (metadata?.tokenSpeed as { tokenSpeed: number })?.tokenSpeed
+ const { tokenSpeed } = useAppState()
+ const persistedTokenSpeed = (metadata?.tokenSpeed as { tokenSpeed: number })
+ ?.tokenSpeed
return (
-
+
+
- {Math.round(persistedTokenSpeed)} tokens/sec
+ {Math.round(
+ streaming ? Number(tokenSpeed?.tokenSpeed) : persistedTokenSpeed
+ )}
+ tokens/sec
)
diff --git a/web-app/src/containers/dialogs/AppUpdater.tsx b/web-app/src/containers/dialogs/AppUpdater.tsx
index 02a84accb..a17876a15 100644
--- a/web-app/src/containers/dialogs/AppUpdater.tsx
+++ b/web-app/src/containers/dialogs/AppUpdater.tsx
@@ -22,8 +22,8 @@ const DialogAppUpdater = () => {
setRemindMeLater(true)
}
- const beta = VERSION.includes('beta')
const nightly = VERSION.includes('-')
+ const beta = VERSION.includes('beta')
const { release, fetchLatestRelease } = useReleaseNotes()
diff --git a/web-app/src/hooks/useAppearance.ts b/web-app/src/hooks/useAppearance.ts
index 60340e542..51a1ce10e 100644
--- a/web-app/src/hooks/useAppearance.ts
+++ b/web-app/src/hooks/useAppearance.ts
@@ -6,8 +6,10 @@ import { rgb, oklch, formatCss } from 'culori'
import { useTheme } from './useTheme'
export type FontSize = '14px' | '15px' | '16px' | '18px'
+export type ChatWidth = 'full' | 'compact'
interface AppearanceState {
+ chatWidth: ChatWidth
fontSize: FontSize
appBgColor: RgbaColor
appMainViewBgColor: RgbaColor
@@ -19,6 +21,7 @@ interface AppearanceState {
appAccentTextColor: string
appDestructiveTextColor: string
appLeftPanelTextColor: string
+ setChatWidth: (size: ChatWidth) => void
setFontSize: (size: FontSize) => void
setAppBgColor: (color: RgbaColor) => void
setAppMainViewBgColor: (color: RgbaColor) => void
@@ -129,6 +132,7 @@ export const useAppearance = create()(
persist(
(set) => {
return {
+ chatWidth: 'compact',
fontSize: defaultFontSize,
appBgColor: defaultAppBgColor,
appMainViewBgColor: defaultAppMainViewBgColor,
@@ -270,6 +274,10 @@ export const useAppearance = create()(
})
},
+ setChatWidth: (value: ChatWidth) => {
+ set({ chatWidth: value })
+ },
+
setFontSize: (size: FontSize) => {
// Update CSS variable
document.documentElement.style.setProperty('--font-size-base', size)
diff --git a/web-app/src/routes/settings/appearance.tsx b/web-app/src/routes/settings/appearance.tsx
index d59abb9b3..21b99c73e 100644
--- a/web-app/src/routes/settings/appearance.tsx
+++ b/web-app/src/routes/settings/appearance.tsx
@@ -18,6 +18,7 @@ import CodeBlockStyleSwitcher from '@/containers/CodeBlockStyleSwitcher'
import { LineNumbersSwitcher } from '@/containers/LineNumbersSwitcher'
import { CodeBlockExample } from '@/containers/CodeBlockExample'
import { toast } from 'sonner'
+import { ChatWidthSwitcher } from '@/containers/ChatWidthSwitcher'
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export const Route = createFileRoute(route.settings.appearance as any)({
@@ -98,6 +99,15 @@ function Appareances() {
/>
+ {/* Chat Message */}
+
+
+
+
+
{/* Codeblock */}
({
@@ -213,7 +213,12 @@ function ThreadDetail() {
'flex flex-col h-full w-full overflow-auto px-4 pt-4 pb-3'
)}
>
-
+
{messages &&
messages.map((item, index) => {
// Only pass isLastMessage to the last message in the array
@@ -247,7 +252,12 @@ function ThreadDetail() {
-