diff --git a/apps/desktop/electron/main.ts b/apps/desktop/electron/main.ts index b51bc4088b..229e080c55 100644 --- a/apps/desktop/electron/main.ts +++ b/apps/desktop/electron/main.ts @@ -5902,6 +5902,7 @@ function installDevToolsShortcut(window) { if (input.key === 'F12') { if (f12Blocked) { event.preventDefault() + return } // Not blocked — fall through to open DevTools. diff --git a/apps/desktop/src/app/chat/composer/ime-composition-dom-repro.test.tsx b/apps/desktop/src/app/chat/composer/ime-composition-dom-repro.test.tsx index 917942cb43..79febaa0de 100644 --- a/apps/desktop/src/app/chat/composer/ime-composition-dom-repro.test.tsx +++ b/apps/desktop/src/app/chat/composer/ime-composition-dom-repro.test.tsx @@ -157,6 +157,7 @@ describe('composer IME composition — send button visibility (#39614)', () => { if (composingRef.current) { return } + flushEditorToDraft(event.currentTarget) }} onKeyDown={handleKeyDown} diff --git a/apps/desktop/src/app/chat/index.tsx b/apps/desktop/src/app/chat/index.tsx index 12ac010ece..9f77e4f617 100644 --- a/apps/desktop/src/app/chat/index.tsx +++ b/apps/desktop/src/app/chat/index.tsx @@ -401,9 +401,7 @@ export const ChatView = memo(function ChatView({ // direct nav). Derived in render so the swap reads instantly: the same frame // the id changes we drop the old transcript and show the loader, instead of // waiting for the resume effect (which paints a frame later) to clear them. - const routeSessionMismatch = isPrimary - ? isRouteSessionMismatch(routedSessionId, selectedSessionId, sessions) - : false + const routeSessionMismatch = isPrimary ? isRouteSessionMismatch(routedSessionId, selectedSessionId, sessions) : false // The compact new-session pop-out skips the wordmark/tagline intro — it's a // scratch window, not the full-height empty state. diff --git a/apps/desktop/src/app/chat/route-session-state.ts b/apps/desktop/src/app/chat/route-session-state.ts index 1c35b157f9..90c0c269df 100644 --- a/apps/desktop/src/app/chat/route-session-state.ts +++ b/apps/desktop/src/app/chat/route-session-state.ts @@ -25,7 +25,6 @@ export function isRouteSessionMismatch( } return !sessions.some( - session => - sessionMatchesStoredId(session, routedSessionId) && sessionMatchesStoredId(session, selectedSessionId) + session => sessionMatchesStoredId(session, routedSessionId) && sessionMatchesStoredId(session, selectedSessionId) ) } diff --git a/apps/desktop/src/components/assistant-ui/thread/system-message.tsx b/apps/desktop/src/components/assistant-ui/thread/system-message.tsx index 4fefc7a306..112611ffe0 100644 --- a/apps/desktop/src/components/assistant-ui/thread/system-message.tsx +++ b/apps/desktop/src/components/assistant-ui/thread/system-message.tsx @@ -60,9 +60,7 @@ export const SystemMessage: FC = () => { steered · - {steerNote.groups.text.trim()} - {' '} - + {steerNote.groups.text.trim()} ) } @@ -93,8 +91,7 @@ export const SystemMessage: FC = () => { · - )} - {' '} + )}{' '} ) @@ -111,8 +108,7 @@ export const SystemMessage: FC = () => { data-role="system" data-slot="aui_system-message-root" > - - {' '} + {' '} ) diff --git a/apps/desktop/src/components/assistant-ui/thread/timeline-timestamp.tsx b/apps/desktop/src/components/assistant-ui/thread/timeline-timestamp.tsx index 8a920aeb92..71773c1a66 100644 --- a/apps/desktop/src/components/assistant-ui/thread/timeline-timestamp.tsx +++ b/apps/desktop/src/components/assistant-ui/thread/timeline-timestamp.tsx @@ -45,8 +45,7 @@ export const TimelineTimestamp: FC<{ return null } - const completed = - validUnixSeconds(completedAt) && completedAt > timestamp ? unixDate(completedAt) : null + const completed = validUnixSeconds(completedAt) && completedAt > timestamp ? unixDate(completedAt) : null const validCompletedAt = completed && validUnixSeconds(completedAt) ? completedAt : undefined const startLabel = formatTimelineRange(timestamp, undefined) @@ -96,7 +95,8 @@ export const MessageTimelineTimestamp: FC<{ timelineTimestamp?: unknown } - const solePart = s.message.parts.length === 1 ? (s.message.parts[0] as { completedAt?: unknown; timestamp?: unknown }) : null + const solePart = + s.message.parts.length === 1 ? (s.message.parts[0] as { completedAt?: unknown; timestamp?: unknown }) : null return ( Boolean(solePart) && diff --git a/apps/desktop/src/lib/chat-messages.ts b/apps/desktop/src/lib/chat-messages.ts index 2a8edd941f..8f26f8c000 100644 --- a/apps/desktop/src/lib/chat-messages.ts +++ b/apps/desktop/src/lib/chat-messages.ts @@ -1270,7 +1270,9 @@ const assistantTimelineMatch = (stored: ChatMessage, local: ChatMessage) => { } const localToolIds = new Set( - local.parts.filter(part => part.type === 'tool-call').map(part => (part.type === 'tool-call' ? part.toolCallId : '')) + local.parts + .filter(part => part.type === 'tool-call') + .map(part => (part.type === 'tool-call' ? part.toolCallId : '')) ) const toolMatch = stored.parts.some(part => part.type === 'tool-call' && localToolIds.has(part.toolCallId)) @@ -1338,7 +1340,9 @@ export function reconcileLocalAssistantTimeline( const unusedLocalParts = new Set(local.parts.map((_, index) => index)) const parts = message.parts.map(part => { - const localIndex = local.parts.findIndex((candidate, index) => unusedLocalParts.has(index) && timelinePartMatch(part, candidate)) + const localIndex = local.parts.findIndex( + (candidate, index) => unusedLocalParts.has(index) && timelinePartMatch(part, candidate) + ) if (localIndex === -1) { return part diff --git a/apps/desktop/src/lib/chat-runtime.ts b/apps/desktop/src/lib/chat-runtime.ts index aaa594160d..c00dd185ea 100644 --- a/apps/desktop/src/lib/chat-runtime.ts +++ b/apps/desktop/src/lib/chat-runtime.ts @@ -536,7 +536,10 @@ export function coalesceToolOnlyAssistants(messages: ChatMessage[], cache: ToolM ...prev, completedAt: [prev.completedAt, message.completedAt, ...message.parts.map(part => part.completedAt)] .filter((value): value is number => value !== undefined) - .reduce((latest, value) => (latest === undefined ? value : Math.max(latest, value)), undefined), + .reduce( + (latest, value) => (latest === undefined ? value : Math.max(latest, value)), + undefined + ), parts: [...prev.parts, ...message.parts] } diff --git a/ui-tui/src/domain/messages.ts b/ui-tui/src/domain/messages.ts index 1edac1e90f..86d2b29223 100644 --- a/ui-tui/src/domain/messages.ts +++ b/ui-tui/src/domain/messages.ts @@ -31,7 +31,8 @@ export const toTranscriptMessages = (rows: unknown): Msg[] => { const { context, display_kind, name, role, text, timestamp } = row as TranscriptRow - const createdAt = typeof timestamp === 'number' && Number.isFinite(timestamp) && timestamp > 0 ? timestamp : undefined + const createdAt = + typeof timestamp === 'number' && Number.isFinite(timestamp) && timestamp > 0 ? timestamp : undefined if (role === 'tool') { pending.push(buildToolTrailLine(name ?? 'tool', context ?? ''))