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