proofscan 0.1.1 → 0.3.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 +231 -159
- package/dist/cli.d.ts +15 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +129 -7
- 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/explore.d.ts +9 -0
- package/dist/commands/explore.d.ts.map +1 -0
- package/dist/commands/explore.js +345 -0
- package/dist/commands/explore.js.map +1 -0
- package/dist/commands/index.d.ts +6 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +8 -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/commands/status.d.ts +7 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +108 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/tree.d.ts +7 -0
- package/dist/commands/tree.d.ts.map +1 -0
- package/dist/commands/tree.js +184 -0
- package/dist/commands/tree.js.map +1 -0
- package/dist/commands/view.d.ts +9 -0
- package/dist/commands/view.d.ts.map +1 -0
- package/dist/commands/view.js +143 -0
- package/dist/commands/view.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/eventline/index.d.ts +8 -0
- package/dist/eventline/index.d.ts.map +1 -0
- package/dist/eventline/index.js +8 -0
- package/dist/eventline/index.js.map +1 -0
- package/dist/eventline/normalizer.d.ts +61 -0
- package/dist/eventline/normalizer.d.ts.map +1 -0
- package/dist/eventline/normalizer.js +298 -0
- package/dist/eventline/normalizer.js.map +1 -0
- package/dist/eventline/schema-discovery.d.ts +79 -0
- package/dist/eventline/schema-discovery.d.ts.map +1 -0
- package/dist/eventline/schema-discovery.js +154 -0
- package/dist/eventline/schema-discovery.js.map +1 -0
- package/dist/eventline/store.d.ts +88 -0
- package/dist/eventline/store.d.ts.map +1 -0
- package/dist/eventline/store.js +358 -0
- package/dist/eventline/store.js.map +1 -0
- package/dist/eventline/types.d.ts +88 -0
- package/dist/eventline/types.d.ts.map +1 -0
- package/dist/eventline/types.js +67 -0
- package/dist/eventline/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
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tree command - hierarchical view of connector → session → rpc
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { ConfigManager } from '../config/index.js';
|
|
6
|
+
import { EventLineStore } from '../eventline/store.js';
|
|
7
|
+
import { formatDuration, shortenId } from '../eventline/types.js';
|
|
8
|
+
import { output, getOutputOptions } from '../utils/output.js';
|
|
9
|
+
/**
|
|
10
|
+
* Render tree to ASCII format
|
|
11
|
+
*/
|
|
12
|
+
function renderTree(nodes, prefix = '', isLast = true) {
|
|
13
|
+
const lines = [];
|
|
14
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
15
|
+
const node = nodes[i];
|
|
16
|
+
const isLastNode = i === nodes.length - 1;
|
|
17
|
+
// Determine prefix for this node
|
|
18
|
+
const nodePrefix = prefix + (isLast ? '' : '│ ');
|
|
19
|
+
const branch = isLastNode ? '└── ' : '├── ';
|
|
20
|
+
// Add type icon
|
|
21
|
+
let icon = '';
|
|
22
|
+
switch (node.type) {
|
|
23
|
+
case 'connector':
|
|
24
|
+
icon = '📦';
|
|
25
|
+
break;
|
|
26
|
+
case 'session':
|
|
27
|
+
icon = '📋';
|
|
28
|
+
break;
|
|
29
|
+
case 'rpc':
|
|
30
|
+
icon = '↔️';
|
|
31
|
+
break;
|
|
32
|
+
case 'proof':
|
|
33
|
+
icon = '🔒';
|
|
34
|
+
break;
|
|
35
|
+
case 'event':
|
|
36
|
+
icon = '•';
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
lines.push(nodePrefix + branch + icon + ' ' + node.label);
|
|
40
|
+
// Recurse into children
|
|
41
|
+
if (node.children && node.children.length > 0) {
|
|
42
|
+
const childPrefix = nodePrefix + (isLastNode ? ' ' : '│ ');
|
|
43
|
+
const childLines = renderTreeChildren(node.children, childPrefix);
|
|
44
|
+
lines.push(...childLines);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return lines;
|
|
48
|
+
}
|
|
49
|
+
function renderTreeChildren(nodes, prefix) {
|
|
50
|
+
const lines = [];
|
|
51
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
52
|
+
const node = nodes[i];
|
|
53
|
+
const isLastNode = i === nodes.length - 1;
|
|
54
|
+
const branch = isLastNode ? '└── ' : '├── ';
|
|
55
|
+
// Add type icon
|
|
56
|
+
let icon = '';
|
|
57
|
+
switch (node.type) {
|
|
58
|
+
case 'connector':
|
|
59
|
+
icon = '📦';
|
|
60
|
+
break;
|
|
61
|
+
case 'session':
|
|
62
|
+
icon = '📋';
|
|
63
|
+
break;
|
|
64
|
+
case 'rpc':
|
|
65
|
+
icon = '↔️';
|
|
66
|
+
break;
|
|
67
|
+
case 'proof':
|
|
68
|
+
icon = '🔒';
|
|
69
|
+
break;
|
|
70
|
+
case 'event':
|
|
71
|
+
icon = '•';
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
lines.push(prefix + branch + icon + ' ' + node.label);
|
|
75
|
+
// Recurse into children
|
|
76
|
+
if (node.children && node.children.length > 0) {
|
|
77
|
+
const childPrefix = prefix + (isLastNode ? ' ' : '│ ');
|
|
78
|
+
const childLines = renderTreeChildren(node.children, childPrefix);
|
|
79
|
+
lines.push(...childLines);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return lines;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Compact tree rendering (no icons, minimal spacing)
|
|
86
|
+
*/
|
|
87
|
+
function renderTreeCompact(nodes, prefix = '') {
|
|
88
|
+
const lines = [];
|
|
89
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
90
|
+
const node = nodes[i];
|
|
91
|
+
const isLastNode = i === nodes.length - 1;
|
|
92
|
+
const branch = isLastNode ? '`-- ' : '|-- ';
|
|
93
|
+
// Compact label based on type
|
|
94
|
+
let label = node.label;
|
|
95
|
+
if (node.type === 'session' && node.meta) {
|
|
96
|
+
const sid = shortenId(node.id, 8);
|
|
97
|
+
const rpcs = node.meta.rpc_count || 0;
|
|
98
|
+
const dur = node.meta.duration_ms ? formatDuration(node.meta.duration_ms) : 'running';
|
|
99
|
+
label = `${sid} (${rpcs} rpcs, ${dur})`;
|
|
100
|
+
}
|
|
101
|
+
else if (node.type === 'rpc' && node.meta) {
|
|
102
|
+
const status = node.meta.success === 1 ? '+' : node.meta.success === 0 ? 'x' : '?';
|
|
103
|
+
label = `[${status}] ${node.meta.method} (${node.id})`;
|
|
104
|
+
}
|
|
105
|
+
lines.push(prefix + branch + label);
|
|
106
|
+
// Recurse into children
|
|
107
|
+
if (node.children && node.children.length > 0) {
|
|
108
|
+
const childPrefix = prefix + (isLastNode ? ' ' : '| ');
|
|
109
|
+
const childLines = renderTreeCompact(node.children, childPrefix);
|
|
110
|
+
lines.push(...childLines);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return lines;
|
|
114
|
+
}
|
|
115
|
+
export function createTreeCommand(getConfigPath) {
|
|
116
|
+
const cmd = new Command('tree')
|
|
117
|
+
.description('Show hierarchical view of connector → session → rpc')
|
|
118
|
+
.argument('[connector]', 'Filter by connector ID')
|
|
119
|
+
.option('--sessions <n>', 'Number of sessions per connector', '5')
|
|
120
|
+
.option('--rpc <n>', 'Number of RPC calls per session', '10')
|
|
121
|
+
.option('--session <id>', 'Show specific session (partial match)')
|
|
122
|
+
.option('--rpc-all', 'Show all RPC calls')
|
|
123
|
+
.option('--method <pattern>', 'Filter by method name')
|
|
124
|
+
.option('--status <status>', 'Filter by status (ok, err, all)', 'all')
|
|
125
|
+
.option('--compact', 'Compact output')
|
|
126
|
+
.option('--ids-only', 'Show only IDs without details')
|
|
127
|
+
.option('--since <time>', 'Show sessions since (24h, 7d, YYYY-MM-DD)')
|
|
128
|
+
.action(async (connector, options) => {
|
|
129
|
+
try {
|
|
130
|
+
const manager = new ConfigManager(getConfigPath());
|
|
131
|
+
const store = new EventLineStore(manager.getConfigDir());
|
|
132
|
+
let tree = store.buildTree({
|
|
133
|
+
sessions: parseInt(options.sessions, 10),
|
|
134
|
+
rpc: parseInt(options.rpc, 10),
|
|
135
|
+
session: options.session,
|
|
136
|
+
rpcAll: options.rpcAll,
|
|
137
|
+
method: options.method,
|
|
138
|
+
status: options.status,
|
|
139
|
+
compact: options.compact,
|
|
140
|
+
idsOnly: options.idsOnly,
|
|
141
|
+
since: options.since,
|
|
142
|
+
});
|
|
143
|
+
// Filter by connector if specified
|
|
144
|
+
if (connector) {
|
|
145
|
+
tree = tree.filter(n => n.id === connector || n.id.includes(connector));
|
|
146
|
+
}
|
|
147
|
+
if (tree.length === 0) {
|
|
148
|
+
console.log('No data found.');
|
|
149
|
+
console.log();
|
|
150
|
+
console.log('hint: Run a scan first: pfscan scan start --id <connector>');
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
if (getOutputOptions().json) {
|
|
154
|
+
output(tree);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
// Render tree
|
|
158
|
+
const lines = options.compact
|
|
159
|
+
? renderTreeCompact(tree)
|
|
160
|
+
: renderTree(tree);
|
|
161
|
+
for (const line of lines) {
|
|
162
|
+
console.log(line);
|
|
163
|
+
}
|
|
164
|
+
// Summary
|
|
165
|
+
console.log();
|
|
166
|
+
const totalConnectors = tree.length;
|
|
167
|
+
const totalSessions = tree.reduce((sum, c) => sum + (c.children?.length || 0), 0);
|
|
168
|
+
const totalRpcs = tree.reduce((sum, c) => sum + (c.children?.reduce((s, sess) => s + (sess.children?.filter(r => r.type === 'rpc').length || 0), 0) || 0), 0);
|
|
169
|
+
console.log(`${totalConnectors} connector(s), ${totalSessions} session(s), ${totalRpcs} rpc(s)`);
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
if (error instanceof Error && error.message.includes('no such table')) {
|
|
173
|
+
console.log('No data yet. Run a scan first:');
|
|
174
|
+
console.log(' pfscan scan start --id <connector>');
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
throw error;
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
return cmd;
|
|
181
|
+
}
|
|
182
|
+
// Aliases
|
|
183
|
+
export { createTreeCommand as createTCommand };
|
|
184
|
+
//# sourceMappingURL=tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree.js","sourceRoot":"","sources":["../../src/commands/tree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* View command - the main entry point for viewing events
|
|
3
|
+
*
|
|
4
|
+
* pfscan view (or just pfscan) shows a timeline of recent events
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
export declare function createViewCommand(getConfigPath: () => string): Command;
|
|
8
|
+
export { createViewCommand as createVCommand };
|
|
9
|
+
//# sourceMappingURL=view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/commands/view.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiGpC,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,MAAM,GAAG,OAAO,CAgEtE;AAGD,OAAO,EAAE,iBAAiB,IAAI,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* View command - the main entry point for viewing events
|
|
3
|
+
*
|
|
4
|
+
* pfscan view (or just pfscan) shows a timeline of recent events
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
import { ConfigManager } from '../config/index.js';
|
|
8
|
+
import { EventLineStore } from '../eventline/store.js';
|
|
9
|
+
import { formatTimestamp, formatDuration, formatBytes, shortenId, getKindSymbol, } from '../eventline/types.js';
|
|
10
|
+
import { output, getOutputOptions } from '../utils/output.js';
|
|
11
|
+
/**
|
|
12
|
+
* Render a single EventLine to terminal string
|
|
13
|
+
*/
|
|
14
|
+
function renderEventLine(event, options) {
|
|
15
|
+
const ts = formatTimestamp(event.ts_ms, options.fulltime);
|
|
16
|
+
const symbol = getKindSymbol(event.kind);
|
|
17
|
+
const status = event.status === 'OK' ? '✓' : event.status === 'ERR' ? '✗' : ' ';
|
|
18
|
+
// Build the line
|
|
19
|
+
const parts = [ts, symbol];
|
|
20
|
+
// Direction indicator
|
|
21
|
+
if (event.direction) {
|
|
22
|
+
parts.push(event.direction);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
parts.push(' ');
|
|
26
|
+
}
|
|
27
|
+
parts.push(status);
|
|
28
|
+
parts.push(event.label.slice(0, 30).padEnd(30));
|
|
29
|
+
// Session ID (shortened)
|
|
30
|
+
if (event.session_id) {
|
|
31
|
+
parts.push(`ses=${shortenId(event.session_id, 6)}`);
|
|
32
|
+
}
|
|
33
|
+
// For responses, show latency and size
|
|
34
|
+
if (event.kind === 'res' || event.kind === 'error') {
|
|
35
|
+
if (event.latency_ms !== undefined) {
|
|
36
|
+
parts.push(`lat=${event.latency_ms}ms`);
|
|
37
|
+
}
|
|
38
|
+
if (event.size_bytes !== undefined) {
|
|
39
|
+
parts.push(`size=${formatBytes(event.size_bytes)}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// For session end, show duration and counts
|
|
43
|
+
if (event.kind === 'session_end' && event.meta) {
|
|
44
|
+
if (event.meta.duration_ms) {
|
|
45
|
+
parts.push(`dur=${formatDuration(event.meta.duration_ms)}`);
|
|
46
|
+
}
|
|
47
|
+
if (event.meta.rpc_count !== undefined) {
|
|
48
|
+
parts.push(`rpcs=${event.meta.rpc_count}`);
|
|
49
|
+
}
|
|
50
|
+
if (event.meta.error_count) {
|
|
51
|
+
parts.push(`err=${event.meta.error_count}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// For session start, show connector
|
|
55
|
+
if (event.kind === 'session_start' && event.connector_id) {
|
|
56
|
+
parts.push(`[${event.connector_id}]`);
|
|
57
|
+
}
|
|
58
|
+
// Error code
|
|
59
|
+
if (event.error_code !== undefined) {
|
|
60
|
+
parts.push(`err=${event.error_code}`);
|
|
61
|
+
}
|
|
62
|
+
return parts.join(' ');
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Print hint line
|
|
66
|
+
*/
|
|
67
|
+
function printHint(events) {
|
|
68
|
+
// Find a connector and session to suggest
|
|
69
|
+
const connector = events.find(e => e.connector_id)?.connector_id;
|
|
70
|
+
const session = events.find(e => e.session_id)?.session_id;
|
|
71
|
+
const hints = [];
|
|
72
|
+
if (connector) {
|
|
73
|
+
hints.push(`pfscan tree ${connector}`);
|
|
74
|
+
}
|
|
75
|
+
if (session) {
|
|
76
|
+
hints.push(`pfscan explore --session ${shortenId(session, 8)}`);
|
|
77
|
+
}
|
|
78
|
+
if (hints.length > 0) {
|
|
79
|
+
console.log();
|
|
80
|
+
console.log(`hint: ${hints.join(' | ')}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export function createViewCommand(getConfigPath) {
|
|
84
|
+
const cmd = new Command('view')
|
|
85
|
+
.description('View recent events timeline (default command)')
|
|
86
|
+
.option('--limit <n>', 'Number of events to show', '20')
|
|
87
|
+
.option('--since <time>', 'Show events since (24h, 7d, YYYY-MM-DD)')
|
|
88
|
+
.option('--errors', 'Show only errors')
|
|
89
|
+
.option('--method <pattern>', 'Filter by method name (partial match)')
|
|
90
|
+
.option('--connector <id>', 'Filter by connector ID')
|
|
91
|
+
.option('--session <id>', 'Filter by session ID (partial match)')
|
|
92
|
+
.option('--fulltime', 'Show full timestamp (YYYY-MM-DD HH:MM:SS.mmm)')
|
|
93
|
+
.option('--with-sessions', 'Include session start/end events')
|
|
94
|
+
.action(async (options) => {
|
|
95
|
+
try {
|
|
96
|
+
const manager = new ConfigManager(getConfigPath());
|
|
97
|
+
const store = new EventLineStore(manager.getConfigDir());
|
|
98
|
+
const events = store.getRecentEvents({
|
|
99
|
+
limit: parseInt(options.limit, 10),
|
|
100
|
+
since: options.since,
|
|
101
|
+
errors: options.errors,
|
|
102
|
+
method: options.method,
|
|
103
|
+
connector: options.connector,
|
|
104
|
+
session: options.session,
|
|
105
|
+
includeSessionEvents: options.withSessions,
|
|
106
|
+
});
|
|
107
|
+
if (events.length === 0) {
|
|
108
|
+
console.log('No events found.');
|
|
109
|
+
console.log();
|
|
110
|
+
console.log('hint: Run a scan first: pfscan scan start --id <connector>');
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (getOutputOptions().json) {
|
|
114
|
+
output(events);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
// Print header
|
|
118
|
+
const header = options.fulltime
|
|
119
|
+
? 'Time Sym Dir St Method Session Extra'
|
|
120
|
+
: 'Time Sym Dir St Method Session Extra';
|
|
121
|
+
console.log(header);
|
|
122
|
+
console.log('-'.repeat(header.length));
|
|
123
|
+
// Print events
|
|
124
|
+
for (const event of events) {
|
|
125
|
+
console.log(renderEventLine(event, { fulltime: options.fulltime }));
|
|
126
|
+
}
|
|
127
|
+
// Print hint
|
|
128
|
+
printHint(events);
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
if (error instanceof Error && error.message.includes('no such table')) {
|
|
132
|
+
console.log('No data yet. Run a scan first:');
|
|
133
|
+
console.log(' pfscan scan start --id <connector>');
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
return cmd;
|
|
140
|
+
}
|
|
141
|
+
// Aliases
|
|
142
|
+
export { createViewCommand as createVCommand };
|
|
143
|
+
//# sourceMappingURL=view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/commands/view.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database connection management
|
|
3
|
+
*/
|
|
4
|
+
import Database from 'better-sqlite3';
|
|
5
|
+
/**
|
|
6
|
+
* Get the database directory
|
|
7
|
+
*/
|
|
8
|
+
export declare function getDbDir(configDir?: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Get or create events database connection
|
|
11
|
+
*/
|
|
12
|
+
export declare function getEventsDb(configDir?: string): Database.Database;
|
|
13
|
+
/**
|
|
14
|
+
* Get or create proofs database connection
|
|
15
|
+
*/
|
|
16
|
+
export declare function getProofsDb(configDir?: string): Database.Database;
|
|
17
|
+
/**
|
|
18
|
+
* Close all database connections
|
|
19
|
+
*/
|
|
20
|
+
export declare function closeAllDbs(): void;
|
|
21
|
+
/**
|
|
22
|
+
* Get database file sizes in bytes
|
|
23
|
+
*/
|
|
24
|
+
export declare function getDbSizes(configDir?: string): {
|
|
25
|
+
events: number;
|
|
26
|
+
proofs: number;
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/db/connection.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAUtC;;GAEG;AACH,wBAAgB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnD;AA2CD;;GAEG;AACH,wBAAgB,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAkBjE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAkBjE;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAUlC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAqBjF"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database connection management
|
|
3
|
+
*/
|
|
4
|
+
import Database from 'better-sqlite3';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
import { mkdirSync, statSync } from 'fs';
|
|
7
|
+
import { EVENTS_DB_SCHEMA, PROOFS_DB_SCHEMA, EVENTS_DB_VERSION, PROOFS_DB_VERSION } from './schema.js';
|
|
8
|
+
import { getDefaultConfigDir } from '../utils/config-path.js';
|
|
9
|
+
let eventsDb = null;
|
|
10
|
+
let proofsDb = null;
|
|
11
|
+
let dbDir = null;
|
|
12
|
+
/**
|
|
13
|
+
* Get the database directory
|
|
14
|
+
*/
|
|
15
|
+
export function getDbDir(configDir) {
|
|
16
|
+
return configDir || getDefaultConfigDir();
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Initialize events.db
|
|
20
|
+
*/
|
|
21
|
+
function initEventsDb(dir) {
|
|
22
|
+
const dbPath = join(dir, 'events.db');
|
|
23
|
+
const db = new Database(dbPath);
|
|
24
|
+
// Enable foreign keys
|
|
25
|
+
db.pragma('foreign_keys = ON');
|
|
26
|
+
// Check version
|
|
27
|
+
const currentVersion = db.pragma('user_version', { simple: true });
|
|
28
|
+
if (currentVersion < EVENTS_DB_VERSION) {
|
|
29
|
+
// Run migrations
|
|
30
|
+
db.exec(EVENTS_DB_SCHEMA);
|
|
31
|
+
db.pragma(`user_version = ${EVENTS_DB_VERSION}`);
|
|
32
|
+
}
|
|
33
|
+
return db;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Initialize proofs.db
|
|
37
|
+
*/
|
|
38
|
+
function initProofsDb(dir) {
|
|
39
|
+
const dbPath = join(dir, 'proofs.db');
|
|
40
|
+
const db = new Database(dbPath);
|
|
41
|
+
// Check version
|
|
42
|
+
const currentVersion = db.pragma('user_version', { simple: true });
|
|
43
|
+
if (currentVersion < PROOFS_DB_VERSION) {
|
|
44
|
+
// Run migrations
|
|
45
|
+
db.exec(PROOFS_DB_SCHEMA);
|
|
46
|
+
db.pragma(`user_version = ${PROOFS_DB_VERSION}`);
|
|
47
|
+
}
|
|
48
|
+
return db;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get or create events database connection
|
|
52
|
+
*/
|
|
53
|
+
export function getEventsDb(configDir) {
|
|
54
|
+
const dir = getDbDir(configDir);
|
|
55
|
+
if (eventsDb && dbDir === dir) {
|
|
56
|
+
return eventsDb;
|
|
57
|
+
}
|
|
58
|
+
// Ensure directory exists
|
|
59
|
+
mkdirSync(dir, { recursive: true });
|
|
60
|
+
// Close existing connection if different dir
|
|
61
|
+
if (eventsDb) {
|
|
62
|
+
eventsDb.close();
|
|
63
|
+
}
|
|
64
|
+
dbDir = dir;
|
|
65
|
+
eventsDb = initEventsDb(dir);
|
|
66
|
+
return eventsDb;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get or create proofs database connection
|
|
70
|
+
*/
|
|
71
|
+
export function getProofsDb(configDir) {
|
|
72
|
+
const dir = getDbDir(configDir);
|
|
73
|
+
if (proofsDb && dbDir === dir) {
|
|
74
|
+
return proofsDb;
|
|
75
|
+
}
|
|
76
|
+
// Ensure directory exists
|
|
77
|
+
mkdirSync(dir, { recursive: true });
|
|
78
|
+
// Close existing connection if different dir
|
|
79
|
+
if (proofsDb) {
|
|
80
|
+
proofsDb.close();
|
|
81
|
+
}
|
|
82
|
+
dbDir = dir;
|
|
83
|
+
proofsDb = initProofsDb(dir);
|
|
84
|
+
return proofsDb;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Close all database connections
|
|
88
|
+
*/
|
|
89
|
+
export function closeAllDbs() {
|
|
90
|
+
if (eventsDb) {
|
|
91
|
+
eventsDb.close();
|
|
92
|
+
eventsDb = null;
|
|
93
|
+
}
|
|
94
|
+
if (proofsDb) {
|
|
95
|
+
proofsDb.close();
|
|
96
|
+
proofsDb = null;
|
|
97
|
+
}
|
|
98
|
+
dbDir = null;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Get database file sizes in bytes
|
|
102
|
+
*/
|
|
103
|
+
export function getDbSizes(configDir) {
|
|
104
|
+
const dir = getDbDir(configDir);
|
|
105
|
+
let eventsSize = 0;
|
|
106
|
+
let proofsSize = 0;
|
|
107
|
+
try {
|
|
108
|
+
const eventsPath = join(dir, 'events.db');
|
|
109
|
+
eventsSize = statSync(eventsPath).size;
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// File doesn't exist yet
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
const proofsPath = join(dir, 'proofs.db');
|
|
116
|
+
proofsSize = statSync(proofsPath).size;
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// File doesn't exist yet
|
|
120
|
+
}
|
|
121
|
+
return { events: eventsSize, proofs: proofsSize };
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/db/connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Events database store - manages sessions, events, and rpc_calls
|
|
3
|
+
*/
|
|
4
|
+
import type { Session, Event, RpcCall, ExitReason, EventDirection, EventKind, SessionWithStats, PruneCandidate } from './types.js';
|
|
5
|
+
export declare class EventsStore {
|
|
6
|
+
private configDir?;
|
|
7
|
+
constructor(configDir?: string);
|
|
8
|
+
private get db();
|
|
9
|
+
createSession(connectorId: string): Session;
|
|
10
|
+
endSession(sessionId: string, exitReason: ExitReason): void;
|
|
11
|
+
getSession(sessionId: string): Session | null;
|
|
12
|
+
getSessionsByConnector(connectorId: string, limit?: number): SessionWithStats[];
|
|
13
|
+
getAllSessions(limit?: number): SessionWithStats[];
|
|
14
|
+
protectSession(sessionId: string): void;
|
|
15
|
+
saveEvent(sessionId: string, direction: EventDirection, kind: EventKind, options?: {
|
|
16
|
+
rpcId?: string;
|
|
17
|
+
rawJson?: string;
|
|
18
|
+
}): Event;
|
|
19
|
+
getEventsBySession(sessionId: string, limit?: number): Event[];
|
|
20
|
+
getRecentEventsByConnector(connectorId: string, limit?: number): Event[];
|
|
21
|
+
saveRpcCall(sessionId: string, rpcId: string, method: string): RpcCall;
|
|
22
|
+
completeRpcCall(sessionId: string, rpcId: string, success: boolean, errorCode?: number): void;
|
|
23
|
+
getRpcCallsBySession(sessionId: string): RpcCall[];
|
|
24
|
+
/**
|
|
25
|
+
* Get sessions that can be pruned (not protected)
|
|
26
|
+
*/
|
|
27
|
+
getPruneCandidates(options?: {
|
|
28
|
+
keepLast?: number;
|
|
29
|
+
before?: string;
|
|
30
|
+
connectorId?: string;
|
|
31
|
+
}): PruneCandidate[];
|
|
32
|
+
/**
|
|
33
|
+
* Delete sessions and all related data
|
|
34
|
+
*/
|
|
35
|
+
deleteSessions(sessionIds: string[]): number;
|
|
36
|
+
/**
|
|
37
|
+
* Clear raw_json from old events (keep metadata)
|
|
38
|
+
*/
|
|
39
|
+
clearRawJson(options: {
|
|
40
|
+
beforeDays?: number;
|
|
41
|
+
sessionIds?: string[];
|
|
42
|
+
}): number;
|
|
43
|
+
/**
|
|
44
|
+
* Get count of events with raw_json that can be cleared
|
|
45
|
+
*/
|
|
46
|
+
countClearableRawJson(beforeDays: number): number;
|
|
47
|
+
/**
|
|
48
|
+
* Get total size of raw_json data
|
|
49
|
+
*/
|
|
50
|
+
getRawJsonSize(): number;
|
|
51
|
+
/**
|
|
52
|
+
* Vacuum database to reclaim space
|
|
53
|
+
*/
|
|
54
|
+
vacuum(): void;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=events-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events-store.d.ts","sourceRoot":"","sources":["../../src/db/events-store.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EACV,OAAO,EACP,KAAK,EACL,OAAO,EACP,UAAU,EACV,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAAC,CAAS;gBAEf,SAAS,CAAC,EAAE,MAAM;IAI9B,OAAO,KAAK,EAAE,GAEb;IAID,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IA6B3C,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI;IAO3D,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAK7C,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAgB/E,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAelD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAOvC,SAAS,CACP,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,cAAc,EACzB,IAAI,EAAE,SAAS,EACf,OAAO,GAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KACb,GACL,KAAK;IA6BR,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE;IAS9D,0BAA0B,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,KAAK,EAAE;IAc5E,WAAW,CACT,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO;IA6BV,eAAe,CACb,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI;IAeP,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE;IASlD;;OAEG;IACH,kBAAkB,CAAC,OAAO,GAAE;QAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,cAAc,EAAE;IAmEzB;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM;IAc5C;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB,GAAG,MAAM;IAyBV;;OAEG;IACH,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAcjD;;OAEG;IACH,cAAc,IAAI,MAAM;IAMxB;;OAEG;IACH,MAAM,IAAI,IAAI;CAGf"}
|