[{"data":1,"prerenderedAt":3055},["ShallowReactive",2],{"navigation_docs":3,"-use-cases-audit-overview":515,"-use-cases-audit-overview-surround":3050},[4,30,80,123,298,430,485],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Start","\u002Fstart","1.start",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fstart\u002Fintroduction","1.start\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Why start with evlog","\u002Fstart\u002Fwhy-evlog","1.start\u002F2.why-evlog","i-lucide-rocket",{"title":20,"path":21,"stem":22,"icon":23},"Installation","\u002Fstart\u002Finstallation","1.start\u002F3.installation","i-lucide-download",{"title":25,"path":26,"stem":27,"icon":28},"Quick Start","\u002Fstart\u002Fquick-start","1.start\u002F4.quick-start","i-lucide-zap",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Learn","\u002Flearn","2.learn",[35,40,45,50,55,60,65,70,75],{"title":36,"path":37,"stem":38,"icon":39},"Overview","\u002Flearn\u002Foverview","2.learn\u002F0.overview","i-lucide-list",{"title":41,"path":42,"stem":43,"icon":44},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":46,"path":47,"stem":48,"icon":49},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":51,"path":52,"stem":53,"icon":54},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":56,"path":57,"stem":58,"icon":59},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":61,"path":62,"stem":63,"icon":64},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling","i-lucide-filter",{"title":66,"path":67,"stem":68,"icon":69},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":71,"path":72,"stem":73,"icon":74},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":76,"path":77,"stem":78,"icon":79},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs","i-lucide-book-open",{"title":81,"path":82,"stem":83,"children":84,"page":29},"CLI","\u002Fcli","3.cli",[85,88,93,98,103,108,113,118],{"title":36,"path":86,"stem":87,"icon":44},"\u002Fcli\u002Foverview","3.cli\u002F0.overview",{"title":89,"path":90,"stem":91,"icon":92},"init","\u002Fcli\u002Finit","3.cli\u002F1.init","i-lucide-wand-sparkles",{"title":94,"path":95,"stem":96,"icon":97},"map","\u002Fcli\u002Fmap","3.cli\u002F2.map","i-lucide-radar",{"title":99,"path":100,"stem":101,"icon":102},"Rules","\u002Fcli\u002Frules","3.cli\u002F3.rules","i-lucide-list-checks",{"title":104,"path":105,"stem":106,"icon":107},"Scoring","\u002Fcli\u002Fscoring","3.cli\u002F4.scoring","i-lucide-gauge",{"title":109,"path":110,"stem":111,"icon":112},"CI","\u002Fcli\u002Fci","3.cli\u002F5.ci","i-lucide-git-pull-request",{"title":114,"path":115,"stem":116,"icon":117},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F6.doctor","i-lucide-stethoscope",{"title":119,"path":120,"stem":121,"icon":122},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F7.telemetry","i-lucide-bar-chart-3",{"title":124,"path":125,"stem":126,"children":127,"page":29},"Integrate","\u002Fintegrate","4.integrate",[128,132,210],{"title":36,"path":129,"stem":130,"icon":131},"\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":133,"path":134,"stem":135,"children":136,"page":29},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[137,140,180,190],{"title":36,"path":138,"stem":139,"icon":39},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview",{"title":141,"path":142,"stem":143,"children":144,"page":29},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[145,150,155,160,165,170,175],{"title":146,"path":147,"stem":148,"icon":149},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":151,"path":152,"stem":153,"icon":154},"OTLP","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fotlp","4.integrate\u002Fadapters\u002Fcloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":156,"path":157,"stem":158,"icon":159},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F03.posthog","i-simple-icons-posthog",{"title":161,"path":162,"stem":163,"icon":164},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F04.sentry","i-simple-icons-sentry",{"title":166,"path":167,"stem":168,"icon":169},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":171,"path":172,"stem":173,"icon":174},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F06.datadog","i-simple-icons-datadog",{"title":176,"path":177,"stem":178,"icon":179},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fhyperdx","4.integrate\u002Fadapters\u002Fcloud\u002F07.hyperdx","i-custom-hyperdx",{"title":181,"path":182,"stem":183,"children":184,"page":29},"Cloud or Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fhybrid","4.integrate\u002Fadapters\u002Fhybrid",[185],{"title":186,"path":187,"stem":188,"icon":189},"Grafana Loki","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Floki","4.integrate\u002Fadapters\u002Fhybrid\u002F01.loki","i-simple-icons-grafana",{"title":191,"path":192,"stem":193,"children":194,"page":29},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[195,200,205],{"title":196,"path":197,"stem":198,"icon":199},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":201,"path":202,"stem":203,"icon":204},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":206,"path":207,"stem":208,"icon":209},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":211,"path":212,"stem":213,"children":214,"page":29},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[215,219,224,229,234,239,244,249,254,259,264,269,274,279,283,288,293],{"title":36,"path":216,"stem":217,"icon":218},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":220,"path":221,"stem":222,"icon":223},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":225,"path":226,"stem":227,"icon":228},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":230,"path":231,"stem":232,"icon":233},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":235,"path":236,"stem":237,"icon":238},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":240,"path":241,"stem":242,"icon":243},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":245,"path":246,"stem":247,"icon":248},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":250,"path":251,"stem":252,"icon":253},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":255,"path":256,"stem":257,"icon":258},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":260,"path":261,"stem":262,"icon":263},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":265,"path":266,"stem":267,"icon":268},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":270,"path":271,"stem":272,"icon":273},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":275,"path":276,"stem":277,"icon":278},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":280,"path":281,"stem":282,"icon":74},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":284,"path":285,"stem":286,"icon":287},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":289,"path":290,"stem":291,"icon":292},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":294,"path":295,"stem":296,"icon":297},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":299,"path":300,"stem":301,"children":302,"page":29},"Use Cases","\u002Fuse-cases","5.use-cases",[303,306,311,340,367,399,420,425],{"title":36,"path":304,"stem":305,"icon":102},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":307,"path":308,"stem":309,"icon":310},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":312,"icon":313,"path":314,"stem":315,"children":316,"page":29},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[317,320,325,330,335],{"title":36,"path":318,"stem":319,"icon":39},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":321,"path":322,"stem":323,"icon":324},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":326,"path":327,"stem":328,"icon":329},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":331,"path":332,"stem":333,"icon":334},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":336,"path":337,"stem":338,"icon":339},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":341,"icon":342,"path":343,"stem":344,"children":345,"page":29},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[346,349,354,359,363],{"title":36,"path":347,"stem":348,"icon":39},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":350,"path":351,"stem":352,"icon":353},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":355,"path":356,"stem":357,"icon":358},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":360,"path":361,"stem":362,"icon":310},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":364,"path":365,"stem":366,"icon":107},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance",{"title":368,"icon":369,"path":370,"stem":371,"children":372,"page":29},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[373,376,381,386,391,395],{"title":36,"path":374,"stem":375,"icon":39},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":377,"path":378,"stem":379,"icon":380},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":382,"path":383,"stem":384,"icon":385},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":387,"path":388,"stem":389,"icon":390},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":392,"path":393,"stem":394,"icon":369},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":396,"path":397,"stem":398,"icon":79},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes",{"title":336,"icon":107,"path":400,"stem":401,"children":402,"page":29},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[403,406,411,416],{"title":36,"path":404,"stem":405,"icon":39},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":407,"path":408,"stem":409,"icon":410},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":412,"path":413,"stem":414,"icon":415},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":417,"path":418,"stem":419,"icon":79},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":421,"path":422,"stem":423,"icon":424},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":426,"path":427,"stem":428,"icon":429},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve","i-custom-eve",{"title":431,"path":432,"stem":433,"children":434,"page":29},"Extend","\u002Fextend","6.extend",[435,439,444,449,454,458,462,466,470,475,480],{"title":36,"path":436,"stem":437,"icon":438},"\u002Fextend\u002Foverview","6.extend\u002F0.overview","i-lucide-blocks",{"title":440,"path":441,"stem":442,"icon":443},"Stream","\u002Fextend\u002Fstream","6.extend\u002F1.stream","i-lucide-radio-tower",{"title":445,"path":446,"stem":447,"icon":448},"Custom framework","\u002Fextend\u002Fcustom-framework","6.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":450,"path":451,"stem":452,"icon":453},"FS reader","\u002Fextend\u002Ffs-reader","6.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":396,"path":455,"stem":456,"icon":457},"\u002Fextend\u002Fconsumer-recipes","6.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":459,"path":460,"stem":461,"icon":438},"Plugins","\u002Fextend\u002Fplugins","6.extend\u002F4.plugins",{"title":463,"path":464,"stem":465,"icon":424},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","6.extend\u002F5.custom-enrichers",{"title":467,"path":468,"stem":469,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","6.extend\u002F6.tail-sampling",{"title":471,"path":472,"stem":473,"icon":474},"Identity headers","\u002Fextend\u002Fidentity-headers","6.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":476,"path":477,"stem":478,"icon":479},"Custom drains","\u002Fextend\u002Fcustom-drains","6.extend\u002F8.custom-drains","i-lucide-share-2",{"title":481,"path":482,"stem":483,"icon":484},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","6.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":417,"path":486,"stem":487,"children":488,"page":29},"\u002Freference","7.reference",[489,494,497,502,506,511],{"title":490,"path":491,"stem":492,"icon":493},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration","i-lucide-settings",{"title":364,"path":495,"stem":496,"icon":107},"\u002Freference\u002Fperformance","7.reference\u002F2.performance",{"title":498,"path":499,"stem":500,"icon":501},"Vite Plugin","\u002Freference\u002Fvite-plugin","7.reference\u002F3.vite-plugin","i-custom-vite",{"title":503,"path":504,"stem":505,"icon":369},"Best Practices","\u002Freference\u002Fbest-practices","7.reference\u002F4.best-practices",{"title":507,"path":508,"stem":509,"icon":510},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":512,"path":513,"stem":514,"icon":424},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"id":516,"title":368,"body":517,"description":3036,"extension":3037,"links":3038,"meta":3046,"navigation":3047,"path":374,"seo":3048,"stem":375,"__hash__":3049},"docs\u002F5.use-cases\u002F4.audit\u002F01.overview.md",{"type":518,"value":519,"toc":3029},"minimark",[520,538,585,589,615,644,657,661,668,675,678,682,685,993,2890,2893,2929,2939,2942,2946,2964,2967,2971,3025],[521,522,523,524,528,529,533,534,537],"p",{},"evlog's audit layer is ",[525,526,527],"strong",{},"not a parallel system",". Audit events are wide events with a reserved ",[530,531,532],"code",{},"audit"," field. Every existing primitive — drains, enrichers, redact, tail-sampling — applies as is. Enable audit logs by adding ",[525,535,536],{},"1 enricher + 1 drain wrapper + 1 helper",".",[539,540,543,546,571],"prompt",{":actions":541,"description":542,"icon":369},"[\"copy\",\"cursor\",\"claude\"]","Add an audit log to my app",[521,544,545],{},"Add a tamper-evident audit log to my app on top of evlog.",[547,548,549,553,556,559,562,565,568],"ul",{},[550,551,552],"li",{},"Identify my framework and follow its evlog integration pattern",[550,554,555],{},"Register auditEnricher() on the evlog:enrich hook (or in initLogger.enrichers)",[550,557,558],{},"Register a separate auditOnly(signed(createFsDrain({ dir: '.audit' }), { strategy: 'hash-chain' })) drain alongside my main drain",[550,560,561],{},"Use { await: true } on the audit drain so audit events are flushed before the response returns",[550,563,564],{},"Call log.audit({ action, actor, target, outcome, reason }) for every security-sensitive action (login, role change, refund, data export, deletion)",[550,566,567],{},"Audit events are force-kept past sampling and signed via hash-chain for tamper-evidence",[550,569,570],{},"Combine with the Better Auth integration so actor.id \u002F actor.email are automatic",[521,572,573,574,580,581],{},"Docs: ",[575,576,577],"a",{"href":577,"rel":578},"https:\u002F\u002Fwww.evlog.dev\u002Fuse-cases\u002Faudit\u002Foverview",[579],"nofollow","\nAdapters: ",[575,582,583],{"href":583,"rel":584},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fadapters\u002Foverview",[579],[586,587,512],"h2",{"id":588},"agent-skills",[521,590,591,592,597,598,601,602,605,606,611,612,537],{},"Install the evlog skill catalog so your assistant can follow ",[525,593,594],{},[530,595,596],{},"build-audit-logs"," end to end: written policy, framework wiring, ",[530,599,600],{},"withAudit"," \u002F ",[530,603,604],{},"log.audit",", denials, redaction, multi-tenant isolation, tamper-evident sinks, and grep-based review passes. If you use the file-system drain for audits or general logs, ",[525,607,608],{},[530,609,610],{},"analyze-logs"," teaches assistants to read NDJSON under ",[530,613,614],{},".evlog\u002Flogs\u002F",[616,617,623],"pre",{"className":618,"code":619,"filename":620,"language":621,"meta":622,"style":622},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npx skills add https:\u002F\u002Fwww.evlog.dev\n","Terminal","bash","",[530,624,625],{"__ignoreMap":622},[626,627,630,634,638,641],"span",{"class":628,"line":629},"line",1,[626,631,633],{"class":632},"sBMFI","npx",[626,635,637],{"class":636},"sfazB"," skills",[626,639,640],{"class":636}," add",[626,642,643],{"class":636}," https:\u002F\u002Fwww.evlog.dev\n",[521,645,646,647,649,650,653,654,537],{},"See ",[575,648,512],{"href":513}," for the full list. Skill paths in the repo: ",[530,651,652],{},"skills\u002Fbuild-audit-logs",", ",[530,655,656],{},"skills\u002Fanalyze-logs",[586,658,660],{"id":659},"why-audit-logs","Why Audit Logs?",[521,662,663,664,667],{},"Compliance frameworks (SOC2, HIPAA, GDPR, PCI) require knowing ",[525,665,666],{},"who did what, on which resource, when, from where, with which outcome",". evlog covers this without a second logging library.",[669,670,671,674],"tip",{},[525,672,673],{},"An audit event is a fact about an intent, not a measurement of an operation."," A regular wide event answers \"how did this request behave?\" (latency, status, tokens). An audit event answers \"who tried to do what, and was it allowed?\". Same pipeline, different question — that's why the schema is reserved and the event is force-kept past sampling.",[676,677],"audit-force-keep",{},[586,679,681],{"id":680},"quickstart","Quickstart",[521,683,684],{},"You already use evlog. Add audit logs in three changes:",[616,686,691],{"className":687,"code":688,"filename":689,"language":690,"meta":622,"style":622},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { auditEnricher, auditOnly, signed } from 'evlog'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\nimport { createFsDrain } from 'evlog\u002Ffs'\n\nexport default defineNitroPlugin((nitro) => {\n  nitro.hooks.hook('evlog:enrich', auditEnricher())\n  nitro.hooks.hook('evlog:drain', createAxiomDrain())\n  nitro.hooks.hook('evlog:drain', auditOnly(\n    signed(createFsDrain({ dir: '.audit' }), { strategy: 'hash-chain' }),\n    { await: true },\n  ))\n})\n","server\u002Fplugins\u002Fevlog.ts","typescript",[530,692,693,733,754,775,782,814,848,876,904,960,978,984],{"__ignoreMap":622},[626,694,695,699,703,707,710,713,715,718,721,724,727,730],{"class":628,"line":629},[626,696,698],{"class":697},"s7zQu","import",[626,700,702],{"class":701},"sMK4o"," {",[626,704,706],{"class":705},"sTEyZ"," auditEnricher",[626,708,709],{"class":701},",",[626,711,712],{"class":705}," auditOnly",[626,714,709],{"class":701},[626,716,717],{"class":705}," signed",[626,719,720],{"class":701}," }",[626,722,723],{"class":697}," from",[626,725,726],{"class":701}," '",[626,728,729],{"class":636},"evlog",[626,731,732],{"class":701},"'\n",[626,734,736,738,740,743,745,747,749,752],{"class":628,"line":735},2,[626,737,698],{"class":697},[626,739,702],{"class":701},[626,741,742],{"class":705}," createAxiomDrain",[626,744,720],{"class":701},[626,746,723],{"class":697},[626,748,726],{"class":701},[626,750,751],{"class":636},"evlog\u002Faxiom",[626,753,732],{"class":701},[626,755,757,759,761,764,766,768,770,773],{"class":628,"line":756},3,[626,758,698],{"class":697},[626,760,702],{"class":701},[626,762,763],{"class":705}," createFsDrain",[626,765,720],{"class":701},[626,767,723],{"class":697},[626,769,726],{"class":701},[626,771,772],{"class":636},"evlog\u002Ffs",[626,774,732],{"class":701},[626,776,778],{"class":628,"line":777},4,[626,779,781],{"emptyLinePlaceholder":780},true,"\n",[626,783,785,788,791,795,798,800,804,807,811],{"class":628,"line":784},5,[626,786,787],{"class":697},"export",[626,789,790],{"class":697}," default",[626,792,794],{"class":793},"s2Zo4"," defineNitroPlugin",[626,796,797],{"class":705},"(",[626,799,797],{"class":701},[626,801,803],{"class":802},"sHdIc","nitro",[626,805,806],{"class":701},")",[626,808,810],{"class":809},"spNyl"," =>",[626,812,813],{"class":701}," {\n",[626,815,817,820,822,825,827,830,833,836,839,841,843,845],{"class":628,"line":816},6,[626,818,819],{"class":705},"  nitro",[626,821,537],{"class":701},[626,823,824],{"class":705},"hooks",[626,826,537],{"class":701},[626,828,829],{"class":793},"hook",[626,831,797],{"class":832},"swJcz",[626,834,835],{"class":701},"'",[626,837,838],{"class":636},"evlog:enrich",[626,840,835],{"class":701},[626,842,709],{"class":701},[626,844,706],{"class":793},[626,846,847],{"class":832},"())\n",[626,849,851,853,855,857,859,861,863,865,868,870,872,874],{"class":628,"line":850},7,[626,852,819],{"class":705},[626,854,537],{"class":701},[626,856,824],{"class":705},[626,858,537],{"class":701},[626,860,829],{"class":793},[626,862,797],{"class":832},[626,864,835],{"class":701},[626,866,867],{"class":636},"evlog:drain",[626,869,835],{"class":701},[626,871,709],{"class":701},[626,873,742],{"class":793},[626,875,847],{"class":832},[626,877,879,881,883,885,887,889,891,893,895,897,899,901],{"class":628,"line":878},8,[626,880,819],{"class":705},[626,882,537],{"class":701},[626,884,824],{"class":705},[626,886,537],{"class":701},[626,888,829],{"class":793},[626,890,797],{"class":832},[626,892,835],{"class":701},[626,894,867],{"class":636},[626,896,835],{"class":701},[626,898,709],{"class":701},[626,900,712],{"class":793},[626,902,903],{"class":832},"(\n",[626,905,907,910,912,915,917,920,923,926,928,931,933,935,937,939,941,944,946,948,951,953,955,957],{"class":628,"line":906},9,[626,908,909],{"class":793},"    signed",[626,911,797],{"class":832},[626,913,914],{"class":793},"createFsDrain",[626,916,797],{"class":832},[626,918,919],{"class":701},"{",[626,921,922],{"class":832}," dir",[626,924,925],{"class":701},":",[626,927,726],{"class":701},[626,929,930],{"class":636},".audit",[626,932,835],{"class":701},[626,934,720],{"class":701},[626,936,806],{"class":832},[626,938,709],{"class":701},[626,940,702],{"class":701},[626,942,943],{"class":832}," strategy",[626,945,925],{"class":701},[626,947,726],{"class":701},[626,949,950],{"class":636},"hash-chain",[626,952,835],{"class":701},[626,954,720],{"class":701},[626,956,806],{"class":832},[626,958,959],{"class":701},",\n",[626,961,963,966,969,971,975],{"class":628,"line":962},10,[626,964,965],{"class":701},"    {",[626,967,968],{"class":832}," await",[626,970,925],{"class":701},[626,972,974],{"class":973},"sfNiH"," true",[626,976,977],{"class":701}," },\n",[626,979,981],{"class":628,"line":980},11,[626,982,983],{"class":832},"  ))\n",[626,985,987,990],{"class":628,"line":986},12,[626,988,989],{"class":701},"}",[626,991,992],{"class":705},")\n",[994,995,996,1290,1593,1966,2277,2435],"code-group",{},[616,997,1000],{"className":687,"code":998,"filename":999,"language":690,"meta":622,"style":622},"export default defineEventHandler(async (event) => {\n  const log = useLogger(event)\n  const user = await requireUser(event)\n  const invoice = await refundInvoice(getRouterParam(event, 'id'))\n\n  log.audit({\n    action: 'invoice.refund',\n    actor: { type: 'user', id: user.id, email: user.email },\n    target: { type: 'invoice', id: invoice.id },\n    outcome: 'success',\n    reason: 'Customer requested refund',\n  })\n\n  return { ok: true }\n})\n","Nuxt \u002F Nitro",[530,1001,1002,1028,1048,1068,1103,1107,1121,1137,1187,1221,1237,1253,1260,1265,1283],{"__ignoreMap":622},[626,1003,1004,1006,1008,1011,1013,1016,1019,1022,1024,1026],{"class":628,"line":629},[626,1005,787],{"class":697},[626,1007,790],{"class":697},[626,1009,1010],{"class":793}," defineEventHandler",[626,1012,797],{"class":705},[626,1014,1015],{"class":809},"async",[626,1017,1018],{"class":701}," (",[626,1020,1021],{"class":802},"event",[626,1023,806],{"class":701},[626,1025,810],{"class":809},[626,1027,813],{"class":701},[626,1029,1030,1033,1036,1039,1042,1044,1046],{"class":628,"line":735},[626,1031,1032],{"class":809},"  const",[626,1034,1035],{"class":705}," log",[626,1037,1038],{"class":701}," =",[626,1040,1041],{"class":793}," useLogger",[626,1043,797],{"class":832},[626,1045,1021],{"class":705},[626,1047,992],{"class":832},[626,1049,1050,1052,1055,1057,1059,1062,1064,1066],{"class":628,"line":756},[626,1051,1032],{"class":809},[626,1053,1054],{"class":705}," user",[626,1056,1038],{"class":701},[626,1058,968],{"class":697},[626,1060,1061],{"class":793}," requireUser",[626,1063,797],{"class":832},[626,1065,1021],{"class":705},[626,1067,992],{"class":832},[626,1069,1070,1072,1075,1077,1079,1082,1084,1087,1089,1091,1093,1095,1098,1100],{"class":628,"line":777},[626,1071,1032],{"class":809},[626,1073,1074],{"class":705}," invoice",[626,1076,1038],{"class":701},[626,1078,968],{"class":697},[626,1080,1081],{"class":793}," refundInvoice",[626,1083,797],{"class":832},[626,1085,1086],{"class":793},"getRouterParam",[626,1088,797],{"class":832},[626,1090,1021],{"class":705},[626,1092,709],{"class":701},[626,1094,726],{"class":701},[626,1096,1097],{"class":636},"id",[626,1099,835],{"class":701},[626,1101,1102],{"class":832},"))\n",[626,1104,1105],{"class":628,"line":784},[626,1106,781],{"emptyLinePlaceholder":780},[626,1108,1109,1112,1114,1116,1118],{"class":628,"line":816},[626,1110,1111],{"class":705},"  log",[626,1113,537],{"class":701},[626,1115,532],{"class":793},[626,1117,797],{"class":832},[626,1119,1120],{"class":701},"{\n",[626,1122,1123,1126,1128,1130,1133,1135],{"class":628,"line":850},[626,1124,1125],{"class":832},"    action",[626,1127,925],{"class":701},[626,1129,726],{"class":701},[626,1131,1132],{"class":636},"invoice.refund",[626,1134,835],{"class":701},[626,1136,959],{"class":701},[626,1138,1139,1142,1144,1146,1149,1151,1153,1156,1158,1160,1163,1165,1167,1169,1171,1173,1176,1178,1180,1182,1185],{"class":628,"line":878},[626,1140,1141],{"class":832},"    actor",[626,1143,925],{"class":701},[626,1145,702],{"class":701},[626,1147,1148],{"class":832}," type",[626,1150,925],{"class":701},[626,1152,726],{"class":701},[626,1154,1155],{"class":636},"user",[626,1157,835],{"class":701},[626,1159,709],{"class":701},[626,1161,1162],{"class":832}," id",[626,1164,925],{"class":701},[626,1166,1054],{"class":705},[626,1168,537],{"class":701},[626,1170,1097],{"class":705},[626,1172,709],{"class":701},[626,1174,1175],{"class":832}," email",[626,1177,925],{"class":701},[626,1179,1054],{"class":705},[626,1181,537],{"class":701},[626,1183,1184],{"class":705},"email",[626,1186,977],{"class":701},[626,1188,1189,1192,1194,1196,1198,1200,1202,1205,1207,1209,1211,1213,1215,1217,1219],{"class":628,"line":906},[626,1190,1191],{"class":832},"    target",[626,1193,925],{"class":701},[626,1195,702],{"class":701},[626,1197,1148],{"class":832},[626,1199,925],{"class":701},[626,1201,726],{"class":701},[626,1203,1204],{"class":636},"invoice",[626,1206,835],{"class":701},[626,1208,709],{"class":701},[626,1210,1162],{"class":832},[626,1212,925],{"class":701},[626,1214,1074],{"class":705},[626,1216,537],{"class":701},[626,1218,1097],{"class":705},[626,1220,977],{"class":701},[626,1222,1223,1226,1228,1230,1233,1235],{"class":628,"line":962},[626,1224,1225],{"class":832},"    outcome",[626,1227,925],{"class":701},[626,1229,726],{"class":701},[626,1231,1232],{"class":636},"success",[626,1234,835],{"class":701},[626,1236,959],{"class":701},[626,1238,1239,1242,1244,1246,1249,1251],{"class":628,"line":980},[626,1240,1241],{"class":832},"    reason",[626,1243,925],{"class":701},[626,1245,726],{"class":701},[626,1247,1248],{"class":636},"Customer requested refund",[626,1250,835],{"class":701},[626,1252,959],{"class":701},[626,1254,1255,1258],{"class":628,"line":986},[626,1256,1257],{"class":701},"  }",[626,1259,992],{"class":832},[626,1261,1263],{"class":628,"line":1262},13,[626,1264,781],{"emptyLinePlaceholder":780},[626,1266,1268,1271,1273,1276,1278,1280],{"class":628,"line":1267},14,[626,1269,1270],{"class":697},"  return",[626,1272,702],{"class":701},[626,1274,1275],{"class":832}," ok",[626,1277,925],{"class":701},[626,1279,974],{"class":973},[626,1281,1282],{"class":701}," }\n",[626,1284,1286,1288],{"class":628,"line":1285},15,[626,1287,989],{"class":701},[626,1289,992],{"class":705},[616,1291,1293],{"className":687,"code":1292,"filename":225,"language":690,"meta":622,"style":622},"import { withEvlog, useLogger } from '@\u002Flib\u002Fevlog'\n\nexport const POST = withEvlog(async (req, { params }) => {\n  const log = useLogger()\n  const user = await requireUser(req)\n  const invoice = await refundInvoice(params.id)\n\n  log.audit({\n    action: 'invoice.refund',\n    actor: { type: 'user', id: user.id, email: user.email },\n    target: { type: 'invoice', id: invoice.id },\n    outcome: 'success',\n    reason: 'Customer requested refund',\n  })\n\n  return Response.json({ ok: true })\n})\n",[530,1294,1295,1319,1323,1361,1374,1392,1415,1419,1431,1445,1489,1521,1535,1549,1555,1559,1586],{"__ignoreMap":622},[626,1296,1297,1299,1301,1304,1306,1308,1310,1312,1314,1317],{"class":628,"line":629},[626,1298,698],{"class":697},[626,1300,702],{"class":701},[626,1302,1303],{"class":705}," withEvlog",[626,1305,709],{"class":701},[626,1307,1041],{"class":705},[626,1309,720],{"class":701},[626,1311,723],{"class":697},[626,1313,726],{"class":701},[626,1315,1316],{"class":636},"@\u002Flib\u002Fevlog",[626,1318,732],{"class":701},[626,1320,1321],{"class":628,"line":735},[626,1322,781],{"emptyLinePlaceholder":780},[626,1324,1325,1327,1330,1333,1336,1338,1340,1342,1344,1347,1349,1351,1354,1357,1359],{"class":628,"line":756},[626,1326,787],{"class":697},[626,1328,1329],{"class":809}," const",[626,1331,1332],{"class":705}," POST ",[626,1334,1335],{"class":701},"=",[626,1337,1303],{"class":793},[626,1339,797],{"class":705},[626,1341,1015],{"class":809},[626,1343,1018],{"class":701},[626,1345,1346],{"class":802},"req",[626,1348,709],{"class":701},[626,1350,702],{"class":701},[626,1352,1353],{"class":802}," params",[626,1355,1356],{"class":701}," })",[626,1358,810],{"class":809},[626,1360,813],{"class":701},[626,1362,1363,1365,1367,1369,1371],{"class":628,"line":777},[626,1364,1032],{"class":809},[626,1366,1035],{"class":705},[626,1368,1038],{"class":701},[626,1370,1041],{"class":793},[626,1372,1373],{"class":832},"()\n",[626,1375,1376,1378,1380,1382,1384,1386,1388,1390],{"class":628,"line":784},[626,1377,1032],{"class":809},[626,1379,1054],{"class":705},[626,1381,1038],{"class":701},[626,1383,968],{"class":697},[626,1385,1061],{"class":793},[626,1387,797],{"class":832},[626,1389,1346],{"class":705},[626,1391,992],{"class":832},[626,1393,1394,1396,1398,1400,1402,1404,1406,1409,1411,1413],{"class":628,"line":816},[626,1395,1032],{"class":809},[626,1397,1074],{"class":705},[626,1399,1038],{"class":701},[626,1401,968],{"class":697},[626,1403,1081],{"class":793},[626,1405,797],{"class":832},[626,1407,1408],{"class":705},"params",[626,1410,537],{"class":701},[626,1412,1097],{"class":705},[626,1414,992],{"class":832},[626,1416,1417],{"class":628,"line":850},[626,1418,781],{"emptyLinePlaceholder":780},[626,1420,1421,1423,1425,1427,1429],{"class":628,"line":878},[626,1422,1111],{"class":705},[626,1424,537],{"class":701},[626,1426,532],{"class":793},[626,1428,797],{"class":832},[626,1430,1120],{"class":701},[626,1432,1433,1435,1437,1439,1441,1443],{"class":628,"line":906},[626,1434,1125],{"class":832},[626,1436,925],{"class":701},[626,1438,726],{"class":701},[626,1440,1132],{"class":636},[626,1442,835],{"class":701},[626,1444,959],{"class":701},[626,1446,1447,1449,1451,1453,1455,1457,1459,1461,1463,1465,1467,1469,1471,1473,1475,1477,1479,1481,1483,1485,1487],{"class":628,"line":962},[626,1448,1141],{"class":832},[626,1450,925],{"class":701},[626,1452,702],{"class":701},[626,1454,1148],{"class":832},[626,1456,925],{"class":701},[626,1458,726],{"class":701},[626,1460,1155],{"class":636},[626,1462,835],{"class":701},[626,1464,709],{"class":701},[626,1466,1162],{"class":832},[626,1468,925],{"class":701},[626,1470,1054],{"class":705},[626,1472,537],{"class":701},[626,1474,1097],{"class":705},[626,1476,709],{"class":701},[626,1478,1175],{"class":832},[626,1480,925],{"class":701},[626,1482,1054],{"class":705},[626,1484,537],{"class":701},[626,1486,1184],{"class":705},[626,1488,977],{"class":701},[626,1490,1491,1493,1495,1497,1499,1501,1503,1505,1507,1509,1511,1513,1515,1517,1519],{"class":628,"line":980},[626,1492,1191],{"class":832},[626,1494,925],{"class":701},[626,1496,702],{"class":701},[626,1498,1148],{"class":832},[626,1500,925],{"class":701},[626,1502,726],{"class":701},[626,1504,1204],{"class":636},[626,1506,835],{"class":701},[626,1508,709],{"class":701},[626,1510,1162],{"class":832},[626,1512,925],{"class":701},[626,1514,1074],{"class":705},[626,1516,537],{"class":701},[626,1518,1097],{"class":705},[626,1520,977],{"class":701},[626,1522,1523,1525,1527,1529,1531,1533],{"class":628,"line":986},[626,1524,1225],{"class":832},[626,1526,925],{"class":701},[626,1528,726],{"class":701},[626,1530,1232],{"class":636},[626,1532,835],{"class":701},[626,1534,959],{"class":701},[626,1536,1537,1539,1541,1543,1545,1547],{"class":628,"line":1262},[626,1538,1241],{"class":832},[626,1540,925],{"class":701},[626,1542,726],{"class":701},[626,1544,1248],{"class":636},[626,1546,835],{"class":701},[626,1548,959],{"class":701},[626,1550,1551,1553],{"class":628,"line":1267},[626,1552,1257],{"class":701},[626,1554,992],{"class":832},[626,1556,1557],{"class":628,"line":1285},[626,1558,781],{"emptyLinePlaceholder":780},[626,1560,1562,1564,1567,1569,1572,1574,1576,1578,1580,1582,1584],{"class":628,"line":1561},16,[626,1563,1270],{"class":697},[626,1565,1566],{"class":705}," Response",[626,1568,537],{"class":701},[626,1570,1571],{"class":793},"json",[626,1573,797],{"class":832},[626,1575,919],{"class":701},[626,1577,1275],{"class":832},[626,1579,925],{"class":701},[626,1581,974],{"class":973},[626,1583,720],{"class":701},[626,1585,992],{"class":832},[626,1587,1589,1591],{"class":628,"line":1588},17,[626,1590,989],{"class":701},[626,1592,992],{"class":705},[616,1594,1596],{"className":687,"code":1595,"filename":255,"language":690,"meta":622,"style":622},"import type { EvlogVariables } from 'evlog\u002Fhono'\nimport { Hono } from 'hono'\n\nconst app = new Hono\u003CEvlogVariables>()\n\napp.post('\u002Finvoices\u002F:id\u002Frefund', async (c) => {\n  const log = c.get('log')\n  const user = await requireUser(c)\n  const invoice = await refundInvoice(c.req.param('id'))\n\n  log.audit({\n    action: 'invoice.refund',\n    actor: { type: 'user', id: user.id, email: user.email },\n    target: { type: 'invoice', id: invoice.id },\n    outcome: 'success',\n    reason: 'Customer requested refund',\n  })\n\n  return c.json({ ok: true })\n})\n",[530,1597,1598,1620,1640,1644,1670,1674,1709,1736,1754,1789,1793,1805,1819,1863,1895,1909,1923,1929,1934,1959],{"__ignoreMap":622},[626,1599,1600,1602,1604,1606,1609,1611,1613,1615,1618],{"class":628,"line":629},[626,1601,698],{"class":697},[626,1603,1148],{"class":697},[626,1605,702],{"class":701},[626,1607,1608],{"class":705}," EvlogVariables",[626,1610,720],{"class":701},[626,1612,723],{"class":697},[626,1614,726],{"class":701},[626,1616,1617],{"class":636},"evlog\u002Fhono",[626,1619,732],{"class":701},[626,1621,1622,1624,1626,1629,1631,1633,1635,1638],{"class":628,"line":735},[626,1623,698],{"class":697},[626,1625,702],{"class":701},[626,1627,1628],{"class":705}," Hono",[626,1630,720],{"class":701},[626,1632,723],{"class":697},[626,1634,726],{"class":701},[626,1636,1637],{"class":636},"hono",[626,1639,732],{"class":701},[626,1641,1642],{"class":628,"line":756},[626,1643,781],{"emptyLinePlaceholder":780},[626,1645,1646,1649,1652,1654,1657,1659,1662,1665,1668],{"class":628,"line":777},[626,1647,1648],{"class":809},"const",[626,1650,1651],{"class":705}," app ",[626,1653,1335],{"class":701},[626,1655,1656],{"class":701}," new",[626,1658,1628],{"class":793},[626,1660,1661],{"class":701},"\u003C",[626,1663,1664],{"class":632},"EvlogVariables",[626,1666,1667],{"class":701},">",[626,1669,1373],{"class":705},[626,1671,1672],{"class":628,"line":784},[626,1673,781],{"emptyLinePlaceholder":780},[626,1675,1676,1679,1681,1684,1686,1688,1691,1693,1695,1698,1700,1703,1705,1707],{"class":628,"line":816},[626,1677,1678],{"class":705},"app",[626,1680,537],{"class":701},[626,1682,1683],{"class":793},"post",[626,1685,797],{"class":705},[626,1687,835],{"class":701},[626,1689,1690],{"class":636},"\u002Finvoices\u002F:id\u002Frefund",[626,1692,835],{"class":701},[626,1694,709],{"class":701},[626,1696,1697],{"class":809}," async",[626,1699,1018],{"class":701},[626,1701,1702],{"class":802},"c",[626,1704,806],{"class":701},[626,1706,810],{"class":809},[626,1708,813],{"class":701},[626,1710,1711,1713,1715,1717,1720,1722,1725,1727,1729,1732,1734],{"class":628,"line":850},[626,1712,1032],{"class":809},[626,1714,1035],{"class":705},[626,1716,1038],{"class":701},[626,1718,1719],{"class":705}," c",[626,1721,537],{"class":701},[626,1723,1724],{"class":793},"get",[626,1726,797],{"class":832},[626,1728,835],{"class":701},[626,1730,1731],{"class":636},"log",[626,1733,835],{"class":701},[626,1735,992],{"class":832},[626,1737,1738,1740,1742,1744,1746,1748,1750,1752],{"class":628,"line":878},[626,1739,1032],{"class":809},[626,1741,1054],{"class":705},[626,1743,1038],{"class":701},[626,1745,968],{"class":697},[626,1747,1061],{"class":793},[626,1749,797],{"class":832},[626,1751,1702],{"class":705},[626,1753,992],{"class":832},[626,1755,1756,1758,1760,1762,1764,1766,1768,1770,1772,1774,1776,1779,1781,1783,1785,1787],{"class":628,"line":906},[626,1757,1032],{"class":809},[626,1759,1074],{"class":705},[626,1761,1038],{"class":701},[626,1763,968],{"class":697},[626,1765,1081],{"class":793},[626,1767,797],{"class":832},[626,1769,1702],{"class":705},[626,1771,537],{"class":701},[626,1773,1346],{"class":705},[626,1775,537],{"class":701},[626,1777,1778],{"class":793},"param",[626,1780,797],{"class":832},[626,1782,835],{"class":701},[626,1784,1097],{"class":636},[626,1786,835],{"class":701},[626,1788,1102],{"class":832},[626,1790,1791],{"class":628,"line":962},[626,1792,781],{"emptyLinePlaceholder":780},[626,1794,1795,1797,1799,1801,1803],{"class":628,"line":980},[626,1796,1111],{"class":705},[626,1798,537],{"class":701},[626,1800,532],{"class":793},[626,1802,797],{"class":832},[626,1804,1120],{"class":701},[626,1806,1807,1809,1811,1813,1815,1817],{"class":628,"line":986},[626,1808,1125],{"class":832},[626,1810,925],{"class":701},[626,1812,726],{"class":701},[626,1814,1132],{"class":636},[626,1816,835],{"class":701},[626,1818,959],{"class":701},[626,1820,1821,1823,1825,1827,1829,1831,1833,1835,1837,1839,1841,1843,1845,1847,1849,1851,1853,1855,1857,1859,1861],{"class":628,"line":1262},[626,1822,1141],{"class":832},[626,1824,925],{"class":701},[626,1826,702],{"class":701},[626,1828,1148],{"class":832},[626,1830,925],{"class":701},[626,1832,726],{"class":701},[626,1834,1155],{"class":636},[626,1836,835],{"class":701},[626,1838,709],{"class":701},[626,1840,1162],{"class":832},[626,1842,925],{"class":701},[626,1844,1054],{"class":705},[626,1846,537],{"class":701},[626,1848,1097],{"class":705},[626,1850,709],{"class":701},[626,1852,1175],{"class":832},[626,1854,925],{"class":701},[626,1856,1054],{"class":705},[626,1858,537],{"class":701},[626,1860,1184],{"class":705},[626,1862,977],{"class":701},[626,1864,1865,1867,1869,1871,1873,1875,1877,1879,1881,1883,1885,1887,1889,1891,1893],{"class":628,"line":1267},[626,1866,1191],{"class":832},[626,1868,925],{"class":701},[626,1870,702],{"class":701},[626,1872,1148],{"class":832},[626,1874,925],{"class":701},[626,1876,726],{"class":701},[626,1878,1204],{"class":636},[626,1880,835],{"class":701},[626,1882,709],{"class":701},[626,1884,1162],{"class":832},[626,1886,925],{"class":701},[626,1888,1074],{"class":705},[626,1890,537],{"class":701},[626,1892,1097],{"class":705},[626,1894,977],{"class":701},[626,1896,1897,1899,1901,1903,1905,1907],{"class":628,"line":1285},[626,1898,1225],{"class":832},[626,1900,925],{"class":701},[626,1902,726],{"class":701},[626,1904,1232],{"class":636},[626,1906,835],{"class":701},[626,1908,959],{"class":701},[626,1910,1911,1913,1915,1917,1919,1921],{"class":628,"line":1561},[626,1912,1241],{"class":832},[626,1914,925],{"class":701},[626,1916,726],{"class":701},[626,1918,1248],{"class":636},[626,1920,835],{"class":701},[626,1922,959],{"class":701},[626,1924,1925,1927],{"class":628,"line":1588},[626,1926,1257],{"class":701},[626,1928,992],{"class":832},[626,1930,1932],{"class":628,"line":1931},18,[626,1933,781],{"emptyLinePlaceholder":780},[626,1935,1937,1939,1941,1943,1945,1947,1949,1951,1953,1955,1957],{"class":628,"line":1936},19,[626,1938,1270],{"class":697},[626,1940,1719],{"class":705},[626,1942,537],{"class":701},[626,1944,1571],{"class":793},[626,1946,797],{"class":832},[626,1948,919],{"class":701},[626,1950,1275],{"class":832},[626,1952,925],{"class":701},[626,1954,974],{"class":973},[626,1956,720],{"class":701},[626,1958,992],{"class":832},[626,1960,1962,1964],{"class":628,"line":1961},20,[626,1963,989],{"class":701},[626,1965,992],{"class":705},[616,1967,1969],{"className":687,"code":1968,"filename":250,"language":690,"meta":622,"style":622},"import type { Request, Response } from 'express'\n\napp.post('\u002Finvoices\u002F:id\u002Frefund', async (req: Request, res: Response) => {\n  const log = req.log\n  const user = await requireUser(req)\n  const invoice = await refundInvoice(req.params.id)\n\n  log.audit({\n    action: 'invoice.refund',\n    actor: { type: 'user', id: user.id, email: user.email },\n    target: { type: 'invoice', id: invoice.id },\n    outcome: 'success',\n    reason: 'Customer requested refund',\n  })\n\n  res.json({ ok: true })\n})\n",[530,1970,1971,1997,2001,2044,2060,2078,2104,2108,2120,2134,2178,2210,2224,2238,2244,2248,2271],{"__ignoreMap":622},[626,1972,1973,1975,1977,1979,1982,1984,1986,1988,1990,1992,1995],{"class":628,"line":629},[626,1974,698],{"class":697},[626,1976,1148],{"class":697},[626,1978,702],{"class":701},[626,1980,1981],{"class":705}," Request",[626,1983,709],{"class":701},[626,1985,1566],{"class":705},[626,1987,720],{"class":701},[626,1989,723],{"class":697},[626,1991,726],{"class":701},[626,1993,1994],{"class":636},"express",[626,1996,732],{"class":701},[626,1998,1999],{"class":628,"line":735},[626,2000,781],{"emptyLinePlaceholder":780},[626,2002,2003,2005,2007,2009,2011,2013,2015,2017,2019,2021,2023,2025,2027,2029,2031,2034,2036,2038,2040,2042],{"class":628,"line":756},[626,2004,1678],{"class":705},[626,2006,537],{"class":701},[626,2008,1683],{"class":793},[626,2010,797],{"class":705},[626,2012,835],{"class":701},[626,2014,1690],{"class":636},[626,2016,835],{"class":701},[626,2018,709],{"class":701},[626,2020,1697],{"class":809},[626,2022,1018],{"class":701},[626,2024,1346],{"class":802},[626,2026,925],{"class":701},[626,2028,1981],{"class":632},[626,2030,709],{"class":701},[626,2032,2033],{"class":802}," res",[626,2035,925],{"class":701},[626,2037,1566],{"class":632},[626,2039,806],{"class":701},[626,2041,810],{"class":809},[626,2043,813],{"class":701},[626,2045,2046,2048,2050,2052,2055,2057],{"class":628,"line":777},[626,2047,1032],{"class":809},[626,2049,1035],{"class":705},[626,2051,1038],{"class":701},[626,2053,2054],{"class":705}," req",[626,2056,537],{"class":701},[626,2058,2059],{"class":705},"log\n",[626,2061,2062,2064,2066,2068,2070,2072,2074,2076],{"class":628,"line":784},[626,2063,1032],{"class":809},[626,2065,1054],{"class":705},[626,2067,1038],{"class":701},[626,2069,968],{"class":697},[626,2071,1061],{"class":793},[626,2073,797],{"class":832},[626,2075,1346],{"class":705},[626,2077,992],{"class":832},[626,2079,2080,2082,2084,2086,2088,2090,2092,2094,2096,2098,2100,2102],{"class":628,"line":816},[626,2081,1032],{"class":809},[626,2083,1074],{"class":705},[626,2085,1038],{"class":701},[626,2087,968],{"class":697},[626,2089,1081],{"class":793},[626,2091,797],{"class":832},[626,2093,1346],{"class":705},[626,2095,537],{"class":701},[626,2097,1408],{"class":705},[626,2099,537],{"class":701},[626,2101,1097],{"class":705},[626,2103,992],{"class":832},[626,2105,2106],{"class":628,"line":850},[626,2107,781],{"emptyLinePlaceholder":780},[626,2109,2110,2112,2114,2116,2118],{"class":628,"line":878},[626,2111,1111],{"class":705},[626,2113,537],{"class":701},[626,2115,532],{"class":793},[626,2117,797],{"class":832},[626,2119,1120],{"class":701},[626,2121,2122,2124,2126,2128,2130,2132],{"class":628,"line":906},[626,2123,1125],{"class":832},[626,2125,925],{"class":701},[626,2127,726],{"class":701},[626,2129,1132],{"class":636},[626,2131,835],{"class":701},[626,2133,959],{"class":701},[626,2135,2136,2138,2140,2142,2144,2146,2148,2150,2152,2154,2156,2158,2160,2162,2164,2166,2168,2170,2172,2174,2176],{"class":628,"line":962},[626,2137,1141],{"class":832},[626,2139,925],{"class":701},[626,2141,702],{"class":701},[626,2143,1148],{"class":832},[626,2145,925],{"class":701},[626,2147,726],{"class":701},[626,2149,1155],{"class":636},[626,2151,835],{"class":701},[626,2153,709],{"class":701},[626,2155,1162],{"class":832},[626,2157,925],{"class":701},[626,2159,1054],{"class":705},[626,2161,537],{"class":701},[626,2163,1097],{"class":705},[626,2165,709],{"class":701},[626,2167,1175],{"class":832},[626,2169,925],{"class":701},[626,2171,1054],{"class":705},[626,2173,537],{"class":701},[626,2175,1184],{"class":705},[626,2177,977],{"class":701},[626,2179,2180,2182,2184,2186,2188,2190,2192,2194,2196,2198,2200,2202,2204,2206,2208],{"class":628,"line":980},[626,2181,1191],{"class":832},[626,2183,925],{"class":701},[626,2185,702],{"class":701},[626,2187,1148],{"class":832},[626,2189,925],{"class":701},[626,2191,726],{"class":701},[626,2193,1204],{"class":636},[626,2195,835],{"class":701},[626,2197,709],{"class":701},[626,2199,1162],{"class":832},[626,2201,925],{"class":701},[626,2203,1074],{"class":705},[626,2205,537],{"class":701},[626,2207,1097],{"class":705},[626,2209,977],{"class":701},[626,2211,2212,2214,2216,2218,2220,2222],{"class":628,"line":986},[626,2213,1225],{"class":832},[626,2215,925],{"class":701},[626,2217,726],{"class":701},[626,2219,1232],{"class":636},[626,2221,835],{"class":701},[626,2223,959],{"class":701},[626,2225,2226,2228,2230,2232,2234,2236],{"class":628,"line":1262},[626,2227,1241],{"class":832},[626,2229,925],{"class":701},[626,2231,726],{"class":701},[626,2233,1248],{"class":636},[626,2235,835],{"class":701},[626,2237,959],{"class":701},[626,2239,2240,2242],{"class":628,"line":1267},[626,2241,1257],{"class":701},[626,2243,992],{"class":832},[626,2245,2246],{"class":628,"line":1285},[626,2247,781],{"emptyLinePlaceholder":780},[626,2249,2250,2253,2255,2257,2259,2261,2263,2265,2267,2269],{"class":628,"line":1561},[626,2251,2252],{"class":705},"  res",[626,2254,537],{"class":701},[626,2256,1571],{"class":793},[626,2258,797],{"class":832},[626,2260,919],{"class":701},[626,2262,1275],{"class":832},[626,2264,925],{"class":701},[626,2266,974],{"class":973},[626,2268,720],{"class":701},[626,2270,992],{"class":832},[626,2272,2273,2275],{"class":628,"line":1588},[626,2274,989],{"class":701},[626,2276,992],{"class":705},[616,2278,2281],{"className":687,"code":2279,"filename":2280,"language":690,"meta":622,"style":622},"import { audit } from 'evlog'\n\naudit({\n  action: 'invoice.refund',\n  actor: { type: 'system', id: 'billing-worker' },\n  target: { type: 'invoice', id: 'inv_889' },\n  outcome: 'success',\n  reason: 'Auto-refund triggered by chargeback webhook',\n})\n","Standalone job",[530,2282,2283,2302,2306,2314,2329,2364,2398,2413,2429],{"__ignoreMap":622},[626,2284,2285,2287,2289,2292,2294,2296,2298,2300],{"class":628,"line":629},[626,2286,698],{"class":697},[626,2288,702],{"class":701},[626,2290,2291],{"class":705}," audit",[626,2293,720],{"class":701},[626,2295,723],{"class":697},[626,2297,726],{"class":701},[626,2299,729],{"class":636},[626,2301,732],{"class":701},[626,2303,2304],{"class":628,"line":735},[626,2305,781],{"emptyLinePlaceholder":780},[626,2307,2308,2310,2312],{"class":628,"line":756},[626,2309,532],{"class":793},[626,2311,797],{"class":705},[626,2313,1120],{"class":701},[626,2315,2316,2319,2321,2323,2325,2327],{"class":628,"line":777},[626,2317,2318],{"class":832},"  action",[626,2320,925],{"class":701},[626,2322,726],{"class":701},[626,2324,1132],{"class":636},[626,2326,835],{"class":701},[626,2328,959],{"class":701},[626,2330,2331,2334,2336,2338,2340,2342,2344,2347,2349,2351,2353,2355,2357,2360,2362],{"class":628,"line":784},[626,2332,2333],{"class":832},"  actor",[626,2335,925],{"class":701},[626,2337,702],{"class":701},[626,2339,1148],{"class":832},[626,2341,925],{"class":701},[626,2343,726],{"class":701},[626,2345,2346],{"class":636},"system",[626,2348,835],{"class":701},[626,2350,709],{"class":701},[626,2352,1162],{"class":832},[626,2354,925],{"class":701},[626,2356,726],{"class":701},[626,2358,2359],{"class":636},"billing-worker",[626,2361,835],{"class":701},[626,2363,977],{"class":701},[626,2365,2366,2369,2371,2373,2375,2377,2379,2381,2383,2385,2387,2389,2391,2394,2396],{"class":628,"line":816},[626,2367,2368],{"class":832},"  target",[626,2370,925],{"class":701},[626,2372,702],{"class":701},[626,2374,1148],{"class":832},[626,2376,925],{"class":701},[626,2378,726],{"class":701},[626,2380,1204],{"class":636},[626,2382,835],{"class":701},[626,2384,709],{"class":701},[626,2386,1162],{"class":832},[626,2388,925],{"class":701},[626,2390,726],{"class":701},[626,2392,2393],{"class":636},"inv_889",[626,2395,835],{"class":701},[626,2397,977],{"class":701},[626,2399,2400,2403,2405,2407,2409,2411],{"class":628,"line":850},[626,2401,2402],{"class":832},"  outcome",[626,2404,925],{"class":701},[626,2406,726],{"class":701},[626,2408,1232],{"class":636},[626,2410,835],{"class":701},[626,2412,959],{"class":701},[626,2414,2415,2418,2420,2422,2425,2427],{"class":628,"line":878},[626,2416,2417],{"class":832},"  reason",[626,2419,925],{"class":701},[626,2421,726],{"class":701},[626,2423,2424],{"class":636},"Auto-refund triggered by chargeback webhook",[626,2426,835],{"class":701},[626,2428,959],{"class":701},[626,2430,2431,2433],{"class":628,"line":906},[626,2432,989],{"class":701},[626,2434,992],{"class":705},[616,2436,2440],{"className":2437,"code":2438,"filename":2439,"language":1571,"meta":622,"style":622},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"level\": \"info\",\n  \"service\": \"billing-api\",\n  \"method\": \"POST\",\n  \"path\": \"\u002Fapi\u002Finvoices\u002Finv_889\u002Frefund\",\n  \"status\": 200,\n  \"duration\": \"84ms\",\n  \"requestId\": \"a566ef91-7765-4f59-b6f0-b9f40ce71599\",\n  \"audit\": {\n    \"action\": \"invoice.refund\",\n    \"actor\": { \"type\": \"user\", \"id\": \"usr_42\", \"email\": \"demo@example.com\" },\n    \"target\": { \"type\": \"invoice\", \"id\": \"inv_889\" },\n    \"outcome\": \"success\",\n    \"reason\": \"Customer requested refund\",\n    \"version\": 1,\n    \"idempotencyKey\": \"ak_8f3c4b2a1e5d6f7c\",\n    \"context\": {\n      \"requestId\": \"a566ef91-7765-4f59-b6f0-b9f40ce71599\",\n      \"ip\": \"203.0.113.7\",\n      \"userAgent\": \"Mozilla\u002F5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit\u002F537.36\"\n    }\n  }\n}\n","Output — wide event",[530,2441,2442,2446,2469,2489,2509,2529,2546,2566,2586,2598,2618,2682,2727,2746,2765,2781,2801,2814,2833,2853,2872,2878,2884],{"__ignoreMap":622},[626,2443,2444],{"class":628,"line":629},[626,2445,1120],{"class":701},[626,2447,2448,2451,2454,2457,2459,2462,2465,2467],{"class":628,"line":735},[626,2449,2450],{"class":701},"  \"",[626,2452,2453],{"class":809},"level",[626,2455,2456],{"class":701},"\"",[626,2458,925],{"class":701},[626,2460,2461],{"class":701}," \"",[626,2463,2464],{"class":636},"info",[626,2466,2456],{"class":701},[626,2468,959],{"class":701},[626,2470,2471,2473,2476,2478,2480,2482,2485,2487],{"class":628,"line":756},[626,2472,2450],{"class":701},[626,2474,2475],{"class":809},"service",[626,2477,2456],{"class":701},[626,2479,925],{"class":701},[626,2481,2461],{"class":701},[626,2483,2484],{"class":636},"billing-api",[626,2486,2456],{"class":701},[626,2488,959],{"class":701},[626,2490,2491,2493,2496,2498,2500,2502,2505,2507],{"class":628,"line":777},[626,2492,2450],{"class":701},[626,2494,2495],{"class":809},"method",[626,2497,2456],{"class":701},[626,2499,925],{"class":701},[626,2501,2461],{"class":701},[626,2503,2504],{"class":636},"POST",[626,2506,2456],{"class":701},[626,2508,959],{"class":701},[626,2510,2511,2513,2516,2518,2520,2522,2525,2527],{"class":628,"line":784},[626,2512,2450],{"class":701},[626,2514,2515],{"class":809},"path",[626,2517,2456],{"class":701},[626,2519,925],{"class":701},[626,2521,2461],{"class":701},[626,2523,2524],{"class":636},"\u002Fapi\u002Finvoices\u002Finv_889\u002Frefund",[626,2526,2456],{"class":701},[626,2528,959],{"class":701},[626,2530,2531,2533,2536,2538,2540,2544],{"class":628,"line":816},[626,2532,2450],{"class":701},[626,2534,2535],{"class":809},"status",[626,2537,2456],{"class":701},[626,2539,925],{"class":701},[626,2541,2543],{"class":2542},"sbssI"," 200",[626,2545,959],{"class":701},[626,2547,2548,2550,2553,2555,2557,2559,2562,2564],{"class":628,"line":850},[626,2549,2450],{"class":701},[626,2551,2552],{"class":809},"duration",[626,2554,2456],{"class":701},[626,2556,925],{"class":701},[626,2558,2461],{"class":701},[626,2560,2561],{"class":636},"84ms",[626,2563,2456],{"class":701},[626,2565,959],{"class":701},[626,2567,2568,2570,2573,2575,2577,2579,2582,2584],{"class":628,"line":878},[626,2569,2450],{"class":701},[626,2571,2572],{"class":809},"requestId",[626,2574,2456],{"class":701},[626,2576,925],{"class":701},[626,2578,2461],{"class":701},[626,2580,2581],{"class":636},"a566ef91-7765-4f59-b6f0-b9f40ce71599",[626,2583,2456],{"class":701},[626,2585,959],{"class":701},[626,2587,2588,2590,2592,2594,2596],{"class":628,"line":906},[626,2589,2450],{"class":701},[626,2591,532],{"class":809},[626,2593,2456],{"class":701},[626,2595,925],{"class":701},[626,2597,813],{"class":701},[626,2599,2600,2603,2606,2608,2610,2612,2614,2616],{"class":628,"line":962},[626,2601,2602],{"class":701},"    \"",[626,2604,2605],{"class":632},"action",[626,2607,2456],{"class":701},[626,2609,925],{"class":701},[626,2611,2461],{"class":701},[626,2613,1132],{"class":636},[626,2615,2456],{"class":701},[626,2617,959],{"class":701},[626,2619,2620,2622,2625,2627,2629,2631,2633,2636,2638,2640,2642,2644,2646,2648,2650,2652,2654,2656,2658,2661,2663,2665,2667,2669,2671,2673,2675,2678,2680],{"class":628,"line":980},[626,2621,2602],{"class":701},[626,2623,2624],{"class":632},"actor",[626,2626,2456],{"class":701},[626,2628,925],{"class":701},[626,2630,702],{"class":701},[626,2632,2461],{"class":701},[626,2634,2635],{"class":2542},"type",[626,2637,2456],{"class":701},[626,2639,925],{"class":701},[626,2641,2461],{"class":701},[626,2643,1155],{"class":636},[626,2645,2456],{"class":701},[626,2647,709],{"class":701},[626,2649,2461],{"class":701},[626,2651,1097],{"class":2542},[626,2653,2456],{"class":701},[626,2655,925],{"class":701},[626,2657,2461],{"class":701},[626,2659,2660],{"class":636},"usr_42",[626,2662,2456],{"class":701},[626,2664,709],{"class":701},[626,2666,2461],{"class":701},[626,2668,1184],{"class":2542},[626,2670,2456],{"class":701},[626,2672,925],{"class":701},[626,2674,2461],{"class":701},[626,2676,2677],{"class":636},"demo@example.com",[626,2679,2456],{"class":701},[626,2681,977],{"class":701},[626,2683,2684,2686,2689,2691,2693,2695,2697,2699,2701,2703,2705,2707,2709,2711,2713,2715,2717,2719,2721,2723,2725],{"class":628,"line":986},[626,2685,2602],{"class":701},[626,2687,2688],{"class":632},"target",[626,2690,2456],{"class":701},[626,2692,925],{"class":701},[626,2694,702],{"class":701},[626,2696,2461],{"class":701},[626,2698,2635],{"class":2542},[626,2700,2456],{"class":701},[626,2702,925],{"class":701},[626,2704,2461],{"class":701},[626,2706,1204],{"class":636},[626,2708,2456],{"class":701},[626,2710,709],{"class":701},[626,2712,2461],{"class":701},[626,2714,1097],{"class":2542},[626,2716,2456],{"class":701},[626,2718,925],{"class":701},[626,2720,2461],{"class":701},[626,2722,2393],{"class":636},[626,2724,2456],{"class":701},[626,2726,977],{"class":701},[626,2728,2729,2731,2734,2736,2738,2740,2742,2744],{"class":628,"line":1262},[626,2730,2602],{"class":701},[626,2732,2733],{"class":632},"outcome",[626,2735,2456],{"class":701},[626,2737,925],{"class":701},[626,2739,2461],{"class":701},[626,2741,1232],{"class":636},[626,2743,2456],{"class":701},[626,2745,959],{"class":701},[626,2747,2748,2750,2753,2755,2757,2759,2761,2763],{"class":628,"line":1267},[626,2749,2602],{"class":701},[626,2751,2752],{"class":632},"reason",[626,2754,2456],{"class":701},[626,2756,925],{"class":701},[626,2758,2461],{"class":701},[626,2760,1248],{"class":636},[626,2762,2456],{"class":701},[626,2764,959],{"class":701},[626,2766,2767,2769,2772,2774,2776,2779],{"class":628,"line":1285},[626,2768,2602],{"class":701},[626,2770,2771],{"class":632},"version",[626,2773,2456],{"class":701},[626,2775,925],{"class":701},[626,2777,2778],{"class":2542}," 1",[626,2780,959],{"class":701},[626,2782,2783,2785,2788,2790,2792,2794,2797,2799],{"class":628,"line":1561},[626,2784,2602],{"class":701},[626,2786,2787],{"class":632},"idempotencyKey",[626,2789,2456],{"class":701},[626,2791,925],{"class":701},[626,2793,2461],{"class":701},[626,2795,2796],{"class":636},"ak_8f3c4b2a1e5d6f7c",[626,2798,2456],{"class":701},[626,2800,959],{"class":701},[626,2802,2803,2805,2808,2810,2812],{"class":628,"line":1588},[626,2804,2602],{"class":701},[626,2806,2807],{"class":632},"context",[626,2809,2456],{"class":701},[626,2811,925],{"class":701},[626,2813,813],{"class":701},[626,2815,2816,2819,2821,2823,2825,2827,2829,2831],{"class":628,"line":1931},[626,2817,2818],{"class":701},"      \"",[626,2820,2572],{"class":2542},[626,2822,2456],{"class":701},[626,2824,925],{"class":701},[626,2826,2461],{"class":701},[626,2828,2581],{"class":636},[626,2830,2456],{"class":701},[626,2832,959],{"class":701},[626,2834,2835,2837,2840,2842,2844,2846,2849,2851],{"class":628,"line":1936},[626,2836,2818],{"class":701},[626,2838,2839],{"class":2542},"ip",[626,2841,2456],{"class":701},[626,2843,925],{"class":701},[626,2845,2461],{"class":701},[626,2847,2848],{"class":636},"203.0.113.7",[626,2850,2456],{"class":701},[626,2852,959],{"class":701},[626,2854,2855,2857,2860,2862,2864,2866,2869],{"class":628,"line":1961},[626,2856,2818],{"class":701},[626,2858,2859],{"class":2542},"userAgent",[626,2861,2456],{"class":701},[626,2863,925],{"class":701},[626,2865,2461],{"class":701},[626,2867,2868],{"class":636},"Mozilla\u002F5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit\u002F537.36",[626,2870,2871],{"class":701},"\"\n",[626,2873,2875],{"class":628,"line":2874},21,[626,2876,2877],{"class":701},"    }\n",[626,2879,2881],{"class":628,"line":2880},22,[626,2882,2883],{"class":701},"  }\n",[626,2885,2887],{"class":628,"line":2886},23,[626,2888,2889],{"class":701},"}\n",[521,2891,2892],{},"That's it. The audit event:",[547,2894,2895,2898,2905,2912],{},[550,2896,2897],{},"Travels through the same wide-event pipeline as the rest of your logs.",[550,2899,2900,2901,2904],{},"Is ",[525,2902,2903],{},"always kept"," past tail sampling.",[550,2906,2907,2908,2911],{},"Goes to your main drain (Axiom) ",[525,2909,2910],{},"and"," to a dedicated, signed, append-only sink (FS journal).",[550,2913,2914,2915,653,2917,653,2920,2922,2923,2925,2926,537],{},"Carries ",[530,2916,2572],{},[530,2918,2919],{},"traceId",[530,2921,2839],{},", and ",[530,2924,2859],{}," automatically via ",[530,2927,2928],{},"auditEnricher",[669,2930,2931,2934,2935,2938],{},[525,2932,2933],{},"Why two drains?"," The main drain (Axiom, Datadog, ...) keeps audits next to the rest of your telemetry so dashboards and queries still work. The signed sink is your insurance: if the main drain has an outage, gets purged, or an admin quietly removes a row, the FS journal still holds the chain. Auditors want both — fast querying ",[2936,2937,2910],"em",{}," a tamper-evident artefact.",[2940,2941],"audit-dual-sink",{},[586,2943,2945],{"id":2944},"composition","Composition",[521,2947,2948,2949,2952,2953,653,2955,2922,2957,601,2960,2963],{},"Each layer is ",[525,2950,2951],{},"opt-in and replaceable",". Every node except ",[530,2954,604],{},[530,2956,2928],{},[530,2958,2959],{},"auditOnly",[530,2961,2962],{},"signed"," is shared with regular wide events.",[2965,2966],"audit-composition-flow",{},[586,2968,2970],{"id":2969},"where-to-next","Where to next",[2972,2973,2974,2982,3005,3015,3018],"card-group",{},[2975,2976,2977,2978,2981],"card",{"icon":380,"title":377,"to":378},"The ",[530,2979,2980],{},"AuditFields"," type, action naming conventions, actor types, and idempotency.",[2975,2983,2985,653,2987,2990,2991,653,2994,653,2996,653,2999,2922,3002,537],{"icon":385,"title":2984,"to":383},"Recording Events",[530,2986,604],{},[530,2988,2989],{},"log.audit.deny",", standalone ",[530,2992,2993],{},"audit()",[530,2995,600],{},[530,2997,2998],{},"defineAuditAction",[530,3000,3001],{},"defineAuditCatalog",[530,3003,3004],{},"auditDiff",[2975,3006,3008,653,3010,2922,3012,3014],{"icon":390,"title":3007,"to":388},"Drains & Integrity",[530,3009,2928],{},[530,3011,2959],{},[530,3013,2962],{}," (HMAC and hash-chain) drain wrappers.",[2975,3016,3017],{"icon":369,"title":392,"to":393},"Integrity, redact presets, GDPR vs append-only, retention, and common pitfalls.",[2975,3019,3020,3021,3024],{"icon":79,"title":396,"to":397},"FS, Axiom, and Postgres recipes — plus testing with ",[530,3022,3023],{},"mockAudit"," and the API reference.",[3026,3027,3028],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":622,"searchDepth":735,"depth":735,"links":3030},[3031,3032,3033,3034,3035],{"id":588,"depth":735,"text":512},{"id":659,"depth":735,"text":660},{"id":680,"depth":735,"text":681},{"id":2944,"depth":735,"text":2945},{"id":2969,"depth":735,"text":2970},"First-class audit logs as a thin layer on top of evlog's wide events. Add tamper-evident audit trails to any app with one enricher, one drain wrapper, and one helper.","md",[3039,3042,3043,3044,3045],{"label":377,"icon":380,"to":378,"color":3040,"variant":3041},"neutral","subtle",{"label":382,"icon":385,"to":383,"color":3040,"variant":3041},{"label":3007,"icon":390,"to":388,"color":3040,"variant":3041},{"label":392,"icon":369,"to":393,"color":3040,"variant":3041},{"label":396,"icon":79,"to":397,"color":3040,"variant":3041},{},{"title":36,"icon":39},{"title":368,"description":3036},"edqnWc1dJv6KXwNogmmjS26ZY4v57pSY6xsGqiNKzxY",[3051,3053],{"title":364,"path":365,"stem":366,"description":3052,"icon":107,"children":-1},"Watch session resolution time, enable session caching, wire the standalone Nitro hook, and combine with the AI SDK integration.",{"title":377,"path":378,"stem":379,"description":3054,"icon":380,"children":-1},"The AuditFields type, action naming conventions, actor types, idempotency, and how the schema sits inside a regular wide event.",1785610596113]