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