Audit Node.js API
The Node.js wrapper provides native JavaScript/TypeScript access to the audit module. It calls into the compiled Go library via N-API, ensuring identical hash computation and chain behavior as the Go implementation.
Installation
npm install @openparallax/auditRequires Node.js 18+. The package includes pre-built binaries for Linux (x86_64, arm64), macOS (x86_64, arm64), and Windows (x86_64).
AuditLogger
import { AuditLogger } from '@openparallax/audit';
const logger = new AuditLogger(path: string);Creates or opens an audit log at the given path. If the file already exists, the logger recovers the chain hash from the last entry.
log
await logger.log(entry: LogEntry): Promise<void>Appends an entry to the audit log with automatic hash chain computation.
interface LogEntry {
eventType: EventType;
actionType?: string;
sessionId?: string;
details?: Record<string, unknown> | string;
otr?: boolean;
source?: string;
}import { AuditLogger, EventType } from '@openparallax/audit';
const logger = new AuditLogger('./audit.jsonl');
await logger.log({
eventType: EventType.ACTION_PROPOSED,
actionType: 'run_command',
sessionId: 'sess-001',
details: { command: 'ls -la', working_dir: '/workspace' },
});
await logger.log({
eventType: EventType.ACTION_EXECUTED,
actionType: 'run_command',
sessionId: 'sess-001',
details: { command: 'ls -la', exit_code: 0 },
});
await logger.close();close
await logger.close(): Promise<void>Flushes and closes the audit log file. The logger should not be used after calling close.
EventType
import { EventType } from '@openparallax/audit';
EventType.ACTION_PROPOSED // 1
EventType.ACTION_EVALUATED // 2
EventType.ACTION_APPROVED // 3
EventType.ACTION_BLOCKED // 4
EventType.ACTION_EXECUTED // 5
EventType.ACTION_FAILED // 6
EventType.SHIELD_ERROR // 7
EventType.CANARY_VERIFIED // 8
EventType.CANARY_MISSING // 9
EventType.RATE_LIMIT_HIT // 10
EventType.BUDGET_EXHAUSTED // 11
EventType.SELF_PROTECTION // 12
EventType.TRANSACTION_BEGIN // 13
EventType.TRANSACTION_COMMIT // 14
EventType.TRANSACTION_ROLLBACK // 15
EventType.INTEGRITY_VIOLATION // 16
EventType.SESSION_STARTED // 17
EventType.SESSION_ENDED // 18
EventType.CONFIG_CHANGED // 19
EventType.IFC_CLASSIFIED // 20
EventType.CHRONICLE_SNAPSHOT // 21
EventType.CHRONICLE_SNAPSHOT_FAILED // 22
EventType.SANDBOX_CANARY_RESULT // 23verifyIntegrity
import { verifyIntegrity } from '@openparallax/audit';
const result = await verifyIntegrity(path: string): Promise<VerifyResult>Reads the entire audit log and checks the hash chain.
interface VerifyResult {
valid: boolean;
entries: number; // Total entries checked
line: number; // Line of first violation (0 if valid)
error: string; // Description of violation (empty if valid)
}const result = await verifyIntegrity('./audit.jsonl');
if (!result.valid) {
console.error(`Tampered at line ${result.line}: ${result.error}`);
}readEntries
import { readEntries } from '@openparallax/audit';
const entries = await readEntries(path: string, query?: Query): Promise<AuditEntry[]>Reads audit entries from the JSONL file in reverse chronological order (most recent first).
Query
interface Query {
sessionId?: string; // Filter by session
eventType?: EventType; // Filter by event type
limit?: number; // Maximum entries to return
}AuditEntry
interface AuditEntry {
id: string;
eventType: EventType;
timestamp: number; // Unix milliseconds
sessionId: string;
actionType: string;
details: Record<string, unknown>; // Parsed from details_json
previousHash: string;
hash: string;
otr: boolean;
source: string;
}Examples
// Most recent 10 entries.
const entries = await readEntries('./audit.jsonl', { limit: 10 });
// All blocked actions in a session.
const blocked = await readEntries('./audit.jsonl', {
sessionId: 'sess-001',
eventType: EventType.ACTION_BLOCKED,
});
// Iterate over results.
for (const entry of entries) {
console.log(`${entry.actionType}: ${JSON.stringify(entry.details)}`);
}Error Handling
All functions throw AuditError on failure:
import { AuditError } from '@openparallax/audit';
try {
const logger = new AuditLogger('/nonexistent/path/audit.jsonl');
} catch (err) {
if (err instanceof AuditError) {
console.error(`Audit error: ${err.message}`);
}
}TypeScript Support
The package ships with full TypeScript declarations. All types are exported from the main entry point:
import type { AuditEntry, LogEntry, Query, VerifyResult } from '@openparallax/audit';