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