[{"data":1,"prerenderedAt":5608},["ShallowReactive",2],{"navigation_docs":3,"-integrate-frameworks-cli":443,"-integrate-frameworks-cli-surround":5603},[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":5592,"extension":5593,"links":5594,"meta":5599,"navigation":5600,"path":247,"seo":5601,"stem":248,"__hash__":5602},"docs\u002F3.integrate\u002Fframeworks\u002F17.cli.md",{"type":446,"value":447,"toc":5544},"minimark",[448,465,486,526,563,568,571,653,712,762,816,820,945,953,970,974,985,1059,1069,1073,1095,1107,1114,1121,1549,1567,1578,1584,1714,1718,1795,1980,1987,1991,2162,2165,2216,2220,2234,2259,2268,2272,2279,2286,2290,2407,2462,2465,2469,2473,2480,2717,2833,2842,2846,3151,3165,3169,3172,3341,3607,3720,3737,3743,3886,3890,4067,4076,4078,4082,4092,4095,4178,4190,4232,4237,4272,4278,4312,4317,4332,4340,4350,4359,4369,4373,4379,4381,4385,4496,4498,4502,4509,4516,4637,4643,4646,4747,4753,4756,4758,4762,4772,5124,5137,5139,5143,5262,5264,5268,5291,5308,5311,5408,5410,5414,5417,5540],[449,450,451,455,456,460,461,464],"p",{},[452,453,454],"code",{},"@evlog\u002Fcli"," adds ",[457,458,459],"strong",{},"command → exit"," observability on top of evlog. It does ",[457,462,463],{},"not"," replace citty, Clack, or your stdout JSON contract — it owns telemetry (wide events + drain) while you keep your existing CLI stack.",[466,467,469,470,473,474,477,478,485],"callout",{"color":468,"icon":44},"neutral","Runnable demo in the evlog repo: ",[452,471,472],{},"pnpm example:cli doctor"," — wide events land in ",[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},"add-evlog-to-an-existing-citty-cli","Add evlog to an existing citty CLI",[449,569,570],{},"Three changes — everything else stays the same.",[572,573,579],"pre",{"className":574,"code":575,"filename":576,"language":577,"meta":578,"style":578},"language-diff shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","+ import type { DrainContext } from 'evlog'\n+ import { createFsDrain } from 'evlog\u002Ffs'\n+ import { createDrainPipeline } from 'evlog\u002Fpipeline'\n+\n+ const pipeline = createDrainPipeline\u003CDrainContext>({ batch: { size: 20 } })\n+\n+ export function createCliDrain() {\n+   return pipeline(createFsDrain({ dir: '.evlog\u002Flogs' }))\n+ }\n","src\u002Fdrain.ts","diff","",[452,580,581,594,602,610,616,624,629,637,645],{"__ignoreMap":578},[582,583,586,590],"span",{"class":584,"line":585},"line",1,[582,587,589],{"class":588},"sMK4o","+",[582,591,593],{"class":592},"sfazB"," import type { DrainContext } from 'evlog'\n",[582,595,597,599],{"class":584,"line":596},2,[582,598,589],{"class":588},[582,600,601],{"class":592}," import { createFsDrain } from 'evlog\u002Ffs'\n",[582,603,605,607],{"class":584,"line":604},3,[582,606,589],{"class":588},[582,608,609],{"class":592}," import { createDrainPipeline } from 'evlog\u002Fpipeline'\n",[582,611,613],{"class":584,"line":612},4,[582,614,615],{"class":588},"+\n",[582,617,619,621],{"class":584,"line":618},5,[582,620,589],{"class":588},[582,622,623],{"class":592}," const pipeline = createDrainPipeline\u003CDrainContext>({ batch: { size: 20 } })\n",[582,625,627],{"class":584,"line":626},6,[582,628,615],{"class":588},[582,630,632,634],{"class":584,"line":631},7,[582,633,589],{"class":588},[582,635,636],{"class":592}," export function createCliDrain() {\n",[582,638,640,642],{"class":584,"line":639},8,[582,641,589],{"class":588},[582,643,644],{"class":592},"   return pipeline(createFsDrain({ dir: '.evlog\u002Flogs' }))\n",[582,646,648,650],{"class":584,"line":647},9,[582,649,589],{"class":588},[582,651,652],{"class":592}," }\n",[572,654,657],{"className":574,"code":655,"filename":656,"language":577,"meta":578,"style":578},"+ import { setupEvlog } from '@evlog\u002Fcli'\n+ import { createCliDrain } from '.\u002Fdrain'\n+\n+ export const setup = setupEvlog({\n+   service: 'my-cli',\n+   version: '1.0.0',\n+   drain: createCliDrain(),\n+ })\n","src\u002Fevlog.ts",[452,658,659,666,673,677,684,691,698,705],{"__ignoreMap":578},[582,660,661,663],{"class":584,"line":585},[582,662,589],{"class":588},[582,664,665],{"class":592}," import { setupEvlog } from '@evlog\u002Fcli'\n",[582,667,668,670],{"class":584,"line":596},[582,669,589],{"class":588},[582,671,672],{"class":592}," import { createCliDrain } from '.\u002Fdrain'\n",[582,674,675],{"class":584,"line":604},[582,676,615],{"class":588},[582,678,679,681],{"class":584,"line":612},[582,680,589],{"class":588},[582,682,683],{"class":592}," export const setup = setupEvlog({\n",[582,685,686,688],{"class":584,"line":618},[582,687,589],{"class":588},[582,689,690],{"class":592},"   service: 'my-cli',\n",[582,692,693,695],{"class":584,"line":626},[582,694,589],{"class":588},[582,696,697],{"class":592},"   version: '1.0.0',\n",[582,699,700,702],{"class":584,"line":631},[582,701,589],{"class":588},[582,703,704],{"class":592},"   drain: createCliDrain(),\n",[582,706,707,709],{"class":584,"line":639},[582,708,589],{"class":588},[582,710,711],{"class":592}," })\n",[572,713,716],{"className":574,"code":714,"filename":715,"language":577,"meta":578,"style":578},"+ import { runMain } from '@evlog\u002Fcli\u002Fcitty'\n+ import { setup } from '.\u002Fevlog'\n- runMain(main)\n+ runMain(main, setup)\n+   .then(() => setup.flush())\n+   .catch(err => exitWithError(err))\n","src\u002Findex.ts",[452,717,718,725,732,741,748,755],{"__ignoreMap":578},[582,719,720,722],{"class":584,"line":585},[582,721,589],{"class":588},[582,723,724],{"class":592}," import { runMain } from '@evlog\u002Fcli\u002Fcitty'\n",[582,726,727,729],{"class":584,"line":596},[582,728,589],{"class":588},[582,730,731],{"class":592}," import { setup } from '.\u002Fevlog'\n",[582,733,734,737],{"class":584,"line":604},[582,735,736],{"class":588},"-",[582,738,740],{"class":739},"swJcz"," runMain(main)\n",[582,742,743,745],{"class":584,"line":612},[582,744,589],{"class":588},[582,746,747],{"class":592}," runMain(main, setup)\n",[582,749,750,752],{"class":584,"line":618},[582,751,589],{"class":588},[582,753,754],{"class":592},"   .then(() => setup.flush())\n",[582,756,757,759],{"class":584,"line":626},[582,758,589],{"class":588},[582,760,761],{"class":592},"   .catch(err => exitWithError(err))\n",[572,763,766],{"className":574,"code":764,"filename":765,"language":577,"meta":578,"style":578},"+ import { useLogger } from '@evlog\u002Fcli'\n\n  async run() {\n+   const log = useLogger()\n+   log.set({ checks: results })\n    p.intro('my-cli doctor')   \u002F\u002F Clack unchanged\n    \u002F\u002F …\n  }\n","src\u002Fcommands\u002Fdoctor.ts",[452,767,768,775,781,787,794,801,806,811],{"__ignoreMap":578},[582,769,770,772],{"class":584,"line":585},[582,771,589],{"class":588},[582,773,774],{"class":592}," import { useLogger } from '@evlog\u002Fcli'\n",[582,776,777],{"class":584,"line":596},[582,778,780],{"emptyLinePlaceholder":779},true,"\n",[582,782,783],{"class":584,"line":604},[582,784,786],{"class":785},"sTEyZ","  async run() {\n",[582,788,789,791],{"class":584,"line":612},[582,790,589],{"class":588},[582,792,793],{"class":592},"   const log = useLogger()\n",[582,795,796,798],{"class":584,"line":618},[582,797,589],{"class":588},[582,799,800],{"class":592},"   log.set({ checks: results })\n",[582,802,803],{"class":584,"line":626},[582,804,805],{"class":785},"    p.intro('my-cli doctor')   \u002F\u002F Clack unchanged\n",[582,807,808],{"class":584,"line":631},[582,809,810],{"class":785},"    \u002F\u002F …\n",[582,812,813],{"class":584,"line":639},[582,814,815],{"class":785},"  }\n",[564,817,819],{"id":818},"what-evlog-does-does-not-do","What evlog does \u002F does not do",[821,822,823,838],"table",{},[824,825,826],"thead",{},[827,828,829,832,835],"tr",{},[830,831],"th",{},[830,833,834],{},"evlog",[830,836,837],{},"Your app",[839,840,841,856,866,879,889,901,913,930],"tbody",{},[827,842,843,851,853],{},[844,845,846,847,850],"td",{},"Routing (",[452,848,849],{},"--help",", subcommands)",[844,852],{},[844,854,855],{},"citty",[827,857,858,861,863],{},[844,859,860],{},"Terminal UI (spinners, colors)",[844,862],{},[844,864,865],{},"Clack, consola, …",[827,867,868,874,876],{},[844,869,870,873],{},[452,871,872],{},"--json"," stdout shape",[844,875],{},[844,877,878],{},"your flag, your format",[827,880,881,884,887],{},[844,882,883],{},"Wide events + drain",[844,885,886],{},"yes",[844,888],{},[827,890,891,897,899],{},[844,892,893,896],{},[452,894,895],{},"--log"," debug on stderr",[844,898,886],{},[844,900],{},[827,902,903,909,911],{},[844,904,905,906],{},"Redact secrets in ",[452,907,908],{},"cli.flags",[844,910,886],{},[844,912],{},[827,914,915,926,928],{},[844,916,917,918,921,922,925],{},"Error catalog (",[452,919,920],{},"errorCatalog",", ",[452,923,924],{},"throw errorCatalog.X()",")",[844,927,886],{},[844,929],{},[827,931,932,941,943],{},[844,933,934,935,921,938,925],{},"Audit catalog (",[452,936,937],{},"auditCatalog",[452,939,940],{},"log.audit()",[844,942,886],{},[844,944],{},[572,946,951],{"className":947,"code":949,"language":950,"meta":578},[948],"language-text","citty runMain\n    │\n    ▼\nevlog.invoke()  ──────────────────────────►  drain (.evlog\u002Flogs, Axiom, …)\n    │\n    ▼\ncommand handler  ──►  useLogger().set() \u002F log.audit()\n    │\n    ▼\nClack \u002F console \u002F your --json  ──►  stdout\u002Fstderr (unchanged)\n","text",[452,952,949],{"__ignoreMap":578},[449,954,955,958,959,962,963,965,966,969],{},[457,956,957],{},"Default:"," evlog console is ",[457,960,961],{},"silent"," — wide events go to the drain only. Pass ",[452,964,895],{}," (auto-injected by ",[452,967,968],{},"runMain",") to echo wide events on stderr while debugging.",[564,971,973],{"id":972},"why-evlog-on-a-cli","Why evlog on a CLI",[449,975,976,977,980,981,984],{},"You do not need audit catalogs on day one. evlog gives you ",[457,978,979],{},"one structured wide event per command"," — duration, exit status, flags (redacted), and whatever you ",[452,982,983],{},"log.set()"," — drained automatically to a file or your observability provider.",[821,986,987,1000],{},[824,988,989],{},[827,990,991,994,997],{},[830,992,993],{},"Level",[830,995,996],{},"What you add",[830,998,999],{},"Demo command",[839,1001,1002,1023,1038],{},[827,1003,1004,1009,1018],{},[844,1005,1006],{},[457,1007,1008],{},"Simple",[844,1010,1011,1014,1015],{},[452,1012,1013],{},"setupEvlog"," + ",[452,1016,1017],{},"useLogger().set()",[844,1019,1020],{},[452,1021,1022],{},"doctor",[827,1024,1025,1030,1033],{},[844,1026,1027],{},[457,1028,1029],{},"Medium",[844,1031,1032],{},"Outbound HTTP hooks, error catalog",[844,1034,1035],{},[452,1036,1037],{},"sync",[827,1039,1040,1045,1051],{},[844,1041,1042],{},[457,1043,1044],{},"Advanced",[844,1046,1047,1048,1050],{},"Audit catalog, ",[452,1049,940],{},", deny",[844,1052,1053,921,1056],{},[452,1054,1055],{},"pull",[452,1057,1058],{},"deploy",[449,1060,1061,1062,1064,1065,1068],{},"Catalogs are optional. Start with a drain + ",[452,1063,983],{}," — that alone replaces ad-hoc ",[452,1066,1067],{},"console.log"," debugging with queryable NDJSON.",[564,1070,1072],{"id":1071},"send-events-to-axiom-or-another-provider","Send events to Axiom (or another provider)",[466,1074,1076,1079,1080,1083,1084,1087,1088,1091,1092,485],{"color":1075,"icon":88},"warning",[457,1077,1078],{},"evlog does not auto-send to Axiom, Datadog, or OTLP."," Wide events only leave your process when you pass a ",[457,1081,1082],{},"drain"," to ",[452,1085,1086],{},"setupEvlog({ drain })",". Without it, telemetry is dropped. The default in most setups is ",[452,1089,1090],{},"createFsDrain()"," — local NDJSON under ",[452,1093,1094],{},".evlog\u002Flogs\u002F",[449,1096,1097,1098,1101,1102,1104,1105,485],{},"On HTTP apps, the framework wires the drain for you (Nuxt hook, Express middleware, …). On a CLI, ",[457,1099,1100],{},"you"," choose the adapter in one file — usually ",[452,1103,576],{}," — and pass it to ",[452,1106,1013],{},[1108,1109,1111,1112],"h3",{"id":1110},"_1-add-srcdraints","1. Add ",[452,1113,576],{},[449,1115,1116,1117,1120],{},"Pick a backend at ",[457,1118,1119],{},"runtime"," from environment variables. Never hard-code API keys in source or the published bundle.",[572,1122,1126],{"className":1123,"code":1124,"filename":576,"language":1125,"meta":578,"style":578},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import type { DrainContext } from 'evlog'\nimport { createAxiomDrain } from 'evlog\u002Faxiom'\nimport { createDatadogDrain } from 'evlog\u002Fdatadog'\nimport { createFsDrain } from 'evlog\u002Ffs'\nimport { createOtlpDrain } from 'evlog\u002Fotlp'\nimport { createDrainPipeline } from 'evlog\u002Fpipeline'\n\nconst pipeline = createDrainPipeline\u003CDrainContext>({ batch: { size: 20 } })\n\nexport function createCliDrain() {\n  switch (process.env.EVLOG_DRAIN ?? 'fs') {\n    case 'axiom':\n      \u002F\u002F Reads AXIOM_API_KEY \u002F AXIOM_DATASET (or AXIOM_TOKEN) from the environment\n      return pipeline(createAxiomDrain())\n    case 'datadog':\n      return pipeline(createDatadogDrain())\n    case 'otlp':\n      return pipeline(createOtlpDrain())\n    default:\n      return pipeline(createFsDrain({\n        dir: process.env.EVLOG_LOG_DIR ?? '.evlog\u002Flogs',\n      }))\n  }\n}\n","typescript",[452,1127,1128,1157,1177,1197,1217,1237,1257,1261,1316,1320,1338,1377,1393,1400,1417,1431,1445,1459,1473,1481,1497,1529,1538,1543],{"__ignoreMap":578},[582,1129,1130,1134,1137,1140,1143,1146,1149,1152,1154],{"class":584,"line":585},[582,1131,1133],{"class":1132},"s7zQu","import",[582,1135,1136],{"class":1132}," type",[582,1138,1139],{"class":588}," {",[582,1141,1142],{"class":785}," DrainContext",[582,1144,1145],{"class":588}," }",[582,1147,1148],{"class":1132}," from",[582,1150,1151],{"class":588}," '",[582,1153,834],{"class":592},[582,1155,1156],{"class":588},"'\n",[582,1158,1159,1161,1163,1166,1168,1170,1172,1175],{"class":584,"line":596},[582,1160,1133],{"class":1132},[582,1162,1139],{"class":588},[582,1164,1165],{"class":785}," createAxiomDrain",[582,1167,1145],{"class":588},[582,1169,1148],{"class":1132},[582,1171,1151],{"class":588},[582,1173,1174],{"class":592},"evlog\u002Faxiom",[582,1176,1156],{"class":588},[582,1178,1179,1181,1183,1186,1188,1190,1192,1195],{"class":584,"line":604},[582,1180,1133],{"class":1132},[582,1182,1139],{"class":588},[582,1184,1185],{"class":785}," createDatadogDrain",[582,1187,1145],{"class":588},[582,1189,1148],{"class":1132},[582,1191,1151],{"class":588},[582,1193,1194],{"class":592},"evlog\u002Fdatadog",[582,1196,1156],{"class":588},[582,1198,1199,1201,1203,1206,1208,1210,1212,1215],{"class":584,"line":612},[582,1200,1133],{"class":1132},[582,1202,1139],{"class":588},[582,1204,1205],{"class":785}," createFsDrain",[582,1207,1145],{"class":588},[582,1209,1148],{"class":1132},[582,1211,1151],{"class":588},[582,1213,1214],{"class":592},"evlog\u002Ffs",[582,1216,1156],{"class":588},[582,1218,1219,1221,1223,1226,1228,1230,1232,1235],{"class":584,"line":618},[582,1220,1133],{"class":1132},[582,1222,1139],{"class":588},[582,1224,1225],{"class":785}," createOtlpDrain",[582,1227,1145],{"class":588},[582,1229,1148],{"class":1132},[582,1231,1151],{"class":588},[582,1233,1234],{"class":592},"evlog\u002Fotlp",[582,1236,1156],{"class":588},[582,1238,1239,1241,1243,1246,1248,1250,1252,1255],{"class":584,"line":626},[582,1240,1133],{"class":1132},[582,1242,1139],{"class":588},[582,1244,1245],{"class":785}," createDrainPipeline",[582,1247,1145],{"class":588},[582,1249,1148],{"class":1132},[582,1251,1151],{"class":588},[582,1253,1254],{"class":592},"evlog\u002Fpipeline",[582,1256,1156],{"class":588},[582,1258,1259],{"class":584,"line":631},[582,1260,780],{"emptyLinePlaceholder":779},[582,1262,1263,1267,1270,1273,1276,1279,1283,1286,1289,1292,1295,1298,1300,1303,1305,1309,1311,1313],{"class":584,"line":639},[582,1264,1266],{"class":1265},"spNyl","const",[582,1268,1269],{"class":785}," pipeline ",[582,1271,1272],{"class":588},"=",[582,1274,1245],{"class":1275},"s2Zo4",[582,1277,1278],{"class":588},"\u003C",[582,1280,1282],{"class":1281},"sBMFI","DrainContext",[582,1284,1285],{"class":588},">",[582,1287,1288],{"class":785},"(",[582,1290,1291],{"class":588},"{",[582,1293,1294],{"class":739}," batch",[582,1296,1297],{"class":588},":",[582,1299,1139],{"class":588},[582,1301,1302],{"class":739}," size",[582,1304,1297],{"class":588},[582,1306,1308],{"class":1307},"sbssI"," 20",[582,1310,1145],{"class":588},[582,1312,1145],{"class":588},[582,1314,1315],{"class":785},")\n",[582,1317,1318],{"class":584,"line":647},[582,1319,780],{"emptyLinePlaceholder":779},[582,1321,1323,1326,1329,1332,1335],{"class":584,"line":1322},10,[582,1324,1325],{"class":1132},"export",[582,1327,1328],{"class":1265}," function",[582,1330,1331],{"class":1275}," createCliDrain",[582,1333,1334],{"class":588},"()",[582,1336,1337],{"class":588}," {\n",[582,1339,1341,1344,1347,1350,1352,1355,1357,1360,1363,1365,1368,1371,1374],{"class":584,"line":1340},11,[582,1342,1343],{"class":1132},"  switch",[582,1345,1346],{"class":739}," (",[582,1348,1349],{"class":785},"process",[582,1351,485],{"class":588},[582,1353,1354],{"class":785},"env",[582,1356,485],{"class":588},[582,1358,1359],{"class":785},"EVLOG_DRAIN",[582,1361,1362],{"class":588}," ??",[582,1364,1151],{"class":588},[582,1366,1367],{"class":592},"fs",[582,1369,1370],{"class":588},"'",[582,1372,1373],{"class":739},") ",[582,1375,1376],{"class":588},"{\n",[582,1378,1380,1383,1385,1388,1390],{"class":584,"line":1379},12,[582,1381,1382],{"class":1132},"    case",[582,1384,1151],{"class":588},[582,1386,1387],{"class":592},"axiom",[582,1389,1370],{"class":588},[582,1391,1392],{"class":588},":\n",[582,1394,1396],{"class":584,"line":1395},13,[582,1397,1399],{"class":1398},"sHwdD","      \u002F\u002F Reads AXIOM_API_KEY \u002F AXIOM_DATASET (or AXIOM_TOKEN) from the environment\n",[582,1401,1403,1406,1409,1411,1414],{"class":584,"line":1402},14,[582,1404,1405],{"class":1132},"      return",[582,1407,1408],{"class":1275}," pipeline",[582,1410,1288],{"class":739},[582,1412,1413],{"class":1275},"createAxiomDrain",[582,1415,1416],{"class":739},"())\n",[582,1418,1420,1422,1424,1427,1429],{"class":584,"line":1419},15,[582,1421,1382],{"class":1132},[582,1423,1151],{"class":588},[582,1425,1426],{"class":592},"datadog",[582,1428,1370],{"class":588},[582,1430,1392],{"class":588},[582,1432,1434,1436,1438,1440,1443],{"class":584,"line":1433},16,[582,1435,1405],{"class":1132},[582,1437,1408],{"class":1275},[582,1439,1288],{"class":739},[582,1441,1442],{"class":1275},"createDatadogDrain",[582,1444,1416],{"class":739},[582,1446,1448,1450,1452,1455,1457],{"class":584,"line":1447},17,[582,1449,1382],{"class":1132},[582,1451,1151],{"class":588},[582,1453,1454],{"class":592},"otlp",[582,1456,1370],{"class":588},[582,1458,1392],{"class":588},[582,1460,1462,1464,1466,1468,1471],{"class":584,"line":1461},18,[582,1463,1405],{"class":1132},[582,1465,1408],{"class":1275},[582,1467,1288],{"class":739},[582,1469,1470],{"class":1275},"createOtlpDrain",[582,1472,1416],{"class":739},[582,1474,1476,1479],{"class":584,"line":1475},19,[582,1477,1478],{"class":1132},"    default",[582,1480,1392],{"class":588},[582,1482,1484,1486,1488,1490,1493,1495],{"class":584,"line":1483},20,[582,1485,1405],{"class":1132},[582,1487,1408],{"class":1275},[582,1489,1288],{"class":739},[582,1491,1492],{"class":1275},"createFsDrain",[582,1494,1288],{"class":739},[582,1496,1376],{"class":588},[582,1498,1500,1503,1505,1508,1510,1512,1514,1517,1519,1521,1524,1526],{"class":584,"line":1499},21,[582,1501,1502],{"class":739},"        dir",[582,1504,1297],{"class":588},[582,1506,1507],{"class":785}," process",[582,1509,485],{"class":588},[582,1511,1354],{"class":785},[582,1513,485],{"class":588},[582,1515,1516],{"class":785},"EVLOG_LOG_DIR",[582,1518,1362],{"class":588},[582,1520,1151],{"class":588},[582,1522,1523],{"class":592},".evlog\u002Flogs",[582,1525,1370],{"class":588},[582,1527,1528],{"class":588},",\n",[582,1530,1532,1535],{"class":584,"line":1531},22,[582,1533,1534],{"class":588},"      }",[582,1536,1537],{"class":739},"))\n",[582,1539,1541],{"class":584,"line":1540},23,[582,1542,815],{"class":588},[582,1544,1546],{"class":584,"line":1545},24,[582,1547,1548],{"class":588},"}\n",[449,1550,1551,1553,1554,1557,1558,1560,1561,1560,1563,1560,1565,485],{},[452,1552,1359],{}," is a ",[457,1555,1556],{},"convention for your CLI"," — evlog does not define it. Name it whatever you want; the demo uses ",[452,1559,1367],{}," | ",[452,1562,1387],{},[452,1564,1426],{},[452,1566,1454],{},[449,1568,1569,1570,1573,1574,1577],{},"Each adapter reads its own env vars when you call ",[452,1571,1572],{},"createXxxDrain()"," with no arguments. See the ",[479,1575,1576],{"href":95},"adapters overview"," for full lists.",[1108,1579,1581,1582],{"id":1580},"_2-wire-the-drain-in-srcevlogts","2. Wire the drain in ",[452,1583,656],{},[572,1585,1587],{"className":1123,"code":1586,"filename":656,"language":1125,"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,1588,1589,1608,1627,1631,1649,1665,1681,1694,1707],{"__ignoreMap":578},[582,1590,1591,1593,1595,1598,1600,1602,1604,1606],{"class":584,"line":585},[582,1592,1133],{"class":1132},[582,1594,1139],{"class":588},[582,1596,1597],{"class":785}," setupEvlog",[582,1599,1145],{"class":588},[582,1601,1148],{"class":1132},[582,1603,1151],{"class":588},[582,1605,454],{"class":592},[582,1607,1156],{"class":588},[582,1609,1610,1612,1614,1616,1618,1620,1622,1625],{"class":584,"line":596},[582,1611,1133],{"class":1132},[582,1613,1139],{"class":588},[582,1615,1331],{"class":785},[582,1617,1145],{"class":588},[582,1619,1148],{"class":1132},[582,1621,1151],{"class":588},[582,1623,1624],{"class":592},".\u002Fdrain",[582,1626,1156],{"class":588},[582,1628,1629],{"class":584,"line":604},[582,1630,780],{"emptyLinePlaceholder":779},[582,1632,1633,1635,1638,1641,1643,1645,1647],{"class":584,"line":612},[582,1634,1325],{"class":1132},[582,1636,1637],{"class":1265}," const",[582,1639,1640],{"class":785}," setup ",[582,1642,1272],{"class":588},[582,1644,1597],{"class":1275},[582,1646,1288],{"class":785},[582,1648,1376],{"class":588},[582,1650,1651,1654,1656,1658,1661,1663],{"class":584,"line":618},[582,1652,1653],{"class":739},"  service",[582,1655,1297],{"class":588},[582,1657,1151],{"class":588},[582,1659,1660],{"class":592},"my-cli",[582,1662,1370],{"class":588},[582,1664,1528],{"class":588},[582,1666,1667,1670,1672,1674,1677,1679],{"class":584,"line":626},[582,1668,1669],{"class":739},"  version",[582,1671,1297],{"class":588},[582,1673,1151],{"class":588},[582,1675,1676],{"class":592},"1.0.0",[582,1678,1370],{"class":588},[582,1680,1528],{"class":588},[582,1682,1683,1686,1688,1692],{"class":584,"line":631},[582,1684,1685],{"class":739},"  redact",[582,1687,1297],{"class":588},[582,1689,1691],{"class":1690},"sfNiH"," true",[582,1693,1528],{"class":588},[582,1695,1696,1699,1701,1703,1705],{"class":584,"line":639},[582,1697,1698],{"class":739},"  drain",[582,1700,1297],{"class":588},[582,1702,1331],{"class":1275},[582,1704,1334],{"class":785},[582,1706,1528],{"class":588},[582,1708,1709,1712],{"class":584,"line":647},[582,1710,1711],{"class":588},"}",[582,1713,1315],{"class":785},[1108,1715,1717],{"id":1716},"_3-configure-credentials-where-the-cli-runs","3. Configure credentials where the CLI runs",[821,1719,1720,1733],{},[824,1721,1722],{},[827,1723,1724,1727,1730],{},[830,1725,1726],{},"Where",[830,1728,1729],{},"What to set",[830,1731,1732],{},"Result",[839,1734,1735,1751,1767,1780],{},[827,1736,1737,1742,1745],{},[844,1738,1739],{},[457,1740,1741],{},"Local dev",[844,1743,1744],{},"nothing (default)",[844,1746,1747,1750],{},[452,1748,1749],{},".evlog\u002Flogs\u002FYYYY-MM-DD.jsonl"," on disk",[827,1752,1753,1758,1764],{},[844,1754,1755],{},[457,1756,1757],{},"Local dev + cloud",[844,1759,1760,1763],{},[452,1761,1762],{},"EVLOG_DRAIN=axiom"," + Axiom env",[844,1765,1766],{},"events in your Axiom dataset",[827,1768,1769,1774,1777],{},[844,1770,1771],{},[457,1772,1773],{},"CI \u002F cron \u002F server",[844,1775,1776],{},"same env on the host",[844,1778,1779],{},"operator chooses destination per environment",[827,1781,1782,1787,1792],{},[844,1783,1784],{},[457,1785,1786],{},"Published npm binary",[844,1788,1789,1790],{},"env on the machine that runs ",[452,1791,1660],{},[844,1793,1794],{},"no token in the package",[572,1796,1800],{"className":1797,"code":1798,"language":1799,"meta":578,"style":578},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Local — inspect NDJSON\nmy-cli doctor\ntail -f .evlog\u002Flogs\u002F$(date +%Y-%m-%d).jsonl\n\n# Send to Axiom instead (credentials on the host, not in your repo)\nexport EVLOG_DRAIN=axiom\nexport AXIOM_API_KEY=xaat-…          # or AXIOM_TOKEN (deprecated alias)\nexport AXIOM_DATASET=my-cli\nmy-cli doctor\n\n# Datadog\nexport EVLOG_DRAIN=datadog\nexport DATADOG_API_KEY=…\nexport DATADOG_SITE=datadoghq.com\n\n# Any OTLP collector (Grafana Cloud, Honeycomb, …)\nexport EVLOG_DRAIN=otlp\nexport OTEL_EXPORTER_OTLP_ENDPOINT=https:\u002F\u002F…\nexport OTEL_SERVICE_NAME=my-cli\n","bash",[452,1801,1802,1807,1814,1839,1843,1848,1860,1875,1887,1893,1897,1902,1913,1925,1937,1941,1946,1957,1969],{"__ignoreMap":578},[582,1803,1804],{"class":584,"line":585},[582,1805,1806],{"class":1398},"# Local — inspect NDJSON\n",[582,1808,1809,1811],{"class":584,"line":596},[582,1810,1660],{"class":1281},[582,1812,1813],{"class":592}," doctor\n",[582,1815,1816,1819,1822,1825,1828,1831,1834,1836],{"class":584,"line":604},[582,1817,1818],{"class":1281},"tail",[582,1820,1821],{"class":592}," -f",[582,1823,1824],{"class":592}," .evlog\u002Flogs\u002F",[582,1826,1827],{"class":588},"$(",[582,1829,1830],{"class":1281},"date",[582,1832,1833],{"class":592}," +%Y-%m-%d",[582,1835,925],{"class":588},[582,1837,1838],{"class":592},".jsonl\n",[582,1840,1841],{"class":584,"line":612},[582,1842,780],{"emptyLinePlaceholder":779},[582,1844,1845],{"class":584,"line":618},[582,1846,1847],{"class":1398},"# Send to Axiom instead (credentials on the host, not in your repo)\n",[582,1849,1850,1852,1855,1857],{"class":584,"line":626},[582,1851,1325],{"class":1265},[582,1853,1854],{"class":785}," EVLOG_DRAIN",[582,1856,1272],{"class":588},[582,1858,1859],{"class":785},"axiom\n",[582,1861,1862,1864,1867,1869,1872],{"class":584,"line":631},[582,1863,1325],{"class":1265},[582,1865,1866],{"class":785}," AXIOM_API_KEY",[582,1868,1272],{"class":588},[582,1870,1871],{"class":785},"xaat-…          ",[582,1873,1874],{"class":1398},"# or AXIOM_TOKEN (deprecated alias)\n",[582,1876,1877,1879,1882,1884],{"class":584,"line":639},[582,1878,1325],{"class":1265},[582,1880,1881],{"class":785}," AXIOM_DATASET",[582,1883,1272],{"class":588},[582,1885,1886],{"class":785},"my-cli\n",[582,1888,1889,1891],{"class":584,"line":647},[582,1890,1660],{"class":1281},[582,1892,1813],{"class":592},[582,1894,1895],{"class":584,"line":1322},[582,1896,780],{"emptyLinePlaceholder":779},[582,1898,1899],{"class":584,"line":1340},[582,1900,1901],{"class":1398},"# Datadog\n",[582,1903,1904,1906,1908,1910],{"class":584,"line":1379},[582,1905,1325],{"class":1265},[582,1907,1854],{"class":785},[582,1909,1272],{"class":588},[582,1911,1912],{"class":785},"datadog\n",[582,1914,1915,1917,1920,1922],{"class":584,"line":1395},[582,1916,1325],{"class":1265},[582,1918,1919],{"class":785}," DATADOG_API_KEY",[582,1921,1272],{"class":588},[582,1923,1924],{"class":785},"…\n",[582,1926,1927,1929,1932,1934],{"class":584,"line":1402},[582,1928,1325],{"class":1265},[582,1930,1931],{"class":785}," DATADOG_SITE",[582,1933,1272],{"class":588},[582,1935,1936],{"class":785},"datadoghq.com\n",[582,1938,1939],{"class":584,"line":1419},[582,1940,780],{"emptyLinePlaceholder":779},[582,1942,1943],{"class":584,"line":1433},[582,1944,1945],{"class":1398},"# Any OTLP collector (Grafana Cloud, Honeycomb, …)\n",[582,1947,1948,1950,1952,1954],{"class":584,"line":1447},[582,1949,1325],{"class":1265},[582,1951,1854],{"class":785},[582,1953,1272],{"class":588},[582,1955,1956],{"class":785},"otlp\n",[582,1958,1959,1961,1964,1966],{"class":584,"line":1461},[582,1960,1325],{"class":1265},[582,1962,1963],{"class":785}," OTEL_EXPORTER_OTLP_ENDPOINT",[582,1965,1272],{"class":588},[582,1967,1968],{"class":785},"https:\u002F\u002F…\n",[582,1970,1971,1973,1976,1978],{"class":584,"line":1475},[582,1972,1325],{"class":1265},[582,1974,1975],{"class":785}," OTEL_SERVICE_NAME",[582,1977,1272],{"class":588},[582,1979,1886],{"class":785},[449,1981,1982,1983,1986],{},"Ship a ",[452,1984,1985],{},".env.example"," with commented placeholders — document what operators must set, not real secrets.",[1108,1988,1990],{"id":1989},"provider-env-vars-quick-reference","Provider env vars (quick reference)",[821,1992,1993,2009],{},[824,1994,1995],{},[827,1996,1997,2000,2003,2006],{},[830,1998,1999],{},"Adapter",[830,2001,2002],{},"Import",[830,2004,2005],{},"Required env (typical)",[830,2007,2008],{},"Docs",[839,2010,2011,2029,2049,2069,2086,2105,2124,2143],{},[827,2012,2013,2016,2020,2025],{},[844,2014,2015],{},"File system",[844,2017,2018],{},[452,2019,1214],{},[844,2021,2022,2024],{},[452,2023,1516],{}," (optional)",[844,2026,2027],{},[479,2028,1367],{"href":144},[827,2030,2031,2033,2037,2045],{},[844,2032,103],{},[844,2034,2035],{},[452,2036,1174],{},[844,2038,2039,921,2042],{},[452,2040,2041],{},"AXIOM_API_KEY",[452,2043,2044],{},"AXIOM_DATASET",[844,2046,2047],{},[479,2048,1387],{"href":104},[827,2050,2051,2053,2057,2065],{},[844,2052,128],{},[844,2054,2055],{},[452,2056,1194],{},[844,2058,2059,921,2062],{},[452,2060,2061],{},"DATADOG_API_KEY",[452,2063,2064],{},"DATADOG_SITE",[844,2066,2067],{},[479,2068,1426],{"href":129},[827,2070,2071,2073,2077,2082],{},[844,2072,108],{},[844,2074,2075],{},[452,2076,1234],{},[844,2078,2079],{},[452,2080,2081],{},"OTEL_EXPORTER_OTLP_ENDPOINT",[844,2083,2084],{},[479,2085,1454],{"href":109},[827,2087,2088,2090,2095,2100],{},[844,2089,123],{},[844,2091,2092],{},[452,2093,2094],{},"evlog\u002Fbetter-stack",[844,2096,2097],{},[452,2098,2099],{},"BETTER_STACK_SOURCE_TOKEN",[844,2101,2102],{},[479,2103,2104],{"href":124},"better-stack",[827,2106,2107,2109,2114,2119],{},[844,2108,133],{},[844,2110,2111],{},[452,2112,2113],{},"evlog\u002Fhyperdx",[844,2115,2116],{},[452,2117,2118],{},"HYPERDX_API_KEY",[844,2120,2121],{},[479,2122,2123],{"href":134},"hyperdx",[827,2125,2126,2128,2133,2138],{},[844,2127,113],{},[844,2129,2130],{},[452,2131,2132],{},"evlog\u002Fposthog",[844,2134,2135],{},[452,2136,2137],{},"POSTHOG_API_KEY",[844,2139,2140],{},[479,2141,2142],{"href":114},"posthog",[827,2144,2145,2147,2152,2157],{},[844,2146,118],{},[844,2148,2149],{},[452,2150,2151],{},"evlog\u002Fsentry",[844,2153,2154],{},[452,2155,2156],{},"SENTRY_DSN",[844,2158,2159],{},[479,2160,2161],{"href":119},"sentry",[449,2163,2164],{},"Adapters also accept config objects if you prefer explicit wiring in code (fine for internal tools, not for published CLIs):",[572,2166,2168],{"className":1123,"code":2167,"language":1125,"meta":578,"style":578},"pipeline(createAxiomDrain({ apiKey: process.env.AXIOM_API_KEY!, dataset: 'my-cli' }))\n",[452,2169,2170],{"__ignoreMap":578},[582,2171,2172,2175,2177,2179,2181,2183,2186,2188,2190,2192,2194,2196,2198,2201,2204,2206,2208,2210,2212,2214],{"class":584,"line":585},[582,2173,2174],{"class":1275},"pipeline",[582,2176,1288],{"class":785},[582,2178,1413],{"class":1275},[582,2180,1288],{"class":785},[582,2182,1291],{"class":588},[582,2184,2185],{"class":739}," apiKey",[582,2187,1297],{"class":588},[582,2189,1507],{"class":785},[582,2191,485],{"class":588},[582,2193,1354],{"class":785},[582,2195,485],{"class":588},[582,2197,2041],{"class":785},[582,2199,2200],{"class":588},"!,",[582,2202,2203],{"class":739}," dataset",[582,2205,1297],{"class":588},[582,2207,1151],{"class":588},[582,2209,1660],{"class":592},[582,2211,1370],{"class":588},[582,2213,1145],{"class":588},[582,2215,1537],{"class":785},[1108,2217,2219],{"id":2218},"packaged-cli-credentials-never-in-the-bundle","Packaged CLI — credentials never in the bundle",[449,2221,2222,2223,1373,2226,2229,2230,2233],{},"A published CLI (",[452,2224,2225],{},"npm install -g my-cli",[457,2227,2228],{},"must not embed"," provider tokens. The pattern above keeps observability in the binary and the ",[457,2231,2232],{},"destination"," on the host:",[2235,2236,2237,2246],"ol",{},[498,2238,2239,2242,2243,2245],{},[457,2240,2241],{},"Default: local drain"," — works offline, zero credentials, good for ",[452,2244,1022],{}," \u002F support scripts.",[498,2247,2248,2251,2252,2254,2255,2258],{},[457,2249,2250],{},"Production: env on the host"," — platform team sets ",[452,2253,1359],{}," + provider keys in systemd, CI secrets, or a ",[452,2256,2257],{},".env"," the operator loads.",[449,2260,2261,2262,1014,2265,2267],{},"The CLI author ships ",[452,2263,2264],{},"drain.ts",[452,2266,1985],{},"; the operator decides where events go.",[564,2269,2271],{"id":2270},"recommended-project-layout","Recommended project layout",[449,2273,2274,2275,1297],{},"Mirror of the ",[479,2276,2278],{"href":481,"rel":2277},[483],"demo CLI",[572,2280,2284],{"className":2281,"code":2282,"filename":2283,"language":950,"meta":578},[948],"my-cli\u002F\n├── package.json\n├── tsconfig.json\n└── src\u002F\n    ├── index.ts              # runMain, flush, exitWithError\n    ├── drain.ts              # createCliDrain() — fs default, axiom via env\n    ├── evlog.ts              # setupEvlog()\n    ├── catalogs\u002F             # optional — advanced commands only\n    │   ├── actor.ts          # resolveCliActor() for audit.actor\n    │   ├── errors.ts\n    │   └── audit.ts\n    └── commands\u002F\n        ├── index.ts          # main + subCommands\n        ├── doctor.ts\n        └── pull.ts\n","my-cli\u002F",[452,2285,2282],{"__ignoreMap":578},[564,2287,2289],{"id":2288},"install","Install",[2291,2292,2293,2327,2354,2380],"code-group",{},[572,2294,2297],{"className":1797,"code":2295,"filename":2296,"language":1799,"meta":578,"style":578},"pnpm add @evlog\u002Fcli evlog citty\npnpm add @clack\u002Fprompts   # optional — UI only\n","pnpm",[452,2298,2299,2315],{"__ignoreMap":578},[582,2300,2301,2303,2306,2309,2312],{"class":584,"line":585},[582,2302,2296],{"class":1281},[582,2304,2305],{"class":592}," add",[582,2307,2308],{"class":592}," @evlog\u002Fcli",[582,2310,2311],{"class":592}," evlog",[582,2313,2314],{"class":592}," citty\n",[582,2316,2317,2319,2321,2324],{"class":584,"line":596},[582,2318,2296],{"class":1281},[582,2320,2305],{"class":592},[582,2322,2323],{"class":592}," @clack\u002Fprompts",[582,2325,2326],{"class":1398},"   # optional — UI only\n",[572,2328,2331],{"className":1797,"code":2329,"filename":2330,"language":1799,"meta":578,"style":578},"bun add @evlog\u002Fcli evlog citty\nbun add @clack\u002Fprompts\n","bun",[452,2332,2333,2345],{"__ignoreMap":578},[582,2334,2335,2337,2339,2341,2343],{"class":584,"line":585},[582,2336,2330],{"class":1281},[582,2338,2305],{"class":592},[582,2340,2308],{"class":592},[582,2342,2311],{"class":592},[582,2344,2314],{"class":592},[582,2346,2347,2349,2351],{"class":584,"line":596},[582,2348,2330],{"class":1281},[582,2350,2305],{"class":592},[582,2352,2353],{"class":592}," @clack\u002Fprompts\n",[572,2355,2358],{"className":1797,"code":2356,"filename":2357,"language":1799,"meta":578,"style":578},"yarn add @evlog\u002Fcli evlog citty\nyarn add @clack\u002Fprompts\n","yarn",[452,2359,2360,2372],{"__ignoreMap":578},[582,2361,2362,2364,2366,2368,2370],{"class":584,"line":585},[582,2363,2357],{"class":1281},[582,2365,2305],{"class":592},[582,2367,2308],{"class":592},[582,2369,2311],{"class":592},[582,2371,2314],{"class":592},[582,2373,2374,2376,2378],{"class":584,"line":596},[582,2375,2357],{"class":1281},[582,2377,2305],{"class":592},[582,2379,2353],{"class":592},[572,2381,2384],{"className":1797,"code":2382,"filename":2383,"language":1799,"meta":578,"style":578},"npm install @evlog\u002Fcli evlog citty\nnpm install @clack\u002Fprompts\n","npm",[452,2385,2386,2399],{"__ignoreMap":578},[582,2387,2388,2390,2393,2395,2397],{"class":584,"line":585},[582,2389,2383],{"class":1281},[582,2391,2392],{"class":592}," install",[582,2394,2308],{"class":592},[582,2396,2311],{"class":592},[582,2398,2314],{"class":592},[582,2400,2401,2403,2405],{"class":584,"line":596},[582,2402,2383],{"class":1281},[582,2404,2392],{"class":592},[582,2406,2353],{"class":592},[821,2408,2409,2421],{},[824,2410,2411],{},[827,2412,2413,2416,2418],{},[830,2414,2415],{},"Package",[830,2417,2002],{},[830,2419,2420],{},"Role",[839,2422,2423,2447],{},[827,2424,2425,2429,2434],{},[844,2426,2427],{},[452,2428,855],{},[844,2430,2431],{},[452,2432,2433],{},"@evlog\u002Fcli\u002Fcitty",[844,2435,2436,2439,2440,2443,2444],{},[452,2437,2438],{},"runMain(main, setup)"," wraps each ",[452,2441,2442],{},"run()"," in ",[452,2445,2446],{},"invoke()",[827,2448,2449,2454,2459],{},[844,2450,2451],{},[452,2452,2453],{},"ofetch",[844,2455,2456],{},[452,2457,2458],{},"@evlog\u002Fcli\u002Fhttp",[844,2460,2461],{},"Outbound HTTP fields on the wide event",[2463,2464],"hr",{},[564,2466,2468],{"id":2467},"walkthrough","Walkthrough",[1108,2470,2472],{"id":2471},"_1-drain-setup-no-catalogs-required","1. Drain + setup (no catalogs required)",[449,2474,2475,2476,2479],{},"Start with local files; add Axiom\u002FDatadog\u002FOTLP branches when you need cloud — see ",[479,2477,1072],{"href":2478},"#send-events-to-axiom-or-another-provider"," above.",[572,2481,2483],{"className":1123,"code":2482,"filename":576,"language":1125,"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())\n  }\n  return pipeline(createFsDrain({\n    dir: process.env.EVLOG_LOG_DIR ?? '.evlog\u002Flogs',\n  }))\n}\n",[452,2484,2485,2505,2523,2541,2559,2563,2601,2605,2617,2647,2660,2664,2679,2706,2713],{"__ignoreMap":578},[582,2486,2487,2489,2491,2493,2495,2497,2499,2501,2503],{"class":584,"line":585},[582,2488,1133],{"class":1132},[582,2490,1136],{"class":1132},[582,2492,1139],{"class":588},[582,2494,1142],{"class":785},[582,2496,1145],{"class":588},[582,2498,1148],{"class":1132},[582,2500,1151],{"class":588},[582,2502,834],{"class":592},[582,2504,1156],{"class":588},[582,2506,2507,2509,2511,2513,2515,2517,2519,2521],{"class":584,"line":596},[582,2508,1133],{"class":1132},[582,2510,1139],{"class":588},[582,2512,1165],{"class":785},[582,2514,1145],{"class":588},[582,2516,1148],{"class":1132},[582,2518,1151],{"class":588},[582,2520,1174],{"class":592},[582,2522,1156],{"class":588},[582,2524,2525,2527,2529,2531,2533,2535,2537,2539],{"class":584,"line":604},[582,2526,1133],{"class":1132},[582,2528,1139],{"class":588},[582,2530,1205],{"class":785},[582,2532,1145],{"class":588},[582,2534,1148],{"class":1132},[582,2536,1151],{"class":588},[582,2538,1214],{"class":592},[582,2540,1156],{"class":588},[582,2542,2543,2545,2547,2549,2551,2553,2555,2557],{"class":584,"line":612},[582,2544,1133],{"class":1132},[582,2546,1139],{"class":588},[582,2548,1245],{"class":785},[582,2550,1145],{"class":588},[582,2552,1148],{"class":1132},[582,2554,1151],{"class":588},[582,2556,1254],{"class":592},[582,2558,1156],{"class":588},[582,2560,2561],{"class":584,"line":618},[582,2562,780],{"emptyLinePlaceholder":779},[582,2564,2565,2567,2569,2571,2573,2575,2577,2579,2581,2583,2585,2587,2589,2591,2593,2595,2597,2599],{"class":584,"line":626},[582,2566,1266],{"class":1265},[582,2568,1269],{"class":785},[582,2570,1272],{"class":588},[582,2572,1245],{"class":1275},[582,2574,1278],{"class":588},[582,2576,1282],{"class":1281},[582,2578,1285],{"class":588},[582,2580,1288],{"class":785},[582,2582,1291],{"class":588},[582,2584,1294],{"class":739},[582,2586,1297],{"class":588},[582,2588,1139],{"class":588},[582,2590,1302],{"class":739},[582,2592,1297],{"class":588},[582,2594,1308],{"class":1307},[582,2596,1145],{"class":588},[582,2598,1145],{"class":588},[582,2600,1315],{"class":785},[582,2602,2603],{"class":584,"line":631},[582,2604,780],{"emptyLinePlaceholder":779},[582,2606,2607,2609,2611,2613,2615],{"class":584,"line":639},[582,2608,1325],{"class":1132},[582,2610,1328],{"class":1265},[582,2612,1331],{"class":1275},[582,2614,1334],{"class":588},[582,2616,1337],{"class":588},[582,2618,2619,2622,2624,2626,2628,2630,2632,2634,2637,2639,2641,2643,2645],{"class":584,"line":647},[582,2620,2621],{"class":1132},"  if",[582,2623,1346],{"class":739},[582,2625,1349],{"class":785},[582,2627,485],{"class":588},[582,2629,1354],{"class":785},[582,2631,485],{"class":588},[582,2633,1359],{"class":785},[582,2635,2636],{"class":588}," ===",[582,2638,1151],{"class":588},[582,2640,1387],{"class":592},[582,2642,1370],{"class":588},[582,2644,1373],{"class":739},[582,2646,1376],{"class":588},[582,2648,2649,2652,2654,2656,2658],{"class":584,"line":1322},[582,2650,2651],{"class":1132},"    return",[582,2653,1408],{"class":1275},[582,2655,1288],{"class":739},[582,2657,1413],{"class":1275},[582,2659,1416],{"class":739},[582,2661,2662],{"class":584,"line":1340},[582,2663,815],{"class":588},[582,2665,2666,2669,2671,2673,2675,2677],{"class":584,"line":1379},[582,2667,2668],{"class":1132},"  return",[582,2670,1408],{"class":1275},[582,2672,1288],{"class":739},[582,2674,1492],{"class":1275},[582,2676,1288],{"class":739},[582,2678,1376],{"class":588},[582,2680,2681,2684,2686,2688,2690,2692,2694,2696,2698,2700,2702,2704],{"class":584,"line":1395},[582,2682,2683],{"class":739},"    dir",[582,2685,1297],{"class":588},[582,2687,1507],{"class":785},[582,2689,485],{"class":588},[582,2691,1354],{"class":785},[582,2693,485],{"class":588},[582,2695,1516],{"class":785},[582,2697,1362],{"class":588},[582,2699,1151],{"class":588},[582,2701,1523],{"class":592},[582,2703,1370],{"class":588},[582,2705,1528],{"class":588},[582,2707,2708,2711],{"class":584,"line":1402},[582,2709,2710],{"class":588},"  }",[582,2712,1537],{"class":739},[582,2714,2715],{"class":584,"line":1419},[582,2716,1548],{"class":588},[572,2718,2719],{"className":1123,"code":1586,"filename":656,"language":1125,"meta":578,"style":578},[452,2720,2721,2739,2757,2761,2777,2791,2805,2815,2827],{"__ignoreMap":578},[582,2722,2723,2725,2727,2729,2731,2733,2735,2737],{"class":584,"line":585},[582,2724,1133],{"class":1132},[582,2726,1139],{"class":588},[582,2728,1597],{"class":785},[582,2730,1145],{"class":588},[582,2732,1148],{"class":1132},[582,2734,1151],{"class":588},[582,2736,454],{"class":592},[582,2738,1156],{"class":588},[582,2740,2741,2743,2745,2747,2749,2751,2753,2755],{"class":584,"line":596},[582,2742,1133],{"class":1132},[582,2744,1139],{"class":588},[582,2746,1331],{"class":785},[582,2748,1145],{"class":588},[582,2750,1148],{"class":1132},[582,2752,1151],{"class":588},[582,2754,1624],{"class":592},[582,2756,1156],{"class":588},[582,2758,2759],{"class":584,"line":604},[582,2760,780],{"emptyLinePlaceholder":779},[582,2762,2763,2765,2767,2769,2771,2773,2775],{"class":584,"line":612},[582,2764,1325],{"class":1132},[582,2766,1637],{"class":1265},[582,2768,1640],{"class":785},[582,2770,1272],{"class":588},[582,2772,1597],{"class":1275},[582,2774,1288],{"class":785},[582,2776,1376],{"class":588},[582,2778,2779,2781,2783,2785,2787,2789],{"class":584,"line":618},[582,2780,1653],{"class":739},[582,2782,1297],{"class":588},[582,2784,1151],{"class":588},[582,2786,1660],{"class":592},[582,2788,1370],{"class":588},[582,2790,1528],{"class":588},[582,2792,2793,2795,2797,2799,2801,2803],{"class":584,"line":626},[582,2794,1669],{"class":739},[582,2796,1297],{"class":588},[582,2798,1151],{"class":588},[582,2800,1676],{"class":592},[582,2802,1370],{"class":588},[582,2804,1528],{"class":588},[582,2806,2807,2809,2811,2813],{"class":584,"line":631},[582,2808,1685],{"class":739},[582,2810,1297],{"class":588},[582,2812,1691],{"class":1690},[582,2814,1528],{"class":588},[582,2816,2817,2819,2821,2823,2825],{"class":584,"line":639},[582,2818,1698],{"class":739},[582,2820,1297],{"class":588},[582,2822,1331],{"class":1275},[582,2824,1334],{"class":785},[582,2826,1528],{"class":588},[582,2828,2829,2831],{"class":584,"line":647},[582,2830,1711],{"class":588},[582,2832,1315],{"class":785},[449,2834,2835,2836,2838,2839,2841],{},"Every command now emits a wide event to the drain on exit. Add ",[452,2837,920],{}," \u002F ",[452,2840,937],{}," later when you need typed errors or audit trails.",[1108,2843,2845],{"id":2844},"_2-simple-command-wide-event-only","2. Simple command — wide event only",[572,2847,2849],{"className":1123,"code":2848,"filename":765,"language":1125,"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",[452,2850,2851,2870,2893,2912,2916,2933,2971,2983,2999,3020,3083,3103,3140,3145],{"__ignoreMap":578},[582,2852,2853,2855,2857,2860,2862,2864,2866,2868],{"class":584,"line":585},[582,2854,1133],{"class":1132},[582,2856,1139],{"class":588},[582,2858,2859],{"class":785}," defineCommand",[582,2861,1145],{"class":588},[582,2863,1148],{"class":1132},[582,2865,1151],{"class":588},[582,2867,855],{"class":592},[582,2869,1156],{"class":588},[582,2871,2872,2874,2877,2880,2883,2886,2888,2891],{"class":584,"line":596},[582,2873,1133],{"class":1132},[582,2875,2876],{"class":588}," *",[582,2878,2879],{"class":1132}," as",[582,2881,2882],{"class":785}," p ",[582,2884,2885],{"class":1132},"from",[582,2887,1151],{"class":588},[582,2889,2890],{"class":592},"@clack\u002Fprompts",[582,2892,1156],{"class":588},[582,2894,2895,2897,2899,2902,2904,2906,2908,2910],{"class":584,"line":604},[582,2896,1133],{"class":1132},[582,2898,1139],{"class":588},[582,2900,2901],{"class":785}," useLogger",[582,2903,1145],{"class":588},[582,2905,1148],{"class":1132},[582,2907,1151],{"class":588},[582,2909,454],{"class":592},[582,2911,1156],{"class":588},[582,2913,2914],{"class":584,"line":612},[582,2915,780],{"emptyLinePlaceholder":779},[582,2917,2918,2920,2922,2925,2927,2929,2931],{"class":584,"line":618},[582,2919,1325],{"class":1132},[582,2921,1637],{"class":1265},[582,2923,2924],{"class":785}," doctor ",[582,2926,1272],{"class":588},[582,2928,2859],{"class":1275},[582,2930,1288],{"class":785},[582,2932,1376],{"class":588},[582,2934,2935,2938,2940,2942,2945,2947,2949,2951,2953,2956,2959,2961,2963,2966,2968],{"class":584,"line":626},[582,2936,2937],{"class":739},"  meta",[582,2939,1297],{"class":588},[582,2941,1139],{"class":588},[582,2943,2944],{"class":739}," name",[582,2946,1297],{"class":588},[582,2948,1151],{"class":588},[582,2950,1022],{"class":592},[582,2952,1370],{"class":588},[582,2954,2955],{"class":588},",",[582,2957,2958],{"class":739}," description",[582,2960,1297],{"class":588},[582,2962,1151],{"class":588},[582,2964,2965],{"class":592},"Health checks",[582,2967,1370],{"class":588},[582,2969,2970],{"class":588}," },\n",[582,2972,2973,2976,2979,2981],{"class":584,"line":631},[582,2974,2975],{"class":1265},"  async",[582,2977,2978],{"class":739}," run",[582,2980,1334],{"class":588},[582,2982,1337],{"class":588},[582,2984,2985,2988,2991,2994,2996],{"class":584,"line":639},[582,2986,2987],{"class":1265},"    const",[582,2989,2990],{"class":785}," log",[582,2992,2993],{"class":588}," =",[582,2995,2901],{"class":1275},[582,2997,2998],{"class":739},"()\n",[582,3000,3001,3004,3006,3009,3011,3013,3016,3018],{"class":584,"line":647},[582,3002,3003],{"class":785},"    p",[582,3005,485],{"class":588},[582,3007,3008],{"class":1275},"intro",[582,3010,1288],{"class":739},[582,3012,1370],{"class":588},[582,3014,3015],{"class":592},"my-cli doctor",[582,3017,1370],{"class":588},[582,3019,1315],{"class":739},[582,3021,3022,3024,3027,3029,3032,3034,3036,3038,3040,3043,3045,3047,3050,3052,3054,3057,3059,3061,3063,3065,3068,3070,3072,3074,3076,3078,3080],{"class":584,"line":1322},[582,3023,2987],{"class":1265},[582,3025,3026],{"class":785}," checks",[582,3028,2993],{"class":588},[582,3030,3031],{"class":739}," [",[582,3033,1291],{"class":588},[582,3035,2944],{"class":739},[582,3037,1297],{"class":588},[582,3039,1151],{"class":588},[582,3041,3042],{"class":592},"config",[582,3044,1370],{"class":588},[582,3046,2955],{"class":588},[582,3048,3049],{"class":739}," ok",[582,3051,1297],{"class":588},[582,3053,1691],{"class":1690},[582,3055,3056],{"class":588}," },",[582,3058,1139],{"class":588},[582,3060,2944],{"class":739},[582,3062,1297],{"class":588},[582,3064,1151],{"class":588},[582,3066,3067],{"class":592},"api",[582,3069,1370],{"class":588},[582,3071,2955],{"class":588},[582,3073,3049],{"class":739},[582,3075,1297],{"class":588},[582,3077,1691],{"class":1690},[582,3079,1145],{"class":588},[582,3081,3082],{"class":739},"]\n",[582,3084,3085,3088,3090,3093,3095,3097,3099,3101],{"class":584,"line":1340},[582,3086,3087],{"class":785},"    log",[582,3089,485],{"class":588},[582,3091,3092],{"class":1275},"set",[582,3094,1288],{"class":739},[582,3096,1291],{"class":588},[582,3098,3026],{"class":785},[582,3100,1145],{"class":588},[582,3102,1315],{"class":739},[582,3104,3105,3107,3109,3112,3114,3117,3120,3123,3126,3128,3131,3133,3136,3138],{"class":584,"line":1379},[582,3106,3003],{"class":785},[582,3108,485],{"class":588},[582,3110,3111],{"class":1275},"outro",[582,3113,1288],{"class":739},[582,3115,3116],{"class":588},"`",[582,3118,3119],{"class":592},"All ",[582,3121,3122],{"class":588},"${",[582,3124,3125],{"class":785},"checks",[582,3127,485],{"class":588},[582,3129,3130],{"class":785},"length",[582,3132,1711],{"class":588},[582,3134,3135],{"class":592}," checks passed",[582,3137,3116],{"class":588},[582,3139,1315],{"class":739},[582,3141,3142],{"class":584,"line":1395},[582,3143,3144],{"class":588},"  },\n",[582,3146,3147,3149],{"class":584,"line":1402},[582,3148,1711],{"class":588},[582,3150,1315],{"class":785},[449,3152,3153,3154,921,3156,921,3159,921,3162,485],{},"That is enough for observability — one NDJSON line per run with ",[452,3155,3125],{},[452,3157,3158],{},"duration",[452,3160,3161],{},"status",[452,3163,3164],{},"cli.command",[1108,3166,3168],{"id":3167},"_3-optional-error-audit-catalogs","3. Optional — error & audit catalogs",[449,3170,3171],{},"Add when commands throw typed errors or record sensitive actions:",[572,3173,3176],{"className":1123,"code":3174,"filename":3175,"language":1125,"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","src\u002Fcatalogs\u002Ferrors.ts",[452,3177,3178,3197,3201,3227,3236,3248,3264,3280,3284,3290,3294,3310,3320,3333,3337],{"__ignoreMap":578},[582,3179,3180,3182,3184,3187,3189,3191,3193,3195],{"class":584,"line":585},[582,3181,1133],{"class":1132},[582,3183,1139],{"class":588},[582,3185,3186],{"class":785}," defineErrorCatalog",[582,3188,1145],{"class":588},[582,3190,1148],{"class":1132},[582,3192,1151],{"class":588},[582,3194,834],{"class":592},[582,3196,1156],{"class":588},[582,3198,3199],{"class":584,"line":596},[582,3200,780],{"emptyLinePlaceholder":779},[582,3202,3203,3205,3207,3210,3212,3214,3216,3218,3221,3223,3225],{"class":584,"line":604},[582,3204,1325],{"class":1132},[582,3206,1637],{"class":1265},[582,3208,3209],{"class":785}," errorCatalog ",[582,3211,1272],{"class":588},[582,3213,3186],{"class":1275},[582,3215,1288],{"class":785},[582,3217,1370],{"class":588},[582,3219,3220],{"class":592},"myapp",[582,3222,1370],{"class":588},[582,3224,2955],{"class":588},[582,3226,1337],{"class":588},[582,3228,3229,3232,3234],{"class":584,"line":612},[582,3230,3231],{"class":739},"  CONFIG_MISSING",[582,3233,1297],{"class":588},[582,3235,1337],{"class":588},[582,3237,3238,3241,3243,3246],{"class":584,"line":618},[582,3239,3240],{"class":739},"    status",[582,3242,1297],{"class":588},[582,3244,3245],{"class":1307}," 1",[582,3247,1528],{"class":588},[582,3249,3250,3253,3255,3257,3260,3262],{"class":584,"line":626},[582,3251,3252],{"class":739},"    message",[582,3254,1297],{"class":588},[582,3256,1151],{"class":588},[582,3258,3259],{"class":592},"No config file found",[582,3261,1370],{"class":588},[582,3263,1528],{"class":588},[582,3265,3266,3269,3271,3273,3276,3278],{"class":584,"line":631},[582,3267,3268],{"class":739},"    fix",[582,3270,1297],{"class":588},[582,3272,1151],{"class":588},[582,3274,3275],{"class":592},"Run myapp init or set MYAPP_CONFIG.",[582,3277,1370],{"class":588},[582,3279,1528],{"class":588},[582,3281,3282],{"class":584,"line":639},[582,3283,3144],{"class":588},[582,3285,3286,3288],{"class":584,"line":647},[582,3287,1711],{"class":588},[582,3289,1315],{"class":785},[582,3291,3292],{"class":584,"line":1322},[582,3293,780],{"emptyLinePlaceholder":779},[582,3295,3296,3299,3302,3304,3306,3308],{"class":584,"line":1340},[582,3297,3298],{"class":1265},"declare",[582,3300,3301],{"class":1265}," module",[582,3303,1151],{"class":588},[582,3305,834],{"class":592},[582,3307,1370],{"class":588},[582,3309,1337],{"class":588},[582,3311,3312,3315,3318],{"class":584,"line":1379},[582,3313,3314],{"class":1265},"  interface",[582,3316,3317],{"class":1281}," RegisteredErrorCatalogs",[582,3319,1337],{"class":588},[582,3321,3322,3325,3327,3330],{"class":584,"line":1395},[582,3323,3324],{"class":739},"    myapp",[582,3326,1297],{"class":588},[582,3328,3329],{"class":588}," typeof",[582,3331,3332],{"class":785}," errorCatalog\n",[582,3334,3335],{"class":584,"line":1402},[582,3336,815],{"class":588},[582,3338,3339],{"class":584,"line":1419},[582,3340,1548],{"class":588},[572,3342,3345],{"className":1123,"code":3343,"filename":3344,"language":1125,"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  DEPLOY: {\n    target: 'deployment',\n    severity: 'critical',\n    requiresChanges: true,\n    description: 'Promote a build to a region',\n  },\n})\n\ndeclare module 'evlog' {\n  interface RegisteredAuditCatalogs {\n    myapp: typeof auditCatalog\n  }\n}\n","src\u002Fcatalogs\u002Faudit.ts",[452,3346,3347,3366,3370,3395,3404,3420,3436,3452,3482,3486,3495,3510,3525,3536,3551,3555,3561,3565,3579,3588,3599,3603],{"__ignoreMap":578},[582,3348,3349,3351,3353,3356,3358,3360,3362,3364],{"class":584,"line":585},[582,3350,1133],{"class":1132},[582,3352,1139],{"class":588},[582,3354,3355],{"class":785}," defineAuditCatalog",[582,3357,1145],{"class":588},[582,3359,1148],{"class":1132},[582,3361,1151],{"class":588},[582,3363,834],{"class":592},[582,3365,1156],{"class":588},[582,3367,3368],{"class":584,"line":596},[582,3369,780],{"emptyLinePlaceholder":779},[582,3371,3372,3374,3376,3379,3381,3383,3385,3387,3389,3391,3393],{"class":584,"line":604},[582,3373,1325],{"class":1132},[582,3375,1637],{"class":1265},[582,3377,3378],{"class":785}," auditCatalog ",[582,3380,1272],{"class":588},[582,3382,3355],{"class":1275},[582,3384,1288],{"class":785},[582,3386,1370],{"class":588},[582,3388,3220],{"class":592},[582,3390,1370],{"class":588},[582,3392,2955],{"class":588},[582,3394,1337],{"class":588},[582,3396,3397,3400,3402],{"class":584,"line":612},[582,3398,3399],{"class":739},"  SECRET_PULL",[582,3401,1297],{"class":588},[582,3403,1337],{"class":588},[582,3405,3406,3409,3411,3413,3416,3418],{"class":584,"line":618},[582,3407,3408],{"class":739},"    target",[582,3410,1297],{"class":588},[582,3412,1151],{"class":588},[582,3414,3415],{"class":592},"secret_store",[582,3417,1370],{"class":588},[582,3419,1528],{"class":588},[582,3421,3422,3425,3427,3429,3432,3434],{"class":584,"line":626},[582,3423,3424],{"class":739},"    severity",[582,3426,1297],{"class":588},[582,3428,1151],{"class":588},[582,3430,3431],{"class":592},"high",[582,3433,1370],{"class":588},[582,3435,1528],{"class":588},[582,3437,3438,3441,3443,3445,3448,3450],{"class":584,"line":631},[582,3439,3440],{"class":739},"    description",[582,3442,1297],{"class":588},[582,3444,1151],{"class":588},[582,3446,3447],{"class":592},"Read secrets from a remote store",[582,3449,1370],{"class":588},[582,3451,1528],{"class":588},[582,3453,3454,3457,3459,3461,3463,3466,3468,3470,3472,3475,3477,3480],{"class":584,"line":639},[582,3455,3456],{"class":739},"    redactPaths",[582,3458,1297],{"class":588},[582,3460,3031],{"class":785},[582,3462,1370],{"class":588},[582,3464,3465],{"class":592},"token",[582,3467,1370],{"class":588},[582,3469,2955],{"class":588},[582,3471,1151],{"class":588},[582,3473,3474],{"class":592},"password",[582,3476,1370],{"class":588},[582,3478,3479],{"class":785},"]",[582,3481,1528],{"class":588},[582,3483,3484],{"class":584,"line":647},[582,3485,3144],{"class":588},[582,3487,3488,3491,3493],{"class":584,"line":1322},[582,3489,3490],{"class":739},"  DEPLOY",[582,3492,1297],{"class":588},[582,3494,1337],{"class":588},[582,3496,3497,3499,3501,3503,3506,3508],{"class":584,"line":1340},[582,3498,3408],{"class":739},[582,3500,1297],{"class":588},[582,3502,1151],{"class":588},[582,3504,3505],{"class":592},"deployment",[582,3507,1370],{"class":588},[582,3509,1528],{"class":588},[582,3511,3512,3514,3516,3518,3521,3523],{"class":584,"line":1379},[582,3513,3424],{"class":739},[582,3515,1297],{"class":588},[582,3517,1151],{"class":588},[582,3519,3520],{"class":592},"critical",[582,3522,1370],{"class":588},[582,3524,1528],{"class":588},[582,3526,3527,3530,3532,3534],{"class":584,"line":1395},[582,3528,3529],{"class":739},"    requiresChanges",[582,3531,1297],{"class":588},[582,3533,1691],{"class":1690},[582,3535,1528],{"class":588},[582,3537,3538,3540,3542,3544,3547,3549],{"class":584,"line":1402},[582,3539,3440],{"class":739},[582,3541,1297],{"class":588},[582,3543,1151],{"class":588},[582,3545,3546],{"class":592},"Promote a build to a region",[582,3548,1370],{"class":588},[582,3550,1528],{"class":588},[582,3552,3553],{"class":584,"line":1419},[582,3554,3144],{"class":588},[582,3556,3557,3559],{"class":584,"line":1433},[582,3558,1711],{"class":588},[582,3560,1315],{"class":785},[582,3562,3563],{"class":584,"line":1447},[582,3564,780],{"emptyLinePlaceholder":779},[582,3566,3567,3569,3571,3573,3575,3577],{"class":584,"line":1461},[582,3568,3298],{"class":1265},[582,3570,3301],{"class":1265},[582,3572,1151],{"class":588},[582,3574,834],{"class":592},[582,3576,1370],{"class":588},[582,3578,1337],{"class":588},[582,3580,3581,3583,3586],{"class":584,"line":1475},[582,3582,3314],{"class":1265},[582,3584,3585],{"class":1281}," RegisteredAuditCatalogs",[582,3587,1337],{"class":588},[582,3589,3590,3592,3594,3596],{"class":584,"line":1483},[582,3591,3324],{"class":739},[582,3593,1297],{"class":588},[582,3595,3329],{"class":588},[582,3597,3598],{"class":785}," auditCatalog\n",[582,3600,3601],{"class":584,"line":1499},[582,3602,815],{"class":588},[582,3604,3605],{"class":584,"line":1531},[582,3606,1548],{"class":588},[572,3608,3611],{"className":1123,"code":3609,"filename":3610,"language":1125,"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,3612,3613,3634,3638,3654,3684,3716],{"__ignoreMap":578},[582,3614,3615,3617,3619,3621,3624,3626,3628,3630,3632],{"class":584,"line":585},[582,3616,1133],{"class":1132},[582,3618,1136],{"class":1132},[582,3620,1139],{"class":588},[582,3622,3623],{"class":785}," AuditActor",[582,3625,1145],{"class":588},[582,3627,1148],{"class":1132},[582,3629,1151],{"class":588},[582,3631,834],{"class":592},[582,3633,1156],{"class":588},[582,3635,3636],{"class":584,"line":596},[582,3637,780],{"emptyLinePlaceholder":779},[582,3639,3640,3642,3644,3647,3650,3652],{"class":584,"line":604},[582,3641,1325],{"class":1132},[582,3643,1328],{"class":1265},[582,3645,3646],{"class":1275}," resolveCliActor",[582,3648,3649],{"class":588},"():",[582,3651,3623],{"class":1281},[582,3653,1337],{"class":588},[582,3655,3656,3659,3662,3664,3666,3668,3670,3672,3675,3677,3679,3682],{"class":584,"line":612},[582,3657,3658],{"class":1265},"  const",[582,3660,3661],{"class":785}," id",[582,3663,2993],{"class":588},[582,3665,1507],{"class":785},[582,3667,485],{"class":588},[582,3669,1354],{"class":785},[582,3671,485],{"class":588},[582,3673,3674],{"class":785},"USER",[582,3676,1362],{"class":588},[582,3678,1151],{"class":588},[582,3680,3681],{"class":592},"unknown",[582,3683,1156],{"class":588},[582,3685,3686,3688,3690,3692,3694,3696,3699,3701,3703,3705,3707,3710,3712,3714],{"class":584,"line":618},[582,3687,2668],{"class":1132},[582,3689,1139],{"class":588},[582,3691,1136],{"class":739},[582,3693,1297],{"class":588},[582,3695,1151],{"class":588},[582,3697,3698],{"class":592},"user",[582,3700,1370],{"class":588},[582,3702,2955],{"class":588},[582,3704,3661],{"class":785},[582,3706,2955],{"class":588},[582,3708,3709],{"class":739}," displayName",[582,3711,1297],{"class":588},[582,3713,3661],{"class":785},[582,3715,652],{"class":588},[582,3717,3718],{"class":584,"line":626},[582,3719,1548],{"class":588},[449,3721,3722,3723,3726,3727,3730,3731,3733,3734,3736],{},"Pass them to ",[452,3724,3725],{},"setupEvlog({ errorCatalog, auditCatalog })",". See the ",[479,3728,2278],{"href":481,"rel":3729},[483]," ",[452,3732,1055],{}," and ",[452,3735,1058],{}," commands for full audit usage.",[1108,3738,3740,3741],{"id":3739},"_4-entry-srcindexts","4. Entry — ",[452,3742,715],{},[572,3744,3746],{"className":1123,"code":3745,"filename":715,"language":1125,"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(error => exitWithError(error))\n",[452,3747,3748,3767,3786,3806,3826,3830,3842,3866],{"__ignoreMap":578},[582,3749,3750,3752,3754,3757,3759,3761,3763,3765],{"class":584,"line":585},[582,3751,1133],{"class":1132},[582,3753,1139],{"class":588},[582,3755,3756],{"class":785}," exitWithError",[582,3758,1145],{"class":588},[582,3760,1148],{"class":1132},[582,3762,1151],{"class":588},[582,3764,454],{"class":592},[582,3766,1156],{"class":588},[582,3768,3769,3771,3773,3776,3778,3780,3782,3784],{"class":584,"line":596},[582,3770,1133],{"class":1132},[582,3772,1139],{"class":588},[582,3774,3775],{"class":785}," runMain",[582,3777,1145],{"class":588},[582,3779,1148],{"class":1132},[582,3781,1151],{"class":588},[582,3783,2433],{"class":592},[582,3785,1156],{"class":588},[582,3787,3788,3790,3792,3795,3797,3799,3801,3804],{"class":584,"line":604},[582,3789,1133],{"class":1132},[582,3791,1139],{"class":588},[582,3793,3794],{"class":785}," setup",[582,3796,1145],{"class":588},[582,3798,1148],{"class":1132},[582,3800,1151],{"class":588},[582,3802,3803],{"class":592},".\u002Fevlog",[582,3805,1156],{"class":588},[582,3807,3808,3810,3812,3815,3817,3819,3821,3824],{"class":584,"line":612},[582,3809,1133],{"class":1132},[582,3811,1139],{"class":588},[582,3813,3814],{"class":785}," main",[582,3816,1145],{"class":588},[582,3818,1148],{"class":1132},[582,3820,1151],{"class":588},[582,3822,3823],{"class":592},".\u002Fcommands",[582,3825,1156],{"class":588},[582,3827,3828],{"class":584,"line":618},[582,3829,780],{"emptyLinePlaceholder":779},[582,3831,3832,3834,3837,3839],{"class":584,"line":626},[582,3833,968],{"class":1275},[582,3835,3836],{"class":785},"(main",[582,3838,2955],{"class":588},[582,3840,3841],{"class":785}," setup)\n",[582,3843,3844,3847,3850,3852,3854,3857,3859,3861,3864],{"class":584,"line":631},[582,3845,3846],{"class":588},"  .",[582,3848,3849],{"class":1275},"then",[582,3851,1288],{"class":785},[582,3853,1334],{"class":588},[582,3855,3856],{"class":1265}," =>",[582,3858,3794],{"class":785},[582,3860,485],{"class":588},[582,3862,3863],{"class":1275},"flush",[582,3865,1416],{"class":785},[582,3867,3868,3870,3873,3875,3879,3881,3883],{"class":584,"line":639},[582,3869,3846],{"class":588},[582,3871,3872],{"class":1275},"catch",[582,3874,1288],{"class":785},[582,3876,3878],{"class":3877},"sHdIc","error",[582,3880,3856],{"class":1265},[582,3882,3756],{"class":1275},[582,3884,3885],{"class":785},"(error))\n",[1108,3887,3889],{"id":3888},"what-you-see-vs-what-gets-drained","What you see vs what gets drained",[2291,3891,3892,3953,4005],{},[572,3893,3896],{"className":1797,"code":3894,"filename":3895,"language":1799,"meta":578,"style":578},"$ my-cli doctor\n◆  my-cli doctor\n│\n◇  Running checks\n│\n◆  All 2 checks passed\n","Normal (TTY)",[452,3897,3898,3908,3918,3923,3934,3938],{"__ignoreMap":578},[582,3899,3900,3903,3906],{"class":584,"line":585},[582,3901,3902],{"class":1281},"$",[582,3904,3905],{"class":592}," my-cli",[582,3907,1813],{"class":592},[582,3909,3910,3913,3916],{"class":584,"line":596},[582,3911,3912],{"class":1281},"◆",[582,3914,3915],{"class":592},"  my-cli",[582,3917,1813],{"class":592},[582,3919,3920],{"class":584,"line":604},[582,3921,3922],{"class":1281},"│\n",[582,3924,3925,3928,3931],{"class":584,"line":612},[582,3926,3927],{"class":1281},"◇",[582,3929,3930],{"class":592},"  Running",[582,3932,3933],{"class":592}," checks\n",[582,3935,3936],{"class":584,"line":618},[582,3937,3922],{"class":1281},[582,3939,3940,3942,3945,3948,3950],{"class":584,"line":626},[582,3941,3912],{"class":1281},[582,3943,3944],{"class":592},"  All",[582,3946,3947],{"class":1307}," 2",[582,3949,3026],{"class":592},[582,3951,3952],{"class":592}," passed\n",[572,3954,3957],{"className":1797,"code":3955,"filename":3956,"language":1799,"meta":578,"style":578},"$ my-cli doctor --log\n◆  my-cli doctor\n…\n19:04:12 INFO [my-cli] CLI \u002Fdoctor in 98ms\n  └─ checks: …\n","--log (debug telemetry on stderr)",[452,3958,3959,3971,3979,3983,3994],{"__ignoreMap":578},[582,3960,3961,3963,3965,3968],{"class":584,"line":585},[582,3962,3902],{"class":1281},[582,3964,3905],{"class":592},[582,3966,3967],{"class":592}," doctor",[582,3969,3970],{"class":592}," --log\n",[582,3972,3973,3975,3977],{"class":584,"line":596},[582,3974,3912],{"class":1281},[582,3976,3915],{"class":592},[582,3978,1813],{"class":592},[582,3980,3981],{"class":584,"line":604},[582,3982,1924],{"class":1281},[582,3984,3985,3988,3991],{"class":584,"line":612},[582,3986,3987],{"class":1281},"19:04:12",[582,3989,3990],{"class":592}," INFO",[582,3992,3993],{"class":785}," [my-cli] CLI \u002Fdoctor in 98ms\n",[582,3995,3996,3999,4002],{"class":584,"line":618},[582,3997,3998],{"class":1281},"  └─",[582,4000,4001],{"class":592}," checks:",[582,4003,4004],{"class":592}," …\n",[572,4006,4009],{"className":1797,"code":4007,"filename":4008,"language":1799,"meta":578,"style":578},"$ my-cli doctor --json\n{\"checks\":[{\"name\":\"config\",\"ok\":true},{\"name\":\"api\",\"ok\":true}]}\n","--json (your app contract)",[452,4010,4011,4022],{"__ignoreMap":578},[582,4012,4013,4015,4017,4019],{"class":584,"line":585},[582,4014,3902],{"class":1281},[582,4016,3905],{"class":592},[582,4018,3967],{"class":592},[582,4020,4021],{"class":592}," --json\n",[582,4023,4024,4026,4029,4031,4034,4037,4040,4043,4045,4048,4051,4054,4056,4058,4060,4062,4064],{"class":584,"line":596},[582,4025,1291],{"class":588},[582,4027,4028],{"class":1281},"\"checks\"",[582,4030,1297],{"class":1275},[582,4032,4033],{"class":592},"[{",[582,4035,4036],{"class":785},"\"",[582,4038,4039],{"class":1281},"name",[582,4041,4042],{"class":1281},"\":\"",[582,4044,3042],{"class":1281},[582,4046,4047],{"class":1281},"\",\"",[582,4049,4050],{"class":1281},"ok",[582,4052,4053],{"class":1281},"\":true},{\"",[582,4055,4039],{"class":1281},[582,4057,4042],{"class":1281},[582,4059,3067],{"class":1281},[582,4061,4047],{"class":1281},[582,4063,4050],{"class":1281},[582,4065,4066],{"class":1281},"\":true}]}\n",[449,4068,4069,4070,4073,4074,485],{},"The NDJSON wide event is always written to the drain — e.g. ",[452,4071,4072],{},".evlog\u002Flogs\u002F2026-05-30.jsonl"," with ",[452,4075,1492],{},[2463,4077],{},[564,4079,4081],{"id":4080},"api-reference","API reference",[1108,4083,4085,4088,4089],{"id":4084},"setupevlogconfig-vs-uselogger",[452,4086,4087],{},"setupEvlog(config)"," vs ",[452,4090,4091],{},"useLogger()",[449,4093,4094],{},"Two roles — same split as HTTP middleware:",[821,4096,4097,4112],{},[824,4098,4099],{},[827,4100,4101,4103,4108],{},[830,4102],{},[830,4104,4105],{},[452,4106,4107],{},"setupEvlog()",[830,4109,4110],{},[452,4111,4091],{},[839,4113,4114,4127,4142,4158],{},[827,4115,4116,4119,4124],{},[844,4117,4118],{},"When",[844,4120,4121,4122,925],{},"once at startup (",[452,4123,656],{},[844,4125,4126],{},"inside every command handler",[827,4128,4129,4132,4135],{},[844,4130,4131],{},"Does",[844,4133,4134],{},"configure drain, redact, catalogs",[844,4136,4137,4138,4141],{},"returns the ",[457,4139,4140],{},"command-scoped"," logger",[827,4143,4144,4147,4153],{},[844,4145,4146],{},"Analog",[844,4148,4149,4152],{},[452,4150,4151],{},"EvlogModule.forRoot()"," \u002F Nitro plugin",[844,4154,4155,4157],{},[452,4156,4091],{}," in Express, Nest, Hono",[827,4159,4160,4163,4170],{},[844,4161,4162],{},"You call",[844,4164,4165,921,4167],{},[452,4166,2438],{},[452,4168,4169],{},"setup.flush()",[844,4171,4172,921,4174,921,4176],{},[452,4173,983],{},[452,4175,940],{},[452,4177,924],{},[449,4179,4180,4182,4183,4186,4187,4189],{},[452,4181,1013],{}," configures the global pipeline. Each citty command gets its own logger (path ",[452,4184,4185],{},"\u002Fdoctor",", flags, duration) via AsyncLocalStorage — ",[452,4188,4091],{}," retrieves it anywhere in the call stack.",[572,4191,4193],{"className":1123,"code":4192,"language":1125,"meta":578,"style":578},"const log = useLogger()\nlog.set({ checks })   \u002F\u002F not setup.set() — setup is config, log is telemetry\n",[452,4194,4195,4208],{"__ignoreMap":578},[582,4196,4197,4199,4202,4204,4206],{"class":584,"line":585},[582,4198,1266],{"class":1265},[582,4200,4201],{"class":785}," log ",[582,4203,1272],{"class":588},[582,4205,2901],{"class":1275},[582,4207,2998],{"class":785},[582,4209,4210,4213,4215,4217,4219,4221,4224,4226,4229],{"class":584,"line":596},[582,4211,4212],{"class":785},"log",[582,4214,485],{"class":588},[582,4216,3092],{"class":1275},[582,4218,1288],{"class":785},[582,4220,1291],{"class":588},[582,4222,4223],{"class":785}," checks ",[582,4225,1711],{"class":588},[582,4227,4228],{"class":785},")   ",[582,4230,4231],{"class":1398},"\u002F\u002F not setup.set() — setup is config, log is telemetry\n",[1108,4233,4235],{"id":4234},"setupevlogconfig",[452,4236,4087],{},[449,4238,4239,4240,921,4243,921,4246,921,4248,921,4250,921,4252,4255,4256,4259,4260,4255,4263,4259,4265,4268,4269,4271],{},"Boot once at startup. Options: ",[452,4241,4242],{},"service",[452,4244,4245],{},"version",[452,4247,1082],{},[452,4249,920],{},[452,4251,937],{},[452,4253,4254],{},"redact"," (default ",[452,4257,4258],{},"true","), ",[452,4261,4262],{},"flushOnExit",[452,4264,4258],{},[452,4266,4267],{},"logToConsole"," (always print wide events, same as ",[452,4270,895],{},").",[449,4273,4274,4275,485],{},"Returns ",[452,4276,4277],{},"{ invoke, log, errorCatalog, auditCatalog, audit, flush }",[495,4279,4280,4291,4302],{},[498,4281,4282,4284,4285,4288,4289],{},[452,4283,920],{}," — from config (",[452,4286,4287],{},"defineErrorCatalog","); import in commands for ",[452,4290,924],{},[498,4292,4293,4284,4295,4298,4299],{},[452,4294,937],{},[452,4296,4297],{},"defineAuditCatalog","); types for ",[452,4300,4301],{},"log.audit({ action: 'myapp.…' })",[498,4303,4304,4307,4308,4311],{},[452,4305,4306],{},"audit()"," — shortcut that calls ",[452,4309,4310],{},"useLogger().audit()"," outside a handler (rare)",[1108,4313,4315],{"id":4314},"uselogger",[452,4316,4091],{},[449,4318,4319,4320,2838,4322,4324,4325,4327,4328,4331],{},"Inside any ",[452,4321,2446],{},[452,4323,968],{}," handler (or any function called from there). Import from ",[452,4326,454],{}," — no need to pass ",[452,4329,4330],{},"setup"," around.",[1108,4333,4335,4337,4338],{"id":4334},"runmainmain-setup-evlogclicitty",[452,4336,2438],{}," — ",[452,4339,2433],{},[449,4341,4342,4343,2443,4345,4347,4348,485],{},"Wraps every citty ",[452,4344,2442],{},[452,4346,2446],{},". Auto-injects global ",[452,4349,895],{},[1108,4351,4353,2838,4356],{"id":4352},"exitwitherrorerr-parseclierrorerr",[452,4354,4355],{},"exitWithError(err)",[452,4357,4358],{},"parseCliError(err)",[449,4360,4361,4362,4365,4366,485],{},"Human-readable message on stderr + ",[452,4363,4364],{},"process.exit",". Throw catalog errors in handlers: ",[452,4367,4368],{},"throw errorCatalog.CONFIG_MISSING()",[1108,4370,4371],{"id":4212},[452,4372,895],{},[449,4374,4375,4376,4378],{},"evlog-only flag. Pretty wide events on stderr. Injected by ",[452,4377,968],{}," — no manual spread.",[2463,4380],{},[564,4382,4384],{"id":4383},"wide-event-shape","Wide event shape",[821,4386,4387,4397],{},[824,4388,4389],{},[827,4390,4391,4394],{},[830,4392,4393],{},"Field",[830,4395,4396],{},"CLI value",[839,4398,4399,4411,4427,4436,4445,4454,4467,4480],{},[827,4400,4401,4406],{},[844,4402,4403],{},[452,4404,4405],{},"method",[844,4407,4408],{},[452,4409,4410],{},"'CLI'",[827,4412,4413,4418],{},[844,4414,4415],{},[452,4416,4417],{},"path",[844,4419,4420,4423,4424],{},[452,4421,4422],{},"'\u002F\u003Ccommand>'"," or ",[452,4425,4426],{},"'\u002F\u003Ccmd>\u002F\u003Csubcmd>'",[827,4428,4429,4433],{},[844,4430,4431],{},[452,4432,3161],{},[844,4434,4435],{},"exit code (0 success, catalog status on error)",[827,4437,4438,4442],{},[844,4439,4440],{},[452,4441,3164],{},[844,4443,4444],{},"command segment",[827,4446,4447,4451],{},[844,4448,4449],{},[452,4450,908],{},[844,4452,4453],{},"parsed flags (secrets redacted)",[827,4455,4456,4461],{},[844,4457,4458],{},[452,4459,4460],{},"cli.version",[844,4462,4463,4464],{},"from ",[452,4465,4466],{},"setupEvlog({ version })",[827,4468,4469,4474],{},[844,4470,4471],{},[452,4472,4473],{},"cli.tty",[844,4475,4476,4479],{},[452,4477,4478],{},"{ stdin, stdout, stderr }"," booleans",[827,4481,4482,4487],{},[844,4483,4484],{},[452,4485,4486],{},"cli.ci",[844,4488,4489,4491,4492,4495],{},[452,4490,4258],{}," when ",[452,4493,4494],{},"CI"," env is set",[2463,4497],{},[564,4499,4501],{"id":4500},"adoption-levels","Adoption levels",[1108,4503,4505,4506],{"id":4504},"level-0-createcommandlogger","Level 0 — ",[452,4507,4508],{},"createCommandLogger",[449,4510,4511,4512,4515],{},"For ",[457,4513,4514],{},"libraries"," inside someone else's CLI — no global drain bootstrap:",[572,4517,4519],{"className":1123,"code":4518,"language":1125,"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,4520,4521,4540,4544,4588,4612],{"__ignoreMap":578},[582,4522,4523,4525,4527,4530,4532,4534,4536,4538],{"class":584,"line":585},[582,4524,1133],{"class":1132},[582,4526,1139],{"class":588},[582,4528,4529],{"class":785}," createCommandLogger",[582,4531,1145],{"class":588},[582,4533,1148],{"class":1132},[582,4535,1151],{"class":588},[582,4537,454],{"class":592},[582,4539,1156],{"class":588},[582,4541,4542],{"class":584,"line":596},[582,4543,780],{"emptyLinePlaceholder":779},[582,4545,4546,4548,4550,4552,4554,4556,4558,4561,4563,4565,4568,4570,4572,4575,4577,4579,4582,4584,4586],{"class":584,"line":604},[582,4547,1266],{"class":1265},[582,4549,4201],{"class":785},[582,4551,1272],{"class":588},[582,4553,4529],{"class":1275},[582,4555,1288],{"class":785},[582,4557,1291],{"class":588},[582,4559,4560],{"class":739}," command",[582,4562,1297],{"class":588},[582,4564,1151],{"class":588},[582,4566,4567],{"class":592},"migrate",[582,4569,1370],{"class":588},[582,4571,2955],{"class":588},[582,4573,4574],{"class":739}," version",[582,4576,1297],{"class":588},[582,4578,1151],{"class":588},[582,4580,4581],{"class":592},"2.0.0",[582,4583,1370],{"class":588},[582,4585,1145],{"class":588},[582,4587,1315],{"class":785},[582,4589,4590,4592,4594,4596,4598,4600,4603,4605,4608,4610],{"class":584,"line":612},[582,4591,4212],{"class":785},[582,4593,485],{"class":588},[582,4595,3092],{"class":1275},[582,4597,1288],{"class":785},[582,4599,1291],{"class":588},[582,4601,4602],{"class":739}," records",[582,4604,1297],{"class":588},[582,4606,4607],{"class":1307}," 150",[582,4609,1145],{"class":588},[582,4611,1315],{"class":785},[582,4613,4614,4616,4618,4621,4623,4625,4628,4630,4633,4635],{"class":584,"line":618},[582,4615,4212],{"class":785},[582,4617,485],{"class":588},[582,4619,4620],{"class":1275},"emit",[582,4622,1288],{"class":785},[582,4624,1291],{"class":588},[582,4626,4627],{"class":739}," status",[582,4629,1297],{"class":588},[582,4631,4632],{"class":1307}," 0",[582,4634,1145],{"class":588},[582,4636,1315],{"class":785},[1108,4638,4640,4641],{"id":4639},"level-1-manual-invoke","Level 1 — manual ",[452,4642,2446],{},[449,4644,4645],{},"When not using citty:",[572,4647,4649],{"className":1123,"code":4648,"language":1125,"meta":578,"style":578},"await setup.invoke({ command: 'backup', flags: { target: 's3' } }, async (log) => {\n  log.set({ files: 42 })\n})\n",[452,4650,4651,4716,4741],{"__ignoreMap":578},[582,4652,4653,4656,4658,4660,4663,4665,4667,4669,4671,4673,4676,4678,4680,4683,4685,4687,4690,4692,4694,4697,4699,4701,4703,4706,4708,4710,4712,4714],{"class":584,"line":585},[582,4654,4655],{"class":1132},"await",[582,4657,3794],{"class":785},[582,4659,485],{"class":588},[582,4661,4662],{"class":1275},"invoke",[582,4664,1288],{"class":785},[582,4666,1291],{"class":588},[582,4668,4560],{"class":739},[582,4670,1297],{"class":588},[582,4672,1151],{"class":588},[582,4674,4675],{"class":592},"backup",[582,4677,1370],{"class":588},[582,4679,2955],{"class":588},[582,4681,4682],{"class":739}," flags",[582,4684,1297],{"class":588},[582,4686,1139],{"class":588},[582,4688,4689],{"class":739}," target",[582,4691,1297],{"class":588},[582,4693,1151],{"class":588},[582,4695,4696],{"class":592},"s3",[582,4698,1370],{"class":588},[582,4700,1145],{"class":588},[582,4702,3056],{"class":588},[582,4704,4705],{"class":1265}," async",[582,4707,1346],{"class":588},[582,4709,4212],{"class":3877},[582,4711,925],{"class":588},[582,4713,3856],{"class":1265},[582,4715,1337],{"class":588},[582,4717,4718,4721,4723,4725,4727,4729,4732,4734,4737,4739],{"class":584,"line":596},[582,4719,4720],{"class":785},"  log",[582,4722,485],{"class":588},[582,4724,3092],{"class":1275},[582,4726,1288],{"class":739},[582,4728,1291],{"class":588},[582,4730,4731],{"class":739}," files",[582,4733,1297],{"class":588},[582,4735,4736],{"class":1307}," 42",[582,4738,1145],{"class":588},[582,4740,1315],{"class":739},[582,4742,4743,4745],{"class":584,"line":604},[582,4744,1711],{"class":588},[582,4746,1315],{"class":785},[1108,4748,4750,4751],{"id":4749},"level-2-citty-runmain","Level 2 — citty ",[452,4752,968],{},[449,4754,4755],{},"Recommended for multi-command CLIs — see walkthrough above.",[2463,4757],{},[564,4759,4761],{"id":4760},"audit","Audit",[449,4763,4764,4765,4768,4769,1297],{},"Use the catalog wrapper — ",[452,4766,4767],{},"target.type"," comes from the catalog entry; add resource metadata on ",[452,4770,4771],{},"target",[572,4773,4775],{"className":1123,"code":4774,"language":1125,"meta":578,"style":578},"import { auditCatalog } from '..\u002Fcatalogs\u002Faudit'\nimport { resolveCliActor } from '..\u002Fcatalogs\u002Factor'\n\nconst log = useLogger()\nconst actor = resolveCliActor()\n\nlog.audit(auditCatalog.SECRET_PULL({\n  actor,\n  target: {\n    id: args.env,\n    env: args.env,\n    resource: 'secrets',\n    access: 'read',\n  },\n  outcome: 'success',\n  changes: {\n    after: { keyCount: 3, keys: ['DATABASE_URL', 'API_KEY'] },\n  },\n}))\n\n\u002F\u002F AuthZ denial — auditors care about these too\nlog.audit.deny('Missing API token', auditCatalog.SECRET_PULL({\n  actor,\n  target: { id: args.env, access: 'read' },\n}))\n",[452,4776,4777,4797,4816,4820,4832,4845,4849,4869,4876,4885,4901,4916,4932,4948,4952,4968,4977,5025,5029,5035,5039,5044,5078,5084,5117],{"__ignoreMap":578},[582,4778,4779,4781,4783,4786,4788,4790,4792,4795],{"class":584,"line":585},[582,4780,1133],{"class":1132},[582,4782,1139],{"class":588},[582,4784,4785],{"class":785}," auditCatalog",[582,4787,1145],{"class":588},[582,4789,1148],{"class":1132},[582,4791,1151],{"class":588},[582,4793,4794],{"class":592},"..\u002Fcatalogs\u002Faudit",[582,4796,1156],{"class":588},[582,4798,4799,4801,4803,4805,4807,4809,4811,4814],{"class":584,"line":596},[582,4800,1133],{"class":1132},[582,4802,1139],{"class":588},[582,4804,3646],{"class":785},[582,4806,1145],{"class":588},[582,4808,1148],{"class":1132},[582,4810,1151],{"class":588},[582,4812,4813],{"class":592},"..\u002Fcatalogs\u002Factor",[582,4815,1156],{"class":588},[582,4817,4818],{"class":584,"line":604},[582,4819,780],{"emptyLinePlaceholder":779},[582,4821,4822,4824,4826,4828,4830],{"class":584,"line":612},[582,4823,1266],{"class":1265},[582,4825,4201],{"class":785},[582,4827,1272],{"class":588},[582,4829,2901],{"class":1275},[582,4831,2998],{"class":785},[582,4833,4834,4836,4839,4841,4843],{"class":584,"line":618},[582,4835,1266],{"class":1265},[582,4837,4838],{"class":785}," actor ",[582,4840,1272],{"class":588},[582,4842,3646],{"class":1275},[582,4844,2998],{"class":785},[582,4846,4847],{"class":584,"line":626},[582,4848,780],{"emptyLinePlaceholder":779},[582,4850,4851,4853,4855,4857,4860,4862,4865,4867],{"class":584,"line":631},[582,4852,4212],{"class":785},[582,4854,485],{"class":588},[582,4856,4760],{"class":1275},[582,4858,4859],{"class":785},"(auditCatalog",[582,4861,485],{"class":588},[582,4863,4864],{"class":1275},"SECRET_PULL",[582,4866,1288],{"class":785},[582,4868,1376],{"class":588},[582,4870,4871,4874],{"class":584,"line":639},[582,4872,4873],{"class":785},"  actor",[582,4875,1528],{"class":588},[582,4877,4878,4881,4883],{"class":584,"line":647},[582,4879,4880],{"class":739},"  target",[582,4882,1297],{"class":588},[582,4884,1337],{"class":588},[582,4886,4887,4890,4892,4895,4897,4899],{"class":584,"line":1322},[582,4888,4889],{"class":739},"    id",[582,4891,1297],{"class":588},[582,4893,4894],{"class":785}," args",[582,4896,485],{"class":588},[582,4898,1354],{"class":785},[582,4900,1528],{"class":588},[582,4902,4903,4906,4908,4910,4912,4914],{"class":584,"line":1340},[582,4904,4905],{"class":739},"    env",[582,4907,1297],{"class":588},[582,4909,4894],{"class":785},[582,4911,485],{"class":588},[582,4913,1354],{"class":785},[582,4915,1528],{"class":588},[582,4917,4918,4921,4923,4925,4928,4930],{"class":584,"line":1379},[582,4919,4920],{"class":739},"    resource",[582,4922,1297],{"class":588},[582,4924,1151],{"class":588},[582,4926,4927],{"class":592},"secrets",[582,4929,1370],{"class":588},[582,4931,1528],{"class":588},[582,4933,4934,4937,4939,4941,4944,4946],{"class":584,"line":1395},[582,4935,4936],{"class":739},"    access",[582,4938,1297],{"class":588},[582,4940,1151],{"class":588},[582,4942,4943],{"class":592},"read",[582,4945,1370],{"class":588},[582,4947,1528],{"class":588},[582,4949,4950],{"class":584,"line":1402},[582,4951,3144],{"class":588},[582,4953,4954,4957,4959,4961,4964,4966],{"class":584,"line":1419},[582,4955,4956],{"class":739},"  outcome",[582,4958,1297],{"class":588},[582,4960,1151],{"class":588},[582,4962,4963],{"class":592},"success",[582,4965,1370],{"class":588},[582,4967,1528],{"class":588},[582,4969,4970,4973,4975],{"class":584,"line":1433},[582,4971,4972],{"class":739},"  changes",[582,4974,1297],{"class":588},[582,4976,1337],{"class":588},[582,4978,4979,4982,4984,4986,4989,4991,4994,4996,4999,5001,5003,5005,5008,5010,5012,5014,5017,5019,5022],{"class":584,"line":1447},[582,4980,4981],{"class":739},"    after",[582,4983,1297],{"class":588},[582,4985,1139],{"class":588},[582,4987,4988],{"class":739}," keyCount",[582,4990,1297],{"class":588},[582,4992,4993],{"class":1307}," 3",[582,4995,2955],{"class":588},[582,4997,4998],{"class":739}," keys",[582,5000,1297],{"class":588},[582,5002,3031],{"class":785},[582,5004,1370],{"class":588},[582,5006,5007],{"class":592},"DATABASE_URL",[582,5009,1370],{"class":588},[582,5011,2955],{"class":588},[582,5013,1151],{"class":588},[582,5015,5016],{"class":592},"API_KEY",[582,5018,1370],{"class":588},[582,5020,5021],{"class":785},"] ",[582,5023,5024],{"class":588},"},\n",[582,5026,5027],{"class":584,"line":1461},[582,5028,3144],{"class":588},[582,5030,5031,5033],{"class":584,"line":1475},[582,5032,1711],{"class":588},[582,5034,1537],{"class":785},[582,5036,5037],{"class":584,"line":1483},[582,5038,780],{"emptyLinePlaceholder":779},[582,5040,5041],{"class":584,"line":1499},[582,5042,5043],{"class":1398},"\u002F\u002F AuthZ denial — auditors care about these too\n",[582,5045,5046,5048,5050,5052,5054,5057,5059,5061,5064,5066,5068,5070,5072,5074,5076],{"class":584,"line":1531},[582,5047,4212],{"class":785},[582,5049,485],{"class":588},[582,5051,4760],{"class":785},[582,5053,485],{"class":588},[582,5055,5056],{"class":1275},"deny",[582,5058,1288],{"class":785},[582,5060,1370],{"class":588},[582,5062,5063],{"class":592},"Missing API token",[582,5065,1370],{"class":588},[582,5067,2955],{"class":588},[582,5069,4785],{"class":785},[582,5071,485],{"class":588},[582,5073,4864],{"class":1275},[582,5075,1288],{"class":785},[582,5077,1376],{"class":588},[582,5079,5080,5082],{"class":584,"line":1540},[582,5081,4873],{"class":785},[582,5083,1528],{"class":588},[582,5085,5086,5088,5090,5092,5094,5096,5098,5100,5102,5104,5107,5109,5111,5113,5115],{"class":584,"line":1545},[582,5087,4880],{"class":739},[582,5089,1297],{"class":588},[582,5091,1139],{"class":588},[582,5093,3661],{"class":739},[582,5095,1297],{"class":588},[582,5097,4894],{"class":785},[582,5099,485],{"class":588},[582,5101,1354],{"class":785},[582,5103,2955],{"class":588},[582,5105,5106],{"class":739}," access",[582,5108,1297],{"class":588},[582,5110,1151],{"class":588},[582,5112,4943],{"class":592},[582,5114,1370],{"class":588},[582,5116,2970],{"class":588},[582,5118,5120,5122],{"class":584,"line":5119},25,[582,5121,1711],{"class":588},[582,5123,1537],{"class":785},[449,5125,5126,5127,1014,5130,5133,5134,485],{},"Fields merge into the wide event. ",[452,5128,5129],{},"cliRedactPreset",[452,5131,5132],{},"auditRedactPreset"," apply when ",[452,5135,5136],{},"redact: true",[2463,5138],{},[564,5140,5142],{"id":5141},"outbound-http-ofetch","Outbound HTTP (ofetch)",[572,5144,5146],{"className":1123,"code":5145,"language":1125,"meta":578,"style":578},"import { ofetch } from 'ofetch'\nimport { useLogger } from '@evlog\u002Fcli'\nimport { createOutboundHooks } from '@evlog\u002Fcli\u002Fhttp'\n\nconst log = useLogger()\nconst api = ofetch.create(createOutboundHooks(log))\nawait api('https:\u002F\u002Fapi.example.com\u002Fv1\u002Frecords')\n",[452,5147,5148,5167,5185,5204,5208,5220,5244],{"__ignoreMap":578},[582,5149,5150,5152,5154,5157,5159,5161,5163,5165],{"class":584,"line":585},[582,5151,1133],{"class":1132},[582,5153,1139],{"class":588},[582,5155,5156],{"class":785}," ofetch",[582,5158,1145],{"class":588},[582,5160,1148],{"class":1132},[582,5162,1151],{"class":588},[582,5164,2453],{"class":592},[582,5166,1156],{"class":588},[582,5168,5169,5171,5173,5175,5177,5179,5181,5183],{"class":584,"line":596},[582,5170,1133],{"class":1132},[582,5172,1139],{"class":588},[582,5174,2901],{"class":785},[582,5176,1145],{"class":588},[582,5178,1148],{"class":1132},[582,5180,1151],{"class":588},[582,5182,454],{"class":592},[582,5184,1156],{"class":588},[582,5186,5187,5189,5191,5194,5196,5198,5200,5202],{"class":584,"line":604},[582,5188,1133],{"class":1132},[582,5190,1139],{"class":588},[582,5192,5193],{"class":785}," createOutboundHooks",[582,5195,1145],{"class":588},[582,5197,1148],{"class":1132},[582,5199,1151],{"class":588},[582,5201,2458],{"class":592},[582,5203,1156],{"class":588},[582,5205,5206],{"class":584,"line":612},[582,5207,780],{"emptyLinePlaceholder":779},[582,5209,5210,5212,5214,5216,5218],{"class":584,"line":618},[582,5211,1266],{"class":1265},[582,5213,4201],{"class":785},[582,5215,1272],{"class":588},[582,5217,2901],{"class":1275},[582,5219,2998],{"class":785},[582,5221,5222,5224,5227,5229,5231,5233,5236,5238,5241],{"class":584,"line":626},[582,5223,1266],{"class":1265},[582,5225,5226],{"class":785}," api ",[582,5228,1272],{"class":588},[582,5230,5156],{"class":785},[582,5232,485],{"class":588},[582,5234,5235],{"class":1275},"create",[582,5237,1288],{"class":785},[582,5239,5240],{"class":1275},"createOutboundHooks",[582,5242,5243],{"class":785},"(log))\n",[582,5245,5246,5248,5251,5253,5255,5258,5260],{"class":584,"line":631},[582,5247,4655],{"class":1132},[582,5249,5250],{"class":1275}," api",[582,5252,1288],{"class":785},[582,5254,1370],{"class":588},[582,5256,5257],{"class":592},"https:\u002F\u002Fapi.example.com\u002Fv1\u002Frecords",[582,5259,1370],{"class":588},[582,5261,1315],{"class":785},[2463,5263],{},[564,5265,5267],{"id":5266},"drain-long-running-commands","Drain & long-running commands",[449,5269,5270,5271,921,5273,921,5275,921,5277,921,5279,5281,5282,5284,5285,1083,5288,5290],{},"Same adapters as HTTP — ",[452,5272,1214],{},[452,5274,1174],{},[452,5276,1194],{},[452,5278,1234],{},[452,5280,1254],{},". Wire them in ",[452,5283,576],{}," and pass ",[452,5286,5287],{},"createCliDrain()",[452,5289,1013],{},". Pipeline drains flush on exit by default.",[572,5292,5294],{"className":1123,"code":5293,"language":1125,"meta":578,"style":578},"await setup.flush()\n",[452,5295,5296],{"__ignoreMap":578},[582,5297,5298,5300,5302,5304,5306],{"class":584,"line":585},[582,5299,4655],{"class":1132},[582,5301,3794],{"class":785},[582,5303,485],{"class":588},[582,5305,3863],{"class":1275},[582,5307,2998],{"class":785},[449,5309,5310],{},"Watch \u002F REPL — disable auto-emit:",[572,5312,5314],{"className":1123,"code":5313,"language":1125,"meta":578,"style":578},"await setup.invoke({ command: 'run', longRunning: true }, async (log) => {\n  log.set({ phase: 'boot' })\n  log.emit()\n})\n",[452,5315,5316,5364,5392,5402],{"__ignoreMap":578},[582,5317,5318,5320,5322,5324,5326,5328,5330,5332,5334,5336,5339,5341,5343,5346,5348,5350,5352,5354,5356,5358,5360,5362],{"class":584,"line":585},[582,5319,4655],{"class":1132},[582,5321,3794],{"class":785},[582,5323,485],{"class":588},[582,5325,4662],{"class":1275},[582,5327,1288],{"class":785},[582,5329,1291],{"class":588},[582,5331,4560],{"class":739},[582,5333,1297],{"class":588},[582,5335,1151],{"class":588},[582,5337,5338],{"class":592},"run",[582,5340,1370],{"class":588},[582,5342,2955],{"class":588},[582,5344,5345],{"class":739}," longRunning",[582,5347,1297],{"class":588},[582,5349,1691],{"class":1690},[582,5351,3056],{"class":588},[582,5353,4705],{"class":1265},[582,5355,1346],{"class":588},[582,5357,4212],{"class":3877},[582,5359,925],{"class":588},[582,5361,3856],{"class":1265},[582,5363,1337],{"class":588},[582,5365,5366,5368,5370,5372,5374,5376,5379,5381,5383,5386,5388,5390],{"class":584,"line":596},[582,5367,4720],{"class":785},[582,5369,485],{"class":588},[582,5371,3092],{"class":1275},[582,5373,1288],{"class":739},[582,5375,1291],{"class":588},[582,5377,5378],{"class":739}," phase",[582,5380,1297],{"class":588},[582,5382,1151],{"class":588},[582,5384,5385],{"class":592},"boot",[582,5387,1370],{"class":588},[582,5389,1145],{"class":588},[582,5391,1315],{"class":739},[582,5393,5394,5396,5398,5400],{"class":584,"line":604},[582,5395,4720],{"class":785},[582,5397,485],{"class":588},[582,5399,4620],{"class":1275},[582,5401,2998],{"class":739},[582,5403,5404,5406],{"class":584,"line":612},[582,5405,1711],{"class":588},[582,5407,1315],{"class":785},[2463,5409],{},[564,5411,5413],{"id":5412},"demo-cli","Demo CLI",[449,5415,5416],{},"From the evlog monorepo root:",[2291,5418,5419,5449,5465,5481,5506],{},[572,5420,5423],{"className":1797,"code":5421,"filename":5422,"language":1799,"meta":578,"style":578},"pnpm example:cli doctor\npnpm example:cli pull --env staging\n","Human output",[452,5424,5425,5434],{"__ignoreMap":578},[582,5426,5427,5429,5432],{"class":584,"line":585},[582,5428,2296],{"class":1281},[582,5430,5431],{"class":592}," example:cli",[582,5433,1813],{"class":592},[582,5435,5436,5438,5440,5443,5446],{"class":584,"line":596},[582,5437,2296],{"class":1281},[582,5439,5431],{"class":592},[582,5441,5442],{"class":592}," pull",[582,5444,5445],{"class":592}," --env",[582,5447,5448],{"class":592}," staging\n",[572,5450,5453],{"className":1797,"code":5451,"filename":5452,"language":1799,"meta":578,"style":578},"pnpm example:cli doctor --log\n","Debug telemetry",[452,5454,5455],{"__ignoreMap":578},[582,5456,5457,5459,5461,5463],{"class":584,"line":585},[582,5458,2296],{"class":1281},[582,5460,5431],{"class":592},[582,5462,3967],{"class":592},[582,5464,3970],{"class":592},[572,5466,5469],{"className":1797,"code":5467,"filename":5468,"language":1799,"meta":578,"style":578},"pnpm example:cli doctor --json\n","App JSON stdout",[452,5470,5471],{"__ignoreMap":578},[582,5472,5473,5475,5477,5479],{"class":584,"line":585},[582,5474,2296],{"class":1281},[582,5476,5431],{"class":592},[582,5478,3967],{"class":592},[582,5480,4021],{"class":592},[572,5482,5485],{"className":1797,"code":5483,"filename":5484,"language":1799,"meta":578,"style":578},"tail -f examples\u002Fcli\u002F.evlog\u002Flogs\u002F$(date +%Y-%m-%d).jsonl\n","Inspect drain",[452,5486,5487],{"__ignoreMap":578},[582,5488,5489,5491,5493,5496,5498,5500,5502,5504],{"class":584,"line":585},[582,5490,1818],{"class":1281},[582,5492,1821],{"class":592},[582,5494,5495],{"class":592}," examples\u002Fcli\u002F.evlog\u002Flogs\u002F",[582,5497,1827],{"class":588},[582,5499,1830],{"class":1281},[582,5501,1833],{"class":592},[582,5503,925],{"class":588},[582,5505,1838],{"class":592},[572,5507,5510],{"className":1797,"code":5508,"filename":5509,"language":1799,"meta":578,"style":578},"export EVLOG_DRAIN=axiom AXIOM_API_KEY=… AXIOM_DATASET=my-cli\npnpm example:cli doctor\n","Axiom (env on host)",[452,5511,5512,5532],{"__ignoreMap":578},[582,5513,5514,5516,5518,5520,5523,5525,5528,5530],{"class":584,"line":585},[582,5515,1325],{"class":1265},[582,5517,1854],{"class":785},[582,5519,1272],{"class":588},[582,5521,5522],{"class":785},"axiom AXIOM_API_KEY",[582,5524,1272],{"class":588},[582,5526,5527],{"class":785},"… AXIOM_DATASET",[582,5529,1272],{"class":588},[582,5531,1886],{"class":785},[582,5533,5534,5536,5538],{"class":584,"line":596},[582,5535,2296],{"class":1281},[582,5537,5431],{"class":592},[582,5539,1813],{"class":592},[5541,5542,5543],"style",{},"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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .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 .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":596,"depth":596,"links":5545},[5546,5547,5548,5549,5558,5559,5560,5568,5579,5580,5588,5589,5590,5591],{"id":566,"depth":596,"text":567},{"id":818,"depth":596,"text":819},{"id":972,"depth":596,"text":973},{"id":1071,"depth":596,"text":1072,"children":5550},[5551,5553,5555,5556,5557],{"id":1110,"depth":604,"text":5552},"1. Add src\u002Fdrain.ts",{"id":1580,"depth":604,"text":5554},"2. Wire the drain in src\u002Fevlog.ts",{"id":1716,"depth":604,"text":1717},{"id":1989,"depth":604,"text":1990},{"id":2218,"depth":604,"text":2219},{"id":2270,"depth":596,"text":2271},{"id":2288,"depth":596,"text":2289},{"id":2467,"depth":596,"text":2468,"children":5561},[5562,5563,5564,5565,5567],{"id":2471,"depth":604,"text":2472},{"id":2844,"depth":604,"text":2845},{"id":3167,"depth":604,"text":3168},{"id":3739,"depth":604,"text":5566},"4. Entry — src\u002Findex.ts",{"id":3888,"depth":604,"text":3889},{"id":4080,"depth":596,"text":4081,"children":5569},[5570,5572,5573,5574,5576,5578],{"id":4084,"depth":604,"text":5571},"setupEvlog(config) vs useLogger()",{"id":4234,"depth":604,"text":4087},{"id":4314,"depth":604,"text":4091},{"id":4334,"depth":604,"text":5575},"runMain(main, setup) — @evlog\u002Fcli\u002Fcitty",{"id":4352,"depth":604,"text":5577},"exitWithError(err) \u002F parseCliError(err)",{"id":4212,"depth":604,"text":895},{"id":4383,"depth":596,"text":4384},{"id":4500,"depth":596,"text":4501,"children":5581},[5582,5584,5586],{"id":4504,"depth":604,"text":5583},"Level 0 — createCommandLogger",{"id":4639,"depth":604,"text":5585},"Level 1 — manual invoke()",{"id":4749,"depth":604,"text":5587},"Level 2 — citty runMain",{"id":4760,"depth":596,"text":4761},{"id":5141,"depth":596,"text":5142},{"id":5266,"depth":596,"text":5267},{"id":5412,"depth":596,"text":5413},"Observability for command-line tools — wide events per command, drain pipeline, error\u002Faudit catalogs, and a citty adapter. Your UI stack stays unchanged.","md",[5595],{"label":5596,"icon":5597,"to":481,"color":468,"variant":5598},"Example CLI","i-simple-icons-github","subtle",{},{"title":246,"icon":44},{"title":246,"description":5592},"lvPt4OMFXTfWs_f3NwC0_5IccC3WV9uqbXGHRcBYBBg",[5604,5606],{"title":241,"path":242,"stem":243,"description":5605,"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":5607,"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.",1780167571988]