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