opena2a-cli 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/README.md +227 -3
  2. package/dist/adapters/registry.js +1 -1
  3. package/dist/adapters/registry.js.map +1 -1
  4. package/dist/commands/guard-hooks.d.ts +27 -0
  5. package/dist/commands/guard-hooks.d.ts.map +1 -0
  6. package/dist/commands/guard-hooks.js +207 -0
  7. package/dist/commands/guard-hooks.js.map +1 -0
  8. package/dist/commands/guard-policy.d.ts +54 -0
  9. package/dist/commands/guard-policy.d.ts.map +1 -0
  10. package/dist/commands/guard-policy.js +251 -0
  11. package/dist/commands/guard-policy.js.map +1 -0
  12. package/dist/commands/guard-signing.d.ts +52 -0
  13. package/dist/commands/guard-signing.d.ts.map +1 -0
  14. package/dist/commands/guard-signing.js +185 -0
  15. package/dist/commands/guard-signing.js.map +1 -0
  16. package/dist/commands/guard-snapshots.d.ts +54 -0
  17. package/dist/commands/guard-snapshots.d.ts.map +1 -0
  18. package/dist/commands/guard-snapshots.js +346 -0
  19. package/dist/commands/guard-snapshots.js.map +1 -0
  20. package/dist/commands/guard.d.ts +60 -4
  21. package/dist/commands/guard.d.ts.map +1 -1
  22. package/dist/commands/guard.js +475 -95
  23. package/dist/commands/guard.js.map +1 -1
  24. package/dist/commands/init.d.ts.map +1 -1
  25. package/dist/commands/init.js +77 -3
  26. package/dist/commands/init.js.map +1 -1
  27. package/dist/commands/protect.d.ts +2 -0
  28. package/dist/commands/protect.d.ts.map +1 -1
  29. package/dist/commands/protect.js +56 -10
  30. package/dist/commands/protect.js.map +1 -1
  31. package/dist/commands/runtime.d.ts +1 -1
  32. package/dist/commands/runtime.js +5 -5
  33. package/dist/commands/runtime.js.map +1 -1
  34. package/dist/commands/self-register.js +6 -6
  35. package/dist/commands/self-register.js.map +1 -1
  36. package/dist/commands/shield.d.ts +39 -0
  37. package/dist/commands/shield.d.ts.map +1 -0
  38. package/dist/commands/shield.js +1262 -0
  39. package/dist/commands/shield.js.map +1 -0
  40. package/dist/commands/verify.js +1 -1
  41. package/dist/commands/verify.js.map +1 -1
  42. package/dist/index.js +41 -3
  43. package/dist/index.js.map +1 -1
  44. package/dist/router.d.ts.map +1 -1
  45. package/dist/router.js +1 -0
  46. package/dist/router.js.map +1 -1
  47. package/dist/shield/arp-bridge.d.ts +62 -0
  48. package/dist/shield/arp-bridge.d.ts.map +1 -0
  49. package/dist/shield/arp-bridge.js +198 -0
  50. package/dist/shield/arp-bridge.js.map +1 -0
  51. package/dist/shield/baselines.d.ts +58 -0
  52. package/dist/shield/baselines.d.ts.map +1 -0
  53. package/dist/shield/baselines.js +371 -0
  54. package/dist/shield/baselines.js.map +1 -0
  55. package/dist/shield/detect.d.ts +18 -0
  56. package/dist/shield/detect.d.ts.map +1 -0
  57. package/dist/shield/detect.js +402 -0
  58. package/dist/shield/detect.js.map +1 -0
  59. package/dist/shield/events.d.ts +65 -0
  60. package/dist/shield/events.d.ts.map +1 -0
  61. package/dist/shield/events.js +342 -0
  62. package/dist/shield/events.js.map +1 -0
  63. package/dist/shield/findings.d.ts +52 -0
  64. package/dist/shield/findings.d.ts.map +1 -0
  65. package/dist/shield/findings.js +336 -0
  66. package/dist/shield/findings.js.map +1 -0
  67. package/dist/shield/init.d.ts +22 -0
  68. package/dist/shield/init.d.ts.map +1 -0
  69. package/dist/shield/init.js +290 -0
  70. package/dist/shield/init.js.map +1 -0
  71. package/dist/shield/integrity.d.ts +75 -0
  72. package/dist/shield/integrity.d.ts.map +1 -0
  73. package/dist/shield/integrity.js +439 -0
  74. package/dist/shield/integrity.js.map +1 -0
  75. package/dist/shield/llm-backend.d.ts +36 -0
  76. package/dist/shield/llm-backend.d.ts.map +1 -0
  77. package/dist/shield/llm-backend.js +145 -0
  78. package/dist/shield/llm-backend.js.map +1 -0
  79. package/dist/shield/llm.d.ts +116 -0
  80. package/dist/shield/llm.d.ts.map +1 -0
  81. package/dist/shield/llm.js +536 -0
  82. package/dist/shield/llm.js.map +1 -0
  83. package/dist/shield/policy.d.ts +70 -0
  84. package/dist/shield/policy.d.ts.map +1 -0
  85. package/dist/shield/policy.js +399 -0
  86. package/dist/shield/policy.js.map +1 -0
  87. package/dist/shield/report-html.d.ts +29 -0
  88. package/dist/shield/report-html.d.ts.map +1 -0
  89. package/dist/shield/report-html.js +596 -0
  90. package/dist/shield/report-html.js.map +1 -0
  91. package/dist/shield/sarif.d.ts +65 -0
  92. package/dist/shield/sarif.d.ts.map +1 -0
  93. package/dist/shield/sarif.js +108 -0
  94. package/dist/shield/sarif.js.map +1 -0
  95. package/dist/shield/session.d.ts +63 -0
  96. package/dist/shield/session.d.ts.map +1 -0
  97. package/dist/shield/session.js +242 -0
  98. package/dist/shield/session.js.map +1 -0
  99. package/dist/shield/signing.d.ts +41 -0
  100. package/dist/shield/signing.d.ts.map +1 -0
  101. package/dist/shield/signing.js +161 -0
  102. package/dist/shield/signing.js.map +1 -0
  103. package/dist/shield/status.d.ts +4 -0
  104. package/dist/shield/status.d.ts.map +1 -0
  105. package/dist/shield/status.js +241 -0
  106. package/dist/shield/status.js.map +1 -0
  107. package/dist/shield/types.d.ts +416 -0
  108. package/dist/shield/types.d.ts.map +1 -0
  109. package/dist/shield/types.js +32 -0
  110. package/dist/shield/types.js.map +1 -0
  111. package/dist/util/drift-liveness.d.ts +37 -0
  112. package/dist/util/drift-liveness.d.ts.map +1 -0
  113. package/dist/util/drift-liveness.js +114 -0
  114. package/dist/util/drift-liveness.js.map +1 -0
  115. package/dist/util/drift-verification.d.ts +60 -0
  116. package/dist/util/drift-verification.d.ts.map +1 -0
  117. package/dist/util/drift-verification.js +457 -0
  118. package/dist/util/drift-verification.js.map +1 -0
  119. package/package.json +4 -2
