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.
Files changed (109) hide show
  1. package/README.md +231 -159
  2. package/dist/cli.d.ts +15 -1
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +129 -7
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/archive.d.ts +6 -0
  7. package/dist/commands/archive.d.ts.map +1 -0
  8. package/dist/commands/archive.js +245 -0
  9. package/dist/commands/archive.js.map +1 -0
  10. package/dist/commands/explore.d.ts +9 -0
  11. package/dist/commands/explore.d.ts.map +1 -0
  12. package/dist/commands/explore.js +345 -0
  13. package/dist/commands/explore.js.map +1 -0
  14. package/dist/commands/index.d.ts +6 -0
  15. package/dist/commands/index.d.ts.map +1 -1
  16. package/dist/commands/index.js +8 -0
  17. package/dist/commands/index.js.map +1 -1
  18. package/dist/commands/monitor.d.ts +1 -1
  19. package/dist/commands/monitor.d.ts.map +1 -1
  20. package/dist/commands/monitor.js +33 -21
  21. package/dist/commands/monitor.js.map +1 -1
  22. package/dist/commands/scan.d.ts.map +1 -1
  23. package/dist/commands/scan.js +4 -0
  24. package/dist/commands/scan.js.map +1 -1
  25. package/dist/commands/sessions.d.ts +6 -0
  26. package/dist/commands/sessions.d.ts.map +1 -0
  27. package/dist/commands/sessions.js +203 -0
  28. package/dist/commands/sessions.js.map +1 -0
  29. package/dist/commands/status.d.ts +7 -0
  30. package/dist/commands/status.d.ts.map +1 -0
  31. package/dist/commands/status.js +108 -0
  32. package/dist/commands/status.js.map +1 -0
  33. package/dist/commands/tree.d.ts +7 -0
  34. package/dist/commands/tree.d.ts.map +1 -0
  35. package/dist/commands/tree.js +184 -0
  36. package/dist/commands/tree.js.map +1 -0
  37. package/dist/commands/view.d.ts +9 -0
  38. package/dist/commands/view.d.ts.map +1 -0
  39. package/dist/commands/view.js +143 -0
  40. package/dist/commands/view.js.map +1 -0
  41. package/dist/db/connection.d.ts +28 -0
  42. package/dist/db/connection.d.ts.map +1 -0
  43. package/dist/db/connection.js +123 -0
  44. package/dist/db/connection.js.map +1 -0
  45. package/dist/db/events-store.d.ts +56 -0
  46. package/dist/db/events-store.d.ts.map +1 -0
  47. package/dist/db/events-store.js +269 -0
  48. package/dist/db/events-store.js.map +1 -0
  49. package/dist/db/index.d.ts +6 -0
  50. package/dist/db/index.d.ts.map +1 -0
  51. package/dist/db/index.js +6 -0
  52. package/dist/db/index.js.map +1 -0
  53. package/dist/db/proofs-store.d.ts +56 -0
  54. package/dist/db/proofs-store.d.ts.map +1 -0
  55. package/dist/db/proofs-store.js +116 -0
  56. package/dist/db/proofs-store.js.map +1 -0
  57. package/dist/db/schema.d.ts +8 -0
  58. package/dist/db/schema.d.ts.map +1 -0
  59. package/dist/db/schema.js +76 -0
  60. package/dist/db/schema.js.map +1 -0
  61. package/dist/db/types.d.ts +64 -0
  62. package/dist/db/types.d.ts.map +1 -0
  63. package/dist/db/types.js +5 -0
  64. package/dist/db/types.js.map +1 -0
  65. package/dist/eventline/index.d.ts +8 -0
  66. package/dist/eventline/index.d.ts.map +1 -0
  67. package/dist/eventline/index.js +8 -0
  68. package/dist/eventline/index.js.map +1 -0
  69. package/dist/eventline/normalizer.d.ts +61 -0
  70. package/dist/eventline/normalizer.d.ts.map +1 -0
  71. package/dist/eventline/normalizer.js +298 -0
  72. package/dist/eventline/normalizer.js.map +1 -0
  73. package/dist/eventline/schema-discovery.d.ts +79 -0
  74. package/dist/eventline/schema-discovery.d.ts.map +1 -0
  75. package/dist/eventline/schema-discovery.js +154 -0
  76. package/dist/eventline/schema-discovery.js.map +1 -0
  77. package/dist/eventline/store.d.ts +88 -0
  78. package/dist/eventline/store.d.ts.map +1 -0
  79. package/dist/eventline/store.js +358 -0
  80. package/dist/eventline/store.js.map +1 -0
  81. package/dist/eventline/types.d.ts +88 -0
  82. package/dist/eventline/types.d.ts.map +1 -0
  83. package/dist/eventline/types.js +67 -0
  84. package/dist/eventline/types.js.map +1 -0
  85. package/dist/index.d.ts +14 -6
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +15 -6
  88. package/dist/index.js.map +1 -1
  89. package/dist/scanner/index.d.ts +3 -2
  90. package/dist/scanner/index.d.ts.map +1 -1
  91. package/dist/scanner/index.js +66 -51
  92. package/dist/scanner/index.js.map +1 -1
  93. package/dist/types/config.d.ts +7 -0
  94. package/dist/types/config.d.ts.map +1 -1
  95. package/dist/types/config.js +5 -0
  96. package/dist/types/config.js.map +1 -1
  97. package/dist/types/events.d.ts +1 -17
  98. package/dist/types/events.d.ts.map +1 -1
  99. package/dist/types/events.js +1 -0
  100. package/dist/types/events.js.map +1 -1
  101. package/package.json +3 -1
  102. package/dist/events/index.d.ts +0 -2
  103. package/dist/events/index.d.ts.map +0 -1
  104. package/dist/events/index.js +0 -2
  105. package/dist/events/index.js.map +0 -1
  106. package/dist/events/store.d.ts +0 -25
  107. package/dist/events/store.d.ts.map +0 -1
  108. package/dist/events/store.js +0 -91
  109. 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":"AAAA;;GAEG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACvG,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,IAAI,QAAQ,GAA6B,IAAI,CAAC;AAC9C,IAAI,QAAQ,GAA6B,IAAI,CAAC;AAC9C,IAAI,KAAK,GAAkB,IAAI,CAAC;AAEhC;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,SAAkB;IACzC,OAAO,SAAS,IAAI,mBAAmB,EAAE,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,GAAW;IAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEhC,sBAAsB;IACtB,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAE/B,gBAAgB;IAChB,MAAM,cAAc,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAW,CAAC;IAE7E,IAAI,cAAc,GAAG,iBAAiB,EAAE,CAAC;QACvC,iBAAiB;QACjB,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC1B,EAAE,CAAC,MAAM,CAAC,kBAAkB,iBAAiB,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,GAAW;IAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEhC,gBAAgB;IAChB,MAAM,cAAc,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAW,CAAC;IAE7E,IAAI,cAAc,GAAG,iBAAiB,EAAE,CAAC;QACvC,iBAAiB;QACjB,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC1B,EAAE,CAAC,MAAM,CAAC,kBAAkB,iBAAiB,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,SAAkB;IAC5C,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAEhC,IAAI,QAAQ,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;QAC9B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,0BAA0B;IAC1B,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpC,6CAA6C;IAC7C,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;IAED,KAAK,GAAG,GAAG,CAAC;IACZ,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC7B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,SAAkB;IAC5C,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAEhC,IAAI,QAAQ,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;QAC9B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,0BAA0B;IAC1B,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpC,6CAA6C;IAC7C,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;IAED,KAAK,GAAG,GAAG,CAAC;IACZ,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC7B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;IACD,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;IACD,KAAK,GAAG,IAAI,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,SAAkB;IAC3C,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAEhC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAC1C,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAC1C,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AACpD,CAAC"}
@@ -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"}