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