proofscan 0.2.0 → 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 (46) hide show
  1. package/README.md +205 -281
  2. package/dist/cli.d.ts +15 -1
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +129 -9
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/explore.d.ts +9 -0
  7. package/dist/commands/explore.d.ts.map +1 -0
  8. package/dist/commands/explore.js +345 -0
  9. package/dist/commands/explore.js.map +1 -0
  10. package/dist/commands/index.d.ts +4 -0
  11. package/dist/commands/index.d.ts.map +1 -1
  12. package/dist/commands/index.js +6 -0
  13. package/dist/commands/index.js.map +1 -1
  14. package/dist/commands/status.d.ts +7 -0
  15. package/dist/commands/status.d.ts.map +1 -0
  16. package/dist/commands/status.js +108 -0
  17. package/dist/commands/status.js.map +1 -0
  18. package/dist/commands/tree.d.ts +7 -0
  19. package/dist/commands/tree.d.ts.map +1 -0
  20. package/dist/commands/tree.js +184 -0
  21. package/dist/commands/tree.js.map +1 -0
  22. package/dist/commands/view.d.ts +9 -0
  23. package/dist/commands/view.d.ts.map +1 -0
  24. package/dist/commands/view.js +143 -0
  25. package/dist/commands/view.js.map +1 -0
  26. package/dist/eventline/index.d.ts +8 -0
  27. package/dist/eventline/index.d.ts.map +1 -0
  28. package/dist/eventline/index.js +8 -0
  29. package/dist/eventline/index.js.map +1 -0
  30. package/dist/eventline/normalizer.d.ts +61 -0
  31. package/dist/eventline/normalizer.d.ts.map +1 -0
  32. package/dist/eventline/normalizer.js +298 -0
  33. package/dist/eventline/normalizer.js.map +1 -0
  34. package/dist/eventline/schema-discovery.d.ts +79 -0
  35. package/dist/eventline/schema-discovery.d.ts.map +1 -0
  36. package/dist/eventline/schema-discovery.js +154 -0
  37. package/dist/eventline/schema-discovery.js.map +1 -0
  38. package/dist/eventline/store.d.ts +88 -0
  39. package/dist/eventline/store.d.ts.map +1 -0
  40. package/dist/eventline/store.js +358 -0
  41. package/dist/eventline/store.js.map +1 -0
  42. package/dist/eventline/types.d.ts +88 -0
  43. package/dist/eventline/types.d.ts.map +1 -0
  44. package/dist/eventline/types.js +67 -0
  45. package/dist/eventline/types.js.map +1 -0
  46. package/package.json +1 -1
