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