@fml-inc/fml 0.0.30 → 0.1.1

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.
@@ -1,640 +0,0 @@
1
- import {
2
- Database
3
- } from "./chunk-UALBZA5X.js";
4
-
5
- // node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/dist/chunk-K7YUPLES.js
6
- import fs from "fs";
7
- import os from "os";
8
- import path from "path";
9
- function defaultDataDir() {
10
- switch (process.platform) {
11
- case "darwin":
12
- return path.join(
13
- os.homedir(),
14
- "Library",
15
- "Application Support",
16
- "panopticon"
17
- );
18
- case "win32":
19
- return path.join(
20
- process.env.APPDATA ?? path.join(os.homedir(), "AppData", "Roaming"),
21
- "panopticon"
22
- );
23
- default:
24
- return path.join(os.homedir(), ".local", "share", "panopticon");
25
- }
26
- }
27
- function resolveDataDir() {
28
- if (process.env.PANOPTICON_DATA_DIR) return process.env.PANOPTICON_DATA_DIR;
29
- return defaultDataDir();
30
- }
31
- var DATA_DIR = resolveDataDir();
32
- var CLAUDE_DIR = path.join(os.homedir(), ".claude");
33
- var MARKETPLACE_DIR = path.join(
34
- os.homedir(),
35
- ".local",
36
- "share",
37
- "claude-plugins"
38
- );
39
- var DEFAULT_PORT = 4318;
40
- var config = {
41
- dataDir: DATA_DIR,
42
- dbPath: path.join(DATA_DIR, "panopticon.db"),
43
- // Unified server port — replaces separate OTLP and proxy ports
44
- port: parseInt(
45
- process.env.PANOPTICON_PORT ?? process.env.PANOPTICON_OTLP_PORT ?? String(DEFAULT_PORT),
46
- 10
47
- ),
48
- host: process.env.PANOPTICON_HOST ?? "127.0.0.1",
49
- serverPidFile: path.join(DATA_DIR, "panopticon.pid"),
50
- // Legacy — kept for backward compat during transition
51
- pidFile: path.join(DATA_DIR, "otlp-receiver.pid"),
52
- otlpPort: parseInt(process.env.PANOPTICON_OTLP_PORT ?? "4318", 10),
53
- otlpHost: process.env.PANOPTICON_OTLP_HOST ?? "0.0.0.0",
54
- marketplaceDir: MARKETPLACE_DIR,
55
- marketplaceManifest: path.join(
56
- MARKETPLACE_DIR,
57
- ".claude-plugin",
58
- "marketplace.json"
59
- ),
60
- pluginCacheDir: path.join(
61
- CLAUDE_DIR,
62
- "plugins",
63
- "cache",
64
- "local-plugins",
65
- "panopticon"
66
- ),
67
- proxyPort: parseInt(process.env.PANOPTICON_PROXY_PORT ?? "4320", 10),
68
- proxyHost: process.env.PANOPTICON_PROXY_HOST ?? "127.0.0.1",
69
- proxyPidFile: path.join(DATA_DIR, "proxy.pid"),
70
- proxyIdleSessionMs: 30 * 60 * 1e3
71
- };
72
- function ensureDataDir() {
73
- fs.mkdirSync(config.dataDir, { recursive: true });
74
- }
75
-
76
- // node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/dist/chunk-ETKHLE37.js
77
- import fs2 from "fs";
78
- import { gunzipSync } from "zlib";
79
- var MIGRATIONS = [
80
- {
81
- id: 1,
82
- name: "add_plugin_hooks_to_user_config",
83
- sql: "ALTER TABLE user_config_snapshots ADD COLUMN plugin_hooks JSON NOT NULL DEFAULT '[]'"
84
- },
85
- {
86
- id: 2,
87
- name: "remove_sessions_sync_watermark",
88
- up: (db) => {
89
- const exists = db.prepare(
90
- "SELECT 1 FROM sqlite_master WHERE type='table' AND name='watermarks'"
91
- ).get();
92
- if (exists) {
93
- db.exec("DELETE FROM watermarks WHERE key LIKE 'sessions:%'");
94
- }
95
- }
96
- },
97
- {
98
- id: 3,
99
- name: "drop_session_summary_deltas",
100
- // #115 (Apr 2) replaced delta summaries with a single sessions.summary
101
- // column but left the table in the schema and never wrote to it. The
102
- // prune/MCP/e2e references have been cleaned up; this migration removes
103
- // the dead table for DBs that were created before the rewrite.
104
- sql: "DROP TABLE IF EXISTS session_summary_deltas"
105
- }
106
- ];
107
- function runMigrations(db, migrations = MIGRATIONS) {
108
- const trackingExists = db.prepare(
109
- "SELECT 1 FROM sqlite_master WHERE type='table' AND name='schema_migrations'"
110
- ).get();
111
- db.exec(`
112
- CREATE TABLE IF NOT EXISTS schema_migrations (
113
- id INTEGER PRIMARY KEY,
114
- name TEXT NOT NULL,
115
- applied_at TEXT NOT NULL DEFAULT (datetime('now'))
116
- )
117
- `);
118
- if (!trackingExists) {
119
- let hasData = false;
120
- try {
121
- hasData = !!db.prepare("SELECT 1 FROM sessions LIMIT 1").get();
122
- } catch {
123
- }
124
- if (!hasData) {
125
- const stamp = db.prepare(
126
- "INSERT INTO schema_migrations (id, name) VALUES (?, ?)"
127
- );
128
- for (const m of migrations) {
129
- stamp.run(m.id, m.name);
130
- }
131
- return;
132
- }
133
- }
134
- const applied = new Set(
135
- db.prepare("SELECT id FROM schema_migrations").all().map((r) => r.id)
136
- );
137
- for (const migration of migrations) {
138
- if (applied.has(migration.id)) continue;
139
- const run = db.transaction(() => {
140
- if (migration.sql) {
141
- db.exec(migration.sql);
142
- } else if (migration.up) {
143
- migration.up(db);
144
- }
145
- db.prepare("INSERT INTO schema_migrations (id, name) VALUES (?, ?)").run(
146
- migration.id,
147
- migration.name
148
- );
149
- });
150
- run();
151
- }
152
- }
153
- var SCHEMA_SQL = `
154
-
155
- -- \u2500\u2500 OTLP tables \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
156
-
157
- CREATE TABLE IF NOT EXISTS otel_logs (
158
- id INTEGER PRIMARY KEY AUTOINCREMENT,
159
- timestamp_ns INTEGER NOT NULL,
160
- observed_timestamp_ns INTEGER,
161
- severity_number INTEGER,
162
- severity_text TEXT,
163
- body TEXT,
164
- attributes JSON,
165
- resource_attributes JSON,
166
- session_id TEXT,
167
- prompt_id TEXT,
168
- trace_id TEXT,
169
- span_id TEXT,
170
- sync_id TEXT DEFAULT (hex(randomblob(8)))
171
- );
172
-
173
- CREATE TABLE IF NOT EXISTS otel_metrics (
174
- id INTEGER PRIMARY KEY AUTOINCREMENT,
175
- timestamp_ns INTEGER NOT NULL,
176
- name TEXT NOT NULL,
177
- value REAL NOT NULL,
178
- metric_type TEXT,
179
- unit TEXT,
180
- attributes JSON,
181
- resource_attributes JSON,
182
- session_id TEXT,
183
- sync_id TEXT DEFAULT (hex(randomblob(8)))
184
- );
185
-
186
- CREATE TABLE IF NOT EXISTS otel_spans (
187
- id INTEGER PRIMARY KEY AUTOINCREMENT,
188
- trace_id TEXT NOT NULL,
189
- span_id TEXT NOT NULL,
190
- parent_span_id TEXT,
191
- name TEXT NOT NULL,
192
- kind INTEGER,
193
- start_time_ns INTEGER NOT NULL,
194
- end_time_ns INTEGER NOT NULL,
195
- status_code INTEGER,
196
- status_message TEXT,
197
- attributes JSON,
198
- resource_attributes JSON,
199
- session_id TEXT,
200
- UNIQUE(trace_id, span_id)
201
- );
202
-
203
- -- \u2500\u2500 Hook events \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
204
-
205
- CREATE TABLE IF NOT EXISTS hook_events (
206
- id INTEGER PRIMARY KEY AUTOINCREMENT,
207
- session_id TEXT NOT NULL,
208
- event_type TEXT NOT NULL,
209
- timestamp_ms INTEGER NOT NULL,
210
- cwd TEXT,
211
- repository TEXT,
212
- tool_name TEXT,
213
- payload BLOB NOT NULL,
214
- user_prompt TEXT,
215
- file_path TEXT,
216
- command TEXT,
217
- plan TEXT,
218
- allowed_prompts TEXT,
219
- tool_result TEXT,
220
- target TEXT,
221
- sync_id TEXT DEFAULT (hex(randomblob(8)))
222
- );
223
-
224
- CREATE VIRTUAL TABLE IF NOT EXISTS hook_events_fts USING fts5(
225
- payload,
226
- content='',
227
- contentless_delete=1,
228
- tokenize='trigram'
229
- );
230
-
231
- -- \u2500\u2500 Sessions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
232
-
233
- CREATE TABLE IF NOT EXISTS sessions (
234
- session_id TEXT PRIMARY KEY,
235
- target TEXT,
236
- started_at_ms INTEGER,
237
- ended_at_ms INTEGER,
238
- cwd TEXT,
239
- first_prompt TEXT,
240
- permission_mode TEXT,
241
- agent_version TEXT,
242
- model TEXT,
243
- cli_version TEXT,
244
- scanner_file_path TEXT,
245
- total_input_tokens INTEGER DEFAULT 0,
246
- total_output_tokens INTEGER DEFAULT 0,
247
- total_cache_read_tokens INTEGER DEFAULT 0,
248
- total_cache_creation_tokens INTEGER DEFAULT 0,
249
- total_reasoning_tokens INTEGER DEFAULT 0,
250
- turn_count INTEGER DEFAULT 0,
251
- otel_input_tokens INTEGER DEFAULT 0,
252
- otel_output_tokens INTEGER DEFAULT 0,
253
- otel_cache_read_tokens INTEGER DEFAULT 0,
254
- otel_cache_creation_tokens INTEGER DEFAULT 0,
255
- models TEXT,
256
- has_hooks INTEGER DEFAULT 0,
257
- has_otel INTEGER DEFAULT 0,
258
- has_scanner INTEGER DEFAULT 0,
259
- summary TEXT,
260
- summary_version INTEGER DEFAULT 0,
261
- sync_dirty INTEGER DEFAULT 0,
262
- sync_seq INTEGER DEFAULT 0,
263
- tool_counts JSON DEFAULT '{}',
264
- hook_tool_counts JSON DEFAULT '{}',
265
- event_type_counts JSON DEFAULT '{}',
266
- hook_event_type_counts JSON DEFAULT '{}',
267
- project TEXT,
268
- machine TEXT NOT NULL DEFAULT 'local',
269
- message_count INTEGER DEFAULT 0,
270
- user_message_count INTEGER DEFAULT 0,
271
- parent_session_id TEXT,
272
- relationship_type TEXT DEFAULT '',
273
- is_automated INTEGER DEFAULT 0,
274
- created_at INTEGER
275
- );
276
-
277
- CREATE TABLE IF NOT EXISTS session_repositories (
278
- session_id TEXT NOT NULL,
279
- repository TEXT NOT NULL,
280
- first_seen_ms INTEGER NOT NULL,
281
- git_user_name TEXT,
282
- git_user_email TEXT,
283
- branch TEXT,
284
- UNIQUE(session_id, repository)
285
- );
286
-
287
- CREATE TABLE IF NOT EXISTS session_cwds (
288
- session_id TEXT NOT NULL,
289
- cwd TEXT NOT NULL,
290
- first_seen_ms INTEGER NOT NULL,
291
- UNIQUE(session_id, cwd)
292
- );
293
-
294
- -- \u2500\u2500 Messages \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
295
-
296
- CREATE TABLE IF NOT EXISTS messages (
297
- id INTEGER PRIMARY KEY AUTOINCREMENT,
298
- session_id TEXT NOT NULL,
299
- ordinal INTEGER NOT NULL,
300
- role TEXT NOT NULL,
301
- content TEXT NOT NULL,
302
- timestamp_ms INTEGER,
303
- has_thinking INTEGER NOT NULL DEFAULT 0,
304
- has_tool_use INTEGER NOT NULL DEFAULT 0,
305
- content_length INTEGER NOT NULL DEFAULT 0,
306
- is_system INTEGER NOT NULL DEFAULT 0,
307
- model TEXT NOT NULL DEFAULT '',
308
- token_usage TEXT NOT NULL DEFAULT '',
309
- context_tokens INTEGER NOT NULL DEFAULT 0,
310
- output_tokens INTEGER NOT NULL DEFAULT 0,
311
- has_context_tokens INTEGER NOT NULL DEFAULT 0,
312
- has_output_tokens INTEGER NOT NULL DEFAULT 0,
313
- uuid TEXT,
314
- parent_uuid TEXT,
315
- UNIQUE(session_id, ordinal)
316
- );
317
-
318
- CREATE VIRTUAL TABLE IF NOT EXISTS messages_fts USING fts5(
319
- content,
320
- content='',
321
- contentless_delete=1,
322
- tokenize='trigram'
323
- );
324
-
325
- -- \u2500\u2500 Tool calls \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
326
-
327
- CREATE TABLE IF NOT EXISTS tool_calls (
328
- id INTEGER PRIMARY KEY AUTOINCREMENT,
329
- message_id INTEGER NOT NULL,
330
- session_id TEXT NOT NULL,
331
- tool_name TEXT NOT NULL,
332
- category TEXT NOT NULL,
333
- tool_use_id TEXT,
334
- input_json TEXT,
335
- skill_name TEXT,
336
- result_content_length INTEGER,
337
- result_content TEXT,
338
- duration_ms INTEGER,
339
- subagent_session_id TEXT,
340
- sync_id TEXT DEFAULT (hex(randomblob(8)))
341
- );
342
-
343
- -- \u2500\u2500 Scanner tables \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
344
-
345
- CREATE TABLE IF NOT EXISTS scanner_turns (
346
- id INTEGER PRIMARY KEY AUTOINCREMENT,
347
- session_id TEXT NOT NULL,
348
- source TEXT NOT NULL,
349
- turn_index INTEGER NOT NULL,
350
- timestamp_ms INTEGER NOT NULL,
351
- model TEXT,
352
- role TEXT,
353
- content_preview TEXT,
354
- input_tokens INTEGER DEFAULT 0,
355
- output_tokens INTEGER DEFAULT 0,
356
- cache_read_tokens INTEGER DEFAULT 0,
357
- cache_creation_tokens INTEGER DEFAULT 0,
358
- reasoning_tokens INTEGER DEFAULT 0,
359
- sync_id TEXT DEFAULT (hex(randomblob(8))),
360
- UNIQUE(session_id, source, turn_index)
361
- );
362
-
363
- CREATE TABLE IF NOT EXISTS scanner_events (
364
- id INTEGER PRIMARY KEY AUTOINCREMENT,
365
- session_id TEXT NOT NULL,
366
- source TEXT NOT NULL,
367
- event_type TEXT NOT NULL,
368
- timestamp_ms INTEGER NOT NULL,
369
- tool_name TEXT,
370
- tool_input TEXT,
371
- tool_output TEXT,
372
- content TEXT,
373
- metadata JSON,
374
- sync_id TEXT DEFAULT (hex(randomblob(8))),
375
- UNIQUE(session_id, source, event_type, timestamp_ms, tool_name)
376
- );
377
-
378
- CREATE TABLE IF NOT EXISTS scanner_file_watermarks (
379
- file_path TEXT PRIMARY KEY,
380
- byte_offset INTEGER NOT NULL DEFAULT 0,
381
- last_scanned_ms INTEGER NOT NULL,
382
- archived_size INTEGER DEFAULT 0
383
- );
384
-
385
- -- \u2500\u2500 Model pricing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
386
-
387
- CREATE TABLE IF NOT EXISTS model_pricing (
388
- id INTEGER PRIMARY KEY AUTOINCREMENT,
389
- model_id TEXT NOT NULL,
390
- input_per_m REAL NOT NULL,
391
- output_per_m REAL NOT NULL,
392
- cache_read_per_m REAL NOT NULL DEFAULT 0,
393
- cache_write_per_m REAL NOT NULL DEFAULT 0,
394
- updated_ms INTEGER NOT NULL
395
- );
396
-
397
- -- \u2500\u2500 Config snapshots \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
398
-
399
- CREATE TABLE IF NOT EXISTS user_config_snapshots (
400
- id INTEGER PRIMARY KEY AUTOINCREMENT,
401
- device_name TEXT NOT NULL,
402
- snapshot_at_ms INTEGER NOT NULL,
403
- content_hash TEXT NOT NULL,
404
- permissions JSON NOT NULL DEFAULT '{}',
405
- enabled_plugins JSON NOT NULL DEFAULT '[]',
406
- hooks JSON NOT NULL DEFAULT '[]',
407
- commands JSON NOT NULL DEFAULT '[]',
408
- rules JSON NOT NULL DEFAULT '[]',
409
- skills JSON NOT NULL DEFAULT '[]',
410
- plugin_hooks JSON NOT NULL DEFAULT '[]'
411
- );
412
-
413
- CREATE TABLE IF NOT EXISTS repo_config_snapshots (
414
- id INTEGER PRIMARY KEY AUTOINCREMENT,
415
- repository TEXT NOT NULL,
416
- cwd TEXT NOT NULL,
417
- session_id TEXT,
418
- snapshot_at_ms INTEGER NOT NULL,
419
- content_hash TEXT NOT NULL,
420
- hooks JSON NOT NULL DEFAULT '[]',
421
- mcp_servers JSON NOT NULL DEFAULT '[]',
422
- commands JSON NOT NULL DEFAULT '[]',
423
- agents JSON NOT NULL DEFAULT '[]',
424
- rules JSON NOT NULL DEFAULT '[]',
425
- local_hooks JSON NOT NULL DEFAULT '[]',
426
- local_mcp_servers JSON NOT NULL DEFAULT '[]',
427
- local_permissions JSON NOT NULL DEFAULT '{}',
428
- local_is_gitignored INTEGER NOT NULL DEFAULT 1,
429
- instructions JSON NOT NULL DEFAULT '[]'
430
- );
431
-
432
- -- \u2500\u2500 Sync watermarks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
433
-
434
- CREATE TABLE IF NOT EXISTS watermarks (
435
- key TEXT PRIMARY KEY,
436
- value INTEGER NOT NULL
437
- );
438
-
439
- -- \u2500\u2500 Per-session sync state \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
440
-
441
- DROP TABLE IF EXISTS pending_session_sync;
442
-
443
- CREATE TABLE IF NOT EXISTS target_session_sync (
444
- session_id TEXT NOT NULL,
445
- target TEXT NOT NULL,
446
- confirmed INTEGER DEFAULT 0,
447
- sync_seq INTEGER DEFAULT 0,
448
- synced_seq INTEGER DEFAULT 0,
449
- wm_messages INTEGER DEFAULT 0,
450
- wm_tool_calls INTEGER DEFAULT 0,
451
- wm_scanner_turns INTEGER DEFAULT 0,
452
- wm_scanner_events INTEGER DEFAULT 0,
453
- wm_hook_events INTEGER DEFAULT 0,
454
- wm_otel_logs INTEGER DEFAULT 0,
455
- wm_otel_metrics INTEGER DEFAULT 0,
456
- wm_otel_spans INTEGER DEFAULT 0,
457
- PRIMARY KEY (session_id, target)
458
- );
459
-
460
- -- \u2500\u2500 Indexes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
461
-
462
- -- otel_logs
463
- CREATE INDEX IF NOT EXISTS idx_logs_session ON otel_logs(session_id);
464
- CREATE INDEX IF NOT EXISTS idx_logs_body ON otel_logs(body);
465
- CREATE INDEX IF NOT EXISTS idx_logs_ts ON otel_logs(timestamp_ns);
466
- CREATE INDEX IF NOT EXISTS idx_logs_prompt ON otel_logs(prompt_id);
467
-
468
- -- otel_metrics
469
- CREATE INDEX IF NOT EXISTS idx_metrics_session ON otel_metrics(session_id);
470
- CREATE INDEX IF NOT EXISTS idx_metrics_name ON otel_metrics(name);
471
- CREATE INDEX IF NOT EXISTS idx_metrics_ts ON otel_metrics(timestamp_ns);
472
-
473
- -- otel_spans
474
- CREATE INDEX IF NOT EXISTS idx_spans_session ON otel_spans(session_id);
475
- CREATE INDEX IF NOT EXISTS idx_spans_trace ON otel_spans(trace_id);
476
- CREATE INDEX IF NOT EXISTS idx_spans_start ON otel_spans(start_time_ns);
477
-
478
- -- hook_events
479
- CREATE INDEX IF NOT EXISTS idx_hooks_session ON hook_events(session_id);
480
- CREATE INDEX IF NOT EXISTS idx_hooks_type ON hook_events(event_type);
481
- CREATE INDEX IF NOT EXISTS idx_hooks_tool ON hook_events(tool_name);
482
- CREATE INDEX IF NOT EXISTS idx_hooks_ts ON hook_events(timestamp_ms);
483
- CREATE INDEX IF NOT EXISTS idx_hooks_file_path ON hook_events(file_path);
484
- CREATE INDEX IF NOT EXISTS idx_hooks_target ON hook_events(target);
485
-
486
- -- sessions
487
- CREATE INDEX IF NOT EXISTS idx_sessions_target ON sessions(target);
488
- CREATE INDEX IF NOT EXISTS idx_sessions_started ON sessions(started_at_ms);
489
- CREATE INDEX IF NOT EXISTS idx_sessions_sync_seq ON sessions(sync_seq);
490
- CREATE INDEX IF NOT EXISTS idx_sessions_project ON sessions(project);
491
- CREATE INDEX IF NOT EXISTS idx_sessions_machine ON sessions(machine);
492
- CREATE INDEX IF NOT EXISTS idx_sessions_parent ON sessions(parent_session_id)
493
- WHERE parent_session_id IS NOT NULL;
494
-
495
- -- session_repositories
496
- CREATE INDEX IF NOT EXISTS idx_session_repos_session ON session_repositories(session_id);
497
- CREATE INDEX IF NOT EXISTS idx_session_repos_repo ON session_repositories(repository);
498
-
499
- -- session_cwds
500
- CREATE INDEX IF NOT EXISTS idx_session_cwds_session ON session_cwds(session_id);
501
-
502
- -- messages
503
- CREATE INDEX IF NOT EXISTS idx_messages_session_ordinal ON messages(session_id, ordinal);
504
- CREATE INDEX IF NOT EXISTS idx_messages_session_role ON messages(session_id, role);
505
-
506
- -- tool_calls
507
- CREATE INDEX IF NOT EXISTS idx_tool_calls_session ON tool_calls(session_id);
508
- CREATE INDEX IF NOT EXISTS idx_tool_calls_category ON tool_calls(category);
509
- CREATE INDEX IF NOT EXISTS idx_tool_calls_skill ON tool_calls(skill_name)
510
- WHERE skill_name IS NOT NULL;
511
- CREATE INDEX IF NOT EXISTS idx_tool_calls_subagent ON tool_calls(subagent_session_id)
512
- WHERE subagent_session_id IS NOT NULL;
513
-
514
- -- scanner_turns
515
- CREATE INDEX IF NOT EXISTS idx_scanner_turns_session ON scanner_turns(session_id);
516
- CREATE INDEX IF NOT EXISTS idx_scanner_turns_ts ON scanner_turns(timestamp_ms);
517
-
518
- -- scanner_events
519
- CREATE INDEX IF NOT EXISTS idx_scanner_events_session ON scanner_events(session_id);
520
- CREATE INDEX IF NOT EXISTS idx_scanner_events_type ON scanner_events(event_type);
521
-
522
- -- model_pricing
523
- CREATE INDEX IF NOT EXISTS idx_model_pricing_model ON model_pricing(model_id, updated_ms);
524
-
525
- -- user_config_snapshots
526
- CREATE INDEX IF NOT EXISTS idx_user_config_ts ON user_config_snapshots(snapshot_at_ms);
527
- CREATE INDEX IF NOT EXISTS idx_user_config_device_hash ON user_config_snapshots(device_name, content_hash);
528
-
529
- -- repo_config_snapshots
530
- CREATE INDEX IF NOT EXISTS idx_repo_config_repo_ts ON repo_config_snapshots(repository, snapshot_at_ms);
531
- CREATE INDEX IF NOT EXISTS idx_repo_config_session ON repo_config_snapshots(session_id);
532
- CREATE INDEX IF NOT EXISTS idx_repo_config_repo_hash ON repo_config_snapshots(repository, content_hash);
533
-
534
- `;
535
- var SCANNER_DATA_VERSION = 1;
536
- var _db = null;
537
- var _needsResync = false;
538
- function registerCompressionFunctions(db) {
539
- db.function(
540
- "decompress",
541
- (blob) => blob ? gunzipSync(blob).toString() : null
542
- );
543
- }
544
- function getDb() {
545
- if (_db && !fs2.existsSync(config.dbPath)) {
546
- try {
547
- _db.close();
548
- } catch {
549
- }
550
- _db = null;
551
- }
552
- if (_db) return _db;
553
- if (!fs2.existsSync(config.dataDir)) {
554
- throw new Error(
555
- `Panopticon data directory not found: ${config.dataDir}. Run "panopticon install" to set up.`
556
- );
557
- }
558
- _db = new Database(config.dbPath);
559
- _db.pragma("auto_vacuum = INCREMENTAL");
560
- _db.pragma("journal_mode = WAL");
561
- _db.pragma("busy_timeout = 5000");
562
- registerCompressionFunctions(_db);
563
- _db.exec(SCHEMA_SQL);
564
- runMigrations(_db);
565
- const currentVersion = _db.pragma("user_version", { simple: true }) ?? 0;
566
- if (currentVersion < SCANNER_DATA_VERSION) {
567
- _needsResync = true;
568
- } else {
569
- _needsResync = false;
570
- }
571
- return _db;
572
- }
573
- function closeDb() {
574
- if (_db) {
575
- _db.close();
576
- _db = null;
577
- }
578
- }
579
-
580
- // node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/dist/chunk-YZWYIA3U.js
581
- function watermarkKey(table, targetName) {
582
- return `${table}:${targetName}`;
583
- }
584
- function readWatermark(key) {
585
- const db = getDb();
586
- const row = db.prepare("SELECT value FROM watermarks WHERE key = ?").get(key);
587
- return row?.value ?? 0;
588
- }
589
-
590
- // node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/dist/chunk-QK5442ZP.js
591
- import fs3 from "fs";
592
- import path2 from "path";
593
- var DEFAULT_RETENTION = {
594
- maxAgeDays: 90,
595
- maxSizeMb: 1e3
596
- };
597
- function defaultConfig() {
598
- return { sync: { targets: [] }, retention: { ...DEFAULT_RETENTION } };
599
- }
600
- var CONFIG_FILE = "config.json";
601
- function configPath() {
602
- return path2.join(config.dataDir, CONFIG_FILE);
603
- }
604
- function mergeDefaults(raw) {
605
- const retention = {
606
- ...DEFAULT_RETENTION,
607
- ...raw.retention ?? {}
608
- };
609
- return {
610
- hooksInstalled: raw.hooksInstalled,
611
- sentryDsn: raw.sentryDsn,
612
- sync: raw.sync ?? { targets: [] },
613
- retention
614
- };
615
- }
616
- function loadUnifiedConfig() {
617
- try {
618
- const raw = JSON.parse(fs3.readFileSync(configPath(), "utf-8"));
619
- return mergeDefaults(raw);
620
- } catch {
621
- return defaultConfig();
622
- }
623
- }
624
- function saveUnifiedConfig(cfg) {
625
- ensureDataDir();
626
- const p = configPath();
627
- fs3.writeFileSync(p, `${JSON.stringify(cfg, null, 2)}
628
- `, { mode: 384 });
629
- }
630
-
631
- export {
632
- config,
633
- getDb,
634
- closeDb,
635
- watermarkKey,
636
- readWatermark,
637
- loadUnifiedConfig,
638
- saveUnifiedConfig
639
- };
640
- //# sourceMappingURL=chunk-NLFKYSN7.js.map