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