diff --git a/apps/desktop/electron/handoff-result.test.ts b/apps/desktop/electron/handoff-result.test.ts index ebcd630a81..4d6f7b1cfe 100644 --- a/apps/desktop/electron/handoff-result.test.ts +++ b/apps/desktop/electron/handoff-result.test.ts @@ -17,7 +17,13 @@ function write(home: string, body: any) { test('consumes and returns a fresh failure result', () => { const home = tempHome() - write(home, { ok: false, exit_code: 6, message: 'rebuild failed', branch: 'main', finished_at: Math.floor(Date.now() / 1000) }) + write(home, { + ok: false, + exit_code: 6, + message: 'rebuild failed', + branch: 'main', + finished_at: Math.floor(Date.now() / 1000) + }) const result = readAndConsumeHandoffResult(home) @@ -38,7 +44,13 @@ test('reports each result at most once', () => { test('discards stale results but still consumes the file', () => { const home = tempHome() - write(home, { ok: false, exit_code: 5, message: 'old', branch: 'main', finished_at: Math.floor(Date.now() / 1000) - 3600 }) + write(home, { + ok: false, + exit_code: 5, + message: 'old', + branch: 'main', + finished_at: Math.floor(Date.now() / 1000) - 3600 + }) assert.equal(readAndConsumeHandoffResult(home), null) assert.equal(fs.existsSync(handoffResultPath(home)), false) diff --git a/apps/desktop/electron/hyprland.test.ts b/apps/desktop/electron/hyprland.test.ts index 8b58340fb8..1626a5c9ac 100644 --- a/apps/desktop/electron/hyprland.test.ts +++ b/apps/desktop/electron/hyprland.test.ts @@ -92,7 +92,10 @@ describe('parseHyprlandClients', () => { it('keeps everything when it cannot find our own window', () => { const parsed = parseHyprlandClients( - payload(client({ class: 'a', pid: 2, workspace: { id: 1 } }), client({ class: 'b', pid: 3, workspace: { id: 7 } })), + payload( + client({ class: 'a', pid: 2, workspace: { id: 1 } }), + client({ class: 'b', pid: 3, workspace: { id: 7 } }) + ), SELF_PID ) diff --git a/apps/desktop/electron/updater-process.test.ts b/apps/desktop/electron/updater-process.test.ts index 06e6ffc6cf..a694b28bc6 100644 --- a/apps/desktop/electron/updater-process.test.ts +++ b/apps/desktop/electron/updater-process.test.ts @@ -204,6 +204,7 @@ test('resolveUpdateScriptHandoff is Windows-only (POSIX updates in place)', () = test('wrapHandoffForDetachedConsole routes through cmd start with own console', () => { const root = String.raw`C:\Users\hermes\AppData\Local\hermes\hermes-agent` const expected = path.join(root, 'scripts', 'desktop-update.ps1') + const handoff = resolveUpdateScriptHandoff(root, { isWindows: true, fileExists: candidate => candidate === expected @@ -214,8 +215,21 @@ test('wrapHandoffForDetachedConsole routes through cmd start with own console', assert.equal(wrapped.command, 'cmd.exe') assert.deepEqual(wrapped.args, [ - '/d', '/s', '/c', 'start', '', '/min', - 'powershell', '-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', expected, - '-InstallRoot', root, '-Branch', 'main' + '/d', + '/s', + '/c', + 'start', + '', + '/min', + 'powershell', + '-NoProfile', + '-ExecutionPolicy', + 'Bypass', + '-File', + expected, + '-InstallRoot', + root, + '-Branch', + 'main' ]) }) diff --git a/apps/desktop/electron/updater-process.ts b/apps/desktop/electron/updater-process.ts index 66a279a200..e572836178 100644 --- a/apps/desktop/electron/updater-process.ts +++ b/apps/desktop/electron/updater-process.ts @@ -81,7 +81,10 @@ export function resolveUpdateScriptHandoff( * callers must not use it as a marker owner (the script claims the marker * itself with its own $PID). */ -export function wrapHandoffForDetachedConsole(handoff: UpdateScriptHandoff, extraArgs: string[]): { +export function wrapHandoffForDetachedConsole( + handoff: UpdateScriptHandoff, + extraArgs: string[] +): { command: string args: string[] } { diff --git a/apps/desktop/src/app/chat/session-status-dot.tsx b/apps/desktop/src/app/chat/session-status-dot.tsx index ab808866a8..789de11a62 100644 --- a/apps/desktop/src/app/chat/session-status-dot.tsx +++ b/apps/desktop/src/app/chat/session-status-dot.tsx @@ -127,6 +127,7 @@ export function SessionStatusDot({ storedSessionId, session, branchStem, classNa const dotState = useStoreSelector($sessionDotStateById, states => storedSessionId ? (states[storedSessionId] ?? 'idle') : 'draft' ) + const variant = DOT_VARIANTS[dotState] return ( diff --git a/apps/desktop/src/app/chat/session-tile.tsx b/apps/desktop/src/app/chat/session-tile.tsx index e362a64d35..27d2cebf68 100644 --- a/apps/desktop/src/app/chat/session-tile.tsx +++ b/apps/desktop/src/app/chat/session-tile.tsx @@ -596,8 +596,7 @@ export const watchSessionTiles = paneMirror({ ), // Until the first turn lists a row there is no title to register, so the tab // takes its name from the composer instead — live, without re-registering. - tabTitle: storedSessionId => - tileStoredRow(storedSessionId) ? null : , + tabTitle: storedSessionId => (tileStoredRow(storedSessionId) ? null : ), render: storedSessionId => , tabWrap: (storedSessionId, tab) => ( !paneChrome(paneFor(paneId)).uncloseable || panesWithCloser.has(paneId) // A pane's own live label when it has one, else its registered string. - const tabLabel = (paneId: string) => - paneChrome(paneFor(paneId)).tabTitle?.() ?? paneFor(paneId)?.title ?? paneId + const tabLabel = (paneId: string) => paneChrome(paneFor(paneId)).tabTitle?.() ?? paneFor(paneId)?.title ?? paneId // Collapse/restore a tool panel (or plain minimize elsewhere) — the header // chevron + tap gesture, routed so ⌃`/the titlebar toggle stay truthful. diff --git a/apps/desktop/src/lib/draft-title.ts b/apps/desktop/src/lib/draft-title.ts index 2c980b1472..bd9f2f221d 100644 --- a/apps/desktop/src/lib/draft-title.ts +++ b/apps/desktop/src/lib/draft-title.ts @@ -16,7 +16,11 @@ const MAX_DRAFT_TITLE_CHARS = 48 * rather than showing a title that says less than the placeholder. */ export function deriveDraftTitle(text: string): string { - const line = text.split('\n').find(candidate => candidate.trim())?.trim() ?? '' + const line = + text + .split('\n') + .find(candidate => candidate.trim()) + ?.trim() ?? '' if (!line) { return ''