From 580273bed0924ccf1eab38dfa0d7c51cf2f7f1cb Mon Sep 17 00:00:00 2001 From: Nikolas Syring Date: Sat, 20 Dec 2025 15:34:46 +0100 Subject: [PATCH] perf: Add performance optimizations and Tanuki avatar MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Frontend: - Add memoization to MessageList with custom comparison function - Implement incremental caching for processedMessages to avoid O(n) rebuilds during streaming - Wrap Message component with memo() - Add better error handling for file uploads in SessionContext Backend: - Improve upload error handling with proper response checks Infrastructure: - Add client_max_body_size 100m to nginx for file uploads - Add Tanuki avatar (optimized 256x256, 77KB) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- backend/server.js | 4 +- frontend/nginx.conf | 2 + frontend/public/tanuki-avatar.png | Bin 0 -> 76603 bytes frontend/src/components/MessageList.jsx | 63 ++++++- frontend/src/components/Sidebar.jsx | 85 +++++---- frontend/src/components/SplitLayout.jsx | 213 ++++++++++++----------- frontend/src/components/TabBar.jsx | 102 ++++++++--- frontend/src/contexts/SessionContext.jsx | 14 ++ 8 files changed, 307 insertions(+), 176 deletions(-) create mode 100644 frontend/public/tanuki-avatar.png diff --git a/backend/server.js b/backend/server.js index 50d30eb..62b6ffc 100644 --- a/backend/server.js +++ b/backend/server.js @@ -175,7 +175,9 @@ app.get('/api/hosts', requireAuth, (req, res) => { color: host.color, icon: host.icon, connectionType: host.connection.type, - isLocal: host.connection.type === 'local' + isLocal: host.connection.type === 'local', + basePaths: host.basePaths || [], + defaultPath: host.basePaths?.[0] || '/home' })); res.json({ hosts, defaultHost: hostsConfig.defaults?.host || 'neko' }); }); diff --git a/frontend/nginx.conf b/frontend/nginx.conf index db6af19..38e3853 100644 --- a/frontend/nginx.conf +++ b/frontend/nginx.conf @@ -19,6 +19,8 @@ server { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # Always HTTPS since NPM handles SSL termination (required for secure cookies) proxy_set_header X-Forwarded-Proto https; + # Allow file uploads up to 100MB + client_max_body_size 100m; } # Auth routes proxy diff --git a/frontend/public/tanuki-avatar.png b/frontend/public/tanuki-avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..6b993bf08e1336df42631a2a5cce7e0c0b893720 GIT binary patch literal 76603 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
    f?; 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⪚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 { + // Check if messages array length changed + if (prev.messages.length !== next.messages.length) return false; + + // Check if last message content changed (for streaming) + if (prev.messages.length > 0 && next.messages.length > 0) { + const prevLast = prev.messages[prev.messages.length - 1]; + const nextLast = next.messages[next.messages.length - 1]; + if (prevLast.content !== nextLast.content) return false; + if (prevLast.type !== nextLast.type) return false; + } + + // Check other props + return ( + prev.isProcessing === next.isProcessing && + prev.onSendMessage === next.onSendMessage && + prev.hostId === next.hostId + ); +}; + +export const MessageList = memo(function MessageList({ messages, isProcessing, onSendMessage, hostId }) { const { hosts } = useHosts(); const hostConfig = hosts[hostId] || null; const containerRef = useRef(null); @@ -174,8 +194,35 @@ export function MessageList({ messages, isProcessing, onSendMessage, hostId }) { setNewMessageCount(0); }, []); + // Cache for incremental updates - avoid full rebuild on streaming content changes + const processedCacheRef = useRef({ messages: [], result: [], toolResultMap: new Map() }); + // Preprocess messages to pair tool_use with tool_result + // Optimized: only rebuild when structure changes, not content const processedMessages = useMemo(() => { + const cache = processedCacheRef.current; + + // Fast path: if only last message content changed (streaming), return cached result + if (cache.messages.length === messages.length && messages.length > 0) { + const lastCached = cache.messages[cache.messages.length - 1]; + const lastCurrent = messages[messages.length - 1]; + + // Check if structure is same (only content might have changed) + if (lastCached.type === lastCurrent.type && + lastCached.timestamp === lastCurrent.timestamp && + lastCached.toolUseId === lastCurrent.toolUseId) { + // Content update only - update the cached result's last item content + if (cache.result.length > 0 && lastCurrent.type === 'assistant') { + cache.result[cache.result.length - 1] = { + ...cache.result[cache.result.length - 1], + content: lastCurrent.content + }; + } + return cache.result; + } + } + + // Full rebuild needed const result = []; const toolResultMap = new Map(); @@ -207,6 +254,11 @@ export function MessageList({ messages, isProcessing, onSendMessage, hostId }) { } }); + // Update cache + cache.messages = messages; + cache.result = result; + cache.toolResultMap = toolResultMap; + return result; }, [messages]); @@ -265,9 +317,10 @@ export function MessageList({ messages, isProcessing, onSendMessage, hostId }) { )} ); -} +}, messageListPropsAreEqual); -function Message({ message, onSendMessage, hostConfig }) { +// Memoize Message component to prevent re-renders during streaming +const Message = memo(function Message({ message, onSendMessage, hostConfig }) { const { type, content, tool, input, timestamp, toolUseId, attachments } = message; const { user } = useAuth(); @@ -434,7 +487,7 @@ function Message({ message, onSendMessage, hostConfig }) { }; return
    {renderContent()}
    ; -} +}); // Tool configuration with icons, colors, and display logic const TOOL_CONFIG = { diff --git a/frontend/src/components/Sidebar.jsx b/frontend/src/components/Sidebar.jsx index 358f161..d2a6e42 100644 --- a/frontend/src/components/Sidebar.jsx +++ b/frontend/src/components/Sidebar.jsx @@ -92,12 +92,6 @@ export function Sidebar({ open, onToggle }) { setShowBrowser(false); }, [focusedSessionId, currentHost, updateSessionConfig]); - // Handle host change - const handleSelectHost = useCallback((hostId) => { - if (!focusedSessionId || sessionActive) return; - updateSessionConfig(focusedSessionId, { host: hostId }); - }, [focusedSessionId, sessionActive, updateSessionConfig]); - // Handle resume toggle const handleToggleResume = useCallback(() => { if (!focusedSessionId) return; @@ -221,46 +215,33 @@ export function Sidebar({ open, onToggle }) {
    - {/* Host Selection */} + {/* Host Display (read-only - host is fixed per session) */}

    Host

    -
    - {hosts.map((host) => { - const isSelected = currentHost === host.id; - const isDisabled = sessionActive && currentHost !== host.id; - return ( - - ); - })} -
    - {sessionActive && ( -

    Stop session to switch hosts

    - )} +
    +
    + ) : ( +
    Loading...
    + ); + })()} +

    + Host is fixed per session. Create a new tab for a different host. +

    {/* Working Directory */} @@ -446,6 +427,21 @@ export function Sidebar({ open, onToggle }) { Clear Messages + + @@ -492,9 +488,10 @@ export function Sidebar({ open, onToggle }) { )} {/* Footer */} -
    -
    Claude Code Web UI
    -
    Multi-Session Mode
    +
    +
    + Claude Code Web UI +
    diff --git a/frontend/src/components/SplitLayout.jsx b/frontend/src/components/SplitLayout.jsx index 52a8e4a..3f17538 100644 --- a/frontend/src/components/SplitLayout.jsx +++ b/frontend/src/components/SplitLayout.jsx @@ -1,6 +1,7 @@ import { memo, useState, useRef, useCallback, useEffect } from 'react'; import { X, Maximize2, GripHorizontal, GripVertical } from 'lucide-react'; import { useSessionManager } from '../contexts/SessionContext'; +import { useHosts } from '../contexts/HostContext'; // Resizable divider - uses DOM manipulation during drag for smooth resize const Divider = memo(function Divider({ direction, panelRef, onResizeEnd }) { @@ -96,49 +97,50 @@ const Divider = memo(function Divider({ direction, panelRef, onResizeEnd }) { ); }); -// Panel wrapper with header -const PanelWrapper = memo(function PanelWrapper({ sessionId, children, onRemove, onMaximize }) { - const { sessions, setFocusedSessionId, focusedSessionId } = useSessionManager(); - const session = sessions[sessionId]; - const isFocused = focusedSessionId === sessionId; - - if (!session) return null; - - // Get host color - const getHostColor = () => { - switch (session.host) { - case 'neko': return '#f97316'; - case 'mochi': return '#22c55e'; - default: return '#6b7280'; - } - }; - - // Get display name - const getDisplayName = () => { - if (session.name) return session.name; - const hostName = session.host.charAt(0).toUpperCase() + session.host.slice(1); - const context = session.currentContext || session.project.split('/').pop() || 'New'; - return `${hostName}: ${context}`; - }; +// Custom comparison for PanelWrapper - only re-render when specific fields change +const panelWrapperPropsAreEqual = (prev, next) => { + return ( + prev.sessionId === next.sessionId && + prev.isFocused === next.isFocused && + prev.hostColor === next.hostColor && + prev.displayName === next.displayName && + prev.isActive === next.isActive && + prev.isProcessing === next.isProcessing && + prev.children === next.children + ); +}; +// Panel wrapper with header - receives pre-computed props to avoid context re-renders +const PanelWrapper = memo(function PanelWrapper({ + sessionId, + children, + onRemove, + onMaximize, + onFocus, + isFocused, + hostColor, + displayName, + isActive, + isProcessing, +}) { return (
    setFocusedSessionId(sessionId)} + onClick={() => onFocus(sessionId)} > {/* Mini header */}
    - + - {getDisplayName()} + {displayName} - {session.isProcessing && ( + {isProcessing && ( Processing... )}
    ); -}); +}, panelWrapperPropsAreEqual); + +// Helper to compute display name +function getDisplayName(session) { + if (!session) return 'Unknown'; + if (session.name) return session.name; + const hostName = session.host.charAt(0).toUpperCase() + session.host.slice(1); + const context = session.currentContext || session.project.split('/').pop() || 'New'; + return `${hostName}: ${context}`; +} export function SplitLayout({ splitSessions, renderPanel }) { - const { removeFromSplit, clearSplit, setFocusedSessionId } = useSessionManager(); + const { sessions, removeFromSplit, clearSplit, setFocusedSessionId, focusedSessionId } = useSessionManager(); + const { hosts } = useHosts(); const [sizes, setSizes] = useState({ h: 50, v: 50 }); // Refs for direct DOM manipulation during resize @@ -188,6 +200,10 @@ export function SplitLayout({ splitSessions, renderPanel }) { setFocusedSessionId(sessionId); }, [clearSplit, setFocusedSessionId]); + const handleFocus = useCallback((sessionId) => { + setFocusedSessionId(sessionId); + }, [setFocusedSessionId]); + const handleHorizontalResizeEnd = useCallback((percentage) => { setSizes(prev => ({ ...prev, h: percentage })); }, []); @@ -196,19 +212,34 @@ export function SplitLayout({ splitSessions, renderPanel }) { setSizes(prev => ({ ...prev, v: percentage })); }, []); + // Helper to get panel props for a session + const getPanelProps = useCallback((sessionId) => { + const session = sessions[sessionId]; + if (!session) return null; + return { + sessionId, + onRemove: handleRemove, + onMaximize: handleMaximize, + onFocus: handleFocus, + isFocused: focusedSessionId === sessionId, + hostColor: hosts[session.host]?.color || '#6b7280', + displayName: getDisplayName(session), + isActive: session.active, + isProcessing: session.isProcessing, + }; + }, [sessions, hosts, focusedSessionId, handleRemove, handleMaximize, handleFocus]); + const count = splitSessions.length; if (count === 0) return null; // Single panel (shouldn't happen in split mode, but handle it) if (count === 1) { + const props = getPanelProps(splitSessions[0]); + if (!props) return null; return (
    - + {renderPanel(splitSessions[0])}
    @@ -217,6 +248,9 @@ export function SplitLayout({ splitSessions, renderPanel }) { // Two panels - horizontal split if (count === 2) { + const props0 = getPanelProps(splitSessions[0]); + const props1 = getPanelProps(splitSessions[1]); + if (!props0 || !props1) return null; return (
    - + {renderPanel(splitSessions[0])}
    @@ -238,11 +268,7 @@ export function SplitLayout({ splitSessions, renderPanel }) { onResizeEnd={handleHorizontalResizeEnd} />
    - + {renderPanel(splitSessions[1])}
    @@ -250,58 +276,44 @@ export function SplitLayout({ splitSessions, renderPanel }) { ); } - // Three panels - 2 on left, 1 on right + // Three panels - all horizontal (side-by-side) if (count === 3) { + const props0 = getPanelProps(splitSessions[0]); + const props1 = getPanelProps(splitSessions[1]); + const props2 = getPanelProps(splitSessions[2]); + if (!props0 || !props1 || !props2) return null; return (
    - {/* Left column - 2 panels stacked */}
    -
    - - {renderPanel(splitSessions[0])} - -
    - -
    - - {renderPanel(splitSessions[1])} - -
    + + {renderPanel(splitSessions[0])} +
    - - - {/* Right column - 1 panel full height */} -
    - +
    + + {renderPanel(splitSessions[1])} + +
    + +
    + {renderPanel(splitSessions[2])}
    @@ -311,6 +323,11 @@ export function SplitLayout({ splitSessions, renderPanel }) { // Four panels - 2x2 grid if (count >= 4) { + const props0 = getPanelProps(splitSessions[0]); + const props1 = getPanelProps(splitSessions[1]); + const props2 = getPanelProps(splitSessions[2]); + const props3 = getPanelProps(splitSessions[3]); + if (!props0 || !props1 || !props2 || !props3) return null; return (
    {/* Top row */} @@ -324,11 +341,7 @@ export function SplitLayout({ splitSessions, renderPanel }) { style={{ width: `${sizes.h}%` }} className="min-w-0 h-full" > - + {renderPanel(splitSessions[0])}
    @@ -338,11 +351,7 @@ export function SplitLayout({ splitSessions, renderPanel }) { onResizeEnd={handleHorizontalResizeEnd} />
    - + {renderPanel(splitSessions[1])}
    @@ -357,11 +366,7 @@ export function SplitLayout({ splitSessions, renderPanel }) { {/* Bottom row */}
    - + {renderPanel(splitSessions[2])}
    @@ -371,11 +376,7 @@ export function SplitLayout({ splitSessions, renderPanel }) { onResizeEnd={handleHorizontalResizeEnd} />
    - + {renderPanel(splitSessions[3])}
    diff --git a/frontend/src/components/TabBar.jsx b/frontend/src/components/TabBar.jsx index 10db955..1b067ac 100644 --- a/frontend/src/components/TabBar.jsx +++ b/frontend/src/components/TabBar.jsx @@ -1,6 +1,26 @@ -import { useState, useRef, useCallback, memo } from 'react'; -import { Plus, X, Columns, Grid2X2, Maximize2, GripVertical, Circle } from 'lucide-react'; +import { useState, useRef, useCallback, memo, useEffect } from 'react'; +import { Plus, X, Columns, Grid2X2, Maximize2, GripVertical, Circle, Server, ChevronDown } from 'lucide-react'; import { useSessionManager } from '../contexts/SessionContext'; +import { useHosts } from '../contexts/HostContext'; + +// Custom comparison for Tab memo - only re-render when these specific fields change +const tabPropsAreEqual = (prev, next) => { + return ( + prev.session.id === next.session.id && + prev.session.name === next.session.name && + prev.session.host === next.session.host && + prev.session.project === next.session.project && + prev.session.currentContext === next.session.currentContext && + prev.session.active === next.session.active && + prev.session.connected === next.session.connected && + prev.session.isProcessing === next.session.isProcessing && + prev.session.unreadCount === next.session.unreadCount && + prev.isActive === next.isActive && + prev.isSplit === next.isSplit && + prev.index === next.index && + prev.hostColor === next.hostColor + ); +}; // Tab component const Tab = memo(function Tab({ @@ -8,6 +28,7 @@ const Tab = memo(function Tab({ isActive, isSplit, index, + hostColor, onDragStart, onDragOver, onDrop, @@ -30,15 +51,6 @@ const Tab = memo(function Tab({ return `${hostName}: ${context}`; }; - // Get host color - const getHostColor = () => { - switch (session.host) { - case 'neko': return '#f97316'; - case 'mochi': return '#22c55e'; - default: return '#6b7280'; - } - }; - const handleDoubleClick = () => { setEditName(session.name || ''); setIsEditing(true); @@ -78,7 +90,7 @@ const Tab = memo(function Tab({ ${isSplit ? 'ring-1 ring-inset ring-blue-500/30' : ''} `} style={{ - borderTopColor: isActive ? getHostColor() : 'transparent', + borderTopColor: isActive ? (hostColor || '#6b7280') : 'transparent', }} > {/* Drag handle */} @@ -146,7 +158,7 @@ const Tab = memo(function Tab({
    ); -}); +}, tabPropsAreEqual); export function TabBar() { const { @@ -165,6 +177,7 @@ export function TabBar() { clearSplit, } = useSessionManager(); + const { hosts } = useHosts(); const [dragIndex, setDragIndex] = useState(null); const handleDragStart = useCallback((e, index) => { @@ -202,9 +215,39 @@ export function TabBar() { } }, [splitSessions, addToSplit, removeFromSplit]); - const handleNewTab = useCallback(() => { - createSession(); - }, [createSession]); + const [showNewTabMenu, setShowNewTabMenu] = useState(false); + const newTabMenuRef = useRef(null); + + const handleNewTab = useCallback((hostId) => { + const hostConfig = hosts[hostId]; + const defaultPath = hostConfig?.defaultPath || hostConfig?.basePaths?.[0] || '/home'; + createSession(hostId, defaultPath); + setShowNewTabMenu(false); + }, [createSession, hosts]); + + // Close menu on outside click + useEffect(() => { + if (!showNewTabMenu) return; + + const handleClickOutside = (e) => { + // Small delay to prevent immediate close on the same click that opened it + setTimeout(() => { + if (newTabMenuRef.current && !newTabMenuRef.current.contains(e.target)) { + setShowNewTabMenu(false); + } + }, 0); + }; + + // Use click instead of mousedown, and add after a small delay + const timeoutId = setTimeout(() => { + document.addEventListener('click', handleClickOutside); + }, 100); + + return () => { + clearTimeout(timeoutId); + document.removeEventListener('click', handleClickOutside); + }; + }, [showNewTabMenu]); // Get split layout info const getSplitInfo = () => { @@ -217,7 +260,7 @@ export function TabBar() { }; return ( -
    +
    {/* Tabs */}
    {tabOrder.map((sessionId, index) => { @@ -231,6 +274,7 @@ export function TabBar() { isActive={focusedSessionId === sessionId} isSplit={splitSessions.includes(sessionId)} index={index} + hostColor={hosts[session.host]?.color} onDragStart={handleDragStart} onRename={renameSession} onDragOver={handleDragOver} @@ -241,15 +285,33 @@ export function TabBar() { /> ); })} +
    - {/* New tab button */} + {/* New tab button with host dropdown - outside scrollable area */} +
    + + {showNewTabMenu && ( +
    + {Object.entries(hosts).map(([hostId, host]) => ( + + ))} +
    + )}
    {/* Split view controls */} diff --git a/frontend/src/contexts/SessionContext.jsx b/frontend/src/contexts/SessionContext.jsx index 17e296d..0afe994 100644 --- a/frontend/src/contexts/SessionContext.jsx +++ b/frontend/src/contexts/SessionContext.jsx @@ -903,6 +903,13 @@ export function SessionProvider({ children }) { // Handle file uploads if needed let uploadedFiles = []; if (attachments.length > 0) { + // Check if we have a claude session ID for uploads + if (!session.claudeSessionId) { + console.error('Upload failed: No claude session ID yet'); + updateSession(sessionId, { error: 'Cannot upload files: Session not fully started yet. Please wait a moment.' }); + return; + } + const formData = new FormData(); for (const file of attachments) { formData.append('files', file.file); @@ -914,6 +921,13 @@ export function SessionProvider({ children }) { body: formData, credentials: 'include', }); + + // Check if response is ok before parsing JSON + if (!res.ok) { + const errorText = await res.text(); + throw new Error(`Upload failed: ${res.status} ${errorText}`); + } + const data = await res.json(); uploadedFiles = data.files || []; } catch (e) {