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