proofscan 0.1.1 → 0.2.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.
Files changed (71) hide show
  1. package/README.md +172 -24
  2. package/dist/cli.js +4 -2
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/archive.d.ts +6 -0
  5. package/dist/commands/archive.d.ts.map +1 -0
  6. package/dist/commands/archive.js +245 -0
  7. package/dist/commands/archive.js.map +1 -0
  8. package/dist/commands/index.d.ts +2 -0
  9. package/dist/commands/index.d.ts.map +1 -1
  10. package/dist/commands/index.js +2 -0
  11. package/dist/commands/index.js.map +1 -1
  12. package/dist/commands/monitor.d.ts +1 -1
  13. package/dist/commands/monitor.d.ts.map +1 -1
  14. package/dist/commands/monitor.js +33 -21
  15. package/dist/commands/monitor.js.map +1 -1
  16. package/dist/commands/scan.d.ts.map +1 -1
  17. package/dist/commands/scan.js +4 -0
  18. package/dist/commands/scan.js.map +1 -1
  19. package/dist/commands/sessions.d.ts +6 -0
  20. package/dist/commands/sessions.d.ts.map +1 -0
  21. package/dist/commands/sessions.js +203 -0
  22. package/dist/commands/sessions.js.map +1 -0
  23. package/dist/db/connection.d.ts +28 -0
  24. package/dist/db/connection.d.ts.map +1 -0
  25. package/dist/db/connection.js +123 -0
  26. package/dist/db/connection.js.map +1 -0
  27. package/dist/db/events-store.d.ts +56 -0
  28. package/dist/db/events-store.d.ts.map +1 -0
  29. package/dist/db/events-store.js +269 -0
  30. package/dist/db/events-store.js.map +1 -0
  31. package/dist/db/index.d.ts +6 -0
  32. package/dist/db/index.d.ts.map +1 -0
  33. package/dist/db/index.js +6 -0
  34. package/dist/db/index.js.map +1 -0
  35. package/dist/db/proofs-store.d.ts +56 -0
  36. package/dist/db/proofs-store.d.ts.map +1 -0
  37. package/dist/db/proofs-store.js +116 -0
  38. package/dist/db/proofs-store.js.map +1 -0
  39. package/dist/db/schema.d.ts +8 -0
  40. package/dist/db/schema.d.ts.map +1 -0
  41. package/dist/db/schema.js +76 -0
  42. package/dist/db/schema.js.map +1 -0
  43. package/dist/db/types.d.ts +64 -0
  44. package/dist/db/types.d.ts.map +1 -0
  45. package/dist/db/types.js +5 -0
  46. package/dist/db/types.js.map +1 -0
  47. package/dist/index.d.ts +14 -6
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +15 -6
  50. package/dist/index.js.map +1 -1
  51. package/dist/scanner/index.d.ts +3 -2
  52. package/dist/scanner/index.d.ts.map +1 -1
  53. package/dist/scanner/index.js +66 -51
  54. package/dist/scanner/index.js.map +1 -1
  55. package/dist/types/config.d.ts +7 -0
  56. package/dist/types/config.d.ts.map +1 -1
  57. package/dist/types/config.js +5 -0
  58. package/dist/types/config.js.map +1 -1
  59. package/dist/types/events.d.ts +1 -17
  60. package/dist/types/events.d.ts.map +1 -1
  61. package/dist/types/events.js +1 -0
  62. package/dist/types/events.js.map +1 -1
  63. package/package.json +3 -1
  64. package/dist/events/index.d.ts +0 -2
  65. package/dist/events/index.d.ts.map +0 -1
  66. package/dist/events/index.js +0 -2
  67. package/dist/events/index.js.map +0 -1
  68. package/dist/events/store.d.ts +0 -25
  69. package/dist/events/store.d.ts.map +0 -1
  70. package/dist/events/store.js +0 -91
  71. package/dist/events/store.js.map +0 -1
package/README.md CHANGED
@@ -8,8 +8,9 @@ proofscan provides visibility into MCP (Model Context Protocol) server communica
8
8
 
9
9
  - Connects to MCP servers via stdio transport
10
10
  - Captures all JSON-RPC messages (requests, responses, notifications)
