{"_id":"@arlopass/audit","name":"@arlopass/audit","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@arlopass/audit","version":"0.1.0","description":"Structured audit event models and exporters for Arlopass decisions","license":"MIT","type":"module","publishConfig":{"access":"public","provenance":true},"repository":{"type":"git","url":"git+https://github.com/arlopass/arlopass.git","directory":"packages/audit"},"homepage":"https://github.com/arlopass/arlopass/tree/main/packages/audit#readme","bugs":{"url":"https://github.com/arlopass/arlopass/issues"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","lint":"eslint \"src/**/*.ts\"","test":"vitest run --passWithNoTests"},"_id":"@arlopass/audit@0.1.0","gitHead":"524008c81190adecca51ec54fbe99d77ebdd056f","_nodeVersion":"22.22.1","_npmVersion":"10.9.4","dist":{"integrity":"sha512-OalXLl6B2t92DUb9voD5xlaUWUfmLqHqchvei+ojwh0H6cw6McD0NheaCAlHaT0FkrN+hkx3Du1vZ7QeWYQsow==","shasum":"99ad901afda5089bc3510ac2a9aec4bd1fcd8797","tarball":"https://registry.npmjs.org/@arlopass/audit/-/audit-0.1.0.tgz","fileCount":18,"unpackedSize":21339,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@arlopass%2faudit@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEMCHz9j/O4fsy8jXdhavUcjjauf+j/MO6A+ihPzAqEnzR4CIE//t4obl3erp3tV+bmm0Mx0S1ly6KIgVVp4YcSP7Bg+"}]},"_npmUser":{"name":"davidszakacs","email":"szakacs_david@hotmail.com"},"directories":{},"maintainers":[{"name":"davidszakacs","email":"szakacs_david@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/audit_0.1.0_1774820850254_0.12433981357690183"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-29T21:47:30.140Z","0.1.0":"2026-03-29T21:47:30.390Z","modified":"2026-03-29T21:47:30.829Z"},"maintainers":[{"name":"davidszakacs","email":"szakacs_david@hotmail.com"}],"description":"Structured audit event models and exporters for Arlopass decisions","homepage":"https://github.com/arlopass/arlopass/tree/main/packages/audit#readme","repository":{"type":"git","url":"git+https://github.com/arlopass/arlopass.git","directory":"packages/audit"},"bugs":{"url":"https://github.com/arlopass/arlopass/issues"},"license":"MIT","readme":"# @arlopass/audit\n\nRecord every Arlopass decision — allow, deny, route, fail — as a structured event for compliance and investigation. Prompts and responses are excluded by default.\n\n```ts\nimport { createAuditEvent, JsonlExporter } from \"@arlopass/audit\";\n\nconst event = createAuditEvent({\n  timestamp: new Date().toISOString(),\n  origin: \"https://app.acme.com\",\n  providerId: \"ollama\",\n  modelId: \"llama3.2\",\n  capability: \"chat.completions\",\n  decision: \"allow\",\n  reasonCode: \"allow\",\n  correlationId: \"req-abc-123\",\n  policyVersion: \"org.acme.v3\",\n});\n\nconst exporter = new JsonlExporter({ filePath: \"./audit.jsonl\" });\nexporter.export(event);\n```\n\n---\n\n## API Reference\n\n### `createAuditEvent(fields: AuditEventFields & { metadata?: Record<string, unknown> }): AuditEvent`\n\nCreate and validate an audit event. Throws `AuditSchemaError` if required fields are missing.\n\n### `validateAuditEvent(candidate: unknown): asserts candidate is AuditEvent`\n\nAssert that a value satisfies the audit event schema.\n\n---\n\n### Audit Event\n\n```ts\ntype AuditEventFields = {\n  timestamp: string;\n  origin: string;\n  providerId: string;\n  modelId: string;\n  capability: string;\n  decision: \"allow\" | \"deny\";\n  reasonCode: string;\n  correlationId: string;\n  policyVersion: string;\n}\n\ntype AuditEvent = AuditEventFields & { metadata?: Record<string, unknown> }\n```\n\n**Required fields** (`REQUIRED_AUDIT_FIELDS`): `timestamp`, `origin`, `providerId`, `modelId`, `capability`, `decision`, `reasonCode`, `correlationId`, `policyVersion`\n\n---\n\n### `JsonlExporter`\n\nWrite audit events as newline-delimited JSON.\n\n```ts\nconst exporter = new JsonlExporter({\n  filePath: \"./audit.jsonl\",\n  filter: (event) => event.decision === \"deny\",\n});\n\nconst result: JsonlExportResult = exporter.export(event);\n// { written: true } or { written: false, filtered: true }\n```\n\n| Constructor Option | Type | Description |\n|-------------------|------|-------------|\n| `filePath` | `string` | Output file path |\n| `filter` | `(event: AuditEvent) => boolean` | Optional event filter |\n\n---\n\n### `OtlpExporter`\n\nConvert audit events to OpenTelemetry log records.\n\n```ts\nconst exporter = new OtlpExporter({\n  emit: (record) => sendToCollector(record),\n  severityResolver: (event) => event.decision === \"deny\" ? \"WARN\" : \"INFO\",\n});\n\nconst result: OtlpExportResult = exporter.export(event);\nconst record: OtlpLogRecord = exporter.toLogRecord(event);\n```\n\n```ts\ntype OtlpLogRecord = {\n  timeUnixNano: string;\n  severityText: \"INFO\" | \"WARN\" | \"ERROR\";\n  body: string;\n  attributes: Record<string, string>;\n}\n```\n\n| Constructor Option | Type | Description |\n|-------------------|------|-------------|\n| `emit` | `(record: OtlpLogRecord) => void` | Callback for emitted records |\n| `severityResolver` | `(event: AuditEvent) => OtlpSeverity` | Override default severity mapping |\n\n---\n\n### Error Classes\n\n**`AuditSchemaError`** — Thrown when required fields are missing.\n\n```ts\nclass AuditSchemaError extends Error {\n  missingFields: string[];\n}\n```\n\n---\n\n### Dependencies\n\nNone.\n","readmeFilename":"README.md","_rev":"1-0085dab5c27f5462d3c76cccf76e9c78"}