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