11
- - Stores events in JSONL format for later analysis
11
+ - Stores events in SQLite for efficient querying and analysis
12
12
  - Supports importing server configurations from mcp.so / Claude Desktop format
13
+ - Manages session history with retention policies and archival
13
14
 
14
15
  ## Installation
15
16
 
@@ -66,9 +67,16 @@ pfscan connectors list
66
67
  pfscan scan start --id time
67
68
  ```
68
69
 
69
- ### 5. View Events
70
+ ### 5. View Sessions and Events
70
71
 
71
72
  ```bash
73
+ # List all sessions
74
+ pfscan sessions list
75
+
76
+ # Show session details
77
+ pfscan sessions show --id <session_id>
78
+
79
+ # View recent events
72
80
  pfscan monitor tail --id time --last 20
73
81
  ```
74
82
 
@@ -118,6 +126,22 @@ pfscan scan start --id <id> [--timeout <sec>]
118
126
  pfscan monitor tail --id <id> [--last <N>]
119
127
  ```
120
128
 
129
+ ### Sessions (Phase 2)
130
+
131
+ ```bash
132
+ pfscan sessions list [--connector <id>] [--limit <N>] # List sessions
133
+ pfscan sessions show --id <session_id> # Show session details
134
+ pfscan sessions prune [--before <date>] [--keep-last <N>] [--yes] # Prune old sessions
135
+ ```
136
+
137
+ ### Archive (Phase 2)
138
+
139
+ ```bash
140
+ pfscan archive status # Show database status
141
+ pfscan archive plan # Show what would be archived
142
+ pfscan archive run [--yes] [--vacuum] # Execute archive based on retention
143
+ ```
144
+
121
145
  ## Config File Format
122
146
 
123
147
  Config is stored in the OS-standard location:
@@ -139,33 +163,45 @@ Config is stored in the OS-standard location:
139
163
  "args": ["mcp-server-time", "--local-timezone=America/New_York"]
140
164
  }
141
165
  }
142
- ]
166
+ ],
167
+ "retention": {
168
+ "keep_last_sessions": 50,
169
+ "raw_days": 7,
170
+ "max_db_mb": 500
171
+ }
143
172
  }
144
173
  ```
145
174
 
146
- ## Event Storage
175
+ ### Retention Settings
176
+
177
+ | Setting | Default | Description |
178
+ |---------|---------|-------------|
179
+ | `keep_last_sessions` | 50 | Keep last N sessions per connector |
180
+ | `raw_days` | 7 | Clear raw JSON after N days |
181
+ | `max_db_mb` | 500 | Target database size limit |
147
182
 
148
- Events are stored in JSONL format:
183
+ ## Data Storage (Phase 2)
184
+
185
+ proofscan uses a 2-file SQLite structure:
149
186
 
150
187
  ```
151
- ~/.config/proofscan/events/<connector_id>/<YYYYMMDD>.jsonl
188
+ ~/.config/proofscan/
189
+ ├── config.json
190
+ ├── events.db # Sessions, events, RPC calls (can be pruned)
191
+ └── proofs.db # Immutable proof records (never pruned)
152
192
  ```
153
193
 
154
- Each event contains:
194
+ ### events.db Schema
155
195
 
156
- ```json
157
- {
158
- "event_id": "uuid",
159
- "ts": "2024-01-15T10:30:00.000Z",
160
- "connector_id": "time",
161
- "direction": "client_to_server",
162
- "kind": "request",
163
- "method": "tools/list",
164
- "rpc_id": 1,
165
- "ok": true,
166
- "raw": "{...}"
167
- }
168
- ```
196
+ - **sessions**: Scan session records with connector, timestamps, exit status
197
+ - **events**: Individual JSON-RPC messages with direction, kind, timestamps
198
+ - **rpc_calls**: Request/response pairs with timing and success status
199
+
200
+ ### proofs.db Schema
201
+
202
+ - **proofs**: Immutable proof records with hashes, references, and artifact URIs
203
+
204
+ Sessions linked to proofs are automatically protected from pruning.
169
205
 
170
206
  ## Example Session
171
207
 
@@ -190,10 +226,34 @@ $ pfscan scan start --id time
190
226
  Scanning connector: time...
191
227
  ✓ Scan successful!
192
228
  Connector: time
193
- Tools found: 1
194
- Tool names: get_current_time
229
+ Session: dcaa519e-e14b-41ea-ac7c-7f2066cc8020
230
+ Tools found: 2
231
+ Tool names: get_current_time, convert_time
195
232
  Events recorded: 8
196
233
 
234
+ # List sessions
235
+ $ pfscan sessions list
236
+ Session ID Connector Started Duration Status Events Protected
237
+ --------------------------------------------------------------------------------
238
+ dcaa519e... time 2025/01/15 10:30:00 450ms normal 8 no
239
+
240
+ # Show session details
241
+ $ pfscan sessions show --id dcaa519e-e14b-41ea-ac7c-7f2066cc8020
242
+ Session: dcaa519e-e14b-41ea-ac7c-7f2066cc8020
243
+ Connector: time
244
+ Started: 2025/01/15 10:30:00
245
+ Ended: 2025/01/15 10:30:00
246
+ Duration: 450ms
247
+ Status: normal
248
+ Protected: no
249
+ Events: 8
250
+ RPC Calls: 2
251
+ Proofs: 0
252
+
253
+ RPC Calls:
254
+ ✓ initialize (id: 1)
255
+ ✓ tools/list (id: 2)
256
+
197
257
  # View events
198
258
  $ pfscan monitor tail --id time --last 5
199
259
  Recent events for 'time' (last 5):
@@ -207,6 +267,82 @@ Time Dir Status Kind Summary
207
267
  10:30:01 ← response
208
268
  ```
