[{"data":1,"prerenderedAt":4003},["ShallowReactive",2],{"navigation_docs":3,"-integrate-frameworks-cli":443,"-integrate-frameworks-cli-surround":3998},[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":3987,"extension":3988,"links":3989,"meta":3994,"navigation":3995,"path":247,"seo":3996,"stem":248,"__hash__":3997},"docs\u002F3.integrate\u002Fframeworks\u002F17.cli.md",{"type":446,"value":447,"toc":3964},"minimark",[448,465,486,526,563,568,696,759,763,769,1623,1629,1634,1779,1789,1793,1894,1902,1915,1919,1929,1932,2007,2015,2019,2041,2054,2393,2412,2486,2493,2497,2501,2504,2987,3006,3207,3211,3324,3328,3334,3337,3341,3350,3413,3422,3460,3480,3496,3511,3515,3595,3602,3605,3727,3731,3847,3849,3853,3856,3960],[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.",[569,770,771,980,1113,1314],{},[572,772,777],{"className":773,"code":774,"filename":775,"language":776,"meta":578,"style":578},"language-typescript 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","1 · drain.ts","typescript",[452,778,779,811,831,852,859,915,920,938,974],{"__ignoreMap":578},[582,780,781,785,788,792,796,799,802,805,808],{"class":584,"line":585},[582,782,784],{"class":783},"s7zQu","import",[582,786,787],{"class":783}," type",[582,789,791],{"class":790},"sMK4o"," {",[582,793,795],{"class":794},"sTEyZ"," DrainContext",[582,797,798],{"class":790}," }",[582,800,801],{"class":783}," from",[582,803,804],{"class":790}," '",[582,806,807],{"class":591},"evlog",[582,809,810],{"class":790},"'\n",[582,812,813,815,817,820,822,824,826,829],{"class":584,"line":604},[582,814,784],{"class":783},[582,816,791],{"class":790},[582,818,819],{"class":794}," createFsDrain",[582,821,798],{"class":790},[582,823,801],{"class":783},[582,825,804],{"class":790},[582,827,828],{"class":591},"evlog\u002Ffs",[582,830,810],{"class":790},[582,832,834,836,838,841,843,845,847,850],{"class":584,"line":833},3,[582,835,784],{"class":783},[582,837,791],{"class":790},[582,839,840],{"class":794}," createDrainPipeline",[582,842,798],{"class":790},[582,844,801],{"class":783},[582,846,804],{"class":790},[582,848,849],{"class":591},"evlog\u002Fpipeline",[582,851,810],{"class":790},[582,853,855],{"class":584,"line":854},4,[582,856,858],{"emptyLinePlaceholder":857},true,"\n",[582,860,862,866,869,872,875,878,881,884,887,890,894,897,899,902,904,908,910,912],{"class":584,"line":861},5,[582,863,865],{"class":864},"spNyl","const",[582,867,868],{"class":794}," pipeline ",[582,870,871],{"class":790},"=",[582,873,840],{"class":874},"s2Zo4",[582,876,877],{"class":790},"\u003C",[582,879,880],{"class":588},"DrainContext",[582,882,883],{"class":790},">",[582,885,886],{"class":794},"(",[582,888,889],{"class":790},"{",[582,891,893],{"class":892},"swJcz"," batch",[582,895,896],{"class":790},":",[582,898,791],{"class":790},[582,900,901],{"class":892}," size",[582,903,896],{"class":790},[582,905,907],{"class":906},"sbssI"," 20",[582,909,798],{"class":790},[582,911,798],{"class":790},[582,913,914],{"class":794},")\n",[582,916,918],{"class":584,"line":917},6,[582,919,858],{"emptyLinePlaceholder":857},[582,921,923,926,929,932,935],{"class":584,"line":922},7,[582,924,925],{"class":783},"export",[582,927,928],{"class":864}," function",[582,930,931],{"class":874}," createCliDrain",[582,933,934],{"class":790},"()",[582,936,937],{"class":790}," {\n",[582,939,941,944,947,949,952,954,956,959,961,963,966,969,971],{"class":584,"line":940},8,[582,942,943],{"class":783},"  return",[582,945,946],{"class":874}," pipeline",[582,948,886],{"class":892},[582,950,951],{"class":874},"createFsDrain",[582,953,886],{"class":892},[582,955,889],{"class":790},[582,957,958],{"class":892}," dir",[582,960,896],{"class":790},[582,962,804],{"class":790},[582,964,965],{"class":591},".evlog\u002Flogs",[582,967,968],{"class":790},"'",[582,970,798],{"class":790},[582,972,973],{"class":892},"))\n",[582,975,977],{"class":584,"line":976},9,[582,978,979],{"class":790},"}\n",[572,981,984],{"className":773,"code":982,"filename":983,"language":776,"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","2 · evlog.ts",[452,985,986,1005,1024,1028,1047,1064,1080,1093,1106],{"__ignoreMap":578},[582,987,988,990,992,995,997,999,1001,1003],{"class":584,"line":585},[582,989,784],{"class":783},[582,991,791],{"class":790},[582,993,994],{"class":794}," setupEvlog",[582,996,798],{"class":790},[582,998,801],{"class":783},[582,1000,804],{"class":790},[582,1002,454],{"class":591},[582,1004,810],{"class":790},[582,1006,1007,1009,1011,1013,1015,1017,1019,1022],{"class":584,"line":604},[582,1008,784],{"class":783},[582,1010,791],{"class":790},[582,1012,931],{"class":794},[582,1014,798],{"class":790},[582,1016,801],{"class":783},[582,1018,804],{"class":790},[582,1020,1021],{"class":591},".\u002Fdrain",[582,1023,810],{"class":790},[582,1025,1026],{"class":584,"line":833},[582,1027,858],{"emptyLinePlaceholder":857},[582,1029,1030,1032,1035,1038,1040,1042,1044],{"class":584,"line":854},[582,1031,925],{"class":783},[582,1033,1034],{"class":864}," const",[582,1036,1037],{"class":794}," setup ",[582,1039,871],{"class":790},[582,1041,994],{"class":874},[582,1043,886],{"class":794},[582,1045,1046],{"class":790},"{\n",[582,1048,1049,1052,1054,1056,1059,1061],{"class":584,"line":861},[582,1050,1051],{"class":892},"  service",[582,1053,896],{"class":790},[582,1055,804],{"class":790},[582,1057,1058],{"class":591},"my-cli",[582,1060,968],{"class":790},[582,1062,1063],{"class":790},",\n",[582,1065,1066,1069,1071,1073,1076,1078],{"class":584,"line":917},[582,1067,1068],{"class":892},"  version",[582,1070,896],{"class":790},[582,1072,804],{"class":790},[582,1074,1075],{"class":591},"1.0.0",[582,1077,968],{"class":790},[582,1079,1063],{"class":790},[582,1081,1082,1085,1087,1091],{"class":584,"line":922},[582,1083,1084],{"class":892},"  redact",[582,1086,896],{"class":790},[582,1088,1090],{"class":1089},"sfNiH"," true",[582,1092,1063],{"class":790},[582,1094,1095,1098,1100,1102,1104],{"class":584,"line":940},[582,1096,1097],{"class":892},"  drain",[582,1099,896],{"class":790},[582,1101,931],{"class":874},[582,1103,934],{"class":794},[582,1105,1063],{"class":790},[582,1107,1108,1111],{"class":584,"line":976},[582,1109,1110],{"class":790},"}",[582,1112,914],{"class":794},[572,1114,1117],{"className":773,"code":1115,"filename":1116,"language":776,"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","3 · index.ts",[452,1118,1119,1138,1157,1177,1197,1201,1215,1240,1266,1294,1306],{"__ignoreMap":578},[582,1120,1121,1123,1125,1128,1130,1132,1134,1136],{"class":584,"line":585},[582,1122,784],{"class":783},[582,1124,791],{"class":790},[582,1126,1127],{"class":794}," exitWithError",[582,1129,798],{"class":790},[582,1131,801],{"class":783},[582,1133,804],{"class":790},[582,1135,454],{"class":591},[582,1137,810],{"class":790},[582,1139,1140,1142,1144,1147,1149,1151,1153,1155],{"class":584,"line":604},[582,1141,784],{"class":783},[582,1143,791],{"class":790},[582,1145,1146],{"class":794}," runMain",[582,1148,798],{"class":790},[582,1150,801],{"class":783},[582,1152,804],{"class":790},[582,1154,730],{"class":591},[582,1156,810],{"class":790},[582,1158,1159,1161,1163,1166,1168,1170,1172,1175],{"class":584,"line":833},[582,1160,784],{"class":783},[582,1162,791],{"class":790},[582,1164,1165],{"class":794}," setup",[582,1167,798],{"class":790},[582,1169,801],{"class":783},[582,1171,804],{"class":790},[582,1173,1174],{"class":591},".\u002Fevlog",[582,1176,810],{"class":790},[582,1178,1179,1181,1183,1186,1188,1190,1192,1195],{"class":584,"line":854},[582,1180,784],{"class":783},[582,1182,791],{"class":790},[582,1184,1185],{"class":794}," main",[582,1187,798],{"class":790},[582,1189,801],{"class":783},[582,1191,804],{"class":790},[582,1193,1194],{"class":591},".\u002Fcommands",[582,1196,810],{"class":790},[582,1198,1199],{"class":584,"line":861},[582,1200,858],{"emptyLinePlaceholder":857},[582,1202,1203,1206,1209,1212],{"class":584,"line":917},[582,1204,1205],{"class":874},"runMain",[582,1207,1208],{"class":794},"(main",[582,1210,1211],{"class":790},",",[582,1213,1214],{"class":794}," setup)\n",[582,1216,1217,1220,1223,1225,1227,1230,1232,1234,1237],{"class":584,"line":922},[582,1218,1219],{"class":790},"  .",[582,1221,1222],{"class":874},"then",[582,1224,886],{"class":794},[582,1226,934],{"class":790},[582,1228,1229],{"class":864}," =>",[582,1231,1165],{"class":794},[582,1233,485],{"class":790},[582,1235,1236],{"class":874},"flush",[582,1238,1239],{"class":794},"())\n",[582,1241,1242,1244,1247,1249,1252,1255,1259,1262,1264],{"class":584,"line":940},[582,1243,1219],{"class":790},[582,1245,1246],{"class":874},"catch",[582,1248,886],{"class":794},[582,1250,1251],{"class":864},"async",[582,1253,1254],{"class":790}," (",[582,1256,1258],{"class":1257},"sHdIc","error",[582,1260,1261],{"class":790},")",[582,1263,1229],{"class":864},[582,1265,937],{"class":790},[582,1267,1268,1271,1273,1275,1277,1279,1281,1283,1285,1287,1289,1292],{"class":584,"line":976},[582,1269,1270],{"class":783},"    await",[582,1272,1165],{"class":794},[582,1274,485],{"class":790},[582,1276,1236],{"class":874},[582,1278,934],{"class":892},[582,1280,485],{"class":790},[582,1282,1246],{"class":874},[582,1284,886],{"class":892},[582,1286,934],{"class":790},[582,1288,1229],{"class":864},[582,1290,1291],{"class":790}," {}",[582,1293,914],{"class":892},[582,1295,1297,1300,1302,1304],{"class":584,"line":1296},10,[582,1298,1299],{"class":874},"    exitWithError",[582,1301,886],{"class":892},[582,1303,1258],{"class":794},[582,1305,914],{"class":892},[582,1307,1309,1312],{"class":584,"line":1308},11,[582,1310,1311],{"class":790},"  }",[582,1313,914],{"class":794},[572,1315,1318],{"className":773,"code":1316,"filename":1317,"language":776,"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","4 · commands\u002Fdoctor.ts",[452,1319,1320,1339,1362,1381,1385,1402,1440,1452,1468,1489,1552,1572,1610,1616],{"__ignoreMap":578},[582,1321,1322,1324,1326,1329,1331,1333,1335,1337],{"class":584,"line":585},[582,1323,784],{"class":783},[582,1325,791],{"class":790},[582,1327,1328],{"class":794}," defineCommand",[582,1330,798],{"class":790},[582,1332,801],{"class":783},[582,1334,804],{"class":790},[582,1336,725],{"class":591},[582,1338,810],{"class":790},[582,1340,1341,1343,1346,1349,1352,1355,1357,1360],{"class":584,"line":604},[582,1342,784],{"class":783},[582,1344,1345],{"class":790}," *",[582,1347,1348],{"class":783}," as",[582,1350,1351],{"class":794}," p ",[582,1353,1354],{"class":783},"from",[582,1356,804],{"class":790},[582,1358,1359],{"class":591},"@clack\u002Fprompts",[582,1361,810],{"class":790},[582,1363,1364,1366,1368,1371,1373,1375,1377,1379],{"class":584,"line":833},[582,1365,784],{"class":783},[582,1367,791],{"class":790},[582,1369,1370],{"class":794}," useLogger",[582,1372,798],{"class":790},[582,1374,801],{"class":783},[582,1376,804],{"class":790},[582,1378,454],{"class":591},[582,1380,810],{"class":790},[582,1382,1383],{"class":584,"line":854},[582,1384,858],{"emptyLinePlaceholder":857},[582,1386,1387,1389,1391,1394,1396,1398,1400],{"class":584,"line":861},[582,1388,925],{"class":783},[582,1390,1034],{"class":864},[582,1392,1393],{"class":794}," doctor ",[582,1395,871],{"class":790},[582,1397,1328],{"class":874},[582,1399,886],{"class":794},[582,1401,1046],{"class":790},[582,1403,1404,1407,1409,1411,1414,1416,1418,1421,1423,1425,1428,1430,1432,1435,1437],{"class":584,"line":917},[582,1405,1406],{"class":892},"  meta",[582,1408,896],{"class":790},[582,1410,791],{"class":790},[582,1412,1413],{"class":892}," name",[582,1415,896],{"class":790},[582,1417,804],{"class":790},[582,1419,1420],{"class":591},"doctor",[582,1422,968],{"class":790},[582,1424,1211],{"class":790},[582,1426,1427],{"class":892}," description",[582,1429,896],{"class":790},[582,1431,804],{"class":790},[582,1433,1434],{"class":591},"Health checks",[582,1436,968],{"class":790},[582,1438,1439],{"class":790}," },\n",[582,1441,1442,1445,1448,1450],{"class":584,"line":922},[582,1443,1444],{"class":864},"  async",[582,1446,1447],{"class":892}," run",[582,1449,934],{"class":790},[582,1451,937],{"class":790},[582,1453,1454,1457,1460,1463,1465],{"class":584,"line":940},[582,1455,1456],{"class":864},"    const",[582,1458,1459],{"class":794}," log",[582,1461,1462],{"class":790}," =",[582,1464,1370],{"class":874},[582,1466,1467],{"class":892},"()\n",[582,1469,1470,1473,1475,1478,1480,1482,1485,1487],{"class":584,"line":976},[582,1471,1472],{"class":794},"    p",[582,1474,485],{"class":790},[582,1476,1477],{"class":874},"intro",[582,1479,886],{"class":892},[582,1481,968],{"class":790},[582,1483,1484],{"class":591},"my-cli doctor",[582,1486,968],{"class":790},[582,1488,914],{"class":892},[582,1490,1491,1493,1496,1498,1501,1503,1505,1507,1509,1512,1514,1516,1519,1521,1523,1526,1528,1530,1532,1534,1537,1539,1541,1543,1545,1547,1549],{"class":584,"line":1296},[582,1492,1456],{"class":864},[582,1494,1495],{"class":794}," checks",[582,1497,1462],{"class":790},[582,1499,1500],{"class":892}," [",[582,1502,889],{"class":790},[582,1504,1413],{"class":892},[582,1506,896],{"class":790},[582,1508,804],{"class":790},[582,1510,1511],{"class":591},"config",[582,1513,968],{"class":790},[582,1515,1211],{"class":790},[582,1517,1518],{"class":892}," ok",[582,1520,896],{"class":790},[582,1522,1090],{"class":1089},[582,1524,1525],{"class":790}," },",[582,1527,791],{"class":790},[582,1529,1413],{"class":892},[582,1531,896],{"class":790},[582,1533,804],{"class":790},[582,1535,1536],{"class":591},"api",[582,1538,968],{"class":790},[582,1540,1211],{"class":790},[582,1542,1518],{"class":892},[582,1544,896],{"class":790},[582,1546,1090],{"class":1089},[582,1548,798],{"class":790},[582,1550,1551],{"class":892},"]\n",[582,1553,1554,1557,1559,1562,1564,1566,1568,1570],{"class":584,"line":1308},[582,1555,1556],{"class":794},"    log",[582,1558,485],{"class":790},[582,1560,1561],{"class":874},"set",[582,1563,886],{"class":892},[582,1565,889],{"class":790},[582,1567,1495],{"class":794},[582,1569,798],{"class":790},[582,1571,914],{"class":892},[582,1573,1575,1577,1579,1582,1584,1587,1590,1593,1596,1598,1601,1603,1606,1608],{"class":584,"line":1574},12,[582,1576,1472],{"class":794},[582,1578,485],{"class":790},[582,1580,1581],{"class":874},"outro",[582,1583,886],{"class":892},[582,1585,1586],{"class":790},"`",[582,1588,1589],{"class":591},"All ",[582,1591,1592],{"class":790},"${",[582,1594,1595],{"class":794},"checks",[582,1597,485],{"class":790},[582,1599,1600],{"class":794},"length",[582,1602,1110],{"class":790},[582,1604,1605],{"class":591}," checks passed",[582,1607,1586],{"class":790},[582,1609,914],{"class":892},[582,1611,1613],{"class":584,"line":1612},13,[582,1614,1615],{"class":790},"  },\n",[582,1617,1619,1621],{"class":584,"line":1618},14,[582,1620,1110],{"class":790},[582,1622,914],{"class":794},[449,1624,1625,1626,485],{},"Each command run emits one wide event to the drain: duration, exit status, redacted flags, and whatever you pass to ",[452,1627,1628],{},"log.set()",[1630,1631,1633],"h3",{"id":1632},"what-you-see-vs-what-gets-drained","What you see vs what gets drained",[569,1635,1636,1689,1730],{},[572,1637,1640],{"className":574,"code":1638,"filename":1639,"language":577,"meta":578,"style":578},"$ my-cli doctor\n◆  my-cli doctor\n◇  Running checks\n◆  All 2 checks passed\n","Terminal",[452,1641,1642,1653,1663,1674],{"__ignoreMap":578},[582,1643,1644,1647,1650],{"class":584,"line":585},[582,1645,1646],{"class":588},"$",[582,1648,1649],{"class":591}," my-cli",[582,1651,1652],{"class":591}," doctor\n",[582,1654,1655,1658,1661],{"class":584,"line":604},[582,1656,1657],{"class":588},"◆",[582,1659,1660],{"class":591},"  my-cli",[582,1662,1652],{"class":591},[582,1664,1665,1668,1671],{"class":584,"line":833},[582,1666,1667],{"class":588},"◇",[582,1669,1670],{"class":591},"  Running",[582,1672,1673],{"class":591}," checks\n",[582,1675,1676,1678,1681,1684,1686],{"class":584,"line":854},[582,1677,1657],{"class":588},[582,1679,1680],{"class":591},"  All",[582,1682,1683],{"class":906}," 2",[582,1685,1495],{"class":591},[582,1687,1688],{"class":591}," passed\n",[572,1690,1693],{"className":574,"code":1691,"filename":1692,"language":577,"meta":578,"style":578},"$ my-cli doctor --log\n… wide event pretty-printed on stderr …\n","--log",[452,1694,1695,1707],{"__ignoreMap":578},[582,1696,1697,1699,1701,1704],{"class":584,"line":585},[582,1698,1646],{"class":588},[582,1700,1649],{"class":591},[582,1702,1703],{"class":591}," doctor",[582,1705,1706],{"class":591}," --log\n",[582,1708,1709,1712,1715,1718,1721,1724,1727],{"class":584,"line":604},[582,1710,1711],{"class":588},"…",[582,1713,1714],{"class":591}," wide",[582,1716,1717],{"class":591}," event",[582,1719,1720],{"class":591}," pretty-printed",[582,1722,1723],{"class":591}," on",[582,1725,1726],{"class":591}," stderr",[582,1728,1729],{"class":591}," …\n",[572,1731,1734],{"className":574,"code":1732,"filename":1733,"language":577,"meta":578,"style":578},"$ my-cli doctor --json\n{\"checks\":[{\"name\":\"config\",\"ok\":true}]}\n","--json (yours)",[452,1735,1736,1747],{"__ignoreMap":578},[582,1737,1738,1740,1742,1744],{"class":584,"line":585},[582,1739,1646],{"class":588},[582,1741,1649],{"class":591},[582,1743,1703],{"class":591},[582,1745,1746],{"class":591}," --json\n",[582,1748,1749,1751,1754,1756,1759,1762,1765,1768,1770,1773,1776],{"class":584,"line":604},[582,1750,889],{"class":790},[582,1752,1753],{"class":588},"\"checks\"",[582,1755,896],{"class":874},[582,1757,1758],{"class":591},"[{",[582,1760,1761],{"class":794},"\"",[582,1763,1764],{"class":588},"name",[582,1766,1767],{"class":588},"\":\"",[582,1769,1511],{"class":588},[582,1771,1772],{"class":588},"\",\"",[582,1774,1775],{"class":588},"ok",[582,1777,1778],{"class":588},"\":true}]}\n",[449,1780,1781,1782,1785,1786,1788],{},"Stdout stays yours. NDJSON wide events always go to the drain (for example ",[452,1783,1784],{},".evlog\u002Flogs\u002F2026-05-30.jsonl"," with ",[452,1787,951],{},").",[564,1790,1792],{"id":1791},"what-evlog-does-does-not-do","What evlog does \u002F does not do",[697,1794,1795,1806],{},[700,1796,1797],{},[703,1798,1799,1801,1803],{},[706,1800],{},[706,1802,807],{},[706,1804,1805],{},"Your app",[716,1807,1808,1821,1831,1843,1853,1864,1876,1885],{},[703,1809,1810,1817,1819],{},[721,1811,1812,1813,1816],{},"Routing (",[452,1814,1815],{},"--help",", subcommands)",[721,1818],{},[721,1820,725],{},[703,1822,1823,1826,1828],{},[721,1824,1825],{},"Terminal UI (spinners, colors)",[721,1827],{},[721,1829,1830],{},"Clack, consola, …",[703,1832,1833,1838,1840],{},[721,1834,1835,1837],{},[452,1836,463],{}," stdout shape",[721,1839],{},[721,1841,1842],{},"your flag, your format",[703,1844,1845,1848,1851],{},[721,1846,1847],{},"Wide events + drain",[721,1849,1850],{},"yes",[721,1852],{},[703,1854,1855,1860,1862],{},[721,1856,1857,1859],{},[452,1858,1692],{}," debug on stderr",[721,1861,1850],{},[721,1863],{},[703,1865,1866,1872,1874],{},[721,1867,1868,1869],{},"Redact secrets in ",[452,1870,1871],{},"cli.flags",[721,1873,1850],{},[721,1875],{},[703,1877,1878,1881,1883],{},[721,1879,1880],{},"Error catalog",[721,1882,1850],{},[721,1884],{},[703,1886,1887,1890,1892],{},[721,1888,1889],{},"Audit catalog",[721,1891,1850],{},[721,1893],{},[572,1895,1900],{"className":1896,"code":1898,"language":1899,"meta":578},[1897],"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,1901,1898],{"__ignoreMap":578},[449,1903,1904,1905,1908,1909,1911,1912,1914],{},"By default the evlog console is ",[457,1906,1907],{},"silent",". Pass ",[452,1910,1692],{}," (auto-injected by ",[452,1913,1205],{},") to echo wide events on stderr while debugging.",[564,1916,1918],{"id":1917},"why-evlog-on-a-cli","Why evlog on a CLI",[449,1920,1921,1922,1925,1926,1928],{},"Every command is a small operation with a clear start and end. That maps cleanly to a ",[457,1923,1924],{},"wide event",": duration, exit code, redacted flags, and the fields you attach with ",[452,1927,1628],{},". The result lands as queryable NDJSON locally, or in Axiom, Datadog, or OTLP when you wire a cloud drain.",[449,1930,1931],{},"Audit and error catalogs are optional. Add them when you need typed throws or security-sensitive actions, not on day one.",[697,1933,1934,1947],{},[700,1935,1936],{},[703,1937,1938,1941,1944],{},[706,1939,1940],{},"Level",[706,1942,1943],{},"What you add",[706,1945,1946],{},"Demo",[716,1948,1949,1969,1984],{},[703,1950,1951,1956,1965],{},[721,1952,1953],{},[457,1954,1955],{},"Simple",[721,1957,1958,1961,1962],{},[452,1959,1960],{},"setupEvlog"," + ",[452,1963,1964],{},"useLogger().set()",[721,1966,1967],{},[452,1968,1420],{},[703,1970,1971,1976,1979],{},[721,1972,1973],{},[457,1974,1975],{},"Medium",[721,1977,1978],{},"Outbound HTTP hooks, error catalog",[721,1980,1981],{},[452,1982,1983],{},"sync",[703,1985,1986,1991,1998],{},[721,1987,1988],{},[457,1989,1990],{},"Advanced",[721,1992,1993,1994,1997],{},"Audit catalog, ",[452,1995,1996],{},"log.audit()",", deny",[721,1999,2000,2003,2004],{},[452,2001,2002],{},"pull",", ",[452,2005,2006],{},"deploy",[449,2008,2009,2010,2014],{},"See the ",[479,2011,2013],{"href":481,"rel":2012},[483],"demo CLI"," for all three levels in one repo.",[564,2016,2018],{"id":2017},"send-events-to-axiom-or-another-provider","Send events to Axiom (or another provider)",[466,2020,2022,2025,2026,2029,2030,2033,2034,2037,2038,485],{"color":2021,"icon":88},"warning",[457,2023,2024],{},"evlog does not auto-send to Axiom, Datadog, or OTLP."," Wide events leave the process only when you pass a ",[457,2027,2028],{},"drain"," to ",[452,2031,2032],{},"setupEvlog({ drain })",". Without it, telemetry is dropped. Most setups start with ",[452,2035,2036],{},"createFsDrain()"," and local NDJSON under ",[452,2039,2040],{},".evlog\u002Flogs\u002F",[449,2042,2043,2044,2047,2048,2029,2051,2053],{},"On HTTP apps the framework wires the drain for you. On a CLI, you pick the adapter in ",[452,2045,2046],{},"src\u002Fdrain.ts"," and pass ",[452,2049,2050],{},"createCliDrain()",[452,2052,1960],{},". Credentials live on the host that runs the binary, never in the published package.",[569,2055,2056,2309,2346],{},[572,2057,2060],{"className":773,"code":2058,"filename":2059,"language":776,"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","drain.ts",[452,2061,2062,2082,2102,2120,2138,2142,2180,2184,2196,2231,2249,2254,2268,2298,2304],{"__ignoreMap":578},[582,2063,2064,2066,2068,2070,2072,2074,2076,2078,2080],{"class":584,"line":585},[582,2065,784],{"class":783},[582,2067,787],{"class":783},[582,2069,791],{"class":790},[582,2071,795],{"class":794},[582,2073,798],{"class":790},[582,2075,801],{"class":783},[582,2077,804],{"class":790},[582,2079,807],{"class":591},[582,2081,810],{"class":790},[582,2083,2084,2086,2088,2091,2093,2095,2097,2100],{"class":584,"line":604},[582,2085,784],{"class":783},[582,2087,791],{"class":790},[582,2089,2090],{"class":794}," createAxiomDrain",[582,2092,798],{"class":790},[582,2094,801],{"class":783},[582,2096,804],{"class":790},[582,2098,2099],{"class":591},"evlog\u002Faxiom",[582,2101,810],{"class":790},[582,2103,2104,2106,2108,2110,2112,2114,2116,2118],{"class":584,"line":833},[582,2105,784],{"class":783},[582,2107,791],{"class":790},[582,2109,819],{"class":794},[582,2111,798],{"class":790},[582,2113,801],{"class":783},[582,2115,804],{"class":790},[582,2117,828],{"class":591},[582,2119,810],{"class":790},[582,2121,2122,2124,2126,2128,2130,2132,2134,2136],{"class":584,"line":854},[582,2123,784],{"class":783},[582,2125,791],{"class":790},[582,2127,840],{"class":794},[582,2129,798],{"class":790},[582,2131,801],{"class":783},[582,2133,804],{"class":790},[582,2135,849],{"class":591},[582,2137,810],{"class":790},[582,2139,2140],{"class":584,"line":861},[582,2141,858],{"emptyLinePlaceholder":857},[582,2143,2144,2146,2148,2150,2152,2154,2156,2158,2160,2162,2164,2166,2168,2170,2172,2174,2176,2178],{"class":584,"line":917},[582,2145,865],{"class":864},[582,2147,868],{"class":794},[582,2149,871],{"class":790},[582,2151,840],{"class":874},[582,2153,877],{"class":790},[582,2155,880],{"class":588},[582,2157,883],{"class":790},[582,2159,886],{"class":794},[582,2161,889],{"class":790},[582,2163,893],{"class":892},[582,2165,896],{"class":790},[582,2167,791],{"class":790},[582,2169,901],{"class":892},[582,2171,896],{"class":790},[582,2173,907],{"class":906},[582,2175,798],{"class":790},[582,2177,798],{"class":790},[582,2179,914],{"class":794},[582,2181,2182],{"class":584,"line":922},[582,2183,858],{"emptyLinePlaceholder":857},[582,2185,2186,2188,2190,2192,2194],{"class":584,"line":940},[582,2187,925],{"class":783},[582,2189,928],{"class":864},[582,2191,931],{"class":874},[582,2193,934],{"class":790},[582,2195,937],{"class":790},[582,2197,2198,2201,2203,2206,2208,2211,2213,2216,2219,2221,2224,2226,2229],{"class":584,"line":976},[582,2199,2200],{"class":783},"  if",[582,2202,1254],{"class":892},[582,2204,2205],{"class":794},"process",[582,2207,485],{"class":790},[582,2209,2210],{"class":794},"env",[582,2212,485],{"class":790},[582,2214,2215],{"class":794},"EVLOG_DRAIN",[582,2217,2218],{"class":790}," ===",[582,2220,804],{"class":790},[582,2222,2223],{"class":591},"axiom",[582,2225,968],{"class":790},[582,2227,2228],{"class":892},") ",[582,2230,1046],{"class":790},[582,2232,2233,2236,2238,2240,2243,2246],{"class":584,"line":1296},[582,2234,2235],{"class":783},"    return",[582,2237,946],{"class":874},[582,2239,886],{"class":892},[582,2241,2242],{"class":874},"createAxiomDrain",[582,2244,2245],{"class":892},"()) ",[582,2247,2248],{"class":614},"\u002F\u002F AXIOM_API_KEY, AXIOM_DATASET from env\n",[582,2250,2251],{"class":584,"line":1308},[582,2252,2253],{"class":790},"  }\n",[582,2255,2256,2258,2260,2262,2264,2266],{"class":584,"line":1574},[582,2257,943],{"class":783},[582,2259,946],{"class":874},[582,2261,886],{"class":892},[582,2263,951],{"class":874},[582,2265,886],{"class":892},[582,2267,1046],{"class":790},[582,2269,2270,2273,2275,2278,2280,2282,2284,2287,2290,2292,2294,2296],{"class":584,"line":1612},[582,2271,2272],{"class":892},"    dir",[582,2274,896],{"class":790},[582,2276,2277],{"class":794}," process",[582,2279,485],{"class":790},[582,2281,2210],{"class":794},[582,2283,485],{"class":790},[582,2285,2286],{"class":794},"EVLOG_LOG_DIR",[582,2288,2289],{"class":790}," ??",[582,2291,804],{"class":790},[582,2293,965],{"class":591},[582,2295,968],{"class":790},[582,2297,1063],{"class":790},[582,2299,2300,2302],{"class":584,"line":1618},[582,2301,1311],{"class":790},[582,2303,973],{"class":892},[582,2305,2307],{"class":584,"line":2306},15,[582,2308,979],{"class":790},[572,2310,2313],{"className":574,"code":2311,"filename":2312,"language":577,"meta":578,"style":578},"my-cli doctor\ntail -f .evlog\u002Flogs\u002F$(date +%Y-%m-%d).jsonl\n","Local",[452,2314,2315,2321],{"__ignoreMap":578},[582,2316,2317,2319],{"class":584,"line":585},[582,2318,1058],{"class":588},[582,2320,1652],{"class":591},[582,2322,2323,2326,2329,2332,2335,2338,2341,2343],{"class":584,"line":604},[582,2324,2325],{"class":588},"tail",[582,2327,2328],{"class":591}," -f",[582,2330,2331],{"class":591}," .evlog\u002Flogs\u002F",[582,2333,2334],{"class":790},"$(",[582,2336,2337],{"class":588},"date",[582,2339,2340],{"class":591}," +%Y-%m-%d",[582,2342,1261],{"class":790},[582,2344,2345],{"class":591},".jsonl\n",[572,2347,2349],{"className":574,"code":2348,"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,2350,2351,2363,2375,2387],{"__ignoreMap":578},[582,2352,2353,2355,2358,2360],{"class":584,"line":585},[582,2354,925],{"class":864},[582,2356,2357],{"class":794}," EVLOG_DRAIN",[582,2359,871],{"class":790},[582,2361,2362],{"class":794},"axiom\n",[582,2364,2365,2367,2370,2372],{"class":584,"line":604},[582,2366,925],{"class":864},[582,2368,2369],{"class":794}," AXIOM_API_KEY",[582,2371,871],{"class":790},[582,2373,2374],{"class":794},"xaat-…\n",[582,2376,2377,2379,2382,2384],{"class":584,"line":833},[582,2378,925],{"class":864},[582,2380,2381],{"class":794}," AXIOM_DATASET",[582,2383,871],{"class":790},[582,2385,2386],{"class":794},"my-cli\n",[582,2388,2389,2391],{"class":584,"line":854},[582,2390,1058],{"class":588},[582,2392,1652],{"class":591},[449,2394,2395,2397,2398,2401,2402,2003,2405,2408,2409,485],{},[452,2396,2215],{}," is a ",[457,2399,2400],{},"convention for your CLI",", not a built-in evlog flag. Swap in ",[452,2403,2404],{},"evlog\u002Fdatadog",[452,2406,2407],{},"evlog\u002Fotlp",", etc. the same way. Full env lists: ",[479,2410,2411],{"href":95},"adapters overview",[697,2413,2414,2426],{},[700,2415,2416],{},[703,2417,2418,2421,2423],{},[706,2419,2420],{},"Adapter",[706,2422,711],{},[706,2424,2425],{},"Typical env",[716,2427,2428,2441,2457,2473],{},[703,2429,2430,2433,2437],{},[721,2431,2432],{},"File system",[721,2434,2435],{},[452,2436,828],{},[721,2438,2439],{},[452,2440,2286],{},[703,2442,2443,2445,2449],{},[721,2444,103],{},[721,2446,2447],{},[452,2448,2099],{},[721,2450,2451,2003,2454],{},[452,2452,2453],{},"AXIOM_API_KEY",[452,2455,2456],{},"AXIOM_DATASET",[703,2458,2459,2461,2465],{},[721,2460,128],{},[721,2462,2463],{},[452,2464,2404],{},[721,2466,2467,2003,2470],{},[452,2468,2469],{},"DATADOG_API_KEY",[452,2471,2472],{},"DATADOG_SITE",[703,2474,2475,2477,2481],{},[721,2476,108],{},[721,2478,2479],{},[452,2480,2407],{},[721,2482,2483],{},[452,2484,2485],{},"OTEL_EXPORTER_OTLP_ENDPOINT",[449,2487,2488,2489,2492],{},"Ship a ",[452,2490,2491],{},".env.example"," with commented placeholders for operators. Never commit real keys.",[564,2494,2496],{"id":2495},"go-further-optional","Go further (optional)",[1630,2498,2500],{"id":2499},"error-and-audit-catalogs","Error and audit catalogs",[449,2502,2503],{},"Add when commands throw typed errors or record sensitive actions:",[569,2505,2506,2675,2873],{},[572,2507,2510],{"className":773,"code":2508,"filename":2509,"language":776,"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","catalogs\u002Ferrors.ts",[452,2511,2512,2531,2535,2561,2570,2582,2598,2614,2618,2624,2628,2644,2654,2667,2671],{"__ignoreMap":578},[582,2513,2514,2516,2518,2521,2523,2525,2527,2529],{"class":584,"line":585},[582,2515,784],{"class":783},[582,2517,791],{"class":790},[582,2519,2520],{"class":794}," defineErrorCatalog",[582,2522,798],{"class":790},[582,2524,801],{"class":783},[582,2526,804],{"class":790},[582,2528,807],{"class":591},[582,2530,810],{"class":790},[582,2532,2533],{"class":584,"line":604},[582,2534,858],{"emptyLinePlaceholder":857},[582,2536,2537,2539,2541,2544,2546,2548,2550,2552,2555,2557,2559],{"class":584,"line":833},[582,2538,925],{"class":783},[582,2540,1034],{"class":864},[582,2542,2543],{"class":794}," errorCatalog ",[582,2545,871],{"class":790},[582,2547,2520],{"class":874},[582,2549,886],{"class":794},[582,2551,968],{"class":790},[582,2553,2554],{"class":591},"myapp",[582,2556,968],{"class":790},[582,2558,1211],{"class":790},[582,2560,937],{"class":790},[582,2562,2563,2566,2568],{"class":584,"line":854},[582,2564,2565],{"class":892},"  CONFIG_MISSING",[582,2567,896],{"class":790},[582,2569,937],{"class":790},[582,2571,2572,2575,2577,2580],{"class":584,"line":861},[582,2573,2574],{"class":892},"    status",[582,2576,896],{"class":790},[582,2578,2579],{"class":906}," 1",[582,2581,1063],{"class":790},[582,2583,2584,2587,2589,2591,2594,2596],{"class":584,"line":917},[582,2585,2586],{"class":892},"    message",[582,2588,896],{"class":790},[582,2590,804],{"class":790},[582,2592,2593],{"class":591},"No config file found",[582,2595,968],{"class":790},[582,2597,1063],{"class":790},[582,2599,2600,2603,2605,2607,2610,2612],{"class":584,"line":922},[582,2601,2602],{"class":892},"    fix",[582,2604,896],{"class":790},[582,2606,804],{"class":790},[582,2608,2609],{"class":591},"Run myapp init or set MYAPP_CONFIG.",[582,2611,968],{"class":790},[582,2613,1063],{"class":790},[582,2615,2616],{"class":584,"line":940},[582,2617,1615],{"class":790},[582,2619,2620,2622],{"class":584,"line":976},[582,2621,1110],{"class":790},[582,2623,914],{"class":794},[582,2625,2626],{"class":584,"line":1296},[582,2627,858],{"emptyLinePlaceholder":857},[582,2629,2630,2633,2636,2638,2640,2642],{"class":584,"line":1308},[582,2631,2632],{"class":864},"declare",[582,2634,2635],{"class":864}," module",[582,2637,804],{"class":790},[582,2639,807],{"class":591},[582,2641,968],{"class":790},[582,2643,937],{"class":790},[582,2645,2646,2649,2652],{"class":584,"line":1574},[582,2647,2648],{"class":864},"  interface",[582,2650,2651],{"class":588}," RegisteredErrorCatalogs",[582,2653,937],{"class":790},[582,2655,2656,2659,2661,2664],{"class":584,"line":1612},[582,2657,2658],{"class":892},"    myapp",[582,2660,896],{"class":790},[582,2662,2663],{"class":790}," typeof",[582,2665,2666],{"class":794}," errorCatalog\n",[582,2668,2669],{"class":584,"line":1618},[582,2670,2253],{"class":790},[582,2672,2673],{"class":584,"line":2306},[582,2674,979],{"class":790},[572,2676,2679],{"className":773,"code":2677,"filename":2678,"language":776,"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","catalogs\u002Faudit.ts",[452,2680,2681,2700,2704,2729,2738,2754,2770,2786,2816,2820,2826,2830,2844,2853,2864,2868],{"__ignoreMap":578},[582,2682,2683,2685,2687,2690,2692,2694,2696,2698],{"class":584,"line":585},[582,2684,784],{"class":783},[582,2686,791],{"class":790},[582,2688,2689],{"class":794}," defineAuditCatalog",[582,2691,798],{"class":790},[582,2693,801],{"class":783},[582,2695,804],{"class":790},[582,2697,807],{"class":591},[582,2699,810],{"class":790},[582,2701,2702],{"class":584,"line":604},[582,2703,858],{"emptyLinePlaceholder":857},[582,2705,2706,2708,2710,2713,2715,2717,2719,2721,2723,2725,2727],{"class":584,"line":833},[582,2707,925],{"class":783},[582,2709,1034],{"class":864},[582,2711,2712],{"class":794}," auditCatalog ",[582,2714,871],{"class":790},[582,2716,2689],{"class":874},[582,2718,886],{"class":794},[582,2720,968],{"class":790},[582,2722,2554],{"class":591},[582,2724,968],{"class":790},[582,2726,1211],{"class":790},[582,2728,937],{"class":790},[582,2730,2731,2734,2736],{"class":584,"line":854},[582,2732,2733],{"class":892},"  SECRET_PULL",[582,2735,896],{"class":790},[582,2737,937],{"class":790},[582,2739,2740,2743,2745,2747,2750,2752],{"class":584,"line":861},[582,2741,2742],{"class":892},"    target",[582,2744,896],{"class":790},[582,2746,804],{"class":790},[582,2748,2749],{"class":591},"secret_store",[582,2751,968],{"class":790},[582,2753,1063],{"class":790},[582,2755,2756,2759,2761,2763,2766,2768],{"class":584,"line":917},[582,2757,2758],{"class":892},"    severity",[582,2760,896],{"class":790},[582,2762,804],{"class":790},[582,2764,2765],{"class":591},"high",[582,2767,968],{"class":790},[582,2769,1063],{"class":790},[582,2771,2772,2775,2777,2779,2782,2784],{"class":584,"line":922},[582,2773,2774],{"class":892},"    description",[582,2776,896],{"class":790},[582,2778,804],{"class":790},[582,2780,2781],{"class":591},"Read secrets from a remote store",[582,2783,968],{"class":790},[582,2785,1063],{"class":790},[582,2787,2788,2791,2793,2795,2797,2800,2802,2804,2806,2809,2811,2814],{"class":584,"line":940},[582,2789,2790],{"class":892},"    redactPaths",[582,2792,896],{"class":790},[582,2794,1500],{"class":794},[582,2796,968],{"class":790},[582,2798,2799],{"class":591},"token",[582,2801,968],{"class":790},[582,2803,1211],{"class":790},[582,2805,804],{"class":790},[582,2807,2808],{"class":591},"password",[582,2810,968],{"class":790},[582,2812,2813],{"class":794},"]",[582,2815,1063],{"class":790},[582,2817,2818],{"class":584,"line":976},[582,2819,1615],{"class":790},[582,2821,2822,2824],{"class":584,"line":1296},[582,2823,1110],{"class":790},[582,2825,914],{"class":794},[582,2827,2828],{"class":584,"line":1308},[582,2829,858],{"emptyLinePlaceholder":857},[582,2831,2832,2834,2836,2838,2840,2842],{"class":584,"line":1574},[582,2833,2632],{"class":864},[582,2835,2635],{"class":864},[582,2837,804],{"class":790},[582,2839,807],{"class":591},[582,2841,968],{"class":790},[582,2843,937],{"class":790},[582,2845,2846,2848,2851],{"class":584,"line":1612},[582,2847,2648],{"class":864},[582,2849,2850],{"class":588}," RegisteredAuditCatalogs",[582,2852,937],{"class":790},[582,2854,2855,2857,2859,2861],{"class":584,"line":1618},[582,2856,2658],{"class":892},[582,2858,896],{"class":790},[582,2860,2663],{"class":790},[582,2862,2863],{"class":794}," auditCatalog\n",[582,2865,2866],{"class":584,"line":2306},[582,2867,2253],{"class":790},[582,2869,2871],{"class":584,"line":2870},16,[582,2872,979],{"class":790},[572,2874,2877],{"className":773,"code":2875,"filename":2876,"language":776,"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","catalogs\u002Factor.ts",[452,2878,2879,2900,2904,2920,2950,2983],{"__ignoreMap":578},[582,2880,2881,2883,2885,2887,2890,2892,2894,2896,2898],{"class":584,"line":585},[582,2882,784],{"class":783},[582,2884,787],{"class":783},[582,2886,791],{"class":790},[582,2888,2889],{"class":794}," AuditActor",[582,2891,798],{"class":790},[582,2893,801],{"class":783},[582,2895,804],{"class":790},[582,2897,807],{"class":591},[582,2899,810],{"class":790},[582,2901,2902],{"class":584,"line":604},[582,2903,858],{"emptyLinePlaceholder":857},[582,2905,2906,2908,2910,2913,2916,2918],{"class":584,"line":833},[582,2907,925],{"class":783},[582,2909,928],{"class":864},[582,2911,2912],{"class":874}," resolveCliActor",[582,2914,2915],{"class":790},"():",[582,2917,2889],{"class":588},[582,2919,937],{"class":790},[582,2921,2922,2925,2928,2930,2932,2934,2936,2938,2941,2943,2945,2948],{"class":584,"line":854},[582,2923,2924],{"class":864},"  const",[582,2926,2927],{"class":794}," id",[582,2929,1462],{"class":790},[582,2931,2277],{"class":794},[582,2933,485],{"class":790},[582,2935,2210],{"class":794},[582,2937,485],{"class":790},[582,2939,2940],{"class":794},"USER",[582,2942,2289],{"class":790},[582,2944,804],{"class":790},[582,2946,2947],{"class":591},"unknown",[582,2949,810],{"class":790},[582,2951,2952,2954,2956,2958,2960,2962,2965,2967,2969,2971,2973,2976,2978,2980],{"class":584,"line":861},[582,2953,943],{"class":783},[582,2955,791],{"class":790},[582,2957,787],{"class":892},[582,2959,896],{"class":790},[582,2961,804],{"class":790},[582,2963,2964],{"class":591},"user",[582,2966,968],{"class":790},[582,2968,1211],{"class":790},[582,2970,2927],{"class":794},[582,2972,1211],{"class":790},[582,2974,2975],{"class":892}," displayName",[582,2977,896],{"class":790},[582,2979,2927],{"class":794},[582,2981,2982],{"class":790}," }\n",[582,2984,2985],{"class":584,"line":917},[582,2986,979],{"class":790},[449,2988,2989,2990,2993,2994,2029,2997,3000,3001,2993,3003,3005],{},"Pass ",[452,2991,2992],{},"errorCatalog"," and ",[452,2995,2996],{},"auditCatalog",[452,2998,2999],{},"setupEvlog()",". Full audit usage: demo ",[452,3002,2002],{},[452,3004,2006],{}," commands.",[572,3007,3009],{"className":773,"code":3008,"language":776,"meta":578,"style":578},"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",[452,3010,3011,3033,3046,3096,3112,3118,3122,3157,3169,3201],{"__ignoreMap":578},[582,3012,3013,3016,3018,3021,3024,3026,3029,3031],{"class":584,"line":585},[582,3014,3015],{"class":794},"log",[582,3017,485],{"class":790},[582,3019,3020],{"class":874},"audit",[582,3022,3023],{"class":794},"(auditCatalog",[582,3025,485],{"class":790},[582,3027,3028],{"class":874},"SECRET_PULL",[582,3030,886],{"class":794},[582,3032,1046],{"class":790},[582,3034,3035,3038,3040,3042,3044],{"class":584,"line":604},[582,3036,3037],{"class":892},"  actor",[582,3039,896],{"class":790},[582,3041,2912],{"class":874},[582,3043,934],{"class":794},[582,3045,1063],{"class":790},[582,3047,3048,3051,3053,3055,3057,3059,3062,3064,3066,3068,3071,3073,3075,3078,3080,3082,3085,3087,3089,3092,3094],{"class":584,"line":833},[582,3049,3050],{"class":892},"  target",[582,3052,896],{"class":790},[582,3054,791],{"class":790},[582,3056,2927],{"class":892},[582,3058,896],{"class":790},[582,3060,3061],{"class":794}," args",[582,3063,485],{"class":790},[582,3065,2210],{"class":794},[582,3067,1211],{"class":790},[582,3069,3070],{"class":892}," resource",[582,3072,896],{"class":790},[582,3074,804],{"class":790},[582,3076,3077],{"class":591},"secrets",[582,3079,968],{"class":790},[582,3081,1211],{"class":790},[582,3083,3084],{"class":892}," access",[582,3086,896],{"class":790},[582,3088,804],{"class":790},[582,3090,3091],{"class":591},"read",[582,3093,968],{"class":790},[582,3095,1439],{"class":790},[582,3097,3098,3101,3103,3105,3108,3110],{"class":584,"line":854},[582,3099,3100],{"class":892},"  outcome",[582,3102,896],{"class":790},[582,3104,804],{"class":790},[582,3106,3107],{"class":591},"success",[582,3109,968],{"class":790},[582,3111,1063],{"class":790},[582,3113,3114,3116],{"class":584,"line":861},[582,3115,1110],{"class":790},[582,3117,973],{"class":794},[582,3119,3120],{"class":584,"line":917},[582,3121,858],{"emptyLinePlaceholder":857},[582,3123,3124,3126,3128,3130,3132,3135,3137,3139,3142,3144,3146,3149,3151,3153,3155],{"class":584,"line":922},[582,3125,3015],{"class":794},[582,3127,485],{"class":790},[582,3129,3020],{"class":794},[582,3131,485],{"class":790},[582,3133,3134],{"class":874},"deny",[582,3136,886],{"class":794},[582,3138,968],{"class":790},[582,3140,3141],{"class":591},"Missing API token",[582,3143,968],{"class":790},[582,3145,1211],{"class":790},[582,3147,3148],{"class":794}," auditCatalog",[582,3150,485],{"class":790},[582,3152,3028],{"class":874},[582,3154,886],{"class":794},[582,3156,1046],{"class":790},[582,3158,3159,3161,3163,3165,3167],{"class":584,"line":940},[582,3160,3037],{"class":892},[582,3162,896],{"class":790},[582,3164,2912],{"class":874},[582,3166,934],{"class":794},[582,3168,1063],{"class":790},[582,3170,3171,3173,3175,3177,3179,3181,3183,3185,3187,3189,3191,3193,3195,3197,3199],{"class":584,"line":976},[582,3172,3050],{"class":892},[582,3174,896],{"class":790},[582,3176,791],{"class":790},[582,3178,2927],{"class":892},[582,3180,896],{"class":790},[582,3182,3061],{"class":794},[582,3184,485],{"class":790},[582,3186,2210],{"class":794},[582,3188,1211],{"class":790},[582,3190,3084],{"class":892},[582,3192,896],{"class":790},[582,3194,804],{"class":790},[582,3196,3091],{"class":591},[582,3198,968],{"class":790},[582,3200,1439],{"class":790},[582,3202,3203,3205],{"class":584,"line":1296},[582,3204,1110],{"class":790},[582,3206,973],{"class":794},[1630,3208,3210],{"id":3209},"outbound-http-ofetch","Outbound HTTP (ofetch)",[572,3212,3214],{"className":773,"code":3213,"language":776,"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,3215,3216,3235,3253,3272,3276,3305],{"__ignoreMap":578},[582,3217,3218,3220,3222,3225,3227,3229,3231,3233],{"class":584,"line":585},[582,3219,784],{"class":783},[582,3221,791],{"class":790},[582,3223,3224],{"class":794}," ofetch",[582,3226,798],{"class":790},[582,3228,801],{"class":783},[582,3230,804],{"class":790},[582,3232,750],{"class":591},[582,3234,810],{"class":790},[582,3236,3237,3239,3241,3243,3245,3247,3249,3251],{"class":584,"line":604},[582,3238,784],{"class":783},[582,3240,791],{"class":790},[582,3242,1370],{"class":794},[582,3244,798],{"class":790},[582,3246,801],{"class":783},[582,3248,804],{"class":790},[582,3250,454],{"class":591},[582,3252,810],{"class":790},[582,3254,3255,3257,3259,3262,3264,3266,3268,3270],{"class":584,"line":833},[582,3256,784],{"class":783},[582,3258,791],{"class":790},[582,3260,3261],{"class":794}," createOutboundHooks",[582,3263,798],{"class":790},[582,3265,801],{"class":783},[582,3267,804],{"class":790},[582,3269,755],{"class":591},[582,3271,810],{"class":790},[582,3273,3274],{"class":584,"line":854},[582,3275,858],{"emptyLinePlaceholder":857},[582,3277,3278,3280,3283,3285,3287,3289,3292,3294,3297,3299,3302],{"class":584,"line":861},[582,3279,865],{"class":864},[582,3281,3282],{"class":794}," api ",[582,3284,871],{"class":790},[582,3286,3224],{"class":794},[582,3288,485],{"class":790},[582,3290,3291],{"class":874},"create",[582,3293,886],{"class":794},[582,3295,3296],{"class":874},"createOutboundHooks",[582,3298,886],{"class":794},[582,3300,3301],{"class":874},"useLogger",[582,3303,3304],{"class":794},"()))\n",[582,3306,3307,3310,3313,3315,3317,3320,3322],{"class":584,"line":917},[582,3308,3309],{"class":783},"await",[582,3311,3312],{"class":874}," api",[582,3314,886],{"class":794},[582,3316,968],{"class":790},[582,3318,3319],{"class":591},"https:\u002F\u002Fapi.example.com\u002Fv1\u002Frecords",[582,3321,968],{"class":790},[582,3323,914],{"class":794},[1630,3325,3327],{"id":3326},"project-layout","Project layout",[572,3329,3332],{"className":3330,"code":3331,"language":1899,"meta":578},[1897],"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,3333,3331],{"__ignoreMap":578},[3335,3336],"hr",{},[564,3338,3340],{"id":3339},"api-reference","API reference",[1630,3342,3344,3346,3347],{"id":3343},"setupevlog-vs-uselogger",[452,3345,2999],{}," vs ",[452,3348,3349],{},"useLogger()",[697,3351,3352,3366],{},[700,3353,3354],{},[703,3355,3356,3358,3362],{},[706,3357],{},[706,3359,3360],{},[452,3361,2999],{},[706,3363,3364],{},[452,3365,3349],{},[716,3367,3368,3382,3392],{},[703,3369,3370,3373,3379],{},[721,3371,3372],{},"When",[721,3374,3375,3376],{},"once in ",[452,3377,3378],{},"src\u002Fevlog.ts",[721,3380,3381],{},"inside every command handler",[703,3383,3384,3386,3389],{},[721,3385,714],{},[721,3387,3388],{},"drain, redact, catalogs",[721,3390,3391],{},"command-scoped logger",[703,3393,3394,3397,3404],{},[721,3395,3396],{},"You call",[721,3398,3399,2003,3401],{},[452,3400,735],{},[452,3402,3403],{},"setup.flush()",[721,3405,3406,2003,3408,2003,3410],{},[452,3407,1628],{},[452,3409,1996],{},[452,3411,3412],{},"throw errorCatalog.X()",[449,3414,3415,3417,3418,3421],{},[452,3416,1960],{}," configures the pipeline once. Each citty command gets its own logger (",[452,3419,3420],{},"path: \u002Fdoctor",", flags, duration) via async context.",[449,3423,3424,3429,3430,2003,3433,2003,3436,2003,3438,2003,3440,2003,3442,3445,3446,3449,3450,2003,3453,3456,3457,485],{},[457,3425,3426],{},[452,3427,3428],{},"setupEvlog(config)"," — ",[452,3431,3432],{},"service",[452,3434,3435],{},"version",[452,3437,2028],{},[452,3439,2992],{},[452,3441,2996],{},[452,3443,3444],{},"redact"," (default ",[452,3447,3448],{},"true","), ",[452,3451,3452],{},"flushOnExit",[452,3454,3455],{},"logToConsole",". Returns ",[452,3458,3459],{},"{ invoke, log, errorCatalog, auditCatalog, audit, flush }",[449,3461,3462,3466,3467,3469,3470,3472,3473,3475,3476,3479],{},[457,3463,3464],{},[452,3465,3349],{}," — inside any ",[452,3468,743],{}," \u002F ",[452,3471,1205],{}," handler. Import from ",[452,3474,454],{},"; no need to pass ",[452,3477,3478],{},"setup"," around.",[449,3481,3482,3429,3486,3488,3489,740,3491,3493,3494,485],{},[457,3483,3484],{},[452,3485,735],{},[452,3487,730],{},". Wraps every ",[452,3490,739],{},[452,3492,743],{},". Auto-injects ",[452,3495,1692],{},[449,3497,3498,3503,3504,3507,3508,3510],{},[457,3499,3500],{},[452,3501,3502],{},"exitWithError(err)"," — human-readable stderr + ",[452,3505,3506],{},"process.exit",". Use after ",[452,3509,3403],{}," on the error path.",[1630,3512,3514],{"id":3513},"wide-event-shape","Wide event shape",[697,3516,3517,3527],{},[700,3518,3519],{},[703,3520,3521,3524],{},[706,3522,3523],{},"Field",[706,3525,3526],{},"CLI value",[716,3528,3529,3541,3553,3563,3573,3582],{},[703,3530,3531,3536],{},[721,3532,3533],{},[452,3534,3535],{},"method",[721,3537,3538],{},[452,3539,3540],{},"'CLI'",[703,3542,3543,3548],{},[721,3544,3545],{},[452,3546,3547],{},"path",[721,3549,3550],{},[452,3551,3552],{},"'\u002F\u003Ccommand>'",[703,3554,3555,3560],{},[721,3556,3557],{},[452,3558,3559],{},"status",[721,3561,3562],{},"exit code",[703,3564,3565,3570],{},[721,3566,3567],{},[452,3568,3569],{},"cli.command",[721,3571,3572],{},"command segment",[703,3574,3575,3579],{},[721,3576,3577],{},[452,3578,1871],{},[721,3580,3581],{},"parsed flags (redacted)",[703,3583,3584,3589],{},[721,3585,3586],{},[452,3587,3588],{},"cli.version",[721,3590,3591,3592],{},"from ",[452,3593,3594],{},"setupEvlog({ version })",[1630,3596,3598,3601],{"id":3597},"createcommandlogger-libraries",[452,3599,3600],{},"createCommandLogger"," (libraries)",[449,3603,3604],{},"For code inside someone else's CLI, without global bootstrap:",[572,3606,3608],{"className":773,"code":3607,"language":776,"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,3609,3610,3629,3633,3678,3702],{"__ignoreMap":578},[582,3611,3612,3614,3616,3619,3621,3623,3625,3627],{"class":584,"line":585},[582,3613,784],{"class":783},[582,3615,791],{"class":790},[582,3617,3618],{"class":794}," createCommandLogger",[582,3620,798],{"class":790},[582,3622,801],{"class":783},[582,3624,804],{"class":790},[582,3626,454],{"class":591},[582,3628,810],{"class":790},[582,3630,3631],{"class":584,"line":604},[582,3632,858],{"emptyLinePlaceholder":857},[582,3634,3635,3637,3640,3642,3644,3646,3648,3651,3653,3655,3658,3660,3662,3665,3667,3669,3672,3674,3676],{"class":584,"line":833},[582,3636,865],{"class":864},[582,3638,3639],{"class":794}," log ",[582,3641,871],{"class":790},[582,3643,3618],{"class":874},[582,3645,886],{"class":794},[582,3647,889],{"class":790},[582,3649,3650],{"class":892}," command",[582,3652,896],{"class":790},[582,3654,804],{"class":790},[582,3656,3657],{"class":591},"migrate",[582,3659,968],{"class":790},[582,3661,1211],{"class":790},[582,3663,3664],{"class":892}," version",[582,3666,896],{"class":790},[582,3668,804],{"class":790},[582,3670,3671],{"class":591},"2.0.0",[582,3673,968],{"class":790},[582,3675,798],{"class":790},[582,3677,914],{"class":794},[582,3679,3680,3682,3684,3686,3688,3690,3693,3695,3698,3700],{"class":584,"line":854},[582,3681,3015],{"class":794},[582,3683,485],{"class":790},[582,3685,1561],{"class":874},[582,3687,886],{"class":794},[582,3689,889],{"class":790},[582,3691,3692],{"class":892}," records",[582,3694,896],{"class":790},[582,3696,3697],{"class":906}," 150",[582,3699,798],{"class":790},[582,3701,914],{"class":794},[582,3703,3704,3706,3708,3711,3713,3715,3718,3720,3723,3725],{"class":584,"line":861},[582,3705,3015],{"class":794},[582,3707,485],{"class":790},[582,3709,3710],{"class":874},"emit",[582,3712,886],{"class":794},[582,3714,889],{"class":790},[582,3716,3717],{"class":892}," status",[582,3719,896],{"class":790},[582,3721,3722],{"class":906}," 0",[582,3724,798],{"class":790},[582,3726,914],{"class":794},[1630,3728,3730],{"id":3729},"long-running-commands","Long-running commands",[572,3732,3734],{"className":773,"code":3733,"language":776,"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,3735,3736,3748,3752,3802,3831,3841],{"__ignoreMap":578},[582,3737,3738,3740,3742,3744,3746],{"class":584,"line":585},[582,3739,3309],{"class":783},[582,3741,1165],{"class":794},[582,3743,485],{"class":790},[582,3745,1236],{"class":874},[582,3747,1467],{"class":794},[582,3749,3750],{"class":584,"line":604},[582,3751,858],{"emptyLinePlaceholder":857},[582,3753,3754,3756,3758,3760,3763,3765,3767,3769,3771,3773,3776,3778,3780,3783,3785,3787,3789,3792,3794,3796,3798,3800],{"class":584,"line":833},[582,3755,3309],{"class":783},[582,3757,1165],{"class":794},[582,3759,485],{"class":790},[582,3761,3762],{"class":874},"invoke",[582,3764,886],{"class":794},[582,3766,889],{"class":790},[582,3768,3650],{"class":892},[582,3770,896],{"class":790},[582,3772,804],{"class":790},[582,3774,3775],{"class":591},"watch",[582,3777,968],{"class":790},[582,3779,1211],{"class":790},[582,3781,3782],{"class":892}," longRunning",[582,3784,896],{"class":790},[582,3786,1090],{"class":1089},[582,3788,1525],{"class":790},[582,3790,3791],{"class":864}," async",[582,3793,1254],{"class":790},[582,3795,3015],{"class":1257},[582,3797,1261],{"class":790},[582,3799,1229],{"class":864},[582,3801,937],{"class":790},[582,3803,3804,3807,3809,3811,3813,3815,3818,3820,3822,3825,3827,3829],{"class":584,"line":854},[582,3805,3806],{"class":794},"  log",[582,3808,485],{"class":790},[582,3810,1561],{"class":874},[582,3812,886],{"class":892},[582,3814,889],{"class":790},[582,3816,3817],{"class":892}," phase",[582,3819,896],{"class":790},[582,3821,804],{"class":790},[582,3823,3824],{"class":591},"boot",[582,3826,968],{"class":790},[582,3828,798],{"class":790},[582,3830,914],{"class":892},[582,3832,3833,3835,3837,3839],{"class":584,"line":861},[582,3834,3806],{"class":794},[582,3836,485],{"class":790},[582,3838,3710],{"class":874},[582,3840,1467],{"class":892},[582,3842,3843,3845],{"class":584,"line":917},[582,3844,1110],{"class":790},[582,3846,914],{"class":794},[3335,3848],{},[564,3850,3852],{"id":3851},"try-it","Try it",[449,3854,3855],{},"From the evlog monorepo root:",[569,3857,3858,3885,3901,3926],{},[572,3859,3862],{"className":574,"code":3860,"filename":3861,"language":577,"meta":578,"style":578},"pnpm example:cli doctor\npnpm example:cli sync 3\n","Run",[452,3863,3864,3873],{"__ignoreMap":578},[582,3865,3866,3868,3871],{"class":584,"line":585},[582,3867,576],{"class":588},[582,3869,3870],{"class":591}," example:cli",[582,3872,1652],{"class":591},[582,3874,3875,3877,3879,3882],{"class":584,"line":604},[582,3876,576],{"class":588},[582,3878,3870],{"class":591},[582,3880,3881],{"class":591}," sync",[582,3883,3884],{"class":906}," 3\n",[572,3886,3889],{"className":574,"code":3887,"filename":3888,"language":577,"meta":578,"style":578},"pnpm example:cli doctor --log\n","Debug",[452,3890,3891],{"__ignoreMap":578},[582,3892,3893,3895,3897,3899],{"class":584,"line":585},[582,3894,576],{"class":588},[582,3896,3870],{"class":591},[582,3898,1703],{"class":591},[582,3900,1706],{"class":591},[572,3902,3905],{"className":574,"code":3903,"filename":3904,"language":577,"meta":578,"style":578},"tail -f examples\u002Fcli\u002F.evlog\u002Flogs\u002F$(date +%Y-%m-%d).jsonl\n","Inspect drain",[452,3906,3907],{"__ignoreMap":578},[582,3908,3909,3911,3913,3916,3918,3920,3922,3924],{"class":584,"line":585},[582,3910,2325],{"class":588},[582,3912,2328],{"class":591},[582,3914,3915],{"class":591}," examples\u002Fcli\u002F.evlog\u002Flogs\u002F",[582,3917,2334],{"class":790},[582,3919,2337],{"class":588},[582,3921,2340],{"class":591},[582,3923,1261],{"class":790},[582,3925,2345],{"class":591},[572,3927,3929],{"className":574,"code":3928,"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,3930,3931,3952],{"__ignoreMap":578},[582,3932,3933,3935,3937,3939,3942,3944,3947,3949],{"class":584,"line":585},[582,3934,925],{"class":864},[582,3936,2357],{"class":794},[582,3938,871],{"class":790},[582,3940,3941],{"class":794},"axiom AXIOM_API_KEY",[582,3943,871],{"class":790},[582,3945,3946],{"class":794},"… AXIOM_DATASET",[582,3948,871],{"class":790},[582,3950,3951],{"class":794},"evlog-demo-cli\n",[582,3953,3954,3956,3958],{"class":584,"line":604},[582,3955,576],{"class":588},[582,3957,3870],{"class":591},[582,3959,1652],{"class":591},[3961,3962,3963],"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":3965},[3966,3967,3970,3971,3972,3973,3978,3986],{"id":566,"depth":604,"text":567},{"id":761,"depth":604,"text":762,"children":3968},[3969],{"id":1632,"depth":833,"text":1633},{"id":1791,"depth":604,"text":1792},{"id":1917,"depth":604,"text":1918},{"id":2017,"depth":604,"text":2018},{"id":2495,"depth":604,"text":2496,"children":3974},[3975,3976,3977],{"id":2499,"depth":833,"text":2500},{"id":3209,"depth":833,"text":3210},{"id":3326,"depth":833,"text":3327},{"id":3339,"depth":604,"text":3340,"children":3979},[3980,3982,3983,3985],{"id":3343,"depth":833,"text":3981},"setupEvlog() vs useLogger()",{"id":3513,"depth":833,"text":3514},{"id":3597,"depth":833,"text":3984},"createCommandLogger (libraries)",{"id":3729,"depth":833,"text":3730},{"id":3851,"depth":604,"text":3852},"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",[3990],{"label":3991,"icon":3992,"to":481,"color":468,"variant":3993},"Example CLI","i-simple-icons-github","subtle",{},{"title":246,"icon":44},{"title":246,"description":3987},"10z0_XIsdtJXvihwTlk2oUYJmKIaOZ-mmQOIgUUIYBM",[3999,4001],{"title":241,"path":242,"stem":243,"description":4000,"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":4002,"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.",1780170067253]