[{"data":1,"prerenderedAt":4335},["ShallowReactive",2],{"navigation_docs":3,"-logging-audit-recording":421,"-logging-audit-recording-surround":4330},[4,35,159,201,289,318,405],{"title":5,"path":6,"stem":7,"children":8,"page":34},"Getting Started","\u002Fgetting-started","1.getting-started",[9,14,19,24,29],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-zap",{"title":25,"path":26,"stem":27,"icon":28},"Agent Skills","\u002Fgetting-started\u002Fagent-skills","1.getting-started\u002F4.agent-skills","i-lucide-sparkles",{"title":30,"path":31,"stem":32,"icon":33},"vs Other Loggers","\u002Fgetting-started\u002Fvs-other-loggers","1.getting-started\u002F5.vs-other-loggers","i-lucide-scale",false,{"title":36,"path":37,"stem":38,"children":39,"page":34},"Logging","\u002Flogging","2.logging",[40,45,50,55,60,65,70,99,127],{"title":41,"path":42,"stem":43,"icon":44},"Overview","\u002Flogging\u002Foverview","2.logging\u002F0.overview","i-lucide-list",{"title":46,"path":47,"stem":48,"icon":49},"Simple Logging","\u002Flogging\u002Fsimple-logging","2.logging\u002F1.simple-logging","i-lucide-terminal",{"title":51,"path":52,"stem":53,"icon":54},"Wide Events","\u002Flogging\u002Fwide-events","2.logging\u002F2.wide-events","i-lucide-layers",{"title":56,"path":57,"stem":58,"icon":59},"Structured Errors","\u002Flogging\u002Fstructured-errors","2.logging\u002F3.structured-errors","i-lucide-shield-alert",{"title":61,"path":62,"stem":63,"icon":64},"Catalogs","\u002Flogging\u002Fcatalogs","2.logging\u002F4.catalogs","i-lucide-book-open",{"title":66,"path":67,"stem":68,"icon":69},"Client Logging","\u002Flogging\u002Fclient-logging","2.logging\u002F5.client-logging","i-lucide-monitor",{"title":71,"icon":72,"path":73,"stem":74,"children":75,"page":34},"AI SDK","i-simple-icons-vercel","\u002Flogging\u002Fai-sdk","2.logging\u002F6.ai-sdk",[76,79,84,89,94],{"title":41,"path":77,"stem":78,"icon":44},"\u002Flogging\u002Fai-sdk\u002Foverview","2.logging\u002F6.ai-sdk\u002F01.overview",{"title":80,"path":81,"stem":82,"icon":83},"Usage","\u002Flogging\u002Fai-sdk\u002Fusage","2.logging\u002F6.ai-sdk\u002F02.usage","i-lucide-code",{"title":85,"path":86,"stem":87,"icon":88},"Options","\u002Flogging\u002Fai-sdk\u002Foptions","2.logging\u002F6.ai-sdk\u002F03.options","i-lucide-sliders",{"title":90,"path":91,"stem":92,"icon":93},"Metadata","\u002Flogging\u002Fai-sdk\u002Fmetadata","2.logging\u002F6.ai-sdk\u002F04.metadata","i-lucide-database",{"title":95,"path":96,"stem":97,"icon":98},"Telemetry","\u002Flogging\u002Fai-sdk\u002Ftelemetry","2.logging\u002F6.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":100,"icon":101,"path":102,"stem":103,"children":104,"page":34},"Better Auth","i-simple-icons-betterauth","\u002Flogging\u002Fbetter-auth","2.logging\u002F7.better-auth",[105,108,113,118,122],{"title":41,"path":106,"stem":107,"icon":44},"\u002Flogging\u002Fbetter-auth\u002Foverview","2.logging\u002F7.better-auth\u002F01.overview",{"title":109,"path":110,"stem":111,"icon":112},"Identify User","\u002Flogging\u002Fbetter-auth\u002Fidentify-user","2.logging\u002F7.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":114,"path":115,"stem":116,"icon":117},"Middleware","\u002Flogging\u002Fbetter-auth\u002Fmiddleware","2.logging\u002F7.better-auth\u002F03.middleware","i-lucide-shield",{"title":119,"path":120,"stem":121,"icon":69},"Client Sync","\u002Flogging\u002Fbetter-auth\u002Fclient-sync","2.logging\u002F7.better-auth\u002F04.client-sync",{"title":123,"path":124,"stem":125,"icon":126},"Performance","\u002Flogging\u002Fbetter-auth\u002Fperformance","2.logging\u002F7.better-auth\u002F05.performance","i-lucide-gauge",{"title":128,"icon":129,"path":130,"stem":131,"children":132,"page":34},"Audit Logs","i-lucide-shield-check","\u002Flogging\u002Faudit","2.logging\u002F8.audit",[133,136,141,146,151,155],{"title":41,"path":134,"stem":135,"icon":44},"\u002Flogging\u002Faudit\u002Foverview","2.logging\u002F8.audit\u002F01.overview",{"title":137,"path":138,"stem":139,"icon":140},"Schema","\u002Flogging\u002Faudit\u002Fschema","2.logging\u002F8.audit\u002F02.schema","i-lucide-file-text",{"title":142,"path":143,"stem":144,"icon":145},"Recording","\u002Flogging\u002Faudit\u002Frecording","2.logging\u002F8.audit\u002F03.recording","i-lucide-pen-line",{"title":147,"path":148,"stem":149,"icon":150},"Drains","\u002Flogging\u002Faudit\u002Fpipeline","2.logging\u002F8.audit\u002F04.pipeline","i-lucide-link",{"title":152,"path":153,"stem":154,"icon":129},"Compliance","\u002Flogging\u002Faudit\u002Fcompliance","2.logging\u002F8.audit\u002F05.compliance",{"title":156,"path":157,"stem":158,"icon":64},"Recipes","\u002Flogging\u002Faudit\u002Frecipes","2.logging\u002F8.audit\u002F06.recipes",{"title":160,"path":161,"stem":162,"children":163,"page":34},"Core Concepts","\u002Fcore-concepts","3.core-concepts",[164,169,174,179,184,188,191,196],{"title":165,"path":166,"stem":167,"icon":168},"Lifecycle","\u002Fcore-concepts\u002Flifecycle","3.core-concepts\u002F0.lifecycle","i-lucide-arrow-right-left",{"title":170,"path":171,"stem":172,"icon":173},"Configuration","\u002Fcore-concepts\u002Fconfiguration","3.core-concepts\u002F1.configuration","i-lucide-settings",{"title":175,"path":176,"stem":177,"icon":178},"Sampling","\u002Fcore-concepts\u002Fsampling","3.core-concepts\u002F2.sampling","i-lucide-filter",{"title":180,"path":181,"stem":182,"icon":183},"Typed Fields","\u002Fcore-concepts\u002Ftyped-fields","3.core-concepts\u002F3.typed-fields","i-simple-icons-typescript",{"title":185,"path":186,"stem":187,"icon":129},"Best Practices","\u002Fcore-concepts\u002Fbest-practices","3.core-concepts\u002F4.best-practices",{"title":123,"path":189,"stem":190,"icon":126},"\u002Fcore-concepts\u002Fperformance","3.core-concepts\u002F5.performance",{"title":192,"path":193,"stem":194,"icon":195},"Vite Plugin","\u002Fcore-concepts\u002Fvite-plugin","3.core-concepts\u002F6.vite-plugin","i-custom-vite",{"title":197,"path":198,"stem":199,"icon":200},"Auto-Redaction","\u002Fcore-concepts\u002Fredaction","3.core-concepts\u002F7.redaction","i-lucide-eye-off",{"title":202,"path":203,"stem":204,"children":205,"page":34},"Frameworks","\u002Fframeworks","4.frameworks",[206,210,215,220,225,230,235,240,245,250,255,260,265,270,274,279,284],{"title":41,"path":207,"stem":208,"icon":209},"\u002Fframeworks\u002Foverview","4.frameworks\u002F00.overview","i-lucide-layout-grid",{"title":211,"path":212,"stem":213,"icon":214},"Nuxt","\u002Fframeworks\u002Fnuxt","4.frameworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":216,"path":217,"stem":218,"icon":219},"Next.js","\u002Fframeworks\u002Fnextjs","4.frameworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":221,"path":222,"stem":223,"icon":224},"SvelteKit","\u002Fframeworks\u002Fsveltekit","4.frameworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":226,"path":227,"stem":228,"icon":229},"Nitro","\u002Fframeworks\u002Fnitro","4.frameworks\u002F04.nitro","i-custom-nitro",{"title":231,"path":232,"stem":233,"icon":234},"TanStack Start","\u002Fframeworks\u002Ftanstack-start","4.frameworks\u002F05.tanstack-start","i-custom-tanstack",{"title":236,"path":237,"stem":238,"icon":239},"NestJS","\u002Fframeworks\u002Fnestjs","4.frameworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":241,"path":242,"stem":243,"icon":244},"Express","\u002Fframeworks\u002Fexpress","4.frameworks\u002F07.express","i-simple-icons-express",{"title":246,"path":247,"stem":248,"icon":249},"Hono","\u002Fframeworks\u002Fhono","4.frameworks\u002F08.hono","i-simple-icons-hono",{"title":251,"path":252,"stem":253,"icon":254},"Fastify","\u002Fframeworks\u002Ffastify","4.frameworks\u002F09.fastify","i-simple-icons-fastify",{"title":256,"path":257,"stem":258,"icon":259},"Elysia","\u002Fframeworks\u002Felysia","4.frameworks\u002F10.elysia","i-custom-elysia",{"title":261,"path":262,"stem":263,"icon":264},"React Router","\u002Fframeworks\u002Freact-router","4.frameworks\u002F11.react-router","i-custom-reactrouter",{"title":266,"path":267,"stem":268,"icon":269},"Cloudflare Workers","\u002Fframeworks\u002Fcloudflare-workers","4.frameworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":271,"path":272,"stem":273,"icon":183},"Standalone","\u002Fframeworks\u002Fstandalone","4.frameworks\u002F13.standalone",{"title":275,"path":276,"stem":277,"icon":278},"Astro","\u002Fframeworks\u002Fastro","4.frameworks\u002F14.astro","i-simple-icons-astro",{"title":280,"path":281,"stem":282,"icon":283},"AWS Lambda","\u002Fframeworks\u002Faws-lambda","4.frameworks\u002F16.aws-lambda","i-custom-lambda",{"title":285,"path":286,"stem":287,"icon":288},"Custom Integration","\u002Fframeworks\u002Fcustom-integration","4.frameworks\u002F17.custom-integration","i-lucide-puzzle",{"title":290,"path":291,"stem":292,"children":293,"page":34},"Build on top","\u002Fbuild-on-top","5.build-on-top",[294,299,304,309,314],{"title":295,"path":296,"stem":297,"icon":298},"Identity headers","\u002Fbuild-on-top\u002Fidentity-headers","5.build-on-top\u002F1.identity-headers","i-lucide-fingerprint",{"title":300,"path":301,"stem":302,"icon":303},"Stream API","\u002Fbuild-on-top\u002Fstream-api","5.build-on-top\u002F2.stream-api","i-lucide-radio-tower",{"title":305,"path":306,"stem":307,"icon":308},"SSE bridge","\u002Fbuild-on-top\u002Fsse-bridge","5.build-on-top\u002F3.sse-bridge","i-lucide-wifi",{"title":310,"path":311,"stem":312,"icon":313},"FS reader","\u002Fbuild-on-top\u002Ffs-reader","5.build-on-top\u002F4.fs-reader","i-lucide-folder-search",{"title":156,"path":315,"stem":316,"icon":317},"\u002Fbuild-on-top\u002Frecipes","5.build-on-top\u002F4.recipes","i-lucide-chef-hat",{"title":319,"path":320,"stem":321,"children":322,"page":34},"Adapters","\u002Fadapters","6.adapters",[323,326,366,381],{"title":41,"path":324,"stem":325,"icon":44},"\u002Fadapters\u002Foverview","6.adapters\u002F01.overview",{"title":327,"path":328,"stem":329,"children":330,"page":34},"Cloud destinations","\u002Fadapters\u002Fcloud","6.adapters\u002F02.cloud",[331,336,341,346,351,356,361],{"title":332,"path":333,"stem":334,"icon":335},"Axiom","\u002Fadapters\u002Fcloud\u002Faxiom","6.adapters\u002F02.cloud\u002F01.axiom","i-custom-axiom",{"title":337,"path":338,"stem":339,"icon":340},"OTLP","\u002Fadapters\u002Fcloud\u002Fotlp","6.adapters\u002F02.cloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":342,"path":343,"stem":344,"icon":345},"PostHog","\u002Fadapters\u002Fcloud\u002Fposthog","6.adapters\u002F02.cloud\u002F03.posthog","i-simple-icons-posthog",{"title":347,"path":348,"stem":349,"icon":350},"Sentry","\u002Fadapters\u002Fcloud\u002Fsentry","6.adapters\u002F02.cloud\u002F04.sentry","i-simple-icons-sentry",{"title":352,"path":353,"stem":354,"icon":355},"Better Stack","\u002Fadapters\u002Fcloud\u002Fbetter-stack","6.adapters\u002F02.cloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":357,"path":358,"stem":359,"icon":360},"Datadog","\u002Fadapters\u002Fcloud\u002Fdatadog","6.adapters\u002F02.cloud\u002F06.datadog","i-simple-icons-datadog",{"title":362,"path":363,"stem":364,"icon":365},"HyperDX","\u002Fadapters\u002Fcloud\u002Fhyperdx","6.adapters\u002F02.cloud\u002F07.hyperdx","i-custom-hyperdx",{"title":367,"path":368,"stem":369,"children":370,"page":34},"Self-hosted","\u002Fadapters\u002Fself-hosted","6.adapters\u002F03.self-hosted",[371,376],{"title":372,"path":373,"stem":374,"icon":375},"File System","\u002Fadapters\u002Fself-hosted\u002Ffs","6.adapters\u002F03.self-hosted\u002F01.fs","i-lucide-hard-drive",{"title":377,"path":378,"stem":379,"icon":380},"NuxtHub","\u002Fadapters\u002Fself-hosted\u002Fnuxthub","6.adapters\u002F03.self-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":382,"path":383,"stem":384,"children":385,"page":34},"Building blocks","\u002Fadapters\u002Fbuilding-blocks","6.adapters\u002F04.building-blocks",[386,391,396,400],{"title":387,"path":388,"stem":389,"icon":390},"Pipeline","\u002Fadapters\u002Fbuilding-blocks\u002Fpipeline","6.adapters\u002F04.building-blocks\u002F01.pipeline","i-lucide-workflow",{"title":392,"path":393,"stem":394,"icon":395},"HTTP","\u002Fadapters\u002Fbuilding-blocks\u002Fhttp","6.adapters\u002F04.building-blocks\u002F02.http","i-lucide-globe",{"title":397,"path":398,"stem":399,"icon":83},"Custom Adapters","\u002Fadapters\u002Fbuilding-blocks\u002Fcustom","6.adapters\u002F04.building-blocks\u002F03.custom",{"title":401,"path":402,"stem":403,"icon":404},"Toolkit","\u002Fadapters\u002Fbuilding-blocks\u002Ftoolkit","6.adapters\u002F04.building-blocks\u002F04.toolkit","i-lucide-blocks",{"title":406,"path":407,"stem":408,"children":409,"page":34},"Enrichers","\u002Fenrichers","7.enrichers",[410,413,417],{"title":41,"path":411,"stem":412,"icon":28},"\u002Fenrichers\u002Foverview","7.enrichers\u002F1.overview",{"title":414,"path":415,"stem":416,"icon":288},"Built-in","\u002Fenrichers\u002Fbuilt-in","7.enrichers\u002F2.built-in",{"title":418,"path":419,"stem":420,"icon":83},"Custom","\u002Fenrichers\u002Fcustom","7.enrichers\u002F3.custom",{"id":422,"title":423,"body":424,"description":4318,"extension":4319,"links":4320,"meta":4326,"navigation":4327,"path":143,"seo":4328,"stem":144,"__hash__":4329},"docs\u002F2.logging\u002F8.audit\u002F03.recording.md","Recording Events",{"type":425,"value":426,"toc":4303},"minimark",[427,431,439,448,678,681,687,693,1315,1322,1327,1694,1714,1720,1725,1891,1899,1905,1931,2207,2220,2270,2281,2284,2335,2349,2353,2359,2436,2442,2455,2461,2467,2503,3173,3180,3186,3204,4259,4262,4299],[428,429,430],"p",{},"Five APIs cover every shape of audit recording: in-request, denied, standalone, auto-instrumented, and typed.",[432,433,435],"h2",{"id":434},"logaudit",[436,437,438],"code",{},"log.audit()",[428,440,441,443,444,447],{},[436,442,438],{}," is sugar over ",[436,445,446],{},"log.set({ audit: ... })"," plus tail-sample force-keep:",[449,450,455],"pre",{"className":451,"code":452,"language":453,"meta":454,"style":454},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","log.audit({\n  action: 'invoice.refund',\n  actor: { type: 'user', id: user.id },\n  target: { type: 'invoice', id: 'inv_889' },\n  outcome: 'success',\n})\n\n\u002F\u002F Strictly equivalent to:\nlog.set({ audit: { action: 'invoice.refund', \u002F* ... *\u002F, version: 1 } })\n","typescript","",[436,456,457,480,503,545,582,599,608,615,622],{"__ignoreMap":454},[458,459,462,466,470,474,477],"span",{"class":460,"line":461},"line",1,[458,463,465],{"class":464},"sTEyZ","log",[458,467,469],{"class":468},"sMK4o",".",[458,471,473],{"class":472},"s2Zo4","audit",[458,475,476],{"class":464},"(",[458,478,479],{"class":468},"{\n",[458,481,483,487,490,493,497,500],{"class":460,"line":482},2,[458,484,486],{"class":485},"swJcz","  action",[458,488,489],{"class":468},":",[458,491,492],{"class":468}," '",[458,494,496],{"class":495},"sfazB","invoice.refund",[458,498,499],{"class":468},"'",[458,501,502],{"class":468},",\n",[458,504,506,509,511,514,517,519,521,524,526,529,532,534,537,539,542],{"class":460,"line":505},3,[458,507,508],{"class":485},"  actor",[458,510,489],{"class":468},[458,512,513],{"class":468}," {",[458,515,516],{"class":485}," type",[458,518,489],{"class":468},[458,520,492],{"class":468},[458,522,523],{"class":495},"user",[458,525,499],{"class":468},[458,527,528],{"class":468},",",[458,530,531],{"class":485}," id",[458,533,489],{"class":468},[458,535,536],{"class":464}," user",[458,538,469],{"class":468},[458,540,541],{"class":464},"id ",[458,543,544],{"class":468},"},\n",[458,546,548,551,553,555,557,559,561,564,566,568,570,572,574,577,579],{"class":460,"line":547},4,[458,549,550],{"class":485},"  target",[458,552,489],{"class":468},[458,554,513],{"class":468},[458,556,516],{"class":485},[458,558,489],{"class":468},[458,560,492],{"class":468},[458,562,563],{"class":495},"invoice",[458,565,499],{"class":468},[458,567,528],{"class":468},[458,569,531],{"class":485},[458,571,489],{"class":468},[458,573,492],{"class":468},[458,575,576],{"class":495},"inv_889",[458,578,499],{"class":468},[458,580,581],{"class":468}," },\n",[458,583,585,588,590,592,595,597],{"class":460,"line":584},5,[458,586,587],{"class":485},"  outcome",[458,589,489],{"class":468},[458,591,492],{"class":468},[458,593,594],{"class":495},"success",[458,596,499],{"class":468},[458,598,502],{"class":468},[458,600,602,605],{"class":460,"line":601},6,[458,603,604],{"class":468},"}",[458,606,607],{"class":464},")\n",[458,609,611],{"class":460,"line":610},7,[458,612,614],{"emptyLinePlaceholder":613},true,"\n",[458,616,618],{"class":460,"line":617},8,[458,619,621],{"class":620},"sHwdD","\u002F\u002F Strictly equivalent to:\n",[458,623,625,627,629,632,634,637,640,642,644,647,649,651,653,655,657,660,662,665,667,671,674,676],{"class":460,"line":624},9,[458,626,465],{"class":464},[458,628,469],{"class":468},[458,630,631],{"class":472},"set",[458,633,476],{"class":464},[458,635,636],{"class":468},"{",[458,638,639],{"class":485}," audit",[458,641,489],{"class":468},[458,643,513],{"class":468},[458,645,646],{"class":485}," action",[458,648,489],{"class":468},[458,650,492],{"class":468},[458,652,496],{"class":495},[458,654,499],{"class":468},[458,656,528],{"class":468},[458,658,659],{"class":620}," \u002F* ... *\u002F",[458,661,528],{"class":468},[458,663,664],{"class":485}," version",[458,666,489],{"class":468},[458,668,670],{"class":669},"sbssI"," 1",[458,672,673],{"class":468}," }",[458,675,673],{"class":468},[458,677,607],{"class":464},[428,679,680],{},"This is the form you'll use most. The audit event lands on the same wide event as the rest of the request.",[432,682,684],{"id":683},"logauditdeny",[436,685,686],{},"log.audit.deny()",[428,688,689,692],{},[436,690,691],{},"log.audit.deny(reason, fields)"," records AuthZ-denied actions. Most teams forget to log denials, but they're exactly what auditors and security teams ask for:",[694,695,696,887],"code-group",{},[449,697,700],{"className":451,"code":698,"filename":699,"language":453,"meta":454,"style":454},"if (!user.canRefund(invoice)) {\n  log.audit.deny('Insufficient permissions', {\n    action: 'invoice.refund',\n    actor: { type: 'user', id: user.id },\n    target: { type: 'invoice', id: invoice.id },\n  })\n  throw createError({ status: 403, message: 'Forbidden' })\n}\n","Input",[436,701,702,726,754,769,803,837,844,882],{"__ignoreMap":454},[458,703,704,708,711,714,716,718,721,724],{"class":460,"line":461},[458,705,707],{"class":706},"s7zQu","if",[458,709,710],{"class":464}," (",[458,712,713],{"class":468},"!",[458,715,523],{"class":464},[458,717,469],{"class":468},[458,719,720],{"class":472},"canRefund",[458,722,723],{"class":464},"(invoice)) ",[458,725,479],{"class":468},[458,727,728,731,733,735,737,740,742,744,747,749,751],{"class":460,"line":482},[458,729,730],{"class":464},"  log",[458,732,469],{"class":468},[458,734,473],{"class":464},[458,736,469],{"class":468},[458,738,739],{"class":472},"deny",[458,741,476],{"class":485},[458,743,499],{"class":468},[458,745,746],{"class":495},"Insufficient permissions",[458,748,499],{"class":468},[458,750,528],{"class":468},[458,752,753],{"class":468}," {\n",[458,755,756,759,761,763,765,767],{"class":460,"line":505},[458,757,758],{"class":485},"    action",[458,760,489],{"class":468},[458,762,492],{"class":468},[458,764,496],{"class":495},[458,766,499],{"class":468},[458,768,502],{"class":468},[458,770,771,774,776,778,780,782,784,786,788,790,792,794,796,798,801],{"class":460,"line":547},[458,772,773],{"class":485},"    actor",[458,775,489],{"class":468},[458,777,513],{"class":468},[458,779,516],{"class":485},[458,781,489],{"class":468},[458,783,492],{"class":468},[458,785,523],{"class":495},[458,787,499],{"class":468},[458,789,528],{"class":468},[458,791,531],{"class":485},[458,793,489],{"class":468},[458,795,536],{"class":464},[458,797,469],{"class":468},[458,799,800],{"class":464},"id",[458,802,581],{"class":468},[458,804,805,808,810,812,814,816,818,820,822,824,826,828,831,833,835],{"class":460,"line":584},[458,806,807],{"class":485},"    target",[458,809,489],{"class":468},[458,811,513],{"class":468},[458,813,516],{"class":485},[458,815,489],{"class":468},[458,817,492],{"class":468},[458,819,563],{"class":495},[458,821,499],{"class":468},[458,823,528],{"class":468},[458,825,531],{"class":485},[458,827,489],{"class":468},[458,829,830],{"class":464}," invoice",[458,832,469],{"class":468},[458,834,800],{"class":464},[458,836,581],{"class":468},[458,838,839,842],{"class":460,"line":601},[458,840,841],{"class":468},"  }",[458,843,607],{"class":485},[458,845,846,849,852,854,856,859,861,864,866,869,871,873,876,878,880],{"class":460,"line":610},[458,847,848],{"class":706},"  throw",[458,850,851],{"class":472}," createError",[458,853,476],{"class":485},[458,855,636],{"class":468},[458,857,858],{"class":485}," status",[458,860,489],{"class":468},[458,862,863],{"class":669}," 403",[458,865,528],{"class":468},[458,867,868],{"class":485}," message",[458,870,489],{"class":468},[458,872,492],{"class":468},[458,874,875],{"class":495},"Forbidden",[458,877,499],{"class":468},[458,879,673],{"class":468},[458,881,607],{"class":485},[458,883,884],{"class":460,"line":617},[458,885,886],{"class":468},"}\n",[449,888,893],{"className":889,"code":890,"filename":891,"language":892,"meta":454,"style":454},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"level\": \"warn\",\n  \"service\": \"billing-api\",\n  \"method\": \"POST\",\n  \"path\": \"\u002Fapi\u002Finvoices\u002Finv_889\u002Frefund\",\n  \"status\": 403,\n  \"duration\": \"12ms\",\n  \"requestId\": \"9c3f7d12-8a45-4e60-b8a9-1f0d4c5e6e7d\",\n  \"audit\": {\n    \"action\": \"invoice.refund\",\n    \"actor\": { \"type\": \"user\", \"id\": \"usr_intruder\" },\n    \"target\": { \"type\": \"invoice\", \"id\": \"inv_889\" },\n    \"outcome\": \"denied\",\n    \"reason\": \"Insufficient permissions\",\n    \"version\": 1,\n    \"idempotencyKey\": \"ak_d12c3a4f5b6e7d8c\",\n    \"context\": {\n      \"requestId\": \"9c3f7d12-8a45-4e60-b8a9-1f0d4c5e6e7d\",\n      \"ip\": \"203.0.113.7\"\n    }\n  }\n}\n","Output — denied","json",[436,894,895,899,923,943,963,983,998,1018,1038,1050,1072,1120,1166,1187,1207,1223,1244,1258,1278,1298,1304,1310],{"__ignoreMap":454},[458,896,897],{"class":460,"line":461},[458,898,479],{"class":468},[458,900,901,904,908,911,913,916,919,921],{"class":460,"line":482},[458,902,903],{"class":468},"  \"",[458,905,907],{"class":906},"spNyl","level",[458,909,910],{"class":468},"\"",[458,912,489],{"class":468},[458,914,915],{"class":468}," \"",[458,917,918],{"class":495},"warn",[458,920,910],{"class":468},[458,922,502],{"class":468},[458,924,925,927,930,932,934,936,939,941],{"class":460,"line":505},[458,926,903],{"class":468},[458,928,929],{"class":906},"service",[458,931,910],{"class":468},[458,933,489],{"class":468},[458,935,915],{"class":468},[458,937,938],{"class":495},"billing-api",[458,940,910],{"class":468},[458,942,502],{"class":468},[458,944,945,947,950,952,954,956,959,961],{"class":460,"line":547},[458,946,903],{"class":468},[458,948,949],{"class":906},"method",[458,951,910],{"class":468},[458,953,489],{"class":468},[458,955,915],{"class":468},[458,957,958],{"class":495},"POST",[458,960,910],{"class":468},[458,962,502],{"class":468},[458,964,965,967,970,972,974,976,979,981],{"class":460,"line":584},[458,966,903],{"class":468},[458,968,969],{"class":906},"path",[458,971,910],{"class":468},[458,973,489],{"class":468},[458,975,915],{"class":468},[458,977,978],{"class":495},"\u002Fapi\u002Finvoices\u002Finv_889\u002Frefund",[458,980,910],{"class":468},[458,982,502],{"class":468},[458,984,985,987,990,992,994,996],{"class":460,"line":601},[458,986,903],{"class":468},[458,988,989],{"class":906},"status",[458,991,910],{"class":468},[458,993,489],{"class":468},[458,995,863],{"class":669},[458,997,502],{"class":468},[458,999,1000,1002,1005,1007,1009,1011,1014,1016],{"class":460,"line":610},[458,1001,903],{"class":468},[458,1003,1004],{"class":906},"duration",[458,1006,910],{"class":468},[458,1008,489],{"class":468},[458,1010,915],{"class":468},[458,1012,1013],{"class":495},"12ms",[458,1015,910],{"class":468},[458,1017,502],{"class":468},[458,1019,1020,1022,1025,1027,1029,1031,1034,1036],{"class":460,"line":617},[458,1021,903],{"class":468},[458,1023,1024],{"class":906},"requestId",[458,1026,910],{"class":468},[458,1028,489],{"class":468},[458,1030,915],{"class":468},[458,1032,1033],{"class":495},"9c3f7d12-8a45-4e60-b8a9-1f0d4c5e6e7d",[458,1035,910],{"class":468},[458,1037,502],{"class":468},[458,1039,1040,1042,1044,1046,1048],{"class":460,"line":624},[458,1041,903],{"class":468},[458,1043,473],{"class":906},[458,1045,910],{"class":468},[458,1047,489],{"class":468},[458,1049,753],{"class":468},[458,1051,1053,1056,1060,1062,1064,1066,1068,1070],{"class":460,"line":1052},10,[458,1054,1055],{"class":468},"    \"",[458,1057,1059],{"class":1058},"sBMFI","action",[458,1061,910],{"class":468},[458,1063,489],{"class":468},[458,1065,915],{"class":468},[458,1067,496],{"class":495},[458,1069,910],{"class":468},[458,1071,502],{"class":468},[458,1073,1075,1077,1080,1082,1084,1086,1088,1091,1093,1095,1097,1099,1101,1103,1105,1107,1109,1111,1113,1116,1118],{"class":460,"line":1074},11,[458,1076,1055],{"class":468},[458,1078,1079],{"class":1058},"actor",[458,1081,910],{"class":468},[458,1083,489],{"class":468},[458,1085,513],{"class":468},[458,1087,915],{"class":468},[458,1089,1090],{"class":669},"type",[458,1092,910],{"class":468},[458,1094,489],{"class":468},[458,1096,915],{"class":468},[458,1098,523],{"class":495},[458,1100,910],{"class":468},[458,1102,528],{"class":468},[458,1104,915],{"class":468},[458,1106,800],{"class":669},[458,1108,910],{"class":468},[458,1110,489],{"class":468},[458,1112,915],{"class":468},[458,1114,1115],{"class":495},"usr_intruder",[458,1117,910],{"class":468},[458,1119,581],{"class":468},[458,1121,1123,1125,1128,1130,1132,1134,1136,1138,1140,1142,1144,1146,1148,1150,1152,1154,1156,1158,1160,1162,1164],{"class":460,"line":1122},12,[458,1124,1055],{"class":468},[458,1126,1127],{"class":1058},"target",[458,1129,910],{"class":468},[458,1131,489],{"class":468},[458,1133,513],{"class":468},[458,1135,915],{"class":468},[458,1137,1090],{"class":669},[458,1139,910],{"class":468},[458,1141,489],{"class":468},[458,1143,915],{"class":468},[458,1145,563],{"class":495},[458,1147,910],{"class":468},[458,1149,528],{"class":468},[458,1151,915],{"class":468},[458,1153,800],{"class":669},[458,1155,910],{"class":468},[458,1157,489],{"class":468},[458,1159,915],{"class":468},[458,1161,576],{"class":495},[458,1163,910],{"class":468},[458,1165,581],{"class":468},[458,1167,1169,1171,1174,1176,1178,1180,1183,1185],{"class":460,"line":1168},13,[458,1170,1055],{"class":468},[458,1172,1173],{"class":1058},"outcome",[458,1175,910],{"class":468},[458,1177,489],{"class":468},[458,1179,915],{"class":468},[458,1181,1182],{"class":495},"denied",[458,1184,910],{"class":468},[458,1186,502],{"class":468},[458,1188,1190,1192,1195,1197,1199,1201,1203,1205],{"class":460,"line":1189},14,[458,1191,1055],{"class":468},[458,1193,1194],{"class":1058},"reason",[458,1196,910],{"class":468},[458,1198,489],{"class":468},[458,1200,915],{"class":468},[458,1202,746],{"class":495},[458,1204,910],{"class":468},[458,1206,502],{"class":468},[458,1208,1210,1212,1215,1217,1219,1221],{"class":460,"line":1209},15,[458,1211,1055],{"class":468},[458,1213,1214],{"class":1058},"version",[458,1216,910],{"class":468},[458,1218,489],{"class":468},[458,1220,670],{"class":669},[458,1222,502],{"class":468},[458,1224,1226,1228,1231,1233,1235,1237,1240,1242],{"class":460,"line":1225},16,[458,1227,1055],{"class":468},[458,1229,1230],{"class":1058},"idempotencyKey",[458,1232,910],{"class":468},[458,1234,489],{"class":468},[458,1236,915],{"class":468},[458,1238,1239],{"class":495},"ak_d12c3a4f5b6e7d8c",[458,1241,910],{"class":468},[458,1243,502],{"class":468},[458,1245,1247,1249,1252,1254,1256],{"class":460,"line":1246},17,[458,1248,1055],{"class":468},[458,1250,1251],{"class":1058},"context",[458,1253,910],{"class":468},[458,1255,489],{"class":468},[458,1257,753],{"class":468},[458,1259,1261,1264,1266,1268,1270,1272,1274,1276],{"class":460,"line":1260},18,[458,1262,1263],{"class":468},"      \"",[458,1265,1024],{"class":669},[458,1267,910],{"class":468},[458,1269,489],{"class":468},[458,1271,915],{"class":468},[458,1273,1033],{"class":495},[458,1275,910],{"class":468},[458,1277,502],{"class":468},[458,1279,1281,1283,1286,1288,1290,1292,1295],{"class":460,"line":1280},19,[458,1282,1263],{"class":468},[458,1284,1285],{"class":669},"ip",[458,1287,910],{"class":468},[458,1289,489],{"class":468},[458,1291,915],{"class":468},[458,1293,1294],{"class":495},"203.0.113.7",[458,1296,1297],{"class":468},"\"\n",[458,1299,1301],{"class":460,"line":1300},20,[458,1302,1303],{"class":468},"    }\n",[458,1305,1307],{"class":460,"line":1306},21,[458,1308,1309],{"class":468},"  }\n",[458,1311,1313],{"class":460,"line":1312},22,[458,1314,886],{"class":468},[432,1316,1318,1319],{"id":1317},"standalone-audit","Standalone ",[436,1320,1321],{},"audit()",[428,1323,1324,1325,489],{},"For non-request contexts (jobs, scripts, CLIs), use the standalone ",[436,1326,1321],{},[694,1328,1329,1472],{},[449,1330,1333],{"className":451,"code":1331,"filename":1332,"language":453,"meta":454,"style":454},"import { audit } from 'evlog'\n\naudit({\n  action: 'cron.cleanup',\n  actor: { type: 'system', id: 'cron' },\n  target: { type: 'job', id: 'cleanup-stale-sessions' },\n  outcome: 'success',\n})\n","scripts\u002Fcleanup.ts",[436,1334,1335,1357,1361,1369,1384,1418,1452,1466],{"__ignoreMap":454},[458,1336,1337,1340,1342,1344,1346,1349,1351,1354],{"class":460,"line":461},[458,1338,1339],{"class":706},"import",[458,1341,513],{"class":468},[458,1343,639],{"class":464},[458,1345,673],{"class":468},[458,1347,1348],{"class":706}," from",[458,1350,492],{"class":468},[458,1352,1353],{"class":495},"evlog",[458,1355,1356],{"class":468},"'\n",[458,1358,1359],{"class":460,"line":482},[458,1360,614],{"emptyLinePlaceholder":613},[458,1362,1363,1365,1367],{"class":460,"line":505},[458,1364,473],{"class":472},[458,1366,476],{"class":464},[458,1368,479],{"class":468},[458,1370,1371,1373,1375,1377,1380,1382],{"class":460,"line":547},[458,1372,486],{"class":485},[458,1374,489],{"class":468},[458,1376,492],{"class":468},[458,1378,1379],{"class":495},"cron.cleanup",[458,1381,499],{"class":468},[458,1383,502],{"class":468},[458,1385,1386,1388,1390,1392,1394,1396,1398,1401,1403,1405,1407,1409,1411,1414,1416],{"class":460,"line":584},[458,1387,508],{"class":485},[458,1389,489],{"class":468},[458,1391,513],{"class":468},[458,1393,516],{"class":485},[458,1395,489],{"class":468},[458,1397,492],{"class":468},[458,1399,1400],{"class":495},"system",[458,1402,499],{"class":468},[458,1404,528],{"class":468},[458,1406,531],{"class":485},[458,1408,489],{"class":468},[458,1410,492],{"class":468},[458,1412,1413],{"class":495},"cron",[458,1415,499],{"class":468},[458,1417,581],{"class":468},[458,1419,1420,1422,1424,1426,1428,1430,1432,1435,1437,1439,1441,1443,1445,1448,1450],{"class":460,"line":601},[458,1421,550],{"class":485},[458,1423,489],{"class":468},[458,1425,513],{"class":468},[458,1427,516],{"class":485},[458,1429,489],{"class":468},[458,1431,492],{"class":468},[458,1433,1434],{"class":495},"job",[458,1436,499],{"class":468},[458,1438,528],{"class":468},[458,1440,531],{"class":485},[458,1442,489],{"class":468},[458,1444,492],{"class":468},[458,1446,1447],{"class":495},"cleanup-stale-sessions",[458,1449,499],{"class":468},[458,1451,581],{"class":468},[458,1453,1454,1456,1458,1460,1462,1464],{"class":460,"line":610},[458,1455,587],{"class":485},[458,1457,489],{"class":468},[458,1459,492],{"class":468},[458,1461,594],{"class":495},[458,1463,499],{"class":468},[458,1465,502],{"class":468},[458,1467,1468,1470],{"class":460,"line":617},[458,1469,604],{"class":468},[458,1471,607],{"class":464},[449,1473,1476],{"className":889,"code":1474,"filename":1475,"language":892,"meta":454,"style":454},"{\n  \"level\": \"info\",\n  \"service\": \"billing-api\",\n  \"audit\": {\n    \"action\": \"cron.cleanup\",\n    \"actor\": { \"type\": \"system\", \"id\": \"cron\" },\n    \"target\": { \"type\": \"job\", \"id\": \"cleanup-stale-sessions\" },\n    \"outcome\": \"success\",\n    \"version\": 1,\n    \"idempotencyKey\": \"ak_2b8e1f9d4c6a7b3e\"\n  }\n}\n","Output — wide event",[436,1477,1478,1482,1501,1519,1531,1549,1593,1637,1655,1669,1686,1690],{"__ignoreMap":454},[458,1479,1480],{"class":460,"line":461},[458,1481,479],{"class":468},[458,1483,1484,1486,1488,1490,1492,1494,1497,1499],{"class":460,"line":482},[458,1485,903],{"class":468},[458,1487,907],{"class":906},[458,1489,910],{"class":468},[458,1491,489],{"class":468},[458,1493,915],{"class":468},[458,1495,1496],{"class":495},"info",[458,1498,910],{"class":468},[458,1500,502],{"class":468},[458,1502,1503,1505,1507,1509,1511,1513,1515,1517],{"class":460,"line":505},[458,1504,903],{"class":468},[458,1506,929],{"class":906},[458,1508,910],{"class":468},[458,1510,489],{"class":468},[458,1512,915],{"class":468},[458,1514,938],{"class":495},[458,1516,910],{"class":468},[458,1518,502],{"class":468},[458,1520,1521,1523,1525,1527,1529],{"class":460,"line":547},[458,1522,903],{"class":468},[458,1524,473],{"class":906},[458,1526,910],{"class":468},[458,1528,489],{"class":468},[458,1530,753],{"class":468},[458,1532,1533,1535,1537,1539,1541,1543,1545,1547],{"class":460,"line":584},[458,1534,1055],{"class":468},[458,1536,1059],{"class":1058},[458,1538,910],{"class":468},[458,1540,489],{"class":468},[458,1542,915],{"class":468},[458,1544,1379],{"class":495},[458,1546,910],{"class":468},[458,1548,502],{"class":468},[458,1550,1551,1553,1555,1557,1559,1561,1563,1565,1567,1569,1571,1573,1575,1577,1579,1581,1583,1585,1587,1589,1591],{"class":460,"line":601},[458,1552,1055],{"class":468},[458,1554,1079],{"class":1058},[458,1556,910],{"class":468},[458,1558,489],{"class":468},[458,1560,513],{"class":468},[458,1562,915],{"class":468},[458,1564,1090],{"class":669},[458,1566,910],{"class":468},[458,1568,489],{"class":468},[458,1570,915],{"class":468},[458,1572,1400],{"class":495},[458,1574,910],{"class":468},[458,1576,528],{"class":468},[458,1578,915],{"class":468},[458,1580,800],{"class":669},[458,1582,910],{"class":468},[458,1584,489],{"class":468},[458,1586,915],{"class":468},[458,1588,1413],{"class":495},[458,1590,910],{"class":468},[458,1592,581],{"class":468},[458,1594,1595,1597,1599,1601,1603,1605,1607,1609,1611,1613,1615,1617,1619,1621,1623,1625,1627,1629,1631,1633,1635],{"class":460,"line":610},[458,1596,1055],{"class":468},[458,1598,1127],{"class":1058},[458,1600,910],{"class":468},[458,1602,489],{"class":468},[458,1604,513],{"class":468},[458,1606,915],{"class":468},[458,1608,1090],{"class":669},[458,1610,910],{"class":468},[458,1612,489],{"class":468},[458,1614,915],{"class":468},[458,1616,1434],{"class":495},[458,1618,910],{"class":468},[458,1620,528],{"class":468},[458,1622,915],{"class":468},[458,1624,800],{"class":669},[458,1626,910],{"class":468},[458,1628,489],{"class":468},[458,1630,915],{"class":468},[458,1632,1447],{"class":495},[458,1634,910],{"class":468},[458,1636,581],{"class":468},[458,1638,1639,1641,1643,1645,1647,1649,1651,1653],{"class":460,"line":617},[458,1640,1055],{"class":468},[458,1642,1173],{"class":1058},[458,1644,910],{"class":468},[458,1646,489],{"class":468},[458,1648,915],{"class":468},[458,1650,594],{"class":495},[458,1652,910],{"class":468},[458,1654,502],{"class":468},[458,1656,1657,1659,1661,1663,1665,1667],{"class":460,"line":624},[458,1658,1055],{"class":468},[458,1660,1214],{"class":1058},[458,1662,910],{"class":468},[458,1664,489],{"class":468},[458,1666,670],{"class":669},[458,1668,502],{"class":468},[458,1670,1671,1673,1675,1677,1679,1681,1684],{"class":460,"line":1052},[458,1672,1055],{"class":468},[458,1674,1230],{"class":1058},[458,1676,910],{"class":468},[458,1678,489],{"class":468},[458,1680,915],{"class":468},[458,1682,1683],{"class":495},"ak_2b8e1f9d4c6a7b3e",[458,1685,1297],{"class":468},[458,1687,1688],{"class":460,"line":1074},[458,1689,1309],{"class":468},[458,1691,1692],{"class":460,"line":1122},[458,1693,886],{"class":468},[1695,1696,1318,1697,1699,1700,1702,1703,1702,1706,1709,1710,1713],"note",{},[436,1698,1321],{}," events have no ",[436,1701,1024],{},", no ",[436,1704,1705],{},"context.ip",[436,1707,1708],{},"userAgent"," — there is no request to enrich from. Add your own context manually (",[436,1711,1712],{},"context: { jobId, queue, runId }",") when it matters for forensics.",[432,1715,1717],{"id":1716},"defineauditaction",[436,1718,1719],{},"defineAuditAction()",[428,1721,1722,1723,489],{},"Define audit actions in one place to avoid magic strings and get full type-safety on ",[436,1724,1127],{},[449,1726,1728],{"className":451,"code":1727,"language":453,"meta":454,"style":454},"import { defineAuditAction } from 'evlog'\n\nconst refund = defineAuditAction('invoice.refund', { target: 'invoice' })\n\nlog.audit(refund({\n  actor: { type: 'user', id: user.id },\n  target: { id: 'inv_889' }, \u002F\u002F type inferred as 'invoice'\n  outcome: 'success',\n}))\n",[436,1729,1730,1749,1753,1793,1797,1814,1846,1870,1884],{"__ignoreMap":454},[458,1731,1732,1734,1736,1739,1741,1743,1745,1747],{"class":460,"line":461},[458,1733,1339],{"class":706},[458,1735,513],{"class":468},[458,1737,1738],{"class":464}," defineAuditAction",[458,1740,673],{"class":468},[458,1742,1348],{"class":706},[458,1744,492],{"class":468},[458,1746,1353],{"class":495},[458,1748,1356],{"class":468},[458,1750,1751],{"class":460,"line":482},[458,1752,614],{"emptyLinePlaceholder":613},[458,1754,1755,1758,1761,1764,1766,1768,1770,1772,1774,1776,1778,1781,1783,1785,1787,1789,1791],{"class":460,"line":505},[458,1756,1757],{"class":906},"const",[458,1759,1760],{"class":464}," refund ",[458,1762,1763],{"class":468},"=",[458,1765,1738],{"class":472},[458,1767,476],{"class":464},[458,1769,499],{"class":468},[458,1771,496],{"class":495},[458,1773,499],{"class":468},[458,1775,528],{"class":468},[458,1777,513],{"class":468},[458,1779,1780],{"class":485}," target",[458,1782,489],{"class":468},[458,1784,492],{"class":468},[458,1786,563],{"class":495},[458,1788,499],{"class":468},[458,1790,673],{"class":468},[458,1792,607],{"class":464},[458,1794,1795],{"class":460,"line":547},[458,1796,614],{"emptyLinePlaceholder":613},[458,1798,1799,1801,1803,1805,1807,1810,1812],{"class":460,"line":584},[458,1800,465],{"class":464},[458,1802,469],{"class":468},[458,1804,473],{"class":472},[458,1806,476],{"class":464},[458,1808,1809],{"class":472},"refund",[458,1811,476],{"class":464},[458,1813,479],{"class":468},[458,1815,1816,1818,1820,1822,1824,1826,1828,1830,1832,1834,1836,1838,1840,1842,1844],{"class":460,"line":601},[458,1817,508],{"class":485},[458,1819,489],{"class":468},[458,1821,513],{"class":468},[458,1823,516],{"class":485},[458,1825,489],{"class":468},[458,1827,492],{"class":468},[458,1829,523],{"class":495},[458,1831,499],{"class":468},[458,1833,528],{"class":468},[458,1835,531],{"class":485},[458,1837,489],{"class":468},[458,1839,536],{"class":464},[458,1841,469],{"class":468},[458,1843,541],{"class":464},[458,1845,544],{"class":468},[458,1847,1848,1850,1852,1854,1856,1858,1860,1862,1864,1867],{"class":460,"line":610},[458,1849,550],{"class":485},[458,1851,489],{"class":468},[458,1853,513],{"class":468},[458,1855,531],{"class":485},[458,1857,489],{"class":468},[458,1859,492],{"class":468},[458,1861,576],{"class":495},[458,1863,499],{"class":468},[458,1865,1866],{"class":468}," },",[458,1868,1869],{"class":620}," \u002F\u002F type inferred as 'invoice'\n",[458,1871,1872,1874,1876,1878,1880,1882],{"class":460,"line":617},[458,1873,587],{"class":485},[458,1875,489],{"class":468},[458,1877,492],{"class":468},[458,1879,594],{"class":495},[458,1881,499],{"class":468},[458,1883,502],{"class":468},[458,1885,1886,1888],{"class":460,"line":624},[458,1887,604],{"class":468},[458,1889,1890],{"class":464},"))\n",[428,1892,1893,1894,469],{},"Pair this with the action dictionary from ",[1895,1896,1898],"a",{"href":1897},"\u002Flogging\u002Faudit\u002Fschema#action-naming","Schema → Action naming",[432,1900,1902],{"id":1901},"defineauditcatalog",[436,1903,1904],{},"defineAuditCatalog()",[428,1906,1907,1908,1912,1913,1916,1917,1920,1921,1924,1925,1927,1928,469],{},"For more than a handful of actions, group them in a typed ",[1909,1910,1911],"strong",{},"catalog"," instead of declaring ",[436,1914,1915],{},"defineAuditAction"," one-by-one. Same convention as error catalogs: ",[436,1918,1919],{},"UPPER_SNAKE_CASE"," keys, ",[436,1922,1923],{},"lower.dot.case"," prefix, wire ",[436,1926,1059],{}," is ",[436,1929,1930],{},"${prefix}.${KEY}",[694,1932,1933,2083],{},[449,1934,1937],{"className":451,"code":1935,"filename":1936,"language":453,"meta":454,"style":454},"import { defineAuditCatalog } from 'evlog'\n\nexport const billingAudit = defineAuditCatalog('billing', {\n  INVOICE_REFUND:      { target: 'invoice' },\n  INVOICE_CREATE:      { target: 'invoice' },\n  INVOICE_VOID:        { target: 'invoice' },\n  SUBSCRIPTION_CANCEL: { target: 'subscription' },\n})\n","audit\u002Fbilling.ts",[436,1938,1939,1958,1962,1990,2012,2033,2055,2077],{"__ignoreMap":454},[458,1940,1941,1943,1945,1948,1950,1952,1954,1956],{"class":460,"line":461},[458,1942,1339],{"class":706},[458,1944,513],{"class":468},[458,1946,1947],{"class":464}," defineAuditCatalog",[458,1949,673],{"class":468},[458,1951,1348],{"class":706},[458,1953,492],{"class":468},[458,1955,1353],{"class":495},[458,1957,1356],{"class":468},[458,1959,1960],{"class":460,"line":482},[458,1961,614],{"emptyLinePlaceholder":613},[458,1963,1964,1967,1970,1973,1975,1977,1979,1981,1984,1986,1988],{"class":460,"line":505},[458,1965,1966],{"class":706},"export",[458,1968,1969],{"class":906}," const",[458,1971,1972],{"class":464}," billingAudit ",[458,1974,1763],{"class":468},[458,1976,1947],{"class":472},[458,1978,476],{"class":464},[458,1980,499],{"class":468},[458,1982,1983],{"class":495},"billing",[458,1985,499],{"class":468},[458,1987,528],{"class":468},[458,1989,753],{"class":468},[458,1991,1992,1995,1997,2000,2002,2004,2006,2008,2010],{"class":460,"line":547},[458,1993,1994],{"class":485},"  INVOICE_REFUND",[458,1996,489],{"class":468},[458,1998,1999],{"class":468},"      {",[458,2001,1780],{"class":485},[458,2003,489],{"class":468},[458,2005,492],{"class":468},[458,2007,563],{"class":495},[458,2009,499],{"class":468},[458,2011,581],{"class":468},[458,2013,2014,2017,2019,2021,2023,2025,2027,2029,2031],{"class":460,"line":584},[458,2015,2016],{"class":485},"  INVOICE_CREATE",[458,2018,489],{"class":468},[458,2020,1999],{"class":468},[458,2022,1780],{"class":485},[458,2024,489],{"class":468},[458,2026,492],{"class":468},[458,2028,563],{"class":495},[458,2030,499],{"class":468},[458,2032,581],{"class":468},[458,2034,2035,2038,2040,2043,2045,2047,2049,2051,2053],{"class":460,"line":601},[458,2036,2037],{"class":485},"  INVOICE_VOID",[458,2039,489],{"class":468},[458,2041,2042],{"class":468},"        {",[458,2044,1780],{"class":485},[458,2046,489],{"class":468},[458,2048,492],{"class":468},[458,2050,563],{"class":495},[458,2052,499],{"class":468},[458,2054,581],{"class":468},[458,2056,2057,2060,2062,2064,2066,2068,2070,2073,2075],{"class":460,"line":610},[458,2058,2059],{"class":485},"  SUBSCRIPTION_CANCEL",[458,2061,489],{"class":468},[458,2063,513],{"class":468},[458,2065,1780],{"class":485},[458,2067,489],{"class":468},[458,2069,492],{"class":468},[458,2071,2072],{"class":495},"subscription",[458,2074,499],{"class":468},[458,2076,581],{"class":468},[458,2078,2079,2081],{"class":460,"line":617},[458,2080,604],{"class":468},[458,2082,607],{"class":464},[449,2084,2087],{"className":451,"code":2085,"filename":2086,"language":453,"meta":454,"style":454},"import { billingAudit } from '~\u002Faudit\u002Fbilling'\n\nlog.audit(billingAudit.INVOICE_REFUND({\n  actor: { type: 'user', id: user.id },\n  target: { id: 'inv_889' }, \u002F\u002F type inferred as 'invoice'\n  outcome: 'success',\n}))\n","server\u002Fapi\u002Frefund.post.ts",[436,2088,2089,2109,2113,2133,2165,2187,2201],{"__ignoreMap":454},[458,2090,2091,2093,2095,2098,2100,2102,2104,2107],{"class":460,"line":461},[458,2092,1339],{"class":706},[458,2094,513],{"class":468},[458,2096,2097],{"class":464}," billingAudit",[458,2099,673],{"class":468},[458,2101,1348],{"class":706},[458,2103,492],{"class":468},[458,2105,2106],{"class":495},"~\u002Faudit\u002Fbilling",[458,2108,1356],{"class":468},[458,2110,2111],{"class":460,"line":482},[458,2112,614],{"emptyLinePlaceholder":613},[458,2114,2115,2117,2119,2121,2124,2126,2129,2131],{"class":460,"line":505},[458,2116,465],{"class":464},[458,2118,469],{"class":468},[458,2120,473],{"class":472},[458,2122,2123],{"class":464},"(billingAudit",[458,2125,469],{"class":468},[458,2127,2128],{"class":472},"INVOICE_REFUND",[458,2130,476],{"class":464},[458,2132,479],{"class":468},[458,2134,2135,2137,2139,2141,2143,2145,2147,2149,2151,2153,2155,2157,2159,2161,2163],{"class":460,"line":547},[458,2136,508],{"class":485},[458,2138,489],{"class":468},[458,2140,513],{"class":468},[458,2142,516],{"class":485},[458,2144,489],{"class":468},[458,2146,492],{"class":468},[458,2148,523],{"class":495},[458,2150,499],{"class":468},[458,2152,528],{"class":468},[458,2154,531],{"class":485},[458,2156,489],{"class":468},[458,2158,536],{"class":464},[458,2160,469],{"class":468},[458,2162,541],{"class":464},[458,2164,544],{"class":468},[458,2166,2167,2169,2171,2173,2175,2177,2179,2181,2183,2185],{"class":460,"line":584},[458,2168,550],{"class":485},[458,2170,489],{"class":468},[458,2172,513],{"class":468},[458,2174,531],{"class":485},[458,2176,489],{"class":468},[458,2178,492],{"class":468},[458,2180,576],{"class":495},[458,2182,499],{"class":468},[458,2184,1866],{"class":468},[458,2186,1869],{"class":620},[458,2188,2189,2191,2193,2195,2197,2199],{"class":460,"line":601},[458,2190,587],{"class":485},[458,2192,489],{"class":468},[458,2194,492],{"class":468},[458,2196,594],{"class":495},[458,2198,499],{"class":468},[458,2200,502],{"class":468},[458,2202,2203,2205],{"class":460,"line":610},[458,2204,604],{"class":468},[458,2206,1890],{"class":464},[428,2208,2209,2210,2212,2213,2216,2217,489],{},"Each entry produces a thin wrapper around ",[436,2211,1915],{}," (target type is fixed at definition time, action name is auto-prefixed). Catalog metadata is exposed on ",[436,2214,2215],{},"_actions"," and ",[436,2218,2219],{},"_prefix",[449,2221,2223],{"className":451,"code":2222,"language":453,"meta":454,"style":454},"billingAudit.INVOICE_REFUND.action \u002F\u002F 'billing.INVOICE_REFUND' (literal type)\nbillingAudit.INVOICE_REFUND.target \u002F\u002F 'invoice'\nbillingAudit._actions              \u002F\u002F readonly ['billing.INVOICE_REFUND', ...]\n",[436,2224,2225,2242,2258],{"__ignoreMap":454},[458,2226,2227,2230,2232,2234,2236,2239],{"class":460,"line":461},[458,2228,2229],{"class":464},"billingAudit",[458,2231,469],{"class":468},[458,2233,2128],{"class":464},[458,2235,469],{"class":468},[458,2237,2238],{"class":464},"action ",[458,2240,2241],{"class":620},"\u002F\u002F 'billing.INVOICE_REFUND' (literal type)\n",[458,2243,2244,2246,2248,2250,2252,2255],{"class":460,"line":482},[458,2245,2229],{"class":464},[458,2247,469],{"class":468},[458,2249,2128],{"class":464},[458,2251,469],{"class":468},[458,2253,2254],{"class":464},"target ",[458,2256,2257],{"class":620},"\u002F\u002F 'invoice'\n",[458,2259,2260,2262,2264,2267],{"class":460,"line":505},[458,2261,2229],{"class":464},[458,2263,469],{"class":468},[458,2265,2266],{"class":464},"_actions              ",[458,2268,2269],{"class":620},"\u002F\u002F readonly ['billing.INVOICE_REFUND', ...]\n",[2271,2272,2274,2276,2277,2280],"h3",{"id":2273},"defineauditaction-vs-defineauditcatalog-when-to-choose",[436,2275,1915],{}," vs ",[436,2278,2279],{},"defineAuditCatalog"," — when to choose",[428,2282,2283],{},"Both produce the same call-site factory shape. Pick by scale:",[2285,2286,2287,2303],"ul",{},[2288,2289,2290,2295,2296,2299,2300,2302],"li",{},[1909,2291,2292],{},[436,2293,2294],{},"defineAuditAction(action, opts?)"," — one-off actions, or per-file organisation in very large repos. Mirrors ",[436,2297,2298],{},"defineError",". Equivalent to a catalog with a single entry but with no prefix derivation: you write the full wire ",[436,2301,1059],{}," directly.",[2288,2304,2305,2310,2311,2314,2315,2317,2318,2320,2321,2323,2324,2326,2327,2330,2331,2334],{},[1909,2306,2307],{},[436,2308,2309],{},"defineAuditCatalog(prefix, map)"," — group anything beyond a handful of related actions under one prefix. Mirrors ",[436,2312,2313],{},"defineErrorCatalog",". The wire ",[436,2316,1059],{}," is auto-derived as ",[436,2319,1930],{},", catalog metadata (",[436,2322,2215],{},", ",[436,2325,2219],{},") is exposed for introspection, and a single ",[436,2328,2329],{},"declare module 'evlog'"," line surfaces the whole bundle in the typed ",[436,2332,2333],{},"AuditAction"," union.",[428,2336,2337,2338,2340,2341,2323,2343,2323,2346,2348],{},"You can mix the two in the same codebase — keep cross-cutting one-off actions as ",[436,2339,1915],{},", group bounded contexts (",[436,2342,1983],{},[436,2344,2345],{},"auth",[436,2347,2072],{},") as catalogs.",[2271,2350,2352],{"id":2351},"type-safe-actions-everywhere-opt-in","Type-safe actions everywhere (opt-in)",[428,2354,2355,2356,489],{},"Mirror the error catalog augmentation by augmenting ",[436,2357,2358],{},"RegisteredAuditCatalogs",[449,2360,2362],{"className":451,"code":2361,"language":453,"meta":454,"style":454},"import type { billingAudit } from '.\u002Faudit\u002Fbilling'\n\ndeclare module 'evlog' {\n  interface RegisteredAuditCatalogs {\n    billing: typeof billingAudit\n  }\n}\n",[436,2363,2364,2385,2389,2405,2415,2428,2432],{"__ignoreMap":454},[458,2365,2366,2368,2370,2372,2374,2376,2378,2380,2383],{"class":460,"line":461},[458,2367,1339],{"class":706},[458,2369,516],{"class":706},[458,2371,513],{"class":468},[458,2373,2097],{"class":464},[458,2375,673],{"class":468},[458,2377,1348],{"class":706},[458,2379,492],{"class":468},[458,2381,2382],{"class":495},".\u002Faudit\u002Fbilling",[458,2384,1356],{"class":468},[458,2386,2387],{"class":460,"line":482},[458,2388,614],{"emptyLinePlaceholder":613},[458,2390,2391,2394,2397,2399,2401,2403],{"class":460,"line":505},[458,2392,2393],{"class":906},"declare",[458,2395,2396],{"class":906}," module",[458,2398,492],{"class":468},[458,2400,1353],{"class":495},[458,2402,499],{"class":468},[458,2404,753],{"class":468},[458,2406,2407,2410,2413],{"class":460,"line":547},[458,2408,2409],{"class":906},"  interface",[458,2411,2412],{"class":1058}," RegisteredAuditCatalogs",[458,2414,753],{"class":468},[458,2416,2417,2420,2422,2425],{"class":460,"line":584},[458,2418,2419],{"class":485},"    billing",[458,2421,489],{"class":468},[458,2423,2424],{"class":468}," typeof",[458,2426,2427],{"class":464}," billingAudit\n",[458,2429,2430],{"class":460,"line":601},[458,2431,1309],{"class":468},[458,2433,2434],{"class":460,"line":610},[458,2435,886],{"class":468},[428,2437,2438,2439,2441],{},"This surfaces the union of all registered actions on the typed ",[436,2440,2333],{}," export, useful for shared helpers, dashboards, and refactor-safe comparisons.",[2443,2444,2447,2450,2451,2454],"callout",{"color":2445,"icon":2446,"to":62},"primary","i-lucide-arrow-right",[1909,2448,2449],{},"Going further."," The dedicated ",[1895,2452,2453],{"href":62},"Catalogs page"," covers the scaling story (single file → folder → feature → npm package) for both error and audit catalogs, plus npm packaging, composition patterns, and the type-augmentation deep dive.",[432,2456,2458],{"id":2457},"auditdiff",[436,2459,2460],{},"auditDiff()",[428,2462,2463,2464,2466],{},"For mutating actions, use ",[436,2465,2460],{}," to produce a compact, redact-aware JSON Patch:",[2468,2469,2470,2475,2476,1927,2479,2483,2484,2487,2488,2491,2492,2495,2496,2499,2500,2502],"warning",{},[1909,2471,2472,2473,469],{},"Don't feed entire DB rows into ",[436,2474,2460],{}," Strip computed columns, hashed passwords, internal flags, and large JSON blobs before diffing. The point of ",[436,2477,2478],{},"changes",[2480,2481,2482],"em",{},"what changed semantically"," (status went from ",[436,2485,2486],{},"paid"," → ",[436,2489,2490],{},"refunded","), not ",[2480,2493,2494],{},"what bytes changed"," (a ",[436,2497,2498],{},"lastModified"," timestamp ticked). A noisy ",[436,2501,2478],{}," field is the fastest way to make audit logs unreadable.",[694,2504,2505,2751],{},[449,2506,2508],{"className":451,"code":2507,"filename":699,"language":453,"meta":454,"style":454},"import { auditDiff } from 'evlog'\n\nconst before = await db.users.byId(id)\nconst after = await db.users.update(id, patch)\n\nlog.audit({\n  action: 'user.update',\n  actor: { type: 'user', id: actorId },\n  target: { type: 'user', id },\n  outcome: 'success',\n  changes: auditDiff(before, after, { redactPaths: ['password', 'token'] }),\n})\n",[436,2509,2510,2529,2533,2561,2591,2595,2607,2622,2651,2676,2690,2745],{"__ignoreMap":454},[458,2511,2512,2514,2516,2519,2521,2523,2525,2527],{"class":460,"line":461},[458,2513,1339],{"class":706},[458,2515,513],{"class":468},[458,2517,2518],{"class":464}," auditDiff",[458,2520,673],{"class":468},[458,2522,1348],{"class":706},[458,2524,492],{"class":468},[458,2526,1353],{"class":495},[458,2528,1356],{"class":468},[458,2530,2531],{"class":460,"line":482},[458,2532,614],{"emptyLinePlaceholder":613},[458,2534,2535,2537,2540,2542,2545,2548,2550,2553,2555,2558],{"class":460,"line":505},[458,2536,1757],{"class":906},[458,2538,2539],{"class":464}," before ",[458,2541,1763],{"class":468},[458,2543,2544],{"class":706}," await",[458,2546,2547],{"class":464}," db",[458,2549,469],{"class":468},[458,2551,2552],{"class":464},"users",[458,2554,469],{"class":468},[458,2556,2557],{"class":472},"byId",[458,2559,2560],{"class":464},"(id)\n",[458,2562,2563,2565,2568,2570,2572,2574,2576,2578,2580,2583,2586,2588],{"class":460,"line":547},[458,2564,1757],{"class":906},[458,2566,2567],{"class":464}," after ",[458,2569,1763],{"class":468},[458,2571,2544],{"class":706},[458,2573,2547],{"class":464},[458,2575,469],{"class":468},[458,2577,2552],{"class":464},[458,2579,469],{"class":468},[458,2581,2582],{"class":472},"update",[458,2584,2585],{"class":464},"(id",[458,2587,528],{"class":468},[458,2589,2590],{"class":464}," patch)\n",[458,2592,2593],{"class":460,"line":584},[458,2594,614],{"emptyLinePlaceholder":613},[458,2596,2597,2599,2601,2603,2605],{"class":460,"line":601},[458,2598,465],{"class":464},[458,2600,469],{"class":468},[458,2602,473],{"class":472},[458,2604,476],{"class":464},[458,2606,479],{"class":468},[458,2608,2609,2611,2613,2615,2618,2620],{"class":460,"line":610},[458,2610,486],{"class":485},[458,2612,489],{"class":468},[458,2614,492],{"class":468},[458,2616,2617],{"class":495},"user.update",[458,2619,499],{"class":468},[458,2621,502],{"class":468},[458,2623,2624,2626,2628,2630,2632,2634,2636,2638,2640,2642,2644,2646,2649],{"class":460,"line":617},[458,2625,508],{"class":485},[458,2627,489],{"class":468},[458,2629,513],{"class":468},[458,2631,516],{"class":485},[458,2633,489],{"class":468},[458,2635,492],{"class":468},[458,2637,523],{"class":495},[458,2639,499],{"class":468},[458,2641,528],{"class":468},[458,2643,531],{"class":485},[458,2645,489],{"class":468},[458,2647,2648],{"class":464}," actorId ",[458,2650,544],{"class":468},[458,2652,2653,2655,2657,2659,2661,2663,2665,2667,2669,2671,2674],{"class":460,"line":624},[458,2654,550],{"class":485},[458,2656,489],{"class":468},[458,2658,513],{"class":468},[458,2660,516],{"class":485},[458,2662,489],{"class":468},[458,2664,492],{"class":468},[458,2666,523],{"class":495},[458,2668,499],{"class":468},[458,2670,528],{"class":468},[458,2672,2673],{"class":464}," id ",[458,2675,544],{"class":468},[458,2677,2678,2680,2682,2684,2686,2688],{"class":460,"line":1052},[458,2679,587],{"class":485},[458,2681,489],{"class":468},[458,2683,492],{"class":468},[458,2685,594],{"class":495},[458,2687,499],{"class":468},[458,2689,502],{"class":468},[458,2691,2692,2695,2697,2699,2702,2704,2707,2709,2711,2714,2716,2719,2721,2724,2726,2728,2730,2733,2735,2738,2740,2743],{"class":460,"line":1074},[458,2693,2694],{"class":485},"  changes",[458,2696,489],{"class":468},[458,2698,2518],{"class":472},[458,2700,2701],{"class":464},"(before",[458,2703,528],{"class":468},[458,2705,2706],{"class":464}," after",[458,2708,528],{"class":468},[458,2710,513],{"class":468},[458,2712,2713],{"class":485}," redactPaths",[458,2715,489],{"class":468},[458,2717,2718],{"class":464}," [",[458,2720,499],{"class":468},[458,2722,2723],{"class":495},"password",[458,2725,499],{"class":468},[458,2727,528],{"class":468},[458,2729,492],{"class":468},[458,2731,2732],{"class":495},"token",[458,2734,499],{"class":468},[458,2736,2737],{"class":464},"] ",[458,2739,604],{"class":468},[458,2741,2742],{"class":464},")",[458,2744,502],{"class":468},[458,2746,2747,2749],{"class":460,"line":1122},[458,2748,604],{"class":468},[458,2750,607],{"class":464},[449,2752,2755],{"className":889,"code":2753,"filename":2754,"language":892,"meta":454,"style":454},"{\n  \"audit\": {\n    \"action\": \"user.update\",\n    \"actor\": { \"type\": \"user\", \"id\": \"usr_42\" },\n    \"target\": { \"type\": \"user\", \"id\": \"usr_99\" },\n    \"outcome\": \"success\",\n    \"changes\": [\n      { \"op\": \"replace\", \"path\": \"\u002Femail\", \"from\": \"old@example.com\", \"to\": \"new@example.com\" },\n      { \"op\": \"replace\", \"path\": \"\u002Frole\", \"from\": \"member\", \"to\": \"admin\" },\n      { \"op\": \"replace\", \"path\": \"\u002Fpassword\", \"from\": \"[REDACTED]\", \"to\": \"[REDACTED]\" }\n    ],\n    \"version\": 1,\n    \"idempotencyKey\": \"ak_5e7d8f9a0b1c2d3e\"\n  }\n}\n","Output — changes patch",[436,2756,2757,2761,2773,2791,2836,2881,2899,2912,2987,3058,3129,3134,3148,3165,3169],{"__ignoreMap":454},[458,2758,2759],{"class":460,"line":461},[458,2760,479],{"class":468},[458,2762,2763,2765,2767,2769,2771],{"class":460,"line":482},[458,2764,903],{"class":468},[458,2766,473],{"class":906},[458,2768,910],{"class":468},[458,2770,489],{"class":468},[458,2772,753],{"class":468},[458,2774,2775,2777,2779,2781,2783,2785,2787,2789],{"class":460,"line":505},[458,2776,1055],{"class":468},[458,2778,1059],{"class":1058},[458,2780,910],{"class":468},[458,2782,489],{"class":468},[458,2784,915],{"class":468},[458,2786,2617],{"class":495},[458,2788,910],{"class":468},[458,2790,502],{"class":468},[458,2792,2793,2795,2797,2799,2801,2803,2805,2807,2809,2811,2813,2815,2817,2819,2821,2823,2825,2827,2829,2832,2834],{"class":460,"line":547},[458,2794,1055],{"class":468},[458,2796,1079],{"class":1058},[458,2798,910],{"class":468},[458,2800,489],{"class":468},[458,2802,513],{"class":468},[458,2804,915],{"class":468},[458,2806,1090],{"class":669},[458,2808,910],{"class":468},[458,2810,489],{"class":468},[458,2812,915],{"class":468},[458,2814,523],{"class":495},[458,2816,910],{"class":468},[458,2818,528],{"class":468},[458,2820,915],{"class":468},[458,2822,800],{"class":669},[458,2824,910],{"class":468},[458,2826,489],{"class":468},[458,2828,915],{"class":468},[458,2830,2831],{"class":495},"usr_42",[458,2833,910],{"class":468},[458,2835,581],{"class":468},[458,2837,2838,2840,2842,2844,2846,2848,2850,2852,2854,2856,2858,2860,2862,2864,2866,2868,2870,2872,2874,2877,2879],{"class":460,"line":584},[458,2839,1055],{"class":468},[458,2841,1127],{"class":1058},[458,2843,910],{"class":468},[458,2845,489],{"class":468},[458,2847,513],{"class":468},[458,2849,915],{"class":468},[458,2851,1090],{"class":669},[458,2853,910],{"class":468},[458,2855,489],{"class":468},[458,2857,915],{"class":468},[458,2859,523],{"class":495},[458,2861,910],{"class":468},[458,2863,528],{"class":468},[458,2865,915],{"class":468},[458,2867,800],{"class":669},[458,2869,910],{"class":468},[458,2871,489],{"class":468},[458,2873,915],{"class":468},[458,2875,2876],{"class":495},"usr_99",[458,2878,910],{"class":468},[458,2880,581],{"class":468},[458,2882,2883,2885,2887,2889,2891,2893,2895,2897],{"class":460,"line":601},[458,2884,1055],{"class":468},[458,2886,1173],{"class":1058},[458,2888,910],{"class":468},[458,2890,489],{"class":468},[458,2892,915],{"class":468},[458,2894,594],{"class":495},[458,2896,910],{"class":468},[458,2898,502],{"class":468},[458,2900,2901,2903,2905,2907,2909],{"class":460,"line":610},[458,2902,1055],{"class":468},[458,2904,2478],{"class":1058},[458,2906,910],{"class":468},[458,2908,489],{"class":468},[458,2910,2911],{"class":468}," [\n",[458,2913,2914,2916,2918,2921,2923,2925,2927,2930,2932,2934,2936,2938,2940,2942,2944,2947,2949,2951,2953,2956,2958,2960,2962,2965,2967,2969,2971,2974,2976,2978,2980,2983,2985],{"class":460,"line":617},[458,2915,1999],{"class":468},[458,2917,915],{"class":468},[458,2919,2920],{"class":669},"op",[458,2922,910],{"class":468},[458,2924,489],{"class":468},[458,2926,915],{"class":468},[458,2928,2929],{"class":495},"replace",[458,2931,910],{"class":468},[458,2933,528],{"class":468},[458,2935,915],{"class":468},[458,2937,969],{"class":669},[458,2939,910],{"class":468},[458,2941,489],{"class":468},[458,2943,915],{"class":468},[458,2945,2946],{"class":495},"\u002Femail",[458,2948,910],{"class":468},[458,2950,528],{"class":468},[458,2952,915],{"class":468},[458,2954,2955],{"class":669},"from",[458,2957,910],{"class":468},[458,2959,489],{"class":468},[458,2961,915],{"class":468},[458,2963,2964],{"class":495},"old@example.com",[458,2966,910],{"class":468},[458,2968,528],{"class":468},[458,2970,915],{"class":468},[458,2972,2973],{"class":669},"to",[458,2975,910],{"class":468},[458,2977,489],{"class":468},[458,2979,915],{"class":468},[458,2981,2982],{"class":495},"new@example.com",[458,2984,910],{"class":468},[458,2986,581],{"class":468},[458,2988,2989,2991,2993,2995,2997,2999,3001,3003,3005,3007,3009,3011,3013,3015,3017,3020,3022,3024,3026,3028,3030,3032,3034,3037,3039,3041,3043,3045,3047,3049,3051,3054,3056],{"class":460,"line":624},[458,2990,1999],{"class":468},[458,2992,915],{"class":468},[458,2994,2920],{"class":669},[458,2996,910],{"class":468},[458,2998,489],{"class":468},[458,3000,915],{"class":468},[458,3002,2929],{"class":495},[458,3004,910],{"class":468},[458,3006,528],{"class":468},[458,3008,915],{"class":468},[458,3010,969],{"class":669},[458,3012,910],{"class":468},[458,3014,489],{"class":468},[458,3016,915],{"class":468},[458,3018,3019],{"class":495},"\u002Frole",[458,3021,910],{"class":468},[458,3023,528],{"class":468},[458,3025,915],{"class":468},[458,3027,2955],{"class":669},[458,3029,910],{"class":468},[458,3031,489],{"class":468},[458,3033,915],{"class":468},[458,3035,3036],{"class":495},"member",[458,3038,910],{"class":468},[458,3040,528],{"class":468},[458,3042,915],{"class":468},[458,3044,2973],{"class":669},[458,3046,910],{"class":468},[458,3048,489],{"class":468},[458,3050,915],{"class":468},[458,3052,3053],{"class":495},"admin",[458,3055,910],{"class":468},[458,3057,581],{"class":468},[458,3059,3060,3062,3064,3066,3068,3070,3072,3074,3076,3078,3080,3082,3084,3086,3088,3091,3093,3095,3097,3099,3101,3103,3105,3108,3110,3112,3114,3116,3118,3120,3122,3124,3126],{"class":460,"line":1052},[458,3061,1999],{"class":468},[458,3063,915],{"class":468},[458,3065,2920],{"class":669},[458,3067,910],{"class":468},[458,3069,489],{"class":468},[458,3071,915],{"class":468},[458,3073,2929],{"class":495},[458,3075,910],{"class":468},[458,3077,528],{"class":468},[458,3079,915],{"class":468},[458,3081,969],{"class":669},[458,3083,910],{"class":468},[458,3085,489],{"class":468},[458,3087,915],{"class":468},[458,3089,3090],{"class":495},"\u002Fpassword",[458,3092,910],{"class":468},[458,3094,528],{"class":468},[458,3096,915],{"class":468},[458,3098,2955],{"class":669},[458,3100,910],{"class":468},[458,3102,489],{"class":468},[458,3104,915],{"class":468},[458,3106,3107],{"class":495},"[REDACTED]",[458,3109,910],{"class":468},[458,3111,528],{"class":468},[458,3113,915],{"class":468},[458,3115,2973],{"class":669},[458,3117,910],{"class":468},[458,3119,489],{"class":468},[458,3121,915],{"class":468},[458,3123,3107],{"class":495},[458,3125,910],{"class":468},[458,3127,3128],{"class":468}," }\n",[458,3130,3131],{"class":460,"line":1074},[458,3132,3133],{"class":468},"    ],\n",[458,3135,3136,3138,3140,3142,3144,3146],{"class":460,"line":1122},[458,3137,1055],{"class":468},[458,3139,1214],{"class":1058},[458,3141,910],{"class":468},[458,3143,489],{"class":468},[458,3145,670],{"class":669},[458,3147,502],{"class":468},[458,3149,3150,3152,3154,3156,3158,3160,3163],{"class":460,"line":1168},[458,3151,1055],{"class":468},[458,3153,1230],{"class":1058},[458,3155,910],{"class":468},[458,3157,489],{"class":468},[458,3159,915],{"class":468},[458,3161,3162],{"class":495},"ak_5e7d8f9a0b1c2d3e",[458,3164,1297],{"class":468},[458,3166,3167],{"class":460,"line":1189},[458,3168,1309],{"class":468},[458,3170,3171],{"class":460,"line":1209},[458,3172,886],{"class":468},[432,3174,3176,3179],{"id":3175},"withaudit-auto-instrumentation",[436,3177,3178],{},"withAudit()"," — auto-instrumentation",[428,3181,3182,3183,3185],{},"Devs forget to call ",[436,3184,438],{},". Wrap the function and never miss a record:",[3187,3188,3189,3192,3193,3196,3197,3199,3200,3203],"tip",{},[1909,3190,3191],{},"When to wrap vs. call manually."," Wrap functions that are ",[2480,3194,3195],{},"pure audit-worthy actions"," (refund, delete, role change, password reset) — outcome resolution is automatic and you can't accidentally skip the call. Stick to manual ",[436,3198,438],{}," when the audit is one of several decisions inside a larger handler, or when you need to emit the audit ",[2480,3201,3202],{},"before"," the action completes (e.g. \"user requested deletion\").",[694,3205,3206,3500,3705,4021],{},[449,3207,3209],{"className":451,"code":3208,"filename":699,"language":453,"meta":454,"style":454},"import { withAudit, AuditDeniedError } from 'evlog'\n\nconst refundInvoice = withAudit(\n  { action: 'invoice.refund', target: input => ({ type: 'invoice', id: input.id }) },\n  async (input: { id: string }, ctx) => {\n    if (!ctx.actor) throw new AuditDeniedError('Anonymous refund denied')\n    return await db.invoices.refund(input.id)\n  },\n)\n\nawait refundInvoice({ id: 'inv_889' }, {\n  actor: { type: 'user', id: user.id },\n  correlationId: requestId,\n})\n",[436,3210,3211,3235,3239,3253,3314,3346,3383,3411,3416,3420,3424,3450,3482,3494],{"__ignoreMap":454},[458,3212,3213,3215,3217,3220,3222,3225,3227,3229,3231,3233],{"class":460,"line":461},[458,3214,1339],{"class":706},[458,3216,513],{"class":468},[458,3218,3219],{"class":464}," withAudit",[458,3221,528],{"class":468},[458,3223,3224],{"class":464}," AuditDeniedError",[458,3226,673],{"class":468},[458,3228,1348],{"class":706},[458,3230,492],{"class":468},[458,3232,1353],{"class":495},[458,3234,1356],{"class":468},[458,3236,3237],{"class":460,"line":482},[458,3238,614],{"emptyLinePlaceholder":613},[458,3240,3241,3243,3246,3248,3250],{"class":460,"line":505},[458,3242,1757],{"class":906},[458,3244,3245],{"class":464}," refundInvoice ",[458,3247,1763],{"class":468},[458,3249,3219],{"class":472},[458,3251,3252],{"class":464},"(\n",[458,3254,3255,3258,3260,3262,3264,3266,3268,3270,3272,3274,3278,3281,3283,3285,3287,3289,3291,3293,3295,3297,3299,3301,3303,3305,3307,3309,3312],{"class":460,"line":547},[458,3256,3257],{"class":468},"  {",[458,3259,646],{"class":485},[458,3261,489],{"class":468},[458,3263,492],{"class":468},[458,3265,496],{"class":495},[458,3267,499],{"class":468},[458,3269,528],{"class":468},[458,3271,1780],{"class":472},[458,3273,489],{"class":468},[458,3275,3277],{"class":3276},"sHdIc"," input",[458,3279,3280],{"class":906}," =>",[458,3282,710],{"class":464},[458,3284,636],{"class":468},[458,3286,516],{"class":485},[458,3288,489],{"class":468},[458,3290,492],{"class":468},[458,3292,563],{"class":495},[458,3294,499],{"class":468},[458,3296,528],{"class":468},[458,3298,531],{"class":485},[458,3300,489],{"class":468},[458,3302,3277],{"class":464},[458,3304,469],{"class":468},[458,3306,541],{"class":464},[458,3308,604],{"class":468},[458,3310,3311],{"class":464},") ",[458,3313,544],{"class":468},[458,3315,3316,3319,3321,3324,3326,3328,3330,3332,3335,3337,3340,3342,3344],{"class":460,"line":584},[458,3317,3318],{"class":906},"  async",[458,3320,710],{"class":468},[458,3322,3323],{"class":3276},"input",[458,3325,489],{"class":468},[458,3327,513],{"class":468},[458,3329,531],{"class":485},[458,3331,489],{"class":468},[458,3333,3334],{"class":1058}," string",[458,3336,1866],{"class":468},[458,3338,3339],{"class":3276}," ctx",[458,3341,2742],{"class":468},[458,3343,3280],{"class":906},[458,3345,753],{"class":468},[458,3347,3348,3351,3353,3355,3358,3360,3362,3364,3367,3370,3372,3374,3376,3379,3381],{"class":460,"line":601},[458,3349,3350],{"class":706},"    if",[458,3352,710],{"class":485},[458,3354,713],{"class":468},[458,3356,3357],{"class":464},"ctx",[458,3359,469],{"class":468},[458,3361,1079],{"class":464},[458,3363,3311],{"class":485},[458,3365,3366],{"class":706},"throw",[458,3368,3369],{"class":468}," new",[458,3371,3224],{"class":472},[458,3373,476],{"class":485},[458,3375,499],{"class":468},[458,3377,3378],{"class":495},"Anonymous refund denied",[458,3380,499],{"class":468},[458,3382,607],{"class":485},[458,3384,3385,3388,3390,3392,3394,3397,3399,3401,3403,3405,3407,3409],{"class":460,"line":610},[458,3386,3387],{"class":706},"    return",[458,3389,2544],{"class":706},[458,3391,2547],{"class":464},[458,3393,469],{"class":468},[458,3395,3396],{"class":464},"invoices",[458,3398,469],{"class":468},[458,3400,1809],{"class":472},[458,3402,476],{"class":485},[458,3404,3323],{"class":464},[458,3406,469],{"class":468},[458,3408,800],{"class":464},[458,3410,607],{"class":485},[458,3412,3413],{"class":460,"line":617},[458,3414,3415],{"class":468},"  },\n",[458,3417,3418],{"class":460,"line":624},[458,3419,607],{"class":464},[458,3421,3422],{"class":460,"line":1052},[458,3423,614],{"emptyLinePlaceholder":613},[458,3425,3426,3429,3432,3434,3436,3438,3440,3442,3444,3446,3448],{"class":460,"line":1074},[458,3427,3428],{"class":706},"await",[458,3430,3431],{"class":472}," refundInvoice",[458,3433,476],{"class":464},[458,3435,636],{"class":468},[458,3437,531],{"class":485},[458,3439,489],{"class":468},[458,3441,492],{"class":468},[458,3443,576],{"class":495},[458,3445,499],{"class":468},[458,3447,1866],{"class":468},[458,3449,753],{"class":468},[458,3451,3452,3454,3456,3458,3460,3462,3464,3466,3468,3470,3472,3474,3476,3478,3480],{"class":460,"line":1122},[458,3453,508],{"class":485},[458,3455,489],{"class":468},[458,3457,513],{"class":468},[458,3459,516],{"class":485},[458,3461,489],{"class":468},[458,3463,492],{"class":468},[458,3465,523],{"class":495},[458,3467,499],{"class":468},[458,3469,528],{"class":468},[458,3471,531],{"class":485},[458,3473,489],{"class":468},[458,3475,536],{"class":464},[458,3477,469],{"class":468},[458,3479,541],{"class":464},[458,3481,544],{"class":468},[458,3483,3484,3487,3489,3492],{"class":460,"line":1168},[458,3485,3486],{"class":485},"  correlationId",[458,3488,489],{"class":468},[458,3490,3491],{"class":464}," requestId",[458,3493,502],{"class":468},[458,3495,3496,3498],{"class":460,"line":1189},[458,3497,604],{"class":468},[458,3499,607],{"class":464},[449,3501,3504],{"className":889,"code":3502,"filename":3503,"language":892,"meta":454,"style":454},"{\n  \"audit\": {\n    \"action\": \"invoice.refund\",\n    \"actor\": { \"type\": \"user\", \"id\": \"usr_42\" },\n    \"target\": { \"type\": \"invoice\", \"id\": \"inv_889\" },\n    \"outcome\": \"success\",\n    \"version\": 1,\n    \"idempotencyKey\": \"ak_8f3c4b2a1e5d6f7c\",\n    \"correlationId\": \"a566ef91-7765-4f59-b6f0-b9f40ce71599\"\n  }\n}\n","Output — success",[436,3505,3506,3510,3522,3540,3584,3628,3646,3660,3679,3697,3701],{"__ignoreMap":454},[458,3507,3508],{"class":460,"line":461},[458,3509,479],{"class":468},[458,3511,3512,3514,3516,3518,3520],{"class":460,"line":482},[458,3513,903],{"class":468},[458,3515,473],{"class":906},[458,3517,910],{"class":468},[458,3519,489],{"class":468},[458,3521,753],{"class":468},[458,3523,3524,3526,3528,3530,3532,3534,3536,3538],{"class":460,"line":505},[458,3525,1055],{"class":468},[458,3527,1059],{"class":1058},[458,3529,910],{"class":468},[458,3531,489],{"class":468},[458,3533,915],{"class":468},[458,3535,496],{"class":495},[458,3537,910],{"class":468},[458,3539,502],{"class":468},[458,3541,3542,3544,3546,3548,3550,3552,3554,3556,3558,3560,3562,3564,3566,3568,3570,3572,3574,3576,3578,3580,3582],{"class":460,"line":547},[458,3543,1055],{"class":468},[458,3545,1079],{"class":1058},[458,3547,910],{"class":468},[458,3549,489],{"class":468},[458,3551,513],{"class":468},[458,3553,915],{"class":468},[458,3555,1090],{"class":669},[458,3557,910],{"class":468},[458,3559,489],{"class":468},[458,3561,915],{"class":468},[458,3563,523],{"class":495},[458,3565,910],{"class":468},[458,3567,528],{"class":468},[458,3569,915],{"class":468},[458,3571,800],{"class":669},[458,3573,910],{"class":468},[458,3575,489],{"class":468},[458,3577,915],{"class":468},[458,3579,2831],{"class":495},[458,3581,910],{"class":468},[458,3583,581],{"class":468},[458,3585,3586,3588,3590,3592,3594,3596,3598,3600,3602,3604,3606,3608,3610,3612,3614,3616,3618,3620,3622,3624,3626],{"class":460,"line":584},[458,3587,1055],{"class":468},[458,3589,1127],{"class":1058},[458,3591,910],{"class":468},[458,3593,489],{"class":468},[458,3595,513],{"class":468},[458,3597,915],{"class":468},[458,3599,1090],{"class":669},[458,3601,910],{"class":468},[458,3603,489],{"class":468},[458,3605,915],{"class":468},[458,3607,563],{"class":495},[458,3609,910],{"class":468},[458,3611,528],{"class":468},[458,3613,915],{"class":468},[458,3615,800],{"class":669},[458,3617,910],{"class":468},[458,3619,489],{"class":468},[458,3621,915],{"class":468},[458,3623,576],{"class":495},[458,3625,910],{"class":468},[458,3627,581],{"class":468},[458,3629,3630,3632,3634,3636,3638,3640,3642,3644],{"class":460,"line":601},[458,3631,1055],{"class":468},[458,3633,1173],{"class":1058},[458,3635,910],{"class":468},[458,3637,489],{"class":468},[458,3639,915],{"class":468},[458,3641,594],{"class":495},[458,3643,910],{"class":468},[458,3645,502],{"class":468},[458,3647,3648,3650,3652,3654,3656,3658],{"class":460,"line":610},[458,3649,1055],{"class":468},[458,3651,1214],{"class":1058},[458,3653,910],{"class":468},[458,3655,489],{"class":468},[458,3657,670],{"class":669},[458,3659,502],{"class":468},[458,3661,3662,3664,3666,3668,3670,3672,3675,3677],{"class":460,"line":617},[458,3663,1055],{"class":468},[458,3665,1230],{"class":1058},[458,3667,910],{"class":468},[458,3669,489],{"class":468},[458,3671,915],{"class":468},[458,3673,3674],{"class":495},"ak_8f3c4b2a1e5d6f7c",[458,3676,910],{"class":468},[458,3678,502],{"class":468},[458,3680,3681,3683,3686,3688,3690,3692,3695],{"class":460,"line":624},[458,3682,1055],{"class":468},[458,3684,3685],{"class":1058},"correlationId",[458,3687,910],{"class":468},[458,3689,489],{"class":468},[458,3691,915],{"class":468},[458,3693,3694],{"class":495},"a566ef91-7765-4f59-b6f0-b9f40ce71599",[458,3696,1297],{"class":468},[458,3698,3699],{"class":460,"line":1052},[458,3700,1309],{"class":468},[458,3702,3703],{"class":460,"line":1074},[458,3704,886],{"class":468},[449,3706,3709],{"className":889,"code":3707,"filename":3708,"language":892,"meta":454,"style":454},"{\n  \"level\": \"error\",\n  \"audit\": {\n    \"action\": \"invoice.refund\",\n    \"actor\": { \"type\": \"user\", \"id\": \"usr_42\" },\n    \"target\": { \"type\": \"invoice\", \"id\": \"inv_889\" },\n    \"outcome\": \"failure\",\n    \"reason\": \"Stripe error: charge already refunded\",\n    \"version\": 1,\n    \"idempotencyKey\": \"ak_4c5d6e7f8a9b0c1d\",\n    \"correlationId\": \"a566ef91-7765-4f59-b6f0-b9f40ce71599\"\n  },\n  \"error\": {\n    \"name\": \"StripeError\",\n    \"message\": \"charge already refunded\",\n    \"stack\": \"...\"\n  }\n}\n","Output — failure",[436,3710,3711,3715,3734,3746,3764,3808,3852,3871,3890,3904,3923,3939,3943,3955,3975,3995,4013,4017],{"__ignoreMap":454},[458,3712,3713],{"class":460,"line":461},[458,3714,479],{"class":468},[458,3716,3717,3719,3721,3723,3725,3727,3730,3732],{"class":460,"line":482},[458,3718,903],{"class":468},[458,3720,907],{"class":906},[458,3722,910],{"class":468},[458,3724,489],{"class":468},[458,3726,915],{"class":468},[458,3728,3729],{"class":495},"error",[458,3731,910],{"class":468},[458,3733,502],{"class":468},[458,3735,3736,3738,3740,3742,3744],{"class":460,"line":505},[458,3737,903],{"class":468},[458,3739,473],{"class":906},[458,3741,910],{"class":468},[458,3743,489],{"class":468},[458,3745,753],{"class":468},[458,3747,3748,3750,3752,3754,3756,3758,3760,3762],{"class":460,"line":547},[458,3749,1055],{"class":468},[458,3751,1059],{"class":1058},[458,3753,910],{"class":468},[458,3755,489],{"class":468},[458,3757,915],{"class":468},[458,3759,496],{"class":495},[458,3761,910],{"class":468},[458,3763,502],{"class":468},[458,3765,3766,3768,3770,3772,3774,3776,3778,3780,3782,3784,3786,3788,3790,3792,3794,3796,3798,3800,3802,3804,3806],{"class":460,"line":584},[458,3767,1055],{"class":468},[458,3769,1079],{"class":1058},[458,3771,910],{"class":468},[458,3773,489],{"class":468},[458,3775,513],{"class":468},[458,3777,915],{"class":468},[458,3779,1090],{"class":669},[458,3781,910],{"class":468},[458,3783,489],{"class":468},[458,3785,915],{"class":468},[458,3787,523],{"class":495},[458,3789,910],{"class":468},[458,3791,528],{"class":468},[458,3793,915],{"class":468},[458,3795,800],{"class":669},[458,3797,910],{"class":468},[458,3799,489],{"class":468},[458,3801,915],{"class":468},[458,3803,2831],{"class":495},[458,3805,910],{"class":468},[458,3807,581],{"class":468},[458,3809,3810,3812,3814,3816,3818,3820,3822,3824,3826,3828,3830,3832,3834,3836,3838,3840,3842,3844,3846,3848,3850],{"class":460,"line":601},[458,3811,1055],{"class":468},[458,3813,1127],{"class":1058},[458,3815,910],{"class":468},[458,3817,489],{"class":468},[458,3819,513],{"class":468},[458,3821,915],{"class":468},[458,3823,1090],{"class":669},[458,3825,910],{"class":468},[458,3827,489],{"class":468},[458,3829,915],{"class":468},[458,3831,563],{"class":495},[458,3833,910],{"class":468},[458,3835,528],{"class":468},[458,3837,915],{"class":468},[458,3839,800],{"class":669},[458,3841,910],{"class":468},[458,3843,489],{"class":468},[458,3845,915],{"class":468},[458,3847,576],{"class":495},[458,3849,910],{"class":468},[458,3851,581],{"class":468},[458,3853,3854,3856,3858,3860,3862,3864,3867,3869],{"class":460,"line":610},[458,3855,1055],{"class":468},[458,3857,1173],{"class":1058},[458,3859,910],{"class":468},[458,3861,489],{"class":468},[458,3863,915],{"class":468},[458,3865,3866],{"class":495},"failure",[458,3868,910],{"class":468},[458,3870,502],{"class":468},[458,3872,3873,3875,3877,3879,3881,3883,3886,3888],{"class":460,"line":617},[458,3874,1055],{"class":468},[458,3876,1194],{"class":1058},[458,3878,910],{"class":468},[458,3880,489],{"class":468},[458,3882,915],{"class":468},[458,3884,3885],{"class":495},"Stripe error: charge already refunded",[458,3887,910],{"class":468},[458,3889,502],{"class":468},[458,3891,3892,3894,3896,3898,3900,3902],{"class":460,"line":624},[458,3893,1055],{"class":468},[458,3895,1214],{"class":1058},[458,3897,910],{"class":468},[458,3899,489],{"class":468},[458,3901,670],{"class":669},[458,3903,502],{"class":468},[458,3905,3906,3908,3910,3912,3914,3916,3919,3921],{"class":460,"line":1052},[458,3907,1055],{"class":468},[458,3909,1230],{"class":1058},[458,3911,910],{"class":468},[458,3913,489],{"class":468},[458,3915,915],{"class":468},[458,3917,3918],{"class":495},"ak_4c5d6e7f8a9b0c1d",[458,3920,910],{"class":468},[458,3922,502],{"class":468},[458,3924,3925,3927,3929,3931,3933,3935,3937],{"class":460,"line":1074},[458,3926,1055],{"class":468},[458,3928,3685],{"class":1058},[458,3930,910],{"class":468},[458,3932,489],{"class":468},[458,3934,915],{"class":468},[458,3936,3694],{"class":495},[458,3938,1297],{"class":468},[458,3940,3941],{"class":460,"line":1122},[458,3942,3415],{"class":468},[458,3944,3945,3947,3949,3951,3953],{"class":460,"line":1168},[458,3946,903],{"class":468},[458,3948,3729],{"class":906},[458,3950,910],{"class":468},[458,3952,489],{"class":468},[458,3954,753],{"class":468},[458,3956,3957,3959,3962,3964,3966,3968,3971,3973],{"class":460,"line":1189},[458,3958,1055],{"class":468},[458,3960,3961],{"class":1058},"name",[458,3963,910],{"class":468},[458,3965,489],{"class":468},[458,3967,915],{"class":468},[458,3969,3970],{"class":495},"StripeError",[458,3972,910],{"class":468},[458,3974,502],{"class":468},[458,3976,3977,3979,3982,3984,3986,3988,3991,3993],{"class":460,"line":1209},[458,3978,1055],{"class":468},[458,3980,3981],{"class":1058},"message",[458,3983,910],{"class":468},[458,3985,489],{"class":468},[458,3987,915],{"class":468},[458,3989,3990],{"class":495},"charge already refunded",[458,3992,910],{"class":468},[458,3994,502],{"class":468},[458,3996,3997,3999,4002,4004,4006,4008,4011],{"class":460,"line":1225},[458,3998,1055],{"class":468},[458,4000,4001],{"class":1058},"stack",[458,4003,910],{"class":468},[458,4005,489],{"class":468},[458,4007,915],{"class":468},[458,4009,4010],{"class":495},"...",[458,4012,1297],{"class":468},[458,4014,4015],{"class":460,"line":1246},[458,4016,1309],{"class":468},[458,4018,4019],{"class":460,"line":1260},[458,4020,886],{"class":468},[449,4022,4024],{"className":889,"code":4023,"filename":891,"language":892,"meta":454,"style":454},"{\n  \"level\": \"warn\",\n  \"audit\": {\n    \"action\": \"invoice.refund\",\n    \"actor\": { \"type\": \"system\", \"id\": \"anonymous\" },\n    \"target\": { \"type\": \"invoice\", \"id\": \"inv_889\" },\n    \"outcome\": \"denied\",\n    \"reason\": \"Anonymous refund denied\",\n    \"version\": 1,\n    \"idempotencyKey\": \"ak_d12c3a4f5b6e7d8c\",\n    \"correlationId\": \"a566ef91-7765-4f59-b6f0-b9f40ce71599\"\n  }\n}\n",[436,4025,4026,4030,4048,4060,4078,4123,4167,4185,4203,4217,4235,4251,4255],{"__ignoreMap":454},[458,4027,4028],{"class":460,"line":461},[458,4029,479],{"class":468},[458,4031,4032,4034,4036,4038,4040,4042,4044,4046],{"class":460,"line":482},[458,4033,903],{"class":468},[458,4035,907],{"class":906},[458,4037,910],{"class":468},[458,4039,489],{"class":468},[458,4041,915],{"class":468},[458,4043,918],{"class":495},[458,4045,910],{"class":468},[458,4047,502],{"class":468},[458,4049,4050,4052,4054,4056,4058],{"class":460,"line":505},[458,4051,903],{"class":468},[458,4053,473],{"class":906},[458,4055,910],{"class":468},[458,4057,489],{"class":468},[458,4059,753],{"class":468},[458,4061,4062,4064,4066,4068,4070,4072,4074,4076],{"class":460,"line":547},[458,4063,1055],{"class":468},[458,4065,1059],{"class":1058},[458,4067,910],{"class":468},[458,4069,489],{"class":468},[458,4071,915],{"class":468},[458,4073,496],{"class":495},[458,4075,910],{"class":468},[458,4077,502],{"class":468},[458,4079,4080,4082,4084,4086,4088,4090,4092,4094,4096,4098,4100,4102,4104,4106,4108,4110,4112,4114,4116,4119,4121],{"class":460,"line":584},[458,4081,1055],{"class":468},[458,4083,1079],{"class":1058},[458,4085,910],{"class":468},[458,4087,489],{"class":468},[458,4089,513],{"class":468},[458,4091,915],{"class":468},[458,4093,1090],{"class":669},[458,4095,910],{"class":468},[458,4097,489],{"class":468},[458,4099,915],{"class":468},[458,4101,1400],{"class":495},[458,4103,910],{"class":468},[458,4105,528],{"class":468},[458,4107,915],{"class":468},[458,4109,800],{"class":669},[458,4111,910],{"class":468},[458,4113,489],{"class":468},[458,4115,915],{"class":468},[458,4117,4118],{"class":495},"anonymous",[458,4120,910],{"class":468},[458,4122,581],{"class":468},[458,4124,4125,4127,4129,4131,4133,4135,4137,4139,4141,4143,4145,4147,4149,4151,4153,4155,4157,4159,4161,4163,4165],{"class":460,"line":601},[458,4126,1055],{"class":468},[458,4128,1127],{"class":1058},[458,4130,910],{"class":468},[458,4132,489],{"class":468},[458,4134,513],{"class":468},[458,4136,915],{"class":468},[458,4138,1090],{"class":669},[458,4140,910],{"class":468},[458,4142,489],{"class":468},[458,4144,915],{"class":468},[458,4146,563],{"class":495},[458,4148,910],{"class":468},[458,4150,528],{"class":468},[458,4152,915],{"class":468},[458,4154,800],{"class":669},[458,4156,910],{"class":468},[458,4158,489],{"class":468},[458,4160,915],{"class":468},[458,4162,576],{"class":495},[458,4164,910],{"class":468},[458,4166,581],{"class":468},[458,4168,4169,4171,4173,4175,4177,4179,4181,4183],{"class":460,"line":610},[458,4170,1055],{"class":468},[458,4172,1173],{"class":1058},[458,4174,910],{"class":468},[458,4176,489],{"class":468},[458,4178,915],{"class":468},[458,4180,1182],{"class":495},[458,4182,910],{"class":468},[458,4184,502],{"class":468},[458,4186,4187,4189,4191,4193,4195,4197,4199,4201],{"class":460,"line":617},[458,4188,1055],{"class":468},[458,4190,1194],{"class":1058},[458,4192,910],{"class":468},[458,4194,489],{"class":468},[458,4196,915],{"class":468},[458,4198,3378],{"class":495},[458,4200,910],{"class":468},[458,4202,502],{"class":468},[458,4204,4205,4207,4209,4211,4213,4215],{"class":460,"line":624},[458,4206,1055],{"class":468},[458,4208,1214],{"class":1058},[458,4210,910],{"class":468},[458,4212,489],{"class":468},[458,4214,670],{"class":669},[458,4216,502],{"class":468},[458,4218,4219,4221,4223,4225,4227,4229,4231,4233],{"class":460,"line":1052},[458,4220,1055],{"class":468},[458,4222,1230],{"class":1058},[458,4224,910],{"class":468},[458,4226,489],{"class":468},[458,4228,915],{"class":468},[458,4230,1239],{"class":495},[458,4232,910],{"class":468},[458,4234,502],{"class":468},[458,4236,4237,4239,4241,4243,4245,4247,4249],{"class":460,"line":1074},[458,4238,1055],{"class":468},[458,4240,3685],{"class":1058},[458,4242,910],{"class":468},[458,4244,489],{"class":468},[458,4246,915],{"class":468},[458,4248,3694],{"class":495},[458,4250,1297],{"class":468},[458,4252,4253],{"class":460,"line":1122},[458,4254,1309],{"class":468},[458,4256,4257],{"class":460,"line":1168},[458,4258,886],{"class":468},[428,4260,4261],{},"Outcome resolution:",[2285,4263,4264,4273,4292],{},[2288,4265,4266,4269,4270,469],{},[436,4267,4268],{},"fn"," resolves → ",[436,4271,4272],{},"outcome: 'success'",[2288,4274,4275,4277,4278,4281,4282,4285,4286,4289,4290,469],{},[436,4276,4268],{}," throws an ",[436,4279,4280],{},"AuditDeniedError"," (or any error with ",[436,4283,4284],{},"status === 403",") → ",[436,4287,4288],{},"outcome: 'denied'",", error message becomes ",[436,4291,1194],{},[2288,4293,4294,4295,4298],{},"Other thrown errors → ",[436,4296,4297],{},"outcome: 'failure'",", then re-thrown.",[4300,4301,4302],"style",{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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}",{"title":454,"searchDepth":482,"depth":482,"links":4304},[4305,4306,4307,4309,4310,4315,4316],{"id":434,"depth":482,"text":438},{"id":683,"depth":482,"text":686},{"id":1317,"depth":482,"text":4308},"Standalone audit()",{"id":1716,"depth":482,"text":1719},{"id":1901,"depth":482,"text":1904,"children":4311},[4312,4314],{"id":2273,"depth":505,"text":4313},"defineAuditAction vs defineAuditCatalog — when to choose",{"id":2351,"depth":505,"text":2352},{"id":2457,"depth":482,"text":2460},{"id":3175,"depth":482,"text":4317},"withAudit() — auto-instrumentation","log.audit, log.audit.deny, standalone audit(), withAudit auto-instrumentation, defineAuditAction and defineAuditCatalog registries, and auditDiff change patches.","md",[4321,4324],{"label":137,"icon":140,"to":138,"color":4322,"variant":4323},"neutral","subtle",{"label":4325,"icon":150,"to":148,"color":4322,"variant":4323},"Drains & Integrity",{},{"title":142,"icon":145},{"title":423,"description":4318},"tTXupY1GFY0e_rUTZJheBImV3dxo3lVgw2OOtZouttM",[4331,4333],{"title":137,"path":138,"stem":139,"description":4332,"icon":140,"children":-1},"The AuditFields type, action naming conventions, actor types, idempotency, and how the schema sits inside a regular wide event.",{"title":147,"path":148,"stem":149,"description":4334,"icon":150,"children":-1},"auditEnricher to auto-fill request context, auditOnly to route audits to a dedicated sink, and signed for tamper-evident HMAC or hash-chain integrity.",1778330170628]