@@ -0,0 +1,402 @@
1
+ "use strict";
2
+ /**
3
+ * Shield environment detection.
4
+ *
5
+ * Scans the developer workstation for CLIs, AI coding assistants,
6
+ * MCP server configurations, and active OAuth sessions. All detection
7
+ * is synchronous so the result can be used during CLI startup without
8
+ * awaiting promises.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.detectEnvironment = detectEnvironment;
12
+ const node_fs_1 = require("node:fs");
13
+ const node_child_process_1 = require("node:child_process");
14
+ const node_os_1 = require("node:os");
15
+ const node_path_1 = require("node:path");
16
+ const detect_js_1 = require("../util/detect.js");
17
+ // ---------------------------------------------------------------------------
18
+ // Helpers
19
+ // ---------------------------------------------------------------------------
20
+ /** Run a command silently and return trimmed stdout, or null on failure. */
21
+ function tryExec(cmd) {
22
+ try {
23
+ return (0, node_child_process_1.execSync)(cmd, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ }
29
+ /** Run a binary with args without shell interpretation (safe from injection). */
30
+ function tryExecFile(binary, args) {
31
+ try {
32
+ return (0, node_child_process_1.execFileSync)(binary, args, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
33
+ }
34
+ catch {
35
+ return null;
36
+ }
37
+ }
38
+ /** Read a JSON file and return the parsed object, or null on failure. */
39
+ function readJson(filePath) {
40
+ try {
41
+ if (!(0, node_fs_1.existsSync)(filePath))
42
+ return null;
43
+ const raw = (0, node_fs_1.readFileSync)(filePath, 'utf-8');
44
+ return JSON.parse(raw);
45
+ }
46
+ catch {
47
+ return null;
48
+ }
49
+ }
50
+ /** Return ISO-8601 mtime string for a file, or null if unreadable. */
51
+ function fileMtime(filePath) {
52
+ try {
53
+ return (0, node_fs_1.statSync)(filePath).mtime.toISOString();
54
+ }
55
+ catch {
56
+ return null;
57
+ }
58
+ }
59
+ const CLI_SPECS = [
60
+ {
61
+ name: 'aws',
62
+ binary: 'aws',
63
+ versionFlag: '--version',
64
+ configDir: (0, node_path_1.join)((0, node_os_1.homedir)(), '.aws'),
65
+ credentialFiles: ['credentials', 'sso/cache'],
66
+ },
67
+ {
68
+ name: 'az',
69
+ binary: 'az',
70
+ versionFlag: '--version',
71
+ configDir: (0, node_path_1.join)((0, node_os_1.homedir)(), '.azure'),
72
+ credentialFiles: ['msal_token_cache.json', 'accessTokens.json'],
73
+ },
74
+ {
75
+ name: 'gcloud',
76
+ binary: 'gcloud',
77
+ versionFlag: '--version',
78
+ configDir: (0, node_path_1.join)((0, node_os_1.homedir)(), '.config', 'gcloud'),
79
+ credentialFiles: ['application_default_credentials.json', 'credentials.db'],
80
+ },
81
+ {
82
+ name: 'vercel',
83
+ binary: 'vercel',
84
+ versionFlag: '--version',
85
+ configDir: (0, node_path_1.join)((0, node_os_1.homedir)(), '.vercel'),
86
+ credentialFiles: ['auth.json'],
87
+ },
88
+ {
89
+ name: 'gh',
90
+ binary: 'gh',
91
+ versionFlag: '--version',
92
+ configDir: (0, node_path_1.join)((0, node_os_1.homedir)(), '.config', 'gh'),
93
+ credentialFiles: ['hosts.yml'],
94
+ },
95
+ {
96
+ name: 'kubectl',
97
+ binary: 'kubectl',
98
+ versionFlag: 'version --client --short',
99
+ configDir: (0, node_path_1.join)((0, node_os_1.homedir)(), '.kube'),
100
+ credentialFiles: ['config'],
101
+ },
102
+ {
103
+ name: 'terraform',
104
+ binary: 'terraform',
105
+ versionFlag: '--version',
106
+ configDir: (0, node_path_1.join)((0, node_os_1.homedir)(), '.terraform.d'),
107
+ credentialFiles: ['credentials.tfrc.json'],
108
+ },
109
+ ];
110
+ function detectClis() {
111
+ const results = [];
112
+ for (const spec of CLI_SPECS) {
113
+ const binaryPath = tryExecFile('which', [spec.binary]);
114
+ if (!binaryPath)
115
+ continue;
116
+ // Extract version string -- take only the first line to keep it concise
117
+ let version = null;
118
+ const rawVersion = tryExecFile(spec.binary, spec.versionFlag.split(/\s+/));
119
+ if (rawVersion) {
120
+ version = rawVersion.split('\n')[0].trim();
121
+ }
122
+ const configDirExists = (0, node_fs_1.existsSync)(spec.configDir);
123
+ const hasCredentials = configDirExists && spec.credentialFiles.some(f => (0, node_fs_1.existsSync)((0, node_path_1.join)(spec.configDir, f)));
124
+ results.push({
125
+ name: spec.name,
126
+ path: binaryPath,
127
+ version,
128
+ configDir: configDirExists ? spec.configDir : null,
129
+ hasCredentials,
130
+ });
131
+ }
132
+ return results;
133
+ }
134
+ const ASSISTANT_SPECS = [
135
+ {
136
+ name: 'Claude Code',
137
+ envVars: ['CLAUDE_CODE'],
138
+ configDirs: [(0, node_path_1.join)((0, node_os_1.homedir)(), '.claude')],
139
+ processEnv: 'TERM_PROGRAM',
140
+ },
141
+ {
142
+ name: 'Cursor',
143
+ envVars: ['CURSOR'],
144
+ configDirs: [(0, node_path_1.join)((0, node_os_1.homedir)(), '.cursor')],
145
+ },
146
+ {
147
+ name: 'GitHub Copilot',
148
+ envVars: ['GITHUB_COPILOT'],
149
+ configDirs: [(0, node_path_1.join)((0, node_os_1.homedir)(), '.config', 'github-copilot')],
150
+ },
151
+ {
152
+ name: 'Windsurf',
153
+ envVars: [],
154
+ configDirs: [(0, node_path_1.join)((0, node_os_1.homedir)(), '.windsurf')],
155
+ },
156
+ {
157
+ name: 'Aider',
158
+ envVars: ['AIDER'],
159
+ configDirs: [],
160
+ },
161
+ ];
162
+ function detectAssistants(targetDir) {
163
+ const results = [];
164
+ for (const spec of ASSISTANT_SPECS) {
165
+ let detected = false;
166
+ let method = 'config';
167
+ let detail = '';
168
+ const configPaths = [];
169
+ // Check process-level env (TERM_PROGRAM for Claude Code)
170
+ if (spec.name === 'Claude Code' && process.env['TERM_PROGRAM'] === 'claude') {
171
+ detected = true;
172
+ method = 'process';
173
+ detail = 'TERM_PROGRAM=claude';
174
+ }
175
+ // Check env vars
176
+ if (!detected) {
177
+ for (const envVar of spec.envVars) {
178
+ if (process.env[envVar]) {
179
+ detected = true;
180
+ method = 'env';
181
+ detail = `${envVar} is set`;
182
+ break;
183
+ }
184
+ }
185
+ }
186
+ // Check config directories
187
+ for (const dir of spec.configDirs) {
188
+ if ((0, node_fs_1.existsSync)(dir)) {
189
+ if (!detected) {
190
+ detected = true;
191
+ method = 'config';
192
+ detail = `Config directory found: ${dir}`;
193
+ }
194
+ configPaths.push(dir);
195
+ }
196
+ }
197
+ // Aider: also check for .aider* files in the target directory
198
+ if (spec.name === 'Aider') {
199
+ const aiderConfFiles = ['.aider.conf.yml', '.aider.model.settings.yml', '.aider.input.history'];
200
+ for (const f of aiderConfFiles) {
201
+ const p = (0, node_path_1.join)(targetDir, f);
202
+ if ((0, node_fs_1.existsSync)(p)) {
203
+ if (!detected) {
204
+ detected = true;
205
+ method = 'config';
206
+ detail = `Aider config found: ${f}`;
207
+ }
208
+ configPaths.push(p);
209
+ }
210
+ }
211
+ }
212
+ if (detected) {
213
+ results.push({ name: spec.name, detected, method, detail, configPaths });
214
+ }
215
+ }
216
+ return results;
217
+ }
218
+ // ---------------------------------------------------------------------------
219
+ // MCP server detection
220
+ // ---------------------------------------------------------------------------
221
+ /** Paths (relative to project and home) that may contain mcpServers config. */
222
+ function mcpConfigPaths(targetDir) {
223
+ return [
224
+ { label: 'mcp.json', path: (0, node_path_1.join)(targetDir, 'mcp.json') },
225
+ { label: '.mcp.json', path: (0, node_path_1.join)(targetDir, '.mcp.json') },
226
+ { label: '.claude/settings.json', path: (0, node_path_1.join)(targetDir, '.claude', 'settings.json') },
227
+ { label: '.cursor/mcp.json', path: (0, node_path_1.join)(targetDir, '.cursor', 'mcp.json') },
228
+ { label: '~/.claude/settings.json', path: (0, node_path_1.join)((0, node_os_1.homedir)(), '.claude', 'settings.json') },
229
+ ];
230
+ }
231
+ /** Redact values that look like environment variable references or secrets. */
232
+ function redactEnv(env) {
233
+ const redacted = {};
234
+ for (const [key, value] of Object.entries(env)) {
235
+ if (typeof value === 'string' && value.length > 0) {
236
+ redacted[key] = '[REDACTED]';
237
+ }
238
+ else {
239
+ redacted[key] = String(value ?? '');
240
+ }
241
+ }
242
+ return redacted;
243
+ }
244
+ function detectMcpServers(targetDir) {
245
+ const results = [];
246
+ const seen = new Set();
247
+ for (const { label, path: cfgPath } of mcpConfigPaths(targetDir)) {
248
+ const data = readJson(cfgPath);
249
+ if (!data)
250
+ continue;
251
+ const servers = data['mcpServers'];
252
+ if (!servers || typeof servers !== 'object')
253
+ continue;
254
+ for (const [name, raw] of Object.entries(servers)) {
255
+ // Deduplicate by server name per source file
256
+ const dedupeKey = `${label}:${name}`;
257
+ if (seen.has(dedupeKey))
258
+ continue;
259
+ seen.add(dedupeKey);
260
+ if (!raw || typeof raw !== 'object')
261
+ continue;
262
+ const entry = raw;
263
+ const command = typeof entry['command'] === 'string' ? entry['command'] : '';
264
+ const args = Array.isArray(entry['args'])
265
+ ? entry['args'].map(a => String(a))
266
+ : [];
267
+ const env = entry['env'] && typeof entry['env'] === 'object'
268
+ ? redactEnv(entry['env'])
269
+ : {};
270
+ results.push({
271
+ name,
272
+ source: label,
273
+ command,
274
+ args,
275
+ env,
276
+ tools: [], // Tool enumeration requires MCP handshake; left empty during static scan
277
+ });
278
+ }
279
+ }
280
+ return results;
281
+ }
282
+ function buildOAuthSpecs(detectedClis) {
283
+ const specs = [];
284
+ for (const cli of detectedClis) {
285
+ if (!cli.configDir)
286
+ continue;
287
+ switch (cli.name) {
288
+ case 'aws':
289
+ specs.push({
290
+ provider: 'aws',
291
+ configDir: cli.configDir,
292
+ credentialFiles: ['credentials', 'sso/cache'],
293
+ });
294
+ break;
295
+ case 'az':
296
+ specs.push({
297
+ provider: 'azure',
298
+ configDir: cli.configDir,
299
+ credentialFiles: ['msal_token_cache.json', 'accessTokens.json'],
300
+ });
301
+ break;
302
+ case 'gcloud':
303
+ specs.push({
304
+ provider: 'gcp',
305
+ configDir: cli.configDir,
306
+ credentialFiles: ['application_default_credentials.json', 'credentials.db'],
307
+ });
308
+ break;
309
+ case 'gh':
310
+ specs.push({
311
+ provider: 'github',
312
+ configDir: cli.configDir,
313
+ credentialFiles: ['hosts.yml'],
314
+ });
315
+ break;
316
+ case 'vercel':
317
+ specs.push({
318
+ provider: 'vercel',
319
+ configDir: cli.configDir,
320
+ credentialFiles: ['auth.json'],
321
+ });
322
+ break;
323
+ case 'kubectl':
324
+ specs.push({
325
+ provider: 'kubernetes',
326
+ configDir: cli.configDir,
327
+ credentialFiles: ['config'],
328
+ });
329
+ break;
330
+ case 'terraform':
331
+ specs.push({
332
+ provider: 'terraform',
333
+ configDir: cli.configDir,
334
+ credentialFiles: ['credentials.tfrc.json'],
335
+ });
336
+ break;
337
+ }
338
+ }
339
+ return specs;
340
+ }
341
+ function detectOAuthSessions(detectedClis) {
342
+ const results = [];
343
+ const specs = buildOAuthSpecs(detectedClis);
344
+ for (const spec of specs) {
345
+ let hasActiveSession = false;
346
+ let latestMtime = null;
347
+ for (const credFile of spec.credentialFiles) {
348
+ const fullPath = (0, node_path_1.join)(spec.configDir, credFile);
349
+ if (!(0, node_fs_1.existsSync)(fullPath))
350
+ continue;
351
+ hasActiveSession = true;
352
+ const mtime = fileMtime(fullPath);
353
+ if (mtime && (!latestMtime || mtime > latestMtime)) {
354
+ latestMtime = mtime;
355
+ }
356
+ }
357
+ results.push({
358
+ provider: spec.provider,
359
+ configDir: spec.configDir,
360
+ hasActiveSession,
361
+ lastModified: latestMtime,
362
+ scopes: [], // Scope extraction would require parsing provider-specific token formats
363
+ });
364
+ }
365
+ return results;
366
+ }
367
+ // ---------------------------------------------------------------------------
368
+ // Public API
369
+ // ---------------------------------------------------------------------------
370
+ /**
371
+ * Scan the current developer workstation and project directory for
372
+ * CLIs, AI assistants, MCP servers, and OAuth sessions.
373
+ *
374
+ * @param targetDir - Directory to scan for project-level artifacts.
375
+ * Defaults to `process.cwd()`.
376
+ */
377
+ function detectEnvironment(targetDir) {
378
+ const dir = (0, node_path_1.resolve)(targetDir ?? process.cwd());
379
+ // CLI detection
380
+ const clis = detectClis();
381
+ // Assistant detection
382
+ const assistants = detectAssistants(dir);
383
+ // MCP server detection
384
+ const mcpServers = detectMcpServers(dir);
385
+ // OAuth session detection (depends on detected CLIs)
386
+ const oauthSessions = detectOAuthSessions(clis);
387
+ // Project detection (reuse existing utility)
388
+ const project = (0, detect_js_1.detectProject)(dir);
389
+ return {
390
+ timestamp: new Date().toISOString(),
391
+ hostname: (0, node_os_1.hostname)(),
392
+ platform: (0, node_os_1.platform)(),
393
+ shell: process.env['SHELL'] ?? 'unknown',
394
+ clis,
395
+ assistants,
396
+ mcpServers,
397
+ oauthSessions,
398
+ projectType: project.type,
399
+ projectName: project.name,
400
+ };
401
+ }
402
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/shield/detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Shield tamper-evident event system.
3
+ *
4
+ * Events are stored as newline-delimited JSON (JSONL) with SHA-256 hash
5
+ * chains. Each event references the hash of the previous event, forming
6
+ * an append-only tamper-evident log. The very first event in the chain
7
+ * uses SHA-256("genesis") as its prevHash.
8
+ */
9
+ import type { ShieldEvent } from './types.js';
10
+ /**
11
+ * Generate a UUIDv7 (time-sortable) per RFC 9562.
12
+ *
13
+ * Layout (128 bits):
14
+ * 48 bits - unix_ts_ms
15
+ * 4 bits - version (0b0111)
16
+ * 12 bits - rand_a
17
+ * 2 bits - variant (0b10)
18
+ * 62 bits - rand_b
19
+ */
20
+ export declare function uuidv7(): string;
21
+ /** Return the absolute path to the Shield data directory (~/.opena2a/shield). */
22
+ export declare function getShieldDir(): string;
23
+ /** Return the absolute path to the events JSONL file. */
24
+ export declare function getEventsPath(): string;
25
+ export declare const GENESIS_HASH: string;
26
+ /** Fields that writeEvent generates automatically. */
27
+ type GeneratedFields = 'id' | 'timestamp' | 'version' | 'prevHash' | 'eventHash';
28
+ /**
29
+ * Write a new event to the tamper-evident log.
30
+ *
31
+ * The caller provides all event fields except id, timestamp, version,
32
+ * prevHash, and eventHash -- those are generated automatically.
33
+ */
34
+ export declare function writeEvent(partial: Omit<ShieldEvent, GeneratedFields>): ShieldEvent;
35
+ export interface EventFilters {
36
+ count?: number;
37
+ source?: string;
38
+ severity?: string;
39
+ agent?: string;
40
+ since?: string;
41
+ category?: string;
42
+ }
43
+ /**
44
+ * Read events from the JSONL log file, applying optional filters.
45
+ *
46
+ * Returns events in newest-first order. Corrupted JSON lines are
47
+ * silently skipped.
48
+ */
49
+ export declare function readEvents(filters?: EventFilters): ShieldEvent[];
50
+ /**
51
+ * Verify the integrity of a hash chain.
52
+ *
53
+ * Events must be provided in chronological order (oldest first).
54
+ * The first event's prevHash must equal SHA-256("genesis").
55
+ *
56
+ * Returns { valid: true, brokenAt: null } if the chain is intact,
57
+ * or { valid: false, brokenAt: <index> } pointing to the first
58
+ * event where the chain breaks.
59
+ */
60
+ export declare function verifyEventChain(events: ShieldEvent[]): {
61
+ valid: boolean;
62
+ brokenAt: number | null;
63
+ };
64
+ export {};
65
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/shield/events.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAeH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAO9C;;;;;;;;;GASG;AACH,wBAAgB,MAAM,IAAI,MAAM,CAmC/B;AAMD,iFAAiF;AACjF,wBAAgB,YAAY,IAAI,MAAM,CAMrC;AAED,yDAAyD;AACzD,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAMD,eAAO,MAAM,YAAY,QAAuD,CAAC;AA6EjF,sDAAsD;AACtD,KAAK,eAAe,GAAG,IAAI,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;AAEjF;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,GAAG,WAAW,CAuCnF;AAMD,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA8CD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,YAAiB,GAAG,WAAW,EAAE,CAuEpE;AAMD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,WAAW,EAAE,GACpB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CA6B7C"}