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.
- package/README.md +172 -24
- package/dist/cli.js +4 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/archive.d.ts +6 -0
- package/dist/commands/archive.d.ts.map +1 -0
- package/dist/commands/archive.js +245 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/index.d.ts +2 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +2 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/monitor.d.ts +1 -1
- package/dist/commands/monitor.d.ts.map +1 -1
- package/dist/commands/monitor.js +33 -21
- package/dist/commands/monitor.js.map +1 -1
- package/dist/commands/scan.d.ts.map +1 -1
- package/dist/commands/scan.js +4 -0
- package/dist/commands/scan.js.map +1 -1
- package/dist/commands/sessions.d.ts +6 -0
- package/dist/commands/sessions.d.ts.map +1 -0
- package/dist/commands/sessions.js +203 -0
- package/dist/commands/sessions.js.map +1 -0
- package/dist/db/connection.d.ts +28 -0
- package/dist/db/connection.d.ts.map +1 -0
- package/dist/db/connection.js +123 -0
- package/dist/db/connection.js.map +1 -0
- package/dist/db/events-store.d.ts +56 -0
- package/dist/db/events-store.d.ts.map +1 -0
- package/dist/db/events-store.js +269 -0
- package/dist/db/events-store.js.map +1 -0
- package/dist/db/index.d.ts +6 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +6 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/proofs-store.d.ts +56 -0
- package/dist/db/proofs-store.d.ts.map +1 -0
- package/dist/db/proofs-store.js +116 -0
- package/dist/db/proofs-store.js.map +1 -0
- package/dist/db/schema.d.ts +8 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +76 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/types.d.ts +64 -0
- package/dist/db/types.d.ts.map +1 -0
- package/dist/db/types.js +5 -0
- package/dist/db/types.js.map +1 -0
- package/dist/index.d.ts +14 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -6
- package/dist/index.js.map +1 -1
- package/dist/scanner/index.d.ts +3 -2
- package/dist/scanner/index.d.ts.map +1 -1
- package/dist/scanner/index.js +66 -51
- package/dist/scanner/index.js.map +1 -1
- package/dist/types/config.d.ts +7 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +5 -0
- package/dist/types/config.js.map +1 -1
- package/dist/types/events.d.ts +1 -17
- package/dist/types/events.d.ts.map +1 -1
- package/dist/types/events.js +1 -0
- package/dist/types/events.js.map +1 -1
- package/package.json +3 -1
- package/dist/events/index.d.ts +0 -2
- package/dist/events/index.d.ts.map +0 -1
- package/dist/events/index.js +0 -2
- package/dist/events/index.js.map +0 -1
- package/dist/events/store.d.ts +0 -25
- package/dist/events/store.d.ts.map +0 -1
- package/dist/events/store.js +0 -91
- 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
|
|
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
|
-
|
|
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
|
-
|
|
183
|
+
## Data Storage (Phase 2)
|
|
184
|
+
|
|
185
|
+
proofscan uses a 2-file SQLite structure:
|
|
149
186
|
|
|
150
187
|
```
|
|
151
|
-
~/.config/proofscan/
|
|
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
|
-
|
|
194
|
+
### events.db Schema
|
|
155
195
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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
|
-
|
|
194
|
-
|
|
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
|
-
"
|
|
230
|
-
"
|
|
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.
|
|
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 @@
|
|
|
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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"}
|
package/dist/commands/index.d.ts
CHANGED
|
@@ -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"}
|
package/dist/commands/index.js
CHANGED
|
@@ -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 +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;
|
|
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"}
|