@dotsetlabs/tollgate 0.1.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 (215) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +885 -0
  3. package/dist/analyzers/filesystem.d.ts +26 -0
  4. package/dist/analyzers/filesystem.d.ts.map +1 -0
  5. package/dist/analyzers/filesystem.js +284 -0
  6. package/dist/analyzers/filesystem.js.map +1 -0
  7. package/dist/analyzers/http.d.ts +90 -0
  8. package/dist/analyzers/http.d.ts.map +1 -0
  9. package/dist/analyzers/http.js +433 -0
  10. package/dist/analyzers/http.js.map +1 -0
  11. package/dist/analyzers/index.d.ts +101 -0
  12. package/dist/analyzers/index.d.ts.map +1 -0
  13. package/dist/analyzers/index.js +342 -0
  14. package/dist/analyzers/index.js.map +1 -0
  15. package/dist/analyzers/loader.d.ts +114 -0
  16. package/dist/analyzers/loader.d.ts.map +1 -0
  17. package/dist/analyzers/loader.js +184 -0
  18. package/dist/analyzers/loader.js.map +1 -0
  19. package/dist/analyzers/prompt-injection.d.ts +95 -0
  20. package/dist/analyzers/prompt-injection.d.ts.map +1 -0
  21. package/dist/analyzers/prompt-injection.js +725 -0
  22. package/dist/analyzers/prompt-injection.js.map +1 -0
  23. package/dist/analyzers/sdk.d.ts +230 -0
  24. package/dist/analyzers/sdk.d.ts.map +1 -0
  25. package/dist/analyzers/sdk.js +283 -0
  26. package/dist/analyzers/sdk.js.map +1 -0
  27. package/dist/analyzers/shell.d.ts +20 -0
  28. package/dist/analyzers/shell.d.ts.map +1 -0
  29. package/dist/analyzers/shell.js +297 -0
  30. package/dist/analyzers/shell.js.map +1 -0
  31. package/dist/analyzers/sql.d.ts +37 -0
  32. package/dist/analyzers/sql.d.ts.map +1 -0
  33. package/dist/analyzers/sql.js +455 -0
  34. package/dist/analyzers/sql.js.map +1 -0
  35. package/dist/analyzers/types.d.ts +117 -0
  36. package/dist/analyzers/types.d.ts.map +1 -0
  37. package/dist/analyzers/types.js +46 -0
  38. package/dist/analyzers/types.js.map +1 -0
  39. package/dist/approval/interactive.d.ts +72 -0
  40. package/dist/approval/interactive.d.ts.map +1 -0
  41. package/dist/approval/interactive.js +550 -0
  42. package/dist/approval/interactive.js.map +1 -0
  43. package/dist/approval/terminal.d.ts +59 -0
  44. package/dist/approval/terminal.d.ts.map +1 -0
  45. package/dist/approval/terminal.js +238 -0
  46. package/dist/approval/terminal.js.map +1 -0
  47. package/dist/approval/types.d.ts +66 -0
  48. package/dist/approval/types.d.ts.map +1 -0
  49. package/dist/approval/types.js +2 -0
  50. package/dist/approval/types.js.map +1 -0
  51. package/dist/audit/exporter.d.ts +138 -0
  52. package/dist/audit/exporter.d.ts.map +1 -0
  53. package/dist/audit/exporter.js +366 -0
  54. package/dist/audit/exporter.js.map +1 -0
  55. package/dist/audit/logger.d.ts +156 -0
  56. package/dist/audit/logger.d.ts.map +1 -0
  57. package/dist/audit/logger.js +406 -0
  58. package/dist/audit/logger.js.map +1 -0
  59. package/dist/audit/redaction.d.ts +110 -0
  60. package/dist/audit/redaction.d.ts.map +1 -0
  61. package/dist/audit/redaction.js +307 -0
  62. package/dist/audit/redaction.js.map +1 -0
  63. package/dist/audit/schema.d.ts +76 -0
  64. package/dist/audit/schema.d.ts.map +1 -0
  65. package/dist/audit/schema.js +122 -0
  66. package/dist/audit/schema.js.map +1 -0
  67. package/dist/cli/commands/doctor.d.ts +34 -0
  68. package/dist/cli/commands/doctor.d.ts.map +1 -0
  69. package/dist/cli/commands/doctor.js +431 -0
  70. package/dist/cli/commands/doctor.js.map +1 -0
  71. package/dist/cli/commands/export.d.ts +18 -0
  72. package/dist/cli/commands/export.d.ts.map +1 -0
  73. package/dist/cli/commands/export.js +63 -0
  74. package/dist/cli/commands/export.js.map +1 -0
  75. package/dist/cli/commands/init.d.ts +12 -0
  76. package/dist/cli/commands/init.d.ts.map +1 -0
  77. package/dist/cli/commands/init.js +102 -0
  78. package/dist/cli/commands/init.js.map +1 -0
  79. package/dist/cli/commands/logs.d.ts +11 -0
  80. package/dist/cli/commands/logs.d.ts.map +1 -0
  81. package/dist/cli/commands/logs.js +60 -0
  82. package/dist/cli/commands/logs.js.map +1 -0
  83. package/dist/cli/commands/scan.d.ts +29 -0
  84. package/dist/cli/commands/scan.d.ts.map +1 -0
  85. package/dist/cli/commands/scan.js +251 -0
  86. package/dist/cli/commands/scan.js.map +1 -0
  87. package/dist/cli/commands/serve.d.ts +26 -0
  88. package/dist/cli/commands/serve.d.ts.map +1 -0
  89. package/dist/cli/commands/serve.js +424 -0
  90. package/dist/cli/commands/serve.js.map +1 -0
  91. package/dist/cli/commands/start.d.ts +20 -0
  92. package/dist/cli/commands/start.d.ts.map +1 -0
  93. package/dist/cli/commands/start.js +82 -0
  94. package/dist/cli/commands/start.js.map +1 -0
  95. package/dist/cli/commands/stats.d.ts +10 -0
  96. package/dist/cli/commands/stats.d.ts.map +1 -0
  97. package/dist/cli/commands/stats.js +42 -0
  98. package/dist/cli/commands/stats.js.map +1 -0
  99. package/dist/cli/commands/templates.d.ts +26 -0
  100. package/dist/cli/commands/templates.d.ts.map +1 -0
  101. package/dist/cli/commands/templates.js +221 -0
  102. package/dist/cli/commands/templates.js.map +1 -0
  103. package/dist/cli/commands/validate.d.ts +12 -0
  104. package/dist/cli/commands/validate.d.ts.map +1 -0
  105. package/dist/cli/commands/validate.js +107 -0
  106. package/dist/cli/commands/validate.js.map +1 -0
  107. package/dist/cli/commands/wrap.d.ts +19 -0
  108. package/dist/cli/commands/wrap.d.ts.map +1 -0
  109. package/dist/cli/commands/wrap.js +59 -0
  110. package/dist/cli/commands/wrap.js.map +1 -0
  111. package/dist/cli/index.d.ts +17 -0
  112. package/dist/cli/index.d.ts.map +1 -0
  113. package/dist/cli/index.js +202 -0
  114. package/dist/cli/index.js.map +1 -0
  115. package/dist/cli/ui.d.ts +139 -0
  116. package/dist/cli/ui.d.ts.map +1 -0
  117. package/dist/cli/ui.js +271 -0
  118. package/dist/cli/ui.js.map +1 -0
  119. package/dist/constants.d.ts +33 -0
  120. package/dist/constants.d.ts.map +1 -0
  121. package/dist/constants.js +54 -0
  122. package/dist/constants.js.map +1 -0
  123. package/dist/errors.d.ts +28 -0
  124. package/dist/errors.d.ts.map +1 -0
  125. package/dist/errors.js +37 -0
  126. package/dist/errors.js.map +1 -0
  127. package/dist/index.d.ts +49 -0
  128. package/dist/index.d.ts.map +1 -0
  129. package/dist/index.js +82 -0
  130. package/dist/index.js.map +1 -0
  131. package/dist/orchestrator/index.d.ts +11 -0
  132. package/dist/orchestrator/index.d.ts.map +1 -0
  133. package/dist/orchestrator/index.js +10 -0
  134. package/dist/orchestrator/index.js.map +1 -0
  135. package/dist/orchestrator/manager.d.ts +127 -0
  136. package/dist/orchestrator/manager.d.ts.map +1 -0
  137. package/dist/orchestrator/manager.js +498 -0
  138. package/dist/orchestrator/manager.js.map +1 -0
  139. package/dist/orchestrator/types.d.ts +141 -0
  140. package/dist/orchestrator/types.d.ts.map +1 -0
  141. package/dist/orchestrator/types.js +9 -0
  142. package/dist/orchestrator/types.js.map +1 -0
  143. package/dist/policy/engine.d.ts +55 -0
  144. package/dist/policy/engine.d.ts.map +1 -0
  145. package/dist/policy/engine.js +288 -0
  146. package/dist/policy/engine.js.map +1 -0
  147. package/dist/policy/natural-language.d.ts +141 -0
  148. package/dist/policy/natural-language.d.ts.map +1 -0
  149. package/dist/policy/natural-language.js +552 -0
  150. package/dist/policy/natural-language.js.map +1 -0
  151. package/dist/policy/parser.d.ts +141 -0
  152. package/dist/policy/parser.d.ts.map +1 -0
  153. package/dist/policy/parser.js +314 -0
  154. package/dist/policy/parser.js.map +1 -0
  155. package/dist/policy/types.d.ts +428 -0
  156. package/dist/policy/types.d.ts.map +1 -0
  157. package/dist/policy/types.js +32 -0
  158. package/dist/policy/types.js.map +1 -0
  159. package/dist/policy/validator.d.ts +72 -0
  160. package/dist/policy/validator.d.ts.map +1 -0
  161. package/dist/policy/validator.js +453 -0
  162. package/dist/policy/validator.js.map +1 -0
  163. package/dist/proxy/bridge.d.ts +84 -0
  164. package/dist/proxy/bridge.d.ts.map +1 -0
  165. package/dist/proxy/bridge.js +217 -0
  166. package/dist/proxy/bridge.js.map +1 -0
  167. package/dist/proxy/client.d.ts +130 -0
  168. package/dist/proxy/client.d.ts.map +1 -0
  169. package/dist/proxy/client.js +290 -0
  170. package/dist/proxy/client.js.map +1 -0
  171. package/dist/proxy/server.d.ts +111 -0
  172. package/dist/proxy/server.d.ts.map +1 -0
  173. package/dist/proxy/server.js +444 -0
  174. package/dist/proxy/server.js.map +1 -0
  175. package/dist/scanner.d.ts +91 -0
  176. package/dist/scanner.d.ts.map +1 -0
  177. package/dist/scanner.js +373 -0
  178. package/dist/scanner.js.map +1 -0
  179. package/dist/session/index.d.ts +32 -0
  180. package/dist/session/index.d.ts.map +1 -0
  181. package/dist/session/index.js +31 -0
  182. package/dist/session/index.js.map +1 -0
  183. package/dist/session/manager.d.ts +166 -0
  184. package/dist/session/manager.d.ts.map +1 -0
  185. package/dist/session/manager.js +454 -0
  186. package/dist/session/manager.js.map +1 -0
  187. package/dist/session/sqlite-store.d.ts +54 -0
  188. package/dist/session/sqlite-store.d.ts.map +1 -0
  189. package/dist/session/sqlite-store.js +209 -0
  190. package/dist/session/sqlite-store.js.map +1 -0
  191. package/dist/session/types.d.ts +179 -0
  192. package/dist/session/types.d.ts.map +1 -0
  193. package/dist/session/types.js +38 -0
  194. package/dist/session/types.js.map +1 -0
  195. package/dist/templates.d.ts +64 -0
  196. package/dist/templates.d.ts.map +1 -0
  197. package/dist/templates.js +451 -0
  198. package/dist/templates.js.map +1 -0
  199. package/dist/utils/config.d.ts +57 -0
  200. package/dist/utils/config.d.ts.map +1 -0
  201. package/dist/utils/config.js +104 -0
  202. package/dist/utils/config.js.map +1 -0
  203. package/dist/utils/errors.d.ts +18 -0
  204. package/dist/utils/errors.d.ts.map +1 -0
  205. package/dist/utils/errors.js +35 -0
  206. package/dist/utils/errors.js.map +1 -0
  207. package/dist/utils/logger.d.ts +144 -0
  208. package/dist/utils/logger.d.ts.map +1 -0
  209. package/dist/utils/logger.js +300 -0
  210. package/dist/utils/logger.js.map +1 -0
  211. package/dist/wizard.d.ts +68 -0
  212. package/dist/wizard.d.ts.map +1 -0
  213. package/dist/wizard.js +395 -0
  214. package/dist/wizard.js.map +1 -0
  215. package/package.json +99 -0
