From 27ac4b2daa3351bcd741fba4cff0c1ef94d1fab6 Mon Sep 17 00:00:00 2001 From: OpenCode Agent Date: Tue, 12 May 2026 00:20:26 -0400 Subject: [PATCH] chore: remove dead code and unused exports --- .../src/services/opencode-single-server.ts | 3 +- frontend/src/api/fetchWrapper.ts | 10 +- .../file-browser/FilePreviewDialog.tsx | 93 ---------------- .../components/message/FileSuggestions.tsx | 80 -------------- .../message/MessageActionButtons.tsx | 48 --------- .../src/components/modals/PassphraseModal.tsx | 102 ------------------ frontend/src/contexts/EventContext.tsx | 5 - frontend/src/hooks/useDebounce.ts | 12 --- frontend/src/lib/agent-colors.ts | 2 +- frontend/src/lib/exportSession.ts | 2 +- frontend/src/lib/fileReferences.ts | 19 +--- 11 files changed, 5 insertions(+), 371 deletions(-) delete mode 100644 frontend/src/components/file-browser/FilePreviewDialog.tsx delete mode 100644 frontend/src/components/message/FileSuggestions.tsx delete mode 100644 frontend/src/components/message/MessageActionButtons.tsx delete mode 100644 frontend/src/components/modals/PassphraseModal.tsx delete mode 100644 frontend/src/hooks/useDebounce.ts diff --git a/backend/src/services/opencode-single-server.ts b/backend/src/services/opencode-single-server.ts index 3d7f8e07..205281c6 100644 --- a/backend/src/services/opencode-single-server.ts +++ b/backend/src/services/opencode-single-server.ts @@ -24,8 +24,7 @@ import { patchConfigWithRecovery } from './opencode/config-recovery' import type { OpenCodeClient } from './opencode/client' import { writeFileContent } from './file-operations' -const OPENCODE_SERVER_HOST = ENV.OPENCODE.HOST -export const OPENCODE_SERVER_CONNECT_HOST = OPENCODE_SERVER_HOST === '0.0.0.0' ? '127.0.0.1' : OPENCODE_SERVER_HOST + const MIN_OPENCODE_VERSION = '1.0.137' const MAX_STDERR_SIZE = 10240 const HEALTH_CHECK_TIMEOUT_MS = 3000 diff --git a/frontend/src/api/fetchWrapper.ts b/frontend/src/api/fetchWrapper.ts index 98e2d1ec..b3ab4661 100644 --- a/frontend/src/api/fetchWrapper.ts +++ b/frontend/src/api/fetchWrapper.ts @@ -102,14 +102,6 @@ async function fetchWrapper( } } -async function fetchWrapperText( - url: string, - options: FetchWrapperOptions = {} -): Promise { - const response = await fetchWithTimeout(url, options) - return response.text() -} - async function fetchWrapperVoid( url: string, options: FetchWrapperOptions = {} @@ -125,4 +117,4 @@ async function fetchWrapperBlob( return response.blob() } -export { fetchWrapper, fetchWrapperText, fetchWrapperVoid, fetchWrapperBlob } +export { fetchWrapper, fetchWrapperVoid, fetchWrapperBlob } diff --git a/frontend/src/components/file-browser/FilePreviewDialog.tsx b/frontend/src/components/file-browser/FilePreviewDialog.tsx deleted file mode 100644 index 333340ff..00000000 --- a/frontend/src/components/file-browser/FilePreviewDialog.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import { useState, useEffect } from 'react' -import { Dialog, DialogContent } from '@/components/ui/dialog' -import { FilePreview } from './FilePreview' -import { Loader2, FileText } from 'lucide-react' -import { API_BASE_URL } from '@/config' -import type { FileInfo } from '@/types/files' - -interface FilePreviewDialogProps { - isOpen: boolean - onClose: () => void - filePath: string - repoBasePath?: string - onFileSaved?: () => void - initialLineNumber?: number -} - -export function FilePreviewDialog({ isOpen, onClose, filePath, repoBasePath, onFileSaved, initialLineNumber }: FilePreviewDialogProps) { - const [file, setFile] = useState(null) - const [isLoading, setIsLoading] = useState(false) - const [error, setError] = useState(null) - - useEffect(() => { - if (!isOpen || !filePath) { - setFile(null) - setError(null) - return - } - - const fetchFile = async () => { - setIsLoading(true) - setError(null) - - try { - const fullPath = repoBasePath ? `${repoBasePath}/${filePath}` : filePath - const response = await fetch(`${API_BASE_URL}/api/files/${fullPath}`) - - if (!response.ok) { - throw new Error(`Failed to load file: ${response.statusText}`) - } - - const data = await response.json() - setFile(data) - } catch (err) { - setError(err instanceof Error ? err.message : 'Failed to load file') - } finally { - setIsLoading(false) - } - } - - fetchFile() - }, [isOpen, filePath, repoBasePath]) - - const handleOpenChange = (open: boolean) => { - if (!open) { - onClose() - } - } - - return ( - - -
- {isLoading ? ( -
- -
- ) : error ? ( -
- -

Failed to load file

-

{error}

-
- ) : file ? ( - - ) : null} -
-
-
- ) -} diff --git a/frontend/src/components/message/FileSuggestions.tsx b/frontend/src/components/message/FileSuggestions.tsx deleted file mode 100644 index ebf53ad1..00000000 --- a/frontend/src/components/message/FileSuggestions.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import { useEffect, useRef } from 'react' - -interface FileSuggestionsProps { - isOpen: boolean - files: string[] - onSelect: (file: string) => void - onClose: () => void - selectedIndex?: number -} - -export function FileSuggestions({ - isOpen, - files, - onSelect, - onClose, - selectedIndex = 0 -}: FileSuggestionsProps) { - const listRef = useRef(null) - - useEffect(() => { - if (!isOpen) return - - const handleClickOutside = (e: MouseEvent) => { - if (listRef.current && !listRef.current.contains(e.target as Node)) { - onClose() - } - } - - document.addEventListener('mousedown', handleClickOutside) - return () => document.removeEventListener('mousedown', handleClickOutside) - }, [isOpen, onClose]) - - useEffect(() => { - if (!isOpen || !listRef.current) return - - const selectedItem = listRef.current.children[selectedIndex] as HTMLElement - if (selectedItem) { - selectedItem.scrollIntoView({ block: 'nearest' }) - } - }, [selectedIndex, isOpen]) - - if (!isOpen || files.length === 0) return null - - const getFilename = (path: string) => path.split('/').pop() || path - const getDirectory = (path: string) => { - const parts = path.split('/') - return parts.slice(0, -1).join('/') || '.' - } - - return ( -
- {files.map((file, idx) => ( - - ))} -
- ) -} diff --git a/frontend/src/components/message/MessageActionButtons.tsx b/frontend/src/components/message/MessageActionButtons.tsx deleted file mode 100644 index 6945ef11..00000000 --- a/frontend/src/components/message/MessageActionButtons.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { memo } from 'react' -import { X, Loader2 } from 'lucide-react' -import { useRemoveMessage } from '@/hooks/useRemoveMessage' -import { useMobile } from '@/hooks/useMobile' -import type { MessageWithParts } from '@/api/types' - -interface MessageActionButtonsProps { - opcodeUrl: string - sessionId: string - directory?: string - message: MessageWithParts -} - -export const MessageActionButtons = memo(function MessageActionButtons({ - opcodeUrl, - sessionId, - directory, - message -}: MessageActionButtonsProps) { - const isMobile = useMobile() - const removeMessage = useRemoveMessage({ opcodeUrl, sessionId, directory }) - - const handleRemove = () => { - if (removeMessage.isPending) return - removeMessage.mutate({ messageID: message.info.id }) - } - - if (message.info.role !== 'assistant') { - return null - } - - return ( -
- -
- ) -}) diff --git a/frontend/src/components/modals/PassphraseModal.tsx b/frontend/src/components/modals/PassphraseModal.tsx deleted file mode 100644 index ebd8948d..00000000 --- a/frontend/src/components/modals/PassphraseModal.tsx +++ /dev/null @@ -1,102 +0,0 @@ -import { useState, useEffect, useRef } from 'react' -import { Button } from '@/components/ui/button' -import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog' -import { Input } from '@/components/ui/input' -import { Label } from '@/components/ui/label' -import { Lock, AlertCircle } from 'lucide-react' - -interface PassphraseModalProps { - open: boolean - onOpenChange: (open: boolean) => void - onSubmit: (passphrase: string) => void - credentialName?: string -} - -export function PassphraseModal({ open, onOpenChange, onSubmit, credentialName = 'SSH key' }: PassphraseModalProps) { - const [passphrase, setPassphrase] = useState('') - const [error, setError] = useState(null) - const inputRef = useRef(null) - - useEffect(() => { - if (open) { - setPassphrase('') - setError(null) - setTimeout(() => inputRef.current?.focus(), 100) - } - }, [open]) - - const handleSubmit = () => { - if (!passphrase.trim()) { - setError('Passphrase is required') - return - } - - onSubmit(passphrase) - setPassphrase('') - setError(null) - } - - const handleKeyDown = (e: React.KeyboardEvent) => { - if (e.key === 'Enter') { - e.preventDefault() - handleSubmit() - } - } - - return ( - - - - - - SSH Key Passphrase Required - - - Enter the passphrase for your {credentialName} - - - -
-
- -
- { - setPassphrase(e.target.value) - setError(null) - }} - onKeyDown={handleKeyDown} - placeholder="Enter your passphrase" - className={error ? 'border-destructive' : ''} - autoComplete="current-password" - /> -
- {error && ( -

- - {error} -

- )} -
- -