209
269
 
270
+ ## Archive Example (Phase 2)
271
+
272
+ ```bash
273
+ # Check current database status
274
+ $ pfscan archive status
275
+ Database Status
276
+ ===============
277
+
278
+ events.db size: 80.0 KB
279
+ proofs.db size: 24.0 KB
280
+
281
+ Total sessions: 6
282
+ Protected sessions: 0
283
+ Total proofs: 0
284
+ raw_json storage: 4.8 KB
285
+
286
+ # View archive plan (based on retention settings)
287
+ $ pfscan archive plan
288
+ Archive Plan
289
+ ============
290
+
291
+ Retention Settings:
292
+ keep_last_sessions: 3
293
+ raw_days: 7
294
+ max_db_mb: 500
295
+
296
+ Current Status:
297
+ events.db size: 80.0 KB
298
+ proofs.db size: 24.0 KB
299
+
300
+ Planned Actions:
301
+
302
+ Sessions to delete: 3
303
+ Session ID Connector Events Reason
304
+ --------------------------------------------------------------
305
+ c3f3ee9a... time 8 Exceeds keep_last_sessions (3)
306
+ 050212d2... time 8 Exceeds keep_last_sessions (3)
307
+ dcaa519e... time 8 Exceeds keep_last_sessions (3)
308
+
309
+ raw_json to clear: 0 events
310
+ Estimated savings: ~0.0 MB
311
+
312
+ Run "pfscan archive run" to execute (or "pfscan archive run --yes" to confirm).
313
+
314
+ # Dry run (shows what would happen)
315
+ $ pfscan archive run
316
+ Archive Run (DRY RUN)
317
+ =====================
318
+
319
+ Sessions to delete: 3
320
+ raw_json to clear: 0 events
321
+ Estimated savings: ~0.0 MB
322
+
323
+ Run with --yes to actually execute.
324
+
325
+ # Execute archive with vacuum
326
+ $ pfscan archive run --yes --vacuum
327
+ Archive Run Complete
328
+ ====================
329
+
330
+ Sessions deleted: 3
331
+ raw_json cleared: 0 events
332
+ Database vacuumed
333
+
334
+ Final events.db size: 72.0 KB
335
+ ✓ Archive complete
336
+
337
+ # Verify sessions after archive
338
+ $ pfscan sessions list
339
+ Session ID Connector Started Duration Status Events Protected
340
+ --------------------------------------------------------------------------------
341
+ f2442c9b... time 2025/01/15 11:01:58 454ms normal 8 no
342
+ f641b379... time 2025/01/15 11:01:58 467ms normal 8 no
343
+ 3cf5a66e... time 2025/01/15 11:01:57 449ms normal 8 no
344
+ ```
345
+
210
346
  ## JSON Output
211
347
 
212
348
  Add `--json` for machine-readable output:
