[{"data":1,"prerenderedAt":3267},["ShallowReactive",2],{"navigation_docs":3,"-use-cases-telemetry-reference":602,"-use-cases-telemetry-reference-surround":3262},[4,35,85,138,318,479,538,577],{"title":5,"path":6,"stem":7,"children":8,"page":34},"Start","\u002Fstart","1.start",[9,14,19,24,29],{"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",{"title":30,"path":31,"stem":32,"icon":33},"Choose your logger","\u002Fstart\u002Ftypescript-logging-library","1.start\u002F5.typescript-logging-library","i-lucide-file-code",false,{"title":36,"path":37,"stem":38,"children":39,"page":34},"Learn","\u002Flearn","2.learn",[40,45,50,55,60,65,70,75,80],{"title":41,"path":42,"stem":43,"icon":44},"Overview","\u002Flearn\u002Foverview","2.learn\u002F0.overview","i-lucide-list",{"title":46,"path":47,"stem":48,"icon":49},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":51,"path":52,"stem":53,"icon":54},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":56,"path":57,"stem":58,"icon":59},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":61,"path":62,"stem":63,"icon":64},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":66,"path":67,"stem":68,"icon":69},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling","i-lucide-filter",{"title":71,"path":72,"stem":73,"icon":74},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":76,"path":77,"stem":78,"icon":79},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":81,"path":82,"stem":83,"icon":84},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs","i-lucide-book-open",{"title":86,"path":87,"stem":88,"children":89,"page":34},"CLI","\u002Fcli","3.cli",[90,93,98,103,108,113,118,123,128,133],{"title":41,"path":91,"stem":92,"icon":49},"\u002Fcli\u002Foverview","3.cli\u002F0.overview",{"title":94,"path":95,"stem":96,"icon":97},"init","\u002Fcli\u002Finit","3.cli\u002F1.init","i-lucide-wand-sparkles",{"title":99,"path":100,"stem":101,"icon":102},"map","\u002Fcli\u002Fmap","3.cli\u002F2.map","i-lucide-radar",{"title":104,"path":105,"stem":106,"icon":107},"Rules","\u002Fcli\u002Frules","3.cli\u002F3.rules","i-lucide-list-checks",{"title":109,"path":110,"stem":111,"icon":112},"Scoring","\u002Fcli\u002Fscoring","3.cli\u002F4.scoring","i-lucide-gauge",{"title":114,"path":115,"stem":116,"icon":117},"CI","\u002Fcli\u002Fci","3.cli\u002F5.ci","i-lucide-git-pull-request",{"title":119,"path":120,"stem":121,"icon":122},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F6.doctor","i-lucide-stethoscope",{"title":124,"path":125,"stem":126,"icon":127},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F7.telemetry","i-lucide-bar-chart-3",{"title":129,"path":130,"stem":131,"icon":132},"agents","\u002Fcli\u002Fagents","3.cli\u002F8.agents","i-lucide-bot",{"title":134,"path":135,"stem":136,"icon":137},"Observability Score","\u002Fcli\u002Fobservability-score","3.cli\u002F9.observability-score","i-lucide-activity",{"title":139,"path":140,"stem":141,"children":142,"page":34},"Integrate","\u002Fintegrate","4.integrate",[143,147,230],{"title":41,"path":144,"stem":145,"icon":146},"\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":148,"path":149,"stem":150,"children":151,"page":34},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[152,155,185,210],{"title":41,"path":153,"stem":154,"icon":44},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview",{"title":156,"path":157,"stem":158,"children":159,"page":34},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[160,165,170,175,180],{"title":161,"path":162,"stem":163,"icon":164},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":166,"path":167,"stem":168,"icon":169},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F02.posthog","i-simple-icons-posthog",{"title":171,"path":172,"stem":173,"icon":174},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F03.sentry","i-simple-icons-sentry",{"title":176,"path":177,"stem":178,"icon":179},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F04.better-stack","i-simple-icons-betterstack",{"title":181,"path":182,"stem":183,"icon":184},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F05.datadog","i-simple-icons-datadog",{"title":186,"path":187,"stem":188,"children":189,"page":34},"Cloud or Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fhybrid","4.integrate\u002Fadapters\u002Fhybrid",[190,195,200,205],{"title":191,"path":192,"stem":193,"icon":194},"Grafana Loki","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Floki","4.integrate\u002Fadapters\u002Fhybrid\u002F01.loki","i-simple-icons-grafana",{"title":196,"path":197,"stem":198,"icon":199},"ClickHouse","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fclickhouse","4.integrate\u002Fadapters\u002Fhybrid\u002F02.clickhouse","i-simple-icons-clickhouse",{"title":201,"path":202,"stem":203,"icon":204},"OTLP","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fotlp","4.integrate\u002Fadapters\u002Fhybrid\u002F03.otlp","i-simple-icons-opentelemetry",{"title":206,"path":207,"stem":208,"icon":209},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fhyperdx","4.integrate\u002Fadapters\u002Fhybrid\u002F04.hyperdx","i-custom-hyperdx",{"title":211,"path":212,"stem":213,"children":214,"page":34},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[215,220,225],{"title":216,"path":217,"stem":218,"icon":219},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":221,"path":222,"stem":223,"icon":224},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":226,"path":227,"stem":228,"icon":229},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":231,"path":232,"stem":233,"children":234,"page":34},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[235,239,244,249,254,259,264,269,274,279,284,289,294,299,303,308,313],{"title":41,"path":236,"stem":237,"icon":238},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":240,"path":241,"stem":242,"icon":243},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":245,"path":246,"stem":247,"icon":248},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":250,"path":251,"stem":252,"icon":253},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":255,"path":256,"stem":257,"icon":258},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":260,"path":261,"stem":262,"icon":263},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":265,"path":266,"stem":267,"icon":268},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":270,"path":271,"stem":272,"icon":273},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":275,"path":276,"stem":277,"icon":278},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":280,"path":281,"stem":282,"icon":283},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":285,"path":286,"stem":287,"icon":288},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":290,"path":291,"stem":292,"icon":293},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":295,"path":296,"stem":297,"icon":298},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":300,"path":301,"stem":302,"icon":79},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":304,"path":305,"stem":306,"icon":307},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":309,"path":310,"stem":311,"icon":312},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":314,"path":315,"stem":316,"icon":317},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":319,"path":320,"stem":321,"children":322,"page":34},"Use Cases","\u002Fuse-cases","5.use-cases",[323,326,331,359,386,418,439,444,449,453],{"title":41,"path":324,"stem":325,"icon":107},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":327,"path":328,"stem":329,"icon":330},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":332,"icon":333,"path":334,"stem":335,"children":336,"page":34},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[337,340,345,350,355],{"title":41,"path":338,"stem":339,"icon":44},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":341,"path":342,"stem":343,"icon":344},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":346,"path":347,"stem":348,"icon":349},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":351,"path":352,"stem":353,"icon":354},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":356,"path":357,"stem":358,"icon":137},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry",{"title":360,"icon":361,"path":362,"stem":363,"children":364,"page":34},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[365,368,373,378,382],{"title":41,"path":366,"stem":367,"icon":44},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":369,"path":370,"stem":371,"icon":372},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":374,"path":375,"stem":376,"icon":377},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":379,"path":380,"stem":381,"icon":330},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":383,"path":384,"stem":385,"icon":112},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance",{"title":387,"icon":388,"path":389,"stem":390,"children":391,"page":34},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[392,395,400,405,410,414],{"title":41,"path":393,"stem":394,"icon":44},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":396,"path":397,"stem":398,"icon":399},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":401,"path":402,"stem":403,"icon":404},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":406,"path":407,"stem":408,"icon":409},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":411,"path":412,"stem":413,"icon":388},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":415,"path":416,"stem":417,"icon":84},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes",{"title":356,"icon":112,"path":419,"stem":420,"children":421,"page":34},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[422,425,430,435],{"title":41,"path":423,"stem":424,"icon":44},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":426,"path":427,"stem":428,"icon":429},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":431,"path":432,"stem":433,"icon":434},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":436,"path":437,"stem":438,"icon":84},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":440,"path":441,"stem":442,"icon":443},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":445,"path":446,"stem":447,"icon":448},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve","i-custom-eve",{"title":450,"path":451,"stem":452,"icon":434},"Node.js request logging","\u002Fuse-cases\u002Fstructured-logging-nodejs","5.use-cases\u002F6.structured-logging-nodejs",{"title":454,"icon":455,"path":456,"stem":457,"children":458,"page":34},"Signals","i-lucide-scan-search","\u002Fuse-cases\u002Fsignals","5.use-cases\u002F7.signals",[459,462,467,472,475],{"title":41,"path":460,"stem":461,"icon":44},"\u002Fuse-cases\u002Fsignals\u002Foverview","5.use-cases\u002F7.signals\u002F01.overview",{"title":463,"path":464,"stem":465,"icon":466},"What You Can Ask","\u002Fuse-cases\u002Fsignals\u002Fask","5.use-cases\u002F7.signals\u002F02.ask","i-lucide-message-circle-question",{"title":468,"path":469,"stem":470,"icon":471},"What It Costs","\u002Fuse-cases\u002Fsignals\u002Fcost","5.use-cases\u002F7.signals\u002F03.cost","i-lucide-coins",{"title":436,"path":473,"stem":474,"icon":84},"\u002Fuse-cases\u002Fsignals\u002Freference","5.use-cases\u002F7.signals\u002F04.reference",{"title":415,"path":476,"stem":477,"icon":478},"\u002Fuse-cases\u002Fsignals\u002Frecipes","5.use-cases\u002F7.signals\u002F05.recipes","i-lucide-lightbulb",{"title":480,"path":481,"stem":482,"children":483,"page":34},"Extend","\u002Fextend","6.extend",[484,488,493,498,502,507,511,515,519,523,528,533],{"title":41,"path":485,"stem":486,"icon":487},"\u002Fextend\u002Foverview","6.extend\u002F0.overview","i-lucide-blocks",{"title":489,"path":490,"stem":491,"icon":492},"Stream","\u002Fextend\u002Fstream","6.extend\u002F1.stream","i-lucide-radio-tower",{"title":494,"path":495,"stem":496,"icon":497},"Custom framework","\u002Fextend\u002Fcustom-framework","6.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":499,"path":500,"stem":501,"icon":492},"Diagnostics channel","\u002Fextend\u002Fdiagnostics-channel","6.extend\u002F11.diagnostics-channel",{"title":503,"path":504,"stem":505,"icon":506},"FS reader","\u002Fextend\u002Ffs-reader","6.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":415,"path":508,"stem":509,"icon":510},"\u002Fextend\u002Fconsumer-recipes","6.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":512,"path":513,"stem":514,"icon":487},"Plugins","\u002Fextend\u002Fplugins","6.extend\u002F4.plugins",{"title":516,"path":517,"stem":518,"icon":443},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","6.extend\u002F5.custom-enrichers",{"title":520,"path":521,"stem":522,"icon":69},"Tail sampling","\u002Fextend\u002Ftail-sampling","6.extend\u002F6.tail-sampling",{"title":524,"path":525,"stem":526,"icon":527},"Identity headers","\u002Fextend\u002Fidentity-headers","6.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":529,"path":530,"stem":531,"icon":532},"Custom drains","\u002Fextend\u002Fcustom-drains","6.extend\u002F8.custom-drains","i-lucide-share-2",{"title":534,"path":535,"stem":536,"icon":537},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","6.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":436,"path":539,"stem":540,"children":541,"page":34},"\u002Freference","7.reference",[542,546,551,554,559,563,568,572],{"title":41,"path":543,"stem":544,"icon":545},"\u002Freference\u002Foverview","7.reference\u002F0.overview","i-lucide-book-marked",{"title":547,"path":548,"stem":549,"icon":550},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration","i-lucide-settings",{"title":383,"path":552,"stem":553,"icon":112},"\u002Freference\u002Fperformance","7.reference\u002F2.performance",{"title":555,"path":556,"stem":557,"icon":558},"Vite Plugin","\u002Freference\u002Fvite-plugin","7.reference\u002F3.vite-plugin","i-custom-vite",{"title":560,"path":561,"stem":562,"icon":388},"Best Practices","\u002Freference\u002Fbest-practices","7.reference\u002F4.best-practices",{"title":564,"path":565,"stem":566,"icon":567},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":569,"path":570,"stem":571,"icon":443},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"title":573,"path":574,"stem":575,"icon":576},"Cost","\u002Freference\u002Fcost","7.reference\u002F7.cost","i-lucide-receipt",{"title":578,"path":579,"stem":580,"children":581,"page":34},"Compare","\u002Fcompare","8.compare",[582,586,590,594,598],{"title":583,"path":584,"stem":585,"icon":567},"evlog vs Pino","\u002Fcompare\u002Fpino","8.compare\u002F1.pino",{"title":587,"path":588,"stem":589,"icon":204},"evlog vs OpenTelemetry","\u002Fcompare\u002Fopentelemetry","8.compare\u002F2.opentelemetry",{"title":591,"path":592,"stem":593,"icon":567},"evlog vs LogTape","\u002Fcompare\u002Flogtape","8.compare\u002F3.logtape",{"title":595,"path":596,"stem":597,"icon":567},"evlog vs Winston: formats and request events","\u002Fcompare\u002Fwinston","8.compare\u002F4.winston",{"title":599,"path":600,"stem":601,"icon":567},"evlog vs Consola: reporters and request context","\u002Fcompare\u002Fconsola","8.compare\u002F5.consola",{"id":603,"title":604,"body":605,"description":3250,"extension":3251,"links":3252,"meta":3258,"navigation":3259,"path":437,"seo":3260,"stem":438,"__hash__":3261},"docs\u002F5.use-cases\u002F4.telemetry\u002F04.reference.md","Telemetry Reference",{"type":606,"value":607,"toc":3234},"minimark",[608,613,617,992,996,1014,1017,1074,1077,1110,1115,1126,1429,1432,1589,1598,1618,1622,1625,1895,1903,1907,1914,2199,2208,2214,2223,2302,2312,2316,2322,2460,2464,2559,2574,2578,2581,2590,2762,2771,2784,2790,2794,2805,2844,2937,2943,2986,3000,3011,3015,3027,3165,3175,3179,3198,3208,3217,3230],[609,610,612],"h2",{"id":611},"standard-envelope","Standard envelope",[614,615,616],"p",{},"Every run shares the same shape. You do not declare per-command schemas.",[618,619,624],"pre",{"className":620,"code":621,"language":622,"meta":623,"style":623},"language-jsonc shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"event\": \"run\",\n  \"command\": \"sync\",\n  \"durationMs\": 412,\n  \"outcome\": \"success\",\n  \"flags\": { \"dryRun\": true, \"output\": \"\u003Cset>\" },\n  \"tool\": { \"name\": \"my-tool\", \"version\": \"1.0.0\" },\n  \"env\": {\n    \"node\": \"20.11\",\n    \"ci\": false,\n    \"provider\": null,\n    \"tty\": true,\n    \"agent\": \"cursor\"   \u002F\u002F std-env: cursor, claude, codex, … or null\n  },\n  \"machineId\": \"ab3f…\", \u002F\u002F hashed; omitted in ephemeral CI\n  \"custom\": { \"itemsSynced\": 42 }\n}\n","jsonc","",[625,626,627,636,664,685,703,724,771,822,837,859,874,889,904,927,933,957,986],"code",{"__ignoreMap":623},[628,629,632],"span",{"class":630,"line":631},"line",1,[628,633,635],{"class":634},"sMK4o","{\n",[628,637,639,642,646,649,652,655,659,661],{"class":630,"line":638},2,[628,640,641],{"class":634},"  \"",[628,643,645],{"class":644},"spNyl","event",[628,647,648],{"class":634},"\"",[628,650,651],{"class":634},":",[628,653,654],{"class":634}," \"",[628,656,658],{"class":657},"sfazB","run",[628,660,648],{"class":634},[628,662,663],{"class":634},",\n",[628,665,667,669,672,674,676,678,681,683],{"class":630,"line":666},3,[628,668,641],{"class":634},[628,670,671],{"class":644},"command",[628,673,648],{"class":634},[628,675,651],{"class":634},[628,677,654],{"class":634},[628,679,680],{"class":657},"sync",[628,682,648],{"class":634},[628,684,663],{"class":634},[628,686,688,690,693,695,697,701],{"class":630,"line":687},4,[628,689,641],{"class":634},[628,691,692],{"class":644},"durationMs",[628,694,648],{"class":634},[628,696,651],{"class":634},[628,698,700],{"class":699},"sbssI"," 412",[628,702,663],{"class":634},[628,704,706,708,711,713,715,717,720,722],{"class":630,"line":705},5,[628,707,641],{"class":634},[628,709,710],{"class":644},"outcome",[628,712,648],{"class":634},[628,714,651],{"class":634},[628,716,654],{"class":634},[628,718,719],{"class":657},"success",[628,721,648],{"class":634},[628,723,663],{"class":634},[628,725,727,729,732,734,736,739,741,745,747,749,752,754,757,759,761,763,766,768],{"class":630,"line":726},6,[628,728,641],{"class":634},[628,730,731],{"class":644},"flags",[628,733,648],{"class":634},[628,735,651],{"class":634},[628,737,738],{"class":634}," {",[628,740,654],{"class":634},[628,742,744],{"class":743},"sBMFI","dryRun",[628,746,648],{"class":634},[628,748,651],{"class":634},[628,750,751],{"class":634}," true,",[628,753,654],{"class":634},[628,755,756],{"class":743},"output",[628,758,648],{"class":634},[628,760,651],{"class":634},[628,762,654],{"class":634},[628,764,765],{"class":657},"\u003Cset>",[628,767,648],{"class":634},[628,769,770],{"class":634}," },\n",[628,772,774,776,779,781,783,785,787,790,792,794,796,799,801,804,806,809,811,813,815,818,820],{"class":630,"line":773},7,[628,775,641],{"class":634},[628,777,778],{"class":644},"tool",[628,780,648],{"class":634},[628,782,651],{"class":634},[628,784,738],{"class":634},[628,786,654],{"class":634},[628,788,789],{"class":743},"name",[628,791,648],{"class":634},[628,793,651],{"class":634},[628,795,654],{"class":634},[628,797,798],{"class":657},"my-tool",[628,800,648],{"class":634},[628,802,803],{"class":634},",",[628,805,654],{"class":634},[628,807,808],{"class":743},"version",[628,810,648],{"class":634},[628,812,651],{"class":634},[628,814,654],{"class":634},[628,816,817],{"class":657},"1.0.0",[628,819,648],{"class":634},[628,821,770],{"class":634},[628,823,825,827,830,832,834],{"class":630,"line":824},8,[628,826,641],{"class":634},[628,828,829],{"class":644},"env",[628,831,648],{"class":634},[628,833,651],{"class":634},[628,835,836],{"class":634}," {\n",[628,838,840,843,846,848,850,852,855,857],{"class":630,"line":839},9,[628,841,842],{"class":634},"    \"",[628,844,845],{"class":743},"node",[628,847,648],{"class":634},[628,849,651],{"class":634},[628,851,654],{"class":634},[628,853,854],{"class":657},"20.11",[628,856,648],{"class":634},[628,858,663],{"class":634},[628,860,862,864,867,869,871],{"class":630,"line":861},10,[628,863,842],{"class":634},[628,865,866],{"class":743},"ci",[628,868,648],{"class":634},[628,870,651],{"class":634},[628,872,873],{"class":634}," false,\n",[628,875,877,879,882,884,886],{"class":630,"line":876},11,[628,878,842],{"class":634},[628,880,881],{"class":743},"provider",[628,883,648],{"class":634},[628,885,651],{"class":634},[628,887,888],{"class":634}," null,\n",[628,890,892,894,897,899,901],{"class":630,"line":891},12,[628,893,842],{"class":634},[628,895,896],{"class":743},"tty",[628,898,648],{"class":634},[628,900,651],{"class":634},[628,902,903],{"class":634}," true,\n",[628,905,907,909,912,914,916,918,921,923],{"class":630,"line":906},13,[628,908,842],{"class":634},[628,910,911],{"class":743},"agent",[628,913,648],{"class":634},[628,915,651],{"class":634},[628,917,654],{"class":634},[628,919,920],{"class":657},"cursor",[628,922,648],{"class":634},[628,924,926],{"class":925},"sHwdD","   \u002F\u002F std-env: cursor, claude, codex, … or null\n",[628,928,930],{"class":630,"line":929},14,[628,931,932],{"class":634},"  },\n",[628,934,936,938,941,943,945,947,950,952,954],{"class":630,"line":935},15,[628,937,641],{"class":634},[628,939,940],{"class":644},"machineId",[628,942,648],{"class":634},[628,944,651],{"class":634},[628,946,654],{"class":634},[628,948,949],{"class":657},"ab3f…",[628,951,648],{"class":634},[628,953,803],{"class":634},[628,955,956],{"class":925}," \u002F\u002F hashed; omitted in ephemeral CI\n",[628,958,960,962,965,967,969,971,973,976,978,980,983],{"class":630,"line":959},16,[628,961,641],{"class":634},[628,963,964],{"class":644},"custom",[628,966,648],{"class":634},[628,968,651],{"class":634},[628,970,738],{"class":634},[628,972,654],{"class":634},[628,974,975],{"class":743},"itemsSynced",[628,977,648],{"class":634},[628,979,651],{"class":634},[628,981,982],{"class":699}," 42",[628,984,985],{"class":634}," }\n",[628,987,989],{"class":630,"line":988},17,[628,990,991],{"class":634},"}\n",[609,993,995],{"id":994},"extending-the-schema","Extending the schema",[614,997,998,999,1003,1004,1007,1008,1010,1011,1013],{},"The envelope above is ",[1000,1001,1002],"strong",{},"fixed",": every tool sends the same top-level shape so ",[625,1005,1006],{},"parseIngestBody()"," and disclosure stay predictable. You do not add fields next to ",[625,1009,671],{}," or ",[625,1012,692],{},".",[614,1015,1016],{},"Your product schema lives in two extension zones:",[1018,1019,1020,1036],"table",{},[1021,1022,1023],"thead",{},[1024,1025,1026,1030,1033],"tr",{},[1027,1028,1029],"th",{},"Zone",[1027,1031,1032],{},"Who sets it",[1027,1034,1035],{},"What goes there",[1037,1038,1039,1055],"tbody",{},[1024,1040,1041,1046,1052],{},[1042,1043,1044],"td",{},[625,1045,731],{},[1042,1047,1048,1049],{},"citty (auto) + ",[625,1050,1051],{},"collect.flags",[1042,1053,1054],{},"Flags you passed — booleans\u002Fnumbers as values, strings only when allowlisted",[1024,1056,1057,1061,1071],{},[1042,1058,1059],{},[625,1060,964],{},[1042,1062,1063,1064,1067,1068],{},"you via ",[625,1065,1066],{},"telemetry.set()"," + ",[625,1069,1070],{},"collect.fields",[1042,1072,1073],{},"Business counters, categorical dimensions, schema version",[614,1075,1076],{},"Think of it as two contracts:",[1078,1079,1080,1095],"ul",{},[1081,1082,1083,1086,1087,1090,1091,1094],"li",{},[1000,1084,1085],{},"Transport contract"," (",[625,1088,1089],{},"RunEvent","): owned by ",[625,1092,1093],{},"@evlog\u002Ftelemetry",", stable across tools",[1081,1096,1097,1086,1100,1102,1103,1105,1106,1109],{},[1000,1098,1099],{},"Product contract",[625,1101,964],{}," + declared ",[625,1104,731],{},"): owned by you, declared in ",[625,1107,1108],{},"collect",", mirrored on the server",[1111,1112,1114],"h3",{"id":1113},"declare-your-extensions-once","Declare your extensions once",[614,1116,1117,1118,1121,1122,1125],{},"Everything you collect beyond the standard envelope is declared inline in the same ",[625,1119,1120],{},"withTelemetry()"," \u002F ",[625,1123,1124],{},"createTelemetry()"," call:",[618,1127,1132],{"className":1128,"code":1129,"filename":1130,"language":1131,"meta":623,"style":623},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","withTelemetry(command, {\n  name: 'acme-cli',\n  version: '2.1.0',\n  endpoint: 'https:\u002F\u002Ftelemetry.acme.dev\u002Fapi\u002Fingest',\n  collect: {\n    flags: {\n      format: ['json', 'yaml', 'table'],\n      target: ['staging', 'production'],\n    },\n    fields: {\n      product: ['cli', 'action', 'migrator'],\n      plan: ['free', 'pro', 'enterprise'],\n      framework: ['nuxt', 'next', 'remix'],\n    },\n  },\n})\n","src\u002Findex.ts","ts",[625,1133,1134,1148,1167,1183,1199,1208,1217,1256,1285,1290,1299,1337,1375,1413,1417,1421],{"__ignoreMap":623},[628,1135,1136,1140,1144,1146],{"class":630,"line":631},[628,1137,1139],{"class":1138},"s2Zo4","withTelemetry",[628,1141,1143],{"class":1142},"sTEyZ","(command",[628,1145,803],{"class":634},[628,1147,836],{"class":634},[628,1149,1150,1154,1156,1159,1162,1165],{"class":630,"line":638},[628,1151,1153],{"class":1152},"swJcz","  name",[628,1155,651],{"class":634},[628,1157,1158],{"class":634}," '",[628,1160,1161],{"class":657},"acme-cli",[628,1163,1164],{"class":634},"'",[628,1166,663],{"class":634},[628,1168,1169,1172,1174,1176,1179,1181],{"class":630,"line":666},[628,1170,1171],{"class":1152},"  version",[628,1173,651],{"class":634},[628,1175,1158],{"class":634},[628,1177,1178],{"class":657},"2.1.0",[628,1180,1164],{"class":634},[628,1182,663],{"class":634},[628,1184,1185,1188,1190,1192,1195,1197],{"class":630,"line":687},[628,1186,1187],{"class":1152},"  endpoint",[628,1189,651],{"class":634},[628,1191,1158],{"class":634},[628,1193,1194],{"class":657},"https:\u002F\u002Ftelemetry.acme.dev\u002Fapi\u002Fingest",[628,1196,1164],{"class":634},[628,1198,663],{"class":634},[628,1200,1201,1204,1206],{"class":630,"line":705},[628,1202,1203],{"class":1152},"  collect",[628,1205,651],{"class":634},[628,1207,836],{"class":634},[628,1209,1210,1213,1215],{"class":630,"line":726},[628,1211,1212],{"class":1152},"    flags",[628,1214,651],{"class":634},[628,1216,836],{"class":634},[628,1218,1219,1222,1224,1227,1229,1232,1234,1236,1238,1241,1243,1245,1247,1249,1251,1254],{"class":630,"line":773},[628,1220,1221],{"class":1152},"      format",[628,1223,651],{"class":634},[628,1225,1226],{"class":1142}," [",[628,1228,1164],{"class":634},[628,1230,1231],{"class":657},"json",[628,1233,1164],{"class":634},[628,1235,803],{"class":634},[628,1237,1158],{"class":634},[628,1239,1240],{"class":657},"yaml",[628,1242,1164],{"class":634},[628,1244,803],{"class":634},[628,1246,1158],{"class":634},[628,1248,1018],{"class":657},[628,1250,1164],{"class":634},[628,1252,1253],{"class":1142},"]",[628,1255,663],{"class":634},[628,1257,1258,1261,1263,1265,1267,1270,1272,1274,1276,1279,1281,1283],{"class":630,"line":824},[628,1259,1260],{"class":1152},"      target",[628,1262,651],{"class":634},[628,1264,1226],{"class":1142},[628,1266,1164],{"class":634},[628,1268,1269],{"class":657},"staging",[628,1271,1164],{"class":634},[628,1273,803],{"class":634},[628,1275,1158],{"class":634},[628,1277,1278],{"class":657},"production",[628,1280,1164],{"class":634},[628,1282,1253],{"class":1142},[628,1284,663],{"class":634},[628,1286,1287],{"class":630,"line":839},[628,1288,1289],{"class":634},"    },\n",[628,1291,1292,1295,1297],{"class":630,"line":861},[628,1293,1294],{"class":1152},"    fields",[628,1296,651],{"class":634},[628,1298,836],{"class":634},[628,1300,1301,1304,1306,1308,1310,1313,1315,1317,1319,1322,1324,1326,1328,1331,1333,1335],{"class":630,"line":876},[628,1302,1303],{"class":1152},"      product",[628,1305,651],{"class":634},[628,1307,1226],{"class":1142},[628,1309,1164],{"class":634},[628,1311,1312],{"class":657},"cli",[628,1314,1164],{"class":634},[628,1316,803],{"class":634},[628,1318,1158],{"class":634},[628,1320,1321],{"class":657},"action",[628,1323,1164],{"class":634},[628,1325,803],{"class":634},[628,1327,1158],{"class":634},[628,1329,1330],{"class":657},"migrator",[628,1332,1164],{"class":634},[628,1334,1253],{"class":1142},[628,1336,663],{"class":634},[628,1338,1339,1342,1344,1346,1348,1351,1353,1355,1357,1360,1362,1364,1366,1369,1371,1373],{"class":630,"line":891},[628,1340,1341],{"class":1152},"      plan",[628,1343,651],{"class":634},[628,1345,1226],{"class":1142},[628,1347,1164],{"class":634},[628,1349,1350],{"class":657},"free",[628,1352,1164],{"class":634},[628,1354,803],{"class":634},[628,1356,1158],{"class":634},[628,1358,1359],{"class":657},"pro",[628,1361,1164],{"class":634},[628,1363,803],{"class":634},[628,1365,1158],{"class":634},[628,1367,1368],{"class":657},"enterprise",[628,1370,1164],{"class":634},[628,1372,1253],{"class":1142},[628,1374,663],{"class":634},[628,1376,1377,1380,1382,1384,1386,1389,1391,1393,1395,1398,1400,1402,1404,1407,1409,1411],{"class":630,"line":906},[628,1378,1379],{"class":1152},"      framework",[628,1381,651],{"class":634},[628,1383,1226],{"class":1142},[628,1385,1164],{"class":634},[628,1387,1388],{"class":657},"nuxt",[628,1390,1164],{"class":634},[628,1392,803],{"class":634},[628,1394,1158],{"class":634},[628,1396,1397],{"class":657},"next",[628,1399,1164],{"class":634},[628,1401,803],{"class":634},[628,1403,1158],{"class":634},[628,1405,1406],{"class":657},"remix",[628,1408,1164],{"class":634},[628,1410,1253],{"class":1142},[628,1412,663],{"class":634},[628,1414,1415],{"class":630,"line":929},[628,1416,1289],{"class":634},[628,1418,1419],{"class":630,"line":935},[628,1420,932],{"class":634},[628,1422,1423,1426],{"class":630,"line":959},[628,1424,1425],{"class":634},"}",[628,1427,1428],{"class":1142},")\n",[614,1430,1431],{},"Inside handlers, add counters and dimensions:",[618,1433,1436],{"className":1128,"code":1434,"filename":1435,"language":1131,"meta":623,"style":623},"await t.run('deploy', async () => {\n  const result = await deployServices()\n  telemetry.set({\n    servicesDeployed: result.count,   \u002F\u002F number — always allowed\n    rollbackUsed: false,              \u002F\u002F boolean — always allowed\n    framework: 'nuxt',                \u002F\u002F string — allowed (in collect.fields)\n    schemaVersion: 2,                 \u002F\u002F number — version your custom shape\n  })\n})\n","src\u002Fcommands\u002Fdeploy.ts",[625,1437,1438,1474,1494,1508,1527,1543,1561,1576,1583],{"__ignoreMap":623},[628,1439,1440,1444,1447,1449,1451,1454,1456,1459,1461,1463,1466,1469,1472],{"class":630,"line":631},[628,1441,1443],{"class":1442},"s7zQu","await",[628,1445,1446],{"class":1142}," t",[628,1448,1013],{"class":634},[628,1450,658],{"class":1138},[628,1452,1453],{"class":1142},"(",[628,1455,1164],{"class":634},[628,1457,1458],{"class":657},"deploy",[628,1460,1164],{"class":634},[628,1462,803],{"class":634},[628,1464,1465],{"class":644}," async",[628,1467,1468],{"class":634}," ()",[628,1470,1471],{"class":644}," =>",[628,1473,836],{"class":634},[628,1475,1476,1479,1482,1485,1488,1491],{"class":630,"line":638},[628,1477,1478],{"class":644},"  const",[628,1480,1481],{"class":1142}," result",[628,1483,1484],{"class":634}," =",[628,1486,1487],{"class":1442}," await",[628,1489,1490],{"class":1138}," deployServices",[628,1492,1493],{"class":1152},"()\n",[628,1495,1496,1499,1501,1504,1506],{"class":630,"line":666},[628,1497,1498],{"class":1142},"  telemetry",[628,1500,1013],{"class":634},[628,1502,1503],{"class":1138},"set",[628,1505,1453],{"class":1152},[628,1507,635],{"class":634},[628,1509,1510,1513,1515,1517,1519,1522,1524],{"class":630,"line":687},[628,1511,1512],{"class":1152},"    servicesDeployed",[628,1514,651],{"class":634},[628,1516,1481],{"class":1142},[628,1518,1013],{"class":634},[628,1520,1521],{"class":1142},"count",[628,1523,803],{"class":634},[628,1525,1526],{"class":925},"   \u002F\u002F number — always allowed\n",[628,1528,1529,1532,1534,1538,1540],{"class":630,"line":705},[628,1530,1531],{"class":1152},"    rollbackUsed",[628,1533,651],{"class":634},[628,1535,1537],{"class":1536},"sfNiH"," false",[628,1539,803],{"class":634},[628,1541,1542],{"class":925},"              \u002F\u002F boolean — always allowed\n",[628,1544,1545,1548,1550,1552,1554,1556,1558],{"class":630,"line":726},[628,1546,1547],{"class":1152},"    framework",[628,1549,651],{"class":634},[628,1551,1158],{"class":634},[628,1553,1388],{"class":657},[628,1555,1164],{"class":634},[628,1557,803],{"class":634},[628,1559,1560],{"class":925},"                \u002F\u002F string — allowed (in collect.fields)\n",[628,1562,1563,1566,1568,1571,1573],{"class":630,"line":773},[628,1564,1565],{"class":1152},"    schemaVersion",[628,1567,651],{"class":634},[628,1569,1570],{"class":699}," 2",[628,1572,803],{"class":634},[628,1574,1575],{"class":925},"                 \u002F\u002F number — version your custom shape\n",[628,1577,1578,1581],{"class":630,"line":824},[628,1579,1580],{"class":634},"  }",[628,1582,1428],{"class":1152},[628,1584,1585,1587],{"class":630,"line":839},[628,1586,1425],{"class":634},[628,1588,1428],{"class":1142},[614,1590,1591,1592,1595,1596,1013],{},"Undeclared strings are ",[1000,1593,1594],{},"dropped at runtime",", never thrown. That is the privacy guarantee: no accidental paths, tokens, or free-form PII in ",[625,1597,964],{},[1599,1600,1601,1604,1605,1608,1609,1611,1612,1614,1615,1617],"note",{},[1000,1602,1603],{},"Typing:"," ",[625,1606,1607],{},"TelemetryHandle.set()"," autocomplete covers declared ",[625,1610,1070],{}," keys. Use the ambient ",[625,1613,1066],{}," for extra numeric\u002Fboolean counters in the same run, and both merge into ",[625,1616,964],{}," before the event is recorded.",[1111,1619,1621],{"id":1620},"mirror-on-the-server","Mirror on the server",[614,1623,1624],{},"Your ingest handler is the second gate. Pass the same tool name and custom keys you declared on the CLI:",[618,1626,1629],{"className":1128,"code":1627,"filename":1628,"language":1131,"meta":623,"style":623},"import { parseIngestBody } from '@evlog\u002Ftelemetry\u002Fingest'\n\nconst ALLOWED_CUSTOM = [\n  'servicesDeployed', 'rollbackUsed', 'framework',\n  'product', 'plan', 'schemaVersion',\n  'ghaAction', 'ghaEvent',\n] as const\n\nexport async function POST(req: Request) {\n  const raw = await req.text()\n  const events = parseIngestBody(raw, {\n    allowedTools: ['acme-cli'],\n    allowedCustomKeys: { 'acme-cli': ALLOWED_CUSTOM },\n  })\n  \u002F\u002F dedupe on idempotencyKey, then persist\n}\n","app\u002Fapi\u002Ftelemetry\u002Fingest\u002Froute.ts",[625,1630,1631,1655,1661,1675,1705,1734,1754,1765,1769,1798,1819,1839,1858,1880,1886,1891],{"__ignoreMap":623},[628,1632,1633,1636,1638,1641,1644,1647,1649,1652],{"class":630,"line":631},[628,1634,1635],{"class":1442},"import",[628,1637,738],{"class":634},[628,1639,1640],{"class":1142}," parseIngestBody",[628,1642,1643],{"class":634}," }",[628,1645,1646],{"class":1442}," from",[628,1648,1158],{"class":634},[628,1650,1651],{"class":657},"@evlog\u002Ftelemetry\u002Fingest",[628,1653,1654],{"class":634},"'\n",[628,1656,1657],{"class":630,"line":638},[628,1658,1660],{"emptyLinePlaceholder":1659},true,"\n",[628,1662,1663,1666,1669,1672],{"class":630,"line":666},[628,1664,1665],{"class":644},"const",[628,1667,1668],{"class":1142}," ALLOWED_CUSTOM ",[628,1670,1671],{"class":634},"=",[628,1673,1674],{"class":1142}," [\n",[628,1676,1677,1680,1683,1685,1687,1689,1692,1694,1696,1698,1701,1703],{"class":630,"line":687},[628,1678,1679],{"class":634},"  '",[628,1681,1682],{"class":657},"servicesDeployed",[628,1684,1164],{"class":634},[628,1686,803],{"class":634},[628,1688,1158],{"class":634},[628,1690,1691],{"class":657},"rollbackUsed",[628,1693,1164],{"class":634},[628,1695,803],{"class":634},[628,1697,1158],{"class":634},[628,1699,1700],{"class":657},"framework",[628,1702,1164],{"class":634},[628,1704,663],{"class":634},[628,1706,1707,1709,1712,1714,1716,1718,1721,1723,1725,1727,1730,1732],{"class":630,"line":705},[628,1708,1679],{"class":634},[628,1710,1711],{"class":657},"product",[628,1713,1164],{"class":634},[628,1715,803],{"class":634},[628,1717,1158],{"class":634},[628,1719,1720],{"class":657},"plan",[628,1722,1164],{"class":634},[628,1724,803],{"class":634},[628,1726,1158],{"class":634},[628,1728,1729],{"class":657},"schemaVersion",[628,1731,1164],{"class":634},[628,1733,663],{"class":634},[628,1735,1736,1738,1741,1743,1745,1747,1750,1752],{"class":630,"line":726},[628,1737,1679],{"class":634},[628,1739,1740],{"class":657},"ghaAction",[628,1742,1164],{"class":634},[628,1744,803],{"class":634},[628,1746,1158],{"class":634},[628,1748,1749],{"class":657},"ghaEvent",[628,1751,1164],{"class":634},[628,1753,663],{"class":634},[628,1755,1756,1759,1762],{"class":630,"line":773},[628,1757,1758],{"class":1142},"] ",[628,1760,1761],{"class":1442},"as",[628,1763,1764],{"class":644}," const\n",[628,1766,1767],{"class":630,"line":824},[628,1768,1660],{"emptyLinePlaceholder":1659},[628,1770,1771,1774,1776,1779,1782,1784,1788,1790,1793,1796],{"class":630,"line":839},[628,1772,1773],{"class":1442},"export",[628,1775,1465],{"class":644},[628,1777,1778],{"class":644}," function",[628,1780,1781],{"class":1138}," POST",[628,1783,1453],{"class":634},[628,1785,1787],{"class":1786},"sHdIc","req",[628,1789,651],{"class":634},[628,1791,1792],{"class":743}," Request",[628,1794,1795],{"class":634},")",[628,1797,836],{"class":634},[628,1799,1800,1802,1805,1807,1809,1812,1814,1817],{"class":630,"line":861},[628,1801,1478],{"class":644},[628,1803,1804],{"class":1142}," raw",[628,1806,1484],{"class":634},[628,1808,1487],{"class":1442},[628,1810,1811],{"class":1142}," req",[628,1813,1013],{"class":634},[628,1815,1816],{"class":1138},"text",[628,1818,1493],{"class":1152},[628,1820,1821,1823,1826,1828,1830,1832,1835,1837],{"class":630,"line":876},[628,1822,1478],{"class":644},[628,1824,1825],{"class":1142}," events",[628,1827,1484],{"class":634},[628,1829,1640],{"class":1138},[628,1831,1453],{"class":1152},[628,1833,1834],{"class":1142},"raw",[628,1836,803],{"class":634},[628,1838,836],{"class":634},[628,1840,1841,1844,1846,1848,1850,1852,1854,1856],{"class":630,"line":891},[628,1842,1843],{"class":1152},"    allowedTools",[628,1845,651],{"class":634},[628,1847,1226],{"class":1152},[628,1849,1164],{"class":634},[628,1851,1161],{"class":657},[628,1853,1164],{"class":634},[628,1855,1253],{"class":1152},[628,1857,663],{"class":634},[628,1859,1860,1863,1865,1867,1869,1871,1873,1875,1878],{"class":630,"line":906},[628,1861,1862],{"class":1152},"    allowedCustomKeys",[628,1864,651],{"class":634},[628,1866,738],{"class":634},[628,1868,1158],{"class":634},[628,1870,1161],{"class":1152},[628,1872,1164],{"class":634},[628,1874,651],{"class":634},[628,1876,1877],{"class":1142}," ALLOWED_CUSTOM",[628,1879,770],{"class":634},[628,1881,1882,1884],{"class":630,"line":929},[628,1883,1580],{"class":634},[628,1885,1428],{"class":1152},[628,1887,1888],{"class":630,"line":935},[628,1889,1890],{"class":925},"  \u002F\u002F dedupe on idempotencyKey, then persist\n",[628,1892,1893],{"class":630,"line":959},[628,1894,991],{"class":634},[614,1896,1897,1899,1900,1902],{},[625,1898,1006],{}," strips any ",[625,1901,964],{}," key you did not list, even if a client somehow sent it.",[1111,1904,1906],{"id":1905},"map-to-your-warehouse-schema","Map to your warehouse schema",[614,1908,1909,1910,1913],{},"After validation, shape the event for ",[1000,1911,1912],{},"your"," database. The evlog envelope is the wire format; your tables are your choice:",[618,1915,1918],{"className":1128,"code":1916,"filename":1917,"language":1131,"meta":623,"style":623},"function toRow(event: RunEvent) {\n  return {\n    command: event.command,\n    duration_ms: event.durationMs,\n    outcome: event.outcome,\n    tool_version: event.tool.version,\n    format: event.flags.format,\n    target: event.flags.target,\n    services_deployed: event.custom.servicesDeployed,\n    framework: event.custom.framework,\n    plan: event.custom.plan,\n    schema_version: event.custom.schemaVersion ?? 1,\n    is_ci: event.env.ci,\n    node: event.env.node,\n    received_at: new Date(),\n  }\n}\n","lib\u002Ftelemetry-store.ts",[625,1919,1920,1941,1948,1964,1979,1994,2013,2033,2053,2072,2090,2109,2134,2153,2172,2190,2195],{"__ignoreMap":623},[628,1921,1922,1925,1928,1930,1932,1934,1937,1939],{"class":630,"line":631},[628,1923,1924],{"class":644},"function",[628,1926,1927],{"class":1138}," toRow",[628,1929,1453],{"class":634},[628,1931,645],{"class":1786},[628,1933,651],{"class":634},[628,1935,1936],{"class":743}," RunEvent",[628,1938,1795],{"class":634},[628,1940,836],{"class":634},[628,1942,1943,1946],{"class":630,"line":638},[628,1944,1945],{"class":1442},"  return",[628,1947,836],{"class":634},[628,1949,1950,1953,1955,1958,1960,1962],{"class":630,"line":666},[628,1951,1952],{"class":1152},"    command",[628,1954,651],{"class":634},[628,1956,1957],{"class":1142}," event",[628,1959,1013],{"class":634},[628,1961,671],{"class":1142},[628,1963,663],{"class":634},[628,1965,1966,1969,1971,1973,1975,1977],{"class":630,"line":687},[628,1967,1968],{"class":1152},"    duration_ms",[628,1970,651],{"class":634},[628,1972,1957],{"class":1142},[628,1974,1013],{"class":634},[628,1976,692],{"class":1142},[628,1978,663],{"class":634},[628,1980,1981,1984,1986,1988,1990,1992],{"class":630,"line":705},[628,1982,1983],{"class":1152},"    outcome",[628,1985,651],{"class":634},[628,1987,1957],{"class":1142},[628,1989,1013],{"class":634},[628,1991,710],{"class":1142},[628,1993,663],{"class":634},[628,1995,1996,1999,2001,2003,2005,2007,2009,2011],{"class":630,"line":726},[628,1997,1998],{"class":1152},"    tool_version",[628,2000,651],{"class":634},[628,2002,1957],{"class":1142},[628,2004,1013],{"class":634},[628,2006,778],{"class":1142},[628,2008,1013],{"class":634},[628,2010,808],{"class":1142},[628,2012,663],{"class":634},[628,2014,2015,2018,2020,2022,2024,2026,2028,2031],{"class":630,"line":773},[628,2016,2017],{"class":1152},"    format",[628,2019,651],{"class":634},[628,2021,1957],{"class":1142},[628,2023,1013],{"class":634},[628,2025,731],{"class":1142},[628,2027,1013],{"class":634},[628,2029,2030],{"class":1142},"format",[628,2032,663],{"class":634},[628,2034,2035,2038,2040,2042,2044,2046,2048,2051],{"class":630,"line":824},[628,2036,2037],{"class":1152},"    target",[628,2039,651],{"class":634},[628,2041,1957],{"class":1142},[628,2043,1013],{"class":634},[628,2045,731],{"class":1142},[628,2047,1013],{"class":634},[628,2049,2050],{"class":1142},"target",[628,2052,663],{"class":634},[628,2054,2055,2058,2060,2062,2064,2066,2068,2070],{"class":630,"line":839},[628,2056,2057],{"class":1152},"    services_deployed",[628,2059,651],{"class":634},[628,2061,1957],{"class":1142},[628,2063,1013],{"class":634},[628,2065,964],{"class":1142},[628,2067,1013],{"class":634},[628,2069,1682],{"class":1142},[628,2071,663],{"class":634},[628,2073,2074,2076,2078,2080,2082,2084,2086,2088],{"class":630,"line":861},[628,2075,1547],{"class":1152},[628,2077,651],{"class":634},[628,2079,1957],{"class":1142},[628,2081,1013],{"class":634},[628,2083,964],{"class":1142},[628,2085,1013],{"class":634},[628,2087,1700],{"class":1142},[628,2089,663],{"class":634},[628,2091,2092,2095,2097,2099,2101,2103,2105,2107],{"class":630,"line":876},[628,2093,2094],{"class":1152},"    plan",[628,2096,651],{"class":634},[628,2098,1957],{"class":1142},[628,2100,1013],{"class":634},[628,2102,964],{"class":1142},[628,2104,1013],{"class":634},[628,2106,1720],{"class":1142},[628,2108,663],{"class":634},[628,2110,2111,2114,2116,2118,2120,2122,2124,2126,2129,2132],{"class":630,"line":891},[628,2112,2113],{"class":1152},"    schema_version",[628,2115,651],{"class":634},[628,2117,1957],{"class":1142},[628,2119,1013],{"class":634},[628,2121,964],{"class":1142},[628,2123,1013],{"class":634},[628,2125,1729],{"class":1142},[628,2127,2128],{"class":634}," ??",[628,2130,2131],{"class":699}," 1",[628,2133,663],{"class":634},[628,2135,2136,2139,2141,2143,2145,2147,2149,2151],{"class":630,"line":906},[628,2137,2138],{"class":1152},"    is_ci",[628,2140,651],{"class":634},[628,2142,1957],{"class":1142},[628,2144,1013],{"class":634},[628,2146,829],{"class":1142},[628,2148,1013],{"class":634},[628,2150,866],{"class":1142},[628,2152,663],{"class":634},[628,2154,2155,2158,2160,2162,2164,2166,2168,2170],{"class":630,"line":929},[628,2156,2157],{"class":1152},"    node",[628,2159,651],{"class":634},[628,2161,1957],{"class":1142},[628,2163,1013],{"class":634},[628,2165,829],{"class":1142},[628,2167,1013],{"class":634},[628,2169,845],{"class":1142},[628,2171,663],{"class":634},[628,2173,2174,2177,2179,2182,2185,2188],{"class":630,"line":935},[628,2175,2176],{"class":1152},"    received_at",[628,2178,651],{"class":634},[628,2180,2181],{"class":634}," new",[628,2183,2184],{"class":1138}," Date",[628,2186,2187],{"class":1152},"()",[628,2189,663],{"class":634},[628,2191,2192],{"class":630,"line":959},[628,2193,2194],{"class":634},"  }\n",[628,2196,2197],{"class":630,"line":988},[628,2198,991],{"class":634},[614,2200,2201,2202,2204,2205,2207],{},"This is where a company \"modifies the schema\" in practice: not by changing ",[625,2203,1089],{},", but by defining how ",[625,2206,964],{}," maps into internal analytics tables.",[1111,2209,2211,2212],{"id":2210},"version-breaking-changes-in-custom","Version breaking changes in ",[625,2213,964],{},[614,2215,2216,2217,2219,2220,2222],{},"When your product counters evolve, bump a numeric ",[625,2218,1729],{}," in ",[625,2221,964],{}," (no allowlist needed) and branch in the ingest mapper:",[618,2224,2226],{"className":1128,"code":2225,"language":1131,"meta":623,"style":623},"const version = (event.custom.schemaVersion as number | undefined) ?? 1\nif (version === 1) return mapV1(event)\nreturn mapV2(event)\n",[625,2227,2228,2269,2293],{"__ignoreMap":623},[628,2229,2230,2232,2235,2237,2240,2242,2244,2246,2249,2251,2254,2257,2260,2263,2266],{"class":630,"line":631},[628,2231,1665],{"class":644},[628,2233,2234],{"class":1142}," version ",[628,2236,1671],{"class":634},[628,2238,2239],{"class":1142}," (event",[628,2241,1013],{"class":634},[628,2243,964],{"class":1142},[628,2245,1013],{"class":634},[628,2247,2248],{"class":1142},"schemaVersion ",[628,2250,1761],{"class":1442},[628,2252,2253],{"class":743}," number",[628,2255,2256],{"class":634}," |",[628,2258,2259],{"class":743}," undefined",[628,2261,2262],{"class":1142},") ",[628,2264,2265],{"class":634},"??",[628,2267,2268],{"class":699}," 1\n",[628,2270,2271,2274,2277,2280,2282,2284,2287,2290],{"class":630,"line":638},[628,2272,2273],{"class":1442},"if",[628,2275,2276],{"class":1142}," (version ",[628,2278,2279],{"class":634},"===",[628,2281,2131],{"class":699},[628,2283,2262],{"class":1142},[628,2285,2286],{"class":1442},"return",[628,2288,2289],{"class":1138}," mapV1",[628,2291,2292],{"class":1142},"(event)\n",[628,2294,2295,2297,2300],{"class":630,"line":666},[628,2296,2286],{"class":1442},[628,2298,2299],{"class":1138}," mapV2",[628,2301,2292],{"class":1142},[614,2303,2304,2305,2308,2309,2311],{},"Commit an updated ",[625,2306,2307],{},"TELEMETRY.md"," whenever ",[625,2310,1108],{}," changes so disclosure stays aligned with releases.",[1111,2313,2315],{"id":2314},"multiple-tools-one-endpoint","Multiple tools, one endpoint",[614,2317,2318,2319,651],{},"If several CLIs POST to the same ingest URL, namespace custom keys or rely on ",[625,2320,2321],{},"tool.name",[618,2323,2325],{"className":1128,"code":2324,"language":1131,"meta":623,"style":623},"\u002F\u002F Option A — prefix keys per product line\ntelemetry.set({ acme_product: 'cli', deployCount: 3 })\n\n\u002F\u002F Option B — separate allowedCustomKeys per tool.name in parseIngestBody\nallowedCustomKeys: {\n  'acme-cli': ['deployCount', 'framework'],\n  'acme-action': ['jobDuration', 'ghaAction', 'ghaEvent'],\n}\n",[625,2326,2327,2332,2370,2374,2379,2388,2418,2456],{"__ignoreMap":623},[628,2328,2329],{"class":630,"line":631},[628,2330,2331],{"class":925},"\u002F\u002F Option A — prefix keys per product line\n",[628,2333,2334,2336,2338,2340,2342,2345,2348,2350,2352,2354,2356,2358,2361,2363,2366,2368],{"class":630,"line":638},[628,2335,124],{"class":1142},[628,2337,1013],{"class":634},[628,2339,1503],{"class":1138},[628,2341,1453],{"class":1142},[628,2343,2344],{"class":634},"{",[628,2346,2347],{"class":1152}," acme_product",[628,2349,651],{"class":634},[628,2351,1158],{"class":634},[628,2353,1312],{"class":657},[628,2355,1164],{"class":634},[628,2357,803],{"class":634},[628,2359,2360],{"class":1152}," deployCount",[628,2362,651],{"class":634},[628,2364,2365],{"class":699}," 3",[628,2367,1643],{"class":634},[628,2369,1428],{"class":1142},[628,2371,2372],{"class":630,"line":666},[628,2373,1660],{"emptyLinePlaceholder":1659},[628,2375,2376],{"class":630,"line":687},[628,2377,2378],{"class":925},"\u002F\u002F Option B — separate allowedCustomKeys per tool.name in parseIngestBody\n",[628,2380,2381,2384,2386],{"class":630,"line":705},[628,2382,2383],{"class":743},"allowedCustomKeys",[628,2385,651],{"class":634},[628,2387,836],{"class":634},[628,2389,2390,2392,2394,2396,2399,2401,2404,2406,2408,2410,2412,2414,2416],{"class":630,"line":726},[628,2391,1679],{"class":634},[628,2393,1161],{"class":657},[628,2395,1164],{"class":634},[628,2397,2398],{"class":1152},": [",[628,2400,1164],{"class":634},[628,2402,2403],{"class":657},"deployCount",[628,2405,1164],{"class":634},[628,2407,803],{"class":634},[628,2409,1158],{"class":634},[628,2411,1700],{"class":657},[628,2413,1164],{"class":634},[628,2415,1253],{"class":1152},[628,2417,663],{"class":634},[628,2419,2420,2422,2425,2427,2429,2431,2434,2436,2438,2440,2442,2444,2446,2448,2450,2452,2454],{"class":630,"line":773},[628,2421,1679],{"class":634},[628,2423,2424],{"class":657},"acme-action",[628,2426,1164],{"class":634},[628,2428,2398],{"class":1152},[628,2430,1164],{"class":634},[628,2432,2433],{"class":657},"jobDuration",[628,2435,1164],{"class":634},[628,2437,803],{"class":634},[628,2439,1158],{"class":634},[628,2441,1740],{"class":657},[628,2443,1164],{"class":634},[628,2445,803],{"class":634},[628,2447,1158],{"class":634},[628,2449,1749],{"class":657},[628,2451,1164],{"class":634},[628,2453,1253],{"class":1152},[628,2455,663],{"class":634},[628,2457,2458],{"class":630,"line":824},[628,2459,991],{"class":634},[1111,2461,2463],{"id":2462},"what-v1-does-not-support","What v1 does not support",[1018,2465,2466,2479],{},[1021,2467,2468],{},[1024,2469,2470,2473,2476],{},[1027,2471,2472],{},"Need",[1027,2474,2475],{},"v1 answer",[1027,2477,2478],{},"Workaround",[1037,2480,2481,2500,2520,2537,2548],{},[1024,2482,2483,2489,2492],{},[1042,2484,2485,2486,1795],{},"New top-level field (",[625,2487,2488],{},"tenantId",[1042,2490,2491],{},"Not on the wire",[1042,2493,2494,2495,2497,2498],{},"Flat key in ",[625,2496,964],{}," + allowlist, or map server-side from ",[625,2499,940],{},[1024,2501,2502,2508,2511],{},[1042,2503,2504,2505,1795],{},"Nested objects (",[625,2506,2507],{},"custom.user.plan",[1042,2509,2510],{},"Flat records only",[1042,2512,2513,2514,2517,2518],{},"Flatten: ",[625,2515,2516],{},"userPlan: 'pro'"," with ",[625,2519,1070],{},[1024,2521,2522,2525,2528],{},[1042,2523,2524],{},"Free-form strings (paths, emails)",[1042,2526,2527],{},"Blocked by design",[1042,2529,2530,2531,2534,2535],{},"Flags record ",[625,2532,2533],{},"\"\u003Cset>\""," instead of the value; hash before ",[625,2536,1066],{},[1024,2538,2539,2542,2545],{},[1042,2540,2541],{},"Different schema per command",[1042,2543,2544],{},"One envelope per run",[1042,2546,2547],{},"Convention: only set relevant keys per command",[1024,2549,2550,2553,2556],{},[1042,2551,2552],{},"Transform before outbox",[1042,2554,2555],{},"No hook yet",[1042,2557,2558],{},"Map on the server (recommended) or see planned v2 below",[2560,2561,2562,2565,2566,2568,2569,1067,2571,2573],"tip",{},[1000,2563,2564],{},"Rule of thumb:"," if it is safe to print in ",[625,2567,2307],{}," and fits a closed set or a number, it belongs in ",[625,2570,1108],{},[625,2572,964],{},". Everything else stays server-side.",[1111,2575,2577],{"id":2576},"planned-v2-extensions","Planned v2 extensions",[614,2579,2580],{},"Not shipped yet. These are design targets for when the v1 extension zones are not enough:",[614,2582,2583,2589],{},[1000,2584,2585,2588],{},[625,2586,2587],{},"enrich"," hook."," Runs after sanitization, before the outbox append. Lets you inject computed fields without forking the package:",[618,2591,2593],{"className":1128,"code":2592,"language":1131,"meta":623,"style":623},"\u002F\u002F Planned API — not available in v1\ncreateTelemetry({\n  name: 'acme-cli',\n  version: '3.0.0',\n  collect: { fields: { product: ['cli', 'action'] } },\n  enrich(event) {\n    return {\n      ...event,\n      custom: {\n        ...event.custom,\n        schemaVersion: 2,\n      },\n    }\n  },\n})\n",[625,2594,2595,2600,2609,2623,2638,2680,2693,2700,2709,2718,2731,2742,2747,2752,2756],{"__ignoreMap":623},[628,2596,2597],{"class":630,"line":631},[628,2598,2599],{"class":925},"\u002F\u002F Planned API — not available in v1\n",[628,2601,2602,2605,2607],{"class":630,"line":638},[628,2603,2604],{"class":1138},"createTelemetry",[628,2606,1453],{"class":1142},[628,2608,635],{"class":634},[628,2610,2611,2613,2615,2617,2619,2621],{"class":630,"line":666},[628,2612,1153],{"class":1152},[628,2614,651],{"class":634},[628,2616,1158],{"class":634},[628,2618,1161],{"class":657},[628,2620,1164],{"class":634},[628,2622,663],{"class":634},[628,2624,2625,2627,2629,2631,2634,2636],{"class":630,"line":687},[628,2626,1171],{"class":1152},[628,2628,651],{"class":634},[628,2630,1158],{"class":634},[628,2632,2633],{"class":657},"3.0.0",[628,2635,1164],{"class":634},[628,2637,663],{"class":634},[628,2639,2640,2642,2644,2646,2649,2651,2653,2656,2658,2660,2662,2664,2666,2668,2670,2672,2674,2676,2678],{"class":630,"line":705},[628,2641,1203],{"class":1152},[628,2643,651],{"class":634},[628,2645,738],{"class":634},[628,2647,2648],{"class":1152}," fields",[628,2650,651],{"class":634},[628,2652,738],{"class":634},[628,2654,2655],{"class":1152}," product",[628,2657,651],{"class":634},[628,2659,1226],{"class":1142},[628,2661,1164],{"class":634},[628,2663,1312],{"class":657},[628,2665,1164],{"class":634},[628,2667,803],{"class":634},[628,2669,1158],{"class":634},[628,2671,1321],{"class":657},[628,2673,1164],{"class":634},[628,2675,1758],{"class":1142},[628,2677,1425],{"class":634},[628,2679,770],{"class":634},[628,2681,2682,2685,2687,2689,2691],{"class":630,"line":726},[628,2683,2684],{"class":1152},"  enrich",[628,2686,1453],{"class":634},[628,2688,645],{"class":1786},[628,2690,1795],{"class":634},[628,2692,836],{"class":634},[628,2694,2695,2698],{"class":630,"line":773},[628,2696,2697],{"class":1442},"    return",[628,2699,836],{"class":634},[628,2701,2702,2705,2707],{"class":630,"line":824},[628,2703,2704],{"class":634},"      ...",[628,2706,645],{"class":1142},[628,2708,663],{"class":634},[628,2710,2711,2714,2716],{"class":630,"line":839},[628,2712,2713],{"class":1152},"      custom",[628,2715,651],{"class":634},[628,2717,836],{"class":634},[628,2719,2720,2723,2725,2727,2729],{"class":630,"line":861},[628,2721,2722],{"class":634},"        ...",[628,2724,645],{"class":1142},[628,2726,1013],{"class":634},[628,2728,964],{"class":1142},[628,2730,663],{"class":634},[628,2732,2733,2736,2738,2740],{"class":630,"line":876},[628,2734,2735],{"class":1152},"        schemaVersion",[628,2737,651],{"class":634},[628,2739,1570],{"class":699},[628,2741,663],{"class":634},[628,2743,2744],{"class":630,"line":891},[628,2745,2746],{"class":634},"      },\n",[628,2748,2749],{"class":630,"line":906},[628,2750,2751],{"class":634},"    }\n",[628,2753,2754],{"class":630,"line":929},[628,2755,932],{"class":634},[628,2757,2758,2760],{"class":630,"line":935},[628,2759,1425],{"class":634},[628,2761,1428],{"class":1142},[614,2763,2764,2765,2767,2768,2770],{},"The hook cannot bypass sanitization rules, and strings still require ",[625,2766,1070],{},". Server-side ",[625,2769,2383],{}," stays the source of truth.",[614,2772,2773,2776,2777,2780,2781,1013],{},[1000,2774,2775],{},"Namespaced keys."," An optional ",[625,2778,2779],{},"acme.product"," convention for multi-tool endpoints without prefix collisions. Would be documented in disclosure as ",[625,2782,2783],{},"acme.product: cli | action",[614,2785,2786,2787,2789],{},"If you need one of these before v2 lands, open a discussion on the repo. The v1 path (",[625,2788,964],{}," + server mapping) covers most product analytics needs.",[609,2791,2793],{"id":2792},"privacy","Privacy",[614,2795,2796,2797,2800,2801,2804],{},"Raw ",[625,2798,2799],{},"argv"," is never read. Sanitization applies to ",[1000,2802,2803],{},"citty-parsed"," flags only:",[1078,2806,2807,2820,2834],{},[1081,2808,2809,2812,2813,2816,2817,1795],{},[1000,2810,2811],{},"Booleans \u002F numbers"," → value stored (",[625,2814,2815],{},"json: true",", ",[625,2818,2819],{},"limit: 50",[1081,2821,2822,2825,2826,1086,2828,2831,2832],{},[1000,2823,2824],{},"Strings"," → ",[625,2827,2533],{},[625,2829,2830],{},"output: \"\u003Cset>\"",") unless allowlisted in ",[625,2833,1051],{},[1081,2835,2836,2840,2841,2843],{},[1000,2837,2838],{},[625,2839,1066],{}," → numbers and booleans always; strings only via ",[625,2842,1070],{}," (undeclared values are dropped at runtime, never thrown)",[618,2845,2847],{"className":1128,"code":2846,"filename":1130,"language":1131,"meta":623,"style":623},"collect: {\n  flags: { format: ['json', 'csv'] },           \u002F\u002F --format json → \"json\"; --format yaml → \"\u003Cset>\"\n  fields: { framework: ['nuxt', 'next'] },      \u002F\u002F telemetry.set({ framework: 'nuxt' }) ok\n}\n",[625,2848,2849,2857,2896,2933],{"__ignoreMap":623},[628,2850,2851,2853,2855],{"class":630,"line":631},[628,2852,1108],{"class":743},[628,2854,651],{"class":634},[628,2856,836],{"class":634},[628,2858,2859,2862,2864,2866,2869,2871,2873,2875,2877,2879,2881,2883,2886,2888,2890,2893],{"class":630,"line":638},[628,2860,2861],{"class":743},"  flags",[628,2863,651],{"class":634},[628,2865,738],{"class":634},[628,2867,2868],{"class":743}," format",[628,2870,651],{"class":634},[628,2872,1226],{"class":1152},[628,2874,1164],{"class":634},[628,2876,1231],{"class":657},[628,2878,1164],{"class":634},[628,2880,803],{"class":634},[628,2882,1158],{"class":634},[628,2884,2885],{"class":657},"csv",[628,2887,1164],{"class":634},[628,2889,1758],{"class":1152},[628,2891,2892],{"class":634},"},",[628,2894,2895],{"class":925},"           \u002F\u002F --format json → \"json\"; --format yaml → \"\u003Cset>\"\n",[628,2897,2898,2901,2903,2905,2908,2910,2912,2914,2916,2918,2920,2922,2924,2926,2928,2930],{"class":630,"line":666},[628,2899,2900],{"class":743},"  fields",[628,2902,651],{"class":634},[628,2904,738],{"class":634},[628,2906,2907],{"class":743}," framework",[628,2909,651],{"class":634},[628,2911,1226],{"class":1152},[628,2913,1164],{"class":634},[628,2915,1388],{"class":657},[628,2917,1164],{"class":634},[628,2919,803],{"class":634},[628,2921,1158],{"class":634},[628,2923,1397],{"class":657},[628,2925,1164],{"class":634},[628,2927,1758],{"class":1152},[628,2929,2892],{"class":634},[628,2931,2932],{"class":925},"      \u002F\u002F telemetry.set({ framework: 'nuxt' }) ok\n",[628,2934,2935],{"class":630,"line":687},[628,2936,991],{"class":634},[614,2938,2939,2940,2942],{},"Three kinds of parser noise are dropped before the event is built, so ",[625,2941,731],{}," reads\nas what the user asked for rather than what the parser filled in:",[1078,2944,2945,2955,2965],{},[1081,2946,2947,2950,2951,2954],{},[1000,2948,2949],{},"Positionals",": citty's ",[625,2952,2953],{},"_"," bucket holds argument values, not flag names",[1081,2956,2957,2960,2961,2964],{},[1000,2958,2959],{},"Defaults",": a flag still sitting at its declared ",[625,2962,2963],{},"default"," is not a choice anyone made",[1081,2966,2967,2970,2971,2974,2975,2978,2979,2982,2983,2985],{},[1000,2968,2969],{},"Kebab-case duplicates",": ",[625,2972,2973],{},"--min-score"," arrives as both ",[625,2976,2977],{},"minScore"," and ",[625,2980,2981],{},"min-score","; only the camelCase name is kept, and that is the name ",[625,2984,1051],{}," allowlists",[614,2987,2988,2989,2992,2993,2996,2997,1013],{},"Negation still reports: ",[625,2990,2991],{},"--no-write"," against ",[625,2994,2995],{},"write: { default: true }"," records ",[625,2998,2999],{},"write: false",[614,3001,3002,3003,1121,3005,3007,3008,3010],{},"Declare allowlists in the same ",[625,3004,1120],{},[625,3006,1124],{}," call as ",[625,3009,1108],{},", with no separate config file.",[609,3012,3014],{"id":3013},"disclosure","Disclosure",[614,3016,3017,3020,3021,3023,3024,3026],{},[625,3018,3019],{},"generateDisclosure()"," produces markdown + JSON from the standard envelope plus your ",[625,3022,1108],{}," extensions. Commit the output (e.g. ",[625,3025,2307],{},") so it stays in sync with releases:",[618,3028,3031],{"className":1128,"code":3029,"filename":3030,"language":1131,"meta":623,"style":623},"import { writeFile } from 'node:fs\u002Fpromises'\nimport { generateDisclosure } from '@evlog\u002Ftelemetry'\n\nconst { markdown } = generateDisclosure('my-tool', {\n  flags: { format: ['json', 'csv'] },\n})\n\nawait writeFile('TELEMETRY.md', markdown)\n","scripts\u002Fgenerate-disclosure.ts",[625,3032,3033,3053,3072,3076,3103,3136,3142,3146],{"__ignoreMap":623},[628,3034,3035,3037,3039,3042,3044,3046,3048,3051],{"class":630,"line":631},[628,3036,1635],{"class":1442},[628,3038,738],{"class":634},[628,3040,3041],{"class":1142}," writeFile",[628,3043,1643],{"class":634},[628,3045,1646],{"class":1442},[628,3047,1158],{"class":634},[628,3049,3050],{"class":657},"node:fs\u002Fpromises",[628,3052,1654],{"class":634},[628,3054,3055,3057,3059,3062,3064,3066,3068,3070],{"class":630,"line":638},[628,3056,1635],{"class":1442},[628,3058,738],{"class":634},[628,3060,3061],{"class":1142}," generateDisclosure",[628,3063,1643],{"class":634},[628,3065,1646],{"class":1442},[628,3067,1158],{"class":634},[628,3069,1093],{"class":657},[628,3071,1654],{"class":634},[628,3073,3074],{"class":630,"line":666},[628,3075,1660],{"emptyLinePlaceholder":1659},[628,3077,3078,3080,3082,3085,3087,3089,3091,3093,3095,3097,3099,3101],{"class":630,"line":687},[628,3079,1665],{"class":644},[628,3081,738],{"class":634},[628,3083,3084],{"class":1142}," markdown ",[628,3086,1425],{"class":634},[628,3088,1484],{"class":634},[628,3090,3061],{"class":1138},[628,3092,1453],{"class":1142},[628,3094,1164],{"class":634},[628,3096,798],{"class":657},[628,3098,1164],{"class":634},[628,3100,803],{"class":634},[628,3102,836],{"class":634},[628,3104,3105,3107,3109,3111,3113,3115,3117,3119,3121,3123,3125,3127,3129,3131,3133],{"class":630,"line":705},[628,3106,2861],{"class":1152},[628,3108,651],{"class":634},[628,3110,738],{"class":634},[628,3112,2868],{"class":1152},[628,3114,651],{"class":634},[628,3116,1226],{"class":1142},[628,3118,1164],{"class":634},[628,3120,1231],{"class":657},[628,3122,1164],{"class":634},[628,3124,803],{"class":634},[628,3126,1158],{"class":634},[628,3128,2885],{"class":657},[628,3130,1164],{"class":634},[628,3132,1758],{"class":1142},[628,3134,3135],{"class":634},"},\n",[628,3137,3138,3140],{"class":630,"line":726},[628,3139,1425],{"class":634},[628,3141,1428],{"class":1142},[628,3143,3144],{"class":630,"line":773},[628,3145,1660],{"emptyLinePlaceholder":1659},[628,3147,3148,3150,3152,3154,3156,3158,3160,3162],{"class":630,"line":824},[628,3149,1443],{"class":1442},[628,3151,3041],{"class":1138},[628,3153,1453],{"class":1142},[628,3155,1164],{"class":634},[628,3157,2307],{"class":657},[628,3159,1164],{"class":634},[628,3161,803],{"class":634},[628,3163,3164],{"class":1142}," markdown)\n",[614,3166,3167,3168,3171,3172,1013],{},"Users can also read it at runtime via ",[625,3169,3170],{},"my-tool telemetry status"," when you wire ",[625,3173,3174],{},"defineTelemetryCommands()",[609,3176,3178],{"id":3177},"consent-and-reliability","Consent and reliability",[614,3180,3181,1604,3184,2825,3187,3190,3191,1121,3194,3197],{},[1000,3182,3183],{},"Opt-out priority:",[625,3185,3186],{},"DO_NOT_TRACK=1",[625,3188,3189],{},"EVLOG_TELEMETRY=0"," → persisted preference (",[625,3192,3193],{},"disableTelemetry()",[625,3195,3196],{},"telemetry disable","). Opt-out purges the undelivered outbox.",[614,3199,3200,3203,3204,3207],{},[1000,3201,3202],{},"Never harms the host:"," telemetry never throws, never blocks exit; ",[625,3205,3206],{},"flush()"," has a 500ms hard cap.",[614,3209,3210,3213,3214,1013],{},[1000,3211,3212],{},"Outbox:"," events append locally before any network attempt. Offline machines and CI matrix jobs drain the backlog on the next invocation once your ingestion endpoint returns ",[625,3215,3216],{},"2xx",[614,3218,3219,1604,3222,3225,3226,3229],{},[1000,3220,3221],{},"Endpoint:",[625,3223,3224],{},"EVLOG_TELEMETRY_ENDPOINT"," env → ",[625,3227,3228],{},"endpoint"," option baked into the CLI. Omit both during local development; ship the URL when your ingest handler is live.",[3231,3232,3233],"style",{},"html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":623,"searchDepth":638,"depth":638,"links":3235},[3236,3237,3247,3248,3249],{"id":611,"depth":638,"text":612},{"id":994,"depth":638,"text":995,"children":3238},[3239,3240,3241,3242,3244,3245,3246],{"id":1113,"depth":666,"text":1114},{"id":1620,"depth":666,"text":1621},{"id":1905,"depth":666,"text":1906},{"id":2210,"depth":666,"text":3243},"Version breaking changes in custom",{"id":2314,"depth":666,"text":2315},{"id":2462,"depth":666,"text":2463},{"id":2576,"depth":666,"text":2577},{"id":2792,"depth":638,"text":2793},{"id":3013,"depth":638,"text":3014},{"id":3177,"depth":638,"text":3178},"RunEvent envelope, extending the schema with collect and custom fields, privacy rules, TELEMETRY.md disclosure, and consent \u002F outbox reliability.","md",[3253,3256,3257],{"label":41,"icon":44,"to":423,"color":3254,"variant":3255},"neutral","subtle",{"label":426,"icon":429,"to":427,"color":3254,"variant":3255},{"label":431,"icon":434,"to":432,"color":3254,"variant":3255},{},{"title":436,"icon":84},{"title":604,"description":3250},"9QIMa3arrtXM1ogwvMDBj2bkaTzJC1sft1nHE9vGiwU",[3263,3265],{"title":431,"path":432,"stem":433,"description":3264,"icon":434,"children":-1},"Build the ingestion endpoint for @evlog\u002Ftelemetry: the threat model, parseIngestBody validation, framework routes, storage, and rate limiting.",{"title":440,"path":441,"stem":442,"description":3266,"icon":443,"children":-1},"Add derived context to every wide event, from user agent and geo to your own computed fields.",1791060986160]