@fml-inc/panopticon 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +10 -0
- package/LICENSE +5 -0
- package/README.md +363 -0
- package/bin/hook-handler +3 -0
- package/bin/mcp-server +3 -0
- package/bin/panopticon +3 -0
- package/bin/proxy +3 -0
- package/bin/server +3 -0
- package/dist/api/client.d.ts +67 -0
- package/dist/api/client.js +48 -0
- package/dist/api/client.js.map +1 -0
- package/dist/chunk-3BUJ7URA.js +387 -0
- package/dist/chunk-3BUJ7URA.js.map +1 -0
- package/dist/chunk-3TZAKV3M.js +158 -0
- package/dist/chunk-3TZAKV3M.js.map +1 -0
- package/dist/chunk-4SM2H22C.js +169 -0
- package/dist/chunk-4SM2H22C.js.map +1 -0
- package/dist/chunk-7Q3BJMLG.js +62 -0
- package/dist/chunk-7Q3BJMLG.js.map +1 -0
- package/dist/chunk-BVOE7A2Z.js +412 -0
- package/dist/chunk-BVOE7A2Z.js.map +1 -0
- package/dist/chunk-CF4GPWLI.js +170 -0
- package/dist/chunk-CF4GPWLI.js.map +1 -0
- package/dist/chunk-DZ5HJFB4.js +467 -0
- package/dist/chunk-DZ5HJFB4.js.map +1 -0
- package/dist/chunk-HQCY722C.js +428 -0
- package/dist/chunk-HQCY722C.js.map +1 -0
- package/dist/chunk-HRCEIYKU.js +134 -0
- package/dist/chunk-HRCEIYKU.js.map +1 -0
- package/dist/chunk-K7YUPLES.js +76 -0
- package/dist/chunk-K7YUPLES.js.map +1 -0
- package/dist/chunk-L7G27XWF.js +130 -0
- package/dist/chunk-L7G27XWF.js.map +1 -0
- package/dist/chunk-LWXF7YRG.js +626 -0
- package/dist/chunk-LWXF7YRG.js.map +1 -0
- package/dist/chunk-NXH7AONS.js +1120 -0
- package/dist/chunk-NXH7AONS.js.map +1 -0
- package/dist/chunk-QK5442ZP.js +55 -0
- package/dist/chunk-QK5442ZP.js.map +1 -0
- package/dist/chunk-QVK6VGCV.js +1703 -0
- package/dist/chunk-QVK6VGCV.js.map +1 -0
- package/dist/chunk-RX2RXHBH.js +1699 -0
- package/dist/chunk-RX2RXHBH.js.map +1 -0
- package/dist/chunk-SEXU2WYG.js +788 -0
- package/dist/chunk-SEXU2WYG.js.map +1 -0
- package/dist/chunk-SUGSQ4YI.js +264 -0
- package/dist/chunk-SUGSQ4YI.js.map +1 -0
- package/dist/chunk-TGXFVAID.js +138 -0
- package/dist/chunk-TGXFVAID.js.map +1 -0
- package/dist/chunk-WLBNFVIG.js +447 -0
- package/dist/chunk-WLBNFVIG.js.map +1 -0
- package/dist/chunk-XLTCUH5A.js +1072 -0
- package/dist/chunk-XLTCUH5A.js.map +1 -0
- package/dist/chunk-YVRWVDIA.js +146 -0
- package/dist/chunk-YVRWVDIA.js.map +1 -0
- package/dist/chunk-ZEC4LRKS.js +176 -0
- package/dist/chunk-ZEC4LRKS.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +1084 -0
- package/dist/cli.js.map +1 -0
- package/dist/config-NwoZC-GM.d.ts +20 -0
- package/dist/db.d.ts +46 -0
- package/dist/db.js +15 -0
- package/dist/db.js.map +1 -0
- package/dist/doctor.d.ts +37 -0
- package/dist/doctor.js +14 -0
- package/dist/doctor.js.map +1 -0
- package/dist/hooks/handler.d.ts +23 -0
- package/dist/hooks/handler.js +295 -0
- package/dist/hooks/handler.js.map +1 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.js +101 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/server.d.ts +1 -0
- package/dist/mcp/server.js +243 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/otlp/server.d.ts +7 -0
- package/dist/otlp/server.js +17 -0
- package/dist/otlp/server.js.map +1 -0
- package/dist/permissions.d.ts +33 -0
- package/dist/permissions.js +14 -0
- package/dist/permissions.js.map +1 -0
- package/dist/pricing.d.ts +29 -0
- package/dist/pricing.js +13 -0
- package/dist/pricing.js.map +1 -0
- package/dist/proxy/server.d.ts +10 -0
- package/dist/proxy/server.js +20 -0
- package/dist/proxy/server.js.map +1 -0
- package/dist/prune.d.ts +18 -0
- package/dist/prune.js +13 -0
- package/dist/prune.js.map +1 -0
- package/dist/query.d.ts +56 -0
- package/dist/query.js +27 -0
- package/dist/query.js.map +1 -0
- package/dist/reparse-636YZCE3.js +14 -0
- package/dist/reparse-636YZCE3.js.map +1 -0
- package/dist/repo.d.ts +17 -0
- package/dist/repo.js +9 -0
- package/dist/repo.js.map +1 -0
- package/dist/scanner.d.ts +73 -0
- package/dist/scanner.js +15 -0
- package/dist/scanner.js.map +1 -0
- package/dist/sdk.d.ts +82 -0
- package/dist/sdk.js +208 -0
- package/dist/sdk.js.map +1 -0
- package/dist/server.d.ts +5 -0
- package/dist/server.js +25 -0
- package/dist/server.js.map +1 -0
- package/dist/setup.d.ts +35 -0
- package/dist/setup.js +19 -0
- package/dist/setup.js.map +1 -0
- package/dist/sync/index.d.ts +29 -0
- package/dist/sync/index.js +32 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/targets.d.ts +279 -0
- package/dist/targets.js +20 -0
- package/dist/targets.js.map +1 -0
- package/dist/types-D-MYCBol.d.ts +128 -0
- package/dist/types.d.ts +164 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/hooks/hooks.json +274 -0
- package/package.json +124 -0
- package/skills/panopticon-optimize/SKILL.md +222 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/db/query.ts"],"sourcesContent":["import { allTargets } from \"../targets/index.js\";\nimport type {\n ActivitySessionDetail,\n ActivitySummaryResult,\n ChildSession,\n SearchMatch,\n SearchResult,\n Session,\n SessionListResult,\n SessionTimelineResult,\n SpendingGroup,\n SpendingResult,\n TimelineMessage,\n TimelineToolCall,\n} from \"../types.js\";\nimport { getDb } from \"./schema.js\";\n\nfunction parseSince(since?: string): number | null {\n if (!since) return null;\n const match = since.match(/^(\\d+)(h|d|m)$/);\n if (match) {\n const [, num, unit] = match;\n const ms = unit === \"h\" ? 3600000 : unit === \"d\" ? 86400000 : 60000;\n return Date.now() - parseInt(num, 10) * ms;\n }\n const date = new Date(since);\n return Number.isNaN(date.getTime()) ? null : date.getTime();\n}\n\nfunction toIso(ms: number): string {\n return new Date(ms).toISOString();\n}\n\n// ── OTel log SQL helpers (adapter-driven) ────────────────────────────────────\n\n/** Build COALESCE/CASE expressions for OTel log event type and timestamp from adapter specs. */\nfunction buildOtelLogExprs(): { eventType: string; timestampMs: string } {\n const defaultTs = \"CAST(timestamp_ns / 1000000 AS INTEGER)\";\n const eventExprs = new Set<string>([\"body\"]);\n const extraTsExprs = new Set<string>();\n\n for (const target of allTargets()) {\n const lf = target.otel?.logFields;\n if (!lf) continue;\n for (const expr of lf.eventTypeExprs ?? []) {\n eventExprs.add(expr);\n }\n for (const expr of lf.timestampMsExprs ?? []) {\n if (expr !== defaultTs) extraTsExprs.add(expr);\n }\n }\n\n const eventExprArr = [...eventExprs];\n const eventType =\n eventExprArr.length === 1\n ? eventExprArr[0]\n : `COALESCE(${eventExprArr.join(\", \")})`;\n\n let timestampMs = defaultTs;\n if (extraTsExprs.size > 0) {\n const fallbackArr = [...extraTsExprs];\n const fallbackExpr =\n fallbackArr.length === 1\n ? fallbackArr[0]\n : `COALESCE(${fallbackArr.join(\", \")})`;\n timestampMs = `CASE WHEN timestamp_ns > 0 THEN ${defaultTs} ELSE ${fallbackExpr} END`;\n }\n\n return { eventType, timestampMs };\n}\n\nlet _otelLogExprs: { eventType: string; timestampMs: string } | null = null;\nfunction otelLogExprs() {\n if (!_otelLogExprs) _otelLogExprs = buildOtelLogExprs();\n return _otelLogExprs;\n}\n\n// ── Sessions ──────────────────────────────────────────────────────────────────\n\ninterface RawRepoRow {\n session_id: string;\n repository: string;\n git_user_name: string | null;\n git_user_email: string | null;\n}\n\n/** Cost SQL fragment for a session row with model + token columns. */\nconst SESSION_COST_SQL = `\n COALESCE((\n SELECT s.total_input_tokens * COALESCE(mp.input_per_m, 0) / 1000000.0\n + s.total_output_tokens * COALESCE(mp.output_per_m, 0) / 1000000.0\n + s.total_cache_read_tokens * COALESCE(mp.cache_read_per_m, 0) / 1000000.0\n + s.total_cache_creation_tokens * COALESCE(mp.cache_write_per_m, 0) / 1000000.0\n FROM model_pricing mp\n WHERE s.model LIKE mp.model_id || '%'\n ORDER BY LENGTH(mp.model_id) DESC, mp.updated_ms DESC\n LIMIT 1\n ), 0)`;\n\nexport function listSessions(\n opts: { limit?: number; since?: string } = {},\n): SessionListResult {\n const db = getDb();\n const limit = opts.limit ?? 20;\n const sinceMs = parseSince(opts.since);\n\n const conditions: string[] = [];\n const params: unknown[] = [];\n if (sinceMs) {\n conditions.push(\"s.started_at_ms >= ?\");\n params.push(sinceMs);\n }\n const where =\n conditions.length > 0 ? `WHERE ${conditions.join(\" AND \")}` : \"\";\n\n const sql = `\n SELECT s.session_id, s.target, s.model, s.project,\n s.started_at_ms, s.ended_at_ms, s.first_prompt, s.summary,\n COALESCE(s.turn_count, 0) as turn_count,\n COALESCE(s.message_count, 0) as message_count,\n COALESCE(s.total_input_tokens, 0) as total_input_tokens,\n COALESCE(s.total_output_tokens, 0) as total_output_tokens,\n s.parent_session_id, s.relationship_type,\n ${SESSION_COST_SQL} as total_cost\n FROM sessions s\n ${where}\n ORDER BY s.started_at_ms DESC\n LIMIT ?\n `;\n params.push(limit);\n\n const rows = db.prepare(sql).all(...params) as Array<{\n session_id: string;\n target: string | null;\n model: string | null;\n project: string | null;\n started_at_ms: number | null;\n ended_at_ms: number | null;\n first_prompt: string | null;\n summary: string | null;\n turn_count: number;\n message_count: number;\n total_input_tokens: number;\n total_output_tokens: number;\n parent_session_id: string | null;\n relationship_type: string | null;\n total_cost: number;\n }>;\n\n const sessionIds = rows.map((r) => r.session_id);\n const repoRows =\n sessionIds.length > 0\n ? (db\n .prepare(\n `SELECT session_id, repository, git_user_name, git_user_email\n FROM session_repositories\n WHERE session_id IN (${sessionIds.map(() => \"?\").join(\",\")})`,\n )\n .all(...sessionIds) as RawRepoRow[])\n : [];\n\n const reposBySession = new Map<string, RawRepoRow[]>();\n for (const r of repoRows) {\n const list = reposBySession.get(r.session_id) ?? [];\n list.push(r);\n reposBySession.set(r.session_id, list);\n }\n\n const sessions: Session[] = rows.map((row) => ({\n sessionId: row.session_id,\n target: row.target,\n model: row.model,\n project: row.project,\n startedAt: row.started_at_ms ? toIso(row.started_at_ms) : null,\n endedAt: row.ended_at_ms ? toIso(row.ended_at_ms) : null,\n firstPrompt: row.first_prompt,\n turnCount: row.turn_count,\n messageCount: row.message_count,\n totalInputTokens: row.total_input_tokens,\n totalOutputTokens: row.total_output_tokens,\n totalCost: row.total_cost,\n repositories: (reposBySession.get(row.session_id) ?? []).map((r) => ({\n name: r.repository,\n gitUserName: r.git_user_name,\n gitUserEmail: r.git_user_email,\n })),\n parentSessionId: row.parent_session_id,\n relationshipType: row.relationship_type,\n summary: row.summary,\n }));\n\n return {\n sessions,\n totalCount: sessions.length,\n source: \"local\",\n };\n}\n\n// ── Timeline ──────────────────────────────────────────────────────────────────\n\nexport function sessionTimeline(opts: {\n sessionId: string;\n limit?: number;\n offset?: number;\n fullPayloads?: boolean;\n}): SessionTimelineResult {\n const db = getDb();\n const limit = opts.limit ?? 50;\n const offset = opts.offset ?? 0;\n const truncate = !opts.fullPayloads;\n\n // Session metadata\n const sessionRow = db\n .prepare(\n \"SELECT session_id, target, model, project, parent_session_id, relationship_type FROM sessions WHERE session_id = ?\",\n )\n .get(opts.sessionId) as\n | {\n session_id: string;\n target: string | null;\n model: string | null;\n project: string | null;\n parent_session_id: string | null;\n relationship_type: string | null;\n }\n | undefined;\n\n if (!sessionRow) {\n return {\n session: null,\n messages: [],\n totalMessages: 0,\n hasMore: false,\n source: \"local\",\n };\n }\n\n const repoRows = db\n .prepare(\n \"SELECT repository, git_user_name, git_user_email FROM session_repositories WHERE session_id = ?\",\n )\n .all(opts.sessionId) as RawRepoRow[];\n\n // Child sessions (forks + subagents)\n const childRows = db\n .prepare(\n \"SELECT session_id, relationship_type, model, COALESCE(turn_count, 0) as turn_count, first_prompt, started_at_ms FROM sessions WHERE parent_session_id = ?\",\n )\n .all(opts.sessionId) as Array<{\n session_id: string;\n relationship_type: string;\n model: string | null;\n turn_count: number;\n first_prompt: string | null;\n started_at_ms: number | null;\n }>;\n\n const childSessions: ChildSession[] = childRows.map((r) => ({\n sessionId: r.session_id,\n relationshipType: r.relationship_type,\n model: r.model,\n turnCount: r.turn_count,\n firstPrompt: r.first_prompt,\n startedAtMs: r.started_at_ms,\n }));\n\n // Message count\n const totalMessages = (\n db\n .prepare(\"SELECT COUNT(*) as c FROM messages WHERE session_id = ?\")\n .get(opts.sessionId) as { c: number }\n ).c;\n\n // Messages\n const contentCol = truncate ? \"SUBSTR(m.content, 1, 500)\" : \"m.content\";\n const msgRows = db\n .prepare(\n `SELECT m.id, m.ordinal, m.role, ${contentCol} as content, m.timestamp_ms,\n m.model, m.is_system, m.has_thinking, m.has_tool_use,\n m.content_length, m.uuid, m.parent_uuid,\n m.token_usage, m.context_tokens, m.output_tokens\n FROM messages m\n WHERE m.session_id = ?\n ORDER BY m.ordinal ASC\n LIMIT ? OFFSET ?`,\n )\n .all(opts.sessionId, limit, offset) as Array<{\n id: number;\n ordinal: number;\n role: string;\n content: string;\n timestamp_ms: number | null;\n model: string | null;\n is_system: number;\n has_thinking: number;\n has_tool_use: number;\n content_length: number;\n uuid: string | null;\n parent_uuid: string | null;\n token_usage: string | null;\n context_tokens: number;\n output_tokens: number;\n }>;\n\n // Batch-load tool calls\n const msgIds = msgRows.map((m) => m.id);\n const tcRows =\n msgIds.length > 0\n ? (db\n .prepare(\n `SELECT tc.message_id, tc.tool_name, tc.category, tc.tool_use_id,\n tc.input_json, tc.skill_name, tc.result_content_length,\n tc.duration_ms, tc.subagent_session_id\n FROM tool_calls tc\n WHERE tc.message_id IN (${msgIds.map(() => \"?\").join(\",\")})\n ORDER BY tc.id ASC`,\n )\n .all(...msgIds) as Array<{\n message_id: number;\n tool_name: string;\n category: string;\n tool_use_id: string | null;\n input_json: string | null;\n skill_name: string | null;\n result_content_length: number | null;\n duration_ms: number | null;\n subagent_session_id: string | null;\n }>)\n : [];\n\n // Subagent metadata lookup\n const subagentIds = [\n ...new Set(\n tcRows.map((tc) => tc.subagent_session_id).filter(Boolean) as string[],\n ),\n ];\n const subagentMap = new Map<\n string,\n { model: string | null; turn_count: number; first_prompt: string | null }\n >();\n if (subagentIds.length > 0) {\n const subRows = db\n .prepare(\n `SELECT session_id, model, COALESCE(turn_count, 0) as turn_count, first_prompt\n FROM sessions WHERE session_id IN (${subagentIds.map(() => \"?\").join(\",\")})`,\n )\n .all(...subagentIds) as Array<{\n session_id: string;\n model: string | null;\n turn_count: number;\n first_prompt: string | null;\n }>;\n for (const r of subRows) {\n subagentMap.set(r.session_id, {\n model: r.model,\n turn_count: r.turn_count,\n first_prompt: r.first_prompt,\n });\n }\n }\n\n // Group tool calls by message_id\n const tcByMessage = new Map<number, typeof tcRows>();\n for (const tc of tcRows) {\n const list = tcByMessage.get(tc.message_id) ?? [];\n list.push(tc);\n tcByMessage.set(tc.message_id, list);\n }\n\n const messages: TimelineMessage[] = msgRows.map((m) => {\n const tcs = tcByMessage.get(m.id) ?? [];\n return {\n id: m.id,\n ordinal: m.ordinal,\n role: m.role,\n content: m.content,\n timestampMs: m.timestamp_ms,\n model: m.model,\n isSystem: m.is_system === 1,\n hasThinking: m.has_thinking === 1,\n hasToolUse: m.has_tool_use === 1,\n contentLength: m.content_length,\n uuid: m.uuid,\n parentUuid: m.parent_uuid,\n tokenUsage: m.token_usage,\n contextTokens: m.context_tokens,\n outputTokens: m.output_tokens,\n toolCalls: tcs.map((tc): TimelineToolCall => {\n const sub = tc.subagent_session_id\n ? subagentMap.get(tc.subagent_session_id)\n : undefined;\n return {\n toolName: tc.tool_name,\n category: tc.category,\n toolUseId: tc.tool_use_id,\n inputJson: truncate\n ? (tc.input_json?.slice(0, 500) ?? null)\n : tc.input_json,\n skillName: tc.skill_name,\n resultContentLength: tc.result_content_length,\n durationMs: tc.duration_ms,\n subagentSessionId: tc.subagent_session_id,\n subagent: sub\n ? {\n sessionId: tc.subagent_session_id!,\n model: sub.model,\n turnCount: sub.turn_count,\n firstPrompt: sub.first_prompt,\n }\n : null,\n };\n }),\n };\n });\n\n return {\n session: {\n sessionId: opts.sessionId,\n target: sessionRow.target,\n model: sessionRow.model,\n project: sessionRow.project,\n parentSessionId: sessionRow.parent_session_id,\n relationshipType: sessionRow.relationship_type,\n repositories: repoRows.map((r) => ({\n name: r.repository,\n gitUserName: r.git_user_name,\n gitUserEmail: r.git_user_email,\n })),\n childSessions,\n },\n messages,\n totalMessages,\n hasMore: offset + limit < totalMessages,\n source: \"local\",\n };\n}\n\n// ── Spending ──────────────────────────────────────────────────────────────────\n\nexport function costBreakdown(\n opts: { since?: string; groupBy?: \"session\" | \"model\" | \"day\" } = {},\n): SpendingResult {\n const db = getDb();\n const sinceMs = parseSince(opts.since);\n const groupBy = opts.groupBy ?? \"session\";\n\n const conditions: string[] = [];\n const params: unknown[] = [];\n if (sinceMs) {\n conditions.push(\"s.started_at_ms >= ?\");\n params.push(sinceMs);\n }\n const where =\n conditions.length > 0 ? `WHERE ${conditions.join(\" AND \")}` : \"\";\n\n let groupExpr: string;\n let selectExpr: string;\n if (groupBy === \"day\") {\n groupExpr = \"date(s.started_at_ms / 1000, 'unixepoch')\";\n selectExpr = `${groupExpr} as group_key`;\n } else if (groupBy === \"model\") {\n groupExpr = \"COALESCE(s.model, 'unknown')\";\n selectExpr = `${groupExpr} as group_key`;\n } else {\n groupExpr = \"s.session_id\";\n selectExpr = \"s.session_id as group_key\";\n }\n\n const sql = `\n SELECT ${selectExpr},\n SUM(COALESCE(s.total_input_tokens, 0) + COALESCE(s.total_cache_read_tokens, 0) + COALESCE(s.total_cache_creation_tokens, 0)) as input_tokens,\n SUM(COALESCE(s.total_output_tokens, 0)) as output_tokens,\n SUM(COALESCE(s.total_input_tokens, 0) + COALESCE(s.total_output_tokens, 0) + COALESCE(s.total_cache_read_tokens, 0) + COALESCE(s.total_cache_creation_tokens, 0)) as total_tokens,\n SUM(${SESSION_COST_SQL}) as total_cost,\n COUNT(DISTINCT s.session_id) as session_count\n FROM sessions s\n ${where}\n GROUP BY ${groupExpr}\n ORDER BY ${groupBy === \"day\" ? \"group_key DESC\" : \"total_tokens DESC\"}\n `;\n\n const rows = db.prepare(sql).all(...params) as Array<{\n group_key: string;\n input_tokens: number;\n output_tokens: number;\n total_tokens: number;\n total_cost: number;\n session_count: number;\n }>;\n\n const groups: SpendingGroup[] = rows.map((row) => ({\n key: row.group_key,\n inputTokens: row.input_tokens,\n outputTokens: row.output_tokens,\n totalTokens: row.total_tokens,\n totalCost: row.total_cost,\n sessionCount: row.session_count,\n }));\n\n const totals = {\n inputTokens: groups.reduce((sum, g) => sum + g.inputTokens, 0),\n outputTokens: groups.reduce((sum, g) => sum + g.outputTokens, 0),\n totalTokens: groups.reduce((sum, g) => sum + g.totalTokens, 0),\n totalCost: groups.reduce((sum, g) => sum + g.totalCost, 0),\n };\n\n return { groups, totals, groupBy, source: \"local\" };\n}\n\n// ── Search ────────────────────────────────────────────────────────────────────\n\ninterface RawSearchRow {\n source: string;\n id: number;\n session_id: string;\n event_type: string;\n timestamp_ms: number;\n tool_name: string | null;\n cwd: string | null;\n payload: string | null;\n}\n\nexport function search(opts: {\n query: string;\n eventTypes?: string[];\n since?: string;\n limit?: number;\n offset?: number;\n fullPayloads?: boolean;\n}): SearchResult {\n const db = getDb();\n const limit = opts.limit ?? 20;\n const offset = opts.offset ?? 0;\n const sinceMs = parseSince(opts.since);\n const pattern = `%${opts.query}%`;\n const truncate = !opts.fullPayloads;\n\n const hookPayloadCol = truncate\n ? \"SUBSTR(decompress(h.payload), 1, 500)\"\n : \"decompress(h.payload)\";\n\n const hookConditions: string[] = [];\n const hookParams: unknown[] = [];\n\n hookConditions.push(\n \"(h.id IN (SELECT rowid FROM hook_events_fts WHERE hook_events_fts MATCH ?) OR h.tool_name LIKE ? OR h.event_type LIKE ?)\",\n );\n hookParams.push(opts.query, pattern, pattern);\n\n if (opts.eventTypes?.length) {\n hookConditions.push(\n `h.event_type IN (${opts.eventTypes.map(() => \"?\").join(\",\")})`,\n );\n hookParams.push(...opts.eventTypes);\n }\n if (sinceMs) {\n hookConditions.push(\"h.timestamp_ms >= ?\");\n hookParams.push(sinceMs);\n }\n\n const hookSql = `\n SELECT 'hook' as source, h.id, h.session_id, h.event_type, h.timestamp_ms,\n h.tool_name, h.cwd, ${hookPayloadCol} as payload\n FROM hook_events h\n WHERE ${hookConditions.join(\" AND \")}\n `;\n\n const otelConditions: string[] = [\"(o.body LIKE ? OR o.attributes LIKE ?)\"];\n const otelParams: unknown[] = [pattern, pattern];\n\n if (sinceMs) {\n otelConditions.push(\"CAST(o.timestamp_ns / 1000000 AS INTEGER) >= ?\");\n otelParams.push(sinceMs);\n }\n\n const otelAttrsCol = truncate\n ? \"SUBSTR(o.attributes, 1, 500)\"\n : \"o.attributes\";\n\n // Use table-qualified versions of the OTel expressions for the aliased query\n const otelEventTypeQ = otelLogExprs().eventType.replace(\n /\\b(body|timestamp_ns|attributes)\\b/g,\n \"o.$1\",\n );\n const otelTimestampMsQ = otelLogExprs().timestampMs.replace(\n /\\b(body|timestamp_ns|attributes)\\b/g,\n \"o.$1\",\n );\n\n const otelSql = `\n SELECT 'otel' as source, o.id, o.session_id,\n ${otelEventTypeQ} as event_type,\n ${otelTimestampMsQ} as timestamp_ms,\n NULL as tool_name, NULL as cwd, ${otelAttrsCol} as payload\n FROM otel_logs o\n WHERE ${otelConditions.join(\" AND \")}\n `;\n\n // Messages FTS search\n const msgContentCol = truncate ? \"SUBSTR(m.content, 1, 500)\" : \"m.content\";\n const msgConditions: string[] = [\n \"m.id IN (SELECT rowid FROM messages_fts WHERE messages_fts MATCH ?)\",\n ];\n const msgParams: unknown[] = [opts.query];\n if (sinceMs) {\n msgConditions.push(\"m.timestamp_ms >= ?\");\n msgParams.push(sinceMs);\n }\n\n const msgSql = `\n SELECT 'message' as source, m.id, m.session_id,\n m.role as event_type, m.timestamp_ms,\n NULL as tool_name, NULL as cwd, ${msgContentCol} as payload\n FROM messages m\n WHERE ${msgConditions.join(\" AND \")}\n `;\n\n // Session summary search\n const summaryConditions: string[] = [\n \"s.summary IS NOT NULL\",\n \"s.summary LIKE ?\",\n ];\n const summaryParams: unknown[] = [pattern];\n if (sinceMs) {\n summaryConditions.push(\"s.started_at_ms >= ?\");\n summaryParams.push(sinceMs);\n }\n\n const summarySql = `\n SELECT 'summary' as source, s.session_id as id, s.session_id,\n 'summary' as event_type, s.started_at_ms as timestamp_ms,\n NULL as tool_name, NULL as cwd, SUBSTR(s.summary, 1, 500) as payload\n FROM sessions s\n WHERE ${summaryConditions.join(\" AND \")}\n `;\n\n const countSql = `SELECT COUNT(*) as total FROM (${hookSql} UNION ALL ${otelSql} UNION ALL ${msgSql} UNION ALL ${summarySql})`;\n const total = (\n db\n .prepare(countSql)\n .get(...hookParams, ...otelParams, ...msgParams, ...summaryParams) as {\n total: number;\n }\n ).total;\n\n const sql = `\n SELECT * FROM (${hookSql} UNION ALL ${otelSql} UNION ALL ${msgSql} UNION ALL ${summarySql})\n ORDER BY timestamp_ms DESC\n LIMIT ? OFFSET ?\n `;\n\n const rows = db\n .prepare(sql)\n .all(\n ...hookParams,\n ...otelParams,\n ...msgParams,\n ...summaryParams,\n limit,\n offset,\n ) as RawSearchRow[];\n\n const results: SearchMatch[] = rows.map((row) => {\n const snippet = row.payload ?? row.event_type ?? \"\";\n const matchType =\n row.source === \"summary\"\n ? \"summary\"\n : row.source === \"message\"\n ? \"message\"\n : row.event_type === \"UserPromptSubmit\"\n ? \"prompt\"\n : row.tool_name\n ? \"tool_use\"\n : \"event\";\n\n return {\n sessionId: row.session_id,\n timestamp: toIso(row.timestamp_ms),\n matchType,\n matchSnippet:\n typeof snippet === \"string\"\n ? snippet.slice(0, 300)\n : String(snippet).slice(0, 300),\n eventType: row.event_type,\n toolName: row.tool_name,\n };\n });\n\n return {\n results,\n totalMatches: total,\n query: opts.query,\n source: \"local\",\n };\n}\n\n// ── Activity Summary ──────────────────────────────────────────────────────────\n\nexport function activitySummary(\n opts: { since?: string } = {},\n): ActivitySummaryResult {\n const db = getDb();\n const sinceMs = parseSince(opts.since ?? \"24h\") ?? Date.now() - 86400000;\n const now = Date.now();\n\n const rawSessions = db\n .prepare(\n `SELECT s.session_id, s.model, s.project,\n s.started_at_ms, s.ended_at_ms,\n COALESCE(s.total_input_tokens, 0) + COALESCE(s.total_output_tokens, 0) +\n COALESCE(s.total_cache_read_tokens, 0) + COALESCE(s.total_cache_creation_tokens, 0) as total_tokens,\n ${SESSION_COST_SQL} as total_cost\n FROM sessions s\n WHERE s.started_at_ms >= ?\n ORDER BY s.started_at_ms ASC`,\n )\n .all(sinceMs) as Array<{\n session_id: string;\n model: string | null;\n project: string | null;\n started_at_ms: number | null;\n ended_at_ms: number | null;\n total_tokens: number;\n total_cost: number;\n }>;\n\n let totalCost = 0;\n let totalTokens = 0;\n const sessions: ActivitySessionDetail[] = [];\n\n for (const s of rawSessions) {\n totalCost += s.total_cost;\n totalTokens += s.total_tokens;\n\n // User prompts from messages\n const prompts = db\n .prepare(\n \"SELECT SUBSTR(content, 1, 100) as prompt FROM messages WHERE session_id = ? AND role = 'user' AND is_system = 0 ORDER BY ordinal ASC LIMIT 10\",\n )\n .all(s.session_id) as { prompt: string }[];\n\n // Tool usage from tool_calls\n const tools = db\n .prepare(\n \"SELECT tool_name, COUNT(*) as count FROM tool_calls WHERE session_id = ? GROUP BY tool_name ORDER BY count DESC\",\n )\n .all(s.session_id) as { tool_name: string; count: number }[];\n\n // Files from Write/Edit tool_calls input_json\n const fileRows = db\n .prepare(\n \"SELECT DISTINCT json_extract(input_json, '$.file_path') as file_path FROM tool_calls WHERE session_id = ? AND tool_name IN ('Write', 'Edit') AND input_json IS NOT NULL\",\n )\n .all(s.session_id) as { file_path: string | null }[];\n\n const repos = db\n .prepare(\n \"SELECT repository, git_user_name, git_user_email FROM session_repositories WHERE session_id = ?\",\n )\n .all(s.session_id) as RawRepoRow[];\n\n const durationMs =\n s.started_at_ms && s.ended_at_ms ? s.ended_at_ms - s.started_at_ms : 0;\n\n sessions.push({\n sessionId: s.session_id,\n startedAt: s.started_at_ms ? toIso(s.started_at_ms) : null,\n durationMinutes: Math.round(durationMs / 60000),\n model: s.model,\n project: s.project,\n repositories: repos.map((r) => ({\n name: r.repository,\n gitUserName: r.git_user_name,\n gitUserEmail: r.git_user_email,\n })),\n userPrompts: prompts.map((p) => p.prompt),\n toolsUsed: tools.map((t) => ({ tool: t.tool_name, count: t.count })),\n filesModified: fileRows\n .map((f) => f.file_path)\n .filter(Boolean) as string[],\n totalCost: s.total_cost,\n });\n }\n\n // Global top tools from tool_calls\n const topTools = db\n .prepare(\n `SELECT tc.tool_name, COUNT(*) as count\n FROM tool_calls tc\n INNER JOIN sessions s ON tc.session_id = s.session_id\n WHERE s.started_at_ms >= ?\n GROUP BY tc.tool_name ORDER BY count DESC LIMIT 10`,\n )\n .all(sinceMs) as { tool_name: string; count: number }[];\n\n return {\n period: {\n since: toIso(sinceMs),\n until: toIso(now),\n },\n totalSessions: rawSessions.length,\n totalTokens,\n totalCost,\n topTools: topTools.map((t) => ({ tool: t.tool_name, count: t.count })),\n sessions,\n source: \"local\",\n };\n}\n\n// ── Plans (panopticon-specific, not in unified types) ─────────────────────────\n\nexport function listPlans(\n opts: { session_id?: string; since?: string; limit?: number } = {},\n) {\n const db = getDb();\n const limit = opts.limit ?? 20;\n const sinceMs = parseSince(opts.since);\n\n const conditions: string[] = [\n \"tool_name = 'ExitPlanMode'\",\n \"event_type = 'PreToolUse'\",\n ];\n const params: unknown[] = [];\n\n if (opts.session_id) {\n conditions.push(\"session_id = ?\");\n params.push(opts.session_id);\n }\n if (sinceMs) {\n conditions.push(\"timestamp_ms >= ?\");\n params.push(sinceMs);\n }\n\n const sql = `\n SELECT id, session_id, timestamp_ms, plan, allowed_prompts\n FROM hook_events\n WHERE ${conditions.join(\" AND \")}\n ORDER BY timestamp_ms DESC\n LIMIT ?\n `;\n params.push(limit);\n\n const rows = db.prepare(sql).all(...params) as {\n id: number;\n session_id: string;\n timestamp_ms: number;\n plan: string | null;\n allowed_prompts: string | null;\n }[];\n\n return rows.map((r) => ({\n id: r.id,\n session_id: r.session_id,\n timestamp: toIso(r.timestamp_ms),\n plan: r.plan,\n allowed_prompts: r.allowed_prompts ? JSON.parse(r.allowed_prompts) : null,\n }));\n}\n\n// ── Get Event (panopticon-specific) ───────────────────────────────────────────\n\nexport function print(opts: {\n source: \"hook\" | \"otel\" | \"message\";\n id: number;\n}) {\n const db = getDb();\n\n if (opts.source === \"hook\") {\n const sql = `\n SELECT 'hook' as source, id, session_id, event_type, timestamp_ms,\n tool_name, cwd, user_prompt, file_path, command, plan,\n tool_result, allowed_prompts, decompress(payload) as payload\n FROM hook_events\n WHERE id = ?\n `;\n return db.prepare(sql).get(opts.id) ?? null;\n }\n\n if (opts.source === \"message\") {\n const msg = db\n .prepare(\n `SELECT m.id, m.session_id, m.ordinal, m.role, m.content, m.timestamp_ms,\n m.has_thinking, m.has_tool_use, m.content_length, m.is_system,\n m.model, m.token_usage, m.context_tokens, m.output_tokens,\n m.uuid, m.parent_uuid\n FROM messages m WHERE m.id = ?`,\n )\n .get(opts.id) as Record<string, unknown> | undefined;\n if (!msg) return null;\n const toolCalls = db\n .prepare(\n `SELECT tool_name, category, tool_use_id, input_json, skill_name,\n result_content_length, duration_ms, subagent_session_id\n FROM tool_calls WHERE message_id = ?`,\n )\n .all(opts.id);\n return { source: \"message\", ...msg, tool_calls: toolCalls };\n }\n\n const sql = `\n SELECT 'otel' as source, id, session_id, ${otelLogExprs().eventType} as event_type,\n ${otelLogExprs().timestampMs} as timestamp_ms,\n NULL as tool_name, NULL as cwd, attributes, severity_text,\n ${otelLogExprs().eventType} as body\n FROM otel_logs\n WHERE id = ?\n `;\n return db.prepare(sql).get(opts.id) ?? null;\n}\n\n// ── Raw Query (panopticon-specific) ──────────────────────────────────────────\n\nexport function rawQuery(sql: string) {\n const db = getDb();\n\n const trimmed = sql.trim().toUpperCase();\n if (\n !trimmed.startsWith(\"SELECT\") &&\n !trimmed.startsWith(\"WITH\") &&\n !trimmed.startsWith(\"PRAGMA\")\n ) {\n throw new Error(\"Only SELECT, WITH, and PRAGMA statements are allowed\");\n }\n\n if (!trimmed.startsWith(\"PRAGMA\") && !trimmed.includes(\"LIMIT\")) {\n sql = `${sql.trimEnd().replace(/;$/, \"\")} LIMIT 1000`;\n }\n\n return db.prepare(sql).all();\n}\n\n// ── DB Stats (panopticon-specific) ───────────────────────────────────────────\n\nexport function dbStats() {\n const db = getDb();\n const logs = db.prepare(\"SELECT COUNT(*) as count FROM otel_logs\").get() as {\n count: number;\n };\n const metrics = db\n .prepare(\"SELECT COUNT(*) as count FROM otel_metrics\")\n .get() as { count: number };\n const hooks = db\n .prepare(\"SELECT COUNT(*) as count FROM hook_events\")\n .get() as { count: number };\n const spans = db\n .prepare(\"SELECT COUNT(*) as count FROM otel_spans\")\n .get() as { count: number };\n const sessions = db\n .prepare(\"SELECT COUNT(*) as count FROM sessions\")\n .get() as { count: number };\n const scannerTurns = db\n .prepare(\"SELECT COUNT(*) as count FROM scanner_turns\")\n .get() as { count: number };\n const scannerEvents = db\n .prepare(\"SELECT COUNT(*) as count FROM scanner_events\")\n .get() as { count: number };\n\n const messages = db\n .prepare(\"SELECT COUNT(*) as count FROM messages\")\n .get() as { count: number };\n const toolCalls = db\n .prepare(\"SELECT COUNT(*) as count FROM tool_calls\")\n .get() as { count: number };\n\n return {\n sessions: sessions.count,\n messages: messages.count,\n tool_calls: toolCalls.count,\n scanner_turns: scannerTurns.count,\n scanner_events: scannerEvents.count,\n hook_events: hooks.count,\n otel_logs: logs.count,\n otel_metrics: metrics.count,\n otel_spans: spans.count,\n };\n}\n"],"mappings":"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","names":["sql"]}
|