@@ -226,10 +362,21 @@ $ pfscan scan start --id time --json
226
362
  {
227
363
  "success": true,
228
364
  "connector_id": "time",
229
- "tools_count": 1,
230
- "tools": ["get_current_time"],
365
+ "session_id": "dcaa519e-e14b-41ea-ac7c-7f2066cc8020",
366
+ "tools_count": 2,
367
+ "tools": ["get_current_time", "convert_time"],
231
368
  "event_count": 8
232
369
  }
370
+
371
+ $ pfscan archive status --json
372
+ {
373
+ "events_db_size": 81920,
374
+ "proofs_db_size": 24576,
375
+ "total_sessions": 6,
376
+ "protected_sessions": 0,
377
+ "total_proofs": 0,
378
+ "raw_json_size": 4896
379
+ }
233
380
  ```
234
381
 
235
382
  ## Supported mcpServers Input Formats
@@ -272,6 +419,7 @@ $ pfscan scan start --id broken-server
272
419
  Scanning connector: broken-server...
273
420
  ✗ Scan failed!
274
421
  Connector: broken-server
422
+ Session: abc123...
275
423
  Error: Initialize failed: Request timeout for method: initialize
276
424
  Events recorded: 3
277
425
 
package/dist/cli.js CHANGED
@@ -6,7 +6,7 @@
6
6
  import { Command } from 'commander';
7
7
  import { resolveConfigPath } from './utils/config-path.js';
8
8
  import { setOutputOptions } from './utils/output.js';
9
- import { createConfigCommand, createConnectorsCommand, createScanCommand, createMonitorCommand, } from './commands/index.js';
9
+ import { createConfigCommand, createConnectorsCommand, createScanCommand, createMonitorCommand, createSessionsCommand, createArchiveCommand, } from './commands/index.js';
10
10
  const program = new Command();
11
11
  // Global state for config path
12
12
  let globalConfigPath;
@@ -16,7 +16,7 @@ function getConfigPath() {
16
16
  program
17
17
  .name('pfscan')
18
18
  .description('MCP Server scanner - eliminate black boxes by capturing JSON-RPC from connection to tools/list')
19
- .version('0.1.1')
19
+ .version('0.2.0')
20
20
  .option('-c, --config <path>', 'Path to config file')
21
21
  .option('--json', 'Output in JSON format')
22
22
  .option('-v, --verbose', 'Verbose output')
@@ -33,6 +33,8 @@ program.addCommand(createConfigCommand(getConfigPath));
33
33
  program.addCommand(createConnectorsCommand(getConfigPath));
34
34
  program.addCommand(createScanCommand(getConfigPath));
35
35
  program.addCommand(createMonitorCommand(getConfigPath));
36
+ program.addCommand(createSessionsCommand(getConfigPath));
37
+ program.addCommand(createArchiveCommand(getConfigPath));
36
38
  // Parse and run
37
39
  program.parse();
38
40
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,+BAA+B;AAC/B,IAAI,gBAAoC,CAAC;AAEzC,SAAS,aAAa;IACpB,OAAO,iBAAiB,CAAC,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,gGAAgG,CAAC;KAC7G,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;KACpD,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;KACzC,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC;KACzC,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,EAAE;IACjC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IAChC,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC/B,gBAAgB,CAAC;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,kBAAkB;AAClB,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,CAAC;AACvD,OAAO,CAAC,UAAU,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC,CAAC;AAC3D,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC;AACrD,OAAO,CAAC,UAAU,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC,CAAC;AAExD,gBAAgB;AAChB,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,+BAA+B;AAC/B,IAAI,gBAAoC,CAAC;AAEzC,SAAS,aAAa;IACpB,OAAO,iBAAiB,CAAC,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,gGAAgG,CAAC;KAC7G,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;KACpD,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;KACzC,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC;KACzC,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,EAAE;IACjC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IAChC,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC/B,gBAAgB,CAAC;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,kBAAkB;AAClB,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,CAAC;AACvD,OAAO,CAAC,UAAU,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC,CAAC;AAC3D,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC;AACrD,OAAO,CAAC,UAAU,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC,CAAC;AACxD,OAAO,CAAC,UAAU,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC,CAAC;AACzD,OAAO,CAAC,UAAU,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC,CAAC;AAExD,gBAAgB;AAChB,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Archive commands - plan and run cleanup based on retention settings
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare function createArchiveCommand(getConfigPath: () => string): Command;
6
+ //# sourceMappingURL=archive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/commands/archive.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4DpC,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,MAAM,GAAG,OAAO,CAwNzE"}
@@ -0,0 +1,245 @@
1
+ /**
2
+ * Archive commands - plan and run cleanup based on retention settings
3
+ */
4
+ import { Command } from 'commander';
5
+ import { ConfigManager } from '../config/index.js';
6
+ import { EventsStore, getDbSizes } from '../db/index.js';
7
+ import { ProofsStore } from '../db/proofs-store.js';
8
+ import { output, outputSuccess, outputError, outputTable, getOutputOptions } from '../utils/output.js';
9
+ function formatBytes(bytes) {
10
+ if (bytes < 1024)
11
+ return `${bytes} B`;
12
+ if (bytes < 1024 * 1024)
13
+ return `${(bytes / 1024).toFixed(1)} KB`;
14
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
15
+ }
16
+ async function computeArchivePlan(eventsStore, proofsStore, retention, configDir) {
17
+ const protectedIds = new Set(proofsStore.getProtectedSessionIds());
18
+ const sessionsToDelete = [];
19
+ // 1. Get sessions exceeding keep_last_sessions
20
+ if (retention.keep_last_sessions !== undefined) {
21
+ const candidates = eventsStore.getPruneCandidates({
22
+ keepLast: retention.keep_last_sessions,
23
+ });
24
+ for (const c of candidates) {
25
+ if (!protectedIds.has(c.session_id)) {
26
+ sessionsToDelete.push(c);
27
+ }
28
+ }
29
+ }
30
+ // 2. Count raw_json that can be cleared based on raw_days
31
+ let rawJsonToClear = 0;
32
+ if (retention.raw_days !== undefined) {
33
+ rawJsonToClear = eventsStore.countClearableRawJson(retention.raw_days);
34
+ }
35
+ // 3. Check max_db_mb (simple heuristic)
36
+ const dbSizes = getDbSizes(configDir);
37
+ const currentSizeMb = dbSizes.events / (1024 * 1024);
38
+ const maxMb = retention.max_db_mb || 500;
39
+ // Estimate savings (rough: each event ~500 bytes raw_json)
40
+ const rawJsonSize = eventsStore.getRawJsonSize();
41
+ const estimatedSavingsMb = (sessionsToDelete.reduce((sum, s) => sum + s.event_count * 500, 0) +
42
+ (rawJsonToClear * 300)) / (1024 * 1024);
43
+ return {
44
+ sessions_to_delete: sessionsToDelete,
45
+ raw_json_to_clear: rawJsonToClear,
46
+ estimated_savings_mb: estimatedSavingsMb,
47
+ };
48
+ }
49
+ export function createArchiveCommand(getConfigPath) {
50
+ const cmd = new Command('archive')
51
+ .description('Manage data retention and cleanup');
52
+ cmd
53
+ .command('plan')
54
+ .description('Show what would be archived based on retention settings')
55
+ .action(async () => {
56
+ try {
57
+ const manager = new ConfigManager(getConfigPath());
58
+ const config = await manager.load();
59
+ const eventsStore = new EventsStore(manager.getConfigDir());
60
+ const proofsStore = new ProofsStore(manager.getConfigDir());
61
+ // Get retention settings with defaults
62
+ const retention = {
63
+ keep_last_sessions: config.retention?.keep_last_sessions ?? 50,
64
+ raw_days: config.retention?.raw_days ?? 7,
65
+ max_db_mb: config.retention?.max_db_mb ?? 500,
66
+ };
67
+ const plan = await computeArchivePlan(eventsStore, proofsStore, retention, manager.getConfigDir());
68
+ const dbSizes = getDbSizes(manager.getConfigDir());
69
+ if (getOutputOptions().json) {
70
+ output({
71
+ retention,
72
+ plan,
73
+ current_db_size_mb: dbSizes.events / (1024 * 1024),
74
+ });
75
+ }
76
+ else {
77
+ console.log('Archive Plan');
78
+ console.log('============\n');
79
+ console.log('Retention Settings:');
80
+ console.log(` keep_last_sessions: ${retention.keep_last_sessions}`);
81
+ console.log(` raw_days: ${retention.raw_days}`);
82
+ console.log(` max_db_mb: ${retention.max_db_mb}`);
83
+ console.log();
84
+ console.log('Current Status:');
85
+ console.log(` events.db size: ${formatBytes(dbSizes.events)}`);
86
+ console.log(` proofs.db size: ${formatBytes(dbSizes.proofs)}`);
87
+ console.log();
88
+ console.log('Planned Actions:');
89
+ if (plan.sessions_to_delete.length > 0) {
90
+ console.log(`\n Sessions to delete: ${plan.sessions_to_delete.length}`);
91
+ const headers = ['Session ID', 'Connector', 'Events', 'Reason'];
92
+ const rows = plan.sessions_to_delete.slice(0, 10).map(s => [
93
+ s.session_id.slice(0, 8) + '...',
94
+ s.connector_id,
95
+ String(s.event_count),
96
+ s.reason,
97
+ ]);
98
+ outputTable(headers, rows);
99
+ if (plan.sessions_to_delete.length > 10) {
100
+ console.log(` ... and ${plan.sessions_to_delete.length - 10} more`);
101
+ }
102
+ }
103
+ else {
104
+ console.log(' Sessions to delete: 0');
105
+ }
106
+ console.log(`\n raw_json to clear: ${plan.raw_json_to_clear} events`);
107
+ console.log(` Estimated savings: ~${plan.estimated_savings_mb.toFixed(1)} MB`);
108
+ console.log('\nRun "pfscan archive run" to execute (or "pfscan archive run --yes" to confirm).');
109
+ }
110
+ }
111
+ catch (error) {
112
+ outputError('Failed to compute archive plan', error instanceof Error ? error : undefined);
113
+ process.exit(1);
114
+ }
115
+ });
116
+ cmd
117
+ .command('run')
118
+ .description('Execute archive cleanup')
119
+ .option('--yes', 'Actually execute (without this, only shows what would be done)')
120
+ .option('--vacuum', 'Run VACUUM after cleanup to reclaim space')
121
+ .action(async (options) => {
122
+ try {
123
+ const manager = new ConfigManager(getConfigPath());
124
+ const config = await manager.load();
125
+ const eventsStore = new EventsStore(manager.getConfigDir());
126
+ const proofsStore = new ProofsStore(manager.getConfigDir());
127
+ // Get retention settings with defaults
128
+ const retention = {
129
+ keep_last_sessions: config.retention?.keep_last_sessions ?? 50,
130
+ raw_days: config.retention?.raw_days ?? 7,
131
+ max_db_mb: config.retention?.max_db_mb ?? 500,
132
+ };
133
+ const plan = await computeArchivePlan(eventsStore, proofsStore, retention, manager.getConfigDir());
134
+ if (!options.yes) {
135
+ // Dry run - same as plan
136
+ const dbSizes = getDbSizes(manager.getConfigDir());
137
+ if (getOutputOptions().json) {
138
+ output({
139
+ dry_run: true,
140
+ retention,
141
+ plan,
142
+ current_db_size_mb: dbSizes.events / (1024 * 1024),
143
+ });
144
+ }
145
+ else {
146
+ console.log('Archive Run (DRY RUN)');
147
+ console.log('=====================\n');
148
+ console.log(`Sessions to delete: ${plan.sessions_to_delete.length}`);
149
+ console.log(`raw_json to clear: ${plan.raw_json_to_clear} events`);
150
+ console.log(`Estimated savings: ~${plan.estimated_savings_mb.toFixed(1)} MB`);
151
+ console.log('\nRun with --yes to actually execute.');
152
+ }
153
+ return;
154
+ }
155
+ // Actually execute
156
+ const results = {
157
+ sessions_deleted: 0,
158
+ raw_json_cleared: 0,
159
+ vacuumed: false,
160
+ };
161
+ // 1. Delete sessions
162
+ if (plan.sessions_to_delete.length > 0) {
163
+ const sessionIds = plan.sessions_to_delete.map(s => s.session_id);
164
+ results.sessions_deleted = eventsStore.deleteSessions(sessionIds);
165
+ }
166
+ // 2. Clear raw_json
167
+ if (plan.raw_json_to_clear > 0 && retention.raw_days !== undefined) {
168
+ results.raw_json_cleared = eventsStore.clearRawJson({
169
+ beforeDays: retention.raw_days,
170
+ });
171
+ }
172
+ // 3. Vacuum if requested
173
+ if (options.vacuum) {
174
+ eventsStore.vacuum();
175
+ results.vacuumed = true;
176
+ }
177
+ const dbSizes = getDbSizes(manager.getConfigDir());
178
+ if (getOutputOptions().json) {
179
+ output({
180
+ success: true,
181
+ results,
182
+ final_db_size_mb: dbSizes.events / (1024 * 1024),
183
+ });
184
+ }
185
+ else {
186
+ console.log('Archive Run Complete');
187
+ console.log('====================\n');
188
+ console.log(`Sessions deleted: ${results.sessions_deleted}`);
189
+ console.log(`raw_json cleared: ${results.raw_json_cleared} events`);
190
+ if (results.vacuumed) {
191
+ console.log('Database vacuumed');
192
+ }
193
+ console.log(`\nFinal events.db size: ${formatBytes(dbSizes.events)}`);
194
+ outputSuccess('Archive complete');
195
+ }
196
+ }
197
+ catch (error) {
198
+ outputError('Failed to run archive', error instanceof Error ? error : undefined);
199
+ process.exit(1);
200
+ }
201
+ });
202
+ cmd
203
+ .command('status')
204
+ .description('Show current database status')
205
+ .action(async () => {
206
+ try {
207
+ const manager = new ConfigManager(getConfigPath());
208
+ const eventsStore = new EventsStore(manager.getConfigDir());
209
+ const proofsStore = new ProofsStore(manager.getConfigDir());
210
+ const dbSizes = getDbSizes(manager.getConfigDir());
211
+ const sessions = eventsStore.getAllSessions();
212
+ const proofCount = proofsStore.countProofs();
213
+ const protectedIds = proofsStore.getProtectedSessionIds();
214
+ const rawJsonSize = eventsStore.getRawJsonSize();
215
+ const status = {
216
+ events_db_size: dbSizes.events,
217
+ proofs_db_size: dbSizes.proofs,
218
+ total_sessions: sessions.length,
219
+ protected_sessions: protectedIds.length,
220
+ total_proofs: proofCount,
221
+ raw_json_size: rawJsonSize,
222
+ };
223
+ if (getOutputOptions().json) {
224
+ output(status);
225
+ }
226
+ else {
227
+ console.log('Database Status');
228
+ console.log('===============\n');
229
+ console.log(`events.db size: ${formatBytes(dbSizes.events)}`);
230
+ console.log(`proofs.db size: ${formatBytes(dbSizes.proofs)}`);
231
+ console.log();
232
+ console.log(`Total sessions: ${sessions.length}`);
233
+ console.log(`Protected sessions: ${protectedIds.length}`);
234
+ console.log(`Total proofs: ${proofCount}`);
235
+ console.log(`raw_json storage: ${formatBytes(rawJsonSize)}`);
236
+ }
237
+ }
238
+ catch (error) {
239
+ outputError('Failed to get status', error instanceof Error ? error : undefined);
240
+ process.exit(1);
241
+ }
242
+ });
243
+ return cmd;
244
+ }
245
+ //# sourceMappingURL=archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/commands/archive.ts"],"names":[],"mappings":"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"}
@@ -2,4 +2,6 @@ export * from './config.js';
2
2
  export * from './connectors.js';
3
3
  export * from './scan.js';
4
4
  export * from './monitor.js';
5
+ export * from './sessions.js';
6
+ export * from './archive.js';
5
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
@@ -2,4 +2,6 @@ export * from './config.js';
2
2
  export * from './connectors.js';
3
3
  export * from './scan.js';
4
4
  export * from './monitor.js';
5
+ export * from './sessions.js';
6
+ export * from './archive.js';
5
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Monitor commands
2
+ * Monitor commands - reads from SQLite
3
3
  */
4
4
  import { Command } from 'commander';
5
5
  export declare function createMonitorCommand(getConfigPath: () => string): Command;
@@ -1 +1 @@
1
- {"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../../src/commands/monitor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgCpC,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,MAAM,GAAG,OAAO,CA6CzE"}
1
+ {"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../../src/commands/monitor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0CpC,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,MAAM,GAAG,OAAO,CA6CzE"}