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