@@ -0,0 +1,298 @@
1
+ /**
2
+ * EventLine Normalizer - converts raw DB events to normalized EventLine format
3
+ *
4
+ * This layer absorbs schema differences and provides a consistent interface
5
+ * for view/tree/explore commands.
6
+ */
7
+ /**
8
+ * Parse ISO8601 timestamp to epoch milliseconds
9
+ */
10
+ export function parseTimestamp(ts) {
11
+ if (ts === null || ts === undefined)
12
+ return 0;
13
+ // Already milliseconds
14
+ if (typeof ts === 'number') {
15
+ // If it looks like seconds (< year 2100 as ms would be ~4e12)
16
+ if (ts < 4e12 && ts > 1e9) {
17
+ return ts * 1000;
18
+ }
19
+ return ts;
20
+ }
21
+ // ISO8601 string
22
+ const date = new Date(ts);
23
+ return isNaN(date.getTime()) ? 0 : date.getTime();
24
+ }
25
+ /**
26
+ * Map old direction format to new → / ← format
27
+ */
28
+ export function normalizeDirection(direction, kind) {
29
+ if (!direction) {
30
+ // Infer from kind if possible
31
+ if (kind === 'request')
32
+ return '→';
33
+ if (kind === 'response')
34
+ return '←';
35
+ return undefined;
36
+ }
37
+ // Map known formats
38
+ const dir = direction.toLowerCase();
39
+ if (dir === 'client_to_server' || dir === 'outbound' || dir === 'out' || dir === 'send') {
40
+ return '→';
41
+ }
42
+ if (dir === 'server_to_client' || dir === 'inbound' || dir === 'in' || dir === 'receive') {
43
+ return '←';
44
+ }
45
+ if (dir === '→' || dir === '->')
46
+ return '→';
47
+ if (dir === '←' || dir === '<-')
48
+ return '←';
49
+ return undefined;
50
+ }
51
+ /**
52
+ * Map old kind format to new 6-type format
53
+ */
54
+ export function normalizeKind(kind) {
55
+ if (!kind)
56
+ return 'notify';
57
+ const k = kind.toLowerCase();
58
+ if (k === 'request' || k === 'req')
59
+ return 'req';
60
+ if (k === 'response' || k === 'res')
61
+ return 'res';
62
+ if (k === 'notification' || k === 'notify')
63
+ return 'notify';
64
+ if (k === 'error' || k === 'err')
65
+ return 'error';
66
+ if (k === 'session_start' || k === 'transport_event' && k.includes('connect'))
67
+ return 'session_start';
68
+ if (k === 'session_end')
69
+ return 'session_end';
70
+ // transport_event → treat as notify
71
+ if (k === 'transport_event')
72
+ return 'notify';
73
+ return 'notify';
74
+ }
75
+ /**
76
+ * Extract method/label from raw JSON or columns
77
+ */
78
+ export function extractLabel(rawJson, method, kind, dbKind) {
79
+ // Use explicit method if available
80
+ if (method)
81
+ return method;
82
+ // Try to extract from raw JSON
83
+ if (rawJson) {
84
+ try {
85
+ const parsed = JSON.parse(rawJson);
86
+ if (parsed.method)
87
+ return parsed.method;
88
+ // For responses, label as "response" if no method
89
+ if (parsed.result !== undefined || parsed.error !== undefined) {
90
+ return 'response';
91
+ }
92
+ }
93
+ catch {
94
+ // Ignore parse errors
95
+ }
96
+ }
97
+ // Fallback labels
98
+ if (kind === 'session_start')
99
+ return 'session start';
100
+ if (kind === 'session_end')
101
+ return 'session end';
102
+ // Transport events
103
+ if (dbKind === 'transport_event') {
104
+ return '[transport]';
105
+ }
106
+ // For notify without method, show kind
107
+ if (kind === 'notify')
108
+ return '[notification]';
109
+ if (kind === 'req')
110
+ return '[request]';
111
+ if (kind === 'res')
112
+ return '[response]';
113
+ if (kind === 'error')
114
+ return '[error]';
115
+ return '(unknown)';
116
+ }
117
+ /**
118
+ * Extract RPC ID from raw JSON or column
119
+ */
120
+ export function extractRpcId(rawJson, rpcId) {
121
+ // Use explicit rpc_id if available
122
+ if (rpcId !== null && rpcId !== undefined)
123
+ return rpcId;
124
+ // Try to extract from raw JSON
125
+ if (rawJson) {
126
+ try {
127
+ const parsed = JSON.parse(rawJson);
128
+ if (parsed.id !== undefined)
129
+ return parsed.id;
130
+ }
131
+ catch {
132
+ // Ignore parse errors
133
+ }
134
+ }
135
+ return undefined;
136
+ }
137
+ /**
138
+ * Determine status from various sources
139
+ */
140
+ export function determineStatus(rawJson, success, kind) {
141
+ // Explicit success column
142
+ if (success === 1)
143
+ return 'OK';
144
+ if (success === 0)
145
+ return 'ERR';
146
+ // Check raw JSON for error
147
+ if (rawJson) {
148
+ try {
149
+ const parsed = JSON.parse(rawJson);
150
+ if (parsed.error)
151
+ return 'ERR';
152
+ if (parsed.result !== undefined)
153
+ return 'OK';
154
+ }
155
+ catch {
156
+ // Ignore parse errors
157
+ }
158
+ }
159
+ // Default based on kind
160
+ if (kind === 'error')
161
+ return 'ERR';
162
+ if (kind === 'res')
163
+ return 'OK';
164
+ if (kind === 'req')
165
+ return 'OK';
166
+ return '-';
167
+ }
168
+ /**
169
+ * Extract error code from raw JSON or column
170
+ */
171
+ export function extractErrorCode(rawJson, errorCode) {
172
+ // Use explicit error_code if available
173
+ if (errorCode !== null && errorCode !== undefined)
174
+ return errorCode;
175
+ // Try to extract from raw JSON
176
+ if (rawJson) {
177
+ try {
178
+ const parsed = JSON.parse(rawJson);
179
+ if (parsed.error?.code)
180
+ return parsed.error.code;
181
+ }
182
+ catch {
183
+ // Ignore parse errors
184
+ }
185
+ }
186
+ return undefined;
187
+ }
188
+ /**
189
+ * Calculate size in bytes
190
+ */
191
+ export function calculateSize(rawJson) {
192
+ if (!rawJson)
193
+ return undefined;
194
+ return new TextEncoder().encode(rawJson).length;
195
+ }
196
+ /**
197
+ * Normalize a single raw Event to EventLine
198
+ */
199
+ export function normalizeEvent(event, session, rpcCall) {
200
+ const kind = normalizeKind(event.kind);
201
+ const direction = normalizeDirection(event.direction, event.kind);
202
+ const label = extractLabel(event.raw_json, rpcCall?.method, kind, event.kind);
203
+ const rpcId = extractRpcId(event.raw_json, event.rpc_id);
204
+ const status = determineStatus(event.raw_json, rpcCall?.success, kind);
205
+ const errorCode = extractErrorCode(event.raw_json, rpcCall?.error_code);
206
+ const sizeBytes = calculateSize(event.raw_json);
207
+ // Calculate latency from RPC call if available
208
+ let latencyMs;
209
+ if (rpcCall && rpcCall.request_ts && rpcCall.response_ts && kind === 'res') {
210
+ const reqTs = parseTimestamp(rpcCall.request_ts);
211
+ const resTs = parseTimestamp(rpcCall.response_ts);
212
+ if (reqTs && resTs) {
213
+ latencyMs = resTs - reqTs;
214
+ }
215
+ }
216
+ const eventLine = {
217
+ ts_ms: parseTimestamp(event.ts),
218
+ kind,
219
+ direction,
220
+ label,
221
+ connector_id: session?.connector_id,
222
+ session_id: event.session_id,
223
+ rpc_id: rpcId,
224
+ status,
225
+ error_code: errorCode,
226
+ latency_ms: latencyMs,
227
+ size_bytes: sizeBytes,
228
+ raw_json: event.raw_json || undefined,
229
+ };
230
+ return eventLine;
231
+ }
232
+ /**
233
+ * Create session_start EventLine from Session
234
+ */
235
+ export function createSessionStartEvent(session) {
236
+ return {
237
+ ts_ms: parseTimestamp(session.started_at),
238
+ kind: 'session_start',
239
+ direction: undefined,
240
+ label: 'session start',
241
+ connector_id: session.connector_id,
242
+ session_id: session.session_id,
243
+ status: '-',
244
+ meta: {
245
+ connector: session.connector_id,
246
+ },
247
+ };
248
+ }
249
+ /**
250
+ * Create session_end EventLine from Session
251
+ */
252
+ export function createSessionEndEvent(session, stats) {
253
+ if (!session.ended_at) {
254
+ // Session still running
255
+ return {
256
+ ts_ms: Date.now(),
257
+ kind: 'session_end',
258
+ direction: undefined,
259
+ label: 'session running',
260
+ connector_id: session.connector_id,
261
+ session_id: session.session_id,
262
+ status: '-',
263
+ meta: { running: true },
264
+ };
265
+ }
266
+ const startMs = parseTimestamp(session.started_at);
267
+ const endMs = parseTimestamp(session.ended_at);
268
+ const durationMs = endMs - startMs;
269
+ const status = session.exit_reason === 'normal' ? 'OK' : 'ERR';
270
+ return {
271
+ ts_ms: endMs,
272
+ kind: 'session_end',
273
+ direction: undefined,
274
+ label: 'session end',
275
+ connector_id: session.connector_id,
276
+ session_id: session.session_id,
277
+ status,
278
+ latency_ms: durationMs, // Reuse latency_ms for session duration
279
+ meta: {
280
+ exit_reason: session.exit_reason,
281
+ rpc_count: stats?.rpc_count || session.rpc_count,
282
+ event_count: stats?.event_count || session.event_count,
283
+ error_count: stats?.error_count,
284
+ duration_ms: durationMs,
285
+ },
286
+ };
287
+ }
288
+ /**
289
+ * Normalize a batch of events with related data
290
+ */
291
+ export function normalizeEvents(events, sessions, rpcCalls) {
292
+ return events.map(event => {
293
+ const session = sessions.get(event.session_id);
294
+ const rpcCall = event.rpc_id ? rpcCalls.get(`${event.session_id}:${event.rpc_id}`) : undefined;
295
+ return normalizeEvent(event, session, rpcCall);
296
+ });
297
+ }
298
+ //# sourceMappingURL=normalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizer.js","sourceRoot":"","sources":["../../src/eventline/normalizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Database schema discovery - auto-detect table structure
3
+ *
4
+ * This allows the EventLine normalization to work even if the schema
5
+ * changes slightly, by discovering available columns at runtime.
6
+ */
7
+ import type Database from 'better-sqlite3';
8
+ export interface TableInfo {
9
+ name: string;
10
+ columns: ColumnInfo[];
11
+ }
12
+ export interface ColumnInfo {
13
+ cid: number;
14
+ name: string;
15
+ type: string;
16
+ notnull: number;
17
+ dflt_value: string | null;
18
+ pk: number;
19
+ }
20
+ export interface SchemaInfo {
21
+ tables: Map<string, TableInfo>;
22
+ version: number;
23
+ }
24
+ /**
25
+ * Discover database schema using PRAGMA commands
26
+ */
27
+ export declare function discoverSchema(db: Database.Database): SchemaInfo;
28
+ /**
29
+ * Check if a table has a specific column
30
+ */
31
+ export declare function hasColumn(schema: SchemaInfo, tableName: string, columnName: string): boolean;
32
+ /**
33
+ * Get column names for a table
34
+ */
35
+ export declare function getColumnNames(schema: SchemaInfo, tableName: string): string[];
36
+ /**
37
+ * Find timestamp column - tries common naming patterns
38
+ */
39
+ export declare function findTimestampColumn(schema: SchemaInfo, tableName: string): string | null;
40
+ /**
41
+ * Find direction column - tries common naming patterns
42
+ */
43
+ export declare function findDirectionColumn(schema: SchemaInfo, tableName: string): string | null;
44
+ /**
45
+ * Find kind column - tries common naming patterns
46
+ */
47
+ export declare function findKindColumn(schema: SchemaInfo, tableName: string): string | null;
48
+ /**
49
+ * Find raw JSON column
50
+ */
51
+ export declare function findRawJsonColumn(schema: SchemaInfo, tableName: string): string | null;
52
+ /**
53
+ * Column mapping for known schema versions
54
+ */
55
+ export interface ColumnMapping {
56
+ timestamp: string;
57
+ direction?: string;
58
+ kind?: string;
59
+ rawJson?: string;
60
+ sessionId?: string;
61
+ connectorId?: string;
62
+ rpcId?: string;
63
+ method?: string;
64
+ success?: string;
65
+ errorCode?: string;
66
+ }
67
+ /**
68
+ * Build column mapping for events table
69
+ */
70
+ export declare function buildEventsMapping(schema: SchemaInfo): ColumnMapping | null;
71
+ /**
72
+ * Build column mapping for sessions table
73
+ */
74
+ export declare function buildSessionsMapping(schema: SchemaInfo): ColumnMapping | null;
75
+ /**
76
+ * Build column mapping for rpc_calls table
77
+ */
78
+ export declare function buildRpcCallsMapping(schema: SchemaInfo): ColumnMapping | null;
79
+ //# sourceMappingURL=schema-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-discovery.d.ts","sourceRoot":"","sources":["../../src/eventline/schema-discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,UAAU,CAkBhE;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAI5F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAI9E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWxF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWxF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWnF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWtF;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,aAAa,GAAG,IAAI,CAe3E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,aAAa,GAAG,IAAI,CAY7E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,aAAa,GAAG,IAAI,CAe7E"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Database schema discovery - auto-detect table structure
3
+ *
4
+ * This allows the EventLine normalization to work even if the schema
5
+ * changes slightly, by discovering available columns at runtime.
6
+ */
7
+ /**
8
+ * Discover database schema using PRAGMA commands
9
+ */
10
+ export function discoverSchema(db) {
11
+ const tables = new Map();
12
+ // Get all tables
13
+ const tableList = db.prepare(`
14
+ SELECT name FROM sqlite_master
15
+ WHERE type = 'table' AND name NOT LIKE 'sqlite_%'
16
+ `).all();
17
+ for (const { name } of tableList) {
18
+ const columns = db.prepare(`PRAGMA table_info('${name}')`).all();
19
+ tables.set(name, { name, columns });
20
+ }
21
+ // Get user_version
22
+ const version = db.pragma('user_version', { simple: true });
23
+ return { tables, version };
24
+ }
25
+ /**
26
+ * Check if a table has a specific column
27
+ */
28
+ export function hasColumn(schema, tableName, columnName) {
29
+ const table = schema.tables.get(tableName);
30
+ if (!table)
31
+ return false;
32
+ return table.columns.some(c => c.name === columnName);
33
+ }
34
+ /**
35
+ * Get column names for a table
36
+ */
37
+ export function getColumnNames(schema, tableName) {
38
+ const table = schema.tables.get(tableName);
39
+ if (!table)
40
+ return [];
41
+ return table.columns.map(c => c.name);
42
+ }
43
+ /**
44
+ * Find timestamp column - tries common naming patterns
45
+ */
46
+ export function findTimestampColumn(schema, tableName) {
47
+ const candidates = ['ts_ms', 'ts', 'timestamp', 'created_at', 'started_at', 'time'];
48
+ const table = schema.tables.get(tableName);
49
+ if (!table)
50
+ return null;
51
+ for (const candidate of candidates) {
52
+ if (table.columns.some(c => c.name === candidate)) {
53
+ return candidate;
54
+ }
55
+ }
56
+ return null;
57
+ }
58
+ /**
59
+ * Find direction column - tries common naming patterns
60
+ */
61
+ export function findDirectionColumn(schema, tableName) {
62
+ const candidates = ['direction', 'dir', 'flow'];
63
+ const table = schema.tables.get(tableName);
64
+ if (!table)
65
+ return null;
66
+ for (const candidate of candidates) {
67
+ if (table.columns.some(c => c.name === candidate)) {
68
+ return candidate;
69
+ }
70
+ }
71
+ return null;
72
+ }
73
+ /**
74
+ * Find kind column - tries common naming patterns
75
+ */
76
+ export function findKindColumn(schema, tableName) {
77
+ const candidates = ['kind', 'type', 'event_type', 'msg_type'];
78
+ const table = schema.tables.get(tableName);
79
+ if (!table)
80
+ return null;
81
+ for (const candidate of candidates) {
82
+ if (table.columns.some(c => c.name === candidate)) {
83
+ return candidate;
84
+ }
85
+ }
86
+ return null;
87
+ }
88
+ /**
89
+ * Find raw JSON column
90
+ */
91
+ export function findRawJsonColumn(schema, tableName) {
92
+ const candidates = ['raw_json', 'raw', 'payload', 'data', 'body', 'content'];
93
+ const table = schema.tables.get(tableName);
94
+ if (!table)
95
+ return null;
96
+ for (const candidate of candidates) {
97
+ if (table.columns.some(c => c.name === candidate)) {
98
+ return candidate;
99
+ }
100
+ }
101
+ return null;
102
+ }
103
+ /**
104
+ * Build column mapping for events table
105
+ */
106
+ export function buildEventsMapping(schema) {
107
+ const tableName = 'events';
108
+ const table = schema.tables.get(tableName);
109
+ if (!table)
110
+ return null;
111
+ const cols = getColumnNames(schema, tableName);
112
+ return {
113
+ timestamp: cols.includes('ts') ? 'ts' : (findTimestampColumn(schema, tableName) || 'ts'),
114
+ direction: cols.includes('direction') ? 'direction' : findDirectionColumn(schema, tableName) || undefined,
115
+ kind: cols.includes('kind') ? 'kind' : findKindColumn(schema, tableName) || undefined,
116
+ rawJson: cols.includes('raw_json') ? 'raw_json' : findRawJsonColumn(schema, tableName) || undefined,
117
+ sessionId: cols.includes('session_id') ? 'session_id' : undefined,
118
+ rpcId: cols.includes('rpc_id') ? 'rpc_id' : undefined,
119
+ };
120
+ }
121
+ /**
122
+ * Build column mapping for sessions table
123
+ */
124
+ export function buildSessionsMapping(schema) {
125
+ const tableName = 'sessions';
126
+ const table = schema.tables.get(tableName);
127
+ if (!table)
128
+ return null;
129
+ const cols = getColumnNames(schema, tableName);
130
+ return {
131
+ timestamp: cols.includes('started_at') ? 'started_at' : (findTimestampColumn(schema, tableName) || 'created_at'),
132
+ connectorId: cols.includes('connector_id') ? 'connector_id' : undefined,
133
+ sessionId: cols.includes('session_id') ? 'session_id' : undefined,
134
+ };
135
+ }
136
+ /**
137
+ * Build column mapping for rpc_calls table
138
+ */
139
+ export function buildRpcCallsMapping(schema) {
140
+ const tableName = 'rpc_calls';
141
+ const table = schema.tables.get(tableName);
142
+ if (!table)
143
+ return null;
144
+ const cols = getColumnNames(schema, tableName);
145
+ return {
146
+ timestamp: cols.includes('request_ts') ? 'request_ts' : (findTimestampColumn(schema, tableName) || 'ts'),
147
+ sessionId: cols.includes('session_id') ? 'session_id' : undefined,
148
+ rpcId: cols.includes('rpc_id') ? 'rpc_id' : undefined,
149
+ method: cols.includes('method') ? 'method' : undefined,
150
+ success: cols.includes('success') ? 'success' : undefined,
151
+ errorCode: cols.includes('error_code') ? 'error_code' : undefined,
152
+ };
153
+ }
154
+ //# sourceMappingURL=schema-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-discovery.js","sourceRoot":"","sources":["../../src/eventline/schema-discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * EventLine Store - unified data access layer
3
+ *
4
+ * This provides a higher-level API for fetching EventLine data,
5
+ * abstracting away the underlying database structure.
6
+ */
7
+ import type { EventLine, TreeNode } from './types.js';
8
+ import type { Event, SessionWithStats, RpcCall, Proof } from '../db/types.js';
9
+ import { type SchemaInfo } from './schema-discovery.js';
10
+ export interface ViewOptions {
11
+ limit?: number;
12
+ since?: string | number;
13
+ errors?: boolean;
14
+ method?: string;
15
+ connector?: string;
16
+ session?: string;
17
+ includeSessionEvents?: boolean;
18
+ }
19
+ export interface TreeOptions {
20
+ sessions?: number;
21
+ rpc?: number;
22
+ session?: string;
23
+ rpcAll?: boolean;
24
+ method?: string;
25
+ status?: 'ok' | 'err' | 'all';
26
+ compact?: boolean;
27
+ idsOnly?: boolean;
28
+ since?: string | number;
29
+ }
30
+ export declare class EventLineStore {
31
+ private eventsStore;
32
+ private proofsStore;
33
+ private configDir;
34
+ private schemaInfo?;
35
+ constructor(configDir: string);
36
+ /**
37
+ * Discover and cache schema info
38
+ */
39
+ getSchema(): SchemaInfo;
40
+ /**
41
+ * Parse "since" parameter to epoch ms
42
+ */
43
+ private parseSince;
44
+ /**
45
+ * Get recent events as EventLines (for view command)
46
+ */
47
+ getRecentEvents(options?: ViewOptions): EventLine[];
48
+ /**
49
+ * Build tree structure for connector → session → rpc
50
+ */
51
+ buildTree(options?: TreeOptions): TreeNode[];
52
+ /**
53
+ * Get all connectors
54
+ */
55
+ getConnectors(): Array<{
56
+ id: string;
57
+ session_count: number;
58
+ latest_session?: string;
59
+ }>;
60
+ /**
61
+ * Get sessions for a connector
62
+ */
63
+ getSessions(connectorId?: string, limit?: number): SessionWithStats[];
64
+ /**
65
+ * Get RPC calls for a session
66
+ */
67
+ getRpcCalls(sessionId: string): RpcCall[];
68
+ /**
69
+ * Get events for a session
70
+ */
71
+ getSessionEvents(sessionId: string, limit?: number): EventLine[];
72
+ /**
73
+ * Get raw event details
74
+ */
75
+ getRawEvent(sessionId: string, rpcId: string): {
76
+ request?: Event;
77
+ response?: Event;
78
+ } | null;
79
+ /**
80
+ * Get proofs for a session
81
+ */
82
+ getProofs(sessionId: string): Proof[];
83
+ /**
84
+ * Get session by ID (supports partial match)
85
+ */
86
+ findSession(partialId: string): SessionWithStats | null;
87
+ }
88
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/eventline/store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,KAAK,EAAE,KAAK,EAAW,gBAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvF,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExE,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACzB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAC,CAAa;gBAEpB,SAAS,EAAE,MAAM;IAM7B;;OAEG;IACH,SAAS,IAAI,UAAU;IAQvB;;OAEG;IACH,OAAO,CAAC,UAAU;IAwBlB;;OAEG;IACH,eAAe,CAAC,OAAO,GAAE,WAAgB,GAAG,SAAS,EAAE;IA2GvD;;OAEG;IACH,SAAS,CAAC,OAAO,GAAE,WAAgB,GAAG,QAAQ,EAAE;IA2JhD;;OAEG;IACH,aAAa,IAAI,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAetF;;OAEG;IACH,WAAW,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAOrE;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE;IAIzC;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE;IAkBhE;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;QAAE,OAAO,CAAC,EAAE,KAAK,CAAC;QAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;KAAE,GAAG,IAAI;IAW3F;;OAEG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,EAAE;IAIrC;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;CAMxD"}