- This passphrase is NOT stored and will be required each time you access this SSH key. -

-
- - - - - -
-
- ) -} diff --git a/frontend/src/contexts/EventContext.tsx b/frontend/src/contexts/EventContext.tsx index cca10806..055e347b 100644 --- a/frontend/src/contexts/EventContext.tsx +++ b/frontend/src/contexts/EventContext.tsx @@ -626,11 +626,6 @@ export function useQuestions() { return questions } -export function usePendingAlerts(): boolean { - const { permissions, questions } = useEventContext() - return permissions.pendingCount + questions.pendingCount > 0 -} - export function useSSEHealth(): EventStreamHealthState { return useEventContext().sseHealth } diff --git a/frontend/src/hooks/useDebounce.ts b/frontend/src/hooks/useDebounce.ts deleted file mode 100644 index 839405f2..00000000 --- a/frontend/src/hooks/useDebounce.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { useState, useEffect } from 'react' - -export function useDebounce(value: T, delay: number): T { - const [debouncedValue, setDebouncedValue] = useState(value) - - useEffect(() => { - const timer = setTimeout(() => setDebouncedValue(value), delay) - return () => clearTimeout(timer) - }, [value, delay]) - - return debouncedValue -} diff --git a/frontend/src/lib/agent-colors.ts b/frontend/src/lib/agent-colors.ts index 8bd15574..4321c3c9 100644 --- a/frontend/src/lib/agent-colors.ts +++ b/frontend/src/lib/agent-colors.ts @@ -30,7 +30,7 @@ function isValidHex(color: string | undefined): color is string { return /^#[0-9A-Fa-f]{6}$/.test(color) } -export function getAgentColor( +function getAgentColor( agentName: string, apiColor?: string ): { light: string; dark: string } { diff --git a/frontend/src/lib/exportSession.ts b/frontend/src/lib/exportSession.ts index 0da128d9..949ae1c3 100644 --- a/frontend/src/lib/exportSession.ts +++ b/frontend/src/lib/exportSession.ts @@ -78,7 +78,7 @@ function formatPatchPart(part: Part): string { return content } -export function generateSessionMarkdown( +function generateSessionMarkdown( messages: MessageWithParts[], session: Session ): string { diff --git a/frontend/src/lib/fileReferences.ts b/frontend/src/lib/fileReferences.ts index 43889e86..4f6cc4fd 100644 --- a/frontend/src/lib/fileReferences.ts +++ b/frontend/src/lib/fileReferences.ts @@ -6,7 +6,7 @@ export interface FileReference { fullMatch: string } -export const FILE_REFERENCE_PATTERN = /\b([\w\-./]+\.(ts|tsx|js|jsx|py|java|cpp|c|h|hpp|go|rs|rb|php|swift|kt|cs|vue|svelte|css|scss|sass|less|html|xml|json|yaml|yml|md|txt|sh|bash|sql|graphql|proto|toml|ini|conf|env))(?::(\d+))?\b/gi +const FILE_REFERENCE_PATTERN = /\b([\w\-./]+\.(ts|tsx|js|jsx|py|java|cpp|c|h|hpp|go|rs|rb|php|swift|kt|cs|vue|svelte|css|scss|sass|less|html|xml|json|yaml|yml|md|txt|sh|bash|sql|graphql|proto|toml|ini|conf|env))(?::(\d+))?\b/gi export function detectFileReferences(text: string): FileReference[] { const references: FileReference[] = [] @@ -30,21 +30,4 @@ export function detectFileReferences(text: string): FileReference[] { return references } -export function isFileReference(text: string): boolean { - return FILE_REFERENCE_PATTERN.test(text) -} - -export function parseFileReference(text: string): FileReference | null { - const regex = new RegExp(FILE_REFERENCE_PATTERN) - const match = regex.exec(text) - if (!match) return null - - return { - filePath: match[1], - lineNumber: match[3] ? parseInt(match[3], 10) : undefined, - startIndex: match.index, - endIndex: match.index + match[0].length, - fullMatch: match[0], - } -}