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