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