diff --git a/apps/desktop/src/app/chat/composer/index.tsx b/apps/desktop/src/app/chat/composer/index.tsx index dbcef7bfe28..19b71ed6543 100644 --- a/apps/desktop/src/app/chat/composer/index.tsx +++ b/apps/desktop/src/app/chat/composer/index.tsx @@ -1043,9 +1043,7 @@ export function ChatBar({
- {isHelpHint && } - {trigger && !argStageEmpty && ( - - )} - {!poppedOut && ( -
- )} - {/* Drag region: covers the transparent grab margin around the surface. + {isHelpHint && } + {trigger && !argStageEmpty && ( + + )} + {!poppedOut && ( +
+ )} + {/* Drag region: covers the transparent grab margin around the surface. The surface sits on top (z-4) so only the exposed ring receives this element's hover/cursor — grab cursor + a diagonal hatch (/////) appear when you hover the draggable margin, never over the input. The hatch pattern + opacity ladder live in styles.css. */} - {popoutAllowed && ( -
- )} -
-
+ {popoutAllowed && (
- + )} +
- {/* Contribution seams: banners above, a row below, inline - additions beside the "+" menu and before the controls. - All four render nothing until something contributes. */} - - - - {queueEdit && editingQueuedPrompt && ( -
-
- {t.composer.editingQueuedInComposer} -
-
- - -
-
- )} - {attachments.length > 0 && } +
+
-
- {contextMenu} - -
-
{input}
-
- - {controls} + {/* Contribution seams: banners above, a row below, inline + additions beside the "+" menu and before the controls. + All four render nothing until something contributes. */} + + + + {queueEdit && editingQueuedPrompt && ( +
+
+ {t.composer.editingQueuedInComposer} +
+
+ + +
+
+ )} + {attachments.length > 0 && } +
+
+ {contextMenu} + +
+
{input}
+
+ + {controls} +
+
-
-
{/* Underside: chrome-free strip BELOW the composer. Outside the root for the same reason as the micro actions — it must not fall inside diff --git a/apps/desktop/src/app/command-palette/index.tsx b/apps/desktop/src/app/command-palette/index.tsx index ff7af6b5c91..ce82571d7d2 100644 --- a/apps/desktop/src/app/command-palette/index.tsx +++ b/apps/desktop/src/app/command-palette/index.tsx @@ -277,7 +277,9 @@ const PaletteRow = memo(function PaletteRow({ )} {item.detail && {item.detail}} - {combo && } + {combo && ( + + )} {item.to && } {item.active && } diff --git a/apps/desktop/src/app/session/hooks/use-session-actions/utils.ts b/apps/desktop/src/app/session/hooks/use-session-actions/utils.ts index 019328d21c5..2c0913fb6dc 100644 --- a/apps/desktop/src/app/session/hooks/use-session-actions/utils.ts +++ b/apps/desktop/src/app/session/hooks/use-session-actions/utils.ts @@ -100,16 +100,8 @@ const _chatMessageFieldsExhaustive: { [K in Exclude]: never } = {} -const COMPARED_FIELDS = [ - 'id', - 'role', - 'pending', - 'error', - 'hidden', - 'branchGroupId', - 'interim', - 'reactions' -] as const +const COMPARED_FIELDS = ['id', 'role', 'pending', 'error', 'hidden', 'branchGroupId', 'interim', 'reactions'] as const + const IGNORED_FIELDS = ['timestamp', 'attachmentRefs', 'parts', 'rowId'] as const // Compile-time check: every ChatMessagePart discriminant must be handled by @@ -193,10 +185,7 @@ export function chatReactionsEquivalent(a: ChatMessage['reactions'], b: ChatMess return ( aList.length === bList.length && - aList.every( - (reaction, index) => - reaction.emoji === bList[index].emoji && reaction.author === bList[index].author - ) + aList.every((reaction, index) => reaction.emoji === bList[index].emoji && reaction.author === bList[index].author) ) } diff --git a/apps/desktop/src/components/assistant-ui/thread/message-reactions.tsx b/apps/desktop/src/components/assistant-ui/thread/message-reactions.tsx index 749335b1c38..05d07a5b12f 100644 --- a/apps/desktop/src/components/assistant-ui/thread/message-reactions.tsx +++ b/apps/desktop/src/components/assistant-ui/thread/message-reactions.tsx @@ -117,10 +117,7 @@ export const ReactionPicker: FC<{ // Opt this one surface out of the shared popover glass: emoji hover // tints at 15% alpha are unreadable over blurred transcript text. // Overriding the local surface var keeps the arrow matched for free. - className={cn( - 'w-auto p-1 [--popover-surface:var(--ui-bg-elevated)]', - !expanded && 'flex gap-0.5' - )} + className={cn('w-auto p-1 [--popover-surface:var(--ui-bg-elevated)]', !expanded && 'flex gap-0.5')} onCloseAutoFocus={event => event.preventDefault()} side="top" > diff --git a/apps/desktop/src/store/projects.ts b/apps/desktop/src/store/projects.ts index 22e9ce2af81..ca4511e6186 100644 --- a/apps/desktop/src/store/projects.ts +++ b/apps/desktop/src/store/projects.ts @@ -1128,7 +1128,11 @@ export async function openFolderAsProject(dir?: string): Promise { setSidebarAgentsGrouped(true) enterProject(existing) } else { - const name = target.replace(/[/\\]+$/, '').split(/[/\\]/).pop() || target + const name = + target + .replace(/[/\\]+$/, '') + .split(/[/\\]/) + .pop() || target try { const created = await createProject({ name, folders: [target], primaryPath: target, use: true }) diff --git a/apps/desktop/src/store/reactions.ts b/apps/desktop/src/store/reactions.ts index c8c2b414a8a..c75af2b81f1 100644 --- a/apps/desktop/src/store/reactions.ts +++ b/apps/desktop/src/store/reactions.ts @@ -62,10 +62,7 @@ export async function toggleMessageReaction( const gateway = activeGateway() if (!sessionId || !gateway) { - notifyError( - new Error(!sessionId ? 'No active session' : 'Gateway not connected'), - 'Could not react' - ) + notifyError(new Error(!sessionId ? 'No active session' : 'Gateway not connected'), 'Could not react') return }