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