brew-tui 0.3.2 → 0.3.3
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.
- package/build/index.js +31 -29
- package/build/index.js.map +1 -1
- package/package.json +1 -1
package/build/index.js.map
CHANGED
|
@@ -1 +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/colors.ts","../src/utils/gradient.tsx","../src/components/layout/footer.tsx","../src/stores/license-store.ts","../src/lib/license/license-manager.ts","../src/lib/license/polar-api.ts","../src/lib/license/anti-tamper.ts","../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/utils/format.ts","../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/components/common/result-banner.tsx","../src/components/common/selectable-row.tsx","../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/profiles/profile-list-mode.tsx","../src/views/profiles/profile-detail-mode.tsx","../src/views/profiles/profile-create-flow.tsx","../src/views/profiles/profile-edit-flow.tsx","../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","../src/lib/license/promo.ts"],"sourcesContent":["import React from 'react';\nimport { createInterface } from 'node:readline/promises';\nimport { rm } from 'node:fs/promises';\nimport { render } from 'ink';\nimport { App } from './app.js';\nimport { activate, deactivate, loadLicense, revalidate } from './lib/license/license-manager.js';\nimport { ensureDataDirs, DATA_DIR } from './lib/data-dir.js';\nimport { t } from './i18n/index.js';\nimport { useLicenseStore } from './stores/license-store.js';\nimport { formatDate } from './utils/format.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: formatDate(license.expiresAt) }));\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 const { remoteSuccess } = await deactivate(license);\n console.log(t('cli_deactivated'));\n if (!remoteSuccess) {\n console.warn(t('cli_deactivateRemoteFailed'));\n }\n return;\n }\n\n if (command === 'revalidate') {\n const license = await loadLicense();\n if (!license) {\n console.log(t('cli_noLicense'));\n process.exit(1);\n }\n\n const result = await revalidate(license);\n if (result === 'expired') {\n console.error(t('cli_revalidateFailed'));\n process.exit(1);\n }\n\n const updated = await loadLicense();\n if (result === 'grace') {\n console.warn(t('cli_revalidateGrace'));\n } else {\n console.log(t('cli_revalidated'));\n }\n if (updated?.expiresAt) {\n console.log(t('cli_expires', { date: formatDate(updated.expiresAt) }));\n }\n return;\n }\n\n if (command === 'status') {\n await useLicenseStore.getState().initialize();\n const { status, license, degradation } = useLicenseStore.getState();\n\n if (status === 'free') {\n console.log(t('cli_planFree'));\n console.log(t('cli_upgradeHint'));\n } else {\n const planLabel = status === 'expired' ? t('cli_planExpired') : t('cli_planPro');\n console.log(planLabel);\n if (license) {\n console.log(t('cli_email', { email: license.customerEmail }));\n }\n\n const statusText = status === 'pro'\n ? (degradation === 'none' ? (license?.status ?? 'active') : degradation)\n : status;\n console.log(t('cli_status', { status: statusText }));\n\n if (license?.expiresAt) {\n console.log(t('cli_expires', { date: formatDate(license.expiresAt) }));\n }\n if (status === 'expired') {\n console.log(t('cli_revalidateHint'));\n }\n if (status === 'pro' && degradation !== 'none' && license) {\n const days = Math.floor((Date.now() - new Date(license.lastValidatedAt).getTime()) / (24 * 60 * 60 * 1000));\n console.log(t('license_offlineWarning', { days }));\n console.log(t('cli_revalidateHint'));\n }\n }\n return;\n }\n\n if (command === 'install-brewbar') {\n await useLicenseStore.getState().initialize();\n const isPro = useLicenseStore.getState().isPro();\n const { installBrewBar } = await import('./lib/brewbar-installer.js');\n try {\n await installBrewBar(isPro, 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 // SEG-007: delete-account subcommand\n if (command === 'delete-account') {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(t('delete_account_confirm') + ' (y/N): ');\n rl.close();\n if (answer.toLowerCase() !== 'y' && answer.toLowerCase() !== 's') {\n console.log(t('cli_deactivateCancelled'));\n return;\n }\n await rm(DATA_DIR, { recursive: true, force: true });\n console.log(t('delete_account_success'));\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';\nimport type { ViewId } from './lib/types.js';\n\n// FE-009: Extracted LicenseInitializer component\nfunction LicenseInitializer() {\n const initLicense = useLicenseStore((s) => s.initialize);\n useEffect(() => { initLicense(); }, []);\n return null;\n}\n\n// FE-009: Extracted ViewRouter component\nfunction ViewRouter({ currentView }: { currentView: ViewId }) {\n const isPro = useLicenseStore((s) => s.isPro);\n\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\nexport function App() {\n const { exit } = useApp();\n const currentView = useNavigationStore((s) => s.currentView);\n\n useGlobalKeyboard({ onQuit: exit });\n\n return (\n <AppLayout>\n <LicenseInitializer />\n <ViewRouter currentView={currentView} />\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 { COLORS } from '../../utils/colors.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', 'package-info', '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 <Text> </Text>\n <Box borderStyle=\"single\" borderBottom borderLeft={false} borderRight={false} borderTop={false} borderColor={COLORS.gold} 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 isPro = isProView(view);\n const isActive = view === currentView;\n const isAccount = view === 'account';\n\n return (\n <React.Fragment key={view}>\n {i > 0 && <Text color={COLORS.border}> {'\\u2502'} </Text>}\n {isActive && <Text color={COLORS.sky}>{'\\u25CF'} </Text>}\n {key ? (\n <>\n <Text bold color=\"#FFFFFF\">{key}</Text>\n <Text bold={isActive} underline={isActive} color={isActive ? COLORS.success : isAccount ? COLORS.gold : COLORS.textSecondary}> {viewLabel}</Text>\n </>\n ) : (\n <Text bold={isActive} underline={isActive} color={isActive ? COLORS.success : isAccount ? COLORS.gold : COLORS.textSecondary}>{viewLabel}</Text>\n )}\n {isPro && <Text color={COLORS.brand} 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 selectedPackage: string | null;\n selectedPackageType: 'formula' | 'cask' | null;\n viewHistory: ViewId[];\n navigate: (view: ViewId) => void;\n goBack: () => void;\n selectPackage: (name: string | null, type?: 'formula' | 'cask' | 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 selectedPackage: null,\n selectedPackageType: null,\n viewHistory: [],\n\n navigate: (view) => {\n const { currentView, viewHistory } = get();\n if (view === currentView) return;\n set({\n currentView: view,\n viewHistory: [...viewHistory.slice(-19), currentView],\n });\n },\n\n goBack: () => {\n const { viewHistory } = get();\n if (viewHistory.length === 0) return;\n const prev = viewHistory[viewHistory.length - 1];\n set({\n currentView: prev,\n viewHistory: viewHistory.slice(0, -1),\n });\n },\n\n selectPackage: (name, type = null) => set({ selectedPackage: name, selectedPackageType: type }),\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","/**\n * Semantic color tokens for Brew-TUI.\n *\n * These constants provide a single source of truth for UI colors.\n * Views should gradually adopt these instead of hardcoded hex strings.\n *\n * Limitation: these tokens are designed for dark terminal backgrounds.\n * Light/high-contrast theme support is not yet implemented.\n */\nexport const COLORS = {\n success: '#22C55E',\n error: '#EF4444',\n warning: '#F59E0B',\n info: '#06B6D4',\n brand: '#FF6B2B',\n muted: '#9CA3AF',\n text: '#F9FAFB',\n textSecondary: '#6B7280',\n teal: '#2DD4BF',\n sky: '#38BDF8',\n gold: '#FFD700',\n purple: '#A855F7',\n blue: '#3B82F6',\n border: '#4B5563',\n} as const;\n","import React, { useMemo } 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 const GradientText = React.memo(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 coloredChars = useMemo(() => {\n const chars = [...children];\n const maxIdx = Math.max(chars.length - 1, 1);\n\n return 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 { char, color, key: `${i}-${color}` };\n });\n }, [children, colors]);\n\n return (\n <>\n {coloredChars.map(({ char, color, key }) => (\n <Text key={key} 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 { COLORS } from '../../utils/colors.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: [['p', 'hint_promo'], ['d', 'hint_deactivate'], ['q', 'hint_quit']],\n};\n\nfunction HintItem({ def }: { def: HintDef }) {\n if (def.length === 1) return <Text color={COLORS.gold} dimColor>{t(def[0])}</Text>;\n return (\n <>\n <Text color={COLORS.text} bold>{def[0]}</Text>\n <Text color={COLORS.textSecondary}>:</Text>\n <Text color={COLORS.gold} 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={COLORS.gold} 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={COLORS.border}> {'\\u2502'} </Text>}\n <HintItem def={def} />\n </React.Fragment>\n );\n })}\n <Text color={COLORS.border}> {'\\u2502'} </Text>\n <Text color={COLORS.text} bold>L</Text>\n <Text color={COLORS.textSecondary}>:</Text>\n <Text color={COLORS.gold} dimColor>{t('hint_lang')}({locale})</Text>\n </Box>\n );\n}\n","import { create } from 'zustand';\nimport type { LicenseData, LicenseStatus } from '../lib/license/types.js';\nimport * as manager from '../lib/license/license-manager.js';\nimport { getDegradationLevel } from '../lib/license/license-manager.js';\nimport type { DegradationLevel } from '../lib/license/license-manager.js';\nimport { ensureDataDirs } from '../lib/data-dir.js';\nimport { initStoreIntegrity } from '../lib/license/anti-tamper.js';\n\nconst REVALIDATION_CHECK_MS = 60 * 60 * 1000; // Check every hour\n\n// ARQ-002: Promise-based mutex for revalidation\nlet _revalidatingPromise: Promise<void> | null = null;\nlet _revalidationInterval: ReturnType<typeof setInterval> | null = null;\n\ninterface LicenseState {\n status: LicenseStatus;\n license: LicenseData | null;\n error: string | null;\n degradation: DegradationLevel;\n\n initialize: () => Promise<void>;\n activate: (key: string) => Promise<boolean>;\n deactivate: () => Promise<void>;\n isPro: () => boolean;\n}\n\nasync function doRevalidation(\n license: LicenseData,\n set: (partial: Partial<LicenseState>) => void,\n): Promise<void> {\n const result = await manager.revalidate(license);\n if (result === 'expired') {\n set({ status: 'expired', license: { ...license, status: 'expired' }, degradation: 'expired' });\n } else {\n const updated = await manager.loadLicense();\n const effective = updated ?? license;\n set({ license: effective, degradation: getDegradationLevel(effective) });\n }\n}\n\nexport const useLicenseStore = create<LicenseState>((set, get) => ({\n status: 'validating',\n license: null,\n error: null,\n degradation: 'none',\n\n initialize: async () => {\n initStoreIntegrity(useLicenseStore);\n await ensureDataDirs();\n const license = await manager.loadLicense();\n\n if (!license) {\n set({ status: 'free', license: null, degradation: 'none' });\n return;\n }\n\n if (manager.isExpired(license)) {\n set({ status: 'expired', license, degradation: 'expired' });\n return;\n }\n\n // Layer 15: Check degradation level based on offline time\n const level = getDegradationLevel(license);\n if (level === 'expired') {\n set({ status: 'expired', license, degradation: 'expired' });\n return;\n }\n\n // Set Pro immediately (warning/limited still shown as pro, but pro-guard checks degradation)\n set({ status: 'pro', license, degradation: level });\n\n if (manager.needsRevalidation(license)) {\n if (!_revalidatingPromise) {\n _revalidatingPromise = doRevalidation(license, set)\n .finally(() => { _revalidatingPromise = null; });\n }\n await _revalidatingPromise;\n }\n\n // Periodically re-check license validity during the session\n if (_revalidationInterval) clearInterval(_revalidationInterval);\n _revalidationInterval = setInterval(() => {\n const current = get().license;\n if (!current || get().status !== 'pro') return;\n if (!manager.needsRevalidation(current)) return;\n if (_revalidatingPromise) return;\n _revalidatingPromise = doRevalidation(current, set)\n .finally(() => { _revalidatingPromise = null; });\n }, REVALIDATION_CHECK_MS);\n _revalidationInterval.unref();\n },\n\n activate: async (key) => {\n set({ error: null });\n try {\n const license = await manager.activate(key);\n set({ status: 'pro', license, degradation: 'none' });\n return true;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n set({ error: msg });\n return false;\n }\n },\n\n deactivate: async () => {\n const { license } = get();\n if (license) {\n const { remoteSuccess } = await manager.deactivate(license);\n if (!remoteSuccess) {\n set({ status: 'free', license: null, degradation: 'none', error: 'License removed locally but server deactivation failed. It may remain active remotely.' });\n return;\n }\n }\n set({ status: 'free', license: null, degradation: 'none', error: null });\n },\n\n isPro: () => get().status === 'pro',\n}));\n","import { readFile, writeFile, rename, rm } from 'node:fs/promises';\nimport { createCipheriv, createDecipheriv, randomBytes, scryptSync } from 'node:crypto';\nimport { LICENSE_PATH, ensureDataDirs } from '../data-dir.js';\nimport { activateLicense as apiActivate, validateLicense as apiValidate, deactivateLicense as apiDeactivate } from './polar-api.js';\nimport { t } from '../../i18n/index.js';\nimport type { LicenseData, LicenseFile } from './types.js';\n\nconst REVALIDATION_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24h\nconst GRACE_PERIOD_MS = 7 * 24 * 60 * 60 * 1000; // 7 days\n\n// ── Layer 18: Client-side rate limiting on activations ──\nconst ACTIVATION_COOLDOWN_MS = 30_000; // 30 seconds between attempts\nconst MAX_ATTEMPTS = 5;\nconst LOCKOUT_MS = 15 * 60 * 1000; // 15 min lockout after max attempts\n\ninterface ActivationTracker {\n attempts: number;\n lastAttempt: number;\n lockedUntil: number;\n}\n\n// Note: rate limit state is in-memory only; resets on process restart\nconst tracker: ActivationTracker = {\n attempts: 0,\n lastAttempt: 0,\n lockedUntil: 0,\n};\n\nfunction checkRateLimit(): void {\n const now = Date.now();\n\n // Check lockout\n if (now < tracker.lockedUntil) {\n const remaining = Math.ceil((tracker.lockedUntil - now) / 60000);\n throw new Error(t('cli_rateLimited', { minutes: remaining }));\n }\n\n // Check cooldown\n if (now - tracker.lastAttempt < ACTIVATION_COOLDOWN_MS) {\n throw new Error(t('cli_cooldown'));\n }\n}\n\nfunction recordAttempt(success: boolean): void {\n const now = Date.now();\n tracker.lastAttempt = now;\n\n if (success) {\n tracker.attempts = 0;\n return;\n }\n\n tracker.attempts++;\n if (tracker.attempts >= MAX_ATTEMPTS) {\n tracker.lockedUntil = now + LOCKOUT_MS;\n tracker.attempts = 0;\n }\n}\n\n// SECURITY NOTE — Known architectural limitation (documented decision):\n// These constants are compiled into the npm bundle and can be extracted by any user\n// with `cat node_modules/.../license-manager.js`. The encryption protects against\n// casual filesystem access, not against a determined attacker with the bundle.\n// The primary defense is server-side revalidation (24h cycle via Polar.sh) and\n// machine binding (machineId in the encrypted envelope). Migrating to macOS Keychain\n// would eliminate this limitation but adds native dependency complexity.\nconst ENCRYPTION_SECRET = 'brew-tui-license-aes256gcm-v1';\nconst SCRYPT_SALT = 'brew-tui-salt-v1';\n\n// Lazy derivation — scryptSync is CPU-intensive (default N=16384) and should\n// not block the event loop at module import time.\nlet _derivedKey: Buffer | null = null;\n\nfunction deriveEncryptionKey(): Buffer {\n if (!_derivedKey) _derivedKey = scryptSync(ENCRYPTION_SECRET, SCRYPT_SALT, 32);\n return _derivedKey;\n}\n\nfunction encryptLicenseData(data: LicenseData): { encrypted: string; iv: string; tag: string } {\n const key = deriveEncryptionKey();\n const iv = randomBytes(12); // 96-bit IV for GCM\n const cipher = createCipheriv('aes-256-gcm', key, iv);\n\n const plaintext = JSON.stringify(data);\n const ciphertext = Buffer.concat([cipher.update(plaintext, 'utf-8'), cipher.final()]);\n const tag = cipher.getAuthTag();\n\n return {\n encrypted: ciphertext.toString('base64'),\n iv: iv.toString('base64'),\n tag: tag.toString('base64'),\n };\n}\n\nfunction decryptLicenseData(encrypted: string, iv: string, tag: string): LicenseData {\n const key = deriveEncryptionKey();\n const decipher = createDecipheriv(\n 'aes-256-gcm',\n key,\n Buffer.from(iv, 'base64'),\n );\n decipher.setAuthTag(Buffer.from(tag, 'base64'));\n\n const plaintext = Buffer.concat([\n decipher.update(Buffer.from(encrypted, 'base64')),\n decipher.final(),\n ]);\n\n return JSON.parse(plaintext.toString('utf-8')) as LicenseData;\n}\n\n// BK-003: Type guard for license data format\nfunction isLicenseFile(obj: unknown): obj is LicenseFile {\n return typeof obj === 'object' && obj !== null && (obj as Record<string, unknown>).version === 1;\n}\n\nfunction isEncryptedLicenseFile(obj: unknown): obj is LicenseFile & { encrypted: string; iv: string; tag: string } {\n if (!isLicenseFile(obj)) return false;\n const record = obj as unknown as Record<string, unknown>;\n return typeof record.encrypted === 'string'\n && typeof record.iv === 'string'\n && typeof record.tag === 'string';\n}\n\n// SEG-002: Read machine ID for portability check\nasync function getMachineId(): Promise<string | null> {\n try {\n const { readFile: readMachineId } = await import('node:fs/promises');\n const { join } = await import('node:path');\n const { homedir } = await import('node:os');\n const machineIdPath = join(homedir(), '.brew-tui', 'machine-id');\n return (await readMachineId(machineIdPath, 'utf-8')).trim() || null;\n } catch {\n return null;\n }\n}\n\nexport async function loadLicense(): Promise<LicenseData | null> {\n try {\n const raw = await readFile(LICENSE_PATH, 'utf-8');\n const parsed: unknown = JSON.parse(raw);\n\n // BK-003: Validate parsed data\n if (!isLicenseFile(parsed)) {\n throw new Error('Invalid license data format');\n }\n\n const file = parsed as LicenseFile;\n\n if (file.version !== 1) {\n // Future: add migration logic here\n throw new Error('Unsupported data version');\n }\n\n // New encrypted format\n if (isEncryptedLicenseFile(file)) {\n const data = decryptLicenseData(file.encrypted!, file.iv!, file.tag!);\n\n // SEG-002: Check machine ID if stored in the envelope\n const fileRecord = file as unknown as Record<string, unknown>;\n if (fileRecord.machineId) {\n const currentMachineId = await getMachineId();\n if (currentMachineId && fileRecord.machineId !== currentMachineId) {\n throw new Error('License was activated on a different machine');\n }\n }\n\n return data;\n }\n\n // Legacy unencrypted format — migrate to encrypted on read\n if (file.license) {\n const data = file.license;\n // Re-save in encrypted format\n await saveLicense(data);\n return data;\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\nexport async function saveLicense(data: LicenseData): Promise<void> {\n await ensureDataDirs();\n const { encrypted, iv, tag } = encryptLicenseData(data);\n // SEG-002: Include machineId in the envelope for portability detection\n const machineId = await getMachineId();\n const file: Record<string, unknown> = { version: 1, encrypted, iv, tag };\n if (machineId) file.machineId = machineId;\n const tmpPath = LICENSE_PATH + '.tmp';\n await writeFile(tmpPath, JSON.stringify(file, null, 2), { encoding: 'utf-8', mode: 0o600 });\n await rename(tmpPath, LICENSE_PATH);\n}\n\nexport async function clearLicense(): Promise<void> {\n try {\n await rm(LICENSE_PATH);\n } catch { /* file may not exist */ }\n}\n\nexport function isExpired(license: LicenseData): boolean {\n if (!license.expiresAt) return false;\n return new Date(license.expiresAt).getTime() < Date.now();\n}\n\nexport function needsRevalidation(license: LicenseData): boolean {\n const lastValidated = new Date(license.lastValidatedAt).getTime();\n if (isNaN(lastValidated)) return true; // corrupted date → force revalidation\n return Date.now() - lastValidated > REVALIDATION_INTERVAL_MS;\n}\n\nexport function isWithinGracePeriod(license: LicenseData): boolean {\n const lastValidated = new Date(license.lastValidatedAt).getTime();\n if (isNaN(lastValidated)) return false; // corrupted date → no grace\n return Date.now() - lastValidated < GRACE_PERIOD_MS;\n}\n\n// ── Layer 15: Gradual degradation after extended offline ──\n\nexport type DegradationLevel = 'none' | 'warning' | 'limited' | 'expired';\nexport type RevalidationResult = 'valid' | 'grace' | 'expired';\n\n/**\n * Returns the degradation level based on time since last server validation.\n * - 0-7 days: none (full access)\n * - 7-14 days: warning (shows a notice but still works)\n * - 14-30 days: limited (some features disabled)\n * - 30+ days: expired (all Pro features disabled)\n */\nexport function getDegradationLevel(license: LicenseData): DegradationLevel {\n const lastValidated = new Date(license.lastValidatedAt).getTime();\n if (isNaN(lastValidated)) return 'expired'; // corrupted date → deny access\n const elapsed = Date.now() - lastValidated;\n if (elapsed < 0) return 'none'; // clock skew: future timestamp → treat as fresh\n const days = elapsed / (24 * 60 * 60 * 1000);\n\n if (days <= 7) return 'none';\n if (days <= 14) return 'warning';\n if (days <= 30) return 'limited';\n return 'expired';\n}\n\n// Layer 10: License key format validation\nfunction validateLicenseKey(key: string): void {\n // Polar keys are UUID-like: 8-4-4-4-12 hex chars or similar\n // Reject obviously invalid keys to avoid unnecessary API calls\n if (key.length < 10 || key.length > 100) {\n throw new Error('Invalid license key format');\n }\n // Only allow alphanumeric, hyphens, underscores\n if (!/^[\\w-]+$/.test(key)) {\n throw new Error('Invalid license key format');\n }\n}\n\nexport async function activate(key: string): Promise<LicenseData> {\n validateLicenseKey(key);\n checkRateLimit();\n\n let success = false;\n try {\n const res = await apiActivate(key);\n\n if (!res.activated) {\n throw new Error(res.error ?? 'Activation failed');\n }\n\n const license: LicenseData = {\n key,\n instanceId: res.instance.id,\n status: 'active',\n customerEmail: res.meta.customer_email,\n customerName: res.meta.customer_name,\n plan: 'pro',\n activatedAt: new Date().toISOString(),\n expiresAt: res.license_key.expires_at,\n lastValidatedAt: new Date().toISOString(),\n };\n\n await saveLicense(license);\n success = true;\n return license;\n } finally {\n recordAttempt(success);\n }\n}\n\n/**\n * Revalidate the license against the server.\n * This also serves as Layer 19 (telemetry): each validation call\n * allows Polar to track activation count, last-seen timestamp,\n * and detect if the activation limit is exceeded (license sharing).\n */\n// EP-006: Detect if an error is a network error vs validation/contract error\nfunction isNetworkError(err: unknown): boolean {\n const msg = err instanceof Error ? err.message : String(err);\n return /fetch failed|ECONNREFUSED|ENOTFOUND|ETIMEDOUT|network|timeout|abort/i.test(msg);\n}\n\nexport async function revalidate(license: LicenseData): Promise<RevalidationResult> {\n try {\n const res = await apiValidate(license.key, license.instanceId);\n\n if (res.valid) {\n const updated: LicenseData = {\n ...license,\n lastValidatedAt: new Date().toISOString(),\n status: 'active',\n expiresAt: res.license_key.expires_at,\n };\n await saveLicense(updated);\n return 'valid';\n }\n\n await saveLicense({ ...license, status: 'expired' });\n return 'expired';\n } catch (err) {\n // EP-006: Network errors trigger grace period; validation/contract errors mean expired\n if (isNetworkError(err)) {\n return isWithinGracePeriod(license) ? 'grace' : 'expired';\n }\n // Unexpected response or contract violation — treat as expired\n await saveLicense({ ...license, status: 'expired' });\n return 'expired';\n }\n}\n\nexport async function deactivate(license: LicenseData): Promise<{ remoteSuccess: boolean }> {\n let remoteSuccess = false;\n for (let attempt = 0; attempt < 3; attempt++) {\n try {\n await apiDeactivate(license.key, license.instanceId);\n remoteSuccess = true;\n break;\n } catch {\n if (attempt < 2) await new Promise(r => setTimeout(r, 1000));\n }\n }\n await clearLicense();\n return { remoteSuccess };\n}\n","import { randomUUID } from 'node:crypto';\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { PolarActivateResponse, PolarValidateResponse } from './types.js';\nimport { fetchWithTimeout } from '../fetch-timeout.js';\n\nconst BASE_URL = 'https://api.polar.sh/v1/customer-portal/license-keys';\n\n// ── GOV-004: Public organization ID (not a secret) ──\n// This is the public Polar organization identifier used for license key operations.\n// Found at: polar.sh/dashboard -> Settings -> General\nexport const POLAR_ORGANIZATION_ID = 'b8f245c0-d116-4457-92fb-1bda47139f82';\n\n// SEG-004: Machine-specific identifier stored persistently\nconst DATA_DIR = join(homedir(), '.brew-tui');\nconst MACHINE_ID_PATH = join(DATA_DIR, 'machine-id');\n\nasync function getMachineId(): Promise<string> {\n try {\n const id = (await readFile(MACHINE_ID_PATH, 'utf-8')).trim();\n if (id) return id;\n } catch { /* file doesn't exist yet */ }\n\n const id = randomUUID();\n await mkdir(DATA_DIR, { recursive: true, mode: 0o700 });\n await writeFile(MACHINE_ID_PATH, id, { encoding: 'utf-8', mode: 0o600 });\n return id;\n}\n\n// Layer 11: API URL validation\nfunction validateApiUrl(url: string): void {\n const parsed = new URL(url);\n if (parsed.protocol !== 'https:') {\n throw new Error('HTTPS required for license API');\n }\n if (!parsed.hostname.endsWith('polar.sh')) {\n throw new Error('Invalid API host');\n }\n}\n\n// Raw Polar response shapes\ninterface PolarActivation {\n id: string; // activation_id\n license_key: {\n status: string;\n expires_at: string | null;\n };\n}\n\ninterface PolarValidated {\n id: string;\n status: string; // 'granted' | 'revoked' | 'disabled'\n expires_at: string | null;\n customer: {\n email: string | null;\n name: string | null;\n };\n activation: { id: string } | null;\n}\n\nasync function post<T>(endpoint: string, body: Record<string, unknown>, expectEmpty = false): Promise<T> {\n const url = `${BASE_URL}/${endpoint}`;\n validateApiUrl(url);\n\n const res = await fetchWithTimeout(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n }, 15_000);\n\n if (!res.ok) {\n let message = `Request failed with status ${res.status}`;\n try {\n const errBody = await res.json() as { detail?: string; error?: string; message?: string };\n if (typeof errBody.detail === 'string') message = errBody.detail;\n else if (typeof errBody.error === 'string') message = errBody.error;\n else if (typeof errBody.message === 'string') message = errBody.message;\n } catch {\n // non-JSON error body — use generic message above\n }\n throw new Error(message);\n }\n\n if (expectEmpty || res.status === 204) return undefined as T;\n return res.json() as Promise<T>;\n}\n\nexport async function activateLicense(key: string): Promise<PolarActivateResponse> {\n const machineId = await getMachineId();\n\n const activation = await post<PolarActivation>('activate', {\n key,\n organization_id: POLAR_ORGANIZATION_ID,\n label: machineId, // SEG-004: Use machine UUID instead of hostname\n });\n\n // EP-001: Runtime validation of activation response\n if (!activation || typeof activation.id !== 'string' || !activation.license_key) {\n throw new Error('Invalid activation response: missing required fields');\n }\n\n // Polar's activate response doesn't include customer info — fetch it via validate\n let customerEmail = '';\n let customerName = '';\n try {\n const validated = await post<PolarValidated>('validate', {\n key,\n organization_id: POLAR_ORGANIZATION_ID,\n activation_id: activation.id,\n });\n customerEmail = validated.customer?.email ?? '';\n customerName = validated.customer?.name ?? '';\n } catch {\n // customer info is non-critical — activation still succeeds\n }\n\n return {\n activated: true,\n error: null,\n instance: { id: activation.id },\n license_key: {\n id: 0,\n status: activation.license_key.status,\n key,\n activation_limit: 0,\n activations_count: 0,\n expires_at: activation.license_key.expires_at,\n },\n meta: { customer_email: customerEmail, customer_name: customerName },\n };\n}\n\nexport async function validateLicense(key: string, instanceId: string): Promise<PolarValidateResponse> {\n const res = await post<PolarValidated>('validate', {\n key,\n organization_id: POLAR_ORGANIZATION_ID,\n activation_id: instanceId,\n });\n\n // EP-002: Runtime validation of validate response\n if (!res || typeof res.id !== 'string' || typeof res.status !== 'string' || !res.customer) {\n throw new Error('Invalid validation response: missing required fields');\n }\n\n const notExpired = res.expires_at === null || new Date(res.expires_at) > new Date();\n const valid = res.status === 'granted' && notExpired;\n\n return {\n valid,\n error: valid ? null : `License ${res.status}`,\n license_key: {\n id: 0,\n status: res.status,\n key,\n expires_at: res.expires_at,\n },\n instance: { id: instanceId },\n };\n}\n\nexport async function deactivateLicense(key: string, instanceId: string): Promise<void> {\n await post<void>(\n 'deactivate',\n { key, organization_id: POLAR_ORGANIZATION_ID, activation_id: instanceId },\n true,\n );\n}\n","import type { LicenseStatus } from './types.js';\n\ninterface LicenseStoreSnapshot {\n status: LicenseStatus;\n isPro: () => boolean;\n}\n\ninterface LicenseStoreApi {\n getState: () => LicenseStoreSnapshot;\n}\n\n// Lazy-captured references: initialized on first call to initStoreIntegrity()\nlet _originalIsPro: (() => boolean) | null = null;\nlet _originalGetState: (() => LicenseStoreSnapshot) | null = null;\nlet _storeApi: LicenseStoreApi | null = null;\n\n/**\n * Capture the original store function references for later integrity checks.\n * Call this once during license store initialization.\n */\nexport function initStoreIntegrity(store: LicenseStoreApi): void {\n _storeApi = store;\n _originalIsPro = store.getState().isPro;\n _originalGetState = store.getState;\n}\n\n/**\n * Verify that the license store's isPro function hasn't been replaced\n * with a function that always returns true.\n */\nexport function verifyStoreIntegrity(): boolean {\n if (!_storeApi || !_originalIsPro || !_originalGetState) return false;\n\n const state = _storeApi.getState();\n\n // Check 1: isPro function reference hasn't changed\n if (state.isPro !== _originalIsPro) return false;\n\n // Check 2: getState itself hasn't been replaced\n if (_storeApi.getState !== _originalGetState) return false;\n\n // Check 3: If status is 'free', isPro() must return false\n // (catches patches that make isPro() always return true regardless of status)\n if (state.status === 'free' && state.isPro()) return false;\n\n return true;\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 { COLORS } from '../../utils/colors.js';\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={COLORS.brand}\n paddingX={3}\n paddingY={2}\n flexDirection=\"column\"\n alignItems=\"center\"\n width=\"80%\"\n >\n <Text bold color={COLORS.brand}>{'\\u2B50'} {t('upgrade_proFeature', { title })}</Text>\n <Text> </Text>\n <Text color={COLORS.text} wrap=\"wrap\">{t(keys.desc)}</Text>\n <Text> </Text>\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text color={COLORS.info} bold>{t('upgrade_pricing')}</Text>\n <Text> </Text>\n <Text color={COLORS.muted}>{t('upgrade_buyAt')}</Text>\n <Text color={COLORS.sky} bold> {t('upgrade_buyUrl')}</Text>\n <Text> </Text>\n <Text color={COLORS.muted}>{t('upgrade_activateWith')}</Text>\n <Text color={COLORS.success} bold> {t('upgrade_activateCmd')}</Text>\n <Text> </Text>\n <Text color={COLORS.brand}>{t('upgrade_proLabel')}</Text>\n </Box>\n </Box>\n </Box>\n );\n}\n","import React, { useEffect, useMemo } from 'react';\nimport { Box, Text, useStdout } 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 { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nimport { formatRelativeTime } from '../utils/format.js';\n\nexport function DashboardView() {\n const { formulae, casks, outdated, services, config, loading, errors, lastFetchedAt, fetchAll } = useBrewStore();\n const { stdout } = useStdout();\n const columns = stdout?.columns ?? 80;\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 const partialErrors = [\n errors.outdated ? { label: t('dashboard_outdated'), message: errors.outdated } : null,\n errors.services ? { label: t('dashboard_services'), message: errors.services } : null,\n errors.config ? { label: t('dashboard_systemInfo'), message: errors.config } : null,\n ].filter((item): item is { label: string; message: string } => item !== null);\n const outdatedValue = loading.outdated\n ? '...'\n : errors.outdated\n ? t('dashboard_statError')\n : outdated.formulae.length + outdated.casks.length;\n const servicesValue = loading.services\n ? '...'\n : errors.services\n ? t('dashboard_statError')\n : `${runningServices}/${services.length}`;\n\n // ARQ-004: Last updated timestamp\n const lastUpdated = lastFetchedAt.installed\n ? formatRelativeTime(lastFetchedAt.installed / 1000)\n : null;\n\n if (loading.installed) return <Loading message={t('loading_fetchingBrew')} />;\n if (errors.installed) return <ErrorMessage message={errors.installed} />;\n\n // SCR-018: Responsive layout\n const isNarrow = columns < 60;\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\" flexDirection={isNarrow ? 'column' : 'row'}>\n <StatCard label={t('dashboard_formulae')} value={formulae.length} color={COLORS.info} />\n <StatCard label={t('dashboard_casks')} value={casks.length} color={COLORS.purple} />\n <StatCard\n label={t('dashboard_outdated')}\n value={outdatedValue}\n color={typeof outdatedValue === 'number' && outdatedValue > 0 ? COLORS.warning : (errors.outdated ? COLORS.error : COLORS.success)}\n />\n <StatCard\n label={t('dashboard_services')}\n value={servicesValue}\n color={errors.services || errorServices > 0 ? COLORS.error : COLORS.success}\n />\n </Box>\n\n {/* ARQ-004: Show last updated */}\n {lastUpdated && (\n <Text color={COLORS.muted}>{t('dashboard_lastUpdated', { time: lastUpdated })}</Text>\n )}\n\n {partialErrors.length > 0 && (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={COLORS.warning} paddingX={2} paddingY={0}>\n <Text color={COLORS.warning} bold>{t('dashboard_partialData')}</Text>\n {partialErrors.map((item) => (\n <Text key={item.label} color={COLORS.muted}>\n {item.label}: {item.message}\n </Text>\n ))}\n </Box>\n )}\n\n {config && !errors.config && (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u2139\\uFE0F'} title={t('dashboard_systemInfo')} gradient={[COLORS.text, COLORS.muted]} />\n <Box borderStyle=\"round\" borderColor={COLORS.blue} paddingX={2} paddingY={0} flexDirection=\"column\" marginTop={1}>\n <Text><Text color={COLORS.muted}>{t('dashboard_homebrew')}</Text> {config.HOMEBREW_VERSION}</Text>\n <Text><Text color={COLORS.muted}>{t('dashboard_prefix')}</Text> {config.HOMEBREW_PREFIX}</Text>\n <Text><Text color={COLORS.muted}>{t('dashboard_updated')}</Text> {config.coreUpdated}</Text>\n </Box>\n </Box>\n )}\n\n {!errors.outdated && 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={COLORS.text}>{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={COLORS.textSecondary} italic>{t('common_andMore', { count: outdated.formulae.length - 10 })}</Text>\n )}\n </Box>\n </Box>\n )}\n\n {!errors.services && errorServices > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <SectionHeader emoji={'\\u26A0\\uFE0F'} title={t('dashboard_serviceErrors')} color={COLORS.error} />\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={COLORS.muted}>{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';\nimport { logger } from '../utils/logger.js';\n\nconst BREW_UPDATE_COOLDOWN_MS = 5 * 60 * 1000;\n\nlet fetchAllInFlight: Promise<void> | null = null;\nlet brewUpdateInFlight: Promise<void> | null = null;\nlet lastBrewUpdateStartedAt = 0;\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 lastFetchedAt: Record<string, number>;\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\nfunction recordFetchTime(set: (fn: (s: BrewState) => Partial<BrewState>) => void, key: string) {\n set((s) => ({ lastFetchedAt: { ...s.lastFetchedAt, [key]: Date.now() } }));\n}\n\nexport const useBrewStore = create<BrewState>((set, get) => ({\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 // SCR-013: Pre-initialize doctor loading to true\n loading: { installed: true, outdated: true, services: true, config: true, doctor: true },\n errors: {},\n lastFetchedAt: {},\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 recordFetchTime(set, 'installed');\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 recordFetchTime(set, 'outdated');\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 recordFetchTime(set, 'services');\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 recordFetchTime(set, 'config');\n }\n },\n\n fetchLeaves: async () => {\n try {\n const result = await api.getLeaves();\n set({ leaves: result });\n } catch (err) {\n // QA-021: Use structured logger unconditionally\n logger.error('fetchLeaves failed', { error: err instanceof Error ? err.message : String(err) });\n } finally {\n recordFetchTime(set, 'leaves');\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 recordFetchTime(set, 'doctor');\n }\n },\n\n fetchAll: async (): Promise<void> => {\n if (fetchAllInFlight) {\n return fetchAllInFlight;\n }\n\n const now = Date.now();\n if (!brewUpdateInFlight && now - lastBrewUpdateStartedAt > BREW_UPDATE_COOLDOWN_MS) {\n lastBrewUpdateStartedAt = now;\n // Don't block on brew update — run in background.\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 // ARQ-003: Capture brew update errors in store\n brewUpdateInFlight = api.brewUpdate()\n .catch((err) => { set((s) => ({ errors: { ...s.errors, update: String(err) } })); })\n .finally(() => {\n brewUpdateInFlight = null;\n });\n }\n\n const store = get();\n fetchAllInFlight = Promise.all([\n store.fetchInstalled(),\n store.fetchOutdated(),\n store.fetchServices(),\n store.fetchConfig(),\n store.fetchLeaves(),\n store.fetchDoctor(),\n ]).then(() => undefined)\n .finally(() => {\n fetchAllInFlight = null;\n });\n\n return fetchAllInFlight;\n },\n\n uninstallPackage: async (name) => {\n setLoading(set, 'action', true);\n try {\n await api.uninstallPackage(name);\n await get().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 get().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\n// EP-011: Package name validation\nconst PKG_PATTERN = /^[\\w@./+-]+$/;\n\nfunction validatePackageName(name: string): void {\n if (!PKG_PATTERN.test(name)) throw new Error('Invalid package name: ' + name);\n}\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 validatePackageName(name);\n const raw = await execBrew(['info', '--json=v2', name]);\n return parseFormulaInfoJson(raw);\n}\n\n// SCR-008: Cask-specific info endpoint\nexport async function getCaskInfo(name: string): Promise<Cask | null> {\n validatePackageName(name);\n try {\n const raw = await execBrew(['info', '--json=v2', '--cask', name]);\n const data = JSON.parse(raw) as { casks?: Cask[] };\n return data.casks?.[0] ?? null;\n } catch {\n return null;\n }\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 validatePackageName(name);\n return streamBrew(['install', name]);\n}\n\nexport function upgradePackage(name: string): AsyncGenerator<string> {\n validatePackageName(name);\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 validatePackageName(name);\n return execBrew(['uninstall', name]);\n}\n\nexport async function serviceAction(name: string, action: 'start' | 'stop' | 'restart'): Promise<string> {\n validatePackageName(name);\n return execBrew(['services', action, name]);\n}\n\n// ARQ-008: Pin/unpin operations moved from outdated view\nexport async function pinPackage(name: string): Promise<string> {\n validatePackageName(name);\n return execBrew(['pin', name]);\n}\n\nexport async function unpinPackage(name: string): Promise<string> {\n validatePackageName(name);\n return execBrew(['unpin', 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\nconst DEFAULT_TIMEOUT_MS = 30_000; // 30 seconds for instant commands\nconst STREAM_IDLE_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes idle timeout for streaming\n\nexport async function execBrew(args: string[], timeoutMs = DEFAULT_TIMEOUT_MS): 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 let killed = false;\n\n // EP-012: Timeout with AbortController pattern\n const timer = setTimeout(() => {\n killed = true;\n proc.kill();\n reject(new Error(`brew ${args.join(' ')} timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\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 clearTimeout(timer);\n if (killed) return;\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 clearTimeout(timer);\n if (killed) return;\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 let lastOutputAt = Date.now();\n\n const push = (chunk: Buffer) => {\n lastOutputAt = Date.now();\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 // EP-012: Kill process if idle for too long\n if (Date.now() - lastOutputAt > STREAM_IDLE_TIMEOUT_MS) {\n proc.kill();\n throw new Error(`brew ${args.join(' ')} timed out: no output for ${STREAM_IDLE_TIMEOUT_MS / 1000}s`);\n }\n await new Promise((r) => setTimeout(r, 100));\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';\nimport { COLORS } from '../../utils/colors.js';\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={COLORS.muted}>{label}</Text>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { Spinner } from '@inkjs/ui';\nimport { COLORS } from '../../utils/colors.js';\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={COLORS.error} bold>{'\\u2718'} {t('error_prefix')}</Text>\n <Text color={COLORS.error}>{message}</Text>\n </Box>\n );\n}\n","import React from 'react';\nimport { Text } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\n\ntype BadgeVariant = 'success' | 'warning' | 'error' | 'info' | 'muted';\n\nconst BADGE_STYLES: Record<BadgeVariant, { icon: string; color: string }> = {\n success: { icon: '\\u2714', color: COLORS.success },\n warning: { icon: '\\u25CF', color: COLORS.warning },\n error: { icon: '\\u2718', color: COLORS.error },\n info: { icon: '\\u25C6', color: COLORS.blue },\n muted: { icon: '\\u25CB', color: COLORS.textSecondary },\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 { COLORS } from '../../utils/colors.js';\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 = COLORS.gold, 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={COLORS.textSecondary}>({count})</Text>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { Text } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\nimport { t } from '../../i18n/index.js';\n\ninterface VersionArrowProps {\n current: string;\n latest: string;\n}\n\nexport function VersionArrow({ current, latest }: VersionArrowProps) {\n return (\n <>\n <Text color={COLORS.muted}>{t('version_installed')} </Text>\n <Text color={COLORS.error}>{current}</Text>\n <Text color={COLORS.warning}>{' \\u2500\\u2500 '}</Text>\n <Text color={COLORS.gold}>{'\\u25B6'}</Text>\n <Text color={COLORS.muted}> {t('version_available')} </Text>\n <Text color={COLORS.teal}>{latest}</Text>\n </>\n );\n}\n","import { getLocale, 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 formatDate(value: string | number | Date): string {\n const date = value instanceof Date ? value : new Date(value);\n const locale = getLocale();\n return date.toLocaleDateString(locale === 'es' ? 'es-ES' : 'en-US');\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, useMemo, useEffect } from 'react';\nimport { Box, Text, useInput, useStdout } 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 { ResultBanner } from '../components/common/result-banner.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { COLORS } from '../utils/colors.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 const { stdout } = useStdout();\n const cols = stdout?.columns ?? 80;\n const nameWidth = Math.floor(cols * 0.35);\n const versionWidth = Math.floor(cols * 0.15);\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 // Stream finished but still showing — Esc dismisses and refreshes\n if (!stream.isRunning && stream.lines.length > 0) {\n if (key.escape) {\n stream.clear();\n void fetchInstalled();\n }\n return;\n }\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, tab === 'formulae' ? 'formula' : 'cask');\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 <Text color={COLORS.textSecondary}>esc:{t('hint_cancel')}</Text>\n )}\n {!stream.isRunning && (\n <Box flexDirection=\"column\" marginTop={1}>\n <ResultBanner\n status={stream.error ? 'error' : 'success'}\n message={stream.error ? `\\u2718 ${stream.error}` : `\\u2714 ${t('pkgInfo_done')}`}\n />\n <Text color={COLORS.textSecondary}>esc:{t('hint_back')}</Text>\n </Box>\n )}\n </Box>\n );\n }\n\n const MAX_VISIBLE_ROWS = Math.max(5, (stdout?.rows ?? 24) - 8);\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' ? COLORS.info : COLORS.textSecondary}\n paddingX={1}\n >\n <Text bold={tab === 'formulae'} color={tab === 'formulae' ? COLORS.info : COLORS.textSecondary}>\n {'\\u{1F4E6}'} {t('installed_formulaeCount', { count: formulae.length })}\n </Text>\n </Box>\n <Box\n borderStyle=\"round\"\n borderColor={tab === 'casks' ? COLORS.purple : COLORS.textSecondary}\n paddingX={1}\n >\n <Text bold={tab === 'casks'} color={tab === 'casks' ? COLORS.purple : COLORS.textSecondary}>\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={COLORS.gold} 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={COLORS.border}>\n <Text color={COLORS.text} bold>{' '}{t('installed_col_package').padEnd(nameWidth)}</Text>\n <Text color={COLORS.text} bold>{t('installed_col_version').padEnd(versionWidth)}</Text>\n <Text color={COLORS.text} bold>{t('installed_col_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={COLORS.textSecondary} italic>{t('installed_noPackages')}</Text>\n </Box>\n )}\n {start > 0 && (\n <Text color={COLORS.textSecondary} 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 <SelectableRow key={item.name} isCurrent={isCurrent}>\n <Text bold={isCurrent} inverse={isCurrent} color={isCurrent ? COLORS.text : COLORS.muted}>\n {truncate(item.name, nameWidth).padEnd(nameWidth)}\n </Text>\n <Text color={COLORS.teal}>{item.version.padEnd(versionWidth)}</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={COLORS.textSecondary} dimColor>{truncate(item.desc, 30)}</Text>\n )}\n </SelectableRow>\n );\n })}\n {start + MAX_VISIBLE_ROWS < allItems.length && (\n <Text color={COLORS.textSecondary} 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={COLORS.text} 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 { detectAction } from '../lib/history/history-logger.js';\nimport { useLicenseStore } from '../stores/license-store.js';\n\nconst MAX_LINES = 100;\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 const isPro = useLicenseStore.getState().isPro();\n const { appendEntry } = await import('../lib/history/history-logger.js');\n await appendEntry(isPro, 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 { COLORS } from '../../utils/colors.js';\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={COLORS.gold}>{'\\u{1F50D}'} </Text>\n {isActive ? (\n <TextInput\n placeholder={resolvedPlaceholder}\n defaultValue={defaultValue}\n onChange={onChange}\n />\n ) : (\n <Text color={COLORS.textSecondary}>{defaultValue || placeholder}</Text>\n )}\n </Box>\n );\n}\n","import React, { useEffect } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\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={COLORS.purple} paddingX={2} paddingY={1} flexDirection=\"column\">\n <Text bold color={COLORS.text}>{message}</Text>\n <Box marginTop={1}>\n <Text color={COLORS.success}>{t('confirm_yes')}</Text>\n <Text> / </Text>\n <Text color={COLORS.error}>{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 { COLORS } from '../../utils/colors.js';\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={COLORS.sky} paddingX={1}>\n {title && (\n <Box marginBottom={1}>\n {isRunning && <Spinner label=\"\" />}\n <Text bold color={COLORS.sky}> {title}</Text>\n </Box>\n )}\n {visible.map((line, i) => (\n <Text key={lines.length - visible.length + i} color={COLORS.muted} wrap=\"wrap\">{line}</Text>\n ))}\n {lines.length === 0 && !isRunning && (\n <Text color={COLORS.textSecondary} italic>{t('progress_noOutput')}</Text>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\n\ninterface ResultBannerProps {\n status: 'success' | 'error' | 'warning' | 'info';\n message: string;\n}\n\nconst STATUS_COLORS: Record<string, string> = {\n success: COLORS.success,\n error: COLORS.error,\n warning: COLORS.warning,\n info: COLORS.info,\n};\n\nexport function ResultBanner({ status, message }: ResultBannerProps) {\n return (\n <Box borderStyle=\"round\" borderColor={STATUS_COLORS[status]} paddingX={2} paddingY={0}>\n <Text color={STATUS_COLORS[status]} bold>{message}</Text>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\n\ninterface SelectableRowProps {\n isCurrent: boolean;\n children: React.ReactNode;\n gap?: number;\n}\n\nexport function SelectableRow({ isCurrent, children, gap = 1 }: SelectableRowProps) {\n return (\n <Box gap={gap}>\n <Text color={isCurrent ? COLORS.success : COLORS.muted}>\n {isCurrent ? '\\u25B6' : ' '}\n </Text>\n {children}\n </Box>\n );\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 { ResultBanner } from '../components/common/result-banner.js';\nimport { COLORS } from '../utils/colors.js';\nimport { SelectableRow } from '../components/common/selectable-row.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 [searchError, setSearchError] = useState<string | null>(null);\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) {\n setResults(null);\n setSearchError(t('search_minChars'));\n return;\n }\n setSearching(true);\n setSearchError(null);\n try {\n const r = await api.search(term);\n setResults(r);\n setCursor(0);\n } catch (err) {\n setResults({ formulae: [], casks: [] });\n setSearchError(err instanceof Error ? err.message : t('search_failed'));\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 MAX_VISIBLE = 20;\n const visibleFormulae = results ? results.formulae.slice(0, MAX_VISIBLE) : [];\n const visibleCasks = results ? results.casks.slice(0, MAX_VISIBLE) : [];\n const allVisible = [...visibleFormulae, ...visibleCasks];\n\n useInput((input, key) => {\n if (stream.isRunning) {\n if (key.escape) stream.cancel();\n return;\n }\n if (stream.lines.length > 0) {\n if (key.escape) {\n stream.clear();\n }\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 && allVisible[cursor]) {\n selectPackage(allVisible[cursor]);\n navigate('package-info');\n return;\n }\n\n // 'i' → install directly (with confirmation)\n if (input === 'i' && allVisible[cursor]) {\n setConfirmInstall(allVisible[cursor]);\n return;\n }\n\n if (input === 'j' || key.downArrow) {\n setCursor((c) => Math.min(c + 1, Math.max(0, allVisible.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={COLORS.textSecondary}>esc:{t('hint_cancel')}</Text>\n )}\n {!stream.isRunning && (\n <Box flexDirection=\"column\" marginTop={1}>\n <ResultBanner\n status={stream.error ? 'error' : 'success'}\n message={stream.error ? `\\u2718 ${stream.error}` : `\\u2714 ${t('search_installComplete')}`}\n />\n <Text color={COLORS.textSecondary}>esc:{t('hint_clear')}</Text>\n </Box>\n )}\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text color={COLORS.gold}>{'\\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={COLORS.text}>{query}</Text>\" <Text color={COLORS.textSecondary}>{t('search_escToClear')}</Text></Text>\n )}\n </Box>\n\n {searching && <Loading message={t('loading_searching')} />}\n\n {searchError && (\n <Box marginBottom={1}>\n <Text color={COLORS.error}>{searchError}</Text>\n </Box>\n )}\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 {visibleFormulae.length > 0 && (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold color={COLORS.info}>{t('search_formulaeHeader', { count: results.formulae.length })}</Text>\n {visibleFormulae.map((name, i) => {\n const isCurrent = i === cursor;\n return (\n <SelectableRow key={name} isCurrent={isCurrent}>\n <Text bold={isCurrent} inverse={isCurrent}>{name}</Text>\n </SelectableRow>\n );\n })}\n {results.formulae.length > MAX_VISIBLE && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: results.formulae.length - MAX_VISIBLE })}</Text>\n )}\n </Box>\n )}\n\n {visibleCasks.length > 0 && (\n <Box flexDirection=\"column\">\n <Text bold color={COLORS.purple}>{t('search_casksHeader', { count: results.casks.length })}</Text>\n {visibleCasks.map((name, i) => {\n const idx = visibleFormulae.length + i;\n const isCurrent = idx === cursor;\n return (\n <SelectableRow key={name} isCurrent={isCurrent}>\n <Text bold={isCurrent} inverse={isCurrent}>{name}</Text>\n </SelectableRow>\n );\n })}\n {results.casks.length > MAX_VISIBLE && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: results.casks.length - MAX_VISIBLE })}</Text>\n )}\n </Box>\n )}\n\n {allVisible.length === 0 && (\n <Box borderStyle=\"round\" borderColor={COLORS.textSecondary} paddingX={2}>\n <Text color={COLORS.textSecondary} italic>{t('search_noResults')}</Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color={COLORS.text} bold>\n {allVisible.length > 0 ? `${cursor + 1}/${allVisible.length}` : ''}\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport { useBrewStore } from '../stores/brew-store.js';\nimport { useBrewStream } from '../hooks/use-brew-stream.js';\nimport { pinPackage, unpinPackage } from '../lib/brew-api.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 { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { VersionArrow } from '../components/common/version-arrow.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { COLORS } from '../utils/colors.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 (stream.lines.length > 0) {\n if (key.escape) {\n stream.clear();\n return;\n }\n if (input === 'r') {\n stream.clear();\n void fetchOutdated();\n }\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 // ARQ-008: Use brew-api functions instead of direct execBrew\n const pkg = allOutdated[cursor];\n void (pkg.pinned ? unpinPackage(pkg.name) : pinPackage(pkg.name)).then(() => void fetchOutdated());\n return;\n } else if (input === 'r') {\n void fetchOutdated();\n }\n });\n\n const { stdout } = useStdout();\n const MAX_VISIBLE_ROWS = Math.max(5, (stdout?.rows ?? 24) - 8);\n const start = Math.max(0, cursor - Math.floor(MAX_VISIBLE_ROWS / 2));\n const visible = allOutdated.slice(start, start + MAX_VISIBLE_ROWS);\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={COLORS.textSecondary}>esc:{t('hint_cancel')}</Text>\n )}\n {!stream.isRunning && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box borderStyle=\"round\" borderColor={stream.error ? COLORS.error : COLORS.success} paddingX={2} paddingY={0}>\n <Text color={stream.error ? COLORS.error : COLORS.success} bold>\n {stream.error ? `\\u2718 ${stream.error}` : `\\u2714 ${t('outdated_upgradeComplete')}`}\n </Text>\n <Text color={COLORS.muted}> {t('outdated_pressRefresh')}</Text>\n </Box>\n <Text color={COLORS.textSecondary}>r:{t('hint_refresh')} esc:{t('hint_clear')}</Text>\n </Box>\n )}\n </Box>\n );\n }\n\n // SCR-012: Build package list for upgrade-all confirmation\n const upgradeAllMessage = confirmAction?.type === 'all'\n ? `${t('outdated_confirmAll', { count: allOutdated.length })}\\n${t('outdated_upgradeAllList', { list: allOutdated.map(p => p.name).join(', ') })}`\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 ? upgradeAllMessage\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 <ResultBanner status=\"success\" message={`\\u2714 ${t('outdated_upToDate')}`} />\n </Box>\n )}\n\n {allOutdated.length > 0 && !confirmAction && (\n <Box flexDirection=\"column\" marginTop={1}>\n {start > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreAbove', { count: start })}</Text>\n )}\n {visible.map((pkg, i) => {\n const idx = start + i;\n const isCurrent = idx === cursor;\n return (\n <SelectableRow key={pkg.name} isCurrent={isCurrent}>\n <Text bold={isCurrent} inverse={isCurrent} color={isCurrent ? COLORS.text : COLORS.muted}>\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 </SelectableRow>\n );\n })}\n {start + MAX_VISIBLE_ROWS < allOutdated.length && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: allOutdated.length - start - MAX_VISIBLE_ROWS })}</Text>\n )}\n\n <Box marginTop={1}>\n <Text color={COLORS.text} 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 { COLORS } from '../utils/colors.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 packageType = useNavigationStore((s) => s.selectedPackageType);\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\n // SCR-008: Try cask-specific info if we know it's a cask\n const fetchInfo = async () => {\n if (packageType === 'cask') {\n // Try cask first, fall back to formula\n const caskInfo = await api.getCaskInfo(packageName);\n if (caskInfo && mountedRef.current) {\n // Convert cask to a formula-like shape for display\n const formulaLike: Formula = {\n name: caskInfo.token,\n full_name: caskInfo.full_token,\n tap: '',\n desc: caskInfo.desc,\n license: '',\n homepage: caskInfo.homepage,\n versions: { stable: caskInfo.version, head: null, bottle: false },\n dependencies: [],\n build_dependencies: [],\n installed: caskInfo.installed ? [{\n version: caskInfo.installed,\n used_options: [],\n built_as_bottle: false,\n poured_from_bottle: false,\n time: caskInfo.installed_time ?? 0,\n runtime_dependencies: [],\n installed_as_dependency: false,\n installed_on_request: true,\n }] : [],\n linked_keg: null,\n pinned: false,\n outdated: caskInfo.outdated,\n deprecated: false,\n keg_only: false,\n caveats: null,\n };\n setFormula(formulaLike);\n setLoading(false);\n return;\n }\n }\n // Default: try formula info\n const f = await api.getFormulaInfo(packageName);\n if (mountedRef.current) { setFormula(f); setLoading(false); }\n };\n\n fetchInfo().catch((err) => {\n if (mountedRef.current) { setError(err.message); setLoading(false); }\n });\n }, [packageName, packageType]);\n\n useEffect(() => {\n if (!stream.isRunning && !stream.error && stream.lines.length > 0 && !hasRefreshed.current && packageName) {\n hasRefreshed.current = true;\n const refreshFn = packageType === 'cask'\n ? api.getCaskInfo(packageName).then((c) => c ? { ...c, installed: c.installed ? [{ version: c.installed }] : [] } as unknown as import('../lib/types.js').Formula : null)\n : api.getFormulaInfo(packageName);\n refreshFn\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={COLORS.textSecondary} 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={COLORS.textSecondary}>esc:{t('hint_cancel')}</Text>\n )}\n {!stream.isRunning && (\n <>\n <Text color={stream.error ? COLORS.error : COLORS.success} bold>\n {stream.error ? `\\u2718 ${stream.error}` : `\\u2714 ${t('pkgInfo_done')}`}\n </Text>\n <Text color={COLORS.textSecondary}>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={COLORS.teal}>{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={[COLORS.text, COLORS.muted]} />\n <Box borderStyle=\"round\" borderColor={COLORS.border} paddingX={2} flexDirection=\"column\">\n <Text><Text color={COLORS.muted}>{t('pkgInfo_homepage')}</Text> {formula.homepage}</Text>\n <Text><Text color={COLORS.muted}>{t('pkgInfo_license')}</Text> {formula.license}</Text>\n <Text><Text color={COLORS.muted}>{t('pkgInfo_tap')}</Text> {formula.tap}</Text>\n <Text><Text color={COLORS.muted}>{t('pkgInfo_stable')}</Text> {formula.versions.stable}</Text>\n {installed && (\n <>\n <Text><Text color={COLORS.muted}>{t('pkgInfo_installed')}</Text> {installed.version} ({formatRelativeTime(installed.time)})</Text>\n <Text><Text color={COLORS.muted}>{t('pkgInfo_bottle')}</Text> {installed.poured_from_bottle ? t('common_yes') : t('common_no')}</Text>\n <Text><Text color={COLORS.muted}>{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={COLORS.muted}>{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={COLORS.warning} />\n <Box borderStyle=\"round\" borderColor={COLORS.warning} paddingX={2}>\n <Text color={COLORS.warning}>{formula.caveats}</Text>\n </Box>\n </Box>\n )}\n </Box>\n\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>\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, useStdout } 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 { SelectableRow } from '../components/common/selectable-row.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\n\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 // SCR-014: Persist last error until explicitly cleared\n const [lastError, setLastError] = useState<string | null>(null);\n const { stdout } = useStdout();\n const cols = stdout?.columns ?? 80;\n const svcNameWidth = Math.floor(cols * 0.35);\n const svcStatusWidth = Math.floor(cols * 0.15);\n const MAX_VISIBLE_ROWS = Math.max(5, (stdout?.rows ?? 24) - 10);\n\n useEffect(() => { fetchServices(); }, []);\n\n useInput((input, key) => {\n if (actionInProgress) return;\n if (confirmAction) return;\n\n // Clear last error on any key press\n if (lastError) { setLastError(null); }\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)\n .catch((err) => {\n setLastError(err instanceof Error ? err.message : String(err));\n })\n .finally(() => {\n setActionInProgress(false);\n // SCR-014: Check store for errors after action\n const storeError = useBrewStore.getState().errors['service-action'];\n if (storeError) setLastError(storeError);\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={COLORS.textSecondary} italic>{t('services_noServices')}</Text>\n </Box>\n );\n }\n\n const start = Math.max(0, cursor - Math.floor(MAX_VISIBLE_ROWS / 2));\n const visible = services.slice(start, start + MAX_VISIBLE_ROWS);\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)\n .catch((err) => {\n setLastError(err instanceof Error ? err.message : String(err));\n })\n .finally(() => {\n setActionInProgress(false);\n const storeError = useBrewStore.getState().errors['service-action'];\n if (storeError) setLastError(storeError);\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={COLORS.border} paddingBottom={0}>\n <Text bold color={COLORS.text}>{' '}{t('services_name').padEnd(svcNameWidth)}</Text>\n <Text bold color={COLORS.text}>{t('services_status').padEnd(svcStatusWidth)}</Text>\n <Text bold color={COLORS.text}>{t('services_user')}</Text>\n </Box>\n\n {start > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreAbove', { count: start })}</Text>\n )}\n\n {visible.map((svc, i) => {\n const idx = start + i;\n const isCurrent = idx === cursor;\n return (\n <SelectableRow key={svc.name} isCurrent={isCurrent}>\n <Text bold={isCurrent} inverse={isCurrent} color={isCurrent ? COLORS.text : COLORS.muted}>\n {svc.name.padEnd(svcNameWidth - 2)}\n </Text>\n <StatusBadge label={svc.status} variant={STATUS_VARIANTS[svc.status]} />\n <Text color={COLORS.muted}>{svc.user ?? '-'}</Text>\n {svc.exit_code != null && svc.exit_code !== 0 && (\n <Text color={COLORS.error}>{t('common_exit', { code: svc.exit_code })}</Text>\n )}\n </SelectableRow>\n );\n })}\n\n {start + MAX_VISIBLE_ROWS < services.length && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: services.length - start - MAX_VISIBLE_ROWS })}</Text>\n )}\n </Box>\n\n {actionInProgress && <Text color={COLORS.sky}>{t('services_processing')}</Text>}\n\n {/* SCR-014: Persistent error display */}\n {lastError && (\n <Box marginTop={1}>\n <Text color={COLORS.error}>{lastError}</Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color={COLORS.text} bold>\n {cursor + 1}/{services.length}\n </Text>\n </Box>\n </Box>\n );\n}\n","import React, { useEffect, useRef } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { useBrewStore } from '../stores/brew-store.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { COLORS } from '../utils/colors.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 // FE-006: Mounted ref for cleanup\n const mountedRef = useRef(true);\n useEffect(() => {\n mountedRef.current = true;\n return () => { mountedRef.current = false; };\n }, []);\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 <ResultBanner status=\"success\" message={`\\u2714 ${t('doctor_clean')}`} />\n )}\n\n {doctorClean === false && doctorWarnings.length === 0 && (\n <Text color={COLORS.warning}>{t('doctor_warningsNotCaptured')}</Text>\n )}\n\n {doctorWarnings.map((warning, i) => (\n // FE-004: Improved React key\n <Box key={`warning-${i}-${warning.slice(0, 20)}`} flexDirection=\"column\" marginBottom={1} borderStyle=\"single\" borderColor={COLORS.warning} paddingX={1}>\n {warning.split('\\n').map((line, j) => (\n <Text key={`warning-${i}-${j}-${line.slice(0, 20)}`} color={j === 0 ? COLORS.warning : COLORS.muted}>{line}</Text>\n ))}\n </Box>\n ))}\n </Box>\n\n <Box marginTop={1}>\n <Text color={COLORS.text} 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, useInput } from 'ink';\nimport { useProfileStore } from '../stores/profile-store.js';\nimport { useLicenseStore } from '../stores/license-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 { ResultBanner } from '../components/common/result-banner.js';\nimport { t } from '../i18n/index.js';\nimport { useModalStore } from '../stores/modal-store.js';\nimport * as manager from '../lib/profiles/profile-manager.js';\nimport { ProfileListMode } from './profiles/profile-list-mode.js';\nimport { ProfileDetailMode } from './profiles/profile-detail-mode.js';\nimport { ProfileCreateName, ProfileCreateDesc } from './profiles/profile-create-flow.js';\nimport { ProfileEditName, ProfileEditDesc } from './profiles/profile-edit-flow.js';\n\ntype Mode = 'list' | 'detail' | 'create-name' | 'create-desc' | 'confirm-import' | '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 [importHadError, setImportHadError] = useState(false);\n const [importProfile, setImportProfile] = useState<Awaited<ReturnType<typeof manager.loadProfile>> | null>(null);\n const { openModal, closeModal } = useModalStore();\n const importGenRef = useRef<AsyncGenerator<string> | null>(null);\n const mountedRef = useRef(true);\n\n useEffect(() => { fetchProfiles(); }, []);\n\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 useEffect(() => {\n if (mode !== 'list') {\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 prepareImport(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 useInput(() => {\n setMode('list');\n }, { isActive: mode === 'importing' && !importRunning });\n\n // SCR-005: Show import summary before starting\n const prepareImport = async (name: string) => {\n try {\n const isPro = useLicenseStore.getState().isPro();\n const profile = await manager.loadProfile(isPro, name);\n setImportProfile(profile);\n setMode('confirm-import');\n } catch (err) {\n setImportLines([`${t('error_prefix')}${err instanceof Error ? err.message : err}`]);\n setMode('importing');\n setImportRunning(false);\n }\n };\n\n const startImport = async (profile: Awaited<ReturnType<typeof manager.loadProfile>>) => {\n setMode('importing');\n setImportLines([]);\n setImportRunning(true);\n setImportHadError(false);\n try {\n const isPro = useLicenseStore.getState().isPro();\n const gen = manager.importProfile(isPro, 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 setImportHadError(true);\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 === 'confirm-import' && importProfile) {\n return (\n <Box flexDirection=\"column\">\n <ConfirmDialog\n message={t('profiles_importSummary', {\n formulae: String(importProfile.formulae.length),\n casks: String(importProfile.casks.length),\n })}\n onConfirm={() => {\n const profile = importProfile;\n setImportProfile(null);\n void startImport(profile);\n }}\n onCancel={() => {\n setImportProfile(null);\n setMode('list');\n }}\n />\n </Box>\n );\n }\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 <ResultBanner status={importHadError ? 'error' : 'success'} message={importHadError ? t('profiles_importPartial') : `\\u2714 ${t('profiles_importComplete')}`} />\n </Box>\n )}\n </Box>\n );\n }\n\n if (mode === 'create-name') {\n return <ProfileCreateName onSubmit={(val) => { setNewName(val); setMode('create-desc'); }} />;\n }\n\n if (mode === 'create-desc') {\n return (\n <ProfileCreateDesc\n name={newName}\n loadError={loadError}\n onSubmit={async (val) => {\n try {\n await exportCurrent(newName, val);\n } finally {\n setMode('list');\n setNewName('');\n }\n }}\n />\n );\n }\n\n if (mode === 'edit-name') {\n return <ProfileEditName defaultName={editName} onSubmit={(val) => { setEditName(val); setMode('edit-desc'); }} />;\n }\n\n if (mode === 'edit-desc') {\n return (\n <ProfileEditDesc\n name={editName}\n defaultDesc={editDesc}\n loadError={loadError}\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 );\n }\n\n if (mode === 'detail' && selectedProfile) {\n return <ProfileDetailMode profile={selectedProfile} />;\n }\n\n return (\n <ProfileListMode\n profileNames={profileNames}\n cursor={cursor}\n confirmDelete={confirmDelete}\n loadError={loadError}\n onConfirmDelete={() => { void deleteProfile(profileNames[cursor]); setConfirmDelete(false); }}\n onCancelDelete={() => setConfirmDelete(false)}\n />\n );\n}\n","import { create } from 'zustand';\nimport type { Profile } from '../lib/profiles/types.js';\nimport * as manager from '../lib/profiles/profile-manager.js';\nimport { useLicenseStore } from './license-store.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\nfunction getIsPro(): boolean {\n return useLicenseStore.getState().isPro();\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(getIsPro());\n set({ profileNames: names, loading: false });\n },\n\n loadProfile: async (name) => {\n set({ loadError: null });\n try {\n const profile = await manager.loadProfile(getIsPro(), 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 const license = useLicenseStore.getState().license;\n await manager.exportCurrentSetup(getIsPro(), name, description, license);\n const names = await manager.listProfiles(getIsPro());\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(getIsPro(), name);\n const names = await manager.listProfiles(getIsPro());\n set({ profileNames: names, selectedProfile: null });\n },\n\n updateProfile: async (oldName, newName, newDescription) => {\n set({ loadError: null });\n try {\n await manager.updateProfile(getIsPro(), oldName, newName, newDescription);\n const names = await manager.listProfiles(getIsPro());\n const updated = await manager.loadProfile(getIsPro(), 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, rename } 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 { getWatermark } from '../license/watermark.js';\nimport type { LicenseData } from '../license/types.js';\nimport type { Profile, ProfileFile } from './types.js';\n\nfunction proCheck(isPro: boolean): void {\n if (!isPro) throw new Error('Pro license required');\n}\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(isPro: boolean): Promise<string[]> {\n proCheck(isPro);\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(isPro: boolean, name: string): Promise<Profile> {\n proCheck(isPro);\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.version !== 1) {\n // Future: add migration logic here\n throw new Error('Unsupported data version');\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(isPro: boolean, profile: Profile): Promise<void> {\n proCheck(isPro);\n await ensureDataDirs();\n\n // BK-002: Atomic write via temp file + rename\n const filePath = profilePath(profile.name);\n const tmpPath = filePath + '.tmp';\n const file: ProfileFile = { version: 1, profile };\n await writeFile(tmpPath, JSON.stringify(file, null, 2), { encoding: 'utf-8', mode: 0o600 });\n await rename(tmpPath, filePath);\n}\n\nexport async function deleteProfile(isPro: boolean, name: string): Promise<void> {\n proCheck(isPro);\n try {\n await rm(profilePath(name));\n } catch { /* may not exist */ }\n}\n\nexport async function exportCurrentSetup(isPro: boolean, name: string, description: string, license: LicenseData | null = null, consent = true): Promise<Profile> {\n proCheck(isPro);\n\n // BK-007: Check if profile already exists\n const existingNames = await listProfiles(isPro);\n if (existingNames.includes(name)) {\n throw new Error('Profile already exists: ' + name);\n }\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: consent ? getWatermark(license) : '', // SEG-003: Only embed watermark with consent\n };\n\n await saveProfile(isPro, profile);\n return profile;\n}\n\nexport async function updateProfile(isPro: boolean, oldName: string, newName: string, newDescription: string): Promise<void> {\n proCheck(isPro);\n const profile = await loadProfile(isPro, oldName);\n if (oldName !== newName) {\n await deleteProfile(isPro, oldName);\n }\n const updated: Profile = {\n ...profile,\n name: newName,\n description: newDescription,\n updatedAt: new Date().toISOString(),\n };\n await saveProfile(isPro, updated);\n}\n\n// Validation patterns for brew package/tap names to prevent command injection\nconst TAP_PATTERN = /^[a-z0-9][-a-z0-9]*\\/[a-z0-9][-a-z0-9]*$/;\nconst PKG_PATTERN = /^[a-z0-9][-a-z0-9_.@+]*$/;\n\nexport async function* importProfile(isPro: boolean, profile: Profile): AsyncGenerator<string> {\n proCheck(isPro);\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 (validated)\n for (const tap of profile.taps) {\n if (!TAP_PATTERN.test(tap)) {\n yield `Skipping invalid tap name: ${tap}`;\n continue;\n }\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 (validated)\n const missingFormulae = profile.formulae.filter((f) => !installedFormulae.has(f));\n for (const name of missingFormulae) {\n if (!PKG_PATTERN.test(name)) {\n yield `Skipping invalid formula name: ${name}`;\n continue;\n }\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 (validated)\n const missingCasks = profile.casks.filter((c) => !installedCasks.has(c));\n for (const name of missingCasks) {\n if (!PKG_PATTERN.test(name)) {\n yield `Skipping invalid cask name: ${name}`;\n continue;\n }\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 type { LicenseData } from './types.js';\n\n/**\n * Get a watermark string containing the license holder's email.\n * Used subtly in Pro feature output for traceability.\n *\n * SEG-003: The `consent` parameter controls whether the watermark is embedded.\n * If false or undefined, returns an empty string.\n */\nexport function getWatermark(license: LicenseData | null, consent = true): string {\n if (!consent) return '';\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 from 'react';\nimport { Box, Text } from 'ink';\nimport { ConfirmDialog } from '../../components/common/confirm-dialog.js';\nimport { SectionHeader } from '../../components/common/section-header.js';\nimport { COLORS } from '../../utils/colors.js';\nimport { SelectableRow } from '../../components/common/selectable-row.js';\nimport { GRADIENTS } from '../../utils/gradient.js';\nimport { t } from '../../i18n/index.js';\n\ninterface ProfileListModeProps {\n profileNames: string[];\n cursor: number;\n confirmDelete: boolean;\n loadError: string | null;\n onConfirmDelete: () => void;\n onCancelDelete: () => void;\n}\n\nexport function ProfileListMode({ profileNames, cursor, confirmDelete, loadError, onConfirmDelete, onCancelDelete }: ProfileListModeProps) {\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u{1F4C1}'} title={t('profiles_title', { count: profileNames.length })} gradient={GRADIENTS.gold} />\n\n {/* SCR-004: Display load errors */}\n {loadError && (\n <Box marginY={1}>\n <Text color={COLORS.error}>{loadError}</Text>\n </Box>\n )}\n\n {confirmDelete && profileNames[cursor] && (\n <Box marginY={1}>\n <ConfirmDialog\n message={t('profiles_confirmDelete', { name: profileNames[cursor] })}\n onConfirm={onConfirmDelete}\n onCancel={onCancelDelete}\n />\n </Box>\n )}\n\n {profileNames.length === 0 && !confirmDelete && (\n <Box marginTop={1} borderStyle=\"round\" borderColor={COLORS.textSecondary} paddingX={2} paddingY={0}>\n <Box flexDirection=\"column\">\n <Text color={COLORS.textSecondary} italic>{t('profiles_noProfiles')}</Text>\n <Text color={COLORS.muted}>{t('profiles_press')} <Text color={COLORS.gold} 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 <SelectableRow key={name} isCurrent={isCurrent}>\n <Text bold={isCurrent} inverse={isCurrent}>{name}</Text>\n </SelectableRow>\n );\n })}\n <Box marginTop={1}>\n <Text color={COLORS.text} bold>{cursor + 1}/{profileNames.length}</Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\nimport { t } from '../../i18n/index.js';\nimport { formatDate } from '../../utils/format.js';\nimport type { Profile } from '../../lib/profiles/types.js';\n\ninterface ProfileDetailModeProps {\n profile: Profile;\n}\n\nexport function ProfileDetailMode({ profile }: ProfileDetailModeProps) {\n return (\n <Box flexDirection=\"column\">\n <Text bold color={COLORS.gold}>{profile.name}</Text>\n <Text color={COLORS.muted}>{profile.description}</Text>\n <Text color={COLORS.muted}>{t('profiles_created', { date: formatDate(profile.createdAt) })}</Text>\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>{t('profiles_formulaeCount', { count: profile.formulae.length })}</Text>\n <Box paddingLeft={2} flexDirection=\"column\">\n {profile.formulae.slice(0, 30).map((f) => (\n <Text key={f} color={COLORS.muted}>{f}</Text>\n ))}\n {profile.formulae.length > 30 && (\n <Text color={COLORS.textSecondary} italic>{t('common_andMore', { count: profile.formulae.length - 30 })}</Text>\n )}\n </Box>\n <Text bold>{t('profiles_casksCount', { count: profile.casks.length })}</Text>\n <Box paddingLeft={2} flexDirection=\"column\">\n {profile.casks.map((c) => (\n <Text key={c} color={COLORS.muted}>{c}</Text>\n ))}\n </Box>\n </Box>\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>esc:{t('hint_back')} e:{t('hint_edit')} i:{t('hint_importProfile')}</Text>\n </Box>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { TextInput } from '@inkjs/ui';\nimport { COLORS } from '../../utils/colors.js';\nimport { t } from '../../i18n/index.js';\n\ninterface ProfileCreateNameProps {\n onSubmit: (name: string) => void;\n}\n\nexport function ProfileCreateName({ onSubmit }: ProfileCreateNameProps) {\n return (\n <Box flexDirection=\"column\">\n <Text bold>{t('profiles_createName')}</Text>\n <TextInput\n placeholder={t('profiles_namePlaceholder')}\n onSubmit={onSubmit}\n />\n </Box>\n );\n}\n\ninterface ProfileCreateDescProps {\n name: string;\n loadError: string | null;\n onSubmit: (desc: string) => void;\n}\n\nexport function ProfileCreateDesc({ name, loadError, onSubmit }: ProfileCreateDescProps) {\n return (\n <Box flexDirection=\"column\">\n <Text bold>{t('profiles_createDesc', { name })}</Text>\n {loadError && <Text color={COLORS.error}>{t('error_prefix')}{loadError}</Text>}\n <TextInput\n placeholder={t('profiles_descPlaceholder')}\n onSubmit={onSubmit}\n />\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { TextInput } from '@inkjs/ui';\nimport { COLORS } from '../../utils/colors.js';\nimport { t } from '../../i18n/index.js';\n\ninterface ProfileEditNameProps {\n defaultName: string;\n onSubmit: (name: string) => void;\n}\n\nexport function ProfileEditName({ defaultName, onSubmit }: ProfileEditNameProps) {\n return (\n <Box flexDirection=\"column\">\n <Text bold>{t('profiles_editName')}</Text>\n <TextInput\n defaultValue={defaultName}\n onSubmit={onSubmit}\n />\n </Box>\n );\n}\n\ninterface ProfileEditDescProps {\n name: string;\n defaultDesc: string;\n loadError: string | null;\n onSubmit: (desc: string) => void;\n}\n\nexport function ProfileEditDesc({ name, defaultDesc, loadError, onSubmit }: ProfileEditDescProps) {\n return (\n <Box flexDirection=\"column\">\n <Text bold>{t('profiles_editDesc', { name })}</Text>\n {loadError && <Text color={COLORS.error}>{t('error_prefix')}{loadError}</Text>}\n <TextInput\n defaultValue={defaultDesc}\n onSubmit={onSubmit}\n />\n </Box>\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 { ResultBanner } from '../components/common/result-banner.js';\nimport { StatCard } from '../components/common/stat-card.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { COLORS } from '../utils/colors.js';\nimport { SelectableRow } from '../components/common/selectable-row.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={COLORS.muted}>esc:{t('hint_cancel')}</Text>\n )}\n\n {!stream.isRunning && !stream.error && (\n <ResultBanner status=\"success\" message={`\\u2714 ${t('cleanup_complete')}`} />\n )}\n\n {!stream.isRunning && stream.error && (\n <Box flexDirection=\"column\" gap={1}>\n <ResultBanner status=\"error\" message={`\\u2718 ${t('cleanup_depError')}`} />\n {isDependencyError && failedNames.length > 0 && (\n <Text color={COLORS.warning}>\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 ? COLORS.warning : COLORS.success} />\n <StatCard label={t('cleanup_reclaimable')} value={summary.totalReclaimableFormatted} color={COLORS.sky} />\n <StatCard label={t('cleanup_selected')} value={selected.size} color={selected.size > 0 ? COLORS.success : COLORS.muted} />\n </Box>\n )}\n\n {/* SCR-001: Two-step confirmation with system tools warning */}\n {confirmClean && (\n <Box flexDirection=\"column\" marginY={1} gap={1}>\n <Box borderStyle=\"round\" borderColor={COLORS.warning} paddingX={2} paddingY={0}>\n <Text color={COLORS.warning}>{t('cleanup_warning_system_tools')}</Text>\n </Box>\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 <ResultBanner status=\"success\" message={`\\u2714 ${t('cleanup_systemClean')}`} />\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 <SelectableRow key={c.name} isCurrent={isCurrent}>\n <Text color={isSelected ? COLORS.success : COLORS.muted}>{isSelected ? '\\u2611' : '\\u2610'}</Text>\n <Text bold={isCurrent} inverse={isCurrent} color={isCurrent ? COLORS.text : COLORS.muted}>{c.name}</Text>\n <Text color={COLORS.warning}>{c.diskUsageFormatted}</Text>\n <Text color={COLORS.textSecondary}>[{c.reason}]</Text>\n </SelectableRow>\n );\n })}\n <Box marginTop={1}>\n <Text color={COLORS.text} 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';\nimport { useLicenseStore } from './license-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 isPro = useLicenseStore.getState().isPro();\n const summary = await analyzeCleanup(isPro, 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 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 isPro: boolean,\n formulae: Formula[],\n leaves: string[],\n): Promise<CleanupSummary> {\n if (!isPro) throw new Error('Pro license required');\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, useStdout } 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 { SelectableRow } from '../components/common/selectable-row.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 { COLORS } from '../utils/colors.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: COLORS.success },\n uninstall: { icon: '-', color: COLORS.error },\n upgrade: { icon: '\\u2191', color: COLORS.info },\n 'upgrade-all': { icon: '\\u21C8', color: COLORS.info },\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 { stdout } = useStdout();\n const MAX_VISIBLE_ROWS = Math.max(5, (stdout?.rows ?? 24) - 8);\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' ? COLORS.text : COLORS.gold}>\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('upgrade_all_warning')\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={COLORS.textSecondary} 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={COLORS.textSecondary} 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 <SelectableRow key={entry.id} isCurrent={isCurrent}>\n <Text color={color} bold>{icon}</Text>\n <Text bold={isCurrent} inverse={isCurrent} color={isCurrent ? COLORS.text : COLORS.muted}>\n {t(ACTION_LABEL_KEYS[entry.action]).padEnd(12)}\n </Text>\n <Text color={COLORS.text}>{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={COLORS.muted}>{formatRelativeTime(ts)}</Text>\n </SelectableRow>\n );\n })}\n {start + MAX_VISIBLE_ROWS < filtered.length && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: filtered.length - start - MAX_VISIBLE_ROWS })}</Text>\n )}\n\n <Box marginTop={1}>\n <Text color={COLORS.text} 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 historyLogger from '../lib/history/history-logger.js';\nimport { useLicenseStore } from './license-store.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 isPro = useLicenseStore.getState().isPro();\n const entries = await historyLogger.loadHistory(isPro);\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 const isPro = useLicenseStore.getState().isPro();\n await historyLogger.appendEntry(isPro, action, packageName, success, error);\n const entries = await historyLogger.loadHistory(isPro);\n set({ entries });\n },\n\n clearHistory: async () => {\n const isPro = useLicenseStore.getState().isPro();\n await historyLogger.clearHistory(isPro);\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 { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { COLORS } from '../utils/colors.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t, tp } from '../i18n/index.js';\nimport { formatRelativeTime } from '../utils/format.js';\nimport type { Severity } from '../lib/security/types.js';\n\nconst SEVERITY_COLORS: Record<Severity, string> = {\n CRITICAL: COLORS.error,\n HIGH: COLORS.error,\n MEDIUM: COLORS.warning,\n LOW: COLORS.textSecondary,\n UNKNOWN: COLORS.textSecondary,\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\n// SCR-017: Detect network-related errors\nfunction isNetworkError(msg: string): boolean {\n return /fetch failed|ECONNREFUSED|ENOTFOUND|ETIMEDOUT|network|abort/i.test(msg);\n}\n\nexport function SecurityAuditView() {\n const { summary, loading, error, scan, cachedAt } = 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 // ARQ-005: Manual refresh forces cache invalidation\n if (input === 'r') { void scan(true); 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\n // SCR-017: Show user-friendly message for network errors\n if (error) {\n const displayError = isNetworkError(error) ? t('security_networkError') : error;\n return <ErrorMessage message={displayError} />;\n }\n\n // ARQ-005: Show cache indicator\n const cacheAge = cachedAt ? formatRelativeTime(cachedAt / 1000) : null;\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={COLORS.info} />\n <StatCard\n label={t('security_vulnerable')}\n value={summary.vulnerablePackages}\n color={summary.vulnerablePackages > 0 ? COLORS.error : COLORS.success}\n />\n {summary.criticalCount > 0 && <StatCard label={t('security_critical')} value={summary.criticalCount} color={COLORS.error} />}\n {summary.highCount > 0 && <StatCard label={t('security_high')} value={summary.highCount} color={COLORS.error} />}\n {summary.mediumCount > 0 && <StatCard label={t('security_medium')} value={summary.mediumCount} color={COLORS.warning} />}\n </Box>\n )}\n\n {/* ARQ-005: Cache indicator */}\n {cacheAge && (\n <Text color={COLORS.muted}>{t('security_cachedResults', { time: cacheAge })}</Text>\n )}\n\n {results.length === 0 && summary && (\n <Box marginTop={1}>\n <ResultBanner status=\"success\" message={`\\u2714 ${t('security_noVulns')}`} />\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(true);\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 <SelectableRow isCurrent={isCurrent}>\n <StatusBadge label={pkg.maxSeverity} variant={SEVERITY_BADGE[pkg.maxSeverity]} />\n <Text bold={isCurrent} inverse={isCurrent} color={isCurrent ? COLORS.text : COLORS.muted}>\n {pkg.packageName}\n </Text>\n <Text color={COLORS.muted}>{pkg.installedVersion}</Text>\n <Text color={COLORS.muted}>{tp('plural_vulns', pkg.vulnerabilities.length)}</Text>\n <Text color={COLORS.muted}>{isExpanded ? '\\u25BC' : '\\u25B6'}</Text>\n </SelectableRow>\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={COLORS.muted}>[{vuln.severity}]</Text>\n </Box>\n <Text color={COLORS.muted} wrap=\"wrap\">{vuln.summary}</Text>\n {vuln.fixedVersion && (\n <Text color={COLORS.success}>{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={COLORS.text} 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';\nimport { useLicenseStore } from './license-store.js';\n\nconst CACHE_TTL_MS = 30 * 60 * 1000; // 30 minutes\n\ninterface SecurityState {\n summary: SecurityAuditSummary | null;\n loading: boolean;\n error: string | null;\n cachedAt: number | null;\n\n scan: (forceRefresh?: boolean) => Promise<void>;\n}\n\nexport const useSecurityStore = create<SecurityState>((set, get) => ({\n summary: null,\n loading: false,\n error: null,\n cachedAt: null,\n\n scan: async (forceRefresh = false) => {\n // ARQ-005: Use cached results if available and fresh\n const { summary, cachedAt } = get();\n if (!forceRefresh && summary && cachedAt && Date.now() - cachedAt < CACHE_TTL_MS) {\n return;\n }\n\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 isPro = useLicenseStore.getState().isPro();\n const result = await runSecurityAudit(isPro, formulae, casks);\n set({ summary: result, loading: false, cachedAt: Date.now() });\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';\nimport { fetchWithTimeout } from '../fetch-timeout.js';\nimport { logger } from '../../utils/logger.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 fetchWithTimeout(OSV_BATCH_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ queries }),\n }, 15_000);\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\n // EP-003: Validate response structure\n if (!data || !Array.isArray(data.results)) {\n throw new Error('Invalid OSV API response: missing results array');\n }\n if (data.results.length !== packages.length) {\n throw new Error(`OSV API response mismatch: expected ${packages.length} results, got ${data.results.length}`);\n }\n\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 const errors: string[] = [];\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 (err) {\n // EP-004: Only skip on 400 (bad request for that package). Re-throw on 5xx or network errors.\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('400')) {\n errors.push(`Skipped ${pkg.name}: ${msg}`);\n continue;\n }\n // For rate limiting (429), apply backoff\n if (msg.includes('429')) {\n logger.warn(`Rate limited by OSV API, backing off`, { package: pkg.name });\n await new Promise(r => setTimeout(r, 2000));\n // Retry once after backoff\n try {\n const retryResult = await queryBatch(\n [pkg],\n [{ package: { name: pkg.name, ecosystem: 'Homebrew' }, version: pkg.version }],\n );\n for (const [k, v] of retryResult) result.set(k, v);\n } catch {\n errors.push(`Failed after retry ${pkg.name}: ${msg}`);\n }\n continue;\n }\n // Network/server errors: log and continue instead of failing entire scan\n logger.error(`OSV query failed for ${pkg.name}: ${msg}`);\n errors.push(`${pkg.name}: ${msg}`);\n }\n\n // EP-008: Rate limit protection — small delay between individual requests\n await new Promise(r => setTimeout(r, 75));\n }\n\n if (errors.length > 0) {\n logger.warn(`OSV query errors for ${errors.length} packages`, { errors: errors.slice(0, 5) });\n }\n\n return result;\n}\n\nexport async function queryVulnerabilities(\n packages: Array<{ name: string; version: string }>,\n): Promise<Map<string, Vulnerability[]>> {\n // EP-007: Filter out packages with empty/undefined/null versions\n const validPackages = packages.filter(\n (p) => p.version && typeof p.version === 'string' && p.version.trim().length > 0,\n );\n\n const result = new Map<string, Vulnerability[]>();\n\n // Split into batches to stay within OSV API limits\n for (let i = 0; i < validPackages.length; i += BATCH_SIZE) {\n const batch = validPackages.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 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 isPro: boolean,\n formulae: Formula[],\n casks: Cask[],\n): Promise<SecurityAuditSummary> {\n if (!isPro) throw new Error('Pro license required');\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 { TextInput } from '@inkjs/ui';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { Loading } from '../components/common/loading.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nimport { formatDate } from '../utils/format.js';\nimport { redeemPromoCode } from '../lib/license/promo.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 const [deactivateError, setDeactivateError] = useState<string | null>(null);\n const [promoMode, setPromoMode] = useState(false);\n const [promoLoading, setPromoLoading] = useState(false);\n const [promoResult, setPromoResult] = useState<{ success: boolean; message: string } | null>(null);\n\n useInput((input, key) => {\n if (confirmDeactivate || deactivating || promoMode) {\n if (key.escape && promoMode) {\n setPromoMode(false);\n setPromoResult(null);\n }\n return;\n }\n\n if (input === 'd' && status === 'pro') {\n setConfirmDeactivate(true);\n }\n if (input === 'p') {\n setPromoMode(true);\n setPromoResult(null);\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 if (status === 'validating') {\n return <Loading message={t('account_loading')} />;\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 setDeactivateError(null);\n try {\n await deactivate();\n } catch (err) {\n // SCR-007: Display deactivation errors\n setDeactivateError(t('deactivate_failed') + ': ' + String(err));\n } finally {\n setDeactivating(false);\n }\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={COLORS.muted}>{t('account_statusLabel')}</Text>\n {status === 'pro' && <Text color={COLORS.success} bold>{t('account_pro')}</Text>}\n {status === 'free' && <Text color={COLORS.muted}>{t('account_free')}</Text>}\n {status === 'expired' && <Text color={COLORS.error}>{t('account_expired')}</Text>}\n </Box>\n\n {(degradation === 'warning' || degradation === 'limited') && license && (\n <Box marginTop={1} borderStyle=\"round\" borderColor={COLORS.warning} paddingX={2} paddingY={0}>\n <Text color={COLORS.warning}>\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={COLORS.muted}>{t('account_emailLabel')}</Text>\n <Text>{license.customerEmail}</Text>\n </Box>\n <Box gap={1}>\n <Text color={COLORS.muted}>{t('account_nameLabel')}</Text>\n <Text>{license.customerName}</Text>\n </Box>\n <Box gap={1}>\n <Text color={COLORS.muted}>{t('account_planLabel')}</Text>\n <Text color={COLORS.success} bold>Pro</Text>\n </Box>\n <Box gap={1}>\n <Text color={COLORS.muted}>{t('account_keyLabel')}</Text>\n <Text>{maskKey(license.key)}</Text>\n </Box>\n {license.expiresAt && (\n <Box gap={1}>\n <Text color={COLORS.muted}>{t('account_expiresLabel')}</Text>\n <Text>{formatDate(license.expiresAt)}</Text>\n </Box>\n )}\n <Box gap={1}>\n <Text color={COLORS.muted}>{t('account_activatedLabel')}</Text>\n <Text>{formatDate(license.activatedAt)}</Text>\n </Box>\n </>\n )}\n\n {status === 'free' && (\n <Box flexDirection=\"column\" marginTop={2} borderStyle=\"round\" borderColor={COLORS.brand} paddingX={2} paddingY={1}>\n <Text bold color={COLORS.brand}>{'\\u2B50'} {t('account_upgradeTitle')}</Text>\n <Text> </Text>\n <Text>{t('account_unlockDesc')}</Text>\n <Text color={COLORS.info} bold>{t('account_pricing')}</Text>\n <Text> </Text>\n <Text color={COLORS.muted}>{t('upgrade_buyAt')} <Text color={COLORS.sky} bold>{t('upgrade_buyUrl')}</Text></Text>\n <Text color={COLORS.muted}>{t('account_runActivate')} <Text color={COLORS.success} bold>{t('account_activateCmd')}</Text></Text>\n </Box>\n )}\n\n {status === 'expired' && (\n <Box marginTop={1}>\n <Box borderStyle=\"round\" borderColor={COLORS.error} paddingX={2} paddingY={0}>\n <Text color={COLORS.error}>{t('account_licenseExpired')}</Text>\n </Box>\n </Box>\n )}\n\n {deactivating && <Text color={COLORS.sky}>{t('account_deactivating')}</Text>}\n {deactivateError && <Text color={COLORS.error}>{deactivateError}</Text>}\n </Box>\n\n {/* Promo code section */}\n <Box flexDirection=\"column\" marginTop={1} paddingLeft={2}>\n {promoMode ? (\n <Box flexDirection=\"column\" gap={1}>\n <Text bold color={COLORS.gold}>{t('account_promoTitle')}</Text>\n {promoLoading ? (\n <Text color={COLORS.sky}>{t('account_promoValidating')}</Text>\n ) : (\n <Box gap={1}>\n <Text color={COLORS.muted}>{t('account_promoLabel')}</Text>\n <TextInput\n defaultValue=\"\"\n placeholder=\"BREW-XXXX-XXXX\"\n onSubmit={async (value: string) => {\n if (!value.trim()) return;\n setPromoLoading(true);\n try {\n const result = await redeemPromoCode(value);\n if (result.success) {\n setPromoResult({ success: true, message: t('account_promoSuccess', { expires: formatDate(result.expiresAt!) }) });\n } else {\n setPromoResult({ success: false, message: result.error ?? t('account_promoInvalid') });\n }\n } catch {\n setPromoResult({ success: false, message: t('account_promoError') });\n } finally {\n setPromoLoading(false);\n }\n }}\n />\n </Box>\n )}\n {promoResult && (\n <ResultBanner status={promoResult.success ? 'success' : 'error'} message={promoResult.message} />\n )}\n <Text color={COLORS.textSecondary} dimColor>{t('account_promoEsc')}</Text>\n </Box>\n ) : (\n <Text color={COLORS.textSecondary}>{t('account_promoHint')}</Text>\n )}\n </Box>\n\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>\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","import { readFile, writeFile, rename } from 'node:fs/promises';\nimport { randomBytes } from 'node:crypto';\nimport { join } from 'node:path';\nimport { DATA_DIR, ensureDataDirs } from '../data-dir.js';\nimport { fetchWithTimeout } from '../fetch-timeout.js';\nimport { logger } from '../../utils/logger.js';\n\nconst PROMO_PATH = join(DATA_DIR, 'promo.json');\n\n// Promo API endpoint (self-hosted or Polar webhook)\nconst PROMO_API_URL = 'https://api.molinesdesigns.com/promo';\n\nexport interface PromoCode {\n code: string;\n type: 'trial' | 'discount' | 'full';\n durationDays: number;\n maxRedemptions: number;\n currentRedemptions: number;\n createdAt: string;\n expiresAt: string | null;\n active: boolean;\n}\n\ninterface PromoRedemption {\n code: string;\n redeemedAt: string;\n expiresAt: string;\n type: 'trial' | 'discount' | 'full';\n}\n\ninterface PromoFile {\n version: 1;\n redemptions: PromoRedemption[];\n}\n\n// ── Generate promo codes (admin/CLI use) ──\n\nexport function generatePromoCode(prefix = 'BREW'): string {\n const random = randomBytes(4).toString('hex').toUpperCase();\n return `${prefix}-${random.slice(0, 4)}-${random.slice(4, 8)}`;\n}\n\nexport function generatePromoBatch(count: number, options: {\n type: 'trial' | 'discount' | 'full';\n durationDays: number;\n maxRedemptions: number;\n expiresAt?: string | null;\n prefix?: string;\n}): PromoCode[] {\n const codes: PromoCode[] = [];\n for (let i = 0; i < count; i++) {\n codes.push({\n code: generatePromoCode(options.prefix),\n type: options.type,\n durationDays: options.durationDays,\n maxRedemptions: options.maxRedemptions,\n currentRedemptions: 0,\n createdAt: new Date().toISOString(),\n expiresAt: options.expiresAt ?? null,\n active: true,\n });\n }\n return codes;\n}\n\n// ── Validate promo code against API ──\n\nexport async function validatePromoCode(code: string): Promise<{\n valid: boolean;\n type?: 'trial' | 'discount' | 'full';\n durationDays?: number;\n error?: string;\n}> {\n const normalized = code.trim().toUpperCase();\n if (!normalized || normalized.length < 8) {\n return { valid: false, error: 'Invalid promo code format' };\n }\n\n try {\n const res = await fetchWithTimeout(`${PROMO_API_URL}/validate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ code: normalized }),\n }, 10_000);\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({})) as { error?: string };\n return { valid: false, error: body.error ?? 'Invalid or expired promo code' };\n }\n\n const data = await res.json() as { type: string; durationDays: number };\n return {\n valid: true,\n type: data.type as 'trial' | 'discount' | 'full',\n durationDays: data.durationDays,\n };\n } catch (err) {\n logger.error('Promo validation failed', { error: String(err) });\n return { valid: false, error: 'Could not validate promo code. Check your connection.' };\n }\n}\n\n// ── Redeem promo code locally ──\n\nexport async function redeemPromoCode(code: string): Promise<{\n success: boolean;\n expiresAt?: string;\n error?: string;\n}> {\n const validation = await validatePromoCode(code);\n if (!validation.valid) {\n return { success: false, error: validation.error };\n }\n\n await ensureDataDirs();\n\n const redemption: PromoRedemption = {\n code: code.trim().toUpperCase(),\n redeemedAt: new Date().toISOString(),\n expiresAt: new Date(Date.now() + (validation.durationDays! * 24 * 60 * 60 * 1000)).toISOString(),\n type: validation.type!,\n };\n\n // Load existing redemptions\n let file: PromoFile = { version: 1, redemptions: [] };\n try {\n const raw = await readFile(PROMO_PATH, 'utf-8');\n file = JSON.parse(raw) as PromoFile;\n } catch { /* no existing file */ }\n\n // Check for duplicate redemption\n if (file.redemptions.some((r) => r.code === redemption.code)) {\n return { success: false, error: 'This promo code has already been redeemed' };\n }\n\n file.redemptions.push(redemption);\n\n // Atomic write\n const tmpPath = PROMO_PATH + '.tmp';\n await writeFile(tmpPath, JSON.stringify(file, null, 2), { encoding: 'utf-8', mode: 0o600 });\n await rename(tmpPath, PROMO_PATH);\n\n return { success: true, expiresAt: redemption.expiresAt };\n}\n\n// ── Check if an active promo is in effect ──\n\nexport async function getActivePromo(): Promise<PromoRedemption | null> {\n try {\n const raw = await readFile(PROMO_PATH, 'utf-8');\n const file = JSON.parse(raw) as PromoFile;\n const now = Date.now();\n\n // Find the most recent non-expired redemption\n const active = file.redemptions\n .filter((r) => new Date(r.expiresAt).getTime() > now)\n .sort((a, b) => new Date(b.expiresAt).getTime() - new Date(a.expiresAt).getTime())[0];\n\n return active ?? null;\n } catch {\n return null;\n }\n}\n"],"mappings":"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","names":["rm","useEffect","Box","React","Text","t","GradientText","Fragment","jsx","Text","React","React","Box","Text","Fragment","jsx","jsxs","Text","Box","React","jsx","jsxs","Box","create","readFile","writeFile","DATA_DIR","id","getMachineId","join","homedir","readFile","writeFile","create","create","VIEW_KEYS","Box","Text","jsx","jsxs","Box","Text","useMemo","Box","Text","create","spawn","spawn","create","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","Text","jsxs","Text","Box","Text","jsx","jsxs","Box","Text","Text","Fragment","jsx","jsxs","Text","jsx","jsxs","useMemo","Box","Text","useState","useMemo","useEffect","Box","Text","useInput","useStdout","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","Box","Text","jsx","Box","Text","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","useState","useStdout","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","useStdout","jsx","jsxs","useState","useRef","useEffect","useInput","useStdout","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","useStdout","jsx","jsxs","serviceAction","useState","useStdout","useEffect","useInput","Box","Text","useEffect","useRef","Box","Text","useInput","jsx","jsxs","useRef","useEffect","useInput","Box","Text","useEffect","useRef","useState","Box","useInput","create","readFile","writeFile","rm","rename","join","join","readFile","writeFile","rename","rm","PKG_PATTERN","create","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","Box","Text","TextInput","jsx","jsxs","Box","Text","TextInput","Box","Text","TextInput","jsx","jsxs","Box","Text","TextInput","jsx","jsxs","loadProfile","deleteProfile","updateProfile","useState","importProfile","useRef","useEffect","useInput","Box","useEffect","useRef","useState","Box","Text","useInput","create","create","jsx","jsxs","useState","useRef","useEffect","useInput","Box","Text","useEffect","useState","useMemo","Box","Text","useInput","useStdout","create","create","jsx","jsxs","clearHistory","useState","useEffect","useMemo","useInput","useStdout","Box","Text","useEffect","useState","Box","Text","useInput","create","create","jsx","jsxs","isNetworkError","useState","useEffect","useInput","Box","Text","useState","Box","Text","useInput","TextInput","readFile","writeFile","rename","randomBytes","join","join","readFile","writeFile","rename","Fragment","jsx","jsxs","deactivate","useState","useInput","Box","Text","TextInput","jsx","jsxs","useEffect","jsx","rm"]}
|
|
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/colors.ts","../src/utils/gradient.tsx","../src/components/layout/footer.tsx","../src/stores/license-store.ts","../src/lib/license/license-manager.ts","../src/lib/license/polar-api.ts","../src/lib/license/anti-tamper.ts","../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/utils/format.ts","../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/components/common/result-banner.tsx","../src/components/common/selectable-row.tsx","../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/profiles/profile-list-mode.tsx","../src/views/profiles/profile-detail-mode.tsx","../src/views/profiles/profile-create-flow.tsx","../src/views/profiles/profile-edit-flow.tsx","../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","../src/lib/license/promo.ts"],"sourcesContent":["import React from 'react';\nimport { createInterface } from 'node:readline/promises';\nimport { rm } from 'node:fs/promises';\nimport { render } from 'ink';\nimport { App } from './app.js';\nimport { activate, deactivate, loadLicense, revalidate } from './lib/license/license-manager.js';\nimport { ensureDataDirs, DATA_DIR } from './lib/data-dir.js';\nimport { t } from './i18n/index.js';\nimport { useLicenseStore } from './stores/license-store.js';\nimport { formatDate } from './utils/format.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: formatDate(license.expiresAt) }));\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 const { remoteSuccess } = await deactivate(license);\n console.log(t('cli_deactivated'));\n if (!remoteSuccess) {\n console.warn(t('cli_deactivateRemoteFailed'));\n }\n return;\n }\n\n if (command === 'revalidate') {\n const license = await loadLicense();\n if (!license) {\n console.log(t('cli_noLicense'));\n process.exit(1);\n }\n\n const result = await revalidate(license);\n if (result === 'expired') {\n console.error(t('cli_revalidateFailed'));\n process.exit(1);\n }\n\n const updated = await loadLicense();\n if (result === 'grace') {\n console.warn(t('cli_revalidateGrace'));\n } else {\n console.log(t('cli_revalidated'));\n }\n if (updated?.expiresAt) {\n console.log(t('cli_expires', { date: formatDate(updated.expiresAt) }));\n }\n return;\n }\n\n if (command === 'status') {\n await useLicenseStore.getState().initialize();\n const { status, license, degradation } = useLicenseStore.getState();\n\n if (status === 'free') {\n console.log(t('cli_planFree'));\n console.log(t('cli_upgradeHint'));\n } else {\n const planLabel = status === 'expired' ? t('cli_planExpired') : t('cli_planPro');\n console.log(planLabel);\n if (license) {\n console.log(t('cli_email', { email: license.customerEmail }));\n }\n\n const statusText = status === 'pro'\n ? (degradation === 'none' ? (license?.status ?? 'active') : degradation)\n : status;\n console.log(t('cli_status', { status: statusText }));\n\n if (license?.expiresAt) {\n console.log(t('cli_expires', { date: formatDate(license.expiresAt) }));\n }\n if (status === 'expired') {\n console.log(t('cli_revalidateHint'));\n }\n if (status === 'pro' && degradation !== 'none' && license) {\n const days = Math.floor((Date.now() - new Date(license.lastValidatedAt).getTime()) / (24 * 60 * 60 * 1000));\n console.log(t('license_offlineWarning', { days }));\n console.log(t('cli_revalidateHint'));\n }\n }\n return;\n }\n\n if (command === 'install-brewbar') {\n await useLicenseStore.getState().initialize();\n const isPro = useLicenseStore.getState().isPro();\n const { installBrewBar } = await import('./lib/brewbar-installer.js');\n try {\n await installBrewBar(isPro, 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 // SEG-007: delete-account subcommand\n if (command === 'delete-account') {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(t('delete_account_confirm') + ' (y/N): ');\n rl.close();\n if (answer.toLowerCase() !== 'y' && answer.toLowerCase() !== 's') {\n console.log(t('cli_deactivateCancelled'));\n return;\n }\n await rm(DATA_DIR, { recursive: true, force: true });\n console.log(t('delete_account_success'));\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';\nimport type { ViewId } from './lib/types.js';\n\n// FE-009: Extracted LicenseInitializer component\nfunction LicenseInitializer() {\n const initLicense = useLicenseStore((s) => s.initialize);\n useEffect(() => { initLicense(); }, []);\n return null;\n}\n\n// FE-009: Extracted ViewRouter component\nfunction ViewRouter({ currentView }: { currentView: ViewId }) {\n const isPro = useLicenseStore((s) => s.isPro);\n\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\nexport function App() {\n const { exit } = useApp();\n const currentView = useNavigationStore((s) => s.currentView);\n\n useGlobalKeyboard({ onQuit: exit });\n\n return (\n <AppLayout>\n <LicenseInitializer />\n <ViewRouter currentView={currentView} />\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 { COLORS } from '../../utils/colors.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', 'package-info', '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 <Text> </Text>\n <Box borderStyle=\"single\" borderBottom borderLeft={false} borderRight={false} borderTop={false} borderColor={COLORS.gold} 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 isPro = isProView(view);\n const isActive = view === currentView;\n const isAccount = view === 'account';\n\n return (\n <React.Fragment key={view}>\n {i > 0 && <Text color={COLORS.border}> {'\\u2502'} </Text>}\n {isActive && <Text color={COLORS.sky}>{'\\u25CF'} </Text>}\n {key ? (\n <>\n <Text bold color=\"#FFFFFF\">{key}</Text>\n <Text bold={isActive} underline={isActive} color={isActive ? COLORS.success : isAccount ? COLORS.gold : COLORS.textSecondary}> {viewLabel}</Text>\n </>\n ) : (\n <Text bold={isActive} underline={isActive} color={isActive ? COLORS.success : isAccount ? COLORS.gold : COLORS.textSecondary}>{viewLabel}</Text>\n )}\n {isPro && <Text color={COLORS.brand} 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 selectedPackage: string | null;\n selectedPackageType: 'formula' | 'cask' | null;\n viewHistory: ViewId[];\n navigate: (view: ViewId) => void;\n goBack: () => void;\n selectPackage: (name: string | null, type?: 'formula' | 'cask' | 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 selectedPackage: null,\n selectedPackageType: null,\n viewHistory: [],\n\n navigate: (view) => {\n const { currentView, viewHistory } = get();\n if (view === currentView) return;\n set({\n currentView: view,\n viewHistory: [...viewHistory.slice(-19), currentView],\n });\n },\n\n goBack: () => {\n const { viewHistory } = get();\n if (viewHistory.length === 0) return;\n const prev = viewHistory[viewHistory.length - 1];\n set({\n currentView: prev,\n viewHistory: viewHistory.slice(0, -1),\n });\n },\n\n selectPackage: (name, type = null) => set({ selectedPackage: name, selectedPackageType: type }),\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","/**\n * Semantic color tokens for Brew-TUI.\n *\n * These constants provide a single source of truth for UI colors.\n * Views should gradually adopt these instead of hardcoded hex strings.\n *\n * Limitation: these tokens are designed for dark terminal backgrounds.\n * Light/high-contrast theme support is not yet implemented.\n */\nexport const COLORS = {\n success: '#22C55E',\n error: '#EF4444',\n warning: '#F59E0B',\n info: '#06B6D4',\n brand: '#FF6B2B',\n muted: '#9CA3AF',\n text: '#F9FAFB',\n textSecondary: '#6B7280',\n teal: '#2DD4BF',\n sky: '#38BDF8',\n gold: '#FFD700',\n purple: '#A855F7',\n blue: '#3B82F6',\n border: '#4B5563',\n} as const;\n","import React, { useMemo } 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 const GradientText = React.memo(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 coloredChars = useMemo(() => {\n const chars = [...children];\n const maxIdx = Math.max(chars.length - 1, 1);\n\n return 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 { char, color, key: `${i}-${color}` };\n });\n }, [children, colors]);\n\n return (\n <>\n {coloredChars.map(({ char, color, key }) => (\n <Text key={key} 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 { COLORS } from '../../utils/colors.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: [['p', 'hint_promo'], ['d', 'hint_deactivate'], ['q', 'hint_quit']],\n};\n\nfunction HintItem({ def }: { def: HintDef }) {\n if (def.length === 1) return <Text color={COLORS.gold} dimColor>{t(def[0])}</Text>;\n return (\n <>\n <Text color={COLORS.text} bold>{def[0]}</Text>\n <Text color={COLORS.textSecondary}>:</Text>\n <Text color={COLORS.gold} 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={COLORS.gold} 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={COLORS.border}> {'\\u2502'} </Text>}\n <HintItem def={def} />\n </React.Fragment>\n );\n })}\n <Text color={COLORS.border}> {'\\u2502'} </Text>\n <Text color={COLORS.text} bold>L</Text>\n <Text color={COLORS.textSecondary}>:</Text>\n <Text color={COLORS.gold} dimColor>{t('hint_lang')}({locale})</Text>\n </Box>\n );\n}\n","import { create } from 'zustand';\nimport type { LicenseData, LicenseStatus } from '../lib/license/types.js';\nimport * as manager from '../lib/license/license-manager.js';\nimport { getDegradationLevel } from '../lib/license/license-manager.js';\nimport type { DegradationLevel } from '../lib/license/license-manager.js';\nimport { ensureDataDirs } from '../lib/data-dir.js';\nimport { initStoreIntegrity } from '../lib/license/anti-tamper.js';\n\nconst REVALIDATION_CHECK_MS = 60 * 60 * 1000; // Check every hour\n\n// ARQ-002: Promise-based mutex for revalidation\nlet _revalidatingPromise: Promise<void> | null = null;\nlet _revalidationInterval: ReturnType<typeof setInterval> | null = null;\n\ninterface LicenseState {\n status: LicenseStatus;\n license: LicenseData | null;\n error: string | null;\n degradation: DegradationLevel;\n\n initialize: () => Promise<void>;\n activate: (key: string) => Promise<boolean>;\n deactivate: () => Promise<void>;\n isPro: () => boolean;\n}\n\nasync function doRevalidation(\n license: LicenseData,\n set: (partial: Partial<LicenseState>) => void,\n): Promise<void> {\n const result = await manager.revalidate(license);\n if (result === 'expired') {\n set({ status: 'expired', license: { ...license, status: 'expired' }, degradation: 'expired' });\n } else {\n const updated = await manager.loadLicense();\n const effective = updated ?? license;\n set({ license: effective, degradation: getDegradationLevel(effective) });\n }\n}\n\nexport const useLicenseStore = create<LicenseState>((set, get) => ({\n status: 'validating',\n license: null,\n error: null,\n degradation: 'none',\n\n initialize: async () => {\n initStoreIntegrity(useLicenseStore);\n await ensureDataDirs();\n const license = await manager.loadLicense();\n\n if (!license) {\n set({ status: 'free', license: null, degradation: 'none' });\n return;\n }\n\n if (manager.isExpired(license)) {\n set({ status: 'expired', license, degradation: 'expired' });\n return;\n }\n\n // Layer 15: Check degradation level based on offline time\n const level = getDegradationLevel(license);\n if (level === 'expired') {\n set({ status: 'expired', license, degradation: 'expired' });\n return;\n }\n\n // Set Pro immediately (warning/limited still shown as pro, but pro-guard checks degradation)\n set({ status: 'pro', license, degradation: level });\n\n if (manager.needsRevalidation(license)) {\n if (!_revalidatingPromise) {\n _revalidatingPromise = doRevalidation(license, set)\n .finally(() => { _revalidatingPromise = null; });\n }\n await _revalidatingPromise;\n }\n\n // Periodically re-check license validity during the session\n if (_revalidationInterval) clearInterval(_revalidationInterval);\n _revalidationInterval = setInterval(() => {\n const current = get().license;\n if (!current || get().status !== 'pro') return;\n if (!manager.needsRevalidation(current)) return;\n if (_revalidatingPromise) return;\n _revalidatingPromise = doRevalidation(current, set)\n .finally(() => { _revalidatingPromise = null; });\n }, REVALIDATION_CHECK_MS);\n _revalidationInterval.unref();\n },\n\n activate: async (key) => {\n set({ error: null });\n try {\n const license = await manager.activate(key);\n set({ status: 'pro', license, degradation: 'none' });\n return true;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n set({ error: msg });\n return false;\n }\n },\n\n deactivate: async () => {\n const { license } = get();\n if (license) {\n const { remoteSuccess } = await manager.deactivate(license);\n if (!remoteSuccess) {\n set({ status: 'free', license: null, degradation: 'none', error: 'License removed locally but server deactivation failed. It may remain active remotely.' });\n return;\n }\n }\n set({ status: 'free', license: null, degradation: 'none', error: null });\n },\n\n isPro: () => get().status === 'pro',\n}));\n","import { readFile, writeFile, rename, rm } from 'node:fs/promises';\nimport { createCipheriv, createDecipheriv, randomBytes, scryptSync } from 'node:crypto';\nimport { LICENSE_PATH, ensureDataDirs } from '../data-dir.js';\nimport { activateLicense as apiActivate, validateLicense as apiValidate, deactivateLicense as apiDeactivate } from './polar-api.js';\nimport { t } from '../../i18n/index.js';\nimport type { LicenseData, LicenseFile } from './types.js';\n\nconst REVALIDATION_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24h\nconst GRACE_PERIOD_MS = 7 * 24 * 60 * 60 * 1000; // 7 days\n\n// ── Layer 18: Client-side rate limiting on activations ──\nconst ACTIVATION_COOLDOWN_MS = 30_000; // 30 seconds between attempts\nconst MAX_ATTEMPTS = 5;\nconst LOCKOUT_MS = 15 * 60 * 1000; // 15 min lockout after max attempts\n\ninterface ActivationTracker {\n attempts: number;\n lastAttempt: number;\n lockedUntil: number;\n}\n\n// Note: rate limit state is in-memory only; resets on process restart\nconst tracker: ActivationTracker = {\n attempts: 0,\n lastAttempt: 0,\n lockedUntil: 0,\n};\n\nfunction checkRateLimit(): void {\n const now = Date.now();\n\n // Check lockout\n if (now < tracker.lockedUntil) {\n const remaining = Math.ceil((tracker.lockedUntil - now) / 60000);\n throw new Error(t('cli_rateLimited', { minutes: remaining }));\n }\n\n // Check cooldown\n if (now - tracker.lastAttempt < ACTIVATION_COOLDOWN_MS) {\n throw new Error(t('cli_cooldown'));\n }\n}\n\nfunction recordAttempt(success: boolean): void {\n const now = Date.now();\n tracker.lastAttempt = now;\n\n if (success) {\n tracker.attempts = 0;\n return;\n }\n\n tracker.attempts++;\n if (tracker.attempts >= MAX_ATTEMPTS) {\n tracker.lockedUntil = now + LOCKOUT_MS;\n tracker.attempts = 0;\n }\n}\n\n// SECURITY NOTE — Known architectural limitation (documented decision):\n// These constants are compiled into the npm bundle and can be extracted by any user\n// with `cat node_modules/.../license-manager.js`. The encryption protects against\n// casual filesystem access, not against a determined attacker with the bundle.\n// The primary defense is server-side revalidation (24h cycle via Polar.sh) and\n// machine binding (machineId in the encrypted envelope). Migrating to macOS Keychain\n// would eliminate this limitation but adds native dependency complexity.\nconst ENCRYPTION_SECRET = 'brew-tui-license-aes256gcm-v1';\nconst SCRYPT_SALT = 'brew-tui-salt-v1';\n\n// Lazy derivation — scryptSync is CPU-intensive (default N=16384) and should\n// not block the event loop at module import time.\nlet _derivedKey: Buffer | null = null;\n\nfunction deriveEncryptionKey(): Buffer {\n if (!_derivedKey) _derivedKey = scryptSync(ENCRYPTION_SECRET, SCRYPT_SALT, 32);\n return _derivedKey;\n}\n\nfunction encryptLicenseData(data: LicenseData): { encrypted: string; iv: string; tag: string } {\n const key = deriveEncryptionKey();\n const iv = randomBytes(12); // 96-bit IV for GCM\n const cipher = createCipheriv('aes-256-gcm', key, iv);\n\n const plaintext = JSON.stringify(data);\n const ciphertext = Buffer.concat([cipher.update(plaintext, 'utf-8'), cipher.final()]);\n const tag = cipher.getAuthTag();\n\n return {\n encrypted: ciphertext.toString('base64'),\n iv: iv.toString('base64'),\n tag: tag.toString('base64'),\n };\n}\n\nfunction decryptLicenseData(encrypted: string, iv: string, tag: string): LicenseData {\n const key = deriveEncryptionKey();\n const decipher = createDecipheriv(\n 'aes-256-gcm',\n key,\n Buffer.from(iv, 'base64'),\n );\n decipher.setAuthTag(Buffer.from(tag, 'base64'));\n\n const plaintext = Buffer.concat([\n decipher.update(Buffer.from(encrypted, 'base64')),\n decipher.final(),\n ]);\n\n return JSON.parse(plaintext.toString('utf-8')) as LicenseData;\n}\n\n// BK-003: Type guard for license data format\nfunction isLicenseFile(obj: unknown): obj is LicenseFile {\n return typeof obj === 'object' && obj !== null && (obj as Record<string, unknown>).version === 1;\n}\n\nfunction isEncryptedLicenseFile(obj: unknown): obj is LicenseFile & { encrypted: string; iv: string; tag: string } {\n if (!isLicenseFile(obj)) return false;\n const record = obj as unknown as Record<string, unknown>;\n return typeof record.encrypted === 'string'\n && typeof record.iv === 'string'\n && typeof record.tag === 'string';\n}\n\n// SEG-002: Read machine ID for portability check\nasync function getMachineId(): Promise<string | null> {\n try {\n const { readFile: readMachineId } = await import('node:fs/promises');\n const { join } = await import('node:path');\n const { homedir } = await import('node:os');\n const machineIdPath = join(homedir(), '.brew-tui', 'machine-id');\n return (await readMachineId(machineIdPath, 'utf-8')).trim() || null;\n } catch {\n return null;\n }\n}\n\nexport async function loadLicense(): Promise<LicenseData | null> {\n try {\n const raw = await readFile(LICENSE_PATH, 'utf-8');\n const parsed: unknown = JSON.parse(raw);\n\n // BK-003: Validate parsed data\n if (!isLicenseFile(parsed)) {\n throw new Error('Invalid license data format');\n }\n\n const file = parsed as LicenseFile;\n\n if (file.version !== 1) {\n // Future: add migration logic here\n throw new Error('Unsupported data version');\n }\n\n // New encrypted format\n if (isEncryptedLicenseFile(file)) {\n const data = decryptLicenseData(file.encrypted!, file.iv!, file.tag!);\n\n // SEG-002: Check machine ID if stored in the envelope\n const fileRecord = file as unknown as Record<string, unknown>;\n if (fileRecord.machineId) {\n const currentMachineId = await getMachineId();\n if (currentMachineId && fileRecord.machineId !== currentMachineId) {\n throw new Error('License was activated on a different machine');\n }\n }\n\n return data;\n }\n\n // Legacy unencrypted format — migrate to encrypted on read\n if (file.license) {\n const data = file.license;\n // Re-save in encrypted format\n await saveLicense(data);\n return data;\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\nexport async function saveLicense(data: LicenseData): Promise<void> {\n await ensureDataDirs();\n const { encrypted, iv, tag } = encryptLicenseData(data);\n // SEG-002: Include machineId in the envelope for portability detection\n const machineId = await getMachineId();\n const file: Record<string, unknown> = { version: 1, encrypted, iv, tag };\n if (machineId) file.machineId = machineId;\n const tmpPath = LICENSE_PATH + '.tmp';\n await writeFile(tmpPath, JSON.stringify(file, null, 2), { encoding: 'utf-8', mode: 0o600 });\n await rename(tmpPath, LICENSE_PATH);\n}\n\nexport async function clearLicense(): Promise<void> {\n try {\n await rm(LICENSE_PATH);\n } catch { /* file may not exist */ }\n}\n\nexport function isExpired(license: LicenseData): boolean {\n if (!license.expiresAt) return false;\n return new Date(license.expiresAt).getTime() < Date.now();\n}\n\nexport function needsRevalidation(license: LicenseData): boolean {\n const lastValidated = new Date(license.lastValidatedAt).getTime();\n if (isNaN(lastValidated)) return true; // corrupted date → force revalidation\n return Date.now() - lastValidated > REVALIDATION_INTERVAL_MS;\n}\n\nexport function isWithinGracePeriod(license: LicenseData): boolean {\n const lastValidated = new Date(license.lastValidatedAt).getTime();\n if (isNaN(lastValidated)) return false; // corrupted date → no grace\n return Date.now() - lastValidated < GRACE_PERIOD_MS;\n}\n\n// ── Layer 15: Gradual degradation after extended offline ──\n\nexport type DegradationLevel = 'none' | 'warning' | 'limited' | 'expired';\nexport type RevalidationResult = 'valid' | 'grace' | 'expired';\n\n/**\n * Returns the degradation level based on time since last server validation.\n * - 0-7 days: none (full access)\n * - 7-14 days: warning (shows a notice but still works)\n * - 14-30 days: limited (some features disabled)\n * - 30+ days: expired (all Pro features disabled)\n */\nexport function getDegradationLevel(license: LicenseData): DegradationLevel {\n const lastValidated = new Date(license.lastValidatedAt).getTime();\n if (isNaN(lastValidated)) return 'expired'; // corrupted date → deny access\n const elapsed = Date.now() - lastValidated;\n if (elapsed < 0) return 'none'; // clock skew: future timestamp → treat as fresh\n const days = elapsed / (24 * 60 * 60 * 1000);\n\n if (days <= 7) return 'none';\n if (days <= 14) return 'warning';\n if (days <= 30) return 'limited';\n return 'expired';\n}\n\n// Layer 10: License key format validation\nfunction validateLicenseKey(key: string): void {\n // Polar keys are UUID-like: 8-4-4-4-12 hex chars or similar\n // Reject obviously invalid keys to avoid unnecessary API calls\n if (key.length < 10 || key.length > 100) {\n throw new Error('Invalid license key format');\n }\n // Only allow alphanumeric, hyphens, underscores\n if (!/^[\\w-]+$/.test(key)) {\n throw new Error('Invalid license key format');\n }\n}\n\nexport async function activate(key: string): Promise<LicenseData> {\n validateLicenseKey(key);\n checkRateLimit();\n\n let success = false;\n try {\n const res = await apiActivate(key);\n\n if (!res.activated) {\n throw new Error(res.error ?? 'Activation failed');\n }\n\n const license: LicenseData = {\n key,\n instanceId: res.instance.id,\n status: 'active',\n customerEmail: res.meta.customer_email,\n customerName: res.meta.customer_name,\n plan: 'pro',\n activatedAt: new Date().toISOString(),\n expiresAt: res.license_key.expires_at,\n lastValidatedAt: new Date().toISOString(),\n };\n\n await saveLicense(license);\n success = true;\n return license;\n } finally {\n recordAttempt(success);\n }\n}\n\n/**\n * Revalidate the license against the server.\n * This also serves as Layer 19 (telemetry): each validation call\n * allows Polar to track activation count, last-seen timestamp,\n * and detect if the activation limit is exceeded (license sharing).\n */\n// EP-006: Detect if an error is a network error vs validation/contract error\nfunction isNetworkError(err: unknown): boolean {\n const msg = err instanceof Error ? err.message : String(err);\n return /fetch failed|ECONNREFUSED|ENOTFOUND|ETIMEDOUT|network|timeout|abort/i.test(msg);\n}\n\nexport async function revalidate(license: LicenseData): Promise<RevalidationResult> {\n try {\n const res = await apiValidate(license.key, license.instanceId);\n\n if (res.valid) {\n const updated: LicenseData = {\n ...license,\n lastValidatedAt: new Date().toISOString(),\n status: 'active',\n expiresAt: res.license_key.expires_at,\n };\n await saveLicense(updated);\n return 'valid';\n }\n\n await saveLicense({ ...license, status: 'expired' });\n return 'expired';\n } catch (err) {\n // EP-006: Network errors trigger grace period; validation/contract errors mean expired\n if (isNetworkError(err)) {\n return isWithinGracePeriod(license) ? 'grace' : 'expired';\n }\n // Unexpected response or contract violation — treat as expired\n await saveLicense({ ...license, status: 'expired' });\n return 'expired';\n }\n}\n\nexport async function deactivate(license: LicenseData): Promise<{ remoteSuccess: boolean }> {\n let remoteSuccess = false;\n for (let attempt = 0; attempt < 3; attempt++) {\n try {\n await apiDeactivate(license.key, license.instanceId);\n remoteSuccess = true;\n break;\n } catch {\n if (attempt < 2) await new Promise(r => setTimeout(r, 1000));\n }\n }\n await clearLicense();\n return { remoteSuccess };\n}\n","import { randomUUID } from 'node:crypto';\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { PolarActivateResponse, PolarValidateResponse } from './types.js';\nimport { fetchWithTimeout } from '../fetch-timeout.js';\n\nconst BASE_URL = 'https://api.polar.sh/v1/customer-portal/license-keys';\n\n// ── GOV-004: Public organization ID (not a secret) ──\n// This is the public Polar organization identifier used for license key operations.\n// Found at: polar.sh/dashboard -> Settings -> General\nexport const POLAR_ORGANIZATION_ID = 'b8f245c0-d116-4457-92fb-1bda47139f82';\n\n// SEG-004: Machine-specific identifier stored persistently\nconst DATA_DIR = join(homedir(), '.brew-tui');\nconst MACHINE_ID_PATH = join(DATA_DIR, 'machine-id');\n\nasync function getMachineId(): Promise<string> {\n try {\n const id = (await readFile(MACHINE_ID_PATH, 'utf-8')).trim();\n if (id) return id;\n } catch { /* file doesn't exist yet */ }\n\n const id = randomUUID();\n await mkdir(DATA_DIR, { recursive: true, mode: 0o700 });\n await writeFile(MACHINE_ID_PATH, id, { encoding: 'utf-8', mode: 0o600 });\n return id;\n}\n\n// Layer 11: API URL validation\nfunction validateApiUrl(url: string): void {\n const parsed = new URL(url);\n if (parsed.protocol !== 'https:') {\n throw new Error('HTTPS required for license API');\n }\n if (!parsed.hostname.endsWith('polar.sh')) {\n throw new Error('Invalid API host');\n }\n}\n\n// Raw Polar response shapes\ninterface PolarActivation {\n id: string; // activation_id\n license_key: {\n status: string;\n expires_at: string | null;\n };\n}\n\ninterface PolarValidated {\n id: string;\n status: string; // 'granted' | 'revoked' | 'disabled'\n expires_at: string | null;\n customer: {\n email: string | null;\n name: string | null;\n };\n activation: { id: string } | null;\n}\n\nasync function post<T>(endpoint: string, body: Record<string, unknown>, expectEmpty = false): Promise<T> {\n const url = `${BASE_URL}/${endpoint}`;\n validateApiUrl(url);\n\n const res = await fetchWithTimeout(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n }, 15_000);\n\n if (!res.ok) {\n let message = `Request failed with status ${res.status}`;\n try {\n const errBody = await res.json() as { detail?: string; error?: string; message?: string };\n if (typeof errBody.detail === 'string') message = errBody.detail;\n else if (typeof errBody.error === 'string') message = errBody.error;\n else if (typeof errBody.message === 'string') message = errBody.message;\n } catch {\n // non-JSON error body — use generic message above\n }\n throw new Error(message);\n }\n\n if (expectEmpty || res.status === 204) return undefined as T;\n return res.json() as Promise<T>;\n}\n\nexport async function activateLicense(key: string): Promise<PolarActivateResponse> {\n const machineId = await getMachineId();\n\n const activation = await post<PolarActivation>('activate', {\n key,\n organization_id: POLAR_ORGANIZATION_ID,\n label: machineId, // SEG-004: Use machine UUID instead of hostname\n });\n\n // EP-001: Runtime validation of activation response\n if (!activation || typeof activation.id !== 'string' || !activation.license_key) {\n throw new Error('Invalid activation response: missing required fields');\n }\n\n // Polar's activate response doesn't include customer info — fetch it via validate\n let customerEmail = '';\n let customerName = '';\n try {\n const validated = await post<PolarValidated>('validate', {\n key,\n organization_id: POLAR_ORGANIZATION_ID,\n activation_id: activation.id,\n });\n customerEmail = validated.customer?.email ?? '';\n customerName = validated.customer?.name ?? '';\n } catch {\n // customer info is non-critical — activation still succeeds\n }\n\n return {\n activated: true,\n error: null,\n instance: { id: activation.id },\n license_key: {\n id: 0,\n status: activation.license_key.status,\n key,\n activation_limit: 0,\n activations_count: 0,\n expires_at: activation.license_key.expires_at,\n },\n meta: { customer_email: customerEmail, customer_name: customerName },\n };\n}\n\nexport async function validateLicense(key: string, instanceId: string): Promise<PolarValidateResponse> {\n const res = await post<PolarValidated>('validate', {\n key,\n organization_id: POLAR_ORGANIZATION_ID,\n activation_id: instanceId,\n });\n\n // EP-002: Runtime validation of validate response\n if (!res || typeof res.id !== 'string' || typeof res.status !== 'string' || !res.customer) {\n throw new Error('Invalid validation response: missing required fields');\n }\n\n const notExpired = res.expires_at === null || new Date(res.expires_at) > new Date();\n const valid = res.status === 'granted' && notExpired;\n\n return {\n valid,\n error: valid ? null : `License ${res.status}`,\n license_key: {\n id: 0,\n status: res.status,\n key,\n expires_at: res.expires_at,\n },\n instance: { id: instanceId },\n };\n}\n\nexport async function deactivateLicense(key: string, instanceId: string): Promise<void> {\n await post<void>(\n 'deactivate',\n { key, organization_id: POLAR_ORGANIZATION_ID, activation_id: instanceId },\n true,\n );\n}\n","import type { LicenseStatus } from './types.js';\n\ninterface LicenseStoreSnapshot {\n status: LicenseStatus;\n isPro: () => boolean;\n}\n\ninterface LicenseStoreApi {\n getState: () => LicenseStoreSnapshot;\n}\n\n// Lazy-captured references: initialized on first call to initStoreIntegrity()\nlet _originalIsPro: (() => boolean) | null = null;\nlet _originalGetState: (() => LicenseStoreSnapshot) | null = null;\nlet _storeApi: LicenseStoreApi | null = null;\n\n/**\n * Capture the original store function references for later integrity checks.\n * Call this once during license store initialization.\n */\nexport function initStoreIntegrity(store: LicenseStoreApi): void {\n _storeApi = store;\n _originalIsPro = store.getState().isPro;\n _originalGetState = store.getState;\n}\n\n/**\n * Verify that the license store's isPro function hasn't been replaced\n * with a function that always returns true.\n */\nexport function verifyStoreIntegrity(): boolean {\n if (!_storeApi || !_originalIsPro || !_originalGetState) return false;\n\n const state = _storeApi.getState();\n\n // Check 1: isPro function reference hasn't changed\n if (state.isPro !== _originalIsPro) return false;\n\n // Check 2: getState itself hasn't been replaced\n if (_storeApi.getState !== _originalGetState) return false;\n\n // Check 3: If status is 'free', isPro() must return false\n // (catches patches that make isPro() always return true regardless of status)\n if (state.status === 'free' && state.isPro()) return false;\n\n return true;\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 { COLORS } from '../../utils/colors.js';\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={COLORS.brand}\n paddingX={3}\n paddingY={2}\n flexDirection=\"column\"\n alignItems=\"center\"\n width=\"80%\"\n >\n <Text bold color={COLORS.brand}>{'\\u2B50'} {t('upgrade_proFeature', { title })}</Text>\n <Text> </Text>\n <Text color={COLORS.text} wrap=\"wrap\">{t(keys.desc)}</Text>\n <Text> </Text>\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text color={COLORS.info} bold>{t('upgrade_pricing')}</Text>\n <Text> </Text>\n <Text color={COLORS.muted}>{t('upgrade_buyAt')}</Text>\n <Text color={COLORS.sky} bold> {t('upgrade_buyUrl')}</Text>\n <Text> </Text>\n <Text color={COLORS.muted}>{t('upgrade_activateWith')}</Text>\n <Text color={COLORS.success} bold> {t('upgrade_activateCmd')}</Text>\n <Text> </Text>\n <Text color={COLORS.brand}>{t('upgrade_proLabel')}</Text>\n </Box>\n </Box>\n </Box>\n );\n}\n","import React, { useEffect, useMemo } from 'react';\nimport { Box, Text, useStdout } 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 { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nimport { formatRelativeTime } from '../utils/format.js';\n\nexport function DashboardView() {\n const { formulae, casks, outdated, services, config, loading, errors, lastFetchedAt, fetchAll } = useBrewStore();\n const { stdout } = useStdout();\n const columns = stdout?.columns ?? 80;\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 const partialErrors = [\n errors.outdated ? { label: t('dashboard_outdated'), message: errors.outdated } : null,\n errors.services ? { label: t('dashboard_services'), message: errors.services } : null,\n errors.config ? { label: t('dashboard_systemInfo'), message: errors.config } : null,\n ].filter((item): item is { label: string; message: string } => item !== null);\n const outdatedValue = loading.outdated\n ? '...'\n : errors.outdated\n ? t('dashboard_statError')\n : outdated.formulae.length + outdated.casks.length;\n const servicesValue = loading.services\n ? '...'\n : errors.services\n ? t('dashboard_statError')\n : `${runningServices}/${services.length}`;\n\n // ARQ-004: Last updated timestamp\n const lastUpdated = lastFetchedAt.installed\n ? formatRelativeTime(lastFetchedAt.installed / 1000)\n : null;\n\n if (loading.installed) return <Loading message={t('loading_fetchingBrew')} />;\n if (errors.installed) return <ErrorMessage message={errors.installed} />;\n\n // SCR-018: Responsive layout\n const isNarrow = columns < 60;\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\" flexDirection={isNarrow ? 'column' : 'row'}>\n <StatCard label={t('dashboard_formulae')} value={formulae.length} color={COLORS.info} />\n <StatCard label={t('dashboard_casks')} value={casks.length} color={COLORS.purple} />\n <StatCard\n label={t('dashboard_outdated')}\n value={outdatedValue}\n color={typeof outdatedValue === 'number' && outdatedValue > 0 ? COLORS.warning : (errors.outdated ? COLORS.error : COLORS.success)}\n />\n <StatCard\n label={t('dashboard_services')}\n value={servicesValue}\n color={errors.services || errorServices > 0 ? COLORS.error : COLORS.success}\n />\n </Box>\n\n {/* ARQ-004: Show last updated */}\n {lastUpdated && (\n <Text color={COLORS.muted}>{t('dashboard_lastUpdated', { time: lastUpdated })}</Text>\n )}\n\n {partialErrors.length > 0 && (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={COLORS.warning} paddingX={2} paddingY={0}>\n <Text color={COLORS.warning} bold>{t('dashboard_partialData')}</Text>\n {partialErrors.map((item) => (\n <Text key={item.label} color={COLORS.muted}>\n {item.label}: {item.message}\n </Text>\n ))}\n </Box>\n )}\n\n {config && !errors.config && (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u2139\\uFE0F'} title={t('dashboard_systemInfo')} gradient={[COLORS.text, COLORS.muted]} />\n <Box borderStyle=\"round\" borderColor={COLORS.blue} paddingX={2} paddingY={0} flexDirection=\"column\" marginTop={1}>\n <Text><Text color={COLORS.muted}>{t('dashboard_homebrew')}</Text> {config.HOMEBREW_VERSION}</Text>\n <Text><Text color={COLORS.muted}>{t('dashboard_prefix')}</Text> {config.HOMEBREW_PREFIX}</Text>\n <Text><Text color={COLORS.muted}>{t('dashboard_updated')}</Text> {config.coreUpdated}</Text>\n </Box>\n </Box>\n )}\n\n {!errors.outdated && 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={COLORS.text}>{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={COLORS.textSecondary} italic>{t('common_andMore', { count: outdated.formulae.length - 10 })}</Text>\n )}\n </Box>\n </Box>\n )}\n\n {!errors.services && errorServices > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <SectionHeader emoji={'\\u26A0\\uFE0F'} title={t('dashboard_serviceErrors')} color={COLORS.error} />\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={COLORS.muted}>{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';\nimport { logger } from '../utils/logger.js';\n\nconst BREW_UPDATE_COOLDOWN_MS = 5 * 60 * 1000;\n\nlet fetchAllInFlight: Promise<void> | null = null;\nlet brewUpdateInFlight: Promise<void> | null = null;\nlet lastBrewUpdateStartedAt = 0;\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 lastFetchedAt: Record<string, number>;\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\nfunction recordFetchTime(set: (fn: (s: BrewState) => Partial<BrewState>) => void, key: string) {\n set((s) => ({ lastFetchedAt: { ...s.lastFetchedAt, [key]: Date.now() } }));\n}\n\nexport const useBrewStore = create<BrewState>((set, get) => ({\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 // SCR-013: Pre-initialize doctor loading to true\n loading: { installed: true, outdated: true, services: true, config: true, doctor: true },\n errors: {},\n lastFetchedAt: {},\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 recordFetchTime(set, 'installed');\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 recordFetchTime(set, 'outdated');\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 recordFetchTime(set, 'services');\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 recordFetchTime(set, 'config');\n }\n },\n\n fetchLeaves: async () => {\n try {\n const result = await api.getLeaves();\n set({ leaves: result });\n } catch (err) {\n // QA-021: Use structured logger unconditionally\n logger.error('fetchLeaves failed', { error: err instanceof Error ? err.message : String(err) });\n } finally {\n recordFetchTime(set, 'leaves');\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 recordFetchTime(set, 'doctor');\n }\n },\n\n fetchAll: async (): Promise<void> => {\n if (fetchAllInFlight) {\n return fetchAllInFlight;\n }\n\n const now = Date.now();\n if (!brewUpdateInFlight && now - lastBrewUpdateStartedAt > BREW_UPDATE_COOLDOWN_MS) {\n lastBrewUpdateStartedAt = now;\n // Don't block on brew update — run in background.\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 // ARQ-003: Capture brew update errors in store\n brewUpdateInFlight = api.brewUpdate()\n .catch((err) => { set((s) => ({ errors: { ...s.errors, update: String(err) } })); })\n .finally(() => {\n brewUpdateInFlight = null;\n });\n }\n\n const store = get();\n fetchAllInFlight = Promise.all([\n store.fetchInstalled(),\n store.fetchOutdated(),\n store.fetchServices(),\n store.fetchConfig(),\n store.fetchLeaves(),\n store.fetchDoctor(),\n ]).then(() => undefined)\n .finally(() => {\n fetchAllInFlight = null;\n });\n\n return fetchAllInFlight;\n },\n\n uninstallPackage: async (name) => {\n setLoading(set, 'action', true);\n try {\n await api.uninstallPackage(name);\n await get().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 get().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\n// EP-011: Package name validation\nconst PKG_PATTERN = /^[\\w@./+-]+$/;\n\nfunction validatePackageName(name: string): void {\n if (!PKG_PATTERN.test(name)) throw new Error('Invalid package name: ' + name);\n}\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 validatePackageName(name);\n const raw = await execBrew(['info', '--json=v2', name]);\n return parseFormulaInfoJson(raw);\n}\n\n// SCR-008: Cask-specific info endpoint\nexport async function getCaskInfo(name: string): Promise<Cask | null> {\n validatePackageName(name);\n try {\n const raw = await execBrew(['info', '--json=v2', '--cask', name]);\n const data = JSON.parse(raw) as { casks?: Cask[] };\n return data.casks?.[0] ?? null;\n } catch {\n return null;\n }\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 validatePackageName(name);\n return streamBrew(['install', name]);\n}\n\nexport function upgradePackage(name: string): AsyncGenerator<string> {\n validatePackageName(name);\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 validatePackageName(name);\n return execBrew(['uninstall', name]);\n}\n\nexport async function serviceAction(name: string, action: 'start' | 'stop' | 'restart'): Promise<string> {\n validatePackageName(name);\n return execBrew(['services', action, name]);\n}\n\n// ARQ-008: Pin/unpin operations moved from outdated view\nexport async function pinPackage(name: string): Promise<string> {\n validatePackageName(name);\n return execBrew(['pin', name]);\n}\n\nexport async function unpinPackage(name: string): Promise<string> {\n validatePackageName(name);\n return execBrew(['unpin', 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\nconst DEFAULT_TIMEOUT_MS = 30_000; // 30 seconds for instant commands\nconst STREAM_IDLE_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes idle timeout for streaming\n\nexport async function execBrew(args: string[], timeoutMs = DEFAULT_TIMEOUT_MS): 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 let killed = false;\n\n // EP-012: Timeout with AbortController pattern\n const timer = setTimeout(() => {\n killed = true;\n proc.kill();\n reject(new Error(`brew ${args.join(' ')} timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\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 clearTimeout(timer);\n if (killed) return;\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 clearTimeout(timer);\n if (killed) return;\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 let lastOutputAt = Date.now();\n\n const push = (chunk: Buffer) => {\n lastOutputAt = Date.now();\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 // EP-012: Kill process if idle for too long\n if (Date.now() - lastOutputAt > STREAM_IDLE_TIMEOUT_MS) {\n proc.kill();\n throw new Error(`brew ${args.join(' ')} timed out: no output for ${STREAM_IDLE_TIMEOUT_MS / 1000}s`);\n }\n await new Promise((r) => setTimeout(r, 100));\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';\nimport { COLORS } from '../../utils/colors.js';\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={COLORS.muted}>{label}</Text>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { Spinner } from '@inkjs/ui';\nimport { COLORS } from '../../utils/colors.js';\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={COLORS.error} bold>{'\\u2718'} {t('error_prefix')}</Text>\n <Text color={COLORS.error}>{message}</Text>\n </Box>\n );\n}\n","import React from 'react';\nimport { Text } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\n\ntype BadgeVariant = 'success' | 'warning' | 'error' | 'info' | 'muted';\n\nconst BADGE_STYLES: Record<BadgeVariant, { icon: string; color: string }> = {\n success: { icon: '\\u2714', color: COLORS.success },\n warning: { icon: '\\u25CF', color: COLORS.warning },\n error: { icon: '\\u2718', color: COLORS.error },\n info: { icon: '\\u25C6', color: COLORS.blue },\n muted: { icon: '\\u25CB', color: COLORS.textSecondary },\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 { COLORS } from '../../utils/colors.js';\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 = COLORS.gold, 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={COLORS.textSecondary}>({count})</Text>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { Text } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\nimport { t } from '../../i18n/index.js';\n\ninterface VersionArrowProps {\n current: string;\n latest: string;\n}\n\nexport function VersionArrow({ current, latest }: VersionArrowProps) {\n return (\n <>\n <Text color={COLORS.muted}>{t('version_installed')} </Text>\n <Text color={COLORS.error}>{current}</Text>\n <Text color={COLORS.warning}>{' \\u2500\\u2500 '}</Text>\n <Text color={COLORS.gold}>{'\\u25B6'}</Text>\n <Text color={COLORS.muted}> {t('version_available')} </Text>\n <Text color={COLORS.teal}>{latest}</Text>\n </>\n );\n}\n","import { getLocale, 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 formatDate(value: string | number | Date): string {\n const date = value instanceof Date ? value : new Date(value);\n const locale = getLocale();\n return date.toLocaleDateString(locale === 'es' ? 'es-ES' : 'en-US');\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, useMemo, useEffect } from 'react';\nimport { Box, Text, useInput, useStdout } 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 { ResultBanner } from '../components/common/result-banner.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { COLORS } from '../utils/colors.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 const { stdout } = useStdout();\n const cols = stdout?.columns ?? 80;\n const nameWidth = Math.floor(cols * 0.35);\n const versionWidth = Math.floor(cols * 0.15);\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 // Stream finished but still showing — Esc dismisses and refreshes\n if (!stream.isRunning && stream.lines.length > 0) {\n if (key.escape) {\n stream.clear();\n void fetchInstalled();\n }\n return;\n }\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, tab === 'formulae' ? 'formula' : 'cask');\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 <Text color={COLORS.textSecondary}>esc:{t('hint_cancel')}</Text>\n )}\n {!stream.isRunning && (\n <Box flexDirection=\"column\" marginTop={1}>\n <ResultBanner\n status={stream.error ? 'error' : 'success'}\n message={stream.error ? `\\u2718 ${stream.error}` : `\\u2714 ${t('pkgInfo_done')}`}\n />\n <Text color={COLORS.textSecondary}>esc:{t('hint_back')}</Text>\n </Box>\n )}\n </Box>\n );\n }\n\n const MAX_VISIBLE_ROWS = Math.max(5, (stdout?.rows ?? 24) - 8);\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' ? COLORS.info : COLORS.textSecondary}\n paddingX={1}\n >\n <Text bold={tab === 'formulae'} color={tab === 'formulae' ? COLORS.info : COLORS.textSecondary}>\n {'\\u{1F4E6}'} {t('installed_formulaeCount', { count: formulae.length })}\n </Text>\n </Box>\n <Box\n borderStyle=\"round\"\n borderColor={tab === 'casks' ? COLORS.purple : COLORS.textSecondary}\n paddingX={1}\n >\n <Text bold={tab === 'casks'} color={tab === 'casks' ? COLORS.purple : COLORS.textSecondary}>\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={COLORS.gold} 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={COLORS.border}>\n <Text color={COLORS.text} bold>{' '}{t('installed_col_package').padEnd(nameWidth)}</Text>\n <Text color={COLORS.text} bold>{t('installed_col_version').padEnd(versionWidth)}</Text>\n <Text color={COLORS.text} bold>{t('installed_col_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={COLORS.textSecondary} italic>{t('installed_noPackages')}</Text>\n </Box>\n )}\n {start > 0 && (\n <Text color={COLORS.textSecondary} 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 <SelectableRow key={item.name} isCurrent={isCurrent}>\n <Text bold={isCurrent} inverse={isCurrent} color={isCurrent ? COLORS.text : COLORS.muted}>\n {truncate(item.name, nameWidth).padEnd(nameWidth)}\n </Text>\n <Text color={COLORS.teal}>{item.version.padEnd(versionWidth)}</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={COLORS.textSecondary} dimColor>{truncate(item.desc, 30)}</Text>\n )}\n </SelectableRow>\n );\n })}\n {start + MAX_VISIBLE_ROWS < allItems.length && (\n <Text color={COLORS.textSecondary} 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={COLORS.text} 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 { detectAction } from '../lib/history/history-logger.js';\nimport { useLicenseStore } from '../stores/license-store.js';\n\nconst MAX_LINES = 100;\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 const isPro = useLicenseStore.getState().isPro();\n const { appendEntry } = await import('../lib/history/history-logger.js');\n await appendEntry(isPro, 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 { COLORS } from '../../utils/colors.js';\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={COLORS.gold}>{'\\u{1F50D}'} </Text>\n {isActive ? (\n <TextInput\n placeholder={resolvedPlaceholder}\n defaultValue={defaultValue}\n onChange={onChange}\n />\n ) : (\n <Text color={COLORS.textSecondary}>{defaultValue || placeholder}</Text>\n )}\n </Box>\n );\n}\n","import React, { useEffect } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\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={COLORS.purple} paddingX={2} paddingY={1} flexDirection=\"column\">\n <Text bold color={COLORS.text}>{message}</Text>\n <Box marginTop={1}>\n <Text color={COLORS.success}>{t('confirm_yes')}</Text>\n <Text> / </Text>\n <Text color={COLORS.error}>{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 { COLORS } from '../../utils/colors.js';\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={COLORS.sky} paddingX={1}>\n {title && (\n <Box marginBottom={1}>\n {isRunning && <Spinner label=\"\" />}\n <Text bold color={COLORS.sky}> {title}</Text>\n </Box>\n )}\n {visible.map((line, i) => (\n <Text key={lines.length - visible.length + i} color={COLORS.muted} wrap=\"wrap\">{line}</Text>\n ))}\n {lines.length === 0 && !isRunning && (\n <Text color={COLORS.textSecondary} italic>{t('progress_noOutput')}</Text>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\n\ninterface ResultBannerProps {\n status: 'success' | 'error' | 'warning' | 'info';\n message: string;\n}\n\nconst STATUS_COLORS: Record<string, string> = {\n success: COLORS.success,\n error: COLORS.error,\n warning: COLORS.warning,\n info: COLORS.info,\n};\n\nexport function ResultBanner({ status, message }: ResultBannerProps) {\n return (\n <Box borderStyle=\"round\" borderColor={STATUS_COLORS[status]} paddingX={2} paddingY={0}>\n <Text color={STATUS_COLORS[status]} bold>{message}</Text>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\n\ninterface SelectableRowProps {\n isCurrent: boolean;\n children: React.ReactNode;\n gap?: number;\n}\n\nexport function SelectableRow({ isCurrent, children, gap = 1 }: SelectableRowProps) {\n return (\n <Box gap={gap}>\n <Text color={isCurrent ? COLORS.success : COLORS.muted}>\n {isCurrent ? '\\u25B6' : ' '}\n </Text>\n {children}\n </Box>\n );\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 { ResultBanner } from '../components/common/result-banner.js';\nimport { COLORS } from '../utils/colors.js';\nimport { SelectableRow } from '../components/common/selectable-row.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 [searchError, setSearchError] = useState<string | null>(null);\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) {\n setResults(null);\n setSearchError(t('search_minChars'));\n return;\n }\n setSearching(true);\n setSearchError(null);\n try {\n const r = await api.search(term);\n setResults(r);\n setCursor(0);\n } catch (err) {\n setResults({ formulae: [], casks: [] });\n setSearchError(err instanceof Error ? err.message : t('search_failed'));\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 MAX_VISIBLE = 20;\n const visibleFormulae = results ? results.formulae.slice(0, MAX_VISIBLE) : [];\n const visibleCasks = results ? results.casks.slice(0, MAX_VISIBLE) : [];\n const allVisible = [...visibleFormulae, ...visibleCasks];\n\n useInput((input, key) => {\n if (stream.isRunning) {\n if (key.escape) stream.cancel();\n return;\n }\n if (stream.lines.length > 0) {\n if (key.escape) {\n stream.clear();\n }\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 && allVisible[cursor]) {\n selectPackage(allVisible[cursor]);\n navigate('package-info');\n return;\n }\n\n // 'i' → install directly (with confirmation)\n if (input === 'i' && allVisible[cursor]) {\n setConfirmInstall(allVisible[cursor]);\n return;\n }\n\n if (input === 'j' || key.downArrow) {\n setCursor((c) => Math.min(c + 1, Math.max(0, allVisible.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={COLORS.textSecondary}>esc:{t('hint_cancel')}</Text>\n )}\n {!stream.isRunning && (\n <Box flexDirection=\"column\" marginTop={1}>\n <ResultBanner\n status={stream.error ? 'error' : 'success'}\n message={stream.error ? `\\u2718 ${stream.error}` : `\\u2714 ${t('search_installComplete')}`}\n />\n <Text color={COLORS.textSecondary}>esc:{t('hint_clear')}</Text>\n </Box>\n )}\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text color={COLORS.gold}>{'\\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={COLORS.text}>{query}</Text>\" <Text color={COLORS.textSecondary}>{t('search_escToClear')}</Text></Text>\n )}\n </Box>\n\n {searching && <Loading message={t('loading_searching')} />}\n\n {searchError && (\n <Box marginBottom={1}>\n <Text color={COLORS.error}>{searchError}</Text>\n </Box>\n )}\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 {visibleFormulae.length > 0 && (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold color={COLORS.info}>{t('search_formulaeHeader', { count: results.formulae.length })}</Text>\n {visibleFormulae.map((name, i) => {\n const isCurrent = i === cursor;\n return (\n <SelectableRow key={name} isCurrent={isCurrent}>\n <Text bold={isCurrent} inverse={isCurrent}>{name}</Text>\n </SelectableRow>\n );\n })}\n {results.formulae.length > MAX_VISIBLE && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: results.formulae.length - MAX_VISIBLE })}</Text>\n )}\n </Box>\n )}\n\n {visibleCasks.length > 0 && (\n <Box flexDirection=\"column\">\n <Text bold color={COLORS.purple}>{t('search_casksHeader', { count: results.casks.length })}</Text>\n {visibleCasks.map((name, i) => {\n const idx = visibleFormulae.length + i;\n const isCurrent = idx === cursor;\n return (\n <SelectableRow key={name} isCurrent={isCurrent}>\n <Text bold={isCurrent} inverse={isCurrent}>{name}</Text>\n </SelectableRow>\n );\n })}\n {results.casks.length > MAX_VISIBLE && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: results.casks.length - MAX_VISIBLE })}</Text>\n )}\n </Box>\n )}\n\n {allVisible.length === 0 && (\n <Box borderStyle=\"round\" borderColor={COLORS.textSecondary} paddingX={2}>\n <Text color={COLORS.textSecondary} italic>{t('search_noResults')}</Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color={COLORS.text} bold>\n {allVisible.length > 0 ? `${cursor + 1}/${allVisible.length}` : ''}\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport { useBrewStore } from '../stores/brew-store.js';\nimport { useBrewStream } from '../hooks/use-brew-stream.js';\nimport { pinPackage, unpinPackage } from '../lib/brew-api.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 { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { VersionArrow } from '../components/common/version-arrow.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { COLORS } from '../utils/colors.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 (stream.lines.length > 0) {\n if (key.escape) {\n stream.clear();\n return;\n }\n if (input === 'r') {\n stream.clear();\n void fetchOutdated();\n }\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 // ARQ-008: Use brew-api functions instead of direct execBrew\n const pkg = allOutdated[cursor];\n void (pkg.pinned ? unpinPackage(pkg.name) : pinPackage(pkg.name)).then(() => void fetchOutdated());\n return;\n } else if (input === 'r') {\n void fetchOutdated();\n }\n });\n\n const { stdout } = useStdout();\n const MAX_VISIBLE_ROWS = Math.max(5, (stdout?.rows ?? 24) - 8);\n const start = Math.max(0, cursor - Math.floor(MAX_VISIBLE_ROWS / 2));\n const visible = allOutdated.slice(start, start + MAX_VISIBLE_ROWS);\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={COLORS.textSecondary}>esc:{t('hint_cancel')}</Text>\n )}\n {!stream.isRunning && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box borderStyle=\"round\" borderColor={stream.error ? COLORS.error : COLORS.success} paddingX={2} paddingY={0}>\n <Text color={stream.error ? COLORS.error : COLORS.success} bold>\n {stream.error ? `\\u2718 ${stream.error}` : `\\u2714 ${t('outdated_upgradeComplete')}`}\n </Text>\n <Text color={COLORS.muted}> {t('outdated_pressRefresh')}</Text>\n </Box>\n <Text color={COLORS.textSecondary}>r:{t('hint_refresh')} esc:{t('hint_clear')}</Text>\n </Box>\n )}\n </Box>\n );\n }\n\n // SCR-012: Build package list for upgrade-all confirmation\n const upgradeAllMessage = confirmAction?.type === 'all'\n ? `${t('outdated_confirmAll', { count: allOutdated.length })}\\n${t('outdated_upgradeAllList', { list: allOutdated.map(p => p.name).join(', ') })}`\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 ? upgradeAllMessage\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 <ResultBanner status=\"success\" message={`\\u2714 ${t('outdated_upToDate')}`} />\n </Box>\n )}\n\n {allOutdated.length > 0 && !confirmAction && (\n <Box flexDirection=\"column\" marginTop={1}>\n {start > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreAbove', { count: start })}</Text>\n )}\n {visible.map((pkg, i) => {\n const idx = start + i;\n const isCurrent = idx === cursor;\n return (\n <SelectableRow key={pkg.name} isCurrent={isCurrent}>\n <Text bold={isCurrent} inverse={isCurrent} color={isCurrent ? COLORS.text : COLORS.muted}>\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 </SelectableRow>\n );\n })}\n {start + MAX_VISIBLE_ROWS < allOutdated.length && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: allOutdated.length - start - MAX_VISIBLE_ROWS })}</Text>\n )}\n\n <Box marginTop={1}>\n <Text color={COLORS.text} 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 { COLORS } from '../utils/colors.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 packageType = useNavigationStore((s) => s.selectedPackageType);\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\n // SCR-008: Try cask-specific info if we know it's a cask\n const fetchInfo = async () => {\n if (packageType === 'cask') {\n // Try cask first, fall back to formula\n const caskInfo = await api.getCaskInfo(packageName);\n if (caskInfo && mountedRef.current) {\n // Convert cask to a formula-like shape for display\n const formulaLike: Formula = {\n name: caskInfo.token,\n full_name: caskInfo.full_token,\n tap: '',\n desc: caskInfo.desc,\n license: '',\n homepage: caskInfo.homepage,\n versions: { stable: caskInfo.version, head: null, bottle: false },\n dependencies: [],\n build_dependencies: [],\n installed: caskInfo.installed ? [{\n version: caskInfo.installed,\n used_options: [],\n built_as_bottle: false,\n poured_from_bottle: false,\n time: caskInfo.installed_time ?? 0,\n runtime_dependencies: [],\n installed_as_dependency: false,\n installed_on_request: true,\n }] : [],\n linked_keg: null,\n pinned: false,\n outdated: caskInfo.outdated,\n deprecated: false,\n keg_only: false,\n caveats: null,\n };\n setFormula(formulaLike);\n setLoading(false);\n return;\n }\n }\n // Default: try formula info\n const f = await api.getFormulaInfo(packageName);\n if (mountedRef.current) { setFormula(f); setLoading(false); }\n };\n\n fetchInfo().catch((err) => {\n if (mountedRef.current) { setError(err.message); setLoading(false); }\n });\n }, [packageName, packageType]);\n\n useEffect(() => {\n if (!stream.isRunning && !stream.error && stream.lines.length > 0 && !hasRefreshed.current && packageName) {\n hasRefreshed.current = true;\n const refreshFn = packageType === 'cask'\n ? api.getCaskInfo(packageName).then((c) => c ? { ...c, installed: c.installed ? [{ version: c.installed }] : [] } as unknown as import('../lib/types.js').Formula : null)\n : api.getFormulaInfo(packageName);\n refreshFn\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={COLORS.textSecondary} 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={COLORS.textSecondary}>esc:{t('hint_cancel')}</Text>\n )}\n {!stream.isRunning && (\n <>\n <Text color={stream.error ? COLORS.error : COLORS.success} bold>\n {stream.error ? `\\u2718 ${stream.error}` : `\\u2714 ${t('pkgInfo_done')}`}\n </Text>\n <Text color={COLORS.textSecondary}>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={COLORS.teal}>{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={[COLORS.text, COLORS.muted]} />\n <Box borderStyle=\"round\" borderColor={COLORS.border} paddingX={2} flexDirection=\"column\">\n <Text><Text color={COLORS.muted}>{t('pkgInfo_homepage')}</Text> {formula.homepage}</Text>\n <Text><Text color={COLORS.muted}>{t('pkgInfo_license')}</Text> {formula.license}</Text>\n <Text><Text color={COLORS.muted}>{t('pkgInfo_tap')}</Text> {formula.tap}</Text>\n <Text><Text color={COLORS.muted}>{t('pkgInfo_stable')}</Text> {formula.versions.stable}</Text>\n {installed && (\n <>\n <Text><Text color={COLORS.muted}>{t('pkgInfo_installed')}</Text> {installed.version} ({formatRelativeTime(installed.time)})</Text>\n <Text><Text color={COLORS.muted}>{t('pkgInfo_bottle')}</Text> {installed.poured_from_bottle ? t('common_yes') : t('common_no')}</Text>\n <Text><Text color={COLORS.muted}>{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={COLORS.muted}>{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={COLORS.warning} />\n <Box borderStyle=\"round\" borderColor={COLORS.warning} paddingX={2}>\n <Text color={COLORS.warning}>{formula.caveats}</Text>\n </Box>\n </Box>\n )}\n </Box>\n\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>\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, useStdout } 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 { SelectableRow } from '../components/common/selectable-row.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\n\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 // SCR-014: Persist last error until explicitly cleared\n const [lastError, setLastError] = useState<string | null>(null);\n const { stdout } = useStdout();\n const cols = stdout?.columns ?? 80;\n const svcNameWidth = Math.floor(cols * 0.35);\n const svcStatusWidth = Math.floor(cols * 0.15);\n const MAX_VISIBLE_ROWS = Math.max(5, (stdout?.rows ?? 24) - 10);\n\n useEffect(() => { fetchServices(); }, []);\n\n useInput((input, key) => {\n if (actionInProgress) return;\n if (confirmAction) return;\n\n // Clear last error on any key press\n if (lastError) { setLastError(null); }\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)\n .catch((err) => {\n setLastError(err instanceof Error ? err.message : String(err));\n })\n .finally(() => {\n setActionInProgress(false);\n // SCR-014: Check store for errors after action\n const storeError = useBrewStore.getState().errors['service-action'];\n if (storeError) setLastError(storeError);\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={COLORS.textSecondary} italic>{t('services_noServices')}</Text>\n </Box>\n );\n }\n\n const start = Math.max(0, cursor - Math.floor(MAX_VISIBLE_ROWS / 2));\n const visible = services.slice(start, start + MAX_VISIBLE_ROWS);\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)\n .catch((err) => {\n setLastError(err instanceof Error ? err.message : String(err));\n })\n .finally(() => {\n setActionInProgress(false);\n const storeError = useBrewStore.getState().errors['service-action'];\n if (storeError) setLastError(storeError);\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={COLORS.border} paddingBottom={0}>\n <Text bold color={COLORS.text}>{' '}{t('services_name').padEnd(svcNameWidth)}</Text>\n <Text bold color={COLORS.text}>{t('services_status').padEnd(svcStatusWidth)}</Text>\n <Text bold color={COLORS.text}>{t('services_user')}</Text>\n </Box>\n\n {start > 0 && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreAbove', { count: start })}</Text>\n )}\n\n {visible.map((svc, i) => {\n const idx = start + i;\n const isCurrent = idx === cursor;\n return (\n <SelectableRow key={svc.name} isCurrent={isCurrent}>\n <Text bold={isCurrent} inverse={isCurrent} color={isCurrent ? COLORS.text : COLORS.muted}>\n {svc.name.padEnd(svcNameWidth - 2)}\n </Text>\n <StatusBadge label={svc.status} variant={STATUS_VARIANTS[svc.status]} />\n <Text color={COLORS.muted}>{svc.user ?? '-'}</Text>\n {svc.exit_code != null && svc.exit_code !== 0 && (\n <Text color={COLORS.error}>{t('common_exit', { code: svc.exit_code })}</Text>\n )}\n </SelectableRow>\n );\n })}\n\n {start + MAX_VISIBLE_ROWS < services.length && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: services.length - start - MAX_VISIBLE_ROWS })}</Text>\n )}\n </Box>\n\n {actionInProgress && <Text color={COLORS.sky}>{t('services_processing')}</Text>}\n\n {/* SCR-014: Persistent error display */}\n {lastError && (\n <Box marginTop={1}>\n <Text color={COLORS.error}>{lastError}</Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color={COLORS.text} bold>\n {cursor + 1}/{services.length}\n </Text>\n </Box>\n </Box>\n );\n}\n","import React, { useEffect, useRef } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { useBrewStore } from '../stores/brew-store.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { COLORS } from '../utils/colors.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 // FE-006: Mounted ref for cleanup\n const mountedRef = useRef(true);\n useEffect(() => {\n mountedRef.current = true;\n return () => { mountedRef.current = false; };\n }, []);\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 <ResultBanner status=\"success\" message={`\\u2714 ${t('doctor_clean')}`} />\n )}\n\n {doctorClean === false && doctorWarnings.length === 0 && (\n <Text color={COLORS.warning}>{t('doctor_warningsNotCaptured')}</Text>\n )}\n\n {doctorWarnings.map((warning, i) => (\n // FE-004: Improved React key\n <Box key={`warning-${i}-${warning.slice(0, 20)}`} flexDirection=\"column\" marginBottom={1} borderStyle=\"single\" borderColor={COLORS.warning} paddingX={1}>\n {warning.split('\\n').map((line, j) => (\n <Text key={`warning-${i}-${j}-${line.slice(0, 20)}`} color={j === 0 ? COLORS.warning : COLORS.muted}>{line}</Text>\n ))}\n </Box>\n ))}\n </Box>\n\n <Box marginTop={1}>\n <Text color={COLORS.text} 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, useInput } from 'ink';\nimport { useProfileStore } from '../stores/profile-store.js';\nimport { useLicenseStore } from '../stores/license-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 { ResultBanner } from '../components/common/result-banner.js';\nimport { t } from '../i18n/index.js';\nimport { useModalStore } from '../stores/modal-store.js';\nimport * as manager from '../lib/profiles/profile-manager.js';\nimport { ProfileListMode } from './profiles/profile-list-mode.js';\nimport { ProfileDetailMode } from './profiles/profile-detail-mode.js';\nimport { ProfileCreateName, ProfileCreateDesc } from './profiles/profile-create-flow.js';\nimport { ProfileEditName, ProfileEditDesc } from './profiles/profile-edit-flow.js';\n\ntype Mode = 'list' | 'detail' | 'create-name' | 'create-desc' | 'confirm-import' | '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 [importHadError, setImportHadError] = useState(false);\n const [importProfile, setImportProfile] = useState<Awaited<ReturnType<typeof manager.loadProfile>> | null>(null);\n const { openModal, closeModal } = useModalStore();\n const importGenRef = useRef<AsyncGenerator<string> | null>(null);\n const mountedRef = useRef(true);\n\n useEffect(() => { fetchProfiles(); }, []);\n\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 useEffect(() => {\n if (mode !== 'list') {\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 prepareImport(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 useInput(() => {\n setMode('list');\n }, { isActive: mode === 'importing' && !importRunning });\n\n // SCR-005: Show import summary before starting\n const prepareImport = async (name: string) => {\n try {\n const isPro = useLicenseStore.getState().isPro();\n const profile = await manager.loadProfile(isPro, name);\n setImportProfile(profile);\n setMode('confirm-import');\n } catch (err) {\n setImportLines([`${t('error_prefix')}${err instanceof Error ? err.message : err}`]);\n setMode('importing');\n setImportRunning(false);\n }\n };\n\n const startImport = async (profile: Awaited<ReturnType<typeof manager.loadProfile>>) => {\n setMode('importing');\n setImportLines([]);\n setImportRunning(true);\n setImportHadError(false);\n try {\n const isPro = useLicenseStore.getState().isPro();\n const gen = manager.importProfile(isPro, 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 setImportHadError(true);\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 === 'confirm-import' && importProfile) {\n return (\n <Box flexDirection=\"column\">\n <ConfirmDialog\n message={t('profiles_importSummary', {\n formulae: String(importProfile.formulae.length),\n casks: String(importProfile.casks.length),\n })}\n onConfirm={() => {\n const profile = importProfile;\n setImportProfile(null);\n void startImport(profile);\n }}\n onCancel={() => {\n setImportProfile(null);\n setMode('list');\n }}\n />\n </Box>\n );\n }\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 <ResultBanner status={importHadError ? 'error' : 'success'} message={importHadError ? t('profiles_importPartial') : `\\u2714 ${t('profiles_importComplete')}`} />\n </Box>\n )}\n </Box>\n );\n }\n\n if (mode === 'create-name') {\n return <ProfileCreateName onSubmit={(val) => { setNewName(val); setMode('create-desc'); }} />;\n }\n\n if (mode === 'create-desc') {\n return (\n <ProfileCreateDesc\n name={newName}\n loadError={loadError}\n onSubmit={async (val) => {\n try {\n await exportCurrent(newName, val);\n } finally {\n setMode('list');\n setNewName('');\n }\n }}\n />\n );\n }\n\n if (mode === 'edit-name') {\n return <ProfileEditName defaultName={editName} onSubmit={(val) => { setEditName(val); setMode('edit-desc'); }} />;\n }\n\n if (mode === 'edit-desc') {\n return (\n <ProfileEditDesc\n name={editName}\n defaultDesc={editDesc}\n loadError={loadError}\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 );\n }\n\n if (mode === 'detail' && selectedProfile) {\n return <ProfileDetailMode profile={selectedProfile} />;\n }\n\n return (\n <ProfileListMode\n profileNames={profileNames}\n cursor={cursor}\n confirmDelete={confirmDelete}\n loadError={loadError}\n onConfirmDelete={() => { void deleteProfile(profileNames[cursor]); setConfirmDelete(false); }}\n onCancelDelete={() => setConfirmDelete(false)}\n />\n );\n}\n","import { create } from 'zustand';\nimport type { Profile } from '../lib/profiles/types.js';\nimport * as manager from '../lib/profiles/profile-manager.js';\nimport { useLicenseStore } from './license-store.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\nfunction getIsPro(): boolean {\n return useLicenseStore.getState().isPro();\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(getIsPro());\n set({ profileNames: names, loading: false });\n },\n\n loadProfile: async (name) => {\n set({ loadError: null });\n try {\n const profile = await manager.loadProfile(getIsPro(), 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 const license = useLicenseStore.getState().license;\n await manager.exportCurrentSetup(getIsPro(), name, description, license);\n const names = await manager.listProfiles(getIsPro());\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(getIsPro(), name);\n const names = await manager.listProfiles(getIsPro());\n set({ profileNames: names, selectedProfile: null });\n },\n\n updateProfile: async (oldName, newName, newDescription) => {\n set({ loadError: null });\n try {\n await manager.updateProfile(getIsPro(), oldName, newName, newDescription);\n const names = await manager.listProfiles(getIsPro());\n const updated = await manager.loadProfile(getIsPro(), 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, rename } 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 { getWatermark } from '../license/watermark.js';\nimport type { LicenseData } from '../license/types.js';\nimport type { Profile, ProfileFile } from './types.js';\n\nfunction proCheck(isPro: boolean): void {\n if (!isPro) throw new Error('Pro license required');\n}\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(isPro: boolean): Promise<string[]> {\n proCheck(isPro);\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(isPro: boolean, name: string): Promise<Profile> {\n proCheck(isPro);\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.version !== 1) {\n // Future: add migration logic here\n throw new Error('Unsupported data version');\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(isPro: boolean, profile: Profile): Promise<void> {\n proCheck(isPro);\n await ensureDataDirs();\n\n // BK-002: Atomic write via temp file + rename\n const filePath = profilePath(profile.name);\n const tmpPath = filePath + '.tmp';\n const file: ProfileFile = { version: 1, profile };\n await writeFile(tmpPath, JSON.stringify(file, null, 2), { encoding: 'utf-8', mode: 0o600 });\n await rename(tmpPath, filePath);\n}\n\nexport async function deleteProfile(isPro: boolean, name: string): Promise<void> {\n proCheck(isPro);\n try {\n await rm(profilePath(name));\n } catch { /* may not exist */ }\n}\n\nexport async function exportCurrentSetup(isPro: boolean, name: string, description: string, license: LicenseData | null = null, consent = true): Promise<Profile> {\n proCheck(isPro);\n\n // BK-007: Check if profile already exists\n const existingNames = await listProfiles(isPro);\n if (existingNames.includes(name)) {\n throw new Error('Profile already exists: ' + name);\n }\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: consent ? getWatermark(license) : '', // SEG-003: Only embed watermark with consent\n };\n\n await saveProfile(isPro, profile);\n return profile;\n}\n\nexport async function updateProfile(isPro: boolean, oldName: string, newName: string, newDescription: string): Promise<void> {\n proCheck(isPro);\n const profile = await loadProfile(isPro, oldName);\n if (oldName !== newName) {\n await deleteProfile(isPro, oldName);\n }\n const updated: Profile = {\n ...profile,\n name: newName,\n description: newDescription,\n updatedAt: new Date().toISOString(),\n };\n await saveProfile(isPro, updated);\n}\n\n// Validation patterns for brew package/tap names to prevent command injection\nconst TAP_PATTERN = /^[a-z0-9][-a-z0-9]*\\/[a-z0-9][-a-z0-9]*$/;\nconst PKG_PATTERN = /^[a-z0-9][-a-z0-9_.@+]*$/;\n\nexport async function* importProfile(isPro: boolean, profile: Profile): AsyncGenerator<string> {\n proCheck(isPro);\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 (validated)\n for (const tap of profile.taps) {\n if (!TAP_PATTERN.test(tap)) {\n yield `Skipping invalid tap name: ${tap}`;\n continue;\n }\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 (validated)\n const missingFormulae = profile.formulae.filter((f) => !installedFormulae.has(f));\n for (const name of missingFormulae) {\n if (!PKG_PATTERN.test(name)) {\n yield `Skipping invalid formula name: ${name}`;\n continue;\n }\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 (validated)\n const missingCasks = profile.casks.filter((c) => !installedCasks.has(c));\n for (const name of missingCasks) {\n if (!PKG_PATTERN.test(name)) {\n yield `Skipping invalid cask name: ${name}`;\n continue;\n }\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 type { LicenseData } from './types.js';\n\n/**\n * Get a watermark string containing the license holder's email.\n * Used subtly in Pro feature output for traceability.\n *\n * SEG-003: The `consent` parameter controls whether the watermark is embedded.\n * If false or undefined, returns an empty string.\n */\nexport function getWatermark(license: LicenseData | null, consent = true): string {\n if (!consent) return '';\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 from 'react';\nimport { Box, Text } from 'ink';\nimport { ConfirmDialog } from '../../components/common/confirm-dialog.js';\nimport { SectionHeader } from '../../components/common/section-header.js';\nimport { COLORS } from '../../utils/colors.js';\nimport { SelectableRow } from '../../components/common/selectable-row.js';\nimport { GRADIENTS } from '../../utils/gradient.js';\nimport { t } from '../../i18n/index.js';\n\ninterface ProfileListModeProps {\n profileNames: string[];\n cursor: number;\n confirmDelete: boolean;\n loadError: string | null;\n onConfirmDelete: () => void;\n onCancelDelete: () => void;\n}\n\nexport function ProfileListMode({ profileNames, cursor, confirmDelete, loadError, onConfirmDelete, onCancelDelete }: ProfileListModeProps) {\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji={'\\u{1F4C1}'} title={t('profiles_title', { count: profileNames.length })} gradient={GRADIENTS.gold} />\n\n {/* SCR-004: Display load errors */}\n {loadError && (\n <Box marginY={1}>\n <Text color={COLORS.error}>{loadError}</Text>\n </Box>\n )}\n\n {confirmDelete && profileNames[cursor] && (\n <Box marginY={1}>\n <ConfirmDialog\n message={t('profiles_confirmDelete', { name: profileNames[cursor] })}\n onConfirm={onConfirmDelete}\n onCancel={onCancelDelete}\n />\n </Box>\n )}\n\n {profileNames.length === 0 && !confirmDelete && (\n <Box marginTop={1} borderStyle=\"round\" borderColor={COLORS.textSecondary} paddingX={2} paddingY={0}>\n <Box flexDirection=\"column\">\n <Text color={COLORS.textSecondary} italic>{t('profiles_noProfiles')}</Text>\n <Text color={COLORS.muted}>{t('profiles_press')} <Text color={COLORS.gold} 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 <SelectableRow key={name} isCurrent={isCurrent}>\n <Text bold={isCurrent} inverse={isCurrent}>{name}</Text>\n </SelectableRow>\n );\n })}\n <Box marginTop={1}>\n <Text color={COLORS.text} bold>{cursor + 1}/{profileNames.length}</Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { COLORS } from '../../utils/colors.js';\nimport { t } from '../../i18n/index.js';\nimport { formatDate } from '../../utils/format.js';\nimport type { Profile } from '../../lib/profiles/types.js';\n\ninterface ProfileDetailModeProps {\n profile: Profile;\n}\n\nexport function ProfileDetailMode({ profile }: ProfileDetailModeProps) {\n return (\n <Box flexDirection=\"column\">\n <Text bold color={COLORS.gold}>{profile.name}</Text>\n <Text color={COLORS.muted}>{profile.description}</Text>\n <Text color={COLORS.muted}>{t('profiles_created', { date: formatDate(profile.createdAt) })}</Text>\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>{t('profiles_formulaeCount', { count: profile.formulae.length })}</Text>\n <Box paddingLeft={2} flexDirection=\"column\">\n {profile.formulae.slice(0, 30).map((f) => (\n <Text key={f} color={COLORS.muted}>{f}</Text>\n ))}\n {profile.formulae.length > 30 && (\n <Text color={COLORS.textSecondary} italic>{t('common_andMore', { count: profile.formulae.length - 30 })}</Text>\n )}\n </Box>\n <Text bold>{t('profiles_casksCount', { count: profile.casks.length })}</Text>\n <Box paddingLeft={2} flexDirection=\"column\">\n {profile.casks.map((c) => (\n <Text key={c} color={COLORS.muted}>{c}</Text>\n ))}\n </Box>\n </Box>\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>esc:{t('hint_back')} e:{t('hint_edit')} i:{t('hint_importProfile')}</Text>\n </Box>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { TextInput } from '@inkjs/ui';\nimport { COLORS } from '../../utils/colors.js';\nimport { t } from '../../i18n/index.js';\n\ninterface ProfileCreateNameProps {\n onSubmit: (name: string) => void;\n}\n\nexport function ProfileCreateName({ onSubmit }: ProfileCreateNameProps) {\n return (\n <Box flexDirection=\"column\">\n <Text bold>{t('profiles_createName')}</Text>\n <TextInput\n placeholder={t('profiles_namePlaceholder')}\n onSubmit={onSubmit}\n />\n </Box>\n );\n}\n\ninterface ProfileCreateDescProps {\n name: string;\n loadError: string | null;\n onSubmit: (desc: string) => void;\n}\n\nexport function ProfileCreateDesc({ name, loadError, onSubmit }: ProfileCreateDescProps) {\n return (\n <Box flexDirection=\"column\">\n <Text bold>{t('profiles_createDesc', { name })}</Text>\n {loadError && <Text color={COLORS.error}>{t('error_prefix')}{loadError}</Text>}\n <TextInput\n placeholder={t('profiles_descPlaceholder')}\n onSubmit={onSubmit}\n />\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport { TextInput } from '@inkjs/ui';\nimport { COLORS } from '../../utils/colors.js';\nimport { t } from '../../i18n/index.js';\n\ninterface ProfileEditNameProps {\n defaultName: string;\n onSubmit: (name: string) => void;\n}\n\nexport function ProfileEditName({ defaultName, onSubmit }: ProfileEditNameProps) {\n return (\n <Box flexDirection=\"column\">\n <Text bold>{t('profiles_editName')}</Text>\n <TextInput\n defaultValue={defaultName}\n onSubmit={onSubmit}\n />\n </Box>\n );\n}\n\ninterface ProfileEditDescProps {\n name: string;\n defaultDesc: string;\n loadError: string | null;\n onSubmit: (desc: string) => void;\n}\n\nexport function ProfileEditDesc({ name, defaultDesc, loadError, onSubmit }: ProfileEditDescProps) {\n return (\n <Box flexDirection=\"column\">\n <Text bold>{t('profiles_editDesc', { name })}</Text>\n {loadError && <Text color={COLORS.error}>{t('error_prefix')}{loadError}</Text>}\n <TextInput\n defaultValue={defaultDesc}\n onSubmit={onSubmit}\n />\n </Box>\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 { ResultBanner } from '../components/common/result-banner.js';\nimport { StatCard } from '../components/common/stat-card.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { COLORS } from '../utils/colors.js';\nimport { SelectableRow } from '../components/common/selectable-row.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={COLORS.muted}>esc:{t('hint_cancel')}</Text>\n )}\n\n {!stream.isRunning && !stream.error && (\n <ResultBanner status=\"success\" message={`\\u2714 ${t('cleanup_complete')}`} />\n )}\n\n {!stream.isRunning && stream.error && (\n <Box flexDirection=\"column\" gap={1}>\n <ResultBanner status=\"error\" message={`\\u2718 ${t('cleanup_depError')}`} />\n {isDependencyError && failedNames.length > 0 && (\n <Text color={COLORS.warning}>\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 ? COLORS.warning : COLORS.success} />\n <StatCard label={t('cleanup_reclaimable')} value={summary.totalReclaimableFormatted} color={COLORS.sky} />\n <StatCard label={t('cleanup_selected')} value={selected.size} color={selected.size > 0 ? COLORS.success : COLORS.muted} />\n </Box>\n )}\n\n {/* SCR-001: Two-step confirmation with system tools warning */}\n {confirmClean && (\n <Box flexDirection=\"column\" marginY={1} gap={1}>\n <Box borderStyle=\"round\" borderColor={COLORS.warning} paddingX={2} paddingY={0}>\n <Text color={COLORS.warning}>{t('cleanup_warning_system_tools')}</Text>\n </Box>\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 <ResultBanner status=\"success\" message={`\\u2714 ${t('cleanup_systemClean')}`} />\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 <SelectableRow key={c.name} isCurrent={isCurrent}>\n <Text color={isSelected ? COLORS.success : COLORS.muted}>{isSelected ? '\\u2611' : '\\u2610'}</Text>\n <Text bold={isCurrent} inverse={isCurrent} color={isCurrent ? COLORS.text : COLORS.muted}>{c.name}</Text>\n <Text color={COLORS.warning}>{c.diskUsageFormatted}</Text>\n <Text color={COLORS.textSecondary}>[{c.reason}]</Text>\n </SelectableRow>\n );\n })}\n <Box marginTop={1}>\n <Text color={COLORS.text} 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';\nimport { useLicenseStore } from './license-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 isPro = useLicenseStore.getState().isPro();\n const summary = await analyzeCleanup(isPro, 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 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 isPro: boolean,\n formulae: Formula[],\n leaves: string[],\n): Promise<CleanupSummary> {\n if (!isPro) throw new Error('Pro license required');\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, useStdout } 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 { SelectableRow } from '../components/common/selectable-row.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 { COLORS } from '../utils/colors.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: COLORS.success },\n uninstall: { icon: '-', color: COLORS.error },\n upgrade: { icon: '\\u2191', color: COLORS.info },\n 'upgrade-all': { icon: '\\u21C8', color: COLORS.info },\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 { stdout } = useStdout();\n const MAX_VISIBLE_ROWS = Math.max(5, (stdout?.rows ?? 24) - 8);\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' ? COLORS.text : COLORS.gold}>\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('upgrade_all_warning')\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={COLORS.textSecondary} 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={COLORS.textSecondary} 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 <SelectableRow key={entry.id} isCurrent={isCurrent}>\n <Text color={color} bold>{icon}</Text>\n <Text bold={isCurrent} inverse={isCurrent} color={isCurrent ? COLORS.text : COLORS.muted}>\n {t(ACTION_LABEL_KEYS[entry.action]).padEnd(12)}\n </Text>\n <Text color={COLORS.text}>{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={COLORS.muted}>{formatRelativeTime(ts)}</Text>\n </SelectableRow>\n );\n })}\n {start + MAX_VISIBLE_ROWS < filtered.length && (\n <Text color={COLORS.textSecondary} dimColor> {t('scroll_moreBelow', { count: filtered.length - start - MAX_VISIBLE_ROWS })}</Text>\n )}\n\n <Box marginTop={1}>\n <Text color={COLORS.text} 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 historyLogger from '../lib/history/history-logger.js';\nimport { useLicenseStore } from './license-store.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 isPro = useLicenseStore.getState().isPro();\n const entries = await historyLogger.loadHistory(isPro);\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 const isPro = useLicenseStore.getState().isPro();\n await historyLogger.appendEntry(isPro, action, packageName, success, error);\n const entries = await historyLogger.loadHistory(isPro);\n set({ entries });\n },\n\n clearHistory: async () => {\n const isPro = useLicenseStore.getState().isPro();\n await historyLogger.clearHistory(isPro);\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 { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { COLORS } from '../utils/colors.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t, tp } from '../i18n/index.js';\nimport { formatRelativeTime } from '../utils/format.js';\nimport type { Severity } from '../lib/security/types.js';\n\nconst SEVERITY_COLORS: Record<Severity, string> = {\n CRITICAL: COLORS.error,\n HIGH: COLORS.error,\n MEDIUM: COLORS.warning,\n LOW: COLORS.textSecondary,\n UNKNOWN: COLORS.textSecondary,\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\n// SCR-017: Detect network-related errors\nfunction isNetworkError(msg: string): boolean {\n return /fetch failed|ECONNREFUSED|ENOTFOUND|ETIMEDOUT|network|abort/i.test(msg);\n}\n\nexport function SecurityAuditView() {\n const { summary, loading, error, scan, cachedAt } = 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 // ARQ-005: Manual refresh forces cache invalidation\n if (input === 'r') { void scan(true); 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\n // SCR-017: Show user-friendly message for network errors\n if (error) {\n const displayError = isNetworkError(error) ? t('security_networkError') : error;\n return <ErrorMessage message={displayError} />;\n }\n\n // ARQ-005: Show cache indicator\n const cacheAge = cachedAt ? formatRelativeTime(cachedAt / 1000) : null;\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={COLORS.info} />\n <StatCard\n label={t('security_vulnerable')}\n value={summary.vulnerablePackages}\n color={summary.vulnerablePackages > 0 ? COLORS.error : COLORS.success}\n />\n {summary.criticalCount > 0 && <StatCard label={t('security_critical')} value={summary.criticalCount} color={COLORS.error} />}\n {summary.highCount > 0 && <StatCard label={t('security_high')} value={summary.highCount} color={COLORS.error} />}\n {summary.mediumCount > 0 && <StatCard label={t('security_medium')} value={summary.mediumCount} color={COLORS.warning} />}\n </Box>\n )}\n\n {/* ARQ-005: Cache indicator */}\n {cacheAge && (\n <Text color={COLORS.muted}>{t('security_cachedResults', { time: cacheAge })}</Text>\n )}\n\n {results.length === 0 && summary && (\n <Box marginTop={1}>\n <ResultBanner status=\"success\" message={`\\u2714 ${t('security_noVulns')}`} />\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(true);\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 <SelectableRow isCurrent={isCurrent}>\n <StatusBadge label={pkg.maxSeverity} variant={SEVERITY_BADGE[pkg.maxSeverity]} />\n <Text bold={isCurrent} inverse={isCurrent} color={isCurrent ? COLORS.text : COLORS.muted}>\n {pkg.packageName}\n </Text>\n <Text color={COLORS.muted}>{pkg.installedVersion}</Text>\n <Text color={COLORS.muted}>{tp('plural_vulns', pkg.vulnerabilities.length)}</Text>\n <Text color={COLORS.muted}>{isExpanded ? '\\u25BC' : '\\u25B6'}</Text>\n </SelectableRow>\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={COLORS.muted}>[{vuln.severity}]</Text>\n </Box>\n <Text color={COLORS.muted} wrap=\"wrap\">{vuln.summary}</Text>\n {vuln.fixedVersion && (\n <Text color={COLORS.success}>{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={COLORS.text} 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';\nimport { useLicenseStore } from './license-store.js';\n\nconst CACHE_TTL_MS = 30 * 60 * 1000; // 30 minutes\n\ninterface SecurityState {\n summary: SecurityAuditSummary | null;\n loading: boolean;\n error: string | null;\n cachedAt: number | null;\n\n scan: (forceRefresh?: boolean) => Promise<void>;\n}\n\nexport const useSecurityStore = create<SecurityState>((set, get) => ({\n summary: null,\n loading: false,\n error: null,\n cachedAt: null,\n\n scan: async (forceRefresh = false) => {\n // ARQ-005: Use cached results if available and fresh\n const { summary, cachedAt } = get();\n if (!forceRefresh && summary && cachedAt && Date.now() - cachedAt < CACHE_TTL_MS) {\n return;\n }\n\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 isPro = useLicenseStore.getState().isPro();\n const result = await runSecurityAudit(isPro, formulae, casks);\n set({ summary: result, loading: false, cachedAt: Date.now() });\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';\nimport { fetchWithTimeout } from '../fetch-timeout.js';\nimport { logger } from '../../utils/logger.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 fetchWithTimeout(OSV_BATCH_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ queries }),\n }, 15_000);\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\n // EP-003: Validate response structure\n if (!data || !Array.isArray(data.results)) {\n throw new Error('Invalid OSV API response: missing results array');\n }\n if (data.results.length !== packages.length) {\n throw new Error(`OSV API response mismatch: expected ${packages.length} results, got ${data.results.length}`);\n }\n\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 const errors: string[] = [];\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 (err) {\n // EP-004: Only skip on 400 (bad request for that package). Re-throw on 5xx or network errors.\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('400')) {\n errors.push(`Skipped ${pkg.name}: ${msg}`);\n continue;\n }\n // For rate limiting (429), apply backoff\n if (msg.includes('429')) {\n logger.warn(`Rate limited by OSV API, backing off`, { package: pkg.name });\n await new Promise(r => setTimeout(r, 2000));\n // Retry once after backoff\n try {\n const retryResult = await queryBatch(\n [pkg],\n [{ package: { name: pkg.name, ecosystem: 'Homebrew' }, version: pkg.version }],\n );\n for (const [k, v] of retryResult) result.set(k, v);\n } catch {\n errors.push(`Failed after retry ${pkg.name}: ${msg}`);\n }\n continue;\n }\n // Network/server errors: log and continue instead of failing entire scan\n logger.error(`OSV query failed for ${pkg.name}: ${msg}`);\n errors.push(`${pkg.name}: ${msg}`);\n }\n\n // EP-008: Rate limit protection — small delay between individual requests\n await new Promise(r => setTimeout(r, 75));\n }\n\n if (errors.length > 0) {\n logger.warn(`OSV query errors for ${errors.length} packages`, { errors: errors.slice(0, 5) });\n }\n\n return result;\n}\n\nexport async function queryVulnerabilities(\n packages: Array<{ name: string; version: string }>,\n): Promise<Map<string, Vulnerability[]>> {\n // EP-007: Filter out packages with empty/undefined/null versions\n const validPackages = packages.filter(\n (p) => p.version && typeof p.version === 'string' && p.version.trim().length > 0,\n );\n\n const result = new Map<string, Vulnerability[]>();\n\n // Split into batches to stay within OSV API limits\n for (let i = 0; i < validPackages.length; i += BATCH_SIZE) {\n const batch = validPackages.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 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 isPro: boolean,\n formulae: Formula[],\n casks: Cask[],\n): Promise<SecurityAuditSummary> {\n if (!isPro) throw new Error('Pro license required');\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 { TextInput } from '@inkjs/ui';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { ConfirmDialog } from '../components/common/confirm-dialog.js';\nimport { Loading } from '../components/common/loading.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nimport { formatDate } from '../utils/format.js';\nimport { redeemPromoCode } from '../lib/license/promo.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 const [deactivateError, setDeactivateError] = useState<string | null>(null);\n const [promoMode, setPromoMode] = useState(false);\n const [promoLoading, setPromoLoading] = useState(false);\n const [promoResult, setPromoResult] = useState<{ success: boolean; message: string } | null>(null);\n\n useInput((input, key) => {\n if (confirmDeactivate || deactivating || promoMode) {\n if (key.escape && promoMode) {\n setPromoMode(false);\n setPromoResult(null);\n }\n return;\n }\n\n if (input === 'd' && status === 'pro') {\n setConfirmDeactivate(true);\n }\n if (input === 'p') {\n setPromoMode(true);\n setPromoResult(null);\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 if (status === 'validating') {\n return <Loading message={t('account_loading')} />;\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 setDeactivateError(null);\n try {\n await deactivate();\n } catch (err) {\n // SCR-007: Display deactivation errors\n setDeactivateError(t('deactivate_failed') + ': ' + String(err));\n } finally {\n setDeactivating(false);\n }\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={COLORS.muted}>{t('account_statusLabel')}</Text>\n {status === 'pro' && <Text color={COLORS.success} bold>{t('account_pro')}</Text>}\n {status === 'free' && <Text color={COLORS.muted}>{t('account_free')}</Text>}\n {status === 'expired' && <Text color={COLORS.error}>{t('account_expired')}</Text>}\n </Box>\n\n {(degradation === 'warning' || degradation === 'limited') && license && (\n <Box marginTop={1} borderStyle=\"round\" borderColor={COLORS.warning} paddingX={2} paddingY={0}>\n <Text color={COLORS.warning}>\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={COLORS.muted}>{t('account_emailLabel')}</Text>\n <Text>{license.customerEmail}</Text>\n </Box>\n <Box gap={1}>\n <Text color={COLORS.muted}>{t('account_nameLabel')}</Text>\n <Text>{license.customerName}</Text>\n </Box>\n <Box gap={1}>\n <Text color={COLORS.muted}>{t('account_planLabel')}</Text>\n <Text color={COLORS.success} bold>Pro</Text>\n </Box>\n <Box gap={1}>\n <Text color={COLORS.muted}>{t('account_keyLabel')}</Text>\n <Text>{maskKey(license.key)}</Text>\n </Box>\n {license.expiresAt && (\n <Box gap={1}>\n <Text color={COLORS.muted}>{t('account_expiresLabel')}</Text>\n <Text>{formatDate(license.expiresAt)}</Text>\n </Box>\n )}\n <Box gap={1}>\n <Text color={COLORS.muted}>{t('account_activatedLabel')}</Text>\n <Text>{formatDate(license.activatedAt)}</Text>\n </Box>\n </>\n )}\n\n {status === 'free' && (\n <Box flexDirection=\"column\" marginTop={2} borderStyle=\"round\" borderColor={COLORS.brand} paddingX={2} paddingY={1}>\n <Text bold color={COLORS.brand}>{'\\u2B50'} {t('account_upgradeTitle')}</Text>\n <Text> </Text>\n <Text>{t('account_unlockDesc')}</Text>\n <Text color={COLORS.info} bold>{t('account_pricing')}</Text>\n <Text> </Text>\n <Text color={COLORS.muted}>{t('upgrade_buyAt')} <Text color={COLORS.sky} bold>{t('upgrade_buyUrl')}</Text></Text>\n <Text color={COLORS.muted}>{t('account_runActivate')} <Text color={COLORS.success} bold>{t('account_activateCmd')}</Text></Text>\n </Box>\n )}\n\n {status === 'expired' && (\n <Box marginTop={1}>\n <Box borderStyle=\"round\" borderColor={COLORS.error} paddingX={2} paddingY={0}>\n <Text color={COLORS.error}>{t('account_licenseExpired')}</Text>\n </Box>\n </Box>\n )}\n\n {deactivating && <Text color={COLORS.sky}>{t('account_deactivating')}</Text>}\n {deactivateError && <Text color={COLORS.error}>{deactivateError}</Text>}\n </Box>\n\n {/* Promo code section */}\n <Box flexDirection=\"column\" marginTop={1} paddingLeft={2}>\n {promoMode ? (\n <Box flexDirection=\"column\" gap={1}>\n <Text bold color={COLORS.gold}>{t('account_promoTitle')}</Text>\n {promoLoading ? (\n <Text color={COLORS.sky}>{t('account_promoValidating')}</Text>\n ) : (\n <Box gap={1}>\n <Text color={COLORS.muted}>{t('account_promoLabel')}</Text>\n <TextInput\n defaultValue=\"\"\n placeholder=\"BREW-XXXX-XXXX\"\n onSubmit={async (value: string) => {\n if (!value.trim()) return;\n setPromoLoading(true);\n try {\n const result = await redeemPromoCode(value);\n if (result.success) {\n setPromoResult({ success: true, message: t('account_promoSuccess', { expires: formatDate(result.expiresAt!) }) });\n } else {\n setPromoResult({ success: false, message: result.error ?? t('account_promoInvalid') });\n }\n } catch {\n setPromoResult({ success: false, message: t('account_promoError') });\n } finally {\n setPromoLoading(false);\n }\n }}\n />\n </Box>\n )}\n {promoResult && (\n <ResultBanner status={promoResult.success ? 'success' : 'error'} message={promoResult.message} />\n )}\n <Text color={COLORS.textSecondary} dimColor>{t('account_promoEsc')}</Text>\n </Box>\n ) : (\n <Text color={COLORS.textSecondary}>{t('account_promoHint')}</Text>\n )}\n </Box>\n\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>\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","import { readFile, writeFile, rename, mkdir } from 'node:fs/promises';\nimport { randomBytes, randomUUID } from 'node:crypto';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { DATA_DIR, ensureDataDirs } from '../data-dir.js';\nimport { fetchWithTimeout } from '../fetch-timeout.js';\nimport { logger } from '../../utils/logger.js';\n\nconst MACHINE_ID_PATH = join(homedir(), '.brew-tui', 'machine-id');\n\nasync function getMachineId(): Promise<string> {\n try {\n const id = (await readFile(MACHINE_ID_PATH, 'utf-8')).trim();\n if (id) return id;\n } catch { /* file doesn't exist yet */ }\n const id = randomUUID();\n await mkdir(join(homedir(), '.brew-tui'), { recursive: true, mode: 0o700 });\n await writeFile(MACHINE_ID_PATH, id, { encoding: 'utf-8', mode: 0o600 });\n return id;\n}\n\nconst PROMO_PATH = join(DATA_DIR, 'promo.json');\n\n// Promo API endpoint (self-hosted or Polar webhook)\nconst PROMO_API_URL = 'https://api.molinesdesigns.com/api/promo';\n\nexport interface PromoCode {\n code: string;\n type: 'trial' | 'discount' | 'full';\n durationDays: number;\n maxRedemptions: number;\n currentRedemptions: number;\n createdAt: string;\n expiresAt: string | null;\n active: boolean;\n}\n\ninterface PromoRedemption {\n code: string;\n redeemedAt: string;\n expiresAt: string;\n type: 'trial' | 'discount' | 'full';\n}\n\ninterface PromoFile {\n version: 1;\n redemptions: PromoRedemption[];\n}\n\n// ── Generate promo codes (admin/CLI use) ──\n\nexport function generatePromoCode(prefix = 'BREW'): string {\n const random = randomBytes(4).toString('hex').toUpperCase();\n return `${prefix}-${random.slice(0, 4)}-${random.slice(4, 8)}`;\n}\n\nexport function generatePromoBatch(count: number, options: {\n type: 'trial' | 'discount' | 'full';\n durationDays: number;\n maxRedemptions: number;\n expiresAt?: string | null;\n prefix?: string;\n}): PromoCode[] {\n const codes: PromoCode[] = [];\n for (let i = 0; i < count; i++) {\n codes.push({\n code: generatePromoCode(options.prefix),\n type: options.type,\n durationDays: options.durationDays,\n maxRedemptions: options.maxRedemptions,\n currentRedemptions: 0,\n createdAt: new Date().toISOString(),\n expiresAt: options.expiresAt ?? null,\n active: true,\n });\n }\n return codes;\n}\n\n// ── Validate promo code against API ──\n\nexport async function validatePromoCode(code: string): Promise<{\n valid: boolean;\n type?: 'trial' | 'discount' | 'full';\n durationDays?: number;\n error?: string;\n}> {\n const normalized = code.trim().toUpperCase();\n if (!normalized || normalized.length < 8) {\n return { valid: false, error: 'Invalid promo code format' };\n }\n\n try {\n const res = await fetchWithTimeout(`${PROMO_API_URL}/validate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ code: normalized }),\n }, 10_000);\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({})) as { error?: string };\n return { valid: false, error: body.error ?? 'Invalid or expired promo code' };\n }\n\n const data = await res.json() as { type: string; durationDays: number };\n return {\n valid: true,\n type: data.type as 'trial' | 'discount' | 'full',\n durationDays: data.durationDays,\n };\n } catch (err) {\n logger.error('Promo validation failed', { error: String(err) });\n return { valid: false, error: 'Could not validate promo code. Check your connection.' };\n }\n}\n\n// ── Redeem promo code locally ──\n\nexport async function redeemPromoCode(code: string): Promise<{\n success: boolean;\n expiresAt?: string;\n error?: string;\n}> {\n const normalized = code.trim().toUpperCase();\n const machineId = await getMachineId();\n\n // Call backend to validate + redeem in one step\n try {\n const res = await fetchWithTimeout(`${PROMO_API_URL}/redeem`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ code: normalized, machineId }),\n }, 10_000);\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({})) as { error?: string };\n return { success: false, error: body.error ?? 'Invalid or expired promo code' };\n }\n\n const data = await res.json() as { data: { expiresAt: string; type: string; durationDays: number } };\n var serverExpiresAt = data.data.expiresAt;\n var serverType = data.data.type as 'trial' | 'discount' | 'full';\n } catch (err) {\n logger.error('Promo redeem failed', { error: String(err) });\n return { success: false, error: 'Could not reach promo server. Check your connection.' };\n }\n\n // Save locally as well\n await ensureDataDirs();\n\n const redemption: PromoRedemption = {\n code: normalized,\n redeemedAt: new Date().toISOString(),\n expiresAt: serverExpiresAt,\n type: serverType,\n };\n\n let file: PromoFile = { version: 1, redemptions: [] };\n try {\n const raw = await readFile(PROMO_PATH, 'utf-8');\n file = JSON.parse(raw) as PromoFile;\n } catch { /* no existing file */ }\n\n // Check for duplicate redemption\n if (file.redemptions.some((r) => r.code === redemption.code)) {\n return { success: false, error: 'This promo code has already been redeemed' };\n }\n\n file.redemptions.push(redemption);\n\n // Atomic write\n const tmpPath = PROMO_PATH + '.tmp';\n await writeFile(tmpPath, JSON.stringify(file, null, 2), { encoding: 'utf-8', mode: 0o600 });\n await rename(tmpPath, PROMO_PATH);\n\n return { success: true, expiresAt: redemption.expiresAt };\n}\n\n// ── Check if an active promo is in effect ──\n\nexport async function getActivePromo(): Promise<PromoRedemption | null> {\n try {\n const raw = await readFile(PROMO_PATH, 'utf-8');\n const file = JSON.parse(raw) as PromoFile;\n const now = Date.now();\n\n // Find the most recent non-expired redemption\n const active = file.redemptions\n .filter((r) => new Date(r.expiresAt).getTime() > now)\n .sort((a, b) => new Date(b.expiresAt).getTime() - new Date(a.expiresAt).getTime())[0];\n\n return active ?? null;\n } catch {\n return null;\n }\n}\n"],"mappings":"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","names":["rm","useEffect","Box","React","Text","t","GradientText","Fragment","jsx","Text","React","React","Box","Text","Fragment","jsx","jsxs","Text","Box","React","jsx","jsxs","Box","create","readFile","writeFile","DATA_DIR","id","getMachineId","join","homedir","readFile","writeFile","create","create","VIEW_KEYS","Box","Text","jsx","jsxs","Box","Text","useMemo","Box","Text","create","spawn","spawn","create","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","Text","jsxs","Text","Box","Text","jsx","jsxs","Box","Text","Text","Fragment","jsx","jsxs","Text","jsx","jsxs","useMemo","Box","Text","useState","useMemo","useEffect","Box","Text","useInput","useStdout","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","Box","Text","jsx","Box","Text","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","useState","useStdout","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","useStdout","jsx","jsxs","useState","useRef","useEffect","useInput","useStdout","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","useStdout","jsx","jsxs","serviceAction","useState","useStdout","useEffect","useInput","Box","Text","useEffect","useRef","Box","Text","useInput","jsx","jsxs","useRef","useEffect","useInput","Box","Text","useEffect","useRef","useState","Box","useInput","create","readFile","writeFile","rm","rename","join","join","readFile","writeFile","rename","rm","PKG_PATTERN","create","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","Box","Text","TextInput","jsx","jsxs","Box","Text","TextInput","Box","Text","TextInput","jsx","jsxs","Box","Text","TextInput","jsx","jsxs","loadProfile","deleteProfile","updateProfile","useState","importProfile","useRef","useEffect","useInput","Box","useEffect","useRef","useState","Box","Text","useInput","create","create","jsx","jsxs","useState","useRef","useEffect","useInput","Box","Text","useEffect","useState","useMemo","Box","Text","useInput","useStdout","create","create","jsx","jsxs","clearHistory","useState","useEffect","useMemo","useInput","useStdout","Box","Text","useEffect","useState","Box","Text","useInput","create","create","jsx","jsxs","isNetworkError","useState","useEffect","useInput","Box","Text","useState","Box","Text","useInput","TextInput","readFile","writeFile","rename","mkdir","randomBytes","randomUUID","join","homedir","MACHINE_ID_PATH","join","homedir","getMachineId","id","readFile","randomUUID","mkdir","writeFile","getMachineId","readFile","writeFile","rename","Fragment","jsx","jsxs","deactivate","useState","useInput","Box","Text","TextInput","jsx","jsxs","useEffect","jsx","rm"]}
|