[{"data":1,"prerenderedAt":4031},["ShallowReactive",2],{"navigation_docs":3,"-integrate-frameworks-cli":443,"-integrate-frameworks-cli-surround":4026},[4,30,80,249,357,412],{"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,157],{"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,152],{"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,"icon":156},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","3.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":158,"path":159,"stem":160,"children":161,"page":29},"Frameworks","\u002Fintegrate\u002Fframeworks","3.integrate\u002Fframeworks",[162,166,171,176,181,186,191,196,201,206,211,216,221,226,230,235,240,245],{"title":36,"path":163,"stem":164,"icon":165},"\u002Fintegrate\u002Fframeworks\u002Foverview","3.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":167,"path":168,"stem":169,"icon":170},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","3.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":172,"path":173,"stem":174,"icon":175},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","3.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":177,"path":178,"stem":179,"icon":180},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","3.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":182,"path":183,"stem":184,"icon":185},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","3.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":187,"path":188,"stem":189,"icon":190},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","3.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":192,"path":193,"stem":194,"icon":195},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","3.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":197,"path":198,"stem":199,"icon":200},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","3.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":202,"path":203,"stem":204,"icon":205},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","3.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":207,"path":208,"stem":209,"icon":210},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","3.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":212,"path":213,"stem":214,"icon":215},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","3.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":217,"path":218,"stem":219,"icon":220},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","3.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":222,"path":223,"stem":224,"icon":225},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","3.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":227,"path":228,"stem":229,"icon":74},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","3.integrate\u002Fframeworks\u002F13.standalone",{"title":231,"path":232,"stem":233,"icon":234},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","3.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":236,"path":237,"stem":238,"icon":239},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","3.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":241,"path":242,"stem":243,"icon":244},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","3.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":246,"path":247,"stem":248,"icon":44},"CLI","\u002Fintegrate\u002Fframeworks\u002Fcli","3.integrate\u002Fframeworks\u002F17.cli",{"title":250,"path":251,"stem":252,"children":253,"page":29},"Use Cases","\u002Fuse-cases","4.use-cases",[254,258,263,292,320,352],{"title":36,"path":255,"stem":256,"icon":257},"\u002Fuse-cases\u002Foverview","4.use-cases\u002F0.overview","i-lucide-list-checks",{"title":259,"path":260,"stem":261,"icon":262},"Client Logging","\u002Fuse-cases\u002Fclient-logging","4.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":264,"icon":265,"path":266,"stem":267,"children":268,"page":29},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","4.use-cases\u002F2.ai-sdk",[269,272,277,282,287],{"title":36,"path":270,"stem":271,"icon":39},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","4.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":273,"path":274,"stem":275,"icon":276},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","4.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":278,"path":279,"stem":280,"icon":281},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","4.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":283,"path":284,"stem":285,"icon":286},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","4.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":288,"path":289,"stem":290,"icon":291},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","4.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":293,"icon":294,"path":295,"stem":296,"children":297,"page":29},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","4.use-cases\u002F3.better-auth",[298,301,306,311,315],{"title":36,"path":299,"stem":300,"icon":39},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","4.use-cases\u002F3.better-auth\u002F01.overview",{"title":302,"path":303,"stem":304,"icon":305},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","4.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":307,"path":308,"stem":309,"icon":310},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","4.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":312,"path":313,"stem":314,"icon":262},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","4.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":316,"path":317,"stem":318,"icon":319},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","4.use-cases\u002F3.better-auth\u002F05.performance","i-lucide-gauge",{"title":321,"icon":322,"path":323,"stem":324,"children":325,"page":29},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","4.use-cases\u002F4.audit",[326,329,334,339,344,348],{"title":36,"path":327,"stem":328,"icon":39},"\u002Fuse-cases\u002Faudit\u002Foverview","4.use-cases\u002F4.audit\u002F01.overview",{"title":330,"path":331,"stem":332,"icon":333},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","4.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":335,"path":336,"stem":337,"icon":338},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","4.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":340,"path":341,"stem":342,"icon":343},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","4.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":345,"path":346,"stem":347,"icon":322},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","4.use-cases\u002F4.audit\u002F05.compliance",{"title":349,"path":350,"stem":351,"icon":79},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","4.use-cases\u002F4.audit\u002F06.recipes",{"title":353,"path":354,"stem":355,"icon":356},"Enrichers","\u002Fuse-cases\u002Fenrichers","4.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":358,"path":359,"stem":360,"children":361,"page":29},"Extend","\u002Fextend","5.extend",[362,366,371,376,381,385,389,393,397,402,407],{"title":36,"path":363,"stem":364,"icon":365},"\u002Fextend\u002Foverview","5.extend\u002F0.overview","i-lucide-blocks",{"title":367,"path":368,"stem":369,"icon":370},"Stream","\u002Fextend\u002Fstream","5.extend\u002F1.stream","i-lucide-radio-tower",{"title":372,"path":373,"stem":374,"icon":375},"Custom framework","\u002Fextend\u002Fcustom-framework","5.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":377,"path":378,"stem":379,"icon":380},"FS reader","\u002Fextend\u002Ffs-reader","5.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":349,"path":382,"stem":383,"icon":384},"\u002Fextend\u002Fconsumer-recipes","5.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":386,"path":387,"stem":388,"icon":365},"Plugins","\u002Fextend\u002Fplugins","5.extend\u002F4.plugins",{"title":390,"path":391,"stem":392,"icon":356},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","5.extend\u002F5.custom-enrichers",{"title":394,"path":395,"stem":396,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","5.extend\u002F6.tail-sampling",{"title":398,"path":399,"stem":400,"icon":401},"Identity headers","\u002Fextend\u002Fidentity-headers","5.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":403,"path":404,"stem":405,"icon":406},"Custom drains","\u002Fextend\u002Fcustom-drains","5.extend\u002F8.custom-drains","i-lucide-share-2",{"title":408,"path":409,"stem":410,"icon":411},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","5.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":413,"path":414,"stem":415,"children":416,"page":29},"Reference","\u002Freference","6.reference",[417,422,425,430,434,439],{"title":418,"path":419,"stem":420,"icon":421},"Configuration","\u002Freference\u002Fconfiguration","6.reference\u002F1.configuration","i-lucide-settings",{"title":316,"path":423,"stem":424,"icon":319},"\u002Freference\u002Fperformance","6.reference\u002F2.performance",{"title":426,"path":427,"stem":428,"icon":429},"Vite Plugin","\u002Freference\u002Fvite-plugin","6.reference\u002F3.vite-plugin","i-custom-vite",{"title":431,"path":432,"stem":433,"icon":322},"Best Practices","\u002Freference\u002Fbest-practices","6.reference\u002F4.best-practices",{"title":435,"path":436,"stem":437,"icon":438},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","6.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":440,"path":441,"stem":442,"icon":356},"Agent Skills","\u002Freference\u002Fagent-skills","6.reference\u002F6.agent-skills",{"id":444,"title":246,"body":445,"description":4015,"extension":4016,"links":4017,"meta":4022,"navigation":4023,"path":247,"seo":4024,"stem":248,"__hash__":4025},"docs\u002F3.integrate\u002Fframeworks\u002F17.cli.md",{"type":446,"value":447,"toc":3992},"minimark",[448,465,486,526,563,568,696,759,763,769,1624,1630,1635,1780,1790,1794,1895,1903,1916,1920,1930,1933,2008,2016,2020,2042,2054,2329,2415,2434,2508,2514,2518,2522,2525,3008,3027,3230,3234,3350,3353,3357,3363,3366,3370,3379,3441,3450,3488,3508,3524,3539,3543,3623,3630,3633,3755,3759,3875,3877,3881,3884,3988],[449,450,451,455,456,460,461,464],"p",{},[452,453,454],"code",{},"@evlog\u002Fcli"," adds observability from ",[457,458,459],"strong",{},"command start to exit",". It does not replace citty, Clack, or your ",[452,462,463],{},"--json"," stdout contract. You keep routing and terminal UI; evlog owns wide events, the drain, redaction, and optional catalogs.",[466,467,469,470,473,474,477,478,485],"callout",{"color":468,"icon":44},"neutral","Try it in the repo: ",[452,471,472],{},"pnpm example:cli doctor"," writes NDJSON to ",[452,475,476],{},"examples\u002Fcli\u002F.evlog\u002Flogs\u002F",". Source: ",[479,480,484],"a",{"href":481,"rel":482},"https:\u002F\u002Fgithub.com\u002Fhugorcd\u002Fevlog\u002Ftree\u002Fmain\u002Fexamples\u002Fcli",[483],"nofollow","examples\u002Fcli",".",[487,488,491,494,519],"prompt",{":actions":489,"description":490,"icon":44},"[\"copy\",\"cursor\",\"windsurf\"]","Add evlog to my existing CLI",[449,492,493],{},"Add evlog observability to my existing TypeScript CLI (citty + optional Clack). Do not replace my UI or stdout JSON contract.",[495,496,497,501,504,507,510,513,516],"ul",{},[498,499,500],"li",{},"Install: pnpm add @evlog\u002Fcli evlog citty",[498,502,503],{},"Create src\u002Fdrain.ts — createCliDrain() with createFsDrain() default; switch to createAxiomDrain() when EVLOG_DRAIN=axiom (credentials from env, never in source)",[498,505,506],{},"Create src\u002Fevlog.ts — export const setup = setupEvlog({ service, version, drain: createCliDrain(), errorCatalog, auditCatalog })",[498,508,509],{},"Entry src\u002Findex.ts — runMain(main, setup) from @evlog\u002Fcli\u002Fcitty, then setup.flush(), exitWithError on catch",[498,511,512],{},"In command handlers: import { useLogger } from '@evlog\u002Fcli' — log.set(), log.audit(auditCatalog.ACTION({ actor, target, outcome }))",[498,514,515],{},"Keep Clack\u002Fconsola\u002Fconsole for terminal output; evlog drains wide events only (silent unless --log)",[498,517,518],{},"Optional catalogs: defineErrorCatalog → errorCatalog, defineAuditCatalog → auditCatalog with target, severity, description",[449,520,521,522],{},"Docs: ",[479,523,524],{"href":524,"rel":525},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fframeworks\u002Fcli",[483],[487,527,529,532,558],{":actions":489,"description":528,"icon":44},"Create a new CLI with evlog",[449,530,531],{},"Create a new TypeScript CLI with citty, optional @clack\u002Fprompts, and evlog observability from day one.",[495,533,534,537,540,543,546,549,552,555],{},[498,535,536],{},"Install: pnpm add @evlog\u002Fcli evlog citty @clack\u002Fprompts",[498,538,539],{},"Layout: src\u002Findex.ts, src\u002Fdrain.ts, src\u002Fevlog.ts, src\u002Fcatalogs\u002F{errors,audit,actor}.ts, src\u002Fcommands\u002F*",[498,541,542],{},"src\u002Fdrain.ts — createCliDrain(): fs by default, Axiom\u002FDatadog\u002FOTLP via env (see drain section below)",[498,544,545],{},"src\u002Fevlog.ts — setupEvlog({ service, version, drain: createCliDrain(), errorCatalog, auditCatalog })",[498,547,548],{},"src\u002Findex.ts — runMain(main, setup).then(() => setup.flush()).catch(exitWithError)",[498,550,551],{},"Commands — citty defineCommand + Clack for UI + useLogger() for telemetry",[498,553,554],{},"Audits — auditCatalog.SECRET_PULL({ actor: resolveCliActor(), target: { id, resource, access }, outcome, changes })",[498,556,557],{},"Runnable reference: examples\u002Fcli in the evlog repo (pnpm example:cli doctor)",[449,559,521,560],{},[479,561,524],{"href":524,"rel":562},[483],[564,565,567],"h2",{"id":566},"install","Install",[569,570,571,616,643,669],"code-group",{},[572,573,579],"pre",{"className":574,"code":575,"filename":576,"language":577,"meta":578,"style":578},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add @evlog\u002Fcli evlog citty\npnpm add @clack\u002Fprompts   # optional — UI only\n","pnpm","bash","",[452,580,581,602],{"__ignoreMap":578},[582,583,586,589,593,596,599],"span",{"class":584,"line":585},"line",1,[582,587,576],{"class":588},"sBMFI",[582,590,592],{"class":591},"sfazB"," add",[582,594,595],{"class":591}," @evlog\u002Fcli",[582,597,598],{"class":591}," evlog",[582,600,601],{"class":591}," citty\n",[582,603,605,607,609,612],{"class":584,"line":604},2,[582,606,576],{"class":588},[582,608,592],{"class":591},[582,610,611],{"class":591}," @clack\u002Fprompts",[582,613,615],{"class":614},"sHwdD","   # optional — UI only\n",[572,617,620],{"className":574,"code":618,"filename":619,"language":577,"meta":578,"style":578},"bun add @evlog\u002Fcli evlog citty\nbun add @clack\u002Fprompts\n","bun",[452,621,622,634],{"__ignoreMap":578},[582,623,624,626,628,630,632],{"class":584,"line":585},[582,625,619],{"class":588},[582,627,592],{"class":591},[582,629,595],{"class":591},[582,631,598],{"class":591},[582,633,601],{"class":591},[582,635,636,638,640],{"class":584,"line":604},[582,637,619],{"class":588},[582,639,592],{"class":591},[582,641,642],{"class":591}," @clack\u002Fprompts\n",[572,644,647],{"className":574,"code":645,"filename":646,"language":577,"meta":578,"style":578},"yarn add @evlog\u002Fcli evlog citty\nyarn add @clack\u002Fprompts\n","yarn",[452,648,649,661],{"__ignoreMap":578},[582,650,651,653,655,657,659],{"class":584,"line":585},[582,652,646],{"class":588},[582,654,592],{"class":591},[582,656,595],{"class":591},[582,658,598],{"class":591},[582,660,601],{"class":591},[582,662,663,665,667],{"class":584,"line":604},[582,664,646],{"class":588},[582,666,592],{"class":591},[582,668,642],{"class":591},[572,670,673],{"className":574,"code":671,"filename":672,"language":577,"meta":578,"style":578},"npm install @evlog\u002Fcli evlog citty\nnpm install @clack\u002Fprompts\n","npm",[452,674,675,688],{"__ignoreMap":578},[582,676,677,679,682,684,686],{"class":584,"line":585},[582,678,672],{"class":588},[582,680,681],{"class":591}," install",[582,683,595],{"class":591},[582,685,598],{"class":591},[582,687,601],{"class":591},[582,689,690,692,694],{"class":584,"line":604},[582,691,672],{"class":588},[582,693,681],{"class":591},[582,695,642],{"class":591},[697,698,699,715],"table",{},[700,701,702],"thead",{},[703,704,705,709,712],"tr",{},[706,707,708],"th",{},"Package",[706,710,711],{},"Import",[706,713,714],{},"Role",[716,717,718,744],"tbody",{},[703,719,720,726,731],{},[721,722,723],"td",{},[452,724,725],{},"citty",[721,727,728],{},[452,729,730],{},"@evlog\u002Fcli\u002Fcitty",[721,732,733,736,737,740,741],{},[452,734,735],{},"runMain(main, setup)"," wraps each ",[452,738,739],{},"run()"," in ",[452,742,743],{},"invoke()",[703,745,746,751,756],{},[721,747,748],{},[452,749,750],{},"ofetch",[721,752,753],{},[452,754,755],{},"@evlog\u002Fcli\u002Fhttp",[721,757,758],{},"Outbound HTTP fields on the wide event",[564,760,762],{"id":761},"integrate-four-files","Integrate (four files)",[449,764,765,766,768],{},"Add evlog to an existing citty CLI in four steps. Your Clack spinners, ",[452,767,463],{}," flag, and subcommand tree stay as they are. Pick a file in the tree to view its code.",[770,771,773,982,1114,1315],"code-tree",{"default-value":772},"src\u002Fevlog.ts",[572,774,779],{"className":775,"code":776,"filename":777,"language":778,"meta":578,"style":578},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import type { DrainContext } from 'evlog'\nimport { createFsDrain } from 'evlog\u002Ffs'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>({ batch: { size: 20 } })\n\nexport function createCliDrain() {\n  return pipeline(createFsDrain({ dir: '.evlog\u002Flogs' }))\n}\n","src\u002Fdrain.ts","ts",[452,780,781,813,833,854,861,917,922,940,976],{"__ignoreMap":578},[582,782,783,787,790,794,798,801,804,807,810],{"class":584,"line":585},[582,784,786],{"class":785},"s7zQu","import",[582,788,789],{"class":785}," type",[582,791,793],{"class":792},"sMK4o"," {",[582,795,797],{"class":796},"sTEyZ"," DrainContext",[582,799,800],{"class":792}," }",[582,802,803],{"class":785}," from",[582,805,806],{"class":792}," '",[582,808,809],{"class":591},"evlog",[582,811,812],{"class":792},"'\n",[582,814,815,817,819,822,824,826,828,831],{"class":584,"line":604},[582,816,786],{"class":785},[582,818,793],{"class":792},[582,820,821],{"class":796}," createFsDrain",[582,823,800],{"class":792},[582,825,803],{"class":785},[582,827,806],{"class":792},[582,829,830],{"class":591},"evlog\u002Ffs",[582,832,812],{"class":792},[582,834,836,838,840,843,845,847,849,852],{"class":584,"line":835},3,[582,837,786],{"class":785},[582,839,793],{"class":792},[582,841,842],{"class":796}," createDrainPipeline",[582,844,800],{"class":792},[582,846,803],{"class":785},[582,848,806],{"class":792},[582,850,851],{"class":591},"evlog\u002Fpipeline",[582,853,812],{"class":792},[582,855,857],{"class":584,"line":856},4,[582,858,860],{"emptyLinePlaceholder":859},true,"\n",[582,862,864,868,871,874,877,880,883,886,889,892,896,899,901,904,906,910,912,914],{"class":584,"line":863},5,[582,865,867],{"class":866},"spNyl","const",[582,869,870],{"class":796}," pipeline ",[582,872,873],{"class":792},"=",[582,875,842],{"class":876},"s2Zo4",[582,878,879],{"class":792},"\u003C",[582,881,882],{"class":588},"DrainContext",[582,884,885],{"class":792},">",[582,887,888],{"class":796},"(",[582,890,891],{"class":792},"{",[582,893,895],{"class":894},"swJcz"," batch",[582,897,898],{"class":792},":",[582,900,793],{"class":792},[582,902,903],{"class":894}," size",[582,905,898],{"class":792},[582,907,909],{"class":908},"sbssI"," 20",[582,911,800],{"class":792},[582,913,800],{"class":792},[582,915,916],{"class":796},")\n",[582,918,920],{"class":584,"line":919},6,[582,921,860],{"emptyLinePlaceholder":859},[582,923,925,928,931,934,937],{"class":584,"line":924},7,[582,926,927],{"class":785},"export",[582,929,930],{"class":866}," function",[582,932,933],{"class":876}," createCliDrain",[582,935,936],{"class":792},"()",[582,938,939],{"class":792}," {\n",[582,941,943,946,949,951,954,956,958,961,963,965,968,971,973],{"class":584,"line":942},8,[582,944,945],{"class":785},"  return",[582,947,948],{"class":876}," pipeline",[582,950,888],{"class":894},[582,952,953],{"class":876},"createFsDrain",[582,955,888],{"class":894},[582,957,891],{"class":792},[582,959,960],{"class":894}," dir",[582,962,898],{"class":792},[582,964,806],{"class":792},[582,966,967],{"class":591},".evlog\u002Flogs",[582,969,970],{"class":792},"'",[582,972,800],{"class":792},[582,974,975],{"class":894},"))\n",[582,977,979],{"class":584,"line":978},9,[582,980,981],{"class":792},"}\n",[572,983,985],{"className":775,"code":984,"filename":772,"language":778,"meta":578,"style":578},"import { setupEvlog } from '@evlog\u002Fcli'\nimport { createCliDrain } from '.\u002Fdrain'\n\nexport const setup = setupEvlog({\n  service: 'my-cli',\n  version: '1.0.0',\n  redact: true,\n  drain: createCliDrain(),\n})\n",[452,986,987,1006,1025,1029,1048,1065,1081,1094,1107],{"__ignoreMap":578},[582,988,989,991,993,996,998,1000,1002,1004],{"class":584,"line":585},[582,990,786],{"class":785},[582,992,793],{"class":792},[582,994,995],{"class":796}," setupEvlog",[582,997,800],{"class":792},[582,999,803],{"class":785},[582,1001,806],{"class":792},[582,1003,454],{"class":591},[582,1005,812],{"class":792},[582,1007,1008,1010,1012,1014,1016,1018,1020,1023],{"class":584,"line":604},[582,1009,786],{"class":785},[582,1011,793],{"class":792},[582,1013,933],{"class":796},[582,1015,800],{"class":792},[582,1017,803],{"class":785},[582,1019,806],{"class":792},[582,1021,1022],{"class":591},".\u002Fdrain",[582,1024,812],{"class":792},[582,1026,1027],{"class":584,"line":835},[582,1028,860],{"emptyLinePlaceholder":859},[582,1030,1031,1033,1036,1039,1041,1043,1045],{"class":584,"line":856},[582,1032,927],{"class":785},[582,1034,1035],{"class":866}," const",[582,1037,1038],{"class":796}," setup ",[582,1040,873],{"class":792},[582,1042,995],{"class":876},[582,1044,888],{"class":796},[582,1046,1047],{"class":792},"{\n",[582,1049,1050,1053,1055,1057,1060,1062],{"class":584,"line":863},[582,1051,1052],{"class":894},"  service",[582,1054,898],{"class":792},[582,1056,806],{"class":792},[582,1058,1059],{"class":591},"my-cli",[582,1061,970],{"class":792},[582,1063,1064],{"class":792},",\n",[582,1066,1067,1070,1072,1074,1077,1079],{"class":584,"line":919},[582,1068,1069],{"class":894},"  version",[582,1071,898],{"class":792},[582,1073,806],{"class":792},[582,1075,1076],{"class":591},"1.0.0",[582,1078,970],{"class":792},[582,1080,1064],{"class":792},[582,1082,1083,1086,1088,1092],{"class":584,"line":924},[582,1084,1085],{"class":894},"  redact",[582,1087,898],{"class":792},[582,1089,1091],{"class":1090},"sfNiH"," true",[582,1093,1064],{"class":792},[582,1095,1096,1099,1101,1103,1105],{"class":584,"line":942},[582,1097,1098],{"class":894},"  drain",[582,1100,898],{"class":792},[582,1102,933],{"class":876},[582,1104,936],{"class":796},[582,1106,1064],{"class":792},[582,1108,1109,1112],{"class":584,"line":978},[582,1110,1111],{"class":792},"}",[582,1113,916],{"class":796},[572,1115,1118],{"className":775,"code":1116,"filename":1117,"language":778,"meta":578,"style":578},"import { exitWithError } from '@evlog\u002Fcli'\nimport { runMain } from '@evlog\u002Fcli\u002Fcitty'\nimport { setup } from '.\u002Fevlog'\nimport { main } from '.\u002Fcommands'\n\nrunMain(main, setup)\n  .then(() => setup.flush())\n  .catch(async (error) => {\n    await setup.flush().catch(() => {})\n    exitWithError(error)\n  })\n","src\u002Findex.ts",[452,1119,1120,1139,1158,1178,1198,1202,1216,1241,1267,1295,1307],{"__ignoreMap":578},[582,1121,1122,1124,1126,1129,1131,1133,1135,1137],{"class":584,"line":585},[582,1123,786],{"class":785},[582,1125,793],{"class":792},[582,1127,1128],{"class":796}," exitWithError",[582,1130,800],{"class":792},[582,1132,803],{"class":785},[582,1134,806],{"class":792},[582,1136,454],{"class":591},[582,1138,812],{"class":792},[582,1140,1141,1143,1145,1148,1150,1152,1154,1156],{"class":584,"line":604},[582,1142,786],{"class":785},[582,1144,793],{"class":792},[582,1146,1147],{"class":796}," runMain",[582,1149,800],{"class":792},[582,1151,803],{"class":785},[582,1153,806],{"class":792},[582,1155,730],{"class":591},[582,1157,812],{"class":792},[582,1159,1160,1162,1164,1167,1169,1171,1173,1176],{"class":584,"line":835},[582,1161,786],{"class":785},[582,1163,793],{"class":792},[582,1165,1166],{"class":796}," setup",[582,1168,800],{"class":792},[582,1170,803],{"class":785},[582,1172,806],{"class":792},[582,1174,1175],{"class":591},".\u002Fevlog",[582,1177,812],{"class":792},[582,1179,1180,1182,1184,1187,1189,1191,1193,1196],{"class":584,"line":856},[582,1181,786],{"class":785},[582,1183,793],{"class":792},[582,1185,1186],{"class":796}," main",[582,1188,800],{"class":792},[582,1190,803],{"class":785},[582,1192,806],{"class":792},[582,1194,1195],{"class":591},".\u002Fcommands",[582,1197,812],{"class":792},[582,1199,1200],{"class":584,"line":863},[582,1201,860],{"emptyLinePlaceholder":859},[582,1203,1204,1207,1210,1213],{"class":584,"line":919},[582,1205,1206],{"class":876},"runMain",[582,1208,1209],{"class":796},"(main",[582,1211,1212],{"class":792},",",[582,1214,1215],{"class":796}," setup)\n",[582,1217,1218,1221,1224,1226,1228,1231,1233,1235,1238],{"class":584,"line":924},[582,1219,1220],{"class":792},"  .",[582,1222,1223],{"class":876},"then",[582,1225,888],{"class":796},[582,1227,936],{"class":792},[582,1229,1230],{"class":866}," =>",[582,1232,1166],{"class":796},[582,1234,485],{"class":792},[582,1236,1237],{"class":876},"flush",[582,1239,1240],{"class":796},"())\n",[582,1242,1243,1245,1248,1250,1253,1256,1260,1263,1265],{"class":584,"line":942},[582,1244,1220],{"class":792},[582,1246,1247],{"class":876},"catch",[582,1249,888],{"class":796},[582,1251,1252],{"class":866},"async",[582,1254,1255],{"class":792}," (",[582,1257,1259],{"class":1258},"sHdIc","error",[582,1261,1262],{"class":792},")",[582,1264,1230],{"class":866},[582,1266,939],{"class":792},[582,1268,1269,1272,1274,1276,1278,1280,1282,1284,1286,1288,1290,1293],{"class":584,"line":978},[582,1270,1271],{"class":785},"    await",[582,1273,1166],{"class":796},[582,1275,485],{"class":792},[582,1277,1237],{"class":876},[582,1279,936],{"class":894},[582,1281,485],{"class":792},[582,1283,1247],{"class":876},[582,1285,888],{"class":894},[582,1287,936],{"class":792},[582,1289,1230],{"class":866},[582,1291,1292],{"class":792}," {}",[582,1294,916],{"class":894},[582,1296,1298,1301,1303,1305],{"class":584,"line":1297},10,[582,1299,1300],{"class":876},"    exitWithError",[582,1302,888],{"class":894},[582,1304,1259],{"class":796},[582,1306,916],{"class":894},[582,1308,1310,1313],{"class":584,"line":1309},11,[582,1311,1312],{"class":792},"  }",[582,1314,916],{"class":796},[572,1316,1319],{"className":775,"code":1317,"filename":1318,"language":778,"meta":578,"style":578},"import { defineCommand } from 'citty'\nimport * as p from '@clack\u002Fprompts'\nimport { useLogger } from '@evlog\u002Fcli'\n\nexport const doctor = defineCommand({\n  meta: { name: 'doctor', description: 'Health checks' },\n  async run() {\n    const log = useLogger()\n    p.intro('my-cli doctor')\n    const checks = [{ name: 'config', ok: true }, { name: 'api', ok: true }]\n    log.set({ checks })\n    p.outro(`All ${checks.length} checks passed`)\n  },\n})\n","src\u002Fcommands\u002Fdoctor.ts",[452,1320,1321,1340,1363,1382,1386,1403,1441,1453,1469,1490,1553,1573,1611,1617],{"__ignoreMap":578},[582,1322,1323,1325,1327,1330,1332,1334,1336,1338],{"class":584,"line":585},[582,1324,786],{"class":785},[582,1326,793],{"class":792},[582,1328,1329],{"class":796}," defineCommand",[582,1331,800],{"class":792},[582,1333,803],{"class":785},[582,1335,806],{"class":792},[582,1337,725],{"class":591},[582,1339,812],{"class":792},[582,1341,1342,1344,1347,1350,1353,1356,1358,1361],{"class":584,"line":604},[582,1343,786],{"class":785},[582,1345,1346],{"class":792}," *",[582,1348,1349],{"class":785}," as",[582,1351,1352],{"class":796}," p ",[582,1354,1355],{"class":785},"from",[582,1357,806],{"class":792},[582,1359,1360],{"class":591},"@clack\u002Fprompts",[582,1362,812],{"class":792},[582,1364,1365,1367,1369,1372,1374,1376,1378,1380],{"class":584,"line":835},[582,1366,786],{"class":785},[582,1368,793],{"class":792},[582,1370,1371],{"class":796}," useLogger",[582,1373,800],{"class":792},[582,1375,803],{"class":785},[582,1377,806],{"class":792},[582,1379,454],{"class":591},[582,1381,812],{"class":792},[582,1383,1384],{"class":584,"line":856},[582,1385,860],{"emptyLinePlaceholder":859},[582,1387,1388,1390,1392,1395,1397,1399,1401],{"class":584,"line":863},[582,1389,927],{"class":785},[582,1391,1035],{"class":866},[582,1393,1394],{"class":796}," doctor ",[582,1396,873],{"class":792},[582,1398,1329],{"class":876},[582,1400,888],{"class":796},[582,1402,1047],{"class":792},[582,1404,1405,1408,1410,1412,1415,1417,1419,1422,1424,1426,1429,1431,1433,1436,1438],{"class":584,"line":919},[582,1406,1407],{"class":894},"  meta",[582,1409,898],{"class":792},[582,1411,793],{"class":792},[582,1413,1414],{"class":894}," name",[582,1416,898],{"class":792},[582,1418,806],{"class":792},[582,1420,1421],{"class":591},"doctor",[582,1423,970],{"class":792},[582,1425,1212],{"class":792},[582,1427,1428],{"class":894}," description",[582,1430,898],{"class":792},[582,1432,806],{"class":792},[582,1434,1435],{"class":591},"Health checks",[582,1437,970],{"class":792},[582,1439,1440],{"class":792}," },\n",[582,1442,1443,1446,1449,1451],{"class":584,"line":924},[582,1444,1445],{"class":866},"  async",[582,1447,1448],{"class":894}," run",[582,1450,936],{"class":792},[582,1452,939],{"class":792},[582,1454,1455,1458,1461,1464,1466],{"class":584,"line":942},[582,1456,1457],{"class":866},"    const",[582,1459,1460],{"class":796}," log",[582,1462,1463],{"class":792}," =",[582,1465,1371],{"class":876},[582,1467,1468],{"class":894},"()\n",[582,1470,1471,1474,1476,1479,1481,1483,1486,1488],{"class":584,"line":978},[582,1472,1473],{"class":796},"    p",[582,1475,485],{"class":792},[582,1477,1478],{"class":876},"intro",[582,1480,888],{"class":894},[582,1482,970],{"class":792},[582,1484,1485],{"class":591},"my-cli doctor",[582,1487,970],{"class":792},[582,1489,916],{"class":894},[582,1491,1492,1494,1497,1499,1502,1504,1506,1508,1510,1513,1515,1517,1520,1522,1524,1527,1529,1531,1533,1535,1538,1540,1542,1544,1546,1548,1550],{"class":584,"line":1297},[582,1493,1457],{"class":866},[582,1495,1496],{"class":796}," checks",[582,1498,1463],{"class":792},[582,1500,1501],{"class":894}," [",[582,1503,891],{"class":792},[582,1505,1414],{"class":894},[582,1507,898],{"class":792},[582,1509,806],{"class":792},[582,1511,1512],{"class":591},"config",[582,1514,970],{"class":792},[582,1516,1212],{"class":792},[582,1518,1519],{"class":894}," ok",[582,1521,898],{"class":792},[582,1523,1091],{"class":1090},[582,1525,1526],{"class":792}," },",[582,1528,793],{"class":792},[582,1530,1414],{"class":894},[582,1532,898],{"class":792},[582,1534,806],{"class":792},[582,1536,1537],{"class":591},"api",[582,1539,970],{"class":792},[582,1541,1212],{"class":792},[582,1543,1519],{"class":894},[582,1545,898],{"class":792},[582,1547,1091],{"class":1090},[582,1549,800],{"class":792},[582,1551,1552],{"class":894},"]\n",[582,1554,1555,1558,1560,1563,1565,1567,1569,1571],{"class":584,"line":1309},[582,1556,1557],{"class":796},"    log",[582,1559,485],{"class":792},[582,1561,1562],{"class":876},"set",[582,1564,888],{"class":894},[582,1566,891],{"class":792},[582,1568,1496],{"class":796},[582,1570,800],{"class":792},[582,1572,916],{"class":894},[582,1574,1576,1578,1580,1583,1585,1588,1591,1594,1597,1599,1602,1604,1607,1609],{"class":584,"line":1575},12,[582,1577,1473],{"class":796},[582,1579,485],{"class":792},[582,1581,1582],{"class":876},"outro",[582,1584,888],{"class":894},[582,1586,1587],{"class":792},"`",[582,1589,1590],{"class":591},"All ",[582,1592,1593],{"class":792},"${",[582,1595,1596],{"class":796},"checks",[582,1598,485],{"class":792},[582,1600,1601],{"class":796},"length",[582,1603,1111],{"class":792},[582,1605,1606],{"class":591}," checks passed",[582,1608,1587],{"class":792},[582,1610,916],{"class":894},[582,1612,1614],{"class":584,"line":1613},13,[582,1615,1616],{"class":792},"  },\n",[582,1618,1620,1622],{"class":584,"line":1619},14,[582,1621,1111],{"class":792},[582,1623,916],{"class":796},[449,1625,1626,1627,485],{},"Each command run emits one wide event to the drain: duration, exit status, redacted flags, and whatever you pass to ",[452,1628,1629],{},"log.set()",[1631,1632,1634],"h3",{"id":1633},"what-you-see-vs-what-gets-drained","What you see vs what gets drained",[569,1636,1637,1690,1731],{},[572,1638,1641],{"className":574,"code":1639,"filename":1640,"language":577,"meta":578,"style":578},"$ my-cli doctor\n◆  my-cli doctor\n◇  Running checks\n◆  All 2 checks passed\n","Terminal",[452,1642,1643,1654,1664,1675],{"__ignoreMap":578},[582,1644,1645,1648,1651],{"class":584,"line":585},[582,1646,1647],{"class":588},"$",[582,1649,1650],{"class":591}," my-cli",[582,1652,1653],{"class":591}," doctor\n",[582,1655,1656,1659,1662],{"class":584,"line":604},[582,1657,1658],{"class":588},"◆",[582,1660,1661],{"class":591},"  my-cli",[582,1663,1653],{"class":591},[582,1665,1666,1669,1672],{"class":584,"line":835},[582,1667,1668],{"class":588},"◇",[582,1670,1671],{"class":591},"  Running",[582,1673,1674],{"class":591}," checks\n",[582,1676,1677,1679,1682,1685,1687],{"class":584,"line":856},[582,1678,1658],{"class":588},[582,1680,1681],{"class":591},"  All",[582,1683,1684],{"class":908}," 2",[582,1686,1496],{"class":591},[582,1688,1689],{"class":591}," passed\n",[572,1691,1694],{"className":574,"code":1692,"filename":1693,"language":577,"meta":578,"style":578},"$ my-cli doctor --log\n… wide event pretty-printed on stderr …\n","--log",[452,1695,1696,1708],{"__ignoreMap":578},[582,1697,1698,1700,1702,1705],{"class":584,"line":585},[582,1699,1647],{"class":588},[582,1701,1650],{"class":591},[582,1703,1704],{"class":591}," doctor",[582,1706,1707],{"class":591}," --log\n",[582,1709,1710,1713,1716,1719,1722,1725,1728],{"class":584,"line":604},[582,1711,1712],{"class":588},"…",[582,1714,1715],{"class":591}," wide",[582,1717,1718],{"class":591}," event",[582,1720,1721],{"class":591}," pretty-printed",[582,1723,1724],{"class":591}," on",[582,1726,1727],{"class":591}," stderr",[582,1729,1730],{"class":591}," …\n",[572,1732,1735],{"className":574,"code":1733,"filename":1734,"language":577,"meta":578,"style":578},"$ my-cli doctor --json\n{\"checks\":[{\"name\":\"config\",\"ok\":true}]}\n","--json (yours)",[452,1736,1737,1748],{"__ignoreMap":578},[582,1738,1739,1741,1743,1745],{"class":584,"line":585},[582,1740,1647],{"class":588},[582,1742,1650],{"class":591},[582,1744,1704],{"class":591},[582,1746,1747],{"class":591}," --json\n",[582,1749,1750,1752,1755,1757,1760,1763,1766,1769,1771,1774,1777],{"class":584,"line":604},[582,1751,891],{"class":792},[582,1753,1754],{"class":588},"\"checks\"",[582,1756,898],{"class":876},[582,1758,1759],{"class":591},"[{",[582,1761,1762],{"class":796},"\"",[582,1764,1765],{"class":588},"name",[582,1767,1768],{"class":588},"\":\"",[582,1770,1512],{"class":588},[582,1772,1773],{"class":588},"\",\"",[582,1775,1776],{"class":588},"ok",[582,1778,1779],{"class":588},"\":true}]}\n",[449,1781,1782,1783,1786,1787,1789],{},"Stdout stays yours. NDJSON wide events always go to the drain (for example ",[452,1784,1785],{},".evlog\u002Flogs\u002F2026-05-30.jsonl"," with ",[452,1788,953],{},").",[564,1791,1793],{"id":1792},"what-evlog-does-does-not-do","What evlog does \u002F does not do",[697,1795,1796,1807],{},[700,1797,1798],{},[703,1799,1800,1802,1804],{},[706,1801],{},[706,1803,809],{},[706,1805,1806],{},"Your app",[716,1808,1809,1822,1832,1844,1854,1865,1877,1886],{},[703,1810,1811,1818,1820],{},[721,1812,1813,1814,1817],{},"Routing (",[452,1815,1816],{},"--help",", subcommands)",[721,1819],{},[721,1821,725],{},[703,1823,1824,1827,1829],{},[721,1825,1826],{},"Terminal UI (spinners, colors)",[721,1828],{},[721,1830,1831],{},"Clack, consola, …",[703,1833,1834,1839,1841],{},[721,1835,1836,1838],{},[452,1837,463],{}," stdout shape",[721,1840],{},[721,1842,1843],{},"your flag, your format",[703,1845,1846,1849,1852],{},[721,1847,1848],{},"Wide events + drain",[721,1850,1851],{},"yes",[721,1853],{},[703,1855,1856,1861,1863],{},[721,1857,1858,1860],{},[452,1859,1693],{}," debug on stderr",[721,1862,1851],{},[721,1864],{},[703,1866,1867,1873,1875],{},[721,1868,1869,1870],{},"Redact secrets in ",[452,1871,1872],{},"cli.flags",[721,1874,1851],{},[721,1876],{},[703,1878,1879,1882,1884],{},[721,1880,1881],{},"Error catalog",[721,1883,1851],{},[721,1885],{},[703,1887,1888,1891,1893],{},[721,1889,1890],{},"Audit catalog",[721,1892,1851],{},[721,1894],{},[572,1896,1901],{"className":1897,"code":1899,"language":1900,"meta":578},[1898],"language-text","citty runMain → evlog.invoke() → drain (.evlog\u002Flogs, Axiom, …)\n                      ↓\n              useLogger().set() \u002F log.audit()\n                      ↓\n         Clack \u002F console \u002F your --json → stdout (unchanged)\n","text",[452,1902,1899],{"__ignoreMap":578},[449,1904,1905,1906,1909,1910,1912,1913,1915],{},"By default the evlog console is ",[457,1907,1908],{},"silent",". Pass ",[452,1911,1693],{}," (auto-injected by ",[452,1914,1206],{},") to echo wide events on stderr while debugging.",[564,1917,1919],{"id":1918},"why-evlog-on-a-cli","Why evlog on a CLI",[449,1921,1922,1923,1926,1927,1929],{},"Every command is a small operation with a clear start and end. That maps cleanly to a ",[457,1924,1925],{},"wide event",": duration, exit code, redacted flags, and the fields you attach with ",[452,1928,1629],{},". The result lands as queryable NDJSON locally, or in Axiom, Datadog, or OTLP when you wire a cloud drain.",[449,1931,1932],{},"Audit and error catalogs are optional. Add them when you need typed throws or security-sensitive actions, not on day one.",[697,1934,1935,1948],{},[700,1936,1937],{},[703,1938,1939,1942,1945],{},[706,1940,1941],{},"Level",[706,1943,1944],{},"What you add",[706,1946,1947],{},"Demo",[716,1949,1950,1970,1985],{},[703,1951,1952,1957,1966],{},[721,1953,1954],{},[457,1955,1956],{},"Simple",[721,1958,1959,1962,1963],{},[452,1960,1961],{},"setupEvlog"," + ",[452,1964,1965],{},"useLogger().set()",[721,1967,1968],{},[452,1969,1421],{},[703,1971,1972,1977,1980],{},[721,1973,1974],{},[457,1975,1976],{},"Medium",[721,1978,1979],{},"Outbound HTTP hooks, error catalog",[721,1981,1982],{},[452,1983,1984],{},"sync",[703,1986,1987,1992,1999],{},[721,1988,1989],{},[457,1990,1991],{},"Advanced",[721,1993,1994,1995,1998],{},"Audit catalog, ",[452,1996,1997],{},"log.audit()",", deny",[721,2000,2001,2004,2005],{},[452,2002,2003],{},"pull",", ",[452,2006,2007],{},"deploy",[449,2009,2010,2011,2015],{},"See the ",[479,2012,2014],{"href":481,"rel":2013},[483],"demo CLI"," for all three levels in one repo.",[564,2017,2019],{"id":2018},"send-events-to-axiom-or-another-provider","Send events to Axiom (or another provider)",[466,2021,2023,2026,2027,2030,2031,2034,2035,2038,2039,485],{"color":2022,"icon":88},"warning",[457,2024,2025],{},"evlog does not auto-send to Axiom, Datadog, or OTLP."," Wide events leave the process only when you pass a ",[457,2028,2029],{},"drain"," to ",[452,2032,2033],{},"setupEvlog({ drain })",". Without it, telemetry is dropped. Most setups start with ",[452,2036,2037],{},"createFsDrain()"," and local NDJSON under ",[452,2040,2041],{},".evlog\u002Flogs\u002F",[449,2043,2044,2045,2047,2048,2030,2051,2053],{},"On HTTP apps the framework wires the drain for you. On a CLI, you pick the adapter in ",[452,2046,777],{}," and pass ",[452,2049,2050],{},"createCliDrain()",[452,2052,1961],{},". Credentials live on the host that runs the binary, never in the published package.",[770,2055,2056,2308],{"default-value":777},[572,2057,2059],{"className":775,"code":2058,"filename":777,"language":778,"meta":578,"style":578},"import type { DrainContext } from 'evlog'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\nimport { createFsDrain } from 'evlog\u002Ffs'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>({ batch: { size: 20 } })\n\nexport function createCliDrain() {\n  if (process.env.EVLOG_DRAIN === 'axiom') {\n    return pipeline(createAxiomDrain()) \u002F\u002F AXIOM_API_KEY, AXIOM_DATASET from env\n  }\n  return pipeline(createFsDrain({\n    dir: process.env.EVLOG_LOG_DIR ?? '.evlog\u002Flogs',\n  }))\n}\n",[452,2060,2061,2081,2101,2119,2137,2141,2179,2183,2195,2230,2248,2253,2267,2297,2303],{"__ignoreMap":578},[582,2062,2063,2065,2067,2069,2071,2073,2075,2077,2079],{"class":584,"line":585},[582,2064,786],{"class":785},[582,2066,789],{"class":785},[582,2068,793],{"class":792},[582,2070,797],{"class":796},[582,2072,800],{"class":792},[582,2074,803],{"class":785},[582,2076,806],{"class":792},[582,2078,809],{"class":591},[582,2080,812],{"class":792},[582,2082,2083,2085,2087,2090,2092,2094,2096,2099],{"class":584,"line":604},[582,2084,786],{"class":785},[582,2086,793],{"class":792},[582,2088,2089],{"class":796}," createAxiomDrain",[582,2091,800],{"class":792},[582,2093,803],{"class":785},[582,2095,806],{"class":792},[582,2097,2098],{"class":591},"evlog\u002Faxiom",[582,2100,812],{"class":792},[582,2102,2103,2105,2107,2109,2111,2113,2115,2117],{"class":584,"line":835},[582,2104,786],{"class":785},[582,2106,793],{"class":792},[582,2108,821],{"class":796},[582,2110,800],{"class":792},[582,2112,803],{"class":785},[582,2114,806],{"class":792},[582,2116,830],{"class":591},[582,2118,812],{"class":792},[582,2120,2121,2123,2125,2127,2129,2131,2133,2135],{"class":584,"line":856},[582,2122,786],{"class":785},[582,2124,793],{"class":792},[582,2126,842],{"class":796},[582,2128,800],{"class":792},[582,2130,803],{"class":785},[582,2132,806],{"class":792},[582,2134,851],{"class":591},[582,2136,812],{"class":792},[582,2138,2139],{"class":584,"line":863},[582,2140,860],{"emptyLinePlaceholder":859},[582,2142,2143,2145,2147,2149,2151,2153,2155,2157,2159,2161,2163,2165,2167,2169,2171,2173,2175,2177],{"class":584,"line":919},[582,2144,867],{"class":866},[582,2146,870],{"class":796},[582,2148,873],{"class":792},[582,2150,842],{"class":876},[582,2152,879],{"class":792},[582,2154,882],{"class":588},[582,2156,885],{"class":792},[582,2158,888],{"class":796},[582,2160,891],{"class":792},[582,2162,895],{"class":894},[582,2164,898],{"class":792},[582,2166,793],{"class":792},[582,2168,903],{"class":894},[582,2170,898],{"class":792},[582,2172,909],{"class":908},[582,2174,800],{"class":792},[582,2176,800],{"class":792},[582,2178,916],{"class":796},[582,2180,2181],{"class":584,"line":924},[582,2182,860],{"emptyLinePlaceholder":859},[582,2184,2185,2187,2189,2191,2193],{"class":584,"line":942},[582,2186,927],{"class":785},[582,2188,930],{"class":866},[582,2190,933],{"class":876},[582,2192,936],{"class":792},[582,2194,939],{"class":792},[582,2196,2197,2200,2202,2205,2207,2210,2212,2215,2218,2220,2223,2225,2228],{"class":584,"line":978},[582,2198,2199],{"class":785},"  if",[582,2201,1255],{"class":894},[582,2203,2204],{"class":796},"process",[582,2206,485],{"class":792},[582,2208,2209],{"class":796},"env",[582,2211,485],{"class":792},[582,2213,2214],{"class":796},"EVLOG_DRAIN",[582,2216,2217],{"class":792}," ===",[582,2219,806],{"class":792},[582,2221,2222],{"class":591},"axiom",[582,2224,970],{"class":792},[582,2226,2227],{"class":894},") ",[582,2229,1047],{"class":792},[582,2231,2232,2235,2237,2239,2242,2245],{"class":584,"line":1297},[582,2233,2234],{"class":785},"    return",[582,2236,948],{"class":876},[582,2238,888],{"class":894},[582,2240,2241],{"class":876},"createAxiomDrain",[582,2243,2244],{"class":894},"()) ",[582,2246,2247],{"class":614},"\u002F\u002F AXIOM_API_KEY, AXIOM_DATASET from env\n",[582,2249,2250],{"class":584,"line":1309},[582,2251,2252],{"class":792},"  }\n",[582,2254,2255,2257,2259,2261,2263,2265],{"class":584,"line":1575},[582,2256,945],{"class":785},[582,2258,948],{"class":876},[582,2260,888],{"class":894},[582,2262,953],{"class":876},[582,2264,888],{"class":894},[582,2266,1047],{"class":792},[582,2268,2269,2272,2274,2277,2279,2281,2283,2286,2289,2291,2293,2295],{"class":584,"line":1613},[582,2270,2271],{"class":894},"    dir",[582,2273,898],{"class":792},[582,2275,2276],{"class":796}," process",[582,2278,485],{"class":792},[582,2280,2209],{"class":796},[582,2282,485],{"class":792},[582,2284,2285],{"class":796},"EVLOG_LOG_DIR",[582,2287,2288],{"class":792}," ??",[582,2290,806],{"class":792},[582,2292,967],{"class":591},[582,2294,970],{"class":792},[582,2296,1064],{"class":792},[582,2298,2299,2301],{"class":584,"line":1619},[582,2300,1312],{"class":792},[582,2302,975],{"class":894},[582,2304,2306],{"class":584,"line":2305},15,[582,2307,981],{"class":792},[572,2309,2312],{"className":574,"code":2310,"filename":2311,"language":577,"meta":578,"style":578},"# EVLOG_DRAIN=axiom\n# AXIOM_API_KEY=\n# AXIOM_DATASET=my-cli\n",".env.example",[452,2313,2314,2319,2324],{"__ignoreMap":578},[582,2315,2316],{"class":584,"line":585},[582,2317,2318],{"class":614},"# EVLOG_DRAIN=axiom\n",[582,2320,2321],{"class":584,"line":604},[582,2322,2323],{"class":614},"# AXIOM_API_KEY=\n",[582,2325,2326],{"class":584,"line":835},[582,2327,2328],{"class":614},"# AXIOM_DATASET=my-cli\n",[569,2330,2331,2368],{},[572,2332,2335],{"className":574,"code":2333,"filename":2334,"language":577,"meta":578,"style":578},"my-cli doctor\ntail -f .evlog\u002Flogs\u002F$(date +%Y-%m-%d).jsonl\n","Local",[452,2336,2337,2343],{"__ignoreMap":578},[582,2338,2339,2341],{"class":584,"line":585},[582,2340,1059],{"class":588},[582,2342,1653],{"class":591},[582,2344,2345,2348,2351,2354,2357,2360,2363,2365],{"class":584,"line":604},[582,2346,2347],{"class":588},"tail",[582,2349,2350],{"class":591}," -f",[582,2352,2353],{"class":591}," .evlog\u002Flogs\u002F",[582,2355,2356],{"class":792},"$(",[582,2358,2359],{"class":588},"date",[582,2361,2362],{"class":591}," +%Y-%m-%d",[582,2364,1262],{"class":792},[582,2366,2367],{"class":591},".jsonl\n",[572,2369,2371],{"className":574,"code":2370,"filename":103,"language":577,"meta":578,"style":578},"export EVLOG_DRAIN=axiom\nexport AXIOM_API_KEY=xaat-…\nexport AXIOM_DATASET=my-cli\nmy-cli doctor\n",[452,2372,2373,2385,2397,2409],{"__ignoreMap":578},[582,2374,2375,2377,2380,2382],{"class":584,"line":585},[582,2376,927],{"class":866},[582,2378,2379],{"class":796}," EVLOG_DRAIN",[582,2381,873],{"class":792},[582,2383,2384],{"class":796},"axiom\n",[582,2386,2387,2389,2392,2394],{"class":584,"line":604},[582,2388,927],{"class":866},[582,2390,2391],{"class":796}," AXIOM_API_KEY",[582,2393,873],{"class":792},[582,2395,2396],{"class":796},"xaat-…\n",[582,2398,2399,2401,2404,2406],{"class":584,"line":835},[582,2400,927],{"class":866},[582,2402,2403],{"class":796}," AXIOM_DATASET",[582,2405,873],{"class":792},[582,2407,2408],{"class":796},"my-cli\n",[582,2410,2411,2413],{"class":584,"line":856},[582,2412,1059],{"class":588},[582,2414,1653],{"class":591},[449,2416,2417,2419,2420,2423,2424,2004,2427,2430,2431,485],{},[452,2418,2214],{}," is a ",[457,2421,2422],{},"convention for your CLI",", not a built-in evlog flag. Swap in ",[452,2425,2426],{},"evlog\u002Fdatadog",[452,2428,2429],{},"evlog\u002Fotlp",", etc. the same way. Full env lists: ",[479,2432,2433],{"href":95},"adapters overview",[697,2435,2436,2448],{},[700,2437,2438],{},[703,2439,2440,2443,2445],{},[706,2441,2442],{},"Adapter",[706,2444,711],{},[706,2446,2447],{},"Typical env",[716,2449,2450,2463,2479,2495],{},[703,2451,2452,2455,2459],{},[721,2453,2454],{},"File system",[721,2456,2457],{},[452,2458,830],{},[721,2460,2461],{},[452,2462,2285],{},[703,2464,2465,2467,2471],{},[721,2466,103],{},[721,2468,2469],{},[452,2470,2098],{},[721,2472,2473,2004,2476],{},[452,2474,2475],{},"AXIOM_API_KEY",[452,2477,2478],{},"AXIOM_DATASET",[703,2480,2481,2483,2487],{},[721,2482,128],{},[721,2484,2485],{},[452,2486,2426],{},[721,2488,2489,2004,2492],{},[452,2490,2491],{},"DATADOG_API_KEY",[452,2493,2494],{},"DATADOG_SITE",[703,2496,2497,2499,2503],{},[721,2498,108],{},[721,2500,2501],{},[452,2502,2429],{},[721,2504,2505],{},[452,2506,2507],{},"OTEL_EXPORTER_OTLP_ENDPOINT",[449,2509,2510,2511,2513],{},"Ship a ",[452,2512,2311],{}," with commented placeholders for operators. Never commit real keys.",[564,2515,2517],{"id":2516},"go-further-optional","Go further (optional)",[1631,2519,2521],{"id":2520},"error-and-audit-catalogs","Error and audit catalogs",[449,2523,2524],{},"Add when commands throw typed errors or record sensitive actions:",[770,2526,2528,2696,2894],{"default-value":2527},"src\u002Fcatalogs\u002Ferrors.ts",[572,2529,2531],{"className":775,"code":2530,"filename":2527,"language":778,"meta":578,"style":578},"import { defineErrorCatalog } from 'evlog'\n\nexport const errorCatalog = defineErrorCatalog('myapp', {\n  CONFIG_MISSING: {\n    status: 1,\n    message: 'No config file found',\n    fix: 'Run myapp init or set MYAPP_CONFIG.',\n  },\n})\n\ndeclare module 'evlog' {\n  interface RegisteredErrorCatalogs {\n    myapp: typeof errorCatalog\n  }\n}\n",[452,2532,2533,2552,2556,2582,2591,2603,2619,2635,2639,2645,2649,2665,2675,2688,2692],{"__ignoreMap":578},[582,2534,2535,2537,2539,2542,2544,2546,2548,2550],{"class":584,"line":585},[582,2536,786],{"class":785},[582,2538,793],{"class":792},[582,2540,2541],{"class":796}," defineErrorCatalog",[582,2543,800],{"class":792},[582,2545,803],{"class":785},[582,2547,806],{"class":792},[582,2549,809],{"class":591},[582,2551,812],{"class":792},[582,2553,2554],{"class":584,"line":604},[582,2555,860],{"emptyLinePlaceholder":859},[582,2557,2558,2560,2562,2565,2567,2569,2571,2573,2576,2578,2580],{"class":584,"line":835},[582,2559,927],{"class":785},[582,2561,1035],{"class":866},[582,2563,2564],{"class":796}," errorCatalog ",[582,2566,873],{"class":792},[582,2568,2541],{"class":876},[582,2570,888],{"class":796},[582,2572,970],{"class":792},[582,2574,2575],{"class":591},"myapp",[582,2577,970],{"class":792},[582,2579,1212],{"class":792},[582,2581,939],{"class":792},[582,2583,2584,2587,2589],{"class":584,"line":856},[582,2585,2586],{"class":894},"  CONFIG_MISSING",[582,2588,898],{"class":792},[582,2590,939],{"class":792},[582,2592,2593,2596,2598,2601],{"class":584,"line":863},[582,2594,2595],{"class":894},"    status",[582,2597,898],{"class":792},[582,2599,2600],{"class":908}," 1",[582,2602,1064],{"class":792},[582,2604,2605,2608,2610,2612,2615,2617],{"class":584,"line":919},[582,2606,2607],{"class":894},"    message",[582,2609,898],{"class":792},[582,2611,806],{"class":792},[582,2613,2614],{"class":591},"No config file found",[582,2616,970],{"class":792},[582,2618,1064],{"class":792},[582,2620,2621,2624,2626,2628,2631,2633],{"class":584,"line":924},[582,2622,2623],{"class":894},"    fix",[582,2625,898],{"class":792},[582,2627,806],{"class":792},[582,2629,2630],{"class":591},"Run myapp init or set MYAPP_CONFIG.",[582,2632,970],{"class":792},[582,2634,1064],{"class":792},[582,2636,2637],{"class":584,"line":942},[582,2638,1616],{"class":792},[582,2640,2641,2643],{"class":584,"line":978},[582,2642,1111],{"class":792},[582,2644,916],{"class":796},[582,2646,2647],{"class":584,"line":1297},[582,2648,860],{"emptyLinePlaceholder":859},[582,2650,2651,2654,2657,2659,2661,2663],{"class":584,"line":1309},[582,2652,2653],{"class":866},"declare",[582,2655,2656],{"class":866}," module",[582,2658,806],{"class":792},[582,2660,809],{"class":591},[582,2662,970],{"class":792},[582,2664,939],{"class":792},[582,2666,2667,2670,2673],{"class":584,"line":1575},[582,2668,2669],{"class":866},"  interface",[582,2671,2672],{"class":588}," RegisteredErrorCatalogs",[582,2674,939],{"class":792},[582,2676,2677,2680,2682,2685],{"class":584,"line":1613},[582,2678,2679],{"class":894},"    myapp",[582,2681,898],{"class":792},[582,2683,2684],{"class":792}," typeof",[582,2686,2687],{"class":796}," errorCatalog\n",[582,2689,2690],{"class":584,"line":1619},[582,2691,2252],{"class":792},[582,2693,2694],{"class":584,"line":2305},[582,2695,981],{"class":792},[572,2697,2700],{"className":775,"code":2698,"filename":2699,"language":778,"meta":578,"style":578},"import { defineAuditCatalog } from 'evlog'\n\nexport const auditCatalog = defineAuditCatalog('myapp', {\n  SECRET_PULL: {\n    target: 'secret_store',\n    severity: 'high',\n    description: 'Read secrets from a remote store',\n    redactPaths: ['token', 'password'],\n  },\n})\n\ndeclare module 'evlog' {\n  interface RegisteredAuditCatalogs {\n    myapp: typeof auditCatalog\n  }\n}\n","src\u002Fcatalogs\u002Faudit.ts",[452,2701,2702,2721,2725,2750,2759,2775,2791,2807,2837,2841,2847,2851,2865,2874,2885,2889],{"__ignoreMap":578},[582,2703,2704,2706,2708,2711,2713,2715,2717,2719],{"class":584,"line":585},[582,2705,786],{"class":785},[582,2707,793],{"class":792},[582,2709,2710],{"class":796}," defineAuditCatalog",[582,2712,800],{"class":792},[582,2714,803],{"class":785},[582,2716,806],{"class":792},[582,2718,809],{"class":591},[582,2720,812],{"class":792},[582,2722,2723],{"class":584,"line":604},[582,2724,860],{"emptyLinePlaceholder":859},[582,2726,2727,2729,2731,2734,2736,2738,2740,2742,2744,2746,2748],{"class":584,"line":835},[582,2728,927],{"class":785},[582,2730,1035],{"class":866},[582,2732,2733],{"class":796}," auditCatalog ",[582,2735,873],{"class":792},[582,2737,2710],{"class":876},[582,2739,888],{"class":796},[582,2741,970],{"class":792},[582,2743,2575],{"class":591},[582,2745,970],{"class":792},[582,2747,1212],{"class":792},[582,2749,939],{"class":792},[582,2751,2752,2755,2757],{"class":584,"line":856},[582,2753,2754],{"class":894},"  SECRET_PULL",[582,2756,898],{"class":792},[582,2758,939],{"class":792},[582,2760,2761,2764,2766,2768,2771,2773],{"class":584,"line":863},[582,2762,2763],{"class":894},"    target",[582,2765,898],{"class":792},[582,2767,806],{"class":792},[582,2769,2770],{"class":591},"secret_store",[582,2772,970],{"class":792},[582,2774,1064],{"class":792},[582,2776,2777,2780,2782,2784,2787,2789],{"class":584,"line":919},[582,2778,2779],{"class":894},"    severity",[582,2781,898],{"class":792},[582,2783,806],{"class":792},[582,2785,2786],{"class":591},"high",[582,2788,970],{"class":792},[582,2790,1064],{"class":792},[582,2792,2793,2796,2798,2800,2803,2805],{"class":584,"line":924},[582,2794,2795],{"class":894},"    description",[582,2797,898],{"class":792},[582,2799,806],{"class":792},[582,2801,2802],{"class":591},"Read secrets from a remote store",[582,2804,970],{"class":792},[582,2806,1064],{"class":792},[582,2808,2809,2812,2814,2816,2818,2821,2823,2825,2827,2830,2832,2835],{"class":584,"line":942},[582,2810,2811],{"class":894},"    redactPaths",[582,2813,898],{"class":792},[582,2815,1501],{"class":796},[582,2817,970],{"class":792},[582,2819,2820],{"class":591},"token",[582,2822,970],{"class":792},[582,2824,1212],{"class":792},[582,2826,806],{"class":792},[582,2828,2829],{"class":591},"password",[582,2831,970],{"class":792},[582,2833,2834],{"class":796},"]",[582,2836,1064],{"class":792},[582,2838,2839],{"class":584,"line":978},[582,2840,1616],{"class":792},[582,2842,2843,2845],{"class":584,"line":1297},[582,2844,1111],{"class":792},[582,2846,916],{"class":796},[582,2848,2849],{"class":584,"line":1309},[582,2850,860],{"emptyLinePlaceholder":859},[582,2852,2853,2855,2857,2859,2861,2863],{"class":584,"line":1575},[582,2854,2653],{"class":866},[582,2856,2656],{"class":866},[582,2858,806],{"class":792},[582,2860,809],{"class":591},[582,2862,970],{"class":792},[582,2864,939],{"class":792},[582,2866,2867,2869,2872],{"class":584,"line":1613},[582,2868,2669],{"class":866},[582,2870,2871],{"class":588}," RegisteredAuditCatalogs",[582,2873,939],{"class":792},[582,2875,2876,2878,2880,2882],{"class":584,"line":1619},[582,2877,2679],{"class":894},[582,2879,898],{"class":792},[582,2881,2684],{"class":792},[582,2883,2884],{"class":796}," auditCatalog\n",[582,2886,2887],{"class":584,"line":2305},[582,2888,2252],{"class":792},[582,2890,2892],{"class":584,"line":2891},16,[582,2893,981],{"class":792},[572,2895,2898],{"className":775,"code":2896,"filename":2897,"language":778,"meta":578,"style":578},"import type { AuditActor } from 'evlog'\n\nexport function resolveCliActor(): AuditActor {\n  const id = process.env.USER ?? 'unknown'\n  return { type: 'user', id, displayName: id }\n}\n","src\u002Fcatalogs\u002Factor.ts",[452,2899,2900,2921,2925,2941,2971,3004],{"__ignoreMap":578},[582,2901,2902,2904,2906,2908,2911,2913,2915,2917,2919],{"class":584,"line":585},[582,2903,786],{"class":785},[582,2905,789],{"class":785},[582,2907,793],{"class":792},[582,2909,2910],{"class":796}," AuditActor",[582,2912,800],{"class":792},[582,2914,803],{"class":785},[582,2916,806],{"class":792},[582,2918,809],{"class":591},[582,2920,812],{"class":792},[582,2922,2923],{"class":584,"line":604},[582,2924,860],{"emptyLinePlaceholder":859},[582,2926,2927,2929,2931,2934,2937,2939],{"class":584,"line":835},[582,2928,927],{"class":785},[582,2930,930],{"class":866},[582,2932,2933],{"class":876}," resolveCliActor",[582,2935,2936],{"class":792},"():",[582,2938,2910],{"class":588},[582,2940,939],{"class":792},[582,2942,2943,2946,2949,2951,2953,2955,2957,2959,2962,2964,2966,2969],{"class":584,"line":856},[582,2944,2945],{"class":866},"  const",[582,2947,2948],{"class":796}," id",[582,2950,1463],{"class":792},[582,2952,2276],{"class":796},[582,2954,485],{"class":792},[582,2956,2209],{"class":796},[582,2958,485],{"class":792},[582,2960,2961],{"class":796},"USER",[582,2963,2288],{"class":792},[582,2965,806],{"class":792},[582,2967,2968],{"class":591},"unknown",[582,2970,812],{"class":792},[582,2972,2973,2975,2977,2979,2981,2983,2986,2988,2990,2992,2994,2997,2999,3001],{"class":584,"line":863},[582,2974,945],{"class":785},[582,2976,793],{"class":792},[582,2978,789],{"class":894},[582,2980,898],{"class":792},[582,2982,806],{"class":792},[582,2984,2985],{"class":591},"user",[582,2987,970],{"class":792},[582,2989,1212],{"class":792},[582,2991,2948],{"class":796},[582,2993,1212],{"class":792},[582,2995,2996],{"class":894}," displayName",[582,2998,898],{"class":792},[582,3000,2948],{"class":796},[582,3002,3003],{"class":792}," }\n",[582,3005,3006],{"class":584,"line":919},[582,3007,981],{"class":792},[449,3009,3010,3011,3014,3015,2030,3018,3021,3022,3014,3024,3026],{},"Pass ",[452,3012,3013],{},"errorCatalog"," and ",[452,3016,3017],{},"auditCatalog",[452,3019,3020],{},"setupEvlog()",". Full audit usage: demo ",[452,3023,2003],{},[452,3025,2007],{}," commands.",[572,3028,3032],{"className":3029,"code":3030,"language":3031,"meta":578,"style":578},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","log.audit(auditCatalog.SECRET_PULL({\n  actor: resolveCliActor(),\n  target: { id: args.env, resource: 'secrets', access: 'read' },\n  outcome: 'success',\n}))\n\nlog.audit.deny('Missing API token', auditCatalog.SECRET_PULL({\n  actor: resolveCliActor(),\n  target: { id: args.env, access: 'read' },\n}))\n","typescript",[452,3033,3034,3056,3069,3119,3135,3141,3145,3180,3192,3224],{"__ignoreMap":578},[582,3035,3036,3039,3041,3044,3047,3049,3052,3054],{"class":584,"line":585},[582,3037,3038],{"class":796},"log",[582,3040,485],{"class":792},[582,3042,3043],{"class":876},"audit",[582,3045,3046],{"class":796},"(auditCatalog",[582,3048,485],{"class":792},[582,3050,3051],{"class":876},"SECRET_PULL",[582,3053,888],{"class":796},[582,3055,1047],{"class":792},[582,3057,3058,3061,3063,3065,3067],{"class":584,"line":604},[582,3059,3060],{"class":894},"  actor",[582,3062,898],{"class":792},[582,3064,2933],{"class":876},[582,3066,936],{"class":796},[582,3068,1064],{"class":792},[582,3070,3071,3074,3076,3078,3080,3082,3085,3087,3089,3091,3094,3096,3098,3101,3103,3105,3108,3110,3112,3115,3117],{"class":584,"line":835},[582,3072,3073],{"class":894},"  target",[582,3075,898],{"class":792},[582,3077,793],{"class":792},[582,3079,2948],{"class":894},[582,3081,898],{"class":792},[582,3083,3084],{"class":796}," args",[582,3086,485],{"class":792},[582,3088,2209],{"class":796},[582,3090,1212],{"class":792},[582,3092,3093],{"class":894}," resource",[582,3095,898],{"class":792},[582,3097,806],{"class":792},[582,3099,3100],{"class":591},"secrets",[582,3102,970],{"class":792},[582,3104,1212],{"class":792},[582,3106,3107],{"class":894}," access",[582,3109,898],{"class":792},[582,3111,806],{"class":792},[582,3113,3114],{"class":591},"read",[582,3116,970],{"class":792},[582,3118,1440],{"class":792},[582,3120,3121,3124,3126,3128,3131,3133],{"class":584,"line":856},[582,3122,3123],{"class":894},"  outcome",[582,3125,898],{"class":792},[582,3127,806],{"class":792},[582,3129,3130],{"class":591},"success",[582,3132,970],{"class":792},[582,3134,1064],{"class":792},[582,3136,3137,3139],{"class":584,"line":863},[582,3138,1111],{"class":792},[582,3140,975],{"class":796},[582,3142,3143],{"class":584,"line":919},[582,3144,860],{"emptyLinePlaceholder":859},[582,3146,3147,3149,3151,3153,3155,3158,3160,3162,3165,3167,3169,3172,3174,3176,3178],{"class":584,"line":924},[582,3148,3038],{"class":796},[582,3150,485],{"class":792},[582,3152,3043],{"class":796},[582,3154,485],{"class":792},[582,3156,3157],{"class":876},"deny",[582,3159,888],{"class":796},[582,3161,970],{"class":792},[582,3163,3164],{"class":591},"Missing API token",[582,3166,970],{"class":792},[582,3168,1212],{"class":792},[582,3170,3171],{"class":796}," auditCatalog",[582,3173,485],{"class":792},[582,3175,3051],{"class":876},[582,3177,888],{"class":796},[582,3179,1047],{"class":792},[582,3181,3182,3184,3186,3188,3190],{"class":584,"line":942},[582,3183,3060],{"class":894},[582,3185,898],{"class":792},[582,3187,2933],{"class":876},[582,3189,936],{"class":796},[582,3191,1064],{"class":792},[582,3193,3194,3196,3198,3200,3202,3204,3206,3208,3210,3212,3214,3216,3218,3220,3222],{"class":584,"line":978},[582,3195,3073],{"class":894},[582,3197,898],{"class":792},[582,3199,793],{"class":792},[582,3201,2948],{"class":894},[582,3203,898],{"class":792},[582,3205,3084],{"class":796},[582,3207,485],{"class":792},[582,3209,2209],{"class":796},[582,3211,1212],{"class":792},[582,3213,3107],{"class":894},[582,3215,898],{"class":792},[582,3217,806],{"class":792},[582,3219,3114],{"class":591},[582,3221,970],{"class":792},[582,3223,1440],{"class":792},[582,3225,3226,3228],{"class":584,"line":1297},[582,3227,1111],{"class":792},[582,3229,975],{"class":796},[1631,3231,3233],{"id":3232},"outbound-http-ofetch","Outbound HTTP (ofetch)",[770,3235,3237],{"default-value":3236},"src\u002Fcommands\u002Fsync.ts",[572,3238,3240],{"className":775,"code":3239,"filename":3236,"language":778,"meta":578,"style":578},"import { ofetch } from 'ofetch'\nimport { useLogger } from '@evlog\u002Fcli'\nimport { createOutboundHooks } from '@evlog\u002Fcli\u002Fhttp'\n\nconst api = ofetch.create(createOutboundHooks(useLogger()))\nawait api('https:\u002F\u002Fapi.example.com\u002Fv1\u002Frecords')\n",[452,3241,3242,3261,3279,3298,3302,3331],{"__ignoreMap":578},[582,3243,3244,3246,3248,3251,3253,3255,3257,3259],{"class":584,"line":585},[582,3245,786],{"class":785},[582,3247,793],{"class":792},[582,3249,3250],{"class":796}," ofetch",[582,3252,800],{"class":792},[582,3254,803],{"class":785},[582,3256,806],{"class":792},[582,3258,750],{"class":591},[582,3260,812],{"class":792},[582,3262,3263,3265,3267,3269,3271,3273,3275,3277],{"class":584,"line":604},[582,3264,786],{"class":785},[582,3266,793],{"class":792},[582,3268,1371],{"class":796},[582,3270,800],{"class":792},[582,3272,803],{"class":785},[582,3274,806],{"class":792},[582,3276,454],{"class":591},[582,3278,812],{"class":792},[582,3280,3281,3283,3285,3288,3290,3292,3294,3296],{"class":584,"line":835},[582,3282,786],{"class":785},[582,3284,793],{"class":792},[582,3286,3287],{"class":796}," createOutboundHooks",[582,3289,800],{"class":792},[582,3291,803],{"class":785},[582,3293,806],{"class":792},[582,3295,755],{"class":591},[582,3297,812],{"class":792},[582,3299,3300],{"class":584,"line":856},[582,3301,860],{"emptyLinePlaceholder":859},[582,3303,3304,3306,3309,3311,3313,3315,3318,3320,3323,3325,3328],{"class":584,"line":863},[582,3305,867],{"class":866},[582,3307,3308],{"class":796}," api ",[582,3310,873],{"class":792},[582,3312,3250],{"class":796},[582,3314,485],{"class":792},[582,3316,3317],{"class":876},"create",[582,3319,888],{"class":796},[582,3321,3322],{"class":876},"createOutboundHooks",[582,3324,888],{"class":796},[582,3326,3327],{"class":876},"useLogger",[582,3329,3330],{"class":796},"()))\n",[582,3332,3333,3336,3339,3341,3343,3346,3348],{"class":584,"line":919},[582,3334,3335],{"class":785},"await",[582,3337,3338],{"class":876}," api",[582,3340,888],{"class":796},[582,3342,970],{"class":792},[582,3344,3345],{"class":591},"https:\u002F\u002Fapi.example.com\u002Fv1\u002Frecords",[582,3347,970],{"class":792},[582,3349,916],{"class":796},[449,3351,3352],{},"Outbound HTTP fields merge into the same wide event as the command.",[1631,3354,3356],{"id":3355},"project-layout","Project layout",[572,3358,3361],{"className":3359,"code":3360,"language":1900,"meta":578},[1898],"my-cli\u002Fsrc\u002F\n├── index.ts       # runMain, flush, exitWithError\n├── drain.ts       # createCliDrain()\n├── evlog.ts       # setupEvlog()\n├── catalogs\u002F      # optional\n└── commands\u002F\n",[452,3362,3360],{"__ignoreMap":578},[3364,3365],"hr",{},[564,3367,3369],{"id":3368},"api-reference","API reference",[1631,3371,3373,3375,3376],{"id":3372},"setupevlog-vs-uselogger",[452,3374,3020],{}," vs ",[452,3377,3378],{},"useLogger()",[697,3380,3381,3395],{},[700,3382,3383],{},[703,3384,3385,3387,3391],{},[706,3386],{},[706,3388,3389],{},[452,3390,3020],{},[706,3392,3393],{},[452,3394,3378],{},[716,3396,3397,3410,3420],{},[703,3398,3399,3402,3407],{},[721,3400,3401],{},"When",[721,3403,3404,3405],{},"once in ",[452,3406,772],{},[721,3408,3409],{},"inside every command handler",[703,3411,3412,3414,3417],{},[721,3413,714],{},[721,3415,3416],{},"drain, redact, catalogs",[721,3418,3419],{},"command-scoped logger",[703,3421,3422,3425,3432],{},[721,3423,3424],{},"You call",[721,3426,3427,2004,3429],{},[452,3428,735],{},[452,3430,3431],{},"setup.flush()",[721,3433,3434,2004,3436,2004,3438],{},[452,3435,1629],{},[452,3437,1997],{},[452,3439,3440],{},"throw errorCatalog.X()",[449,3442,3443,3445,3446,3449],{},[452,3444,1961],{}," configures the pipeline once. Each citty command gets its own logger (",[452,3447,3448],{},"path: \u002Fdoctor",", flags, duration) via async context.",[449,3451,3452,3457,3458,2004,3461,2004,3464,2004,3466,2004,3468,2004,3470,3473,3474,3477,3478,2004,3481,3484,3485,485],{},[457,3453,3454],{},[452,3455,3456],{},"setupEvlog(config)"," — ",[452,3459,3460],{},"service",[452,3462,3463],{},"version",[452,3465,2029],{},[452,3467,3013],{},[452,3469,3017],{},[452,3471,3472],{},"redact"," (default ",[452,3475,3476],{},"true","), ",[452,3479,3480],{},"flushOnExit",[452,3482,3483],{},"logToConsole",". Returns ",[452,3486,3487],{},"{ invoke, log, errorCatalog, auditCatalog, audit, flush }",[449,3489,3490,3494,3495,3497,3498,3500,3501,3503,3504,3507],{},[457,3491,3492],{},[452,3493,3378],{}," — inside any ",[452,3496,743],{}," \u002F ",[452,3499,1206],{}," handler. Import from ",[452,3502,454],{},"; no need to pass ",[452,3505,3506],{},"setup"," around.",[449,3509,3510,3457,3514,3516,3517,740,3519,3521,3522,485],{},[457,3511,3512],{},[452,3513,735],{},[452,3515,730],{},". Wraps every ",[452,3518,739],{},[452,3520,743],{},". Auto-injects ",[452,3523,1693],{},[449,3525,3526,3531,3532,3535,3536,3538],{},[457,3527,3528],{},[452,3529,3530],{},"exitWithError(err)"," — human-readable stderr + ",[452,3533,3534],{},"process.exit",". Use after ",[452,3537,3431],{}," on the error path.",[1631,3540,3542],{"id":3541},"wide-event-shape","Wide event shape",[697,3544,3545,3555],{},[700,3546,3547],{},[703,3548,3549,3552],{},[706,3550,3551],{},"Field",[706,3553,3554],{},"CLI value",[716,3556,3557,3569,3581,3591,3601,3610],{},[703,3558,3559,3564],{},[721,3560,3561],{},[452,3562,3563],{},"method",[721,3565,3566],{},[452,3567,3568],{},"'CLI'",[703,3570,3571,3576],{},[721,3572,3573],{},[452,3574,3575],{},"path",[721,3577,3578],{},[452,3579,3580],{},"'\u002F\u003Ccommand>'",[703,3582,3583,3588],{},[721,3584,3585],{},[452,3586,3587],{},"status",[721,3589,3590],{},"exit code",[703,3592,3593,3598],{},[721,3594,3595],{},[452,3596,3597],{},"cli.command",[721,3599,3600],{},"command segment",[703,3602,3603,3607],{},[721,3604,3605],{},[452,3606,1872],{},[721,3608,3609],{},"parsed flags (redacted)",[703,3611,3612,3617],{},[721,3613,3614],{},[452,3615,3616],{},"cli.version",[721,3618,3619,3620],{},"from ",[452,3621,3622],{},"setupEvlog({ version })",[1631,3624,3626,3629],{"id":3625},"createcommandlogger-libraries",[452,3627,3628],{},"createCommandLogger"," (libraries)",[449,3631,3632],{},"For code inside someone else's CLI, without global bootstrap:",[572,3634,3636],{"className":3029,"code":3635,"language":3031,"meta":578,"style":578},"import { createCommandLogger } from '@evlog\u002Fcli'\n\nconst log = createCommandLogger({ command: 'migrate', version: '2.0.0' })\nlog.set({ records: 150 })\nlog.emit({ status: 0 })\n",[452,3637,3638,3657,3661,3706,3730],{"__ignoreMap":578},[582,3639,3640,3642,3644,3647,3649,3651,3653,3655],{"class":584,"line":585},[582,3641,786],{"class":785},[582,3643,793],{"class":792},[582,3645,3646],{"class":796}," createCommandLogger",[582,3648,800],{"class":792},[582,3650,803],{"class":785},[582,3652,806],{"class":792},[582,3654,454],{"class":591},[582,3656,812],{"class":792},[582,3658,3659],{"class":584,"line":604},[582,3660,860],{"emptyLinePlaceholder":859},[582,3662,3663,3665,3668,3670,3672,3674,3676,3679,3681,3683,3686,3688,3690,3693,3695,3697,3700,3702,3704],{"class":584,"line":835},[582,3664,867],{"class":866},[582,3666,3667],{"class":796}," log ",[582,3669,873],{"class":792},[582,3671,3646],{"class":876},[582,3673,888],{"class":796},[582,3675,891],{"class":792},[582,3677,3678],{"class":894}," command",[582,3680,898],{"class":792},[582,3682,806],{"class":792},[582,3684,3685],{"class":591},"migrate",[582,3687,970],{"class":792},[582,3689,1212],{"class":792},[582,3691,3692],{"class":894}," version",[582,3694,898],{"class":792},[582,3696,806],{"class":792},[582,3698,3699],{"class":591},"2.0.0",[582,3701,970],{"class":792},[582,3703,800],{"class":792},[582,3705,916],{"class":796},[582,3707,3708,3710,3712,3714,3716,3718,3721,3723,3726,3728],{"class":584,"line":856},[582,3709,3038],{"class":796},[582,3711,485],{"class":792},[582,3713,1562],{"class":876},[582,3715,888],{"class":796},[582,3717,891],{"class":792},[582,3719,3720],{"class":894}," records",[582,3722,898],{"class":792},[582,3724,3725],{"class":908}," 150",[582,3727,800],{"class":792},[582,3729,916],{"class":796},[582,3731,3732,3734,3736,3739,3741,3743,3746,3748,3751,3753],{"class":584,"line":863},[582,3733,3038],{"class":796},[582,3735,485],{"class":792},[582,3737,3738],{"class":876},"emit",[582,3740,888],{"class":796},[582,3742,891],{"class":792},[582,3744,3745],{"class":894}," status",[582,3747,898],{"class":792},[582,3749,3750],{"class":908}," 0",[582,3752,800],{"class":792},[582,3754,916],{"class":796},[1631,3756,3758],{"id":3757},"long-running-commands","Long-running commands",[572,3760,3762],{"className":3029,"code":3761,"language":3031,"meta":578,"style":578},"await setup.flush()\n\nawait setup.invoke({ command: 'watch', longRunning: true }, async (log) => {\n  log.set({ phase: 'boot' })\n  log.emit()\n})\n",[452,3763,3764,3776,3780,3830,3859,3869],{"__ignoreMap":578},[582,3765,3766,3768,3770,3772,3774],{"class":584,"line":585},[582,3767,3335],{"class":785},[582,3769,1166],{"class":796},[582,3771,485],{"class":792},[582,3773,1237],{"class":876},[582,3775,1468],{"class":796},[582,3777,3778],{"class":584,"line":604},[582,3779,860],{"emptyLinePlaceholder":859},[582,3781,3782,3784,3786,3788,3791,3793,3795,3797,3799,3801,3804,3806,3808,3811,3813,3815,3817,3820,3822,3824,3826,3828],{"class":584,"line":835},[582,3783,3335],{"class":785},[582,3785,1166],{"class":796},[582,3787,485],{"class":792},[582,3789,3790],{"class":876},"invoke",[582,3792,888],{"class":796},[582,3794,891],{"class":792},[582,3796,3678],{"class":894},[582,3798,898],{"class":792},[582,3800,806],{"class":792},[582,3802,3803],{"class":591},"watch",[582,3805,970],{"class":792},[582,3807,1212],{"class":792},[582,3809,3810],{"class":894}," longRunning",[582,3812,898],{"class":792},[582,3814,1091],{"class":1090},[582,3816,1526],{"class":792},[582,3818,3819],{"class":866}," async",[582,3821,1255],{"class":792},[582,3823,3038],{"class":1258},[582,3825,1262],{"class":792},[582,3827,1230],{"class":866},[582,3829,939],{"class":792},[582,3831,3832,3835,3837,3839,3841,3843,3846,3848,3850,3853,3855,3857],{"class":584,"line":856},[582,3833,3834],{"class":796},"  log",[582,3836,485],{"class":792},[582,3838,1562],{"class":876},[582,3840,888],{"class":894},[582,3842,891],{"class":792},[582,3844,3845],{"class":894}," phase",[582,3847,898],{"class":792},[582,3849,806],{"class":792},[582,3851,3852],{"class":591},"boot",[582,3854,970],{"class":792},[582,3856,800],{"class":792},[582,3858,916],{"class":894},[582,3860,3861,3863,3865,3867],{"class":584,"line":863},[582,3862,3834],{"class":796},[582,3864,485],{"class":792},[582,3866,3738],{"class":876},[582,3868,1468],{"class":894},[582,3870,3871,3873],{"class":584,"line":919},[582,3872,1111],{"class":792},[582,3874,916],{"class":796},[3364,3876],{},[564,3878,3880],{"id":3879},"try-it","Try it",[449,3882,3883],{},"From the evlog monorepo root:",[569,3885,3886,3913,3929,3954],{},[572,3887,3890],{"className":574,"code":3888,"filename":3889,"language":577,"meta":578,"style":578},"pnpm example:cli doctor\npnpm example:cli sync 3\n","Run",[452,3891,3892,3901],{"__ignoreMap":578},[582,3893,3894,3896,3899],{"class":584,"line":585},[582,3895,576],{"class":588},[582,3897,3898],{"class":591}," example:cli",[582,3900,1653],{"class":591},[582,3902,3903,3905,3907,3910],{"class":584,"line":604},[582,3904,576],{"class":588},[582,3906,3898],{"class":591},[582,3908,3909],{"class":591}," sync",[582,3911,3912],{"class":908}," 3\n",[572,3914,3917],{"className":574,"code":3915,"filename":3916,"language":577,"meta":578,"style":578},"pnpm example:cli doctor --log\n","Debug",[452,3918,3919],{"__ignoreMap":578},[582,3920,3921,3923,3925,3927],{"class":584,"line":585},[582,3922,576],{"class":588},[582,3924,3898],{"class":591},[582,3926,1704],{"class":591},[582,3928,1707],{"class":591},[572,3930,3933],{"className":574,"code":3931,"filename":3932,"language":577,"meta":578,"style":578},"tail -f examples\u002Fcli\u002F.evlog\u002Flogs\u002F$(date +%Y-%m-%d).jsonl\n","Inspect drain",[452,3934,3935],{"__ignoreMap":578},[582,3936,3937,3939,3941,3944,3946,3948,3950,3952],{"class":584,"line":585},[582,3938,2347],{"class":588},[582,3940,2350],{"class":591},[582,3942,3943],{"class":591}," examples\u002Fcli\u002F.evlog\u002Flogs\u002F",[582,3945,2356],{"class":792},[582,3947,2359],{"class":588},[582,3949,2362],{"class":591},[582,3951,1262],{"class":792},[582,3953,2367],{"class":591},[572,3955,3957],{"className":574,"code":3956,"filename":103,"language":577,"meta":578,"style":578},"export EVLOG_DRAIN=axiom AXIOM_API_KEY=… AXIOM_DATASET=evlog-demo-cli\npnpm example:cli doctor\n",[452,3958,3959,3980],{"__ignoreMap":578},[582,3960,3961,3963,3965,3967,3970,3972,3975,3977],{"class":584,"line":585},[582,3962,927],{"class":866},[582,3964,2379],{"class":796},[582,3966,873],{"class":792},[582,3968,3969],{"class":796},"axiom AXIOM_API_KEY",[582,3971,873],{"class":792},[582,3973,3974],{"class":796},"… AXIOM_DATASET",[582,3976,873],{"class":792},[582,3978,3979],{"class":796},"evlog-demo-cli\n",[582,3981,3982,3984,3986],{"class":584,"line":604},[582,3983,576],{"class":588},[582,3985,3898],{"class":591},[582,3987,1653],{"class":591},[3989,3990,3991],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html 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 .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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":578,"searchDepth":604,"depth":604,"links":3993},[3994,3995,3998,3999,4000,4001,4006,4014],{"id":566,"depth":604,"text":567},{"id":761,"depth":604,"text":762,"children":3996},[3997],{"id":1633,"depth":835,"text":1634},{"id":1792,"depth":604,"text":1793},{"id":1918,"depth":604,"text":1919},{"id":2018,"depth":604,"text":2019},{"id":2516,"depth":604,"text":2517,"children":4002},[4003,4004,4005],{"id":2520,"depth":835,"text":2521},{"id":3232,"depth":835,"text":3233},{"id":3355,"depth":835,"text":3356},{"id":3368,"depth":604,"text":3369,"children":4007},[4008,4010,4011,4013],{"id":3372,"depth":835,"text":4009},"setupEvlog() vs useLogger()",{"id":3541,"depth":835,"text":3542},{"id":3625,"depth":835,"text":4012},"createCommandLogger (libraries)",{"id":3757,"depth":835,"text":3758},{"id":3879,"depth":604,"text":3880},"Observability for command-line tools. One wide event per command, drain pipeline, optional error and audit catalogs. Your citty and Clack stack stays unchanged.","md",[4018],{"label":4019,"icon":4020,"to":481,"color":468,"variant":4021},"Example CLI","i-simple-icons-github","subtle",{},{"title":246,"icon":44},{"title":246,"description":4015},"XzWqrm6KDiIRSm0d3r3qGgvZOv0QsSeE2rJjQhAt7yA",[4027,4029],{"title":241,"path":242,"stem":243,"description":4028,"icon":244,"children":-1},"Wide events and structured logging in AWS Lambda functions, including SQS consumers and event-driven handlers.",{"title":36,"path":255,"stem":256,"description":4030,"icon":257,"children":-1},"Recipes that solve a specific problem with evlog — capture browser logs, observe AI SDK calls, identify users from Better Auth, build a tamper-evident audit trail, enrich every event with derived context.",1780170267350]