From e4d2d47e611e78fef453fb88cf887e15e7b5f8fa Mon Sep 17 00:00:00 2001 From: Naomi Carrigan Date: Tue, 20 Jan 2026 11:12:41 -0800 Subject: [PATCH] chore: linter --- src/lib/components/ConversationTabs.svelte | 42 +++++++++++++------ .../components/ConversationTabsDebug.svelte | 2 +- src/lib/components/InputBar.svelte | 2 +- src/lib/components/PermissionModal.svelte | 2 +- src/lib/stores/claude.ts | 2 +- src/lib/stores/conversations.ts | 25 ++++++++--- src/lib/tauri.ts | 29 +++++++++---- 7 files changed, 74 insertions(+), 30 deletions(-) diff --git a/src/lib/components/ConversationTabs.svelte b/src/lib/components/ConversationTabs.svelte index e819e0d..96864aa 100644 --- a/src/lib/components/ConversationTabs.svelte +++ b/src/lib/components/ConversationTabs.svelte @@ -2,6 +2,7 @@ import { claudeStore } from "$lib/stores/claude"; import { onMount } from "svelte"; import type { Conversation } from "$lib/stores/conversations"; + import { SvelteMap } from "svelte/reactivity"; let conversations: Map = new Map(); let activeConversationId: string | null = null; @@ -12,7 +13,7 @@ let connectedConversationId: string | null = null; // Track last seen message count for each conversation - let lastSeenMessageCount: Map = new Map(); + let lastSeenMessageCount = new SvelteMap(); claudeStore.conversations.subscribe((convs) => { conversations = convs; @@ -75,6 +76,11 @@ event.stopPropagation(); editingTabId = id; editingName = name; + // Focus input after DOM update + setTimeout(() => { + const input = document.querySelector('.tab-item input[type="text"]') as HTMLInputElement; + if (input) input.focus(); + }, 0); } function saveTabName() { @@ -113,6 +119,13 @@ } } + function handleTabKeydown(id: string, event: KeyboardEvent) { + if (event.key === "Enter" || event.key === " ") { + event.preventDefault(); + switchTab(id); + } + } + // Keyboard shortcuts onMount(() => { function handleGlobalKeydown(event: KeyboardEvent) { @@ -165,6 +178,7 @@ ? 'bg-[var(--bg-terminal)] text-[var(--text-primary)] border-t border-l border-r border-[var(--border-color)]' : 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)] hover:bg-[var(--bg-terminal)]/50'}" onclick={() => switchTab(id)} + onkeydown={(e) => handleTabKeydown(id, e)} role="tab" tabindex={0} aria-selected={id === activeConversationId} @@ -177,22 +191,29 @@ onkeydown={handleKeydown} onclick={(e) => e.stopPropagation()} class="bg-transparent border-b border-[var(--border-color)] outline-none px-0 py-0 text-sm w-32" - autofocus /> {:else}
+ title="Connection: {conversation.connectionStatus}{id !== connectedConversationId && + connectedConversationId + ? ' (Another tab is connected)' + : ''}" + >
startEditing(id, conversation.name, e)} + role="button" + tabindex={-1} > {conversation.name} {#if id !== activeConversationId && id === connectedConversationId} - + (connected) {/if} @@ -200,7 +221,7 @@
+ >
{/if}
{/if} @@ -242,12 +263,7 @@ viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" > - + @@ -260,4 +276,4 @@ .tab-item { min-width: 100px; } - \ No newline at end of file + diff --git a/src/lib/components/ConversationTabsDebug.svelte b/src/lib/components/ConversationTabsDebug.svelte index 5ec3a4d..53c5b22 100644 --- a/src/lib/components/ConversationTabsDebug.svelte +++ b/src/lib/components/ConversationTabsDebug.svelte @@ -4,4 +4,4 @@
Debug: Tabs Component Loaded -
\ No newline at end of file + diff --git a/src/lib/components/InputBar.svelte b/src/lib/components/InputBar.svelte index f93770a..5d78367 100644 --- a/src/lib/components/InputBar.svelte +++ b/src/lib/components/InputBar.svelte @@ -73,7 +73,7 @@ User: ${formattedMessage}`; } await invoke("send_prompt", { conversationId, - message: messageToSend + message: messageToSend, }); } catch (error) { console.error("Failed to send prompt:", error); diff --git a/src/lib/components/PermissionModal.svelte b/src/lib/components/PermissionModal.svelte index 0ea268d..01ebc46 100644 --- a/src/lib/components/PermissionModal.svelte +++ b/src/lib/components/PermissionModal.svelte @@ -81,7 +81,7 @@ Please continue where we left off and retry that action now that you have permis await invoke("send_prompt", { conversationId, - message: contextMessage + message: contextMessage, }); } } catch (error) { diff --git a/src/lib/stores/claude.ts b/src/lib/stores/claude.ts index a5a9dc7..1a822f3 100644 --- a/src/lib/stores/claude.ts +++ b/src/lib/stores/claude.ts @@ -1,6 +1,6 @@ import { derived } from "svelte/store"; import { conversationsStore } from "./conversations"; -import type { ConnectionStatus, PermissionRequest, TerminalLine } from "$lib/types/messages"; +import type { TerminalLine } from "$lib/types/messages"; import { characterState } from "$lib/stores/character"; import { setShouldRestoreHistory, diff --git a/src/lib/stores/conversations.ts b/src/lib/stores/conversations.ts index 97f7dfc..539bcd9 100644 --- a/src/lib/stores/conversations.ts +++ b/src/lib/stores/conversations.ts @@ -76,14 +76,23 @@ function createConversationsStore() { ); // Derived stores for compatibility with existing code - const connectionStatus = derived(activeConversation, ($conv) => $conv?.connectionStatus || "disconnected"); + const connectionStatus = derived( + activeConversation, + ($conv) => $conv?.connectionStatus || "disconnected" + ); const terminalLines = derived(activeConversation, ($conv) => { return $conv?.terminalLines || []; }); const sessionId = derived(activeConversation, ($conv) => $conv?.sessionId || null); - const currentWorkingDirectory = derived(activeConversation, ($conv) => $conv?.workingDirectory || ""); + const currentWorkingDirectory = derived( + activeConversation, + ($conv) => $conv?.workingDirectory || "" + ); const isProcessing = derived(activeConversation, ($conv) => $conv?.isProcessing || false); - const grantedTools = derived(activeConversation, ($conv) => $conv?.grantedTools || new Set()); + const grantedTools = derived( + activeConversation, + ($conv) => $conv?.grantedTools || new Set() + ); return { // Expose derived stores for compatibility @@ -198,7 +207,6 @@ function createConversationsStore() { if (targetConv) { characterState.setState(targetConv.characterState); } - } }, @@ -304,7 +312,12 @@ function createConversationsStore() { return line.id; }, - addLineToConversation: (conversationId: string, type: TerminalLine["type"], content: string, toolName?: string) => { + addLineToConversation: ( + conversationId: string, + type: TerminalLine["type"], + content: string, + toolName?: string + ) => { ensureInitialized(); const line: TerminalLine = { @@ -443,4 +456,4 @@ function createConversationsStore() { export const conversationsStore = createConversationsStore(); // Initialize immediately -conversationsStore.initialize(); \ No newline at end of file +conversationsStore.initialize(); diff --git a/src/lib/tauri.ts b/src/lib/tauri.ts index 2019114..a9310e7 100644 --- a/src/lib/tauri.ts +++ b/src/lib/tauri.ts @@ -21,7 +21,7 @@ interface StateChangePayload { conversation_id?: string; } -let connectedConversations = new Set(); +const connectedConversations = new Set(); let unlisteners: Array<() => void> = []; let skipNextGreeting = false; @@ -72,7 +72,7 @@ async function sendGreeting(conversationId: string) { try { await invoke("send_prompt", { conversationId, - message: greetingPrompt + message: greetingPrompt, }); } catch (error) { console.error("Failed to send greeting:", error); @@ -140,7 +140,11 @@ export async function initializeTauriListeners() { if (targetConversationId) { // Add system message to the correct conversation - claudeStore.addLineToConversation(targetConversationId, "system", "Connected to Claude Code"); + claudeStore.addLineToConversation( + targetConversationId, + "system", + "Connected to Claude Code" + ); // Update character state for this conversation claudeStore.setCharacterStateForConversation(targetConversationId, "idle"); @@ -162,7 +166,11 @@ export async function initializeTauriListeners() { // Don't add system message if we're about to reconnect if (!skipNextGreeting && targetConversationId) { - claudeStore.addLineToConversation(targetConversationId, "system", "Disconnected from Claude Code"); + claudeStore.addLineToConversation( + targetConversationId, + "system", + "Disconnected from Claude Code" + ); } // Update character state for this conversation @@ -225,7 +233,6 @@ export async function initializeTauriListeners() { const outputUnlisten = await listen("claude:output", (event) => { const { line_type, content, tool_name, conversation_id } = event.payload; - // Always store the output to the correct conversation if (conversation_id) { claudeStore.addLineToConversation( @@ -256,7 +263,11 @@ export async function initializeTauriListeners() { // Store session ID for the correct conversation if (conversation_id) { claudeStore.setSessionIdForConversation(conversation_id, session_id); - claudeStore.addLineToConversation(conversation_id, "system", `Session: ${session_id.substring(0, 8)}...`); + claudeStore.addLineToConversation( + conversation_id, + "system", + `Session: ${session_id.substring(0, 8)}...` + ); } else { // Fallback to active conversation if no conversation_id claudeStore.setSessionId(session_id); @@ -294,7 +305,11 @@ export async function initializeTauriListeners() { // Always store the permission message to the correct conversation if (conversation_id) { - claudeStore.addLineToConversation(conversation_id, "system", `Permission requested for: ${tool_name}`); + claudeStore.addLineToConversation( + conversation_id, + "system", + `Permission requested for: ${tool_name}` + ); } else if (conversation_id === activeConversationId) { claudeStore.addLine("system", `Permission requested for: ${tool_name}`); }