@fml-inc/panopticon 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/client.d.ts +2 -2
- package/dist/api/client.js +1 -1
- package/dist/{chunk-KLXRBD4N.js → chunk-2PMFNSGA.js} +6 -5
- package/dist/{chunk-KLXRBD4N.js.map → chunk-2PMFNSGA.js.map} +1 -1
- package/dist/{chunk-3BUJ7URA.js → chunk-3ILOOWUF.js} +66 -2
- package/dist/chunk-3ILOOWUF.js.map +1 -0
- package/dist/{chunk-NXH7AONS.js → chunk-5FRYHDPJ.js} +8 -6
- package/dist/chunk-5FRYHDPJ.js.map +1 -0
- package/dist/{chunk-TCKL7E4K.js → chunk-5IPC5XXZ.js} +4 -4
- package/dist/{chunk-YZBYEULL.js → chunk-75IXBXBO.js} +5 -5
- package/dist/{chunk-HRCEIYKU.js → chunk-7NBZ4NMJ.js} +2 -2
- package/dist/{chunk-4SM2H22C.js → chunk-HO443ZQM.js} +1 -1
- package/dist/{chunk-4SM2H22C.js.map → chunk-HO443ZQM.js.map} +1 -1
- package/dist/{chunk-3TZAKV3M.js → chunk-OSWBZKK5.js} +2 -2
- package/dist/{chunk-SEXU2WYG.js → chunk-P5KAIE3O.js} +5 -4
- package/dist/chunk-P5KAIE3O.js.map +1 -0
- package/dist/{chunk-XO5NQRTD.js → chunk-RNICEX6N.js} +2 -2
- package/dist/{chunk-L7G27XWF.js → chunk-RRHBTXHB.js} +3 -3
- package/dist/{chunk-BVOE7A2Z.js → chunk-UD6H6EP6.js} +8 -6
- package/dist/chunk-UD6H6EP6.js.map +1 -0
- package/dist/{chunk-LWXF7YRG.js → chunk-UDUBRSIG.js} +2 -2
- package/dist/{chunk-SUGSQ4YI.js → chunk-UEEWG7FD.js} +4 -4
- package/dist/{chunk-DZ5HJFB4.js → chunk-UM5U6FPH.js} +60 -2
- package/dist/chunk-UM5U6FPH.js.map +1 -0
- package/dist/{chunk-VXQ33OYT.js → chunk-YV2AN73J.js} +47 -19
- package/dist/chunk-YV2AN73J.js.map +1 -0
- package/dist/cli.js +6 -6
- package/dist/cli.js.map +1 -1
- package/dist/db.js +1 -1
- package/dist/doctor.js +4 -4
- package/dist/hooks/handler.js +4 -4
- package/dist/index.d.ts +2 -2
- package/dist/index.js +15 -15
- package/dist/mcp/server.js +1 -1
- package/dist/otlp/server.js +5 -5
- package/dist/pricing.js +2 -2
- package/dist/proxy/server.js +5 -5
- package/dist/prune.js +2 -2
- package/dist/query.js +2 -2
- package/dist/{reparse-636YZCE3.js → reparse-TFYD67WP.js} +5 -5
- package/dist/scanner.d.ts +7 -1
- package/dist/scanner.js +1 -1
- package/dist/server.js +13 -13
- package/dist/setup.js +3 -3
- package/dist/sync/index.d.ts +2 -2
- package/dist/sync/index.js +4 -4
- package/dist/{types-D-MYCBol.d.ts → types-DrhrWbWe.d.ts} +1 -0
- package/package.json +1 -1
- package/dist/chunk-3BUJ7URA.js.map +0 -1
- package/dist/chunk-BVOE7A2Z.js.map +0 -1
- package/dist/chunk-DZ5HJFB4.js.map +0 -1
- package/dist/chunk-NXH7AONS.js.map +0 -1
- package/dist/chunk-SEXU2WYG.js.map +0 -1
- package/dist/chunk-VXQ33OYT.js.map +0 -1
- /package/dist/{chunk-TCKL7E4K.js.map → chunk-5IPC5XXZ.js.map} +0 -0
- /package/dist/{chunk-YZBYEULL.js.map → chunk-75IXBXBO.js.map} +0 -0
- /package/dist/{chunk-HRCEIYKU.js.map → chunk-7NBZ4NMJ.js.map} +0 -0
- /package/dist/{chunk-3TZAKV3M.js.map → chunk-OSWBZKK5.js.map} +0 -0
- /package/dist/{chunk-XO5NQRTD.js.map → chunk-RNICEX6N.js.map} +0 -0
- /package/dist/{chunk-L7G27XWF.js.map → chunk-RRHBTXHB.js.map} +0 -0
- /package/dist/{chunk-LWXF7YRG.js.map → chunk-UDUBRSIG.js.map} +0 -0
- /package/dist/{chunk-SUGSQ4YI.js.map → chunk-UEEWG7FD.js.map} +0 -0
- /package/dist/{reparse-636YZCE3.js.map → reparse-TFYD67WP.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server.ts","../src/api/routes.ts","../src/db/sync-prune.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport http from \"node:http\";\nimport { handleApiRequest } from \"./api/routes.js\";\nimport { config } from \"./config.js\";\nimport { autoPrune } from \"./db/prune.js\";\nimport { syncAwarePrune } from \"./db/sync-prune.js\";\nimport { type HookInput, processHookEvent } from \"./hooks/ingest.js\";\nimport { log } from \"./log.js\";\nimport { handleOtlpRequest } from \"./otlp/server.js\";\nimport { handleProxyRequest, tunnelWebSocket } from \"./proxy/server.js\";\nimport { createScannerLoop } from \"./scanner/index.js\";\nimport type { ScannerHandle } from \"./scanner/types.js\";\nimport {\n addBreadcrumb,\n captureException,\n flushSentry,\n initSentry,\n setTag,\n} from \"./sentry.js\";\nimport { createSyncLoop } from \"./sync/loop.js\";\nimport type { SyncHandle } from \"./sync/types.js\";\nimport { loadUnifiedConfig } from \"./unified-config.js\";\n\nfunction collectBody(req: http.IncomingMessage): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n req.on(\"end\", () => resolve(Buffer.concat(chunks)));\n req.on(\"error\", reject);\n });\n}\n\nexport function createUnifiedServer(): http.Server {\n const server = http.createServer(async (req, res) => {\n const url = req.url ?? \"\";\n const method = req.method ?? \"\";\n\n // Health check\n if (url === \"/health\" && method === \"GET\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ status: \"ok\", port: config.port }));\n return;\n }\n\n // Hook event ingest\n if (url === \"/hooks\" && method === \"POST\") {\n try {\n const body = await collectBody(req);\n const data: HookInput = JSON.parse(body.toString(\"utf-8\"));\n addBreadcrumb(\"hooks\", `${data.hook_event_name ?? \"unknown\"} event`, {\n session_id: data.session_id,\n tool_name: data.tool_name,\n target: data.target ?? data.source,\n });\n const result = processHookEvent(data);\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(result));\n } catch (err) {\n log.hooks.error(\"Hook ingest error:\", err);\n captureException(err, { component: \"hooks\" });\n if (!res.headersSent) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"hook ingest failed\" }));\n }\n }\n return;\n }\n\n // OTLP ingest — /v1/logs, /v1/metrics, /v1/traces, or bare \"/\" (Gemini)\n if (\n method === \"POST\" &&\n (url.startsWith(\"/v1/\") || url === \"/\" || url === \"\")\n ) {\n await handleOtlpRequest(req, res);\n return;\n }\n\n // Proxy routes — /proxy/anthropic/*, /proxy/openai/*, /proxy/codex/*, /proxy/google/*\n if (url.startsWith(\"/proxy/\")) {\n if (method !== \"POST\") {\n res.writeHead(405);\n res.end();\n return;\n }\n addBreadcrumb(\"proxy\", `Proxy ${url}`);\n // Strip /proxy prefix so the proxy handler sees /anthropic/*, /openai/*, etc.\n req.url = url.slice(6);\n await handleProxyRequest(req, res);\n return;\n }\n\n // API routes — /api/tool, /api/exec\n if (url.startsWith(\"/api/\") && method === \"POST\") {\n await handleApiRequest(req, res);\n return;\n }\n\n // 404\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"not_found\" }));\n });\n\n // WebSocket upgrades for proxy routes\n server.on(\"upgrade\", (req, socket, head) => {\n const url = req.url ?? \"\";\n if (url.startsWith(\"/proxy/\")) {\n req.url = url.slice(6);\n tunnelWebSocket(req, socket, head);\n } else {\n socket.end(\"HTTP/1.1 404 Not Found\\r\\n\\r\\n\");\n }\n });\n\n return server;\n}\n\n// When run directly, start the unified server\nconst entryScript = process.argv[1]?.replaceAll(\"\\\\\", \"/\") ?? \"\";\nif (entryScript.endsWith(\"/server.js\") || entryScript.endsWith(\"/server.ts\")) {\n const PRUNE_INTERVAL_MS = 60 * 60 * 1000; // 1 hour\n\n function runPrune(): void {\n try {\n const cfg = loadUnifiedConfig();\n addBreadcrumb(\"prune\", \"Running scheduled prune\");\n autoPrune(cfg.retention.maxAgeDays, cfg.retention.maxSizeMb);\n if (cfg.sync.targets.length > 0 && cfg.retention.syncedMaxAgeDays) {\n syncAwarePrune(cfg.sync.targets, cfg.retention);\n }\n } catch (err) {\n log.server.error(\"Prune error:\", err);\n captureException(err, { component: \"prune\" });\n }\n }\n\n const sentryActive = initSentry();\n if (sentryActive) log.server.info(\"Sentry: enabled\");\n\n const server = createUnifiedServer();\n let syncHandle: SyncHandle | null = null;\n let scannerHandle: ScannerHandle | null = null;\n let pruneTimer: ReturnType<typeof setInterval> | null = null;\n\n let takeoverAttempted = false;\n server.on(\"error\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"EADDRINUSE\") {\n if (takeoverAttempted) {\n log.server.warn(`Already running on ${config.host}:${config.port}`);\n process.exit(0);\n }\n takeoverAttempted = true;\n log.server.warn(`Port ${config.port} in use, attempting takeover...`);\n try {\n // Only kill the old panopticon server via PID file, not all\n // processes on the port (which could include Claude Code CLI)\n const pidFile = config.serverPidFile;\n const pidStr = fs.readFileSync(pidFile, \"utf-8\").trim();\n const oldPid = parseInt(pidStr, 10);\n if (oldPid && oldPid !== process.pid) {\n try {\n process.kill(oldPid, \"SIGTERM\");\n } catch {}\n }\n setTimeout(() => server.listen(config.port, config.host), 1500);\n } catch {\n log.server.warn(`Already running on ${config.host}:${config.port}`);\n process.exit(0);\n }\n return;\n }\n captureException(err, { component: \"server\" });\n throw err;\n });\n server.listen(config.port, config.host, () => {\n log.server.info(`Listening on ${config.host}:${config.port}`);\n\n const cfg = loadUnifiedConfig();\n\n // Start session file scanner first — sync is deferred until scanner\n // finishes any initial resync so we don't sync stale/partial data.\n scannerHandle = createScannerLoop({\n onReady: () => {\n if (cfg.sync.targets.length > 0) {\n log.sync.info(\n `Targets: ${cfg.sync.targets.map((t) => t.name).join(\", \")}`,\n );\n setTag(\"sync_targets\", cfg.sync.targets.length);\n syncHandle = createSyncLoop({\n targets: cfg.sync.targets,\n filter: cfg.sync.filter,\n });\n syncHandle.start();\n }\n },\n });\n scannerHandle.start();\n\n // Run prune on startup, then hourly\n runPrune();\n pruneTimer = setInterval(runPrune, PRUNE_INTERVAL_MS);\n pruneTimer.unref();\n });\n\n const shutdown = async () => {\n if (pruneTimer) clearInterval(pruneTimer);\n scannerHandle?.stop();\n syncHandle?.stop();\n await flushSentry();\n server.close();\n process.exit(0);\n };\n process.on(\"SIGTERM\", shutdown);\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGHUP\", shutdown);\n}\n","/**\n * Server-side API route handler.\n *\n * Two endpoints:\n * POST /api/tool — read-only query dispatch (CLI + MCP)\n * POST /api/exec — write command dispatch (CLI only)\n */\nimport type http from \"node:http\";\nimport { refreshPricing } from \"../db/pricing.js\";\nimport { pruneEstimate, pruneExecute } from \"../db/prune.js\";\nimport {\n activitySummary,\n costBreakdown,\n dbStats,\n listPlans,\n listSessions,\n print,\n rawQuery,\n search,\n sessionTimeline,\n} from \"../db/query.js\";\nimport { getDb } from \"../db/schema.js\";\nimport { log } from \"../log.js\";\nimport { addTarget, listTargets, removeTarget } from \"../sync/config.js\";\nimport { TABLE_SYNC_REGISTRY } from \"../sync/registry.js\";\nimport type { SyncTarget } from \"../sync/types.js\";\nimport {\n readWatermark,\n resetWatermarks,\n watermarkKey,\n writeWatermark,\n} from \"../sync/watermark.js\";\n\n// ── Tool dispatch ────────────────────────────────────────────────────────────\n\ntype ToolFn = (params: Record<string, unknown>) => unknown;\n\nconst TOOLS: Record<string, ToolFn> = {\n sessions: (p) => listSessions(p as Parameters<typeof listSessions>[0]),\n timeline: (p) => sessionTimeline(p as Parameters<typeof sessionTimeline>[0]),\n costs: (p) => costBreakdown(p as Parameters<typeof costBreakdown>[0]),\n summary: (p) => activitySummary(p as Parameters<typeof activitySummary>[0]),\n plans: (p) => listPlans(p as Parameters<typeof listPlans>[0]),\n search: (p) => search(p as Parameters<typeof search>[0]),\n get: (p) => print(p as Parameters<typeof print>[0]),\n query: (p) => rawQuery((p as { sql: string }).sql),\n status: () => dbStats(),\n};\n\n// ── Exec dispatch ────────────────────────────────────────────────────────────\n\ntype ExecFn = (params: Record<string, unknown>) => unknown;\n\nconst EXEC: Record<string, ExecFn> = {\n prune: (p) => {\n const cutoffMs = p.cutoffMs as number;\n if (typeof cutoffMs !== \"number\") {\n throw new Error(\"cutoffMs is required and must be a number\");\n }\n if (p.dryRun) {\n return pruneEstimate(cutoffMs);\n }\n const result = pruneExecute(cutoffMs);\n if (p.vacuum) {\n const db = getDb();\n db.pragma(\"wal_checkpoint(TRUNCATE)\");\n db.exec(\"VACUUM\");\n }\n return result;\n },\n \"refresh-pricing\": () => refreshPricing(),\n \"sync-reset\": (p) => {\n const target = p.target as string | undefined;\n resetWatermarks(target);\n return { ok: true, target: target ?? \"all\" };\n },\n \"sync-watermark-get\": (p) => {\n const target = p.target as string;\n if (!target) throw new Error(\"target is required\");\n const table = p.table as string | undefined;\n if (table) {\n return {\n key: watermarkKey(table, target),\n value: readWatermark(watermarkKey(table, target)),\n };\n }\n // Return all watermarks for this target\n const watermarks: Record<string, number> = {};\n for (const desc of TABLE_SYNC_REGISTRY) {\n const key = watermarkKey(desc.table, target);\n watermarks[desc.table] = readWatermark(key);\n }\n return { target, watermarks };\n },\n \"sync-watermark-set\": (p) => {\n const target = p.target as string;\n const table = p.table as string;\n const value = p.value as number;\n if (!target) throw new Error(\"target is required\");\n if (!table) throw new Error(\"table is required\");\n if (typeof value !== \"number\") throw new Error(\"value must be a number\");\n const key = watermarkKey(table, target);\n writeWatermark(key, value);\n return { key, value };\n },\n \"sync-pending\": (p) => {\n const target = p.target as string;\n if (!target) throw new Error(\"target is required\");\n const db = getDb();\n\n /** Maps table name → wm column in target_session_sync. */\n const WM_COLUMNS: Record<string, string> = {\n messages: \"wm_messages\",\n tool_calls: \"wm_tool_calls\",\n scanner_turns: \"wm_scanner_turns\",\n scanner_events: \"wm_scanner_events\",\n hook_events: \"wm_hook_events\",\n otel_logs: \"wm_otel_logs\",\n otel_metrics: \"wm_otel_metrics\",\n otel_spans: \"wm_otel_spans\",\n };\n\n const pending: Record<\n string,\n { total: number; synced: number; pending: number }\n > = {};\n for (const desc of TABLE_SYNC_REGISTRY) {\n const wmCol = WM_COLUMNS[desc.table];\n if (desc.sessionLinked && wmCol) {\n // Session-linked tables: count rows beyond each session's per-session watermark,\n // plus rows belonging to sessions not yet tracked in target_session_sync.\n const total =\n (\n db.prepare(`SELECT COUNT(*) as c FROM ${desc.table}`).get() as {\n c: number;\n }\n )?.c ?? 0;\n const pendingCount =\n (\n db\n .prepare(\n `SELECT COUNT(*) as c FROM ${desc.table} t\n LEFT JOIN target_session_sync tss\n ON tss.session_id = t.session_id AND tss.target = ?\n WHERE tss.${wmCol} IS NULL OR t.id > tss.${wmCol}`,\n )\n .get(target) as { c: number }\n )?.c ?? 0;\n if (pendingCount > 0) {\n pending[desc.table] = {\n total,\n synced: total - pendingCount,\n pending: pendingCount,\n };\n }\n } else {\n // Sessions table and non-session-linked tables: use global watermark.\n const key = watermarkKey(desc.table, target);\n const wm = readWatermark(key);\n const maxId =\n (\n db\n .prepare(\n `SELECT MAX(${desc.table === \"sessions\" ? \"sync_seq\" : \"id\"}) as m FROM ${desc.table}`,\n )\n .get() as { m: number | null }\n )?.m ?? 0;\n const count = Math.max(0, maxId - wm);\n if (count > 0) {\n pending[desc.table] = { total: maxId, synced: wm, pending: count };\n }\n }\n }\n const totalPending = Object.values(pending).reduce(\n (s, v) => s + v.pending,\n 0,\n );\n return { target, totalPending, tables: pending };\n },\n \"sync-target-list\": () => {\n return { targets: listTargets() };\n },\n \"sync-target-add\": (p) => {\n const target = p as unknown as SyncTarget;\n if (!target.name) throw new Error(\"name is required\");\n if (!target.url) throw new Error(\"url is required\");\n addTarget(target);\n return { ok: true, name: target.name, url: target.url };\n },\n \"sync-target-remove\": (p) => {\n const name = p.name as string;\n if (!name) throw new Error(\"name is required\");\n const removed = removeTarget(name);\n return { ok: removed, name };\n },\n};\n\n// ── Request handler ──────────────────────────────────────────────────────────\n\nfunction collectBody(req: http.IncomingMessage): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n req.on(\"end\", () => resolve(Buffer.concat(chunks)));\n req.on(\"error\", reject);\n });\n}\n\nfunction jsonResponse(\n res: http.ServerResponse,\n status: number,\n data: unknown,\n): void {\n res.writeHead(status, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(data));\n}\n\nexport async function handleApiRequest(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n): Promise<void> {\n const url = req.url ?? \"\";\n\n let body: Record<string, unknown>;\n try {\n const raw = await collectBody(req);\n body = raw.length > 0 ? JSON.parse(raw.toString(\"utf-8\")) : {};\n } catch {\n jsonResponse(res, 400, { error: \"Invalid JSON body\" });\n return;\n }\n\n if (url === \"/api/tool\") {\n const name = body.name as string | undefined;\n if (!name || !(name in TOOLS)) {\n jsonResponse(res, 404, {\n error: `Unknown tool: ${name}`,\n available: Object.keys(TOOLS),\n });\n return;\n }\n try {\n const params = (body.params as Record<string, unknown>) ?? {};\n const result = TOOLS[name](params);\n jsonResponse(res, 200, result);\n } catch (err) {\n log.server.error(`API tool \"${name}\" error:`, err);\n jsonResponse(res, 500, {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n return;\n }\n\n if (url === \"/api/exec\") {\n const command = body.command as string | undefined;\n if (!command || !(command in EXEC)) {\n jsonResponse(res, 404, {\n error: `Unknown command: ${command}`,\n available: Object.keys(EXEC),\n });\n return;\n }\n try {\n const params = (body.params as Record<string, unknown>) ?? {};\n const result = await EXEC[command](params);\n jsonResponse(res, 200, result ?? { ok: true });\n } catch (err) {\n log.server.error(`API exec \"${command}\" error:`, err);\n jsonResponse(res, 500, {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n return;\n }\n\n jsonResponse(res, 404, { error: \"Unknown API endpoint\", url });\n}\n","import type { SyncTarget } from \"../sync/types.js\";\nimport { readWatermark, watermarkKey } from \"../sync/watermark.js\";\nimport type { RetentionConfig } from \"../unified-config.js\";\nimport { getDb } from \"./schema.js\";\n\nexport interface SyncPruneResult {\n hook_events: number;\n otel_logs: number;\n otel_metrics: number;\n}\n\n/**\n * Compute the minimum watermark for a table across all sync targets.\n * Returns 0 if no targets exist or any target has watermark 0 (hasn't synced yet).\n */\nexport function minWatermarkForTable(\n table: string,\n targets: SyncTarget[],\n): number {\n if (targets.length === 0) return 0;\n\n let min = Infinity;\n for (const t of targets) {\n const wm = readWatermark(watermarkKey(table, t.name));\n if (wm === 0) return 0;\n if (wm < min) min = wm;\n }\n return min === Infinity ? 0 : min;\n}\n\n/**\n * Aggressively prune rows that have been confirmed synced to ALL targets\n * and are older than `syncedMaxAgeDays`.\n *\n * No-op when:\n * - No sync targets configured\n * - `syncedMaxAgeDays` is not set\n * - Any target has watermark 0 for a given table (hasn't completed first sync)\n */\nexport function syncAwarePrune(\n targets: SyncTarget[],\n retention: RetentionConfig,\n): SyncPruneResult {\n const result: SyncPruneResult = {\n hook_events: 0,\n otel_logs: 0,\n otel_metrics: 0,\n };\n\n if (!retention.syncedMaxAgeDays || targets.length === 0) {\n return result;\n }\n\n const cutoffMs =\n Date.now() - retention.syncedMaxAgeDays * 24 * 60 * 60 * 1000;\n const cutoffNs = cutoffMs * 1_000_000;\n const db = getDb();\n\n const tx = db.transaction(() => {\n // -- hook_events --\n const hookMinWm = minWatermarkForTable(\"hook_events\", targets);\n if (hookMinWm > 0) {\n db.prepare(\n \"DELETE FROM hook_events_fts WHERE rowid IN (SELECT id FROM hook_events WHERE id <= ? AND timestamp_ms < ?)\",\n ).run(hookMinWm, cutoffMs);\n\n result.hook_events = db\n .prepare(\"DELETE FROM hook_events WHERE id <= ? AND timestamp_ms < ?\")\n .run(hookMinWm, cutoffMs).changes;\n }\n\n // -- otel_logs --\n const logsMinWm = minWatermarkForTable(\"otel_logs\", targets);\n if (logsMinWm > 0) {\n result.otel_logs = db\n .prepare(\"DELETE FROM otel_logs WHERE id <= ? AND timestamp_ns < ?\")\n .run(logsMinWm, cutoffNs).changes;\n }\n\n // -- otel_metrics --\n const metricsMinWm = minWatermarkForTable(\"otel_metrics\", targets);\n if (metricsMinWm > 0) {\n result.otel_metrics = db\n .prepare(\"DELETE FROM otel_metrics WHERE id <= ? AND timestamp_ns < ?\")\n .run(metricsMinWm, cutoffNs).changes;\n }\n\n // Session metadata (session_repositories, session_cwds) is local-only —\n // not synced to remote targets. Left to regular time/size-based pruneExecute.\n });\n\n tx();\n return result;\n}\n"],"mappings":"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","names":["collectBody","runPrune"]}
|
package/dist/cli.js
CHANGED
|
@@ -23,7 +23,7 @@ import {
|
|
|
23
23
|
syncTargetRemove,
|
|
24
24
|
syncWatermarkGet,
|
|
25
25
|
syncWatermarkSet
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-HO443ZQM.js";
|
|
27
27
|
import {
|
|
28
28
|
DAEMON_NAMES,
|
|
29
29
|
LOG_DIR,
|
|
@@ -32,7 +32,7 @@ import {
|
|
|
32
32
|
} from "./chunk-7Q3BJMLG.js";
|
|
33
33
|
import {
|
|
34
34
|
refreshPricing as refreshPricing2
|
|
35
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-OSWBZKK5.js";
|
|
36
36
|
import {
|
|
37
37
|
loadUnifiedConfig
|
|
38
38
|
} from "./chunk-QK5442ZP.js";
|
|
@@ -45,7 +45,7 @@ import {
|
|
|
45
45
|
import {
|
|
46
46
|
closeDb,
|
|
47
47
|
getDb
|
|
48
|
-
} from "./chunk-
|
|
48
|
+
} from "./chunk-UM5U6FPH.js";
|
|
49
49
|
import {
|
|
50
50
|
config,
|
|
51
51
|
ensureDataDir
|
|
@@ -334,7 +334,7 @@ function removeShellEnv() {
|
|
|
334
334
|
}
|
|
335
335
|
var program = new Command();
|
|
336
336
|
program.name("panopticon").description("Observability for Claude Code").version(
|
|
337
|
-
true ? "0.1.
|
|
337
|
+
true ? "0.1.3+1deea73" : "dev"
|
|
338
338
|
);
|
|
339
339
|
program.command("install").alias("setup").description("Build, register plugin, init DB, configure shell").option(
|
|
340
340
|
"--target <target>",
|
|
@@ -462,7 +462,7 @@ program.command("uninstall").description("Remove panopticon hooks, shell config,
|
|
|
462
462
|
}
|
|
463
463
|
});
|
|
464
464
|
program.command("update").description("Update panopticon to the latest version").action(async () => {
|
|
465
|
-
const currentVersion = true ? "0.1.
|
|
465
|
+
const currentVersion = true ? "0.1.3+1deea73" : "unknown";
|
|
466
466
|
console.log(`Current: ${currentVersion}`);
|
|
467
467
|
console.log(
|
|
468
468
|
"To update, re-run the install command for your package manager:\n"
|
|
@@ -821,7 +821,7 @@ program.command("status").description("Show server status and database stats").a
|
|
|
821
821
|
console.log(` pending: ${result.totalPending} total`);
|
|
822
822
|
for (const [table, info] of Object.entries(result.tables)) {
|
|
823
823
|
console.log(
|
|
824
|
-
` ${table}: ${info.pending} (${info.
|
|
824
|
+
` ${table}: ${info.pending} (${info.synced} / ${info.total})`
|
|
825
825
|
);
|
|
826
826
|
}
|
|
827
827
|
}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/toml.ts"],"sourcesContent":["#!/usr/bin/env node\n\ndeclare const __PANOPTICON_VERSION__: string;\n\nimport { execFileSync, spawn } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport readline from \"node:readline\";\nimport { fileURLToPath } from \"node:url\";\nimport { Command, type OptionValues } from \"commander\";\n\ntype Opts = OptionValues;\n\nimport {\n activitySummary,\n costBreakdown,\n dbStats,\n listPlans,\n listSessions,\n print,\n pruneEstimate,\n pruneExecute,\n rawQuery,\n refreshPricing,\n search,\n sessionTimeline,\n syncPending,\n syncReset,\n syncTargetAdd,\n syncTargetList,\n syncTargetRemove,\n syncWatermarkGet,\n syncWatermarkSet,\n} from \"./api/client.js\";\nimport { config, ensureDataDir } from \"./config.js\";\nimport { refreshPricing as refreshPricingDirect } from \"./db/pricing.js\";\nimport { closeDb, getDb } from \"./db/schema.js\";\nimport {\n DAEMON_NAMES,\n type DaemonName,\n LOG_DIR,\n logPaths,\n openLogFd,\n} from \"./log.js\";\nimport { permissionsApply, permissionsShow } from \"./mcp/permissions.js\";\nimport { allTargets, getTarget, targetIds } from \"./targets/index.js\";\nimport { readTomlFile, writeTomlFile } from \"./toml.js\";\nimport { loadUnifiedConfig } from \"./unified-config.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction output(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n\nfunction getPluginRoot(): string {\n let dir = path.dirname(fileURLToPath(import.meta.url));\n dir = path.resolve(dir, \"..\");\n return dir;\n}\n\nfunction stopExistingDaemons(): void {\n const pidsKilled = new Set<number>();\n\n // 1. Try PID files first\n for (const pidFile of [config.serverPidFile, config.pidFile]) {\n try {\n const pid = parseInt(fs.readFileSync(pidFile, \"utf-8\").trim(), 10);\n process.kill(pid, \"SIGTERM\");\n pidsKilled.add(pid);\n } catch {}\n try {\n fs.unlinkSync(pidFile);\n } catch {}\n }\n\n // 2. Fallback: kill whatever is listening on our port (covers purged PID files)\n try {\n const out = execFileSync(\"lsof\", [\"-ti\", `tcp:${config.port}`], {\n encoding: \"utf-8\",\n timeout: 3000,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n for (const line of out.split(\"\\n\")) {\n const pid = parseInt(line, 10);\n if (pid && !pidsKilled.has(pid)) {\n try {\n process.kill(pid, \"SIGTERM\");\n pidsKilled.add(pid);\n } catch {}\n }\n }\n } catch {}\n\n // 3. Wait for port to be free (up to 3s)\n if (pidsKilled.size > 0) {\n const deadline = Date.now() + 3000;\n while (Date.now() < deadline) {\n try {\n execFileSync(\"lsof\", [\"-ti\", `tcp:${config.port}`], {\n encoding: \"utf-8\",\n timeout: 1000,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n // lsof succeeded = port still in use, wait and retry\n } catch {\n break; // lsof failed = port is free\n }\n const waitMs = Math.min(200, deadline - Date.now());\n if (waitMs > 0)\n Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, waitMs);\n }\n }\n}\n\nfunction readJsonFile(filePath: string): any {\n try {\n return JSON.parse(fs.readFileSync(filePath, \"utf-8\"));\n } catch {\n return null;\n }\n}\n\nfunction writeJsonFile(filePath: string, data: any): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n fs.writeFileSync(filePath, `${JSON.stringify(data, null, 2)}\\n`);\n}\n\nfunction isProcessRunning(pidFile: string): {\n running: boolean;\n pid: number | null;\n} {\n if (!fs.existsSync(pidFile)) return { running: false, pid: null };\n const pid = parseInt(fs.readFileSync(pidFile, \"utf-8\").trim(), 10);\n try {\n process.kill(pid, 0);\n return { running: true, pid };\n } catch {\n return { running: false, pid };\n }\n}\n\nfunction parseAge(value: string): number {\n const match = value.match(/^(\\d+)\\s*(d|h|m)$/);\n if (!match) {\n console.error(\n `Invalid --older-than value: ${value} (use e.g. 30d, 24h, 60m)`,\n );\n process.exit(1);\n }\n const n = parseInt(match[1], 10);\n const unit = match[2];\n const multipliers: Record<string, number> = {\n d: 86400000,\n h: 3600000,\n m: 60000,\n };\n return n * multipliers[unit];\n}\n\nfunction promptUser(question: string): Promise<string> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nfunction tailLines(filePath: string, n: number): string[] {\n const CHUNK_SIZE = 64 * 1024;\n const fd = fs.openSync(filePath, \"r\");\n try {\n const { size } = fs.fstatSync(fd);\n if (size === 0) return [];\n\n const readStart = Math.max(0, size - CHUNK_SIZE);\n const buf = Buffer.alloc(size - readStart);\n fs.readSync(fd, buf, 0, buf.length, readStart);\n const chunk = buf.toString(\"utf-8\");\n\n const lines = chunk.split(\"\\n\");\n if (lines.length > 0 && lines[lines.length - 1] === \"\") lines.pop();\n if (readStart > 0 && lines.length > 0) lines.shift();\n return lines.slice(-n);\n } finally {\n fs.closeSync(fd);\n }\n}\n\nfunction readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n return new Promise((resolve, reject) => {\n process.stdin.on(\"data\", (chunk) => chunks.push(chunk));\n process.stdin.on(\"end\", () =>\n resolve(Buffer.concat(chunks).toString(\"utf-8\")),\n );\n process.stdin.on(\"error\", reject);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Shell environment configuration\n// ---------------------------------------------------------------------------\n\nfunction configureShellEnv(force: boolean, target = \"claude\", proxy = false) {\n const shellRc = path.join(\n os.homedir(),\n process.env.SHELL?.includes(\"zsh\") ? \".zshrc\" : \".bashrc\",\n );\n const rcContent = fs.existsSync(shellRc)\n ? fs.readFileSync(shellRc, \"utf-8\")\n : \"\";\n\n // Collect all known target env var names for detection/cleanup\n const allTargetVarNames = new Set<string>();\n for (const v of allTargets()) {\n for (const [varName] of v.shellEnv.envVars(config.port, true)) {\n allTargetVarNames.add(varName);\n }\n }\n\n // Shared OTEL vars + all target-specific vars\n const PANOPTICON_VARS = [\n \"OTEL_EXPORTER_OTLP_ENDPOINT\",\n \"OTEL_EXPORTER_OTLP_PROTOCOL\",\n \"OTEL_METRICS_EXPORTER\",\n \"OTEL_LOGS_EXPORTER\",\n \"OTEL_LOG_TOOL_DETAILS\",\n \"OTEL_LOG_USER_PROMPTS\",\n \"OTEL_METRIC_EXPORT_INTERVAL\",\n ...allTargetVarNames,\n ];\n const PANOPTICON_COMMENTS = [\"# >>> panopticon\", \"# <<< panopticon\"];\n\n const isPanopticonLine = (line: string): boolean => {\n const trimmed = line.trim();\n if (PANOPTICON_COMMENTS.some((c) => trimmed.startsWith(c))) return true;\n for (const v of PANOPTICON_VARS) {\n if (trimmed === `export ${v}` || trimmed.startsWith(`export ${v}=`))\n return true;\n }\n return false;\n };\n\n // Build the wanted env vars: shared OTEL vars + target-specific vars\n const wantedLines: [string, string][] = [\n [\"# >>> panopticon >>>\", \"# >>> panopticon >>>\"],\n [\n \"OTEL_EXPORTER_OTLP_ENDPOINT\",\n `export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:${config.port}`,\n ],\n [\n \"OTEL_EXPORTER_OTLP_PROTOCOL\",\n \"export OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf\",\n ],\n [\"OTEL_METRICS_EXPORTER\", \"export OTEL_METRICS_EXPORTER=otlp\"],\n [\"OTEL_LOGS_EXPORTER\", \"export OTEL_LOGS_EXPORTER=otlp\"],\n [\"OTEL_LOG_TOOL_DETAILS\", \"export OTEL_LOG_TOOL_DETAILS=1\"],\n [\"OTEL_LOG_USER_PROMPTS\", \"export OTEL_LOG_USER_PROMPTS=1\"],\n [\"OTEL_METRIC_EXPORT_INTERVAL\", \"export OTEL_METRIC_EXPORT_INTERVAL=10000\"],\n ];\n\n // Add target-specific env vars for selected targets\n const selectedTargetList =\n target === \"all\"\n ? allTargets()\n : allTargets().filter((v) => v.id === target);\n\n for (const t of selectedTargetList) {\n for (const [varName, value] of t.shellEnv.envVars(config.port, proxy)) {\n wantedLines.push([varName, `export ${varName}=${value}`]);\n }\n }\n\n wantedLines.push([\"# <<< panopticon <<<\", \"# <<< panopticon <<<\"]);\n\n const lines = rcContent.split(\"\\n\");\n const seen = new Set<string>();\n let lastPanopticonIdx = -1;\n\n for (let i = 0; i < lines.length; i++) {\n if (!isPanopticonLine(lines[i])) continue;\n lastPanopticonIdx = i;\n\n const match = wantedLines.find(([key]) => {\n if (key.startsWith(\"#\")) return lines[i].trim().startsWith(key);\n return (\n lines[i].trim() === `export ${key}` ||\n lines[i].trim().startsWith(`export ${key}=`)\n );\n });\n if (match) {\n if (!force && lines[i].trim() !== match[1] && !match[0].startsWith(\"#\")) {\n console.log(` ⚠ Keeping existing value: ${lines[i].trim()}`);\n console.log(` (default would be: ${match[1]})`);\n console.log(\" (use --force to overwrite)\");\n } else {\n lines[i] = match[1];\n }\n seen.add(match[0]);\n } else {\n lines[i] = \"\";\n }\n }\n\n const newLines = wantedLines\n .filter(([key]) => !seen.has(key))\n .map(([, val]) => val);\n\n if (newLines.length > 0) {\n if (lastPanopticonIdx >= 0) {\n lines.splice(lastPanopticonIdx + 1, 0, ...newLines);\n } else {\n lines.push(\"\", ...newLines, \"\");\n }\n }\n\n fs.writeFileSync(shellRc, lines.join(\"\\n\"));\n console.log(\n ` ${lastPanopticonIdx >= 0 ? \"Updated\" : \"Added\"} env vars in ${shellRc}\\n`,\n );\n}\n\nfunction removeShellEnv() {\n const shellRc = path.join(\n os.homedir(),\n process.env.SHELL?.includes(\"zsh\") ? \".zshrc\" : \".bashrc\",\n );\n if (!fs.existsSync(shellRc)) return;\n\n const content = fs.readFileSync(shellRc, \"utf-8\");\n const lines = content.split(\"\\n\");\n let inBlock = false;\n const filtered = lines.filter((line) => {\n if (line.trim().startsWith(\"# >>> panopticon\")) {\n inBlock = true;\n return false;\n }\n if (line.trim().startsWith(\"# <<< panopticon\")) {\n inBlock = false;\n return false;\n }\n return !inBlock;\n });\n\n fs.writeFileSync(shellRc, filtered.join(\"\\n\"));\n console.log(` Removed panopticon env vars from ${shellRc}\\n`);\n}\n\n// ---------------------------------------------------------------------------\n// Program\n// ---------------------------------------------------------------------------\n\nconst program = new Command();\nprogram\n .name(\"panopticon\")\n .description(\"Observability for Claude Code\")\n .version(\n typeof __PANOPTICON_VERSION__ !== \"undefined\"\n ? __PANOPTICON_VERSION__\n : \"dev\",\n );\n\n// ---------------------------------------------------------------------------\n// Daemon management commands\n// ---------------------------------------------------------------------------\n\nprogram\n .command(\"install\")\n .alias(\"setup\")\n .description(\"Build, register plugin, init DB, configure shell\")\n .option(\n \"--target <target>\",\n `Target CLI: ${targetIds().join(\", \")}, all`,\n \"all\",\n )\n .option(\"--proxy\", \"Also route API traffic through the panopticon proxy\")\n .option(\"--force\", \"Overwrite customized env vars with defaults\")\n .action(async (opts: Opts) => {\n const validTargets = [...targetIds(), \"all\"];\n if (!validTargets.includes(opts.target)) {\n console.error(\n `Invalid target: ${opts.target}. Must be ${validTargets.join(\", \")}.`,\n );\n process.exit(1);\n }\n const pluginRoot = getPluginRoot();\n await install(pluginRoot, opts);\n });\n\nprogram\n .command(\"uninstall\")\n .description(\"Remove panopticon hooks, shell config, and optionally all data\")\n .option(\n \"--target <target>\",\n `Target CLI: ${targetIds().join(\", \")}, all`,\n \"all\",\n )\n .option(\"--purge\", \"Also remove database and all data\")\n .action(async (opts: Opts) => {\n const validTargets = [...targetIds(), \"all\"];\n if (!validTargets.includes(opts.target)) {\n console.error(\n `Invalid target: ${opts.target}. Must be ${validTargets.join(\", \")}.`,\n );\n process.exit(1);\n }\n\n const targetId = opts.target ?? \"all\";\n const purge = !!opts.purge;\n\n console.log(\"Uninstalling panopticon...\\n\");\n\n // Stop running daemons\n console.log(\"[1/6] Stopping daemons...\");\n stopExistingDaemons();\n console.log();\n\n // Ask Claude Code to uninstall the plugin so the MCP server process is\n // killed and in-memory state (including the cached DB) is evicted.\n console.log(\"[2/6] Uninstalling MCP plugin...\");\n if (targetId === \"all\" || targetId === \"claude\") {\n try {\n execFileSync(\n \"claude\",\n [\"plugin\", \"uninstall\", \"panopticon@local-plugins\"],\n {\n stdio: \"ignore\",\n timeout: 10_000,\n },\n );\n console.log(\" Uninstalled plugin via Claude Code CLI\");\n } catch {\n // Best-effort — claude CLI may not be on PATH or plugin already gone\n }\n } else {\n console.log(\" Skipped (target-specific uninstall)\");\n }\n console.log();\n\n // Remove target configs\n const selectedTargets =\n targetId === \"all\"\n ? allTargets()\n : allTargets().filter((t) => t.id === targetId);\n\n for (const t of selectedTargets) {\n console.log(`[3/6] Removing panopticon from ${t.detect.displayName}...`);\n let existing: Record<string, unknown>;\n if (t.config.configFormat === \"toml\") {\n existing = readTomlFile(t.config.configPath);\n } else {\n existing = readJsonFile(t.config.configPath) ?? {};\n }\n const updated = t.hooks.removeInstallConfig(existing);\n if (t.config.configFormat === \"toml\") {\n writeTomlFile(t.config.configPath, updated);\n } else {\n writeJsonFile(t.config.configPath, updated);\n }\n console.log(` ${t.config.configPath}\\n`);\n }\n\n // Remove shell env\n console.log(\"[4/6] Cleaning shell environment...\");\n removeShellEnv();\n\n if (targetId === \"all\") {\n // Remove marketplace and plugin cache\n console.log(\"[5/6] Removing marketplace and plugin cache...\");\n try {\n fs.rmSync(config.marketplaceDir, { recursive: true, force: true });\n console.log(` Removed ${config.marketplaceDir}`);\n } catch {}\n try {\n fs.rmSync(config.pluginCacheDir, { recursive: true, force: true });\n console.log(` Removed ${config.pluginCacheDir}`);\n } catch {}\n console.log();\n\n // Remove skills\n console.log(\"[6/6] Removing skills...\");\n const pluginRoot = getPluginRoot();\n const skillsSource = path.join(pluginRoot, \"skills\");\n const skillsTarget = path.join(os.homedir(), \".claude\", \"skills\");\n if (fs.existsSync(skillsSource)) {\n for (const name of fs.readdirSync(skillsSource)) {\n const dest = path.join(skillsTarget, name);\n try {\n fs.rmSync(dest, { recursive: true, force: true });\n console.log(` Removed ${dest}`);\n } catch {}\n }\n }\n console.log();\n } else {\n console.log(\"[5/6] Skipping marketplace (target-specific uninstall)\");\n console.log(\"[6/6] Skipping skills (target-specific uninstall)\\n\");\n }\n\n if (purge) {\n console.log(\"Purging data...\");\n closeDb();\n try {\n fs.rmSync(config.dataDir, { recursive: true, force: true });\n console.log(` Removed ${config.dataDir}`);\n } catch {}\n try {\n fs.rmSync(LOG_DIR, { recursive: true, force: true });\n console.log(` Removed ${LOG_DIR}`);\n } catch {}\n console.log();\n }\n\n console.log(\"Done! Panopticon has been uninstalled.\");\n if (!purge) {\n console.log(\n `Database preserved at ${config.dataDir} (use --purge to remove)`,\n );\n }\n });\n\nprogram\n .command(\"update\")\n .description(\"Update panopticon to the latest version\")\n .action(async () => {\n const currentVersion =\n typeof __PANOPTICON_VERSION__ !== \"undefined\"\n ? __PANOPTICON_VERSION__\n : \"unknown\";\n\n console.log(`Current: ${currentVersion}`);\n console.log(\n \"To update, re-run the install command for your package manager:\\n\",\n );\n console.log(\" pnpm install -g @fml-inc/panopticon@latest\");\n console.log(\" # or: npm install -g @fml-inc/panopticon@latest\\n\");\n console.log(\"Then run: panopticon install\");\n });\n\nasync function install(\n pluginRoot: string,\n opts: {\n force?: boolean;\n target?: string;\n proxy?: boolean;\n },\n) {\n const force = opts.force ?? false;\n const target = opts.target ?? \"claude\";\n\n console.log(\"Installing panopticon...\\n\");\n\n const pkgJson = readJsonFile(path.join(pluginRoot, \"package.json\"));\n const version = pkgJson?.version ?? \"0.0.0-dev\";\n\n console.log(\"[1/5] Initializing database and log directory...\");\n ensureDataDir();\n const logDir = path.dirname(logPaths.server);\n fs.mkdirSync(logDir, { recursive: true });\n getDb();\n closeDb();\n console.log(` ${config.dbPath}`);\n console.log(` ${logDir}`);\n\n // Fetch model pricing from LiteLLM (non-blocking if it fails)\n const pricing = await refreshPricingDirect();\n console.log(\n pricing\n ? ` Cached pricing for ${Object.keys(pricing.models).length} models\\n`\n : \" Could not fetch pricing (will use defaults)\\n\",\n );\n\n console.log(\"[2/5] Setting up local marketplace...\");\n fs.mkdirSync(path.join(config.marketplaceDir, \".claude-plugin\"), {\n recursive: true,\n });\n const manifest = readJsonFile(config.marketplaceManifest) ?? {\n name: \"local-plugins\",\n owner: { name: os.userInfo().username },\n plugins: [],\n };\n const plugins = (manifest.plugins as Array<Record<string, unknown>>) ?? [];\n const existing = plugins.findIndex((p) => p.name === \"panopticon\");\n const entry = {\n name: \"panopticon\",\n source: \"./panopticon\",\n description: pkgJson?.description ?? \"Observability for Claude Code\",\n };\n if (existing >= 0) {\n plugins[existing] = entry;\n } else {\n plugins.push(entry);\n }\n manifest.plugins = plugins;\n writeJsonFile(config.marketplaceManifest, manifest);\n\n const symlinkType = process.platform === \"win32\" ? \"junction\" : \"dir\";\n const marketplaceLink = path.join(config.marketplaceDir, \"panopticon\");\n try {\n fs.unlinkSync(marketplaceLink);\n } catch {}\n fs.symlinkSync(pluginRoot, marketplaceLink, symlinkType);\n\n const cacheDir = path.join(config.pluginCacheDir, version);\n fs.mkdirSync(cacheDir, { recursive: true });\n const filesToSync = [\n \".claude-plugin\",\n \"hooks\",\n \"bin\",\n \"dist\",\n \"skills\",\n \"node_modules\",\n \"package.json\",\n \"package-lock.json\",\n ];\n for (const name of filesToSync) {\n const src = path.join(pluginRoot, name);\n const dest = path.join(cacheDir, name);\n if (fs.existsSync(src)) {\n fs.rmSync(dest, { recursive: true, force: true });\n fs.cpSync(src, dest, { recursive: true, dereference: true });\n }\n }\n\n // Ensure bin scripts are executable (cpSync doesn't always preserve mode)\n const binDir = path.join(pluginRoot, \"bin\");\n if (fs.existsSync(binDir)) {\n for (const file of fs.readdirSync(binDir)) {\n const binPath = path.join(binDir, file);\n if (fs.statSync(binPath).isFile()) {\n fs.chmodSync(binPath, 0o755);\n }\n }\n const cachedBinDir = path.join(cacheDir, \"bin\");\n if (fs.existsSync(cachedBinDir)) {\n for (const file of fs.readdirSync(cachedBinDir)) {\n const binPath = path.join(cachedBinDir, file);\n if (fs.statSync(binPath).isFile()) {\n fs.chmodSync(binPath, 0o755);\n }\n }\n }\n }\n\n console.log(` Marketplace: ${config.marketplaceDir}`);\n console.log(` Cache: ${cacheDir}\\n`);\n\n // Register hooks/config for each selected target\n const selectedTargets =\n target === \"all\"\n ? allTargets()\n : ([getTarget(target)].filter(\n Boolean,\n ) as import(\"./targets/types.js\").TargetAdapter[]);\n\n for (const t of selectedTargets) {\n console.log(`[3/5] Registering panopticon in ${t.detect.displayName}...`);\n\n // Read existing config\n let existingConfig: Record<string, unknown>;\n if (t.config.configFormat === \"toml\") {\n existingConfig = readTomlFile(t.config.configPath);\n } else {\n existingConfig = readJsonFile(t.config.configPath) ?? {};\n }\n\n // Apply target-specific install config\n const updatedConfig = t.hooks.applyInstallConfig(existingConfig, {\n pluginRoot,\n port: config.port,\n proxy: !!opts.proxy,\n });\n\n // Write back\n if (t.config.configFormat === \"toml\") {\n writeTomlFile(t.config.configPath, updatedConfig);\n } else {\n writeJsonFile(t.config.configPath, updatedConfig);\n }\n\n if (opts.proxy && t.id === \"codex\") {\n console.log(\" API proxy enabled (--proxy)\");\n }\n console.log(` ${t.config.configPath}\\n`);\n }\n\n // Log skipped targets\n const skippedTargets = allTargets().filter(\n (v) => !selectedTargets.some((st) => st.id === v.id),\n );\n for (const t of skippedTargets) {\n console.log(`[3/5] Skipping ${t.detect.displayName} settings...\\n`);\n }\n\n console.log(\"[4/5] Installing skills...\");\n const skillsSource = path.join(pluginRoot, \"skills\");\n const skillsTarget = path.join(os.homedir(), \".claude\", \"skills\");\n if (fs.existsSync(skillsSource)) {\n for (const skillName of fs.readdirSync(skillsSource)) {\n const src = path.join(skillsSource, skillName);\n if (!fs.statSync(src).isDirectory()) continue;\n const dest = path.join(skillsTarget, skillName);\n fs.mkdirSync(dest, { recursive: true });\n for (const file of fs.readdirSync(src)) {\n fs.cpSync(path.join(src, file), path.join(dest, file), {\n recursive: true,\n });\n }\n console.log(` ${skillName} -> ${dest}`);\n }\n }\n console.log();\n\n console.log(\"[5/5] Configuring shell environment...\");\n configureShellEnv(force, target, !!opts.proxy);\n\n // Start the server so it's ready for the first hook event\n stopExistingDaemons();\n const serverScript = path.resolve(\n path.dirname(fileURLToPath(import.meta.url)),\n \"server.js\",\n );\n const logFd = openLogFd(\"server\");\n const child = spawn(\"node\", [serverScript], {\n detached: true,\n stdio: [\"ignore\", logFd, logFd],\n env: { ...process.env, PANOPTICON_PORT: String(config.port) },\n });\n if (child.pid) {\n fs.writeFileSync(config.serverPidFile, String(child.pid));\n console.log(`\\nServer started (PID ${child.pid}) on :${config.port}`);\n }\n child.unref();\n fs.closeSync(logFd);\n\n const assistant =\n target === \"all\"\n ? allTargets()\n .map((v) => v.detect.displayName)\n .join(\", \")\n : (getTarget(target)?.detect.displayName ?? target);\n console.log(`Done! Start a new ${assistant} session to activate.\\n`);\n console.log(\"Verify with: panopticon status\");\n}\n\nprogram\n .command(\"start\")\n .description(\"Start panopticon server (background)\")\n .action(async () => {\n ensureDataDir();\n\n // Check for already-running unified server\n if (fs.existsSync(config.serverPidFile)) {\n const pid = parseInt(\n fs.readFileSync(config.serverPidFile, \"utf-8\").trim(),\n 10,\n );\n try {\n process.kill(pid, 0);\n console.log(`Panopticon already running (PID ${pid})`);\n return;\n } catch {\n fs.unlinkSync(config.serverPidFile);\n }\n }\n\n // Clean up legacy PID files from old separate daemons\n for (const legacyPid of [config.pidFile, config.proxyPidFile]) {\n if (fs.existsSync(legacyPid)) {\n try {\n const pid = parseInt(fs.readFileSync(legacyPid, \"utf-8\").trim(), 10);\n process.kill(pid, \"SIGTERM\");\n } catch {}\n try {\n fs.unlinkSync(legacyPid);\n } catch {}\n }\n }\n\n const serverScript = path.resolve(\n path.dirname(fileURLToPath(import.meta.url)),\n \"server.js\",\n );\n const logFd = openLogFd(\"server\");\n\n const child = spawn(\"node\", [serverScript], {\n detached: true,\n stdio: [\"ignore\", logFd, logFd],\n env: {\n ...process.env,\n PANOPTICON_PORT: String(config.port),\n },\n });\n\n await new Promise<void>((resolve, reject) => {\n child.on(\"error\", (err) => {\n reject(new Error(`Failed to start: ${err.message}`));\n });\n setTimeout(() => {\n if (child.pid) {\n fs.writeFileSync(config.serverPidFile, String(child.pid));\n child.unref();\n fs.closeSync(logFd);\n console.log(\n `Panopticon started (PID ${child.pid}) on :${config.port}`,\n );\n console.log(`Log: ${logPaths.server}`);\n resolve();\n } else {\n fs.closeSync(logFd);\n reject(new Error(\"Failed to start panopticon server\"));\n }\n }, 500);\n });\n });\n\nprogram\n .command(\"stop\")\n .description(\"Stop panopticon server\")\n .action(() => {\n if (!fs.existsSync(config.serverPidFile)) {\n console.log(\"Panopticon is not running (no PID file)\");\n return;\n }\n const pid = parseInt(\n fs.readFileSync(config.serverPidFile, \"utf-8\").trim(),\n 10,\n );\n try {\n process.kill(pid, \"SIGTERM\");\n fs.unlinkSync(config.serverPidFile);\n console.log(`Panopticon stopped (PID ${pid})`);\n } catch {\n fs.unlinkSync(config.serverPidFile);\n console.log(\"Panopticon was not running (stale PID file removed)\");\n }\n });\n\nprogram\n .command(\"doctor\")\n .description(\"Check system health, server, database, and configuration\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts: { json?: boolean }) => {\n const { doctor } = await import(\"./doctor.js\");\n const result = await doctor();\n\n if (opts.json) {\n output(result);\n return;\n }\n\n console.log(\n `System: ${result.system.os} · Node ${result.system.node}${result.system.sandbox ? \" · Sandbox\" : \"\"}`,\n );\n console.log();\n\n for (const check of result.checks) {\n const icon =\n check.status === \"ok\"\n ? \"\\x1b[32m✓\\x1b[0m\"\n : check.status === \"warn\"\n ? \"\\x1b[33m!\\x1b[0m\"\n : \"\\x1b[31m✗\\x1b[0m\";\n console.log(` ${icon} ${check.label.padEnd(12)} ${check.detail}`);\n }\n\n console.log();\n const passed = result.checks.filter((c) => c.status === \"ok\").length;\n const warned = result.checks.filter((c) => c.status === \"warn\").length;\n const failed = result.checks.filter((c) => c.status === \"fail\").length;\n const parts: string[] = [];\n if (passed > 0) parts.push(`\\x1b[32m${passed} passed\\x1b[0m`);\n if (warned > 0)\n parts.push(`\\x1b[33m${warned} warning${warned > 1 ? \"s\" : \"\"}\\x1b[0m`);\n if (failed > 0) parts.push(`\\x1b[31m${failed} failed\\x1b[0m`);\n console.log(` ${parts.join(\", \")}`);\n\n if (result.recentErrors.length > 0) {\n console.log();\n console.log(\" Recent errors:\");\n for (const err of result.recentErrors) {\n console.log(` [${err.id}] ${err.body}`);\n }\n }\n\n if (result.recentEvents.length > 0) {\n console.log();\n console.log(\" Recent events:\");\n for (const evt of result.recentEvents) {\n const tool = evt.toolName ? ` (${evt.toolName})` : \"\";\n console.log(` ${evt.eventType}${tool} — ${evt.timestamp}`);\n }\n }\n\n console.log();\n });\n\nprogram\n .command(\"status\")\n .description(\"Show server status and database stats\")\n .action(async () => {\n const server = isProcessRunning(config.serverPidFile);\n\n console.log(\"Panopticon Status\");\n console.log(\"=================\");\n console.log();\n console.log(\n `Server: ${server.running ? `running (PID ${server.pid}, port ${config.port})` : \"stopped\"}`,\n );\n console.log(`Database: ${config.dbPath}`);\n\n console.log();\n console.log(\"Log files:\");\n for (const name of DAEMON_NAMES) {\n const logPath = logPaths[name];\n let sizeStr = \"not created\";\n try {\n const stat = fs.statSync(logPath);\n sizeStr =\n stat.size < 1024\n ? `${stat.size} B`\n : `${(stat.size / 1024).toFixed(1)} KB`;\n } catch {}\n console.log(` ${name}: ${logPath} (${sizeStr})`);\n }\n\n if (fs.existsSync(config.dbPath)) {\n const stat = fs.statSync(config.dbPath);\n console.log(`Database size: ${(stat.size / 1024).toFixed(1)} KB`);\n\n if (server.running) {\n try {\n const stats = (await dbStats()) as Record<string, number>;\n console.log();\n console.log(\"Row counts:\");\n console.log(` sessions: ${stats.sessions}`);\n console.log(` messages: ${stats.messages}`);\n console.log(` tool_calls: ${stats.tool_calls}`);\n console.log(` scanner_turns: ${stats.scanner_turns}`);\n console.log(` scanner_events: ${stats.scanner_events}`);\n console.log(` hook_events: ${stats.hook_events}`);\n console.log(` otel_logs: ${stats.otel_logs}`);\n console.log(` otel_metrics: ${stats.otel_metrics}`);\n } catch {\n console.log(\" (could not read database)\");\n }\n }\n } else {\n console.log(\"Database: not initialized (run 'panopticon install')\");\n }\n\n // Sync targets\n try {\n const cfg = loadUnifiedConfig();\n const targets = cfg.sync.targets;\n if (targets.length > 0) {\n console.log();\n console.log(\"Sync targets:\");\n for (const t of targets) {\n console.log(` ${t.name} → ${t.url}`);\n\n if (server.running) {\n try {\n const result = await syncPending(t.name);\n if (result.totalPending === 0) {\n console.log(\" status: up to date\");\n } else {\n console.log(` pending: ${result.totalPending} total`);\n for (const [table, info] of Object.entries(result.tables)) {\n console.log(\n ` ${table}: ${info.pending} (${info.watermark} / ${info.maxId})`,\n );\n }\n }\n } catch {}\n }\n }\n }\n } catch {\n // Sync not configured\n }\n });\n\nprogram\n .command(\"logs\")\n .alias(\"log\")\n .description(\"View daemon logs (otlp, mcp)\")\n .argument(\"[daemon]\", \"Daemon name (otlp, mcp)\", \"otlp\")\n .option(\"-f, --follow\", \"Follow log output (like tail -f)\")\n .option(\"-n, --lines <count>\", \"Number of lines to show\", \"50\")\n .action(async (daemon: string, opts: Opts) => {\n if (!DAEMON_NAMES.includes(daemon as DaemonName)) {\n console.error(`Unknown daemon: ${daemon}`);\n console.log(`Available: ${DAEMON_NAMES.join(\", \")}`);\n process.exit(1);\n }\n\n const logPath = logPaths[daemon as DaemonName];\n const numLines = parseInt(opts.lines, 10);\n\n if (!fs.existsSync(logPath)) {\n console.log(`No logs yet for ${daemon} (${logPath})`);\n return;\n }\n\n const lines = tailLines(logPath, numLines);\n for (const line of lines) {\n console.log(line);\n }\n\n if (opts.follow) {\n let pos = fs.statSync(logPath).size;\n fs.watchFile(logPath, { interval: 200 }, () => {\n const stat = fs.statSync(logPath);\n if (stat.size > pos) {\n const fd = fs.openSync(logPath, \"r\");\n const buf = Buffer.alloc(stat.size - pos);\n fs.readSync(fd, buf, 0, buf.length, pos);\n fs.closeSync(fd);\n process.stdout.write(buf.toString(\"utf-8\"));\n pos = stat.size;\n } else if (stat.size < pos) {\n pos = 0;\n }\n });\n await new Promise(() => {});\n }\n });\n\nprogram\n .command(\"prune\")\n .description(\"Delete old data from the database\")\n .option(\"--older-than <age>\", \"Max age (e.g. 30d, 24h, 60m)\", \"30d\")\n .option(\"--dry-run\", \"Show estimate without deleting\")\n .option(\"--vacuum\", \"Reclaim disk space after pruning\")\n .option(\"--yes\", \"Skip confirmation prompt\")\n .action(async (opts: Opts) => {\n const ageMs = parseAge(opts.olderThan);\n const cutoffMs = Date.now() - ageMs;\n const cutoffDate = new Date(cutoffMs).toISOString();\n\n console.log(\n `Pruning rows older than ${opts.olderThan} (before ${cutoffDate})`,\n );\n console.log();\n\n const estimate = (await pruneEstimate(cutoffMs)) as Record<string, number>;\n const total = Object.values(estimate).reduce((a, b) => a + b, 0);\n\n console.log(\"Rows to delete:\");\n for (const [key, count] of Object.entries(estimate)) {\n if (count > 0) console.log(` ${key}: ${count}`);\n }\n console.log(` total: ${total}`);\n console.log();\n\n if (total === 0) {\n console.log(\"Nothing to prune.\");\n return;\n }\n\n if (opts.dryRun) {\n console.log(\"Dry run — no rows deleted.\");\n return;\n }\n\n if (!opts.yes) {\n const answer = await promptUser(\"Proceed with deletion? [y/N] \");\n if (answer.toLowerCase() !== \"y\") {\n console.log(\"Aborted.\");\n return;\n }\n }\n\n const result = (await pruneExecute(cutoffMs, {\n vacuum: opts.vacuum,\n })) as Record<string, number>;\n console.log(\"Deleted:\");\n for (const [key, count] of Object.entries(result)) {\n if (count > 0) console.log(` ${key}: ${count}`);\n }\n\n if (opts.vacuum) {\n console.log(\"\\nDisk space reclaimed.\");\n }\n });\n\nprogram\n .command(\"sync\")\n .description(\"Manage sync targets (OTLP export)\")\n .addCommand(\n new Command(\"add\")\n .description(\"Add or update a sync target\")\n .argument(\"<name>\", \"Target name\")\n .argument(\"<url>\", \"OTLP endpoint base URL\")\n .option(\"--token <token>\", \"Bearer token for auth\")\n .option(\n \"--token-command <command>\",\n \"Shell command that returns a token (e.g. 'gh auth token')\",\n )\n .action(async (name: string, url: string, opts: Opts) => {\n await syncTargetAdd({\n name,\n url,\n token: opts.token ?? undefined,\n tokenCommand: opts.tokenCommand ?? undefined,\n });\n console.log(`Added sync target \"${name}\" → ${url}`);\n console.log(\"Restart panopticon to activate.\");\n }),\n )\n .addCommand(\n new Command(\"remove\")\n .description(\"Remove a sync target\")\n .argument(\"<name>\", \"Target name\")\n .action(async (name: string) => {\n const result = (await syncTargetRemove(name)) as { ok: boolean };\n if (result.ok) {\n console.log(`Removed sync target \"${name}\"`);\n console.log(\"Restart panopticon to apply.\");\n } else {\n console.log(`No target named \"${name}\"`);\n }\n }),\n )\n .addCommand(\n new Command(\"list\").description(\"List sync targets\").action(async () => {\n const result = (await syncTargetList()) as {\n targets: Array<{\n name: string;\n url: string;\n token?: string;\n tokenCommand?: string;\n }>;\n };\n if (result.targets.length === 0) {\n console.log(\"No sync targets configured.\");\n return;\n }\n for (const t of result.targets) {\n const auth = t.token\n ? \" (token)\"\n : t.tokenCommand\n ? ` (token-command: ${t.tokenCommand})`\n : \"\";\n console.log(` ${t.name} → ${t.url}${auth}`);\n }\n }),\n )\n .addCommand(\n new Command(\"reset\")\n .description(\"Reset sync watermarks (re-syncs all data)\")\n .argument(\"[target]\", \"Reset only this sync target (default: all)\")\n .action(async (targetName?: string) => {\n await syncReset(targetName);\n console.log(\n targetName\n ? `Reset sync watermarks for \"${targetName}\"`\n : \"Reset all sync watermarks\",\n );\n console.log(\"Restart panopticon to re-sync.\");\n }),\n )\n .addCommand(\n new Command(\"watermark\")\n .description(\"Get or set sync watermarks\")\n .argument(\"<target>\", \"Sync target name\")\n .argument(\"[table]\", \"Table name (omit to show all)\")\n .option(\"--set <value>\", \"Set watermark to this value\", parseInt)\n .action(async (target: string, table?: string, opts?: Opts) => {\n if (opts?.set !== undefined) {\n if (!table) {\n console.error(\"Table name is required when setting a watermark\");\n process.exit(1);\n }\n const result = (await syncWatermarkSet(target, table, opts.set)) as {\n key: string;\n value: number;\n };\n console.log(`${result.key} = ${result.value}`);\n } else {\n const result = await syncWatermarkGet(target, table);\n if (table) {\n const r = result as { key: string; value: number };\n console.log(`${r.key} = ${r.value}`);\n } else {\n const r = result as {\n target: string;\n watermarks: Record<string, number>;\n };\n console.log(`Watermarks for \"${r.target}\":`);\n for (const [tbl, value] of Object.entries(r.watermarks)) {\n console.log(` ${tbl}: ${value}`);\n }\n }\n }\n }),\n );\n\n// ---------------------------------------------------------------------------\n// Query commands\n// ---------------------------------------------------------------------------\n\nprogram\n .command(\"sessions\")\n .description(\"List recent sessions with stats (event count, tools, cost)\")\n .option(\"--limit <n>\", \"Max sessions to return (default 20)\", parseInt)\n .option(\n \"--since <duration>\",\n 'Time filter: ISO date or relative like \"24h\", \"7d\", \"30m\"',\n )\n .action(async (opts: Opts) => {\n output(await listSessions({ limit: opts.limit, since: opts.since }));\n });\n\nprogram\n .command(\"timeline\")\n .description(\"Get messages and tool calls for a session\")\n .argument(\"<session-id>\", \"The session ID to query\")\n .option(\"--limit <n>\", \"Max messages to return (default 50)\", parseInt)\n .option(\"--offset <n>\", \"Number of messages to skip\", parseInt)\n .option(\"--full\", \"Return full content instead of truncated\")\n .action(async (sessionId: string, opts: Opts) => {\n const result = await sessionTimeline({\n sessionId,\n limit: opts.limit,\n offset: opts.offset,\n fullPayloads: opts.full,\n });\n output(result);\n });\n\nprogram\n .command(\"costs\")\n .description(\"Token usage and cost breakdowns\")\n .option(\n \"--since <duration>\",\n 'Time filter: ISO date or relative like \"24h\", \"7d\"',\n )\n .option(\"--group-by <key>\", \"Group by: session, model, or day\")\n .action(async (opts: Opts) => {\n output(await costBreakdown({ since: opts.since, groupBy: opts.groupBy }));\n });\n\nprogram\n .command(\"summary\")\n .description(\"Activity summary — sessions, prompts, tools, files, costs\")\n .option(\n \"--since <duration>\",\n 'Time window (default \"24h\"). ISO date or relative like \"24h\", \"7d\"',\n )\n .action(async (opts: Opts) => {\n output(await activitySummary({ since: opts.since }));\n });\n\nprogram\n .command(\"plans\")\n .description(\"List plans created by Claude Code (from ExitPlanMode events)\")\n .option(\"--session <id>\", \"Filter to a specific session\")\n .option(\n \"--since <duration>\",\n 'Time filter: ISO date or relative like \"24h\", \"7d\"',\n )\n .option(\"--limit <n>\", \"Max plans to return (default 20)\", parseInt)\n .action(async (opts: Opts) => {\n output(\n await listPlans({\n session_id: opts.session,\n since: opts.since,\n limit: opts.limit,\n }),\n );\n });\n\nprogram\n .command(\"search\")\n .description(\"Full-text search across events and messages\")\n .argument(\"<query>\", \"Text to search for\")\n .option(\"--types <types...>\", \"Filter to specific event types\")\n .option(\n \"--since <duration>\",\n 'Time filter: ISO date or relative like \"24h\", \"7d\"',\n )\n .option(\"--limit <n>\", \"Max results (default 20)\", parseInt)\n .option(\"--offset <n>\", \"Number of results to skip\", parseInt)\n .option(\"--full\", \"Return full payloads instead of truncated\")\n .action(async (query: string, opts: Opts) => {\n const result = await search({\n query,\n eventTypes: opts.types,\n since: opts.since,\n limit: opts.limit,\n offset: opts.offset,\n fullPayloads: opts.full,\n });\n output(result);\n });\n\nprogram\n .command(\"print\")\n .alias(\"event\")\n .description(\"Get full details for a record by source and ID\")\n .argument(\"<source>\", \"Source: hook, otel, or message\")\n .argument(\"<id>\", \"Record ID from search/timeline results\")\n .action(async (source: string, id: string) => {\n if (source !== \"hook\" && source !== \"otel\" && source !== \"message\") {\n console.error(\n `Invalid source: ${source} (must be \"hook\", \"otel\", or \"message\")`,\n );\n process.exit(1);\n }\n const result = await print({ source, id: parseInt(id, 10) });\n if (!result) {\n console.error(`No ${source} record found with id ${id}`);\n process.exit(1);\n }\n output(result);\n });\n\nprogram\n .command(\"query\")\n .description(\"Execute a read-only SQL query against the database\")\n .argument(\"<sql>\", \"SQL query (SELECT/WITH/PRAGMA only)\")\n .action(async (sql: string) => {\n try {\n output(await rawQuery(sql));\n } catch (err: unknown) {\n console.error(`Error: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\nprogram\n .command(\"db-stats\")\n .description(\"Show database row counts for each table\")\n .action(async () => {\n output(await dbStats());\n });\n\nprogram\n .command(\"refresh-pricing\")\n .description(\"Fetch latest model pricing from LiteLLM\")\n .action(async () => {\n console.log(\"Fetching pricing from LiteLLM...\");\n const result = await refreshPricing();\n if (result && typeof result === \"object\" && \"models\" in result) {\n const models = (result as { models: Record<string, unknown> }).models;\n console.log(`Cached pricing for ${Object.keys(models).length} models`);\n } else if (result && typeof result === \"object\" && \"ok\" in result) {\n console.log(\"Pricing refreshed.\");\n } else {\n console.error(\"Failed to fetch pricing\");\n process.exit(1);\n }\n });\n\nconst permissions = program\n .command(\"permissions\")\n .description(\"Show or apply permission rules\");\n\npermissions\n .command(\"show\", { isDefault: true })\n .description(\"Show current approvals and allowed tools/commands\")\n .action(() => {\n output(permissionsShow());\n });\n\npermissions\n .command(\"apply\")\n .description(\"Apply permission rules (reads JSON payload from stdin)\")\n .action(async () => {\n const input = JSON.parse(await readStdin());\n output(permissionsApply(input));\n });\n\n// ---------------------------------------------------------------------------\n// Run\n// ---------------------------------------------------------------------------\n\nprogram.parseAsync().catch((err: unknown) => {\n console.error(\"Error:\", (err as Error).message);\n process.exit(1);\n});\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { parse, stringify } from \"smol-toml\";\n\nexport function readTomlFile(filePath: string): Record<string, unknown> {\n try {\n return parse(fs.readFileSync(filePath, \"utf-8\"));\n } catch {\n return {};\n }\n}\n\nexport function writeTomlFile(\n filePath: string,\n data: Record<string, unknown>,\n): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n fs.writeFileSync(filePath, `${stringify(data)}\\n`);\n}\n"],"mappings":"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","names":["fs","path","path","fs","refreshPricing"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/toml.ts"],"sourcesContent":["#!/usr/bin/env node\n\ndeclare const __PANOPTICON_VERSION__: string;\n\nimport { execFileSync, spawn } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport readline from \"node:readline\";\nimport { fileURLToPath } from \"node:url\";\nimport { Command, type OptionValues } from \"commander\";\n\ntype Opts = OptionValues;\n\nimport {\n activitySummary,\n costBreakdown,\n dbStats,\n listPlans,\n listSessions,\n print,\n pruneEstimate,\n pruneExecute,\n rawQuery,\n refreshPricing,\n search,\n sessionTimeline,\n syncPending,\n syncReset,\n syncTargetAdd,\n syncTargetList,\n syncTargetRemove,\n syncWatermarkGet,\n syncWatermarkSet,\n} from \"./api/client.js\";\nimport { config, ensureDataDir } from \"./config.js\";\nimport { refreshPricing as refreshPricingDirect } from \"./db/pricing.js\";\nimport { closeDb, getDb } from \"./db/schema.js\";\nimport {\n DAEMON_NAMES,\n type DaemonName,\n LOG_DIR,\n logPaths,\n openLogFd,\n} from \"./log.js\";\nimport { permissionsApply, permissionsShow } from \"./mcp/permissions.js\";\nimport { allTargets, getTarget, targetIds } from \"./targets/index.js\";\nimport { readTomlFile, writeTomlFile } from \"./toml.js\";\nimport { loadUnifiedConfig } from \"./unified-config.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction output(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n\nfunction getPluginRoot(): string {\n let dir = path.dirname(fileURLToPath(import.meta.url));\n dir = path.resolve(dir, \"..\");\n return dir;\n}\n\nfunction stopExistingDaemons(): void {\n const pidsKilled = new Set<number>();\n\n // 1. Try PID files first\n for (const pidFile of [config.serverPidFile, config.pidFile]) {\n try {\n const pid = parseInt(fs.readFileSync(pidFile, \"utf-8\").trim(), 10);\n process.kill(pid, \"SIGTERM\");\n pidsKilled.add(pid);\n } catch {}\n try {\n fs.unlinkSync(pidFile);\n } catch {}\n }\n\n // 2. Fallback: kill whatever is listening on our port (covers purged PID files)\n try {\n const out = execFileSync(\"lsof\", [\"-ti\", `tcp:${config.port}`], {\n encoding: \"utf-8\",\n timeout: 3000,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n for (const line of out.split(\"\\n\")) {\n const pid = parseInt(line, 10);\n if (pid && !pidsKilled.has(pid)) {\n try {\n process.kill(pid, \"SIGTERM\");\n pidsKilled.add(pid);\n } catch {}\n }\n }\n } catch {}\n\n // 3. Wait for port to be free (up to 3s)\n if (pidsKilled.size > 0) {\n const deadline = Date.now() + 3000;\n while (Date.now() < deadline) {\n try {\n execFileSync(\"lsof\", [\"-ti\", `tcp:${config.port}`], {\n encoding: \"utf-8\",\n timeout: 1000,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n // lsof succeeded = port still in use, wait and retry\n } catch {\n break; // lsof failed = port is free\n }\n const waitMs = Math.min(200, deadline - Date.now());\n if (waitMs > 0)\n Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, waitMs);\n }\n }\n}\n\nfunction readJsonFile(filePath: string): any {\n try {\n return JSON.parse(fs.readFileSync(filePath, \"utf-8\"));\n } catch {\n return null;\n }\n}\n\nfunction writeJsonFile(filePath: string, data: any): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n fs.writeFileSync(filePath, `${JSON.stringify(data, null, 2)}\\n`);\n}\n\nfunction isProcessRunning(pidFile: string): {\n running: boolean;\n pid: number | null;\n} {\n if (!fs.existsSync(pidFile)) return { running: false, pid: null };\n const pid = parseInt(fs.readFileSync(pidFile, \"utf-8\").trim(), 10);\n try {\n process.kill(pid, 0);\n return { running: true, pid };\n } catch {\n return { running: false, pid };\n }\n}\n\nfunction parseAge(value: string): number {\n const match = value.match(/^(\\d+)\\s*(d|h|m)$/);\n if (!match) {\n console.error(\n `Invalid --older-than value: ${value} (use e.g. 30d, 24h, 60m)`,\n );\n process.exit(1);\n }\n const n = parseInt(match[1], 10);\n const unit = match[2];\n const multipliers: Record<string, number> = {\n d: 86400000,\n h: 3600000,\n m: 60000,\n };\n return n * multipliers[unit];\n}\n\nfunction promptUser(question: string): Promise<string> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nfunction tailLines(filePath: string, n: number): string[] {\n const CHUNK_SIZE = 64 * 1024;\n const fd = fs.openSync(filePath, \"r\");\n try {\n const { size } = fs.fstatSync(fd);\n if (size === 0) return [];\n\n const readStart = Math.max(0, size - CHUNK_SIZE);\n const buf = Buffer.alloc(size - readStart);\n fs.readSync(fd, buf, 0, buf.length, readStart);\n const chunk = buf.toString(\"utf-8\");\n\n const lines = chunk.split(\"\\n\");\n if (lines.length > 0 && lines[lines.length - 1] === \"\") lines.pop();\n if (readStart > 0 && lines.length > 0) lines.shift();\n return lines.slice(-n);\n } finally {\n fs.closeSync(fd);\n }\n}\n\nfunction readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n return new Promise((resolve, reject) => {\n process.stdin.on(\"data\", (chunk) => chunks.push(chunk));\n process.stdin.on(\"end\", () =>\n resolve(Buffer.concat(chunks).toString(\"utf-8\")),\n );\n process.stdin.on(\"error\", reject);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Shell environment configuration\n// ---------------------------------------------------------------------------\n\nfunction configureShellEnv(force: boolean, target = \"claude\", proxy = false) {\n const shellRc = path.join(\n os.homedir(),\n process.env.SHELL?.includes(\"zsh\") ? \".zshrc\" : \".bashrc\",\n );\n const rcContent = fs.existsSync(shellRc)\n ? fs.readFileSync(shellRc, \"utf-8\")\n : \"\";\n\n // Collect all known target env var names for detection/cleanup\n const allTargetVarNames = new Set<string>();\n for (const v of allTargets()) {\n for (const [varName] of v.shellEnv.envVars(config.port, true)) {\n allTargetVarNames.add(varName);\n }\n }\n\n // Shared OTEL vars + all target-specific vars\n const PANOPTICON_VARS = [\n \"OTEL_EXPORTER_OTLP_ENDPOINT\",\n \"OTEL_EXPORTER_OTLP_PROTOCOL\",\n \"OTEL_METRICS_EXPORTER\",\n \"OTEL_LOGS_EXPORTER\",\n \"OTEL_LOG_TOOL_DETAILS\",\n \"OTEL_LOG_USER_PROMPTS\",\n \"OTEL_METRIC_EXPORT_INTERVAL\",\n ...allTargetVarNames,\n ];\n const PANOPTICON_COMMENTS = [\"# >>> panopticon\", \"# <<< panopticon\"];\n\n const isPanopticonLine = (line: string): boolean => {\n const trimmed = line.trim();\n if (PANOPTICON_COMMENTS.some((c) => trimmed.startsWith(c))) return true;\n for (const v of PANOPTICON_VARS) {\n if (trimmed === `export ${v}` || trimmed.startsWith(`export ${v}=`))\n return true;\n }\n return false;\n };\n\n // Build the wanted env vars: shared OTEL vars + target-specific vars\n const wantedLines: [string, string][] = [\n [\"# >>> panopticon >>>\", \"# >>> panopticon >>>\"],\n [\n \"OTEL_EXPORTER_OTLP_ENDPOINT\",\n `export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:${config.port}`,\n ],\n [\n \"OTEL_EXPORTER_OTLP_PROTOCOL\",\n \"export OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf\",\n ],\n [\"OTEL_METRICS_EXPORTER\", \"export OTEL_METRICS_EXPORTER=otlp\"],\n [\"OTEL_LOGS_EXPORTER\", \"export OTEL_LOGS_EXPORTER=otlp\"],\n [\"OTEL_LOG_TOOL_DETAILS\", \"export OTEL_LOG_TOOL_DETAILS=1\"],\n [\"OTEL_LOG_USER_PROMPTS\", \"export OTEL_LOG_USER_PROMPTS=1\"],\n [\"OTEL_METRIC_EXPORT_INTERVAL\", \"export OTEL_METRIC_EXPORT_INTERVAL=10000\"],\n ];\n\n // Add target-specific env vars for selected targets\n const selectedTargetList =\n target === \"all\"\n ? allTargets()\n : allTargets().filter((v) => v.id === target);\n\n for (const t of selectedTargetList) {\n for (const [varName, value] of t.shellEnv.envVars(config.port, proxy)) {\n wantedLines.push([varName, `export ${varName}=${value}`]);\n }\n }\n\n wantedLines.push([\"# <<< panopticon <<<\", \"# <<< panopticon <<<\"]);\n\n const lines = rcContent.split(\"\\n\");\n const seen = new Set<string>();\n let lastPanopticonIdx = -1;\n\n for (let i = 0; i < lines.length; i++) {\n if (!isPanopticonLine(lines[i])) continue;\n lastPanopticonIdx = i;\n\n const match = wantedLines.find(([key]) => {\n if (key.startsWith(\"#\")) return lines[i].trim().startsWith(key);\n return (\n lines[i].trim() === `export ${key}` ||\n lines[i].trim().startsWith(`export ${key}=`)\n );\n });\n if (match) {\n if (!force && lines[i].trim() !== match[1] && !match[0].startsWith(\"#\")) {\n console.log(` ⚠ Keeping existing value: ${lines[i].trim()}`);\n console.log(` (default would be: ${match[1]})`);\n console.log(\" (use --force to overwrite)\");\n } else {\n lines[i] = match[1];\n }\n seen.add(match[0]);\n } else {\n lines[i] = \"\";\n }\n }\n\n const newLines = wantedLines\n .filter(([key]) => !seen.has(key))\n .map(([, val]) => val);\n\n if (newLines.length > 0) {\n if (lastPanopticonIdx >= 0) {\n lines.splice(lastPanopticonIdx + 1, 0, ...newLines);\n } else {\n lines.push(\"\", ...newLines, \"\");\n }\n }\n\n fs.writeFileSync(shellRc, lines.join(\"\\n\"));\n console.log(\n ` ${lastPanopticonIdx >= 0 ? \"Updated\" : \"Added\"} env vars in ${shellRc}\\n`,\n );\n}\n\nfunction removeShellEnv() {\n const shellRc = path.join(\n os.homedir(),\n process.env.SHELL?.includes(\"zsh\") ? \".zshrc\" : \".bashrc\",\n );\n if (!fs.existsSync(shellRc)) return;\n\n const content = fs.readFileSync(shellRc, \"utf-8\");\n const lines = content.split(\"\\n\");\n let inBlock = false;\n const filtered = lines.filter((line) => {\n if (line.trim().startsWith(\"# >>> panopticon\")) {\n inBlock = true;\n return false;\n }\n if (line.trim().startsWith(\"# <<< panopticon\")) {\n inBlock = false;\n return false;\n }\n return !inBlock;\n });\n\n fs.writeFileSync(shellRc, filtered.join(\"\\n\"));\n console.log(` Removed panopticon env vars from ${shellRc}\\n`);\n}\n\n// ---------------------------------------------------------------------------\n// Program\n// ---------------------------------------------------------------------------\n\nconst program = new Command();\nprogram\n .name(\"panopticon\")\n .description(\"Observability for Claude Code\")\n .version(\n typeof __PANOPTICON_VERSION__ !== \"undefined\"\n ? __PANOPTICON_VERSION__\n : \"dev\",\n );\n\n// ---------------------------------------------------------------------------\n// Daemon management commands\n// ---------------------------------------------------------------------------\n\nprogram\n .command(\"install\")\n .alias(\"setup\")\n .description(\"Build, register plugin, init DB, configure shell\")\n .option(\n \"--target <target>\",\n `Target CLI: ${targetIds().join(\", \")}, all`,\n \"all\",\n )\n .option(\"--proxy\", \"Also route API traffic through the panopticon proxy\")\n .option(\"--force\", \"Overwrite customized env vars with defaults\")\n .action(async (opts: Opts) => {\n const validTargets = [...targetIds(), \"all\"];\n if (!validTargets.includes(opts.target)) {\n console.error(\n `Invalid target: ${opts.target}. Must be ${validTargets.join(\", \")}.`,\n );\n process.exit(1);\n }\n const pluginRoot = getPluginRoot();\n await install(pluginRoot, opts);\n });\n\nprogram\n .command(\"uninstall\")\n .description(\"Remove panopticon hooks, shell config, and optionally all data\")\n .option(\n \"--target <target>\",\n `Target CLI: ${targetIds().join(\", \")}, all`,\n \"all\",\n )\n .option(\"--purge\", \"Also remove database and all data\")\n .action(async (opts: Opts) => {\n const validTargets = [...targetIds(), \"all\"];\n if (!validTargets.includes(opts.target)) {\n console.error(\n `Invalid target: ${opts.target}. Must be ${validTargets.join(\", \")}.`,\n );\n process.exit(1);\n }\n\n const targetId = opts.target ?? \"all\";\n const purge = !!opts.purge;\n\n console.log(\"Uninstalling panopticon...\\n\");\n\n // Stop running daemons\n console.log(\"[1/6] Stopping daemons...\");\n stopExistingDaemons();\n console.log();\n\n // Ask Claude Code to uninstall the plugin so the MCP server process is\n // killed and in-memory state (including the cached DB) is evicted.\n console.log(\"[2/6] Uninstalling MCP plugin...\");\n if (targetId === \"all\" || targetId === \"claude\") {\n try {\n execFileSync(\n \"claude\",\n [\"plugin\", \"uninstall\", \"panopticon@local-plugins\"],\n {\n stdio: \"ignore\",\n timeout: 10_000,\n },\n );\n console.log(\" Uninstalled plugin via Claude Code CLI\");\n } catch {\n // Best-effort — claude CLI may not be on PATH or plugin already gone\n }\n } else {\n console.log(\" Skipped (target-specific uninstall)\");\n }\n console.log();\n\n // Remove target configs\n const selectedTargets =\n targetId === \"all\"\n ? allTargets()\n : allTargets().filter((t) => t.id === targetId);\n\n for (const t of selectedTargets) {\n console.log(`[3/6] Removing panopticon from ${t.detect.displayName}...`);\n let existing: Record<string, unknown>;\n if (t.config.configFormat === \"toml\") {\n existing = readTomlFile(t.config.configPath);\n } else {\n existing = readJsonFile(t.config.configPath) ?? {};\n }\n const updated = t.hooks.removeInstallConfig(existing);\n if (t.config.configFormat === \"toml\") {\n writeTomlFile(t.config.configPath, updated);\n } else {\n writeJsonFile(t.config.configPath, updated);\n }\n console.log(` ${t.config.configPath}\\n`);\n }\n\n // Remove shell env\n console.log(\"[4/6] Cleaning shell environment...\");\n removeShellEnv();\n\n if (targetId === \"all\") {\n // Remove marketplace and plugin cache\n console.log(\"[5/6] Removing marketplace and plugin cache...\");\n try {\n fs.rmSync(config.marketplaceDir, { recursive: true, force: true });\n console.log(` Removed ${config.marketplaceDir}`);\n } catch {}\n try {\n fs.rmSync(config.pluginCacheDir, { recursive: true, force: true });\n console.log(` Removed ${config.pluginCacheDir}`);\n } catch {}\n console.log();\n\n // Remove skills\n console.log(\"[6/6] Removing skills...\");\n const pluginRoot = getPluginRoot();\n const skillsSource = path.join(pluginRoot, \"skills\");\n const skillsTarget = path.join(os.homedir(), \".claude\", \"skills\");\n if (fs.existsSync(skillsSource)) {\n for (const name of fs.readdirSync(skillsSource)) {\n const dest = path.join(skillsTarget, name);\n try {\n fs.rmSync(dest, { recursive: true, force: true });\n console.log(` Removed ${dest}`);\n } catch {}\n }\n }\n console.log();\n } else {\n console.log(\"[5/6] Skipping marketplace (target-specific uninstall)\");\n console.log(\"[6/6] Skipping skills (target-specific uninstall)\\n\");\n }\n\n if (purge) {\n console.log(\"Purging data...\");\n closeDb();\n try {\n fs.rmSync(config.dataDir, { recursive: true, force: true });\n console.log(` Removed ${config.dataDir}`);\n } catch {}\n try {\n fs.rmSync(LOG_DIR, { recursive: true, force: true });\n console.log(` Removed ${LOG_DIR}`);\n } catch {}\n console.log();\n }\n\n console.log(\"Done! Panopticon has been uninstalled.\");\n if (!purge) {\n console.log(\n `Database preserved at ${config.dataDir} (use --purge to remove)`,\n );\n }\n });\n\nprogram\n .command(\"update\")\n .description(\"Update panopticon to the latest version\")\n .action(async () => {\n const currentVersion =\n typeof __PANOPTICON_VERSION__ !== \"undefined\"\n ? __PANOPTICON_VERSION__\n : \"unknown\";\n\n console.log(`Current: ${currentVersion}`);\n console.log(\n \"To update, re-run the install command for your package manager:\\n\",\n );\n console.log(\" pnpm install -g @fml-inc/panopticon@latest\");\n console.log(\" # or: npm install -g @fml-inc/panopticon@latest\\n\");\n console.log(\"Then run: panopticon install\");\n });\n\nasync function install(\n pluginRoot: string,\n opts: {\n force?: boolean;\n target?: string;\n proxy?: boolean;\n },\n) {\n const force = opts.force ?? false;\n const target = opts.target ?? \"claude\";\n\n console.log(\"Installing panopticon...\\n\");\n\n const pkgJson = readJsonFile(path.join(pluginRoot, \"package.json\"));\n const version = pkgJson?.version ?? \"0.0.0-dev\";\n\n console.log(\"[1/5] Initializing database and log directory...\");\n ensureDataDir();\n const logDir = path.dirname(logPaths.server);\n fs.mkdirSync(logDir, { recursive: true });\n getDb();\n closeDb();\n console.log(` ${config.dbPath}`);\n console.log(` ${logDir}`);\n\n // Fetch model pricing from LiteLLM (non-blocking if it fails)\n const pricing = await refreshPricingDirect();\n console.log(\n pricing\n ? ` Cached pricing for ${Object.keys(pricing.models).length} models\\n`\n : \" Could not fetch pricing (will use defaults)\\n\",\n );\n\n console.log(\"[2/5] Setting up local marketplace...\");\n fs.mkdirSync(path.join(config.marketplaceDir, \".claude-plugin\"), {\n recursive: true,\n });\n const manifest = readJsonFile(config.marketplaceManifest) ?? {\n name: \"local-plugins\",\n owner: { name: os.userInfo().username },\n plugins: [],\n };\n const plugins = (manifest.plugins as Array<Record<string, unknown>>) ?? [];\n const existing = plugins.findIndex((p) => p.name === \"panopticon\");\n const entry = {\n name: \"panopticon\",\n source: \"./panopticon\",\n description: pkgJson?.description ?? \"Observability for Claude Code\",\n };\n if (existing >= 0) {\n plugins[existing] = entry;\n } else {\n plugins.push(entry);\n }\n manifest.plugins = plugins;\n writeJsonFile(config.marketplaceManifest, manifest);\n\n const symlinkType = process.platform === \"win32\" ? \"junction\" : \"dir\";\n const marketplaceLink = path.join(config.marketplaceDir, \"panopticon\");\n try {\n fs.unlinkSync(marketplaceLink);\n } catch {}\n fs.symlinkSync(pluginRoot, marketplaceLink, symlinkType);\n\n const cacheDir = path.join(config.pluginCacheDir, version);\n fs.mkdirSync(cacheDir, { recursive: true });\n const filesToSync = [\n \".claude-plugin\",\n \"hooks\",\n \"bin\",\n \"dist\",\n \"skills\",\n \"node_modules\",\n \"package.json\",\n \"package-lock.json\",\n ];\n for (const name of filesToSync) {\n const src = path.join(pluginRoot, name);\n const dest = path.join(cacheDir, name);\n if (fs.existsSync(src)) {\n fs.rmSync(dest, { recursive: true, force: true });\n fs.cpSync(src, dest, { recursive: true, dereference: true });\n }\n }\n\n // Ensure bin scripts are executable (cpSync doesn't always preserve mode)\n const binDir = path.join(pluginRoot, \"bin\");\n if (fs.existsSync(binDir)) {\n for (const file of fs.readdirSync(binDir)) {\n const binPath = path.join(binDir, file);\n if (fs.statSync(binPath).isFile()) {\n fs.chmodSync(binPath, 0o755);\n }\n }\n const cachedBinDir = path.join(cacheDir, \"bin\");\n if (fs.existsSync(cachedBinDir)) {\n for (const file of fs.readdirSync(cachedBinDir)) {\n const binPath = path.join(cachedBinDir, file);\n if (fs.statSync(binPath).isFile()) {\n fs.chmodSync(binPath, 0o755);\n }\n }\n }\n }\n\n console.log(` Marketplace: ${config.marketplaceDir}`);\n console.log(` Cache: ${cacheDir}\\n`);\n\n // Register hooks/config for each selected target\n const selectedTargets =\n target === \"all\"\n ? allTargets()\n : ([getTarget(target)].filter(\n Boolean,\n ) as import(\"./targets/types.js\").TargetAdapter[]);\n\n for (const t of selectedTargets) {\n console.log(`[3/5] Registering panopticon in ${t.detect.displayName}...`);\n\n // Read existing config\n let existingConfig: Record<string, unknown>;\n if (t.config.configFormat === \"toml\") {\n existingConfig = readTomlFile(t.config.configPath);\n } else {\n existingConfig = readJsonFile(t.config.configPath) ?? {};\n }\n\n // Apply target-specific install config\n const updatedConfig = t.hooks.applyInstallConfig(existingConfig, {\n pluginRoot,\n port: config.port,\n proxy: !!opts.proxy,\n });\n\n // Write back\n if (t.config.configFormat === \"toml\") {\n writeTomlFile(t.config.configPath, updatedConfig);\n } else {\n writeJsonFile(t.config.configPath, updatedConfig);\n }\n\n if (opts.proxy && t.id === \"codex\") {\n console.log(\" API proxy enabled (--proxy)\");\n }\n console.log(` ${t.config.configPath}\\n`);\n }\n\n // Log skipped targets\n const skippedTargets = allTargets().filter(\n (v) => !selectedTargets.some((st) => st.id === v.id),\n );\n for (const t of skippedTargets) {\n console.log(`[3/5] Skipping ${t.detect.displayName} settings...\\n`);\n }\n\n console.log(\"[4/5] Installing skills...\");\n const skillsSource = path.join(pluginRoot, \"skills\");\n const skillsTarget = path.join(os.homedir(), \".claude\", \"skills\");\n if (fs.existsSync(skillsSource)) {\n for (const skillName of fs.readdirSync(skillsSource)) {\n const src = path.join(skillsSource, skillName);\n if (!fs.statSync(src).isDirectory()) continue;\n const dest = path.join(skillsTarget, skillName);\n fs.mkdirSync(dest, { recursive: true });\n for (const file of fs.readdirSync(src)) {\n fs.cpSync(path.join(src, file), path.join(dest, file), {\n recursive: true,\n });\n }\n console.log(` ${skillName} -> ${dest}`);\n }\n }\n console.log();\n\n console.log(\"[5/5] Configuring shell environment...\");\n configureShellEnv(force, target, !!opts.proxy);\n\n // Start the server so it's ready for the first hook event\n stopExistingDaemons();\n const serverScript = path.resolve(\n path.dirname(fileURLToPath(import.meta.url)),\n \"server.js\",\n );\n const logFd = openLogFd(\"server\");\n const child = spawn(\"node\", [serverScript], {\n detached: true,\n stdio: [\"ignore\", logFd, logFd],\n env: { ...process.env, PANOPTICON_PORT: String(config.port) },\n });\n if (child.pid) {\n fs.writeFileSync(config.serverPidFile, String(child.pid));\n console.log(`\\nServer started (PID ${child.pid}) on :${config.port}`);\n }\n child.unref();\n fs.closeSync(logFd);\n\n const assistant =\n target === \"all\"\n ? allTargets()\n .map((v) => v.detect.displayName)\n .join(\", \")\n : (getTarget(target)?.detect.displayName ?? target);\n console.log(`Done! Start a new ${assistant} session to activate.\\n`);\n console.log(\"Verify with: panopticon status\");\n}\n\nprogram\n .command(\"start\")\n .description(\"Start panopticon server (background)\")\n .action(async () => {\n ensureDataDir();\n\n // Check for already-running unified server\n if (fs.existsSync(config.serverPidFile)) {\n const pid = parseInt(\n fs.readFileSync(config.serverPidFile, \"utf-8\").trim(),\n 10,\n );\n try {\n process.kill(pid, 0);\n console.log(`Panopticon already running (PID ${pid})`);\n return;\n } catch {\n fs.unlinkSync(config.serverPidFile);\n }\n }\n\n // Clean up legacy PID files from old separate daemons\n for (const legacyPid of [config.pidFile, config.proxyPidFile]) {\n if (fs.existsSync(legacyPid)) {\n try {\n const pid = parseInt(fs.readFileSync(legacyPid, \"utf-8\").trim(), 10);\n process.kill(pid, \"SIGTERM\");\n } catch {}\n try {\n fs.unlinkSync(legacyPid);\n } catch {}\n }\n }\n\n const serverScript = path.resolve(\n path.dirname(fileURLToPath(import.meta.url)),\n \"server.js\",\n );\n const logFd = openLogFd(\"server\");\n\n const child = spawn(\"node\", [serverScript], {\n detached: true,\n stdio: [\"ignore\", logFd, logFd],\n env: {\n ...process.env,\n PANOPTICON_PORT: String(config.port),\n },\n });\n\n await new Promise<void>((resolve, reject) => {\n child.on(\"error\", (err) => {\n reject(new Error(`Failed to start: ${err.message}`));\n });\n setTimeout(() => {\n if (child.pid) {\n fs.writeFileSync(config.serverPidFile, String(child.pid));\n child.unref();\n fs.closeSync(logFd);\n console.log(\n `Panopticon started (PID ${child.pid}) on :${config.port}`,\n );\n console.log(`Log: ${logPaths.server}`);\n resolve();\n } else {\n fs.closeSync(logFd);\n reject(new Error(\"Failed to start panopticon server\"));\n }\n }, 500);\n });\n });\n\nprogram\n .command(\"stop\")\n .description(\"Stop panopticon server\")\n .action(() => {\n if (!fs.existsSync(config.serverPidFile)) {\n console.log(\"Panopticon is not running (no PID file)\");\n return;\n }\n const pid = parseInt(\n fs.readFileSync(config.serverPidFile, \"utf-8\").trim(),\n 10,\n );\n try {\n process.kill(pid, \"SIGTERM\");\n fs.unlinkSync(config.serverPidFile);\n console.log(`Panopticon stopped (PID ${pid})`);\n } catch {\n fs.unlinkSync(config.serverPidFile);\n console.log(\"Panopticon was not running (stale PID file removed)\");\n }\n });\n\nprogram\n .command(\"doctor\")\n .description(\"Check system health, server, database, and configuration\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts: { json?: boolean }) => {\n const { doctor } = await import(\"./doctor.js\");\n const result = await doctor();\n\n if (opts.json) {\n output(result);\n return;\n }\n\n console.log(\n `System: ${result.system.os} · Node ${result.system.node}${result.system.sandbox ? \" · Sandbox\" : \"\"}`,\n );\n console.log();\n\n for (const check of result.checks) {\n const icon =\n check.status === \"ok\"\n ? \"\\x1b[32m✓\\x1b[0m\"\n : check.status === \"warn\"\n ? \"\\x1b[33m!\\x1b[0m\"\n : \"\\x1b[31m✗\\x1b[0m\";\n console.log(` ${icon} ${check.label.padEnd(12)} ${check.detail}`);\n }\n\n console.log();\n const passed = result.checks.filter((c) => c.status === \"ok\").length;\n const warned = result.checks.filter((c) => c.status === \"warn\").length;\n const failed = result.checks.filter((c) => c.status === \"fail\").length;\n const parts: string[] = [];\n if (passed > 0) parts.push(`\\x1b[32m${passed} passed\\x1b[0m`);\n if (warned > 0)\n parts.push(`\\x1b[33m${warned} warning${warned > 1 ? \"s\" : \"\"}\\x1b[0m`);\n if (failed > 0) parts.push(`\\x1b[31m${failed} failed\\x1b[0m`);\n console.log(` ${parts.join(\", \")}`);\n\n if (result.recentErrors.length > 0) {\n console.log();\n console.log(\" Recent errors:\");\n for (const err of result.recentErrors) {\n console.log(` [${err.id}] ${err.body}`);\n }\n }\n\n if (result.recentEvents.length > 0) {\n console.log();\n console.log(\" Recent events:\");\n for (const evt of result.recentEvents) {\n const tool = evt.toolName ? ` (${evt.toolName})` : \"\";\n console.log(` ${evt.eventType}${tool} — ${evt.timestamp}`);\n }\n }\n\n console.log();\n });\n\nprogram\n .command(\"status\")\n .description(\"Show server status and database stats\")\n .action(async () => {\n const server = isProcessRunning(config.serverPidFile);\n\n console.log(\"Panopticon Status\");\n console.log(\"=================\");\n console.log();\n console.log(\n `Server: ${server.running ? `running (PID ${server.pid}, port ${config.port})` : \"stopped\"}`,\n );\n console.log(`Database: ${config.dbPath}`);\n\n console.log();\n console.log(\"Log files:\");\n for (const name of DAEMON_NAMES) {\n const logPath = logPaths[name];\n let sizeStr = \"not created\";\n try {\n const stat = fs.statSync(logPath);\n sizeStr =\n stat.size < 1024\n ? `${stat.size} B`\n : `${(stat.size / 1024).toFixed(1)} KB`;\n } catch {}\n console.log(` ${name}: ${logPath} (${sizeStr})`);\n }\n\n if (fs.existsSync(config.dbPath)) {\n const stat = fs.statSync(config.dbPath);\n console.log(`Database size: ${(stat.size / 1024).toFixed(1)} KB`);\n\n if (server.running) {\n try {\n const stats = (await dbStats()) as Record<string, number>;\n console.log();\n console.log(\"Row counts:\");\n console.log(` sessions: ${stats.sessions}`);\n console.log(` messages: ${stats.messages}`);\n console.log(` tool_calls: ${stats.tool_calls}`);\n console.log(` scanner_turns: ${stats.scanner_turns}`);\n console.log(` scanner_events: ${stats.scanner_events}`);\n console.log(` hook_events: ${stats.hook_events}`);\n console.log(` otel_logs: ${stats.otel_logs}`);\n console.log(` otel_metrics: ${stats.otel_metrics}`);\n } catch {\n console.log(\" (could not read database)\");\n }\n }\n } else {\n console.log(\"Database: not initialized (run 'panopticon install')\");\n }\n\n // Sync targets\n try {\n const cfg = loadUnifiedConfig();\n const targets = cfg.sync.targets;\n if (targets.length > 0) {\n console.log();\n console.log(\"Sync targets:\");\n for (const t of targets) {\n console.log(` ${t.name} → ${t.url}`);\n\n if (server.running) {\n try {\n const result = await syncPending(t.name);\n if (result.totalPending === 0) {\n console.log(\" status: up to date\");\n } else {\n console.log(` pending: ${result.totalPending} total`);\n for (const [table, info] of Object.entries(result.tables)) {\n console.log(\n ` ${table}: ${info.pending} (${info.synced} / ${info.total})`,\n );\n }\n }\n } catch {}\n }\n }\n }\n } catch {\n // Sync not configured\n }\n });\n\nprogram\n .command(\"logs\")\n .alias(\"log\")\n .description(\"View daemon logs (otlp, mcp)\")\n .argument(\"[daemon]\", \"Daemon name (otlp, mcp)\", \"otlp\")\n .option(\"-f, --follow\", \"Follow log output (like tail -f)\")\n .option(\"-n, --lines <count>\", \"Number of lines to show\", \"50\")\n .action(async (daemon: string, opts: Opts) => {\n if (!DAEMON_NAMES.includes(daemon as DaemonName)) {\n console.error(`Unknown daemon: ${daemon}`);\n console.log(`Available: ${DAEMON_NAMES.join(\", \")}`);\n process.exit(1);\n }\n\n const logPath = logPaths[daemon as DaemonName];\n const numLines = parseInt(opts.lines, 10);\n\n if (!fs.existsSync(logPath)) {\n console.log(`No logs yet for ${daemon} (${logPath})`);\n return;\n }\n\n const lines = tailLines(logPath, numLines);\n for (const line of lines) {\n console.log(line);\n }\n\n if (opts.follow) {\n let pos = fs.statSync(logPath).size;\n fs.watchFile(logPath, { interval: 200 }, () => {\n const stat = fs.statSync(logPath);\n if (stat.size > pos) {\n const fd = fs.openSync(logPath, \"r\");\n const buf = Buffer.alloc(stat.size - pos);\n fs.readSync(fd, buf, 0, buf.length, pos);\n fs.closeSync(fd);\n process.stdout.write(buf.toString(\"utf-8\"));\n pos = stat.size;\n } else if (stat.size < pos) {\n pos = 0;\n }\n });\n await new Promise(() => {});\n }\n });\n\nprogram\n .command(\"prune\")\n .description(\"Delete old data from the database\")\n .option(\"--older-than <age>\", \"Max age (e.g. 30d, 24h, 60m)\", \"30d\")\n .option(\"--dry-run\", \"Show estimate without deleting\")\n .option(\"--vacuum\", \"Reclaim disk space after pruning\")\n .option(\"--yes\", \"Skip confirmation prompt\")\n .action(async (opts: Opts) => {\n const ageMs = parseAge(opts.olderThan);\n const cutoffMs = Date.now() - ageMs;\n const cutoffDate = new Date(cutoffMs).toISOString();\n\n console.log(\n `Pruning rows older than ${opts.olderThan} (before ${cutoffDate})`,\n );\n console.log();\n\n const estimate = (await pruneEstimate(cutoffMs)) as Record<string, number>;\n const total = Object.values(estimate).reduce((a, b) => a + b, 0);\n\n console.log(\"Rows to delete:\");\n for (const [key, count] of Object.entries(estimate)) {\n if (count > 0) console.log(` ${key}: ${count}`);\n }\n console.log(` total: ${total}`);\n console.log();\n\n if (total === 0) {\n console.log(\"Nothing to prune.\");\n return;\n }\n\n if (opts.dryRun) {\n console.log(\"Dry run — no rows deleted.\");\n return;\n }\n\n if (!opts.yes) {\n const answer = await promptUser(\"Proceed with deletion? [y/N] \");\n if (answer.toLowerCase() !== \"y\") {\n console.log(\"Aborted.\");\n return;\n }\n }\n\n const result = (await pruneExecute(cutoffMs, {\n vacuum: opts.vacuum,\n })) as Record<string, number>;\n console.log(\"Deleted:\");\n for (const [key, count] of Object.entries(result)) {\n if (count > 0) console.log(` ${key}: ${count}`);\n }\n\n if (opts.vacuum) {\n console.log(\"\\nDisk space reclaimed.\");\n }\n });\n\nprogram\n .command(\"sync\")\n .description(\"Manage sync targets (OTLP export)\")\n .addCommand(\n new Command(\"add\")\n .description(\"Add or update a sync target\")\n .argument(\"<name>\", \"Target name\")\n .argument(\"<url>\", \"OTLP endpoint base URL\")\n .option(\"--token <token>\", \"Bearer token for auth\")\n .option(\n \"--token-command <command>\",\n \"Shell command that returns a token (e.g. 'gh auth token')\",\n )\n .action(async (name: string, url: string, opts: Opts) => {\n await syncTargetAdd({\n name,\n url,\n token: opts.token ?? undefined,\n tokenCommand: opts.tokenCommand ?? undefined,\n });\n console.log(`Added sync target \"${name}\" → ${url}`);\n console.log(\"Restart panopticon to activate.\");\n }),\n )\n .addCommand(\n new Command(\"remove\")\n .description(\"Remove a sync target\")\n .argument(\"<name>\", \"Target name\")\n .action(async (name: string) => {\n const result = (await syncTargetRemove(name)) as { ok: boolean };\n if (result.ok) {\n console.log(`Removed sync target \"${name}\"`);\n console.log(\"Restart panopticon to apply.\");\n } else {\n console.log(`No target named \"${name}\"`);\n }\n }),\n )\n .addCommand(\n new Command(\"list\").description(\"List sync targets\").action(async () => {\n const result = (await syncTargetList()) as {\n targets: Array<{\n name: string;\n url: string;\n token?: string;\n tokenCommand?: string;\n }>;\n };\n if (result.targets.length === 0) {\n console.log(\"No sync targets configured.\");\n return;\n }\n for (const t of result.targets) {\n const auth = t.token\n ? \" (token)\"\n : t.tokenCommand\n ? ` (token-command: ${t.tokenCommand})`\n : \"\";\n console.log(` ${t.name} → ${t.url}${auth}`);\n }\n }),\n )\n .addCommand(\n new Command(\"reset\")\n .description(\"Reset sync watermarks (re-syncs all data)\")\n .argument(\"[target]\", \"Reset only this sync target (default: all)\")\n .action(async (targetName?: string) => {\n await syncReset(targetName);\n console.log(\n targetName\n ? `Reset sync watermarks for \"${targetName}\"`\n : \"Reset all sync watermarks\",\n );\n console.log(\"Restart panopticon to re-sync.\");\n }),\n )\n .addCommand(\n new Command(\"watermark\")\n .description(\"Get or set sync watermarks\")\n .argument(\"<target>\", \"Sync target name\")\n .argument(\"[table]\", \"Table name (omit to show all)\")\n .option(\"--set <value>\", \"Set watermark to this value\", parseInt)\n .action(async (target: string, table?: string, opts?: Opts) => {\n if (opts?.set !== undefined) {\n if (!table) {\n console.error(\"Table name is required when setting a watermark\");\n process.exit(1);\n }\n const result = (await syncWatermarkSet(target, table, opts.set)) as {\n key: string;\n value: number;\n };\n console.log(`${result.key} = ${result.value}`);\n } else {\n const result = await syncWatermarkGet(target, table);\n if (table) {\n const r = result as { key: string; value: number };\n console.log(`${r.key} = ${r.value}`);\n } else {\n const r = result as {\n target: string;\n watermarks: Record<string, number>;\n };\n console.log(`Watermarks for \"${r.target}\":`);\n for (const [tbl, value] of Object.entries(r.watermarks)) {\n console.log(` ${tbl}: ${value}`);\n }\n }\n }\n }),\n );\n\n// ---------------------------------------------------------------------------\n// Query commands\n// ---------------------------------------------------------------------------\n\nprogram\n .command(\"sessions\")\n .description(\"List recent sessions with stats (event count, tools, cost)\")\n .option(\"--limit <n>\", \"Max sessions to return (default 20)\", parseInt)\n .option(\n \"--since <duration>\",\n 'Time filter: ISO date or relative like \"24h\", \"7d\", \"30m\"',\n )\n .action(async (opts: Opts) => {\n output(await listSessions({ limit: opts.limit, since: opts.since }));\n });\n\nprogram\n .command(\"timeline\")\n .description(\"Get messages and tool calls for a session\")\n .argument(\"<session-id>\", \"The session ID to query\")\n .option(\"--limit <n>\", \"Max messages to return (default 50)\", parseInt)\n .option(\"--offset <n>\", \"Number of messages to skip\", parseInt)\n .option(\"--full\", \"Return full content instead of truncated\")\n .action(async (sessionId: string, opts: Opts) => {\n const result = await sessionTimeline({\n sessionId,\n limit: opts.limit,\n offset: opts.offset,\n fullPayloads: opts.full,\n });\n output(result);\n });\n\nprogram\n .command(\"costs\")\n .description(\"Token usage and cost breakdowns\")\n .option(\n \"--since <duration>\",\n 'Time filter: ISO date or relative like \"24h\", \"7d\"',\n )\n .option(\"--group-by <key>\", \"Group by: session, model, or day\")\n .action(async (opts: Opts) => {\n output(await costBreakdown({ since: opts.since, groupBy: opts.groupBy }));\n });\n\nprogram\n .command(\"summary\")\n .description(\"Activity summary — sessions, prompts, tools, files, costs\")\n .option(\n \"--since <duration>\",\n 'Time window (default \"24h\"). ISO date or relative like \"24h\", \"7d\"',\n )\n .action(async (opts: Opts) => {\n output(await activitySummary({ since: opts.since }));\n });\n\nprogram\n .command(\"plans\")\n .description(\"List plans created by Claude Code (from ExitPlanMode events)\")\n .option(\"--session <id>\", \"Filter to a specific session\")\n .option(\n \"--since <duration>\",\n 'Time filter: ISO date or relative like \"24h\", \"7d\"',\n )\n .option(\"--limit <n>\", \"Max plans to return (default 20)\", parseInt)\n .action(async (opts: Opts) => {\n output(\n await listPlans({\n session_id: opts.session,\n since: opts.since,\n limit: opts.limit,\n }),\n );\n });\n\nprogram\n .command(\"search\")\n .description(\"Full-text search across events and messages\")\n .argument(\"<query>\", \"Text to search for\")\n .option(\"--types <types...>\", \"Filter to specific event types\")\n .option(\n \"--since <duration>\",\n 'Time filter: ISO date or relative like \"24h\", \"7d\"',\n )\n .option(\"--limit <n>\", \"Max results (default 20)\", parseInt)\n .option(\"--offset <n>\", \"Number of results to skip\", parseInt)\n .option(\"--full\", \"Return full payloads instead of truncated\")\n .action(async (query: string, opts: Opts) => {\n const result = await search({\n query,\n eventTypes: opts.types,\n since: opts.since,\n limit: opts.limit,\n offset: opts.offset,\n fullPayloads: opts.full,\n });\n output(result);\n });\n\nprogram\n .command(\"print\")\n .alias(\"event\")\n .description(\"Get full details for a record by source and ID\")\n .argument(\"<source>\", \"Source: hook, otel, or message\")\n .argument(\"<id>\", \"Record ID from search/timeline results\")\n .action(async (source: string, id: string) => {\n if (source !== \"hook\" && source !== \"otel\" && source !== \"message\") {\n console.error(\n `Invalid source: ${source} (must be \"hook\", \"otel\", or \"message\")`,\n );\n process.exit(1);\n }\n const result = await print({ source, id: parseInt(id, 10) });\n if (!result) {\n console.error(`No ${source} record found with id ${id}`);\n process.exit(1);\n }\n output(result);\n });\n\nprogram\n .command(\"query\")\n .description(\"Execute a read-only SQL query against the database\")\n .argument(\"<sql>\", \"SQL query (SELECT/WITH/PRAGMA only)\")\n .action(async (sql: string) => {\n try {\n output(await rawQuery(sql));\n } catch (err: unknown) {\n console.error(`Error: ${(err as Error).message}`);\n process.exit(1);\n }\n });\n\nprogram\n .command(\"db-stats\")\n .description(\"Show database row counts for each table\")\n .action(async () => {\n output(await dbStats());\n });\n\nprogram\n .command(\"refresh-pricing\")\n .description(\"Fetch latest model pricing from LiteLLM\")\n .action(async () => {\n console.log(\"Fetching pricing from LiteLLM...\");\n const result = await refreshPricing();\n if (result && typeof result === \"object\" && \"models\" in result) {\n const models = (result as { models: Record<string, unknown> }).models;\n console.log(`Cached pricing for ${Object.keys(models).length} models`);\n } else if (result && typeof result === \"object\" && \"ok\" in result) {\n console.log(\"Pricing refreshed.\");\n } else {\n console.error(\"Failed to fetch pricing\");\n process.exit(1);\n }\n });\n\nconst permissions = program\n .command(\"permissions\")\n .description(\"Show or apply permission rules\");\n\npermissions\n .command(\"show\", { isDefault: true })\n .description(\"Show current approvals and allowed tools/commands\")\n .action(() => {\n output(permissionsShow());\n });\n\npermissions\n .command(\"apply\")\n .description(\"Apply permission rules (reads JSON payload from stdin)\")\n .action(async () => {\n const input = JSON.parse(await readStdin());\n output(permissionsApply(input));\n });\n\n// ---------------------------------------------------------------------------\n// Run\n// ---------------------------------------------------------------------------\n\nprogram.parseAsync().catch((err: unknown) => {\n console.error(\"Error:\", (err as Error).message);\n process.exit(1);\n});\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { parse, stringify } from \"smol-toml\";\n\nexport function readTomlFile(filePath: string): Record<string, unknown> {\n try {\n return parse(fs.readFileSync(filePath, \"utf-8\"));\n } catch {\n return {};\n }\n}\n\nexport function writeTomlFile(\n filePath: string,\n data: Record<string, unknown>,\n): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n fs.writeFileSync(filePath, `${stringify(data)}\\n`);\n}\n"],"mappings":"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","names":["fs","path","path","fs","refreshPricing"]}
|
package/dist/db.js
CHANGED
package/dist/doctor.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
doctor
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-UEEWG7FD.js";
|
|
4
|
+
import "./chunk-P5KAIE3O.js";
|
|
5
5
|
import "./chunk-QK5442ZP.js";
|
|
6
|
-
import "./chunk-
|
|
6
|
+
import "./chunk-UDUBRSIG.js";
|
|
7
7
|
import "./chunk-ZEC4LRKS.js";
|
|
8
8
|
import "./chunk-QVK6VGCV.js";
|
|
9
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-UM5U6FPH.js";
|
|
10
10
|
import "./chunk-K7YUPLES.js";
|
|
11
11
|
export {
|
|
12
12
|
doctor
|
package/dist/hooks/handler.js
CHANGED
|
@@ -3,15 +3,15 @@ import {
|
|
|
3
3
|
addBreadcrumb,
|
|
4
4
|
captureException,
|
|
5
5
|
initSentry
|
|
6
|
-
} from "../chunk-
|
|
6
|
+
} from "../chunk-RNICEX6N.js";
|
|
7
7
|
import {
|
|
8
8
|
logPaths,
|
|
9
9
|
openLogFd
|
|
10
10
|
} from "../chunk-7Q3BJMLG.js";
|
|
11
11
|
import {
|
|
12
12
|
refreshIfStale
|
|
13
|
-
} from "../chunk-
|
|
14
|
-
import "../chunk-
|
|
13
|
+
} from "../chunk-OSWBZKK5.js";
|
|
14
|
+
import "../chunk-UM5U6FPH.js";
|
|
15
15
|
import {
|
|
16
16
|
config,
|
|
17
17
|
ensureDataDir
|
|
@@ -80,7 +80,7 @@ async function waitForServer(port, timeoutMs = 3e3) {
|
|
|
80
80
|
|
|
81
81
|
// src/hooks/handler.ts
|
|
82
82
|
function getAgentVersion() {
|
|
83
|
-
return true ? "0.1.
|
|
83
|
+
return true ? "0.1.3+1deea73" : void 0;
|
|
84
84
|
}
|
|
85
85
|
function logHook(message, meta) {
|
|
86
86
|
try {
|
package/dist/index.d.ts
CHANGED
|
@@ -3,11 +3,11 @@ export { refreshPricing } from './pricing.js';
|
|
|
3
3
|
export { autoPrune, pruneEstimate, pruneExecute } from './prune.js';
|
|
4
4
|
export { activitySummary, costBreakdown, dbStats, listPlans, listSessions, print, rawQuery, search, sessionTimeline } from './query.js';
|
|
5
5
|
export { HookEventRow, OtelLogRow, OtelMetricRow, closeDb, getDb } from './db.js';
|
|
6
|
-
import { S as SyncTarget, a as SyncFilter } from './types-
|
|
6
|
+
import { S as SyncTarget, a as SyncFilter } from './types-DrhrWbWe.js';
|
|
7
7
|
export { CheckResult, DoctorResult, RecentError, RecentEvent, doctor } from './doctor.js';
|
|
8
8
|
export { permissionsApply, permissionsShow } from './permissions.js';
|
|
9
9
|
export { RepoInfo, resolveRepoFromCwd } from './repo.js';
|
|
10
|
-
export { ClaudeCodeConfig, ConfigLayer, readConfig, writeFile, writeSettings } from './scanner.js';
|
|
10
|
+
export { ClaudeCodeConfig, ConfigLayer, PluginHooksSummary, readConfig, writeFile, writeSettings } from './scanner.js';
|
|
11
11
|
export { createUnifiedServer } from './server.js';
|
|
12
12
|
export { ShellEnvOptions, configureShellEnv, fetchPricing, initDb } from './setup.js';
|
|
13
13
|
export { ActivitySessionDetail, ActivitySummaryResult, ChildSession, SearchMatch, SearchResult, Session, SessionListResult, SessionTimelineResult, SpendingGroup, SpendingResult, TimelineMessage, TimelineToolCall } from './types.js';
|