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