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