@fml-inc/panopticon 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/client.d.ts +2 -2
- package/dist/api/client.js +1 -1
- package/dist/{chunk-3BUJ7URA.js → chunk-3ILOOWUF.js} +66 -2
- package/dist/chunk-3ILOOWUF.js.map +1 -0
- package/dist/{chunk-YZBYEULL.js → chunk-3ZT3V7FP.js} +5 -5
- package/dist/{chunk-VXQ33OYT.js → chunk-BKGQJ76N.js} +47 -19
- package/dist/chunk-BKGQJ76N.js.map +1 -0
- package/dist/{chunk-3TZAKV3M.js → chunk-FMAHQRIU.js} +2 -2
- package/dist/{chunk-LWXF7YRG.js → chunk-GPTBERQD.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-L7G27XWF.js → chunk-HRNZUHTA.js} +3 -3
- package/dist/{chunk-XO5NQRTD.js → chunk-J3HVD4VI.js} +2 -2
- package/dist/{chunk-SEXU2WYG.js → chunk-MEVW27U4.js} +5 -4
- package/dist/chunk-MEVW27U4.js.map +1 -0
- package/dist/{chunk-SUGSQ4YI.js → chunk-N7NCNJZU.js} +4 -4
- package/dist/{chunk-KLXRBD4N.js → chunk-NE7VBLQD.js} +6 -5
- package/dist/{chunk-KLXRBD4N.js.map → chunk-NE7VBLQD.js.map} +1 -1
- package/dist/{chunk-NXH7AONS.js → chunk-OROLSIWZ.js} +8 -6
- package/dist/chunk-OROLSIWZ.js.map +1 -0
- package/dist/{chunk-TCKL7E4K.js → chunk-OW52TNVA.js} +4 -4
- package/dist/{chunk-DZ5HJFB4.js → chunk-SKZHAYNF.js} +53 -2
- package/dist/chunk-SKZHAYNF.js.map +1 -0
- package/dist/{chunk-BVOE7A2Z.js → chunk-V3XR2TAN.js} +8 -6
- package/dist/chunk-V3XR2TAN.js.map +1 -0
- package/dist/{chunk-HRCEIYKU.js → chunk-WXPT6KG7.js} +2 -2
- 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-VHUSGCPN.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-YZBYEULL.js.map → chunk-3ZT3V7FP.js.map} +0 -0
- /package/dist/{chunk-3TZAKV3M.js.map → chunk-FMAHQRIU.js.map} +0 -0
- /package/dist/{chunk-LWXF7YRG.js.map → chunk-GPTBERQD.js.map} +0 -0
- /package/dist/{chunk-L7G27XWF.js.map → chunk-HRNZUHTA.js.map} +0 -0
- /package/dist/{chunk-XO5NQRTD.js.map → chunk-J3HVD4VI.js.map} +0 -0
- /package/dist/{chunk-SUGSQ4YI.js.map → chunk-N7NCNJZU.js.map} +0 -0
- /package/dist/{chunk-TCKL7E4K.js.map → chunk-OW52TNVA.js.map} +0 -0
- /package/dist/{chunk-HRCEIYKU.js.map → chunk-WXPT6KG7.js.map} +0 -0
- /package/dist/{reparse-636YZCE3.js.map → reparse-VHUSGCPN.js.map} +0 -0
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-N7NCNJZU.js";
|
|
4
|
+
import "./chunk-MEVW27U4.js";
|
|
5
5
|
import "./chunk-QK5442ZP.js";
|
|
6
|
-
import "./chunk-
|
|
6
|
+
import "./chunk-GPTBERQD.js";
|
|
7
7
|
import "./chunk-ZEC4LRKS.js";
|
|
8
8
|
import "./chunk-QVK6VGCV.js";
|
|
9
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-SKZHAYNF.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-J3HVD4VI.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-FMAHQRIU.js";
|
|
14
|
+
import "../chunk-SKZHAYNF.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.2+430c018" : 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';
|
package/dist/index.js
CHANGED
|
@@ -5,12 +5,12 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
createUnifiedServer,
|
|
7
7
|
syncAwarePrune
|
|
8
|
-
} from "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
8
|
+
} from "./chunk-BKGQJ76N.js";
|
|
9
|
+
import "./chunk-OW52TNVA.js";
|
|
10
|
+
import "./chunk-NE7VBLQD.js";
|
|
11
|
+
import "./chunk-3ZT3V7FP.js";
|
|
12
|
+
import "./chunk-OROLSIWZ.js";
|
|
13
|
+
import "./chunk-V3XR2TAN.js";
|
|
14
14
|
import {
|
|
15
15
|
resolveRepoFromCwd
|
|
16
16
|
} from "./chunk-YVRWVDIA.js";
|
|
@@ -18,26 +18,26 @@ import {
|
|
|
18
18
|
autoPrune,
|
|
19
19
|
pruneEstimate,
|
|
20
20
|
pruneExecute
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-WXPT6KG7.js";
|
|
22
22
|
import {
|
|
23
23
|
readConfig,
|
|
24
24
|
writeFile,
|
|
25
25
|
writeSettings
|
|
26
|
-
} from "./chunk-
|
|
27
|
-
import "./chunk-
|
|
26
|
+
} from "./chunk-3ILOOWUF.js";
|
|
27
|
+
import "./chunk-J3HVD4VI.js";
|
|
28
28
|
import "./chunk-7Q3BJMLG.js";
|
|
29
29
|
import {
|
|
30
30
|
configureShellEnv,
|
|
31
31
|
fetchPricing,
|
|
32
32
|
initDb
|
|
33
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-HRNZUHTA.js";
|
|
34
34
|
import {
|
|
35
35
|
refreshPricing
|
|
36
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-FMAHQRIU.js";
|
|
37
37
|
import {
|
|
38
38
|
doctor
|
|
39
|
-
} from "./chunk-
|
|
40
|
-
import "./chunk-
|
|
39
|
+
} from "./chunk-N7NCNJZU.js";
|
|
40
|
+
import "./chunk-MEVW27U4.js";
|
|
41
41
|
import {
|
|
42
42
|
loadRetentionConfig,
|
|
43
43
|
loadUnifiedConfig,
|
|
@@ -53,13 +53,13 @@ import {
|
|
|
53
53
|
rawQuery,
|
|
54
54
|
search,
|
|
55
55
|
sessionTimeline
|
|
56
|
-
} from "./chunk-
|
|
56
|
+
} from "./chunk-GPTBERQD.js";
|
|
57
57
|
import "./chunk-ZEC4LRKS.js";
|
|
58
58
|
import "./chunk-QVK6VGCV.js";
|
|
59
59
|
import {
|
|
60
60
|
closeDb,
|
|
61
61
|
getDb
|
|
62
|
-
} from "./chunk-
|
|
62
|
+
} from "./chunk-SKZHAYNF.js";
|
|
63
63
|
import {
|
|
64
64
|
config,
|
|
65
65
|
ensureDataDir
|
package/dist/mcp/server.js
CHANGED
package/dist/otlp/server.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createOtlpServer,
|
|
3
3
|
handleOtlpRequest
|
|
4
|
-
} from "../chunk-
|
|
5
|
-
import "../chunk-
|
|
6
|
-
import "../chunk-
|
|
4
|
+
} from "../chunk-OW52TNVA.js";
|
|
5
|
+
import "../chunk-V3XR2TAN.js";
|
|
6
|
+
import "../chunk-J3HVD4VI.js";
|
|
7
7
|
import "../chunk-7Q3BJMLG.js";
|
|
8
|
-
import "../chunk-
|
|
8
|
+
import "../chunk-FMAHQRIU.js";
|
|
9
9
|
import "../chunk-ZEC4LRKS.js";
|
|
10
10
|
import "../chunk-QVK6VGCV.js";
|
|
11
|
-
import "../chunk-
|
|
11
|
+
import "../chunk-SKZHAYNF.js";
|
|
12
12
|
import "../chunk-K7YUPLES.js";
|
|
13
13
|
export {
|
|
14
14
|
createOtlpServer,
|
package/dist/pricing.js
CHANGED
package/dist/proxy/server.js
CHANGED
|
@@ -2,15 +2,15 @@ import {
|
|
|
2
2
|
createProxyServer,
|
|
3
3
|
handleProxyRequest,
|
|
4
4
|
tunnelWebSocket
|
|
5
|
-
} from "../chunk-
|
|
6
|
-
import "../chunk-
|
|
5
|
+
} from "../chunk-NE7VBLQD.js";
|
|
6
|
+
import "../chunk-V3XR2TAN.js";
|
|
7
7
|
import "../chunk-YVRWVDIA.js";
|
|
8
|
-
import "../chunk-
|
|
9
|
-
import "../chunk-
|
|
8
|
+
import "../chunk-3ILOOWUF.js";
|
|
9
|
+
import "../chunk-J3HVD4VI.js";
|
|
10
10
|
import "../chunk-7Q3BJMLG.js";
|
|
11
11
|
import "../chunk-ZEC4LRKS.js";
|
|
12
12
|
import "../chunk-QVK6VGCV.js";
|
|
13
|
-
import "../chunk-
|
|
13
|
+
import "../chunk-SKZHAYNF.js";
|
|
14
14
|
import "../chunk-K7YUPLES.js";
|
|
15
15
|
export {
|
|
16
16
|
createProxyServer,
|
package/dist/prune.js
CHANGED
package/dist/query.js
CHANGED
|
@@ -8,10 +8,10 @@ import {
|
|
|
8
8
|
rawQuery,
|
|
9
9
|
search,
|
|
10
10
|
sessionTimeline
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-GPTBERQD.js";
|
|
12
12
|
import "./chunk-ZEC4LRKS.js";
|
|
13
13
|
import "./chunk-QVK6VGCV.js";
|
|
14
|
-
import "./chunk-
|
|
14
|
+
import "./chunk-SKZHAYNF.js";
|
|
15
15
|
import "./chunk-K7YUPLES.js";
|
|
16
16
|
export {
|
|
17
17
|
activitySummary,
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
reparseAll
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-OROLSIWZ.js";
|
|
4
|
+
import "./chunk-V3XR2TAN.js";
|
|
5
5
|
import "./chunk-YVRWVDIA.js";
|
|
6
6
|
import "./chunk-7Q3BJMLG.js";
|
|
7
|
-
import "./chunk-
|
|
7
|
+
import "./chunk-FMAHQRIU.js";
|
|
8
8
|
import "./chunk-QVK6VGCV.js";
|
|
9
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-SKZHAYNF.js";
|
|
10
10
|
import "./chunk-K7YUPLES.js";
|
|
11
11
|
export {
|
|
12
12
|
reparseAll
|
|
13
13
|
};
|
|
14
|
-
//# sourceMappingURL=reparse-
|
|
14
|
+
//# sourceMappingURL=reparse-VHUSGCPN.js.map
|