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