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