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