@@ -0,0 +1,366 @@
1
+ /**
2
+ * Audit Export Module for Tollgate
3
+ *
4
+ * Exports audit records in various formats for compliance reporting,
5
+ * log aggregation, and SIEM integration.
6
+ *
7
+ * Supported formats:
8
+ * - JSON Lines (JSONL) - for log aggregation (Splunk, ELK, etc.)
9
+ * - CSV - for spreadsheet analysis
10
+ * - CEF (Common Event Format) - for SIEM systems
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * import { AuditExporter } from './exporter.js';
15
+ *
16
+ * const exporter = new AuditExporter(logger);
17
+ *
18
+ * // Export as JSON Lines
19
+ * const jsonl = exporter.exportJsonLines({ since: new Date('2024-01-01') });
20
+ *
21
+ * // Export as CSV
22
+ * const csv = exporter.exportCsv({ useRedacted: true });
23
+ *
24
+ * // Export as CEF for SIEM
25
+ * const cef = exporter.exportCef({ server: 'postgres' });
26
+ * ```
27
+ */
28
+ /**
29
+ * CEF severity levels mapped from risk levels.
30
+ */
31
+ const CEF_SEVERITY = {
32
+ safe: 0,
33
+ read: 1,
34
+ write: 4,
35
+ destructive: 7,
36
+ dangerous: 10,
37
+ // Default for policy decisions
38
+ allow: 1,
39
+ deny: 4,
40
+ prompt: 3,
41
+ };
42
+ /**
43
+ * Audit exporter for generating compliance reports.
44
+ */
45
+ export class AuditExporter {
46
+ logger;
47
+ constructor(logger) {
48
+ this.logger = logger;
49
+ }
50
+ /**
51
+ * Exports audit records as JSON Lines (JSONL).
52
+ *
53
+ * Each line is a complete JSON object, suitable for log aggregation systems.
54
+ *
55
+ * @param options - Export options
56
+ * @returns JSONL string with one record per line
57
+ */
58
+ exportJsonLines(options = {}) {
59
+ const records = this.getRecords(options);
60
+ const lines = [];
61
+ for (const record of records) {
62
+ const exportRecord = this.formatRecordForExport(record, options.useRedacted ?? true);
63
+ lines.push(JSON.stringify(exportRecord));
64
+ }
65
+ if (options.includeSessionGrants) {
66
+ const grants = this.logger.getActiveSessionGrants(options.server);
67
+ for (const grant of grants) {
68
+ lines.push(JSON.stringify({
69
+ type: 'session_grant',
70
+ ...this.formatGrantForExport(grant),
71
+ }));
72
+ }
73
+ }
74
+ return lines.join('\n');
75
+ }
76
+ /**
77
+ * Exports audit records as CSV.
78
+ *
79
+ * @param options - Export options
80
+ * @returns CSV string with headers
81
+ */
82
+ exportCsv(options = {}) {
83
+ const records = this.getRecords(options);
84
+ const useRedacted = options.useRedacted ?? true;
85
+ // CSV headers
86
+ const headers = [
87
+ 'id',
88
+ 'timestamp',
89
+ 'server',
90
+ 'tool',
91
+ 'policy_decision',
92
+ 'policy_rule',
93
+ 'policy_reason',
94
+ 'analyzer',
95
+ 'risk_level',
96
+ 'user_decision',
97
+ 'result',
98
+ 'error_message',
99
+ 'duration_ms',
100
+ 'session_grant_id',
101
+ 'correlation_id',
102
+ 'client_id',
103
+ 'args',
104
+ ];
105
+ const lines = [headers.join(',')];
106
+ for (const record of records) {
107
+ const args = useRedacted && record.argsRedacted
108
+ ? record.argsRedacted
109
+ : JSON.stringify(record.args);
110
+ const row = [
111
+ this.escapeCsv(record.id),
112
+ this.escapeCsv(record.timestamp.toISOString()),
113
+ this.escapeCsv(record.server),
114
+ this.escapeCsv(record.tool),
115
+ this.escapeCsv(record.policyDecision),
116
+ this.escapeCsv(record.policyRule ?? ''),
117
+ this.escapeCsv(record.policyReason ?? ''),
118
+ this.escapeCsv(record.analyzer ?? ''),
119
+ this.escapeCsv(record.riskLevel ?? ''),
120
+ this.escapeCsv(record.userDecision ?? ''),
121
+ this.escapeCsv(record.result ?? ''),
122
+ this.escapeCsv(record.errorMessage ?? ''),
123
+ record.durationMs?.toString() ?? '',
124
+ this.escapeCsv(record.sessionGrantId ?? ''),
125
+ this.escapeCsv(record.correlationId ?? ''),
126
+ this.escapeCsv(record.clientId ?? ''),
127
+ this.escapeCsv(args),
128
+ ];
129
+ lines.push(row.join(','));
130
+ }
131
+ return lines.join('\n');
132
+ }
133
+ /**
134
+ * Exports audit records in CEF (Common Event Format).
135
+ *
136
+ * CEF is widely supported by SIEM systems like Splunk, ArcSight, and QRadar.
137
+ *
138
+ * Format: CEF:Version|Device Vendor|Device Product|Device Version|Signature ID|Name|Severity|Extension
139
+ *
140
+ * @param options - Export options
141
+ * @returns CEF formatted string with one event per line
142
+ */
143
+ exportCef(options = {}) {
144
+ const records = this.getRecords(options);
145
+ const useRedacted = options.useRedacted ?? true;
146
+ const lines = [];
147
+ for (const record of records) {
148
+ const cef = this.formatCefEvent(record, useRedacted);
149
+ lines.push(cef);
150
+ }
151
+ return lines.join('\n');
152
+ }
153
+ /**
154
+ * Gets records based on export options.
155
+ */
156
+ getRecords(options) {
157
+ return this.logger.getRecentCalls({
158
+ limit: options.limit ?? 10000, // Default to a large number for exports
159
+ server: options.server,
160
+ since: options.since,
161
+ until: options.until,
162
+ riskLevel: options.riskLevel,
163
+ includeRedacted: options.useRedacted ?? true,
164
+ });
165
+ }
166
+ /**
167
+ * Formats an audit record for JSON export.
168
+ */
169
+ formatRecordForExport(record, useRedacted) {
170
+ return {
171
+ type: 'tool_call',
172
+ id: record.id,
173
+ timestamp: record.timestamp.toISOString(),
174
+ server: record.server,
175
+ tool: record.tool,
176
+ args: useRedacted && record.argsRedacted
177
+ ? JSON.parse(record.argsRedacted)
178
+ : record.args,
179
+ policy: {
180
+ decision: record.policyDecision,
181
+ rule: record.policyRule,
182
+ reason: record.policyReason,
183
+ },
184
+ analysis: record.analyzer ? {
185
+ analyzer: record.analyzer,
186
+ riskLevel: record.riskLevel,
187
+ } : undefined,
188
+ approval: record.userDecision ? {
189
+ decision: record.userDecision,
190
+ sessionGrantId: record.sessionGrantId,
191
+ } : undefined,
192
+ result: {
193
+ status: record.result,
194
+ error: record.errorMessage,
195
+ durationMs: record.durationMs,
196
+ },
197
+ context: {
198
+ correlationId: record.correlationId,
199
+ clientId: record.clientId,
200
+ },
201
+ };
202
+ }
203
+ /**
204
+ * Formats a session grant for JSON export.
205
+ */
206
+ formatGrantForExport(grant) {
207
+ return {
208
+ id: grant.id,
209
+ createdAt: grant.createdAt.toISOString(),
210
+ expiresAt: grant.expiresAt?.toISOString(),
211
+ server: grant.server,
212
+ scope: grant.scope,
213
+ scopeValue: grant.scopeValue,
214
+ tool: grant.tool,
215
+ grantedBy: grant.grantedBy,
216
+ originalRequestId: grant.originalRequestId,
217
+ usageCount: grant.usageCount,
218
+ revoked: grant.revokedAt ? {
219
+ at: grant.revokedAt.toISOString(),
220
+ by: grant.revokedBy,
221
+ } : undefined,
222
+ };
223
+ }
224
+ /**
225
+ * Formats a CEF event from an audit record.
226
+ *
227
+ * CEF format: CEF:0|Vendor|Product|Version|SignatureID|Name|Severity|Extension
228
+ */
229
+ formatCefEvent(record, useRedacted) {
230
+ const vendor = 'Tollgate';
231
+ const product = 'MCP-Security-Proxy';
232
+ const version = '1.0';
233
+ // Signature ID based on action
234
+ const signatureId = this.getCefSignatureId(record);
235
+ // Event name
236
+ const name = `${record.server}:${record.tool} ${record.policyDecision}`;
237
+ // Severity (0-10 scale)
238
+ const severity = this.getCefSeverity(record);
239
+ // CEF extension fields
240
+ const extensions = this.getCefExtensions(record, useRedacted);
241
+ // Escape special characters in CEF fields
242
+ const escapedName = this.escapeCef(name);
243
+ return `CEF:0|${vendor}|${product}|${version}|${signatureId}|${escapedName}|${severity}|${extensions}`;
244
+ }
245
+ /**
246
+ * Gets the CEF signature ID for a record.
247
+ */
248
+ getCefSignatureId(record) {
249
+ const base = record.policyDecision === 'allow' ? '100'
250
+ : record.policyDecision === 'deny' ? '200'
251
+ : '300';
252
+ const risk = record.riskLevel
253
+ ? { safe: '0', read: '1', write: '2', destructive: '3', dangerous: '4' }[record.riskLevel] ?? '9'
254
+ : '9';
255
+ return `${base}${risk}`;
256
+ }
257
+ /**
258
+ * Gets the CEF severity for a record.
259
+ */
260
+ getCefSeverity(record) {
261
+ // Use risk level if available, otherwise use policy decision
262
+ if (record.riskLevel) {
263
+ return CEF_SEVERITY[record.riskLevel] ?? 3;
264
+ }
265
+ return CEF_SEVERITY[record.policyDecision] ?? 3;
266
+ }
267
+ /**
268
+ * Gets CEF extension fields for a record.
269
+ */
270
+ getCefExtensions(record, useRedacted) {
271
+ const extensions = [];
272
+ // Standard CEF fields
273
+ extensions.push(`rt=${record.timestamp.getTime()}`); // Receipt Time
274
+ extensions.push(`src=${record.server}`); // Source
275
+ extensions.push(`act=${record.policyDecision}`); // Action
276
+ // Custom fields
277
+ extensions.push(`cs1=${this.escapeCefValue(record.tool)}`);
278
+ extensions.push(`cs1Label=Tool`);
279
+ if (record.policyRule) {
280
+ extensions.push(`cs2=${this.escapeCefValue(record.policyRule)}`);
281
+ extensions.push(`cs2Label=PolicyRule`);
282
+ }
283
+ if (record.riskLevel) {
284
+ extensions.push(`cs3=${record.riskLevel}`);
285
+ extensions.push(`cs3Label=RiskLevel`);
286
+ }
287
+ if (record.userDecision) {
288
+ extensions.push(`cs4=${record.userDecision}`);
289
+ extensions.push(`cs4Label=UserDecision`);
290
+ }
291
+ if (record.result) {
292
+ extensions.push(`outcome=${record.result === 'success' ? 'Success' : 'Failure'}`);
293
+ }
294
+ if (record.durationMs !== undefined) {
295
+ extensions.push(`cn1=${record.durationMs}`);
296
+ extensions.push(`cn1Label=DurationMs`);
297
+ }
298
+ if (record.correlationId) {
299
+ extensions.push(`externalId=${this.escapeCefValue(record.correlationId)}`);
300
+ }
301
+ // Add args (redacted if requested)
302
+ const args = useRedacted && record.argsRedacted
303
+ ? record.argsRedacted
304
+ : JSON.stringify(record.args);
305
+ extensions.push(`msg=${this.escapeCefValue(args)}`);
306
+ return extensions.join(' ');
307
+ }
308
+ /**
309
+ * Escapes a value for CSV format.
310
+ */
311
+ escapeCsv(value) {
312
+ if (value.includes(',') || value.includes('"') || value.includes('\n')) {
313
+ return `"${value.replace(/"/g, '""')}"`;
314
+ }
315
+ return value;
316
+ }
317
+ /**
318
+ * Escapes a CEF header field (pipe and backslash).
319
+ */
320
+ escapeCef(value) {
321
+ return value.replace(/\\/g, '\\\\').replace(/\|/g, '\\|');
322
+ }
323
+ /**
324
+ * Escapes a CEF extension value (equals and newlines).
325
+ */
326
+ escapeCefValue(value) {
327
+ return value
328
+ .replace(/\\/g, '\\\\')
329
+ .replace(/=/g, '\\=')
330
+ .replace(/\n/g, '\\n')
331
+ .replace(/\r/g, '\\r');
332
+ }
333
+ }
334
+ /**
335
+ * Creates an exporter and exports records in the specified format.
336
+ *
337
+ * @param logger - The audit logger to export from
338
+ * @param format - The export format
339
+ * @param options - Export options
340
+ * @returns Formatted export string
341
+ */
342
+ export function exportAuditRecords(logger, format, options = {}) {
343
+ const exporter = new AuditExporter(logger);
344
+ switch (format) {
345
+ case 'json': {
346
+ // Pretty-printed JSON array
347
+ const records = logger.getRecentCalls({
348
+ limit: options.limit ?? 10000,
349
+ server: options.server,
350
+ since: options.since,
351
+ until: options.until,
352
+ riskLevel: options.riskLevel,
353
+ });
354
+ return JSON.stringify(records, null, 2);
355
+ }
356
+ case 'jsonl':
357
+ return exporter.exportJsonLines(options);
358
+ case 'csv':
359
+ return exporter.exportCsv(options);
360
+ case 'cef':
361
+ return exporter.exportCef(options);
362
+ default:
363
+ throw new Error(`Unsupported export format: ${format}`);
364
+ }
365
+ }
366
+ //# sourceMappingURL=exporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exporter.js","sourceRoot":"","sources":["../../src/audit/exporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAyBH;;GAEG;AACH,MAAM,YAAY,GAA2B;IAC3C,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,WAAW,EAAE,CAAC;IACd,SAAS,EAAE,EAAE;IACb,+BAA+B;IAC/B,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;CACV,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,aAAa;IACJ;IAApB,YAAoB,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAE3C;;;;;;;OAOG;IACH,eAAe,CAAC,UAAyB,EAAE;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC;YACrF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAClE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;oBACxB,IAAI,EAAE,eAAe;oBACrB,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;iBACpC,CAAC,CAAC,CAAC;YACN,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;;;;OAKG;IACH,SAAS,CAAC,UAAyB,EAAE;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC;QAEhD,cAAc;QACd,MAAM,OAAO,GAAG;YACd,IAAI;YACJ,WAAW;YACX,QAAQ;YACR,MAAM;YACN,iBAAiB;YACjB,aAAa;YACb,eAAe;YACf,UAAU;YACV,YAAY;YACZ,eAAe;YACf,QAAQ;YACR,eAAe;YACf,aAAa;YACb,kBAAkB;YAClB,gBAAgB;YAChB,WAAW;YACX,MAAM;SACP,CAAC;QAEF,MAAM,KAAK,GAAa,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAE5C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,WAAW,IAAI,MAAM,CAAC,YAAY;gBAC7C,CAAC,CAAC,MAAM,CAAC,YAAY;gBACrB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEhC,MAAM,GAAG,GAAG;gBACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;gBAC9C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;gBAC7B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;gBAC3B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC;gBACrC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;gBACvC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;gBACzC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;gBACrC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;gBACtC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;gBACzC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;gBACnC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;gBACzC,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACnC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC;gBAC3C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC;gBAC1C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;gBACrC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;aACrB,CAAC;YAEF,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;;;;;;;;OASG;IACH,SAAS,CAAC,UAAyB,EAAE;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC;QAChD,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YACrD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,OAAsB;QACvC,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;YAChC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK,EAAE,wCAAwC;YACvE,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,eAAe,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;SAC7C,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,qBAAqB,CAC3B,MAAmB,EACnB,WAAoB;QAEpB,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE;YACzC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,WAAW,IAAI,MAAM,CAAC,YAAY;gBACtC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC;gBACjC,CAAC,CAAC,MAAM,CAAC,IAAI;YACf,MAAM,EAAE;gBACN,QAAQ,EAAE,MAAM,CAAC,cAAc;gBAC/B,IAAI,EAAE,MAAM,CAAC,UAAU;gBACvB,MAAM,EAAE,MAAM,CAAC,YAAY;aAC5B;YACD,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC1B,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B,CAAC,CAAC,CAAC,SAAS;YACb,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;gBAC9B,QAAQ,EAAE,MAAM,CAAC,YAAY;gBAC7B,cAAc,EAAE,MAAM,CAAC,cAAc;aACtC,CAAC,CAAC,CAAC,SAAS;YACb,MAAM,EAAE;gBACN,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,KAAK,EAAE,MAAM,CAAC,YAAY;gBAC1B,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B;YACD,OAAO,EAAE;gBACP,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,oBAAoB,CAAC,KAAyB;QACpD,OAAO;YACL,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE;YACxC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,WAAW,EAAE;YACzC,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;YAC1C,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;gBACzB,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE;gBACjC,EAAE,EAAE,KAAK,CAAC,SAAS;aACpB,CAAC,CAAC,CAAC,SAAS;SACd,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACK,cAAc,CAAC,MAAmB,EAAE,WAAoB;QAC9D,MAAM,MAAM,GAAG,UAAU,CAAC;QAC1B,MAAM,OAAO,GAAG,oBAAoB,CAAC;QACrC,MAAM,OAAO,GAAG,KAAK,CAAC;QAEtB,+BAA+B;QAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAEnD,aAAa;QACb,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAExE,wBAAwB;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAE7C,uBAAuB;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAE9D,0CAA0C;QAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAEzC,OAAO,SAAS,MAAM,IAAI,OAAO,IAAI,OAAO,IAAI,WAAW,IAAI,WAAW,IAAI,QAAQ,IAAI,UAAU,EAAE,CAAC;IACzG,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,MAAmB;QAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK;YACpD,CAAC,CAAC,MAAM,CAAC,cAAc,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK;gBAC1C,CAAC,CAAC,KAAK,CAAC;QAEV,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS;YAC3B,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG;YACjG,CAAC,CAAC,GAAG,CAAC;QAER,OAAO,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,MAAmB;QACxC,6DAA6D;QAC7D,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,OAAO,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,YAAY,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,MAAmB,EAAE,WAAoB;QAChE,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,sBAAsB;QACtB,UAAU,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe;QACpE,UAAU,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS;QAClD,UAAU,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,SAAS;QAE1D,gBAAgB;QAChB,UAAU,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3D,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAEjC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,UAAU,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YACjE,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,UAAU,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;YAC3C,UAAU,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACxB,UAAU,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;YAC9C,UAAU,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,UAAU,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACpC,UAAU,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;YAC5C,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACzB,UAAU,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC7E,CAAC;QAED,mCAAmC;QACnC,MAAM,IAAI,GAAG,WAAW,IAAI,MAAM,CAAC,YAAY;YAC7C,CAAC,CAAC,MAAM,CAAC,YAAY;YACrB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChC,UAAU,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEpD,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,KAAa;QAC7B,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACvE,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;QAC1C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,KAAa;QAC7B,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,KAAa;QAClC,OAAO,KAAK;aACT,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;aACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;aACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;aACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;CACF;AAOD;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAmB,EACnB,MAAoB,EACpB,UAAyB,EAAE;IAE3B,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IAE3C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,4BAA4B;YAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC;gBACpC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK;gBAC7B,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B,CAAC,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1C,CAAC;QAED,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAE3C,KAAK,KAAK;YACR,OAAO,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAErC,KAAK,KAAK;YACR,OAAO,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAErC;YACE,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,EAAE,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Audit Logger for Tollgate
3
+ *
4
+ * Logs all tool invocations and session grants to SQLite database
5
+ * for compliance, debugging, and analytics.
6
+ *
7
+ * Features:
8
+ * - Schema versioning with automatic migrations
9
+ * - PII redaction for compliance (GDPR, SOC2)
10
+ * - Enhanced metadata for security analysis
11
+ */
12
+ import { type AuditRecord, type SessionGrantRecord, type RiskLevel } from './schema.js';
13
+ import type { ToolCallContext, PolicyDecision } from '../policy/types.js';
14
+ import type { ApprovalResult } from '../approval/types.js';
15
+ import type { SessionGrant } from '../session/types.js';
16
+ import { type RedactionOptions } from './redaction.js';
17
+ /**
18
+ * Options for the AuditLogger.
19
+ */
20
+ export interface AuditLoggerOptions {
21
+ /** Path to the SQLite database file */
22
+ dbPath?: string;
23
+ /** Enable PII redaction (default: true) */
24
+ enableRedaction?: boolean;
25
+ /** PII redaction options */
26
+ redactionOptions?: RedactionOptions;
27
+ /**
28
+ * Store raw (unredacted) args in the database.
29
+ * WARNING: Setting this to true stores PII in the database, which may
30
+ * violate compliance requirements (GDPR, SOC2, HIPAA). Only enable for
31
+ * debugging in non-production environments.
32
+ * Default: false
33
+ */
34
+ storeRawArgs?: boolean;
35
+ }
36
+ /**
37
+ * AuditLogger records all tool calls and session grants to SQLite.
38
+ *
39
+ * Uses WAL mode for concurrent access and prepared statements for performance.
40
+ *
41
+ * @example
42
+ * ```typescript
43
+ * const logger = new AuditLogger();
44
+ *
45
+ * // Log a tool call attempt
46
+ * const id = logger.logAttempt(context, decision);
47
+ *
48
+ * // Later, log the result
49
+ * logger.logResult(id, 'approved', 'success', undefined, 150);
50
+ *
51
+ * // Log a session grant
52
+ * logger.logSessionGrant(grant);
53
+ * ```
54
+ */
55
+ export declare class AuditLogger {
56
+ private db;
57
+ private insertToolCallStmt;
58
+ private updateToolCallStmt;
59
+ private insertSessionGrantStmt;
60
+ private updateSessionGrantUsageStmt;
61
+ private redactor;
62
+ private enableRedaction;
63
+ private storeRawArgs;
64
+ constructor(optionsOrPath?: string | AuditLoggerOptions);
65
+ /**
66
+ * Initializes the database schema with version tracking and migrations.
67
+ */
68
+ private initializeSchema;
69
+ /**
70
+ * Applies migration to version 2 (compliance fields).
71
+ */
72
+ private applyMigrationV2;
73
+ /**
74
+ * Logs a tool call attempt.
75
+ *
76
+ * @param context - The tool call context
77
+ * @param decision - The policy decision
78
+ * @param sessionGrantId - ID of session grant that authorized this call (if any)
79
+ * @param metadata - Additional metadata for the audit record
80
+ * @returns The generated audit record ID
81
+ */
82
+ logAttempt(context: ToolCallContext, decision: PolicyDecision, sessionGrantId?: string, metadata?: {
83
+ correlationId?: string;
84
+ clientId?: string;
85
+ }): string;
86
+ /**
87
+ * Updates a tool call record with the final result.
88
+ *
89
+ * @param id - The audit record ID from logAttempt
90
+ * @param userDecision - The user's approval decision (if prompted)
91
+ * @param result - Whether the tool call succeeded or failed
92
+ * @param errorMessage - Error message (if result is 'error')
93
+ * @param durationMs - Total duration of the tool call
94
+ */
95
+ logResult(id: string, userDecision: ApprovalResult | null, result: 'success' | 'error', errorMessage?: string, durationMs?: number): void;
96
+ /**
97
+ * Logs a new session grant.
98
+ *
99
+ * @param grant - The session grant to log
100
+ */
101
+ logSessionGrant(grant: SessionGrant): void;
102
+ /**
103
+ * Increments the usage count for a session grant.
104
+ *
105
+ * @param grantId - The session grant ID
106
+ */
107
+ logSessionGrantUsage(grantId: string): void;
108
+ /**
109
+ * Marks a session grant as revoked.
110
+ *
111
+ * @param grantId - The session grant ID
112
+ * @param revokedBy - Who revoked it (e.g., 'user', 'timeout', 'policy')
113
+ */
114
+ revokeSessionGrant(grantId: string, revokedBy: string): void;
115
+ /**
116
+ * Gets recent tool calls with optional filtering.
117
+ */
118
+ getRecentCalls(limitOrOptions?: number | {
119
+ limit?: number;
120
+ server?: string;
121
+ since?: Date;
122
+ until?: Date;
123
+ riskLevel?: RiskLevel;
124
+ includeRedacted?: boolean;
125
+ }): AuditRecord[];
126
+ /**
127
+ * Gets active session grants for a server.
128
+ *
129
+ * @param server - Server name to filter by (optional)
130
+ * @returns Array of active grants
131
+ */
132
+ getActiveSessionGrants(server?: string): SessionGrantRecord[];
133
+ /**
134
+ * Gets aggregate statistics for tool calls.
135
+ */
136
+ getStats(): {
137
+ total: number;
138
+ allowed: number;
139
+ denied: number;
140
+ prompted: number;
141
+ sessionAuthorized: number;
142
+ };
143
+ /**
144
+ * Gets session grant statistics.
145
+ */
146
+ getSessionStats(): {
147
+ totalGrants: number;
148
+ activeGrants: number;
149
+ expiredGrants: number;
150
+ revokedGrants: number;
151
+ totalUsage: number;
152
+ };
153
+ /** Closes the database connection. */
154
+ close(): void;
155
+ }
156
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/audit/logger.ts"],"names":[],"mappings":"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"}