diff --git a/src/components/chat/hooks/useChatComposerState.ts b/src/components/chat/hooks/useChatComposerState.ts index 858faff9..15f4b63f 100644 --- a/src/components/chat/hooks/useChatComposerState.ts +++ b/src/components/chat/hooks/useChatComposerState.ts @@ -19,7 +19,7 @@ import type { PendingPermissionRequest, PermissionMode, } from '../types/types'; -import type { Project, ProjectSession, SessionProvider } from '../../../types/app'; +import type { Project, ProjectSession, LLMProvider } from '../../../types/app'; import { escapeRegExp } from '../utils/chatFormatting'; import { useFileMentions } from './useFileMentions'; import { type SlashCommand, useSlashCommands } from './useSlashCommands'; @@ -33,7 +33,7 @@ interface UseChatComposerStateArgs { selectedProject: Project | null; selectedSession: ProjectSession | null; currentSessionId: string | null; - provider: SessionProvider; + provider: LLMProvider; permissionMode: PermissionMode | string; cyclePermissionMode: () => void; cursorModel: string; diff --git a/src/components/chat/hooks/useChatProviderState.ts b/src/components/chat/hooks/useChatProviderState.ts index 9d48ce3d..6d39d22a 100644 --- a/src/components/chat/hooks/useChatProviderState.ts +++ b/src/components/chat/hooks/useChatProviderState.ts @@ -2,7 +2,7 @@ import { useCallback, useEffect, useRef, useState } from 'react'; import { authenticatedFetch } from '../../../utils/api'; import { CLAUDE_MODELS, CODEX_MODELS, CURSOR_MODELS, GEMINI_MODELS } from '../../../../shared/modelConstants'; import type { PendingPermissionRequest, PermissionMode } from '../types/types'; -import type { ProjectSession, SessionProvider } from '../../../types/app'; +import type { ProjectSession, LLMProvider } from '../../../types/app'; interface UseChatProviderStateArgs { selectedSession: ProjectSession | null; @@ -11,8 +11,8 @@ interface UseChatProviderStateArgs { export function useChatProviderState({ selectedSession }: UseChatProviderStateArgs) { const [permissionMode, setPermissionMode] = useState('default'); const [pendingPermissionRequests, setPendingPermissionRequests] = useState([]); - const [provider, setProvider] = useState(() => { - return (localStorage.getItem('selected-provider') as SessionProvider) || 'claude'; + const [provider, setProvider] = useState(() => { + return (localStorage.getItem('selected-provider') as LLMProvider) || 'claude'; }); const [cursorModel, setCursorModel] = useState(() => { return localStorage.getItem('cursor-model') || CURSOR_MODELS.DEFAULT; diff --git a/src/components/chat/hooks/useChatRealtimeHandlers.ts b/src/components/chat/hooks/useChatRealtimeHandlers.ts index 6d734730..73d1a5e7 100644 --- a/src/components/chat/hooks/useChatRealtimeHandlers.ts +++ b/src/components/chat/hooks/useChatRealtimeHandlers.ts @@ -1,7 +1,7 @@ import { useEffect, useRef } from 'react'; import type { Dispatch, MutableRefObject, SetStateAction } from 'react'; import type { PendingPermissionRequest } from '../types/types'; -import type { Project, ProjectSession, SessionProvider } from '../../../types/app'; +import type { Project, ProjectSession, LLMProvider } from '../../../types/app'; import type { SessionStore, NormalizedMessage } from '../../../stores/useSessionStore'; type PendingViewSession = { @@ -48,7 +48,7 @@ type LatestChatMessage = { interface UseChatRealtimeHandlersArgs { latestMessage: LatestChatMessage | null; - provider: SessionProvider; + provider: LLMProvider; selectedProject: Project | null; selectedSession: ProjectSession | null; currentSessionId: string | null; diff --git a/src/components/chat/hooks/useChatSessionState.ts b/src/components/chat/hooks/useChatSessionState.ts index e952ee1a..b551060a 100644 --- a/src/components/chat/hooks/useChatSessionState.ts +++ b/src/components/chat/hooks/useChatSessionState.ts @@ -2,7 +2,7 @@ import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } fr import type { MutableRefObject } from 'react'; import { authenticatedFetch } from '../../../utils/api'; import type { ChatMessage, Provider } from '../types/types'; -import type { Project, ProjectSession, SessionProvider } from '../../../types/app'; +import type { Project, ProjectSession, LLMProvider } from '../../../types/app'; import { createCachedDiffCalculator, type DiffCalculator } from '../utils/messageTransforms'; import { normalizedToChatMessages } from './useChatMessages'; import type { SessionStore, NormalizedMessage } from '../../../stores/useSessionStore'; @@ -40,7 +40,7 @@ interface ScrollRestoreState { function chatMessageToNormalized( msg: ChatMessage, sessionId: string, - provider: SessionProvider, + provider: LLMProvider, ): NormalizedMessage | null { const id = `local_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`; const ts = msg.timestamp instanceof Date @@ -151,7 +151,7 @@ export function useChatSessionState({ // When a real session ID arrives and we have a pending user message, flush it to the store const prevActiveSessionRef = useRef(null); if (activeSessionId && activeSessionId !== prevActiveSessionRef.current && pendingUserMessage) { - const prov = (localStorage.getItem('selected-provider') as SessionProvider) || 'claude'; + const prov = (localStorage.getItem('selected-provider') as LLMProvider) || 'claude'; const normalized = chatMessageToNormalized(pendingUserMessage, activeSessionId, prov); if (normalized) { sessionStore.appendRealtime(activeSessionId, normalized); @@ -189,7 +189,7 @@ export function useChatSessionState({ setPendingUserMessage(msg); return; } - const prov = (localStorage.getItem('selected-provider') as SessionProvider) || 'claude'; + const prov = (localStorage.getItem('selected-provider') as LLMProvider) || 'claude'; const normalized = chatMessageToNormalized(msg, activeSessionId, prov); if (normalized) { sessionStore.appendRealtime(activeSessionId, normalized); @@ -240,7 +240,7 @@ export function useChatSessionState({ try { const slot = await sessionStore.fetchMore(selectedSession.id, { - provider: sessionProvider as SessionProvider, + provider: sessionProvider as LLMProvider, projectName: selectedProject.name, projectPath: selectedProject.fullPath || selectedProject.path || '', limit: MESSAGES_PER_PAGE, @@ -374,7 +374,7 @@ export function useChatSessionState({ // Fetch from server → store updates → chatMessages re-derives automatically setIsLoadingSessionMessages(true); sessionStore.fetchFromServer(selectedSession.id, { - provider: (selectedSession.__provider || provider) as SessionProvider, + provider: (selectedSession.__provider || provider) as LLMProvider, projectName: selectedProject.name, projectPath: selectedProject.fullPath || selectedProject.path || '', limit: MESSAGES_PER_PAGE, @@ -410,7 +410,7 @@ export function useChatSessionState({ // Skip store refresh during active streaming if (!isLoading) { await sessionStore.refreshFromServer(selectedSession.id, { - provider: (selectedSession.__provider || provider) as SessionProvider, + provider: (selectedSession.__provider || provider) as LLMProvider, projectName: selectedProject.name, projectPath: selectedProject.fullPath || selectedProject.path || '', }); @@ -468,7 +468,7 @@ export function useChatSessionState({ try { // Load all messages into the store for search navigation const slot = await sessionStore.fetchFromServer(selectedSession.id, { - provider: sessionProvider as SessionProvider, + provider: sessionProvider as LLMProvider, projectName: selectedProject.name, projectPath: selectedProject.fullPath || selectedProject.path || '', limit: null, @@ -655,7 +655,7 @@ export function useChatSessionState({ try { const slot = await sessionStore.fetchFromServer(requestSessionId, { - provider: sessionProvider as SessionProvider, + provider: sessionProvider as LLMProvider, projectName: selectedProject.name, projectPath: selectedProject.fullPath || selectedProject.path || '', limit: null, diff --git a/src/components/chat/types/types.ts b/src/components/chat/types/types.ts index 66d50741..900028c0 100644 --- a/src/components/chat/types/types.ts +++ b/src/components/chat/types/types.ts @@ -1,6 +1,6 @@ -import type { Project, ProjectSession, SessionProvider } from '../../../types/app'; +import type { Project, ProjectSession, LLMProvider } from '../../../types/app'; -export type Provider = SessionProvider; +export type Provider = LLMProvider; export type PermissionMode = 'default' | 'acceptEdits' | 'bypassPermissions' | 'plan'; diff --git a/src/components/chat/view/ChatInterface.tsx b/src/components/chat/view/ChatInterface.tsx index 19483f64..44709502 100644 --- a/src/components/chat/view/ChatInterface.tsx +++ b/src/components/chat/view/ChatInterface.tsx @@ -3,7 +3,7 @@ import { useTranslation } from 'react-i18next'; import { useTasksSettings } from '../../../contexts/TasksSettingsContext'; import { QuickSettingsPanel } from '../../quick-settings-panel'; import type { ChatInterfaceProps, Provider } from '../types/types'; -import type { SessionProvider } from '../../../types/app'; +import type { LLMProvider } from '../../../types/app'; import { useChatProviderState } from '../hooks/useChatProviderState'; import { useChatSessionState } from '../hooks/useChatSessionState'; import { useChatRealtimeHandlers } from '../hooks/useChatRealtimeHandlers'; @@ -206,9 +206,9 @@ function ChatInterface({ // so missed streaming events are shown. Also reset isLoading. const handleWebSocketReconnect = useCallback(async () => { if (!selectedProject || !selectedSession) return; - const providerVal = (localStorage.getItem('selected-provider') as SessionProvider) || 'claude'; + const providerVal = (localStorage.getItem('selected-provider') as LLMProvider) || 'claude'; await sessionStore.refreshFromServer(selectedSession.id, { - provider: (selectedSession.__provider || providerVal) as SessionProvider, + provider: (selectedSession.__provider || providerVal) as LLMProvider, projectName: selectedProject.name, projectPath: selectedProject.fullPath || selectedProject.path || '', }); diff --git a/src/components/chat/view/subcomponents/ChatMessagesPane.tsx b/src/components/chat/view/subcomponents/ChatMessagesPane.tsx index 63ae4841..9d47a7c2 100644 --- a/src/components/chat/view/subcomponents/ChatMessagesPane.tsx +++ b/src/components/chat/view/subcomponents/ChatMessagesPane.tsx @@ -2,7 +2,7 @@ import { useTranslation } from 'react-i18next'; import { useCallback, useRef } from 'react'; import type { Dispatch, RefObject, SetStateAction } from 'react'; import type { ChatMessage } from '../../types/types'; -import type { Project, ProjectSession, SessionProvider } from '../../../../types/app'; +import type { Project, ProjectSession, LLMProvider } from '../../../../types/app'; import { getIntrinsicMessageKey } from '../../utils/messageKeys'; import MessageComponent from './MessageComponent'; import ProviderSelectionEmptyState from './ProviderSelectionEmptyState'; @@ -15,8 +15,8 @@ interface ChatMessagesPaneProps { chatMessages: ChatMessage[]; selectedSession: ProjectSession | null; currentSessionId: string | null; - provider: SessionProvider; - setProvider: (provider: SessionProvider) => void; + provider: LLMProvider; + setProvider: (provider: LLMProvider) => void; textareaRef: RefObject; claudeModel: string; setClaudeModel: (model: string) => void; diff --git a/src/components/chat/view/subcomponents/ProviderSelectionEmptyState.tsx b/src/components/chat/view/subcomponents/ProviderSelectionEmptyState.tsx index 792b12c7..9eaf690e 100644 --- a/src/components/chat/view/subcomponents/ProviderSelectionEmptyState.tsx +++ b/src/components/chat/view/subcomponents/ProviderSelectionEmptyState.tsx @@ -8,14 +8,14 @@ import { CODEX_MODELS, GEMINI_MODELS, } from "../../../../../shared/modelConstants"; -import type { ProjectSession, SessionProvider } from "../../../../types/app"; +import type { ProjectSession, LLMProvider } from "../../../../types/app"; import { NextTaskBanner } from "../../../task-master"; type ProviderSelectionEmptyStateProps = { selectedSession: ProjectSession | null; currentSessionId: string | null; - provider: SessionProvider; - setProvider: (next: SessionProvider) => void; + provider: LLMProvider; + setProvider: (next: LLMProvider) => void; textareaRef: React.RefObject; claudeModel: string; setClaudeModel: (model: string) => void; @@ -32,7 +32,7 @@ type ProviderSelectionEmptyStateProps = { }; type ProviderDef = { - id: SessionProvider; + id: LLMProvider; name: string; infoKey: string; accent: string; @@ -75,7 +75,7 @@ const PROVIDERS: ProviderDef[] = [ }, ]; -function getModelConfig(p: SessionProvider) { +function getModelConfig(p: LLMProvider) { if (p === "claude") return CLAUDE_MODELS; if (p === "codex") return CODEX_MODELS; if (p === "gemini") return GEMINI_MODELS; @@ -83,7 +83,7 @@ function getModelConfig(p: SessionProvider) { } function getModelValue( - p: SessionProvider, + p: LLMProvider, c: string, cu: string, co: string, @@ -119,7 +119,7 @@ export default function ProviderSelectionEmptyState({ defaultValue: "Start the next task", }); - const selectProvider = (next: SessionProvider) => { + const selectProvider = (next: LLMProvider) => { setProvider(next); localStorage.setItem("selected-provider", next); setTimeout(() => textareaRef.current?.focus(), 100); diff --git a/src/components/llm-logo-provider/SessionProviderLogo.tsx b/src/components/llm-logo-provider/SessionProviderLogo.tsx index 1eaef523..53c02291 100644 --- a/src/components/llm-logo-provider/SessionProviderLogo.tsx +++ b/src/components/llm-logo-provider/SessionProviderLogo.tsx @@ -1,11 +1,11 @@ -import type { SessionProvider } from '../../types/app'; +import type { LLMProvider } from '../../types/app'; import ClaudeLogo from './ClaudeLogo'; import CodexLogo from './CodexLogo'; import CursorLogo from './CursorLogo'; import GeminiLogo from './GeminiLogo'; type SessionProviderLogoProps = { - provider?: SessionProvider | string | null; + provider?: LLMProvider | string | null; className?: string; }; diff --git a/src/components/onboarding/view/Onboarding.tsx b/src/components/onboarding/view/Onboarding.tsx index de5cbc42..6d9a69ca 100644 --- a/src/components/onboarding/view/Onboarding.tsx +++ b/src/components/onboarding/view/Onboarding.tsx @@ -1,8 +1,8 @@ import { Check, ChevronLeft, ChevronRight, Loader2 } from 'lucide-react'; import { useCallback, useEffect, useRef, useState } from 'react'; +import type { LLMProvider } from '../../../types/app'; import { authenticatedFetch } from '../../../utils/api'; import { useProviderAuthStatus } from '../../provider-auth/hooks/useProviderAuthStatus'; -import type { CliProvider } from '../../provider-auth/types'; import ProviderLoginModal from '../../provider-auth/view/ProviderLoginModal'; import AgentConnectionsStep from './subcomponents/AgentConnectionsStep'; import GitConfigurationStep from './subcomponents/GitConfigurationStep'; @@ -22,14 +22,14 @@ export default function Onboarding({ onComplete }: OnboardingProps) { const [gitEmail, setGitEmail] = useState(''); const [isSubmitting, setIsSubmitting] = useState(false); const [errorMessage, setErrorMessage] = useState(''); - const [activeLoginProvider, setActiveLoginProvider] = useState(null); + const [activeLoginProvider, setActiveLoginProvider] = useState(null); const { providerAuthStatus, checkProviderAuthStatus, refreshProviderAuthStatuses, } = useProviderAuthStatus(); - const previousActiveLoginProviderRef = useRef(undefined); + const previousActiveLoginProviderRef = useRef(undefined); const loadGitConfig = useCallback(async () => { try { @@ -69,7 +69,7 @@ export default function Onboarding({ onComplete }: OnboardingProps) { } }, [activeLoginProvider, refreshProviderAuthStatuses]); - const handleProviderLoginOpen = (provider: CliProvider) => { + const handleProviderLoginOpen = (provider: LLMProvider) => { setActiveLoginProvider(provider); }; diff --git a/src/components/onboarding/view/subcomponents/AgentConnectionCard.tsx b/src/components/onboarding/view/subcomponents/AgentConnectionCard.tsx index 55c40702..3737ad54 100644 --- a/src/components/onboarding/view/subcomponents/AgentConnectionCard.tsx +++ b/src/components/onboarding/view/subcomponents/AgentConnectionCard.tsx @@ -1,9 +1,10 @@ import { Check } from 'lucide-react'; import SessionProviderLogo from '../../../llm-logo-provider/SessionProviderLogo'; -import type { CliProvider, ProviderAuthStatus } from '../../../provider-auth/types'; +import type { LLMProvider } from '../../../../types/app'; +import type { ProviderAuthStatus } from '../../../provider-auth/types'; type AgentConnectionCardProps = { - provider: CliProvider; + provider: LLMProvider; title: string; status: ProviderAuthStatus; connectedClassName: string; diff --git a/src/components/onboarding/view/subcomponents/AgentConnectionsStep.tsx b/src/components/onboarding/view/subcomponents/AgentConnectionsStep.tsx index 0443facc..3dfb25a9 100644 --- a/src/components/onboarding/view/subcomponents/AgentConnectionsStep.tsx +++ b/src/components/onboarding/view/subcomponents/AgentConnectionsStep.tsx @@ -1,9 +1,10 @@ -import type { CliProvider, ProviderAuthStatusMap } from '../../../provider-auth/types'; +import type { LLMProvider } from '../../../../types/app'; +import type { ProviderAuthStatusMap } from '../../../provider-auth/types'; import AgentConnectionCard from './AgentConnectionCard'; type AgentConnectionsStepProps = { providerStatuses: ProviderAuthStatusMap; - onOpenProviderLogin: (provider: CliProvider) => void; + onOpenProviderLogin: (provider: LLMProvider) => void; }; const providerCards = [ diff --git a/src/components/provider-auth/hooks/useProviderAuthStatus.ts b/src/components/provider-auth/hooks/useProviderAuthStatus.ts index a162b75e..83692a2a 100644 --- a/src/components/provider-auth/hooks/useProviderAuthStatus.ts +++ b/src/components/provider-auth/hooks/useProviderAuthStatus.ts @@ -1,12 +1,12 @@ import { useCallback, useState } from 'react'; import { authenticatedFetch } from '../../../utils/api'; +import type { LLMProvider } from '../../../types/app'; import { CLI_AUTH_STATUS_ENDPOINTS, CLI_PROVIDERS, createInitialProviderAuthStatusMap, } from '../types'; import type { - CliProvider, ProviderAuthStatus, ProviderAuthStatusMap, } from '../types'; @@ -47,7 +47,7 @@ export function useProviderAuthStatus( createInitialProviderAuthStatusMap(initialLoading) )); - const setProviderLoading = useCallback((provider: CliProvider) => { + const setProviderLoading = useCallback((provider: LLMProvider) => { setProviderAuthStatus((previous) => ({ ...previous, [provider]: { @@ -58,14 +58,14 @@ export function useProviderAuthStatus( })); }, []); - const setProviderStatus = useCallback((provider: CliProvider, status: ProviderAuthStatus) => { + const setProviderStatus = useCallback((provider: LLMProvider, status: ProviderAuthStatus) => { setProviderAuthStatus((previous) => ({ ...previous, [provider]: status, })); }, []); - const checkProviderAuthStatus = useCallback(async (provider: CliProvider) => { + const checkProviderAuthStatus = useCallback(async (provider: LLMProvider) => { setProviderLoading(provider); try { @@ -96,7 +96,7 @@ export function useProviderAuthStatus( } }, [setProviderLoading, setProviderStatus]); - const refreshProviderAuthStatuses = useCallback(async (providers: CliProvider[] = CLI_PROVIDERS) => { + const refreshProviderAuthStatuses = useCallback(async (providers: LLMProvider[] = CLI_PROVIDERS) => { await Promise.all(providers.map((provider) => checkProviderAuthStatus(provider))); }, [checkProviderAuthStatus]); diff --git a/src/components/provider-auth/types.ts b/src/components/provider-auth/types.ts index e7ee49f2..bb93199c 100644 --- a/src/components/provider-auth/types.ts +++ b/src/components/provider-auth/types.ts @@ -1,4 +1,4 @@ -export type CliProvider = 'claude' | 'cursor' | 'codex' | 'gemini'; +import type { LLMProvider } from '../../types/app'; export type ProviderAuthStatus = { authenticated: boolean; @@ -8,11 +8,11 @@ export type ProviderAuthStatus = { loading: boolean; }; -export type ProviderAuthStatusMap = Record; +export type ProviderAuthStatusMap = Record; -export const CLI_PROVIDERS: CliProvider[] = ['claude', 'cursor', 'codex', 'gemini']; +export const CLI_PROVIDERS: LLMProvider[] = ['claude', 'cursor', 'codex', 'gemini']; -export const CLI_AUTH_STATUS_ENDPOINTS: Record = { +export const CLI_AUTH_STATUS_ENDPOINTS: Record = { claude: '/api/cli/claude/status', cursor: '/api/cli/cursor/status', codex: '/api/cli/codex/status', diff --git a/src/components/provider-auth/view/ProviderLoginModal.tsx b/src/components/provider-auth/view/ProviderLoginModal.tsx index a1d66d95..fa1d4407 100644 --- a/src/components/provider-auth/view/ProviderLoginModal.tsx +++ b/src/components/provider-auth/view/ProviderLoginModal.tsx @@ -1,12 +1,12 @@ import { ExternalLink, KeyRound, X } from 'lucide-react'; import StandaloneShell from '../../standalone-shell/view/StandaloneShell'; import { DEFAULT_PROJECT_FOR_EMPTY_SHELL, IS_PLATFORM } from '../../../constants/config'; -import type { CliProvider } from '../types'; +import type { LLMProvider } from '../../../types/app'; type ProviderLoginModalProps = { isOpen: boolean; onClose: () => void; - provider?: CliProvider; + provider?: LLMProvider; onComplete?: (exitCode: number) => void; customCommand?: string; isAuthenticated?: boolean; @@ -17,7 +17,7 @@ const getProviderCommand = ({ customCommand, isAuthenticated: _isAuthenticated, }: { - provider: CliProvider; + provider: LLMProvider; customCommand?: string; isAuthenticated: boolean; }) => { @@ -40,7 +40,7 @@ const getProviderCommand = ({ return 'gemini status'; }; -const getProviderTitle = (provider: CliProvider) => { +const getProviderTitle = (provider: LLMProvider) => { if (provider === 'claude') return 'Claude CLI Login'; if (provider === 'cursor') return 'Cursor CLI Login'; if (provider === 'codex') return 'Codex CLI Login'; diff --git a/src/components/settings/types/types.ts b/src/components/settings/types/types.ts index d6328644..235d0b47 100644 --- a/src/components/settings/types/types.ts +++ b/src/components/settings/types/types.ts @@ -1,8 +1,9 @@ import type { Dispatch, SetStateAction } from 'react'; -import type { CliProvider, ProviderAuthStatus } from '../../provider-auth/types'; +import type { LLMProvider } from '../../../types/app'; +import type { ProviderAuthStatus } from '../../provider-auth/types'; export type SettingsMainTab = 'agents' | 'appearance' | 'git' | 'api' | 'tasks' | 'notifications' | 'plugins' | 'about'; -export type AgentProvider = CliProvider; +export type AgentProvider = LLMProvider; export type AgentCategory = 'account' | 'permissions' | 'mcp'; export type ProjectSortOrder = 'name' | 'date'; export type SaveStatus = 'success' | 'error' | null; diff --git a/src/components/sidebar/hooks/useSidebarController.ts b/src/components/sidebar/hooks/useSidebarController.ts index 7141208e..37570a55 100644 --- a/src/components/sidebar/hooks/useSidebarController.ts +++ b/src/components/sidebar/hooks/useSidebarController.ts @@ -2,7 +2,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import type React from 'react'; import type { TFunction } from 'i18next'; import { api } from '../../../utils/api'; -import type { Project, ProjectSession, SessionProvider } from '../../../types/app'; +import type { Project, ProjectSession, LLMProvider } from '../../../types/app'; import type { AdditionalSessionsByProject, DeleteProjectConfirmation, @@ -545,7 +545,7 @@ export function useSidebarController({ }, [onRefresh]); const updateSessionSummary = useCallback( - async (_projectName: string, sessionId: string, summary: string, provider: SessionProvider) => { + async (_projectName: string, sessionId: string, summary: string, provider: LLMProvider) => { const trimmed = summary.trim(); if (!trimmed) { setEditingSession(null); diff --git a/src/components/sidebar/types/types.ts b/src/components/sidebar/types/types.ts index bab1b665..9154717e 100644 --- a/src/components/sidebar/types/types.ts +++ b/src/components/sidebar/types/types.ts @@ -1,9 +1,9 @@ -import type { LoadingProgress, Project, ProjectSession, SessionProvider } from '../../../types/app'; +import type { LoadingProgress, Project, ProjectSession, LLMProvider } from '../../../types/app'; export type ProjectSortOrder = 'name' | 'date'; export type SessionWithProvider = ProjectSession & { - __provider: SessionProvider; + __provider: LLMProvider; }; export type AdditionalSessionsByProject = Record; @@ -18,7 +18,7 @@ export type SessionDeleteConfirmation = { projectName: string; sessionId: string; sessionTitle: string; - provider: SessionProvider; + provider: LLMProvider; }; export type SidebarProps = { diff --git a/src/components/sidebar/view/Sidebar.tsx b/src/components/sidebar/view/Sidebar.tsx index fefb6dca..0d6c9061 100644 --- a/src/components/sidebar/view/Sidebar.tsx +++ b/src/components/sidebar/view/Sidebar.tsx @@ -6,7 +6,7 @@ import { useUiPreferences } from '../../../hooks/useUiPreferences'; import { useSidebarController } from '../hooks/useSidebarController'; import { useTaskMaster } from '../../../contexts/TaskMasterContext'; import { useTasksSettings } from '../../../contexts/TasksSettingsContext'; -import type { Project, SessionProvider } from '../../../types/app'; +import type { Project, LLMProvider } from '../../../types/app'; import type { MCPServerStatus, SidebarProps } from '../types/types'; import SidebarCollapsed from './subcomponents/SidebarCollapsed'; import SidebarContent from './subcomponents/SidebarContent'; @@ -177,7 +177,7 @@ function Sidebar({ setEditingSession(null); setEditingSessionName(''); }, - onSaveEditingSession: (projectName: string, sessionId: string, summary: string, provider: SessionProvider) => { + onSaveEditingSession: (projectName: string, sessionId: string, summary: string, provider: LLMProvider) => { void updateSessionSummary(projectName, sessionId, summary, provider); }, t, @@ -235,7 +235,7 @@ function Sidebar({ isSearching={isSearching} searchProgress={searchProgress} onConversationResultClick={(projectName: string, sessionId: string, provider: string, messageTimestamp?: string | null, messageSnippet?: string | null) => { - const resolvedProvider = (provider || 'claude') as SessionProvider; + const resolvedProvider = (provider || 'claude') as LLMProvider; const project = projects.find(p => p.name === projectName); const searchTarget = { __searchTargetTimestamp: messageTimestamp || null, __searchTargetSnippet: messageSnippet || null }; const sessionObj = { diff --git a/src/components/sidebar/view/subcomponents/SidebarProjectItem.tsx b/src/components/sidebar/view/subcomponents/SidebarProjectItem.tsx index ae0bdf97..5ac02019 100644 --- a/src/components/sidebar/view/subcomponents/SidebarProjectItem.tsx +++ b/src/components/sidebar/view/subcomponents/SidebarProjectItem.tsx @@ -2,7 +2,7 @@ import { Check, ChevronDown, ChevronRight, Edit3, Folder, FolderOpen, Star, Tras import type { TFunction } from 'i18next'; import { Button } from '../../../../shared/view/ui'; import { cn } from '../../../../lib/utils'; -import type { Project, ProjectSession, SessionProvider } from '../../../../types/app'; +import type { Project, ProjectSession, LLMProvider } from '../../../../types/app'; import type { MCPServerStatus, SessionWithProvider } from '../../types/types'; import { getTaskIndicatorStatus } from '../../utils/utils'; import TaskIndicator from './TaskIndicator'; @@ -38,14 +38,14 @@ type SidebarProjectItemProps = { projectName: string, sessionId: string, sessionTitle: string, - provider: SessionProvider, + provider: LLMProvider, ) => void; onLoadMoreSessions: (project: Project) => void; onNewSession: (project: Project) => void; onEditingSessionNameChange: (value: string) => void; onStartEditingSession: (sessionId: string, initialName: string) => void; onCancelEditingSession: () => void; - onSaveEditingSession: (projectName: string, sessionId: string, summary: string, provider: SessionProvider) => void; + onSaveEditingSession: (projectName: string, sessionId: string, summary: string, provider: LLMProvider) => void; t: TFunction; }; diff --git a/src/components/sidebar/view/subcomponents/SidebarProjectList.tsx b/src/components/sidebar/view/subcomponents/SidebarProjectList.tsx index bd0fdbb3..a755b1da 100644 --- a/src/components/sidebar/view/subcomponents/SidebarProjectList.tsx +++ b/src/components/sidebar/view/subcomponents/SidebarProjectList.tsx @@ -1,6 +1,6 @@ import { useEffect } from 'react'; import type { TFunction } from 'i18next'; -import type { LoadingProgress, Project, ProjectSession, SessionProvider } from '../../../../types/app'; +import type { LoadingProgress, Project, ProjectSession, LLMProvider } from '../../../../types/app'; import type { LoadingSessionsByProject, MCPServerStatus, @@ -42,14 +42,14 @@ export type SidebarProjectListProps = { projectName: string, sessionId: string, sessionTitle: string, - provider: SessionProvider, + provider: LLMProvider, ) => void; onLoadMoreSessions: (project: Project) => void; onNewSession: (project: Project) => void; onEditingSessionNameChange: (value: string) => void; onStartEditingSession: (sessionId: string, initialName: string) => void; onCancelEditingSession: () => void; - onSaveEditingSession: (projectName: string, sessionId: string, summary: string, provider: SessionProvider) => void; + onSaveEditingSession: (projectName: string, sessionId: string, summary: string, provider: LLMProvider) => void; t: TFunction; }; diff --git a/src/components/sidebar/view/subcomponents/SidebarProjectSessions.tsx b/src/components/sidebar/view/subcomponents/SidebarProjectSessions.tsx index a5ceaa06..2f4068e9 100644 --- a/src/components/sidebar/view/subcomponents/SidebarProjectSessions.tsx +++ b/src/components/sidebar/view/subcomponents/SidebarProjectSessions.tsx @@ -1,7 +1,7 @@ import { ChevronDown, Plus } from 'lucide-react'; import type { TFunction } from 'i18next'; import { Button } from '../../../../shared/view/ui'; -import type { Project, ProjectSession, SessionProvider } from '../../../../types/app'; +import type { Project, ProjectSession, LLMProvider } from '../../../../types/app'; import type { SessionWithProvider } from '../../types/types'; import SidebarSessionItem from './SidebarSessionItem'; @@ -18,14 +18,14 @@ type SidebarProjectSessionsProps = { onEditingSessionNameChange: (value: string) => void; onStartEditingSession: (sessionId: string, initialName: string) => void; onCancelEditingSession: () => void; - onSaveEditingSession: (projectName: string, sessionId: string, summary: string, provider: SessionProvider) => void; + onSaveEditingSession: (projectName: string, sessionId: string, summary: string, provider: LLMProvider) => void; onProjectSelect: (project: Project) => void; onSessionSelect: (session: SessionWithProvider, projectName: string) => void; onDeleteSession: ( projectName: string, sessionId: string, sessionTitle: string, - provider: SessionProvider, + provider: LLMProvider, ) => void; onLoadMoreSessions: (project: Project) => void; onNewSession: (project: Project) => void; diff --git a/src/components/sidebar/view/subcomponents/SidebarSessionItem.tsx b/src/components/sidebar/view/subcomponents/SidebarSessionItem.tsx index a0f9b8d9..507478a8 100644 --- a/src/components/sidebar/view/subcomponents/SidebarSessionItem.tsx +++ b/src/components/sidebar/view/subcomponents/SidebarSessionItem.tsx @@ -3,7 +3,7 @@ import type { TFunction } from 'i18next'; import { Badge, Button } from '../../../../shared/view/ui'; import { cn } from '../../../../lib/utils'; import { formatTimeAgo } from '../../../../utils/dateUtils'; -import type { Project, ProjectSession, SessionProvider } from '../../../../types/app'; +import type { Project, ProjectSession, LLMProvider } from '../../../../types/app'; import type { SessionWithProvider } from '../../types/types'; import { createSessionViewModel } from '../../utils/utils'; import SessionProviderLogo from '../../../llm-logo-provider/SessionProviderLogo'; @@ -18,14 +18,14 @@ type SidebarSessionItemProps = { onEditingSessionNameChange: (value: string) => void; onStartEditingSession: (sessionId: string, initialName: string) => void; onCancelEditingSession: () => void; - onSaveEditingSession: (projectName: string, sessionId: string, summary: string, provider: SessionProvider) => void; + onSaveEditingSession: (projectName: string, sessionId: string, summary: string, provider: LLMProvider) => void; onProjectSelect: (project: Project) => void; onSessionSelect: (session: SessionWithProvider, projectName: string) => void; onDeleteSession: ( projectName: string, sessionId: string, sessionTitle: string, - provider: SessionProvider, + provider: LLMProvider, ) => void; t: TFunction; }; diff --git a/src/stores/useSessionStore.ts b/src/stores/useSessionStore.ts index 60ace484..5f6446be 100644 --- a/src/stores/useSessionStore.ts +++ b/src/stores/useSessionStore.ts @@ -8,7 +8,7 @@ */ import { useCallback, useMemo, useRef, useState } from 'react'; -import type { SessionProvider } from '../types/app'; +import type { LLMProvider } from '../types/app'; import { authenticatedFetch } from '../utils/api'; // ─── NormalizedMessage (mirrors server/adapters/types.js) ──────────────────── @@ -33,7 +33,7 @@ export interface NormalizedMessage { id: string; sessionId: string; timestamp: string; - provider: SessionProvider; + provider: LLMProvider; kind: MessageKind; // kind-specific fields (flat for simplicity) @@ -169,7 +169,7 @@ export function useSessionStore() { const fetchFromServer = useCallback(async ( sessionId: string, opts: { - provider?: SessionProvider; + provider?: LLMProvider; projectName?: string; projectPath?: string; limit?: number | null; @@ -228,7 +228,7 @@ export function useSessionStore() { const fetchMore = useCallback(async ( sessionId: string, opts: { - provider?: SessionProvider; + provider?: LLMProvider; projectName?: string; projectPath?: string; limit?: number; @@ -303,7 +303,7 @@ export function useSessionStore() { const refreshFromServer = useCallback(async ( sessionId: string, opts: { - provider?: SessionProvider; + provider?: LLMProvider; projectName?: string; projectPath?: string; } = {}, @@ -357,7 +357,7 @@ export function useSessionStore() { * Update or create a streaming message (accumulated text so far). * Uses a well-known ID so subsequent calls replace the same message. */ - const updateStreaming = useCallback((sessionId: string, accumulatedText: string, msgProvider: SessionProvider) => { + const updateStreaming = useCallback((sessionId: string, accumulatedText: string, msgProvider: LLMProvider) => { const slot = getSlot(sessionId); const streamId = `__streaming_${sessionId}`; const msg: NormalizedMessage = { diff --git a/src/types/app.ts b/src/types/app.ts index 9abaac6b..4c2f230d 100644 --- a/src/types/app.ts +++ b/src/types/app.ts @@ -1,4 +1,4 @@ -export type SessionProvider = 'claude' | 'cursor' | 'codex' | 'gemini'; +export type LLMProvider = 'claude' | 'cursor' | 'codex' | 'gemini'; export type AppTab = 'chat' | 'files' | 'shell' | 'git' | 'tasks' | 'preview' | `plugin:${string}`; @@ -12,7 +12,7 @@ export interface ProjectSession { updated_at?: string; lastActivity?: string; messageCount?: number; - __provider?: SessionProvider; + __provider?: LLMProvider; __projectName?: string; [key: string]: unknown; }