brew-tui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.tsx","../src/app.tsx","../src/components/layout/app-layout.tsx","../src/components/layout/header.tsx","../src/stores/navigation-store.ts","../src/lib/license/feature-gate.ts","../src/utils/gradient.tsx","../src/components/layout/footer.tsx","../src/hooks/use-keyboard.ts","../src/stores/modal-store.ts","../src/components/common/upgrade-prompt.tsx","../src/views/dashboard.tsx","../src/stores/brew-store.ts","../src/lib/brew-api.ts","../src/lib/brew-cli.ts","../src/lib/parsers/json-parser.ts","../src/lib/parsers/text-parser.ts","../src/components/common/stat-card.tsx","../src/components/common/loading.tsx","../src/components/common/status-badge.tsx","../src/components/common/section-header.tsx","../src/components/common/version-arrow.tsx","../src/views/installed.tsx","../src/hooks/use-debounce.ts","../src/hooks/use-brew-stream.ts","../src/components/common/search-input.tsx","../src/components/common/confirm-dialog.tsx","../src/components/common/progress-log.tsx","../src/utils/format.ts","../src/views/search.tsx","../src/views/outdated.tsx","../src/views/package-info.tsx","../src/views/services.tsx","../src/views/doctor.tsx","../src/views/profiles.tsx","../src/stores/profile-store.ts","../src/lib/profiles/profile-manager.ts","../src/lib/license/watermark.ts","../src/views/smart-cleanup.tsx","../src/stores/cleanup-store.ts","../src/lib/cleanup/cleanup-analyzer.ts","../src/views/history.tsx","../src/stores/history-store.ts","../src/views/security-audit.tsx","../src/stores/security-store.ts","../src/lib/security/osv-api.ts","../src/lib/security/audit-runner.ts","../src/views/account.tsx"],"sourcesContent":["import React from 'react';\nimport { createInterface } from 'node:readline/promises';\nimport { render } from 'ink';\nimport { App } from './app.js';\nimport { activate, deactivate, loadLicense } from './lib/license/license-manager.js';\nimport { ensureDataDirs } from './lib/data-dir.js';\nimport { t } from './i18n/index.js';\n\nconst [,, command, arg] = process.argv;\n\nasync function runCli() {\n await ensureDataDirs();\n\n if (command === 'activate') {\n const key = arg?.trim() ?? '';\n if (!key) {\n console.error(t('cli_usageActivate'));\n process.exit(1);\n }\n try {\n const license = await activate(key);\n console.log(t('cli_activated', { email: license.customerEmail }));\n console.log(t('cli_planPro'));\n if (license.expiresAt) {\n console.log(t('cli_expires', { date: new Date(license.expiresAt).toLocaleDateString() }));\n }\n } catch (err) {\n console.error(t('cli_activationFailed', { error: err instanceof Error ? err.message : String(err) }));\n process.exit(1);\n }\n return;\n }\n\n if (command === 'deactivate') {\n const license = await loadLicense();\n if (!license) {\n console.log(t('cli_noLicense'));\n return;\n }\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(t('cli_confirmDeactivate'));\n rl.close();\n if (answer.toLowerCase() !== 'y' && answer.toLowerCase() !== 's') {\n console.log(t('cli_deactivateCancelled'));\n return;\n }\n await deactivate(license);\n console.log(t('cli_deactivated'));\n return;\n }\n\n if (command === 'status') {\n const license = await loadLicense();\n if (!license) {\n console.log(t('cli_planFree'));\n console.log(t('cli_upgradeHint'));\n } else {\n console.log(t('cli_planPro'));\n console.log(t('cli_email', { email: license.customerEmail }));\n console.log(t('cli_status', { status: license.status }));\n if (license.expiresAt) {\n console.log(t('cli_expires', { date: new Date(license.expiresAt).toLocaleDateString() }));\n }\n }\n return;\n }\n\n if (command === 'install-brewbar') {\n const { installBrewBar } = await import('./lib/brewbar-installer.js');\n try {\n await installBrewBar(arg === '--force');\n console.log(t('cli_brewbarInstalled'));\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n return;\n }\n\n if (command === 'uninstall-brewbar') {\n const { uninstallBrewBar } = await import('./lib/brewbar-installer.js');\n try {\n await uninstallBrewBar();\n console.log(t('cli_brewbarUninstalled'));\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n return;\n }\n\n // Default: launch TUI\n render(<App />);\n}\n\nrunCli().catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n","import React, { useEffect } from 'react';\nimport { useApp } from 'ink';\nimport { AppLayout } from './components/layout/app-layout.js';\nimport { useNavigationStore } from './stores/navigation-store.js';\nimport { useLicenseStore } from './stores/license-store.js';\nimport { useGlobalKeyboard } from './hooks/use-keyboard.js';\nimport { isProView } from './lib/license/feature-gate.js';\nimport { UpgradePrompt } from './components/common/upgrade-prompt.js';\nimport { DashboardView } from './views/dashboard.js';\nimport { InstalledView } from './views/installed.js';\nimport { SearchView } from './views/search.js';\nimport { OutdatedView } from './views/outdated.js';\nimport { PackageInfoView } from './views/package-info.js';\nimport { ServicesView } from './views/services.js';\nimport { DoctorView } from './views/doctor.js';\nimport { ProfilesView } from './views/profiles.js';\nimport { SmartCleanupView } from './views/smart-cleanup.js';\nimport { HistoryView } from './views/history.js';\nimport { SecurityAuditView } from './views/security-audit.js';\nimport { AccountView } from './views/account.js';\n\nexport function App() {\n const { exit } = useApp();\n const currentView = useNavigationStore((s) => s.currentView);\n const isPro = useLicenseStore((s) => s.isPro);\n const initLicense = useLicenseStore((s) => s.initialize);\n\n useEffect(() => { initLicense(); }, []);\n useGlobalKeyboard({ onQuit: exit });\n\n const renderView = () => {\n // Gate Pro views\n if (isProView(currentView) && !isPro()) {\n return <UpgradePrompt viewId={currentView} />;\n }\n\n switch (currentView) {\n case 'dashboard': return <DashboardView />;\n case 'installed': return <InstalledView />;\n case 'search': return <SearchView />;\n case 'outdated': return <OutdatedView />;\n case 'package-info': return <PackageInfoView />;\n case 'services': return <ServicesView />;\n case 'doctor': return <DoctorView />;\n case 'profiles': return <ProfilesView />;\n case 'smart-cleanup': return <SmartCleanupView />;\n case 'history': return <HistoryView />;\n case 'security-audit': return <SecurityAuditView />;\n case 'account': return <AccountView />;\n }\n };\n\n return (\n <AppLayout>\n {renderView()}\n </AppLayout>\n );\n}\n","import React from 'react';\nimport { Box } from 'ink';\nimport { Header } from './header.js';\nimport { Footer } from './footer.js';\n\ninterface AppLayoutProps {\n children: React.ReactNode;\n}\n\nexport function AppLayout({ children }: AppLayoutProps) {\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n <Header />\n <Box flexDirection=\"column\" flexGrow={1} paddingX={2} paddingY={1}>\n {children}\n </Box>\n <Footer />\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { useNavigationStore } from '../../stores/navigation-store.js';\nimport { isProView } from '../../lib/license/feature-gate.js';\nimport { t, useLocaleStore } from '../../i18n/index.js';\nimport { GradientText, GRADIENTS } from '../../utils/gradient.js';\nimport type { ViewId } from '../../lib/types.js';\nimport type { TranslationKey } from '../../i18n/en.js';\n\n// BREW portion (cols 0-27) and TUI portion (cols 28+) rendered in different colors\nconst LOGO_BREW = [\n '\\u256D\\u2501\\u2501\\u256E\\u2571\\u256D\\u2501\\u2501\\u2501\\u256E\\u256D\\u2501\\u2501\\u2501\\u256E\\u256D\\u256E\\u256D\\u256E\\u256D\\u256E\\u2571\\u2571\\u2571\\u2571\\u2571\\u2571\\u2571',\n '\\u2503\\u256D\\u256E\\u2503\\u2571\\u2503\\u256D\\u2501\\u256E\\u2503\\u2503\\u256D\\u2501\\u2501\\u256F\\u2503\\u2503\\u2503\\u2503\\u2503\\u2503\\u2571\\u2571\\u2571\\u2571\\u2571\\u2571\\u2571',\n '\\u2503\\u2570\\u256F\\u2570\\u256E\\u2503\\u2570\\u2501\\u256F\\u2503\\u2503\\u2570\\u2501\\u2501\\u256E\\u2503\\u2503\\u2503\\u2503\\u2503\\u2503\\u2571\\u2571\\u2571\\u2571\\u2571\\u2571\\u2571',\n '\\u2503\\u256D\\u2501\\u256E\\u2503\\u2503\\u256D\\u256E\\u256D\\u256F\\u2503\\u256D\\u2501\\u2501\\u256F\\u2503\\u2570\\u256F\\u2570\\u256F\\u2503\\u256D\\u2501\\u2501\\u2533\\u2501\\u2501\\u256E',\n '\\u2503\\u2570\\u2501\\u256F\\u2503\\u2503\\u2503\\u2503\\u2570\\u256E\\u2503\\u2570\\u2501\\u2501\\u256E\\u2570\\u256E\\u256D\\u256E\\u256D\\u256F\\u2570\\u2501\\u2501\\u253B\\u2501\\u2501\\u256F',\n '\\u2570\\u2501\\u2501\\u2501\\u256F\\u2570\\u256F\\u2570\\u2501\\u256F\\u2570\\u2501\\u2501\\u2501\\u256F\\u2571\\u2570\\u256F\\u2570\\u256F\\u2571\\u2571\\u2571\\u2571\\u2571\\u2571\\u2571\\u2571',\n];\nconst LOGO_TUI = [\n '\\u256D\\u2501\\u2501\\u2501\\u2501\\u256E\\u256D\\u256E\\u2571\\u256D\\u256E\\u256D\\u2501\\u2501\\u256E',\n '\\u2503\\u256D\\u256E\\u256D\\u256E\\u2503\\u2503\\u2503\\u2571\\u2503\\u2503\\u2570\\u252B\\u2523\\u256F',\n '\\u2570\\u256F\\u2503\\u2503\\u2570\\u256F\\u2503\\u2503\\u2571\\u2503\\u2503\\u2571\\u2503\\u2503',\n '\\u2571\\u2571\\u2503\\u2503\\u2571\\u2571\\u2503\\u2503\\u2571\\u2503\\u2503\\u2571\\u2503\\u2503',\n '\\u2571\\u2571\\u2503\\u2503\\u2571\\u2571\\u2503\\u2570\\u2501\\u256F\\u2503\\u256D\\u252B\\u2523\\u256E',\n '\\u2571\\u2571\\u2570\\u256F\\u2571\\u2571\\u2570\\u2501\\u2501\\u2501\\u256F\\u2570\\u2501\\u2501\\u256F',\n];\n\nconst VIEW_LABEL_KEYS: Record<ViewId, TranslationKey> = {\n dashboard: 'view_dashboard',\n installed: 'view_installed',\n search: 'view_search',\n outdated: 'view_outdated',\n 'package-info': 'view_packageInfo',\n services: 'view_services',\n doctor: 'view_doctor',\n profiles: 'view_profiles',\n 'smart-cleanup': 'view_smartCleanup',\n history: 'view_history',\n 'security-audit': 'view_securityAudit',\n account: 'view_account',\n};\n\nconst VIEW_KEYS: Record<ViewId, string> = {\n dashboard: '1', installed: '2', search: '3', outdated: '4',\n 'package-info': '', services: '5', doctor: '6',\n profiles: '7', 'smart-cleanup': '8', history: '9', 'security-audit': '0',\n account: '',\n};\n\nconst TAB_VIEWS: ViewId[] = [\n 'dashboard', 'installed', 'search', 'outdated', 'services', 'doctor',\n 'profiles', 'smart-cleanup', 'history', 'security-audit', 'account',\n];\n\nexport function Header() {\n const currentView = useNavigationStore((s) => s.currentView);\n useLocaleStore((s) => s.locale);\n\n return (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"column\" paddingX={1}>\n {LOGO_BREW.map((brew, i) => (\n <Box key={i}>\n <GradientText colors={GRADIENTS.gold}>{brew}</GradientText>\n <GradientText colors={['#B8860B', '#8B6914', '#6B4F10']}>{LOGO_TUI[i]}</GradientText>\n </Box>\n ))}\n </Box>\n <Box borderStyle=\"single\" borderBottom borderLeft={false} borderRight={false} borderTop={false} borderColor=\"#FFD700\" paddingX={1} flexWrap=\"wrap\">\n {TAB_VIEWS.map((view, i) => {\n const key = VIEW_KEYS[view];\n const viewLabel = t(VIEW_LABEL_KEYS[view]);\n const label = key ? `${key}:${viewLabel}` : viewLabel;\n const isPro = isProView(view);\n\n return (\n <React.Fragment key={view}>\n {i > 0 && <Text color=\"#4B5563\"> {'\\u2502'} </Text>}\n <Text\n bold={view === currentView}\n color={view === currentView ? '#22C55E' : '#6B7280'}\n underline={view === currentView}\n >\n {view === currentView ? `\\u25CF ${label}` : label}\n </Text>\n {isPro && <Text color=\"#FF6B2B\" bold> {t('pro_badge')}</Text>}\n </React.Fragment>\n );\n })}\n </Box>\n </Box>\n );\n}\n","import { create } from 'zustand';\nimport type { ViewId } from '../lib/types.js';\n\ninterface NavigationState {\n currentView: ViewId;\n previousView: ViewId | null;\n selectedPackage: string | null;\n viewHistory: ViewId[];\n navigate: (view: ViewId) => void;\n goBack: () => void;\n selectPackage: (name: string | null) => void;\n}\n\nconst VIEWS: ViewId[] = [\n 'dashboard', 'installed', 'search', 'outdated', 'package-info', 'services', 'doctor',\n 'profiles', 'smart-cleanup', 'history', 'security-audit', 'account',\n];\n\nexport const useNavigationStore = create<NavigationState>((set, get) => ({\n currentView: 'dashboard',\n previousView: null,\n selectedPackage: null,\n viewHistory: ['dashboard'],\n\n navigate: (view) => {\n const { currentView, viewHistory } = get();\n if (view === currentView) return;\n set({\n currentView: view,\n previousView: currentView,\n viewHistory: [...viewHistory.slice(-19), view],\n });\n },\n\n goBack: () => {\n const { previousView } = get();\n if (previousView) {\n set((state) => ({\n currentView: previousView,\n previousView: state.currentView,\n }));\n }\n },\n\n selectPackage: (name) => set({ selectedPackage: name }),\n}));\n\nexport function getNextView(current: ViewId): ViewId {\n const idx = VIEWS.indexOf(current);\n return VIEWS[(idx + 1) % VIEWS.length]!;\n}\n\nexport function getPrevView(current: ViewId): ViewId {\n const idx = VIEWS.indexOf(current);\n return VIEWS[(idx - 1 + VIEWS.length) % VIEWS.length]!;\n}\n\nexport { VIEWS };\n","import type { ViewId } from '../types.js';\n\nconst PRO_VIEWS = new Set<ViewId>([\n 'profiles',\n 'smart-cleanup',\n 'history',\n 'security-audit',\n]);\n\nexport function isProView(viewId: ViewId): boolean {\n return PRO_VIEWS.has(viewId);\n}\n","import React from 'react';\nimport { Text } from 'ink';\n\nfunction hexToRgb(hex: string): [number, number, number] {\n const n = parseInt(hex.slice(1), 16);\n return [(n >> 16) & 255, (n >> 8) & 255, n & 255];\n}\n\nfunction rgbToHex(r: number, g: number, b: number): string {\n return '#' + ((1 << 24) | (r << 16) | (g << 8) | b).toString(16).slice(1).toUpperCase();\n}\n\nfunction lerp(a: number, b: number, t: number): number {\n return Math.round(a + (b - a) * t);\n}\n\nfunction interpolateColor(c1: string, c2: string, t: number): string {\n const [r1, g1, b1] = hexToRgb(c1);\n const [r2, g2, b2] = hexToRgb(c2);\n return rgbToHex(lerp(r1, r2, t), lerp(g1, g2, t), lerp(b1, b2, t));\n}\n\ninterface GradientTextProps {\n children: string;\n colors: string[];\n bold?: boolean;\n}\n\nexport function GradientText({ children, colors, bold }: GradientTextProps) {\n if (colors.length < 2) {\n return <Text color={colors[0]} bold={bold}>{children}</Text>;\n }\n\n const chars = [...children];\n const maxIdx = Math.max(chars.length - 1, 1);\n\n return (\n <>\n {chars.map((char, i) => {\n const t = i / maxIdx;\n const segment = t * (colors.length - 1);\n const lower = Math.floor(segment);\n const upper = Math.min(lower + 1, colors.length - 1);\n const frac = segment - lower;\n const color = interpolateColor(colors[lower]!, colors[upper]!, frac);\n return <Text key={i} color={color} bold={bold}>{char}</Text>;\n })}\n </>\n );\n}\n\n// Pre-defined gradient palettes\nexport const GRADIENTS = {\n gold: ['#FFD700', '#FFA500', '#B8860B'],\n sunset: ['#FF6B2B', '#FFD700', '#FF6B2B'],\n ocean: ['#06B6D4', '#3B82F6', '#A855F7'],\n emerald: ['#22C55E', '#2DD4BF', '#06B6D4'],\n fire: ['#EF4444', '#F59E0B', '#FFD700'],\n version: ['#EF4444', '#9CA3AF', '#2DD4BF'],\n pro: ['#FF6B2B', '#FFD700', '#FF6B2B'],\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { useNavigationStore } from '../../stores/navigation-store.js';\nimport { t, useLocaleStore } from '../../i18n/index.js';\nimport type { ViewId } from '../../lib/types.js';\nimport type { TranslationKey } from '../../i18n/en.js';\n\ntype HintDef = [key: string, action: TranslationKey] | [text: TranslationKey];\n\nconst VIEW_HINT_DEFS: Record<ViewId, HintDef[]> = {\n dashboard: [['1-0', 'hint_navigate'], ['tab', 'hint_next'], ['q', 'hint_quit']],\n installed: [['/', 'hint_filter'], ['enter', 'hint_info'], ['u', 'hint_uninstall'], ['f', 'hint_toggle'], ['tab', 'hint_next'], ['q', 'hint_quit']],\n search: [['hint_typeToSearch'], ['enter', 'hint_details'], ['i', 'hint_install'], ['esc', 'hint_back'], ['q', 'hint_quit']],\n outdated: [['enter', 'hint_upgrade'], ['A', 'hint_upgradeAll'], ['p', 'hint_pin'], ['tab', 'hint_next'], ['q', 'hint_quit']],\n 'package-info': [['i', 'hint_install'], ['u', 'hint_uninstall'], ['U', 'hint_upgrade'], ['esc', 'hint_back'], ['q', 'hint_quit']],\n services: [['s', 'hint_start'], ['S', 'hint_stop'], ['R', 'hint_restart'], ['r', 'hint_refresh'], ['tab', 'hint_next'], ['q', 'hint_quit']],\n doctor: [['r', 'hint_refresh'], ['tab', 'hint_next'], ['q', 'hint_quit']],\n profiles: [['n', 'hint_new'], ['enter', 'hint_details'], ['e', 'hint_edit'], ['i', 'hint_import'], ['d', 'hint_delete'], ['q', 'hint_quit']],\n 'smart-cleanup': [['enter', 'hint_toggle'], ['c', 'hint_clean'], ['r', 'hint_refresh'], ['q', 'hint_quit']],\n history: [['/', 'hint_search'], ['enter', 'hint_replay'], ['f', 'hint_filter'], ['c', 'hint_clear'], ['q', 'hint_quit']],\n 'security-audit': [['r', 'hint_scan'], ['enter', 'hint_details'], ['u', 'hint_upgrade'], ['q', 'hint_quit']],\n account: [['d', 'hint_deactivate'], ['q', 'hint_quit']],\n};\n\nfunction HintItem({ def }: { def: HintDef }) {\n if (def.length === 1) return <Text color=\"#FFD700\" dimColor>{t(def[0])}</Text>;\n return (\n <>\n <Text color=\"#F9FAFB\" bold>{def[0]}</Text>\n <Text color=\"#6B7280\">:</Text>\n <Text color=\"#FFD700\" dimColor>{t(def[1])}</Text>\n </>\n );\n}\n\nexport function Footer() {\n const currentView = useNavigationStore((s) => s.currentView);\n const locale = useLocaleStore((s) => s.locale);\n const defs = VIEW_HINT_DEFS[currentView] ?? [];\n\n return (\n <Box borderStyle=\"single\" borderTop borderBottom={false} borderLeft={false} borderRight={false} borderColor=\"#FFD700\" paddingX={1} flexWrap=\"wrap\">\n {defs.map((def, i) => {\n const key = def.length === 1 ? def[0] : `${def[0]}:${def[1]}`;\n return (\n <React.Fragment key={key}>\n {i > 0 && <Text color=\"#4B5563\"> {'\\u2502'} </Text>}\n <HintItem def={def} />\n </React.Fragment>\n );\n })}\n <Text color=\"#4B5563\"> {'\\u2502'} </Text>\n <Text color=\"#F9FAFB\" bold>L</Text>\n <Text color=\"#6B7280\">:</Text>\n <Text color=\"#FFD700\" dimColor>{t('hint_lang')}({locale})</Text>\n </Box>\n );\n}\n","import { useInput } from 'ink';\nimport { useNavigationStore, getNextView, getPrevView } from '../stores/navigation-store.js';\nimport { useLocaleStore } from '../i18n/index.js';\nimport { useModalStore } from '../stores/modal-store.js';\nimport type { ViewId } from '../lib/types.js';\n\nconst VIEW_KEYS: Record<string, ViewId> = {\n '1': 'dashboard',\n '2': 'installed',\n '3': 'search',\n '4': 'outdated',\n '5': 'services',\n '6': 'doctor',\n '7': 'profiles',\n '8': 'smart-cleanup',\n '9': 'history',\n '0': 'security-audit',\n};\n\nexport function useGlobalKeyboard(opts?: { onQuit?: () => void; disabled?: boolean }) {\n const navigate = useNavigationStore((s) => s.navigate);\n const currentView = useNavigationStore((s) => s.currentView);\n const goBack = useNavigationStore((s) => s.goBack);\n const { locale, setLocale } = useLocaleStore();\n const modalOpen = useModalStore((s) => s.isOpen);\n\n useInput((input, key) => {\n if (opts?.disabled) return;\n\n // When a confirm dialog is open, suppress navigation/quit so only the\n // dialog's own useInput handler handles the keypress.\n if (modalOpen) return;\n\n if (input === 'q' || (key.ctrl && input === 'c')) {\n opts?.onQuit?.();\n return;\n }\n\n if (key.escape) {\n goBack();\n return;\n }\n\n if (key.tab && key.shift) {\n navigate(getPrevView(currentView));\n return;\n }\n if (key.tab) {\n navigate(getNextView(currentView));\n return;\n }\n\n if (input === 'L') {\n setLocale(locale === 'en' ? 'es' : 'en');\n return;\n }\n\n if (input in VIEW_KEYS) {\n navigate(VIEW_KEYS[input]!);\n }\n }, { isActive: !opts?.disabled });\n}\n","import { create } from 'zustand';\n\ninterface ModalState {\n // Reference counter: >0 means at least one suppressor is active.\n // Using a counter (not a boolean) prevents a nested suppressor's cleanup\n // from prematurely unblocking global keyboard when a sibling suppressor is\n // still active (e.g. SearchView holds results open while a ConfirmDialog\n // mounts and then dismisses).\n _count: number;\n isOpen: boolean;\n openModal: () => void;\n closeModal: () => void;\n}\n\nexport const useModalStore = create<ModalState>((set) => ({\n _count: 0,\n isOpen: false,\n openModal: () =>\n set((s) => {\n const next = s._count + 1;\n return { _count: next, isOpen: next > 0 };\n }),\n closeModal: () =>\n set((s) => {\n const next = Math.max(0, s._count - 1);\n return { _count: next, isOpen: next > 0 };\n }),\n}));\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { t } from '../../i18n/index.js';\nimport type { ViewId } from '../../lib/types.js';\nimport type { TranslationKey } from '../../i18n/en.js';\n\nconst FEATURE_KEYS: Record<string, { title: TranslationKey; desc: TranslationKey }> = {\n profiles: { title: 'upgrade_profiles', desc: 'upgrade_profilesDesc' },\n 'smart-cleanup': { title: 'upgrade_cleanup', desc: 'upgrade_cleanupDesc' },\n history: { title: 'upgrade_history', desc: 'upgrade_historyDesc' },\n 'security-audit': { title: 'upgrade_security', desc: 'upgrade_securityDesc' },\n};\n\ninterface UpgradePromptProps {\n viewId: ViewId;\n}\n\nexport function UpgradePrompt({ viewId }: UpgradePromptProps) {\n const keys = FEATURE_KEYS[viewId];\n if (!keys) return null;\n\n const title = t(keys.title);\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" paddingY={2}>\n <Box\n borderStyle=\"double\"\n borderColor=\"#FF6B2B\"\n paddingX={3}\n paddingY={2}\n flexDirection=\"column\"\n alignItems=\"center\"\n width=\"80%\"\n >\n <Text bold color=\"#FF6B2B\">{'\\u2B50'} {t('upgrade_proFeature', { title })}</Text>\n <Text> </Text>\n <Text color=\"#F9FAFB\" wrap=\"wrap\">{t(keys.desc)}</Text>\n <Text> </Text>\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text color=\"#06B6D4\" bold>{t('upgrade_pricing')}</Text>\n <Text> </Text>\n <Text color=\"#9CA3AF\">{t('upgrade_activateWith')}</Text>\n <Text color=\"#22C55E\" bold> {t('upgrade_activateCmd')}</Text>\n <Text> </Text>\n <Text color=\"#FF6B2B\">{t('upgrade_proLabel')}</Text>\n </Box>\n </Box>\n </Box>\n );\n}\n","import React, { useEffect, useMemo } from 'react';\nimport { Box, Text } from 'ink';\nimport { useBrewStore } from '../stores/brew-store.js';\nimport { StatCard } from '../components/common/stat-card.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { StatusBadge } from '../components/common/status-badge.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { VersionArrow } from '../components/common/version-arrow.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\n\nexport function DashboardView() {\n const { formulae, casks, outdated, services, config, loading, errors, fetchAll } = useBrewStore();\n\n useEffect(() => { fetchAll(); }, []);\n\n const errorServiceList = useMemo(\n () => services.filter((s) => s.status === 'error'),\n [services]\n );\n const runningServices = useMemo(\n () => services.filter((s) => s.status === 'started').length,\n [services]\n );\n const errorServices = errorServiceList.length;\n\n if (loading.installed) return <Loading message={t('loading_fetchingBrew')} />;\n if (errors.installed) return <ErrorMessage message={errors.installed} />;\n\n return (\n <Box flexDirection=\"column\" gap={2}>\n <SectionHeader emoji={'\\u{1F4CA}'} title={t('dashboard_overview')} gradient={GRADIENTS.gold} />\n\n <Box gap={1} flexWrap=\"wrap\">\n <StatCard label={t('dashboard_formulae')} value={formulae.length} color=\"#06B6D4\" />\n <StatCard label={t('dashboard_casks')} value={casks.length} color=\"#A855F7\" />\n <StatCard\n label={t('dashboard_outdated')}\n value={outdated.formulae.length + outdated.casks.length}\n color={outdated.formulae.length + outdated.casks.length > 0 ? '#F59E0B' : '#22C55E'}\n />\n <StatCard\n label={t('dashboard_services')}\n value={`${runningServices}/${services.length}`}\n color={errorServices > 0 ? '#EF4444' : '#22C55E'}\n />\n </Box>\n\n {config && (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u2139\\uFE0F'} title={t('dashboard_systemInfo')} gradient={['#F9FAFB', '#9CA3AF']} />\n <Box borderStyle=\"round\" borderColor=\"#3B82F6\" paddingX={2} paddingY={0} flexDirection=\"column\" marginTop={1}>\n <Text><Text color=\"#9CA3AF\">{t('dashboard_homebrew')}</Text> {config.HOMEBREW_VERSION}</Text>\n <Text><Text color=\"#9CA3AF\">{t('dashboard_prefix')}</Text> {config.HOMEBREW_PREFIX}</Text>\n <Text><Text color=\"#9CA3AF\">{t('dashboard_updated')}</Text> {config.coreUpdated}</Text>\n </Box>\n </Box>\n )}\n\n {outdated.formulae.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <SectionHeader emoji={'\\u{1F4E6}'} title={t('dashboard_outdatedPackages')} gradient={GRADIENTS.fire} />\n <Box paddingLeft={2} flexDirection=\"column\">\n {outdated.formulae.slice(0, 10).map((pkg) => (\n <Box key={pkg.name} gap={1}>\n <Text color=\"#F9FAFB\">{pkg.name}</Text>\n <VersionArrow current={pkg.installed_versions[0] ?? ''} latest={pkg.current_version} />\n </Box>\n ))}\n {outdated.formulae.length > 10 && (\n <Text color=\"#6B7280\" italic>{t('common_andMore', { count: outdated.formulae.length - 10 })}</Text>\n )}\n </Box>\n </Box>\n )}\n\n {errorServices > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <SectionHeader emoji={'\\u26A0\\uFE0F'} title={t('dashboard_serviceErrors')} color=\"#EF4444\" />\n <Box paddingLeft={2} flexDirection=\"column\">\n {errorServiceList.map((s) => (\n <Box key={s.name} gap={1}>\n <StatusBadge label={t('badge_error')} variant=\"error\" />\n <Text>{s.name}</Text>\n {s.exit_code != null && <Text color=\"#9CA3AF\">{t('common_exit', { code: s.exit_code })}</Text>}\n </Box>\n ))}\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import { create } from 'zustand';\nimport type { Formula, Cask, OutdatedPackage, BrewService, BrewConfig } from '../lib/types.js';\nimport * as api from '../lib/brew-api.js';\n\ninterface BrewState {\n formulae: Formula[];\n casks: Cask[];\n outdated: { formulae: OutdatedPackage[]; casks: OutdatedPackage[] };\n services: BrewService[];\n config: BrewConfig | null;\n leaves: string[];\n doctorWarnings: string[];\n doctorClean: boolean | null;\n\n loading: Record<string, boolean>;\n errors: Record<string, string | null>;\n\n fetchInstalled: () => Promise<void>;\n fetchOutdated: () => Promise<void>;\n fetchServices: () => Promise<void>;\n fetchConfig: () => Promise<void>;\n fetchLeaves: () => Promise<void>;\n fetchDoctor: () => Promise<void>;\n fetchAll: () => Promise<void>;\n\n uninstallPackage: (name: string) => Promise<void>;\n serviceAction: (name: string, action: 'start' | 'stop' | 'restart') => Promise<void>;\n}\n\nfunction setLoading(set: (fn: (s: BrewState) => Partial<BrewState>) => void, key: string, value: boolean) {\n set((s) => ({ loading: { ...s.loading, [key]: value } }));\n}\n\nfunction setError(set: (fn: (s: BrewState) => Partial<BrewState>) => void, key: string, error: string | null) {\n set((s) => ({ errors: { ...s.errors, [key]: error } }));\n}\n\nexport const useBrewStore = create<BrewState>((set) => ({\n formulae: [],\n casks: [],\n outdated: { formulae: [], casks: [] },\n services: [],\n config: null,\n leaves: [],\n doctorWarnings: [],\n doctorClean: null,\n // Pre-initialize loading flags for keys that fetchAll always triggers so\n // views that check loading.X get a spinner on first render rather than\n // flashing empty/zeroed content for one frame before the fetch starts.\n loading: { installed: true, outdated: true, services: true, config: true, doctor: false },\n errors: {},\n\n fetchInstalled: async () => {\n setLoading(set, 'installed', true);\n setError(set, 'installed', null);\n try {\n const result = await api.getInstalled();\n set({ formulae: result.formulae, casks: result.casks });\n } catch (err) {\n setError(set, 'installed', err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(set, 'installed', false);\n }\n },\n\n fetchOutdated: async () => {\n setLoading(set, 'outdated', true);\n setError(set, 'outdated', null);\n try {\n const result = await api.getOutdated();\n set({ outdated: result });\n } catch (err) {\n setError(set, 'outdated', err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(set, 'outdated', false);\n }\n },\n\n fetchServices: async () => {\n setLoading(set, 'services', true);\n setError(set, 'services', null);\n try {\n const result = await api.getServices();\n set({ services: result });\n } catch (err) {\n setError(set, 'services', err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(set, 'services', false);\n }\n },\n\n fetchConfig: async () => {\n setLoading(set, 'config', true);\n try {\n const result = await api.getConfig();\n set({ config: result });\n } catch (err) {\n setError(set, 'config', err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(set, 'config', false);\n }\n },\n\n fetchLeaves: async () => {\n try {\n const result = await api.getLeaves();\n set({ leaves: result });\n } catch (err) {\n // Non-critical: leaves is used by cleanup analysis only.\n // Log the error so failures are visible during development.\n if (process.env.NODE_ENV !== 'production') {\n console.error('[brew-store] fetchLeaves failed:', err instanceof Error ? err.message : String(err));\n }\n }\n },\n\n fetchDoctor: async () => {\n setLoading(set, 'doctor', true);\n setError(set, 'doctor', null);\n try {\n const result = await api.getDoctor();\n set({ doctorWarnings: result.warnings, doctorClean: result.isClean });\n } catch (err) {\n setError(set, 'doctor', err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(set, 'doctor', false);\n }\n },\n\n fetchAll: async () => {\n // Update Homebrew indices first so outdated/installed data is fresh.\n // This is equivalent to the auto-update that `brew` does by default,\n // which we disable per-command with HOMEBREW_NO_AUTO_UPDATE=1.\n try {\n await api.brewUpdate();\n } catch {\n // Non-critical: if update fails (offline, etc.), continue with stale data\n }\n\n const store = useBrewStore.getState();\n await Promise.all([\n store.fetchInstalled(),\n store.fetchOutdated(),\n store.fetchServices(),\n store.fetchConfig(),\n store.fetchLeaves(),\n ]);\n },\n\n uninstallPackage: async (name) => {\n setLoading(set, 'action', true);\n try {\n await api.uninstallPackage(name);\n await useBrewStore.getState().fetchInstalled();\n } catch (err) {\n setError(set, 'action', err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(set, 'action', false);\n }\n },\n\n serviceAction: async (name, action) => {\n setLoading(set, 'service-action', true);\n try {\n await api.serviceAction(name, action);\n await useBrewStore.getState().fetchServices();\n } catch (err) {\n setError(set, 'service-action', err instanceof Error ? err.message : String(err));\n } finally {\n setLoading(set, 'service-action', false);\n }\n },\n}));\n","import { spawn } from 'node:child_process';\nimport { execBrew, streamBrew } from './brew-cli.js';\nimport { parseInstalledJson, parseOutdatedJson, parseServicesJson, parseFormulaInfoJson } from './parsers/json-parser.js';\nimport { parseSearchResults, parseDoctorOutput, parseBrewConfig, parseLeavesOutput } from './parsers/text-parser.js';\nimport type { Formula, Cask, OutdatedPackage, BrewService, BrewConfig, PackageListItem } from './types.js';\n\nexport async function brewUpdate(): Promise<void> {\n // Run brew update WITHOUT HOMEBREW_NO_AUTO_UPDATE so it actually fetches\n return new Promise((resolve, reject) => {\n const proc = spawn('brew', ['update'], { stdio: 'ignore' });\n proc.on('close', (code) => {\n if (code === 0) resolve();\n else reject(new Error(`brew update exited with code ${code}`));\n });\n proc.on('error', reject);\n });\n}\n\nexport async function getInstalled(): Promise<{ formulae: Formula[]; casks: Cask[] }> {\n const raw = await execBrew(['info', '--json=v2', '--installed']);\n return parseInstalledJson(raw);\n}\n\nexport async function getOutdated(): Promise<{ formulae: OutdatedPackage[]; casks: OutdatedPackage[] }> {\n const raw = await execBrew(['outdated', '--json=v2']);\n return parseOutdatedJson(raw);\n}\n\nexport async function getServices(): Promise<BrewService[]> {\n const raw = await execBrew(['services', 'list', '--json']);\n return parseServicesJson(raw);\n}\n\nexport async function getFormulaInfo(name: string): Promise<Formula | null> {\n const raw = await execBrew(['info', '--json=v2', name]);\n return parseFormulaInfoJson(raw);\n}\n\nexport async function search(term: string): Promise<{ formulae: string[]; casks: string[] }> {\n // Strip leading dashes to prevent flag injection into `brew search`\n // (e.g. \"--desc\" would be parsed by brew as an option, not a search term).\n const safeTerm = term.replace(/^-+/, '');\n if (!safeTerm) return { formulae: [], casks: [] };\n const raw = await execBrew(['search', safeTerm]);\n return parseSearchResults(raw);\n}\n\nexport async function getDoctor(): Promise<{ warnings: string[]; isClean: boolean }> {\n try {\n const raw = await execBrew(['doctor']);\n return parseDoctorOutput(raw);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return parseDoctorOutput(msg);\n }\n}\n\nexport async function getConfig(): Promise<BrewConfig> {\n const raw = await execBrew(['config']);\n return parseBrewConfig(raw);\n}\n\nexport async function getLeaves(): Promise<string[]> {\n const raw = await execBrew(['leaves']);\n return parseLeavesOutput(raw);\n}\n\nexport function installPackage(name: string): AsyncGenerator<string> {\n return streamBrew(['install', name]);\n}\n\nexport function upgradePackage(name: string): AsyncGenerator<string> {\n return streamBrew(['upgrade', name]);\n}\n\nexport function upgradeAll(): AsyncGenerator<string> {\n return streamBrew(['upgrade']);\n}\n\nexport async function uninstallPackage(name: string): Promise<string> {\n return execBrew(['uninstall', name]);\n}\n\n\nexport async function serviceAction(name: string, action: 'start' | 'stop' | 'restart'): Promise<string> {\n return execBrew(['services', action, name]);\n}\n\nexport function formulaeToListItems(formulae: Formula[]): PackageListItem[] {\n return formulae.map((f) => {\n const installed = f.installed[0];\n return {\n name: f.name,\n version: installed?.version ?? f.versions.stable,\n desc: f.desc,\n type: 'formula',\n outdated: f.outdated,\n pinned: f.pinned,\n kegOnly: f.keg_only,\n installedAsDependency: installed?.installed_as_dependency ?? false,\n installedTime: installed?.time ?? null,\n };\n });\n}\n\nexport function casksToListItems(casks: Cask[]): PackageListItem[] {\n return casks.map((c) => ({\n name: c.token,\n version: c.installed ?? c.version,\n desc: c.desc,\n type: 'cask',\n outdated: c.outdated,\n pinned: false,\n kegOnly: false,\n installedAsDependency: false,\n installedTime: c.installed_time ?? null,\n }));\n}\n","import { spawn } from 'node:child_process';\n\nexport async function execBrew(args: string[]): Promise<string> {\n return new Promise((resolve, reject) => {\n const proc = spawn('brew', args, { env: { ...process.env, HOMEBREW_NO_AUTO_UPDATE: '1' } });\n let stdout = '';\n let stderr = '';\n proc.stdout.on('data', (d: Buffer) => { stdout += d.toString(); });\n proc.stderr.on('data', (d: Buffer) => { stderr += d.toString(); });\n proc.on('close', (code) => {\n if (code === 0) {\n resolve(stdout);\n } else {\n reject(new Error(stderr.trim() || `brew ${args.join(' ')} exited with code ${code}`));\n }\n });\n proc.on('error', (err) => {\n reject(new Error(`Failed to run brew: ${err.message}`));\n });\n });\n}\n\nexport async function* streamBrew(args: string[]): AsyncGenerator<string> {\n const proc = spawn('brew', args, {\n env: { ...process.env, HOMEBREW_NO_AUTO_UPDATE: '1' },\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n let buffer = '';\n const lines: string[] = [];\n let done = false;\n let exitError: string | null = null;\n\n const push = (chunk: Buffer) => {\n buffer += chunk.toString();\n const parts = buffer.split('\\n');\n buffer = parts.pop() ?? '';\n for (const line of parts) {\n if (line.trim()) lines.push(line);\n }\n };\n\n proc.stdout.on('data', push);\n proc.stderr.on('data', push);\n\n proc.on('close', (code) => {\n if (buffer.trim()) lines.push(buffer.trim());\n done = true;\n if (code !== 0) {\n exitError = `brew ${args.join(' ')} exited with code ${code}`;\n }\n });\n\n proc.on('error', (err) => {\n done = true;\n exitError = err.message;\n });\n\n try {\n while (!done || lines.length > 0) {\n if (lines.length > 0) {\n yield lines.shift()!;\n } else if (!done) {\n await new Promise((r) => setTimeout(r, 50));\n }\n }\n } finally {\n if (!done) {\n proc.kill();\n }\n }\n\n // Throw after all lines have been yielded so the consumer sees\n // brew's stderr output in the stream before the error surfaces.\n if (exitError) {\n throw new Error(exitError);\n }\n}\n","import type { BrewInfoResponse, BrewOutdatedResponse, BrewService, Formula, Cask, OutdatedPackage } from '../types.js';\n\nfunction safeParse<T>(raw: string, context: string): T {\n try {\n const result = JSON.parse(raw);\n if (result === null || result === undefined) {\n throw new Error(`${context} returned null or empty response`);\n }\n return result as T;\n } catch (err) {\n throw new Error(`Failed to parse ${context} JSON: ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n\nexport function parseInstalledJson(raw: string): { formulae: Formula[]; casks: Cask[] } {\n const data = safeParse<BrewInfoResponse>(raw, 'brew info --installed');\n return {\n formulae: Array.isArray(data.formulae) ? data.formulae : [],\n casks: Array.isArray(data.casks) ? data.casks : [],\n };\n}\n\nexport function parseOutdatedJson(raw: string): { formulae: OutdatedPackage[]; casks: OutdatedPackage[] } {\n const data = safeParse<BrewOutdatedResponse>(raw, 'brew outdated');\n return {\n formulae: Array.isArray(data.formulae) ? data.formulae : [],\n casks: Array.isArray(data.casks) ? data.casks : [],\n };\n}\n\nexport function parseServicesJson(raw: string): BrewService[] {\n const data = safeParse<BrewService[]>(raw, 'brew services list');\n if (!Array.isArray(data)) return [];\n return data.map((s) => ({\n name: s.name,\n status: s.status ?? 'none',\n user: s.user ?? null,\n file: s.file ?? null,\n exit_code: s.exit_code ?? null,\n }));\n}\n\nexport function parseFormulaInfoJson(raw: string): Formula | null {\n const data = safeParse<BrewInfoResponse>(raw, 'brew info');\n return data.formulae?.[0] ?? null;\n}\n","import type { BrewConfig } from '../types.js';\n\nexport function parseSearchResults(raw: string): { formulae: string[]; casks: string[] } {\n const lines = raw.split('\\n').map((l) => l.trim()).filter(Boolean);\n const formulae: string[] = [];\n const casks: string[] = [];\n let section: 'formulae' | 'casks' = 'formulae';\n\n for (const line of lines) {\n if (line.startsWith('==> Formulae')) {\n section = 'formulae';\n continue;\n }\n if (line.startsWith('==> Casks')) {\n section = 'casks';\n continue;\n }\n if (line.startsWith('==>')) continue;\n\n if (section === 'formulae') formulae.push(line);\n else casks.push(line);\n }\n\n return { formulae, casks };\n}\n\nexport function parseDoctorOutput(raw: string): { warnings: string[]; isClean: boolean } {\n const cleaned = raw.trim();\n if (cleaned.includes('Your system is ready to brew')) {\n return { warnings: [], isClean: true };\n }\n\n const warnings: string[] = [];\n let current = '';\n\n for (const line of cleaned.split('\\n')) {\n if (line.startsWith('Warning:')) {\n if (current) warnings.push(current.trim());\n current = line;\n } else if (current) {\n current += '\\n' + line;\n }\n }\n if (current) warnings.push(current.trim());\n\n return { warnings, isClean: false };\n}\n\nexport function parseBrewConfig(raw: string): BrewConfig {\n const lines = raw.split('\\n');\n const get = (key: string): string => {\n const line = lines.find((l) => l.startsWith(key));\n return line?.split(':').slice(1).join(':').trim() ?? '';\n };\n\n return {\n HOMEBREW_VERSION: get('HOMEBREW_VERSION'),\n HOMEBREW_PREFIX: get('HOMEBREW_PREFIX'),\n coreUpdated: get('Core tap last commit') || get('Core tap JSON'),\n };\n}\n\nexport function parseLeavesOutput(raw: string): string[] {\n return raw.split('\\n').map((l) => l.trim()).filter(Boolean);\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\n\ninterface StatCardProps {\n label: string;\n value: string | number;\n color?: string;\n}\n\nexport function StatCard({ label, value, color = 'white' }: StatCardProps) {\n return (\n <Box\n borderStyle=\"round\"\n borderColor={color}\n paddingX={2}\n paddingY={1}\n flexDirection=\"column\"\n alignItems=\"center\"\n minWidth={16}\n >\n <Text bold color={color}>{value}</Text>\n <Text color=\"#9CA3AF\">{label}</Text>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { Spinner } from '@inkjs/ui';\nimport { t, useLocaleStore } from '../../i18n/index.js';\n\ninterface LoadingProps {\n message?: string;\n}\n\nexport function Loading({ message }: LoadingProps) {\n useLocaleStore((s) => s.locale); // re-render on locale change\n return (\n <Box paddingY={1}>\n <Spinner label={message ?? t('loading_default')} />\n </Box>\n );\n}\n\ninterface ErrorMessageProps {\n message: string;\n}\n\nexport function ErrorMessage({ message }: ErrorMessageProps) {\n useLocaleStore((s) => s.locale); // re-render on locale change\n return (\n <Box paddingY={1}>\n <Text color=\"#EF4444\" bold>{'\\u2718'} {t('error_prefix')}</Text>\n <Text color=\"#EF4444\">{message}</Text>\n </Box>\n );\n}\n","import React from 'react';\nimport { Text } from 'ink';\n\ntype BadgeVariant = 'success' | 'warning' | 'error' | 'info' | 'muted';\n\nconst BADGE_STYLES: Record<BadgeVariant, { icon: string; color: string }> = {\n success: { icon: '\\u2714', color: '#22C55E' },\n warning: { icon: '\\u25CF', color: '#F59E0B' },\n error: { icon: '\\u2718', color: '#EF4444' },\n info: { icon: '\\u25C6', color: '#3B82F6' },\n muted: { icon: '\\u25CB', color: '#6B7280' },\n};\n\ninterface StatusBadgeProps {\n label: string;\n variant: BadgeVariant;\n}\n\nexport function StatusBadge({ label, variant }: StatusBadgeProps) {\n const { icon, color } = BADGE_STYLES[variant];\n return <Text color={color}>{icon} {label}</Text>;\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { GradientText } from '../../utils/gradient.js';\n\ninterface SectionHeaderProps {\n emoji: string;\n title: string;\n color?: string;\n gradient?: string[];\n count?: number | string;\n}\n\nexport function SectionHeader({ emoji, title, color = '#FFD700', gradient, count }: SectionHeaderProps) {\n return (\n <Box gap={1}>\n <Text>{emoji}</Text>\n {gradient ? (\n <GradientText colors={gradient} bold>{title}</GradientText>\n ) : (\n <Text bold color={color}>{title}</Text>\n )}\n {count !== undefined && (\n <Text color=\"#6B7280\">({count})</Text>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { Text } from 'ink';\n\ninterface VersionArrowProps {\n current: string;\n latest: string;\n}\n\nexport function VersionArrow({ current, latest }: VersionArrowProps) {\n return (\n <>\n <Text color=\"#EF4444\">{current}</Text>\n <Text color=\"#F59E0B\">{' \\u2500\\u2500 '}</Text>\n <Text color=\"#FFD700\">{'\\u25B6'}</Text>\n <Text color=\"#2DD4BF\"> {latest}</Text>\n </>\n );\n}\n","import React, { useState, useMemo, useEffect } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { useBrewStore } from '../stores/brew-store.js';\nimport { useNavigationStore } from '../stores/navigation-store.js';\nimport { useDebounce } from '../hooks/use-debounce.js';\nimport { useBrewStream } from '../hooks/use-brew-stream.js';\nimport { formulaeToListItems, casksToListItems } from '../lib/brew-api.js';\nimport { SearchInput } from '../components/common/search-input.js';\nimport { StatusBadge } from '../components/common/status-badge.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { truncate } from '../utils/format.js';\nimport { t } from '../i18n/index.js';\nimport { useModalStore } from '../stores/modal-store.js';\nimport type { PackageListItem } from '../lib/types.js';\n\nexport function InstalledView() {\n const { formulae, casks, loading, errors, fetchInstalled } = useBrewStore();\n const navigate = useNavigationStore((s) => s.navigate);\n const selectPackage = useNavigationStore((s) => s.selectPackage);\n\n const [filter, setFilter] = useState('');\n const [cursor, setCursor] = useState(0);\n const [tab, setTab] = useState<'formulae' | 'casks'>('formulae');\n const [isSearching, setIsSearching] = useState(false);\n const [confirmUninstall, setConfirmUninstall] = useState<string | null>(null);\n const debouncedFilter = useDebounce(filter, 200);\n const stream = useBrewStream();\n const { openModal, closeModal } = useModalStore();\n\n useEffect(() => { fetchInstalled(); }, []);\n\n useEffect(() => {\n if (isSearching) {\n openModal();\n return () => { closeModal(); };\n }\n return undefined;\n }, [isSearching]);\n\n const allItems: PackageListItem[] = useMemo(() => {\n const items = tab === 'formulae'\n ? formulaeToListItems(formulae)\n : casksToListItems(casks);\n\n if (!debouncedFilter) return items;\n const lower = debouncedFilter.toLowerCase();\n return items.filter((p) =>\n p.name.toLowerCase().includes(lower) || p.desc.toLowerCase().includes(lower)\n );\n }, [formulae, casks, tab, debouncedFilter]);\n\n useInput((input, key) => {\n if (confirmUninstall || stream.isRunning) return;\n\n if (isSearching) {\n if (key.escape) {\n setIsSearching(false);\n setFilter('');\n }\n return;\n }\n\n if (input === '/') {\n setIsSearching(true);\n return;\n }\n\n if (input === 'u' && allItems[cursor]) {\n setConfirmUninstall(allItems[cursor].name);\n return;\n }\n\n if (input === 'j' || key.downArrow) {\n setCursor((c) => Math.min(c + 1, Math.max(0, allItems.length - 1)));\n } else if (input === 'k' || key.upArrow) {\n setCursor((c) => Math.max(c - 1, 0));\n } else if (input === 'g') {\n setCursor(0);\n } else if (input === 'G') {\n setCursor(Math.max(allItems.length - 1, 0));\n } else if (key.return && allItems[cursor]) {\n selectPackage(allItems[cursor].name);\n navigate('package-info');\n } else if (input === 'f') {\n setTab((t) => t === 'formulae' ? 'casks' : 'formulae');\n setCursor(0);\n }\n }, { isActive: true });\n\n if (loading.installed) return <Loading message={t('loading_installed')} />;\n if (errors.installed) return <ErrorMessage message={errors.installed} />;\n\n if (stream.isRunning || stream.lines.length > 0) {\n return (\n <Box flexDirection=\"column\">\n <ProgressLog\n lines={stream.lines}\n isRunning={stream.isRunning}\n title={t('pkgInfo_uninstalling', { name: '...' })}\n />\n {!stream.isRunning && (\n <Box marginTop={1}>\n <Box borderStyle=\"round\" borderColor={stream.error ? '#EF4444' : '#22C55E'} paddingX={2} paddingY={0}>\n <Text color={stream.error ? '#EF4444' : '#22C55E'} bold>\n {stream.error ? `\\u2718 ${stream.error}` : `\\u2714 ${t('pkgInfo_done')}`}\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n }\n\n const MAX_VISIBLE_ROWS = 20;\n const start = Math.max(0, cursor - Math.floor(MAX_VISIBLE_ROWS / 2));\n const visible = allItems.slice(start, start + MAX_VISIBLE_ROWS);\n\n return (\n <Box flexDirection=\"column\">\n {/* Tab selector — both tabs always have a round border so the tab bar\n height stays constant when switching (prevents content jump). The\n inactive tab uses a dim gray border to signal it is not selected. */}\n <Box marginBottom={1} gap={1}>\n <Box\n borderStyle=\"round\"\n borderColor={tab === 'formulae' ? '#06B6D4' : '#6B7280'}\n paddingX={1}\n >\n <Text bold={tab === 'formulae'} color={tab === 'formulae' ? '#06B6D4' : '#6B7280'}>\n {'\\u{1F4E6}'} {t('installed_formulaeCount', { count: formulae.length })}\n </Text>\n </Box>\n <Box\n borderStyle=\"round\"\n borderColor={tab === 'casks' ? '#A855F7' : '#6B7280'}\n paddingX={1}\n >\n <Text bold={tab === 'casks'} color={tab === 'casks' ? '#A855F7' : '#6B7280'}>\n {'\\u{1F37A}'} {t('installed_casksCount', { count: casks.length })}\n </Text>\n </Box>\n </Box>\n\n {/* Uninstall confirmation */}\n {confirmUninstall && (\n <ConfirmDialog\n message={t('installed_confirmUninstall', { name: confirmUninstall })}\n onConfirm={() => {\n const name = confirmUninstall;\n setConfirmUninstall(null);\n void stream.run(['uninstall', name]).then(() => { fetchInstalled(); });\n }}\n onCancel={() => setConfirmUninstall(null)}\n />\n )}\n\n {/* Search bar */}\n {isSearching && (\n <Box marginBottom={1} borderStyle=\"round\" borderColor=\"#FFD700\" paddingX={1}>\n <SearchInput defaultValue={filter} onChange={setFilter} isActive={isSearching} />\n </Box>\n )}\n\n {/* Column header — 1 space prefix matches the 1-char cursor glyph in data\n rows; gap={1} is shared by both header and data rows via the parent Box,\n so widths must match: ' ' + gap(1) + padEnd(27) aligns with data rows. */}\n <Box gap={1} borderStyle=\"single\" borderBottom borderTop={false} borderLeft={false} borderRight={false} borderColor=\"#4B5563\">\n <Text color=\"#F9FAFB\" bold>{' '}{'Package'.padEnd(27)}</Text>\n <Text color=\"#F9FAFB\" bold>{'Version'.padEnd(12)}</Text>\n <Text color=\"#F9FAFB\" bold>{'Status'}</Text>\n </Box>\n\n {/* Package list */}\n <Box flexDirection=\"column\">\n {visible.length === 0 && (\n <Box paddingY={1} justifyContent=\"center\">\n <Text color=\"#6B7280\" italic>{t('installed_noPackages')}</Text>\n </Box>\n )}\n {start > 0 && (\n <Text color=\"#6B7280\" dimColor> {t('scroll_moreAbove', { count: start })}</Text>\n )}\n {visible.map((item, i) => {\n const idx = start + i;\n const isCurrent = idx === cursor;\n return (\n <Box key={item.name} gap={1}>\n <Text color={isCurrent ? '#22C55E' : '#9CA3AF'}>{isCurrent ? '\\u25B6' : ' '}</Text>\n <Text bold={isCurrent} inverse={isCurrent} color={isCurrent ? '#F9FAFB' : '#9CA3AF'}>\n {truncate(item.name, 27).padEnd(27)}\n </Text>\n <Text color=\"#2DD4BF\">{item.version.padEnd(12)}</Text>\n {item.outdated && <StatusBadge label={t('badge_outdated')} variant=\"warning\" />}\n {item.pinned && <StatusBadge label={t('badge_pinned')} variant=\"info\" />}\n {item.kegOnly && <StatusBadge label={t('badge_kegOnly')} variant=\"muted\" />}\n {item.installedAsDependency && <StatusBadge label={t('badge_dep')} variant=\"muted\" />}\n {!item.outdated && !item.pinned && !item.kegOnly && !item.installedAsDependency && (\n <Text color=\"#6B7280\" dimColor>{truncate(item.desc, 30)}</Text>\n )}\n </Box>\n );\n })}\n {start + MAX_VISIBLE_ROWS < allItems.length && (\n <Text color=\"#6B7280\" dimColor> {t('scroll_moreBelow', { count: allItems.length - start - MAX_VISIBLE_ROWS })}</Text>\n )}\n </Box>\n\n {/* Status bar */}\n <Box marginTop={1}>\n <Text color=\"#F9FAFB\" bold>\n {allItems.length > 0 ? `${cursor + 1}/${allItems.length}` : '0/0'}\n </Text>\n </Box>\n </Box>\n );\n}\n","import { useState, useEffect } from 'react';\n\nexport function useDebounce<T>(value: T, delayMs: number): T {\n const [debounced, setDebounced] = useState(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebounced(value), delayMs);\n return () => clearTimeout(timer);\n }, [value, delayMs]);\n\n return debounced;\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport { streamBrew } from '../lib/brew-cli.js';\nimport type { HistoryAction } from '../lib/history/types.js';\n\nconst MAX_LINES = 100;\n\n/** Map brew subcommand to a history action type */\nfunction detectAction(args: string[]): { action: HistoryAction; packageName: string | null } | null {\n const cmd = args[0];\n if (cmd === 'install') return { action: 'install', packageName: args[1] ?? null };\n if (cmd === 'uninstall') {\n const name = args.find((a) => !a.startsWith('-')) === 'uninstall'\n ? args.find((a, i) => i > 0 && !a.startsWith('-')) ?? null\n : args[1] ?? null;\n return { action: 'uninstall', packageName: name };\n }\n if (cmd === 'upgrade') {\n if (args.length === 1) return { action: 'upgrade-all', packageName: null };\n return { action: 'upgrade', packageName: args[1] ?? null };\n }\n return null;\n}\n\nasync function logToHistory(args: string[], success: boolean, error: string | null): Promise<void> {\n const detected = detectAction(args);\n if (!detected) return;\n\n try {\n // Dynamic import to avoid circular deps and to skip logging for free users\n // (appendEntry calls requirePro() which will throw for free users)\n const { appendEntry } = await import('../lib/history/history-logger.js');\n await appendEntry(detected.action, detected.packageName, success, error);\n } catch {\n // Free user or file error — silently skip logging\n }\n}\n\ninterface BrewStreamState {\n lines: string[];\n isRunning: boolean;\n error: string | null;\n run: (args: string[]) => Promise<void>;\n cancel: () => void;\n clear: () => void;\n}\n\nexport function useBrewStream(): BrewStreamState {\n const [lines, setLines] = useState<string[]>([]);\n const [isRunning, setIsRunning] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const cancelRef = useRef(false);\n const generatorRef = useRef<AsyncGenerator<string> | null>(null);\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n generatorRef.current?.return(undefined);\n generatorRef.current = null;\n };\n }, []);\n\n const run = useCallback(async (args: string[]) => {\n if (!mountedRef.current) return;\n setIsRunning(true);\n setError(null);\n setLines([]);\n cancelRef.current = false;\n\n const gen = streamBrew(args);\n generatorRef.current = gen;\n\n let streamError: string | null = null;\n\n try {\n for await (const line of gen) {\n if (cancelRef.current) break;\n if (mountedRef.current) {\n setLines((prev) => [...prev.slice(-(MAX_LINES - 1)), line]);\n }\n }\n } catch (err) {\n streamError = err instanceof Error ? err.message : String(err);\n if (!cancelRef.current && mountedRef.current) {\n setError(streamError);\n }\n } finally {\n generatorRef.current = null;\n if (mountedRef.current) {\n setIsRunning(false);\n }\n }\n\n // Log to history (Pro users only, silently skipped for free)\n if (!cancelRef.current) {\n void logToHistory(args, streamError === null, streamError);\n }\n }, []);\n\n const cancel = useCallback(() => {\n cancelRef.current = true;\n generatorRef.current?.return(undefined);\n generatorRef.current = null;\n }, []);\n\n const clear = useCallback(() => {\n setLines([]);\n setError(null);\n }, []);\n\n return { lines, isRunning, error, run, cancel, clear };\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { TextInput } from '@inkjs/ui';\nimport { t } from '../../i18n/index.js';\n\ninterface SearchInputProps {\n defaultValue?: string;\n onChange: (value: string) => void;\n placeholder?: string;\n isActive?: boolean;\n}\n\nexport function SearchInput({ defaultValue, onChange, placeholder, isActive = true }: SearchInputProps) {\n const resolvedPlaceholder = placeholder ?? t('searchInput_placeholder');\n return (\n <Box>\n <Text color=\"#FFD700\">{'\\u{1F50D}'} </Text>\n {isActive ? (\n <TextInput\n placeholder={resolvedPlaceholder}\n defaultValue={defaultValue}\n onChange={onChange}\n />\n ) : (\n <Text color=\"#6B7280\">{defaultValue || placeholder}</Text>\n )}\n </Box>\n );\n}\n","import React, { useEffect } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { t, useLocaleStore } from '../../i18n/index.js';\nimport { useModalStore } from '../../stores/modal-store.js';\n\ninterface ConfirmDialogProps {\n message: string;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport function ConfirmDialog({ message, onConfirm, onCancel }: ConfirmDialogProps) {\n const locale = useLocaleStore((s) => s.locale);\n const { openModal, closeModal } = useModalStore();\n\n useEffect(() => {\n openModal();\n return () => { closeModal(); };\n }, []);\n\n useInput((input, key) => {\n if (input === 'y' || input === 'Y') onConfirm();\n else if (locale === 'es' && (input === 's' || input === 'S')) onConfirm();\n else if (input === 'n' || input === 'N') onCancel();\n else if (key.escape) onCancel();\n });\n\n return (\n <Box borderStyle=\"double\" borderColor=\"#A855F7\" paddingX={2} paddingY={1} flexDirection=\"column\">\n <Text bold color=\"#F9FAFB\">{message}</Text>\n <Box marginTop={1}>\n <Text color=\"#22C55E\">{t('confirm_yes')}</Text>\n <Text> / </Text>\n <Text color=\"#EF4444\">{t('confirm_no')}</Text>\n </Box>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { Spinner } from '@inkjs/ui';\nimport { t } from '../../i18n/index.js';\n\ninterface ProgressLogProps {\n lines: string[];\n isRunning: boolean;\n title?: string;\n maxVisible?: number;\n}\n\nexport function ProgressLog({ lines, isRunning, title, maxVisible = 15 }: ProgressLogProps) {\n const visible = lines.slice(-maxVisible);\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"#38BDF8\" paddingX={1}>\n {title && (\n <Box marginBottom={1}>\n {isRunning && <Spinner label=\"\" />}\n <Text bold color=\"#38BDF8\"> {title}</Text>\n </Box>\n )}\n {visible.map((line, i) => (\n <Text key={i} color=\"#9CA3AF\" wrap=\"wrap\">{line}</Text>\n ))}\n {lines.length === 0 && !isRunning && (\n <Text color=\"#6B7280\" italic>{t('progress_noOutput')}</Text>\n )}\n </Box>\n );\n}\n","import { t } from '../i18n/index.js';\n\nexport function formatBytes(bytes: number): string {\n if (!isFinite(bytes) || bytes <= 0) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), units.length - 1);\n return `${(bytes / Math.pow(1024, i)).toFixed(1)} ${units[i]}`;\n}\n\nexport function formatRelativeTime(timestamp: number): string {\n if (!timestamp || !isFinite(timestamp)) return t('time_justNow');\n const diff = Date.now() / 1000 - timestamp;\n if (diff < 0) return t('time_justNow');\n if (diff < 60) return t('time_justNow');\n if (diff < 3600) return t('time_minutesAgo', { n: Math.floor(diff / 60) });\n if (diff < 86400) return t('time_hoursAgo', { n: Math.floor(diff / 3600) });\n if (diff < 2592000) return t('time_daysAgo', { n: Math.floor(diff / 86400) });\n return t('time_monthsAgo', { n: Math.floor(diff / 2592000) });\n}\n\nexport function truncate(str: string, maxLen: number): string {\n if (str.length <= maxLen) return str;\n return str.slice(0, maxLen - 1) + '\\u2026';\n}\n","import React, { useState, useCallback, useEffect, useRef } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { TextInput } from '@inkjs/ui';\nimport { useBrewStore } from '../stores/brew-store.js';\nimport { useBrewStream } from '../hooks/use-brew-stream.js';\nimport { Loading } from '../components/common/loading.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { t } from '../i18n/index.js';\nimport { useModalStore } from '../stores/modal-store.js';\nimport { useNavigationStore } from '../stores/navigation-store.js';\nimport * as api from '../lib/brew-api.js';\n\nexport function SearchView() {\n const [query, setQuery] = useState('');\n const [results, setResults] = useState<{ formulae: string[]; casks: string[] } | null>(null);\n const [searching, setSearching] = useState(false);\n const [cursor, setCursor] = useState(0);\n const [confirmInstall, setConfirmInstall] = useState<string | null>(null);\n const stream = useBrewStream();\n const { openModal, closeModal } = useModalStore();\n const navigate = useNavigationStore((s) => s.navigate);\n const selectPackage = useNavigationStore((s) => s.selectPackage);\n const fetchInstalled = useBrewStore((s) => s.fetchInstalled);\n const hasRefreshed = useRef(false);\n\n // Suppress global Escape while results are showing so Escape clears results\n // rather than navigating away from this view.\n useEffect(() => {\n if (results !== null) {\n openModal();\n return () => { closeModal(); };\n }\n return undefined;\n }, [results]);\n\n const doSearch = useCallback(async (term: string) => {\n if (term.length < 2) return;\n setSearching(true);\n try {\n const r = await api.search(term);\n setResults(r);\n setCursor(0);\n } catch (err) {\n setResults({ formulae: [], casks: [] });\n // Search failed (network error, brew not found, etc.)\n // Results are cleared so the UI shows \"no results\" rather than stale data\n void err;\n } finally {\n setSearching(false);\n }\n }, []);\n\n useEffect(() => {\n if (!stream.isRunning && !stream.error && stream.lines.length > 0 && !hasRefreshed.current) {\n hasRefreshed.current = true;\n void fetchInstalled();\n }\n }, [stream.isRunning, stream.error]);\n\n const allResults = results ? [...results.formulae, ...results.casks] : [];\n\n useInput((input, key) => {\n if (stream.isRunning) {\n if (key.escape) stream.cancel();\n return;\n }\n if (confirmInstall) return;\n\n if (key.return && !results) {\n void doSearch(query);\n return;\n }\n\n // Enter → navigate to package-info view (preview details, deps, caveats)\n if (key.return && allResults[cursor]) {\n selectPackage(allResults[cursor]);\n navigate('package-info');\n return;\n }\n\n // 'i' → install directly (with confirmation)\n if (input === 'i' && allResults[cursor]) {\n setConfirmInstall(allResults[cursor]);\n return;\n }\n\n if (input === 'j' || key.downArrow) {\n setCursor((c) => Math.min(c + 1, Math.max(0, allResults.length - 1)));\n } else if (input === 'k' || key.upArrow) {\n setCursor((c) => Math.max(c - 1, 0));\n } else if (key.escape) {\n setResults(null);\n setQuery('');\n }\n });\n\n if (stream.isRunning || stream.lines.length > 0) {\n return (\n <Box flexDirection=\"column\">\n <ProgressLog\n lines={stream.lines}\n isRunning={stream.isRunning}\n title={t('search_installing')}\n />\n {stream.isRunning && (\n <Text color=\"#6B7280\">esc:{t('hint_cancel')}</Text>\n )}\n {!stream.isRunning && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box borderStyle=\"round\" borderColor={stream.error ? '#EF4444' : '#22C55E'} paddingX={2} paddingY={0}>\n <Text color={stream.error ? '#EF4444' : '#22C55E'} bold>\n {stream.error ? `\\u2718 ${stream.error}` : `\\u2714 ${t('search_installComplete')}`}\n </Text>\n </Box>\n <Text color=\"#6B7280\">esc:{t('hint_back')}</Text>\n </Box>\n )}\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text color=\"#FFD700\">{'\\u{1F50D}'} </Text>\n {!results ? (\n <TextInput\n placeholder={t('search_placeholder')}\n defaultValue={query}\n onChange={setQuery}\n onSubmit={() => void doSearch(query)}\n />\n ) : (\n <Text>{t('search_resultsFor')} \"<Text bold color=\"#F9FAFB\">{query}</Text>\" <Text color=\"#6B7280\">{t('search_escToClear')}</Text></Text>\n )}\n </Box>\n\n {searching && <Loading message={t('loading_searching')} />}\n\n {confirmInstall && (\n <ConfirmDialog\n message={t('search_confirmInstall', { name: confirmInstall })}\n onConfirm={() => {\n const name = confirmInstall;\n hasRefreshed.current = false;\n setConfirmInstall(null);\n void stream.run(['install', name]);\n }}\n onCancel={() => setConfirmInstall(null)}\n />\n )}\n\n {results && !searching && !confirmInstall && (\n <Box flexDirection=\"column\">\n {results.formulae.length > 0 && (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold color=\"#06B6D4\">{t('search_formulaeHeader', { count: results.formulae.length })}</Text>\n {results.formulae.slice(0, 20).map((name, i) => {\n const isCurrent = i === cursor;\n return (\n <Box key={name} gap={1}>\n <Text color={isCurrent ? '#22C55E' : '#9CA3AF'}>{isCurrent ? '\\u25B6' : ' '}</Text>\n <Text bold={isCurrent} inverse={isCurrent}>{name}</Text>\n </Box>\n );\n })}\n {results.formulae.length > 20 && (\n <Text color=\"#6B7280\" dimColor> {t('scroll_moreBelow', { count: results.formulae.length - 20 })}</Text>\n )}\n </Box>\n )}\n\n {results.casks.length > 0 && (\n <Box flexDirection=\"column\">\n <Text bold color=\"#A855F7\">{t('search_casksHeader', { count: results.casks.length })}</Text>\n {results.casks.slice(0, 20).map((name, i) => {\n const idx = results.formulae.length + i;\n const isCurrent = idx === cursor;\n return (\n <Box key={name} gap={1}>\n <Text color={isCurrent ? '#22C55E' : '#9CA3AF'}>{isCurrent ? '\\u25B6' : ' '}</Text>\n <Text bold={isCurrent} inverse={isCurrent}>{name}</Text>\n </Box>\n );\n })}\n {results.casks.length > 20 && (\n <Text color=\"#6B7280\" dimColor> {t('scroll_moreBelow', { count: results.casks.length - 20 })}</Text>\n )}\n </Box>\n )}\n\n {allResults.length === 0 && (\n <Box borderStyle=\"round\" borderColor=\"#6B7280\" paddingX={2}>\n <Text color=\"#6B7280\" italic>{t('search_noResults')}</Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color=\"#F9FAFB\" bold>\n {allResults.length > 0 ? `${cursor + 1}/${allResults.length}` : ''}\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { useBrewStore } from '../stores/brew-store.js';\nimport { useBrewStream } from '../hooks/use-brew-stream.js';\nimport { execBrew } from '../lib/brew-cli.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { StatusBadge } from '../components/common/status-badge.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { VersionArrow } from '../components/common/version-arrow.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\n\nexport function OutdatedView() {\n const { outdated, loading, errors, fetchOutdated } = useBrewStore();\n const stream = useBrewStream();\n const [cursor, setCursor] = useState(0);\n const [confirmAction, setConfirmAction] = useState<\n | { type: 'single'; name: string }\n | { type: 'all' }\n | null\n >(null);\n const hasRefreshed = useRef(false);\n\n useEffect(() => { fetchOutdated(); }, []);\n\n useEffect(() => {\n if (!stream.isRunning && !stream.error && stream.lines.length > 0 && !hasRefreshed.current) {\n hasRefreshed.current = true;\n void fetchOutdated();\n }\n }, [stream.isRunning, stream.error]);\n\n const allOutdated = [...outdated.formulae, ...outdated.casks];\n\n useInput((input, key) => {\n if (stream.isRunning) {\n if (key.escape) stream.cancel();\n return;\n }\n if (confirmAction) return;\n\n if (input === 'j' || key.downArrow) {\n setCursor((c) => Math.min(c + 1, Math.max(0, allOutdated.length - 1)));\n } else if (input === 'k' || key.upArrow) {\n setCursor((c) => Math.max(c - 1, 0));\n } else if (key.return && allOutdated[cursor]) {\n setConfirmAction({ type: 'single', name: allOutdated[cursor].name });\n } else if (input === 'A' && allOutdated.length > 0) {\n setConfirmAction({ type: 'all' });\n } else if (input === 'p' && allOutdated[cursor]) {\n const pkg = allOutdated[cursor];\n void execBrew([pkg.pinned ? 'unpin' : 'pin', pkg.name]).then(() => void fetchOutdated());\n return;\n } else if (input === 'r') {\n void fetchOutdated();\n }\n });\n\n if (loading.outdated) return <Loading message={t('loading_outdated')} />;\n if (errors.outdated) return <ErrorMessage message={errors.outdated} />;\n\n if (stream.isRunning || stream.lines.length > 0) {\n return (\n <Box flexDirection=\"column\">\n <ProgressLog\n lines={stream.lines}\n isRunning={stream.isRunning}\n title={t('outdated_upgrading')}\n />\n {stream.isRunning && (\n <Text color=\"#6B7280\">esc:{t('hint_cancel')}</Text>\n )}\n {!stream.isRunning && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box borderStyle=\"round\" borderColor={stream.error ? '#EF4444' : '#22C55E'} paddingX={2} paddingY={0}>\n <Text color={stream.error ? '#EF4444' : '#22C55E'} bold>\n {stream.error ? `\\u2718 ${stream.error}` : `\\u2714 ${t('outdated_upgradeComplete')}`}\n </Text>\n <Text color=\"#9CA3AF\"> {t('outdated_pressRefresh')}</Text>\n </Box>\n <Text color=\"#6B7280\">r:{t('hint_refresh')} esc:{t('hint_back')}</Text>\n </Box>\n )}\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u{1F4E6}'} title={t('outdated_title', { count: allOutdated.length })} gradient={GRADIENTS.fire} />\n\n {confirmAction && (\n <Box marginY={1}>\n <ConfirmDialog\n message={\n confirmAction.type === 'all'\n ? t('outdated_confirmAll', { count: allOutdated.length })\n : t('outdated_confirmSingle', { name: confirmAction.type === 'single' ? confirmAction.name : '' })\n }\n onConfirm={() => {\n hasRefreshed.current = false;\n if (confirmAction.type === 'all') {\n void stream.run(['upgrade']);\n } else if (confirmAction.name) {\n void stream.run(['upgrade', confirmAction.name]);\n }\n setConfirmAction(null);\n }}\n onCancel={() => setConfirmAction(null)}\n />\n </Box>\n )}\n\n {allOutdated.length === 0 && !confirmAction && (\n <Box marginTop={1}>\n <Box borderStyle=\"round\" borderColor=\"#22C55E\" paddingX={2} paddingY={0}>\n <Text color=\"#22C55E\" bold>{'\\u2714'} {t('outdated_upToDate')}</Text>\n </Box>\n </Box>\n )}\n\n {allOutdated.length > 0 && !confirmAction && (\n <Box flexDirection=\"column\" marginTop={1}>\n {allOutdated.map((pkg, i) => {\n const isCurrent = i === cursor;\n return (\n <Box key={pkg.name} gap={1}>\n <Text color={isCurrent ? '#22C55E' : '#9CA3AF'}>{isCurrent ? '\\u25B6' : ' '}</Text>\n <Text bold={isCurrent} inverse={isCurrent} color={isCurrent ? '#F9FAFB' : '#9CA3AF'}>\n {pkg.name}\n </Text>\n <VersionArrow current={pkg.installed_versions[0] ?? ''} latest={pkg.current_version} />\n {pkg.pinned && <StatusBadge label={t('outdated_pinned')} variant=\"info\" />}\n </Box>\n );\n })}\n\n <Box marginTop={1}>\n <Text color=\"#F9FAFB\" bold>\n {cursor + 1}/{allOutdated.length}\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { useNavigationStore } from '../stores/navigation-store.js';\nimport { useBrewStream } from '../hooks/use-brew-stream.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { StatusBadge } from '../components/common/status-badge.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { GradientText, GRADIENTS } from '../utils/gradient.js';\nimport { formatRelativeTime } from '../utils/format.js';\nimport { t } from '../i18n/index.js';\nimport type { TranslationKey } from '../i18n/en.js';\nimport * as api from '../lib/brew-api.js';\nimport type { Formula } from '../lib/types.js';\n\nconst ACTION_PROGRESS_KEYS: Record<string, TranslationKey> = {\n install: 'pkgInfo_installing',\n uninstall: 'pkgInfo_uninstalling',\n upgrade: 'pkgInfo_upgrading',\n};\n\nconst ACTION_CONFIRM_KEYS: Record<string, TranslationKey> = {\n install: 'pkgInfo_confirmInstall',\n uninstall: 'pkgInfo_confirmUninstall',\n upgrade: 'pkgInfo_confirmUpgrade',\n};\n\nexport function PackageInfoView() {\n const packageName = useNavigationStore((s) => s.selectedPackage);\n const [formula, setFormula] = useState<Formula | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [confirmAction, setConfirmAction] = useState<string | null>(null);\n const activeActionRef = useRef<string>('install');\n const mountedRef = useRef(true);\n const hasRefreshed = useRef(false);\n const stream = useBrewStream();\n\n useEffect(() => {\n mountedRef.current = true;\n return () => { mountedRef.current = false; };\n }, []);\n\n useEffect(() => {\n if (!packageName) return;\n setLoading(true);\n api.getFormulaInfo(packageName)\n .then((f) => { if (mountedRef.current) { setFormula(f); setLoading(false); } })\n .catch((err) => { if (mountedRef.current) { setError(err.message); setLoading(false); } });\n }, [packageName]);\n\n useEffect(() => {\n if (!stream.isRunning && !stream.error && stream.lines.length > 0 && !hasRefreshed.current && packageName) {\n hasRefreshed.current = true;\n api.getFormulaInfo(packageName)\n .then((f) => { if (mountedRef.current) { setFormula(f); } })\n .catch(() => { /* ignore refresh errors */ });\n }\n }, [stream.isRunning, stream.error]);\n\n useInput((input, key) => {\n if (stream.isRunning) {\n if (key.escape) stream.cancel();\n return;\n }\n if (confirmAction) return;\n\n if (!formula) return;\n\n const isInstalled = formula.installed.length > 0;\n if (input === 'i' && !isInstalled) {\n setConfirmAction('install');\n } else if (input === 'u' && isInstalled) {\n setConfirmAction('uninstall');\n } else if (input === 'U' && isInstalled && formula.outdated) {\n setConfirmAction('upgrade');\n }\n });\n\n if (!packageName) {\n return <Text color=\"#6B7280\" italic>{t('pkgInfo_noPackage')}</Text>;\n }\n\n if (loading) return <Loading message={t('loading_package', { name: packageName })} />;\n if (error) return <ErrorMessage message={error} />;\n if (!formula) return <ErrorMessage message={t('pkgInfo_notFound')} />;\n\n if (stream.isRunning || stream.lines.length > 0) {\n return (\n <Box flexDirection=\"column\">\n <ProgressLog lines={stream.lines} isRunning={stream.isRunning} title={t(ACTION_PROGRESS_KEYS[activeActionRef.current] ?? ACTION_PROGRESS_KEYS['install']!, { name: formula.name })} />\n {stream.isRunning && (\n <Text color=\"#6B7280\">esc:{t('hint_cancel')}</Text>\n )}\n {!stream.isRunning && (\n <>\n <Text color={stream.error ? '#EF4444' : '#22C55E'} bold>\n {stream.error ? `\\u2718 ${stream.error}` : `\\u2714 ${t('pkgInfo_done')}`}\n </Text>\n <Text color=\"#6B7280\">esc:{t('hint_back')}</Text>\n </>\n )}\n </Box>\n );\n }\n\n const installed = formula.installed[0];\n const isInstalled = formula.installed.length > 0;\n\n return (\n <Box flexDirection=\"column\">\n {confirmAction && (\n <ConfirmDialog\n message={t(ACTION_CONFIRM_KEYS[confirmAction], { name: formula.name })}\n onConfirm={() => {\n const action = confirmAction;\n activeActionRef.current = action ?? 'install';\n hasRefreshed.current = false;\n setConfirmAction(null);\n if (action === 'install') void stream.run(['install', formula.name]);\n else if (action === 'uninstall') void stream.run(['uninstall', formula.name]);\n else if (action === 'upgrade') void stream.run(['upgrade', formula.name]);\n }}\n onCancel={() => setConfirmAction(null)}\n />\n )}\n\n <Box gap={2} marginBottom={1}>\n <GradientText colors={GRADIENTS.gold} bold>{formula.name}</GradientText>\n <Text color=\"#2DD4BF\">{installed?.version ?? formula.versions.stable}</Text>\n {isInstalled && <StatusBadge label={t('badge_installed')} variant=\"success\" />}\n {formula.outdated && <StatusBadge label={t('badge_outdated')} variant=\"warning\" />}\n {formula.pinned && <StatusBadge label={t('badge_pinned')} variant=\"info\" />}\n {formula.keg_only && <StatusBadge label={t('badge_kegOnly')} variant=\"muted\" />}\n {formula.deprecated && <StatusBadge label={t('badge_deprecated')} variant=\"error\" />}\n </Box>\n\n <Box flexDirection=\"column\" gap={1}>\n <Text>{formula.desc}</Text>\n\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u{1F4CB}'} title={t('pkgInfo_details')} gradient={['#F9FAFB', '#9CA3AF']} />\n <Box borderStyle=\"round\" borderColor=\"#4B5563\" paddingX={2} flexDirection=\"column\">\n <Text><Text color=\"#9CA3AF\">{t('pkgInfo_homepage')}</Text> {formula.homepage}</Text>\n <Text><Text color=\"#9CA3AF\">{t('pkgInfo_license')}</Text> {formula.license}</Text>\n <Text><Text color=\"#9CA3AF\">{t('pkgInfo_tap')}</Text> {formula.tap}</Text>\n <Text><Text color=\"#9CA3AF\">{t('pkgInfo_stable')}</Text> {formula.versions.stable}</Text>\n {installed && (\n <>\n <Text><Text color=\"#9CA3AF\">{t('pkgInfo_installed')}</Text> {installed.version} ({formatRelativeTime(installed.time)})</Text>\n <Text><Text color=\"#9CA3AF\">{t('pkgInfo_bottle')}</Text> {installed.poured_from_bottle ? t('common_yes') : t('common_no')}</Text>\n <Text><Text color=\"#9CA3AF\">{t('pkgInfo_onRequest')}</Text> {installed.installed_on_request ? t('common_yes') : t('pkgInfo_noDependency')}</Text>\n </>\n )}\n </Box>\n </Box>\n\n {formula.dependencies.length > 0 && (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u{1F517}'} title={t('pkgInfo_dependencies', { count: formula.dependencies.length })} gradient={GRADIENTS.ocean} />\n <Box paddingLeft={2} flexWrap=\"wrap\" columnGap={2}>\n {formula.dependencies.map((dep) => (\n <Text key={dep} color=\"#9CA3AF\">{dep}</Text>\n ))}\n </Box>\n </Box>\n )}\n\n {formula.caveats && (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u26A0\\uFE0F'} title={t('pkgInfo_caveats')} color=\"#F59E0B\" />\n <Box borderStyle=\"round\" borderColor=\"#F59E0B\" paddingX={2}>\n <Text color=\"#F59E0B\">{formula.caveats}</Text>\n </Box>\n </Box>\n )}\n </Box>\n\n <Box marginTop={1}>\n <Text color=\"#6B7280\">\n {isInstalled ? `u:${t('hint_uninstall')}` : `i:${t('hint_install')}`}\n {isInstalled && formula.outdated ? ` U:${t('hint_upgrade')}` : ''}\n {` esc:${t('hint_back')}`}\n </Text>\n </Box>\n </Box>\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { useBrewStore } from '../stores/brew-store.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { StatusBadge } from '../components/common/status-badge.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nconst STATUS_VARIANTS = {\n started: 'success',\n stopped: 'muted',\n error: 'error',\n none: 'muted',\n} as const;\n\nexport function ServicesView() {\n const { services, loading, errors, fetchServices, serviceAction } = useBrewStore();\n const [cursor, setCursor] = useState(0);\n const [actionInProgress, setActionInProgress] = useState(false);\n const [confirmAction, setConfirmAction] = useState<{ type: 'stop' | 'restart'; name: string } | null>(null);\n\n useEffect(() => { fetchServices(); }, []);\n\n useInput((input, key) => {\n if (actionInProgress) return;\n if (confirmAction) return;\n\n if (input === 'j' || key.downArrow) {\n setCursor((c) => Math.min(c + 1, Math.max(0, services.length - 1)));\n } else if (input === 'k' || key.upArrow) {\n setCursor((c) => Math.max(c - 1, 0));\n } else if (input === 'r') {\n void fetchServices();\n }\n\n const svc = services[cursor];\n if (!svc) return;\n\n const doAction = (action: 'start' | 'stop' | 'restart') => {\n setActionInProgress(true);\n void serviceAction(svc.name, action).finally(() => {\n setActionInProgress(false);\n });\n };\n\n if (input === 's') doAction('start');\n else if (input === 'S') setConfirmAction({ type: 'stop', name: svc.name });\n else if (input === 'R') setConfirmAction({ type: 'restart', name: svc.name });\n });\n\n if (loading.services) return <Loading message={t('loading_services')} />;\n if (errors.services) return <ErrorMessage message={errors.services} />;\n\n if (services.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u2699\\uFE0F'} title={t('services_title')} gradient={GRADIENTS.ocean} />\n <Text color=\"#6B7280\" italic>{t('services_noServices')}</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u2699\\uFE0F'} title={t('services_titleCount', { count: services.length })} gradient={GRADIENTS.ocean} />\n\n {confirmAction && (\n <Box marginY={1}>\n <ConfirmDialog\n message={\n confirmAction.type === 'stop'\n ? t('services_confirmStop', { name: confirmAction.name })\n : t('services_confirmRestart', { name: confirmAction.name })\n }\n onConfirm={() => {\n const { type, name } = confirmAction;\n setConfirmAction(null);\n setActionInProgress(true);\n void serviceAction(name, type).finally(() => {\n setActionInProgress(false);\n });\n }}\n onCancel={() => setConfirmAction(null)}\n />\n </Box>\n )}\n\n <Box flexDirection=\"column\" marginTop={1}>\n <Box gap={1} borderStyle=\"single\" borderBottom borderTop={false} borderLeft={false} borderRight={false} borderColor=\"#4B5563\" paddingBottom={0}>\n <Text bold color=\"#F9FAFB\">{' '}{t('services_name').padEnd(22)}</Text>\n <Text bold color=\"#F9FAFB\">{t('services_status').padEnd(12)}</Text>\n <Text bold color=\"#F9FAFB\">{t('services_user')}</Text>\n </Box>\n\n {services.map((svc, i) => {\n const isCurrent = i === cursor;\n return (\n <Box key={svc.name} gap={1}>\n <Text color={isCurrent ? '#22C55E' : '#9CA3AF'}>{isCurrent ? '\\u25B6' : ' '}</Text>\n <Text bold={isCurrent} inverse={isCurrent} color={isCurrent ? '#F9FAFB' : '#9CA3AF'}>\n {svc.name.padEnd(20)}\n </Text>\n <StatusBadge label={svc.status} variant={STATUS_VARIANTS[svc.status]} />\n <Text color=\"#9CA3AF\">{svc.user ?? '-'}</Text>\n {svc.exit_code != null && svc.exit_code !== 0 && (\n <Text color=\"#EF4444\">{t('common_exit', { code: svc.exit_code })}</Text>\n )}\n </Box>\n );\n })}\n </Box>\n\n {actionInProgress && <Text color=\"#38BDF8\">{t('services_processing')}</Text>}\n\n <Box marginTop={1}>\n <Text color=\"#F9FAFB\" bold>\n {cursor + 1}/{services.length}\n </Text>\n </Box>\n </Box>\n );\n}\n","import React, { useEffect } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { useBrewStore } from '../stores/brew-store.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t, tp } from '../i18n/index.js';\n\nexport function DoctorView() {\n const { doctorWarnings, doctorClean, loading, errors, fetchDoctor } = useBrewStore();\n\n useEffect(() => { fetchDoctor(); }, []);\n\n useInput((input) => {\n if (input === 'r') void fetchDoctor();\n });\n\n if (loading.doctor) return <Loading message={t('loading_doctor')} />;\n if (errors.doctor) return <ErrorMessage message={errors.doctor} />;\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u{1FA7A}'} title={t('doctor_title')} gradient={GRADIENTS.emerald} />\n\n <Box flexDirection=\"column\" marginTop={1}>\n {doctorClean && (\n <Box borderStyle=\"round\" borderColor=\"#22C55E\" paddingX={2} paddingY={0}>\n <Text color=\"#22C55E\" bold>{'\\u2714'} {t('doctor_clean')}</Text>\n </Box>\n )}\n\n {doctorClean === false && doctorWarnings.length === 0 && (\n <Text color=\"#F59E0B\">{t('doctor_warningsNotCaptured')}</Text>\n )}\n\n {doctorWarnings.map((warning, i) => (\n <Box key={i} flexDirection=\"column\" marginBottom={1} borderStyle=\"single\" borderColor=\"#F59E0B\" paddingX={1}>\n {warning.split('\\n').map((line, j) => (\n <Text key={j} color={j === 0 ? '#F59E0B' : '#9CA3AF'}>{line}</Text>\n ))}\n </Box>\n ))}\n </Box>\n\n <Box marginTop={1}>\n <Text color=\"#F9FAFB\" bold>\n {doctorWarnings.length > 0 ? tp('plural_warnings', doctorWarnings.length) : ''}\n </Text>\n </Box>\n </Box>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { TextInput } from '@inkjs/ui';\nimport { useProfileStore } from '../stores/profile-store.js';\nimport { Loading } from '../components/common/loading.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nimport { useModalStore } from '../stores/modal-store.js';\nimport * as manager from '../lib/profiles/profile-manager.js';\n\ntype Mode = 'list' | 'detail' | 'create-name' | 'create-desc' | 'importing' | 'edit-name' | 'edit-desc';\n\nexport function ProfilesView() {\n const { profileNames, selectedProfile, loading, loadError, fetchProfiles, loadProfile, exportCurrent, deleteProfile, updateProfile } = useProfileStore();\n const [cursor, setCursor] = useState(0);\n const [mode, setMode] = useState<Mode>('list');\n const [newName, setNewName] = useState('');\n const [confirmDelete, setConfirmDelete] = useState(false);\n const [editName, setEditName] = useState('');\n const [editDesc, setEditDesc] = useState('');\n const [importLines, setImportLines] = useState<string[]>([]);\n const [importRunning, setImportRunning] = useState(false);\n const { openModal, closeModal } = useModalStore();\n // Holds the active import generator so it can be cancelled on unmount,\n // which terminates the underlying brew child process via streamBrew's finally block.\n const importGenRef = useRef<AsyncGenerator<string> | null>(null);\n const mountedRef = useRef(true);\n\n useEffect(() => { fetchProfiles(); }, []);\n\n // Cancel any in-flight import when this view unmounts.\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n importGenRef.current?.return(undefined);\n importGenRef.current = null;\n };\n }, []);\n\n // Suppress global keys while in any sub-panel so Escape/q/numbers don't\n // navigate away while the user is typing a name, typing a description,\n // viewing detail, or watching an import stream.\n useEffect(() => {\n if (mode === 'detail' || mode === 'create-name' || mode === 'create-desc' || mode === 'importing' || mode === 'edit-name' || mode === 'edit-desc') {\n openModal();\n return () => { closeModal(); };\n }\n return undefined;\n }, [mode]);\n\n useInput((input, key) => {\n if (mode !== 'list' || confirmDelete) return;\n\n if (input === 'n') { setMode('create-name'); return; }\n if (input === 'd' && profileNames[cursor]) { setConfirmDelete(true); return; }\n if (key.return && profileNames[cursor]) {\n void loadProfile(profileNames[cursor]);\n setMode('detail');\n return;\n }\n if (input === 'i' && profileNames[cursor]) {\n void startImport(profileNames[cursor]);\n return;\n }\n\n if (input === 'j' || key.downArrow) setCursor((c) => Math.min(c + 1, Math.max(0, profileNames.length - 1)));\n else if (input === 'k' || key.upArrow) setCursor((c) => Math.max(c - 1, 0));\n });\n\n useInput((input, key) => {\n if (key.escape || input === 'q') {\n setMode('list');\n return;\n }\n if (input === 'e' && selectedProfile) {\n setEditName(selectedProfile.name);\n setEditDesc(selectedProfile.description);\n setMode('edit-name');\n }\n }, { isActive: mode === 'detail' });\n\n const startImport = async (name: string) => {\n setMode('importing');\n setImportLines([]);\n setImportRunning(true);\n try {\n const profile = await manager.loadProfile(name);\n const gen = manager.importProfile(profile);\n importGenRef.current = gen;\n for await (const line of gen) {\n if (!mountedRef.current) break;\n setImportLines((prev) => [...prev.slice(-99), line]);\n }\n } catch (err) {\n if (mountedRef.current) {\n setImportLines((prev) => [...prev, `${t('error_prefix')}${err instanceof Error ? err.message : err}`]);\n }\n } finally {\n importGenRef.current = null;\n if (mountedRef.current) {\n setImportRunning(false);\n }\n }\n };\n\n if (loading) return <Loading message={t('loading_profiles')} />;\n\n if (mode === 'importing') {\n return (\n <Box flexDirection=\"column\">\n <ProgressLog lines={importLines} isRunning={importRunning} title={t('profiles_importTitle')} />\n {!importRunning && (\n <Box marginTop={1}>\n <Box borderStyle=\"round\" borderColor=\"#22C55E\" paddingX={2} paddingY={0}>\n <Text color=\"#22C55E\" bold>{'\\u2714'} {t('profiles_importComplete')}</Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n }\n\n if (mode === 'create-name') {\n return (\n <Box flexDirection=\"column\">\n <Text bold>{t('profiles_createName')}</Text>\n <TextInput\n placeholder={t('profiles_namePlaceholder')}\n onSubmit={(val) => { setNewName(val); setMode('create-desc'); }}\n />\n </Box>\n );\n }\n\n if (mode === 'create-desc') {\n return (\n <Box flexDirection=\"column\">\n <Text bold>{t('profiles_createDesc', { name: newName })}</Text>\n {loadError && <Text color=\"#EF4444\">{t('error_prefix')}{loadError}</Text>}\n <TextInput\n placeholder={t('profiles_descPlaceholder')}\n onSubmit={async (val) => {\n try {\n await exportCurrent(newName, val);\n } finally {\n setMode('list');\n setNewName('');\n }\n }}\n />\n </Box>\n );\n }\n\n if (mode === 'edit-name') {\n return (\n <Box flexDirection=\"column\">\n <Text bold>{t('profiles_editName')}</Text>\n <TextInput\n defaultValue={editName}\n onSubmit={(val) => { setEditName(val); setMode('edit-desc'); }}\n />\n </Box>\n );\n }\n\n if (mode === 'edit-desc') {\n return (\n <Box flexDirection=\"column\">\n <Text bold>{t('profiles_editDesc', { name: editName })}</Text>\n {loadError && <Text color=\"#EF4444\">{t('error_prefix')}{loadError}</Text>}\n <TextInput\n defaultValue={editDesc}\n onSubmit={async (val) => {\n if (selectedProfile) {\n await updateProfile(selectedProfile.name, editName, val);\n }\n setMode('detail');\n setEditName('');\n setEditDesc('');\n }}\n />\n </Box>\n );\n }\n\n if (mode === 'detail' && selectedProfile) {\n return (\n <Box flexDirection=\"column\">\n <Text bold color=\"#FFD700\">{selectedProfile.name}</Text>\n <Text color=\"#9CA3AF\">{selectedProfile.description}</Text>\n <Text color=\"#9CA3AF\">{t('profiles_created', { date: new Date(selectedProfile.createdAt).toLocaleDateString() })}</Text>\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>{t('profiles_formulaeCount', { count: selectedProfile.formulae.length })}</Text>\n <Box paddingLeft={2} flexDirection=\"column\">\n {selectedProfile.formulae.slice(0, 30).map((f) => (\n <Text key={f} color=\"#9CA3AF\">{f}</Text>\n ))}\n {selectedProfile.formulae.length > 30 && (\n <Text color=\"#6B7280\" italic>{t('common_andMore', { count: selectedProfile.formulae.length - 30 })}</Text>\n )}\n </Box>\n <Text bold>{t('profiles_casksCount', { count: selectedProfile.casks.length })}</Text>\n <Box paddingLeft={2} flexDirection=\"column\">\n {selectedProfile.casks.map((c) => (\n <Text key={c} color=\"#9CA3AF\">{c}</Text>\n ))}\n </Box>\n </Box>\n <Box marginTop={1}>\n <Text color=\"#6B7280\">esc:{t('hint_back')} e:{t('hint_edit')} i:{t('hint_importProfile')}</Text>\n </Box>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u{1F4C1}'} title={t('profiles_title', { count: profileNames.length })} gradient={GRADIENTS.gold} />\n\n {confirmDelete && profileNames[cursor] && (\n <Box marginY={1}>\n <ConfirmDialog\n message={t('profiles_confirmDelete', { name: profileNames[cursor] })}\n onConfirm={() => { void deleteProfile(profileNames[cursor]); setConfirmDelete(false); }}\n onCancel={() => setConfirmDelete(false)}\n />\n </Box>\n )}\n\n {profileNames.length === 0 && !confirmDelete && (\n <Box marginTop={1} borderStyle=\"round\" borderColor=\"#6B7280\" paddingX={2} paddingY={0}>\n <Box flexDirection=\"column\">\n <Text color=\"#6B7280\" italic>{t('profiles_noProfiles')}</Text>\n <Text color=\"#9CA3AF\">{t('profiles_press')} <Text color=\"#FFD700\" bold>n</Text> {t('profiles_exportHint')}</Text>\n </Box>\n </Box>\n )}\n\n {profileNames.length > 0 && !confirmDelete && (\n <Box flexDirection=\"column\" marginTop={1}>\n {profileNames.map((name, i) => {\n const isCurrent = i === cursor;\n return (\n <Box key={name} gap={1}>\n <Text color={isCurrent ? '#22C55E' : '#9CA3AF'}>{isCurrent ? '\\u25B6' : ' '}</Text>\n <Text bold={isCurrent} inverse={isCurrent}>{name}</Text>\n </Box>\n );\n })}\n <Box marginTop={1}>\n <Text color=\"#F9FAFB\" bold>{cursor + 1}/{profileNames.length}</Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import { create } from 'zustand';\nimport type { Profile } from '../lib/profiles/types.js';\nimport * as manager from '../lib/profiles/profile-manager.js';\n\ninterface ProfileState {\n profileNames: string[];\n selectedProfile: Profile | null;\n loading: boolean;\n loadError: string | null;\n\n fetchProfiles: () => Promise<void>;\n loadProfile: (name: string) => Promise<void>;\n exportCurrent: (name: string, description: string) => Promise<void>;\n deleteProfile: (name: string) => Promise<void>;\n updateProfile: (oldName: string, newName: string, newDescription: string) => Promise<void>;\n}\n\nexport const useProfileStore = create<ProfileState>((set) => ({\n profileNames: [],\n selectedProfile: null,\n loading: false,\n loadError: null,\n\n fetchProfiles: async () => {\n set({ loading: true });\n const names = await manager.listProfiles();\n set({ profileNames: names, loading: false });\n },\n\n loadProfile: async (name) => {\n set({ loadError: null });\n try {\n const profile = await manager.loadProfile(name);\n set({ selectedProfile: profile });\n } catch (err) {\n set({ loadError: err instanceof Error ? err.message : String(err) });\n }\n },\n\n exportCurrent: async (name, description) => {\n set({ loading: true, loadError: null });\n try {\n await manager.exportCurrentSetup(name, description);\n const names = await manager.listProfiles();\n set({ profileNames: names, loading: false });\n } catch (err) {\n set({ loading: false, loadError: err instanceof Error ? err.message : String(err) });\n throw err;\n }\n },\n\n deleteProfile: async (name) => {\n await manager.deleteProfile(name);\n const names = await manager.listProfiles();\n set({ profileNames: names, selectedProfile: null });\n },\n\n updateProfile: async (oldName, newName, newDescription) => {\n set({ loadError: null });\n try {\n await manager.updateProfile(oldName, newName, newDescription);\n const names = await manager.listProfiles();\n const updated = await manager.loadProfile(newName);\n set({ profileNames: names, selectedProfile: updated });\n } catch (err) {\n set({ loadError: err instanceof Error ? err.message : String(err) });\n }\n },\n}));\n","import { readFile, writeFile, readdir, rm } from 'node:fs/promises';\nimport { join, basename } from 'node:path';\nimport { PROFILES_DIR, ensureDataDirs } from '../data-dir.js';\nimport { execBrew, streamBrew } from '../brew-cli.js';\nimport { getInstalled, getLeaves } from '../brew-api.js';\nimport { t } from '../../i18n/index.js';\nimport { requirePro } from '../license/pro-guard.js';\nimport { getWatermark } from '../license/watermark.js';\nimport type { Profile, ProfileFile } from './types.js';\n\n/**\n * Validate a profile name to prevent path traversal.\n * Only allows alphanumeric characters, hyphens, underscores, and spaces.\n * Throws if the name contains path separators or traversal sequences.\n */\nconst MAX_PROFILE_NAME_LENGTH = 100;\n\nfunction validateProfileName(name: string): void {\n if (!name || name.trim().length === 0) {\n throw new Error('Profile name cannot be empty');\n }\n if (name.length > MAX_PROFILE_NAME_LENGTH) {\n throw new Error(`Profile name is too long (max ${MAX_PROFILE_NAME_LENGTH} characters)`);\n }\n if (!/^[\\w\\s-]+$/.test(name)) {\n throw new Error(`Invalid profile name: \"${name}\". Only letters, numbers, spaces, hyphens, and underscores are allowed.`);\n }\n}\n\nfunction profilePath(name: string): string {\n validateProfileName(name);\n // Use basename as an additional defense-in-depth guard: strips any directory\n // component that might survive the regex check on edge-case OS behavior.\n return join(PROFILES_DIR, `${basename(name)}.json`);\n}\n\nexport async function listProfiles(): Promise<string[]> {\n requirePro();\n await ensureDataDirs();\n try {\n const files = await readdir(PROFILES_DIR);\n return files.filter((f) => f.endsWith('.json')).map((f) => f.replace('.json', ''));\n } catch {\n return [];\n }\n}\n\nexport async function loadProfile(name: string): Promise<Profile> {\n requirePro();\n const raw = await readFile(profilePath(name), 'utf-8');\n let file: ProfileFile;\n try {\n file = JSON.parse(raw) as ProfileFile;\n } catch (err) {\n throw new Error(`Profile \"${name}\" is corrupted: ${err instanceof Error ? err.message : String(err)}`);\n }\n if (!file.profile) {\n throw new Error(`Profile \"${name}\" is missing required data`);\n }\n return file.profile;\n}\n\nexport async function saveProfile(profile: Profile): Promise<void> {\n requirePro();\n await ensureDataDirs();\n const file: ProfileFile = { version: 1, profile };\n await writeFile(profilePath(profile.name), JSON.stringify(file, null, 2), 'utf-8');\n}\n\nexport async function deleteProfile(name: string): Promise<void> {\n requirePro();\n try {\n await rm(profilePath(name));\n } catch { /* may not exist */ }\n}\n\nexport async function exportCurrentSetup(name: string, description: string): Promise<Profile> {\n requirePro();\n\n const [installed, leaves, tapsRaw] = await Promise.all([\n getInstalled(),\n getLeaves(),\n execBrew(['tap']),\n ]);\n\n const taps = tapsRaw.split('\\n').map((l) => l.trim()).filter(Boolean);\n const casks = installed.casks\n .filter((c) => c.installed)\n .map((c) => c.token);\n\n const now = new Date().toISOString();\n const profile: Profile = {\n name,\n description,\n createdAt: now,\n updatedAt: now,\n formulae: leaves,\n casks,\n taps,\n exportedBy: getWatermark(), // Layer 16: Watermark — who exported this profile\n };\n\n await saveProfile(profile);\n return profile;\n}\n\nexport async function updateProfile(oldName: string, newName: string, newDescription: string): Promise<void> {\n requirePro();\n const profile = await loadProfile(oldName);\n if (oldName !== newName) {\n await deleteProfile(oldName);\n }\n const updated: Profile = {\n ...profile,\n name: newName,\n description: newDescription,\n updatedAt: new Date().toISOString(),\n };\n await saveProfile(updated);\n}\n\nexport async function* importProfile(profile: Profile): AsyncGenerator<string> {\n requirePro();\n\n const installed = await getInstalled();\n const installedFormulae = new Set(installed.formulae.map((f) => f.name));\n const installedCasks = new Set(installed.casks.filter((c) => c.installed).map((c) => c.token));\n\n // Add missing taps\n for (const tap of profile.taps) {\n yield t('profileMgr_tapping', { name: tap });\n try {\n await execBrew(['tap', tap]);\n } catch { /* may already be tapped */ }\n }\n\n // Install missing formulae\n const missingFormulae = profile.formulae.filter((f) => !installedFormulae.has(f));\n for (const name of missingFormulae) {\n yield t('profileMgr_installing', { name });\n for await (const line of streamBrew(['install', name])) {\n yield line;\n }\n }\n\n // Install missing casks\n const missingCasks = profile.casks.filter((c) => !installedCasks.has(c));\n for (const name of missingCasks) {\n yield t('profileMgr_installingCask', { name });\n for await (const line of streamBrew(['install', '--cask', name])) {\n yield line;\n }\n }\n\n const totalInstalled = missingFormulae.length + missingCasks.length;\n yield t('profileMgr_importDone', { count: totalInstalled });\n}\n","import { useLicenseStore } from '../../stores/license-store.js';\n\n/**\n * Get a watermark string containing the license holder's email.\n * Used subtly in Pro feature output for traceability.\n */\nexport function getWatermark(): string {\n const license = useLicenseStore.getState().license;\n if (!license?.customerEmail) return '';\n // Create a subtle, non-obvious watermark\n // Embed as zero-width characters or as a comment in exported data\n return `Licensed to: ${license.customerEmail}`;\n}\n\n/**\n * Embed invisible watermark in a string using zero-width characters.\n * Each bit of the email is encoded as either a zero-width space (0) or\n * zero-width non-joiner (1).\n */\nexport function embedInvisibleWatermark(text: string, email: string): string {\n const encoded = [...email].map(c => {\n const cp = c.codePointAt(0) ?? 0;\n // Use 21 bits to cover the full Unicode range (max code point U+10FFFF)\n const bits = cp.toString(2).padStart(21, '0');\n return [...bits].map(b => b === '0' ? '\\u200B' : '\\u200C').join('');\n }).join('\\u200D'); // zero-width joiner as separator\n\n // Insert at the end of the first line\n const lines = text.split('\\n');\n if (lines.length > 0) {\n lines[0] = lines[0] + encoded;\n }\n return lines.join('\\n');\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { useCleanupStore } from '../stores/cleanup-store.js';\nimport { useBrewStream } from '../hooks/use-brew-stream.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { StatCard } from '../components/common/stat-card.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\n\nexport function SmartCleanupView() {\n const { summary, selected, loading, error, analyze, toggleSelect, selectAll } = useCleanupStore();\n const [cursor, setCursor] = useState(0);\n const [confirmClean, setConfirmClean] = useState(false);\n const [confirmForce, setConfirmForce] = useState(false);\n const [failedNames, setFailedNames] = useState<string[]>([]);\n const stream = useBrewStream();\n const hasRefreshed = useRef(false);\n\n useEffect(() => { analyze(); }, []);\n\n useEffect(() => {\n if (!stream.isRunning && !stream.error && stream.lines.length > 0 && !hasRefreshed.current) {\n hasRefreshed.current = true;\n void analyze();\n }\n }, [stream.isRunning, stream.error]);\n\n const candidates = summary?.candidates ?? [];\n\n const isDependencyError = stream.error != null &&\n stream.lines.some((l) => l.includes('Refusing to uninstall') || l.includes('required by'));\n\n useInput((input, key) => {\n if (stream.isRunning) {\n if (key.escape) stream.cancel();\n return;\n }\n if (confirmClean || confirmForce) return;\n\n // After a dependency error, offer F to force\n if (input === 'F' && isDependencyError && failedNames.length > 0) {\n setConfirmForce(true);\n return;\n }\n\n if (input === 'r') { stream.clear(); setFailedNames([]); void analyze(); return; }\n if (key.return && candidates[cursor]) {\n toggleSelect(candidates[cursor].name);\n return;\n }\n if (input === 'a') { selectAll(); return; }\n if (input === 'c' && selected.size > 0) { setConfirmClean(true); return; }\n\n if (input === 'j' || key.downArrow) setCursor((c) => Math.min(c + 1, Math.max(0, candidates.length - 1)));\n else if (input === 'k' || key.upArrow) setCursor((c) => Math.max(c - 1, 0));\n });\n\n if (loading) return <Loading message={t('loading_cleanup')} />;\n if (error) return <ErrorMessage message={error} />;\n\n if (stream.isRunning || stream.lines.length > 0) {\n return (\n <Box flexDirection=\"column\">\n <ProgressLog lines={stream.lines} isRunning={stream.isRunning} title={t('cleanup_cleaning')} />\n {stream.isRunning && (\n <Text color=\"#6B7280\">esc:{t('hint_cancel')}</Text>\n )}\n\n {!stream.isRunning && !stream.error && (\n <Box borderStyle=\"round\" borderColor=\"#22C55E\" paddingX={2} paddingY={0}>\n <Text color=\"#22C55E\" bold>{'\\u2714'} {t('cleanup_complete')}</Text>\n </Box>\n )}\n\n {!stream.isRunning && stream.error && (\n <Box flexDirection=\"column\" gap={1}>\n <Box borderStyle=\"round\" borderColor=\"#EF4444\" paddingX={2} paddingY={0}>\n <Text color=\"#EF4444\" bold>{'\\u2718'} {t('cleanup_depError')}</Text>\n </Box>\n {isDependencyError && failedNames.length > 0 && (\n <Text color=\"#F59E0B\">\n F:{t('hint_force')} r:{t('hint_refresh')}\n </Text>\n )}\n </Box>\n )}\n\n {confirmForce && (\n <Box marginY={1}>\n <ConfirmDialog\n message={t('cleanup_confirmForce', { count: failedNames.length })}\n onConfirm={() => {\n setConfirmForce(false);\n hasRefreshed.current = false;\n stream.clear();\n void stream.run(['uninstall', '--ignore-dependencies', ...failedNames]);\n }}\n onCancel={() => setConfirmForce(false)}\n />\n </Box>\n )}\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u{1F9F9}'} title={t('cleanup_title')} gradient={GRADIENTS.emerald} />\n\n {summary && (\n <Box gap={1} marginY={1}>\n <StatCard label={t('cleanup_orphans')} value={candidates.length} color={candidates.length > 0 ? '#F59E0B' : '#22C55E'} />\n <StatCard label={t('cleanup_reclaimable')} value={summary.totalReclaimableFormatted} color=\"#38BDF8\" />\n <StatCard label={t('cleanup_selected')} value={selected.size} color={selected.size > 0 ? '#22C55E' : '#6B7280'} />\n </Box>\n )}\n\n {confirmClean && (\n <Box marginY={1}>\n <ConfirmDialog\n message={t('cleanup_confirmUninstall', { count: selected.size })}\n onConfirm={() => {\n setConfirmClean(false);\n hasRefreshed.current = false;\n const names = Array.from(selected);\n setFailedNames(names);\n void stream.run(['uninstall', ...names]);\n }}\n onCancel={() => setConfirmClean(false)}\n />\n </Box>\n )}\n\n {candidates.length === 0 && !confirmClean && (\n <Box borderStyle=\"round\" borderColor=\"#22C55E\" paddingX={2} paddingY={0}>\n <Text color=\"#22C55E\" bold>{'\\u2714'} {t('cleanup_systemClean')}</Text>\n </Box>\n )}\n\n {candidates.length > 0 && !confirmClean && (\n <Box flexDirection=\"column\">\n {candidates.map((c, i) => {\n const isCurrent = i === cursor;\n const isSelected = selected.has(c.name);\n return (\n <Box key={c.name} gap={1}>\n <Text color={isCurrent ? '#22C55E' : '#9CA3AF'}>{isCurrent ? '\\u25B6' : ' '}</Text>\n <Text color={isSelected ? '#22C55E' : '#9CA3AF'}>{isSelected ? '\\u2611' : '\\u2610'}</Text>\n <Text bold={isCurrent} inverse={isCurrent} color={isCurrent ? '#F9FAFB' : '#9CA3AF'}>{c.name}</Text>\n <Text color=\"#F59E0B\">{c.diskUsageFormatted}</Text>\n <Text color=\"#6B7280\">[{c.reason}]</Text>\n </Box>\n );\n })}\n <Box marginTop={1}>\n <Text color=\"#F9FAFB\" bold>\n {cursor + 1}/{candidates.length}\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import { create } from 'zustand';\nimport type { CleanupSummary } from '../lib/cleanup/types.js';\nimport { analyzeCleanup } from '../lib/cleanup/cleanup-analyzer.js';\nimport { useBrewStore } from './brew-store.js';\n\ninterface CleanupState {\n summary: CleanupSummary | null;\n selected: Set<string>;\n loading: boolean;\n error: string | null;\n\n analyze: () => Promise<void>;\n toggleSelect: (name: string) => void;\n selectAll: () => void;\n deselectAll: () => void;\n}\n\nexport const useCleanupStore = create<CleanupState>((set, get) => ({\n summary: null,\n selected: new Set(),\n loading: false,\n error: null,\n\n analyze: async () => {\n set({ loading: true, error: null });\n try {\n const brewState = useBrewStore.getState();\n if (brewState.formulae.length === 0) {\n await brewState.fetchInstalled();\n await brewState.fetchLeaves();\n }\n const { formulae, leaves } = useBrewStore.getState();\n const summary = await analyzeCleanup(formulae, leaves);\n set({ summary, selected: new Set(), loading: false });\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err), loading: false });\n }\n },\n\n toggleSelect: (name) => {\n const selected = new Set(get().selected);\n if (selected.has(name)) selected.delete(name);\n else selected.add(name);\n set({ selected });\n },\n\n selectAll: () => {\n const names = get().summary?.candidates.map((c) => c.name) ?? [];\n set({ selected: new Set(names) });\n },\n\n deselectAll: () => set({ selected: new Set() }),\n}));\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { execBrew } from '../brew-cli.js';\nimport { formatBytes } from '../../utils/format.js';\nimport { requirePro } from '../license/pro-guard.js';\nimport type { Formula } from '../types.js';\nimport type { CleanupCandidate, CleanupSummary } from './types.js';\n\nconst execFileAsync = promisify(execFile);\n\nasync function getDiskUsage(cellarPath: string): Promise<number> {\n try {\n const { stdout } = await execFileAsync('du', ['-sk', cellarPath]);\n const kb = parseInt(stdout.split('\\t')[0] ?? '0', 10);\n return kb * 1024;\n } catch {\n return 0;\n }\n}\n\nasync function getCellarPath(name: string): Promise<string | null> {\n try {\n const raw = await execBrew(['--cellar', name]);\n return raw.trim() || null;\n } catch {\n return null;\n }\n}\n\nexport async function analyzeCleanup(\n formulae: Formula[],\n leaves: string[],\n): Promise<CleanupSummary> {\n requirePro();\n\n const leavesSet = new Set(leaves);\n\n // Build reverse dependency map\n const reverseDeps = new Map<string, number>();\n for (const f of formulae) {\n for (const dep of f.dependencies) {\n reverseDeps.set(dep, (reverseDeps.get(dep) ?? 0) + 1);\n }\n }\n\n // Find orphans: installed as dependency but not a leaf and has 0 reverse deps from installed packages\n const orphans: string[] = [];\n\n for (const f of formulae) {\n const installed = f.installed[0];\n if (!installed) continue;\n\n if (installed.installed_as_dependency && !installed.installed_on_request && !leavesSet.has(f.name)) {\n // Check if any installed package still depends on this\n // Actually, we need to check if any installed package lists THIS package as a dependency\n let isNeeded = false;\n for (const other of formulae) {\n if (other.name === f.name) continue;\n if (other.dependencies.includes(f.name)) {\n isNeeded = true;\n break;\n }\n }\n if (!isNeeded) {\n orphans.push(f.name);\n }\n }\n }\n\n // Get disk usage for orphans (parallel, limited concurrency)\n const candidates: CleanupCandidate[] = [];\n const concurrency = 5;\n\n for (let i = 0; i < orphans.length; i += concurrency) {\n const batch = orphans.slice(i, i + concurrency);\n const results = await Promise.all(\n batch.map(async (name) => {\n const cellarPath = await getCellarPath(name);\n const bytes = cellarPath ? await getDiskUsage(cellarPath) : 0;\n return {\n name,\n reason: 'orphan' as const,\n diskUsageBytes: bytes,\n diskUsageFormatted: formatBytes(bytes),\n installedAsDependency: true,\n dependentsCount: 0,\n };\n }),\n );\n candidates.push(...results);\n }\n\n // Sort by disk usage descending\n candidates.sort((a, b) => b.diskUsageBytes - a.diskUsageBytes);\n\n const totalBytes = candidates.reduce((sum, c) => sum + c.diskUsageBytes, 0);\n\n return {\n totalReclaimableBytes: totalBytes,\n totalReclaimableFormatted: formatBytes(totalBytes),\n candidates,\n analyzedAt: new Date().toISOString(),\n };\n}\n","import React, { useEffect, useState, useMemo } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { useHistoryStore } from '../stores/history-store.js';\nimport { useBrewStream } from '../hooks/use-brew-stream.js';\nimport { useDebounce } from '../hooks/use-debounce.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { StatusBadge } from '../components/common/status-badge.js';\nimport { SearchInput } from '../components/common/search-input.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { formatRelativeTime } from '../utils/format.js';\nimport { t } from '../i18n/index.js';\nimport { useModalStore } from '../stores/modal-store.js';\nimport type { TranslationKey } from '../i18n/en.js';\nimport type { HistoryAction, HistoryEntry } from '../lib/history/types.js';\n\nconst ACTION_ICONS: Record<HistoryAction, { icon: string; color: string }> = {\n install: { icon: '+', color: '#22C55E' },\n uninstall: { icon: '-', color: '#EF4444' },\n upgrade: { icon: '\\u2191', color: '#06B6D4' },\n 'upgrade-all': { icon: '\\u21C8', color: '#06B6D4' },\n};\n\nconst ACTION_LABEL_KEYS: Record<HistoryAction, TranslationKey> = {\n install: 'history_actionInstall',\n uninstall: 'history_actionUninstall',\n upgrade: 'history_actionUpgrade',\n 'upgrade-all': 'history_actionUpgradeAll',\n};\n\nconst FILTERS: (HistoryAction | 'all')[] = ['all', 'install', 'uninstall', 'upgrade', 'upgrade-all'];\n\nexport function HistoryView() {\n const { entries, loading, error, fetchHistory, clearHistory } = useHistoryStore();\n const [cursor, setCursor] = useState(0);\n const [filter, setFilter] = useState<HistoryAction | 'all'>('all');\n const [searchQuery, setSearchQuery] = useState('');\n const [isSearching, setIsSearching] = useState(false);\n const [confirmClear, setConfirmClear] = useState(false);\n const [confirmReplay, setConfirmReplay] = useState<HistoryEntry | null>(null);\n const stream = useBrewStream();\n const debouncedQuery = useDebounce(searchQuery, 200);\n const { openModal, closeModal } = useModalStore();\n\n useEffect(() => { fetchHistory(); }, []);\n\n // Suppress global Escape while search bar is active so Escape clears the\n // search bar rather than navigating away from the history view.\n useEffect(() => {\n if (isSearching) {\n openModal();\n return () => { closeModal(); };\n }\n return undefined;\n }, [isSearching]);\n\n const filtered = useMemo(() => {\n let result = entries;\n if (filter !== 'all') {\n result = result.filter((e) => e.action === filter);\n }\n if (debouncedQuery) {\n const q = debouncedQuery.toLowerCase();\n result = result.filter((e) => e.packageName?.toLowerCase().includes(q));\n }\n return result;\n }, [entries, filter, debouncedQuery]);\n\n useInput((input, key) => {\n if (confirmClear || confirmReplay || stream.isRunning) return;\n\n if (isSearching) {\n if (key.escape) {\n setIsSearching(false);\n setSearchQuery('');\n }\n return;\n }\n\n if (input === '/') { setIsSearching(true); return; }\n if (input === 'f') {\n const idx = FILTERS.indexOf(filter);\n setFilter(FILTERS[(idx + 1) % FILTERS.length]!);\n setCursor(0);\n return;\n }\n if (input === 'c' && entries.length > 0) { setConfirmClear(true); return; }\n if (key.return && filtered[cursor]) {\n setConfirmReplay(filtered[cursor]);\n return;\n }\n\n if (input === 'j' || key.downArrow) setCursor((c) => Math.min(c + 1, Math.max(0, filtered.length - 1)));\n else if (input === 'k' || key.upArrow) setCursor((c) => Math.max(c - 1, 0));\n });\n\n if (loading) return <Loading message={t('loading_history')} />;\n if (error) return <ErrorMessage message={error} />;\n\n const MAX_VISIBLE_ROWS = 20;\n const start = Math.max(0, cursor - Math.floor(MAX_VISIBLE_ROWS / 2));\n const visible = filtered.slice(start, start + MAX_VISIBLE_ROWS);\n\n return (\n <Box flexDirection=\"column\">\n <Box gap={2} marginBottom={1}>\n <SectionHeader emoji={'\\u{1F4DC}'} title={t('history_title', { count: filtered.length })} gradient={GRADIENTS.gold} />\n <Text color={filter === 'all' ? '#F9FAFB' : '#FFD700'}>\n {t('history_filterLabel', { filter })}\n </Text>\n </Box>\n\n {isSearching && (\n <Box marginBottom={1}>\n <SearchInput defaultValue={searchQuery} onChange={setSearchQuery} placeholder={t('history_searchPlaceholder')} isActive />\n </Box>\n )}\n\n {confirmClear && (\n <ConfirmDialog\n message={t('history_confirmClear', { count: entries.length })}\n onConfirm={() => { void clearHistory(); setConfirmClear(false); }}\n onCancel={() => setConfirmClear(false)}\n />\n )}\n\n {confirmReplay && (\n <ConfirmDialog\n message={\n confirmReplay.action === 'upgrade-all'\n ? t('history_replayAll')\n : t('history_confirmReplay', { action: t(ACTION_LABEL_KEYS[confirmReplay.action]), name: confirmReplay.packageName ?? '' })\n }\n onConfirm={async () => {\n const entry = confirmReplay;\n setConfirmReplay(null);\n let args: string[];\n switch (entry.action) {\n case 'install': args = ['install', entry.packageName!]; break;\n case 'uninstall': args = ['uninstall', entry.packageName!]; break;\n case 'upgrade': args = ['upgrade', entry.packageName!]; break;\n case 'upgrade-all': args = ['upgrade']; break;\n }\n await stream.run(args);\n void fetchHistory();\n }}\n onCancel={() => setConfirmReplay(null)}\n />\n )}\n\n {(stream.isRunning || stream.lines.length > 0) && (\n <Box marginY={1}>\n <ProgressLog lines={stream.lines} isRunning={stream.isRunning} title={t('hint_replay')} />\n </Box>\n )}\n\n {filtered.length === 0 && !confirmClear && (\n <Text color=\"#6B7280\" italic>\n {filter !== 'all' ? t('history_noEntriesFor', { filter }) : t('history_noEntries')}\n </Text>\n )}\n\n {filtered.length > 0 && !confirmClear && (\n <Box flexDirection=\"column\">\n {start > 0 && (\n <Text color=\"#6B7280\" dimColor> {t('scroll_moreAbove', { count: start })}</Text>\n )}\n {visible.map((entry, i) => {\n const idx = start + i;\n const isCurrent = idx === cursor;\n const { icon, color } = ACTION_ICONS[entry.action];\n const ts = new Date(entry.timestamp).getTime() / 1000;\n\n return (\n <Box key={entry.id} gap={1}>\n <Text color={isCurrent ? '#22C55E' : '#9CA3AF'}>{isCurrent ? '\\u25B6' : ' '}</Text>\n <Text color={color} bold>{icon}</Text>\n <Text bold={isCurrent} inverse={isCurrent} color={isCurrent ? '#F9FAFB' : '#9CA3AF'}>\n {t(ACTION_LABEL_KEYS[entry.action]).padEnd(12)}\n </Text>\n <Text color=\"#F9FAFB\">{entry.packageName ?? t('history_all')}</Text>\n {entry.success\n ? <StatusBadge label={t('badge_ok')} variant=\"success\" />\n : <StatusBadge label={t('badge_fail')} variant=\"error\" />}\n <Text color=\"#9CA3AF\">{formatRelativeTime(ts)}</Text>\n </Box>\n );\n })}\n {start + MAX_VISIBLE_ROWS < filtered.length && (\n <Text color=\"#6B7280\" dimColor> {t('scroll_moreBelow', { count: filtered.length - start - MAX_VISIBLE_ROWS })}</Text>\n )}\n\n <Box marginTop={1}>\n <Text color=\"#F9FAFB\" bold>\n {cursor + 1}/{filtered.length}\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import { create } from 'zustand';\nimport type { HistoryEntry, HistoryAction } from '../lib/history/types.js';\nimport * as logger from '../lib/history/history-logger.js';\n\ninterface HistoryState {\n entries: HistoryEntry[];\n loading: boolean;\n error: string | null;\n\n fetchHistory: () => Promise<void>;\n logAction: (action: HistoryAction, packageName: string | null, success: boolean, error?: string | null) => Promise<void>;\n clearHistory: () => Promise<void>;\n}\n\nexport const useHistoryStore = create<HistoryState>((set) => ({\n entries: [],\n loading: false,\n error: null,\n\n fetchHistory: async () => {\n set({ loading: true, error: null });\n try {\n const entries = await logger.loadHistory();\n set({ entries, loading: false });\n } catch (err) {\n set({ loading: false, error: err instanceof Error ? err.message : String(err) });\n }\n },\n\n logAction: async (action, packageName, success, error = null) => {\n await logger.appendEntry(action, packageName, success, error);\n const entries = await logger.loadHistory();\n set({ entries });\n },\n\n clearHistory: async () => {\n await logger.clearHistory();\n set({ entries: [] });\n },\n}));\n","import React, { useEffect, useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { useSecurityStore } from '../stores/security-store.js';\nimport { useBrewStream } from '../hooks/use-brew-stream.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { StatCard } from '../components/common/stat-card.js';\nimport { StatusBadge } from '../components/common/status-badge.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t, tp } from '../i18n/index.js';\nimport type { Severity } from '../lib/security/types.js';\n\nconst SEVERITY_COLORS: Record<Severity, string> = {\n CRITICAL: '#EF4444',\n HIGH: '#EF4444',\n MEDIUM: '#F59E0B',\n LOW: '#6B7280',\n UNKNOWN: '#6B7280',\n};\n\nconst SEVERITY_BADGE: Record<Severity, 'error' | 'warning' | 'muted'> = {\n CRITICAL: 'error',\n HIGH: 'error',\n MEDIUM: 'warning',\n LOW: 'muted',\n UNKNOWN: 'muted',\n};\n\nexport function SecurityAuditView() {\n const { summary, loading, error, scan } = useSecurityStore();\n const [cursor, setCursor] = useState(0);\n const [expandedPkg, setExpandedPkg] = useState<string | null>(null);\n const [confirmUpgrade, setConfirmUpgrade] = useState<string | null>(null);\n const stream = useBrewStream();\n\n useEffect(() => { scan(); }, []);\n\n const results = summary?.results ?? [];\n\n useInput((input, key) => {\n if (confirmUpgrade || stream.isRunning) return;\n\n if (input === 'r') { void scan(); return; }\n if (input === 'u' && results[cursor]) {\n setConfirmUpgrade(results[cursor].packageName);\n return;\n }\n\n if (input === 'j' || key.downArrow) setCursor((c) => Math.min(c + 1, Math.max(0, results.length - 1)));\n else if (input === 'k' || key.upArrow) setCursor((c) => Math.max(c - 1, 0));\n else if (key.return && results[cursor]) {\n setExpandedPkg(expandedPkg === results[cursor].packageName ? null : results[cursor].packageName);\n }\n });\n\n if (loading) return <Loading message={t('loading_security')} />;\n if (error) return <ErrorMessage message={error} />;\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u{1F6E1}\\uFE0F'} title={t('security_title')} gradient={GRADIENTS.ocean} />\n\n {summary && (\n <Box gap={1} marginY={1}>\n <StatCard label={t('security_scanned')} value={summary.totalPackages} color=\"#06B6D4\" />\n <StatCard\n label={t('security_vulnerable')}\n value={summary.vulnerablePackages}\n color={summary.vulnerablePackages > 0 ? '#EF4444' : '#22C55E'}\n />\n {summary.criticalCount > 0 && <StatCard label={t('security_critical')} value={summary.criticalCount} color=\"#EF4444\" />}\n {summary.highCount > 0 && <StatCard label={t('security_high')} value={summary.highCount} color=\"#EF4444\" />}\n {summary.mediumCount > 0 && <StatCard label={t('security_medium')} value={summary.mediumCount} color=\"#F59E0B\" />}\n </Box>\n )}\n\n {results.length === 0 && summary && (\n <Box marginTop={1}>\n <Box borderStyle=\"round\" borderColor=\"#22C55E\" paddingX={2} paddingY={0}>\n <Text color=\"#22C55E\" bold>{'\\u2714'} {t('security_noVulns')}</Text>\n </Box>\n </Box>\n )}\n\n {confirmUpgrade && (\n <Box marginY={1}>\n <ConfirmDialog\n message={t('security_confirmUpgrade', { name: confirmUpgrade })}\n onConfirm={async () => {\n const name = confirmUpgrade;\n setConfirmUpgrade(null);\n await stream.run(['upgrade', name]);\n void scan();\n }}\n onCancel={() => setConfirmUpgrade(null)}\n />\n </Box>\n )}\n\n {(stream.isRunning || stream.lines.length > 0) && (\n <Box marginY={1}>\n <ProgressLog lines={stream.lines} isRunning={stream.isRunning} title={t('hint_upgrade')} />\n </Box>\n )}\n\n {results.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n {results.map((pkg, i) => {\n const isCurrent = i === cursor;\n const isExpanded = expandedPkg === pkg.packageName;\n\n return (\n <Box key={pkg.packageName} flexDirection=\"column\">\n <Box gap={1}>\n <Text color={isCurrent ? '#22C55E' : '#9CA3AF'}>{isCurrent ? '\\u25B6' : ' '}</Text>\n <StatusBadge label={pkg.maxSeverity} variant={SEVERITY_BADGE[pkg.maxSeverity]} />\n <Text bold={isCurrent} inverse={isCurrent} color={isCurrent ? '#F9FAFB' : '#9CA3AF'}>\n {pkg.packageName}\n </Text>\n <Text color=\"#9CA3AF\">{pkg.installedVersion}</Text>\n <Text color=\"#9CA3AF\">{tp('plural_vulns', pkg.vulnerabilities.length)}</Text>\n <Text color=\"#9CA3AF\">{isExpanded ? '\\u25BC' : '\\u25B6'}</Text>\n </Box>\n\n {isExpanded && (\n <Box flexDirection=\"column\" paddingLeft={4} marginBottom={1}>\n {pkg.vulnerabilities.map((vuln) => (\n <Box key={vuln.id} flexDirection=\"column\" marginBottom={1}>\n <Box gap={1}>\n <Text color={SEVERITY_COLORS[vuln.severity]} bold>{vuln.id}</Text>\n <Text color=\"#9CA3AF\">[{vuln.severity}]</Text>\n </Box>\n <Text color=\"#9CA3AF\" wrap=\"wrap\">{vuln.summary}</Text>\n {vuln.fixedVersion && (\n <Text color=\"#22C55E\">{t('security_fixedIn', { version: vuln.fixedVersion })}</Text>\n )}\n </Box>\n ))}\n </Box>\n )}\n </Box>\n );\n })}\n\n <Box marginTop={1}>\n <Text color=\"#F9FAFB\" bold>\n {cursor + 1}/{results.length}\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import { create } from 'zustand';\nimport type { SecurityAuditSummary } from '../lib/security/types.js';\nimport { runSecurityAudit } from '../lib/security/audit-runner.js';\nimport { useBrewStore } from './brew-store.js';\n\ninterface SecurityState {\n summary: SecurityAuditSummary | null;\n loading: boolean;\n error: string | null;\n\n scan: () => Promise<void>;\n}\n\nexport const useSecurityStore = create<SecurityState>((set) => ({\n summary: null,\n loading: false,\n error: null,\n\n scan: async () => {\n set({ loading: true, error: null });\n try {\n const brewState = useBrewStore.getState();\n if (brewState.formulae.length === 0) {\n await brewState.fetchInstalled();\n }\n const { formulae, casks } = useBrewStore.getState();\n const summary = await runSecurityAudit(formulae, casks);\n set({ summary, loading: false });\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err), loading: false });\n }\n },\n}));\n","import type { Vulnerability, Severity } from './types.js';\n\nconst OSV_BATCH_URL = 'https://api.osv.dev/v1/querybatch';\n\ninterface OsvQuery {\n package: { name: string; ecosystem: string };\n version: string;\n}\n\ninterface OsvVulnerability {\n id: string;\n summary?: string;\n severity?: Array<{ type: string; score: string }>;\n affected?: Array<{\n ranges?: Array<{\n events?: Array<{ fixed?: string }>;\n }>;\n }>;\n references?: Array<{ url: string }>;\n database_specific?: { severity?: string };\n}\n\ninterface OsvBatchResponse {\n results: Array<{ vulns?: OsvVulnerability[] }>;\n}\n\nfunction mapSeverity(vuln: OsvVulnerability): Severity {\n // Check database_specific severity first\n const dbSev = vuln.database_specific?.severity?.toUpperCase();\n if (dbSev && ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW'].includes(dbSev)) {\n return dbSev as Severity;\n }\n\n // Check CVSS score\n const cvss = vuln.severity?.find((s) => s.type === 'CVSS_V3');\n if (cvss) {\n const score = parseFloat(cvss.score);\n if (score >= 9.0) return 'CRITICAL';\n if (score >= 7.0) return 'HIGH';\n if (score >= 4.0) return 'MEDIUM';\n return 'LOW';\n }\n\n return 'UNKNOWN';\n}\n\nfunction getFixedVersion(vuln: OsvVulnerability): string | null {\n for (const affected of vuln.affected ?? []) {\n for (const range of affected.ranges ?? []) {\n for (const event of range.events ?? []) {\n if (event.fixed) return event.fixed;\n }\n }\n }\n return null;\n}\n\nconst BATCH_SIZE = 100;\n\nasync function queryBatch(\n packages: Array<{ name: string; version: string }>,\n queries: OsvQuery[],\n): Promise<Map<string, Vulnerability[]>> {\n const res = await fetch(OSV_BATCH_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ queries }),\n });\n\n if (!res.ok) {\n // On 400, try individual queries to isolate bad packages\n if (res.status === 400 && queries.length > 1) {\n return queryOneByOne(packages);\n }\n throw new Error(`OSV API error: ${res.status} ${res.statusText}`);\n }\n\n const data = (await res.json()) as OsvBatchResponse;\n const result = new Map<string, Vulnerability[]>();\n\n for (let i = 0; i < packages.length; i++) {\n const vulns = data.results[i]?.vulns;\n if (!vulns || vulns.length === 0) continue;\n\n result.set(\n packages[i]!.name,\n vulns.map((v) => ({\n id: v.id,\n summary: v.summary ?? 'No description available',\n severity: mapSeverity(v),\n fixedVersion: getFixedVersion(v),\n references: v.references?.map((r) => r.url) ?? [],\n })),\n );\n }\n\n return result;\n}\n\nasync function queryOneByOne(\n packages: Array<{ name: string; version: string }>,\n): Promise<Map<string, Vulnerability[]>> {\n const result = new Map<string, Vulnerability[]>();\n\n for (const pkg of packages) {\n try {\n const partial = await queryBatch(\n [pkg],\n [{ package: { name: pkg.name, ecosystem: 'Homebrew' }, version: pkg.version }],\n );\n for (const [k, v] of partial) result.set(k, v);\n } catch {\n // Skip packages that the API rejects\n }\n }\n\n return result;\n}\n\nexport async function queryVulnerabilities(\n packages: Array<{ name: string; version: string }>,\n): Promise<Map<string, Vulnerability[]>> {\n const result = new Map<string, Vulnerability[]>();\n\n // Split into batches to stay within OSV API limits\n for (let i = 0; i < packages.length; i += BATCH_SIZE) {\n const batch = packages.slice(i, i + BATCH_SIZE);\n const queries: OsvQuery[] = batch.map((p) => ({\n package: { name: p.name, ecosystem: 'Homebrew' },\n version: p.version,\n }));\n\n const partial = await queryBatch(batch, queries);\n for (const [k, v] of partial) result.set(k, v);\n }\n\n return result;\n}\n","import { queryVulnerabilities } from './osv-api.js';\nimport { requirePro } from '../license/pro-guard.js';\nimport type { Formula, Cask } from '../types.js';\nimport type { PackageAuditResult, SecurityAuditSummary, Severity } from './types.js';\n\nconst SEVERITY_ORDER: Record<Severity, number> = {\n CRITICAL: 4,\n HIGH: 3,\n MEDIUM: 2,\n LOW: 1,\n UNKNOWN: 0,\n};\n\nexport async function runSecurityAudit(\n formulae: Formula[],\n casks: Cask[],\n): Promise<SecurityAuditSummary> {\n requirePro();\n\n const packages: Array<{ name: string; version: string }> = [];\n\n for (const f of formulae) {\n const version = f.installed[0]?.version ?? f.versions.stable;\n packages.push({ name: f.name, version });\n }\n\n for (const c of casks) {\n if (c.installed) {\n packages.push({ name: c.token, version: c.installed });\n }\n }\n\n // Batch query (OSV supports up to 1000)\n const vulnMap = await queryVulnerabilities(packages);\n\n const results: PackageAuditResult[] = [];\n let criticalCount = 0;\n let highCount = 0;\n let mediumCount = 0;\n let lowCount = 0;\n\n for (const [name, vulns] of vulnMap) {\n const pkg = packages.find((p) => p.name === name);\n if (!pkg) continue;\n\n const maxSeverity = vulns.reduce<Severity>((max, v) =>\n SEVERITY_ORDER[v.severity] > SEVERITY_ORDER[max] ? v.severity : max,\n 'UNKNOWN',\n );\n\n results.push({\n packageName: name,\n installedVersion: pkg.version,\n vulnerabilities: vulns,\n maxSeverity,\n });\n\n for (const v of vulns) {\n if (v.severity === 'CRITICAL') criticalCount++;\n else if (v.severity === 'HIGH') highCount++;\n else if (v.severity === 'MEDIUM') mediumCount++;\n else if (v.severity === 'LOW') lowCount++;\n }\n }\n\n // Sort by severity (most severe first)\n results.sort((a, b) => SEVERITY_ORDER[b.maxSeverity] - SEVERITY_ORDER[a.maxSeverity]);\n\n return {\n scannedAt: new Date().toISOString(),\n totalPackages: packages.length,\n vulnerablePackages: results.length,\n criticalCount,\n highCount,\n mediumCount,\n lowCount,\n results,\n };\n}\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\n\nexport function AccountView() {\n const { status, license, deactivate, degradation } = useLicenseStore();\n const [confirmDeactivate, setConfirmDeactivate] = useState(false);\n const [deactivating, setDeactivating] = useState(false);\n\n useInput((input) => {\n if (confirmDeactivate || deactivating) return;\n\n if (input === 'd' && status === 'pro') {\n setConfirmDeactivate(true);\n }\n });\n\n const maskKey = (key: string) => {\n if (key.length <= 8) return key;\n return key.slice(0, 4) + '-****-****-' + key.slice(-4);\n };\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u{1F464}'} title={t('account_title')} gradient={GRADIENTS.gold} />\n\n {confirmDeactivate && (\n <Box marginY={1}>\n <ConfirmDialog\n message={t('account_confirmDeactivate')}\n onConfirm={async () => {\n setConfirmDeactivate(false);\n setDeactivating(true);\n await deactivate();\n setDeactivating(false);\n }}\n onCancel={() => setConfirmDeactivate(false)}\n />\n </Box>\n )}\n\n <Box flexDirection=\"column\" marginTop={1} paddingLeft={2}>\n <Box gap={1}>\n <Text color=\"#9CA3AF\">{t('account_statusLabel')}</Text>\n {status === 'pro' && <Text color=\"#22C55E\" bold>{t('account_pro')}</Text>}\n {status === 'free' && <Text color=\"#9CA3AF\">{t('account_free')}</Text>}\n {status === 'expired' && <Text color=\"#EF4444\">{t('account_expired')}</Text>}\n {status === 'validating' && <Text color=\"#38BDF8\">{t('account_validating')}</Text>}\n </Box>\n\n {(degradation === 'warning' || degradation === 'limited') && license && (\n <Box marginTop={1} borderStyle=\"round\" borderColor=\"#F59E0B\" paddingX={2} paddingY={0}>\n <Text color=\"#F59E0B\">\n {t('license_offlineWarning', {\n days: Math.floor((Date.now() - new Date(license.lastValidatedAt).getTime()) / (24 * 60 * 60 * 1000)),\n })}\n </Text>\n </Box>\n )}\n\n {license && (\n <>\n <Box gap={1}>\n <Text color=\"#9CA3AF\">{t('account_emailLabel')}</Text>\n <Text>{license.customerEmail}</Text>\n </Box>\n <Box gap={1}>\n <Text color=\"#9CA3AF\">{t('account_nameLabel')}</Text>\n <Text>{license.customerName}</Text>\n </Box>\n <Box gap={1}>\n <Text color=\"#9CA3AF\">{t('account_planLabel')}</Text>\n <Text color=\"#22C55E\" bold>Pro</Text>\n </Box>\n <Box gap={1}>\n <Text color=\"#9CA3AF\">{t('account_keyLabel')}</Text>\n <Text>{maskKey(license.key)}</Text>\n </Box>\n {license.expiresAt && (\n <Box gap={1}>\n <Text color=\"#9CA3AF\">{t('account_expiresLabel')}</Text>\n <Text>{new Date(license.expiresAt).toLocaleDateString()}</Text>\n </Box>\n )}\n <Box gap={1}>\n <Text color=\"#9CA3AF\">{t('account_activatedLabel')}</Text>\n <Text>{new Date(license.activatedAt).toLocaleDateString()}</Text>\n </Box>\n </>\n )}\n\n {status === 'free' && (\n <Box flexDirection=\"column\" marginTop={2} borderStyle=\"round\" borderColor=\"#FF6B2B\" paddingX={2} paddingY={1}>\n <Text bold color=\"#FF6B2B\">{'\\u2B50'} {t('account_upgradeTitle')}</Text>\n <Text> </Text>\n <Text>{t('account_unlockDesc')}</Text>\n <Text color=\"#06B6D4\" bold>{t('account_pricing')}</Text>\n <Text> </Text>\n <Text color=\"#9CA3AF\">{t('account_runActivate')} <Text color=\"#22C55E\" bold>{t('account_activateCmd')}</Text></Text>\n </Box>\n )}\n\n {status === 'expired' && (\n <Box marginTop={1}>\n <Box borderStyle=\"round\" borderColor=\"#EF4444\" paddingX={2} paddingY={0}>\n <Text color=\"#EF4444\">{t('account_licenseExpired')}</Text>\n </Box>\n </Box>\n )}\n\n {deactivating && <Text color=\"#38BDF8\">{t('account_deactivating')}</Text>}\n </Box>\n\n <Box marginTop={2}>\n <Text color=\"#6B7280\">\n {status === 'pro' ? `d:${t('hint_deactivate')}` : ''}\n {' '}{t('app_version', { version: process.env.APP_VERSION ?? '0.1.0' })}\n </Text>\n </Box>\n </Box>\n );\n}\n"],"mappings":"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","names":["useEffect","Box","Text","t","jsx","Text","React","Box","Text","Fragment","jsx","jsxs","Text","Box","React","jsx","jsxs","Box","create","VIEW_KEYS","Box","Text","jsx","jsxs","Box","Text","Box","Text","create","spawn","spawn","create","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","Text","jsxs","Box","Text","jsx","jsxs","Box","Text","Text","Fragment","jsx","jsxs","jsx","jsxs","Box","Text","useState","useMemo","useEffect","Box","Text","useInput","useEffect","useState","useEffect","appendEntry","useState","setError","useEffect","Box","Text","jsx","jsxs","Box","Text","useEffect","Box","Text","useInput","jsx","jsxs","useEffect","useInput","Box","Text","Box","Text","Spinner","jsx","jsxs","Box","Spinner","Text","jsx","jsxs","useState","useEffect","useMemo","useInput","t","Box","Text","useState","useCallback","useEffect","useRef","Box","Text","useInput","TextInput","jsx","jsxs","useState","useRef","useEffect","useCallback","useInput","Box","Text","TextInput","useEffect","useRef","useState","Box","Text","useInput","jsx","jsxs","useState","useRef","useEffect","useInput","Box","Text","useEffect","useRef","useState","Box","Text","useInput","Fragment","jsx","jsxs","useState","setLoading","setError","useRef","useEffect","useInput","isInstalled","Text","Box","useEffect","useState","Box","Text","useInput","jsx","jsxs","serviceAction","useState","useEffect","useInput","Box","Text","useEffect","Box","Text","useInput","jsx","jsxs","useEffect","useInput","Box","Text","useEffect","useRef","useState","Box","Text","useInput","TextInput","create","create","jsx","jsxs","loadProfile","deleteProfile","updateProfile","useState","useRef","useEffect","useInput","Box","Text","TextInput","useEffect","useRef","useState","Box","Text","useInput","create","create","jsx","jsxs","useState","useRef","useEffect","useInput","Box","Text","useEffect","useState","useMemo","Box","Text","useInput","create","create","jsx","jsxs","clearHistory","useState","useEffect","useMemo","useInput","Box","Text","useEffect","useState","Box","Text","useInput","create","create","jsx","jsxs","useState","useEffect","useInput","Box","Text","useState","Box","Text","useInput","Fragment","jsx","jsxs","deactivate","useState","useInput","Box","Text","jsx","useEffect","jsx"]}