agenttop 0.7.0 → 0.7.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.
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.tsx","../src/ui/App.tsx","../src/config/themes.ts","../src/hooks/installer.ts","../src/install-mcp.ts","../src/updates.ts","../src/ui/components/StatusBar.tsx","../src/ui/theme.ts","../src/ui/components/SessionList.tsx","../src/ui/components/ActivityFeed.tsx","../src/ui/components/AlertBar.tsx","../src/ui/components/SessionDetail.tsx","../src/ui/components/SetupModal.tsx","../src/ui/components/FooterBar.tsx","../src/ui/components/SettingsMenu.tsx","../src/ui/components/ThemeMenu.tsx","../src/ui/components/ThemeEditor.tsx","../src/ui/components/ThemePickerModal.tsx","../src/ui/components/GuidedTour.tsx","../src/ui/components/ConfirmModal.tsx","../src/ui/components/SplitPanel.tsx","../src/ui/hooks/useSessions.ts","../src/ui/hooks/useActivityStream.ts","../src/ui/hooks/useFilteredEvents.ts","../src/ui/hooks/useAlerts.ts","../src/notifications.ts","../src/alerts/logger.ts","../src/ui/hooks/useTextInput.ts","../src/ui/hooks/useKeyHandler.ts","../src/ui/hooks/useUpdateChecker.ts","../src/stream.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport React from 'react';\nimport { render } from 'ink';\n\nimport type { AlertSeverity, CLIOptions } from './discovery/types.js';\nimport { App } from './ui/App.js';\nimport { installHooks, uninstallHooks } from './hooks/installer.js';\nimport { loadConfig, saveConfig, isFirstRun } from './config/store.js';\nimport { startMcpServer } from './mcp/server.js';\nimport { runStreamMode } from './stream.js';\nimport { installMcpConfig } from './install-mcp.js';\n\nconst getVersion = (): string => {\n try {\n const thisFile = fileURLToPath(import.meta.url);\n const pkgPath = join(dirname(thisFile), '..', 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n return pkg.version || '0.0.0';\n } catch {\n return '0.0.0';\n }\n};\n\nconst VERSION = getVersion();\n\nconst HELP = `agenttop v${VERSION} -- Real-time dashboard for AI coding agent sessions\n\nUsage: agenttop [options]\n\nOptions:\n --all-users Monitor all users (root only)\n --no-security Disable security analysis\n --json Stream events as JSON lines (no TUI)\n --plain Stream events as plain text (no TUI)\n --alert-level <l> Minimum: info|warn|high|critical (default: warn)\n --no-notify Disable all notifications\n --no-alert-log Disable alert file logging\n --no-updates Disable update checks\n --poll-interval <ms> Session discovery interval (default: 10000)\n --mcp Start as MCP server (for Claude Code integration)\n --install-mcp Register agenttop as MCP server in Claude Code\n --install-hooks Install Claude Code PostToolUse hook for active protection\n --uninstall-hooks Remove agenttop hooks from Claude Code\n --version Show version\n --help Show this help\n\nStreaming modes (--json / --plain):\n Stream session events to stdout for piping into other tools.\n --json outputs one JSON object per line (JSONL format).\n --plain outputs human-readable lines.\n\n Examples:\n agenttop --json | jq 'select(.type == \"alert\")'\n agenttop --plain | grep ALERT\n agenttop --json --no-security # stream tool calls only\n`;\n\nconst write = (msg: string): void => {\n process.stdout.write(msg + '\\n');\n};\n\nconst parseArgs = (argv: string[]): CLIOptions => {\n const args = argv.slice(2);\n const options: CLIOptions = {\n allUsers: false,\n noSecurity: false,\n json: false,\n plain: false,\n alertLevel: 'warn',\n installHooks: false,\n uninstallHooks: false,\n help: false,\n version: false,\n noNotify: false,\n noAlertLog: false,\n noUpdates: false,\n pollInterval: 10000,\n mcp: false,\n installMcp: false,\n };\n\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case '--all-users':\n options.allUsers = true;\n break;\n case '--no-security':\n options.noSecurity = true;\n break;\n case '--json':\n options.json = true;\n break;\n case '--plain':\n options.plain = true;\n break;\n case '--alert-level':\n i++;\n if (['info', 'warn', 'high', 'critical'].includes(args[i])) {\n options.alertLevel = args[i] as AlertSeverity;\n }\n break;\n case '--no-notify':\n options.noNotify = true;\n break;\n case '--no-alert-log':\n options.noAlertLog = true;\n break;\n case '--no-updates':\n options.noUpdates = true;\n break;\n case '--poll-interval':\n i++;\n {\n const n = parseInt(args[i], 10);\n if (n > 0) options.pollInterval = n;\n }\n break;\n case '--mcp':\n options.mcp = true;\n break;\n case '--install-mcp':\n options.installMcp = true;\n break;\n case '--install-hooks':\n options.installHooks = true;\n break;\n case '--uninstall-hooks':\n options.uninstallHooks = true;\n break;\n case '--version':\n options.version = true;\n break;\n case '--help':\n options.help = true;\n break;\n }\n }\n\n return options;\n};\n\nconst main = () => {\n const options = parseArgs(process.argv);\n\n if (options.version) {\n write(`agenttop v${VERSION}`);\n process.exit(0);\n }\n if (options.help) {\n write(HELP);\n process.exit(0);\n }\n if (options.installHooks) {\n installHooks();\n process.exit(0);\n }\n if (options.uninstallHooks) {\n uninstallHooks();\n process.exit(0);\n }\n if (options.installMcp) {\n installMcpConfig();\n process.exit(0);\n }\n\n if (options.mcp) {\n startMcpServer(options.allUsers, options.noSecurity).catch((err) => {\n process.stderr.write(`mcp server error: ${err}\\n`);\n process.exit(1);\n });\n return;\n }\n\n if (options.json || options.plain) {\n runStreamMode(options, options.json);\n return;\n }\n\n const config = loadConfig();\n const firstRun = isFirstRun();\n\n if (options.noNotify) {\n config.notifications.bell = false;\n config.notifications.desktop = false;\n }\n if (options.noAlertLog) config.alerts.enabled = false;\n if (options.noUpdates) config.updates.checkOnLaunch = false;\n if (options.noSecurity) config.security.enabled = false;\n\n if (firstRun) saveConfig(config);\n\n render(React.createElement(App, { options, config, version: VERSION, firstRun }));\n};\n\nmain();\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { Box, Text, useApp, useStdout } from 'ink';\n\nimport type { CLIOptions, Session } from '../discovery/types.js';\nimport type { Config } from '../config/store.js';\nimport {\n setNickname,\n clearNickname,\n saveConfig,\n archiveSession,\n unarchiveSession,\n getArchived,\n purgeExpiredArchives,\n deleteSessionFiles,\n} from '../config/store.js';\nimport { resolveTheme } from '../config/themes.js';\nimport { installHooks } from '../hooks/installer.js';\nimport { installMcpConfig } from '../install-mcp.js';\nimport { installUpdate } from '../updates.js';\nimport { StatusBar } from './components/StatusBar.js';\nimport { SessionList } from './components/SessionList.js';\nimport { ActivityFeed } from './components/ActivityFeed.js';\nimport { AlertBar } from './components/AlertBar.js';\nimport { SessionDetail } from './components/SessionDetail.js';\nimport { SetupModal } from './components/SetupModal.js';\nimport { FooterBar } from './components/FooterBar.js';\nimport { SettingsMenu } from './components/SettingsMenu.js';\nimport { ThemeMenu } from './components/ThemeMenu.js';\nimport { ThemePickerModal } from './components/ThemePickerModal.js';\nimport { GuidedTour } from './components/GuidedTour.js';\nimport { ConfirmModal } from './components/ConfirmModal.js';\nimport { SplitPanel } from './components/SplitPanel.js';\nimport { useSessions } from './hooks/useSessions.js';\nimport { useActivityStream } from './hooks/useActivityStream.js';\nimport { useFilteredEvents } from './hooks/useFilteredEvents.js';\nimport { useAlerts } from './hooks/useAlerts.js';\nimport { useTextInput } from './hooks/useTextInput.js';\nimport { useKeyHandler } from './hooks/useKeyHandler.js';\nimport { useUpdateChecker } from './hooks/useUpdateChecker.js';\nimport { colors, applyTheme } from './theme.js';\n\nexport type Panel = 'sessions' | 'activity' | 'left' | 'right';\n\ninterface AppProps {\n options: CLIOptions;\n config: Config;\n version: string;\n firstRun: boolean;\n}\n\nexport const App: React.FC<AppProps> = ({ options, config: initialConfig, version, firstRun }) => {\n const { exit } = useApp();\n const { stdout } = useStdout();\n const termHeight = stdout?.rows ?? 40;\n const [liveConfig, setLiveConfig] = useState(initialConfig);\n const kb = liveConfig.keybindings;\n\n const [activePanel, setActivePanel] = useState<Panel>('sessions');\n const [activityScroll, setActivityScroll] = useState(0);\n const [inputMode, setInputMode] = useState<'normal' | 'nickname' | 'filter'>('normal');\n const [showSetup, setShowSetup] = useState(firstRun);\n const [showThemePicker, setShowThemePicker] = useState(false);\n const [showTour, setShowTour] = useState(false);\n const [filter, setFilter] = useState('');\n const [activityFilter, setActivityFilter] = useState('');\n const [updateStatus, setUpdateStatus] = useState('');\n const [showDetail, setShowDetail] = useState(false);\n const [showSettings, setShowSettings] = useState(false);\n const [showThemeMenu, setShowThemeMenu] = useState(false);\n const [viewingArchive, setViewingArchive] = useState(false);\n const [confirmAction, setConfirmAction] = useState<{ title: string; message: string; onConfirm: () => void } | null>(\n null,\n );\n const [archivedIds, setArchivedIds] = useState<Set<string>>(() => new Set(Object.keys(getArchived())));\n\n const [splitMode, setSplitMode] = useState(false);\n const [leftSession, setLeftSession] = useState<Session | null>(null);\n const [rightSession, setRightSession] = useState<Session | null>(null);\n const [leftScroll, setLeftScroll] = useState(0);\n const [rightScroll, setRightScroll] = useState(0);\n const [leftFilter, setLeftFilter] = useState('');\n const [rightFilter, setRightFilter] = useState('');\n const [leftShowDetail, setLeftShowDetail] = useState(false);\n const [rightShowDetail, setRightShowDetail] = useState(false);\n\n const refreshArchived = useCallback(() => setArchivedIds(new Set(Object.keys(getArchived()))), []);\n const updateInfo = useUpdateChecker(\n options.noUpdates,\n liveConfig.updates.checkOnLaunch,\n liveConfig.updates.checkInterval,\n );\n\n useEffect(() => {\n applyTheme(resolveTheme(liveConfig.theme, liveConfig.customThemes));\n }, [liveConfig.theme, liveConfig.customThemes]);\n\n const { sessions, selectedSession, selectedIndex, selectNext, selectPrev, refresh } = useSessions(\n options.allUsers,\n filter || undefined,\n archivedIds,\n viewingArchive,\n );\n\n const rawEvents = useActivityStream(splitMode ? null : selectedSession, options.allUsers);\n const leftRawEvents = useActivityStream(splitMode ? leftSession : null, options.allUsers);\n const rightRawEvents = useActivityStream(splitMode ? rightSession : null, options.allUsers);\n const events = useFilteredEvents(rawEvents, activityFilter);\n const leftEvents = useFilteredEvents(leftRawEvents, leftFilter);\n const rightEvents = useFilteredEvents(rightRawEvents, rightFilter);\n const { alerts } = useAlerts(!options.noSecurity, options.alertLevel, options.allUsers, liveConfig);\n\n const nicknameInput = useTextInput(\n (value) => {\n if (selectedSession && value.trim()) {\n setNickname(selectedSession.sessionId, value.trim());\n refresh();\n }\n setInputMode('normal');\n },\n () => setInputMode('normal'),\n );\n const filterInput = useTextInput(\n (value) => {\n if (activePanel === 'sessions') setFilter(value);\n else if (activePanel === 'left') setLeftFilter(value);\n else if (activePanel === 'right') setRightFilter(value);\n else setActivityFilter(value);\n setInputMode('normal');\n },\n () => {\n if (activePanel === 'sessions') setFilter('');\n else if (activePanel === 'left') setLeftFilter('');\n else if (activePanel === 'right') setRightFilter('');\n else setActivityFilter('');\n setInputMode('normal');\n },\n );\n\n useEffect(() => {\n purgeExpiredArchives();\n refreshArchived();\n }, []);\n useEffect(() => {\n setActivityScroll(0);\n }, [selectedSession?.sessionId]);\n\n const alertHeight = options.noSecurity ? 0 : 6;\n const mainHeight = termHeight - 3 - alertHeight - 1 - (inputMode !== 'normal' ? 1 : 0);\n const viewportRows = mainHeight - 2;\n\n const handleSettingsClose = useCallback((c: Config) => {\n setLiveConfig(c);\n saveConfig(c);\n setShowSettings(false);\n }, []);\n const handleThemeMenuClose = useCallback((c: Config) => {\n setLiveConfig(c);\n saveConfig(c);\n setShowThemeMenu(false);\n setShowSettings(true);\n }, []);\n const handleOpenThemeMenu = useCallback(() => setShowThemeMenu(true), []);\n\n const handleSetupComplete = useCallback(\n (results: Array<'yes' | 'not_now' | 'dismiss'>) => {\n const nc = { ...liveConfig };\n const [hc, mc] = results;\n if (hc === 'yes') {\n try {\n installHooks();\n } catch {\n /**/\n }\n nc.prompts.hook = 'installed';\n } else if (hc === 'dismiss') nc.prompts.hook = 'dismissed';\n if (mc === 'yes') {\n try {\n installMcpConfig();\n } catch {\n /**/\n }\n nc.prompts.mcp = 'installed';\n } else if (mc === 'dismiss') nc.prompts.mcp = 'dismissed';\n saveConfig(nc);\n setShowSetup(false);\n if (nc.prompts.theme === 'pending') setShowThemePicker(true);\n else if (nc.prompts.tour === 'pending') setShowTour(true);\n },\n [liveConfig],\n );\n\n const handleThemePickerSelect = useCallback(\n (themeName: string) => {\n const nc = { ...liveConfig, theme: themeName, prompts: { ...liveConfig.prompts, theme: 'done' as const } };\n setLiveConfig(nc);\n saveConfig(nc);\n setShowThemePicker(false);\n if (nc.prompts.tour === 'pending') setShowTour(true);\n },\n [liveConfig],\n );\n const handleThemePickerSkip = useCallback(() => {\n setShowThemePicker(false);\n if (liveConfig.prompts.tour === 'pending') setShowTour(true);\n }, [liveConfig]);\n const handleThemePickerDismiss = useCallback(() => {\n const nc = { ...liveConfig, prompts: { ...liveConfig.prompts, theme: 'dismissed' as const } };\n setLiveConfig(nc);\n saveConfig(nc);\n setShowThemePicker(false);\n if (nc.prompts.tour === 'pending') setShowTour(true);\n }, [liveConfig]);\n\n const handleTourComplete = useCallback(() => {\n const nc = { ...liveConfig, prompts: { ...liveConfig.prompts, tour: 'done' as const } };\n setLiveConfig(nc);\n saveConfig(nc);\n setShowTour(false);\n }, [liveConfig]);\n const handleTourSkip = useCallback(() => {\n setShowTour(false);\n }, []);\n\n const switchPanel = useCallback(\n (dir: 'next' | 'prev') => {\n if (splitMode) {\n const order: Panel[] = ['sessions', 'left', 'right'];\n setActivePanel((p) => {\n const idx = order.indexOf(p);\n if (idx === -1) return 'sessions';\n return dir === 'next' ? order[(idx + 1) % order.length] : order[(idx - 1 + order.length) % order.length];\n });\n } else {\n setActivePanel((p) => (p === 'sessions' ? 'activity' : 'sessions'));\n }\n },\n [splitMode],\n );\n\n const getActiveFilter = useCallback(() => {\n if (activePanel === 'sessions') return filter;\n if (activePanel === 'left') return leftFilter;\n if (activePanel === 'right') return rightFilter;\n return activityFilter;\n }, [activePanel, filter, leftFilter, rightFilter, activityFilter]);\n\n const clearSplitState = useCallback(() => {\n setSplitMode(false);\n setLeftSession(null);\n setRightSession(null);\n setLeftScroll(0);\n setRightScroll(0);\n setLeftFilter('');\n setRightFilter('');\n setLeftShowDetail(false);\n setRightShowDetail(false);\n setActivePanel('sessions');\n }, []);\n\n const resetPanel = useCallback((side: 'left' | 'right') => {\n if (side === 'left') {\n setLeftSession(null);\n setLeftScroll(0);\n setLeftFilter('');\n setLeftShowDetail(false);\n } else {\n setRightSession(null);\n setRightScroll(0);\n setRightFilter('');\n setRightShowDetail(false);\n }\n }, []);\n\n useKeyHandler({\n kb,\n activePanel,\n splitMode,\n inputMode,\n showSetup,\n showSettings: showSettings || showThemeMenu || showThemePicker || showTour,\n showDetail,\n leftShowDetail,\n rightShowDetail,\n confirmAction,\n selectedSession,\n leftSession,\n rightSession,\n leftScroll,\n rightScroll,\n leftFilter,\n rightFilter,\n filter,\n activityFilter,\n viewingArchive,\n archivedIds,\n updateInfo,\n maxScroll: Math.max(0, events.length - viewportRows),\n leftMaxScroll: Math.max(0, leftEvents.length - viewportRows),\n rightMaxScroll: Math.max(0, rightEvents.length - viewportRows),\n exit,\n selectNext,\n selectPrev,\n refresh,\n switchPanel,\n clearSplitState,\n resetPanel,\n getActiveFilter,\n setActivePanel,\n setInputMode,\n setFilter,\n setActivityFilter,\n setLeftFilter,\n setRightFilter,\n setShowDetail,\n setLeftShowDetail,\n setRightShowDetail,\n setShowSettings,\n setViewingArchive,\n setSplitMode,\n setLeftSession,\n setRightSession,\n setLeftScroll,\n setRightScroll,\n setActivityScroll,\n setConfirmAction,\n setUpdateStatus,\n nicknameInput,\n filterInput,\n onNickname: (id) => {\n clearNickname(id);\n refresh();\n },\n onClearNickname: (id) => {\n clearNickname(id);\n refresh();\n },\n onArchive: (id) => {\n archiveSession(id);\n refreshArchived();\n refresh();\n },\n onUnarchive: (id) => {\n unarchiveSession(id);\n refreshArchived();\n refresh();\n },\n onDelete: (sess) =>\n setConfirmAction({\n title: 'Delete session?',\n message: `Delete ${sess.nickname || sess.slug}? Output files will be removed.`,\n onConfirm: () => {\n deleteSessionFiles(sess.outputFiles);\n clearNickname(sess.sessionId);\n if (archivedIds.has(sess.sessionId)) {\n unarchiveSession(sess.sessionId);\n refreshArchived();\n }\n refresh();\n setConfirmAction(null);\n },\n }),\n onUpdate: () => {\n setUpdateStatus('updating...');\n installUpdate()\n .then(() => setUpdateStatus(`updated to v${updateInfo?.latest} — restart to apply`))\n .catch(() => setUpdateStatus('update failed'));\n },\n });\n\n if (showSetup) {\n const steps = [\n ...(liveConfig.prompts.hook === 'pending'\n ? [\n {\n title: 'Install Claude Code hook?',\n description: 'Adds a PostToolUse hook that blocks prompt injection attempts in real-time.',\n },\n ]\n : []),\n ...(liveConfig.prompts.mcp === 'pending'\n ? [\n {\n title: 'Install MCP server?',\n description: 'Registers agenttop as an MCP server so Claude Code can query session status and alerts.',\n },\n ]\n : []),\n ];\n if (steps.length === 0) {\n setShowSetup(false);\n if (liveConfig.prompts.theme === 'pending') setShowThemePicker(true);\n else if (liveConfig.prompts.tour === 'pending') setShowTour(true);\n return null;\n }\n return <SetupModal steps={steps} onComplete={handleSetupComplete} />;\n }\n if (showThemePicker) {\n return (\n <ThemePickerModal\n onSelect={handleThemePickerSelect}\n onSkip={handleThemePickerSkip}\n onDismiss={handleThemePickerDismiss}\n />\n );\n }\n if (showTour) return <GuidedTour onComplete={handleTourComplete} onSkip={handleTourSkip} />;\n if (showThemeMenu) return <ThemeMenu config={liveConfig} onClose={handleThemeMenuClose} />;\n if (showSettings)\n return <SettingsMenu config={liveConfig} onClose={handleSettingsClose} onOpenThemeMenu={handleOpenThemeMenu} />;\n if (confirmAction) {\n return (\n <Box flexDirection=\"column\" height={termHeight} justifyContent=\"center\" alignItems=\"center\">\n <ConfirmModal\n title={confirmAction.title}\n message={confirmAction.message}\n onConfirm={confirmAction.onConfirm}\n onCancel={() => setConfirmAction(null)}\n />\n </Box>\n );\n }\n\n const filterLabel =\n activePanel === 'sessions'\n ? 'sessions'\n : activePanel === 'left'\n ? 'left'\n : activePanel === 'right'\n ? 'right'\n : 'activity';\n const rightPanel = splitMode ? (\n <SplitPanel\n activePanel={activePanel}\n leftSession={leftSession}\n rightSession={rightSession}\n leftEvents={leftEvents}\n rightEvents={rightEvents}\n leftScroll={leftScroll}\n rightScroll={rightScroll}\n leftFilter={leftFilter}\n rightFilter={rightFilter}\n leftShowDetail={leftShowDetail}\n rightShowDetail={rightShowDetail}\n height={mainHeight}\n />\n ) : showDetail && selectedSession ? (\n <SessionDetail session={selectedSession} focused={activePanel === 'activity'} height={mainHeight} />\n ) : (\n <ActivityFeed\n events={events}\n sessionSlug={selectedSession?.slug ?? null}\n focused={activePanel === 'activity'}\n height={mainHeight}\n scrollOffset={activityScroll}\n filter={activityFilter || undefined}\n />\n );\n\n return (\n <Box flexDirection=\"column\" height={termHeight}>\n <StatusBar sessionCount={sessions.length} alertCount={alerts.length} version={version} updateInfo={updateInfo} />\n <Box flexGrow={1} height={mainHeight}>\n <SessionList\n sessions={sessions}\n selectedIndex={selectedIndex}\n focused={activePanel === 'sessions'}\n filter={filter || undefined}\n viewingArchive={viewingArchive}\n />\n {rightPanel}\n </Box>\n {!options.noSecurity && <AlertBar alerts={alerts} />}\n {inputMode === 'nickname' && (\n <Box paddingX={1}>\n <Text color={colors.primary}>nickname: </Text>\n <Text color={colors.bright}>{nicknameInput.value}</Text>\n <Text color={colors.muted}>_</Text>\n </Box>\n )}\n {inputMode === 'filter' && (\n <Box paddingX={1}>\n <Text color={colors.muted}>{filterLabel}</Text>\n <Text color={colors.primary}>/</Text>\n <Text color={colors.bright}>{filterInput.value}</Text>\n <Text color={colors.muted}>_</Text>\n </Box>\n )}\n {inputMode === 'normal' && (\n <FooterBar keybindings={kb} updateStatus={updateStatus} viewingArchive={viewingArchive} splitMode={splitMode} />\n )}\n </Box>\n );\n};\n","export interface ThemeColors {\n primary: string;\n secondary: string;\n accent: string;\n warning: string;\n error: string;\n critical: string;\n muted: string;\n text: string;\n bright: string;\n border: string;\n selected: string;\n header: string;\n}\n\nexport interface ToolColors {\n Bash: string;\n Read: string;\n Write: string;\n Edit: string;\n Grep: string;\n Glob: string;\n Task: string;\n WebFetch: string;\n WebSearch: string;\n}\n\nexport interface ThemeDefinition {\n name: string;\n colors: ThemeColors;\n toolColors: ToolColors;\n builtin?: boolean;\n}\n\nexport const COLOR_KEYS: (keyof ThemeColors)[] = [\n 'primary',\n 'secondary',\n 'accent',\n 'warning',\n 'error',\n 'critical',\n 'muted',\n 'text',\n 'bright',\n 'border',\n 'selected',\n 'header',\n];\n\nexport const TOOL_COLOR_KEYS: (keyof ToolColors)[] = [\n 'Bash',\n 'Read',\n 'Write',\n 'Edit',\n 'Grep',\n 'Glob',\n 'Task',\n 'WebFetch',\n 'WebSearch',\n];\n\nconst deriveToolColors = (c: ThemeColors): ToolColors => ({\n Bash: c.error,\n Read: c.secondary,\n Write: c.accent,\n Edit: c.accent,\n Grep: c.primary,\n Glob: c.primary,\n Task: c.warning,\n WebFetch: c.warning,\n WebSearch: c.warning,\n});\n\n// Compact preset builder: [name, primary, secondary, accent, warning, error, critical,\n// muted, text, bright, border, selected, header]\ntype PresetTuple = [\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n];\n\nconst fromTuple = ([\n name,\n primary,\n secondary,\n accent,\n warning,\n error,\n critical,\n muted,\n text,\n bright,\n border,\n selected,\n header,\n]: PresetTuple): ThemeDefinition => ({\n name,\n builtin: true,\n colors: { primary, secondary, accent, warning, error, critical, muted, text, bright, border, selected, header },\n toolColors: deriveToolColors({\n primary,\n secondary,\n accent,\n warning,\n error,\n critical,\n muted,\n text,\n bright,\n border,\n selected,\n header,\n }),\n});\n\nconst PRESETS: PresetTuple[] = [\n [\n 'one-dark',\n '#61AFEF',\n '#98C379',\n '#C678DD',\n '#E5C07B',\n '#E06C75',\n '#FF0000',\n '#5C6370',\n '#ABB2BF',\n '#FFFFFF',\n '#3E4451',\n '#2C313A',\n '#61AFEF',\n ],\n [\n 'dracula',\n '#BD93F9',\n '#50FA7B',\n '#FF79C6',\n '#F1FA8C',\n '#FF5555',\n '#FF0000',\n '#6272A4',\n '#F8F8F2',\n '#FFFFFF',\n '#44475A',\n '#383A59',\n '#BD93F9',\n ],\n [\n 'monokai-pro',\n '#78DCE8',\n '#A9DC76',\n '#AB9DF2',\n '#FFD866',\n '#FF6188',\n '#FF0000',\n '#727072',\n '#FCFCFA',\n '#FFFFFF',\n '#403E41',\n '#2D2A2E',\n '#78DCE8',\n ],\n [\n 'solarized-dark',\n '#268BD2',\n '#859900',\n '#D33682',\n '#B58900',\n '#DC322F',\n '#FF0000',\n '#586E75',\n '#839496',\n '#FDF6E3',\n '#073642',\n '#002B36',\n '#268BD2',\n ],\n [\n 'solarized-light',\n '#268BD2',\n '#859900',\n '#D33682',\n '#B58900',\n '#DC322F',\n '#FF0000',\n '#93A1A1',\n '#657B83',\n '#002B36',\n '#EEE8D5',\n '#FDF6E3',\n '#268BD2',\n ],\n [\n 'nord',\n '#88C0D0',\n '#A3BE8C',\n '#B48EAD',\n '#EBCB8B',\n '#BF616A',\n '#FF0000',\n '#4C566A',\n '#D8DEE9',\n '#ECEFF4',\n '#3B4252',\n '#2E3440',\n '#88C0D0',\n ],\n [\n 'gruvbox-dark',\n '#83A598',\n '#B8BB26',\n '#D3869B',\n '#FABD2F',\n '#FB4934',\n '#FF0000',\n '#928374',\n '#EBDBB2',\n '#FBF1C7',\n '#3C3836',\n '#282828',\n '#83A598',\n ],\n [\n 'tokyo-night',\n '#7AA2F7',\n '#9ECE6A',\n '#BB9AF7',\n '#E0AF68',\n '#F7768E',\n '#FF0000',\n '#565F89',\n '#A9B1D6',\n '#C0CAF5',\n '#292E42',\n '#1A1B26',\n '#7AA2F7',\n ],\n [\n 'catppuccin-mocha',\n '#89B4FA',\n '#A6E3A1',\n '#CBA6F7',\n '#F9E2AF',\n '#F38BA8',\n '#FF0000',\n '#6C7086',\n '#CDD6F4',\n '#FFFFFF',\n '#313244',\n '#1E1E2E',\n '#89B4FA',\n ],\n [\n 'catppuccin-latte',\n '#1E66F5',\n '#40A02B',\n '#8839EF',\n '#DF8E1D',\n '#D20F39',\n '#FF0000',\n '#9CA0B0',\n '#4C4F69',\n '#11111B',\n '#E6E9EF',\n '#EFF1F5',\n '#1E66F5',\n ],\n [\n 'rose-pine',\n '#9CCFD8',\n '#31748F',\n '#C4A7E7',\n '#F6C177',\n '#EB6F92',\n '#FF0000',\n '#6E6A86',\n '#E0DEF4',\n '#E0DEF4',\n '#26233A',\n '#191724',\n '#9CCFD8',\n ],\n [\n 'rose-pine-moon',\n '#9CCFD8',\n '#3E8FB0',\n '#C4A7E7',\n '#F6C177',\n '#EB6F92',\n '#FF0000',\n '#6E6A86',\n '#E0DEF4',\n '#E0DEF4',\n '#2A273F',\n '#232136',\n '#9CCFD8',\n ],\n [\n 'pastel-dark',\n '#89CFF0',\n '#77DD77',\n '#FDCFE8',\n '#FFD580',\n '#FF6961',\n '#FF0000',\n '#7B8794',\n '#D4D4D4',\n '#FFFFFF',\n '#3A3A4A',\n '#2B2B3A',\n '#89CFF0',\n ],\n [\n 'kanagawa',\n '#7E9CD8',\n '#76946A',\n '#957FB8',\n '#E6C384',\n '#C34043',\n '#FF0000',\n '#727169',\n '#DCD7BA',\n '#FFFFFF',\n '#2A2A37',\n '#1F1F28',\n '#7E9CD8',\n ],\n [\n 'everforest',\n '#7FBBB3',\n '#A7C080',\n '#D699B6',\n '#DBBC7F',\n '#E67E80',\n '#FF0000',\n '#859289',\n '#D3C6AA',\n '#FFFFFF',\n '#374145',\n '#2D353B',\n '#7FBBB3',\n ],\n];\n\nexport const BUILTIN_THEMES: ThemeDefinition[] = PRESETS.map(fromTuple);\n\nexport const getDefaultTheme = (): ThemeDefinition => BUILTIN_THEMES[0];\n\ntype CustomThemeMap = Record<string, { name: string; colors: ThemeColors; toolColors: ToolColors }>;\n\nexport const getAllThemes = (customThemes: CustomThemeMap): ThemeDefinition[] => [\n ...BUILTIN_THEMES,\n ...Object.values(customThemes).map((t) => ({ ...t, builtin: false })),\n];\n\nexport const resolveTheme = (name: string, customThemes: CustomThemeMap): ThemeDefinition => {\n const builtin = BUILTIN_THEMES.find((t) => t.name === name);\n if (builtin) return builtin;\n const custom = customThemes[name];\n if (custom) return { ...custom, builtin: false };\n return getDefaultTheme();\n};\n\nexport const deriveSeverityColors = (c: ThemeColors): Record<string, string> => ({\n info: c.muted,\n warn: c.warning,\n high: c.error,\n critical: c.critical,\n});\n\nexport { deriveToolColors };\n","import { existsSync, readFileSync, writeFileSync, copyFileSync, mkdirSync, chmodSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { homedir } from 'node:os';\nimport { fileURLToPath } from 'node:url';\n\nconst HOOK_FILENAME = 'agenttop-guard.py';\nconst SETTINGS_PATH = join(homedir(), '.claude', 'settings.json');\n\nconst getHookSource = (): string => {\n const thisFile = fileURLToPath(import.meta.url);\n const srcHooksDir = join(dirname(thisFile), '..', 'src', 'hooks');\n const distHooksDir = join(dirname(thisFile), 'hooks');\n\n for (const dir of [distHooksDir, srcHooksDir]) {\n const path = join(dir, HOOK_FILENAME);\n if (existsSync(path)) return path;\n }\n\n const npmGlobalPath = join(dirname(thisFile), '..', 'hooks', HOOK_FILENAME);\n if (existsSync(npmGlobalPath)) return npmGlobalPath;\n\n throw new Error(`cannot find ${HOOK_FILENAME} — is agenttop installed correctly?`);\n};\n\nconst getHookTarget = (): string => {\n const claudeHooksDir = join(homedir(), '.claude', 'hooks');\n mkdirSync(claudeHooksDir, { recursive: true });\n return join(claudeHooksDir, HOOK_FILENAME);\n};\n\ninterface HookEntry {\n type: string;\n command: string;\n}\n\ninterface MatcherEntry {\n matcher: string;\n hooks: HookEntry[];\n}\n\nconst readSettings = (): Record<string, unknown> => {\n if (!existsSync(SETTINGS_PATH)) {\n return {};\n }\n try {\n return JSON.parse(readFileSync(SETTINGS_PATH, 'utf-8'));\n } catch {\n return {};\n }\n};\n\nconst writeSettings = (settings: Record<string, unknown>): void => {\n mkdirSync(dirname(SETTINGS_PATH), { recursive: true });\n writeFileSync(SETTINGS_PATH, JSON.stringify(settings, null, 2) + '\\n');\n};\n\nexport const installHooks = (): void => {\n const source = getHookSource();\n const target = getHookTarget();\n\n copyFileSync(source, target);\n chmodSync(target, 0o755);\n\n const settings = readSettings();\n const hooks = (settings.hooks ?? {}) as Record<string, MatcherEntry[]>;\n\n const postToolUse = hooks.PostToolUse ?? [];\n const hookCommand = target;\n\n const allToolsMatcher = postToolUse.find(\n (entry: MatcherEntry) => entry.matcher === 'Bash|Read|Grep|Glob|WebFetch|WebSearch',\n );\n\n if (allToolsMatcher) {\n const alreadyInstalled = allToolsMatcher.hooks.some((h: HookEntry) => h.command.includes('agenttop-guard'));\n if (alreadyInstalled) {\n process.stdout.write('agenttop hooks already installed\\n');\n return;\n }\n allToolsMatcher.hooks.push({ type: 'command', command: hookCommand });\n } else {\n postToolUse.push({\n matcher: 'Bash|Read|Grep|Glob|WebFetch|WebSearch',\n hooks: [{ type: 'command', command: hookCommand }],\n });\n }\n\n hooks.PostToolUse = postToolUse;\n settings.hooks = hooks;\n writeSettings(settings);\n\n process.stdout.write(`agenttop hooks installed:\\n`);\n process.stdout.write(` hook: ${target}\\n`);\n process.stdout.write(` settings: ${SETTINGS_PATH}\\n`);\n process.stdout.write(` matcher: PostToolUse (Bash|Read|Grep|Glob|WebFetch|WebSearch)\\n`);\n};\n\nexport const uninstallHooks = (): void => {\n const settings = readSettings();\n const hooks = (settings.hooks ?? {}) as Record<string, MatcherEntry[]>;\n const postToolUse = hooks.PostToolUse ?? [];\n\n let removed = false;\n for (const entry of postToolUse) {\n const before = entry.hooks.length;\n entry.hooks = entry.hooks.filter((h: HookEntry) => !h.command.includes('agenttop-guard'));\n if (entry.hooks.length < before) removed = true;\n }\n\n hooks.PostToolUse = postToolUse.filter((e: MatcherEntry) => e.hooks.length > 0);\n settings.hooks = hooks;\n writeSettings(settings);\n\n if (removed) {\n process.stdout.write('agenttop hooks removed from Claude Code settings\\n');\n } else {\n process.stdout.write('agenttop hooks were not installed\\n');\n }\n};\n","import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nexport const installMcpConfig = (): void => {\n const settingsPath = join(homedir(), '.claude', 'settings.json');\n let settings: Record<string, unknown> = {};\n try {\n settings = JSON.parse(readFileSync(settingsPath, 'utf-8'));\n } catch {\n /* empty */\n }\n const mcpServers = (settings.mcpServers ?? {}) as Record<string, unknown>;\n mcpServers.agenttop = { command: 'agenttop', args: ['--mcp'] };\n settings.mcpServers = mcpServers;\n mkdirSync(join(homedir(), '.claude'), { recursive: true });\n writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\\n');\n process.stdout.write('agenttop MCP server registered in Claude Code settings\\n');\n process.stdout.write(` settings: ${settingsPath}\\n`);\n};\n","import { execSync, exec } from 'node:child_process';\nimport { readFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst getPackageVersion = (): string => {\n try {\n const thisFile = fileURLToPath(import.meta.url);\n const pkgPath = join(dirname(thisFile), '..', 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n return pkg.version || '0.0.0';\n } catch {\n return '0.0.0';\n }\n};\n\nexport interface UpdateInfo {\n current: string;\n latest: string;\n available: boolean;\n}\n\nexport const checkForUpdate = (): UpdateInfo => {\n const current = getPackageVersion();\n try {\n const latest = execSync('npm view agenttop version', { encoding: 'utf-8', timeout: 5000 }).trim();\n return {\n current,\n latest,\n available: latest !== current && compareVersions(latest, current) > 0,\n };\n } catch {\n return { current, latest: current, available: false };\n }\n};\n\nexport const installUpdate = (): Promise<string> => {\n return new Promise((resolve, reject) => {\n exec('npm install -g agenttop@latest', { timeout: 60000 }, (err, stdout) => {\n if (err) {\n reject(err);\n } else {\n resolve(stdout.trim());\n }\n });\n });\n};\n\nconst compareVersions = (a: string, b: string): number => {\n const pa = a.split('.').map(Number);\n const pb = b.split('.').map(Number);\n for (let i = 0; i < 3; i++) {\n const da = pa[i] ?? 0;\n const db = pb[i] ?? 0;\n if (da > db) return 1;\n if (da < db) return -1;\n }\n return 0;\n};\n","import React, { useState, useEffect } from 'react';\nimport { Box, Text } from 'ink';\n\nimport { colors } from '../theme.js';\nimport type { UpdateInfo } from '../../updates.js';\n\ninterface StatusBarProps {\n sessionCount: number;\n alertCount: number;\n version: string;\n updateInfo?: UpdateInfo | null;\n}\n\nexport const StatusBar: React.FC<StatusBarProps> = React.memo(({ sessionCount, alertCount, version, updateInfo }) => {\n const [time, setTime] = useState(new Date());\n\n useEffect(() => {\n const interval = setInterval(() => setTime(new Date()), 1000);\n return () => clearInterval(interval);\n }, []);\n\n const timeStr = time.toLocaleTimeString('en-GB', { hour12: false });\n\n return (\n <Box borderStyle=\"single\" borderColor={colors.border} paddingX={1} justifyContent=\"space-between\">\n <Text color={colors.header} bold>\n agenttop v{version}\n </Text>\n <Text color={colors.text}>\n {sessionCount} session{sessionCount !== 1 ? 's' : ''}\n </Text>\n {alertCount > 0 && (\n <Text color={colors.error} bold>\n {alertCount} alert{alertCount !== 1 ? 's' : ''}\n </Text>\n )}\n {updateInfo?.available && <Text color={colors.secondary}>v{updateInfo.latest} available (u)</Text>}\n <Text color={colors.muted}>{timeStr}</Text>\n </Box>\n );\n});\n","import type { ThemeDefinition } from '../config/themes.js';\nimport { deriveSeverityColors } from '../config/themes.js';\n\nexport const colors: Record<string, string> = {\n primary: '#61AFEF',\n secondary: '#98C379',\n accent: '#C678DD',\n warning: '#E5C07B',\n error: '#E06C75',\n critical: '#FF0000',\n muted: '#5C6370',\n text: '#ABB2BF',\n bright: '#FFFFFF',\n border: '#3E4451',\n selected: '#2C313A',\n header: '#61AFEF',\n};\n\nexport const severityColors: Record<string, string> = {\n info: colors.muted,\n warn: colors.warning,\n high: colors.error,\n critical: colors.critical,\n};\n\nexport const toolColors: Record<string, string> = {\n Bash: colors.error,\n Read: colors.secondary,\n Write: colors.accent,\n Edit: colors.accent,\n Grep: colors.primary,\n Glob: colors.primary,\n Task: colors.warning,\n WebFetch: colors.warning,\n WebSearch: colors.warning,\n};\n\nexport const getToolColor = (toolName: string): string => toolColors[toolName] || colors.text;\n\nexport const applyTheme = (theme: ThemeDefinition): void => {\n Object.assign(colors, theme.colors);\n Object.assign(toolColors, theme.toolColors);\n Object.assign(severityColors, deriveSeverityColors(theme.colors));\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\n\nimport type { Session } from '../../discovery/types.js';\nimport { colors } from '../theme.js';\n\ninterface SessionListProps {\n sessions: Session[];\n selectedIndex: number;\n focused: boolean;\n filter?: string;\n viewingArchive?: boolean;\n}\n\nconst formatModel = (model: string): string => {\n if (model.includes('opus')) return 'opus';\n if (model.includes('sonnet')) return 'sonnet';\n if (model.includes('haiku')) return 'haiku';\n return model.slice(0, 8);\n};\n\nconst formatProject = (project: string, max: number): string => {\n const parts = project.split('/');\n const last = parts[parts.length - 1] || project;\n return last.length > max ? last.slice(0, max - 1) + '\\u2026' : last;\n};\n\nconst formatTokens = (n: number): string => {\n if (n >= 1_000_000) return (n / 1_000_000).toFixed(1) + 'M';\n if (n >= 1_000) return (n / 1_000).toFixed(1) + 'k';\n return String(n);\n};\n\nconst truncate = (s: string, max: number): string => (s.length > max ? s.slice(0, max - 1) + '\\u2026' : s);\n\nconst SIDEBAR_WIDTH = 28;\nconst INNER_WIDTH = SIDEBAR_WIDTH - 4; // borders + paddingX\n\nexport const SessionList: React.FC<SessionListProps> = React.memo(\n ({ sessions, selectedIndex, focused, filter, viewingArchive }) => {\n const divider = '-'.repeat(INNER_WIDTH);\n\n return (\n <Box\n flexDirection=\"column\"\n width={SIDEBAR_WIDTH}\n borderStyle=\"single\"\n borderColor={focused ? colors.primary : colors.border}\n overflow=\"hidden\"\n >\n <Box paddingX={1}>\n <Text color={viewingArchive ? colors.warning : colors.header} bold>\n {viewingArchive ? 'ARCHIVE' : 'SESSIONS'}\n </Text>\n {filter && <Text color={colors.muted}> [{truncate(filter, 10)}]</Text>}\n </Box>\n\n {sessions.length === 0 && (\n <Box paddingX={1} paddingY={1}>\n <Text color={colors.muted} italic>\n {filter ? 'No matches' : viewingArchive ? 'No archived sessions' : 'No sessions'}\n </Text>\n </Box>\n )}\n\n {sessions.map((session, i) => {\n const isSelected = i === selectedIndex;\n const indicator = isSelected ? '>' : ' ';\n const nameMaxLen = INNER_WIDTH - 2;\n const displayName = truncate(session.nickname || session.slug, nameMaxLen);\n const totalIn = session.usage.inputTokens + session.usage.cacheReadTokens;\n const proj = formatProject(session.project, 12);\n const model = formatModel(session.model);\n const isActive = session.pid !== null;\n const nameColor = isSelected ? colors.bright : isActive ? colors.secondary : colors.error;\n\n return (\n <Box key={session.sessionId} flexDirection=\"column\" paddingX={1} paddingY={0}>\n {i > 0 && (\n <Text color={colors.border} wrap=\"truncate\">\n {divider}\n </Text>\n )}\n <Text\n color={nameColor}\n bold={isSelected}\n backgroundColor={isSelected ? colors.selected : undefined}\n wrap=\"truncate\"\n >\n {indicator} {displayName}\n </Text>\n {session.nickname && (\n <Text color={colors.muted} wrap=\"truncate\">\n {' '}\n {truncate(session.slug, nameMaxLen)}\n </Text>\n )}\n <Text color={colors.muted} wrap=\"truncate\">\n {' '}\n {proj} {model} {session.agentCount}ag\n </Text>\n <Text color={colors.muted} wrap=\"truncate\">\n {' '}\n {formatTokens(totalIn)}in {formatTokens(session.usage.outputTokens)}out {session.cpu}%\n </Text>\n </Box>\n );\n })}\n </Box>\n );\n },\n);\n","import React from 'react';\nimport { Box, Text } from 'ink';\n\nimport type { ToolCall } from '../../discovery/types.js';\nimport { colors, getToolColor } from '../theme.js';\n\ninterface ActivityFeedProps {\n events: ToolCall[];\n sessionSlug: string | null;\n focused: boolean;\n height: number;\n scrollOffset: number;\n filter?: string;\n}\n\nconst formatTime = (ts: number): string => {\n const d = new Date(ts);\n return d.toLocaleTimeString('en-GB', { hour12: false });\n};\n\nconst summarizeInput = (call: ToolCall): string => {\n const input = call.toolInput;\n\n switch (call.toolName) {\n case 'Bash':\n return String(input.command || '').slice(0, 50);\n case 'Read':\n case 'Write':\n case 'Edit':\n return String(input.file_path || '')\n .split('/')\n .slice(-2)\n .join('/');\n case 'Grep':\n return `pattern=\"${String(input.pattern || '').slice(0, 30)}\"`;\n case 'Glob':\n return String(input.pattern || '').slice(0, 40);\n case 'Task':\n return String(input.description || '').slice(0, 40);\n case 'WebFetch':\n case 'WebSearch':\n return String(input.url || input.query || '').slice(0, 40);\n default:\n return JSON.stringify(input).slice(0, 40);\n }\n};\n\nexport const ActivityFeed: React.FC<ActivityFeedProps> = React.memo(\n ({ events, sessionSlug, focused, height, scrollOffset, filter }) => {\n const viewportRows = height - 2;\n const totalEvents = events.length;\n const start = Math.max(0, totalEvents - viewportRows - scrollOffset);\n const end = start + viewportRows;\n const visible = events.slice(start, end);\n\n const isAtBottom = scrollOffset === 0;\n const isAtTop = start === 0;\n const canScroll = totalEvents > viewportRows;\n\n return (\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n borderStyle=\"single\"\n borderColor={focused ? colors.primary : colors.border}\n >\n <Box paddingX={1} justifyContent=\"space-between\">\n <Box>\n <Text color={colors.header} bold>\n ACTIVITY\n </Text>\n {sessionSlug && <Text color={colors.muted}> ({sessionSlug})</Text>}\n {filter && (\n <Text color={colors.muted}> [{filter.length > 10 ? filter.slice(0, 9) + '\\u2026' : filter}]</Text>\n )}\n </Box>\n {focused && canScroll && !isAtBottom && (\n <Text color={colors.muted}>\n [{totalEvents - end + viewportRows}/{totalEvents}]\n </Text>\n )}\n </Box>\n\n {visible.length === 0 && (\n <Box paddingX={1} paddingY={1}>\n <Text color={colors.muted} italic>\n {sessionSlug ? 'Waiting for activity...' : 'Select a session'}\n </Text>\n </Box>\n )}\n\n {visible.map((event, i) => (\n <Box key={`${event.timestamp}-${i}`} paddingX={1}>\n <Text color={colors.muted}>{formatTime(event.timestamp)} </Text>\n <Text color={getToolColor(event.toolName)} bold>\n {event.toolName.padEnd(8)}\n </Text>\n <Text color={colors.text}> {summarizeInput(event)}</Text>\n </Box>\n ))}\n\n {focused && canScroll && !isAtTop && visible.length > 0 && (\n <Box paddingX={1} justifyContent=\"flex-end\">\n <Text color={colors.muted}>{isAtBottom ? '' : 'G:bottom '}</Text>\n </Box>\n )}\n </Box>\n );\n },\n);\n","import React from 'react';\nimport { Box, Text } from 'ink';\n\nimport type { Alert } from '../../discovery/types.js';\nimport { colors, severityColors } from '../theme.js';\n\ninterface AlertBarProps {\n alerts: Alert[];\n maxVisible?: number;\n}\n\nconst formatTime = (ts: number): string => {\n const d = new Date(ts);\n return d.toLocaleTimeString('en-GB', { hour12: false });\n};\n\nconst severityIcon: Record<string, string> = {\n info: 'i',\n warn: '!',\n high: '!!',\n critical: '!!!',\n};\n\nexport const AlertBar: React.FC<AlertBarProps> = React.memo(({ alerts, maxVisible = 4 }) => {\n const visible = alerts.slice(-maxVisible);\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor={alerts.length > 0 ? colors.error : colors.border}>\n <Box paddingX={1}>\n <Text color={colors.error} bold>\n ALERTS\n </Text>\n {alerts.length === 0 && <Text color={colors.muted}> (none)</Text>}\n </Box>\n\n {visible.map((alert, i) => (\n <Box key={alert.id || i} paddingX={1}>\n <Text color={severityColors[alert.severity] || colors.text}>[{severityIcon[alert.severity] || '?'}]</Text>\n <Text color={colors.muted}> {formatTime(alert.timestamp)} </Text>\n <Text color={colors.warning}>{alert.sessionSlug}: </Text>\n <Text color={colors.text}>{alert.message.slice(0, 60)}</Text>\n </Box>\n ))}\n </Box>\n );\n});\n","import React from 'react';\nimport { Box, Text } from 'ink';\n\nimport type { Session } from '../../discovery/types.js';\nimport { colors } from '../theme.js';\n\ninterface SessionDetailProps {\n session: Session;\n focused: boolean;\n height: number;\n}\n\nconst formatTokens = (n: number): string => {\n if (n >= 1_000_000) return (n / 1_000_000).toFixed(1) + 'M';\n if (n >= 1_000) return (n / 1_000).toFixed(1) + 'k';\n return String(n);\n};\n\nconst formatUptime = (startTime: number): string => {\n const ms = Date.now() - startTime;\n const secs = Math.floor(ms / 1000);\n const mins = Math.floor(secs / 60);\n const hours = Math.floor(mins / 60);\n if (hours > 0) return `${hours}h ${mins % 60}m`;\n if (mins > 0) return `${mins}m ${secs % 60}s`;\n return `${secs}s`;\n};\n\nconst formatModel = (model: string): string => {\n if (model.includes('opus')) return 'opus';\n if (model.includes('sonnet')) return 'sonnet';\n if (model.includes('haiku')) return 'haiku';\n return model.slice(0, 20);\n};\n\nexport const SessionDetail: React.FC<SessionDetailProps> = React.memo(({ session, focused }) => {\n const totalInput = session.usage.inputTokens + session.usage.cacheCreationTokens + session.usage.cacheReadTokens;\n const totalTokens = totalInput + session.usage.outputTokens;\n const cacheHitRate = totalInput > 0 ? ((session.usage.cacheReadTokens / totalInput) * 100).toFixed(0) : '0';\n\n return (\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n borderStyle=\"single\"\n borderColor={focused ? colors.primary : colors.border}\n >\n <Box paddingX={1}>\n <Text color={colors.header} bold>\n SESSION DETAIL\n </Text>\n <Text color={colors.muted}> (Esc to return)</Text>\n </Box>\n\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Box>\n <Text color={colors.muted}>{'slug: '}</Text>\n <Text color={colors.bright} bold>\n {session.slug}\n </Text>\n </Box>\n {session.nickname && (\n <Box>\n <Text color={colors.muted}>{'nickname: '}</Text>\n <Text color={colors.secondary}>{session.nickname}</Text>\n </Box>\n )}\n <Box>\n <Text color={colors.muted}>{'model: '}</Text>\n <Text color={colors.text}>{formatModel(session.model)}</Text>\n </Box>\n <Box>\n <Text color={colors.muted}>{'cwd: '}</Text>\n <Text color={colors.text}>{session.cwd}</Text>\n </Box>\n {session.gitBranch && (\n <Box>\n <Text color={colors.muted}>{'branch: '}</Text>\n <Text color={colors.secondary}>{session.gitBranch}</Text>\n </Box>\n )}\n <Box>\n <Text color={colors.muted}>{'version: '}</Text>\n <Text color={colors.text}>{session.version || 'unknown'}</Text>\n </Box>\n <Box>\n <Text color={colors.muted}>{'pid: '}</Text>\n <Text color={colors.text}>{session.pid ?? 'not running'}</Text>\n </Box>\n <Box>\n <Text color={colors.muted}>{'cpu: '}</Text>\n <Text color={colors.text}>{session.cpu}%</Text>\n </Box>\n <Box>\n <Text color={colors.muted}>{'memory: '}</Text>\n <Text color={colors.text}>{session.memMB}MB</Text>\n </Box>\n <Box>\n <Text color={colors.muted}>{'uptime: '}</Text>\n <Text color={colors.text}>{formatUptime(session.startTime)}</Text>\n </Box>\n <Box>\n <Text color={colors.muted}>{'agents: '}</Text>\n <Text color={colors.text}>{session.agentCount}</Text>\n </Box>\n\n <Box marginTop={1}>\n <Text color={colors.header} bold>\n Token usage\n </Text>\n </Box>\n <Box>\n <Text color={colors.muted}>{' input: '}</Text>\n <Text color={colors.text}>{formatTokens(session.usage.inputTokens)}</Text>\n </Box>\n <Box>\n <Text color={colors.muted}>{' output: '}</Text>\n <Text color={colors.text}>{formatTokens(session.usage.outputTokens)}</Text>\n </Box>\n <Box>\n <Text color={colors.muted}>{' cache write: '}</Text>\n <Text color={colors.text}>{formatTokens(session.usage.cacheCreationTokens)}</Text>\n </Box>\n <Box>\n <Text color={colors.muted}>{' cache read: '}</Text>\n <Text color={colors.text}>{formatTokens(session.usage.cacheReadTokens)}</Text>\n </Box>\n <Box>\n <Text color={colors.muted}>{' cache hit: '}</Text>\n <Text color={session.usage.cacheReadTokens > 0 ? colors.secondary : colors.text}>{cacheHitRate}%</Text>\n </Box>\n <Box>\n <Text color={colors.muted}>{' total: '}</Text>\n <Text color={colors.bright} bold>\n {formatTokens(totalTokens)}\n </Text>\n </Box>\n </Box>\n </Box>\n );\n});\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\n\nimport { colors } from '../theme.js';\n\ntype PromptChoice = 'yes' | 'not_now' | 'dismiss';\n\ninterface SetupStep {\n title: string;\n description: string;\n}\n\ninterface SetupModalProps {\n steps: SetupStep[];\n onComplete: (results: PromptChoice[]) => void;\n}\n\nconst OPTIONS: Array<{ label: string; value: PromptChoice }> = [\n { label: 'Yes', value: 'yes' },\n { label: 'Not now', value: 'not_now' },\n { label: \"Don't ask again\", value: 'dismiss' },\n];\n\nexport const SetupModal: React.FC<SetupModalProps> = React.memo(({ steps, onComplete }) => {\n const [stepIndex, setStepIndex] = useState(0);\n const [selectedOption, setSelectedOption] = useState(0);\n const [results, setResults] = useState<PromptChoice[]>([]);\n\n const step = steps[stepIndex];\n\n useInput((_input, key) => {\n if (key.upArrow) {\n setSelectedOption((i) => Math.max(0, i - 1));\n }\n if (key.downArrow) {\n setSelectedOption((i) => Math.min(OPTIONS.length - 1, i + 1));\n }\n if (key.return) {\n const choice = OPTIONS[selectedOption].value;\n const newResults = [...results, choice];\n if (stepIndex + 1 >= steps.length) {\n onComplete(newResults);\n } else {\n setResults(newResults);\n setStepIndex(stepIndex + 1);\n setSelectedOption(0);\n }\n }\n });\n\n if (!step) return null;\n\n return (\n <Box flexDirection=\"column\" paddingX={4} paddingY={2}>\n <Box borderStyle=\"round\" borderColor={colors.primary} flexDirection=\"column\" paddingX={3} paddingY={1}>\n <Box marginBottom={1}>\n <Text color={colors.header} bold>\n agenttop setup ({stepIndex + 1}/{steps.length})\n </Text>\n </Box>\n\n <Box marginBottom={1}>\n <Text color={colors.bright} bold>\n {step.title}\n </Text>\n </Box>\n <Box marginBottom={1}>\n <Text color={colors.text}>{step.description}</Text>\n </Box>\n\n {OPTIONS.map((opt, i) => (\n <Box key={opt.value}>\n <Text color={i === selectedOption ? colors.primary : colors.muted}>\n {i === selectedOption ? '> ' : ' '}\n {opt.label}\n </Text>\n </Box>\n ))}\n\n <Box marginTop={1}>\n <Text color={colors.muted}>Use arrow keys + Enter to select</Text>\n </Box>\n </Box>\n </Box>\n );\n});\n","import React from 'react';\nimport { Box, Text } from 'ink';\n\nimport type { KeybindingsConfig } from '../../config/store.js';\nimport { colors } from '../theme.js';\n\ninterface FooterBarProps {\n keybindings: KeybindingsConfig;\n updateStatus?: string;\n viewingArchive?: boolean;\n splitMode?: boolean;\n}\n\nconst label = (key: string): string => {\n if (key === 'tab') return 'tab';\n if (key === 'shift+tab') return 'S-tab';\n if (key === 'enter') return 'enter';\n return key;\n};\n\nexport const FooterBar: React.FC<FooterBarProps> = React.memo(\n ({ keybindings, updateStatus, viewingArchive, splitMode }) => (\n <Box paddingX={1}>\n <Box marginRight={2}>\n <Text color={colors.muted}>{label(keybindings.quit)}:quit</Text>\n </Box>\n <Box marginRight={2}>\n <Text color={colors.muted}>\n {label(keybindings.navDown)}/{label(keybindings.navUp)}:nav\n </Text>\n </Box>\n <Box marginRight={2}>\n <Text color={colors.muted}>{label(keybindings.panelNext)}:panel</Text>\n </Box>\n <Box marginRight={2}>\n <Text color={colors.muted}>{label(keybindings.filter)}:filter</Text>\n </Box>\n <Box marginRight={2}>\n <Text color={colors.muted}>{label(keybindings.nickname)}:name</Text>\n </Box>\n <Box marginRight={2}>\n <Text color={colors.muted}>{label(keybindings.detail)}:detail</Text>\n </Box>\n <Box marginRight={2}>\n <Text color={colors.muted}>\n {label(keybindings.split)}:{splitMode ? 'unsplit' : 'split'}\n </Text>\n </Box>\n {splitMode && (\n <>\n <Box marginRight={2}>\n <Text color={colors.muted}>\n {label(keybindings.pinLeft)}/{label(keybindings.pinRight)}:pin\n </Text>\n </Box>\n <Box marginRight={2}>\n <Text color={colors.muted}>{label(keybindings.swapPanels)}:swap</Text>\n </Box>\n </>\n )}\n <Box marginRight={2}>\n <Text color={colors.muted}>\n {label(keybindings.archive)}:{viewingArchive ? 'restore' : 'archive'}\n </Text>\n </Box>\n <Box marginRight={2}>\n <Text color={colors.muted}>{label(keybindings.delete)}:delete</Text>\n </Box>\n <Box marginRight={2}>\n <Text color={colors.muted}>{label(keybindings.viewArchive)}:archived</Text>\n </Box>\n <Box marginRight={2}>\n <Text color={colors.muted}>{label(keybindings.settings)}:settings</Text>\n </Box>\n {updateStatus && (\n <Box marginRight={2}>\n <Text color={colors.secondary}>{updateStatus}</Text>\n </Box>\n )}\n </Box>\n ),\n);\n","import React, { useState, useMemo, useEffect, useRef } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\n\nimport type { Config, KeybindingsConfig, SecurityRulesConfig, NotificationsConfig } from '../../config/store.js';\nimport { colors } from '../theme.js';\n\ninterface SettingsMenuProps {\n config: Config;\n onClose: (updatedConfig: Config) => void;\n onOpenThemeMenu: () => void;\n}\n\ntype ItemType = 'keybind' | 'toggle' | 'cycle' | 'header' | 'action';\n\ninterface MenuItem {\n type: ItemType;\n label: string;\n section: string;\n key?: string;\n getValue: (config: Config) => string;\n apply?: (config: Config, newValue?: string) => Config;\n}\n\nconst KEYBIND_LABELS: Record<keyof KeybindingsConfig, string> = {\n quit: 'Quit',\n navUp: 'Navigate up',\n navDown: 'Navigate down',\n panelNext: 'Next panel',\n panelPrev: 'Previous panel',\n scrollTop: 'Scroll to top',\n scrollBottom: 'Scroll to bottom',\n filter: 'Filter',\n nickname: 'Set nickname',\n clearNickname: 'Clear nickname',\n detail: 'Detail view',\n update: 'Install update',\n settings: 'Settings',\n archive: 'Archive session',\n delete: 'Delete session',\n viewArchive: 'View archive',\n split: 'Toggle split view',\n pinLeft: 'Pin to left panel',\n pinRight: 'Pin to right panel',\n swapPanels: 'Swap panels',\n closePanel: 'Close panel',\n};\n\nconst RULE_LABELS: Record<keyof SecurityRulesConfig, string> = {\n network: 'Network detection',\n exfiltration: 'Exfiltration detection',\n sensitiveFiles: 'Sensitive files',\n shellEscape: 'Shell escape',\n injection: 'Prompt injection',\n};\n\nconst DEFAULT_KEYBINDINGS: KeybindingsConfig = {\n quit: 'q',\n navUp: 'k',\n navDown: 'j',\n panelNext: 'tab',\n panelPrev: 'shift+tab',\n scrollTop: 'g',\n scrollBottom: 'G',\n filter: '/',\n nickname: 'n',\n clearNickname: 'N',\n detail: 'enter',\n update: 'u',\n settings: 's',\n archive: 'a',\n delete: 'd',\n viewArchive: 'A',\n split: 'x',\n pinLeft: '1',\n pinRight: '2',\n swapPanels: 'S',\n closePanel: 'X',\n};\n\nconst SEVERITY_OPTIONS: NotificationsConfig['minSeverity'][] = ['info', 'warn', 'high', 'critical'];\nconst ARCHIVE_EXPIRY_OPTIONS = [0, 7, 14, 30, 60, 90];\nconst formatExpiry = (days: number): string => (days === 0 ? 'never' : `${days}d`);\n\nconst displayKey = (key: string): string => {\n if (key === 'tab') return 'tab';\n if (key === 'shift+tab') return 'S-tab';\n if (key === 'enter') return 'enter';\n return key;\n};\n\nconst buildMenuItems = (): MenuItem[] => {\n const items: MenuItem[] = [];\n\n items.push({ type: 'header', label: 'THEMES', section: 'themes', getValue: () => '', key: undefined });\n items.push({\n type: 'action',\n label: 'Manage themes...',\n section: 'themes',\n key: 'manageThemes',\n getValue: (cfg) => cfg.theme,\n apply: undefined,\n });\n\n items.push({ type: 'header', label: 'GENERAL', section: 'general', getValue: () => '', key: undefined });\n items.push({\n type: 'cycle',\n label: 'Archive expiry',\n section: 'general',\n key: 'archiveExpiryDays',\n getValue: (cfg) => formatExpiry(cfg.archiveExpiryDays),\n apply: (cfg) => {\n const idx = ARCHIVE_EXPIRY_OPTIONS.indexOf(cfg.archiveExpiryDays);\n return { ...cfg, archiveExpiryDays: ARCHIVE_EXPIRY_OPTIONS[(idx + 1) % ARCHIVE_EXPIRY_OPTIONS.length] };\n },\n });\n\n items.push({ type: 'header', label: 'KEYBINDINGS', section: 'keybindings', getValue: () => '', key: undefined });\n for (const [k, label] of Object.entries(KEYBIND_LABELS)) {\n const kbKey = k as keyof KeybindingsConfig;\n items.push({\n type: 'keybind',\n label,\n section: 'keybindings',\n key: kbKey,\n getValue: (cfg) => displayKey(cfg.keybindings[kbKey]),\n apply: (cfg, newValue) => ({ ...cfg, keybindings: { ...cfg.keybindings, [kbKey]: newValue } }),\n });\n }\n items.push({\n type: 'action',\n label: 'Reset all keybindings',\n section: 'keybindings',\n key: 'resetAllKeybinds',\n getValue: () => '',\n apply: (cfg) => ({ ...cfg, keybindings: { ...DEFAULT_KEYBINDINGS } }),\n });\n\n items.push({ type: 'header', label: 'SECURITY RULES', section: 'security', getValue: () => '', key: undefined });\n for (const [k, label] of Object.entries(RULE_LABELS)) {\n const ruleKey = k as keyof SecurityRulesConfig;\n items.push({\n type: 'toggle',\n label,\n section: 'security',\n key: ruleKey,\n getValue: (cfg) => (cfg.security.rules[ruleKey] ? 'ON' : 'OFF'),\n apply: (cfg) => ({\n ...cfg,\n security: { ...cfg.security, rules: { ...cfg.security.rules, [ruleKey]: !cfg.security.rules[ruleKey] } },\n }),\n });\n }\n\n items.push({ type: 'header', label: 'NOTIFICATIONS', section: 'notifications', getValue: () => '', key: undefined });\n items.push({\n type: 'toggle',\n label: 'Terminal bell',\n section: 'notifications',\n key: 'bell',\n getValue: (cfg) => (cfg.notifications.bell ? 'ON' : 'OFF'),\n apply: (cfg) => ({ ...cfg, notifications: { ...cfg.notifications, bell: !cfg.notifications.bell } }),\n });\n items.push({\n type: 'toggle',\n label: 'Desktop notifications',\n section: 'notifications',\n key: 'desktop',\n getValue: (cfg) => (cfg.notifications.desktop ? 'ON' : 'OFF'),\n apply: (cfg) => ({ ...cfg, notifications: { ...cfg.notifications, desktop: !cfg.notifications.desktop } }),\n });\n items.push({\n type: 'cycle',\n label: 'Minimum severity',\n section: 'notifications',\n key: 'minSeverity',\n getValue: (cfg) => cfg.notifications.minSeverity,\n apply: (cfg) => {\n const idx = SEVERITY_OPTIONS.indexOf(cfg.notifications.minSeverity);\n return {\n ...cfg,\n notifications: { ...cfg.notifications, minSeverity: SEVERITY_OPTIONS[(idx + 1) % SEVERITY_OPTIONS.length] },\n };\n },\n });\n\n return items;\n};\n\nconst MENU_ITEMS = buildMenuItems();\nconst SELECTABLE_INDICES = MENU_ITEMS.map((item, i) => (item.type !== 'header' ? i : -1)).filter((i) => i >= 0);\n\nexport const SettingsMenu: React.FC<SettingsMenuProps> = React.memo(({ config, onClose, onOpenThemeMenu }) => {\n const { stdout } = useStdout();\n const termHeight = stdout?.rows ?? 40;\n const [localConfig, setLocalConfig] = useState<Config>(() => JSON.parse(JSON.stringify(config)));\n const [selectablePos, setSelectablePos] = useState(0);\n const [rebinding, setRebinding] = useState(false);\n const [toast, setToast] = useState('');\n const toastTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const showToast = (msg: string) => {\n if (toastTimer.current) clearTimeout(toastTimer.current);\n setToast(msg);\n toastTimer.current = setTimeout(() => setToast(''), 2500);\n };\n\n useEffect(\n () => () => {\n if (toastTimer.current) clearTimeout(toastTimer.current);\n },\n [],\n );\n\n const selectedIndex = SELECTABLE_INDICES[selectablePos];\n const maxLabelLen = useMemo(\n () => Math.max(...MENU_ITEMS.filter((i) => i.type !== 'header').map((i) => i.label.length)),\n [],\n );\n\n useInput((input, key) => {\n if (rebinding) {\n const item = MENU_ITEMS[selectedIndex];\n let newKey: string;\n if (key.tab && key.shift) newKey = 'shift+tab';\n else if (key.tab) newKey = 'tab';\n else if (key.return) newKey = 'enter';\n else if (key.escape) {\n setRebinding(false);\n return;\n } else if (key.backspace || key.delete) {\n const kbKey = item.key as keyof KeybindingsConfig;\n const defaultVal = DEFAULT_KEYBINDINGS[kbKey];\n if (item.apply) setLocalConfig((c) => item.apply!(c, defaultVal));\n showToast(`Reset to default: ${displayKey(defaultVal)}`);\n setRebinding(false);\n return;\n } else if (input && input.length === 1) newKey = input;\n else return;\n\n const kbKey = item.key as keyof KeybindingsConfig;\n const conflict = Object.entries(localConfig.keybindings).find(([k, v]) => k !== kbKey && v === newKey);\n if (conflict) {\n const conflictLabel = KEYBIND_LABELS[conflict[0] as keyof KeybindingsConfig] || conflict[0];\n showToast(`'${displayKey(newKey)}' is already assigned to '${conflictLabel}'`);\n setRebinding(false);\n return;\n }\n\n if (item.apply) setLocalConfig((c) => item.apply!(c, newKey));\n setRebinding(false);\n return;\n }\n\n if (key.escape) {\n onClose(localConfig);\n return;\n }\n if (key.upArrow) {\n setSelectablePos((p) => Math.max(0, p - 1));\n return;\n }\n if (key.downArrow) {\n setSelectablePos((p) => Math.min(SELECTABLE_INDICES.length - 1, p + 1));\n return;\n }\n\n if (key.return) {\n const item = MENU_ITEMS[selectedIndex];\n if (item.key === 'manageThemes') {\n onOpenThemeMenu();\n return;\n }\n if (item.key === 'resetAllKeybinds') {\n if (item.apply) setLocalConfig((c) => item.apply!(c));\n showToast('All keybindings reset to defaults');\n return;\n }\n if (item.type === 'keybind') setRebinding(true);\n else if (item.apply) setLocalConfig((c) => item.apply!(c));\n }\n });\n\n const contentHeight = termHeight - 6;\n const halfView = Math.floor(contentHeight / 2);\n const menuItemIndex = MENU_ITEMS.indexOf(MENU_ITEMS[selectedIndex]);\n const scrollStart = Math.max(0, Math.min(menuItemIndex - halfView, MENU_ITEMS.length - contentHeight));\n const visibleItems = MENU_ITEMS.slice(Math.max(0, scrollStart), Math.max(0, scrollStart) + contentHeight);\n const visibleStartIndex = Math.max(0, scrollStart);\n\n return (\n <Box flexDirection=\"column\" height={termHeight}>\n <Box\n borderStyle=\"round\"\n borderColor={colors.primary}\n flexDirection=\"column\"\n paddingX={2}\n paddingY={1}\n height={termHeight}\n >\n <Box justifyContent=\"space-between\" marginBottom={1}>\n <Text color={colors.header} bold>\n SETTINGS\n </Text>\n <Text color={colors.muted}>esc to save & close {rebinding ? '| backspace to reset' : ''}</Text>\n </Box>\n\n {visibleItems.map((item, vi) => {\n const realIndex = visibleStartIndex + vi;\n const isSelected = realIndex === selectedIndex;\n if (item.type === 'header') {\n return (\n <Box key={`h-${item.label}`} marginTop={realIndex > 0 ? 1 : 0}>\n <Text color={colors.accent} bold>\n {' '}\n {item.label}\n </Text>\n </Box>\n );\n }\n\n const value = item.getValue(localConfig);\n const isRebindingThis = rebinding && isSelected;\n const displayValue = isRebindingThis ? '[press key...]' : value;\n const valueColor = isRebindingThis\n ? colors.warning\n : value === 'ON'\n ? colors.secondary\n : value === 'OFF'\n ? colors.error\n : colors.bright;\n const isReset = item.key === 'resetAllKeybinds';\n const dots = isReset ? '' : '.'.repeat(Math.max(2, maxLabelLen - item.label.length + 4)) + ' ';\n\n return (\n <Box key={`${item.section}-${item.key}`}>\n <Text color={isSelected ? colors.primary : colors.text}>\n {isSelected ? '> ' : ' '} {item.label} {dots}\n </Text>\n {!isReset && <Text color={valueColor}>{displayValue}</Text>}\n </Box>\n );\n })}\n\n {toast && (\n <Box marginTop={1} paddingX={2}>\n <Text color={colors.warning}>{toast}</Text>\n </Box>\n )}\n </Box>\n </Box>\n );\n});\n","import React, { useState, useCallback, useRef, useEffect } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\n\nimport type { ThemeDefinition } from '../../config/themes.js';\nimport { getAllThemes, getDefaultTheme, resolveTheme } from '../../config/themes.js';\nimport type { Config } from '../../config/store.js';\nimport { colors, applyTheme } from '../theme.js';\nimport { ThemeEditor } from './ThemeEditor.js';\n\ninterface ThemeMenuProps {\n config: Config;\n onClose: (updatedConfig: Config) => void;\n}\n\ntype View = 'list' | 'editor' | 'naming';\n\nexport const ThemeMenu: React.FC<ThemeMenuProps> = React.memo(({ config, onClose }) => {\n const { stdout } = useStdout();\n const termHeight = stdout?.rows ?? 40;\n const [localConfig, setLocalConfig] = useState<Config>(() => JSON.parse(JSON.stringify(config)));\n const [selectedIdx, setSelectedIdx] = useState(0);\n const [view, setView] = useState<View>('list');\n const [editingTheme, setEditingTheme] = useState<ThemeDefinition | null>(null);\n const [nameInput, setNameInput] = useState('');\n const [namingAction, setNamingAction] = useState<'copy' | 'rename'>('copy');\n const [toast, setToast] = useState('');\n const toastTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const showToast = (msg: string) => {\n if (toastTimer.current) clearTimeout(toastTimer.current);\n setToast(msg);\n toastTimer.current = setTimeout(() => setToast(''), 2500);\n };\n\n useEffect(\n () => () => {\n if (toastTimer.current) clearTimeout(toastTimer.current);\n },\n [],\n );\n\n const themes = getAllThemes(localConfig.customThemes);\n\n const previewTheme = useCallback(\n (idx: number) => {\n const t = themes[idx];\n if (t) applyTheme(t);\n },\n [themes],\n );\n\n const updateSelection = useCallback(\n (newIdx: number) => {\n setSelectedIdx(newIdx);\n previewTheme(newIdx);\n },\n [previewTheme],\n );\n\n useInput((input, key) => {\n if (view === 'naming') {\n if (key.escape) {\n setView('list');\n setNameInput('');\n return;\n }\n if (key.return && nameInput.trim()) {\n const name = nameInput.trim();\n if (themes.some((t) => t.name === name)) {\n showToast(`Theme '${name}' already exists`);\n return;\n }\n if (namingAction === 'copy') {\n const source = themes[selectedIdx];\n const newTheme: ThemeDefinition = {\n name,\n colors: { ...source.colors },\n toolColors: { ...source.toolColors },\n };\n setLocalConfig((c) => ({\n ...c,\n theme: name,\n customThemes: {\n ...c.customThemes,\n [name]: { name, colors: newTheme.colors, toolColors: newTheme.toolColors },\n },\n }));\n applyTheme(newTheme);\n showToast(`Created '${name}'`);\n } else {\n const old = themes[selectedIdx];\n const updated = { ...localConfig.customThemes };\n delete updated[old.name];\n updated[name] = { name, colors: old.colors, toolColors: old.toolColors };\n const newActive = localConfig.theme === old.name ? name : localConfig.theme;\n setLocalConfig((c) => ({ ...c, theme: newActive, customThemes: updated }));\n showToast(`Renamed to '${name}'`);\n }\n setView('list');\n setNameInput('');\n return;\n }\n if (key.backspace || key.delete) {\n setNameInput((v) => v.slice(0, -1));\n return;\n }\n if (input && input.length === 1) setNameInput((v) => v + input);\n return;\n }\n\n if (view === 'editor' && editingTheme) return;\n\n if (key.escape) {\n const restoreTheme = resolveTheme(localConfig.theme, localConfig.customThemes);\n applyTheme(restoreTheme);\n onClose(localConfig);\n return;\n }\n\n if (key.upArrow) {\n updateSelection(Math.max(0, selectedIdx - 1));\n return;\n }\n if (key.downArrow) {\n updateSelection(Math.min(themes.length - 1, selectedIdx + 1));\n return;\n }\n\n if (key.return) {\n setLocalConfig((c) => ({ ...c, theme: themes[selectedIdx].name }));\n applyTheme(themes[selectedIdx]);\n onClose({ ...localConfig, theme: themes[selectedIdx].name });\n return;\n }\n\n if (input === 'c') {\n setNamingAction('copy');\n setNameInput(themes[selectedIdx].name + '-custom');\n setView('naming');\n return;\n }\n\n const selected = themes[selectedIdx];\n if (input === 'e' && !selected.builtin) {\n setEditingTheme(selected);\n setView('editor');\n return;\n }\n\n if (input === 'r' && !selected.builtin) {\n setNamingAction('rename');\n setNameInput(selected.name);\n setView('naming');\n return;\n }\n\n if (input === 'd' && !selected.builtin) {\n const updated = { ...localConfig.customThemes };\n delete updated[selected.name];\n const newTheme = localConfig.theme === selected.name ? 'one-dark' : localConfig.theme;\n setLocalConfig((c) => ({ ...c, theme: newTheme, customThemes: updated }));\n if (localConfig.theme === selected.name) applyTheme(getDefaultTheme());\n setSelectedIdx((i) => Math.min(i, themes.length - 2));\n showToast(`Deleted '${selected.name}'`);\n return;\n }\n\n if (key.backspace || key.delete) {\n setLocalConfig((c) => ({ ...c, theme: 'one-dark' }));\n applyTheme(getDefaultTheme());\n showToast('Restored default theme');\n }\n });\n\n const handleEditorSave = useCallback((updated: ThemeDefinition) => {\n setLocalConfig((c) => ({\n ...c,\n customThemes: {\n ...c.customThemes,\n [updated.name]: { name: updated.name, colors: updated.colors, toolColors: updated.toolColors },\n },\n }));\n applyTheme(updated);\n setView('list');\n setEditingTheme(null);\n showToast(`Saved '${updated.name}'`);\n }, []);\n\n const handleEditorCancel = useCallback(() => {\n const restoreTheme = resolveTheme(localConfig.theme, localConfig.customThemes);\n applyTheme(restoreTheme);\n setView('list');\n setEditingTheme(null);\n }, [localConfig]);\n\n if (view === 'editor' && editingTheme) {\n return (\n <Box flexDirection=\"column\" height={termHeight}>\n <Box borderStyle=\"round\" borderColor={colors.primary} flexDirection=\"column\" height={termHeight}>\n <ThemeEditor theme={editingTheme} onSave={handleEditorSave} onCancel={handleEditorCancel} />\n </Box>\n </Box>\n );\n }\n\n const contentHeight = termHeight - 8;\n const halfView = Math.floor(contentHeight / 2);\n const scrollStart = Math.max(0, Math.min(selectedIdx - halfView, themes.length - contentHeight));\n const visibleThemes = themes.slice(Math.max(0, scrollStart), Math.max(0, scrollStart) + contentHeight);\n const visibleStartIdx = Math.max(0, scrollStart);\n\n return (\n <Box flexDirection=\"column\" height={termHeight}>\n <Box\n borderStyle=\"round\"\n borderColor={colors.primary}\n flexDirection=\"column\"\n paddingX={2}\n paddingY={1}\n height={termHeight}\n >\n <Box justifyContent=\"space-between\" marginBottom={1}>\n <Text color={colors.header} bold>\n THEMES\n </Text>\n <Text color={colors.muted}>enter:apply c:copy e:edit r:rename d:delete esc:back</Text>\n </Box>\n\n {view === 'naming' && (\n <Box marginBottom={1}>\n <Text color={colors.warning}>{namingAction === 'copy' ? 'New name' : 'Rename to'}: </Text>\n <Text color={colors.bright}>{nameInput}_</Text>\n </Box>\n )}\n\n {visibleThemes.map((theme, vi) => {\n const realIdx = visibleStartIdx + vi;\n const isSelected = realIdx === selectedIdx;\n const isActive = theme.name === localConfig.theme;\n return (\n <Box key={theme.name}>\n <Text color={isSelected ? colors.primary : colors.text}>\n {isSelected ? '> ' : ' '}\n {isActive ? '* ' : ' '}\n {theme.name}\n </Text>\n <Text color={colors.muted}>{theme.builtin ? ' (built-in)' : ' (custom)'}</Text>\n <Text> </Text>\n <Text color={theme.colors.primary}>{'\\u2588'}</Text>\n <Text color={theme.colors.secondary}>{'\\u2588'}</Text>\n <Text color={theme.colors.accent}>{'\\u2588'}</Text>\n <Text color={theme.colors.warning}>{'\\u2588'}</Text>\n <Text color={theme.colors.error}>{'\\u2588'}</Text>\n </Box>\n );\n })}\n\n {toast && (\n <Box marginTop={1} paddingX={2}>\n <Text color={colors.warning}>{toast}</Text>\n </Box>\n )}\n </Box>\n </Box>\n );\n});\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\n\nimport type { ThemeDefinition, ThemeColors, ToolColors } from '../../config/themes.js';\nimport { COLOR_KEYS, TOOL_COLOR_KEYS } from '../../config/themes.js';\nimport { colors } from '../theme.js';\n\ninterface ThemeEditorProps {\n theme: ThemeDefinition;\n onSave: (theme: ThemeDefinition) => void;\n onCancel: () => void;\n}\n\ntype EditTarget = { group: 'colors'; key: keyof ThemeColors } | { group: 'toolColors'; key: keyof ToolColors };\n\nconst ALL_KEYS: EditTarget[] = [\n ...COLOR_KEYS.map((key) => ({ group: 'colors' as const, key })),\n ...TOOL_COLOR_KEYS.map((key) => ({ group: 'toolColors' as const, key })),\n];\n\nconst isValidHex = (v: string): boolean => /^#[0-9A-Fa-f]{6}$/.test(v);\n\nexport const ThemeEditor: React.FC<ThemeEditorProps> = React.memo(({ theme, onSave, onCancel }) => {\n const [editColors, setEditColors] = useState<ThemeColors>({ ...theme.colors });\n const [editToolColors, setEditToolColors] = useState<ToolColors>({ ...theme.toolColors });\n const [selectedIdx, setSelectedIdx] = useState(0);\n const [editing, setEditing] = useState(false);\n const [inputValue, setInputValue] = useState('');\n\n const currentTarget = ALL_KEYS[selectedIdx];\n const getCurrentValue = (t: EditTarget): string => (t.group === 'colors' ? editColors[t.key] : editToolColors[t.key]);\n\n useInput((input, key) => {\n if (editing) {\n if (key.escape) {\n setEditing(false);\n setInputValue('');\n return;\n }\n if (key.return) {\n const val = inputValue.startsWith('#') ? inputValue : `#${inputValue}`;\n if (isValidHex(val)) {\n if (currentTarget.group === 'colors') {\n setEditColors((c) => ({ ...c, [currentTarget.key]: val }));\n } else {\n setEditToolColors((c) => ({ ...c, [currentTarget.key]: val }));\n }\n }\n setEditing(false);\n setInputValue('');\n return;\n }\n if (key.backspace || key.delete) {\n setInputValue((v) => v.slice(0, -1));\n return;\n }\n if (input && input.length === 1 && /[0-9A-Fa-f#]/.test(input)) {\n setInputValue((v) => v + input);\n }\n return;\n }\n\n if (key.escape) {\n onCancel();\n return;\n }\n if (key.upArrow) {\n setSelectedIdx((i) => Math.max(0, i - 1));\n return;\n }\n if (key.downArrow) {\n setSelectedIdx((i) => Math.min(ALL_KEYS.length - 1, i + 1));\n return;\n }\n\n if (key.return) {\n setEditing(true);\n setInputValue(getCurrentValue(currentTarget));\n return;\n }\n\n if (input === 's' || input === 'S') {\n onSave({ ...theme, colors: editColors, toolColors: editToolColors });\n }\n });\n\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Box justifyContent=\"space-between\" marginBottom={1}>\n <Text color={colors.header} bold>\n EDIT THEME: {theme.name}\n </Text>\n <Text color={colors.muted}>enter:edit s:save esc:cancel</Text>\n </Box>\n\n <Box marginBottom={1}>\n <Text color={colors.accent} bold>\n {' '}\n COLORS\n </Text>\n </Box>\n {COLOR_KEYS.map((k, i) => {\n const isSelected = selectedIdx === i;\n const value = editColors[k];\n const isEditingThis = editing && isSelected;\n return (\n <Box key={k}>\n <Text color={isSelected ? colors.primary : colors.text}>\n {isSelected ? '> ' : ' '} {k.padEnd(12)}\n </Text>\n <Text color={value}>{isEditingThis ? inputValue + '_' : value}</Text>\n <Text color={value}> {'\\u2588\\u2588'}</Text>\n </Box>\n );\n })}\n\n <Box marginTop={1} marginBottom={1}>\n <Text color={colors.accent} bold>\n {' '}\n TOOL COLORS\n </Text>\n </Box>\n {TOOL_COLOR_KEYS.map((k, i) => {\n const realIdx = COLOR_KEYS.length + i;\n const isSelected = selectedIdx === realIdx;\n const value = editToolColors[k];\n const isEditingThis = editing && isSelected;\n return (\n <Box key={k}>\n <Text color={isSelected ? colors.primary : colors.text}>\n {isSelected ? '> ' : ' '} {k.padEnd(12)}\n </Text>\n <Text color={value}>{isEditingThis ? inputValue + '_' : value}</Text>\n <Text color={value}> {'\\u2588\\u2588'}</Text>\n </Box>\n );\n })}\n </Box>\n );\n});\n","import React, { useState, useEffect } from 'react';\nimport { Box, Text, useInput } from 'ink';\n\nimport type { ThemeDefinition } from '../../config/themes.js';\nimport { BUILTIN_THEMES } from '../../config/themes.js';\nimport { applyTheme } from '../theme.js';\nimport { colors } from '../theme.js';\n\ninterface ThemePickerModalProps {\n onSelect: (themeName: string) => void;\n onSkip: () => void;\n onDismiss: () => void;\n}\n\nexport const ThemePickerModal: React.FC<ThemePickerModalProps> = React.memo(({ onSelect, onSkip, onDismiss }) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const themes = BUILTIN_THEMES;\n\n useEffect(() => {\n applyTheme(themes[selectedIndex]);\n }, [selectedIndex]);\n\n useInput((input, key) => {\n if (key.upArrow) setSelectedIndex((i) => Math.max(0, i - 1));\n if (key.downArrow) setSelectedIndex((i) => Math.min(themes.length - 1, i + 1));\n if (key.return) onSelect(themes[selectedIndex].name);\n if (input === 'n') onSkip();\n if (input === 'd') onDismiss();\n });\n\n const renderSwatch = (theme: ThemeDefinition) => {\n const c = theme.colors;\n return (\n <Text>\n <Text color={c.primary}>{'\\u2588'}</Text>\n <Text color={c.secondary}>{'\\u2588'}</Text>\n <Text color={c.accent}>{'\\u2588'}</Text>\n <Text color={c.warning}>{'\\u2588'}</Text>\n <Text color={c.error}>{'\\u2588'}</Text>\n </Text>\n );\n };\n\n return (\n <Box flexDirection=\"column\" paddingX={4} paddingY={1}>\n <Box borderStyle=\"round\" borderColor={colors.primary} flexDirection=\"column\" paddingX={3} paddingY={1}>\n <Box marginBottom={1}>\n <Text color={colors.header} bold>\n Choose a theme\n </Text>\n </Box>\n <Box marginBottom={1}>\n <Text color={colors.text}>Select a theme to get started. You can change this later in settings (s).</Text>\n </Box>\n {themes.map((theme, i) => (\n <Box key={theme.name}>\n <Text color={i === selectedIndex ? colors.primary : colors.muted}>{i === selectedIndex ? '> ' : ' '}</Text>\n {renderSwatch(theme)}\n <Text color={i === selectedIndex ? colors.bright : colors.text}> {theme.name}</Text>\n </Box>\n ))}\n <Box marginTop={1} flexDirection=\"column\">\n <Text color={colors.muted}>Enter = select | n = not now | d = don't ask again</Text>\n </Box>\n </Box>\n </Box>\n );\n});\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\n\nimport { colors } from '../theme.js';\n\ninterface TourStep {\n title: string;\n body: string;\n}\n\nconst STEPS: TourStep[] = [\n {\n title: 'Session list',\n body: 'The left panel shows all active Claude Code sessions. Use j/k to navigate and Enter to view details.',\n },\n {\n title: 'Activity feed',\n body: 'The right panel streams tool calls in real-time. Press Tab to switch between panels.',\n },\n {\n title: 'Split view',\n body: 'Press x to split the activity panel. Pin sessions to left (1) or right (2) panels. Press S to swap.',\n },\n {\n title: 'Filtering',\n body: 'Press / to filter sessions or activity by keyword. Works in any panel.',\n },\n {\n title: 'Session management',\n body: 'Press n to nickname a session, a to archive it, d to delete it. Press A to view archived sessions.',\n },\n {\n title: 'Security alerts',\n body: 'The alert bar highlights suspicious tool calls like network access or sensitive file reads.',\n },\n {\n title: 'Themes & settings',\n body: 'Press s to open settings. Customise keybindings, manage themes, and configure updates.',\n },\n];\n\ninterface GuidedTourProps {\n onComplete: () => void;\n onSkip: () => void;\n}\n\nexport const GuidedTour: React.FC<GuidedTourProps> = React.memo(({ onComplete, onSkip }) => {\n const [stepIndex, setStepIndex] = useState(0);\n const step = STEPS[stepIndex];\n const isLast = stepIndex === STEPS.length - 1;\n\n useInput((input, key) => {\n if (key.return || key.rightArrow) {\n if (isLast) onComplete();\n else setStepIndex((i) => i + 1);\n }\n if (key.leftArrow && stepIndex > 0) setStepIndex((i) => i - 1);\n if (input === 'q' || key.escape) onSkip();\n });\n\n return (\n <Box flexDirection=\"column\" paddingX={4} paddingY={1}>\n <Box borderStyle=\"round\" borderColor={colors.primary} flexDirection=\"column\" paddingX={3} paddingY={1}>\n <Box marginBottom={1}>\n <Text color={colors.header} bold>\n Quick tour ({stepIndex + 1}/{STEPS.length})\n </Text>\n </Box>\n <Box marginBottom={1}>\n <Text color={colors.bright} bold>\n {step.title}\n </Text>\n </Box>\n <Box marginBottom={1}>\n <Text color={colors.text}>{step.body}</Text>\n </Box>\n <Text color={colors.muted}>\n {isLast ? 'Enter = finish' : 'Enter/\\u2192 = next'} | {stepIndex > 0 ? '\\u2190 = back | ' : ''}q = skip tour\n </Text>\n </Box>\n </Box>\n );\n});\n","import React from 'react';\nimport { Box, Text, useInput } from 'ink';\n\nimport { colors } from '../theme.js';\n\ninterface ConfirmModalProps {\n title: string;\n message: string;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport const ConfirmModal: React.FC<ConfirmModalProps> = React.memo(({ title, message, onConfirm, onCancel }) => {\n useInput((input, key) => {\n if (input === 'y' || input === 'Y') {\n onConfirm();\n } else if (input === 'n' || input === 'N' || key.escape) {\n onCancel();\n }\n });\n\n return (\n <Box\n borderStyle=\"round\"\n borderColor={colors.warning}\n flexDirection=\"column\"\n paddingX={2}\n paddingY={1}\n alignSelf=\"center\"\n >\n <Text color={colors.warning} bold>\n {title}\n </Text>\n <Text color={colors.text}>{message}</Text>\n <Box marginTop={1}>\n <Text color={colors.muted}>[y] confirm [n/esc] cancel</Text>\n </Box>\n </Box>\n );\n});\n","import React from 'react';\nimport { Box } from 'ink';\n\nimport type { ToolCall } from '../../discovery/types.js';\nimport type { Session } from '../../discovery/types.js';\nimport type { Panel } from '../App.js';\nimport { colors } from '../theme.js';\nimport { ActivityFeed } from './ActivityFeed.js';\nimport { SessionDetail } from './SessionDetail.js';\n\ninterface SplitPanelProps {\n activePanel: Panel;\n leftSession: Session | null;\n rightSession: Session | null;\n leftEvents: ToolCall[];\n rightEvents: ToolCall[];\n leftScroll: number;\n rightScroll: number;\n leftFilter: string;\n rightFilter: string;\n leftShowDetail: boolean;\n rightShowDetail: boolean;\n height: number;\n}\n\nexport const SplitPanel: React.FC<SplitPanelProps> = React.memo(\n ({\n activePanel,\n leftSession,\n rightSession,\n leftEvents,\n rightEvents,\n leftScroll,\n rightScroll,\n leftFilter,\n rightFilter,\n leftShowDetail,\n rightShowDetail,\n height,\n }) => {\n const left =\n leftShowDetail && leftSession ? (\n <SessionDetail session={leftSession} focused={activePanel === 'left'} height={height} />\n ) : (\n <ActivityFeed\n events={leftEvents}\n sessionSlug={leftSession?.slug ?? null}\n focused={activePanel === 'left'}\n height={height}\n scrollOffset={leftScroll}\n filter={leftFilter || undefined}\n />\n );\n\n const right =\n rightShowDetail && rightSession ? (\n <SessionDetail session={rightSession} focused={activePanel === 'right'} height={height} />\n ) : (\n <ActivityFeed\n events={rightEvents}\n sessionSlug={rightSession?.slug ?? null}\n focused={activePanel === 'right'}\n height={height}\n scrollOffset={rightScroll}\n filter={rightFilter || undefined}\n />\n );\n\n return (\n <Box flexDirection=\"row\" flexGrow={1}>\n <Box\n flexGrow={1}\n borderStyle=\"single\"\n borderRight\n borderTop={false}\n borderBottom={false}\n borderLeft={false}\n borderColor={colors.border}\n >\n {left}\n </Box>\n {right}\n </Box>\n );\n },\n);\n","import { useState, useEffect, useCallback, useRef } from 'react';\n\nimport { discoverSessions } from '../../discovery/sessions.js';\nimport type { Session, TokenUsage } from '../../discovery/types.js';\nimport { getNicknames } from '../../config/store.js';\n\nconst ACTIVE_POLL_MS = 10_000;\nconst IDLE_POLL_MS = 30_000;\n\nexport const useSessions = (\n allUsers: boolean,\n filter?: string,\n archivedIds?: Set<string>,\n viewingArchive?: boolean,\n) => {\n const [sessions, setSessions] = useState<Session[]>([]);\n const [selectedIndex, setSelectedIndex] = useState(0);\n const usageOverrides = useRef(new Map<string, TokenUsage>());\n\n const refresh = useCallback(() => {\n const found = discoverSessions(allUsers);\n const nicknames = getNicknames();\n\n const enriched = found.map((s) => {\n const override = usageOverrides.current.get(s.sessionId);\n return {\n ...s,\n nickname: nicknames[s.sessionId],\n usage: override\n ? {\n inputTokens: s.usage.inputTokens + override.inputTokens,\n cacheCreationTokens: s.usage.cacheCreationTokens + override.cacheCreationTokens,\n cacheReadTokens: s.usage.cacheReadTokens + override.cacheReadTokens,\n outputTokens: s.usage.outputTokens + override.outputTokens,\n }\n : s.usage,\n };\n });\n\n let filtered = enriched;\n\n if (archivedIds && archivedIds.size > 0) {\n if (viewingArchive) {\n filtered = filtered.filter((s) => archivedIds.has(s.sessionId));\n } else {\n filtered = filtered.filter((s) => !archivedIds.has(s.sessionId));\n }\n } else if (viewingArchive) {\n filtered = [];\n }\n\n if (filter) {\n const lower = filter.toLowerCase();\n filtered = filtered.filter(\n (s) =>\n s.slug.toLowerCase().includes(lower) ||\n s.nickname?.toLowerCase().includes(lower) ||\n s.project.toLowerCase().includes(lower) ||\n s.model.toLowerCase().includes(lower),\n );\n }\n\n setSessions(filtered);\n }, [allUsers, filter, archivedIds, viewingArchive]);\n\n useEffect(() => {\n refresh();\n const pollMs = sessions.length > 0 ? ACTIVE_POLL_MS : IDLE_POLL_MS;\n const interval = setInterval(refresh, pollMs);\n return () => clearInterval(interval);\n }, [refresh, sessions.length > 0]);\n\n const selectedSession = sessions[selectedIndex] ?? null;\n\n const selectNext = useCallback(() => {\n setSelectedIndex((i) => Math.min(i + 1, Math.max(0, sessions.length - 1)));\n }, [sessions.length]);\n\n const selectPrev = useCallback(() => {\n setSelectedIndex((i) => Math.max(i - 1, 0));\n }, []);\n\n const selectIndex = useCallback((i: number) => {\n setSelectedIndex(i);\n }, []);\n\n const addUsage = useCallback((sessionId: string, usage: TokenUsage) => {\n const existing = usageOverrides.current.get(sessionId);\n if (existing) {\n usageOverrides.current.set(sessionId, {\n inputTokens: existing.inputTokens + usage.inputTokens,\n cacheCreationTokens: existing.cacheCreationTokens + usage.cacheCreationTokens,\n cacheReadTokens: existing.cacheReadTokens + usage.cacheReadTokens,\n outputTokens: existing.outputTokens + usage.outputTokens,\n });\n } else {\n usageOverrides.current.set(sessionId, usage);\n }\n }, []);\n\n return { sessions, selectedSession, selectedIndex, selectNext, selectPrev, selectIndex, refresh, addUsage };\n};\n","import { useState, useEffect, useRef } from 'react';\n\nimport type { Session, ToolCall } from '../../discovery/types.js';\nimport { Watcher } from '../../ingestion/watcher.js';\n\nconst MAX_EVENTS = 200;\n\nexport const useActivityStream = (session: Session | null, allUsers: boolean) => {\n const [events, setEvents] = useState<ToolCall[]>([]);\n const watcherRef = useRef<Watcher | null>(null);\n\n useEffect(() => {\n setEvents([]);\n\n if (!session) return;\n\n const existingCalls: ToolCall[] = [];\n const tempWatcher = new Watcher(() => {}, allUsers);\n for (const file of session.outputFiles) {\n existingCalls.push(...tempWatcher.readExisting(file));\n }\n setEvents(existingCalls.slice(-MAX_EVENTS));\n\n const handler = (calls: ToolCall[]) => {\n const sessionCalls = calls.filter((c) => c.sessionId === session.sessionId);\n if (sessionCalls.length === 0) return;\n setEvents((prev) => [...prev, ...sessionCalls].slice(-MAX_EVENTS));\n };\n\n const watcher = new Watcher(handler, allUsers);\n watcherRef.current = watcher;\n watcher.start();\n\n return () => {\n watcher.stop();\n watcherRef.current = null;\n };\n }, [session?.sessionId, allUsers]);\n\n return events;\n};\n","import { useMemo } from 'react';\n\nimport type { ToolCall } from '../../discovery/types.js';\n\nconst applyFilter = (events: ToolCall[], filter: string): ToolCall[] => {\n if (!filter) return events;\n const lower = filter.toLowerCase();\n return events.filter(\n (e) => e.toolName.toLowerCase().includes(lower) || JSON.stringify(e.toolInput).toLowerCase().includes(lower),\n );\n};\n\nexport const useFilteredEvents = (rawEvents: ToolCall[], filter: string): ToolCall[] =>\n useMemo(() => applyFilter(rawEvents, filter), [rawEvents, filter]);\n","import { useState, useEffect, useRef } from 'react';\n\nimport type { Alert, AlertSeverity, SecurityEvent } from '../../discovery/types.js';\nimport { SecurityEngine } from '../../analysis/security.js';\nimport { Watcher } from '../../ingestion/watcher.js';\nimport { notify } from '../../notifications.js';\nimport { AlertLogger } from '../../alerts/logger.js';\nimport type { Config } from '../../config/store.js';\n\nconst MAX_ALERTS = 100;\n\nexport const useAlerts = (enabled: boolean, alertLevel: AlertSeverity, allUsers: boolean, config?: Config) => {\n const [alerts, setAlerts] = useState<Alert[]>([]);\n const engineRef = useRef(new SecurityEngine(alertLevel));\n const watcherRef = useRef<Watcher | null>(null);\n const loggerRef = useRef<AlertLogger | null>(null);\n\n useEffect(() => {\n if (!enabled) return;\n\n engineRef.current = new SecurityEngine(alertLevel);\n\n if (config?.alerts.enabled) {\n loggerRef.current = new AlertLogger(config);\n }\n\n const securityHandler = (events: SecurityEvent[]) => {\n const newAlerts: Alert[] = [];\n for (const event of events) {\n newAlerts.push(...engineRef.current.analyzeEvent(event));\n }\n if (newAlerts.length > 0) {\n for (const alert of newAlerts) {\n if (config) {\n notify(alert, config.notifications);\n }\n loggerRef.current?.log(alert);\n }\n setAlerts((prev) => [...prev, ...newAlerts].slice(-MAX_ALERTS));\n }\n };\n\n const watcher = new Watcher(() => {}, allUsers, securityHandler);\n watcherRef.current = watcher;\n watcher.start();\n\n return () => {\n watcher.stop();\n watcherRef.current = null;\n loggerRef.current = null;\n };\n }, [enabled, alertLevel, allUsers]);\n\n const clearAlerts = () => setAlerts([]);\n\n return { alerts, clearAlerts };\n};\n","import { exec } from 'node:child_process';\nimport { platform } from 'node:os';\n\nimport type { Alert, AlertSeverity } from './discovery/types.js';\nimport type { NotificationsConfig } from './config/store.js';\n\nconst SEVERITY_ORDER: Record<AlertSeverity, number> = {\n info: 0,\n warn: 1,\n high: 2,\n critical: 3,\n};\n\nconst RATE_LIMIT_MS = 30_000;\nlet lastDesktopNotification = 0;\n\nexport const notify = (alert: Alert, config: NotificationsConfig): void => {\n if (SEVERITY_ORDER[alert.severity] < SEVERITY_ORDER[config.minSeverity]) return;\n\n if (config.bell) {\n process.stdout.write('\\x07');\n }\n\n if (config.desktop) {\n const now = Date.now();\n if (now - lastDesktopNotification < RATE_LIMIT_MS) return;\n lastDesktopNotification = now;\n\n const title = `agenttop: ${alert.severity} alert`;\n const body = `${alert.sessionSlug}: ${alert.message.slice(0, 100)}`;\n\n const os = platform();\n if (os === 'linux') {\n exec(`notify-send ${JSON.stringify(title)} ${JSON.stringify(body)}`, { timeout: 3000 });\n } else if (os === 'darwin') {\n exec(`osascript -e 'display notification ${JSON.stringify(body)} with title ${JSON.stringify(title)}'`, {\n timeout: 3000,\n });\n }\n }\n};\n","import { appendFileSync, mkdirSync } from 'node:fs';\nimport { dirname } from 'node:path';\n\nimport type { Alert } from '../discovery/types.js';\nimport { resolveAlertLogPath, rotateLogFile } from '../config/store.js';\nimport type { Config } from '../config/store.js';\n\nexport class AlertLogger {\n private logPath: string;\n private writeCount = 0;\n\n constructor(config: Config) {\n this.logPath = resolveAlertLogPath(config);\n mkdirSync(dirname(this.logPath), { recursive: true });\n }\n\n log(alert: Alert): void {\n const entry = {\n timestamp: new Date(alert.timestamp).toISOString(),\n severity: alert.severity,\n rule: alert.rule,\n message: alert.message,\n sessionSlug: alert.sessionSlug,\n sessionId: alert.sessionId,\n };\n\n try {\n appendFileSync(this.logPath, JSON.stringify(entry) + '\\n');\n this.writeCount++;\n if (this.writeCount % 100 === 0) {\n rotateLogFile(this.logPath);\n }\n } catch {\n // silently ignore write errors\n }\n }\n}\n","import { useState, useCallback } from 'react';\n\nexport interface TextInputState {\n value: string;\n isActive: boolean;\n start: (initial?: string) => void;\n cancel: () => void;\n confirm: () => string;\n handleInput: (\n input: string,\n key: { return?: boolean; escape?: boolean; backspace?: boolean; delete?: boolean },\n ) => boolean;\n}\n\nexport const useTextInput = (onConfirm?: (value: string) => void, onCancel?: () => void): TextInputState => {\n const [value, setValue] = useState('');\n const [isActive, setIsActive] = useState(false);\n\n const start = useCallback((initial = '') => {\n setValue(initial);\n setIsActive(true);\n }, []);\n\n const cancel = useCallback(() => {\n setValue('');\n setIsActive(false);\n onCancel?.();\n }, [onCancel]);\n\n const confirm = useCallback(() => {\n const result = value;\n setIsActive(false);\n setValue('');\n onConfirm?.(result);\n return result;\n }, [value, onConfirm]);\n\n const handleInput = useCallback(\n (input: string, key: { return?: boolean; escape?: boolean; backspace?: boolean; delete?: boolean }): boolean => {\n if (!isActive) return false;\n\n if (key.escape) {\n cancel();\n return true;\n }\n\n if (key.return) {\n confirm();\n return true;\n }\n\n if (key.backspace || key.delete) {\n setValue((v) => {\n if (v.length === 0) {\n cancel();\n return v;\n }\n return v.slice(0, -1);\n });\n return true;\n }\n\n if (input && input.length === 1 && input >= ' ') {\n setValue((v) => v + input);\n return true;\n }\n\n return true;\n },\n [isActive, cancel, confirm],\n );\n\n return { value, isActive, start, cancel, confirm, handleInput };\n};\n","import { useInput } from 'ink';\n\nimport type { KeybindingsConfig } from '../../config/store.js';\nimport type { Session } from '../../discovery/types.js';\nimport type { TextInputState } from './useTextInput.js';\nimport type { Panel } from '../App.js';\n\ntype InputMode = 'normal' | 'nickname' | 'filter';\n\nconst matchKey = (binding: string, input: string, key: Record<string, unknown>): boolean => {\n if (binding === 'tab') return Boolean(key.tab);\n if (binding === 'shift+tab') return Boolean(key.shift && key.tab);\n if (binding === 'enter') return Boolean(key.return);\n return input === binding;\n};\n\nexport interface KeyHandlerDeps {\n kb: KeybindingsConfig;\n activePanel: Panel;\n splitMode: boolean;\n inputMode: InputMode;\n showSetup: boolean;\n showSettings: boolean;\n showDetail: boolean;\n leftShowDetail: boolean;\n rightShowDetail: boolean;\n confirmAction: unknown;\n selectedSession: Session | null;\n leftSession: Session | null;\n rightSession: Session | null;\n leftScroll: number;\n rightScroll: number;\n leftFilter: string;\n rightFilter: string;\n filter: string;\n activityFilter: string;\n viewingArchive: boolean;\n archivedIds: Set<string>;\n maxScroll: number;\n leftMaxScroll: number;\n rightMaxScroll: number;\n updateInfo: { available: boolean; latest?: string } | null;\n\n exit: () => void;\n selectNext: () => void;\n selectPrev: () => void;\n refresh: () => void;\n switchPanel: (dir: 'next' | 'prev') => void;\n clearSplitState: () => void;\n resetPanel: (side: 'left' | 'right') => void;\n getActiveFilter: () => string;\n\n setActivePanel: (p: Panel | ((p: Panel) => Panel)) => void;\n setInputMode: (m: InputMode) => void;\n setFilter: (v: string) => void;\n setActivityFilter: (v: string) => void;\n setLeftFilter: (v: string) => void;\n setRightFilter: (v: string) => void;\n setShowDetail: (v: boolean) => void;\n setLeftShowDetail: (v: boolean | ((d: boolean) => boolean)) => void;\n setRightShowDetail: (v: boolean | ((d: boolean) => boolean)) => void;\n setShowSettings: (v: boolean) => void;\n setViewingArchive: (v: boolean | ((v: boolean) => boolean)) => void;\n setSplitMode: (v: boolean) => void;\n setLeftSession: (v: Session | null) => void;\n setRightSession: (v: Session | null) => void;\n setLeftScroll: (v: number | ((s: number) => number)) => void;\n setRightScroll: (v: number | ((s: number) => number)) => void;\n setActivityScroll: (v: number | ((s: number) => number)) => void;\n setConfirmAction: (v: { title: string; message: string; onConfirm: () => void } | null) => void;\n setUpdateStatus: (v: string) => void;\n\n nicknameInput: TextInputState;\n filterInput: TextInputState;\n\n onNickname: (sessionId: string) => void;\n onClearNickname: (sessionId: string) => void;\n onArchive: (sessionId: string) => void;\n onUnarchive: (sessionId: string) => void;\n onDelete: (sess: Session) => void;\n onUpdate: () => void;\n}\n\nexport const useKeyHandler = (deps: KeyHandlerDeps): void => {\n const d = deps;\n\n useInput((input, key) => {\n if (d.showSetup || d.showSettings || d.confirmAction) return;\n\n if (d.inputMode === 'nickname') {\n d.nicknameInput.handleInput(input, key);\n return;\n }\n if (d.inputMode === 'filter') {\n if (key.escape) {\n if (d.activePanel === 'sessions') d.setFilter('');\n else if (d.activePanel === 'left') d.setLeftFilter('');\n else if (d.activePanel === 'right') d.setRightFilter('');\n else d.setActivityFilter('');\n d.setInputMode('normal');\n d.filterInput.cancel();\n return;\n }\n d.filterInput.handleInput(input, key);\n return;\n }\n\n if (matchKey(d.kb.quit, input, key)) {\n d.exit();\n return;\n }\n\n if (d.showDetail && !d.splitMode) {\n if (key.escape || key.return || key.leftArrow) d.setShowDetail(false);\n return;\n }\n if (d.splitMode && (d.leftShowDetail || d.rightShowDetail)) {\n if (key.escape || key.return) {\n if (d.activePanel === 'left') d.setLeftShowDetail(false);\n else if (d.activePanel === 'right') d.setRightShowDetail(false);\n else {\n d.setLeftShowDetail(false);\n d.setRightShowDetail(false);\n }\n return;\n }\n if (key.leftArrow) {\n if (d.activePanel === 'left') d.setLeftShowDetail(false);\n else if (d.activePanel === 'right') d.setRightShowDetail(false);\n return;\n }\n }\n\n if (matchKey(d.kb.split, input, key)) {\n if (d.splitMode) {\n d.clearSplitState();\n } else {\n d.setSplitMode(true);\n d.setLeftSession(d.selectedSession);\n d.setActivePanel('left');\n }\n return;\n }\n\n if (d.splitMode && d.activePanel === 'sessions' && d.selectedSession) {\n if (matchKey(d.kb.pinLeft, input, key)) {\n d.resetPanel('left');\n d.setLeftSession(d.selectedSession);\n return;\n }\n if (matchKey(d.kb.pinRight, input, key)) {\n d.resetPanel('right');\n d.setRightSession(d.selectedSession);\n return;\n }\n }\n\n if (d.splitMode && matchKey(d.kb.swapPanels, input, key)) {\n const tmpLs = d.leftSession;\n const tmpRs = d.rightSession;\n d.setLeftSession(tmpRs);\n d.setRightSession(tmpLs);\n const tmpScroll = d.leftScroll;\n d.setLeftScroll(d.rightScroll);\n d.setRightScroll(tmpScroll);\n const tmpFilt = d.leftFilter;\n d.setLeftFilter(d.rightFilter);\n d.setRightFilter(tmpFilt);\n const tmpDetail = d.leftShowDetail;\n d.setLeftShowDetail(d.rightShowDetail);\n d.setRightShowDetail(tmpDetail);\n return;\n }\n\n if (d.splitMode && matchKey(d.kb.closePanel, input, key)) {\n if (d.activePanel === 'left') {\n d.resetPanel('left');\n if (!d.rightSession) d.clearSplitState();\n } else if (d.activePanel === 'right') {\n d.resetPanel('right');\n if (!d.leftSession) d.clearSplitState();\n }\n return;\n }\n\n if (matchKey(d.kb.detail, input, key) && d.selectedSession) {\n if (d.splitMode) {\n if (d.activePanel === 'left') {\n d.setLeftShowDetail((v) => !v);\n return;\n }\n if (d.activePanel === 'right') {\n d.setRightShowDetail((v) => !v);\n return;\n }\n if (d.activePanel === 'sessions') {\n if (!d.leftSession) {\n d.setLeftSession(d.selectedSession);\n d.setLeftShowDetail(true);\n d.setActivePanel('left');\n } else if (!d.rightSession) {\n d.setRightSession(d.selectedSession);\n d.setRightShowDetail(true);\n d.setActivePanel('right');\n }\n return;\n }\n } else if (d.activePanel === 'sessions') {\n d.setShowDetail(true);\n return;\n }\n }\n\n if (matchKey(d.kb.panelNext, input, key) || key.rightArrow) {\n d.switchPanel('next');\n return;\n }\n if (matchKey(d.kb.panelPrev, input, key) || key.leftArrow) {\n d.switchPanel('prev');\n return;\n }\n\n if (matchKey(d.kb.nickname, input, key) && d.selectedSession) {\n d.setInputMode('nickname');\n d.nicknameInput.start(d.selectedSession.nickname || '');\n return;\n }\n if (matchKey(d.kb.clearNickname, input, key) && d.selectedSession) {\n d.onClearNickname(d.selectedSession.sessionId);\n return;\n }\n if (matchKey(d.kb.filter, input, key)) {\n d.setInputMode('filter');\n d.filterInput.start(d.getActiveFilter());\n return;\n }\n if (key.escape) {\n if (d.activePanel === 'sessions' && d.filter) {\n d.setFilter('');\n return;\n }\n if (d.activePanel === 'activity' && d.activityFilter) {\n d.setActivityFilter('');\n return;\n }\n if (d.activePanel === 'left' && d.leftFilter) {\n d.setLeftFilter('');\n return;\n }\n if (d.activePanel === 'right' && d.rightFilter) {\n d.setRightFilter('');\n return;\n }\n return;\n }\n if (matchKey(d.kb.settings, input, key)) {\n d.setShowSettings(true);\n return;\n }\n if (matchKey(d.kb.viewArchive, input, key)) {\n d.setViewingArchive((v) => !v);\n return;\n }\n if (matchKey(d.kb.archive, input, key) && d.selectedSession) {\n if (d.viewingArchive) d.onUnarchive(d.selectedSession.sessionId);\n else d.onArchive(d.selectedSession.sessionId);\n return;\n }\n if (matchKey(d.kb.delete, input, key) && d.selectedSession) {\n d.onDelete(d.selectedSession);\n return;\n }\n if (matchKey(d.kb.update, input, key) && d.updateInfo?.available) {\n d.onUpdate();\n return;\n }\n\n if (d.activePanel === 'sessions') {\n if (matchKey(d.kb.navDown, input, key) || key.downArrow) d.selectNext();\n if (matchKey(d.kb.navUp, input, key) || key.upArrow) d.selectPrev();\n }\n if (d.activePanel === 'activity') {\n if (matchKey(d.kb.navUp, input, key) || key.upArrow) d.setActivityScroll((s) => Math.min(s + 1, d.maxScroll));\n if (matchKey(d.kb.navDown, input, key) || key.downArrow) d.setActivityScroll((s) => Math.max(s - 1, 0));\n if (matchKey(d.kb.scrollBottom, input, key)) d.setActivityScroll(0);\n if (matchKey(d.kb.scrollTop, input, key)) d.setActivityScroll(d.maxScroll);\n }\n if (d.activePanel === 'left') {\n if (matchKey(d.kb.navUp, input, key) || key.upArrow) d.setLeftScroll((s) => Math.min(s + 1, d.leftMaxScroll));\n if (matchKey(d.kb.navDown, input, key) || key.downArrow) d.setLeftScroll((s) => Math.max(s - 1, 0));\n if (matchKey(d.kb.scrollBottom, input, key)) d.setLeftScroll(0);\n if (matchKey(d.kb.scrollTop, input, key)) d.setLeftScroll(d.leftMaxScroll);\n }\n if (d.activePanel === 'right') {\n if (matchKey(d.kb.navUp, input, key) || key.upArrow) d.setRightScroll((s) => Math.min(s + 1, d.rightMaxScroll));\n if (matchKey(d.kb.navDown, input, key) || key.downArrow) d.setRightScroll((s) => Math.max(s - 1, 0));\n if (matchKey(d.kb.scrollBottom, input, key)) d.setRightScroll(0);\n if (matchKey(d.kb.scrollTop, input, key)) d.setRightScroll(d.rightMaxScroll);\n }\n });\n};\n","import { useState, useEffect } from 'react';\n\nimport { checkForUpdate } from '../../updates.js';\nimport type { UpdateInfo } from '../../updates.js';\n\nexport const useUpdateChecker = (\n disabled: boolean,\n checkOnLaunch: boolean,\n checkInterval: number,\n): UpdateInfo | null => {\n const [updateInfo, setUpdateInfo] = useState<UpdateInfo | null>(null);\n\n useEffect(() => {\n if (disabled || !checkOnLaunch) return;\n try {\n const i = checkForUpdate();\n if (i.available) setUpdateInfo(i);\n } catch {\n /* */\n }\n const iv = setInterval(() => {\n try {\n const i = checkForUpdate();\n if (i.available) setUpdateInfo(i);\n } catch {\n /* */\n }\n }, checkInterval);\n return () => clearInterval(iv);\n }, []);\n\n return updateInfo;\n};\n","import type { CLIOptions, ToolCall, SecurityEvent, TokenUsage } from './discovery/types.js';\nimport { discoverSessions } from './discovery/sessions.js';\nimport { Watcher } from './ingestion/watcher.js';\nimport { SecurityEngine } from './analysis/security.js';\n\nconst write = (msg: string): void => {\n process.stdout.write(msg + '\\n');\n};\n\nconst formatTokens = (n: number): string => {\n if (n >= 1_000_000) return (n / 1_000_000).toFixed(1) + 'M';\n if (n >= 1_000) return (n / 1_000).toFixed(1) + 'k';\n return String(n);\n};\n\nexport const runStreamMode = (options: CLIOptions, isJson: boolean): void => {\n const engine = options.noSecurity ? null : new SecurityEngine(options.alertLevel);\n\n const sessions = discoverSessions(options.allUsers);\n if (isJson) {\n write(JSON.stringify({ type: 'sessions', data: sessions }));\n } else {\n for (const s of sessions) {\n write(\n `SESSION ${s.slug} | ${s.model} | ${s.cwd} | CPU ${s.cpu}% | ${s.memMB}MB | ${formatTokens(s.usage.inputTokens)} in / ${formatTokens(s.usage.outputTokens)} out`,\n );\n }\n }\n\n const handler = (calls: ToolCall[]) => {\n for (const call of calls) {\n if (isJson) {\n write(JSON.stringify({ type: 'tool_call', data: call }));\n } else {\n const ts = new Date(call.timestamp).toLocaleTimeString('en-GB', { hour12: false });\n const input =\n call.toolName === 'Bash'\n ? String(call.toolInput.command || '').slice(0, 80)\n : JSON.stringify(call.toolInput).slice(0, 80);\n write(`${ts} ${call.slug} ${call.toolName.padEnd(8)} ${input}`);\n }\n }\n };\n\n const securityHandler = engine\n ? (events: SecurityEvent[]) => {\n for (const event of events) {\n const alerts = engine.analyzeEvent(event);\n for (const alert of alerts) {\n if (isJson) {\n write(JSON.stringify({ type: 'alert', data: alert }));\n } else {\n const ts = new Date(alert.timestamp).toLocaleTimeString('en-GB', { hour12: false });\n write(`ALERT ${ts} [${alert.severity}] ${alert.sessionSlug}: ${alert.message}`);\n }\n }\n }\n }\n : undefined;\n\n const usageHandler = (sessionId: string, usage: TokenUsage) => {\n if (isJson) {\n write(JSON.stringify({ type: 'usage', data: { sessionId, usage } }));\n } else {\n write(\n `USAGE ${sessionId.slice(0, 12)} +${formatTokens(usage.inputTokens)} in / +${formatTokens(usage.outputTokens)} out`,\n );\n }\n };\n\n const watcher = new Watcher(handler, options.allUsers, securityHandler, usageHandler);\n watcher.start();\n\n process.on('SIGINT', () => {\n watcher.stop();\n process.exit(0);\n });\n process.on('SIGTERM', () => {\n watcher.stop();\n process.exit(0);\n });\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,gBAAAA,qBAAoB;AAC7B,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAC9B,SAAS,iBAAAC,sBAAqB;AAE9B,OAAOC,aAAW;AAClB,SAAS,cAAc;;;ACLvB,SAAgB,YAAAC,YAAU,aAAAC,YAAW,eAAAC,oBAAmB;AACxD,SAAS,OAAAC,OAAK,QAAAC,QAAM,QAAQ,aAAAC,kBAAiB;;;ACiCtC,IAAM,aAAoC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,kBAAwC;AAAA,EACnD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,mBAAmB,CAAC,OAAgC;AAAA,EACxD,MAAM,EAAE;AAAA,EACR,MAAM,EAAE;AAAA,EACR,OAAO,EAAE;AAAA,EACT,MAAM,EAAE;AAAA,EACR,MAAM,EAAE;AAAA,EACR,MAAM,EAAE;AAAA,EACR,MAAM,EAAE;AAAA,EACR,UAAU,EAAE;AAAA,EACZ,WAAW,EAAE;AACf;AAoBA,IAAM,YAAY,CAAC;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,OAAqC;AAAA,EACnC;AAAA,EACA,SAAS;AAAA,EACT,QAAQ,EAAE,SAAS,WAAW,QAAQ,SAAS,OAAO,UAAU,OAAO,MAAM,QAAQ,QAAQ,UAAU,OAAO;AAAA,EAC9G,YAAY,iBAAiB;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,IAAM,UAAyB;AAAA,EAC7B;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA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","names":["readFileSync","join","dirname","fileURLToPath","React","useState","useEffect","useCallback","Box","Text","useStdout","readFileSync","writeFileSync","mkdirSync","join","homedir","readFileSync","join","dirname","fileURLToPath","React","Box","Text","jsx","jsxs","React","Box","Text","React","Box","Text","jsx","jsxs","React","Box","Text","React","Box","Text","jsx","jsxs","formatTime","React","Box","Text","React","Box","Text","jsx","jsxs","formatTokens","formatModel","React","Box","Text","React","useState","Box","Text","jsx","jsxs","React","useState","Box","Text","React","Box","Text","jsx","jsxs","React","Box","Text","React","useState","useEffect","Box","Text","useInput","jsx","jsxs","label","React","useState","useEffect","useInput","kbKey","Box","Text","React","useState","useRef","useEffect","Box","Text","useInput","useStdout","React","useState","Box","Text","useInput","jsx","jsxs","React","useState","useInput","Box","Text","jsx","jsxs","React","useStdout","useState","useRef","useEffect","useInput","Box","Text","React","useState","useEffect","Box","Text","useInput","jsx","jsxs","React","useState","useEffect","useInput","Text","Box","React","useState","Box","Text","useInput","jsx","jsxs","React","useState","useInput","Box","Text","React","Box","Text","useInput","jsx","jsxs","React","useInput","Box","Text","React","Box","jsx","jsxs","React","Box","useState","useEffect","useCallback","useRef","useState","useRef","useCallback","useEffect","useState","useEffect","useRef","useState","useRef","useEffect","useMemo","useState","useEffect","useRef","exec","mkdirSync","dirname","mkdirSync","dirname","useState","useRef","useEffect","useState","useCallback","useInput","useState","useEffect","useState","useEffect","jsx","jsxs","useStdout","useState","useCallback","useEffect","Box","Text","formatTokens","fileURLToPath","join","dirname","readFileSync","write","React"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx","../src/ui/App.tsx","../src/config/themes.ts","../src/hooks/installer.ts","../src/install-mcp.ts","../src/updates.ts","../src/ui/components/StatusBar.tsx","../src/ui/theme.ts","../src/ui/components/SessionList.tsx","../src/ui/components/ActivityFeed.tsx","../src/ui/components/AlertBar.tsx","../src/ui/components/SessionDetail.tsx","../src/ui/components/SetupModal.tsx","../src/ui/components/FooterBar.tsx","../src/ui/components/SettingsMenu.tsx","../src/ui/components/ThemeMenu.tsx","../src/ui/components/ThemeEditor.tsx","../src/ui/components/ThemePickerModal.tsx","../src/ui/components/GuidedTour.tsx","../src/ui/components/ConfirmModal.tsx","../src/ui/components/SplitPanel.tsx","../src/ui/hooks/useSessions.ts","../src/ui/hooks/useActivityStream.ts","../src/ui/hooks/useFilteredEvents.ts","../src/ui/hooks/useAlerts.ts","../src/notifications.ts","../src/alerts/logger.ts","../src/ui/hooks/useTextInput.ts","../src/ui/hooks/useKeyHandler.ts","../src/ui/hooks/useUpdateChecker.ts","../src/stream.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport React from 'react';\nimport { render } from 'ink';\n\nimport type { AlertSeverity, CLIOptions } from './discovery/types.js';\nimport { App } from './ui/App.js';\nimport { installHooks, uninstallHooks } from './hooks/installer.js';\nimport { loadConfig, saveConfig, isFirstRun } from './config/store.js';\nimport { startMcpServer } from './mcp/server.js';\nimport { runStreamMode } from './stream.js';\nimport { installMcpConfig } from './install-mcp.js';\n\nconst getVersion = (): string => {\n try {\n const thisFile = fileURLToPath(import.meta.url);\n const pkgPath = join(dirname(thisFile), '..', 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n return pkg.version || '0.0.0';\n } catch {\n return '0.0.0';\n }\n};\n\nconst VERSION = getVersion();\n\nconst HELP = `agenttop v${VERSION} -- Real-time dashboard for AI coding agent sessions\n\nUsage: agenttop [options]\n\nOptions:\n --all-users Monitor all users (root only)\n --no-security Disable security analysis\n --json Stream events as JSON lines (no TUI)\n --plain Stream events as plain text (no TUI)\n --alert-level <l> Minimum: info|warn|high|critical (default: warn)\n --no-notify Disable all notifications\n --no-alert-log Disable alert file logging\n --no-updates Disable update checks\n --poll-interval <ms> Session discovery interval (default: 10000)\n --mcp Start as MCP server (for Claude Code integration)\n --install-mcp Register agenttop as MCP server in Claude Code\n --install-hooks Install Claude Code PostToolUse hook for active protection\n --uninstall-hooks Remove agenttop hooks from Claude Code\n --version Show version\n --help Show this help\n\nStreaming modes (--json / --plain):\n Stream session events to stdout for piping into other tools.\n --json outputs one JSON object per line (JSONL format).\n --plain outputs human-readable lines.\n\n Examples:\n agenttop --json | jq 'select(.type == \"alert\")'\n agenttop --plain | grep ALERT\n agenttop --json --no-security # stream tool calls only\n`;\n\nconst write = (msg: string): void => {\n process.stdout.write(msg + '\\n');\n};\n\nconst parseArgs = (argv: string[]): CLIOptions => {\n const args = argv.slice(2);\n const options: CLIOptions = {\n allUsers: false,\n noSecurity: false,\n json: false,\n plain: false,\n alertLevel: 'warn',\n installHooks: false,\n uninstallHooks: false,\n help: false,\n version: false,\n noNotify: false,\n noAlertLog: false,\n noUpdates: false,\n pollInterval: 10000,\n mcp: false,\n installMcp: false,\n };\n\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case '--all-users':\n options.allUsers = true;\n break;\n case '--no-security':\n options.noSecurity = true;\n break;\n case '--json':\n options.json = true;\n break;\n case '--plain':\n options.plain = true;\n break;\n case '--alert-level':\n i++;\n if (['info', 'warn', 'high', 'critical'].includes(args[i])) {\n options.alertLevel = args[i] as AlertSeverity;\n }\n break;\n case '--no-notify':\n options.noNotify = true;\n break;\n case '--no-alert-log':\n options.noAlertLog = true;\n break;\n case '--no-updates':\n options.noUpdates = true;\n break;\n case '--poll-interval':\n i++;\n {\n const n = parseInt(args[i], 10);\n if (n > 0) options.pollInterval = n;\n }\n break;\n case '--mcp':\n options.mcp = true;\n break;\n case '--install-mcp':\n options.installMcp = true;\n break;\n case '--install-hooks':\n options.installHooks = true;\n break;\n case '--uninstall-hooks':\n options.uninstallHooks = true;\n break;\n case '--version':\n options.version = true;\n break;\n case '--help':\n options.help = true;\n break;\n }\n }\n\n return options;\n};\n\nconst main = () => {\n const options = parseArgs(process.argv);\n\n if (options.version) {\n write(`agenttop v${VERSION}`);\n process.exit(0);\n }\n if (options.help) {\n write(HELP);\n process.exit(0);\n }\n if (options.installHooks) {\n installHooks();\n process.exit(0);\n }\n if (options.uninstallHooks) {\n uninstallHooks();\n process.exit(0);\n }\n if (options.installMcp) {\n installMcpConfig();\n process.exit(0);\n }\n\n if (options.mcp) {\n startMcpServer(options.allUsers, options.noSecurity).catch((err) => {\n process.stderr.write(`mcp server error: ${err}\\n`);\n process.exit(1);\n });\n return;\n }\n\n if (options.json || options.plain) {\n runStreamMode(options, options.json);\n return;\n }\n\n const config = loadConfig();\n const firstRun = isFirstRun();\n\n if (options.noNotify) {\n config.notifications.bell = false;\n config.notifications.desktop = false;\n }\n if (options.noAlertLog) config.alerts.enabled = false;\n if (options.noUpdates) config.updates.checkOnLaunch = false;\n if (options.noSecurity) config.security.enabled = false;\n\n if (firstRun) saveConfig(config);\n\n render(React.createElement(App, { options, config, version: VERSION, firstRun }));\n};\n\nmain();\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { Box, Text, useApp, useStdout } from 'ink';\n\nimport type { CLIOptions, Session } from '../discovery/types.js';\nimport type { Config } from '../config/store.js';\nimport {\n setNickname,\n clearNickname,\n saveConfig,\n archiveSession,\n unarchiveSession,\n getArchived,\n purgeExpiredArchives,\n deleteSessionFiles,\n} from '../config/store.js';\nimport { resolveTheme } from '../config/themes.js';\nimport { installHooks } from '../hooks/installer.js';\nimport { installMcpConfig } from '../install-mcp.js';\nimport { installUpdate } from '../updates.js';\nimport { StatusBar } from './components/StatusBar.js';\nimport { SessionList } from './components/SessionList.js';\nimport { ActivityFeed } from './components/ActivityFeed.js';\nimport { AlertBar } from './components/AlertBar.js';\nimport { SessionDetail } from './components/SessionDetail.js';\nimport { SetupModal } from './components/SetupModal.js';\nimport { FooterBar } from './components/FooterBar.js';\nimport { SettingsMenu } from './components/SettingsMenu.js';\nimport { ThemeMenu } from './components/ThemeMenu.js';\nimport { ThemePickerModal } from './components/ThemePickerModal.js';\nimport { GuidedTour } from './components/GuidedTour.js';\nimport { ConfirmModal } from './components/ConfirmModal.js';\nimport { SplitPanel } from './components/SplitPanel.js';\nimport { useSessions } from './hooks/useSessions.js';\nimport { useActivityStream } from './hooks/useActivityStream.js';\nimport { useFilteredEvents } from './hooks/useFilteredEvents.js';\nimport { useAlerts } from './hooks/useAlerts.js';\nimport { useTextInput } from './hooks/useTextInput.js';\nimport { useKeyHandler } from './hooks/useKeyHandler.js';\nimport { useUpdateChecker } from './hooks/useUpdateChecker.js';\nimport { colors, applyTheme } from './theme.js';\n\nexport type Panel = 'sessions' | 'activity' | 'left' | 'right';\n\ninterface AppProps {\n options: CLIOptions;\n config: Config;\n version: string;\n firstRun: boolean;\n}\n\nexport const App: React.FC<AppProps> = ({ options, config: initialConfig, version, firstRun }) => {\n const { exit } = useApp();\n const { stdout } = useStdout();\n const termHeight = stdout?.rows ?? 40;\n const [liveConfig, setLiveConfig] = useState(initialConfig);\n const kb = liveConfig.keybindings;\n\n const [activePanel, setActivePanel] = useState<Panel>('sessions');\n const [activityScroll, setActivityScroll] = useState(0);\n const [inputMode, setInputMode] = useState<'normal' | 'nickname' | 'filter'>('normal');\n const [showSetup, setShowSetup] = useState(firstRun);\n const [showThemePicker, setShowThemePicker] = useState(false);\n const [showTour, setShowTour] = useState(false);\n const [filter, setFilter] = useState('');\n const [activityFilter, setActivityFilter] = useState('');\n const [updateStatus, setUpdateStatus] = useState('');\n const [showDetail, setShowDetail] = useState(false);\n const [showSettings, setShowSettings] = useState(false);\n const [showThemeMenu, setShowThemeMenu] = useState(false);\n const [viewingArchive, setViewingArchive] = useState(false);\n const [confirmAction, setConfirmAction] = useState<{ title: string; message: string; onConfirm: () => void } | null>(\n null,\n );\n const [archivedIds, setArchivedIds] = useState<Set<string>>(() => new Set(Object.keys(getArchived())));\n\n const [splitMode, setSplitMode] = useState(false);\n const [leftSession, setLeftSession] = useState<Session | null>(null);\n const [rightSession, setRightSession] = useState<Session | null>(null);\n const [leftScroll, setLeftScroll] = useState(0);\n const [rightScroll, setRightScroll] = useState(0);\n const [leftFilter, setLeftFilter] = useState('');\n const [rightFilter, setRightFilter] = useState('');\n const [leftShowDetail, setLeftShowDetail] = useState(false);\n const [rightShowDetail, setRightShowDetail] = useState(false);\n\n const refreshArchived = useCallback(() => setArchivedIds(new Set(Object.keys(getArchived()))), []);\n const updateInfo = useUpdateChecker(\n options.noUpdates,\n liveConfig.updates.checkOnLaunch,\n liveConfig.updates.checkInterval,\n );\n\n useEffect(() => {\n applyTheme(resolveTheme(liveConfig.theme, liveConfig.customThemes));\n }, [liveConfig.theme, liveConfig.customThemes]);\n\n const { sessions, selectedSession, selectedIndex, selectNext, selectPrev, refresh } = useSessions(\n options.allUsers,\n filter || undefined,\n archivedIds,\n viewingArchive,\n );\n\n const rawEvents = useActivityStream(splitMode ? null : selectedSession, options.allUsers);\n const leftRawEvents = useActivityStream(splitMode ? leftSession : null, options.allUsers);\n const rightRawEvents = useActivityStream(splitMode ? rightSession : null, options.allUsers);\n const events = useFilteredEvents(rawEvents, activityFilter);\n const leftEvents = useFilteredEvents(leftRawEvents, leftFilter);\n const rightEvents = useFilteredEvents(rightRawEvents, rightFilter);\n const { alerts } = useAlerts(!options.noSecurity, options.alertLevel, options.allUsers, liveConfig);\n\n const nicknameInput = useTextInput(\n (value) => {\n if (selectedSession && value.trim()) {\n setNickname(selectedSession.sessionId, value.trim());\n refresh();\n }\n setInputMode('normal');\n },\n () => setInputMode('normal'),\n );\n const filterInput = useTextInput(\n (value) => {\n if (activePanel === 'sessions') setFilter(value);\n else if (activePanel === 'left') setLeftFilter(value);\n else if (activePanel === 'right') setRightFilter(value);\n else setActivityFilter(value);\n setInputMode('normal');\n },\n () => {\n if (activePanel === 'sessions') setFilter('');\n else if (activePanel === 'left') setLeftFilter('');\n else if (activePanel === 'right') setRightFilter('');\n else setActivityFilter('');\n setInputMode('normal');\n },\n );\n\n useEffect(() => {\n purgeExpiredArchives();\n refreshArchived();\n }, []);\n useEffect(() => {\n setActivityScroll(0);\n }, [selectedSession?.sessionId]);\n\n const alertHeight = options.noSecurity ? 0 : 6;\n const mainHeight = termHeight - 3 - alertHeight - 1 - (inputMode !== 'normal' ? 1 : 0);\n const viewportRows = mainHeight - 2;\n\n const handleSettingsClose = useCallback((c: Config) => {\n setLiveConfig(c);\n saveConfig(c);\n setShowSettings(false);\n }, []);\n const handleThemeMenuClose = useCallback((c: Config) => {\n setLiveConfig(c);\n saveConfig(c);\n setShowThemeMenu(false);\n setShowSettings(true);\n }, []);\n const handleOpenThemeMenu = useCallback(() => setShowThemeMenu(true), []);\n\n const handleSetupComplete = useCallback(\n (results: Array<'yes' | 'not_now' | 'dismiss'>) => {\n const nc = { ...liveConfig };\n const [hc, mc] = results;\n if (hc === 'yes') {\n try {\n installHooks();\n } catch {\n /**/\n }\n nc.prompts.hook = 'installed';\n } else if (hc === 'dismiss') nc.prompts.hook = 'dismissed';\n if (mc === 'yes') {\n try {\n installMcpConfig();\n } catch {\n /**/\n }\n nc.prompts.mcp = 'installed';\n } else if (mc === 'dismiss') nc.prompts.mcp = 'dismissed';\n saveConfig(nc);\n setShowSetup(false);\n if (nc.prompts.theme === 'pending') setShowThemePicker(true);\n else if (nc.prompts.tour === 'pending') setShowTour(true);\n },\n [liveConfig],\n );\n\n const handleThemePickerSelect = useCallback(\n (themeName: string) => {\n const nc = { ...liveConfig, theme: themeName, prompts: { ...liveConfig.prompts, theme: 'done' as const } };\n setLiveConfig(nc);\n saveConfig(nc);\n setShowThemePicker(false);\n if (nc.prompts.tour === 'pending') setShowTour(true);\n },\n [liveConfig],\n );\n const handleThemePickerSkip = useCallback(() => {\n setShowThemePicker(false);\n if (liveConfig.prompts.tour === 'pending') setShowTour(true);\n }, [liveConfig]);\n const handleThemePickerDismiss = useCallback(() => {\n const nc = { ...liveConfig, prompts: { ...liveConfig.prompts, theme: 'dismissed' as const } };\n setLiveConfig(nc);\n saveConfig(nc);\n setShowThemePicker(false);\n if (nc.prompts.tour === 'pending') setShowTour(true);\n }, [liveConfig]);\n\n const handleTourComplete = useCallback(() => {\n const nc = { ...liveConfig, prompts: { ...liveConfig.prompts, tour: 'done' as const } };\n setLiveConfig(nc);\n saveConfig(nc);\n setShowTour(false);\n }, [liveConfig]);\n const handleTourSkip = useCallback(() => {\n setShowTour(false);\n }, []);\n\n const switchPanel = useCallback(\n (dir: 'next' | 'prev') => {\n if (splitMode) {\n const order: Panel[] = ['sessions', 'left', 'right'];\n setActivePanel((p) => {\n const idx = order.indexOf(p);\n if (idx === -1) return 'sessions';\n return dir === 'next' ? order[(idx + 1) % order.length] : order[(idx - 1 + order.length) % order.length];\n });\n } else {\n setActivePanel((p) => (p === 'sessions' ? 'activity' : 'sessions'));\n }\n },\n [splitMode],\n );\n\n const getActiveFilter = useCallback(() => {\n if (activePanel === 'sessions') return filter;\n if (activePanel === 'left') return leftFilter;\n if (activePanel === 'right') return rightFilter;\n return activityFilter;\n }, [activePanel, filter, leftFilter, rightFilter, activityFilter]);\n\n const clearSplitState = useCallback(() => {\n setSplitMode(false);\n setLeftSession(null);\n setRightSession(null);\n setLeftScroll(0);\n setRightScroll(0);\n setLeftFilter('');\n setRightFilter('');\n setLeftShowDetail(false);\n setRightShowDetail(false);\n setActivePanel('sessions');\n }, []);\n\n const resetPanel = useCallback((side: 'left' | 'right') => {\n if (side === 'left') {\n setLeftSession(null);\n setLeftScroll(0);\n setLeftFilter('');\n setLeftShowDetail(false);\n } else {\n setRightSession(null);\n setRightScroll(0);\n setRightFilter('');\n setRightShowDetail(false);\n }\n }, []);\n\n useKeyHandler({\n kb,\n activePanel,\n splitMode,\n inputMode,\n showSetup,\n showSettings: showSettings || showThemeMenu || showThemePicker || showTour,\n showDetail,\n leftShowDetail,\n rightShowDetail,\n confirmAction,\n selectedSession,\n leftSession,\n rightSession,\n leftScroll,\n rightScroll,\n leftFilter,\n rightFilter,\n filter,\n activityFilter,\n viewingArchive,\n archivedIds,\n updateInfo,\n maxScroll: Math.max(0, events.length - viewportRows),\n leftMaxScroll: Math.max(0, leftEvents.length - viewportRows),\n rightMaxScroll: Math.max(0, rightEvents.length - viewportRows),\n exit,\n selectNext,\n selectPrev,\n refresh,\n switchPanel,\n clearSplitState,\n resetPanel,\n getActiveFilter,\n setActivePanel,\n setInputMode,\n setFilter,\n setActivityFilter,\n setLeftFilter,\n setRightFilter,\n setShowDetail,\n setLeftShowDetail,\n setRightShowDetail,\n setShowSettings,\n setViewingArchive,\n setSplitMode,\n setLeftSession,\n setRightSession,\n setLeftScroll,\n setRightScroll,\n setActivityScroll,\n setConfirmAction,\n setUpdateStatus,\n nicknameInput,\n filterInput,\n onNickname: (id) => {\n clearNickname(id);\n refresh();\n },\n onClearNickname: (id) => {\n clearNickname(id);\n refresh();\n },\n onArchive: (id) => {\n archiveSession(id);\n refreshArchived();\n refresh();\n },\n onUnarchive: (id) => {\n unarchiveSession(id);\n refreshArchived();\n refresh();\n },\n onDelete: (sess) =>\n setConfirmAction({\n title: 'Delete session?',\n message: `Delete ${sess.nickname || sess.slug}? Output files will be removed.`,\n onConfirm: () => {\n deleteSessionFiles(sess.outputFiles);\n clearNickname(sess.sessionId);\n if (archivedIds.has(sess.sessionId)) {\n unarchiveSession(sess.sessionId);\n refreshArchived();\n }\n refresh();\n setConfirmAction(null);\n },\n }),\n onUpdate: () => {\n setUpdateStatus('updating...');\n installUpdate()\n .then(() => setUpdateStatus(`updated to v${updateInfo?.latest} — restart to apply`))\n .catch(() => setUpdateStatus('update failed'));\n },\n });\n\n if (showSetup) {\n const steps = [\n ...(liveConfig.prompts.hook === 'pending'\n ? [\n {\n title: 'Install Claude Code hook?',\n description: 'Adds a PostToolUse hook that blocks prompt injection attempts in real-time.',\n },\n ]\n : []),\n ...(liveConfig.prompts.mcp === 'pending'\n ? [\n {\n title: 'Install MCP server?',\n description: 'Registers agenttop as an MCP server so Claude Code can query session status and alerts.',\n },\n ]\n : []),\n ];\n if (steps.length === 0) {\n setShowSetup(false);\n if (liveConfig.prompts.theme === 'pending') setShowThemePicker(true);\n else if (liveConfig.prompts.tour === 'pending') setShowTour(true);\n return null;\n }\n return <SetupModal steps={steps} onComplete={handleSetupComplete} />;\n }\n if (showThemePicker) {\n return (\n <ThemePickerModal\n onSelect={handleThemePickerSelect}\n onSkip={handleThemePickerSkip}\n onDismiss={handleThemePickerDismiss}\n />\n );\n }\n if (showTour) return <GuidedTour onComplete={handleTourComplete} onSkip={handleTourSkip} />;\n if (showThemeMenu) return <ThemeMenu config={liveConfig} onClose={handleThemeMenuClose} />;\n if (showSettings)\n return <SettingsMenu config={liveConfig} onClose={handleSettingsClose} onOpenThemeMenu={handleOpenThemeMenu} />;\n if (confirmAction) {\n return (\n <Box flexDirection=\"column\" height={termHeight} justifyContent=\"center\" alignItems=\"center\">\n <ConfirmModal\n title={confirmAction.title}\n message={confirmAction.message}\n onConfirm={confirmAction.onConfirm}\n onCancel={() => setConfirmAction(null)}\n />\n </Box>\n );\n }\n\n const filterLabel =\n activePanel === 'sessions'\n ? 'sessions'\n : activePanel === 'left'\n ? 'left'\n : activePanel === 'right'\n ? 'right'\n : 'activity';\n const rightPanel = splitMode ? (\n <SplitPanel\n activePanel={activePanel}\n leftSession={leftSession}\n rightSession={rightSession}\n leftEvents={leftEvents}\n rightEvents={rightEvents}\n leftScroll={leftScroll}\n rightScroll={rightScroll}\n leftFilter={leftFilter}\n rightFilter={rightFilter}\n leftShowDetail={leftShowDetail}\n rightShowDetail={rightShowDetail}\n height={mainHeight}\n />\n ) : showDetail && selectedSession ? (\n <SessionDetail session={selectedSession} focused={activePanel === 'activity'} height={mainHeight} />\n ) : (\n <ActivityFeed\n events={events}\n sessionSlug={selectedSession?.slug ?? null}\n focused={activePanel === 'activity'}\n height={mainHeight}\n scrollOffset={activityScroll}\n filter={activityFilter || undefined}\n />\n );\n\n return (\n <Box flexDirection=\"column\" height={termHeight}>\n <StatusBar sessionCount={sessions.length} alertCount={alerts.length} version={version} updateInfo={updateInfo} />\n <Box flexGrow={1} height={mainHeight}>\n <SessionList\n sessions={sessions}\n selectedIndex={selectedIndex}\n focused={activePanel === 'sessions'}\n filter={filter || undefined}\n viewingArchive={viewingArchive}\n />\n {rightPanel}\n </Box>\n {!options.noSecurity && <AlertBar alerts={alerts} />}\n {inputMode === 'nickname' && (\n <Box paddingX={1}>\n <Text color={colors.primary}>nickname: </Text>\n <Text color={colors.bright}>{nicknameInput.value}</Text>\n <Text color={colors.muted}>_</Text>\n </Box>\n )}\n {inputMode === 'filter' && (\n <Box paddingX={1}>\n <Text color={colors.muted}>{filterLabel}</Text>\n <Text color={colors.primary}>/</Text>\n <Text color={colors.bright}>{filterInput.value}</Text>\n <Text color={colors.muted}>_</Text>\n </Box>\n )}\n {inputMode === 'normal' && (\n <FooterBar keybindings={kb} updateStatus={updateStatus} viewingArchive={viewingArchive} splitMode={splitMode} />\n )}\n </Box>\n );\n};\n","export interface ThemeColors {\n primary: string;\n secondary: string;\n accent: string;\n warning: string;\n error: string;\n critical: string;\n muted: string;\n text: string;\n bright: string;\n border: string;\n selected: string;\n header: string;\n}\n\nexport interface ToolColors {\n Bash: string;\n Read: string;\n Write: string;\n Edit: string;\n Grep: string;\n Glob: string;\n Task: string;\n WebFetch: string;\n WebSearch: string;\n}\n\nexport interface ThemeDefinition {\n name: string;\n colors: ThemeColors;\n toolColors: ToolColors;\n builtin?: boolean;\n}\n\nexport const COLOR_KEYS: (keyof ThemeColors)[] = [\n 'primary',\n 'secondary',\n 'accent',\n 'warning',\n 'error',\n 'critical',\n 'muted',\n 'text',\n 'bright',\n 'border',\n 'selected',\n 'header',\n];\n\nexport const TOOL_COLOR_KEYS: (keyof ToolColors)[] = [\n 'Bash',\n 'Read',\n 'Write',\n 'Edit',\n 'Grep',\n 'Glob',\n 'Task',\n 'WebFetch',\n 'WebSearch',\n];\n\nconst deriveToolColors = (c: ThemeColors): ToolColors => ({\n Bash: c.error,\n Read: c.secondary,\n Write: c.accent,\n Edit: c.accent,\n Grep: c.primary,\n Glob: c.primary,\n Task: c.warning,\n WebFetch: c.warning,\n WebSearch: c.warning,\n});\n\n// Compact preset builder: [name, primary, secondary, accent, warning, error, critical,\n// muted, text, bright, border, selected, header]\ntype PresetTuple = [\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n];\n\nconst fromTuple = ([\n name,\n primary,\n secondary,\n accent,\n warning,\n error,\n critical,\n muted,\n text,\n bright,\n border,\n selected,\n header,\n]: PresetTuple): ThemeDefinition => ({\n name,\n builtin: true,\n colors: { primary, secondary, accent, warning, error, critical, muted, text, bright, border, selected, header },\n toolColors: deriveToolColors({\n primary,\n secondary,\n accent,\n warning,\n error,\n critical,\n muted,\n text,\n bright,\n border,\n selected,\n header,\n }),\n});\n\nconst PRESETS: PresetTuple[] = [\n [\n 'one-dark',\n '#61AFEF',\n '#98C379',\n '#C678DD',\n '#E5C07B',\n '#E06C75',\n '#FF0000',\n '#5C6370',\n '#ABB2BF',\n '#FFFFFF',\n '#3E4451',\n '#2C313A',\n '#61AFEF',\n ],\n [\n 'dracula',\n '#BD93F9',\n '#50FA7B',\n '#FF79C6',\n '#F1FA8C',\n '#FF5555',\n '#FF0000',\n '#6272A4',\n '#F8F8F2',\n '#FFFFFF',\n '#44475A',\n '#383A59',\n '#BD93F9',\n ],\n [\n 'monokai-pro',\n '#78DCE8',\n '#A9DC76',\n '#AB9DF2',\n '#FFD866',\n '#FF6188',\n '#FF0000',\n '#727072',\n '#FCFCFA',\n '#FFFFFF',\n '#403E41',\n '#2D2A2E',\n '#78DCE8',\n ],\n [\n 'solarized-dark',\n '#268BD2',\n '#859900',\n '#D33682',\n '#B58900',\n '#DC322F',\n '#FF0000',\n '#586E75',\n '#839496',\n '#FDF6E3',\n '#073642',\n '#002B36',\n '#268BD2',\n ],\n [\n 'solarized-light',\n '#268BD2',\n '#859900',\n '#D33682',\n '#B58900',\n '#DC322F',\n '#FF0000',\n '#93A1A1',\n '#657B83',\n '#002B36',\n '#EEE8D5',\n '#FDF6E3',\n '#268BD2',\n ],\n [\n 'nord',\n '#88C0D0',\n '#A3BE8C',\n '#B48EAD',\n '#EBCB8B',\n '#BF616A',\n '#FF0000',\n '#4C566A',\n '#D8DEE9',\n '#ECEFF4',\n '#3B4252',\n '#2E3440',\n '#88C0D0',\n ],\n [\n 'gruvbox-dark',\n '#83A598',\n '#B8BB26',\n '#D3869B',\n '#FABD2F',\n '#FB4934',\n '#FF0000',\n '#928374',\n '#EBDBB2',\n '#FBF1C7',\n '#3C3836',\n '#282828',\n '#83A598',\n ],\n [\n 'tokyo-night',\n '#7AA2F7',\n '#9ECE6A',\n '#BB9AF7',\n '#E0AF68',\n '#F7768E',\n '#FF0000',\n '#565F89',\n '#A9B1D6',\n '#C0CAF5',\n '#292E42',\n '#1A1B26',\n '#7AA2F7',\n ],\n [\n 'catppuccin-mocha',\n '#89B4FA',\n '#A6E3A1',\n '#CBA6F7',\n '#F9E2AF',\n '#F38BA8',\n '#FF0000',\n '#6C7086',\n '#CDD6F4',\n '#FFFFFF',\n '#313244',\n '#1E1E2E',\n '#89B4FA',\n ],\n [\n 'catppuccin-latte',\n '#1E66F5',\n '#40A02B',\n '#8839EF',\n '#DF8E1D',\n '#D20F39',\n '#FF0000',\n '#9CA0B0',\n '#4C4F69',\n '#11111B',\n '#E6E9EF',\n '#EFF1F5',\n '#1E66F5',\n ],\n [\n 'rose-pine',\n '#9CCFD8',\n '#31748F',\n '#C4A7E7',\n '#F6C177',\n '#EB6F92',\n '#FF0000',\n '#6E6A86',\n '#E0DEF4',\n '#E0DEF4',\n '#26233A',\n '#191724',\n '#9CCFD8',\n ],\n [\n 'rose-pine-moon',\n '#9CCFD8',\n '#3E8FB0',\n '#C4A7E7',\n '#F6C177',\n '#EB6F92',\n '#FF0000',\n '#6E6A86',\n '#E0DEF4',\n '#E0DEF4',\n '#2A273F',\n '#232136',\n '#9CCFD8',\n ],\n [\n 'pastel-dark',\n '#89CFF0',\n '#77DD77',\n '#FDCFE8',\n '#FFD580',\n '#FF6961',\n '#FF0000',\n '#7B8794',\n '#D4D4D4',\n '#FFFFFF',\n '#3A3A4A',\n '#2B2B3A',\n '#89CFF0',\n ],\n [\n 'kanagawa',\n '#7E9CD8',\n '#76946A',\n '#957FB8',\n '#E6C384',\n '#C34043',\n '#FF0000',\n '#727169',\n '#DCD7BA',\n '#FFFFFF',\n '#2A2A37',\n '#1F1F28',\n '#7E9CD8',\n ],\n [\n 'everforest',\n '#7FBBB3',\n '#A7C080',\n '#D699B6',\n '#DBBC7F',\n '#E67E80',\n '#FF0000',\n '#859289',\n '#D3C6AA',\n '#FFFFFF',\n '#374145',\n '#2D353B',\n '#7FBBB3',\n ],\n];\n\nexport const BUILTIN_THEMES: ThemeDefinition[] = PRESETS.map(fromTuple);\n\nexport const getDefaultTheme = (): ThemeDefinition => BUILTIN_THEMES[0];\n\ntype CustomThemeMap = Record<string, { name: string; colors: ThemeColors; toolColors: ToolColors }>;\n\nexport const getAllThemes = (customThemes: CustomThemeMap): ThemeDefinition[] => [\n ...BUILTIN_THEMES,\n ...Object.values(customThemes).map((t) => ({ ...t, builtin: false })),\n];\n\nexport const resolveTheme = (name: string, customThemes: CustomThemeMap): ThemeDefinition => {\n const builtin = BUILTIN_THEMES.find((t) => t.name === name);\n if (builtin) return builtin;\n const custom = customThemes[name];\n if (custom) return { ...custom, builtin: false };\n return getDefaultTheme();\n};\n\nexport const deriveSeverityColors = (c: ThemeColors): Record<string, string> => ({\n info: c.muted,\n warn: c.warning,\n high: c.error,\n critical: c.critical,\n});\n\nexport { deriveToolColors };\n","import { existsSync, readFileSync, writeFileSync, copyFileSync, mkdirSync, chmodSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { homedir } from 'node:os';\nimport { fileURLToPath } from 'node:url';\n\nconst HOOK_FILENAME = 'agenttop-guard.py';\nconst SETTINGS_PATH = join(homedir(), '.claude', 'settings.json');\n\nconst getHookSource = (): string => {\n const thisFile = fileURLToPath(import.meta.url);\n const srcHooksDir = join(dirname(thisFile), '..', 'src', 'hooks');\n const distHooksDir = join(dirname(thisFile), 'hooks');\n\n for (const dir of [distHooksDir, srcHooksDir]) {\n const path = join(dir, HOOK_FILENAME);\n if (existsSync(path)) return path;\n }\n\n const npmGlobalPath = join(dirname(thisFile), '..', 'hooks', HOOK_FILENAME);\n if (existsSync(npmGlobalPath)) return npmGlobalPath;\n\n throw new Error(`cannot find ${HOOK_FILENAME} — is agenttop installed correctly?`);\n};\n\nconst getHookTarget = (): string => {\n const claudeHooksDir = join(homedir(), '.claude', 'hooks');\n mkdirSync(claudeHooksDir, { recursive: true });\n return join(claudeHooksDir, HOOK_FILENAME);\n};\n\ninterface HookEntry {\n type: string;\n command: string;\n}\n\ninterface MatcherEntry {\n matcher: string;\n hooks: HookEntry[];\n}\n\nconst readSettings = (): Record<string, unknown> => {\n if (!existsSync(SETTINGS_PATH)) {\n return {};\n }\n try {\n return JSON.parse(readFileSync(SETTINGS_PATH, 'utf-8'));\n } catch {\n return {};\n }\n};\n\nconst writeSettings = (settings: Record<string, unknown>): void => {\n mkdirSync(dirname(SETTINGS_PATH), { recursive: true });\n writeFileSync(SETTINGS_PATH, JSON.stringify(settings, null, 2) + '\\n');\n};\n\nexport const installHooks = (): void => {\n const source = getHookSource();\n const target = getHookTarget();\n\n copyFileSync(source, target);\n chmodSync(target, 0o755);\n\n const settings = readSettings();\n const hooks = (settings.hooks ?? {}) as Record<string, MatcherEntry[]>;\n\n const postToolUse = hooks.PostToolUse ?? [];\n const hookCommand = target;\n\n const allToolsMatcher = postToolUse.find(\n (entry: MatcherEntry) => entry.matcher === 'Bash|Read|Grep|Glob|WebFetch|WebSearch',\n );\n\n if (allToolsMatcher) {\n const alreadyInstalled = allToolsMatcher.hooks.some((h: HookEntry) => h.command.includes('agenttop-guard'));\n if (alreadyInstalled) {\n process.stdout.write('agenttop hooks already installed\\n');\n return;\n }\n allToolsMatcher.hooks.push({ type: 'command', command: hookCommand });\n } else {\n postToolUse.push({\n matcher: 'Bash|Read|Grep|Glob|WebFetch|WebSearch',\n hooks: [{ type: 'command', command: hookCommand }],\n });\n }\n\n hooks.PostToolUse = postToolUse;\n settings.hooks = hooks;\n writeSettings(settings);\n\n process.stdout.write(`agenttop hooks installed:\\n`);\n process.stdout.write(` hook: ${target}\\n`);\n process.stdout.write(` settings: ${SETTINGS_PATH}\\n`);\n process.stdout.write(` matcher: PostToolUse (Bash|Read|Grep|Glob|WebFetch|WebSearch)\\n`);\n};\n\nexport const uninstallHooks = (): void => {\n const settings = readSettings();\n const hooks = (settings.hooks ?? {}) as Record<string, MatcherEntry[]>;\n const postToolUse = hooks.PostToolUse ?? [];\n\n let removed = false;\n for (const entry of postToolUse) {\n const before = entry.hooks.length;\n entry.hooks = entry.hooks.filter((h: HookEntry) => !h.command.includes('agenttop-guard'));\n if (entry.hooks.length < before) removed = true;\n }\n\n hooks.PostToolUse = postToolUse.filter((e: MatcherEntry) => e.hooks.length > 0);\n settings.hooks = hooks;\n writeSettings(settings);\n\n if (removed) {\n process.stdout.write('agenttop hooks removed from Claude Code settings\\n');\n } else {\n process.stdout.write('agenttop hooks were not installed\\n');\n }\n};\n","import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nexport const installMcpConfig = (): void => {\n const settingsPath = join(homedir(), '.claude', 'settings.json');\n let settings: Record<string, unknown> = {};\n try {\n settings = JSON.parse(readFileSync(settingsPath, 'utf-8'));\n } catch {\n /* empty */\n }\n const mcpServers = (settings.mcpServers ?? {}) as Record<string, unknown>;\n mcpServers.agenttop = { command: 'agenttop', args: ['--mcp'] };\n settings.mcpServers = mcpServers;\n mkdirSync(join(homedir(), '.claude'), { recursive: true });\n writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\\n');\n process.stdout.write('agenttop MCP server registered in Claude Code settings\\n');\n process.stdout.write(` settings: ${settingsPath}\\n`);\n};\n","import { execSync, exec } from 'node:child_process';\nimport { readFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst getPackageVersion = (): string => {\n try {\n const thisFile = fileURLToPath(import.meta.url);\n const pkgPath = join(dirname(thisFile), '..', 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n return pkg.version || '0.0.0';\n } catch {\n return '0.0.0';\n }\n};\n\nexport interface UpdateInfo {\n current: string;\n latest: string;\n available: boolean;\n}\n\nexport const checkForUpdate = (): UpdateInfo => {\n const current = getPackageVersion();\n try {\n const latest = execSync('npm view agenttop version', { encoding: 'utf-8', timeout: 5000 }).trim();\n return {\n current,\n latest,\n available: latest !== current && compareVersions(latest, current) > 0,\n };\n } catch {\n return { current, latest: current, available: false };\n }\n};\n\nexport const installUpdate = (): Promise<string> => {\n return new Promise((resolve, reject) => {\n exec('npm install -g agenttop@latest', { timeout: 60000 }, (err, stdout) => {\n if (err) {\n reject(err);\n } else {\n resolve(stdout.trim());\n }\n });\n });\n};\n\nconst compareVersions = (a: string, b: string): number => {\n const pa = a.split('.').map(Number);\n const pb = b.split('.').map(Number);\n for (let i = 0; i < 3; i++) {\n const da = pa[i] ?? 0;\n const db = pb[i] ?? 0;\n if (da > db) return 1;\n if (da < db) return -1;\n }\n return 0;\n};\n","import React, { useState, useEffect } from 'react';\nimport { Box, Text } from 'ink';\n\nimport { colors } from '../theme.js';\nimport type { UpdateInfo } from '../../updates.js';\n\ninterface StatusBarProps {\n sessionCount: number;\n alertCount: number;\n version: string;\n updateInfo?: UpdateInfo | null;\n}\n\nexport const StatusBar: React.FC<StatusBarProps> = React.memo(({ sessionCount, alertCount, version, updateInfo }) => {\n const [time, setTime] = useState(new Date());\n\n useEffect(() => {\n const interval = setInterval(() => setTime(new Date()), 1000);\n return () => clearInterval(interval);\n }, []);\n\n const timeStr = time.toLocaleTimeString('en-GB', { hour12: false });\n\n return (\n <Box borderStyle=\"single\" borderColor={colors.border} paddingX={1} justifyContent=\"space-between\">\n <Text color={colors.header} bold>\n agenttop v{version}\n </Text>\n <Text color={colors.text}>\n {sessionCount} session{sessionCount !== 1 ? 's' : ''}\n </Text>\n {alertCount > 0 && (\n <Text color={colors.error} bold>\n {alertCount} alert{alertCount !== 1 ? 's' : ''}\n </Text>\n )}\n {updateInfo?.available && <Text color={colors.secondary}>v{updateInfo.latest} available (u)</Text>}\n <Text color={colors.muted}>{timeStr}</Text>\n </Box>\n );\n});\n","import type { ThemeDefinition } from '../config/themes.js';\nimport { deriveSeverityColors } from '../config/themes.js';\n\nexport const colors: Record<string, string> = {\n primary: '#61AFEF',\n secondary: '#98C379',\n accent: '#C678DD',\n warning: '#E5C07B',\n error: '#E06C75',\n critical: '#FF0000',\n muted: '#5C6370',\n text: '#ABB2BF',\n bright: '#FFFFFF',\n border: '#3E4451',\n selected: '#2C313A',\n header: '#61AFEF',\n};\n\nexport const severityColors: Record<string, string> = {\n info: colors.muted,\n warn: colors.warning,\n high: colors.error,\n critical: colors.critical,\n};\n\nexport const toolColors: Record<string, string> = {\n Bash: colors.error,\n Read: colors.secondary,\n Write: colors.accent,\n Edit: colors.accent,\n Grep: colors.primary,\n Glob: colors.primary,\n Task: colors.warning,\n WebFetch: colors.warning,\n WebSearch: colors.warning,\n};\n\nexport const getToolColor = (toolName: string): string => toolColors[toolName] || colors.text;\n\nexport const applyTheme = (theme: ThemeDefinition): void => {\n Object.assign(colors, theme.colors);\n Object.assign(toolColors, theme.toolColors);\n Object.assign(severityColors, deriveSeverityColors(theme.colors));\n};\n","import React from 'react';\nimport { Box, Text } from 'ink';\n\nimport type { Session } from '../../discovery/types.js';\nimport { colors } from '../theme.js';\n\ninterface SessionListProps {\n sessions: Session[];\n selectedIndex: number;\n focused: boolean;\n filter?: string;\n viewingArchive?: boolean;\n}\n\nconst formatModel = (model: string): string => {\n if (model.includes('opus')) return 'opus';\n if (model.includes('sonnet')) return 'sonnet';\n if (model.includes('haiku')) return 'haiku';\n return model.slice(0, 8);\n};\n\nconst formatProject = (project: string, max: number): string => {\n const parts = project.split('/');\n const last = parts[parts.length - 1] || project;\n return last.length > max ? last.slice(0, max - 1) + '\\u2026' : last;\n};\n\nconst formatTokens = (n: number): string => {\n if (n >= 1_000_000) return (n / 1_000_000).toFixed(1) + 'M';\n if (n >= 1_000) return (n / 1_000).toFixed(1) + 'k';\n return String(n);\n};\n\nconst truncate = (s: string, max: number): string => (s.length > max ? s.slice(0, max - 1) + '\\u2026' : s);\n\nconst SIDEBAR_WIDTH = 28;\nconst INNER_WIDTH = SIDEBAR_WIDTH - 4; // borders + paddingX\n\nexport const SessionList: React.FC<SessionListProps> = React.memo(\n ({ sessions, selectedIndex, focused, filter, viewingArchive }) => {\n const divider = '-'.repeat(INNER_WIDTH);\n\n return (\n <Box\n flexDirection=\"column\"\n width={SIDEBAR_WIDTH}\n borderStyle=\"single\"\n borderColor={focused ? colors.primary : colors.border}\n overflow=\"hidden\"\n >\n <Box paddingX={1}>\n <Text color={viewingArchive ? colors.warning : colors.header} bold>\n {viewingArchive ? 'ARCHIVE' : 'SESSIONS'}\n </Text>\n {filter && <Text color={colors.muted}> [{truncate(filter, 10)}]</Text>}\n </Box>\n\n {sessions.length === 0 && (\n <Box paddingX={1} paddingY={1}>\n <Text color={colors.muted} italic>\n {filter ? 'No matches' : viewingArchive ? 'No archived sessions' : 'No sessions'}\n </Text>\n </Box>\n )}\n\n {sessions.map((session, i) => {\n const isSelected = i === selectedIndex;\n const indicator = isSelected ? '>' : ' ';\n const nameMaxLen = INNER_WIDTH - 2;\n const displayName = truncate(session.nickname || session.slug, nameMaxLen);\n const totalIn = session.usage.inputTokens + session.usage.cacheReadTokens;\n const proj = formatProject(session.project, 12);\n const model = formatModel(session.model);\n const isActive = session.pid !== null;\n const nameColor = isSelected ? colors.bright : isActive ? colors.secondary : colors.error;\n\n return (\n <Box key={session.sessionId} flexDirection=\"column\" paddingX={1} paddingY={0}>\n {i > 0 && (\n <Text color={colors.border} wrap=\"truncate\">\n {divider}\n </Text>\n )}\n <Text\n color={nameColor}\n bold={isSelected}\n backgroundColor={isSelected ? colors.selected : undefined}\n wrap=\"truncate\"\n >\n {indicator} {displayName}\n </Text>\n {session.nickname && (\n <Text color={colors.muted} wrap=\"truncate\">\n {' '}\n {truncate(session.slug, nameMaxLen)}\n </Text>\n )}\n <Text color={colors.muted} wrap=\"truncate\">\n {' '}\n {proj} {model} {session.agentCount}ag\n </Text>\n <Text color={colors.muted} wrap=\"truncate\">\n {' '}\n {formatTokens(totalIn)}in {formatTokens(session.usage.outputTokens)}out {session.cpu}%\n </Text>\n </Box>\n );\n })}\n </Box>\n );\n },\n);\n","import React from 'react';\nimport { Box, Text } from 'ink';\n\nimport type { ToolCall } from '../../discovery/types.js';\nimport { colors, getToolColor } from '../theme.js';\n\ninterface ActivityFeedProps {\n events: ToolCall[];\n sessionSlug: string | null;\n focused: boolean;\n height: number;\n scrollOffset: number;\n filter?: string;\n}\n\nconst formatTime = (ts: number): string => {\n const d = new Date(ts);\n return d.toLocaleTimeString('en-GB', { hour12: false });\n};\n\nconst summarizeInput = (call: ToolCall): string => {\n const input = call.toolInput;\n\n switch (call.toolName) {\n case 'Bash':\n return String(input.command || '').slice(0, 50);\n case 'Read':\n case 'Write':\n case 'Edit':\n return String(input.file_path || '')\n .split('/')\n .slice(-2)\n .join('/');\n case 'Grep':\n return `pattern=\"${String(input.pattern || '').slice(0, 30)}\"`;\n case 'Glob':\n return String(input.pattern || '').slice(0, 40);\n case 'Task':\n return String(input.description || '').slice(0, 40);\n case 'WebFetch':\n case 'WebSearch':\n return String(input.url || input.query || '').slice(0, 40);\n default:\n return JSON.stringify(input).slice(0, 40);\n }\n};\n\nexport const ActivityFeed: React.FC<ActivityFeedProps> = React.memo(\n ({ events, sessionSlug, focused, height, scrollOffset, filter }) => {\n const viewportRows = height - 2;\n const totalEvents = events.length;\n const start = Math.max(0, totalEvents - viewportRows - scrollOffset);\n const end = start + viewportRows;\n const visible = events.slice(start, end);\n\n const isAtBottom = scrollOffset === 0;\n const isAtTop = start === 0;\n const canScroll = totalEvents > viewportRows;\n\n return (\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n borderStyle=\"single\"\n borderColor={focused ? colors.primary : colors.border}\n >\n <Box paddingX={1} justifyContent=\"space-between\">\n <Box>\n <Text color={colors.header} bold>\n ACTIVITY\n </Text>\n {sessionSlug && <Text color={colors.muted}> ({sessionSlug})</Text>}\n {filter && (\n <Text color={colors.muted}> [{filter.length > 10 ? filter.slice(0, 9) + '\\u2026' : filter}]</Text>\n )}\n </Box>\n {focused && canScroll && !isAtBottom && (\n <Text color={colors.muted}>\n [{totalEvents - end + viewportRows}/{totalEvents}]\n </Text>\n )}\n </Box>\n\n {visible.length === 0 && (\n <Box paddingX={1} paddingY={1}>\n <Text color={colors.muted} italic>\n {sessionSlug ? 'Waiting for activity...' : 'Select a session'}\n </Text>\n </Box>\n )}\n\n {visible.map((event, i) => (\n <Box key={`${event.timestamp}-${i}`} paddingX={1}>\n <Text color={colors.muted}>{formatTime(event.timestamp)} </Text>\n <Text color={getToolColor(event.toolName)} bold>\n {event.toolName.padEnd(8)}\n </Text>\n <Text color={colors.text}> {summarizeInput(event)}</Text>\n </Box>\n ))}\n\n {focused && canScroll && !isAtTop && visible.length > 0 && (\n <Box paddingX={1} justifyContent=\"flex-end\">\n <Text color={colors.muted}>{isAtBottom ? '' : 'G:bottom '}</Text>\n </Box>\n )}\n </Box>\n );\n },\n);\n","import React from 'react';\nimport { Box, Text } from 'ink';\n\nimport type { Alert } from '../../discovery/types.js';\nimport { colors, severityColors } from '../theme.js';\n\ninterface AlertBarProps {\n alerts: Alert[];\n maxVisible?: number;\n}\n\nconst formatTime = (ts: number): string => {\n const d = new Date(ts);\n return d.toLocaleTimeString('en-GB', { hour12: false });\n};\n\nconst severityIcon: Record<string, string> = {\n info: 'i',\n warn: '!',\n high: '!!',\n critical: '!!!',\n};\n\nexport const AlertBar: React.FC<AlertBarProps> = React.memo(({ alerts, maxVisible = 4 }) => {\n const visible = alerts.slice(-maxVisible);\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor={alerts.length > 0 ? colors.error : colors.border}>\n <Box paddingX={1}>\n <Text color={colors.error} bold>\n ALERTS\n </Text>\n {alerts.length === 0 && <Text color={colors.muted}> (none)</Text>}\n </Box>\n\n {visible.map((alert, i) => (\n <Box key={alert.id || i} paddingX={1}>\n <Text color={severityColors[alert.severity] || colors.text}>[{severityIcon[alert.severity] || '?'}]</Text>\n <Text color={colors.muted}> {formatTime(alert.timestamp)} </Text>\n <Text color={colors.warning}>{alert.sessionSlug}: </Text>\n <Text color={colors.text}>{alert.message.slice(0, 60)}</Text>\n </Box>\n ))}\n </Box>\n );\n});\n","import React from 'react';\nimport { Box, Text } from 'ink';\n\nimport type { Session } from '../../discovery/types.js';\nimport { colors } from '../theme.js';\n\ninterface SessionDetailProps {\n session: Session;\n focused: boolean;\n height: number;\n}\n\nconst formatTokens = (n: number): string => {\n if (n >= 1_000_000) return (n / 1_000_000).toFixed(1) + 'M';\n if (n >= 1_000) return (n / 1_000).toFixed(1) + 'k';\n return String(n);\n};\n\nconst formatUptime = (startTime: number): string => {\n const ms = Date.now() - startTime;\n const secs = Math.floor(ms / 1000);\n const mins = Math.floor(secs / 60);\n const hours = Math.floor(mins / 60);\n if (hours > 0) return `${hours}h ${mins % 60}m`;\n if (mins > 0) return `${mins}m ${secs % 60}s`;\n return `${secs}s`;\n};\n\nconst formatModel = (model: string): string => {\n if (model.includes('opus')) return 'opus';\n if (model.includes('sonnet')) return 'sonnet';\n if (model.includes('haiku')) return 'haiku';\n return model.slice(0, 20);\n};\n\nexport const SessionDetail: React.FC<SessionDetailProps> = React.memo(({ session, focused }) => {\n const totalInput = session.usage.inputTokens + session.usage.cacheCreationTokens + session.usage.cacheReadTokens;\n const totalTokens = totalInput + session.usage.outputTokens;\n const cacheHitRate = totalInput > 0 ? ((session.usage.cacheReadTokens / totalInput) * 100).toFixed(0) : '0';\n\n return (\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n borderStyle=\"single\"\n borderColor={focused ? colors.primary : colors.border}\n >\n <Box paddingX={1}>\n <Text color={colors.header} bold>\n SESSION DETAIL\n </Text>\n <Text color={colors.muted}> (Esc to return)</Text>\n </Box>\n\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Box>\n <Text color={colors.muted}>{'slug: '}</Text>\n <Text color={colors.bright} bold>\n {session.slug}\n </Text>\n </Box>\n {session.nickname && (\n <Box>\n <Text color={colors.muted}>{'nickname: '}</Text>\n <Text color={colors.secondary}>{session.nickname}</Text>\n </Box>\n )}\n <Box>\n <Text color={colors.muted}>{'model: '}</Text>\n <Text color={colors.text}>{formatModel(session.model)}</Text>\n </Box>\n <Box>\n <Text color={colors.muted}>{'cwd: '}</Text>\n <Text color={colors.text}>{session.cwd}</Text>\n </Box>\n {session.gitBranch && (\n <Box>\n <Text color={colors.muted}>{'branch: '}</Text>\n <Text color={colors.secondary}>{session.gitBranch}</Text>\n </Box>\n )}\n <Box>\n <Text color={colors.muted}>{'version: '}</Text>\n <Text color={colors.text}>{session.version || 'unknown'}</Text>\n </Box>\n <Box>\n <Text color={colors.muted}>{'pid: '}</Text>\n <Text color={colors.text}>{session.pid ?? 'not running'}</Text>\n </Box>\n <Box>\n <Text color={colors.muted}>{'cpu: '}</Text>\n <Text color={colors.text}>{session.cpu}%</Text>\n </Box>\n <Box>\n <Text color={colors.muted}>{'memory: '}</Text>\n <Text color={colors.text}>{session.memMB}MB</Text>\n </Box>\n <Box>\n <Text color={colors.muted}>{'uptime: '}</Text>\n <Text color={colors.text}>{formatUptime(session.startTime)}</Text>\n </Box>\n <Box>\n <Text color={colors.muted}>{'agents: '}</Text>\n <Text color={colors.text}>{session.agentCount}</Text>\n </Box>\n\n <Box marginTop={1}>\n <Text color={colors.header} bold>\n Token usage\n </Text>\n </Box>\n <Box>\n <Text color={colors.muted}>{' input: '}</Text>\n <Text color={colors.text}>{formatTokens(session.usage.inputTokens)}</Text>\n </Box>\n <Box>\n <Text color={colors.muted}>{' output: '}</Text>\n <Text color={colors.text}>{formatTokens(session.usage.outputTokens)}</Text>\n </Box>\n <Box>\n <Text color={colors.muted}>{' cache write: '}</Text>\n <Text color={colors.text}>{formatTokens(session.usage.cacheCreationTokens)}</Text>\n </Box>\n <Box>\n <Text color={colors.muted}>{' cache read: '}</Text>\n <Text color={colors.text}>{formatTokens(session.usage.cacheReadTokens)}</Text>\n </Box>\n <Box>\n <Text color={colors.muted}>{' cache hit: '}</Text>\n <Text color={session.usage.cacheReadTokens > 0 ? colors.secondary : colors.text}>{cacheHitRate}%</Text>\n </Box>\n <Box>\n <Text color={colors.muted}>{' total: '}</Text>\n <Text color={colors.bright} bold>\n {formatTokens(totalTokens)}\n </Text>\n </Box>\n </Box>\n </Box>\n );\n});\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\n\nimport { colors } from '../theme.js';\n\ntype PromptChoice = 'yes' | 'not_now' | 'dismiss';\n\ninterface SetupStep {\n title: string;\n description: string;\n}\n\ninterface SetupModalProps {\n steps: SetupStep[];\n onComplete: (results: PromptChoice[]) => void;\n}\n\nconst OPTIONS: Array<{ label: string; value: PromptChoice }> = [\n { label: 'Yes', value: 'yes' },\n { label: 'Not now', value: 'not_now' },\n { label: \"Don't ask again\", value: 'dismiss' },\n];\n\nexport const SetupModal: React.FC<SetupModalProps> = React.memo(({ steps, onComplete }) => {\n const [stepIndex, setStepIndex] = useState(0);\n const [selectedOption, setSelectedOption] = useState(0);\n const [results, setResults] = useState<PromptChoice[]>([]);\n\n const step = steps[stepIndex];\n\n useInput((_input, key) => {\n if (key.upArrow) {\n setSelectedOption((i) => Math.max(0, i - 1));\n }\n if (key.downArrow) {\n setSelectedOption((i) => Math.min(OPTIONS.length - 1, i + 1));\n }\n if (key.return) {\n const choice = OPTIONS[selectedOption].value;\n const newResults = [...results, choice];\n if (stepIndex + 1 >= steps.length) {\n onComplete(newResults);\n } else {\n setResults(newResults);\n setStepIndex(stepIndex + 1);\n setSelectedOption(0);\n }\n }\n });\n\n if (!step) return null;\n\n return (\n <Box flexDirection=\"column\" paddingX={4} paddingY={2}>\n <Box borderStyle=\"round\" borderColor={colors.primary} flexDirection=\"column\" paddingX={3} paddingY={1}>\n <Box marginBottom={1}>\n <Text color={colors.header} bold>\n agenttop setup ({stepIndex + 1}/{steps.length})\n </Text>\n </Box>\n\n <Box marginBottom={1}>\n <Text color={colors.bright} bold>\n {step.title}\n </Text>\n </Box>\n <Box marginBottom={1}>\n <Text color={colors.text}>{step.description}</Text>\n </Box>\n\n {OPTIONS.map((opt, i) => (\n <Box key={opt.value}>\n <Text color={i === selectedOption ? colors.primary : colors.muted}>\n {i === selectedOption ? '> ' : ' '}\n {opt.label}\n </Text>\n </Box>\n ))}\n\n <Box marginTop={1}>\n <Text color={colors.muted}>Use arrow keys + Enter to select</Text>\n </Box>\n </Box>\n </Box>\n );\n});\n","import React from 'react';\nimport { Box, Text } from 'ink';\n\nimport type { KeybindingsConfig } from '../../config/store.js';\nimport { colors } from '../theme.js';\n\ninterface FooterBarProps {\n keybindings: KeybindingsConfig;\n updateStatus?: string;\n viewingArchive?: boolean;\n splitMode?: boolean;\n}\n\nconst label = (key: string): string => {\n if (key === 'tab') return 'tab';\n if (key === 'shift+tab') return 'S-tab';\n if (key === 'enter') return 'enter';\n return key;\n};\n\nexport const FooterBar: React.FC<FooterBarProps> = React.memo(\n ({ keybindings, updateStatus, viewingArchive, splitMode }) => (\n <Box paddingX={1}>\n <Box marginRight={2}>\n <Text color={colors.muted}>{label(keybindings.quit)}:quit</Text>\n </Box>\n <Box marginRight={2}>\n <Text color={colors.muted}>\n {label(keybindings.navDown)}/{label(keybindings.navUp)}:nav\n </Text>\n </Box>\n <Box marginRight={2}>\n <Text color={colors.muted}>{label(keybindings.panelNext)}:panel</Text>\n </Box>\n <Box marginRight={2}>\n <Text color={colors.muted}>{label(keybindings.filter)}:filter</Text>\n </Box>\n <Box marginRight={2}>\n <Text color={colors.muted}>{label(keybindings.nickname)}:name</Text>\n </Box>\n <Box marginRight={2}>\n <Text color={colors.muted}>{label(keybindings.detail)}:detail</Text>\n </Box>\n <Box marginRight={2}>\n <Text color={colors.muted}>\n {label(keybindings.split)}:{splitMode ? 'unsplit' : 'split'}\n </Text>\n </Box>\n {splitMode && (\n <>\n <Box marginRight={2}>\n <Text color={colors.muted}>\n {label(keybindings.pinLeft)}/{label(keybindings.pinRight)}:pin\n </Text>\n </Box>\n <Box marginRight={2}>\n <Text color={colors.muted}>{label(keybindings.swapPanels)}:swap</Text>\n </Box>\n </>\n )}\n <Box marginRight={2}>\n <Text color={colors.muted}>\n {label(keybindings.archive)}:{viewingArchive ? 'restore' : 'archive'}\n </Text>\n </Box>\n <Box marginRight={2}>\n <Text color={colors.muted}>{label(keybindings.delete)}:delete</Text>\n </Box>\n <Box marginRight={2}>\n <Text color={colors.muted}>{label(keybindings.viewArchive)}:archived</Text>\n </Box>\n <Box marginRight={2}>\n <Text color={colors.muted}>{label(keybindings.settings)}:settings</Text>\n </Box>\n {updateStatus && (\n <Box marginRight={2}>\n <Text color={colors.secondary}>{updateStatus}</Text>\n </Box>\n )}\n </Box>\n ),\n);\n","import React, { useState, useMemo, useEffect, useRef } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\n\nimport type { Config, KeybindingsConfig, SecurityRulesConfig, NotificationsConfig } from '../../config/store.js';\nimport { colors } from '../theme.js';\n\ninterface SettingsMenuProps {\n config: Config;\n onClose: (updatedConfig: Config) => void;\n onOpenThemeMenu: () => void;\n}\n\ntype ItemType = 'keybind' | 'toggle' | 'cycle' | 'header' | 'action';\n\ninterface MenuItem {\n type: ItemType;\n label: string;\n section: string;\n key?: string;\n getValue: (config: Config) => string;\n apply?: (config: Config, newValue?: string) => Config;\n}\n\nconst KEYBIND_LABELS: Record<keyof KeybindingsConfig, string> = {\n quit: 'Quit',\n navUp: 'Navigate up',\n navDown: 'Navigate down',\n panelNext: 'Next panel',\n panelPrev: 'Previous panel',\n scrollTop: 'Scroll to top',\n scrollBottom: 'Scroll to bottom',\n filter: 'Filter',\n nickname: 'Set nickname',\n clearNickname: 'Clear nickname',\n detail: 'Detail view',\n update: 'Install update',\n settings: 'Settings',\n archive: 'Archive session',\n delete: 'Delete session',\n viewArchive: 'View archive',\n split: 'Toggle split view',\n pinLeft: 'Pin to left panel',\n pinRight: 'Pin to right panel',\n swapPanels: 'Swap panels',\n closePanel: 'Close panel',\n};\n\nconst RULE_LABELS: Record<keyof SecurityRulesConfig, string> = {\n network: 'Network detection',\n exfiltration: 'Exfiltration detection',\n sensitiveFiles: 'Sensitive files',\n shellEscape: 'Shell escape',\n injection: 'Prompt injection',\n};\n\nconst DEFAULT_KEYBINDINGS: KeybindingsConfig = {\n quit: 'q',\n navUp: 'k',\n navDown: 'j',\n panelNext: 'tab',\n panelPrev: 'shift+tab',\n scrollTop: 'g',\n scrollBottom: 'G',\n filter: '/',\n nickname: 'n',\n clearNickname: 'N',\n detail: 'enter',\n update: 'u',\n settings: 's',\n archive: 'a',\n delete: 'd',\n viewArchive: 'A',\n split: 'x',\n pinLeft: '1',\n pinRight: '2',\n swapPanels: 'S',\n closePanel: 'X',\n};\n\nconst SEVERITY_OPTIONS: NotificationsConfig['minSeverity'][] = ['info', 'warn', 'high', 'critical'];\nconst ARCHIVE_EXPIRY_OPTIONS = [0, 7, 14, 30, 60, 90];\nconst formatExpiry = (days: number): string => (days === 0 ? 'never' : `${days}d`);\n\nconst displayKey = (key: string): string => {\n if (key === 'tab') return 'tab';\n if (key === 'shift+tab') return 'S-tab';\n if (key === 'enter') return 'enter';\n return key;\n};\n\nconst buildMenuItems = (): MenuItem[] => {\n const items: MenuItem[] = [];\n\n items.push({ type: 'header', label: 'THEMES', section: 'themes', getValue: () => '', key: undefined });\n items.push({\n type: 'action',\n label: 'Manage themes...',\n section: 'themes',\n key: 'manageThemes',\n getValue: (cfg) => cfg.theme,\n apply: undefined,\n });\n\n items.push({ type: 'header', label: 'GENERAL', section: 'general', getValue: () => '', key: undefined });\n items.push({\n type: 'cycle',\n label: 'Archive expiry',\n section: 'general',\n key: 'archiveExpiryDays',\n getValue: (cfg) => formatExpiry(cfg.archiveExpiryDays),\n apply: (cfg) => {\n const idx = ARCHIVE_EXPIRY_OPTIONS.indexOf(cfg.archiveExpiryDays);\n return { ...cfg, archiveExpiryDays: ARCHIVE_EXPIRY_OPTIONS[(idx + 1) % ARCHIVE_EXPIRY_OPTIONS.length] };\n },\n });\n\n items.push({ type: 'header', label: 'KEYBINDINGS', section: 'keybindings', getValue: () => '', key: undefined });\n for (const [k, label] of Object.entries(KEYBIND_LABELS)) {\n const kbKey = k as keyof KeybindingsConfig;\n items.push({\n type: 'keybind',\n label,\n section: 'keybindings',\n key: kbKey,\n getValue: (cfg) => displayKey(cfg.keybindings[kbKey]),\n apply: (cfg, newValue) => ({ ...cfg, keybindings: { ...cfg.keybindings, [kbKey]: newValue } }),\n });\n }\n items.push({\n type: 'action',\n label: 'Reset all keybindings',\n section: 'keybindings',\n key: 'resetAllKeybinds',\n getValue: () => '',\n apply: (cfg) => ({ ...cfg, keybindings: { ...DEFAULT_KEYBINDINGS } }),\n });\n\n items.push({ type: 'header', label: 'SECURITY RULES', section: 'security', getValue: () => '', key: undefined });\n for (const [k, label] of Object.entries(RULE_LABELS)) {\n const ruleKey = k as keyof SecurityRulesConfig;\n items.push({\n type: 'toggle',\n label,\n section: 'security',\n key: ruleKey,\n getValue: (cfg) => (cfg.security.rules[ruleKey] ? 'ON' : 'OFF'),\n apply: (cfg) => ({\n ...cfg,\n security: { ...cfg.security, rules: { ...cfg.security.rules, [ruleKey]: !cfg.security.rules[ruleKey] } },\n }),\n });\n }\n\n items.push({ type: 'header', label: 'NOTIFICATIONS', section: 'notifications', getValue: () => '', key: undefined });\n items.push({\n type: 'toggle',\n label: 'Terminal bell',\n section: 'notifications',\n key: 'bell',\n getValue: (cfg) => (cfg.notifications.bell ? 'ON' : 'OFF'),\n apply: (cfg) => ({ ...cfg, notifications: { ...cfg.notifications, bell: !cfg.notifications.bell } }),\n });\n items.push({\n type: 'toggle',\n label: 'Desktop notifications',\n section: 'notifications',\n key: 'desktop',\n getValue: (cfg) => (cfg.notifications.desktop ? 'ON' : 'OFF'),\n apply: (cfg) => ({ ...cfg, notifications: { ...cfg.notifications, desktop: !cfg.notifications.desktop } }),\n });\n items.push({\n type: 'cycle',\n label: 'Minimum severity',\n section: 'notifications',\n key: 'minSeverity',\n getValue: (cfg) => cfg.notifications.minSeverity,\n apply: (cfg) => {\n const idx = SEVERITY_OPTIONS.indexOf(cfg.notifications.minSeverity);\n return {\n ...cfg,\n notifications: { ...cfg.notifications, minSeverity: SEVERITY_OPTIONS[(idx + 1) % SEVERITY_OPTIONS.length] },\n };\n },\n });\n\n return items;\n};\n\nconst MENU_ITEMS = buildMenuItems();\nconst SELECTABLE_INDICES = MENU_ITEMS.map((item, i) => (item.type !== 'header' ? i : -1)).filter((i) => i >= 0);\n\nexport const SettingsMenu: React.FC<SettingsMenuProps> = React.memo(({ config, onClose, onOpenThemeMenu }) => {\n const { stdout } = useStdout();\n const termHeight = stdout?.rows ?? 40;\n const [localConfig, setLocalConfig] = useState<Config>(() => JSON.parse(JSON.stringify(config)));\n const [selectablePos, setSelectablePos] = useState(0);\n const [rebinding, setRebinding] = useState(false);\n const [toast, setToast] = useState('');\n const toastTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const showToast = (msg: string) => {\n if (toastTimer.current) clearTimeout(toastTimer.current);\n setToast(msg);\n toastTimer.current = setTimeout(() => setToast(''), 2500);\n };\n\n useEffect(\n () => () => {\n if (toastTimer.current) clearTimeout(toastTimer.current);\n },\n [],\n );\n\n const selectedIndex = SELECTABLE_INDICES[selectablePos];\n const maxLabelLen = useMemo(\n () => Math.max(...MENU_ITEMS.filter((i) => i.type !== 'header').map((i) => i.label.length)),\n [],\n );\n\n useInput((input, key) => {\n if (rebinding) {\n const item = MENU_ITEMS[selectedIndex];\n let newKey: string;\n if (key.tab && key.shift) newKey = 'shift+tab';\n else if (key.tab) newKey = 'tab';\n else if (key.return) newKey = 'enter';\n else if (key.escape) {\n setRebinding(false);\n return;\n } else if (key.backspace || key.delete) {\n const kbKey = item.key as keyof KeybindingsConfig;\n const defaultVal = DEFAULT_KEYBINDINGS[kbKey];\n if (item.apply) setLocalConfig((c) => item.apply!(c, defaultVal));\n showToast(`Reset to default: ${displayKey(defaultVal)}`);\n setRebinding(false);\n return;\n } else if (input && input.length === 1) newKey = input;\n else return;\n\n const kbKey = item.key as keyof KeybindingsConfig;\n const conflict = Object.entries(localConfig.keybindings).find(([k, v]) => k !== kbKey && v === newKey);\n if (conflict) {\n const conflictLabel = KEYBIND_LABELS[conflict[0] as keyof KeybindingsConfig] || conflict[0];\n showToast(`'${displayKey(newKey)}' is already assigned to '${conflictLabel}'`);\n setRebinding(false);\n return;\n }\n\n if (item.apply) setLocalConfig((c) => item.apply!(c, newKey));\n setRebinding(false);\n return;\n }\n\n if (key.escape) {\n onClose(localConfig);\n return;\n }\n if (key.upArrow) {\n setSelectablePos((p) => Math.max(0, p - 1));\n return;\n }\n if (key.downArrow) {\n setSelectablePos((p) => Math.min(SELECTABLE_INDICES.length - 1, p + 1));\n return;\n }\n\n if (key.return) {\n const item = MENU_ITEMS[selectedIndex];\n if (item.key === 'manageThemes') {\n onOpenThemeMenu();\n return;\n }\n if (item.key === 'resetAllKeybinds') {\n if (item.apply) setLocalConfig((c) => item.apply!(c));\n showToast('All keybindings reset to defaults');\n return;\n }\n if (item.type === 'keybind') setRebinding(true);\n else if (item.apply) setLocalConfig((c) => item.apply!(c));\n }\n });\n\n const contentHeight = termHeight - 6;\n const halfView = Math.floor(contentHeight / 2);\n const menuItemIndex = MENU_ITEMS.indexOf(MENU_ITEMS[selectedIndex]);\n const scrollStart = Math.max(0, Math.min(menuItemIndex - halfView, MENU_ITEMS.length - contentHeight));\n const visibleItems = MENU_ITEMS.slice(Math.max(0, scrollStart), Math.max(0, scrollStart) + contentHeight);\n const visibleStartIndex = Math.max(0, scrollStart);\n\n return (\n <Box flexDirection=\"column\" height={termHeight}>\n <Box\n borderStyle=\"round\"\n borderColor={colors.primary}\n flexDirection=\"column\"\n paddingX={2}\n paddingY={1}\n height={termHeight}\n >\n <Box justifyContent=\"space-between\" marginBottom={1}>\n <Text color={colors.header} bold>\n SETTINGS\n </Text>\n <Text color={colors.muted}>esc to save & close {rebinding ? '| backspace to reset' : ''}</Text>\n </Box>\n\n {visibleItems.map((item, vi) => {\n const realIndex = visibleStartIndex + vi;\n const isSelected = realIndex === selectedIndex;\n if (item.type === 'header') {\n return (\n <Box key={`h-${item.label}`} marginTop={realIndex > 0 ? 1 : 0}>\n <Text color={colors.accent} bold>\n {' '}\n {item.label}\n </Text>\n </Box>\n );\n }\n\n const value = item.getValue(localConfig);\n const isRebindingThis = rebinding && isSelected;\n const displayValue = isRebindingThis ? '[press key...]' : value;\n const valueColor = isRebindingThis\n ? colors.warning\n : value === 'ON'\n ? colors.secondary\n : value === 'OFF'\n ? colors.error\n : colors.bright;\n const isReset = item.key === 'resetAllKeybinds';\n const dots = isReset ? '' : '.'.repeat(Math.max(2, maxLabelLen - item.label.length + 4)) + ' ';\n\n return (\n <Box key={`${item.section}-${item.key}`}>\n <Text color={isSelected ? colors.primary : colors.text}>\n {isSelected ? '> ' : ' '} {item.label} {dots}\n </Text>\n {!isReset && <Text color={valueColor}>{displayValue}</Text>}\n </Box>\n );\n })}\n\n {toast && (\n <Box marginTop={1} paddingX={2}>\n <Text color={colors.warning}>{toast}</Text>\n </Box>\n )}\n </Box>\n </Box>\n );\n});\n","import React, { useState, useCallback, useRef, useEffect } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\n\nimport type { ThemeDefinition } from '../../config/themes.js';\nimport { getAllThemes, getDefaultTheme, resolveTheme } from '../../config/themes.js';\nimport type { Config } from '../../config/store.js';\nimport { colors, applyTheme } from '../theme.js';\nimport { ThemeEditor } from './ThemeEditor.js';\n\ninterface ThemeMenuProps {\n config: Config;\n onClose: (updatedConfig: Config) => void;\n}\n\ntype View = 'list' | 'editor' | 'naming';\n\nexport const ThemeMenu: React.FC<ThemeMenuProps> = React.memo(({ config, onClose }) => {\n const { stdout } = useStdout();\n const termHeight = stdout?.rows ?? 40;\n const [localConfig, setLocalConfig] = useState<Config>(() => JSON.parse(JSON.stringify(config)));\n const [selectedIdx, setSelectedIdx] = useState(0);\n const [view, setView] = useState<View>('list');\n const [editingTheme, setEditingTheme] = useState<ThemeDefinition | null>(null);\n const [nameInput, setNameInput] = useState('');\n const [namingAction, setNamingAction] = useState<'copy' | 'rename'>('copy');\n const [toast, setToast] = useState('');\n const toastTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const showToast = (msg: string) => {\n if (toastTimer.current) clearTimeout(toastTimer.current);\n setToast(msg);\n toastTimer.current = setTimeout(() => setToast(''), 2500);\n };\n\n useEffect(\n () => () => {\n if (toastTimer.current) clearTimeout(toastTimer.current);\n },\n [],\n );\n\n const themes = getAllThemes(localConfig.customThemes);\n\n const previewTheme = useCallback(\n (idx: number) => {\n const t = themes[idx];\n if (t) applyTheme(t);\n },\n [themes],\n );\n\n const updateSelection = useCallback(\n (newIdx: number) => {\n setSelectedIdx(newIdx);\n previewTheme(newIdx);\n },\n [previewTheme],\n );\n\n useInput((input, key) => {\n if (view === 'naming') {\n if (key.escape) {\n setView('list');\n setNameInput('');\n return;\n }\n if (key.return && nameInput.trim()) {\n const name = nameInput.trim();\n if (themes.some((t) => t.name === name)) {\n showToast(`Theme '${name}' already exists`);\n return;\n }\n if (namingAction === 'copy') {\n const source = themes[selectedIdx];\n const newTheme: ThemeDefinition = {\n name,\n colors: { ...source.colors },\n toolColors: { ...source.toolColors },\n };\n setLocalConfig((c) => ({\n ...c,\n theme: name,\n customThemes: {\n ...c.customThemes,\n [name]: { name, colors: newTheme.colors, toolColors: newTheme.toolColors },\n },\n }));\n applyTheme(newTheme);\n showToast(`Created '${name}'`);\n } else {\n const old = themes[selectedIdx];\n const updated = { ...localConfig.customThemes };\n delete updated[old.name];\n updated[name] = { name, colors: old.colors, toolColors: old.toolColors };\n const newActive = localConfig.theme === old.name ? name : localConfig.theme;\n setLocalConfig((c) => ({ ...c, theme: newActive, customThemes: updated }));\n showToast(`Renamed to '${name}'`);\n }\n setView('list');\n setNameInput('');\n return;\n }\n if (key.backspace || key.delete) {\n setNameInput((v) => v.slice(0, -1));\n return;\n }\n if (input && input.length === 1) setNameInput((v) => v + input);\n return;\n }\n\n if (view === 'editor' && editingTheme) return;\n\n if (key.escape) {\n const restoreTheme = resolveTheme(localConfig.theme, localConfig.customThemes);\n applyTheme(restoreTheme);\n onClose(localConfig);\n return;\n }\n\n if (key.upArrow) {\n updateSelection(Math.max(0, selectedIdx - 1));\n return;\n }\n if (key.downArrow) {\n updateSelection(Math.min(themes.length - 1, selectedIdx + 1));\n return;\n }\n\n if (key.return) {\n setLocalConfig((c) => ({ ...c, theme: themes[selectedIdx].name }));\n applyTheme(themes[selectedIdx]);\n onClose({ ...localConfig, theme: themes[selectedIdx].name });\n return;\n }\n\n if (input === 'c') {\n setNamingAction('copy');\n setNameInput(themes[selectedIdx].name + '-custom');\n setView('naming');\n return;\n }\n\n const selected = themes[selectedIdx];\n if (input === 'e') {\n if (selected.builtin) {\n showToast('Copy (c) a built-in theme to edit it');\n return;\n }\n setEditingTheme(selected);\n setView('editor');\n return;\n }\n\n if (input === 'r') {\n if (selected.builtin) {\n showToast('Copy (c) a built-in theme to rename it');\n return;\n }\n setNamingAction('rename');\n setNameInput(selected.name);\n setView('naming');\n return;\n }\n\n if (input === 'd') {\n if (selected.builtin) {\n showToast('Cannot delete built-in themes');\n return;\n }\n const updated = { ...localConfig.customThemes };\n delete updated[selected.name];\n const newTheme = localConfig.theme === selected.name ? 'one-dark' : localConfig.theme;\n setLocalConfig((c) => ({ ...c, theme: newTheme, customThemes: updated }));\n if (localConfig.theme === selected.name) applyTheme(getDefaultTheme());\n setSelectedIdx((i) => Math.min(i, themes.length - 2));\n showToast(`Deleted '${selected.name}'`);\n return;\n }\n\n if (key.backspace || key.delete) {\n setLocalConfig((c) => ({ ...c, theme: 'one-dark' }));\n applyTheme(getDefaultTheme());\n showToast('Restored default theme');\n }\n });\n\n const handleEditorSave = useCallback((updated: ThemeDefinition) => {\n setLocalConfig((c) => ({\n ...c,\n customThemes: {\n ...c.customThemes,\n [updated.name]: { name: updated.name, colors: updated.colors, toolColors: updated.toolColors },\n },\n }));\n applyTheme(updated);\n setView('list');\n setEditingTheme(null);\n showToast(`Saved '${updated.name}'`);\n }, []);\n\n const handleEditorCancel = useCallback(() => {\n const restoreTheme = resolveTheme(localConfig.theme, localConfig.customThemes);\n applyTheme(restoreTheme);\n setView('list');\n setEditingTheme(null);\n }, [localConfig]);\n\n if (view === 'editor' && editingTheme) {\n return (\n <Box flexDirection=\"column\" height={termHeight}>\n <Box borderStyle=\"round\" borderColor={colors.primary} flexDirection=\"column\" height={termHeight}>\n <ThemeEditor theme={editingTheme} onSave={handleEditorSave} onCancel={handleEditorCancel} />\n </Box>\n </Box>\n );\n }\n\n const contentHeight = termHeight - 8;\n const halfView = Math.floor(contentHeight / 2);\n const scrollStart = Math.max(0, Math.min(selectedIdx - halfView, themes.length - contentHeight));\n const visibleThemes = themes.slice(Math.max(0, scrollStart), Math.max(0, scrollStart) + contentHeight);\n const visibleStartIdx = Math.max(0, scrollStart);\n\n return (\n <Box flexDirection=\"column\" height={termHeight}>\n <Box\n borderStyle=\"round\"\n borderColor={colors.primary}\n flexDirection=\"column\"\n paddingX={2}\n paddingY={1}\n height={termHeight}\n >\n <Box justifyContent=\"space-between\" marginBottom={1}>\n <Text color={colors.header} bold>\n THEMES\n </Text>\n <Text color={colors.muted}>enter:apply c:copy e:edit r:rename d:delete esc:back</Text>\n </Box>\n\n {view === 'naming' && (\n <Box marginBottom={1}>\n <Text color={colors.warning}>{namingAction === 'copy' ? 'New name' : 'Rename to'}: </Text>\n <Text color={colors.bright}>{nameInput}_</Text>\n </Box>\n )}\n\n {visibleThemes.map((theme, vi) => {\n const realIdx = visibleStartIdx + vi;\n const isSelected = realIdx === selectedIdx;\n const isActive = theme.name === localConfig.theme;\n return (\n <Box key={theme.name}>\n <Text color={isSelected ? colors.primary : colors.text}>\n {isSelected ? '> ' : ' '}\n {isActive ? '* ' : ' '}\n {theme.name}\n </Text>\n <Text color={colors.muted}>{theme.builtin ? ' (built-in)' : ' (custom)'}</Text>\n <Text> </Text>\n <Text color={theme.colors.primary}>{'\\u2588'}</Text>\n <Text color={theme.colors.secondary}>{'\\u2588'}</Text>\n <Text color={theme.colors.accent}>{'\\u2588'}</Text>\n <Text color={theme.colors.warning}>{'\\u2588'}</Text>\n <Text color={theme.colors.error}>{'\\u2588'}</Text>\n </Box>\n );\n })}\n\n {toast && (\n <Box marginTop={1} paddingX={2}>\n <Text color={colors.warning}>{toast}</Text>\n </Box>\n )}\n </Box>\n </Box>\n );\n});\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\n\nimport type { ThemeDefinition, ThemeColors, ToolColors } from '../../config/themes.js';\nimport { COLOR_KEYS, TOOL_COLOR_KEYS } from '../../config/themes.js';\nimport { colors } from '../theme.js';\n\ninterface ThemeEditorProps {\n theme: ThemeDefinition;\n onSave: (theme: ThemeDefinition) => void;\n onCancel: () => void;\n}\n\ntype EditTarget = { group: 'colors'; key: keyof ThemeColors } | { group: 'toolColors'; key: keyof ToolColors };\n\nconst ALL_KEYS: EditTarget[] = [\n ...COLOR_KEYS.map((key) => ({ group: 'colors' as const, key })),\n ...TOOL_COLOR_KEYS.map((key) => ({ group: 'toolColors' as const, key })),\n];\n\nconst isValidHex = (v: string): boolean => /^#[0-9A-Fa-f]{6}$/.test(v);\n\nexport const ThemeEditor: React.FC<ThemeEditorProps> = React.memo(({ theme, onSave, onCancel }) => {\n const [editColors, setEditColors] = useState<ThemeColors>({ ...theme.colors });\n const [editToolColors, setEditToolColors] = useState<ToolColors>({ ...theme.toolColors });\n const [selectedIdx, setSelectedIdx] = useState(0);\n const [editing, setEditing] = useState(false);\n const [inputValue, setInputValue] = useState('');\n\n const currentTarget = ALL_KEYS[selectedIdx];\n const getCurrentValue = (t: EditTarget): string => (t.group === 'colors' ? editColors[t.key] : editToolColors[t.key]);\n\n useInput((input, key) => {\n if (editing) {\n if (key.escape) {\n setEditing(false);\n setInputValue('');\n return;\n }\n if (key.return) {\n const val = inputValue.startsWith('#') ? inputValue : `#${inputValue}`;\n if (isValidHex(val)) {\n if (currentTarget.group === 'colors') {\n setEditColors((c) => ({ ...c, [currentTarget.key]: val }));\n } else {\n setEditToolColors((c) => ({ ...c, [currentTarget.key]: val }));\n }\n }\n setEditing(false);\n setInputValue('');\n return;\n }\n if (key.backspace || key.delete) {\n setInputValue((v) => v.slice(0, -1));\n return;\n }\n if (input && input.length === 1 && /[0-9A-Fa-f#]/.test(input)) {\n setInputValue((v) => v + input);\n }\n return;\n }\n\n if (key.escape) {\n onCancel();\n return;\n }\n if (key.upArrow) {\n setSelectedIdx((i) => Math.max(0, i - 1));\n return;\n }\n if (key.downArrow) {\n setSelectedIdx((i) => Math.min(ALL_KEYS.length - 1, i + 1));\n return;\n }\n\n if (key.return) {\n setEditing(true);\n setInputValue(getCurrentValue(currentTarget));\n return;\n }\n\n if (input === 's' || input === 'S') {\n onSave({ ...theme, colors: editColors, toolColors: editToolColors });\n }\n });\n\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Box justifyContent=\"space-between\" marginBottom={1}>\n <Text color={colors.header} bold>\n EDIT THEME: {theme.name}\n </Text>\n <Text color={colors.muted}>enter:edit s:save esc:cancel</Text>\n </Box>\n\n <Box marginBottom={1}>\n <Text color={colors.accent} bold>\n {' '}\n COLORS\n </Text>\n </Box>\n {COLOR_KEYS.map((k, i) => {\n const isSelected = selectedIdx === i;\n const value = editColors[k];\n const isEditingThis = editing && isSelected;\n return (\n <Box key={k}>\n <Text color={isSelected ? colors.primary : colors.text}>\n {isSelected ? '> ' : ' '} {k.padEnd(12)}\n </Text>\n <Text color={value}>{isEditingThis ? inputValue + '_' : value}</Text>\n <Text color={value}> {'\\u2588\\u2588'}</Text>\n </Box>\n );\n })}\n\n <Box marginTop={1} marginBottom={1}>\n <Text color={colors.accent} bold>\n {' '}\n TOOL COLORS\n </Text>\n </Box>\n {TOOL_COLOR_KEYS.map((k, i) => {\n const realIdx = COLOR_KEYS.length + i;\n const isSelected = selectedIdx === realIdx;\n const value = editToolColors[k];\n const isEditingThis = editing && isSelected;\n return (\n <Box key={k}>\n <Text color={isSelected ? colors.primary : colors.text}>\n {isSelected ? '> ' : ' '} {k.padEnd(12)}\n </Text>\n <Text color={value}>{isEditingThis ? inputValue + '_' : value}</Text>\n <Text color={value}> {'\\u2588\\u2588'}</Text>\n </Box>\n );\n })}\n </Box>\n );\n});\n","import React, { useState, useEffect } from 'react';\nimport { Box, Text, useInput } from 'ink';\n\nimport type { ThemeDefinition } from '../../config/themes.js';\nimport { BUILTIN_THEMES } from '../../config/themes.js';\nimport { applyTheme } from '../theme.js';\nimport { colors } from '../theme.js';\n\ninterface ThemePickerModalProps {\n onSelect: (themeName: string) => void;\n onSkip: () => void;\n onDismiss: () => void;\n}\n\nexport const ThemePickerModal: React.FC<ThemePickerModalProps> = React.memo(({ onSelect, onSkip, onDismiss }) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const themes = BUILTIN_THEMES;\n\n useEffect(() => {\n applyTheme(themes[selectedIndex]);\n }, [selectedIndex]);\n\n useInput((input, key) => {\n if (key.upArrow) setSelectedIndex((i) => Math.max(0, i - 1));\n if (key.downArrow) setSelectedIndex((i) => Math.min(themes.length - 1, i + 1));\n if (key.return) onSelect(themes[selectedIndex].name);\n if (input === 'n') onSkip();\n if (input === 'd') onDismiss();\n });\n\n const renderSwatch = (theme: ThemeDefinition) => {\n const c = theme.colors;\n return (\n <Text>\n <Text color={c.primary}>{'\\u2588'}</Text>\n <Text color={c.secondary}>{'\\u2588'}</Text>\n <Text color={c.accent}>{'\\u2588'}</Text>\n <Text color={c.warning}>{'\\u2588'}</Text>\n <Text color={c.error}>{'\\u2588'}</Text>\n </Text>\n );\n };\n\n return (\n <Box flexDirection=\"column\" paddingX={4} paddingY={1}>\n <Box borderStyle=\"round\" borderColor={colors.primary} flexDirection=\"column\" paddingX={3} paddingY={1}>\n <Box marginBottom={1}>\n <Text color={colors.header} bold>\n Choose a theme\n </Text>\n </Box>\n <Box marginBottom={1}>\n <Text color={colors.text}>Select a theme to get started. You can change this later in settings (s).</Text>\n </Box>\n {themes.map((theme, i) => (\n <Box key={theme.name}>\n <Text color={i === selectedIndex ? colors.primary : colors.muted}>{i === selectedIndex ? '> ' : ' '}</Text>\n {renderSwatch(theme)}\n <Text color={i === selectedIndex ? colors.bright : colors.text}> {theme.name}</Text>\n </Box>\n ))}\n <Box marginTop={1} flexDirection=\"column\">\n <Text color={colors.muted}>Enter = select | n = not now | d = don't ask again</Text>\n </Box>\n </Box>\n </Box>\n );\n});\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\n\nimport { colors } from '../theme.js';\n\ninterface TourStep {\n title: string;\n body: string;\n}\n\nconst STEPS: TourStep[] = [\n {\n title: 'Session list',\n body: 'The left panel shows all active Claude Code sessions. Use j/k to navigate and Enter to view details.',\n },\n {\n title: 'Activity feed',\n body: 'The right panel streams tool calls in real-time. Press Tab to switch between panels.',\n },\n {\n title: 'Split view',\n body: 'Press x to split the activity panel. Pin sessions to left (1) or right (2) panels. Press S to swap.',\n },\n {\n title: 'Filtering',\n body: 'Press / to filter sessions or activity by keyword. Works in any panel.',\n },\n {\n title: 'Session management',\n body: 'Press n to nickname a session, a to archive it, d to delete it. Press A to view archived sessions.',\n },\n {\n title: 'Security alerts',\n body: 'The alert bar highlights suspicious tool calls like network access or sensitive file reads.',\n },\n {\n title: 'Themes & settings',\n body: 'Press s to open settings. Customise keybindings, manage themes, and configure updates.',\n },\n];\n\ninterface GuidedTourProps {\n onComplete: () => void;\n onSkip: () => void;\n}\n\nexport const GuidedTour: React.FC<GuidedTourProps> = React.memo(({ onComplete, onSkip }) => {\n const [stepIndex, setStepIndex] = useState(0);\n const step = STEPS[stepIndex];\n const isLast = stepIndex === STEPS.length - 1;\n\n useInput((input, key) => {\n if (key.return || key.rightArrow) {\n if (isLast) onComplete();\n else setStepIndex((i) => i + 1);\n }\n if (key.leftArrow && stepIndex > 0) setStepIndex((i) => i - 1);\n if (input === 'q' || key.escape) onSkip();\n });\n\n return (\n <Box flexDirection=\"column\" paddingX={4} paddingY={1}>\n <Box borderStyle=\"round\" borderColor={colors.primary} flexDirection=\"column\" paddingX={3} paddingY={1}>\n <Box marginBottom={1}>\n <Text color={colors.header} bold>\n Quick tour ({stepIndex + 1}/{STEPS.length})\n </Text>\n </Box>\n <Box marginBottom={1}>\n <Text color={colors.bright} bold>\n {step.title}\n </Text>\n </Box>\n <Box marginBottom={1}>\n <Text color={colors.text}>{step.body}</Text>\n </Box>\n <Text color={colors.muted}>\n {isLast ? 'Enter = finish' : 'Enter/\\u2192 = next'} | {stepIndex > 0 ? '\\u2190 = back | ' : ''}q = skip tour\n </Text>\n </Box>\n </Box>\n );\n});\n","import React from 'react';\nimport { Box, Text, useInput } from 'ink';\n\nimport { colors } from '../theme.js';\n\ninterface ConfirmModalProps {\n title: string;\n message: string;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport const ConfirmModal: React.FC<ConfirmModalProps> = React.memo(({ title, message, onConfirm, onCancel }) => {\n useInput((input, key) => {\n if (input === 'y' || input === 'Y') {\n onConfirm();\n } else if (input === 'n' || input === 'N' || key.escape) {\n onCancel();\n }\n });\n\n return (\n <Box\n borderStyle=\"round\"\n borderColor={colors.warning}\n flexDirection=\"column\"\n paddingX={2}\n paddingY={1}\n alignSelf=\"center\"\n >\n <Text color={colors.warning} bold>\n {title}\n </Text>\n <Text color={colors.text}>{message}</Text>\n <Box marginTop={1}>\n <Text color={colors.muted}>[y] confirm [n/esc] cancel</Text>\n </Box>\n </Box>\n );\n});\n","import React from 'react';\nimport { Box } from 'ink';\n\nimport type { ToolCall } from '../../discovery/types.js';\nimport type { Session } from '../../discovery/types.js';\nimport type { Panel } from '../App.js';\nimport { colors } from '../theme.js';\nimport { ActivityFeed } from './ActivityFeed.js';\nimport { SessionDetail } from './SessionDetail.js';\n\ninterface SplitPanelProps {\n activePanel: Panel;\n leftSession: Session | null;\n rightSession: Session | null;\n leftEvents: ToolCall[];\n rightEvents: ToolCall[];\n leftScroll: number;\n rightScroll: number;\n leftFilter: string;\n rightFilter: string;\n leftShowDetail: boolean;\n rightShowDetail: boolean;\n height: number;\n}\n\nexport const SplitPanel: React.FC<SplitPanelProps> = React.memo(\n ({\n activePanel,\n leftSession,\n rightSession,\n leftEvents,\n rightEvents,\n leftScroll,\n rightScroll,\n leftFilter,\n rightFilter,\n leftShowDetail,\n rightShowDetail,\n height,\n }) => {\n const left =\n leftShowDetail && leftSession ? (\n <SessionDetail session={leftSession} focused={activePanel === 'left'} height={height} />\n ) : (\n <ActivityFeed\n events={leftEvents}\n sessionSlug={leftSession?.slug ?? null}\n focused={activePanel === 'left'}\n height={height}\n scrollOffset={leftScroll}\n filter={leftFilter || undefined}\n />\n );\n\n const right =\n rightShowDetail && rightSession ? (\n <SessionDetail session={rightSession} focused={activePanel === 'right'} height={height} />\n ) : (\n <ActivityFeed\n events={rightEvents}\n sessionSlug={rightSession?.slug ?? null}\n focused={activePanel === 'right'}\n height={height}\n scrollOffset={rightScroll}\n filter={rightFilter || undefined}\n />\n );\n\n return (\n <Box flexDirection=\"row\" flexGrow={1}>\n <Box\n flexGrow={1}\n borderStyle=\"single\"\n borderRight\n borderTop={false}\n borderBottom={false}\n borderLeft={false}\n borderColor={colors.border}\n >\n {left}\n </Box>\n {right}\n </Box>\n );\n },\n);\n","import { useState, useEffect, useCallback, useRef } from 'react';\n\nimport { discoverSessions } from '../../discovery/sessions.js';\nimport type { Session, TokenUsage } from '../../discovery/types.js';\nimport { getNicknames } from '../../config/store.js';\n\nconst ACTIVE_POLL_MS = 10_000;\nconst IDLE_POLL_MS = 30_000;\n\nexport const useSessions = (\n allUsers: boolean,\n filter?: string,\n archivedIds?: Set<string>,\n viewingArchive?: boolean,\n) => {\n const [sessions, setSessions] = useState<Session[]>([]);\n const [selectedIndex, setSelectedIndex] = useState(0);\n const usageOverrides = useRef(new Map<string, TokenUsage>());\n\n const refresh = useCallback(() => {\n const found = discoverSessions(allUsers);\n const nicknames = getNicknames();\n\n const enriched = found.map((s) => {\n const override = usageOverrides.current.get(s.sessionId);\n return {\n ...s,\n nickname: nicknames[s.sessionId],\n usage: override\n ? {\n inputTokens: s.usage.inputTokens + override.inputTokens,\n cacheCreationTokens: s.usage.cacheCreationTokens + override.cacheCreationTokens,\n cacheReadTokens: s.usage.cacheReadTokens + override.cacheReadTokens,\n outputTokens: s.usage.outputTokens + override.outputTokens,\n }\n : s.usage,\n };\n });\n\n let filtered = enriched;\n\n if (archivedIds && archivedIds.size > 0) {\n if (viewingArchive) {\n filtered = filtered.filter((s) => archivedIds.has(s.sessionId));\n } else {\n filtered = filtered.filter((s) => !archivedIds.has(s.sessionId));\n }\n } else if (viewingArchive) {\n filtered = [];\n }\n\n if (filter) {\n const lower = filter.toLowerCase();\n filtered = filtered.filter(\n (s) =>\n s.slug.toLowerCase().includes(lower) ||\n s.nickname?.toLowerCase().includes(lower) ||\n s.project.toLowerCase().includes(lower) ||\n s.model.toLowerCase().includes(lower),\n );\n }\n\n setSessions(filtered);\n }, [allUsers, filter, archivedIds, viewingArchive]);\n\n useEffect(() => {\n refresh();\n const pollMs = sessions.length > 0 ? ACTIVE_POLL_MS : IDLE_POLL_MS;\n const interval = setInterval(refresh, pollMs);\n return () => clearInterval(interval);\n }, [refresh, sessions.length > 0]);\n\n const selectedSession = sessions[selectedIndex] ?? null;\n\n const selectNext = useCallback(() => {\n setSelectedIndex((i) => Math.min(i + 1, Math.max(0, sessions.length - 1)));\n }, [sessions.length]);\n\n const selectPrev = useCallback(() => {\n setSelectedIndex((i) => Math.max(i - 1, 0));\n }, []);\n\n const selectIndex = useCallback((i: number) => {\n setSelectedIndex(i);\n }, []);\n\n const addUsage = useCallback((sessionId: string, usage: TokenUsage) => {\n const existing = usageOverrides.current.get(sessionId);\n if (existing) {\n usageOverrides.current.set(sessionId, {\n inputTokens: existing.inputTokens + usage.inputTokens,\n cacheCreationTokens: existing.cacheCreationTokens + usage.cacheCreationTokens,\n cacheReadTokens: existing.cacheReadTokens + usage.cacheReadTokens,\n outputTokens: existing.outputTokens + usage.outputTokens,\n });\n } else {\n usageOverrides.current.set(sessionId, usage);\n }\n }, []);\n\n return { sessions, selectedSession, selectedIndex, selectNext, selectPrev, selectIndex, refresh, addUsage };\n};\n","import { useState, useEffect, useRef } from 'react';\n\nimport type { Session, ToolCall } from '../../discovery/types.js';\nimport { Watcher } from '../../ingestion/watcher.js';\n\nconst MAX_EVENTS = 200;\n\nexport const useActivityStream = (session: Session | null, allUsers: boolean) => {\n const [events, setEvents] = useState<ToolCall[]>([]);\n const watcherRef = useRef<Watcher | null>(null);\n\n useEffect(() => {\n setEvents([]);\n\n if (!session) return;\n\n const existingCalls: ToolCall[] = [];\n const tempWatcher = new Watcher(() => {}, allUsers);\n for (const file of session.outputFiles) {\n existingCalls.push(...tempWatcher.readExisting(file));\n }\n setEvents(existingCalls.slice(-MAX_EVENTS));\n\n const handler = (calls: ToolCall[]) => {\n const sessionCalls = calls.filter((c) => c.sessionId === session.sessionId);\n if (sessionCalls.length === 0) return;\n setEvents((prev) => [...prev, ...sessionCalls].slice(-MAX_EVENTS));\n };\n\n const watcher = new Watcher(handler, allUsers);\n watcherRef.current = watcher;\n watcher.start();\n\n return () => {\n watcher.stop();\n watcherRef.current = null;\n };\n }, [session?.sessionId, allUsers]);\n\n return events;\n};\n","import { useMemo } from 'react';\n\nimport type { ToolCall } from '../../discovery/types.js';\n\nconst applyFilter = (events: ToolCall[], filter: string): ToolCall[] => {\n if (!filter) return events;\n const lower = filter.toLowerCase();\n return events.filter(\n (e) => e.toolName.toLowerCase().includes(lower) || JSON.stringify(e.toolInput).toLowerCase().includes(lower),\n );\n};\n\nexport const useFilteredEvents = (rawEvents: ToolCall[], filter: string): ToolCall[] =>\n useMemo(() => applyFilter(rawEvents, filter), [rawEvents, filter]);\n","import { useState, useEffect, useRef } from 'react';\n\nimport type { Alert, AlertSeverity, SecurityEvent } from '../../discovery/types.js';\nimport { SecurityEngine } from '../../analysis/security.js';\nimport { Watcher } from '../../ingestion/watcher.js';\nimport { notify } from '../../notifications.js';\nimport { AlertLogger } from '../../alerts/logger.js';\nimport type { Config } from '../../config/store.js';\n\nconst MAX_ALERTS = 100;\n\nexport const useAlerts = (enabled: boolean, alertLevel: AlertSeverity, allUsers: boolean, config?: Config) => {\n const [alerts, setAlerts] = useState<Alert[]>([]);\n const engineRef = useRef(new SecurityEngine(alertLevel));\n const watcherRef = useRef<Watcher | null>(null);\n const loggerRef = useRef<AlertLogger | null>(null);\n\n useEffect(() => {\n if (!enabled) return;\n\n engineRef.current = new SecurityEngine(alertLevel);\n\n if (config?.alerts.enabled) {\n loggerRef.current = new AlertLogger(config);\n }\n\n const securityHandler = (events: SecurityEvent[]) => {\n const newAlerts: Alert[] = [];\n for (const event of events) {\n newAlerts.push(...engineRef.current.analyzeEvent(event));\n }\n if (newAlerts.length > 0) {\n for (const alert of newAlerts) {\n if (config) {\n notify(alert, config.notifications);\n }\n loggerRef.current?.log(alert);\n }\n setAlerts((prev) => [...prev, ...newAlerts].slice(-MAX_ALERTS));\n }\n };\n\n const watcher = new Watcher(() => {}, allUsers, securityHandler);\n watcherRef.current = watcher;\n watcher.start();\n\n return () => {\n watcher.stop();\n watcherRef.current = null;\n loggerRef.current = null;\n };\n }, [enabled, alertLevel, allUsers]);\n\n const clearAlerts = () => setAlerts([]);\n\n return { alerts, clearAlerts };\n};\n","import { exec } from 'node:child_process';\nimport { platform } from 'node:os';\n\nimport type { Alert, AlertSeverity } from './discovery/types.js';\nimport type { NotificationsConfig } from './config/store.js';\n\nconst SEVERITY_ORDER: Record<AlertSeverity, number> = {\n info: 0,\n warn: 1,\n high: 2,\n critical: 3,\n};\n\nconst RATE_LIMIT_MS = 30_000;\nlet lastDesktopNotification = 0;\n\nexport const notify = (alert: Alert, config: NotificationsConfig): void => {\n if (SEVERITY_ORDER[alert.severity] < SEVERITY_ORDER[config.minSeverity]) return;\n\n if (config.bell) {\n process.stdout.write('\\x07');\n }\n\n if (config.desktop) {\n const now = Date.now();\n if (now - lastDesktopNotification < RATE_LIMIT_MS) return;\n lastDesktopNotification = now;\n\n const title = `agenttop: ${alert.severity} alert`;\n const body = `${alert.sessionSlug}: ${alert.message.slice(0, 100)}`;\n\n const os = platform();\n if (os === 'linux') {\n exec(`notify-send ${JSON.stringify(title)} ${JSON.stringify(body)}`, { timeout: 3000 });\n } else if (os === 'darwin') {\n exec(`osascript -e 'display notification ${JSON.stringify(body)} with title ${JSON.stringify(title)}'`, {\n timeout: 3000,\n });\n }\n }\n};\n","import { appendFileSync, mkdirSync } from 'node:fs';\nimport { dirname } from 'node:path';\n\nimport type { Alert } from '../discovery/types.js';\nimport { resolveAlertLogPath, rotateLogFile } from '../config/store.js';\nimport type { Config } from '../config/store.js';\n\nexport class AlertLogger {\n private logPath: string;\n private writeCount = 0;\n\n constructor(config: Config) {\n this.logPath = resolveAlertLogPath(config);\n mkdirSync(dirname(this.logPath), { recursive: true });\n }\n\n log(alert: Alert): void {\n const entry = {\n timestamp: new Date(alert.timestamp).toISOString(),\n severity: alert.severity,\n rule: alert.rule,\n message: alert.message,\n sessionSlug: alert.sessionSlug,\n sessionId: alert.sessionId,\n };\n\n try {\n appendFileSync(this.logPath, JSON.stringify(entry) + '\\n');\n this.writeCount++;\n if (this.writeCount % 100 === 0) {\n rotateLogFile(this.logPath);\n }\n } catch {\n // silently ignore write errors\n }\n }\n}\n","import { useState, useCallback } from 'react';\n\nexport interface TextInputState {\n value: string;\n isActive: boolean;\n start: (initial?: string) => void;\n cancel: () => void;\n confirm: () => string;\n handleInput: (\n input: string,\n key: { return?: boolean; escape?: boolean; backspace?: boolean; delete?: boolean },\n ) => boolean;\n}\n\nexport const useTextInput = (onConfirm?: (value: string) => void, onCancel?: () => void): TextInputState => {\n const [value, setValue] = useState('');\n const [isActive, setIsActive] = useState(false);\n\n const start = useCallback((initial = '') => {\n setValue(initial);\n setIsActive(true);\n }, []);\n\n const cancel = useCallback(() => {\n setValue('');\n setIsActive(false);\n onCancel?.();\n }, [onCancel]);\n\n const confirm = useCallback(() => {\n const result = value;\n setIsActive(false);\n setValue('');\n onConfirm?.(result);\n return result;\n }, [value, onConfirm]);\n\n const handleInput = useCallback(\n (input: string, key: { return?: boolean; escape?: boolean; backspace?: boolean; delete?: boolean }): boolean => {\n if (!isActive) return false;\n\n if (key.escape) {\n cancel();\n return true;\n }\n\n if (key.return) {\n confirm();\n return true;\n }\n\n if (key.backspace || key.delete) {\n setValue((v) => {\n if (v.length === 0) {\n cancel();\n return v;\n }\n return v.slice(0, -1);\n });\n return true;\n }\n\n if (input && input.length === 1 && input >= ' ') {\n setValue((v) => v + input);\n return true;\n }\n\n return true;\n },\n [isActive, cancel, confirm],\n );\n\n return { value, isActive, start, cancel, confirm, handleInput };\n};\n","import { useInput } from 'ink';\n\nimport type { KeybindingsConfig } from '../../config/store.js';\nimport type { Session } from '../../discovery/types.js';\nimport type { TextInputState } from './useTextInput.js';\nimport type { Panel } from '../App.js';\n\ntype InputMode = 'normal' | 'nickname' | 'filter';\n\nconst matchKey = (binding: string, input: string, key: Record<string, unknown>): boolean => {\n if (binding === 'tab') return Boolean(key.tab);\n if (binding === 'shift+tab') return Boolean(key.shift && key.tab);\n if (binding === 'enter') return Boolean(key.return);\n return input === binding;\n};\n\nexport interface KeyHandlerDeps {\n kb: KeybindingsConfig;\n activePanel: Panel;\n splitMode: boolean;\n inputMode: InputMode;\n showSetup: boolean;\n showSettings: boolean;\n showDetail: boolean;\n leftShowDetail: boolean;\n rightShowDetail: boolean;\n confirmAction: unknown;\n selectedSession: Session | null;\n leftSession: Session | null;\n rightSession: Session | null;\n leftScroll: number;\n rightScroll: number;\n leftFilter: string;\n rightFilter: string;\n filter: string;\n activityFilter: string;\n viewingArchive: boolean;\n archivedIds: Set<string>;\n maxScroll: number;\n leftMaxScroll: number;\n rightMaxScroll: number;\n updateInfo: { available: boolean; latest?: string } | null;\n\n exit: () => void;\n selectNext: () => void;\n selectPrev: () => void;\n refresh: () => void;\n switchPanel: (dir: 'next' | 'prev') => void;\n clearSplitState: () => void;\n resetPanel: (side: 'left' | 'right') => void;\n getActiveFilter: () => string;\n\n setActivePanel: (p: Panel | ((p: Panel) => Panel)) => void;\n setInputMode: (m: InputMode) => void;\n setFilter: (v: string) => void;\n setActivityFilter: (v: string) => void;\n setLeftFilter: (v: string) => void;\n setRightFilter: (v: string) => void;\n setShowDetail: (v: boolean) => void;\n setLeftShowDetail: (v: boolean | ((d: boolean) => boolean)) => void;\n setRightShowDetail: (v: boolean | ((d: boolean) => boolean)) => void;\n setShowSettings: (v: boolean) => void;\n setViewingArchive: (v: boolean | ((v: boolean) => boolean)) => void;\n setSplitMode: (v: boolean) => void;\n setLeftSession: (v: Session | null) => void;\n setRightSession: (v: Session | null) => void;\n setLeftScroll: (v: number | ((s: number) => number)) => void;\n setRightScroll: (v: number | ((s: number) => number)) => void;\n setActivityScroll: (v: number | ((s: number) => number)) => void;\n setConfirmAction: (v: { title: string; message: string; onConfirm: () => void } | null) => void;\n setUpdateStatus: (v: string) => void;\n\n nicknameInput: TextInputState;\n filterInput: TextInputState;\n\n onNickname: (sessionId: string) => void;\n onClearNickname: (sessionId: string) => void;\n onArchive: (sessionId: string) => void;\n onUnarchive: (sessionId: string) => void;\n onDelete: (sess: Session) => void;\n onUpdate: () => void;\n}\n\nexport const useKeyHandler = (deps: KeyHandlerDeps): void => {\n const d = deps;\n\n useInput((input, key) => {\n if (d.showSetup || d.showSettings || d.confirmAction) return;\n\n if (d.inputMode === 'nickname') {\n d.nicknameInput.handleInput(input, key);\n return;\n }\n if (d.inputMode === 'filter') {\n if (key.escape) {\n if (d.activePanel === 'sessions') d.setFilter('');\n else if (d.activePanel === 'left') d.setLeftFilter('');\n else if (d.activePanel === 'right') d.setRightFilter('');\n else d.setActivityFilter('');\n d.setInputMode('normal');\n d.filterInput.cancel();\n return;\n }\n d.filterInput.handleInput(input, key);\n return;\n }\n\n if (matchKey(d.kb.quit, input, key)) {\n d.exit();\n return;\n }\n\n if (d.showDetail && !d.splitMode) {\n if (key.escape || key.return || key.leftArrow) d.setShowDetail(false);\n return;\n }\n if (d.splitMode && (d.leftShowDetail || d.rightShowDetail)) {\n if (key.escape || key.return) {\n if (d.activePanel === 'left') d.setLeftShowDetail(false);\n else if (d.activePanel === 'right') d.setRightShowDetail(false);\n else {\n d.setLeftShowDetail(false);\n d.setRightShowDetail(false);\n }\n return;\n }\n if (key.leftArrow) {\n if (d.activePanel === 'left') d.setLeftShowDetail(false);\n else if (d.activePanel === 'right') d.setRightShowDetail(false);\n return;\n }\n }\n\n if (matchKey(d.kb.split, input, key)) {\n if (d.splitMode) {\n d.clearSplitState();\n } else {\n d.setSplitMode(true);\n d.setLeftSession(d.selectedSession);\n d.setActivePanel('left');\n }\n return;\n }\n\n if (d.splitMode && d.activePanel === 'sessions' && d.selectedSession) {\n if (matchKey(d.kb.pinLeft, input, key)) {\n d.resetPanel('left');\n d.setLeftSession(d.selectedSession);\n return;\n }\n if (matchKey(d.kb.pinRight, input, key)) {\n d.resetPanel('right');\n d.setRightSession(d.selectedSession);\n return;\n }\n }\n\n if (d.splitMode && matchKey(d.kb.swapPanels, input, key)) {\n const tmpLs = d.leftSession;\n const tmpRs = d.rightSession;\n d.setLeftSession(tmpRs);\n d.setRightSession(tmpLs);\n const tmpScroll = d.leftScroll;\n d.setLeftScroll(d.rightScroll);\n d.setRightScroll(tmpScroll);\n const tmpFilt = d.leftFilter;\n d.setLeftFilter(d.rightFilter);\n d.setRightFilter(tmpFilt);\n const tmpDetail = d.leftShowDetail;\n d.setLeftShowDetail(d.rightShowDetail);\n d.setRightShowDetail(tmpDetail);\n return;\n }\n\n if (d.splitMode && matchKey(d.kb.closePanel, input, key)) {\n if (d.activePanel === 'left') {\n d.resetPanel('left');\n if (!d.rightSession) d.clearSplitState();\n } else if (d.activePanel === 'right') {\n d.resetPanel('right');\n if (!d.leftSession) d.clearSplitState();\n }\n return;\n }\n\n if (matchKey(d.kb.detail, input, key) && d.selectedSession) {\n if (d.splitMode) {\n if (d.activePanel === 'left') {\n d.setLeftShowDetail((v) => !v);\n return;\n }\n if (d.activePanel === 'right') {\n d.setRightShowDetail((v) => !v);\n return;\n }\n if (d.activePanel === 'sessions') {\n if (!d.leftSession) {\n d.setLeftSession(d.selectedSession);\n d.setLeftShowDetail(true);\n d.setActivePanel('left');\n } else if (!d.rightSession) {\n d.setRightSession(d.selectedSession);\n d.setRightShowDetail(true);\n d.setActivePanel('right');\n }\n return;\n }\n } else if (d.activePanel === 'sessions') {\n d.setShowDetail(true);\n return;\n }\n }\n\n if (matchKey(d.kb.panelNext, input, key) || key.rightArrow) {\n d.switchPanel('next');\n return;\n }\n if (matchKey(d.kb.panelPrev, input, key) || key.leftArrow) {\n d.switchPanel('prev');\n return;\n }\n\n if (matchKey(d.kb.nickname, input, key) && d.selectedSession) {\n d.setInputMode('nickname');\n d.nicknameInput.start(d.selectedSession.nickname || '');\n return;\n }\n if (matchKey(d.kb.clearNickname, input, key) && d.selectedSession) {\n d.onClearNickname(d.selectedSession.sessionId);\n return;\n }\n if (matchKey(d.kb.filter, input, key)) {\n d.setInputMode('filter');\n d.filterInput.start(d.getActiveFilter());\n return;\n }\n if (key.escape) {\n if (d.activePanel === 'sessions' && d.filter) {\n d.setFilter('');\n return;\n }\n if (d.activePanel === 'activity' && d.activityFilter) {\n d.setActivityFilter('');\n return;\n }\n if (d.activePanel === 'left' && d.leftFilter) {\n d.setLeftFilter('');\n return;\n }\n if (d.activePanel === 'right' && d.rightFilter) {\n d.setRightFilter('');\n return;\n }\n return;\n }\n if (matchKey(d.kb.settings, input, key)) {\n d.setShowSettings(true);\n return;\n }\n if (matchKey(d.kb.viewArchive, input, key)) {\n d.setViewingArchive((v) => !v);\n return;\n }\n if (matchKey(d.kb.archive, input, key) && d.selectedSession) {\n if (d.viewingArchive) d.onUnarchive(d.selectedSession.sessionId);\n else d.onArchive(d.selectedSession.sessionId);\n return;\n }\n if (matchKey(d.kb.delete, input, key) && d.selectedSession) {\n d.onDelete(d.selectedSession);\n return;\n }\n if (matchKey(d.kb.update, input, key) && d.updateInfo?.available) {\n d.onUpdate();\n return;\n }\n\n if (d.activePanel === 'sessions') {\n if (matchKey(d.kb.navDown, input, key) || key.downArrow) d.selectNext();\n if (matchKey(d.kb.navUp, input, key) || key.upArrow) d.selectPrev();\n }\n if (d.activePanel === 'activity') {\n if (matchKey(d.kb.navUp, input, key) || key.upArrow) d.setActivityScroll((s) => Math.min(s + 1, d.maxScroll));\n if (matchKey(d.kb.navDown, input, key) || key.downArrow) d.setActivityScroll((s) => Math.max(s - 1, 0));\n if (matchKey(d.kb.scrollBottom, input, key)) d.setActivityScroll(0);\n if (matchKey(d.kb.scrollTop, input, key)) d.setActivityScroll(d.maxScroll);\n }\n if (d.activePanel === 'left') {\n if (matchKey(d.kb.navUp, input, key) || key.upArrow) d.setLeftScroll((s) => Math.min(s + 1, d.leftMaxScroll));\n if (matchKey(d.kb.navDown, input, key) || key.downArrow) d.setLeftScroll((s) => Math.max(s - 1, 0));\n if (matchKey(d.kb.scrollBottom, input, key)) d.setLeftScroll(0);\n if (matchKey(d.kb.scrollTop, input, key)) d.setLeftScroll(d.leftMaxScroll);\n }\n if (d.activePanel === 'right') {\n if (matchKey(d.kb.navUp, input, key) || key.upArrow) d.setRightScroll((s) => Math.min(s + 1, d.rightMaxScroll));\n if (matchKey(d.kb.navDown, input, key) || key.downArrow) d.setRightScroll((s) => Math.max(s - 1, 0));\n if (matchKey(d.kb.scrollBottom, input, key)) d.setRightScroll(0);\n if (matchKey(d.kb.scrollTop, input, key)) d.setRightScroll(d.rightMaxScroll);\n }\n });\n};\n","import { useState, useEffect } from 'react';\n\nimport { checkForUpdate } from '../../updates.js';\nimport type { UpdateInfo } from '../../updates.js';\n\nexport const useUpdateChecker = (\n disabled: boolean,\n checkOnLaunch: boolean,\n checkInterval: number,\n): UpdateInfo | null => {\n const [updateInfo, setUpdateInfo] = useState<UpdateInfo | null>(null);\n\n useEffect(() => {\n if (disabled || !checkOnLaunch) return;\n try {\n const i = checkForUpdate();\n if (i.available) setUpdateInfo(i);\n } catch {\n /* */\n }\n const iv = setInterval(() => {\n try {\n const i = checkForUpdate();\n if (i.available) setUpdateInfo(i);\n } catch {\n /* */\n }\n }, checkInterval);\n return () => clearInterval(iv);\n }, []);\n\n return updateInfo;\n};\n","import type { CLIOptions, ToolCall, SecurityEvent, TokenUsage } from './discovery/types.js';\nimport { discoverSessions } from './discovery/sessions.js';\nimport { Watcher } from './ingestion/watcher.js';\nimport { SecurityEngine } from './analysis/security.js';\n\nconst write = (msg: string): void => {\n process.stdout.write(msg + '\\n');\n};\n\nconst formatTokens = (n: number): string => {\n if (n >= 1_000_000) return (n / 1_000_000).toFixed(1) + 'M';\n if (n >= 1_000) return (n / 1_000).toFixed(1) + 'k';\n return String(n);\n};\n\nexport const runStreamMode = (options: CLIOptions, isJson: boolean): void => {\n const engine = options.noSecurity ? null : new SecurityEngine(options.alertLevel);\n\n const sessions = discoverSessions(options.allUsers);\n if (isJson) {\n write(JSON.stringify({ type: 'sessions', data: sessions }));\n } else {\n for (const s of sessions) {\n write(\n `SESSION ${s.slug} | ${s.model} | ${s.cwd} | CPU ${s.cpu}% | ${s.memMB}MB | ${formatTokens(s.usage.inputTokens)} in / ${formatTokens(s.usage.outputTokens)} out`,\n );\n }\n }\n\n const handler = (calls: ToolCall[]) => {\n for (const call of calls) {\n if (isJson) {\n write(JSON.stringify({ type: 'tool_call', data: call }));\n } else {\n const ts = new Date(call.timestamp).toLocaleTimeString('en-GB', { hour12: false });\n const input =\n call.toolName === 'Bash'\n ? String(call.toolInput.command || '').slice(0, 80)\n : JSON.stringify(call.toolInput).slice(0, 80);\n write(`${ts} ${call.slug} ${call.toolName.padEnd(8)} ${input}`);\n }\n }\n };\n\n const securityHandler = engine\n ? (events: SecurityEvent[]) => {\n for (const event of events) {\n const alerts = engine.analyzeEvent(event);\n for (const alert of alerts) {\n if (isJson) {\n write(JSON.stringify({ type: 'alert', data: alert }));\n } else {\n const ts = new Date(alert.timestamp).toLocaleTimeString('en-GB', { hour12: false });\n write(`ALERT ${ts} [${alert.severity}] ${alert.sessionSlug}: ${alert.message}`);\n }\n }\n }\n }\n : undefined;\n\n const usageHandler = (sessionId: string, usage: TokenUsage) => {\n if (isJson) {\n write(JSON.stringify({ type: 'usage', data: { sessionId, usage } }));\n } else {\n write(\n `USAGE ${sessionId.slice(0, 12)} +${formatTokens(usage.inputTokens)} in / +${formatTokens(usage.outputTokens)} out`,\n );\n }\n };\n\n const watcher = new Watcher(handler, options.allUsers, securityHandler, usageHandler);\n watcher.start();\n\n process.on('SIGINT', () => {\n watcher.stop();\n process.exit(0);\n });\n process.on('SIGTERM', () => {\n watcher.stop();\n process.exit(0);\n });\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,gBAAAA,qBAAoB;AAC7B,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAC9B,SAAS,iBAAAC,sBAAqB;AAE9B,OAAOC,aAAW;AAClB,SAAS,cAAc;;;ACLvB,SAAgB,YAAAC,YAAU,aAAAC,YAAW,eAAAC,oBAAmB;AACxD,SAAS,OAAAC,OAAK,QAAAC,QAAM,QAAQ,aAAAC,kBAAiB;;;ACiCtC,IAAM,aAAoC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,kBAAwC;AAAA,EACnD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,mBAAmB,CAAC,OAAgC;AAAA,EACxD,MAAM,EAAE;AAAA,EACR,MAAM,EAAE;AAAA,EACR,OAAO,EAAE;AAAA,EACT,MAAM,EAAE;AAAA,EACR,MAAM,EAAE;AAAA,EACR,MAAM,EAAE;AAAA,EACR,MAAM,EAAE;AAAA,EACR,UAAU,EAAE;AAAA,EACZ,WAAW,EAAE;AACf;AAoBA,IAAM,YAAY,CAAC;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,OAAqC;AAAA,EACnC;AAAA,EACA,SAAS;AAAA,EACT,QAAQ,EAAE,SAAS,WAAW,QAAQ,SAAS,OAAO,UAAU,OAAO,MAAM,QAAQ,QAAQ,UAAU,OAAO;AAAA,EAC9G,YAAY,iBAAiB;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,IAAM,UAAyB;AAAA,EAC7B;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA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","names":["readFileSync","join","dirname","fileURLToPath","React","useState","useEffect","useCallback","Box","Text","useStdout","readFileSync","writeFileSync","mkdirSync","join","homedir","readFileSync","join","dirname","fileURLToPath","React","Box","Text","jsx","jsxs","React","Box","Text","React","Box","Text","jsx","jsxs","React","Box","Text","React","Box","Text","jsx","jsxs","formatTime","React","Box","Text","React","Box","Text","jsx","jsxs","formatTokens","formatModel","React","Box","Text","React","useState","Box","Text","jsx","jsxs","React","useState","Box","Text","React","Box","Text","jsx","jsxs","React","Box","Text","React","useState","useEffect","Box","Text","useInput","jsx","jsxs","label","React","useState","useEffect","useInput","kbKey","Box","Text","React","useState","useRef","useEffect","Box","Text","useInput","useStdout","React","useState","Box","Text","useInput","jsx","jsxs","React","useState","useInput","Box","Text","jsx","jsxs","React","useStdout","useState","useRef","useEffect","useInput","Box","Text","React","useState","useEffect","Box","Text","useInput","jsx","jsxs","React","useState","useEffect","useInput","Text","Box","React","useState","Box","Text","useInput","jsx","jsxs","React","useState","useInput","Box","Text","React","Box","Text","useInput","jsx","jsxs","React","useInput","Box","Text","React","Box","jsx","jsxs","React","Box","useState","useEffect","useCallback","useRef","useState","useRef","useCallback","useEffect","useState","useEffect","useRef","useState","useRef","useEffect","useMemo","useState","useEffect","useRef","exec","mkdirSync","dirname","mkdirSync","dirname","useState","useRef","useEffect","useState","useCallback","useInput","useState","useEffect","useState","useEffect","jsx","jsxs","useStdout","useState","useCallback","useEffect","Box","Text","formatTokens","fileURLToPath","join","dirname","readFileSync","write","React"]}
|