brew-tui 0.5.0 → 0.5.2

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.
@@ -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/parsers/json-parser.ts","../src/lib/parsers/text-parser.ts","../src/lib/impact/impact-analyzer.ts","../src/stores/security-store.ts","../src/lib/security/osv-api.ts","../src/lib/security/audit-runner.ts","../src/stores/brewfile-store.ts","../src/stores/sync-store.ts","../src/stores/compliance-store.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/views/account.tsx","../src/lib/license/promo.ts","../src/views/rollback.tsx","../src/stores/rollback-store.ts","../src/lib/rollback/rollback-engine.ts","../src/views/brewfile.tsx","../src/views/sync.tsx","../src/views/compliance.tsx","../src/lib/compliance/compliance-remediator.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 const isPro = useLicenseStore.getState().isPro();\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\n // Pro-only status sections\n if (isPro) {\n // Snapshots\n try {\n const { loadSnapshots } = await import('./lib/state-snapshot/snapshot.js');\n const snapshots = await loadSnapshots();\n if (snapshots.length > 0) {\n const latest = snapshots[0];\n console.log(`\\nSnapshots: ${snapshots.length} (latest: ${latest ? formatDate(latest.capturedAt) : '—'})`);\n } else {\n console.log('\\nSnapshots: none');\n }\n } catch {\n // Non-fatal: snapshot dir may not exist yet\n }\n\n // Brewfile drift\n try {\n const { loadBrewfile, computeDrift } = await import('./lib/brewfile/brewfile-manager.js');\n const schema = await loadBrewfile();\n if (schema) {\n const drift = await computeDrift(schema);\n console.log(`Brewfile: ${drift.score}% compliant (${drift.missingPackages.length} missing, ${drift.extraPackages.length} extra)`);\n }\n } catch {\n // Non-fatal\n }\n\n // Sync last sync date\n try {\n const { loadSyncConfig } = await import('./lib/sync/sync-engine.js');\n const syncConfig = await loadSyncConfig();\n if (syncConfig?.lastSync) {\n console.log(`Sync: last sync ${formatDate(syncConfig.lastSync)}`);\n }\n } catch {\n // Non-fatal\n }\n\n // Compliance score\n try {\n const { loadPolicy } = await import('./lib/compliance/policy-io.js');\n const { checkCompliance } = await import('./lib/compliance/compliance-checker.js');\n // Try loading from default location\n const policy = await loadPolicy(`${process.env['HOME'] ?? '~'}/.brew-tui/policy.yaml`).catch(() => null);\n if (policy) {\n const report = await checkCompliance(policy, true);\n console.log(`Compliance: ${report.score}% (${report.violations.length} violation(s))`);\n }\n } catch {\n // Non-fatal: no policy loaded\n }\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 // Auto-install + auto-launch BrewBar for Pro users on macOS.\n // Runs before the TUI clears the screen so progress messages are visible on cold install.\n await ensureBrewBarRunning();\n\n // Default: launch TUI. Mark TUI mode so the logger redirects to a file\n // instead of stdout/stderr (which would corrupt the Ink-rendered frame).\n process.env.BREW_TUI_TUI_MODE = '1';\n process.stdout.write('\\x1B[2J\\x1B[3J\\x1B[H');\n render(<App />);\n}\n\nasync function ensureBrewBarRunning() {\n if (process.platform !== 'darwin') return;\n\n await useLicenseStore.getState().initialize();\n if (!useLicenseStore.getState().isPro()) return;\n\n const { isBrewBarInstalled, installBrewBar, launchBrewBar } = await import('./lib/brewbar-installer.js');\n\n try {\n if (!await isBrewBarInstalled()) {\n console.log(t('cli_brewbarInstalling'));\n await installBrewBar(true, false);\n console.log(t('cli_brewbarInstalled'));\n }\n await launchBrewBar();\n } catch (err) {\n // Non-fatal: log a single line and continue to TUI so brew-tui stays usable.\n console.warn(t('cli_brewbarAutoFailed', { error: err instanceof Error ? err.message : String(err) }));\n }\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, isTeamView } 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 { RollbackView } from './views/rollback.js';\nimport { BrewfileView } from './views/brewfile.js';\nimport { SyncView } from './views/sync.js';\nimport { ComplianceView } from './views/compliance.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 const isTeam = useLicenseStore((s) => s.isTeam);\n\n // Gate Pro views\n if (isProView(currentView) && !isPro()) {\n return <UpgradePrompt viewId={currentView} />;\n }\n\n // Gate Team views\n if (isTeamView(currentView) && !isTeam()) {\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 'rollback': return <RollbackView />;\n case 'brewfile': return <BrewfileView />;\n case 'sync': return <SyncView />;\n case 'security-audit': return <SecurityAuditView />;\n case 'compliance': return <ComplianceView />;\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, useStdout } from 'ink';\nimport { useNavigationStore } from '../../stores/navigation-store.js';\nimport { isProView, isTeamView } 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 rollback: 'view_rollback',\n brewfile: 'view_brewfile',\n sync: 'view_sync',\n 'security-audit': 'view_securityAudit',\n compliance: 'view_compliance',\n account: 'view_account',\n};\n\nconst VIEW_KEYS: Record<ViewId, string> = {\n dashboard: '1', installed: '2', search: '', outdated: '3',\n 'package-info': '', services: '4', doctor: '5',\n profiles: '6', 'smart-cleanup': '7', history: '8', 'security-audit': '9',\n rollback: '', brewfile: '', sync: '', compliance: '',\n account: '0',\n};\n\nconst TAB_VIEWS: ViewId[] = [\n 'dashboard', 'installed', 'outdated', 'package-info', 'services', 'doctor',\n 'profiles', 'smart-cleanup', 'history', 'rollback', 'brewfile', 'sync', 'security-audit', 'compliance', 'account',\n];\n\nfunction MenuItem({ view, currentView }: { view: ViewId; currentView: ViewId }) {\n const key = VIEW_KEYS[view];\n const viewLabel = t(VIEW_LABEL_KEYS[view]);\n const isPro = isProView(view) || isTeamView(view);\n const isActive = view === currentView;\n const isAccount = view === 'account';\n // Indicator for keyless views: package-info uses Enter, account uses 0\n const indicator = key || (view === 'package-info' ? '\\u21B2' : ' ');\n\n return (\n <Box>\n {isActive ? <Text color={COLORS.success} bold>{'\\u25B6'} </Text> : <Text> </Text>}\n <Text bold color={key ? '#FFFFFF' : COLORS.textSecondary}>{indicator}</Text>\n <Text bold={isActive} underline={isActive} color={isActive ? COLORS.success : isAccount ? COLORS.gold : COLORS.textSecondary}> {viewLabel}</Text>\n {isPro && <Text color={COLORS.brand} bold> {t('pro_badge')}</Text>}\n </Box>\n );\n}\n\nconst COL1_VIEWS = TAB_VIEWS.slice(0, 6);\nconst COL2_VIEWS = TAB_VIEWS.slice(6);\n\nexport function Header() {\n const currentView = useNavigationStore((s) => s.currentView);\n useLocaleStore((s) => s.locale);\n const { stdout } = useStdout();\n const cols = stdout?.columns ?? 80;\n const isNarrow = cols < 95;\n\n const logoBlock = (\n <Box flexDirection=\"column\" flexShrink={0}>\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 );\n\n const menuBlock = (\n <Box borderStyle=\"round\" borderColor={COLORS.lavender} paddingX={1} flexDirection=\"column\" alignSelf={isNarrow ? 'flex-start' : 'center'}>\n <Box flexDirection=\"row\">\n <Box flexDirection=\"column\">\n {COL1_VIEWS.map((view) => (\n <MenuItem key={view} view={view} currentView={currentView} />\n ))}\n </Box>\n <Box flexDirection=\"column\" marginLeft={2}>\n {COL2_VIEWS.map((view) => (\n <MenuItem key={view} view={view} currentView={currentView} />\n ))}\n </Box>\n </Box>\n <Box borderStyle=\"single\" borderTop borderBottom={false} borderLeft={false} borderRight={false} borderColor={COLORS.lavender} marginTop={0}>\n <Text bold color=\"#FFFFFF\">S</Text>\n <Text color={COLORS.textSecondary}> {t('hint_search')}</Text>\n <Text color={COLORS.lavender}> {'\\u2503'} </Text>\n <Text bold color=\"#FFFFFF\">L</Text>\n <Text color={COLORS.textSecondary}> {t('hint_lang')}</Text>\n </Box>\n </Box>\n );\n\n if (isNarrow) {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n {logoBlock}\n <Box marginTop={1}>{menuBlock}</Box>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"row\" paddingX={1} alignItems=\"center\">\n {logoBlock}\n <Box marginLeft={2}>{menuBlock}</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', 'outdated', 'package-info', 'services', 'doctor',\n 'profiles', 'smart-cleanup', 'history', 'rollback', 'brewfile', 'sync', 'security-audit', 'compliance', '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 'rollback',\n 'brewfile',\n 'sync',\n 'security-audit',\n]);\n\n// Team-tier views — superset de Pro, requieren licencia Team (o Pro durante lanzamiento)\nconst TEAM_VIEWS = new Set<ViewId>(['compliance']);\n\nexport function isProView(viewId: ViewId): boolean {\n return PRO_VIEWS.has(viewId);\n}\n\nexport function isTeamView(viewId: ViewId): boolean {\n return TEAM_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 lavender: '#C4B5FD',\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-9,0', 'hint_navigate'], ['S', 'hint_search'], ['tab', 'hint_next'], ['q', 'hint_quit']],\n installed: [['/', 'hint_filter'], ['enter', 'hint_info'], ['u', 'hint_uninstall'], ['S', 'hint_search'], ['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'], ['S', 'hint_search'], ['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'], ['x', 'hint_stop'], ['R', 'hint_restart'], ['r', 'hint_refresh'], ['S', 'hint_search'], ['q', 'hint_quit']],\n doctor: [['r', 'hint_refresh'], ['S', 'hint_search'], ['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'], ['S', 'hint_search'], ['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'], ['S', 'hint_search'], ['q', 'hint_quit']],\n rollback: [['j/k', 'hint_navigate'], ['enter', 'hint_select'], ['r', 'hint_rollback_confirm'], ['esc', 'hint_back'], ['q', 'hint_quit']],\n brewfile: [['j/k', 'hint_navigate'], ['a', 'hint_add'], ['d', 'hint_delete'], ['r', 'hint_reconcile'], ['e', 'hint_export'], ['q', 'hint_quit']],\n sync: [['s', 'hint_sync'], ['r', 'hint_refresh'], ['c', 'hint_conflict'], ['esc', 'hint_back'], ['q', 'hint_quit']],\n compliance: [['r', 'hint_scan'], ['i', 'hint_import'], ['e', 'hint_export'], ['c', 'hint_clean'], ['q', 'hint_quit']],\n account: [['p', 'hint_promo'], ['d', 'hint_deactivate'], ['S', 'hint_search'], ['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.lavender}> {'\\u2503'} </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, getBuiltinAccountType } 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 isTeam: () => 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 // Built-in perennial accounts: skip all Polar validation\n const builtinType = getBuiltinAccountType(license.customerEmail);\n if (builtinType === 'pro') {\n set({ status: 'pro', license: { ...license, status: 'active' }, degradation: 'none' });\n return;\n }\n if (builtinType === 'team') {\n set({ status: 'team', license: { ...license, status: 'active', plan: 'team' }, degradation: 'none' });\n return;\n }\n if (builtinType === 'free') {\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 // Team is a superset of Pro — team users have full Pro access plus team features\n isPro: () => { const s = get().status; return s === 'pro' || s === 'team'; },\n isTeam: () => { const s = get().status; return s === 'team' || s === '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\n// ── Built-in perennial accounts (bypass Polar validation) ──\nconst BUILTIN_ACCOUNTS: Record<string, 'pro' | 'team' | 'free'> = {\n 'admin@molinesdesigns.com': 'pro',\n 'team@molinesdesigns.com': 'team', // Team tier test/admin account\n 'artax1983@icloud.com': 'free',\n};\n\nexport function getBuiltinAccountType(email: string): 'pro' | 'team' | 'free' | null {\n return BUILTIN_ACCOUNTS[email] ?? null;\n}\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': 'outdated',\n '4': 'services',\n '5': 'doctor',\n '6': 'profiles',\n '7': 'smart-cleanup',\n '8': 'history',\n '9': 'security-audit',\n '0': 'account',\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 === 'S') {\n navigate('search');\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 sync: { title: 'upgrade_sync', desc: 'upgrade_syncDesc' },\n compliance: { title: 'upgrade_compliance', desc: 'upgrade_complianceDesc' },\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 { useSecurityStore } from '../stores/security-store.js';\nimport { useBrewfileStore } from '../stores/brewfile-store.js';\nimport { useSyncStore } from '../stores/sync-store.js';\nimport { useComplianceStore } from '../stores/compliance-store.js';\nimport { useLicenseStore } from '../stores/license-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\nfunction ProStatusPanel() {\n const security = useSecurityStore((s) => s.summary);\n const drift = useBrewfileStore((s) => s.drift);\n const syncConfig = useSyncStore((s) => s.config);\n const complianceReport = useComplianceStore((s) => s.report);\n\n const cveCount = security ? security.vulnerablePackages : null;\n const criticalCount = security ? security.criticalCount : null;\n\n const driftScore = drift ? drift.score : null;\n\n const lastSync = syncConfig?.lastSync ?? null;\n const syncAgo = lastSync ? formatRelativeTime(new Date(lastSync).getTime() / 1000) : null;\n\n const violationCount = complianceReport ? complianceReport.violations.length : null;\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={COLORS.purple} paddingX={2} paddingY={0} marginTop={1}>\n <Text bold color={COLORS.purple}>{t('dashboard_pro_status')}</Text>\n <Box gap={1}>\n <Text color={COLORS.muted}>{t('dashboard_security')}</Text>\n {cveCount === null ? (\n <Text color={COLORS.muted}>—</Text>\n ) : cveCount === 0 ? (\n <Text color={COLORS.success}>{t('dashboard_no_cves')}</Text>\n ) : (\n <Text color={COLORS.error}>\n {t('dashboard_cves', { count: String(cveCount) })}\n {criticalCount && criticalCount > 0 ? ` (${criticalCount} critical)` : ''}\n </Text>\n )}\n </Box>\n <Box gap={1}>\n <Text color={COLORS.muted}>{t('dashboard_brewfile')}</Text>\n {driftScore === null ? (\n <Text color={COLORS.muted}>—</Text>\n ) : (\n <Text color={driftScore >= 80 ? COLORS.success : COLORS.warning}>{driftScore}%</Text>\n )}\n </Box>\n <Box gap={1}>\n <Text color={COLORS.muted}>{t('dashboard_sync')}</Text>\n {syncAgo === null ? (\n <Text color={COLORS.muted}>{t('dashboard_sync_never')}</Text>\n ) : (\n <Text color={COLORS.info}>{t('dashboard_sync_ago', { time: syncAgo })}</Text>\n )}\n </Box>\n <Box gap={1}>\n <Text color={COLORS.muted}>{t('dashboard_compliance')}</Text>\n {violationCount === null ? (\n <Text color={COLORS.muted}>—</Text>\n ) : violationCount === 0 ? (\n <Text color={COLORS.success}>{t('dashboard_compliance_ok')}</Text>\n ) : (\n <Text color={COLORS.warning}>{t('dashboard_compliance_violations', { count: String(violationCount) })}</Text>\n )}\n </Box>\n </Box>\n );\n}\n\nexport function DashboardView() {\n const { formulae, casks, outdated, services, config, loading, errors, lastFetchedAt, fetchAll } = useBrewStore();\n const isPro = useLicenseStore((s) => s.isPro);\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\n {isPro() && <ProStatusPanel />}\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';\nimport { analyzeUpgradeImpact } from './impact/impact-analyzer.js';\nimport type { UpgradeImpact } from './impact/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 async function getUpgradeImpact(\n packageName: string,\n fromVersion: string,\n toVersion: string,\n packageType: 'formula' | 'cask',\n): Promise<UpgradeImpact> {\n validatePackageName(packageName);\n return analyzeUpgradeImpact(packageName, fromVersion, toVersion, packageType);\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 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)}`, { cause: 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 { execBrew } from '../brew-cli.js';\nimport { logger } from '../../utils/logger.js';\nimport { t } from '../../i18n/index.js';\nimport type { UpgradeImpact, RiskLevel } from './types.js';\n\n// Packages whose upgrade is always considered high risk\nconst HIGH_RISK_PACKAGES = new Set([\n 'openssl', 'openssl@3', 'openssl@1.1',\n 'python', 'python@3', 'python@3.11', 'python@3.12', 'python@3.13',\n 'node', 'node@18', 'node@20', 'ruby', 'ruby@3',\n 'sqlite', 'sqlite3', 'libpq', 'postgresql', 'postgresql@16',\n 'glibc', 'gcc', 'llvm',\n]);\n\nfunction isMajorVersionBump(from: string, to: string): boolean {\n const fromMajor = parseInt(from.split('.')[0] ?? '0', 10);\n const toMajor = parseInt(to.split('.')[0] ?? '0', 10);\n return !isNaN(fromMajor) && !isNaN(toMajor) && toMajor > fromMajor;\n}\n\nfunction calculateRisk(\n name: string,\n reverseDeps: string[],\n fromVersion: string,\n toVersion: string,\n): { risk: RiskLevel; reasons: string[] } {\n const reasons: string[] = [];\n\n // HIGH_RISK packages are sticky — always 'high' regardless of other factors\n if (HIGH_RISK_PACKAGES.has(name)) {\n reasons.push(t('impact_reason_critical_package'));\n return { risk: 'high', reasons };\n }\n\n // >10 reverse deps forces high directly\n if (reverseDeps.length > 10) {\n reasons.push(t('impact_reason_many_deps', { count: reverseDeps.length }));\n return { risk: 'high', reasons };\n }\n\n let factorCount = 0;\n\n if (reverseDeps.length >= 3) {\n factorCount++;\n reasons.push(t('impact_reason_many_deps', { count: reverseDeps.length }));\n }\n\n if (isMajorVersionBump(fromVersion, toVersion)) {\n factorCount++;\n reasons.push(t('impact_reason_major_bump'));\n }\n\n const risk: RiskLevel = factorCount >= 2 ? 'high' : factorCount === 1 ? 'medium' : 'low';\n return { risk, reasons };\n}\n\nexport async function analyzeUpgradeImpact(\n packageName: string,\n fromVersion: string,\n toVersion: string,\n packageType: 'formula' | 'cask',\n): Promise<UpgradeImpact> {\n // Casks are self-contained — no dependency graph to analyze\n if (packageType === 'cask') {\n return {\n packageName,\n fromVersion,\n toVersion,\n packageType,\n directDeps: [],\n reverseDeps: [],\n risk: 'low',\n riskReasons: [],\n };\n }\n\n let directDeps: string[] = [];\n let reverseDeps: string[] = [];\n\n try {\n const depsOutput = await execBrew(['deps', '--1', packageName]);\n directDeps = depsOutput.split('\\n').filter((l) => l.trim() !== '');\n } catch (err) {\n logger.warn(`impact-analyzer: deps failed for ${packageName}: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n try {\n const usesOutput = await execBrew(['uses', '--installed', packageName]);\n reverseDeps = usesOutput.split('\\n').filter((l) => l.trim() !== '');\n } catch (err) {\n logger.warn(`impact-analyzer: uses failed for ${packageName}: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n const { risk, reasons } = calculateRisk(packageName, reverseDeps, fromVersion, toVersion);\n\n return {\n packageName,\n fromVersion,\n toVersion,\n packageType,\n directDeps,\n reverseDeps,\n risk,\n riskReasons: reasons,\n };\n}\n\nexport { isMajorVersionBump };\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 { create } from 'zustand';\nimport type { BrewfileSchema, DriftReport } from '../lib/brewfile/types.js';\nimport {\n loadBrewfile,\n saveBrewfile,\n computeDrift,\n createDefaultBrewfile,\n} from '../lib/brewfile/brewfile-manager.js';\n\ninterface BrewfileState {\n schema: BrewfileSchema | null;\n drift: DriftReport | null;\n loading: boolean;\n driftLoading: boolean;\n error: string | null;\n\n load: () => Promise<void>;\n save: (schema: BrewfileSchema) => Promise<void>;\n refreshDrift: () => Promise<void>;\n createFromCurrent: (name: string) => Promise<void>;\n}\n\nexport const useBrewfileStore = create<BrewfileState>((set, get) => ({\n schema: null,\n drift: null,\n loading: false,\n driftLoading: false,\n error: null,\n\n load: async () => {\n set({ loading: true, error: null });\n try {\n const schema = await loadBrewfile();\n set({ schema, loading: false });\n if (schema) {\n void get().refreshDrift();\n }\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err), loading: false });\n }\n },\n\n save: async (schema) => {\n set({ error: null });\n try {\n await saveBrewfile(schema);\n set({ schema });\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err) });\n }\n },\n\n refreshDrift: async () => {\n const { schema } = get();\n if (!schema) return;\n set({ driftLoading: true, error: null });\n try {\n const drift = await computeDrift(schema);\n set({ drift, driftLoading: false });\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err), driftLoading: false });\n }\n },\n\n createFromCurrent: async (name) => {\n set({ loading: true, error: null });\n try {\n const schema = await createDefaultBrewfile(name);\n await saveBrewfile(schema);\n set({ schema, loading: false });\n void get().refreshDrift();\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err), loading: false });\n }\n },\n}));\n","import { create } from 'zustand';\nimport type { SyncConfig, SyncConflict, SyncResult } from '../lib/sync/types.js';\nimport {\n sync,\n loadSyncConfig,\n applyConflictResolutions,\n} from '../lib/sync/sync-engine.js';\nimport { readSyncEnvelope } from '../lib/sync/backends/icloud-backend.js';\nimport { decryptPayload } from '../lib/sync/crypto.js';\nimport { logger } from '../utils/logger.js';\nimport type { BrewfileSchema } from '../lib/brewfile/types.js';\n\ninterface SyncState {\n config: SyncConfig | null;\n lastResult: SyncResult | null;\n conflicts: SyncConflict[];\n loading: boolean;\n error: string | null;\n\n initialize: (isPro: boolean) => Promise<void>;\n syncNow: (isPro: boolean, brewfile?: BrewfileSchema) => Promise<void>;\n resolveConflicts: (\n resolutions: Array<{ conflict: SyncConflict; resolution: 'use-local' | 'use-remote' }>,\n ) => Promise<void>;\n}\n\nexport const useSyncStore = create<SyncState>((set, get) => ({\n config: null,\n lastResult: null,\n conflicts: [],\n loading: false,\n error: null,\n\n initialize: async (isPro: boolean) => {\n if (!isPro) return;\n try {\n const config = await loadSyncConfig();\n set({ config });\n } catch (err) {\n logger.warn('sync-store: could not load config', { error: String(err) });\n }\n },\n\n syncNow: async (isPro: boolean, brewfile?: BrewfileSchema) => {\n set({ loading: true, error: null });\n try {\n const result = await sync(isPro, brewfile);\n if (result.conflicts.length > 0) {\n set({ conflicts: result.conflicts, lastResult: result, loading: false });\n } else {\n const config = await loadSyncConfig();\n set({ config, lastResult: result, conflicts: [], loading: false });\n }\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n set({ error, loading: false });\n }\n },\n\n resolveConflicts: async (resolutions) => {\n set({ loading: true, error: null });\n try {\n const config = get().config;\n if (!config) throw new Error('Sync not initialized');\n\n // Load current payload from iCloud\n const envelope = await readSyncEnvelope();\n if (!envelope) throw new Error('No sync data found');\n\n const payload = decryptPayload(envelope.encrypted, envelope.iv, envelope.tag);\n await applyConflictResolutions(payload, resolutions, config.machineId);\n\n const updatedConfig = await loadSyncConfig();\n set({ config: updatedConfig, conflicts: [], loading: false });\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n set({ error, loading: false });\n }\n },\n}));\n","import { create } from 'zustand';\nimport type { PolicyFile, ComplianceReport } from '../lib/compliance/types.js';\nimport { checkCompliance } from '../lib/compliance/compliance-checker.js';\nimport { loadPolicy } from '../lib/compliance/policy-io.js';\n\ninterface ComplianceState {\n policy: PolicyFile | null;\n report: ComplianceReport | null;\n loading: boolean;\n error: string | null;\n\n importPolicy: (filePath: string, isPro: boolean) => Promise<void>;\n runCheck: (isPro: boolean) => Promise<void>;\n clearPolicy: () => void;\n}\n\nexport const useComplianceStore = create<ComplianceState>((set, get) => ({\n policy: null,\n report: null,\n loading: false,\n error: null,\n\n importPolicy: async (filePath: string, isPro: boolean) => {\n if (!isPro) {\n set({ error: 'Pro license required' });\n return;\n }\n set({ loading: true, error: null });\n try {\n const policy = await loadPolicy(filePath);\n set({ policy, loading: false });\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n set({ error, loading: false });\n }\n },\n\n runCheck: async (isPro: boolean) => {\n const { policy } = get();\n if (!policy) return;\n set({ loading: true, error: null });\n try {\n const report = await checkCompliance(policy, isPro);\n set({ report, loading: false });\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n set({ error, loading: false });\n }\n },\n\n clearPolicy: () => set({ policy: null, report: null, error: null }),\n}));\n","import React from 'react';\nimport { Box, Text, useStdout } 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 const { stdout } = useStdout();\n const cols = stdout?.columns ?? 80;\n // Adapt min width to terminal: tight on narrow, comfortable on wide\n const minW = cols < 60 ? 12 : cols < 100 ? 14 : 16;\n\n return (\n <Box\n borderStyle=\"round\"\n borderColor={color}\n paddingX={2}\n paddingY={0}\n flexDirection=\"column\"\n alignItems=\"center\"\n minWidth={minW}\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: '\\u25B2', 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 // Auto-capture snapshot after mutating brew operations\n const MUTATING_COMMANDS = new Set(['install', 'uninstall', 'upgrade', 'pin', 'unpin', 'tap', 'untap']);\n if (!cancelRef.current && MUTATING_COMMANDS.has(args[0] ?? '')) {\n void import('../lib/state-snapshot/snapshot.js').then(({ captureSnapshot, saveSnapshot }) => {\n captureSnapshot().then((s) => saveSnapshot(s)).catch(() => {});\n });\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, getUpgradeImpact } 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';\nimport { useDebounce } from '../hooks/use-debounce.js';\nimport type { UpgradeImpact } from '../lib/impact/types.js';\n\nfunction ImpactPanel({ impact }: { impact: UpgradeImpact }) {\n const riskColor =\n impact.risk === 'high' ? COLORS.error\n : impact.risk === 'medium' ? COLORS.warning\n : COLORS.success;\n\n const riskLabel =\n impact.risk === 'high' ? t('impact_high')\n : impact.risk === 'medium' ? t('impact_medium')\n : t('impact_low');\n\n const riskIcon =\n impact.risk === 'high' ? '\\u26A0'\n : impact.risk === 'medium' ? '~'\n : '\\u2713';\n\n return (\n <Box flexDirection=\"column\" marginTop={1} borderStyle=\"round\" borderColor={riskColor} paddingX={2} paddingY={0}>\n <Box>\n <Text bold color={riskColor}>{riskIcon} {riskLabel}</Text>\n {impact.reverseDeps.length > 0 && (\n <Text color={COLORS.textSecondary}> \\u2014 {t('impact_affects', { count: impact.reverseDeps.length })}</Text>\n )}\n </Box>\n {impact.riskReasons.length > 0 && (\n <Text color={COLORS.textSecondary}>{impact.riskReasons.join(' \\u00B7 ')}</Text>\n )}\n {impact.reverseDeps.length > 0 && impact.reverseDeps.length <= 5 && (\n <Text color={COLORS.muted} dimColor>\n {t('impact_usedBy', { packages: impact.reverseDeps.join(', ') })}\n </Text>\n )}\n {impact.risk === 'high' && (\n <Text color={COLORS.info}>{t('impact_brewfile_hint')}</Text>\n )}\n </Box>\n );\n}\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 const [impact, setImpact] = useState<UpgradeImpact | null>(null);\n const [impactLoading, setImpactLoading] = useState(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 // Enrich packages with type so formula/cask distinction is available\n const allOutdated = [\n ...outdated.formulae.map((p) => ({ ...p, type: 'formula' as const })),\n ...outdated.casks.map((p) => ({ ...p, type: 'cask' as const })),\n ];\n\n const debouncedCursor = useDebounce(cursor, 150);\n\n useEffect(() => {\n const pkg = allOutdated[debouncedCursor];\n if (!pkg || stream.isRunning) {\n setImpact(null);\n return;\n }\n setImpactLoading(true);\n void getUpgradeImpact(\n pkg.name,\n pkg.installed_versions[0] ?? '',\n pkg.current_version,\n pkg.type,\n )\n .then(setImpact)\n .catch(() => setImpact(null))\n .finally(() => setImpactLoading(false));\n }, [debouncedCursor, stream.isRunning]);\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\n {impact && !stream.isRunning && !confirmAction && (\n <ImpactPanel impact={impact} />\n )}\n {impactLoading && !stream.isRunning && !confirmAction && (\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>{t('impact_analyzing')}</Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>{t('impact_hint')}</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 === 'x') 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)}`, { cause: 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 { useNavigationStore } from '../stores/navigation-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 navigate = useNavigationStore((s) => s.navigate);\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 // Navigate to rollback view (capital R to avoid conflict with rescan)\n if (input === 'R') { navigate('rollback'); 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 {pkg.vulnerabilities.some((v) => v.fixedVersion) && (\n <Text color={COLORS.textSecondary}>[R:{t('hint_rollback')}]</Text>\n )}\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 marginTop={1}>\n <Text color={COLORS.textSecondary}>{t('security_rollback_hint')}</Text>\n </Box>\n </Box>\n )}\n </Box>\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","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { useRollbackStore } from '../stores/rollback-store.js';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { executeRollbackPlan } from '../lib/rollback/rollback-engine.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 { SectionHeader } from '../components/common/section-header.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t, tp } from '../i18n/index.js';\nimport type { RollbackAction, RollbackPlan } from '../lib/rollback/types.js';\n\ntype Phase = 'list' | 'plan' | 'confirm' | 'executing' | 'result';\n\nfunction strategyLabel(action: RollbackAction): string {\n switch (action.strategy) {\n case 'versioned-formula': return t('rollback_strategy_versioned');\n case 'bottle-cache': return t('rollback_strategy_bottle');\n case 'pin-only': return t('rollback_strategy_pin');\n case 'unavailable': return t('rollback_strategy_unavailable');\n }\n}\n\nfunction actionColor(action: RollbackAction): string {\n if (action.strategy === 'unavailable') return COLORS.muted;\n if (action.action === 'remove') return COLORS.muted;\n if (action.action === 'downgrade') return COLORS.warning;\n if (action.action === 'install') return COLORS.success;\n return COLORS.info;\n}\n\nfunction actionPrefix(action: RollbackAction): string {\n if (action.strategy === 'unavailable' || action.action === 'remove') return '⊗';\n if (action.strategy === 'pin-only') return '📌';\n if (action.action === 'downgrade') return '⬇';\n return '⬆';\n}\n\nfunction PlanView({ plan }: { plan: RollbackPlan }) {\n const executableCount = plan.actions.filter((a) => a.strategy !== 'unavailable' && a.action !== 'remove').length;\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box marginBottom={1}>\n <Text color={COLORS.text} bold>{plan.snapshotLabel} </Text>\n <Text color={COLORS.textSecondary}>{plan.snapshotDate}</Text>\n </Box>\n\n {plan.actions.length === 0 && (\n <ResultBanner status=\"success\" message={t('rollback_diff_empty')} />\n )}\n\n {plan.actions.map((a) => (\n <Box key={a.packageName + a.action}>\n <Text color={actionColor(a)}>{actionPrefix(a)} </Text>\n <Text color={actionColor(a)} bold>{a.packageName}</Text>\n {a.fromVersion !== '' && a.toVersion !== '' && (\n <Text color={COLORS.textSecondary}>{' '}{a.fromVersion} → {a.toVersion}</Text>\n )}\n {a.fromVersion === '' && a.toVersion !== '' && (\n <Text color={COLORS.textSecondary}> install {a.toVersion}</Text>\n )}\n {a.fromVersion !== '' && a.toVersion === '' && (\n <Text color={COLORS.textSecondary}> remove</Text>\n )}\n <Text color={COLORS.muted} dimColor> [{strategyLabel(a)}]</Text>\n </Box>\n ))}\n\n {plan.warnings.map((w) => (\n <Box key={w} marginTop={1}>\n <Text color={COLORS.warning}>⚠ {w}</Text>\n </Box>\n ))}\n\n <Box marginTop={1}>\n {plan.canExecute ? (\n <Text color={COLORS.textSecondary}>\n enter:{t('rollback_confirm', { count: String(executableCount) })} esc:{t('hint_back')}\n </Text>\n ) : (\n <Text color={COLORS.muted}>{t('rollback_strategy_unavailable')} esc:{t('hint_back')}</Text>\n )}\n </Box>\n </Box>\n );\n}\n\nexport function RollbackView() {\n const isPro = useLicenseStore((s) => s.isPro);\n const { snapshots, loading, error, plan, planLoading, planError, fetchSnapshots, selectSnapshot, clearPlan } = useRollbackStore();\n\n const [cursor, setCursor] = useState(0);\n const [phase, setPhase] = useState<Phase>('list');\n const [streamLines, setStreamLines] = useState<string[]>([]);\n const [streamRunning, setStreamRunning] = useState(false);\n const [streamError, setStreamError] = useState<string | null>(null);\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 void generatorRef.current?.return(undefined);\n };\n }, []);\n\n useEffect(() => { void fetchSnapshots(isPro()); }, []);\n\n const runRollback = useCallback(async (p: RollbackPlan) => {\n setPhase('executing');\n setStreamLines([]);\n setStreamError(null);\n setStreamRunning(true);\n\n const gen = executeRollbackPlan(p, isPro());\n generatorRef.current = gen;\n\n try {\n for await (const line of gen) {\n if (!mountedRef.current) break;\n setStreamLines((prev) => [...prev.slice(-99), line]);\n }\n } catch (err) {\n if (mountedRef.current) {\n setStreamError(err instanceof Error ? err.message : String(err));\n }\n } finally {\n generatorRef.current = null;\n if (mountedRef.current) {\n setStreamRunning(false);\n setPhase('result');\n }\n }\n }, [isPro]);\n\n useInput((input, key) => {\n if (phase === 'executing') return;\n\n if (phase === 'result') {\n if (key.escape || input === 'r') {\n setPhase('list');\n clearPlan();\n void fetchSnapshots(isPro());\n }\n return;\n }\n\n if (phase === 'confirm') return;\n\n if (phase === 'plan') {\n if (key.escape) { clearPlan(); setPhase('list'); return; }\n if (key.return && plan?.canExecute) { setPhase('confirm'); }\n return;\n }\n\n // phase === 'list'\n if (input === 'j' || key.downArrow) {\n setCursor((c) => Math.min(c + 1, Math.max(0, snapshots.length - 1)));\n } else if (input === 'k' || key.upArrow) {\n setCursor((c) => Math.max(c - 1, 0));\n } else if (key.return && snapshots[cursor]) {\n void selectSnapshot(snapshots[cursor]!, isPro());\n setPhase('plan');\n } else if (input === 'r') {\n void fetchSnapshots(isPro());\n }\n });\n\n if (loading) return <Loading message={t('rollback_select_snapshot')} />;\n if (error) return <ErrorMessage message={error} />;\n\n if (phase === 'executing') {\n return (\n <Box flexDirection=\"column\">\n <ProgressLog lines={streamLines} isRunning={streamRunning} title={t('rollback_executing')} />\n </Box>\n );\n }\n\n if (phase === 'result') {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <ResultBanner\n status={streamError ? 'error' : 'success'}\n message={streamError ? t('rollback_error', { error: streamError }) : t('rollback_success')}\n />\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>r:{t('hint_refresh')} esc:{t('hint_back')}</Text>\n </Box>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji=\"⏪\" title={t('rollback_title')} gradient={GRADIENTS.gold} />\n\n {snapshots.length === 0 && (\n <Box marginTop={1}>\n <ResultBanner status=\"info\" message={t('rollback_no_snapshots')} />\n </Box>\n )}\n\n {phase === 'list' && snapshots.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={COLORS.textSecondary} dimColor>{t('rollback_select_snapshot')}</Text>\n <Box flexDirection=\"column\" marginTop={1}>\n {snapshots.map((s, i) => (\n <SelectableRow key={s.capturedAt} isCurrent={i === cursor}>\n <Text bold={i === cursor} color={i === cursor ? COLORS.text : COLORS.muted}>\n {s.label ?? t('rollback_snapshot_auto')}\n </Text>\n <Text color={COLORS.textSecondary}>\n {' — '}{new Date(s.capturedAt).toLocaleString()}\n </Text>\n <Text color={COLORS.muted} dimColor>\n {' '}({tp('packages', s.formulae.length + s.casks.length)})\n </Text>\n </SelectableRow>\n ))}\n </Box>\n </Box>\n )}\n\n {phase === 'plan' && (\n <Box flexDirection=\"column\">\n {planLoading && <Loading message={t('rollback_capturing')} />}\n {planError && <ErrorMessage message={planError} />}\n {plan && !planLoading && <PlanView plan={plan} />}\n </Box>\n )}\n\n {phase === 'confirm' && plan && (\n <Box marginTop={1}>\n <ConfirmDialog\n message={t('rollback_confirm', {\n count: String(plan.actions.filter((a) => a.strategy !== 'unavailable' && a.action !== 'remove').length),\n })}\n onConfirm={() => void runRollback(plan)}\n onCancel={() => setPhase('plan')}\n />\n </Box>\n )}\n </Box>\n );\n}\n","import { create } from 'zustand';\nimport type { BrewSnapshot } from '../lib/state-snapshot/snapshot.js';\nimport { loadSnapshots, buildRollbackPlan } from '../lib/rollback/rollback-engine.js';\nimport type { RollbackPlan } from '../lib/rollback/types.js';\n\ninterface RollbackState {\n snapshots: BrewSnapshot[];\n loading: boolean;\n error: string | null;\n selectedSnapshot: BrewSnapshot | null;\n plan: RollbackPlan | null;\n planLoading: boolean;\n planError: string | null;\n\n fetchSnapshots: (isPro: boolean) => Promise<void>;\n selectSnapshot: (s: BrewSnapshot | null, isPro: boolean) => Promise<void>;\n clearPlan: () => void;\n}\n\nexport const useRollbackStore = create<RollbackState>((set) => ({\n snapshots: [],\n loading: false,\n error: null,\n selectedSnapshot: null,\n plan: null,\n planLoading: false,\n planError: null,\n\n fetchSnapshots: async (isPro) => {\n if (!isPro) return;\n set({ loading: true, error: null });\n try {\n const snapshots = await loadSnapshots();\n set({ snapshots, loading: false });\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err), loading: false });\n }\n },\n\n selectSnapshot: async (snapshot, isPro) => {\n if (!snapshot) {\n set({ selectedSnapshot: null, plan: null, planError: null });\n return;\n }\n set({ selectedSnapshot: snapshot, plan: null, planLoading: true, planError: null });\n try {\n const plan = await buildRollbackPlan(snapshot, isPro);\n set({ plan, planLoading: false });\n } catch (err) {\n set({ planError: err instanceof Error ? err.message : String(err), planLoading: false });\n }\n },\n\n clearPlan: () => set({ selectedSnapshot: null, plan: null, planError: null }),\n}));\n","import { readdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { captureSnapshot, loadSnapshots, saveSnapshot } from '../state-snapshot/snapshot.js';\nimport type { BrewSnapshot } from '../state-snapshot/snapshot.js';\nimport { diffSnapshots } from '../diff-engine/diff.js';\nimport { execBrew, streamBrew } from '../brew-cli.js';\nimport { logger } from '../../utils/logger.js';\nimport type { RollbackAction, RollbackPlan, RollbackStrategy } from './types.js';\n\nasync function detectStrategy(\n name: string,\n targetVersion: string,\n packageType: 'formula' | 'cask',\n): Promise<{ strategy: RollbackStrategy; versionedFormula?: string }> {\n // Casks cannot be restored to a specific version\n if (packageType === 'cask') {\n return { strategy: 'pin-only' };\n }\n\n // Try versioned formula (e.g. node@20)\n try {\n const major = targetVersion.split('.')[0] ?? '';\n if (major !== '' && !isNaN(parseInt(major, 10))) {\n const versionedFormula = `${name}@${major}`;\n await execBrew(['info', '--json=v2', versionedFormula]);\n return { strategy: 'versioned-formula', versionedFormula };\n }\n } catch {\n // Not available — fall through\n }\n\n // Try bottle cache\n try {\n const brewCache = (await execBrew(['--cache'])).trim();\n const downloadsDir = join(brewCache, 'downloads');\n const entries = await readdir(downloadsDir);\n const found = entries.some(\n (entry) => entry.includes(name) && entry.includes(targetVersion),\n );\n if (found) {\n return { strategy: 'bottle-cache' };\n }\n } catch {\n // Cache not readable — fall through\n }\n\n return { strategy: 'pin-only' };\n}\n\nexport async function buildRollbackPlan(\n snapshot: BrewSnapshot,\n isPro: boolean,\n): Promise<RollbackPlan> {\n if (!isPro) throw new Error('Pro license required');\n\n const current = await captureSnapshot();\n const diff = diffSnapshots(snapshot, current);\n\n const actions: RollbackAction[] = [];\n const warnings: string[] = [];\n\n // Packages that were upgraded (current > snapshot) → need downgrade\n for (const entry of diff.upgraded) {\n const type = entry.type;\n const { strategy, versionedFormula } = await detectStrategy(entry.name, entry.from, type);\n actions.push({\n packageName: entry.name,\n packageType: type,\n action: 'downgrade',\n fromVersion: entry.to, // current version\n toVersion: entry.from, // snapshot (target) version\n strategy,\n versionedFormula,\n });\n }\n\n // Packages that were downgraded (current < snapshot) → need to restore up\n for (const entry of diff.downgraded) {\n const type = entry.type;\n const { strategy, versionedFormula } = await detectStrategy(entry.name, entry.from, type);\n actions.push({\n packageName: entry.name,\n packageType: type,\n action: 'downgrade',\n fromVersion: entry.to, // current version\n toVersion: entry.from, // snapshot (target) version\n strategy,\n versionedFormula,\n });\n }\n\n // Packages added since snapshot (in current, not in snapshot) → would need removal\n // Security: never auto-remove. Mark as unavailable with warning.\n for (const entry of diff.added) {\n if (entry.type === 'tap') continue;\n const type = entry.type;\n actions.push({\n packageName: entry.name,\n packageType: type,\n action: 'remove',\n fromVersion: entry.version,\n toVersion: '',\n strategy: 'unavailable',\n });\n }\n\n // Packages removed since snapshot (in snapshot, not in current) → need re-install\n for (const entry of diff.removed) {\n if (entry.type === 'tap') continue;\n const type = entry.type;\n const { strategy, versionedFormula } = await detectStrategy(entry.name, entry.version, type);\n actions.push({\n packageName: entry.name,\n packageType: type,\n action: 'install',\n fromVersion: '',\n toVersion: entry.version,\n strategy,\n versionedFormula,\n });\n }\n\n // Build warnings\n const caskPinCount = actions.filter(\n (a) => a.packageType === 'cask' && a.action !== 'remove' && a.strategy === 'pin-only',\n ).length;\n if (caskPinCount > 0) {\n warnings.push(`${caskPinCount} cask(s) will be pinned only (version restoration not supported)`);\n }\n\n const canExecute = actions.some((a) => a.strategy !== 'unavailable');\n\n const snapshotLabel = snapshot.label ?? 'Auto';\n const snapshotDate = new Date(snapshot.capturedAt).toLocaleString();\n\n logger.debug('Built rollback plan', { actionCount: actions.length, canExecute });\n\n return {\n snapshotLabel,\n snapshotDate,\n actions,\n warnings,\n canExecute,\n };\n}\n\nexport async function* executeRollbackPlan(\n plan: RollbackPlan,\n isPro: boolean,\n): AsyncGenerator<string> {\n if (!isPro) throw new Error('Pro license required');\n\n for (const action of plan.actions) {\n if (action.strategy === 'unavailable') {\n yield `[skip] ${action.packageName}: cannot restore automatically — manual action required`;\n continue;\n }\n\n if (action.action === 'remove') {\n yield `[skip] ${action.packageName}: removal skipped for safety — remove manually if needed`;\n continue;\n }\n\n if (action.action === 'install') {\n if (action.strategy === 'pin-only') {\n yield `[warn] ${action.packageName}: cannot install specific version — skipping`;\n continue;\n }\n if (action.strategy === 'versioned-formula' && action.versionedFormula) {\n yield `[install] ${action.packageName} via ${action.versionedFormula}`;\n for await (const line of streamBrew(['install', action.versionedFormula])) {\n yield line;\n }\n continue;\n }\n if (action.strategy === 'bottle-cache') {\n yield `[install] ${action.packageName} from bottle cache`;\n for await (const line of streamBrew(['install', '--force-bottle', action.packageName])) {\n yield line;\n }\n continue;\n }\n continue;\n }\n\n // action === 'downgrade'\n if (action.strategy === 'versioned-formula' && action.versionedFormula) {\n yield `[downgrade] ${action.packageName}: ${action.fromVersion} → ${action.toVersion} via ${action.versionedFormula}`;\n for await (const line of streamBrew(['install', action.versionedFormula])) {\n yield line;\n }\n } else if (action.strategy === 'bottle-cache') {\n yield `[downgrade] ${action.packageName}: ${action.fromVersion} → ${action.toVersion} from bottle cache`;\n for await (const line of streamBrew(['install', '--force-bottle', action.packageName])) {\n yield line;\n }\n } else if (action.strategy === 'pin-only') {\n yield `[pin] ${action.packageName}: pinning at current version (target version not restorable)`;\n await execBrew(['pin', action.packageName]);\n yield `✓ Pinned ${action.packageName}`;\n }\n }\n\n // Capture post-rollback snapshot\n yield '[snapshot] Capturing post-rollback snapshot...';\n try {\n const postSnapshot = await captureSnapshot();\n await saveSnapshot(postSnapshot, 'post-rollback');\n yield '[snapshot] Snapshot saved.';\n } catch (err) {\n logger.warn('Failed to save post-rollback snapshot', { err });\n yield '[snapshot] Warning: could not save snapshot.';\n }\n}\n\nexport { loadSnapshots };\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { TextInput } from '@inkjs/ui';\nimport { useBrewfileStore } from '../stores/brewfile-store.js';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { reconcile } from '../lib/brewfile/brewfile-manager.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.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 { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nimport type { DriftReport } from '../lib/brewfile/types.js';\n\ntype Phase = 'overview' | 'creating' | 'reconciling' | 'result';\n\n// ── DriftScore ────────────────────────────────────────────────────────────────\n\nfunction DriftScore({ score }: { score: number }) {\n const color = score >= 80 ? COLORS.success : score >= 50 ? COLORS.warning : COLORS.error;\n const bars = Math.round(score / 10);\n const filled = '▓'.repeat(bars);\n const empty = '░'.repeat(10 - bars);\n return (\n <Box>\n <Text color={color}>{filled}{empty}</Text>\n <Text color={color} bold> {score}% </Text>\n <Text color={COLORS.textSecondary}>{t('brewfile_compliant')}</Text>\n </Box>\n );\n}\n\n// ── DriftSummary ──────────────────────────────────────────────────────────────\n\nfunction DriftSummary({ drift }: { drift: DriftReport }) {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n {drift.missingPackages.length > 0 && (\n <Box>\n <Text color={COLORS.error}>● </Text>\n <Text color={COLORS.error}>\n {t('brewfile_drift_missing', { count: drift.missingPackages.length })}\n </Text>\n <Text color={COLORS.textSecondary}>\n {': ' + drift.missingPackages.slice(0, 3).join(', ')}\n {drift.missingPackages.length > 3 ? '...' : ''}\n </Text>\n </Box>\n )}\n {drift.extraPackages.length > 0 && (\n <Box>\n <Text color={COLORS.warning}>● </Text>\n <Text color={COLORS.warning}>\n {t('brewfile_drift_extra', { count: drift.extraPackages.length })}\n </Text>\n </Box>\n )}\n {drift.wrongVersions.length > 0 && (\n <Box>\n <Text color={COLORS.info}>● </Text>\n <Text color={COLORS.info}>\n {t('brewfile_drift_wrong', { count: drift.wrongVersions.length })}\n </Text>\n </Box>\n )}\n {drift.missingPackages.length === 0 &&\n drift.extraPackages.length === 0 &&\n drift.wrongVersions.length === 0 && (\n <ResultBanner status=\"success\" message=\"✓ System is in sync with Brewfile\" />\n )}\n </Box>\n );\n}\n\n// ── Main View ─────────────────────────────────────────────────────────────────\n\nexport function BrewfileView() {\n const isPro = useLicenseStore((s) => s.isPro);\n const { schema, drift, loading, driftLoading, error, load, createFromCurrent } = useBrewfileStore();\n\n const [phase, setPhase] = useState<Phase>('overview');\n const [streamLines, setStreamLines] = useState<string[]>([]);\n const [streamRunning, setStreamRunning] = useState(false);\n const [streamError, setStreamError] = useState<string | null>(null);\n const [resultMessage, setResultMessage] = useState('');\n const generatorRef = useRef<AsyncGenerator<string> | null>(null);\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n void load();\n return () => {\n mountedRef.current = false;\n void generatorRef.current?.return(undefined);\n };\n }, []);\n\n const startReconcile = useCallback(async () => {\n if (!schema) return;\n setPhase('reconciling');\n setStreamLines([]);\n setStreamError(null);\n setStreamRunning(true);\n\n const gen = reconcile(schema, isPro());\n generatorRef.current = gen;\n\n try {\n for await (const line of gen) {\n if (!mountedRef.current) break;\n setStreamLines((prev) => [...prev.slice(-99), line]);\n }\n if (mountedRef.current) {\n setResultMessage(t('brewfile_reconcile_success'));\n }\n } catch (err) {\n if (mountedRef.current) {\n const msg = err instanceof Error ? err.message : String(err);\n setStreamError(msg);\n setResultMessage(t('brewfile_reconcile_error', { error: msg }));\n }\n } finally {\n generatorRef.current = null;\n if (mountedRef.current) {\n setStreamRunning(false);\n setPhase('result');\n }\n }\n }, [schema, isPro]);\n\n useInput((input, key) => {\n if (phase === 'reconciling') return;\n\n if (phase === 'result') {\n if (key.escape || input === 'r') {\n setPhase('overview');\n void load();\n }\n return;\n }\n\n if (phase === 'creating') return; // TextInput handles input\n\n // phase === 'overview'\n if (input === 'n') {\n setPhase('creating');\n return;\n }\n if (input === 'r') {\n void load();\n return;\n }\n if (input === 'c') {\n const needsReconcile =\n drift && (\n drift.missingPackages.length > 0 ||\n drift.wrongVersions.length > 0\n );\n if (needsReconcile) {\n void startReconcile();\n }\n return;\n }\n if (key.escape) {\n // back handled by global navigation\n }\n });\n\n if (loading) return <Loading message={t('loading_default')} />;\n if (error) return <ErrorMessage message={error} />;\n\n // ── Phase: creating ──\n if (phase === 'creating') {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <SectionHeader emoji=\"📦\" title={t('brewfile_title')} gradient={GRADIENTS.ocean} />\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>{t('brewfile_create_name')} </Text>\n <TextInput\n defaultValue=\"My Environment\"\n onSubmit={(value) => {\n const name = value.trim() || 'My Environment';\n setPhase('overview');\n void createFromCurrent(name).then(() => {\n // drift will auto-refresh via store\n });\n }}\n />\n </Box>\n </Box>\n );\n }\n\n // ── Phase: reconciling ──\n if (phase === 'reconciling') {\n return (\n <Box flexDirection=\"column\">\n <ProgressLog\n lines={streamLines}\n isRunning={streamRunning}\n title={t('brewfile_reconciling')}\n />\n </Box>\n );\n }\n\n // ── Phase: result ──\n if (phase === 'result') {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <ResultBanner\n status={streamError ? 'error' : 'success'}\n message={resultMessage}\n />\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>r:{t('hint_refresh')} esc:{t('hint_back')}</Text>\n </Box>\n </Box>\n );\n }\n\n // ── Phase: overview ──\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji=\"📦\" title={t('brewfile_title')} gradient={GRADIENTS.ocean} />\n\n {schema === null ? (\n <Box marginTop={1} flexDirection=\"column\">\n <ResultBanner status=\"info\" message={t('brewfile_no_brewfile')} />\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>n:{t('hint_new')}</Text>\n </Box>\n </Box>\n ) : (\n <Box flexDirection=\"column\" marginTop={1}>\n {/* Brewfile metadata */}\n <Box gap={2}>\n <Text color={COLORS.text} bold>{schema.meta.name}</Text>\n {schema.meta.description && (\n <Text color={COLORS.textSecondary}>{schema.meta.description}</Text>\n )}\n {schema.strictMode && (\n <Text color={COLORS.warning}>[{t('brewfile_strict_mode')}]</Text>\n )}\n </Box>\n\n {/* Package counts */}\n <Box gap={3} marginTop={1}>\n <Text color={COLORS.sky}>\n {t('brewfile_formulae_count', { count: schema.formulae.length })}\n </Text>\n <Text color={COLORS.teal}>\n {t('brewfile_casks_count', { count: schema.casks.length })}\n </Text>\n </Box>\n\n {/* Drift score */}\n {driftLoading && (\n <Box marginTop={1}>\n <Text color={COLORS.muted}>Computing drift...</Text>\n </Box>\n )}\n {drift && !driftLoading && (\n <Box flexDirection=\"column\" marginTop={1}>\n <DriftScore score={drift.score} />\n <DriftSummary drift={drift} />\n </Box>\n )}\n\n {/* Keyboard hints */}\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>\n r:{t('hint_refresh')}\n {drift && (drift.missingPackages.length > 0 || drift.wrongVersions.length > 0)\n ? ` c:${t('hint_reconcile')}`\n : ''}\n {' '}n:{t('hint_new')}\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import React, { useCallback, useEffect, useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { useSyncStore } from '../stores/sync-store.js';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { useNavigationStore } from '../stores/navigation-store.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { Loading } from '../components/common/loading.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nimport type { SyncConflict } from '../lib/sync/types.js';\n\ntype Phase = 'overview' | 'syncing' | 'conflicts' | 'result';\n\ntype ConflictResolution = 'use-local' | 'use-remote' | 'pending';\n\ninterface ConflictEntry {\n conflict: SyncConflict;\n resolution: ConflictResolution;\n}\n\nfunction OverviewSection({\n config,\n lastResult,\n conflicts,\n onSyncNow: _onSyncNow,\n onGoToConflicts: _onGoToConflicts,\n}: {\n config: ReturnType<typeof useSyncStore.getState>['config'];\n lastResult: ReturnType<typeof useSyncStore.getState>['lastResult'];\n conflicts: SyncConflict[];\n onSyncNow: () => void;\n onGoToConflicts: () => void;\n}) {\n const hasConflicts = conflicts.length > 0;\n const showComplianceHint = !hasConflicts && !!lastResult?.success;\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n {config ? (\n <>\n <Box marginBottom={1}>\n <Text color={COLORS.textSecondary}>{t('sync_machine', { name: config.machineName })}</Text>\n </Box>\n {config.lastSync && (\n <Box marginBottom={1}>\n <Text color={COLORS.textSecondary}>\n {t('sync_last_sync', { date: new Date(config.lastSync).toLocaleString() })}\n </Text>\n </Box>\n )}\n {hasConflicts ? (\n <ResultBanner\n status=\"error\"\n message={t('sync_status_conflict', { count: String(conflicts.length) })}\n />\n ) : lastResult?.success ? (\n <ResultBanner status=\"success\" message={t('sync_status_ok')} />\n ) : null}\n </>\n ) : (\n <Box marginBottom={1}>\n <Text color={COLORS.textSecondary}>{t('sync_disabled')}</Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>\n {'s'}<Text color={COLORS.gold}>:{t('hint_sync')}</Text>\n {hasConflicts && (\n <>\n {' c'}<Text color={COLORS.gold}>:{t('hint_conflict')}</Text>\n </>\n )}\n {showComplianceHint && (\n <>\n {' c'}<Text color={COLORS.gold}>:{t('hint_check_compliance')}</Text>\n </>\n )}\n </Text>\n </Box>\n </Box>\n );\n}\n\nfunction ConflictsList({\n entries,\n cursor,\n}: {\n entries: ConflictEntry[];\n cursor: number;\n}) {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n {entries.map((entry, i) => {\n const { conflict, resolution } = entry;\n const isActive = i === cursor;\n return (\n <Box key={`${conflict.packageName}-${conflict.remoteMachine}`} flexDirection=\"column\" marginBottom={1}>\n <SelectableRow isCurrent={isActive}>\n <Text bold color={isActive ? COLORS.text : COLORS.textSecondary}>\n {t('sync_conflict_title', { package: conflict.packageName })}\n </Text>\n <Text color={COLORS.muted}> ({conflict.packageType})</Text>\n </SelectableRow>\n <Box marginLeft={2} flexDirection=\"column\">\n <Text\n color={resolution === 'use-local' ? COLORS.success : COLORS.textSecondary}\n >\n {'l '}{t('sync_conflict_local', { version: conflict.localVersion })}\n {resolution === 'use-local' && ' ✓'}\n </Text>\n <Text\n color={resolution === 'use-remote' ? COLORS.success : COLORS.textSecondary}\n >\n {'r '}{t('sync_conflict_remote', { machine: conflict.remoteMachine, version: conflict.remoteVersion })}\n {resolution === 'use-remote' && ' ✓'}\n </Text>\n </Box>\n </Box>\n );\n })}\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>\n j/k:navegar l:{t('sync_conflict_use_local')} r:{t('sync_conflict_use_remote')} enter:aplicar\n </Text>\n </Box>\n </Box>\n );\n}\n\nexport function SyncView() {\n const isPro = useLicenseStore((s) => s.isPro);\n const navigate = useNavigationStore((s) => s.navigate);\n const { config, lastResult, conflicts, loading, error, initialize, syncNow, resolveConflicts } =\n useSyncStore();\n\n const [phase, setPhase] = useState<Phase>('overview');\n const [syncError, setSyncError] = useState<string | null>(null);\n const [conflictEntries, setConflictEntries] = useState<ConflictEntry[]>([]);\n const [cursor, setCursor] = useState(0);\n\n useEffect(() => {\n void initialize(isPro());\n }, []);\n\n // When store conflicts change, populate entries\n useEffect(() => {\n if (conflicts.length > 0) {\n setConflictEntries(\n conflicts.map((c) => ({ conflict: c, resolution: 'pending' as ConflictResolution })),\n );\n }\n }, [conflicts]);\n\n const handleSyncNow = useCallback(async () => {\n setPhase('syncing');\n setSyncError(null);\n await syncNow(isPro());\n // After sync, check for conflicts or success\n const state = useSyncStore.getState();\n if (state.conflicts.length > 0) {\n setPhase('conflicts');\n } else if (state.error) {\n setSyncError(state.error);\n setPhase('result');\n } else {\n setPhase('result');\n }\n }, [isPro, syncNow]);\n\n const handleApplyResolutions = useCallback(async () => {\n const pending = conflictEntries.filter((e) => e.resolution === 'pending');\n if (pending.length > 0) return; // All must be resolved before applying\n\n const resolutions = conflictEntries.map((e) => ({\n conflict: e.conflict,\n resolution: e.resolution as 'use-local' | 'use-remote',\n }));\n\n await resolveConflicts(resolutions);\n setPhase('result');\n }, [conflictEntries, resolveConflicts]);\n\n useInput((input, key) => {\n if (phase === 'syncing') return;\n\n if (phase === 'result') {\n if (key.escape || input === 'r') {\n setPhase('overview');\n setSyncError(null);\n void initialize(isPro());\n }\n return;\n }\n\n if (phase === 'conflicts') {\n if (key.escape) { setPhase('overview'); return; }\n\n if (input === 'j' || key.downArrow) {\n setCursor((c) => Math.min(c + 1, conflictEntries.length - 1));\n return;\n }\n if (input === 'k' || key.upArrow) {\n setCursor((c) => Math.max(c - 1, 0));\n return;\n }\n\n if (input === 'l') {\n setConflictEntries((prev) =>\n prev.map((e, i) => (i === cursor ? { ...e, resolution: 'use-local' } : e)),\n );\n return;\n }\n if (input === 'r') {\n setConflictEntries((prev) =>\n prev.map((e, i) => (i === cursor ? { ...e, resolution: 'use-remote' } : e)),\n );\n return;\n }\n\n if (key.return) {\n void handleApplyResolutions();\n return;\n }\n }\n\n // phase === 'overview'\n if (input === 's') {\n void handleSyncNow();\n return;\n }\n if (input === 'c' && conflicts.length > 0) {\n setCursor(0);\n setPhase('conflicts');\n return;\n }\n if (input === 'c' && lastResult?.success) {\n navigate('compliance');\n return;\n }\n if (input === 'r') {\n void initialize(isPro());\n return;\n }\n });\n\n if (phase === 'syncing' || loading) {\n return <Loading message={t('sync_syncing')} />;\n }\n\n if (phase === 'result') {\n const isError = !!(syncError ?? error);\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <SectionHeader emoji=\"🔄\" title={t('sync_title')} gradient={GRADIENTS.gold} />\n <Box marginTop={1}>\n <ResultBanner\n status={isError ? 'error' : 'success'}\n message={\n isError\n ? t('sync_error', { error: syncError ?? error ?? '' })\n : t('sync_success')\n }\n />\n </Box>\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>r:{t('hint_refresh')} esc:{t('hint_back')}</Text>\n </Box>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji=\"🔄\" title={t('sync_title')} gradient={GRADIENTS.gold} />\n\n {error && phase === 'overview' && (\n <Box marginTop={1}>\n <ResultBanner status=\"error\" message={t('sync_error', { error })} />\n </Box>\n )}\n\n {phase === 'overview' && (\n <OverviewSection\n config={config}\n lastResult={lastResult}\n conflicts={conflicts}\n onSyncNow={() => void handleSyncNow()}\n onGoToConflicts={() => { setCursor(0); setPhase('conflicts'); }}\n />\n )}\n\n {phase === 'conflicts' && (\n <Box flexDirection=\"column\">\n <SectionHeader emoji=\"⚠\" title={t('sync_status_conflict', { count: String(conflictEntries.length) })} gradient={GRADIENTS.gold} />\n <ConflictsList entries={conflictEntries} cursor={cursor} />\n </Box>\n )}\n </Box>\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { TextInput } from '@inkjs/ui';\nimport { useComplianceStore } from '../stores/compliance-store.js';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { remediateViolations } from '../lib/compliance/compliance-remediator.js';\nimport { exportReport } from '../lib/compliance/policy-io.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { Loading } from '../components/common/loading.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nimport { DATA_DIR } from '../lib/data-dir.js';\nimport { join } from 'node:path';\nimport type { ComplianceReport, ComplianceViolation } from '../lib/compliance/types.js';\n\ntype Phase = 'overview' | 'importing' | 'remediating' | 'result';\n\nfunction ComplianceScore({ report }: { report: ComplianceReport }) {\n const color =\n report.score >= 80 ? COLORS.success : report.score >= 50 ? COLORS.warning : COLORS.error;\n const bars = Math.round(report.score / 10);\n\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Text color={color}>{'▓'.repeat(bars)}{'░'.repeat(10 - bars)}</Text>\n <Text color={color} bold> {report.score}%</Text>\n <Text color={COLORS.textSecondary}> {t('compliance_score', { score: String(report.score) })}</Text>\n </Box>\n <Text color={COLORS.muted} dimColor>\n {t('compliance_policy_name', { name: report.policyName })} · {t('compliance_machine', { name: report.machineName })}\n </Text>\n </Box>\n );\n}\n\nfunction ViolationItem({ violation }: { violation: ComplianceViolation }) {\n const color = violation.severity === 'error' ? COLORS.error : COLORS.warning;\n const prefix = violation.severity === 'error' ? '✗' : '⚠';\n\n return (\n <Box marginBottom={0}>\n <Text color={color}>{prefix} </Text>\n <Text color={color}>{violation.detail}</Text>\n </Box>\n );\n}\n\nfunction ViolationList({ violations }: { violations: ComplianceViolation[] }) {\n const errors = violations.filter((v) => v.severity === 'error');\n const warnings = violations.filter((v) => v.severity === 'warning');\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n {errors.length > 0 && (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color={COLORS.error} bold>{t('compliance_violations', { count: String(errors.length) })} (errors)</Text>\n {errors.map((v) => (\n <ViolationItem key={`${v.type}-${v.packageName}`} violation={v} />\n ))}\n </Box>\n )}\n {warnings.length > 0 && (\n <Box flexDirection=\"column\">\n <Text color={COLORS.warning} bold>{t('compliance_violations', { count: String(warnings.length) })} (warnings)</Text>\n {warnings.map((v) => (\n <ViolationItem key={`${v.type}-${v.packageName}`} violation={v} />\n ))}\n </Box>\n )}\n </Box>\n );\n}\n\nexport function ComplianceView() {\n const isPro = useLicenseStore((s) => s.isPro);\n const { policy, report, loading, error, importPolicy, runCheck } =\n useComplianceStore();\n\n const [phase, setPhase] = useState<Phase>('overview');\n const [resultMessage, setResultMessage] = useState<{ ok: boolean; text: string } | null>(null);\n const [streamLines, setStreamLines] = useState<string[]>([]);\n const [streamRunning, setStreamRunning] = useState(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 void generatorRef.current?.return(undefined);\n };\n }, []);\n\n const handleImportSubmit = useCallback(\n async (filePath: string) => {\n if (!filePath.trim()) { setPhase('overview'); return; }\n await importPolicy(filePath.trim(), isPro());\n // importPolicy actualiza el store; runCheck si no hubo error\n const state = useComplianceStore.getState();\n if (!state.error && state.policy) {\n await runCheck(isPro());\n }\n setPhase('overview');\n },\n [isPro, importPolicy, runCheck],\n );\n\n const handleRecheck = useCallback(() => {\n void runCheck(isPro());\n }, [isPro, runCheck]);\n\n const handleExport = useCallback(async () => {\n if (!report) return;\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const outputPath = join(DATA_DIR, `compliance-report-${timestamp}.json`);\n try {\n await exportReport(report, outputPath);\n setResultMessage({ ok: true, text: t('compliance_export_done', { path: outputPath }) });\n setPhase('result');\n } catch (err) {\n setResultMessage({\n ok: false,\n text: t('compliance_remediate_error', { error: err instanceof Error ? err.message : String(err) }),\n });\n setPhase('result');\n }\n }, [report]);\n\n const handleRemediate = useCallback(async () => {\n if (!report) return;\n const actionable = report.violations.filter(\n (v) => v.type === 'missing' || v.type === 'wrong-version',\n );\n if (actionable.length === 0) return;\n\n setPhase('remediating');\n setStreamLines([]);\n setStreamRunning(true);\n\n const gen = remediateViolations(actionable, isPro());\n generatorRef.current = gen;\n\n try {\n for await (const line of gen) {\n if (!mountedRef.current) break;\n setStreamLines((prev) => [...prev.slice(-99), line]);\n }\n if (mountedRef.current) {\n setResultMessage({ ok: true, text: t('compliance_remediate_success') });\n // Re-check after remediation\n await runCheck(isPro());\n }\n } catch (err) {\n if (mountedRef.current) {\n setResultMessage({\n ok: false,\n text: t('compliance_remediate_error', { error: err instanceof Error ? err.message : String(err) }),\n });\n }\n } finally {\n generatorRef.current = null;\n if (mountedRef.current) {\n setStreamRunning(false);\n setPhase('result');\n }\n }\n }, [report, isPro, runCheck]);\n\n useInput((input, key) => {\n if (phase === 'remediating' || phase === 'importing') return;\n\n if (phase === 'result') {\n if (key.escape || input === 'r') {\n setPhase('overview');\n setResultMessage(null);\n }\n return;\n }\n\n // phase === 'overview'\n if (input === 'i') {\n setPhase('importing');\n return;\n }\n if (input === 'r' && policy) {\n handleRecheck();\n return;\n }\n if (input === 'e' && report) {\n void handleExport();\n return;\n }\n if (input === 'c' && report) {\n const actionable = report.violations.filter(\n (v) => v.type === 'missing' || v.type === 'wrong-version',\n );\n if (actionable.length > 0) {\n void handleRemediate();\n }\n return;\n }\n });\n\n if (phase === 'remediating' || (loading && phase !== 'importing')) {\n if (phase === 'remediating') {\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji=\"🔍\" title={t('compliance_title')} gradient={GRADIENTS.gold} />\n <Box marginTop={1}>\n <ProgressLog lines={streamLines} isRunning={streamRunning} title={t('compliance_remediating')} />\n </Box>\n </Box>\n );\n }\n return <Loading message={t('compliance_title')} />;\n }\n\n if (phase === 'result' && resultMessage) {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <SectionHeader emoji=\"🔍\" title={t('compliance_title')} gradient={GRADIENTS.gold} />\n <Box marginTop={1}>\n <ResultBanner\n status={resultMessage.ok ? 'success' : 'error'}\n message={resultMessage.text}\n />\n </Box>\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>r:{t('hint_refresh')} esc:{t('hint_back')}</Text>\n </Box>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji=\"🔍\" title={t('compliance_title')} gradient={GRADIENTS.gold} />\n\n {error && (\n <Box marginTop={1}>\n <ResultBanner status=\"error\" message={t('compliance_import_error', { error })} />\n </Box>\n )}\n\n {phase === 'importing' && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color={COLORS.textSecondary}>{t('compliance_import_prompt')}</Text>\n <Box marginTop={1}>\n <TextInput\n defaultValue=\"\"\n onSubmit={(val) => { void handleImportSubmit(val); }}\n />\n </Box>\n <Box marginTop={1}>\n <Text color={COLORS.muted} dimColor>esc:{t('hint_back')}</Text>\n </Box>\n </Box>\n )}\n\n {phase === 'overview' && (\n <Box flexDirection=\"column\" marginTop={1}>\n {!policy ? (\n <Box flexDirection=\"column\">\n <Text color={COLORS.textSecondary}>{t('compliance_no_policy')}</Text>\n </Box>\n ) : (\n <Box flexDirection=\"column\">\n <Text color={COLORS.textSecondary} bold>\n {t('compliance_policy_by', { maintainer: policy.meta.maintainer })}\n </Text>\n\n {report ? (\n <Box flexDirection=\"column\" marginTop={1}>\n <ComplianceScore report={report} />\n {report.compliant ? (\n <ResultBanner status=\"success\" message={t('compliance_ok')} />\n ) : (\n <ViolationList violations={report.violations} />\n )}\n </Box>\n ) : (\n <Box marginTop={1}>\n <Text color={COLORS.muted} dimColor>Press r to run compliance check.</Text>\n </Box>\n )}\n </Box>\n )}\n\n <Box marginTop={2} flexWrap=\"wrap\">\n <Text color={COLORS.textSecondary}>\n i:{t('hint_import')}\n {policy && <Text> r:{t('hint_scan')}</Text>}\n {report && <Text> e:{t('hint_export')}</Text>}\n {report && report.violations.some((v) => v.type === 'missing' || v.type === 'wrong-version') && (\n <Text> c:{t('hint_clean')}</Text>\n )}\n {' q:'}{t('hint_quit')}\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import { streamBrew } from '../brew-cli.js';\nimport type { ComplianceViolation } from './types.js';\n\nexport async function* remediateViolations(\n violations: ComplianceViolation[],\n isPro: boolean,\n): AsyncGenerator<string> {\n if (!isPro) throw new Error('Pro license required');\n\n let installed = 0;\n let upgraded = 0;\n let skipped = 0;\n\n for (const v of violations) {\n if (v.type === 'missing') {\n yield `Installing ${v.packageName}...`;\n try {\n for await (const line of streamBrew(['install', v.packageName])) {\n yield line;\n }\n installed++;\n } catch (err) {\n yield ` ✗ Failed to install ${v.packageName}: ${err instanceof Error ? err.message : String(err)}`;\n skipped++;\n }\n } else if (v.type === 'wrong-version') {\n yield `Upgrading ${v.packageName}${v.required ? ` to ${v.required}+` : ''}...`;\n try {\n for await (const line of streamBrew(['upgrade', v.packageName])) {\n yield line;\n }\n upgraded++;\n } catch (err) {\n yield ` ✗ Failed to upgrade ${v.packageName}: ${err instanceof Error ? err.message : String(err)}`;\n skipped++;\n }\n } else if (v.type === 'forbidden') {\n yield ` ⚠ Forbidden package detected: ${v.packageName} — manual removal required`;\n skipped++;\n } else if (v.type === 'extra') {\n yield ` ⚠ Extra package in strict mode: ${v.packageName} — manual removal required`;\n skipped++;\n }\n }\n\n yield `Remediation complete: ${installed} installed, ${upgraded} upgraded, ${skipped} skipped (manual action required)`;\n}\n"],"mappings":"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","names":["rm","useEffect","Box","Text","t","GradientText","jsx","Text","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","useStdout","create","create","create","create","create","create","create","create","create","create","Box","Text","useStdout","jsx","jsxs","useStdout","Box","Text","Box","Text","jsx","jsxs","Box","Text","Text","jsxs","Text","Box","Text","jsx","jsxs","Box","Text","Text","Fragment","jsx","jsxs","Text","jsx","jsxs","Box","Text","useStdout","useMemo","useState","useMemo","useEffect","Box","Text","useInput","useStdout","useEffect","useState","useEffect","appendEntry","useState","setError","useEffect","captureSnapshot","saveSnapshot","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","Box","Text","useState","useRef","useEffect","useInput","useStdout","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","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","useCallback","useEffect","useRef","useState","Box","Text","useInput","create","readdir","join","join","readdir","create","jsx","jsxs","Box","Text","useState","useRef","useEffect","useCallback","useInput","useCallback","useEffect","useRef","useState","Box","Text","useInput","TextInput","jsx","jsxs","Box","Text","useState","useRef","useEffect","useCallback","useInput","TextInput","useCallback","useEffect","useState","Box","Text","useInput","Fragment","jsx","jsxs","Box","Text","useState","useEffect","useCallback","useInput","useCallback","useEffect","useRef","useState","Box","Text","useInput","TextInput","join","jsx","jsxs","Box","Text","useState","useRef","useEffect","useCallback","useInput","TextInput","jsx","jsxs","useEffect","jsx","loadSnapshots","loadBrewfile","computeDrift","loadSyncConfig","loadPolicy","checkCompliance","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/parsers/json-parser.ts","../src/lib/parsers/text-parser.ts","../src/lib/impact/impact-analyzer.ts","../src/stores/security-store.ts","../src/lib/security/osv-api.ts","../src/lib/security/audit-runner.ts","../src/stores/brewfile-store.ts","../src/stores/sync-store.ts","../src/stores/compliance-store.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/views/account.tsx","../src/lib/license/promo.ts","../src/views/rollback.tsx","../src/stores/rollback-store.ts","../src/lib/rollback/rollback-engine.ts","../src/views/brewfile.tsx","../src/views/sync.tsx","../src/views/compliance.tsx","../src/lib/compliance/compliance-remediator.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 const isPro = useLicenseStore.getState().isPro();\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\n // Pro-only status sections\n if (isPro) {\n // Snapshots\n try {\n const { loadSnapshots } = await import('./lib/state-snapshot/snapshot.js');\n const snapshots = await loadSnapshots();\n if (snapshots.length > 0) {\n const latest = snapshots[0];\n console.log(`\\nSnapshots: ${snapshots.length} (latest: ${latest ? formatDate(latest.capturedAt) : '—'})`);\n } else {\n console.log('\\nSnapshots: none');\n }\n } catch {\n // Non-fatal: snapshot dir may not exist yet\n }\n\n // Brewfile drift\n try {\n const { loadBrewfile, computeDrift } = await import('./lib/brewfile/brewfile-manager.js');\n const schema = await loadBrewfile();\n if (schema) {\n const drift = await computeDrift(schema);\n console.log(`Brewfile: ${drift.score}% compliant (${drift.missingPackages.length} missing, ${drift.extraPackages.length} extra)`);\n }\n } catch {\n // Non-fatal\n }\n\n // Sync last sync date\n try {\n const { loadSyncConfig } = await import('./lib/sync/sync-engine.js');\n const syncConfig = await loadSyncConfig();\n if (syncConfig?.lastSync) {\n console.log(`Sync: last sync ${formatDate(syncConfig.lastSync)}`);\n }\n } catch {\n // Non-fatal\n }\n\n // Compliance score\n try {\n const { loadPolicy } = await import('./lib/compliance/policy-io.js');\n const { checkCompliance } = await import('./lib/compliance/compliance-checker.js');\n // Try loading from default location\n const policy = await loadPolicy(`${process.env['HOME'] ?? '~'}/.brew-tui/policy.yaml`).catch(() => null);\n if (policy) {\n const report = await checkCompliance(policy, true);\n console.log(`Compliance: ${report.score}% (${report.violations.length} violation(s))`);\n }\n } catch {\n // Non-fatal: no policy loaded\n }\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 // Auto-install + auto-launch BrewBar for Pro users on macOS.\n // Runs before the TUI clears the screen so progress messages are visible on cold install.\n await ensureBrewBarRunning();\n\n // Default: launch TUI. Mark TUI mode so the logger redirects to a file\n // instead of stdout/stderr (which would corrupt the Ink-rendered frame).\n process.env.BREW_TUI_TUI_MODE = '1';\n process.stdout.write('\\x1B[2J\\x1B[3J\\x1B[H');\n render(<App />);\n}\n\nasync function ensureBrewBarRunning() {\n if (process.platform !== 'darwin') return;\n\n await useLicenseStore.getState().initialize();\n if (!useLicenseStore.getState().isPro()) return;\n\n const { isBrewBarInstalled, installBrewBar, launchBrewBar } = await import('./lib/brewbar-installer.js');\n\n try {\n if (!await isBrewBarInstalled()) {\n console.log(t('cli_brewbarInstalling'));\n await installBrewBar(true, false);\n console.log(t('cli_brewbarInstalled'));\n }\n await launchBrewBar();\n } catch (err) {\n // Non-fatal: log a single line and continue to TUI so brew-tui stays usable.\n console.warn(t('cli_brewbarAutoFailed', { error: err instanceof Error ? err.message : String(err) }));\n }\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, isTeamView } 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 { RollbackView } from './views/rollback.js';\nimport { BrewfileView } from './views/brewfile.js';\nimport { SyncView } from './views/sync.js';\nimport { ComplianceView } from './views/compliance.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 const isTeam = useLicenseStore((s) => s.isTeam);\n\n // Gate Pro views\n if (isProView(currentView) && !isPro()) {\n return <UpgradePrompt viewId={currentView} />;\n }\n\n // Gate Team views\n if (isTeamView(currentView) && !isTeam()) {\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 'rollback': return <RollbackView />;\n case 'brewfile': return <BrewfileView />;\n case 'sync': return <SyncView />;\n case 'security-audit': return <SecurityAuditView />;\n case 'compliance': return <ComplianceView />;\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, useStdout } from 'ink';\nimport { useNavigationStore } from '../../stores/navigation-store.js';\nimport { isProView, isTeamView } 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 rollback: 'view_rollback',\n brewfile: 'view_brewfile',\n sync: 'view_sync',\n 'security-audit': 'view_securityAudit',\n compliance: 'view_compliance',\n account: 'view_account',\n};\n\nconst VIEW_KEYS: Record<ViewId, string> = {\n dashboard: '1', installed: '2', search: '', outdated: '3',\n 'package-info': '', services: '4', doctor: '5',\n profiles: '6', 'smart-cleanup': '7', history: '8', 'security-audit': '9',\n rollback: '', brewfile: '', sync: '', compliance: '',\n account: '0',\n};\n\nconst TAB_VIEWS: ViewId[] = [\n 'dashboard', 'installed', 'outdated', 'package-info', 'services', 'doctor',\n 'profiles', 'smart-cleanup', 'history', 'rollback', 'brewfile', 'sync', 'security-audit', 'compliance', 'account',\n];\n\nfunction MenuItem({ view, currentView }: { view: ViewId; currentView: ViewId }) {\n const key = VIEW_KEYS[view];\n const viewLabel = t(VIEW_LABEL_KEYS[view]);\n const isPro = isProView(view) || isTeamView(view);\n const isActive = view === currentView;\n const isAccount = view === 'account';\n // Indicator for keyless views: package-info uses Enter, account uses 0\n const indicator = key || (view === 'package-info' ? '\\u21B2' : ' ');\n\n return (\n <Box>\n {isActive ? <Text color={COLORS.success} bold>{'\\u25B6'} </Text> : <Text> </Text>}\n <Text bold color={key ? '#FFFFFF' : COLORS.textSecondary}>{indicator}</Text>\n <Text bold={isActive} underline={isActive} color={isActive ? COLORS.success : isAccount ? COLORS.gold : COLORS.textSecondary}> {viewLabel}</Text>\n {isPro && <Text color={COLORS.brand} bold> {t('pro_badge')}</Text>}\n </Box>\n );\n}\n\nconst COL1_VIEWS = TAB_VIEWS.slice(0, 6);\nconst COL2_VIEWS = TAB_VIEWS.slice(6);\n\nexport function Header() {\n const currentView = useNavigationStore((s) => s.currentView);\n useLocaleStore((s) => s.locale);\n const { stdout } = useStdout();\n const cols = stdout?.columns ?? 80;\n const isNarrow = cols < 95;\n\n const logoBlock = (\n <Box flexDirection=\"column\" flexShrink={0}>\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 );\n\n const menuBlock = (\n <Box borderStyle=\"round\" borderColor={COLORS.lavender} paddingX={1} flexDirection=\"column\" alignSelf={isNarrow ? 'flex-start' : 'center'}>\n <Box flexDirection=\"row\">\n <Box flexDirection=\"column\">\n {COL1_VIEWS.map((view) => (\n <MenuItem key={view} view={view} currentView={currentView} />\n ))}\n </Box>\n <Box flexDirection=\"column\" marginLeft={2}>\n {COL2_VIEWS.map((view) => (\n <MenuItem key={view} view={view} currentView={currentView} />\n ))}\n </Box>\n </Box>\n <Box borderStyle=\"single\" borderTop borderBottom={false} borderLeft={false} borderRight={false} borderColor={COLORS.lavender} marginTop={0}>\n <Text bold color=\"#FFFFFF\">S</Text>\n <Text color={COLORS.textSecondary}> {t('hint_search')}</Text>\n <Text color={COLORS.lavender}> {'\\u2503'} </Text>\n <Text bold color=\"#FFFFFF\">L</Text>\n <Text color={COLORS.textSecondary}> {t('hint_lang')}</Text>\n </Box>\n </Box>\n );\n\n if (isNarrow) {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n {logoBlock}\n <Box marginTop={1}>{menuBlock}</Box>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"row\" paddingX={1} alignItems=\"center\">\n {logoBlock}\n <Box marginLeft={2}>{menuBlock}</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', 'outdated', 'package-info', 'services', 'doctor',\n 'profiles', 'smart-cleanup', 'history', 'rollback', 'brewfile', 'sync', 'security-audit', 'compliance', '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 'rollback',\n 'brewfile',\n 'sync',\n 'security-audit',\n]);\n\n// Team-tier views — superset de Pro, requieren licencia Team (o Pro durante lanzamiento)\nconst TEAM_VIEWS = new Set<ViewId>(['compliance']);\n\nexport function isProView(viewId: ViewId): boolean {\n return PRO_VIEWS.has(viewId);\n}\n\nexport function isTeamView(viewId: ViewId): boolean {\n return TEAM_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 lavender: '#C4B5FD',\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-9,0', 'hint_navigate'], ['S', 'hint_search'], ['tab', 'hint_next'], ['q', 'hint_quit']],\n installed: [['/', 'hint_filter'], ['enter', 'hint_info'], ['u', 'hint_uninstall'], ['S', 'hint_search'], ['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'], ['S', 'hint_search'], ['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'], ['x', 'hint_stop'], ['R', 'hint_restart'], ['r', 'hint_refresh'], ['S', 'hint_search'], ['q', 'hint_quit']],\n doctor: [['r', 'hint_refresh'], ['S', 'hint_search'], ['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'], ['S', 'hint_search'], ['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'], ['S', 'hint_search'], ['q', 'hint_quit']],\n rollback: [['j/k', 'hint_navigate'], ['enter', 'hint_select'], ['r', 'hint_rollback_confirm'], ['esc', 'hint_back'], ['q', 'hint_quit']],\n brewfile: [['j/k', 'hint_navigate'], ['a', 'hint_add'], ['d', 'hint_delete'], ['r', 'hint_reconcile'], ['e', 'hint_export'], ['q', 'hint_quit']],\n sync: [['s', 'hint_sync'], ['r', 'hint_refresh'], ['c', 'hint_conflict'], ['esc', 'hint_back'], ['q', 'hint_quit']],\n compliance: [['r', 'hint_scan'], ['i', 'hint_import'], ['e', 'hint_export'], ['c', 'hint_clean'], ['q', 'hint_quit']],\n account: [['p', 'hint_promo'], ['d', 'hint_deactivate'], ['S', 'hint_search'], ['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.lavender}> {'\\u2503'} </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, getBuiltinAccountType } 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 isTeam: () => 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 // Built-in perennial accounts: skip all Polar validation\n const builtinType = getBuiltinAccountType(license.customerEmail);\n if (builtinType === 'pro') {\n set({ status: 'pro', license: { ...license, status: 'active' }, degradation: 'none' });\n return;\n }\n if (builtinType === 'team') {\n set({ status: 'team', license: { ...license, status: 'active', plan: 'team' }, degradation: 'none' });\n return;\n }\n if (builtinType === 'free') {\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 tier immediately (warning/limited still shown as the licensed tier, but pro-guard checks degradation)\n set({ status: license.plan, 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 const status = get().status;\n if (!current || (status !== 'pro' && status !== 'team')) 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: license.plan, 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 // Team is a superset of Pro — team users have full Pro access plus team features.\n // Pro users do NOT get Team features (Compliance) without paying for the Team tier.\n isPro: () => { const s = get().status; return s === 'pro' || s === 'team'; },\n isTeam: () => get().status === 'team',\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\n// ── Built-in perennial accounts (bypass Polar validation) ──\nconst BUILTIN_ACCOUNTS: Record<string, 'pro' | 'team' | 'free'> = {\n 'admin@molinesdesigns.com': 'pro',\n 'team@molinesdesigns.com': 'team', // Team tier test/admin account\n 'artax1983@icloud.com': 'free',\n};\n\nexport function getBuiltinAccountType(email: string): 'pro' | 'team' | 'free' | null {\n return BUILTIN_ACCOUNTS[email] ?? null;\n}\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\n// Polar license-key benefits use distinct prefixes per tier:\n// Pro Monthly/Yearly → \"BTUI-...\"\n// Team Monthly/Yearly → \"BTUI-T-...\"\n// We detect the tier from the prefix instead of looking up the productId,\n// because Polar's customer-portal license endpoints don't echo product info\n// in the activation response.\nfunction detectPlan(key: string): 'pro' | 'team' {\n const upper = key.toUpperCase();\n return upper.startsWith('BTUI-T-') || upper.startsWith('BTUI-T_') ? 'team' : 'pro';\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: detectPlan(key),\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// Polar product IDs (public, not secret) — useful for analytics, support, and\n// future server-side validation that wants to confirm what the customer bought.\nexport const POLAR_PRODUCT_IDS = {\n proMonthly: 'b925b882-464c-40c1-9ffd-b088ab31d9a3',\n proYearly: '8f97bb81-b950-4bc3-97c5-8133dd817d0b',\n teamMonthly: '7cf3fcb2-560d-4fbb-9936-15efac511b23',\n teamYearly: 'd096914d-902d-47b0-8d62-5c7e6fc4e087',\n} as const;\n\n// Public checkout URLs surfaced from the landing page and the CLI upgrade prompt.\n// Team links carry ?quantity=3 because Polar has no native min-seats enforcement\n// and the Team tier is sold from 3 seats up.\nexport const POLAR_CHECKOUT_URLS = {\n proMonthly: 'https://buy.polar.sh/polar_cl_QW1ZJ9887bU74drGr7JfujQfm3RKYnn1fuvc53DqD6D',\n proYearly: 'https://buy.polar.sh/polar_cl_yQsiUeDelyyEQznbWffD1j77JAyP24ra7iEVQ22PA4h',\n teamMonthly: 'https://buy.polar.sh/polar_cl_CO6xqSzKgFiQJwXnhZYGqisOP04Wspi0KKZSn38NjFZ?quantity=3',\n teamYearly: 'https://buy.polar.sh/polar_cl_BZowqmtaKwWEkRJNtBcashWg7oZOH6OhnnsJ204opNA?quantity=3',\n} as const;\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': 'outdated',\n '4': 'services',\n '5': 'doctor',\n '6': 'profiles',\n '7': 'smart-cleanup',\n '8': 'history',\n '9': 'security-audit',\n '0': 'account',\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 === 'S') {\n navigate('search');\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';\nimport { isTeamView } from '../../lib/license/feature-gate.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 sync: { title: 'upgrade_sync', desc: 'upgrade_syncDesc' },\n compliance: { title: 'upgrade_compliance', desc: 'upgrade_complianceDesc' },\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 const team = isTeamView(viewId);\n const headerKey: TranslationKey = team ? 'upgrade_teamFeature' : 'upgrade_proFeature';\n const pricingKey: TranslationKey = team ? 'upgrade_teamPricing' : 'upgrade_pricing';\n const buyUrlKey: TranslationKey = team ? 'upgrade_buyUrlTeam' : 'upgrade_buyUrl';\n const labelKey: TranslationKey = team ? 'upgrade_teamLabel' : 'upgrade_proLabel';\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(headerKey, { 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(pricingKey)}</Text>\n <Text> </Text>\n <Text color={COLORS.muted}>{t('upgrade_buyAt')}</Text>\n <Text color={COLORS.sky} bold> {t(buyUrlKey)}</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(labelKey)}</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 { useSecurityStore } from '../stores/security-store.js';\nimport { useBrewfileStore } from '../stores/brewfile-store.js';\nimport { useSyncStore } from '../stores/sync-store.js';\nimport { useComplianceStore } from '../stores/compliance-store.js';\nimport { useLicenseStore } from '../stores/license-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\nfunction ProStatusPanel() {\n const security = useSecurityStore((s) => s.summary);\n const drift = useBrewfileStore((s) => s.drift);\n const syncConfig = useSyncStore((s) => s.config);\n const complianceReport = useComplianceStore((s) => s.report);\n\n const cveCount = security ? security.vulnerablePackages : null;\n const criticalCount = security ? security.criticalCount : null;\n\n const driftScore = drift ? drift.score : null;\n\n const lastSync = syncConfig?.lastSync ?? null;\n const syncAgo = lastSync ? formatRelativeTime(new Date(lastSync).getTime() / 1000) : null;\n\n const violationCount = complianceReport ? complianceReport.violations.length : null;\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={COLORS.purple} paddingX={2} paddingY={0} marginTop={1}>\n <Text bold color={COLORS.purple}>{t('dashboard_pro_status')}</Text>\n <Box gap={1}>\n <Text color={COLORS.muted}>{t('dashboard_security')}</Text>\n {cveCount === null ? (\n <Text color={COLORS.muted}>—</Text>\n ) : cveCount === 0 ? (\n <Text color={COLORS.success}>{t('dashboard_no_cves')}</Text>\n ) : (\n <Text color={COLORS.error}>\n {t('dashboard_cves', { count: String(cveCount) })}\n {criticalCount && criticalCount > 0 ? ` (${criticalCount} critical)` : ''}\n </Text>\n )}\n </Box>\n <Box gap={1}>\n <Text color={COLORS.muted}>{t('dashboard_brewfile')}</Text>\n {driftScore === null ? (\n <Text color={COLORS.muted}>—</Text>\n ) : (\n <Text color={driftScore >= 80 ? COLORS.success : COLORS.warning}>{driftScore}%</Text>\n )}\n </Box>\n <Box gap={1}>\n <Text color={COLORS.muted}>{t('dashboard_sync')}</Text>\n {syncAgo === null ? (\n <Text color={COLORS.muted}>{t('dashboard_sync_never')}</Text>\n ) : (\n <Text color={COLORS.info}>{t('dashboard_sync_ago', { time: syncAgo })}</Text>\n )}\n </Box>\n <Box gap={1}>\n <Text color={COLORS.muted}>{t('dashboard_compliance')}</Text>\n {violationCount === null ? (\n <Text color={COLORS.muted}>—</Text>\n ) : violationCount === 0 ? (\n <Text color={COLORS.success}>{t('dashboard_compliance_ok')}</Text>\n ) : (\n <Text color={COLORS.warning}>{t('dashboard_compliance_violations', { count: String(violationCount) })}</Text>\n )}\n </Box>\n </Box>\n );\n}\n\nexport function DashboardView() {\n const { formulae, casks, outdated, services, config, loading, errors, lastFetchedAt, fetchAll } = useBrewStore();\n const isPro = useLicenseStore((s) => s.isPro);\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\n {isPro() && <ProStatusPanel />}\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';\nimport { analyzeUpgradeImpact } from './impact/impact-analyzer.js';\nimport type { UpgradeImpact } from './impact/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 async function getUpgradeImpact(\n packageName: string,\n fromVersion: string,\n toVersion: string,\n packageType: 'formula' | 'cask',\n): Promise<UpgradeImpact> {\n validatePackageName(packageName);\n return analyzeUpgradeImpact(packageName, fromVersion, toVersion, packageType);\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 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)}`, { cause: 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 { execBrew } from '../brew-cli.js';\nimport { logger } from '../../utils/logger.js';\nimport { t } from '../../i18n/index.js';\nimport type { UpgradeImpact, RiskLevel } from './types.js';\n\n// Packages whose upgrade is always considered high risk\nconst HIGH_RISK_PACKAGES = new Set([\n 'openssl', 'openssl@3', 'openssl@1.1',\n 'python', 'python@3', 'python@3.11', 'python@3.12', 'python@3.13',\n 'node', 'node@18', 'node@20', 'ruby', 'ruby@3',\n 'sqlite', 'sqlite3', 'libpq', 'postgresql', 'postgresql@16',\n 'glibc', 'gcc', 'llvm',\n]);\n\nfunction isMajorVersionBump(from: string, to: string): boolean {\n const fromMajor = parseInt(from.split('.')[0] ?? '0', 10);\n const toMajor = parseInt(to.split('.')[0] ?? '0', 10);\n return !isNaN(fromMajor) && !isNaN(toMajor) && toMajor > fromMajor;\n}\n\nfunction calculateRisk(\n name: string,\n reverseDeps: string[],\n fromVersion: string,\n toVersion: string,\n): { risk: RiskLevel; reasons: string[] } {\n const reasons: string[] = [];\n\n // HIGH_RISK packages are sticky — always 'high' regardless of other factors\n if (HIGH_RISK_PACKAGES.has(name)) {\n reasons.push(t('impact_reason_critical_package'));\n return { risk: 'high', reasons };\n }\n\n // >10 reverse deps forces high directly\n if (reverseDeps.length > 10) {\n reasons.push(t('impact_reason_many_deps', { count: reverseDeps.length }));\n return { risk: 'high', reasons };\n }\n\n let factorCount = 0;\n\n if (reverseDeps.length >= 3) {\n factorCount++;\n reasons.push(t('impact_reason_many_deps', { count: reverseDeps.length }));\n }\n\n if (isMajorVersionBump(fromVersion, toVersion)) {\n factorCount++;\n reasons.push(t('impact_reason_major_bump'));\n }\n\n const risk: RiskLevel = factorCount >= 2 ? 'high' : factorCount === 1 ? 'medium' : 'low';\n return { risk, reasons };\n}\n\nexport async function analyzeUpgradeImpact(\n packageName: string,\n fromVersion: string,\n toVersion: string,\n packageType: 'formula' | 'cask',\n): Promise<UpgradeImpact> {\n // Casks are self-contained — no dependency graph to analyze\n if (packageType === 'cask') {\n return {\n packageName,\n fromVersion,\n toVersion,\n packageType,\n directDeps: [],\n reverseDeps: [],\n risk: 'low',\n riskReasons: [],\n };\n }\n\n let directDeps: string[] = [];\n let reverseDeps: string[] = [];\n\n try {\n const depsOutput = await execBrew(['deps', '--1', packageName]);\n directDeps = depsOutput.split('\\n').filter((l) => l.trim() !== '');\n } catch (err) {\n logger.warn(`impact-analyzer: deps failed for ${packageName}: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n try {\n const usesOutput = await execBrew(['uses', '--installed', packageName]);\n reverseDeps = usesOutput.split('\\n').filter((l) => l.trim() !== '');\n } catch (err) {\n logger.warn(`impact-analyzer: uses failed for ${packageName}: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n const { risk, reasons } = calculateRisk(packageName, reverseDeps, fromVersion, toVersion);\n\n return {\n packageName,\n fromVersion,\n toVersion,\n packageType,\n directDeps,\n reverseDeps,\n risk,\n riskReasons: reasons,\n };\n}\n\nexport { isMajorVersionBump };\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 { create } from 'zustand';\nimport type { BrewfileSchema, DriftReport } from '../lib/brewfile/types.js';\nimport {\n loadBrewfile,\n saveBrewfile,\n computeDrift,\n createDefaultBrewfile,\n} from '../lib/brewfile/brewfile-manager.js';\n\ninterface BrewfileState {\n schema: BrewfileSchema | null;\n drift: DriftReport | null;\n loading: boolean;\n driftLoading: boolean;\n error: string | null;\n\n load: () => Promise<void>;\n save: (schema: BrewfileSchema) => Promise<void>;\n refreshDrift: () => Promise<void>;\n createFromCurrent: (name: string) => Promise<void>;\n}\n\nexport const useBrewfileStore = create<BrewfileState>((set, get) => ({\n schema: null,\n drift: null,\n loading: false,\n driftLoading: false,\n error: null,\n\n load: async () => {\n set({ loading: true, error: null });\n try {\n const schema = await loadBrewfile();\n set({ schema, loading: false });\n if (schema) {\n void get().refreshDrift();\n }\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err), loading: false });\n }\n },\n\n save: async (schema) => {\n set({ error: null });\n try {\n await saveBrewfile(schema);\n set({ schema });\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err) });\n }\n },\n\n refreshDrift: async () => {\n const { schema } = get();\n if (!schema) return;\n set({ driftLoading: true, error: null });\n try {\n const drift = await computeDrift(schema);\n set({ drift, driftLoading: false });\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err), driftLoading: false });\n }\n },\n\n createFromCurrent: async (name) => {\n set({ loading: true, error: null });\n try {\n const schema = await createDefaultBrewfile(name);\n await saveBrewfile(schema);\n set({ schema, loading: false });\n void get().refreshDrift();\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err), loading: false });\n }\n },\n}));\n","import { create } from 'zustand';\nimport type { SyncConfig, SyncConflict, SyncResult } from '../lib/sync/types.js';\nimport {\n sync,\n loadSyncConfig,\n applyConflictResolutions,\n} from '../lib/sync/sync-engine.js';\nimport { readSyncEnvelope } from '../lib/sync/backends/icloud-backend.js';\nimport { decryptPayload } from '../lib/sync/crypto.js';\nimport { logger } from '../utils/logger.js';\nimport type { BrewfileSchema } from '../lib/brewfile/types.js';\n\ninterface SyncState {\n config: SyncConfig | null;\n lastResult: SyncResult | null;\n conflicts: SyncConflict[];\n loading: boolean;\n error: string | null;\n\n initialize: (isPro: boolean) => Promise<void>;\n syncNow: (isPro: boolean, brewfile?: BrewfileSchema) => Promise<void>;\n resolveConflicts: (\n resolutions: Array<{ conflict: SyncConflict; resolution: 'use-local' | 'use-remote' }>,\n ) => Promise<void>;\n}\n\nexport const useSyncStore = create<SyncState>((set, get) => ({\n config: null,\n lastResult: null,\n conflicts: [],\n loading: false,\n error: null,\n\n initialize: async (isPro: boolean) => {\n if (!isPro) return;\n try {\n const config = await loadSyncConfig();\n set({ config });\n } catch (err) {\n logger.warn('sync-store: could not load config', { error: String(err) });\n }\n },\n\n syncNow: async (isPro: boolean, brewfile?: BrewfileSchema) => {\n set({ loading: true, error: null });\n try {\n const result = await sync(isPro, brewfile);\n if (result.conflicts.length > 0) {\n set({ conflicts: result.conflicts, lastResult: result, loading: false });\n } else {\n const config = await loadSyncConfig();\n set({ config, lastResult: result, conflicts: [], loading: false });\n }\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n set({ error, loading: false });\n }\n },\n\n resolveConflicts: async (resolutions) => {\n set({ loading: true, error: null });\n try {\n const config = get().config;\n if (!config) throw new Error('Sync not initialized');\n\n // Load current payload from iCloud\n const envelope = await readSyncEnvelope();\n if (!envelope) throw new Error('No sync data found');\n\n const payload = decryptPayload(envelope.encrypted, envelope.iv, envelope.tag);\n await applyConflictResolutions(payload, resolutions, config.machineId);\n\n const updatedConfig = await loadSyncConfig();\n set({ config: updatedConfig, conflicts: [], loading: false });\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n set({ error, loading: false });\n }\n },\n}));\n","import { create } from 'zustand';\nimport type { PolicyFile, ComplianceReport } from '../lib/compliance/types.js';\nimport { checkCompliance } from '../lib/compliance/compliance-checker.js';\nimport { loadPolicy } from '../lib/compliance/policy-io.js';\n\ninterface ComplianceState {\n policy: PolicyFile | null;\n report: ComplianceReport | null;\n loading: boolean;\n error: string | null;\n\n importPolicy: (filePath: string, isPro: boolean) => Promise<void>;\n runCheck: (isPro: boolean) => Promise<void>;\n clearPolicy: () => void;\n}\n\nexport const useComplianceStore = create<ComplianceState>((set, get) => ({\n policy: null,\n report: null,\n loading: false,\n error: null,\n\n importPolicy: async (filePath: string, isPro: boolean) => {\n if (!isPro) {\n set({ error: 'Pro license required' });\n return;\n }\n set({ loading: true, error: null });\n try {\n const policy = await loadPolicy(filePath);\n set({ policy, loading: false });\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n set({ error, loading: false });\n }\n },\n\n runCheck: async (isPro: boolean) => {\n const { policy } = get();\n if (!policy) return;\n set({ loading: true, error: null });\n try {\n const report = await checkCompliance(policy, isPro);\n set({ report, loading: false });\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n set({ error, loading: false });\n }\n },\n\n clearPolicy: () => set({ policy: null, report: null, error: null }),\n}));\n","import React from 'react';\nimport { Box, Text, useStdout } 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 const { stdout } = useStdout();\n const cols = stdout?.columns ?? 80;\n // Adapt min width to terminal: tight on narrow, comfortable on wide\n const minW = cols < 60 ? 12 : cols < 100 ? 14 : 16;\n\n return (\n <Box\n borderStyle=\"round\"\n borderColor={color}\n paddingX={2}\n paddingY={0}\n flexDirection=\"column\"\n alignItems=\"center\"\n minWidth={minW}\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: '\\u25B2', 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 // Auto-capture snapshot after mutating brew operations\n const MUTATING_COMMANDS = new Set(['install', 'uninstall', 'upgrade', 'pin', 'unpin', 'tap', 'untap']);\n if (!cancelRef.current && MUTATING_COMMANDS.has(args[0] ?? '')) {\n void import('../lib/state-snapshot/snapshot.js').then(({ captureSnapshot, saveSnapshot }) => {\n captureSnapshot().then((s) => saveSnapshot(s)).catch(() => {});\n });\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, getUpgradeImpact } 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';\nimport { useDebounce } from '../hooks/use-debounce.js';\nimport type { UpgradeImpact } from '../lib/impact/types.js';\n\nfunction ImpactPanel({ impact }: { impact: UpgradeImpact }) {\n const riskColor =\n impact.risk === 'high' ? COLORS.error\n : impact.risk === 'medium' ? COLORS.warning\n : COLORS.success;\n\n const riskLabel =\n impact.risk === 'high' ? t('impact_high')\n : impact.risk === 'medium' ? t('impact_medium')\n : t('impact_low');\n\n const riskIcon =\n impact.risk === 'high' ? '\\u26A0'\n : impact.risk === 'medium' ? '~'\n : '\\u2713';\n\n return (\n <Box flexDirection=\"column\" marginTop={1} borderStyle=\"round\" borderColor={riskColor} paddingX={2} paddingY={0}>\n <Box>\n <Text bold color={riskColor}>{riskIcon} {riskLabel}</Text>\n {impact.reverseDeps.length > 0 && (\n <Text color={COLORS.textSecondary}> \\u2014 {t('impact_affects', { count: impact.reverseDeps.length })}</Text>\n )}\n </Box>\n {impact.riskReasons.length > 0 && (\n <Text color={COLORS.textSecondary}>{impact.riskReasons.join(' \\u00B7 ')}</Text>\n )}\n {impact.reverseDeps.length > 0 && impact.reverseDeps.length <= 5 && (\n <Text color={COLORS.muted} dimColor>\n {t('impact_usedBy', { packages: impact.reverseDeps.join(', ') })}\n </Text>\n )}\n {impact.risk === 'high' && (\n <Text color={COLORS.info}>{t('impact_brewfile_hint')}</Text>\n )}\n </Box>\n );\n}\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 const [impact, setImpact] = useState<UpgradeImpact | null>(null);\n const [impactLoading, setImpactLoading] = useState(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 // Enrich packages with type so formula/cask distinction is available\n const allOutdated = [\n ...outdated.formulae.map((p) => ({ ...p, type: 'formula' as const })),\n ...outdated.casks.map((p) => ({ ...p, type: 'cask' as const })),\n ];\n\n const debouncedCursor = useDebounce(cursor, 150);\n\n useEffect(() => {\n const pkg = allOutdated[debouncedCursor];\n if (!pkg || stream.isRunning) {\n setImpact(null);\n return;\n }\n setImpactLoading(true);\n void getUpgradeImpact(\n pkg.name,\n pkg.installed_versions[0] ?? '',\n pkg.current_version,\n pkg.type,\n )\n .then(setImpact)\n .catch(() => setImpact(null))\n .finally(() => setImpactLoading(false));\n }, [debouncedCursor, stream.isRunning]);\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\n {impact && !stream.isRunning && !confirmAction && (\n <ImpactPanel impact={impact} />\n )}\n {impactLoading && !stream.isRunning && !confirmAction && (\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>{t('impact_analyzing')}</Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>{t('impact_hint')}</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 === 'x') 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)}`, { cause: 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 { useNavigationStore } from '../stores/navigation-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 navigate = useNavigationStore((s) => s.navigate);\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 // Navigate to rollback view (capital R to avoid conflict with rescan)\n if (input === 'R') { navigate('rollback'); 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 {pkg.vulnerabilities.some((v) => v.fixedVersion) && (\n <Text color={COLORS.textSecondary}>[R:{t('hint_rollback')}]</Text>\n )}\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 marginTop={1}>\n <Text color={COLORS.textSecondary}>{t('security_rollback_hint')}</Text>\n </Box>\n </Box>\n )}\n </Box>\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","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { useRollbackStore } from '../stores/rollback-store.js';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { executeRollbackPlan } from '../lib/rollback/rollback-engine.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 { SectionHeader } from '../components/common/section-header.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t, tp } from '../i18n/index.js';\nimport type { RollbackAction, RollbackPlan } from '../lib/rollback/types.js';\n\ntype Phase = 'list' | 'plan' | 'confirm' | 'executing' | 'result';\n\nfunction strategyLabel(action: RollbackAction): string {\n switch (action.strategy) {\n case 'versioned-formula': return t('rollback_strategy_versioned');\n case 'bottle-cache': return t('rollback_strategy_bottle');\n case 'pin-only': return t('rollback_strategy_pin');\n case 'unavailable': return t('rollback_strategy_unavailable');\n }\n}\n\nfunction actionColor(action: RollbackAction): string {\n if (action.strategy === 'unavailable') return COLORS.muted;\n if (action.action === 'remove') return COLORS.muted;\n if (action.action === 'downgrade') return COLORS.warning;\n if (action.action === 'install') return COLORS.success;\n return COLORS.info;\n}\n\nfunction actionPrefix(action: RollbackAction): string {\n if (action.strategy === 'unavailable' || action.action === 'remove') return '⊗';\n if (action.strategy === 'pin-only') return '📌';\n if (action.action === 'downgrade') return '⬇';\n return '⬆';\n}\n\nfunction PlanView({ plan }: { plan: RollbackPlan }) {\n const executableCount = plan.actions.filter((a) => a.strategy !== 'unavailable' && a.action !== 'remove').length;\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box marginBottom={1}>\n <Text color={COLORS.text} bold>{plan.snapshotLabel} </Text>\n <Text color={COLORS.textSecondary}>{plan.snapshotDate}</Text>\n </Box>\n\n {plan.actions.length === 0 && (\n <ResultBanner status=\"success\" message={t('rollback_diff_empty')} />\n )}\n\n {plan.actions.map((a) => (\n <Box key={a.packageName + a.action}>\n <Text color={actionColor(a)}>{actionPrefix(a)} </Text>\n <Text color={actionColor(a)} bold>{a.packageName}</Text>\n {a.fromVersion !== '' && a.toVersion !== '' && (\n <Text color={COLORS.textSecondary}>{' '}{a.fromVersion} → {a.toVersion}</Text>\n )}\n {a.fromVersion === '' && a.toVersion !== '' && (\n <Text color={COLORS.textSecondary}> install {a.toVersion}</Text>\n )}\n {a.fromVersion !== '' && a.toVersion === '' && (\n <Text color={COLORS.textSecondary}> remove</Text>\n )}\n <Text color={COLORS.muted} dimColor> [{strategyLabel(a)}]</Text>\n </Box>\n ))}\n\n {plan.warnings.map((w) => (\n <Box key={w} marginTop={1}>\n <Text color={COLORS.warning}>⚠ {w}</Text>\n </Box>\n ))}\n\n <Box marginTop={1}>\n {plan.canExecute ? (\n <Text color={COLORS.textSecondary}>\n enter:{t('rollback_confirm', { count: String(executableCount) })} esc:{t('hint_back')}\n </Text>\n ) : (\n <Text color={COLORS.muted}>{t('rollback_strategy_unavailable')} esc:{t('hint_back')}</Text>\n )}\n </Box>\n </Box>\n );\n}\n\nexport function RollbackView() {\n const isPro = useLicenseStore((s) => s.isPro);\n const { snapshots, loading, error, plan, planLoading, planError, fetchSnapshots, selectSnapshot, clearPlan } = useRollbackStore();\n\n const [cursor, setCursor] = useState(0);\n const [phase, setPhase] = useState<Phase>('list');\n const [streamLines, setStreamLines] = useState<string[]>([]);\n const [streamRunning, setStreamRunning] = useState(false);\n const [streamError, setStreamError] = useState<string | null>(null);\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 void generatorRef.current?.return(undefined);\n };\n }, []);\n\n useEffect(() => { void fetchSnapshots(isPro()); }, []);\n\n const runRollback = useCallback(async (p: RollbackPlan) => {\n setPhase('executing');\n setStreamLines([]);\n setStreamError(null);\n setStreamRunning(true);\n\n const gen = executeRollbackPlan(p, isPro());\n generatorRef.current = gen;\n\n try {\n for await (const line of gen) {\n if (!mountedRef.current) break;\n setStreamLines((prev) => [...prev.slice(-99), line]);\n }\n } catch (err) {\n if (mountedRef.current) {\n setStreamError(err instanceof Error ? err.message : String(err));\n }\n } finally {\n generatorRef.current = null;\n if (mountedRef.current) {\n setStreamRunning(false);\n setPhase('result');\n }\n }\n }, [isPro]);\n\n useInput((input, key) => {\n if (phase === 'executing') return;\n\n if (phase === 'result') {\n if (key.escape || input === 'r') {\n setPhase('list');\n clearPlan();\n void fetchSnapshots(isPro());\n }\n return;\n }\n\n if (phase === 'confirm') return;\n\n if (phase === 'plan') {\n if (key.escape) { clearPlan(); setPhase('list'); return; }\n if (key.return && plan?.canExecute) { setPhase('confirm'); }\n return;\n }\n\n // phase === 'list'\n if (input === 'j' || key.downArrow) {\n setCursor((c) => Math.min(c + 1, Math.max(0, snapshots.length - 1)));\n } else if (input === 'k' || key.upArrow) {\n setCursor((c) => Math.max(c - 1, 0));\n } else if (key.return && snapshots[cursor]) {\n void selectSnapshot(snapshots[cursor]!, isPro());\n setPhase('plan');\n } else if (input === 'r') {\n void fetchSnapshots(isPro());\n }\n });\n\n if (loading) return <Loading message={t('rollback_select_snapshot')} />;\n if (error) return <ErrorMessage message={error} />;\n\n if (phase === 'executing') {\n return (\n <Box flexDirection=\"column\">\n <ProgressLog lines={streamLines} isRunning={streamRunning} title={t('rollback_executing')} />\n </Box>\n );\n }\n\n if (phase === 'result') {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <ResultBanner\n status={streamError ? 'error' : 'success'}\n message={streamError ? t('rollback_error', { error: streamError }) : t('rollback_success')}\n />\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>r:{t('hint_refresh')} esc:{t('hint_back')}</Text>\n </Box>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji=\"⏪\" title={t('rollback_title')} gradient={GRADIENTS.gold} />\n\n {snapshots.length === 0 && (\n <Box marginTop={1}>\n <ResultBanner status=\"info\" message={t('rollback_no_snapshots')} />\n </Box>\n )}\n\n {phase === 'list' && snapshots.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <Text color={COLORS.textSecondary} dimColor>{t('rollback_select_snapshot')}</Text>\n <Box flexDirection=\"column\" marginTop={1}>\n {snapshots.map((s, i) => (\n <SelectableRow key={s.capturedAt} isCurrent={i === cursor}>\n <Text bold={i === cursor} color={i === cursor ? COLORS.text : COLORS.muted}>\n {s.label ?? t('rollback_snapshot_auto')}\n </Text>\n <Text color={COLORS.textSecondary}>\n {' — '}{new Date(s.capturedAt).toLocaleString()}\n </Text>\n <Text color={COLORS.muted} dimColor>\n {' '}({tp('packages', s.formulae.length + s.casks.length)})\n </Text>\n </SelectableRow>\n ))}\n </Box>\n </Box>\n )}\n\n {phase === 'plan' && (\n <Box flexDirection=\"column\">\n {planLoading && <Loading message={t('rollback_capturing')} />}\n {planError && <ErrorMessage message={planError} />}\n {plan && !planLoading && <PlanView plan={plan} />}\n </Box>\n )}\n\n {phase === 'confirm' && plan && (\n <Box marginTop={1}>\n <ConfirmDialog\n message={t('rollback_confirm', {\n count: String(plan.actions.filter((a) => a.strategy !== 'unavailable' && a.action !== 'remove').length),\n })}\n onConfirm={() => void runRollback(plan)}\n onCancel={() => setPhase('plan')}\n />\n </Box>\n )}\n </Box>\n );\n}\n","import { create } from 'zustand';\nimport type { BrewSnapshot } from '../lib/state-snapshot/snapshot.js';\nimport { loadSnapshots, buildRollbackPlan } from '../lib/rollback/rollback-engine.js';\nimport type { RollbackPlan } from '../lib/rollback/types.js';\n\ninterface RollbackState {\n snapshots: BrewSnapshot[];\n loading: boolean;\n error: string | null;\n selectedSnapshot: BrewSnapshot | null;\n plan: RollbackPlan | null;\n planLoading: boolean;\n planError: string | null;\n\n fetchSnapshots: (isPro: boolean) => Promise<void>;\n selectSnapshot: (s: BrewSnapshot | null, isPro: boolean) => Promise<void>;\n clearPlan: () => void;\n}\n\nexport const useRollbackStore = create<RollbackState>((set) => ({\n snapshots: [],\n loading: false,\n error: null,\n selectedSnapshot: null,\n plan: null,\n planLoading: false,\n planError: null,\n\n fetchSnapshots: async (isPro) => {\n if (!isPro) return;\n set({ loading: true, error: null });\n try {\n const snapshots = await loadSnapshots();\n set({ snapshots, loading: false });\n } catch (err) {\n set({ error: err instanceof Error ? err.message : String(err), loading: false });\n }\n },\n\n selectSnapshot: async (snapshot, isPro) => {\n if (!snapshot) {\n set({ selectedSnapshot: null, plan: null, planError: null });\n return;\n }\n set({ selectedSnapshot: snapshot, plan: null, planLoading: true, planError: null });\n try {\n const plan = await buildRollbackPlan(snapshot, isPro);\n set({ plan, planLoading: false });\n } catch (err) {\n set({ planError: err instanceof Error ? err.message : String(err), planLoading: false });\n }\n },\n\n clearPlan: () => set({ selectedSnapshot: null, plan: null, planError: null }),\n}));\n","import { readdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { captureSnapshot, loadSnapshots, saveSnapshot } from '../state-snapshot/snapshot.js';\nimport type { BrewSnapshot } from '../state-snapshot/snapshot.js';\nimport { diffSnapshots } from '../diff-engine/diff.js';\nimport { execBrew, streamBrew } from '../brew-cli.js';\nimport { logger } from '../../utils/logger.js';\nimport type { RollbackAction, RollbackPlan, RollbackStrategy } from './types.js';\n\nasync function detectStrategy(\n name: string,\n targetVersion: string,\n packageType: 'formula' | 'cask',\n): Promise<{ strategy: RollbackStrategy; versionedFormula?: string }> {\n // Casks cannot be restored to a specific version\n if (packageType === 'cask') {\n return { strategy: 'pin-only' };\n }\n\n // Try versioned formula (e.g. node@20)\n try {\n const major = targetVersion.split('.')[0] ?? '';\n if (major !== '' && !isNaN(parseInt(major, 10))) {\n const versionedFormula = `${name}@${major}`;\n await execBrew(['info', '--json=v2', versionedFormula]);\n return { strategy: 'versioned-formula', versionedFormula };\n }\n } catch {\n // Not available — fall through\n }\n\n // Try bottle cache\n try {\n const brewCache = (await execBrew(['--cache'])).trim();\n const downloadsDir = join(brewCache, 'downloads');\n const entries = await readdir(downloadsDir);\n const found = entries.some(\n (entry) => entry.includes(name) && entry.includes(targetVersion),\n );\n if (found) {\n return { strategy: 'bottle-cache' };\n }\n } catch {\n // Cache not readable — fall through\n }\n\n return { strategy: 'pin-only' };\n}\n\nexport async function buildRollbackPlan(\n snapshot: BrewSnapshot,\n isPro: boolean,\n): Promise<RollbackPlan> {\n if (!isPro) throw new Error('Pro license required');\n\n const current = await captureSnapshot();\n const diff = diffSnapshots(snapshot, current);\n\n const actions: RollbackAction[] = [];\n const warnings: string[] = [];\n\n // Packages that were upgraded (current > snapshot) → need downgrade\n for (const entry of diff.upgraded) {\n const type = entry.type;\n const { strategy, versionedFormula } = await detectStrategy(entry.name, entry.from, type);\n actions.push({\n packageName: entry.name,\n packageType: type,\n action: 'downgrade',\n fromVersion: entry.to, // current version\n toVersion: entry.from, // snapshot (target) version\n strategy,\n versionedFormula,\n });\n }\n\n // Packages that were downgraded (current < snapshot) → need to restore up\n for (const entry of diff.downgraded) {\n const type = entry.type;\n const { strategy, versionedFormula } = await detectStrategy(entry.name, entry.from, type);\n actions.push({\n packageName: entry.name,\n packageType: type,\n action: 'downgrade',\n fromVersion: entry.to, // current version\n toVersion: entry.from, // snapshot (target) version\n strategy,\n versionedFormula,\n });\n }\n\n // Packages added since snapshot (in current, not in snapshot) → would need removal\n // Security: never auto-remove. Mark as unavailable with warning.\n for (const entry of diff.added) {\n if (entry.type === 'tap') continue;\n const type = entry.type;\n actions.push({\n packageName: entry.name,\n packageType: type,\n action: 'remove',\n fromVersion: entry.version,\n toVersion: '',\n strategy: 'unavailable',\n });\n }\n\n // Packages removed since snapshot (in snapshot, not in current) → need re-install\n for (const entry of diff.removed) {\n if (entry.type === 'tap') continue;\n const type = entry.type;\n const { strategy, versionedFormula } = await detectStrategy(entry.name, entry.version, type);\n actions.push({\n packageName: entry.name,\n packageType: type,\n action: 'install',\n fromVersion: '',\n toVersion: entry.version,\n strategy,\n versionedFormula,\n });\n }\n\n // Build warnings\n const caskPinCount = actions.filter(\n (a) => a.packageType === 'cask' && a.action !== 'remove' && a.strategy === 'pin-only',\n ).length;\n if (caskPinCount > 0) {\n warnings.push(`${caskPinCount} cask(s) will be pinned only (version restoration not supported)`);\n }\n\n const canExecute = actions.some((a) => a.strategy !== 'unavailable');\n\n const snapshotLabel = snapshot.label ?? 'Auto';\n const snapshotDate = new Date(snapshot.capturedAt).toLocaleString();\n\n logger.debug('Built rollback plan', { actionCount: actions.length, canExecute });\n\n return {\n snapshotLabel,\n snapshotDate,\n actions,\n warnings,\n canExecute,\n };\n}\n\nexport async function* executeRollbackPlan(\n plan: RollbackPlan,\n isPro: boolean,\n): AsyncGenerator<string> {\n if (!isPro) throw new Error('Pro license required');\n\n for (const action of plan.actions) {\n if (action.strategy === 'unavailable') {\n yield `[skip] ${action.packageName}: cannot restore automatically — manual action required`;\n continue;\n }\n\n if (action.action === 'remove') {\n yield `[skip] ${action.packageName}: removal skipped for safety — remove manually if needed`;\n continue;\n }\n\n if (action.action === 'install') {\n if (action.strategy === 'pin-only') {\n yield `[warn] ${action.packageName}: cannot install specific version — skipping`;\n continue;\n }\n if (action.strategy === 'versioned-formula' && action.versionedFormula) {\n yield `[install] ${action.packageName} via ${action.versionedFormula}`;\n for await (const line of streamBrew(['install', action.versionedFormula])) {\n yield line;\n }\n continue;\n }\n if (action.strategy === 'bottle-cache') {\n yield `[install] ${action.packageName} from bottle cache`;\n for await (const line of streamBrew(['install', '--force-bottle', action.packageName])) {\n yield line;\n }\n continue;\n }\n continue;\n }\n\n // action === 'downgrade'\n if (action.strategy === 'versioned-formula' && action.versionedFormula) {\n yield `[downgrade] ${action.packageName}: ${action.fromVersion} → ${action.toVersion} via ${action.versionedFormula}`;\n for await (const line of streamBrew(['install', action.versionedFormula])) {\n yield line;\n }\n } else if (action.strategy === 'bottle-cache') {\n yield `[downgrade] ${action.packageName}: ${action.fromVersion} → ${action.toVersion} from bottle cache`;\n for await (const line of streamBrew(['install', '--force-bottle', action.packageName])) {\n yield line;\n }\n } else if (action.strategy === 'pin-only') {\n yield `[pin] ${action.packageName}: pinning at current version (target version not restorable)`;\n await execBrew(['pin', action.packageName]);\n yield `✓ Pinned ${action.packageName}`;\n }\n }\n\n // Capture post-rollback snapshot\n yield '[snapshot] Capturing post-rollback snapshot...';\n try {\n const postSnapshot = await captureSnapshot();\n await saveSnapshot(postSnapshot, 'post-rollback');\n yield '[snapshot] Snapshot saved.';\n } catch (err) {\n logger.warn('Failed to save post-rollback snapshot', { err });\n yield '[snapshot] Warning: could not save snapshot.';\n }\n}\n\nexport { loadSnapshots };\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { TextInput } from '@inkjs/ui';\nimport { useBrewfileStore } from '../stores/brewfile-store.js';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { reconcile } from '../lib/brewfile/brewfile-manager.js';\nimport { Loading, ErrorMessage } from '../components/common/loading.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 { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nimport type { DriftReport } from '../lib/brewfile/types.js';\n\ntype Phase = 'overview' | 'creating' | 'reconciling' | 'result';\n\n// ── DriftScore ────────────────────────────────────────────────────────────────\n\nfunction DriftScore({ score }: { score: number }) {\n const color = score >= 80 ? COLORS.success : score >= 50 ? COLORS.warning : COLORS.error;\n const bars = Math.round(score / 10);\n const filled = '▓'.repeat(bars);\n const empty = '░'.repeat(10 - bars);\n return (\n <Box>\n <Text color={color}>{filled}{empty}</Text>\n <Text color={color} bold> {score}% </Text>\n <Text color={COLORS.textSecondary}>{t('brewfile_compliant')}</Text>\n </Box>\n );\n}\n\n// ── DriftSummary ──────────────────────────────────────────────────────────────\n\nfunction DriftSummary({ drift }: { drift: DriftReport }) {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n {drift.missingPackages.length > 0 && (\n <Box>\n <Text color={COLORS.error}>● </Text>\n <Text color={COLORS.error}>\n {t('brewfile_drift_missing', { count: drift.missingPackages.length })}\n </Text>\n <Text color={COLORS.textSecondary}>\n {': ' + drift.missingPackages.slice(0, 3).join(', ')}\n {drift.missingPackages.length > 3 ? '...' : ''}\n </Text>\n </Box>\n )}\n {drift.extraPackages.length > 0 && (\n <Box>\n <Text color={COLORS.warning}>● </Text>\n <Text color={COLORS.warning}>\n {t('brewfile_drift_extra', { count: drift.extraPackages.length })}\n </Text>\n </Box>\n )}\n {drift.wrongVersions.length > 0 && (\n <Box>\n <Text color={COLORS.info}>● </Text>\n <Text color={COLORS.info}>\n {t('brewfile_drift_wrong', { count: drift.wrongVersions.length })}\n </Text>\n </Box>\n )}\n {drift.missingPackages.length === 0 &&\n drift.extraPackages.length === 0 &&\n drift.wrongVersions.length === 0 && (\n <ResultBanner status=\"success\" message=\"✓ System is in sync with Brewfile\" />\n )}\n </Box>\n );\n}\n\n// ── Main View ─────────────────────────────────────────────────────────────────\n\nexport function BrewfileView() {\n const isPro = useLicenseStore((s) => s.isPro);\n const { schema, drift, loading, driftLoading, error, load, createFromCurrent } = useBrewfileStore();\n\n const [phase, setPhase] = useState<Phase>('overview');\n const [streamLines, setStreamLines] = useState<string[]>([]);\n const [streamRunning, setStreamRunning] = useState(false);\n const [streamError, setStreamError] = useState<string | null>(null);\n const [resultMessage, setResultMessage] = useState('');\n const generatorRef = useRef<AsyncGenerator<string> | null>(null);\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n void load();\n return () => {\n mountedRef.current = false;\n void generatorRef.current?.return(undefined);\n };\n }, []);\n\n const startReconcile = useCallback(async () => {\n if (!schema) return;\n setPhase('reconciling');\n setStreamLines([]);\n setStreamError(null);\n setStreamRunning(true);\n\n const gen = reconcile(schema, isPro());\n generatorRef.current = gen;\n\n try {\n for await (const line of gen) {\n if (!mountedRef.current) break;\n setStreamLines((prev) => [...prev.slice(-99), line]);\n }\n if (mountedRef.current) {\n setResultMessage(t('brewfile_reconcile_success'));\n }\n } catch (err) {\n if (mountedRef.current) {\n const msg = err instanceof Error ? err.message : String(err);\n setStreamError(msg);\n setResultMessage(t('brewfile_reconcile_error', { error: msg }));\n }\n } finally {\n generatorRef.current = null;\n if (mountedRef.current) {\n setStreamRunning(false);\n setPhase('result');\n }\n }\n }, [schema, isPro]);\n\n useInput((input, key) => {\n if (phase === 'reconciling') return;\n\n if (phase === 'result') {\n if (key.escape || input === 'r') {\n setPhase('overview');\n void load();\n }\n return;\n }\n\n if (phase === 'creating') return; // TextInput handles input\n\n // phase === 'overview'\n if (input === 'n') {\n setPhase('creating');\n return;\n }\n if (input === 'r') {\n void load();\n return;\n }\n if (input === 'c') {\n const needsReconcile =\n drift && (\n drift.missingPackages.length > 0 ||\n drift.wrongVersions.length > 0\n );\n if (needsReconcile) {\n void startReconcile();\n }\n return;\n }\n if (key.escape) {\n // back handled by global navigation\n }\n });\n\n if (loading) return <Loading message={t('loading_default')} />;\n if (error) return <ErrorMessage message={error} />;\n\n // ── Phase: creating ──\n if (phase === 'creating') {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <SectionHeader emoji=\"📦\" title={t('brewfile_title')} gradient={GRADIENTS.ocean} />\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>{t('brewfile_create_name')} </Text>\n <TextInput\n defaultValue=\"My Environment\"\n onSubmit={(value) => {\n const name = value.trim() || 'My Environment';\n setPhase('overview');\n void createFromCurrent(name).then(() => {\n // drift will auto-refresh via store\n });\n }}\n />\n </Box>\n </Box>\n );\n }\n\n // ── Phase: reconciling ──\n if (phase === 'reconciling') {\n return (\n <Box flexDirection=\"column\">\n <ProgressLog\n lines={streamLines}\n isRunning={streamRunning}\n title={t('brewfile_reconciling')}\n />\n </Box>\n );\n }\n\n // ── Phase: result ──\n if (phase === 'result') {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <ResultBanner\n status={streamError ? 'error' : 'success'}\n message={resultMessage}\n />\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>r:{t('hint_refresh')} esc:{t('hint_back')}</Text>\n </Box>\n </Box>\n );\n }\n\n // ── Phase: overview ──\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji=\"📦\" title={t('brewfile_title')} gradient={GRADIENTS.ocean} />\n\n {schema === null ? (\n <Box marginTop={1} flexDirection=\"column\">\n <ResultBanner status=\"info\" message={t('brewfile_no_brewfile')} />\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>n:{t('hint_new')}</Text>\n </Box>\n </Box>\n ) : (\n <Box flexDirection=\"column\" marginTop={1}>\n {/* Brewfile metadata */}\n <Box gap={2}>\n <Text color={COLORS.text} bold>{schema.meta.name}</Text>\n {schema.meta.description && (\n <Text color={COLORS.textSecondary}>{schema.meta.description}</Text>\n )}\n {schema.strictMode && (\n <Text color={COLORS.warning}>[{t('brewfile_strict_mode')}]</Text>\n )}\n </Box>\n\n {/* Package counts */}\n <Box gap={3} marginTop={1}>\n <Text color={COLORS.sky}>\n {t('brewfile_formulae_count', { count: schema.formulae.length })}\n </Text>\n <Text color={COLORS.teal}>\n {t('brewfile_casks_count', { count: schema.casks.length })}\n </Text>\n </Box>\n\n {/* Drift score */}\n {driftLoading && (\n <Box marginTop={1}>\n <Text color={COLORS.muted}>Computing drift...</Text>\n </Box>\n )}\n {drift && !driftLoading && (\n <Box flexDirection=\"column\" marginTop={1}>\n <DriftScore score={drift.score} />\n <DriftSummary drift={drift} />\n </Box>\n )}\n\n {/* Keyboard hints */}\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>\n r:{t('hint_refresh')}\n {drift && (drift.missingPackages.length > 0 || drift.wrongVersions.length > 0)\n ? ` c:${t('hint_reconcile')}`\n : ''}\n {' '}n:{t('hint_new')}\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import React, { useCallback, useEffect, useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { useSyncStore } from '../stores/sync-store.js';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { useNavigationStore } from '../stores/navigation-store.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { SelectableRow } from '../components/common/selectable-row.js';\nimport { Loading } from '../components/common/loading.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nimport type { SyncConflict } from '../lib/sync/types.js';\n\ntype Phase = 'overview' | 'syncing' | 'conflicts' | 'result';\n\ntype ConflictResolution = 'use-local' | 'use-remote' | 'pending';\n\ninterface ConflictEntry {\n conflict: SyncConflict;\n resolution: ConflictResolution;\n}\n\nfunction OverviewSection({\n config,\n lastResult,\n conflicts,\n onSyncNow: _onSyncNow,\n onGoToConflicts: _onGoToConflicts,\n}: {\n config: ReturnType<typeof useSyncStore.getState>['config'];\n lastResult: ReturnType<typeof useSyncStore.getState>['lastResult'];\n conflicts: SyncConflict[];\n onSyncNow: () => void;\n onGoToConflicts: () => void;\n}) {\n const hasConflicts = conflicts.length > 0;\n const showComplianceHint = !hasConflicts && !!lastResult?.success;\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n {config ? (\n <>\n <Box marginBottom={1}>\n <Text color={COLORS.textSecondary}>{t('sync_machine', { name: config.machineName })}</Text>\n </Box>\n {config.lastSync && (\n <Box marginBottom={1}>\n <Text color={COLORS.textSecondary}>\n {t('sync_last_sync', { date: new Date(config.lastSync).toLocaleString() })}\n </Text>\n </Box>\n )}\n {hasConflicts ? (\n <ResultBanner\n status=\"error\"\n message={t('sync_status_conflict', { count: String(conflicts.length) })}\n />\n ) : lastResult?.success ? (\n <ResultBanner status=\"success\" message={t('sync_status_ok')} />\n ) : null}\n </>\n ) : (\n <Box marginBottom={1}>\n <Text color={COLORS.textSecondary}>{t('sync_disabled')}</Text>\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>\n {'s'}<Text color={COLORS.gold}>:{t('hint_sync')}</Text>\n {hasConflicts && (\n <>\n {' c'}<Text color={COLORS.gold}>:{t('hint_conflict')}</Text>\n </>\n )}\n {showComplianceHint && (\n <>\n {' c'}<Text color={COLORS.gold}>:{t('hint_check_compliance')}</Text>\n </>\n )}\n </Text>\n </Box>\n </Box>\n );\n}\n\nfunction ConflictsList({\n entries,\n cursor,\n}: {\n entries: ConflictEntry[];\n cursor: number;\n}) {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n {entries.map((entry, i) => {\n const { conflict, resolution } = entry;\n const isActive = i === cursor;\n return (\n <Box key={`${conflict.packageName}-${conflict.remoteMachine}`} flexDirection=\"column\" marginBottom={1}>\n <SelectableRow isCurrent={isActive}>\n <Text bold color={isActive ? COLORS.text : COLORS.textSecondary}>\n {t('sync_conflict_title', { package: conflict.packageName })}\n </Text>\n <Text color={COLORS.muted}> ({conflict.packageType})</Text>\n </SelectableRow>\n <Box marginLeft={2} flexDirection=\"column\">\n <Text\n color={resolution === 'use-local' ? COLORS.success : COLORS.textSecondary}\n >\n {'l '}{t('sync_conflict_local', { version: conflict.localVersion })}\n {resolution === 'use-local' && ' ✓'}\n </Text>\n <Text\n color={resolution === 'use-remote' ? COLORS.success : COLORS.textSecondary}\n >\n {'r '}{t('sync_conflict_remote', { machine: conflict.remoteMachine, version: conflict.remoteVersion })}\n {resolution === 'use-remote' && ' ✓'}\n </Text>\n </Box>\n </Box>\n );\n })}\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>\n j/k:navegar l:{t('sync_conflict_use_local')} r:{t('sync_conflict_use_remote')} enter:aplicar\n </Text>\n </Box>\n </Box>\n );\n}\n\nexport function SyncView() {\n const isPro = useLicenseStore((s) => s.isPro);\n const navigate = useNavigationStore((s) => s.navigate);\n const { config, lastResult, conflicts, loading, error, initialize, syncNow, resolveConflicts } =\n useSyncStore();\n\n const [phase, setPhase] = useState<Phase>('overview');\n const [syncError, setSyncError] = useState<string | null>(null);\n const [conflictEntries, setConflictEntries] = useState<ConflictEntry[]>([]);\n const [cursor, setCursor] = useState(0);\n\n useEffect(() => {\n void initialize(isPro());\n }, []);\n\n // When store conflicts change, populate entries\n useEffect(() => {\n if (conflicts.length > 0) {\n setConflictEntries(\n conflicts.map((c) => ({ conflict: c, resolution: 'pending' as ConflictResolution })),\n );\n }\n }, [conflicts]);\n\n const handleSyncNow = useCallback(async () => {\n setPhase('syncing');\n setSyncError(null);\n await syncNow(isPro());\n // After sync, check for conflicts or success\n const state = useSyncStore.getState();\n if (state.conflicts.length > 0) {\n setPhase('conflicts');\n } else if (state.error) {\n setSyncError(state.error);\n setPhase('result');\n } else {\n setPhase('result');\n }\n }, [isPro, syncNow]);\n\n const handleApplyResolutions = useCallback(async () => {\n const pending = conflictEntries.filter((e) => e.resolution === 'pending');\n if (pending.length > 0) return; // All must be resolved before applying\n\n const resolutions = conflictEntries.map((e) => ({\n conflict: e.conflict,\n resolution: e.resolution as 'use-local' | 'use-remote',\n }));\n\n await resolveConflicts(resolutions);\n setPhase('result');\n }, [conflictEntries, resolveConflicts]);\n\n useInput((input, key) => {\n if (phase === 'syncing') return;\n\n if (phase === 'result') {\n if (key.escape || input === 'r') {\n setPhase('overview');\n setSyncError(null);\n void initialize(isPro());\n }\n return;\n }\n\n if (phase === 'conflicts') {\n if (key.escape) { setPhase('overview'); return; }\n\n if (input === 'j' || key.downArrow) {\n setCursor((c) => Math.min(c + 1, conflictEntries.length - 1));\n return;\n }\n if (input === 'k' || key.upArrow) {\n setCursor((c) => Math.max(c - 1, 0));\n return;\n }\n\n if (input === 'l') {\n setConflictEntries((prev) =>\n prev.map((e, i) => (i === cursor ? { ...e, resolution: 'use-local' } : e)),\n );\n return;\n }\n if (input === 'r') {\n setConflictEntries((prev) =>\n prev.map((e, i) => (i === cursor ? { ...e, resolution: 'use-remote' } : e)),\n );\n return;\n }\n\n if (key.return) {\n void handleApplyResolutions();\n return;\n }\n }\n\n // phase === 'overview'\n if (input === 's') {\n void handleSyncNow();\n return;\n }\n if (input === 'c' && conflicts.length > 0) {\n setCursor(0);\n setPhase('conflicts');\n return;\n }\n if (input === 'c' && lastResult?.success) {\n navigate('compliance');\n return;\n }\n if (input === 'r') {\n void initialize(isPro());\n return;\n }\n });\n\n if (phase === 'syncing' || loading) {\n return <Loading message={t('sync_syncing')} />;\n }\n\n if (phase === 'result') {\n const isError = !!(syncError ?? error);\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <SectionHeader emoji=\"🔄\" title={t('sync_title')} gradient={GRADIENTS.gold} />\n <Box marginTop={1}>\n <ResultBanner\n status={isError ? 'error' : 'success'}\n message={\n isError\n ? t('sync_error', { error: syncError ?? error ?? '' })\n : t('sync_success')\n }\n />\n </Box>\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>r:{t('hint_refresh')} esc:{t('hint_back')}</Text>\n </Box>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji=\"🔄\" title={t('sync_title')} gradient={GRADIENTS.gold} />\n\n {error && phase === 'overview' && (\n <Box marginTop={1}>\n <ResultBanner status=\"error\" message={t('sync_error', { error })} />\n </Box>\n )}\n\n {phase === 'overview' && (\n <OverviewSection\n config={config}\n lastResult={lastResult}\n conflicts={conflicts}\n onSyncNow={() => void handleSyncNow()}\n onGoToConflicts={() => { setCursor(0); setPhase('conflicts'); }}\n />\n )}\n\n {phase === 'conflicts' && (\n <Box flexDirection=\"column\">\n <SectionHeader emoji=\"⚠\" title={t('sync_status_conflict', { count: String(conflictEntries.length) })} gradient={GRADIENTS.gold} />\n <ConflictsList entries={conflictEntries} cursor={cursor} />\n </Box>\n )}\n </Box>\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { TextInput } from '@inkjs/ui';\nimport { useComplianceStore } from '../stores/compliance-store.js';\nimport { useLicenseStore } from '../stores/license-store.js';\nimport { remediateViolations } from '../lib/compliance/compliance-remediator.js';\nimport { exportReport } from '../lib/compliance/policy-io.js';\nimport { ResultBanner } from '../components/common/result-banner.js';\nimport { SectionHeader } from '../components/common/section-header.js';\nimport { ProgressLog } from '../components/common/progress-log.js';\nimport { Loading } from '../components/common/loading.js';\nimport { COLORS } from '../utils/colors.js';\nimport { GRADIENTS } from '../utils/gradient.js';\nimport { t } from '../i18n/index.js';\nimport { DATA_DIR } from '../lib/data-dir.js';\nimport { join } from 'node:path';\nimport type { ComplianceReport, ComplianceViolation } from '../lib/compliance/types.js';\n\ntype Phase = 'overview' | 'importing' | 'remediating' | 'result';\n\nfunction ComplianceScore({ report }: { report: ComplianceReport }) {\n const color =\n report.score >= 80 ? COLORS.success : report.score >= 50 ? COLORS.warning : COLORS.error;\n const bars = Math.round(report.score / 10);\n\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Text color={color}>{'▓'.repeat(bars)}{'░'.repeat(10 - bars)}</Text>\n <Text color={color} bold> {report.score}%</Text>\n <Text color={COLORS.textSecondary}> {t('compliance_score', { score: String(report.score) })}</Text>\n </Box>\n <Text color={COLORS.muted} dimColor>\n {t('compliance_policy_name', { name: report.policyName })} · {t('compliance_machine', { name: report.machineName })}\n </Text>\n </Box>\n );\n}\n\nfunction ViolationItem({ violation }: { violation: ComplianceViolation }) {\n const color = violation.severity === 'error' ? COLORS.error : COLORS.warning;\n const prefix = violation.severity === 'error' ? '✗' : '⚠';\n\n return (\n <Box marginBottom={0}>\n <Text color={color}>{prefix} </Text>\n <Text color={color}>{violation.detail}</Text>\n </Box>\n );\n}\n\nfunction ViolationList({ violations }: { violations: ComplianceViolation[] }) {\n const errors = violations.filter((v) => v.severity === 'error');\n const warnings = violations.filter((v) => v.severity === 'warning');\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n {errors.length > 0 && (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color={COLORS.error} bold>{t('compliance_violations', { count: String(errors.length) })} (errors)</Text>\n {errors.map((v) => (\n <ViolationItem key={`${v.type}-${v.packageName}`} violation={v} />\n ))}\n </Box>\n )}\n {warnings.length > 0 && (\n <Box flexDirection=\"column\">\n <Text color={COLORS.warning} bold>{t('compliance_violations', { count: String(warnings.length) })} (warnings)</Text>\n {warnings.map((v) => (\n <ViolationItem key={`${v.type}-${v.packageName}`} violation={v} />\n ))}\n </Box>\n )}\n </Box>\n );\n}\n\nexport function ComplianceView() {\n const isPro = useLicenseStore((s) => s.isPro);\n const { policy, report, loading, error, importPolicy, runCheck } =\n useComplianceStore();\n\n const [phase, setPhase] = useState<Phase>('overview');\n const [resultMessage, setResultMessage] = useState<{ ok: boolean; text: string } | null>(null);\n const [streamLines, setStreamLines] = useState<string[]>([]);\n const [streamRunning, setStreamRunning] = useState(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 void generatorRef.current?.return(undefined);\n };\n }, []);\n\n const handleImportSubmit = useCallback(\n async (filePath: string) => {\n if (!filePath.trim()) { setPhase('overview'); return; }\n await importPolicy(filePath.trim(), isPro());\n // importPolicy actualiza el store; runCheck si no hubo error\n const state = useComplianceStore.getState();\n if (!state.error && state.policy) {\n await runCheck(isPro());\n }\n setPhase('overview');\n },\n [isPro, importPolicy, runCheck],\n );\n\n const handleRecheck = useCallback(() => {\n void runCheck(isPro());\n }, [isPro, runCheck]);\n\n const handleExport = useCallback(async () => {\n if (!report) return;\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const outputPath = join(DATA_DIR, `compliance-report-${timestamp}.json`);\n try {\n await exportReport(report, outputPath);\n setResultMessage({ ok: true, text: t('compliance_export_done', { path: outputPath }) });\n setPhase('result');\n } catch (err) {\n setResultMessage({\n ok: false,\n text: t('compliance_remediate_error', { error: err instanceof Error ? err.message : String(err) }),\n });\n setPhase('result');\n }\n }, [report]);\n\n const handleRemediate = useCallback(async () => {\n if (!report) return;\n const actionable = report.violations.filter(\n (v) => v.type === 'missing' || v.type === 'wrong-version',\n );\n if (actionable.length === 0) return;\n\n setPhase('remediating');\n setStreamLines([]);\n setStreamRunning(true);\n\n const gen = remediateViolations(actionable, isPro());\n generatorRef.current = gen;\n\n try {\n for await (const line of gen) {\n if (!mountedRef.current) break;\n setStreamLines((prev) => [...prev.slice(-99), line]);\n }\n if (mountedRef.current) {\n setResultMessage({ ok: true, text: t('compliance_remediate_success') });\n // Re-check after remediation\n await runCheck(isPro());\n }\n } catch (err) {\n if (mountedRef.current) {\n setResultMessage({\n ok: false,\n text: t('compliance_remediate_error', { error: err instanceof Error ? err.message : String(err) }),\n });\n }\n } finally {\n generatorRef.current = null;\n if (mountedRef.current) {\n setStreamRunning(false);\n setPhase('result');\n }\n }\n }, [report, isPro, runCheck]);\n\n useInput((input, key) => {\n if (phase === 'remediating' || phase === 'importing') return;\n\n if (phase === 'result') {\n if (key.escape || input === 'r') {\n setPhase('overview');\n setResultMessage(null);\n }\n return;\n }\n\n // phase === 'overview'\n if (input === 'i') {\n setPhase('importing');\n return;\n }\n if (input === 'r' && policy) {\n handleRecheck();\n return;\n }\n if (input === 'e' && report) {\n void handleExport();\n return;\n }\n if (input === 'c' && report) {\n const actionable = report.violations.filter(\n (v) => v.type === 'missing' || v.type === 'wrong-version',\n );\n if (actionable.length > 0) {\n void handleRemediate();\n }\n return;\n }\n });\n\n if (phase === 'remediating' || (loading && phase !== 'importing')) {\n if (phase === 'remediating') {\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji=\"🔍\" title={t('compliance_title')} gradient={GRADIENTS.gold} />\n <Box marginTop={1}>\n <ProgressLog lines={streamLines} isRunning={streamRunning} title={t('compliance_remediating')} />\n </Box>\n </Box>\n );\n }\n return <Loading message={t('compliance_title')} />;\n }\n\n if (phase === 'result' && resultMessage) {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <SectionHeader emoji=\"🔍\" title={t('compliance_title')} gradient={GRADIENTS.gold} />\n <Box marginTop={1}>\n <ResultBanner\n status={resultMessage.ok ? 'success' : 'error'}\n message={resultMessage.text}\n />\n </Box>\n <Box marginTop={1}>\n <Text color={COLORS.textSecondary}>r:{t('hint_refresh')} esc:{t('hint_back')}</Text>\n </Box>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <SectionHeader emoji=\"🔍\" title={t('compliance_title')} gradient={GRADIENTS.gold} />\n\n {error && (\n <Box marginTop={1}>\n <ResultBanner status=\"error\" message={t('compliance_import_error', { error })} />\n </Box>\n )}\n\n {phase === 'importing' && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color={COLORS.textSecondary}>{t('compliance_import_prompt')}</Text>\n <Box marginTop={1}>\n <TextInput\n defaultValue=\"\"\n onSubmit={(val) => { void handleImportSubmit(val); }}\n />\n </Box>\n <Box marginTop={1}>\n <Text color={COLORS.muted} dimColor>esc:{t('hint_back')}</Text>\n </Box>\n </Box>\n )}\n\n {phase === 'overview' && (\n <Box flexDirection=\"column\" marginTop={1}>\n {!policy ? (\n <Box flexDirection=\"column\">\n <Text color={COLORS.textSecondary}>{t('compliance_no_policy')}</Text>\n </Box>\n ) : (\n <Box flexDirection=\"column\">\n <Text color={COLORS.textSecondary} bold>\n {t('compliance_policy_by', { maintainer: policy.meta.maintainer })}\n </Text>\n\n {report ? (\n <Box flexDirection=\"column\" marginTop={1}>\n <ComplianceScore report={report} />\n {report.compliant ? (\n <ResultBanner status=\"success\" message={t('compliance_ok')} />\n ) : (\n <ViolationList violations={report.violations} />\n )}\n </Box>\n ) : (\n <Box marginTop={1}>\n <Text color={COLORS.muted} dimColor>Press r to run compliance check.</Text>\n </Box>\n )}\n </Box>\n )}\n\n <Box marginTop={2} flexWrap=\"wrap\">\n <Text color={COLORS.textSecondary}>\n i:{t('hint_import')}\n {policy && <Text> r:{t('hint_scan')}</Text>}\n {report && <Text> e:{t('hint_export')}</Text>}\n {report && report.violations.some((v) => v.type === 'missing' || v.type === 'wrong-version') && (\n <Text> c:{t('hint_clean')}</Text>\n )}\n {' q:'}{t('hint_quit')}\n </Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","import { streamBrew } from '../brew-cli.js';\nimport type { ComplianceViolation } from './types.js';\n\nexport async function* remediateViolations(\n violations: ComplianceViolation[],\n isPro: boolean,\n): AsyncGenerator<string> {\n if (!isPro) throw new Error('Pro license required');\n\n let installed = 0;\n let upgraded = 0;\n let skipped = 0;\n\n for (const v of violations) {\n if (v.type === 'missing') {\n yield `Installing ${v.packageName}...`;\n try {\n for await (const line of streamBrew(['install', v.packageName])) {\n yield line;\n }\n installed++;\n } catch (err) {\n yield ` ✗ Failed to install ${v.packageName}: ${err instanceof Error ? err.message : String(err)}`;\n skipped++;\n }\n } else if (v.type === 'wrong-version') {\n yield `Upgrading ${v.packageName}${v.required ? ` to ${v.required}+` : ''}...`;\n try {\n for await (const line of streamBrew(['upgrade', v.packageName])) {\n yield line;\n }\n upgraded++;\n } catch (err) {\n yield ` ✗ Failed to upgrade ${v.packageName}: ${err instanceof Error ? err.message : String(err)}`;\n skipped++;\n }\n } else if (v.type === 'forbidden') {\n yield ` ⚠ Forbidden package detected: ${v.packageName} — manual removal required`;\n skipped++;\n } else if (v.type === 'extra') {\n yield ` ⚠ Extra package in strict mode: ${v.packageName} — manual removal required`;\n skipped++;\n }\n }\n\n yield `Remediation complete: ${installed} installed, ${upgraded} upgraded, ${skipped} skipped (manual action required)`;\n}\n"],"mappings":"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","names":["rm","useEffect","Box","Text","t","GradientText","jsx","Text","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","useStdout","create","create","create","create","create","create","create","create","create","create","Box","Text","useStdout","jsx","jsxs","useStdout","Box","Text","Box","Text","jsx","jsxs","Box","Text","Text","jsxs","Text","Box","Text","jsx","jsxs","Box","Text","Text","Fragment","jsx","jsxs","Text","jsx","jsxs","Box","Text","useStdout","useMemo","useState","useMemo","useEffect","Box","Text","useInput","useStdout","useEffect","useState","useEffect","appendEntry","useState","setError","useEffect","captureSnapshot","saveSnapshot","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","Box","Text","useState","useRef","useEffect","useInput","useStdout","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","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","useCallback","useEffect","useRef","useState","Box","Text","useInput","create","readdir","join","join","readdir","create","jsx","jsxs","Box","Text","useState","useRef","useEffect","useCallback","useInput","useCallback","useEffect","useRef","useState","Box","Text","useInput","TextInput","jsx","jsxs","Box","Text","useState","useRef","useEffect","useCallback","useInput","TextInput","useCallback","useEffect","useState","Box","Text","useInput","Fragment","jsx","jsxs","Box","Text","useState","useEffect","useCallback","useInput","useCallback","useEffect","useRef","useState","Box","Text","useInput","TextInput","join","jsx","jsxs","Box","Text","useState","useRef","useEffect","useCallback","useInput","TextInput","jsx","jsxs","useEffect","jsx","loadSnapshots","loadBrewfile","computeDrift","loadSyncConfig","loadPolicy","checkCompliance","rm"]}