agenttop 0.10.6 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/store.ts","../src/mcp/server.ts","../src/discovery/sessions.ts","../src/config.ts","../src/discovery/types.ts","../src/discovery/platform.ts","../src/analysis/rules/network.ts","../src/analysis/rules/exfiltration.ts","../src/analysis/rules/sensitive-files.ts","../src/analysis/rules/shell-escape.ts","../src/analysis/rules/injection.ts","../src/analysis/rules/custom.ts","../src/analysis/security.ts","../src/ingestion/watcher.ts","../src/ingestion/tail.ts","../src/ingestion/parser.ts"],"sourcesContent":["import { existsSync, readFileSync, writeFileSync, mkdirSync, statSync, renameSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nimport type { ThemeColors, ToolColors } from './themes.js';\n\nexport interface SecurityRulesConfig {\n network: boolean;\n exfiltration: boolean;\n sensitiveFiles: boolean;\n shellEscape: boolean;\n injection: boolean;\n}\n\nexport interface NotificationsConfig {\n bell: boolean;\n desktop: boolean;\n minSeverity: 'info' | 'warn' | 'high' | 'critical';\n}\n\nexport interface AlertsConfig {\n logFile: string;\n enabled: boolean;\n staleTimeout: number;\n staleAlertSeverity: 'info' | 'warn' | 'high' | 'critical';\n custom: CustomAlertRule[];\n}\n\nexport interface CustomAlertRule {\n name: string;\n pattern: string;\n match: 'input' | 'output' | 'toolName' | 'all';\n severity: 'info' | 'warn' | 'high' | 'critical';\n message: string;\n enabled: boolean;\n}\n\nexport interface UpdatesConfig {\n checkOnLaunch: boolean;\n checkInterval: number;\n}\n\nexport interface PromptsConfig {\n hook: 'pending' | 'installed' | 'dismissed';\n mcp: 'pending' | 'installed' | 'dismissed';\n theme: 'pending' | 'done' | 'dismissed';\n tour: 'pending' | 'done' | 'dismissed';\n autoUpdate: 'pending' | 'dismissed';\n}\n\nexport interface KeybindingsConfig {\n quit: string;\n navUp: string;\n navDown: string;\n panelNext: string;\n panelPrev: string;\n scrollTop: string;\n scrollBottom: string;\n filter: string;\n nickname: string;\n clearNickname: string;\n detail: string;\n update: string;\n settings: string;\n archive: string;\n delete: string;\n viewArchive: string;\n split: string;\n pinLeft: string;\n pinRight: string;\n swapPanels: string;\n closePanel: string;\n sidebarNarrower: string;\n sidebarWider: string;\n alertRules: string;\n pin: string;\n pinMoveUp: string;\n pinMoveDown: string;\n}\n\nexport interface Config {\n pollInterval: number;\n maxEvents: number;\n maxAlerts: number;\n alertLevel: 'info' | 'warn' | 'high' | 'critical';\n notifications: NotificationsConfig;\n alerts: AlertsConfig;\n updates: UpdatesConfig;\n nicknames: Record<string, string>;\n keybindings: KeybindingsConfig;\n security: {\n enabled: boolean;\n rules: SecurityRulesConfig;\n };\n prompts: PromptsConfig;\n archived: Record<string, number>;\n archiveExpiryDays: number;\n sidebarWidth: number;\n theme: string;\n customThemes: Record<string, { name: string; colors: ThemeColors; toolColors: ToolColors }>;\n pinnedSessions: string[];\n}\n\nexport const getConfigDir = (): string => {\n const xdg = process.env.XDG_CONFIG_HOME;\n if (xdg) return join(xdg, 'agenttop');\n if (process.platform === 'win32' && process.env.APPDATA) return join(process.env.APPDATA, 'agenttop');\n return join(homedir(), '.config', 'agenttop');\n};\n\nexport const getConfigPath = (): string => join(getConfigDir(), 'config.json');\n\nconst defaultConfig = (): Config => ({\n pollInterval: 10000,\n maxEvents: 200,\n maxAlerts: 100,\n alertLevel: 'warn',\n notifications: {\n bell: true,\n desktop: false,\n minSeverity: 'high',\n },\n alerts: {\n logFile: join(getConfigDir(), 'alerts.jsonl'),\n enabled: true,\n staleTimeout: 60,\n staleAlertSeverity: 'warn',\n custom: [],\n },\n updates: {\n checkOnLaunch: true,\n checkInterval: 21600000,\n },\n nicknames: {},\n keybindings: {\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 sidebarNarrower: '<',\n sidebarWider: '>',\n alertRules: 'r',\n pin: 'p',\n pinMoveUp: 'P',\n pinMoveDown: 'ctrl+p',\n },\n security: {\n enabled: true,\n rules: {\n network: true,\n exfiltration: true,\n sensitiveFiles: true,\n shellEscape: true,\n injection: true,\n },\n },\n prompts: {\n hook: 'pending',\n mcp: 'pending',\n theme: 'pending',\n tour: 'pending',\n autoUpdate: 'pending',\n },\n archived: {},\n archiveExpiryDays: 0,\n sidebarWidth: 30,\n theme: 'one-dark',\n customThemes: {},\n pinnedSessions: [],\n});\n\nconst deepMerge = (target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown> => {\n const result = { ...target };\n for (const key of Object.keys(target)) {\n if (key in source) {\n const tVal = target[key];\n const sVal = source[key];\n if (tVal && sVal && typeof tVal === 'object' && typeof sVal === 'object' && !Array.isArray(tVal)) {\n result[key] = deepMerge(tVal as Record<string, unknown>, sVal as Record<string, unknown>);\n } else {\n result[key] = sVal;\n }\n }\n }\n for (const key of Object.keys(source)) {\n if (!(key in target)) {\n result[key] = source[key];\n }\n }\n return result;\n};\n\nexport const loadConfig = (): Config => {\n const configPath = getConfigPath();\n const defaults = defaultConfig();\n\n if (!existsSync(configPath)) {\n return defaults;\n }\n\n try {\n const raw = JSON.parse(readFileSync(configPath, 'utf-8'));\n return deepMerge(defaults as unknown as Record<string, unknown>, raw) as unknown as Config;\n } catch {\n return defaults;\n }\n};\n\nexport const saveConfig = (config: Config): void => {\n const configDir = getConfigDir();\n mkdirSync(configDir, { recursive: true });\n writeFileSync(getConfigPath(), JSON.stringify(config, null, 2) + '\\n');\n};\n\nexport const isFirstRun = (): boolean => !existsSync(getConfigPath());\n\nexport const setNickname = (sessionId: string, nickname: string): void => {\n const config = loadConfig();\n config.nicknames[sessionId] = nickname;\n saveConfig(config);\n};\n\nexport const clearNickname = (sessionId: string): void => {\n const config = loadConfig();\n delete config.nicknames[sessionId];\n saveConfig(config);\n};\n\nexport const getNicknames = (): Record<string, string> => {\n return loadConfig().nicknames;\n};\n\nexport const resolveAlertLogPath = (config: Config): string => {\n const logFile = config.alerts.logFile;\n if (logFile.startsWith('~')) {\n return join(homedir(), logFile.slice(1));\n }\n return logFile;\n};\n\nexport const rotateLogFile = (filePath: string, maxBytes = 10 * 1024 * 1024): void => {\n try {\n const stat = statSync(filePath);\n if (stat.size > maxBytes) {\n const rotated = filePath + '.1';\n if (existsSync(rotated)) {\n try {\n renameSync(rotated, filePath + '.2');\n } catch {\n /* ignore */\n }\n }\n renameSync(filePath, rotated);\n }\n } catch {\n // file doesn't exist yet\n }\n};\n\nexport const archiveSession = (sessionId: string): void => {\n const config = loadConfig();\n config.archived[sessionId] = Date.now();\n saveConfig(config);\n};\n\nexport const unarchiveSession = (sessionId: string): void => {\n const config = loadConfig();\n delete config.archived[sessionId];\n saveConfig(config);\n};\n\nexport const getArchived = (): Record<string, number> => {\n return loadConfig().archived;\n};\n\nexport const purgeExpiredArchives = (): void => {\n const config = loadConfig();\n if (config.archiveExpiryDays <= 0) return;\n const cutoff = Date.now() - config.archiveExpiryDays * 86_400_000;\n let changed = false;\n for (const [id, ts] of Object.entries(config.archived)) {\n if (ts < cutoff) {\n delete config.archived[id];\n changed = true;\n }\n }\n if (changed) saveConfig(config);\n};\n\nexport const deleteSessionFiles = (outputFiles: string[]): void => {\n for (const file of outputFiles) {\n try {\n unlinkSync(file);\n } catch {\n /* file may already be gone */\n }\n }\n};\n\nexport const pinSession = (sessionId: string): void => {\n const config = loadConfig();\n if (!config.pinnedSessions.includes(sessionId)) {\n config.pinnedSessions.push(sessionId);\n saveConfig(config);\n }\n};\n\nexport const unpinSession = (sessionId: string): void => {\n const config = loadConfig();\n config.pinnedSessions = config.pinnedSessions.filter((id) => id !== sessionId);\n saveConfig(config);\n};\n\nexport const movePinned = (sessionId: string, direction: 'up' | 'down'): void => {\n const config = loadConfig();\n const idx = config.pinnedSessions.indexOf(sessionId);\n if (idx === -1) return;\n const newIdx = direction === 'up' ? idx - 1 : idx + 1;\n if (newIdx < 0 || newIdx >= config.pinnedSessions.length) return;\n config.pinnedSessions.splice(idx, 1);\n config.pinnedSessions.splice(newIdx, 0, sessionId);\n saveConfig(config);\n};\n\nexport const getPinnedSessions = (): string[] => loadConfig().pinnedSessions;\n","import { readFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';\n\nimport { discoverSessions } from '../discovery/sessions.js';\nimport type { Alert, AlertSeverity, SecurityEvent, ToolCall } from '../discovery/types.js';\nimport { SecurityEngine } from '../analysis/security.js';\nimport { Watcher } from '../ingestion/watcher.js';\nimport { loadConfig, saveConfig, resolveAlertLogPath, pinSession, unpinSession } from '../config/store.js';\n\nconst MAX_ALERTS = 100;\nconst MAX_ACTIVITY = 200;\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\nexport const startMcpServer = async (allUsers: boolean, noSecurity: boolean): Promise<void> => {\n const alerts: Alert[] = [];\n const activity = new Map<string, ToolCall[]>();\n const engine = noSecurity ? null : new SecurityEngine('info');\n\n const toolHandler = (calls: ToolCall[]) => {\n for (const call of calls) {\n const existing = activity.get(call.sessionId) ?? [];\n existing.push(call);\n if (existing.length > MAX_ACTIVITY) existing.splice(0, existing.length - MAX_ACTIVITY);\n activity.set(call.sessionId, existing);\n }\n };\n\n const securityHandler = engine\n ? (events: SecurityEvent[]) => {\n for (const event of events) {\n const newAlerts = engine.analyzeEvent(event);\n alerts.push(...newAlerts);\n if (alerts.length > MAX_ALERTS) alerts.splice(0, alerts.length - MAX_ALERTS);\n }\n }\n : undefined;\n\n const watcher = new Watcher(toolHandler, allUsers, securityHandler);\n watcher.start();\n\n const server = new Server(\n { name: 'agenttop', version: getVersion() },\n {\n capabilities: { tools: {} },\n },\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [\n {\n name: 'agenttop_sessions',\n description: 'List active Claude Code sessions with model, CPU, MEM, tokens, nickname',\n inputSchema: { type: 'object' as const, properties: {} },\n },\n {\n name: 'agenttop_alerts',\n description: 'Get recent security alerts, optionally filtered by severity',\n inputSchema: {\n type: 'object' as const,\n properties: {\n severity: {\n type: 'string',\n enum: ['info', 'warn', 'high', 'critical'],\n description: 'Minimum severity filter',\n },\n limit: { type: 'number', description: 'Max alerts to return (default 20)' },\n },\n },\n },\n {\n name: 'agenttop_usage',\n description: 'Get token usage for a session or all sessions',\n inputSchema: {\n type: 'object' as const,\n properties: {\n sessionId: { type: 'string', description: 'Session ID (omit for all)' },\n },\n },\n },\n {\n name: 'agenttop_activity',\n description: 'Get recent tool calls for a session',\n inputSchema: {\n type: 'object' as const,\n properties: {\n sessionId: { type: 'string', description: 'Session ID' },\n limit: { type: 'number', description: 'Max events to return (default 20)' },\n },\n required: ['sessionId'],\n },\n },\n {\n name: 'agenttop_waiting_sessions',\n description: 'List sessions in waiting or stale state',\n inputSchema: { type: 'object' as const, properties: {} },\n },\n {\n name: 'agenttop_session_status',\n description: 'Get status for a session',\n inputSchema: {\n type: 'object' as const,\n properties: { sessionId: { type: 'string' } },\n required: ['sessionId'],\n },\n },\n {\n name: 'agenttop_custom_alerts',\n description: 'List custom alert rules',\n inputSchema: { type: 'object' as const, properties: {} },\n },\n {\n name: 'agenttop_set_custom_alert',\n description: 'Add or update a custom alert rule',\n inputSchema: {\n type: 'object' as const,\n properties: {\n name: { type: 'string' },\n pattern: { type: 'string' },\n match: { type: 'string', enum: ['input', 'output', 'toolName', 'all'] },\n severity: { type: 'string', enum: ['info', 'warn', 'high', 'critical'] },\n message: { type: 'string' },\n },\n required: ['name', 'pattern'],\n },\n },\n {\n name: 'agenttop_delete_custom_alert',\n description: 'Delete a custom alert rule',\n inputSchema: { type: 'object' as const, properties: { name: { type: 'string' } }, required: ['name'] },\n },\n {\n name: 'agenttop_alert_history',\n description: 'Get recent alerts with severity filter',\n inputSchema: {\n type: 'object' as const,\n properties: {\n severity: { type: 'string', enum: ['info', 'warn', 'high', 'critical'] },\n limit: { type: 'number' },\n },\n },\n },\n {\n name: 'agenttop_set_stale_timeout',\n description: 'Set stale timeout in seconds',\n inputSchema: { type: 'object' as const, properties: { seconds: { type: 'number' } }, required: ['seconds'] },\n },\n {\n name: 'agenttop_pin_session',\n description: 'Pin a session to top',\n inputSchema: {\n type: 'object' as const,\n properties: { sessionId: { type: 'string' } },\n required: ['sessionId'],\n },\n },\n {\n name: 'agenttop_unpin_session',\n description: 'Unpin a session',\n inputSchema: {\n type: 'object' as const,\n properties: { sessionId: { type: 'string' } },\n required: ['sessionId'],\n },\n },\n ],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n switch (name) {\n case 'agenttop_sessions': {\n const sessions = discoverSessions(allUsers);\n const data = sessions.map((s) => ({\n sessionId: s.sessionId,\n slug: s.slug,\n model: s.model,\n cwd: s.cwd,\n cpu: s.cpu,\n memMB: s.memMB,\n agents: s.agentCount,\n tokens: { input: s.usage.inputTokens, output: s.usage.outputTokens, cacheRead: s.usage.cacheReadTokens },\n status: s.status,\n pinned: s.pinned,\n }));\n return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };\n }\n\n case 'agenttop_alerts': {\n const severity = (args?.severity as AlertSeverity) ?? 'info';\n const limit = (args?.limit as number) ?? 20;\n const order: Record<string, number> = { info: 0, warn: 1, high: 2, critical: 3 };\n const minOrder = order[severity] ?? 0;\n const filtered = alerts\n .filter((a) => (order[a.severity] ?? 0) >= minOrder)\n .slice(-limit)\n .map((a) => ({\n severity: a.severity,\n rule: a.rule,\n message: a.message,\n sessionSlug: a.sessionSlug,\n timestamp: new Date(a.timestamp).toISOString(),\n }));\n return { content: [{ type: 'text', text: JSON.stringify(filtered, null, 2) }] };\n }\n\n case 'agenttop_usage': {\n const sessions = discoverSessions(allUsers);\n const sessionId = args?.sessionId as string | undefined;\n const targets = sessionId ? sessions.filter((s) => s.sessionId === sessionId) : sessions;\n const data = targets.map((s) => ({\n sessionId: s.sessionId,\n slug: s.slug,\n usage: s.usage,\n }));\n return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };\n }\n\n case 'agenttop_activity': {\n const sid = args?.sessionId as string;\n const limit = (args?.limit as number) ?? 20;\n const events = (activity.get(sid) ?? []).slice(-limit).map((e) => ({\n timestamp: new Date(e.timestamp).toISOString(),\n tool: e.toolName,\n input: e.toolInput,\n }));\n return { content: [{ type: 'text', text: JSON.stringify(events, null, 2) }] };\n }\n\n case 'agenttop_waiting_sessions': {\n const sessions = discoverSessions(allUsers);\n const waiting = sessions\n .filter((s) => s.status === 'waiting' || s.status === 'stale')\n .map((s) => ({\n sessionId: s.sessionId,\n slug: s.slug,\n status: s.status,\n cwd: s.cwd,\n model: s.model,\n idleSeconds: Math.round((Date.now() - s.lastActivity) / 1000),\n }));\n return { content: [{ type: 'text', text: JSON.stringify(waiting, null, 2) }] };\n }\n case 'agenttop_session_status': {\n const sid = args?.sessionId as string;\n const sessions = discoverSessions(allUsers);\n const session = sessions.find((s) => s.sessionId === sid);\n if (!session) return { content: [{ type: 'text', text: `Session not found: ${sid}` }], isError: true };\n return { content: [{ type: 'text', text: JSON.stringify({ sessionId: sid, status: session.status }) }] };\n }\n case 'agenttop_custom_alerts': {\n const cfg = loadConfig();\n return { content: [{ type: 'text', text: JSON.stringify(cfg.alerts.custom ?? [], null, 2) }] };\n }\n case 'agenttop_set_custom_alert': {\n const name = args?.name as string;\n const pattern = args?.pattern as string;\n try {\n new RegExp(pattern);\n } catch {\n return { content: [{ type: 'text', text: `Invalid regex: ${pattern}` }], isError: true };\n }\n const cfg = loadConfig();\n const custom = [...(cfg.alerts.custom ?? [])];\n const existing = custom.findIndex((r) => r.name === name);\n const rule = {\n name,\n pattern,\n match: ((args?.match as string) ?? 'all') as 'input' | 'output' | 'toolName' | 'all',\n severity: ((args?.severity as string) ?? 'warn') as 'info' | 'warn' | 'high' | 'critical',\n message: (args?.message as string) ?? name,\n enabled: true,\n };\n if (existing >= 0) custom[existing] = rule;\n else custom.push(rule);\n cfg.alerts.custom = custom;\n saveConfig(cfg);\n return { content: [{ type: 'text', text: `Rule '${name}' saved` }] };\n }\n case 'agenttop_delete_custom_alert': {\n const name = args?.name as string;\n const cfg = loadConfig();\n cfg.alerts.custom = (cfg.alerts.custom ?? []).filter((r) => r.name !== name);\n saveConfig(cfg);\n return { content: [{ type: 'text', text: `Rule '${name}' deleted` }] };\n }\n case 'agenttop_alert_history': {\n const severity = (args?.severity as string) ?? 'info';\n const limit = (args?.limit as number) ?? 50;\n const order: Record<string, number> = { info: 0, warn: 1, high: 2, critical: 3 };\n const minOrder = order[severity] ?? 0;\n const cfg = loadConfig();\n const logPath = resolveAlertLogPath(cfg);\n const logAlerts: { severity: string; rule: string; message: string; sessionSlug: string; timestamp: string }[] =\n [];\n try {\n const lines = readFileSync(logPath, 'utf-8').split('\\n').filter(Boolean);\n for (const line of lines) {\n try {\n const a = JSON.parse(line);\n if ((order[a.severity] ?? 0) >= minOrder)\n logAlerts.push({\n severity: a.severity,\n rule: a.rule,\n message: a.message,\n sessionSlug: a.sessionSlug,\n timestamp: a.timestamp ? new Date(a.timestamp).toISOString() : 'unknown',\n });\n } catch {\n continue;\n }\n }\n } catch {\n /* no log file */\n }\n for (const a of alerts) {\n if ((order[a.severity] ?? 0) >= minOrder)\n logAlerts.push({\n severity: a.severity,\n rule: a.rule,\n message: a.message,\n sessionSlug: a.sessionSlug,\n timestamp: new Date(a.timestamp).toISOString(),\n });\n }\n return { content: [{ type: 'text', text: JSON.stringify(logAlerts.slice(-limit), null, 2) }] };\n }\n case 'agenttop_set_stale_timeout': {\n const seconds = Math.max(15, (args?.seconds as number) ?? 60);\n const cfg = loadConfig();\n cfg.alerts.staleTimeout = seconds;\n saveConfig(cfg);\n return { content: [{ type: 'text', text: `Stale timeout set to ${seconds}s` }] };\n }\n case 'agenttop_pin_session': {\n pinSession(args?.sessionId as string);\n return { content: [{ type: 'text', text: `Session pinned` }] };\n }\n case 'agenttop_unpin_session': {\n unpinSession(args?.sessionId as string);\n return { content: [{ type: 'text', text: `Session unpinned` }] };\n }\n\n default:\n return { content: [{ type: 'text', text: `Unknown tool: ${name}` }], isError: true };\n }\n });\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\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","import { readdirSync, statSync, openSync, readSync, closeSync } from 'node:fs';\nimport { join, basename } from 'node:path';\n\nimport { getTaskDirs, getProjectsDirs } from '../config.js';\nimport type { Session, ProcessInfo, TokenUsage, SessionStatus } from './types.js';\nimport { STATUS_PRIORITY } from './types.js';\nimport { loadConfig } from '../config/store.js';\nimport { getClaudeProcesses } from './platform.js';\n\nexport { getClaudeProcesses };\n\nconst readFirstLines = (filePath: string, bytes: number): string[] => {\n try {\n const fd = openSync(filePath, 'r');\n const buf = Buffer.alloc(bytes);\n const bytesRead = readSync(fd, buf, 0, bytes, 0);\n closeSync(fd);\n return buf.subarray(0, bytesRead).toString('utf-8').split('\\n').filter(Boolean);\n } catch {\n return [];\n }\n};\n\nexport const readTailBytes = (filePath: string, bytes: number): string => {\n try {\n const fd = openSync(filePath, 'r');\n const fstat = statSync(filePath);\n const start = Math.max(0, fstat.size - bytes);\n const readSize = Math.min(bytes, fstat.size);\n const buf = Buffer.alloc(readSize);\n readSync(fd, buf, 0, readSize, start);\n closeSync(fd);\n return buf.toString('utf-8');\n } catch {\n return '';\n }\n};\n\nconst detectStatus = (filePath: string, hasPid: boolean, lastActivity: number, staleTimeout: number): SessionStatus => {\n if (!hasPid) return 'inactive';\n const tail = readTailBytes(filePath, 4096);\n const lines = tail.split('\\n').filter(Boolean);\n if (lines.length > 0) {\n try {\n const lastEvent = JSON.parse(lines[lines.length - 1]);\n if (lastEvent.type === 'assistant') {\n const content = lastEvent.message?.content;\n if (Array.isArray(content)) {\n const hasAskUser = content.some(\n (b: { type?: string; name?: string }) => b.type === 'tool_use' && b.name === 'AskUserQuestion',\n );\n if (hasAskUser) return 'waiting';\n const hasToolUse = content.some((b: { type?: string }) => b.type === 'tool_use');\n if (!hasToolUse) return 'waiting';\n }\n }\n } catch {\n /* malformed */\n }\n }\n if (Date.now() - lastActivity > staleTimeout * 1000) return 'stale';\n return 'active';\n};\n\nconst readFirstEvent = (filePath: string): Record<string, unknown> | null => {\n const lines = readFirstLines(filePath, 16384);\n if (lines.length === 0) return null;\n try {\n return JSON.parse(lines[0]) as Record<string, unknown>;\n } catch {\n return null;\n }\n};\n\nconst findModelAndUsage = (filePath: string): { model: string; usage: TokenUsage } => {\n const usage: TokenUsage = { inputTokens: 0, cacheCreationTokens: 0, cacheReadTokens: 0, outputTokens: 0 };\n let model = '';\n\n const lines = readFirstLines(filePath, 65536);\n for (const line of lines) {\n try {\n const evt = JSON.parse(line);\n if (evt.type === 'assistant') {\n if (!model && evt.message?.model) model = String(evt.message.model);\n const u = evt.message?.usage;\n if (u) {\n usage.inputTokens += u.input_tokens ?? 0;\n usage.cacheCreationTokens += u.cache_creation_input_tokens ?? 0;\n usage.cacheReadTokens += u.cache_read_input_tokens ?? 0;\n usage.outputTokens += u.output_tokens ?? 0;\n }\n }\n } catch {\n continue;\n }\n }\n\n return { model, usage };\n};\n\nconst normalisePath = (p: string): string => p.replace(/\\/+$/, '');\n\nconst extractSessionMeta = (\n filePath: string,\n): { sessionId: string; cwd: string; version: string; gitBranch: string; model: string; usage: TokenUsage } | null => {\n const lines = readFirstLines(filePath, 65536);\n let sessionId = '';\n let cwd = '';\n let version = '';\n let gitBranch = '';\n let model = '';\n const usage: TokenUsage = { inputTokens: 0, cacheCreationTokens: 0, cacheReadTokens: 0, outputTokens: 0 };\n\n for (const line of lines) {\n try {\n const evt = JSON.parse(line);\n if (!sessionId && evt.sessionId) sessionId = String(evt.sessionId);\n if (!cwd && evt.cwd) cwd = String(evt.cwd);\n if (!version && evt.version) version = String(evt.version);\n if (!gitBranch && evt.gitBranch) gitBranch = String(evt.gitBranch);\n if (evt.type === 'assistant') {\n if (!model && evt.message?.model) model = String(evt.message.model);\n const u = evt.message?.usage;\n if (u) {\n usage.inputTokens += u.input_tokens ?? 0;\n usage.cacheCreationTokens += u.cache_creation_input_tokens ?? 0;\n usage.cacheReadTokens += u.cache_read_input_tokens ?? 0;\n usage.outputTokens += u.output_tokens ?? 0;\n }\n }\n } catch {\n continue;\n }\n }\n\n if (!sessionId) return null;\n return { sessionId, cwd, version, gitBranch, model, usage };\n};\n\nconst discoverFromProjects = (\n allUsers: boolean,\n processes: ProcessInfo[],\n sessionMap: Map<string, Session>,\n staleTimeout: number,\n pinnedOrder: string[],\n): void => {\n const projectsDirs = getProjectsDirs(allUsers);\n\n for (const projectsDir of projectsDirs) {\n let projectNames: string[];\n try {\n projectNames = readdirSync(projectsDir);\n } catch {\n continue;\n }\n\n for (const projectName of projectNames) {\n const projectPath = join(projectsDir, projectName);\n try {\n if (!statSync(projectPath).isDirectory()) continue;\n } catch {\n continue;\n }\n\n let files: string[];\n try {\n files = readdirSync(projectPath).filter((f) => f.endsWith('.jsonl'));\n } catch {\n continue;\n }\n\n for (const file of files) {\n const filePath = join(projectPath, file);\n let fstat;\n try {\n fstat = statSync(filePath);\n if (!fstat.isFile() || fstat.size === 0) continue;\n } catch {\n continue;\n }\n\n const meta = extractSessionMeta(filePath);\n if (!meta) continue;\n if (sessionMap.has(meta.sessionId)) continue;\n\n const normCwd = normalisePath(meta.cwd);\n const matchingProcess = processes.find((p) => p.cwd && normalisePath(p.cwd) === normCwd);\n\n const session: Session = {\n sessionId: meta.sessionId,\n slug: meta.sessionId.slice(0, 12),\n project: projectName.replace(/-/g, '/'),\n cwd: meta.cwd,\n model: meta.model || 'unknown',\n version: meta.version,\n gitBranch: meta.gitBranch,\n pid: matchingProcess?.pid ?? null,\n cpu: matchingProcess?.cpu ?? 0,\n mem: matchingProcess?.mem ?? 0,\n memMB: matchingProcess ? Math.round(matchingProcess.memKB / 1024) : 0,\n agentCount: 1,\n agentIds: [basename(file, '.jsonl')],\n outputFiles: [filePath],\n startTime: fstat.birthtimeMs || fstat.ctimeMs,\n lastActivity: fstat.mtimeMs,\n usage: meta.usage,\n status: detectStatus(filePath, matchingProcess !== undefined, fstat.mtimeMs, staleTimeout),\n pinned: pinnedOrder.includes(meta.sessionId),\n };\n\n sessionMap.set(meta.sessionId, session);\n }\n }\n }\n};\n\nconst discoverFromTmp = (\n allUsers: boolean,\n processes: ProcessInfo[],\n sessionMap: Map<string, Session>,\n staleTimeout: number,\n pinnedOrder: string[],\n): void => {\n const taskDirs = getTaskDirs(allUsers);\n\n for (const taskDir of taskDirs) {\n let projectDirs: string[];\n try {\n projectDirs = readdirSync(taskDir);\n } catch {\n continue;\n }\n\n for (const projectName of projectDirs) {\n const projectPath = join(taskDir, projectName);\n try {\n if (!statSync(projectPath).isDirectory()) continue;\n } catch {\n continue;\n }\n\n // both old (project/tasks/) and new (project/session-id/tasks/) layouts\n const tasksPaths: string[] = [];\n const tasksDir = join(projectPath, 'tasks');\n try {\n readdirSync(tasksDir);\n tasksPaths.push(tasksDir);\n } catch {\n // try nested session-id directories\n try {\n for (const sub of readdirSync(projectPath)) {\n const subTasks = join(projectPath, sub, 'tasks');\n try {\n readdirSync(subTasks);\n tasksPaths.push(subTasks);\n } catch {\n continue;\n }\n }\n } catch {\n continue;\n }\n }\n\n for (const tDir of tasksPaths) {\n let outputFiles: string[];\n try {\n outputFiles = readdirSync(tDir)\n .filter((f) => f.endsWith('.output'))\n .map((f) => join(tDir, f));\n } catch {\n continue;\n }\n\n if (outputFiles.length === 0) continue;\n\n const agentIds: string[] = [];\n let sessionId = '';\n let slug = '';\n let cwd = '';\n let model = '';\n let version = '';\n let gitBranch = '';\n let startTime = Infinity;\n let lastActivity = 0;\n const totalUsage: TokenUsage = {\n inputTokens: 0,\n cacheCreationTokens: 0,\n cacheReadTokens: 0,\n outputTokens: 0,\n };\n\n for (const outputFile of outputFiles) {\n const agentId = basename(outputFile, '.output');\n agentIds.push(agentId);\n\n const firstEvent = readFirstEvent(outputFile);\n if (firstEvent) {\n if (!sessionId) sessionId = String(firstEvent.sessionId || '');\n if (!slug) slug = String(firstEvent.slug || '');\n if (!cwd) cwd = String(firstEvent.cwd || '');\n if (!version) version = String(firstEvent.version || '');\n if (!gitBranch) gitBranch = String(firstEvent.gitBranch || '');\n }\n\n try {\n const fstat = statSync(outputFile);\n const created = fstat.birthtimeMs || fstat.ctimeMs;\n if (created < startTime) startTime = created;\n if (fstat.mtimeMs > lastActivity) lastActivity = fstat.mtimeMs;\n } catch {\n // ignore\n }\n\n const result = findModelAndUsage(outputFile);\n if (!model && result.model) model = result.model;\n totalUsage.inputTokens += result.usage.inputTokens;\n totalUsage.cacheCreationTokens += result.usage.cacheCreationTokens;\n totalUsage.cacheReadTokens += result.usage.cacheReadTokens;\n totalUsage.outputTokens += result.usage.outputTokens;\n }\n\n if (!sessionId && !slug) continue;\n if (sessionMap.has(sessionId || projectName)) continue;\n\n const normCwd = normalisePath(cwd);\n const matchingProcess = processes.find((p) => p.cwd && normalisePath(p.cwd) === normCwd);\n\n const latestFile = outputFiles.reduce((a, b) => {\n try {\n return statSync(a).mtimeMs > statSync(b).mtimeMs ? a : b;\n } catch {\n return a;\n }\n });\n\n const session: Session = {\n sessionId,\n slug: slug || sessionId.slice(0, 12),\n project: projectName.replace(/-/g, '/'),\n cwd,\n model: model || 'unknown',\n version,\n gitBranch,\n pid: matchingProcess?.pid ?? null,\n cpu: matchingProcess?.cpu ?? 0,\n mem: matchingProcess?.mem ?? 0,\n memMB: matchingProcess ? Math.round(matchingProcess.memKB / 1024) : 0,\n agentCount: agentIds.length,\n agentIds,\n outputFiles,\n startTime: startTime === Infinity ? Date.now() : startTime,\n lastActivity,\n usage: totalUsage,\n status: detectStatus(latestFile, matchingProcess !== undefined, lastActivity, staleTimeout),\n pinned: pinnedOrder.includes(sessionId),\n };\n\n sessionMap.set(sessionId || projectName, session);\n }\n }\n }\n};\n\nexport const discoverSessions = (allUsers: boolean): Session[] => {\n const config = loadConfig();\n const staleTimeout = config.alerts.staleTimeout ?? 60;\n const pinnedOrder = config.pinnedSessions ?? [];\n const processes = getClaudeProcesses();\n const sessionMap = new Map<string, Session>();\n\n discoverFromProjects(allUsers, processes, sessionMap, staleTimeout, pinnedOrder);\n discoverFromTmp(allUsers, processes, sessionMap, staleTimeout, pinnedOrder);\n\n return Array.from(sessionMap.values()).sort((a, b) => {\n const aPin = pinnedOrder.indexOf(a.sessionId);\n const bPin = pinnedOrder.indexOf(b.sessionId);\n const aIsPinned = aPin !== -1;\n const bIsPinned = bPin !== -1;\n if (aIsPinned && !bIsPinned) return -1;\n if (!aIsPinned && bIsPinned) return 1;\n if (aIsPinned && bIsPinned) return aPin - bPin;\n const aPri = STATUS_PRIORITY[a.status];\n const bPri = STATUS_PRIORITY[b.status];\n if (aPri !== bPri) return aPri - bPri;\n return b.lastActivity - a.lastActivity;\n });\n};\n","import { existsSync, realpathSync, readdirSync } from 'node:fs';\nimport { homedir, platform, tmpdir, userInfo } from 'node:os';\nimport { join } from 'node:path';\n\nconst os = platform();\n\nconst resolvePath = (p: string): string => {\n try {\n return realpathSync(p);\n } catch {\n return p;\n }\n};\n\nexport const getUid = (): string => {\n const uid = process.getuid?.();\n if (uid !== undefined) return String(uid);\n try {\n return userInfo().username;\n } catch {\n return process.env['USERNAME'] || process.env['USER'] || '0';\n }\n};\n\nexport const isRoot = (): boolean => process.getuid?.() === 0;\n\nexport const getTmpDir = (): string => {\n if (os === 'darwin') return resolvePath('/private/tmp');\n if (os === 'win32') return tmpdir();\n return resolvePath('/tmp');\n};\n\nexport const getClaudeHome = (): string => join(homedir(), '.claude');\n\nexport const getHistoryPath = (): string => join(getClaudeHome(), 'history.jsonl');\n\nexport const getTaskDirs = (allUsers: boolean): string[] => {\n const tmp = getTmpDir();\n const uid = getUid();\n\n if (allUsers && os !== 'win32') {\n try {\n const dirs = readdirSync(tmp)\n .filter((d: string) => d.startsWith('claude-'))\n .filter((d: string) => !d.endsWith('-cwd'))\n .map((d: string) => join(tmp, d));\n if (dirs.length > 0) return dirs;\n } catch {\n // fall through to default\n }\n }\n\n const dirs = [join(tmp, `claude-${uid}`)];\n\n if (isRoot()) {\n try {\n const sudoUid = process.env['SUDO_UID'];\n if (sudoUid && sudoUid !== String(uid)) {\n dirs.push(join(tmp, `claude-${sudoUid}`));\n }\n } catch {\n // ignore\n }\n }\n\n return dirs;\n};\n\nexport const getProjectsDirs = (allUsers: boolean): string[] => {\n const dirs: string[] = [];\n const addDir = (d: string) => {\n if (!dirs.includes(d) && existsSync(d)) dirs.push(d);\n };\n\n const home = homedir();\n addDir(join(home, '.claude', 'projects'));\n\n if (isRoot()) {\n addDir(join('/root', '.claude', 'projects'));\n const sudoUser = process.env['SUDO_USER'];\n if (sudoUser) {\n const homeBase = os === 'darwin' ? '/Users' : '/home';\n addDir(join(homeBase, sudoUser, '.claude', 'projects'));\n }\n }\n\n if (allUsers && os !== 'win32') {\n try {\n const homeBase = os === 'darwin' ? '/Users' : '/home';\n for (const user of readdirSync(homeBase)) {\n addDir(join(homeBase, user, '.claude', 'projects'));\n }\n } catch {\n // can't enumerate home dirs — skip\n }\n if (os !== 'darwin') addDir(join('/root', '.claude', 'projects'));\n }\n\n if (allUsers && os === 'win32') {\n try {\n for (const user of readdirSync('C:\\\\Users')) {\n addDir(join('C:\\\\Users', user, '.claude', 'projects'));\n }\n } catch {\n // can't enumerate user dirs — skip\n }\n }\n\n return dirs;\n};\n\nexport const getPlatform = (): 'linux' | 'darwin' | 'win32' => {\n if (os === 'darwin') return 'darwin';\n if (os === 'win32') return 'win32';\n return 'linux';\n};\n\nexport { getConfigDir } from './config/store.js';\n","export interface TokenUsage {\n inputTokens: number;\n cacheCreationTokens: number;\n cacheReadTokens: number;\n outputTokens: number;\n}\n\nexport type SessionStatus = 'waiting' | 'stale' | 'active' | 'inactive';\n\nexport const STATUS_PRIORITY: Record<SessionStatus, number> = {\n waiting: 0,\n stale: 1,\n active: 2,\n inactive: 3,\n};\n\nexport interface Session {\n sessionId: string;\n slug: string;\n project: string;\n cwd: string;\n model: string;\n version: string;\n gitBranch: string;\n pid: number | null;\n cpu: number;\n mem: number;\n memMB: number;\n agentCount: number;\n agentIds: string[];\n outputFiles: string[];\n startTime: number;\n lastActivity: number;\n usage: TokenUsage;\n nickname?: string;\n status: SessionStatus;\n pinned: boolean;\n}\n\nexport interface ToolCall {\n sessionId: string;\n agentId: string;\n slug: string;\n timestamp: number;\n toolName: string;\n toolInput: Record<string, unknown>;\n toolUseId?: string;\n cwd: string;\n}\n\nexport interface ActivityEvent {\n call: ToolCall;\n result?: ToolResult;\n}\n\nexport interface ToolResult {\n sessionId: string;\n agentId: string;\n slug: string;\n timestamp: number;\n toolUseId: string;\n content: string;\n isError: boolean;\n cwd: string;\n}\n\nexport type SecurityEvent = ToolCall | ToolResult;\n\nexport const isToolResult = (event: SecurityEvent): event is ToolResult => 'toolUseId' in event;\n\nexport const isToolCall = (event: SecurityEvent): event is ToolCall => 'toolName' in event;\n\nexport interface RawEvent {\n type: 'user' | 'assistant' | 'tool_result';\n sessionId: string;\n agentId: string;\n slug: string;\n timestamp?: string;\n cwd: string;\n version: string;\n gitBranch: string;\n message: {\n role: string;\n content: unknown;\n model?: string;\n usage?: {\n input_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n output_tokens?: number;\n };\n };\n}\n\nexport type AlertSeverity = 'info' | 'warn' | 'high' | 'critical';\n\nexport interface Alert {\n id: string;\n severity: AlertSeverity;\n rule: string;\n message: string;\n sessionSlug: string;\n sessionId: string;\n event: SecurityEvent;\n timestamp: number;\n}\n\nexport interface SessionGroup {\n key: string;\n sessions: Session[];\n expanded: boolean;\n // aggregated fields for group header\n totalInputTokens: number;\n totalOutputTokens: number;\n latestModel: string;\n status: SessionStatus;\n latestActivity: number;\n earliestStart: number;\n}\n\nexport type VisibleItem =\n | { type: 'group'; group: SessionGroup }\n | { type: 'session'; session: Session; groupKey: string }\n | { type: 'ungrouped'; session: Session };\n\nexport interface ProcessInfo {\n pid: number;\n cpu: number;\n mem: number;\n memKB: number;\n command: string;\n startTime: string;\n cwd: string;\n}\n\nexport interface CLIOptions {\n allUsers: boolean;\n noSecurity: boolean;\n json: boolean;\n plain: boolean;\n alertLevel: AlertSeverity;\n installHooks: boolean;\n uninstallHooks: boolean;\n help: boolean;\n version: boolean;\n noNotify: boolean;\n noAlertLog: boolean;\n noUpdates: boolean;\n pollInterval: number;\n mcp: boolean;\n installMcp: boolean;\n}\n","import { execFileSync, execFile } from 'node:child_process';\nimport { readlinkSync } from 'node:fs';\nimport { readlink } from 'node:fs/promises';\nimport { platform } from 'node:os';\n\nimport type { ProcessInfo } from './types.js';\n\nconst os = platform();\n\nconst parsePsLine = (line: string): ProcessInfo | null => {\n const parts = line.trim().split(/\\s+/);\n const pid = parseInt(parts[1], 10);\n if (isNaN(pid)) return null;\n const command = parts.slice(10).join(' ');\n if (command.startsWith('sudo')) return null;\n return {\n pid,\n cpu: parseFloat(parts[2]) || 0,\n mem: parseFloat(parts[3]) || 0,\n memKB: parseInt(parts[5], 10) || 0,\n startTime: parts[8] || '',\n command,\n cwd: '',\n };\n};\n\nconst isClaudeLine = (line: string): boolean =>\n (line.includes('/claude') || /\\bclaude\\b/.test(line)) && !line.includes('grep') && !line.includes('agenttop');\n\nexport const getProcessCwd = (pid: number): string => {\n if (os === 'linux') {\n try {\n return readlinkSync(`/proc/${pid}/cwd`);\n } catch {\n return '';\n }\n }\n if (os === 'darwin') {\n try {\n const out = execFileSync('lsof', ['-a', '-p', String(pid), '-d', 'cwd', '-Fn'], {\n encoding: 'utf-8',\n timeout: 3000,\n });\n for (const line of out.split('\\n')) {\n if (line.startsWith('n') && line.length > 1) return line.slice(1);\n }\n } catch {\n // lsof may fail for processes we don't own\n }\n return '';\n }\n // windows: cwd not reliably available from OS, resolved from session metadata\n return '';\n};\n\nexport const getProcessCwdAsync = async (pid: number): Promise<string> => {\n if (os === 'linux') {\n try {\n return await readlink(`/proc/${pid}/cwd`);\n } catch {\n return '';\n }\n }\n if (os === 'darwin') {\n return new Promise((resolve) => {\n execFile(\n 'lsof',\n ['-a', '-p', String(pid), '-d', 'cwd', '-Fn'],\n { encoding: 'utf-8', timeout: 3000 },\n (err, out) => {\n if (err || !out) {\n resolve('');\n return;\n }\n for (const line of out.split('\\n')) {\n if (line.startsWith('n') && line.length > 1) {\n resolve(line.slice(1));\n return;\n }\n }\n resolve('');\n },\n );\n });\n }\n return '';\n};\n\nconst getClaudeProcessesUnix = (): ProcessInfo[] => {\n try {\n const output = execFileSync('ps', ['aux'], { encoding: 'utf-8', timeout: 5000 });\n return output\n .split('\\n')\n .filter(isClaudeLine)\n .map(parsePsLine)\n .filter((p): p is ProcessInfo => p !== null);\n } catch {\n return [];\n }\n};\n\nconst getClaudeProcessesWin32 = (): ProcessInfo[] => {\n try {\n const output = execFileSync(\n 'powershell',\n [\n '-NoProfile',\n '-Command',\n \"Get-Process | Where-Object { $_.ProcessName -match 'claude' } | Select-Object Id,CPU,WorkingSet64,Path,StartTime | ConvertTo-Json -Compress\",\n ],\n { encoding: 'utf-8', timeout: 5000 },\n );\n if (!output.trim()) return [];\n const raw = JSON.parse(output.trim());\n const items = Array.isArray(raw) ? raw : [raw];\n return items\n .filter((p: Record<string, unknown>) => p.Id)\n .map((p: Record<string, unknown>) => ({\n pid: Number(p.Id),\n cpu: Number(p.CPU) || 0,\n mem: 0,\n memKB: Math.round((Number(p.WorkingSet64) || 0) / 1024),\n startTime: String(p.StartTime || ''),\n command: String(p.Path || ''),\n cwd: '',\n }));\n } catch {\n return [];\n }\n};\n\nexport const getClaudeProcesses = (): ProcessInfo[] => {\n const procs = os === 'win32' ? getClaudeProcessesWin32() : getClaudeProcessesUnix();\n for (const p of procs) {\n p.cwd = getProcessCwd(p.pid);\n p.memMB = Math.round(p.memKB / 1024);\n }\n return procs;\n};\n\nconst getClaudeProcessesUnixAsync = async (): Promise<ProcessInfo[]> => {\n const stdout = await new Promise<string>((resolve) => {\n execFile('ps', ['aux'], { encoding: 'utf-8', timeout: 5000, maxBuffer: 4 * 1024 * 1024 }, (err, out) => {\n resolve(err || !out ? '' : out);\n });\n });\n if (!stdout) return [];\n return stdout\n .split('\\n')\n .filter(isClaudeLine)\n .map(parsePsLine)\n .filter((p): p is ProcessInfo => p !== null);\n};\n\nconst getClaudeProcessesWin32Async = async (): Promise<ProcessInfo[]> => {\n const stdout = await new Promise<string>((resolve) => {\n execFile(\n 'powershell',\n [\n '-NoProfile',\n '-Command',\n \"Get-Process | Where-Object { $_.ProcessName -match 'claude' } | Select-Object Id,CPU,WorkingSet64,Path,StartTime | ConvertTo-Json -Compress\",\n ],\n { encoding: 'utf-8', timeout: 5000 },\n (err, out) => resolve(err || !out ? '' : out),\n );\n });\n if (!stdout.trim()) return [];\n try {\n const raw = JSON.parse(stdout.trim());\n const items = Array.isArray(raw) ? raw : [raw];\n return items\n .filter((p: Record<string, unknown>) => p.Id)\n .map((p: Record<string, unknown>) => ({\n pid: Number(p.Id),\n cpu: Number(p.CPU) || 0,\n mem: 0,\n memKB: Math.round((Number(p.WorkingSet64) || 0) / 1024),\n startTime: String(p.StartTime || ''),\n command: String(p.Path || ''),\n cwd: '',\n }));\n } catch {\n return [];\n }\n};\n\nexport const getClaudeProcessesAsync = async (): Promise<ProcessInfo[]> => {\n const procs = os === 'win32' ? await getClaudeProcessesWin32Async() : await getClaudeProcessesUnixAsync();\n await Promise.all(\n procs.map(async (p) => {\n p.cwd = await getProcessCwdAsync(p.pid);\n p.memMB = Math.round(p.memKB / 1024);\n }),\n );\n return procs;\n};\n","import type { ToolCall, Alert } from '../../discovery/types.js';\n\nconst NETWORK_PATTERNS = [\n /\\bcurl\\b/,\n /\\bwget\\b/,\n /\\bfetch\\s*\\(/,\n /\\bnc\\b/,\n /\\bnetcat\\b/,\n /\\bpython3?\\s+-m\\s+http\\.server\\b/,\n /\\bncat\\b/,\n /\\bsocat\\b/,\n /\\btelnet\\b/,\n];\n\nconst LOCALHOST = /\\b(localhost|127\\.0\\.0\\.1|0\\.0\\.0\\.0|\\[::1\\])\\b/;\n\nexport const checkNetwork = (call: ToolCall): Alert | null => {\n if (call.toolName !== 'Bash') return null;\n\n const command = String(call.toolInput.command || '');\n const matched = NETWORK_PATTERNS.some((p) => p.test(command));\n if (!matched) return null;\n\n const isLocal = LOCALHOST.test(command);\n const severity = isLocal ? 'info' : 'warn';\n\n return {\n id: `net-${call.timestamp}-${call.agentId}`,\n severity,\n rule: 'network',\n message: isLocal\n ? `Network command to localhost: ${command.slice(0, 80)}`\n : `Network command to external target: ${command.slice(0, 80)}`,\n sessionSlug: call.slug,\n sessionId: call.sessionId,\n event: call,\n timestamp: call.timestamp,\n };\n};\n","import type { ToolCall, Alert } from '../../discovery/types.js';\n\nconst EXFIL_PATTERNS = [\n /base64.*\\|\\s*(curl|wget|nc)/,\n /cat\\s+.*\\|\\s*(curl|wget|nc)/,\n /(tar|zip|gzip).*\\|\\s*(curl|wget|nc)/,\n /\\bcurl\\b.*-d\\s*@/,\n /\\bcurl\\b.*--data-binary/,\n /\\bscp\\b/,\n /\\brsync\\b.*[^/]@/,\n />\\s*\\/dev\\/tcp\\//,\n];\n\nexport const checkExfiltration = (call: ToolCall): Alert | null => {\n if (call.toolName !== 'Bash') return null;\n\n const command = String(call.toolInput.command || '');\n const matched = EXFIL_PATTERNS.some((p) => p.test(command));\n if (!matched) return null;\n\n return {\n id: `exfil-${call.timestamp}-${call.agentId}`,\n severity: 'high',\n rule: 'exfiltration',\n message: `Potential data exfiltration: ${command.slice(0, 80)}`,\n sessionSlug: call.slug,\n sessionId: call.sessionId,\n event: call,\n timestamp: call.timestamp,\n };\n};\n","import type { ToolCall, Alert } from '../../discovery/types.js';\n\nconst SENSITIVE_PATTERNS = [\n /\\.env\\b/,\n /\\.env\\.\\w+/,\n /\\.ssh\\//,\n /id_rsa/,\n /id_ed25519/,\n /\\.pem$/,\n /\\.key$/,\n /credentials/i,\n /\\/etc\\/shadow/,\n /\\/etc\\/passwd/,\n /\\.aws\\/credentials/,\n /\\.kube\\/config/,\n /\\.docker\\/config\\.json/,\n /\\.npmrc/,\n /\\.pypirc/,\n /\\.netrc/,\n /secrets?\\.\\w+/i,\n /token\\.\\w+/i,\n];\n\nconst TOOLS_THAT_READ = ['Read', 'Bash', 'Grep', 'Glob'];\n\nexport const checkSensitiveFiles = (call: ToolCall): Alert | null => {\n if (!TOOLS_THAT_READ.includes(call.toolName)) return null;\n\n const inputs = JSON.stringify(call.toolInput);\n const matched = SENSITIVE_PATTERNS.some((p) => p.test(inputs));\n if (!matched) return null;\n\n const target = String(call.toolInput.file_path || call.toolInput.command || call.toolInput.pattern || '').slice(\n 0,\n 60,\n );\n\n return {\n id: `sens-${call.timestamp}-${call.agentId}`,\n severity: 'warn',\n rule: 'sensitive-files',\n message: `Accessing sensitive file: ${target}`,\n sessionSlug: call.slug,\n sessionId: call.sessionId,\n event: call,\n timestamp: call.timestamp,\n };\n};\n","import type { ToolCall, Alert } from '../../discovery/types.js';\n\nconst SHELL_PATTERNS: Array<{ pattern: RegExp; severity: 'high' | 'critical'; label: string }> = [\n { pattern: /\\beval\\s*[(\"']/, severity: 'high', label: 'eval execution' },\n { pattern: /\\bchmod\\s+777\\b/, severity: 'high', label: 'chmod 777' },\n { pattern: /\\bchmod\\s+\\+s\\b/, severity: 'critical', label: 'setuid chmod' },\n { pattern: /\\bsudo\\b/, severity: 'high', label: 'sudo usage' },\n { pattern: /\\bsu\\s+-?\\s*\\w/, severity: 'high', label: 'su usage' },\n { pattern: />\\s*\\/etc\\//, severity: 'critical', label: 'writing to /etc/' },\n { pattern: />\\s*\\/usr\\//, severity: 'critical', label: 'writing to /usr/' },\n { pattern: /--privileged/, severity: 'critical', label: 'privileged flag' },\n { pattern: /\\brm\\s+-rf\\s+\\/(?!\\w)/, severity: 'critical', label: 'rm -rf /' },\n { pattern: /\\bdd\\s+.*of=\\/dev\\//, severity: 'critical', label: 'dd to device' },\n { pattern: /\\bmkfs\\b/, severity: 'critical', label: 'filesystem format' },\n { pattern: /\\biptables\\b/, severity: 'high', label: 'firewall modification' },\n];\n\nexport const checkShellEscape = (call: ToolCall): Alert | null => {\n if (call.toolName !== 'Bash') return null;\n\n const command = String(call.toolInput.command || '');\n\n for (const rule of SHELL_PATTERNS) {\n if (rule.pattern.test(command)) {\n return {\n id: `shell-${call.timestamp}-${call.agentId}`,\n severity: rule.severity,\n rule: 'shell-escape',\n message: `${rule.label}: ${command.slice(0, 80)}`,\n sessionSlug: call.slug,\n sessionId: call.sessionId,\n event: call,\n timestamp: call.timestamp,\n };\n }\n }\n\n return null;\n};\n","import type { ToolCall, ToolResult, Alert, SecurityEvent } from '../../discovery/types.js';\nimport { isToolResult, isToolCall } from '../../discovery/types.js';\n\nconst INJECTION_PATTERNS = [\n /ignore\\s+(all\\s+)?previous\\s+instructions/i,\n /ignore\\s+(all\\s+)?prior\\s+instructions/i,\n /disregard\\s+(all\\s+)?previous/i,\n /you\\s+are\\s+now\\s+/i,\n /new\\s+instructions?\\s*:/i,\n /system\\s*:\\s*you/i,\n /\\bdo\\s+not\\s+follow\\s+(your|the)\\s+(original|previous)/i,\n /override\\s+(your\\s+)?(instructions|rules|guidelines)/i,\n /forget\\s+(your\\s+)?(instructions|rules|guidelines)/i,\n /act\\s+as\\s+(if\\s+)?(you\\s+are|a)\\s+/i,\n /pretend\\s+(you\\s+are|to\\s+be)\\s+/i,\n /\\bAI\\s+assistant\\b.*\\bmust\\b/i,\n /\\bhuman\\s*:\\s*/i,\n /\\bassistant\\s*:\\s*/i,\n /<\\s*system\\s*>/i,\n /\\[\\s*INST\\s*\\]/i,\n /BEGIN\\s+HIDDEN\\s+INSTRUCTIONS/i,\n];\n\nconst ENCODED_PATTERNS = [\n /aWdub3JlIHByZXZpb3Vz/, // base64 \"ignore previous\"\n /&#x[0-9a-f]+;/i, // html hex entities\n /&#\\d+;/, // html decimal entities\n /\\\\u[0-9a-f]{4}/i, // unicode escapes\n];\n\nexport const checkInjection = (event: SecurityEvent): Alert | null => {\n if (isToolCall(event)) {\n return checkToolCallInjection(event);\n }\n if (isToolResult(event)) {\n return checkToolResultInjection(event);\n }\n return null;\n};\n\nconst checkToolCallInjection = (call: ToolCall): Alert | null => {\n const inputs = JSON.stringify(call.toolInput);\n\n const matched = INJECTION_PATTERNS.some((p) => p.test(inputs));\n if (!matched) return null;\n\n return {\n id: `inject-call-${call.timestamp}-${call.agentId}`,\n severity: 'critical',\n rule: 'injection',\n message: `Prompt injection in ${call.toolName} input`,\n sessionSlug: call.slug,\n sessionId: call.sessionId,\n event: call,\n timestamp: call.timestamp,\n };\n};\n\nconst checkToolResultInjection = (result: ToolResult): Alert | null => {\n const content = result.content;\n if (!content || content.length < 10) return null;\n\n const textPatternMatch = INJECTION_PATTERNS.some((p) => p.test(content));\n const encodedMatch = ENCODED_PATTERNS.some((p) => p.test(content));\n\n if (!textPatternMatch && !encodedMatch) return null;\n\n const matchedPattern = INJECTION_PATTERNS.find((p) => p.test(content));\n const snippet = matchedPattern ? content.match(matchedPattern)?.[0]?.slice(0, 50) || '' : 'encoded pattern';\n\n return {\n id: `inject-result-${result.timestamp}-${result.agentId}`,\n severity: 'critical',\n rule: 'injection-in-result',\n message: `Prompt injection in tool result: \"${snippet}\"`,\n sessionSlug: result.slug,\n sessionId: result.sessionId,\n event: result,\n timestamp: result.timestamp,\n };\n};\n","import type { SecurityEvent, Alert } from '../../discovery/types.js';\nimport { isToolCall, isToolResult } from '../../discovery/types.js';\nimport type { CustomAlertRule } from '../../config/store.js';\n\ntype SecurityEventRule = (event: SecurityEvent) => Alert | null;\n\nexport const createCustomRules = (rules: CustomAlertRule[]): SecurityEventRule[] => {\n const compiled: SecurityEventRule[] = [];\n for (const rule of rules) {\n if (!rule.enabled) continue;\n let regex: RegExp;\n try {\n regex = new RegExp(rule.pattern);\n } catch {\n continue;\n }\n\n const fn: SecurityEventRule = (event: SecurityEvent): Alert | null => {\n let matched = false;\n if (isToolCall(event)) {\n if (rule.match === 'output') return null;\n if (rule.match === 'toolName' || rule.match === 'all') {\n if (regex.test(event.toolName)) matched = true;\n }\n if (!matched && (rule.match === 'input' || rule.match === 'all')) {\n if (regex.test(JSON.stringify(event.toolInput))) matched = true;\n }\n }\n if (isToolResult(event)) {\n if (rule.match === 'input' || rule.match === 'toolName') return null;\n if (rule.match === 'output' || rule.match === 'all') {\n if (regex.test(event.content)) matched = true;\n }\n }\n if (!matched) return null;\n return {\n id: `custom-${rule.name}-${event.timestamp}`,\n severity: rule.severity,\n rule: `custom:${rule.name}`,\n message: rule.message || rule.name,\n sessionSlug: 'slug' in event ? event.slug : '',\n sessionId: 'sessionId' in event ? event.sessionId : '',\n event,\n timestamp: event.timestamp,\n };\n };\n compiled.push(fn);\n }\n return compiled;\n};\n","import type { ToolCall, ToolResult, SecurityEvent, Alert, AlertSeverity } from '../discovery/types.js';\nimport { isToolCall } from '../discovery/types.js';\nimport type { SecurityRulesConfig, CustomAlertRule } from '../config/store.js';\n\nimport { checkNetwork } from './rules/network.js';\nimport { checkExfiltration } from './rules/exfiltration.js';\nimport { checkSensitiveFiles } from './rules/sensitive-files.js';\nimport { checkShellEscape } from './rules/shell-escape.js';\nimport { checkInjection } from './rules/injection.js';\nimport { createCustomRules } from './rules/custom.js';\n\ntype ToolCallRule = (call: ToolCall) => Alert | null;\ntype SecurityEventRule = (event: SecurityEvent) => Alert | null;\n\ninterface NamedRule<T> {\n key: keyof SecurityRulesConfig;\n fn: T;\n}\n\nconst toolCallRules: NamedRule<ToolCallRule>[] = [\n { key: 'network', fn: checkNetwork },\n { key: 'exfiltration', fn: checkExfiltration },\n { key: 'sensitiveFiles', fn: checkSensitiveFiles },\n { key: 'shellEscape', fn: checkShellEscape },\n];\n\nconst allEventRules: NamedRule<SecurityEventRule>[] = [{ key: 'injection', fn: checkInjection }];\n\nconst SEVERITY_ORDER: Record<AlertSeverity, number> = {\n info: 0,\n warn: 1,\n high: 2,\n critical: 3,\n};\n\nconst DEDUP_WINDOW_MS = 30_000;\n\nexport class SecurityEngine {\n private recentAlerts = new Map<string, number>();\n private minLevel: AlertSeverity;\n private rulesConfig: SecurityRulesConfig;\n private customEventRules: SecurityEventRule[] = [];\n\n constructor(minLevel: AlertSeverity = 'warn', rulesConfig?: SecurityRulesConfig, customRules?: CustomAlertRule[]) {\n this.minLevel = minLevel;\n this.rulesConfig = rulesConfig ?? {\n network: true,\n exfiltration: true,\n sensitiveFiles: true,\n shellEscape: true,\n injection: true,\n };\n if (customRules?.length) {\n this.customEventRules = createCustomRules(customRules);\n }\n }\n\n analyze(call: ToolCall): Alert[] {\n return this.analyzeEvent(call);\n }\n\n analyzeResult(result: ToolResult): Alert[] {\n return this.analyzeEvent(result);\n }\n\n analyzeEvent(event: SecurityEvent): Alert[] {\n const alerts: Alert[] = [];\n\n if (isToolCall(event)) {\n for (const rule of toolCallRules) {\n if (!this.rulesConfig[rule.key]) continue;\n const alert = rule.fn(event);\n if (alert) alerts.push(alert);\n }\n }\n\n for (const rule of allEventRules) {\n if (!this.rulesConfig[rule.key]) continue;\n const alert = rule.fn(event);\n if (alert) alerts.push(alert);\n }\n\n for (const fn of this.customEventRules) {\n const alert = fn(event);\n if (alert) alerts.push(alert);\n }\n\n return alerts.filter((alert) => {\n if (SEVERITY_ORDER[alert.severity] < SEVERITY_ORDER[this.minLevel]) return false;\n\n const dedupKey = `${alert.rule}-${alert.sessionId}-${alert.message.slice(0, 40)}`;\n const lastSeen = this.recentAlerts.get(dedupKey);\n if (lastSeen && alert.timestamp - lastSeen < DEDUP_WINDOW_MS) return false;\n\n this.recentAlerts.set(dedupKey, alert.timestamp);\n return true;\n });\n }\n\n pruneOldAlerts(): void {\n const cutoff = Date.now() - DEDUP_WINDOW_MS * 2;\n for (const [key, ts] of this.recentAlerts) {\n if (ts < cutoff) this.recentAlerts.delete(key);\n }\n }\n}\n","import { watch } from 'chokidar';\nimport type { FSWatcher } from 'chokidar';\n\nimport { getTaskDirs, getProjectsDirs } from '../config.js';\nimport type { ToolCall, ToolResult, SecurityEvent, TokenUsage } from '../discovery/types.js';\nimport { FileTailer } from './tail.js';\nimport { parseLines, parseLinesWithResults, parseAllEvents, parseUsageFromLines } from './parser.js';\n\nexport type ToolCallHandler = (calls: ToolCall[]) => void;\nexport type ToolResultHandler = (results: ToolResult[]) => void;\nexport type SecurityEventHandler = (events: SecurityEvent[]) => void;\nexport type UsageHandler = (sessionId: string, usage: TokenUsage) => void;\n\nexport class Watcher {\n private watcher: FSWatcher | null = null;\n private tailer = new FileTailer();\n private handler: ToolCallHandler;\n private resultHandler: ToolResultHandler | null;\n private securityHandler: SecurityEventHandler | null;\n private usageHandler: UsageHandler | null;\n private allUsers: boolean;\n private knownFiles = new Set<string>();\n\n constructor(\n handler: ToolCallHandler,\n allUsers: boolean,\n securityHandler?: SecurityEventHandler,\n usageHandler?: UsageHandler,\n resultHandler?: ToolResultHandler,\n ) {\n this.handler = handler;\n this.allUsers = allUsers;\n this.securityHandler = securityHandler ?? null;\n this.usageHandler = usageHandler ?? null;\n this.resultHandler = resultHandler ?? null;\n }\n\n start(): void {\n const taskDirs = getTaskDirs(this.allUsers);\n const projectsDirs = getProjectsDirs(this.allUsers);\n const globs = [...taskDirs.map((d) => `${d}/**/tasks/*.output`), ...projectsDirs.map((d) => `${d}/**/*.jsonl`)];\n\n this.watcher = watch(globs, {\n persistent: true,\n ignoreInitial: false,\n awaitWriteFinish: false,\n usePolling: false,\n });\n\n this.watcher.on('add', (filePath: string) => {\n if (this.knownFiles.has(filePath)) return;\n this.knownFiles.add(filePath);\n this.tailer.seekToEndAsync(filePath);\n });\n\n this.watcher.on('change', (filePath: string) => {\n this.handleChange(filePath);\n });\n }\n\n private async handleChange(filePath: string): Promise<void> {\n const lines = await this.tailer.readNewLinesAsync(filePath);\n if (lines.length === 0) return;\n\n const { calls, results } = parseLinesWithResults(lines);\n if (calls.length > 0) {\n this.handler(calls);\n }\n if (this.resultHandler && results.length > 0) {\n this.resultHandler(results);\n }\n\n if (this.securityHandler) {\n const allEvents = parseAllEvents(lines);\n if (allEvents.length > 0) {\n this.securityHandler(allEvents);\n }\n }\n\n if (this.usageHandler) {\n const usage = parseUsageFromLines(lines);\n if (usage.inputTokens > 0 || usage.outputTokens > 0) {\n const firstCall = calls[0];\n if (firstCall) {\n this.usageHandler(firstCall.sessionId, usage);\n }\n }\n }\n }\n\n stop(): void {\n this.watcher?.close();\n this.watcher = null;\n this.tailer.resetAll();\n this.knownFiles.clear();\n }\n\n async readExistingAsync(filePath: string): Promise<ToolCall[]> {\n this.tailer.reset(filePath);\n const lines = await this.tailer.readNewLinesAsync(filePath);\n return parseLines(lines);\n }\n\n async readExistingWithResultsAsync(filePath: string): Promise<{ calls: ToolCall[]; results: ToolResult[] }> {\n this.tailer.reset(filePath);\n const lines = await this.tailer.readNewLinesAsync(filePath);\n return parseLinesWithResults(lines);\n }\n\n readExisting(filePath: string): ToolCall[] {\n this.tailer.reset(filePath);\n const lines = this.tailer.readNewLines(filePath);\n return parseLines(lines);\n }\n}\n","import { statSync, openSync, readSync, closeSync } from 'node:fs';\nimport { stat, open } from 'node:fs/promises';\n\nexport class FileTailer {\n private offsets = new Map<string, number>();\n\n async readNewLinesAsync(filePath: string): Promise<string[]> {\n let currentSize: number;\n try {\n const s = await stat(filePath);\n currentSize = s.size;\n } catch {\n return [];\n }\n\n const lastOffset = this.offsets.get(filePath) ?? 0;\n if (currentSize <= lastOffset) return [];\n\n const bytesToRead = currentSize - lastOffset;\n const buf = Buffer.alloc(bytesToRead);\n\n let fh;\n try {\n fh = await open(filePath, 'r');\n await fh.read(buf, 0, bytesToRead, lastOffset);\n } catch {\n return [];\n } finally {\n await fh?.close();\n }\n\n this.offsets.set(filePath, currentSize);\n\n const text = buf.toString('utf-8');\n const lines = text.split('\\n').filter((l) => l.trim().length > 0);\n return lines;\n }\n\n // sync variant kept for hot-path change events where chokidar\n // already knows the file changed (minimal blocking)\n readNewLines(filePath: string): string[] {\n let currentSize: number;\n try {\n currentSize = statSync(filePath).size;\n } catch {\n return [];\n }\n\n const lastOffset = this.offsets.get(filePath) ?? 0;\n if (currentSize <= lastOffset) return [];\n\n const bytesToRead = currentSize - lastOffset;\n const buf = Buffer.alloc(bytesToRead);\n\n let fd: number;\n try {\n fd = openSync(filePath, 'r');\n } catch {\n return [];\n }\n\n try {\n readSync(fd, buf, 0, bytesToRead, lastOffset);\n } finally {\n closeSync(fd);\n }\n\n this.offsets.set(filePath, currentSize);\n\n const text = buf.toString('utf-8');\n const lines = text.split('\\n').filter((l) => l.trim().length > 0);\n return lines;\n }\n\n async seekToEndAsync(filePath: string): Promise<void> {\n try {\n const s = await stat(filePath);\n this.offsets.set(filePath, s.size);\n } catch {\n // file doesn't exist yet\n }\n }\n\n seekToEnd(filePath: string): void {\n try {\n const size = statSync(filePath).size;\n this.offsets.set(filePath, size);\n } catch {\n // file doesn't exist yet\n }\n }\n\n reset(filePath: string): void {\n this.offsets.delete(filePath);\n }\n\n resetAll(): void {\n this.offsets.clear();\n }\n}\n","import type { RawEvent, ToolCall, ToolResult, SecurityEvent, TokenUsage } from '../discovery/types.js';\n\nconst parseEventTimestamp = (event: RawEvent): number => {\n if (event.timestamp) {\n const parsed = new Date(event.timestamp).getTime();\n if (!isNaN(parsed)) return parsed;\n }\n return Date.now();\n};\n\nexport const parseLine = (line: string): RawEvent | null => {\n try {\n return JSON.parse(line) as RawEvent;\n } catch {\n return null;\n }\n};\n\nexport const extractToolCalls = (event: RawEvent): ToolCall[] => {\n if (event.type !== 'assistant') return [];\n\n const content = event.message?.content;\n if (!Array.isArray(content)) return [];\n\n const ts = parseEventTimestamp(event);\n const calls: ToolCall[] = [];\n\n for (const block of content) {\n if (\n typeof block === 'object' &&\n block !== null &&\n 'type' in block &&\n (block as Record<string, unknown>).type === 'tool_use'\n ) {\n const toolBlock = block as Record<string, unknown>;\n calls.push({\n sessionId: event.sessionId,\n agentId: event.agentId,\n slug: ((event as Record<string, unknown>).slug as string) || '',\n timestamp: ts,\n toolName: (toolBlock.name as string) || 'unknown',\n toolInput: (toolBlock.input as Record<string, unknown>) || {},\n toolUseId: (toolBlock.id as string) || undefined,\n cwd: event.cwd,\n });\n }\n }\n\n return calls;\n};\n\nexport const extractToolResults = (event: RawEvent): ToolResult[] => {\n if (event.type !== 'user') return [];\n\n const content = event.message?.content;\n if (!Array.isArray(content)) return [];\n\n const ts = parseEventTimestamp(event);\n const results: ToolResult[] = [];\n\n for (const block of content) {\n if (\n typeof block === 'object' &&\n block !== null &&\n 'type' in block &&\n (block as Record<string, unknown>).type === 'tool_result'\n ) {\n const resultBlock = block as Record<string, unknown>;\n const resultContent = resultBlock.content;\n let text = '';\n if (typeof resultContent === 'string') {\n text = resultContent;\n } else if (Array.isArray(resultContent)) {\n text = resultContent\n .map((c) => (typeof c === 'object' && c !== null ? (c as Record<string, unknown>).text || '' : String(c)))\n .join('\\n');\n }\n\n results.push({\n sessionId: event.sessionId,\n agentId: event.agentId,\n slug: ((event as Record<string, unknown>).slug as string) || '',\n timestamp: ts,\n toolUseId: String(resultBlock.tool_use_id || ''),\n content: text,\n isError: Boolean(resultBlock.is_error),\n cwd: event.cwd,\n });\n }\n }\n\n return results;\n};\n\nexport const extractUsage = (event: RawEvent): TokenUsage | null => {\n if (event.type !== 'assistant') return null;\n\n const usage = event.message?.usage;\n if (!usage) return null;\n\n return {\n inputTokens: usage.input_tokens ?? 0,\n cacheCreationTokens: usage.cache_creation_input_tokens ?? 0,\n cacheReadTokens: usage.cache_read_input_tokens ?? 0,\n outputTokens: usage.output_tokens ?? 0,\n };\n};\n\nexport const parseLines = (lines: string[]): ToolCall[] => {\n const calls: ToolCall[] = [];\n for (const line of lines) {\n const event = parseLine(line);\n if (event) {\n calls.push(...extractToolCalls(event));\n }\n }\n return calls;\n};\n\nexport const parseLinesWithResults = (lines: string[]): { calls: ToolCall[]; results: ToolResult[] } => {\n const calls: ToolCall[] = [];\n const results: ToolResult[] = [];\n for (const line of lines) {\n const event = parseLine(line);\n if (event) {\n calls.push(...extractToolCalls(event));\n results.push(...extractToolResults(event));\n }\n }\n return { calls, results };\n};\n\nexport const parseAllEvents = (lines: string[]): SecurityEvent[] => {\n const events: SecurityEvent[] = [];\n for (const line of lines) {\n const event = parseLine(line);\n if (event) {\n events.push(...extractToolCalls(event));\n events.push(...extractToolResults(event));\n }\n }\n return events;\n};\n\nexport const parseUsageFromLines = (lines: string[]): TokenUsage => {\n const total: TokenUsage = { inputTokens: 0, cacheCreationTokens: 0, cacheReadTokens: 0, outputTokens: 0 };\n for (const line of lines) {\n const event = parseLine(line);\n if (event) {\n const usage = extractUsage(event);\n if (usage) {\n total.inputTokens += usage.inputTokens;\n total.cacheCreationTokens += usage.cacheCreationTokens;\n total.cacheReadTokens += usage.cacheReadTokens;\n total.outputTokens += usage.outputTokens;\n }\n }\n }\n return total;\n};\n"],"mappings":"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","names":["stat","readFileSync","join","readdirSync","statSync","join","existsSync","homedir","join","dirs","join","existsSync","homedir","platform","os","statSync","readdirSync","join","statSync","openSync","readSync","closeSync","join","readFileSync","name"]}