[{"data":1,"prerenderedAt":6919},["ShallowReactive",2],{"navigation_docs":3,"-use-cases-telemetry":447,"-use-cases-telemetry-surround":6914},[4,30,80,245,361,416],{"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,353,358],{"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":349,"path":350,"stem":351,"icon":352},"Enrichers","\u002Fuse-cases\u002Fenrichers","4.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":354,"path":355,"stem":356,"icon":357},"eve","\u002Fuse-cases\u002Feve","4.use-cases\u002F5.eve","i-custom-eve",{"title":284,"path":359,"stem":360,"icon":315},"\u002Fuse-cases\u002Ftelemetry","4.use-cases\u002F6.telemetry",{"title":362,"path":363,"stem":364,"children":365,"page":29},"Extend","\u002Fextend","5.extend",[366,370,375,380,385,389,393,397,401,406,411],{"title":36,"path":367,"stem":368,"icon":369},"\u002Fextend\u002Foverview","5.extend\u002F0.overview","i-lucide-blocks",{"title":371,"path":372,"stem":373,"icon":374},"Stream","\u002Fextend\u002Fstream","5.extend\u002F1.stream","i-lucide-radio-tower",{"title":376,"path":377,"stem":378,"icon":379},"Custom framework","\u002Fextend\u002Fcustom-framework","5.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":381,"path":382,"stem":383,"icon":384},"FS reader","\u002Fextend\u002Ffs-reader","5.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":345,"path":386,"stem":387,"icon":388},"\u002Fextend\u002Fconsumer-recipes","5.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":390,"path":391,"stem":392,"icon":369},"Plugins","\u002Fextend\u002Fplugins","5.extend\u002F4.plugins",{"title":394,"path":395,"stem":396,"icon":352},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","5.extend\u002F5.custom-enrichers",{"title":398,"path":399,"stem":400,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","5.extend\u002F6.tail-sampling",{"title":402,"path":403,"stem":404,"icon":405},"Identity headers","\u002Fextend\u002Fidentity-headers","5.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":407,"path":408,"stem":409,"icon":410},"Custom drains","\u002Fextend\u002Fcustom-drains","5.extend\u002F8.custom-drains","i-lucide-share-2",{"title":412,"path":413,"stem":414,"icon":415},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","5.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":417,"path":418,"stem":419,"children":420,"page":29},"Reference","\u002Freference","6.reference",[421,426,429,434,438,443],{"title":422,"path":423,"stem":424,"icon":425},"Configuration","\u002Freference\u002Fconfiguration","6.reference\u002F1.configuration","i-lucide-settings",{"title":312,"path":427,"stem":428,"icon":315},"\u002Freference\u002Fperformance","6.reference\u002F2.performance",{"title":430,"path":431,"stem":432,"icon":433},"Vite Plugin","\u002Freference\u002Fvite-plugin","6.reference\u002F3.vite-plugin","i-custom-vite",{"title":435,"path":436,"stem":437,"icon":318},"Best Practices","\u002Freference\u002Fbest-practices","6.reference\u002F4.best-practices",{"title":439,"path":440,"stem":441,"icon":442},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","6.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":444,"path":445,"stem":446,"icon":352},"Agent Skills","\u002Freference\u002Fagent-skills","6.reference\u002F6.agent-skills",{"id":448,"title":449,"body":450,"description":6905,"extension":6906,"links":6907,"meta":6910,"navigation":6911,"path":359,"seo":6912,"stem":360,"__hash__":6913},"docs\u002F4.use-cases\u002F6.telemetry.md","Tool telemetry",{"type":451,"value":452,"toc":6866},"minimark",[453,474,499,510,666,671,686,694,697,701,704,784,836,855,859,870,877,882,889,894,905,910,921,1008,1014,1026,1032,1043,1245,1264,1268,1275,2209,2213,2219,2527,2531,2540,2550,2554,2571,2998,3002,3011,3120,3130,3134,3139,3678,3692,3744,3751,3946,3950,3960,4152,4176,4332,4336,4339,4434,4438,4453,4456,4503,4506,4534,4538,4546,4828,4831,4974,4983,5003,5007,5010,5255,5263,5267,5273,5555,5564,5570,5578,5656,5665,5669,5674,5811,5815,5909,5923,5927,5930,5939,6107,6116,6129,6135,6139,6149,6185,6275,6286,6290,6301,6438,6447,6451,6469,6478,6486,6497,6501,6537,6540,6544,6547,6551,6626,6630,6715,6721,6725,6768,6772,6775,6820,6823,6845,6849,6862],[454,455,456,460,461,468,469,473],"p",{},[457,458,459],"code",{},"@evlog\u002Ftelemetry"," brings ",[462,463,467],"a",{"href":464,"rel":465},"https:\u002F\u002Fevlog.dev",[466],"nofollow","evlog","'s wide-event model to tools that run on other people's machines — CLIs, GitHub Actions, dev scripts, and CI jobs. Same philosophy as HTTP logging: ",[470,471,472],"strong",{},"one command execution → one structured event",", not a stream of analytics calls.",[475,476,481],"pre",{"className":477,"code":478,"language":479,"meta":480,"style":480},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add @evlog\u002Ftelemetry\n","bash","",[457,482,483],{"__ignoreMap":480},[484,485,488,492,496],"span",{"class":486,"line":487},"line",1,[484,489,491],{"class":490},"sBMFI","pnpm",[484,493,495],{"class":494},"sfazB"," add",[484,497,498],{"class":494}," @evlog\u002Ftelemetry\n",[454,500,501,502,505,506,509],{},"You get command name, sanitized flags, duration, and outcome automatically. Call ",[457,503,504],{},"telemetry.set()"," only when you have extra counters — numbers and booleans by default. Raw ",[457,507,508],{},"argv"," is never read; disclosure is generated from your runtime config so it cannot drift from what you actually collect.",[511,512,515,518,659],"prompt",{":actions":513,"description":514,"icon":315},"[\"copy\",\"cursor\",\"windsurf\"]","Add anonymous telemetry to my CLI or script",[454,516,517],{},"Add privacy-respecting telemetry to my CLI, script, or GitHub Action with @evlog\u002Ftelemetry.",[519,520,521,537,543,557,567,585,595,604,610,621,632],"ul",{},[522,523,524,525,528,529,532,533,536],"li",{},"Detect my entrypoint: citty CLI (",[457,526,527],{},"withTelemetry","), standalone script (",[457,530,531],{},"createTelemetry","), or GitHub Actions (",[457,534,535],{},"createGitHubActionsTelemetry",")",[522,538,539,540],{},"Install: ",[457,541,542],{},"pnpm add @evlog\u002Ftelemetry",[522,544,545,546,549,550,553,554],{},"Citty: wrap the root command in ",[457,547,548],{},"withTelemetry()"," in ",[457,551,552],{},"src\u002Findex.ts"," and add ",[457,555,556],{},"defineTelemetryCommands({ name: TOOL })",[522,558,559,560,563,564],{},"Script \u002F migrator: ",[457,561,562],{},"createTelemetry({ name, version })"," and wrap each logical unit with ",[457,565,566],{},"t.run('command', fn)",[522,568,569,570,573,574,577,578,581,582],{},"GitHub Actions: ",[457,571,572],{},"createGitHubActionsTelemetry()"," — only ",[457,575,576],{},"GITHUB_ACTION"," \u002F ",[457,579,580],{},"GITHUB_EVENT_NAME"," are injected into ",[457,583,584],{},"custom",[522,586,587,588,577,591,594],{},"Declare ",[457,589,590],{},"collect.flags",[457,592,593],{},"collect.fields"," for any string values you need beyond presence-only capture",[522,596,597,598,600,601,603],{},"Put your product schema in ",[457,599,584],{}," via ",[457,602,504],{}," — see \"Extending the schema\" on the docs page",[522,605,606,607,609],{},"Call ",[457,608,504],{}," for business counters (numbers\u002Fbooleans) inside handlers or helpers on the same async stack",[522,611,612,613,616,617,620],{},"Run ",[457,614,615],{},"generateDisclosure()"," and commit ",[457,618,619],{},"TELEMETRY.md"," beside the tool",[522,622,623,624,627,628,631],{},"Bake an ingestion URL in ",[457,625,626],{},"endpoint"," (or ",[457,629,630],{},"EVLOG_TELEMETRY_ENDPOINT",") — the local outbox is a buffer, not the destination",[522,633,634,635,638,639,642,643,646,647,650,651,654,655,658],{},"Ship ",[457,636,637],{},"POST \u002Fapi\u002Ftelemetry\u002Fingest"," on my app: use ",[457,640,641],{},"parseIngestBody()"," from ",[457,644,645],{},"@evlog\u002Ftelemetry\u002Fingest"," with ",[457,648,649],{},"allowedTools"," + ",[457,652,653],{},"allowedCustomKeys",", dedupe on ",[457,656,657],{},"idempotencyKey",", return 204 on success",[454,660,661,662],{},"Docs: ",[462,663,664],{"href":664,"rel":665},"https:\u002F\u002Fwww.evlog.dev\u002Fuse-cases\u002Ftelemetry",[466],[667,668,670],"h2",{"id":669},"from-cli-to-your-backend","From CLI to your backend",[454,672,673,674,677,678,681,682,685],{},"The disk outbox (",[457,675,676],{},"~\u002F.config\u002F{toolName}\u002Ftelemetry\u002Foutbox.ndjson",") is a ",[470,679,680],{},"reliability buffer",", not where telemetry lives long-term. Each run appends one event locally, then the HTTP drain POSTs the backlog to ",[470,683,684],{},"your"," ingestion endpoint. Short-lived CI jobs and offline machines drain on the next invocation.",[475,687,692],{"className":688,"code":690,"language":691,"meta":480},[689],"language-text","my-tool doctor\n     │\n     ▼\n┌─────────────────────────────────────────┐\n│  @evlog\u002Ftelemetry (on the user's machine) │\n│  sanitize flags · consent · one RunEvent   │\n└─────────────────────────────────────────┘\n     │ append (always)\n     ▼\n  outbox.ndjson          POST { events: RunEvent[] }\n     │ flush ───────────────────────────────►  your \u002Fapi\u002Ftelemetry\u002Fingest\n     │                                              │\n     │                                              ▼\n     │                                    validate · allowlist · dedupe\n     │                                              │\n     │                                              ▼\n     │                                    DB · warehouse · evlog drain\n     ▼\n  remove delivered keys on 2xx\n","text",[457,693,690],{"__ignoreMap":480},[454,695,696],{},"Nothing is sent until you configure an endpoint and the server returns a success status. Until then, events stay in the outbox (or are purged on opt-out).",[667,698,700],{"id":699},"configure-delivery","Configure delivery",[454,702,703],{},"Point the CLI at your ingestion URL when you ship it — baked into the binary, overridable per environment:",[475,705,709],{"className":706,"code":707,"filename":552,"language":708,"meta":480,"style":480},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","withTelemetry(command, {\n  name: TOOL,\n  version: VERSION,\n  endpoint: 'https:\u002F\u002Ftelemetry.my-tool.dev\u002Fapi\u002Ftelemetry\u002Fingest',\n})\n","ts",[457,710,711,727,743,756,775],{"__ignoreMap":480},[484,712,713,716,720,724],{"class":486,"line":487},[484,714,527],{"class":715},"s2Zo4",[484,717,719],{"class":718},"sTEyZ","(command",[484,721,723],{"class":722},"sMK4o",",",[484,725,726],{"class":722}," {\n",[484,728,730,734,737,740],{"class":486,"line":729},2,[484,731,733],{"class":732},"swJcz","  name",[484,735,736],{"class":722},":",[484,738,739],{"class":718}," TOOL",[484,741,742],{"class":722},",\n",[484,744,746,749,751,754],{"class":486,"line":745},3,[484,747,748],{"class":732},"  version",[484,750,736],{"class":722},[484,752,753],{"class":718}," VERSION",[484,755,742],{"class":722},[484,757,759,762,764,767,770,773],{"class":486,"line":758},4,[484,760,761],{"class":732},"  endpoint",[484,763,736],{"class":722},[484,765,766],{"class":722}," '",[484,768,769],{"class":494},"https:\u002F\u002Ftelemetry.my-tool.dev\u002Fapi\u002Ftelemetry\u002Fingest",[484,771,772],{"class":722},"'",[484,774,742],{"class":722},[484,776,778,781],{"class":486,"line":777},5,[484,779,780],{"class":722},"}",[484,782,783],{"class":718},")\n",[785,786,787,800],"table",{},[788,789,790],"thead",{},[791,792,793,797],"tr",{},[794,795,796],"th",{},"Override",[794,798,799],{},"Effect",[801,802,803,813,826],"tbody",{},[791,804,805,810],{},[806,807,808],"td",{},[457,809,630],{},[806,811,812],{},"Replaces the baked-in URL (staging, self-hosted)",[791,814,815,823],{},[806,816,817,577,820],{},[457,818,819],{},"EVLOG_TELEMETRY=0",[457,821,822],{},"DO_NOT_TRACK=1",[806,824,825],{},"No recording, no send",[791,827,828,833],{},[806,829,830],{},[457,831,832],{},"EVLOG_TELEMETRY_DEBUG=1",[806,834,835],{},"Print payloads to stderr without sending",[454,837,838,839,842,843,846,847,850,851,854],{},"The built-in HTTP drain POSTs ",[457,840,841],{},"Content-Type: application\u002Fjson"," with body ",[457,844,845],{},"{ events: RunEvent[] }"," and a 400ms timeout. On success (",[457,848,849],{},"res.ok","), delivered keys are removed from the outbox. ",[457,852,853],{},"flush()"," is capped at 500ms and never throws.",[667,856,858],{"id":857},"build-an-ingestion-endpoint","Build an ingestion endpoint",[454,860,861,862,866,867,869],{},"You ship a CLI. Users run it on their machines. You want to know ",[863,864,865],"em",{},"which commands run, how often they fail, and which versions are out there"," — without building a separate analytics SDK or reading raw ",[457,868,508],{},".",[454,871,872,873,876],{},"That means a ",[470,874,875],{},"server endpoint"," your CLI POSTs to. The local outbox is only there so short CI jobs and offline runs do not lose data before the POST succeeds.",[878,879,881],"h3",{"id":880},"the-security-question-read-this-first","The security question (read this first)",[883,884,885,888],"tip",{},[470,886,887],{},"CLI telemetry is not a vault."," You are collecting anonymous usage counters (command name, duration, outcome, a few numbers) — not passwords, not file paths, not tokens. Design for that threat model and you do not need impossible client-side secrets.",[454,890,891],{},[470,892,893],{},"\"I put the ingest URL in my CLI — isn't that a secret?\"",[454,895,896,897,900,901,904],{},"No. The URL lives in your npm package or binary. Anyone can read it with ",[457,898,899],{},"strings",", by installing the package, or by watching network traffic. The same applies to an API key or ",[457,902,903],{},"Authorization"," header baked into the CLI — extractable, not a real barrier.",[454,906,907],{},[470,908,909],{},"\"So can't anyone send fake events?\"",[454,911,912,913,916,917,920],{},"In theory, yes — someone could ",[457,914,915],{},"curl"," your endpoint with forged JSON. That is why you treat the endpoint as ",[470,918,919],{},"semi-public"," (like a browser analytics key) and defend on the server:",[785,922,923,933],{},[788,924,925],{},[791,926,927,930],{},[794,928,929],{},"What you might worry about",[794,931,932],{},"Practical answer",[801,934,935,946,958,969,983,994],{},[791,936,937,940],{},[806,938,939],{},"Random internet bots",[806,941,942,943],{},"Validate the payload shape; reject garbage with ",[457,944,945],{},"400",[791,947,948,955],{},[806,949,950,951,954],{},"Someone spamming fake ",[457,952,953],{},"doctor"," runs",[806,956,957],{},"Rate-limit by IP; data is low-value counters, not money",[791,959,960,966],{},[806,961,962,963],{},"Forged ",[457,964,965],{},"tool.name",[806,967,968],{},"Allowlist only your published tool names server-side",[791,970,971,976],{},[806,972,973,974],{},"Unexpected fields in ",[457,975,584],{},[806,977,978,979,982],{},"Filter to the keys you declared — same list as ",[457,980,981],{},"collect"," on the CLI",[791,984,985,988],{},[806,986,987],{},"Double-counting on retry",[806,989,990,991,993],{},"Dedupe on ",[457,992,657],{}," when storing",[791,995,996,999],{},[806,997,998],{},"Leaking user secrets",[806,1000,1001,1002,1004,1005,1007],{},"CLI never reads raw ",[457,1003,508],{},"; you only allowlisted flags and ",[457,1006,504],{}," counters",[454,1009,1010,1013],{},[470,1011,1012],{},"What \"good enough\" looks like:"," validate every POST, store idempotently, rate-limit at the edge (CDN, API gateway, or middleware), and keep the payload boring (no PII by design). That is the same playbook as client-side analytics — not banking-grade auth, but reliable product insight.",[1015,1016,1018,1020,1021,1025],"callout",{"color":1017,"icon":318},"info",[457,1019,459],{}," ships ",[470,1022,1023],{},[457,1024,641],{}," for your server — the same validation rules documented here, so you do not copy-paste a validator from the docs. Pair it with your framework route and your database or evlog drain.",[878,1027,1029,1030],{"id":1028},"step-1-validate-with-parseingestbody","Step 1 — Validate with ",[457,1031,641],{},[454,1033,1034,1035,1038,1039,577,1041,869],{},"Mirror the CLI config on the server: same ",[457,1036,1037],{},"name",", same custom keys you allow via ",[457,1040,981],{},[457,1042,504],{},[475,1044,1047],{"className":706,"code":1045,"filename":1046,"language":708,"meta":480,"style":480},"import { parseIngestBody } from '@evlog\u002Ftelemetry\u002Fingest'\n\nexport const ingestOptions = {\n  allowedTools: ['my-tool'],\n  allowedCustomKeys: {\n    'my-tool': ['checksFailed', 'checksWarn', 'itemsSynced'],\n  },\n} as const\n\nexport function parseTelemetryBody(raw: string) {\n  return parseIngestBody(raw, ingestOptions)\n}\n","lib\u002Ftelemetry-ingest.ts",[457,1048,1049,1074,1080,1097,1119,1128,1171,1177,1188,1193,1220,1239],{"__ignoreMap":480},[484,1050,1051,1055,1058,1061,1064,1067,1069,1071],{"class":486,"line":487},[484,1052,1054],{"class":1053},"s7zQu","import",[484,1056,1057],{"class":722}," {",[484,1059,1060],{"class":718}," parseIngestBody",[484,1062,1063],{"class":722}," }",[484,1065,1066],{"class":1053}," from",[484,1068,766],{"class":722},[484,1070,645],{"class":494},[484,1072,1073],{"class":722},"'\n",[484,1075,1076],{"class":486,"line":729},[484,1077,1079],{"emptyLinePlaceholder":1078},true,"\n",[484,1081,1082,1085,1089,1092,1095],{"class":486,"line":745},[484,1083,1084],{"class":1053},"export",[484,1086,1088],{"class":1087},"spNyl"," const",[484,1090,1091],{"class":718}," ingestOptions ",[484,1093,1094],{"class":722},"=",[484,1096,726],{"class":722},[484,1098,1099,1102,1104,1107,1109,1112,1114,1117],{"class":486,"line":758},[484,1100,1101],{"class":732},"  allowedTools",[484,1103,736],{"class":722},[484,1105,1106],{"class":718}," [",[484,1108,772],{"class":722},[484,1110,1111],{"class":494},"my-tool",[484,1113,772],{"class":722},[484,1115,1116],{"class":718},"]",[484,1118,742],{"class":722},[484,1120,1121,1124,1126],{"class":486,"line":777},[484,1122,1123],{"class":732},"  allowedCustomKeys",[484,1125,736],{"class":722},[484,1127,726],{"class":722},[484,1129,1131,1134,1136,1138,1140,1142,1144,1147,1149,1151,1153,1156,1158,1160,1162,1165,1167,1169],{"class":486,"line":1130},6,[484,1132,1133],{"class":722},"    '",[484,1135,1111],{"class":732},[484,1137,772],{"class":722},[484,1139,736],{"class":722},[484,1141,1106],{"class":718},[484,1143,772],{"class":722},[484,1145,1146],{"class":494},"checksFailed",[484,1148,772],{"class":722},[484,1150,723],{"class":722},[484,1152,766],{"class":722},[484,1154,1155],{"class":494},"checksWarn",[484,1157,772],{"class":722},[484,1159,723],{"class":722},[484,1161,766],{"class":722},[484,1163,1164],{"class":494},"itemsSynced",[484,1166,772],{"class":722},[484,1168,1116],{"class":718},[484,1170,742],{"class":722},[484,1172,1174],{"class":486,"line":1173},7,[484,1175,1176],{"class":722},"  },\n",[484,1178,1180,1182,1185],{"class":486,"line":1179},8,[484,1181,780],{"class":722},[484,1183,1184],{"class":1053}," as",[484,1186,1187],{"class":1087}," const\n",[484,1189,1191],{"class":486,"line":1190},9,[484,1192,1079],{"emptyLinePlaceholder":1078},[484,1194,1196,1198,1201,1204,1207,1211,1213,1216,1218],{"class":486,"line":1195},10,[484,1197,1084],{"class":1053},[484,1199,1200],{"class":1087}," function",[484,1202,1203],{"class":715}," parseTelemetryBody",[484,1205,1206],{"class":722},"(",[484,1208,1210],{"class":1209},"sHdIc","raw",[484,1212,736],{"class":722},[484,1214,1215],{"class":490}," string",[484,1217,536],{"class":722},[484,1219,726],{"class":722},[484,1221,1223,1226,1228,1230,1232,1234,1237],{"class":486,"line":1222},11,[484,1224,1225],{"class":1053},"  return",[484,1227,1060],{"class":715},[484,1229,1206],{"class":732},[484,1231,1210],{"class":718},[484,1233,723],{"class":722},[484,1235,1236],{"class":718}," ingestOptions",[484,1238,783],{"class":732},[484,1240,1242],{"class":486,"line":1241},12,[484,1243,1244],{"class":722},"}\n",[454,1246,1247,1249,1250,1253,1254,1256,1257,1260,1261,1263],{},[457,1248,641],{}," checks batch size, JSON shape, ",[457,1251,1252],{},"event: 'run'",", tool allowlist, envelope types, ISO timestamp, and strips ",[457,1255,584],{}," keys you did not declare. Throws ",[457,1258,1259],{},"IngestValidationError"," on failure — return ",[457,1262,945],{}," from your route.",[878,1265,1267],{"id":1266},"step-2-wire-your-route","Step 2 — Wire your route",[454,1269,1270,1271,1274],{},"Same contract for any framework — read the raw body, validate, store, return ",[470,1272,1273],{},"204"," so the CLI clears its outbox:",[1276,1277,1278,1647,1903],"code-group",{},[475,1279,1282],{"className":706,"code":1280,"filename":1281,"language":708,"meta":480,"style":480},"import { defineEventHandler, readRawBody, setResponseStatus } from 'h3'\nimport { IngestValidationError } from '@evlog\u002Ftelemetry\u002Fingest'\nimport { parseTelemetryBody } from '~\u002Flib\u002Ftelemetry-ingest'\nimport { storeRunEvents } from '~\u002Flib\u002Ftelemetry-store'\n\nexport default defineEventHandler(async (event) => {\n  const raw = await readRawBody(event, 'utf8')\n  if (!raw) {\n    setResponseStatus(event, 400)\n    return { error: 'empty body' }\n  }\n\n  try {\n    const events = parseTelemetryBody(raw)\n    await storeRunEvents(events)\n    setResponseStatus(event, 204)\n    return null\n  } catch (err) {\n    setResponseStatus(event, err instanceof IngestValidationError ? 400 : 500)\n    return { error: 'invalid payload' }\n  }\n})\n","server\u002Fapi\u002Ftelemetry\u002Fingest.post.ts (Nitro)",[457,1283,1284,1313,1332,1351,1371,1375,1402,1433,1451,1468,1490,1495,1499,1507,1526,1541,1557,1565,1583,1615,1635,1640],{"__ignoreMap":480},[484,1285,1286,1288,1290,1293,1295,1298,1300,1303,1305,1307,1309,1311],{"class":486,"line":487},[484,1287,1054],{"class":1053},[484,1289,1057],{"class":722},[484,1291,1292],{"class":718}," defineEventHandler",[484,1294,723],{"class":722},[484,1296,1297],{"class":718}," readRawBody",[484,1299,723],{"class":722},[484,1301,1302],{"class":718}," setResponseStatus",[484,1304,1063],{"class":722},[484,1306,1066],{"class":1053},[484,1308,766],{"class":722},[484,1310,878],{"class":494},[484,1312,1073],{"class":722},[484,1314,1315,1317,1319,1322,1324,1326,1328,1330],{"class":486,"line":729},[484,1316,1054],{"class":1053},[484,1318,1057],{"class":722},[484,1320,1321],{"class":718}," IngestValidationError",[484,1323,1063],{"class":722},[484,1325,1066],{"class":1053},[484,1327,766],{"class":722},[484,1329,645],{"class":494},[484,1331,1073],{"class":722},[484,1333,1334,1336,1338,1340,1342,1344,1346,1349],{"class":486,"line":745},[484,1335,1054],{"class":1053},[484,1337,1057],{"class":722},[484,1339,1203],{"class":718},[484,1341,1063],{"class":722},[484,1343,1066],{"class":1053},[484,1345,766],{"class":722},[484,1347,1348],{"class":494},"~\u002Flib\u002Ftelemetry-ingest",[484,1350,1073],{"class":722},[484,1352,1353,1355,1357,1360,1362,1364,1366,1369],{"class":486,"line":758},[484,1354,1054],{"class":1053},[484,1356,1057],{"class":722},[484,1358,1359],{"class":718}," storeRunEvents",[484,1361,1063],{"class":722},[484,1363,1066],{"class":1053},[484,1365,766],{"class":722},[484,1367,1368],{"class":494},"~\u002Flib\u002Ftelemetry-store",[484,1370,1073],{"class":722},[484,1372,1373],{"class":486,"line":777},[484,1374,1079],{"emptyLinePlaceholder":1078},[484,1376,1377,1379,1382,1384,1386,1389,1392,1395,1397,1400],{"class":486,"line":1130},[484,1378,1084],{"class":1053},[484,1380,1381],{"class":1053}," default",[484,1383,1292],{"class":715},[484,1385,1206],{"class":718},[484,1387,1388],{"class":1087},"async",[484,1390,1391],{"class":722}," (",[484,1393,1394],{"class":1209},"event",[484,1396,536],{"class":722},[484,1398,1399],{"class":1087}," =>",[484,1401,726],{"class":722},[484,1403,1404,1407,1410,1413,1416,1418,1420,1422,1424,1426,1429,1431],{"class":486,"line":1173},[484,1405,1406],{"class":1087},"  const",[484,1408,1409],{"class":718}," raw",[484,1411,1412],{"class":722}," =",[484,1414,1415],{"class":1053}," await",[484,1417,1297],{"class":715},[484,1419,1206],{"class":732},[484,1421,1394],{"class":718},[484,1423,723],{"class":722},[484,1425,766],{"class":722},[484,1427,1428],{"class":494},"utf8",[484,1430,772],{"class":722},[484,1432,783],{"class":732},[484,1434,1435,1438,1440,1443,1445,1448],{"class":486,"line":1179},[484,1436,1437],{"class":1053},"  if",[484,1439,1391],{"class":732},[484,1441,1442],{"class":722},"!",[484,1444,1210],{"class":718},[484,1446,1447],{"class":732},") ",[484,1449,1450],{"class":722},"{\n",[484,1452,1453,1456,1458,1460,1462,1466],{"class":486,"line":1190},[484,1454,1455],{"class":715},"    setResponseStatus",[484,1457,1206],{"class":732},[484,1459,1394],{"class":718},[484,1461,723],{"class":722},[484,1463,1465],{"class":1464},"sbssI"," 400",[484,1467,783],{"class":732},[484,1469,1470,1473,1475,1478,1480,1482,1485,1487],{"class":486,"line":1195},[484,1471,1472],{"class":1053},"    return",[484,1474,1057],{"class":722},[484,1476,1477],{"class":732}," error",[484,1479,736],{"class":722},[484,1481,766],{"class":722},[484,1483,1484],{"class":494},"empty body",[484,1486,772],{"class":722},[484,1488,1489],{"class":722}," }\n",[484,1491,1492],{"class":486,"line":1222},[484,1493,1494],{"class":722},"  }\n",[484,1496,1497],{"class":486,"line":1241},[484,1498,1079],{"emptyLinePlaceholder":1078},[484,1500,1502,1505],{"class":486,"line":1501},13,[484,1503,1504],{"class":1053},"  try",[484,1506,726],{"class":722},[484,1508,1510,1513,1516,1518,1520,1522,1524],{"class":486,"line":1509},14,[484,1511,1512],{"class":1087},"    const",[484,1514,1515],{"class":718}," events",[484,1517,1412],{"class":722},[484,1519,1203],{"class":715},[484,1521,1206],{"class":732},[484,1523,1210],{"class":718},[484,1525,783],{"class":732},[484,1527,1529,1532,1534,1536,1539],{"class":486,"line":1528},15,[484,1530,1531],{"class":1053},"    await",[484,1533,1359],{"class":715},[484,1535,1206],{"class":732},[484,1537,1538],{"class":718},"events",[484,1540,783],{"class":732},[484,1542,1544,1546,1548,1550,1552,1555],{"class":486,"line":1543},16,[484,1545,1455],{"class":715},[484,1547,1206],{"class":732},[484,1549,1394],{"class":718},[484,1551,723],{"class":722},[484,1553,1554],{"class":1464}," 204",[484,1556,783],{"class":732},[484,1558,1560,1562],{"class":486,"line":1559},17,[484,1561,1472],{"class":1053},[484,1563,1564],{"class":722}," null\n",[484,1566,1568,1571,1574,1576,1579,1581],{"class":486,"line":1567},18,[484,1569,1570],{"class":722},"  }",[484,1572,1573],{"class":1053}," catch",[484,1575,1391],{"class":732},[484,1577,1578],{"class":718},"err",[484,1580,1447],{"class":732},[484,1582,1450],{"class":722},[484,1584,1586,1588,1590,1592,1594,1597,1600,1602,1605,1607,1610,1613],{"class":486,"line":1585},19,[484,1587,1455],{"class":715},[484,1589,1206],{"class":732},[484,1591,1394],{"class":718},[484,1593,723],{"class":722},[484,1595,1596],{"class":718}," err",[484,1598,1599],{"class":722}," instanceof",[484,1601,1321],{"class":490},[484,1603,1604],{"class":722}," ?",[484,1606,1465],{"class":1464},[484,1608,1609],{"class":722}," :",[484,1611,1612],{"class":1464}," 500",[484,1614,783],{"class":732},[484,1616,1618,1620,1622,1624,1626,1628,1631,1633],{"class":486,"line":1617},20,[484,1619,1472],{"class":1053},[484,1621,1057],{"class":722},[484,1623,1477],{"class":732},[484,1625,736],{"class":722},[484,1627,766],{"class":722},[484,1629,1630],{"class":494},"invalid payload",[484,1632,772],{"class":722},[484,1634,1489],{"class":722},[484,1636,1638],{"class":486,"line":1637},21,[484,1639,1494],{"class":722},[484,1641,1643,1645],{"class":486,"line":1642},22,[484,1644,780],{"class":722},[484,1646,783],{"class":718},[475,1648,1651],{"className":706,"code":1649,"filename":1650,"language":708,"meta":480,"style":480},"import { IngestValidationError } from '@evlog\u002Ftelemetry\u002Fingest'\nimport { parseTelemetryBody } from '@\u002Flib\u002Ftelemetry-ingest'\nimport { storeRunEvents } from '@\u002Flib\u002Ftelemetry-store'\n\nexport async function POST(request: Request) {\n  const raw = await request.text()\n  try {\n    const events = parseTelemetryBody(raw)\n    await storeRunEvents(events)\n    return new Response(null, { status: 204 })\n  } catch (err) {\n    const status = err instanceof IngestValidationError ? 400 : 500\n    return Response.json({ error: 'invalid payload' }, { status })\n  }\n}\n","app\u002Fapi\u002Ftelemetry\u002Fingest\u002Froute.ts (Next.js App Router)",[457,1652,1653,1671,1690,1709,1713,1739,1759,1765,1781,1793,1821,1835,1858,1895,1899],{"__ignoreMap":480},[484,1654,1655,1657,1659,1661,1663,1665,1667,1669],{"class":486,"line":487},[484,1656,1054],{"class":1053},[484,1658,1057],{"class":722},[484,1660,1321],{"class":718},[484,1662,1063],{"class":722},[484,1664,1066],{"class":1053},[484,1666,766],{"class":722},[484,1668,645],{"class":494},[484,1670,1073],{"class":722},[484,1672,1673,1675,1677,1679,1681,1683,1685,1688],{"class":486,"line":729},[484,1674,1054],{"class":1053},[484,1676,1057],{"class":722},[484,1678,1203],{"class":718},[484,1680,1063],{"class":722},[484,1682,1066],{"class":1053},[484,1684,766],{"class":722},[484,1686,1687],{"class":494},"@\u002Flib\u002Ftelemetry-ingest",[484,1689,1073],{"class":722},[484,1691,1692,1694,1696,1698,1700,1702,1704,1707],{"class":486,"line":745},[484,1693,1054],{"class":1053},[484,1695,1057],{"class":722},[484,1697,1359],{"class":718},[484,1699,1063],{"class":722},[484,1701,1066],{"class":1053},[484,1703,766],{"class":722},[484,1705,1706],{"class":494},"@\u002Flib\u002Ftelemetry-store",[484,1708,1073],{"class":722},[484,1710,1711],{"class":486,"line":758},[484,1712,1079],{"emptyLinePlaceholder":1078},[484,1714,1715,1717,1720,1722,1725,1727,1730,1732,1735,1737],{"class":486,"line":777},[484,1716,1084],{"class":1053},[484,1718,1719],{"class":1087}," async",[484,1721,1200],{"class":1087},[484,1723,1724],{"class":715}," POST",[484,1726,1206],{"class":722},[484,1728,1729],{"class":1209},"request",[484,1731,736],{"class":722},[484,1733,1734],{"class":490}," Request",[484,1736,536],{"class":722},[484,1738,726],{"class":722},[484,1740,1741,1743,1745,1747,1749,1752,1754,1756],{"class":486,"line":1130},[484,1742,1406],{"class":1087},[484,1744,1409],{"class":718},[484,1746,1412],{"class":722},[484,1748,1415],{"class":1053},[484,1750,1751],{"class":718}," request",[484,1753,869],{"class":722},[484,1755,691],{"class":715},[484,1757,1758],{"class":732},"()\n",[484,1760,1761,1763],{"class":486,"line":1173},[484,1762,1504],{"class":1053},[484,1764,726],{"class":722},[484,1766,1767,1769,1771,1773,1775,1777,1779],{"class":486,"line":1179},[484,1768,1512],{"class":1087},[484,1770,1515],{"class":718},[484,1772,1412],{"class":722},[484,1774,1203],{"class":715},[484,1776,1206],{"class":732},[484,1778,1210],{"class":718},[484,1780,783],{"class":732},[484,1782,1783,1785,1787,1789,1791],{"class":486,"line":1190},[484,1784,1531],{"class":1053},[484,1786,1359],{"class":715},[484,1788,1206],{"class":732},[484,1790,1538],{"class":718},[484,1792,783],{"class":732},[484,1794,1795,1797,1800,1803,1805,1808,1810,1813,1815,1817,1819],{"class":486,"line":1195},[484,1796,1472],{"class":1053},[484,1798,1799],{"class":722}," new",[484,1801,1802],{"class":715}," Response",[484,1804,1206],{"class":732},[484,1806,1807],{"class":722},"null,",[484,1809,1057],{"class":722},[484,1811,1812],{"class":732}," status",[484,1814,736],{"class":722},[484,1816,1554],{"class":1464},[484,1818,1063],{"class":722},[484,1820,783],{"class":732},[484,1822,1823,1825,1827,1829,1831,1833],{"class":486,"line":1222},[484,1824,1570],{"class":722},[484,1826,1573],{"class":1053},[484,1828,1391],{"class":732},[484,1830,1578],{"class":718},[484,1832,1447],{"class":732},[484,1834,1450],{"class":722},[484,1836,1837,1839,1841,1843,1845,1847,1849,1851,1853,1855],{"class":486,"line":1241},[484,1838,1512],{"class":1087},[484,1840,1812],{"class":718},[484,1842,1412],{"class":722},[484,1844,1596],{"class":718},[484,1846,1599],{"class":722},[484,1848,1321],{"class":490},[484,1850,1604],{"class":722},[484,1852,1465],{"class":1464},[484,1854,1609],{"class":722},[484,1856,1857],{"class":1464}," 500\n",[484,1859,1860,1862,1864,1866,1869,1871,1874,1876,1878,1880,1882,1884,1887,1889,1891,1893],{"class":486,"line":1501},[484,1861,1472],{"class":1053},[484,1863,1802],{"class":718},[484,1865,869],{"class":722},[484,1867,1868],{"class":715},"json",[484,1870,1206],{"class":732},[484,1872,1873],{"class":722},"{",[484,1875,1477],{"class":732},[484,1877,736],{"class":722},[484,1879,766],{"class":722},[484,1881,1630],{"class":494},[484,1883,772],{"class":722},[484,1885,1886],{"class":722}," },",[484,1888,1057],{"class":722},[484,1890,1812],{"class":718},[484,1892,1063],{"class":722},[484,1894,783],{"class":732},[484,1896,1897],{"class":486,"line":1509},[484,1898,1494],{"class":722},[484,1900,1901],{"class":486,"line":1528},[484,1902,1244],{"class":722},[475,1904,1907],{"className":706,"code":1905,"filename":1906,"language":708,"meta":480,"style":480},"import { Hono } from 'hono'\nimport { IngestValidationError } from '@evlog\u002Ftelemetry\u002Fingest'\nimport { parseTelemetryBody } from '..\u002Flib\u002Ftelemetry-ingest'\nimport { storeRunEvents } from '..\u002Flib\u002Ftelemetry-store'\n\nconst app = new Hono()\n\napp.post('\u002Fapi\u002Ftelemetry\u002Fingest', async (c) => {\n  const raw = await c.req.text()\n  try {\n    const events = parseTelemetryBody(raw)\n    await storeRunEvents(events)\n    return c.body(null, 204)\n  } catch (err) {\n    const status = err instanceof IngestValidationError ? 400 : 500\n    return c.json({ error: 'invalid payload' }, status)\n  }\n})\n\nexport default app\n","src\u002Froutes\u002Ftelemetry.ts (Hono)",[457,1908,1909,1929,1947,1966,1985,1989,2005,2009,2043,2067,2073,2089,2101,2120,2134,2156,2186,2190,2196,2200],{"__ignoreMap":480},[484,1910,1911,1913,1915,1918,1920,1922,1924,1927],{"class":486,"line":487},[484,1912,1054],{"class":1053},[484,1914,1057],{"class":722},[484,1916,1917],{"class":718}," Hono",[484,1919,1063],{"class":722},[484,1921,1066],{"class":1053},[484,1923,766],{"class":722},[484,1925,1926],{"class":494},"hono",[484,1928,1073],{"class":722},[484,1930,1931,1933,1935,1937,1939,1941,1943,1945],{"class":486,"line":729},[484,1932,1054],{"class":1053},[484,1934,1057],{"class":722},[484,1936,1321],{"class":718},[484,1938,1063],{"class":722},[484,1940,1066],{"class":1053},[484,1942,766],{"class":722},[484,1944,645],{"class":494},[484,1946,1073],{"class":722},[484,1948,1949,1951,1953,1955,1957,1959,1961,1964],{"class":486,"line":745},[484,1950,1054],{"class":1053},[484,1952,1057],{"class":722},[484,1954,1203],{"class":718},[484,1956,1063],{"class":722},[484,1958,1066],{"class":1053},[484,1960,766],{"class":722},[484,1962,1963],{"class":494},"..\u002Flib\u002Ftelemetry-ingest",[484,1965,1073],{"class":722},[484,1967,1968,1970,1972,1974,1976,1978,1980,1983],{"class":486,"line":758},[484,1969,1054],{"class":1053},[484,1971,1057],{"class":722},[484,1973,1359],{"class":718},[484,1975,1063],{"class":722},[484,1977,1066],{"class":1053},[484,1979,766],{"class":722},[484,1981,1982],{"class":494},"..\u002Flib\u002Ftelemetry-store",[484,1984,1073],{"class":722},[484,1986,1987],{"class":486,"line":777},[484,1988,1079],{"emptyLinePlaceholder":1078},[484,1990,1991,1994,1997,1999,2001,2003],{"class":486,"line":1130},[484,1992,1993],{"class":1087},"const",[484,1995,1996],{"class":718}," app ",[484,1998,1094],{"class":722},[484,2000,1799],{"class":722},[484,2002,1917],{"class":715},[484,2004,1758],{"class":718},[484,2006,2007],{"class":486,"line":1173},[484,2008,1079],{"emptyLinePlaceholder":1078},[484,2010,2011,2014,2016,2019,2021,2023,2026,2028,2030,2032,2034,2037,2039,2041],{"class":486,"line":1179},[484,2012,2013],{"class":718},"app",[484,2015,869],{"class":722},[484,2017,2018],{"class":715},"post",[484,2020,1206],{"class":718},[484,2022,772],{"class":722},[484,2024,2025],{"class":494},"\u002Fapi\u002Ftelemetry\u002Fingest",[484,2027,772],{"class":722},[484,2029,723],{"class":722},[484,2031,1719],{"class":1087},[484,2033,1391],{"class":722},[484,2035,2036],{"class":1209},"c",[484,2038,536],{"class":722},[484,2040,1399],{"class":1087},[484,2042,726],{"class":722},[484,2044,2045,2047,2049,2051,2053,2056,2058,2061,2063,2065],{"class":486,"line":1190},[484,2046,1406],{"class":1087},[484,2048,1409],{"class":718},[484,2050,1412],{"class":722},[484,2052,1415],{"class":1053},[484,2054,2055],{"class":718}," c",[484,2057,869],{"class":722},[484,2059,2060],{"class":718},"req",[484,2062,869],{"class":722},[484,2064,691],{"class":715},[484,2066,1758],{"class":732},[484,2068,2069,2071],{"class":486,"line":1195},[484,2070,1504],{"class":1053},[484,2072,726],{"class":722},[484,2074,2075,2077,2079,2081,2083,2085,2087],{"class":486,"line":1222},[484,2076,1512],{"class":1087},[484,2078,1515],{"class":718},[484,2080,1412],{"class":722},[484,2082,1203],{"class":715},[484,2084,1206],{"class":732},[484,2086,1210],{"class":718},[484,2088,783],{"class":732},[484,2090,2091,2093,2095,2097,2099],{"class":486,"line":1241},[484,2092,1531],{"class":1053},[484,2094,1359],{"class":715},[484,2096,1206],{"class":732},[484,2098,1538],{"class":718},[484,2100,783],{"class":732},[484,2102,2103,2105,2107,2109,2112,2114,2116,2118],{"class":486,"line":1501},[484,2104,1472],{"class":1053},[484,2106,2055],{"class":718},[484,2108,869],{"class":722},[484,2110,2111],{"class":715},"body",[484,2113,1206],{"class":732},[484,2115,1807],{"class":722},[484,2117,1554],{"class":1464},[484,2119,783],{"class":732},[484,2121,2122,2124,2126,2128,2130,2132],{"class":486,"line":1509},[484,2123,1570],{"class":722},[484,2125,1573],{"class":1053},[484,2127,1391],{"class":732},[484,2129,1578],{"class":718},[484,2131,1447],{"class":732},[484,2133,1450],{"class":722},[484,2135,2136,2138,2140,2142,2144,2146,2148,2150,2152,2154],{"class":486,"line":1528},[484,2137,1512],{"class":1087},[484,2139,1812],{"class":718},[484,2141,1412],{"class":722},[484,2143,1596],{"class":718},[484,2145,1599],{"class":722},[484,2147,1321],{"class":490},[484,2149,1604],{"class":722},[484,2151,1465],{"class":1464},[484,2153,1609],{"class":722},[484,2155,1857],{"class":1464},[484,2157,2158,2160,2162,2164,2166,2168,2170,2172,2174,2176,2178,2180,2182,2184],{"class":486,"line":1543},[484,2159,1472],{"class":1053},[484,2161,2055],{"class":718},[484,2163,869],{"class":722},[484,2165,1868],{"class":715},[484,2167,1206],{"class":732},[484,2169,1873],{"class":722},[484,2171,1477],{"class":732},[484,2173,736],{"class":722},[484,2175,766],{"class":722},[484,2177,1630],{"class":494},[484,2179,772],{"class":722},[484,2181,1886],{"class":722},[484,2183,1812],{"class":718},[484,2185,783],{"class":732},[484,2187,2188],{"class":486,"line":1559},[484,2189,1494],{"class":722},[484,2191,2192,2194],{"class":486,"line":1567},[484,2193,780],{"class":722},[484,2195,783],{"class":718},[484,2197,2198],{"class":486,"line":1585},[484,2199,1079],{"emptyLinePlaceholder":1078},[484,2201,2202,2204,2206],{"class":486,"line":1617},[484,2203,1084],{"class":1053},[484,2205,1381],{"class":1053},[484,2207,2208],{"class":718}," app\n",[878,2210,2212],{"id":2211},"step-3-store-idempotently","Step 3 — Store idempotently",[454,2214,2215,2216,2218],{},"Retries and backlog drains can POST the same ",[457,2217,657],{}," twice. Upsert (or skip) so metrics stay correct:",[475,2220,2223],{"className":706,"code":2221,"filename":2222,"language":708,"meta":480,"style":480},"import type { RunEvent } from '@evlog\u002Ftelemetry'\n\nexport async function storeRunEvents(events: RunEvent[]): Promise\u003Cvoid> {\n  for (const run of events) {\n    await db.telemetryRun.upsert({\n      where: { idempotencyKey: run.idempotencyKey },\n      create: {\n        tool: run.tool.name,\n        version: run.tool.version,\n        command: run.command,\n        outcome: run.outcome,\n        durationMs: run.durationMs,\n        custom: run.custom,\n        recordedAt: run.timestamp,\n      },\n      update: {},\n    })\n  }\n\n  \u002F\u002F Or forward into evlog's drain pipeline for Axiom \u002F Datadog \u002F OTLP:\n  \u002F\u002F await ingestWideEvents(events.map(run => ({ source: 'telemetry', ...run })))\n}\n","lib\u002Ftelemetry-store.ts",[457,2224,2225,2247,2251,2289,2310,2331,2354,2363,2383,2403,2419,2435,2451,2466,2482,2487,2497,2504,2508,2512,2518,2523],{"__ignoreMap":480},[484,2226,2227,2229,2232,2234,2237,2239,2241,2243,2245],{"class":486,"line":487},[484,2228,1054],{"class":1053},[484,2230,2231],{"class":1053}," type",[484,2233,1057],{"class":722},[484,2235,2236],{"class":718}," RunEvent",[484,2238,1063],{"class":722},[484,2240,1066],{"class":1053},[484,2242,766],{"class":722},[484,2244,459],{"class":494},[484,2246,1073],{"class":722},[484,2248,2249],{"class":486,"line":729},[484,2250,1079],{"emptyLinePlaceholder":1078},[484,2252,2253,2255,2257,2259,2261,2263,2265,2267,2269,2272,2275,2278,2281,2284,2287],{"class":486,"line":745},[484,2254,1084],{"class":1053},[484,2256,1719],{"class":1087},[484,2258,1200],{"class":1087},[484,2260,1359],{"class":715},[484,2262,1206],{"class":722},[484,2264,1538],{"class":1209},[484,2266,736],{"class":722},[484,2268,2236],{"class":490},[484,2270,2271],{"class":718},"[]",[484,2273,2274],{"class":722},"):",[484,2276,2277],{"class":490}," Promise",[484,2279,2280],{"class":722},"\u003C",[484,2282,2283],{"class":490},"void",[484,2285,2286],{"class":722},">",[484,2288,726],{"class":722},[484,2290,2291,2294,2296,2298,2301,2304,2306,2308],{"class":486,"line":758},[484,2292,2293],{"class":1053},"  for",[484,2295,1391],{"class":732},[484,2297,1993],{"class":1087},[484,2299,2300],{"class":718}," run",[484,2302,2303],{"class":722}," of",[484,2305,1515],{"class":718},[484,2307,1447],{"class":732},[484,2309,1450],{"class":722},[484,2311,2312,2314,2317,2319,2322,2324,2327,2329],{"class":486,"line":777},[484,2313,1531],{"class":1053},[484,2315,2316],{"class":718}," db",[484,2318,869],{"class":722},[484,2320,2321],{"class":718},"telemetryRun",[484,2323,869],{"class":722},[484,2325,2326],{"class":715},"upsert",[484,2328,1206],{"class":732},[484,2330,1450],{"class":722},[484,2332,2333,2336,2338,2340,2343,2345,2347,2349,2351],{"class":486,"line":1130},[484,2334,2335],{"class":732},"      where",[484,2337,736],{"class":722},[484,2339,1057],{"class":722},[484,2341,2342],{"class":732}," idempotencyKey",[484,2344,736],{"class":722},[484,2346,2300],{"class":718},[484,2348,869],{"class":722},[484,2350,657],{"class":718},[484,2352,2353],{"class":722}," },\n",[484,2355,2356,2359,2361],{"class":486,"line":1173},[484,2357,2358],{"class":732},"      create",[484,2360,736],{"class":722},[484,2362,726],{"class":722},[484,2364,2365,2368,2370,2372,2374,2377,2379,2381],{"class":486,"line":1179},[484,2366,2367],{"class":732},"        tool",[484,2369,736],{"class":722},[484,2371,2300],{"class":718},[484,2373,869],{"class":722},[484,2375,2376],{"class":718},"tool",[484,2378,869],{"class":722},[484,2380,1037],{"class":718},[484,2382,742],{"class":722},[484,2384,2385,2388,2390,2392,2394,2396,2398,2401],{"class":486,"line":1190},[484,2386,2387],{"class":732},"        version",[484,2389,736],{"class":722},[484,2391,2300],{"class":718},[484,2393,869],{"class":722},[484,2395,2376],{"class":718},[484,2397,869],{"class":722},[484,2399,2400],{"class":718},"version",[484,2402,742],{"class":722},[484,2404,2405,2408,2410,2412,2414,2417],{"class":486,"line":1195},[484,2406,2407],{"class":732},"        command",[484,2409,736],{"class":722},[484,2411,2300],{"class":718},[484,2413,869],{"class":722},[484,2415,2416],{"class":718},"command",[484,2418,742],{"class":722},[484,2420,2421,2424,2426,2428,2430,2433],{"class":486,"line":1222},[484,2422,2423],{"class":732},"        outcome",[484,2425,736],{"class":722},[484,2427,2300],{"class":718},[484,2429,869],{"class":722},[484,2431,2432],{"class":718},"outcome",[484,2434,742],{"class":722},[484,2436,2437,2440,2442,2444,2446,2449],{"class":486,"line":1241},[484,2438,2439],{"class":732},"        durationMs",[484,2441,736],{"class":722},[484,2443,2300],{"class":718},[484,2445,869],{"class":722},[484,2447,2448],{"class":718},"durationMs",[484,2450,742],{"class":722},[484,2452,2453,2456,2458,2460,2462,2464],{"class":486,"line":1501},[484,2454,2455],{"class":732},"        custom",[484,2457,736],{"class":722},[484,2459,2300],{"class":718},[484,2461,869],{"class":722},[484,2463,584],{"class":718},[484,2465,742],{"class":722},[484,2467,2468,2471,2473,2475,2477,2480],{"class":486,"line":1509},[484,2469,2470],{"class":732},"        recordedAt",[484,2472,736],{"class":722},[484,2474,2300],{"class":718},[484,2476,869],{"class":722},[484,2478,2479],{"class":718},"timestamp",[484,2481,742],{"class":722},[484,2483,2484],{"class":486,"line":1528},[484,2485,2486],{"class":722},"      },\n",[484,2488,2489,2492,2494],{"class":486,"line":1543},[484,2490,2491],{"class":732},"      update",[484,2493,736],{"class":722},[484,2495,2496],{"class":722}," {},\n",[484,2498,2499,2502],{"class":486,"line":1559},[484,2500,2501],{"class":722},"    }",[484,2503,783],{"class":732},[484,2505,2506],{"class":486,"line":1567},[484,2507,1494],{"class":722},[484,2509,2510],{"class":486,"line":1585},[484,2511,1079],{"emptyLinePlaceholder":1078},[484,2513,2514],{"class":486,"line":1617},[484,2515,2517],{"class":2516},"sHwdD","  \u002F\u002F Or forward into evlog's drain pipeline for Axiom \u002F Datadog \u002F OTLP:\n",[484,2519,2520],{"class":486,"line":1637},[484,2521,2522],{"class":2516},"  \u002F\u002F await ingestWideEvents(events.map(run => ({ source: 'telemetry', ...run })))\n",[484,2524,2525],{"class":486,"line":1642},[484,2526,1244],{"class":722},[878,2528,2530],{"id":2529},"step-4-rate-limit-at-the-edge","Step 4 — Rate-limit at the edge",[454,2532,2533,2535,2536,2539],{},[457,2534,641],{}," is your last line of schema defense, not your only one. Add rate limits where traffic enters — CDN, API gateway, or middleware — especially per IP. Optional: also bucket by ",[457,2537,2538],{},"machineId"," hash inside the handler if you need tighter control.",[454,2541,2542,2543,2545,2546,2549],{},"Non-2xx responses keep events in the user's outbox; they will retry on the next CLI invocation. Return ",[470,2544,1273],{}," (or any ",[457,2547,2548],{},"2xx",") only when storage succeeded.",[667,2551,2553],{"id":2552},"setup-with-citty","Setup with citty",[454,2555,2556,2557,2559,2560,2562,2563,2566,2567,2570],{},"Wrap your root command in ",[457,2558,548],{}," — typically in ",[457,2561,552],{},", the file that calls ",[457,2564,2565],{},"runMain()",". Subcommands can live in the same file or in ",[457,2568,2569],{},"src\u002Fcommands\u002F*.ts","; only the entrypoint needs the wrapper.",[475,2572,2574],{"className":706,"code":2573,"filename":552,"language":708,"meta":480,"style":480},"import { defineCommand, runMain } from 'citty'\nimport { withTelemetry, defineTelemetryCommands } from '@evlog\u002Ftelemetry'\nimport { doctorCommand } from '.\u002Fcommands\u002Fdoctor'\nimport { syncCommand } from '.\u002Fcommands\u002Fsync'\n\nconst TOOL = 'my-tool'\nconst VERSION = '1.0.0'\n\nexport const main = withTelemetry(\n  defineCommand({\n    meta: { name: 'my-tool', description: '…', version: VERSION },\n    subCommands: {\n      doctor: doctorCommand,\n      sync: syncCommand,\n      telemetry: defineTelemetryCommands({ name: TOOL }),\n    },\n  }),\n  {\n    name: TOOL,\n    version: VERSION,\n    endpoint: 'https:\u002F\u002Ftelemetry.my-tool.dev\u002Fapi\u002Ftelemetry\u002Fingest',\n    collect: {\n      flags: { format: ['json', 'csv'] },\n      fields: { framework: ['nuxt', 'next'] },\n    },\n  },\n)\n\nrunMain(main)\n",[457,2575,2576,2601,2625,2645,2665,2669,2684,2700,2704,2720,2729,2775,2784,2795,2806,2831,2836,2844,2849,2860,2871,2886,2895,2932,2969,2974,2979,2984,2989],{"__ignoreMap":480},[484,2577,2578,2580,2582,2585,2587,2590,2592,2594,2596,2599],{"class":486,"line":487},[484,2579,1054],{"class":1053},[484,2581,1057],{"class":722},[484,2583,2584],{"class":718}," defineCommand",[484,2586,723],{"class":722},[484,2588,2589],{"class":718}," runMain",[484,2591,1063],{"class":722},[484,2593,1066],{"class":1053},[484,2595,766],{"class":722},[484,2597,2598],{"class":494},"citty",[484,2600,1073],{"class":722},[484,2602,2603,2605,2607,2610,2612,2615,2617,2619,2621,2623],{"class":486,"line":729},[484,2604,1054],{"class":1053},[484,2606,1057],{"class":722},[484,2608,2609],{"class":718}," withTelemetry",[484,2611,723],{"class":722},[484,2613,2614],{"class":718}," defineTelemetryCommands",[484,2616,1063],{"class":722},[484,2618,1066],{"class":1053},[484,2620,766],{"class":722},[484,2622,459],{"class":494},[484,2624,1073],{"class":722},[484,2626,2627,2629,2631,2634,2636,2638,2640,2643],{"class":486,"line":745},[484,2628,1054],{"class":1053},[484,2630,1057],{"class":722},[484,2632,2633],{"class":718}," doctorCommand",[484,2635,1063],{"class":722},[484,2637,1066],{"class":1053},[484,2639,766],{"class":722},[484,2641,2642],{"class":494},".\u002Fcommands\u002Fdoctor",[484,2644,1073],{"class":722},[484,2646,2647,2649,2651,2654,2656,2658,2660,2663],{"class":486,"line":758},[484,2648,1054],{"class":1053},[484,2650,1057],{"class":722},[484,2652,2653],{"class":718}," syncCommand",[484,2655,1063],{"class":722},[484,2657,1066],{"class":1053},[484,2659,766],{"class":722},[484,2661,2662],{"class":494},".\u002Fcommands\u002Fsync",[484,2664,1073],{"class":722},[484,2666,2667],{"class":486,"line":777},[484,2668,1079],{"emptyLinePlaceholder":1078},[484,2670,2671,2673,2676,2678,2680,2682],{"class":486,"line":1130},[484,2672,1993],{"class":1087},[484,2674,2675],{"class":718}," TOOL ",[484,2677,1094],{"class":722},[484,2679,766],{"class":722},[484,2681,1111],{"class":494},[484,2683,1073],{"class":722},[484,2685,2686,2688,2691,2693,2695,2698],{"class":486,"line":1173},[484,2687,1993],{"class":1087},[484,2689,2690],{"class":718}," VERSION ",[484,2692,1094],{"class":722},[484,2694,766],{"class":722},[484,2696,2697],{"class":494},"1.0.0",[484,2699,1073],{"class":722},[484,2701,2702],{"class":486,"line":1179},[484,2703,1079],{"emptyLinePlaceholder":1078},[484,2705,2706,2708,2710,2713,2715,2717],{"class":486,"line":1190},[484,2707,1084],{"class":1053},[484,2709,1088],{"class":1087},[484,2711,2712],{"class":718}," main ",[484,2714,1094],{"class":722},[484,2716,2609],{"class":715},[484,2718,2719],{"class":718},"(\n",[484,2721,2722,2725,2727],{"class":486,"line":1195},[484,2723,2724],{"class":715},"  defineCommand",[484,2726,1206],{"class":718},[484,2728,1450],{"class":722},[484,2730,2731,2734,2736,2738,2741,2743,2745,2747,2749,2751,2754,2756,2758,2761,2763,2765,2768,2770,2772],{"class":486,"line":1222},[484,2732,2733],{"class":732},"    meta",[484,2735,736],{"class":722},[484,2737,1057],{"class":722},[484,2739,2740],{"class":732}," name",[484,2742,736],{"class":722},[484,2744,766],{"class":722},[484,2746,1111],{"class":494},[484,2748,772],{"class":722},[484,2750,723],{"class":722},[484,2752,2753],{"class":732}," description",[484,2755,736],{"class":722},[484,2757,766],{"class":722},[484,2759,2760],{"class":494},"…",[484,2762,772],{"class":722},[484,2764,723],{"class":722},[484,2766,2767],{"class":732}," version",[484,2769,736],{"class":722},[484,2771,2690],{"class":718},[484,2773,2774],{"class":722},"},\n",[484,2776,2777,2780,2782],{"class":486,"line":1241},[484,2778,2779],{"class":732},"    subCommands",[484,2781,736],{"class":722},[484,2783,726],{"class":722},[484,2785,2786,2789,2791,2793],{"class":486,"line":1501},[484,2787,2788],{"class":732},"      doctor",[484,2790,736],{"class":722},[484,2792,2633],{"class":718},[484,2794,742],{"class":722},[484,2796,2797,2800,2802,2804],{"class":486,"line":1509},[484,2798,2799],{"class":732},"      sync",[484,2801,736],{"class":722},[484,2803,2653],{"class":718},[484,2805,742],{"class":722},[484,2807,2808,2811,2813,2815,2817,2819,2821,2823,2825,2827,2829],{"class":486,"line":1528},[484,2809,2810],{"class":732},"      telemetry",[484,2812,736],{"class":722},[484,2814,2614],{"class":715},[484,2816,1206],{"class":718},[484,2818,1873],{"class":722},[484,2820,2740],{"class":732},[484,2822,736],{"class":722},[484,2824,2675],{"class":718},[484,2826,780],{"class":722},[484,2828,536],{"class":718},[484,2830,742],{"class":722},[484,2832,2833],{"class":486,"line":1543},[484,2834,2835],{"class":722},"    },\n",[484,2837,2838,2840,2842],{"class":486,"line":1559},[484,2839,1570],{"class":722},[484,2841,536],{"class":718},[484,2843,742],{"class":722},[484,2845,2846],{"class":486,"line":1567},[484,2847,2848],{"class":722},"  {\n",[484,2850,2851,2854,2856,2858],{"class":486,"line":1585},[484,2852,2853],{"class":732},"    name",[484,2855,736],{"class":722},[484,2857,739],{"class":718},[484,2859,742],{"class":722},[484,2861,2862,2865,2867,2869],{"class":486,"line":1617},[484,2863,2864],{"class":732},"    version",[484,2866,736],{"class":722},[484,2868,753],{"class":718},[484,2870,742],{"class":722},[484,2872,2873,2876,2878,2880,2882,2884],{"class":486,"line":1637},[484,2874,2875],{"class":732},"    endpoint",[484,2877,736],{"class":722},[484,2879,766],{"class":722},[484,2881,769],{"class":494},[484,2883,772],{"class":722},[484,2885,742],{"class":722},[484,2887,2888,2891,2893],{"class":486,"line":1642},[484,2889,2890],{"class":732},"    collect",[484,2892,736],{"class":722},[484,2894,726],{"class":722},[484,2896,2898,2901,2903,2905,2908,2910,2912,2914,2916,2918,2920,2922,2925,2927,2930],{"class":486,"line":2897},23,[484,2899,2900],{"class":732},"      flags",[484,2902,736],{"class":722},[484,2904,1057],{"class":722},[484,2906,2907],{"class":732}," format",[484,2909,736],{"class":722},[484,2911,1106],{"class":718},[484,2913,772],{"class":722},[484,2915,1868],{"class":494},[484,2917,772],{"class":722},[484,2919,723],{"class":722},[484,2921,766],{"class":722},[484,2923,2924],{"class":494},"csv",[484,2926,772],{"class":722},[484,2928,2929],{"class":718},"] ",[484,2931,2774],{"class":722},[484,2933,2935,2938,2940,2942,2945,2947,2949,2951,2954,2956,2958,2960,2963,2965,2967],{"class":486,"line":2934},24,[484,2936,2937],{"class":732},"      fields",[484,2939,736],{"class":722},[484,2941,1057],{"class":722},[484,2943,2944],{"class":732}," framework",[484,2946,736],{"class":722},[484,2948,1106],{"class":718},[484,2950,772],{"class":722},[484,2952,2953],{"class":494},"nuxt",[484,2955,772],{"class":722},[484,2957,723],{"class":722},[484,2959,766],{"class":722},[484,2961,2962],{"class":494},"next",[484,2964,772],{"class":722},[484,2966,2929],{"class":718},[484,2968,2774],{"class":722},[484,2970,2972],{"class":486,"line":2971},25,[484,2973,2835],{"class":722},[484,2975,2977],{"class":486,"line":2976},26,[484,2978,1176],{"class":722},[484,2980,2982],{"class":486,"line":2981},27,[484,2983,783],{"class":718},[484,2985,2987],{"class":486,"line":2986},28,[484,2988,1079],{"emptyLinePlaceholder":1078},[484,2990,2992,2995],{"class":486,"line":2991},29,[484,2993,2994],{"class":715},"runMain",[484,2996,2997],{"class":718},"(main)\n",[878,2999,3001],{"id":3000},"what-gets-recorded-automatically","What gets recorded automatically",[454,3003,3004,3006,3007,3010],{},[457,3005,527],{}," walks your citty tree. Each ",[457,3008,3009],{},"run"," handler produces one event — no per-command telemetry boilerplate.",[785,3012,3013,3031],{},[788,3014,3015],{},[791,3016,3017,3020,3025],{},[794,3018,3019],{},"Invocation",[794,3021,3022],{},[457,3023,3024],{},"event.command",[794,3026,3027,3028],{},"Notes on ",[457,3029,3030],{},"flags",[801,3032,3033,3050,3065,3086,3105],{},[791,3034,3035,3040,3044],{},[806,3036,3037],{},[457,3038,3039],{},"my-tool doctor",[806,3041,3042],{},[457,3043,953],{},[806,3045,3046,3049],{},[457,3047,3048],{},"{ json: true }"," — booleans captured as values",[791,3051,3052,3057,3061],{},[806,3053,3054],{},[457,3055,3056],{},"my-tool doctor --json",[806,3058,3059],{},[457,3060,953],{},[806,3062,3063],{},[457,3064,3048],{},[791,3066,3067,3072,3077],{},[806,3068,3069],{},[457,3070,3071],{},"my-tool sync --dry-run --output .\u002Fout",[806,3073,3074],{},[457,3075,3076],{},"sync",[806,3078,3079,3082,3083],{},[457,3080,3081],{},"{ dryRun: true, output: true }"," — string path is ",[470,3084,3085],{},"presence only",[791,3087,3088,3093,3097],{},[806,3089,3090],{},[457,3091,3092],{},"my-tool sync --format json",[806,3094,3095],{},[457,3096,3076],{},[806,3098,3099,3102,3103],{},[457,3100,3101],{},"{ format: \"json\" }"," only if allowlisted in ",[457,3104,590],{},[791,3106,3107,3112,3117],{},[806,3108,3109],{},[457,3110,3111],{},"my-tool telemetry status",[806,3113,3114],{},[457,3115,3116],{},"telemetry status",[806,3118,3119],{},"nested subcommands join with a space",[454,3121,3122,3123,3126,3127,869],{},"The root ",[457,3124,3125],{},"meta.name"," is not prefixed when the root only delegates to ",[457,3128,3129],{},"subCommands",[878,3131,3133],{"id":3132},"enriching-a-run","Enriching a run",[454,3135,606,3136,3138],{},[457,3137,504],{}," anywhere inside a command handler — or in helpers that run on the same async stack (the run context is preserved via AsyncLocalStorage).",[475,3140,3143],{"className":706,"code":3141,"filename":3142,"language":708,"meta":480,"style":480},"import { telemetry } from '@evlog\u002Ftelemetry'\nimport { existsSync } from 'node:fs'\nimport { resolveConfigPath } from '..\u002Flib\u002Fconfig'\n\nasync function runHealthChecks() {\n  let checksFailed = 0\n  let checksWarn = 0\n\n  const configPath = resolveConfigPath()\n  if (!existsSync(configPath)) {\n    checksFailed++\n  }\n\n  try {\n    await fetch('https:\u002F\u002Fregistry.npmjs.org\u002Fmy-tool')\n  } catch {\n    checksWarn++\n  }\n\n  \u002F\u002F Counters land in event.custom on the wide event for this run\n  telemetry.set({ checksFailed, checksWarn })\n  return checksFailed === 0\n}\n\nexport const doctorCommand = {\n  meta: { name: 'doctor', description: 'Check environment' },\n  args: {\n    json: { type: 'boolean', alias: 'j' },\n  },\n  async run({ args }: { args: { json?: boolean } }) {\n    const ok = await runHealthChecks()\n    if (!ok) {\n      throw Object.assign(new Error('Health checks failed'), { code: 'DOCTOR_FAILED' })\n    }\n    if (!args.json) process.stdout.write('ok\\n')\n  },\n}\n","src\u002Fcommands\u002Fdoctor.ts",[457,3144,3145,3164,3184,3204,3208,3222,3235,3246,3250,3263,3284,3292,3296,3300,3306,3324,3332,3339,3343,3347,3352,3376,3387,3391,3395,3408,3442,3451,3487,3491,3532,3548,3565,3618,3624,3668,3673],{"__ignoreMap":480},[484,3146,3147,3149,3151,3154,3156,3158,3160,3162],{"class":486,"line":487},[484,3148,1054],{"class":1053},[484,3150,1057],{"class":722},[484,3152,3153],{"class":718}," telemetry",[484,3155,1063],{"class":722},[484,3157,1066],{"class":1053},[484,3159,766],{"class":722},[484,3161,459],{"class":494},[484,3163,1073],{"class":722},[484,3165,3166,3168,3170,3173,3175,3177,3179,3182],{"class":486,"line":729},[484,3167,1054],{"class":1053},[484,3169,1057],{"class":722},[484,3171,3172],{"class":718}," existsSync",[484,3174,1063],{"class":722},[484,3176,1066],{"class":1053},[484,3178,766],{"class":722},[484,3180,3181],{"class":494},"node:fs",[484,3183,1073],{"class":722},[484,3185,3186,3188,3190,3193,3195,3197,3199,3202],{"class":486,"line":745},[484,3187,1054],{"class":1053},[484,3189,1057],{"class":722},[484,3191,3192],{"class":718}," resolveConfigPath",[484,3194,1063],{"class":722},[484,3196,1066],{"class":1053},[484,3198,766],{"class":722},[484,3200,3201],{"class":494},"..\u002Flib\u002Fconfig",[484,3203,1073],{"class":722},[484,3205,3206],{"class":486,"line":758},[484,3207,1079],{"emptyLinePlaceholder":1078},[484,3209,3210,3212,3214,3217,3220],{"class":486,"line":777},[484,3211,1388],{"class":1087},[484,3213,1200],{"class":1087},[484,3215,3216],{"class":715}," runHealthChecks",[484,3218,3219],{"class":722},"()",[484,3221,726],{"class":722},[484,3223,3224,3227,3230,3232],{"class":486,"line":1130},[484,3225,3226],{"class":1087},"  let",[484,3228,3229],{"class":718}," checksFailed",[484,3231,1412],{"class":722},[484,3233,3234],{"class":1464}," 0\n",[484,3236,3237,3239,3242,3244],{"class":486,"line":1173},[484,3238,3226],{"class":1087},[484,3240,3241],{"class":718}," checksWarn",[484,3243,1412],{"class":722},[484,3245,3234],{"class":1464},[484,3247,3248],{"class":486,"line":1179},[484,3249,1079],{"emptyLinePlaceholder":1078},[484,3251,3252,3254,3257,3259,3261],{"class":486,"line":1190},[484,3253,1406],{"class":1087},[484,3255,3256],{"class":718}," configPath",[484,3258,1412],{"class":722},[484,3260,3192],{"class":715},[484,3262,1758],{"class":732},[484,3264,3265,3267,3269,3271,3274,3276,3279,3282],{"class":486,"line":1195},[484,3266,1437],{"class":1053},[484,3268,1391],{"class":732},[484,3270,1442],{"class":722},[484,3272,3273],{"class":715},"existsSync",[484,3275,1206],{"class":732},[484,3277,3278],{"class":718},"configPath",[484,3280,3281],{"class":732},")) ",[484,3283,1450],{"class":722},[484,3285,3286,3289],{"class":486,"line":1222},[484,3287,3288],{"class":718},"    checksFailed",[484,3290,3291],{"class":722},"++\n",[484,3293,3294],{"class":486,"line":1241},[484,3295,1494],{"class":722},[484,3297,3298],{"class":486,"line":1501},[484,3299,1079],{"emptyLinePlaceholder":1078},[484,3301,3302,3304],{"class":486,"line":1509},[484,3303,1504],{"class":1053},[484,3305,726],{"class":722},[484,3307,3308,3310,3313,3315,3317,3320,3322],{"class":486,"line":1528},[484,3309,1531],{"class":1053},[484,3311,3312],{"class":715}," fetch",[484,3314,1206],{"class":732},[484,3316,772],{"class":722},[484,3318,3319],{"class":494},"https:\u002F\u002Fregistry.npmjs.org\u002Fmy-tool",[484,3321,772],{"class":722},[484,3323,783],{"class":732},[484,3325,3326,3328,3330],{"class":486,"line":1543},[484,3327,1570],{"class":722},[484,3329,1573],{"class":1053},[484,3331,726],{"class":722},[484,3333,3334,3337],{"class":486,"line":1559},[484,3335,3336],{"class":718},"    checksWarn",[484,3338,3291],{"class":722},[484,3340,3341],{"class":486,"line":1567},[484,3342,1494],{"class":722},[484,3344,3345],{"class":486,"line":1585},[484,3346,1079],{"emptyLinePlaceholder":1078},[484,3348,3349],{"class":486,"line":1617},[484,3350,3351],{"class":2516},"  \u002F\u002F Counters land in event.custom on the wide event for this run\n",[484,3353,3354,3357,3359,3362,3364,3366,3368,3370,3372,3374],{"class":486,"line":1637},[484,3355,3356],{"class":718},"  telemetry",[484,3358,869],{"class":722},[484,3360,3361],{"class":715},"set",[484,3363,1206],{"class":732},[484,3365,1873],{"class":722},[484,3367,3229],{"class":718},[484,3369,723],{"class":722},[484,3371,3241],{"class":718},[484,3373,1063],{"class":722},[484,3375,783],{"class":732},[484,3377,3378,3380,3382,3385],{"class":486,"line":1642},[484,3379,1225],{"class":1053},[484,3381,3229],{"class":718},[484,3383,3384],{"class":722}," ===",[484,3386,3234],{"class":1464},[484,3388,3389],{"class":486,"line":2897},[484,3390,1244],{"class":722},[484,3392,3393],{"class":486,"line":2934},[484,3394,1079],{"emptyLinePlaceholder":1078},[484,3396,3397,3399,3401,3404,3406],{"class":486,"line":2971},[484,3398,1084],{"class":1053},[484,3400,1088],{"class":1087},[484,3402,3403],{"class":718}," doctorCommand ",[484,3405,1094],{"class":722},[484,3407,726],{"class":722},[484,3409,3410,3413,3415,3417,3419,3421,3423,3425,3427,3429,3431,3433,3435,3438,3440],{"class":486,"line":2976},[484,3411,3412],{"class":732},"  meta",[484,3414,736],{"class":722},[484,3416,1057],{"class":722},[484,3418,2740],{"class":732},[484,3420,736],{"class":722},[484,3422,766],{"class":722},[484,3424,953],{"class":494},[484,3426,772],{"class":722},[484,3428,723],{"class":722},[484,3430,2753],{"class":732},[484,3432,736],{"class":722},[484,3434,766],{"class":722},[484,3436,3437],{"class":494},"Check environment",[484,3439,772],{"class":722},[484,3441,2353],{"class":722},[484,3443,3444,3447,3449],{"class":486,"line":2981},[484,3445,3446],{"class":732},"  args",[484,3448,736],{"class":722},[484,3450,726],{"class":722},[484,3452,3453,3456,3458,3460,3462,3464,3466,3469,3471,3473,3476,3478,3480,3483,3485],{"class":486,"line":2986},[484,3454,3455],{"class":732},"    json",[484,3457,736],{"class":722},[484,3459,1057],{"class":722},[484,3461,2231],{"class":732},[484,3463,736],{"class":722},[484,3465,766],{"class":722},[484,3467,3468],{"class":494},"boolean",[484,3470,772],{"class":722},[484,3472,723],{"class":722},[484,3474,3475],{"class":732}," alias",[484,3477,736],{"class":722},[484,3479,766],{"class":722},[484,3481,3482],{"class":494},"j",[484,3484,772],{"class":722},[484,3486,2353],{"class":722},[484,3488,3489],{"class":486,"line":2991},[484,3490,1176],{"class":722},[484,3492,3494,3497,3499,3502,3505,3508,3510,3512,3514,3516,3519,3522,3525,3527,3530],{"class":486,"line":3493},30,[484,3495,3496],{"class":1087},"  async",[484,3498,2300],{"class":732},[484,3500,3501],{"class":722},"({",[484,3503,3504],{"class":1209}," args",[484,3506,3507],{"class":722}," }:",[484,3509,1057],{"class":722},[484,3511,3504],{"class":732},[484,3513,736],{"class":722},[484,3515,1057],{"class":722},[484,3517,3518],{"class":732}," json",[484,3520,3521],{"class":722},"?:",[484,3523,3524],{"class":490}," boolean",[484,3526,1063],{"class":722},[484,3528,3529],{"class":722}," })",[484,3531,726],{"class":722},[484,3533,3535,3537,3540,3542,3544,3546],{"class":486,"line":3534},31,[484,3536,1512],{"class":1087},[484,3538,3539],{"class":718}," ok",[484,3541,1412],{"class":722},[484,3543,1415],{"class":1053},[484,3545,3216],{"class":715},[484,3547,1758],{"class":732},[484,3549,3551,3554,3556,3558,3561,3563],{"class":486,"line":3550},32,[484,3552,3553],{"class":1053},"    if",[484,3555,1391],{"class":732},[484,3557,1442],{"class":722},[484,3559,3560],{"class":718},"ok",[484,3562,1447],{"class":732},[484,3564,1450],{"class":722},[484,3566,3568,3571,3574,3576,3579,3581,3584,3587,3589,3591,3594,3596,3598,3600,3602,3605,3607,3609,3612,3614,3616],{"class":486,"line":3567},33,[484,3569,3570],{"class":1053},"      throw",[484,3572,3573],{"class":718}," Object",[484,3575,869],{"class":722},[484,3577,3578],{"class":715},"assign",[484,3580,1206],{"class":732},[484,3582,3583],{"class":722},"new",[484,3585,3586],{"class":715}," Error",[484,3588,1206],{"class":732},[484,3590,772],{"class":722},[484,3592,3593],{"class":494},"Health checks failed",[484,3595,772],{"class":722},[484,3597,536],{"class":732},[484,3599,723],{"class":722},[484,3601,1057],{"class":722},[484,3603,3604],{"class":732}," code",[484,3606,736],{"class":722},[484,3608,766],{"class":722},[484,3610,3611],{"class":494},"DOCTOR_FAILED",[484,3613,772],{"class":722},[484,3615,1063],{"class":722},[484,3617,783],{"class":732},[484,3619,3621],{"class":486,"line":3620},34,[484,3622,3623],{"class":722},"    }\n",[484,3625,3627,3629,3631,3633,3636,3638,3640,3642,3645,3647,3650,3652,3655,3657,3659,3661,3664,3666],{"class":486,"line":3626},35,[484,3628,3553],{"class":1053},[484,3630,1391],{"class":732},[484,3632,1442],{"class":722},[484,3634,3635],{"class":718},"args",[484,3637,869],{"class":722},[484,3639,1868],{"class":718},[484,3641,1447],{"class":732},[484,3643,3644],{"class":718},"process",[484,3646,869],{"class":722},[484,3648,3649],{"class":718},"stdout",[484,3651,869],{"class":722},[484,3653,3654],{"class":715},"write",[484,3656,1206],{"class":732},[484,3658,772],{"class":722},[484,3660,3560],{"class":494},[484,3662,3663],{"class":718},"\\n",[484,3665,772],{"class":722},[484,3667,783],{"class":732},[484,3669,3671],{"class":486,"line":3670},36,[484,3672,1176],{"class":722},[484,3674,3676],{"class":486,"line":3675},37,[484,3677,1244],{"class":722},[454,3679,3680,3681,3683,3684,3687,3688,3691],{},"Throw an error with a ",[457,3682,457],{}," property and ",[457,3685,3686],{},"outcome: \"error\""," plus ",[457,3689,3690],{},"errorCode"," are recorded automatically:",[475,3693,3695],{"className":706,"code":3694,"filename":3142,"language":708,"meta":480,"style":480},"throw Object.assign(new Error('Config missing'), { code: 'CONFIG_NOT_FOUND' })\n",[457,3696,3697],{"__ignoreMap":480},[484,3698,3699,3702,3704,3706,3708,3710,3712,3714,3716,3718,3721,3723,3725,3727,3729,3731,3733,3735,3738,3740,3742],{"class":486,"line":487},[484,3700,3701],{"class":1053},"throw",[484,3703,3573],{"class":718},[484,3705,869],{"class":722},[484,3707,3578],{"class":715},[484,3709,1206],{"class":718},[484,3711,3583],{"class":722},[484,3713,3586],{"class":715},[484,3715,1206],{"class":718},[484,3717,772],{"class":722},[484,3719,3720],{"class":494},"Config missing",[484,3722,772],{"class":722},[484,3724,536],{"class":718},[484,3726,723],{"class":722},[484,3728,1057],{"class":722},[484,3730,3604],{"class":732},[484,3732,736],{"class":722},[484,3734,766],{"class":722},[484,3736,3737],{"class":494},"CONFIG_NOT_FOUND",[484,3739,772],{"class":722},[484,3741,1063],{"class":722},[484,3743,783],{"class":718},[454,3745,3746,3747,3750],{},"A minimal sync handler for comparison — flags are auto-captured, you only ",[457,3748,3749],{},"set()"," business counters:",[475,3752,3755],{"className":706,"code":3753,"filename":3754,"language":708,"meta":480,"style":480},"import { telemetry } from '@evlog\u002Ftelemetry'\n\nexport const syncCommand = {\n  meta: { name: 'sync', description: 'Pull remote state' },\n  args: {\n    dryRun: { type: 'boolean' },\n    output: { type: 'string', description: 'Output path' },\n  },\n  async run() {\n    const itemsSynced = await pullRemoteState()\n    telemetry.set({ itemsSynced })\n  },\n}\n","src\u002Fcommands\u002Fsync.ts",[457,3756,3757,3775,3779,3792,3825,3833,3854,3889,3893,3903,3919,3938,3942],{"__ignoreMap":480},[484,3758,3759,3761,3763,3765,3767,3769,3771,3773],{"class":486,"line":487},[484,3760,1054],{"class":1053},[484,3762,1057],{"class":722},[484,3764,3153],{"class":718},[484,3766,1063],{"class":722},[484,3768,1066],{"class":1053},[484,3770,766],{"class":722},[484,3772,459],{"class":494},[484,3774,1073],{"class":722},[484,3776,3777],{"class":486,"line":729},[484,3778,1079],{"emptyLinePlaceholder":1078},[484,3780,3781,3783,3785,3788,3790],{"class":486,"line":745},[484,3782,1084],{"class":1053},[484,3784,1088],{"class":1087},[484,3786,3787],{"class":718}," syncCommand ",[484,3789,1094],{"class":722},[484,3791,726],{"class":722},[484,3793,3794,3796,3798,3800,3802,3804,3806,3808,3810,3812,3814,3816,3818,3821,3823],{"class":486,"line":758},[484,3795,3412],{"class":732},[484,3797,736],{"class":722},[484,3799,1057],{"class":722},[484,3801,2740],{"class":732},[484,3803,736],{"class":722},[484,3805,766],{"class":722},[484,3807,3076],{"class":494},[484,3809,772],{"class":722},[484,3811,723],{"class":722},[484,3813,2753],{"class":732},[484,3815,736],{"class":722},[484,3817,766],{"class":722},[484,3819,3820],{"class":494},"Pull remote state",[484,3822,772],{"class":722},[484,3824,2353],{"class":722},[484,3826,3827,3829,3831],{"class":486,"line":777},[484,3828,3446],{"class":732},[484,3830,736],{"class":722},[484,3832,726],{"class":722},[484,3834,3835,3838,3840,3842,3844,3846,3848,3850,3852],{"class":486,"line":1130},[484,3836,3837],{"class":732},"    dryRun",[484,3839,736],{"class":722},[484,3841,1057],{"class":722},[484,3843,2231],{"class":732},[484,3845,736],{"class":722},[484,3847,766],{"class":722},[484,3849,3468],{"class":494},[484,3851,772],{"class":722},[484,3853,2353],{"class":722},[484,3855,3856,3859,3861,3863,3865,3867,3869,3872,3874,3876,3878,3880,3882,3885,3887],{"class":486,"line":1173},[484,3857,3858],{"class":732},"    output",[484,3860,736],{"class":722},[484,3862,1057],{"class":722},[484,3864,2231],{"class":732},[484,3866,736],{"class":722},[484,3868,766],{"class":722},[484,3870,3871],{"class":494},"string",[484,3873,772],{"class":722},[484,3875,723],{"class":722},[484,3877,2753],{"class":732},[484,3879,736],{"class":722},[484,3881,766],{"class":722},[484,3883,3884],{"class":494},"Output path",[484,3886,772],{"class":722},[484,3888,2353],{"class":722},[484,3890,3891],{"class":486,"line":1179},[484,3892,1176],{"class":722},[484,3894,3895,3897,3899,3901],{"class":486,"line":1190},[484,3896,3496],{"class":1087},[484,3898,2300],{"class":732},[484,3900,3219],{"class":722},[484,3902,726],{"class":722},[484,3904,3905,3907,3910,3912,3914,3917],{"class":486,"line":1195},[484,3906,1512],{"class":1087},[484,3908,3909],{"class":718}," itemsSynced",[484,3911,1412],{"class":722},[484,3913,1415],{"class":1053},[484,3915,3916],{"class":715}," pullRemoteState",[484,3918,1758],{"class":732},[484,3920,3921,3924,3926,3928,3930,3932,3934,3936],{"class":486,"line":1222},[484,3922,3923],{"class":718},"    telemetry",[484,3925,869],{"class":722},[484,3927,3361],{"class":715},[484,3929,1206],{"class":732},[484,3931,1873],{"class":722},[484,3933,3909],{"class":718},[484,3935,1063],{"class":722},[484,3937,783],{"class":732},[484,3939,3940],{"class":486,"line":1241},[484,3941,1176],{"class":722},[484,3943,3944],{"class":486,"line":1501},[484,3945,1244],{"class":722},[667,3947,3949],{"id":3948},"setup-without-citty","Setup without citty",[454,3951,3952,3953,3956,3957,736],{},"For scripts, migrators, or custom CLIs, use ",[457,3954,3955],{},"createTelemetry()"," and wrap each logical run with ",[457,3958,3959],{},"t.run()",[475,3961,3964],{"className":706,"code":3962,"filename":3963,"language":708,"meta":480,"style":480},"import { createTelemetry, telemetry } from '@evlog\u002Ftelemetry'\n\nconst t = createTelemetry({ name: 'my-migrator', version: '2.0.0' })\n\nawait t.run('migrate', async () => {\n  const rows = await migrateBatch()\n  telemetry.set({ rowsMigrated: rows.length, batchSize: 500 })\n})\n\nawait t.flush() \u002F\u002F optional — also runs at end of each t.run()\n","scripts\u002Fmigrate.ts",[457,3965,3966,3989,3993,4036,4040,4072,4088,4125,4131,4135],{"__ignoreMap":480},[484,3967,3968,3970,3972,3975,3977,3979,3981,3983,3985,3987],{"class":486,"line":487},[484,3969,1054],{"class":1053},[484,3971,1057],{"class":722},[484,3973,3974],{"class":718}," createTelemetry",[484,3976,723],{"class":722},[484,3978,3153],{"class":718},[484,3980,1063],{"class":722},[484,3982,1066],{"class":1053},[484,3984,766],{"class":722},[484,3986,459],{"class":494},[484,3988,1073],{"class":722},[484,3990,3991],{"class":486,"line":729},[484,3992,1079],{"emptyLinePlaceholder":1078},[484,3994,3995,3997,4000,4002,4004,4006,4008,4010,4012,4014,4017,4019,4021,4023,4025,4027,4030,4032,4034],{"class":486,"line":745},[484,3996,1993],{"class":1087},[484,3998,3999],{"class":718}," t ",[484,4001,1094],{"class":722},[484,4003,3974],{"class":715},[484,4005,1206],{"class":718},[484,4007,1873],{"class":722},[484,4009,2740],{"class":732},[484,4011,736],{"class":722},[484,4013,766],{"class":722},[484,4015,4016],{"class":494},"my-migrator",[484,4018,772],{"class":722},[484,4020,723],{"class":722},[484,4022,2767],{"class":732},[484,4024,736],{"class":722},[484,4026,766],{"class":722},[484,4028,4029],{"class":494},"2.0.0",[484,4031,772],{"class":722},[484,4033,1063],{"class":722},[484,4035,783],{"class":718},[484,4037,4038],{"class":486,"line":758},[484,4039,1079],{"emptyLinePlaceholder":1078},[484,4041,4042,4045,4048,4050,4052,4054,4056,4059,4061,4063,4065,4068,4070],{"class":486,"line":777},[484,4043,4044],{"class":1053},"await",[484,4046,4047],{"class":718}," t",[484,4049,869],{"class":722},[484,4051,3009],{"class":715},[484,4053,1206],{"class":718},[484,4055,772],{"class":722},[484,4057,4058],{"class":494},"migrate",[484,4060,772],{"class":722},[484,4062,723],{"class":722},[484,4064,1719],{"class":1087},[484,4066,4067],{"class":722}," ()",[484,4069,1399],{"class":1087},[484,4071,726],{"class":722},[484,4073,4074,4076,4079,4081,4083,4086],{"class":486,"line":1130},[484,4075,1406],{"class":1087},[484,4077,4078],{"class":718}," rows",[484,4080,1412],{"class":722},[484,4082,1415],{"class":1053},[484,4084,4085],{"class":715}," migrateBatch",[484,4087,1758],{"class":732},[484,4089,4090,4092,4094,4096,4098,4100,4103,4105,4107,4109,4112,4114,4117,4119,4121,4123],{"class":486,"line":1173},[484,4091,3356],{"class":718},[484,4093,869],{"class":722},[484,4095,3361],{"class":715},[484,4097,1206],{"class":732},[484,4099,1873],{"class":722},[484,4101,4102],{"class":732}," rowsMigrated",[484,4104,736],{"class":722},[484,4106,4078],{"class":718},[484,4108,869],{"class":722},[484,4110,4111],{"class":718},"length",[484,4113,723],{"class":722},[484,4115,4116],{"class":732}," batchSize",[484,4118,736],{"class":722},[484,4120,1612],{"class":1464},[484,4122,1063],{"class":722},[484,4124,783],{"class":732},[484,4126,4127,4129],{"class":486,"line":1179},[484,4128,780],{"class":722},[484,4130,783],{"class":718},[484,4132,4133],{"class":486,"line":1190},[484,4134,1079],{"emptyLinePlaceholder":1078},[484,4136,4137,4139,4141,4143,4146,4149],{"class":486,"line":1195},[484,4138,4044],{"class":1053},[484,4140,4047],{"class":718},[484,4142,869],{"class":722},[484,4144,4145],{"class":715},"flush",[484,4147,4148],{"class":718},"() ",[484,4150,4151],{"class":2516},"\u002F\u002F optional — also runs at end of each t.run()\n",[454,4153,4154,4155,4157,4158,4160,4161,4164,4165,4168,4169,642,4171,577,4173,4175],{},"GitHub Actions: swap ",[457,4156,531],{}," for ",[457,4159,572],{}," in the same file — it adds ",[457,4162,4163],{},"ghaAction"," and ",[457,4166,4167],{},"ghaEvent"," to ",[457,4170,584],{},[457,4172,576],{},[457,4174,580],{}," only (never repo content).",[475,4177,4180],{"className":706,"code":4178,"filename":4179,"language":708,"meta":480,"style":480},"import { createGitHubActionsTelemetry, telemetry } from '@evlog\u002Ftelemetry'\n\nconst t = createGitHubActionsTelemetry({ name: 'my-action', version: '1.0.0' })\n\nawait t.run('report', async () => {\n  const artifacts = await collectArtifacts()\n  telemetry.set({ artifactCount: artifacts.length })\n})\n","scripts\u002Fci-report.ts",[457,4181,4182,4205,4209,4250,4254,4283,4299,4326],{"__ignoreMap":480},[484,4183,4184,4186,4188,4191,4193,4195,4197,4199,4201,4203],{"class":486,"line":487},[484,4185,1054],{"class":1053},[484,4187,1057],{"class":722},[484,4189,4190],{"class":718}," createGitHubActionsTelemetry",[484,4192,723],{"class":722},[484,4194,3153],{"class":718},[484,4196,1063],{"class":722},[484,4198,1066],{"class":1053},[484,4200,766],{"class":722},[484,4202,459],{"class":494},[484,4204,1073],{"class":722},[484,4206,4207],{"class":486,"line":729},[484,4208,1079],{"emptyLinePlaceholder":1078},[484,4210,4211,4213,4215,4217,4219,4221,4223,4225,4227,4229,4232,4234,4236,4238,4240,4242,4244,4246,4248],{"class":486,"line":745},[484,4212,1993],{"class":1087},[484,4214,3999],{"class":718},[484,4216,1094],{"class":722},[484,4218,4190],{"class":715},[484,4220,1206],{"class":718},[484,4222,1873],{"class":722},[484,4224,2740],{"class":732},[484,4226,736],{"class":722},[484,4228,766],{"class":722},[484,4230,4231],{"class":494},"my-action",[484,4233,772],{"class":722},[484,4235,723],{"class":722},[484,4237,2767],{"class":732},[484,4239,736],{"class":722},[484,4241,766],{"class":722},[484,4243,2697],{"class":494},[484,4245,772],{"class":722},[484,4247,1063],{"class":722},[484,4249,783],{"class":718},[484,4251,4252],{"class":486,"line":758},[484,4253,1079],{"emptyLinePlaceholder":1078},[484,4255,4256,4258,4260,4262,4264,4266,4268,4271,4273,4275,4277,4279,4281],{"class":486,"line":777},[484,4257,4044],{"class":1053},[484,4259,4047],{"class":718},[484,4261,869],{"class":722},[484,4263,3009],{"class":715},[484,4265,1206],{"class":718},[484,4267,772],{"class":722},[484,4269,4270],{"class":494},"report",[484,4272,772],{"class":722},[484,4274,723],{"class":722},[484,4276,1719],{"class":1087},[484,4278,4067],{"class":722},[484,4280,1399],{"class":1087},[484,4282,726],{"class":722},[484,4284,4285,4287,4290,4292,4294,4297],{"class":486,"line":1130},[484,4286,1406],{"class":1087},[484,4288,4289],{"class":718}," artifacts",[484,4291,1412],{"class":722},[484,4293,1415],{"class":1053},[484,4295,4296],{"class":715}," collectArtifacts",[484,4298,1758],{"class":732},[484,4300,4301,4303,4305,4307,4309,4311,4314,4316,4318,4320,4322,4324],{"class":486,"line":1173},[484,4302,3356],{"class":718},[484,4304,869],{"class":722},[484,4306,3361],{"class":715},[484,4308,1206],{"class":732},[484,4310,1873],{"class":722},[484,4312,4313],{"class":732}," artifactCount",[484,4315,736],{"class":722},[484,4317,4289],{"class":718},[484,4319,869],{"class":722},[484,4321,4111],{"class":718},[484,4323,1063],{"class":722},[484,4325,783],{"class":732},[484,4327,4328,4330],{"class":486,"line":1179},[484,4329,780],{"class":722},[484,4331,783],{"class":718},[667,4333,4335],{"id":4334},"standard-envelope","Standard envelope",[454,4337,4338],{},"Every run shares the same shape. You do not declare per-command schemas.",[475,4340,4344],{"className":4341,"code":4342,"language":4343,"meta":480,"style":480},"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",[457,4345,4346,4350,4355,4360,4365,4370,4375,4380,4385,4390,4395,4400,4405,4413,4417,4425,4430],{"__ignoreMap":480},[484,4347,4348],{"class":486,"line":487},[484,4349,1450],{},[484,4351,4352],{"class":486,"line":729},[484,4353,4354],{},"  \"event\": \"run\",\n",[484,4356,4357],{"class":486,"line":745},[484,4358,4359],{},"  \"command\": \"sync\",\n",[484,4361,4362],{"class":486,"line":758},[484,4363,4364],{},"  \"durationMs\": 412,\n",[484,4366,4367],{"class":486,"line":777},[484,4368,4369],{},"  \"outcome\": \"success\",\n",[484,4371,4372],{"class":486,"line":1130},[484,4373,4374],{},"  \"flags\": { \"dryRun\": true, \"output\": true },\n",[484,4376,4377],{"class":486,"line":1173},[484,4378,4379],{},"  \"tool\": { \"name\": \"my-tool\", \"version\": \"1.0.0\" },\n",[484,4381,4382],{"class":486,"line":1179},[484,4383,4384],{},"  \"env\": {\n",[484,4386,4387],{"class":486,"line":1190},[484,4388,4389],{},"    \"node\": \"20.11\",\n",[484,4391,4392],{"class":486,"line":1195},[484,4393,4394],{},"    \"ci\": false,\n",[484,4396,4397],{"class":486,"line":1222},[484,4398,4399],{},"    \"provider\": null,\n",[484,4401,4402],{"class":486,"line":1241},[484,4403,4404],{},"    \"tty\": true,\n",[484,4406,4407,4410],{"class":486,"line":1501},[484,4408,4409],{},"    \"agent\": \"cursor\"",[484,4411,4412],{},"   \u002F\u002F std-env: cursor, claude, codex, … or null\n",[484,4414,4415],{"class":486,"line":1509},[484,4416,1176],{},[484,4418,4419,4422],{"class":486,"line":1528},[484,4420,4421],{},"  \"machineId\": \"ab3f…\",",[484,4423,4424],{}," \u002F\u002F hashed; omitted in ephemeral CI\n",[484,4426,4427],{"class":486,"line":1543},[484,4428,4429],{},"  \"custom\": { \"itemsSynced\": 42 }\n",[484,4431,4432],{"class":486,"line":1559},[484,4433,1244],{},[667,4435,4437],{"id":4436},"extending-the-schema","Extending the schema",[454,4439,4440,4441,4444,4445,4447,4448,4450,4451,869],{},"The envelope above is ",[470,4442,4443],{},"fixed"," — every tool sends the same top-level shape so ",[457,4446,641],{}," and disclosure stay predictable. You do not add fields next to ",[457,4449,2416],{}," or ",[457,4452,2448],{},[454,4454,4455],{},"Your product schema lives in two extension zones:",[785,4457,4458,4471],{},[788,4459,4460],{},[791,4461,4462,4465,4468],{},[794,4463,4464],{},"Zone",[794,4466,4467],{},"Who sets it",[794,4469,4470],{},"What goes there",[801,4472,4473,4487],{},[791,4474,4475,4479,4484],{},[806,4476,4477],{},[457,4478,3030],{},[806,4480,4481,4482],{},"citty (auto) + ",[457,4483,590],{},[806,4485,4486],{},"CLI switches — booleans\u002Fnumbers as values, strings only when allowlisted",[791,4488,4489,4493,4500],{},[806,4490,4491],{},[457,4492,584],{},[806,4494,4495,4496,650,4498],{},"you via ",[457,4497,504],{},[457,4499,593],{},[806,4501,4502],{},"Business counters, categorical dimensions, schema version",[454,4504,4505],{},"Think of it as two contracts:",[519,4507,4508,4520],{},[522,4509,4510,1391,4513,4516,4517,4519],{},[470,4511,4512],{},"Transport contract",[457,4514,4515],{},"RunEvent",") — owned by ",[457,4518,459],{},", stable across tools",[522,4521,4522,1391,4525,4527,4528,4530,4531,4533],{},[470,4523,4524],{},"Product contract",[457,4526,584],{}," + declared ",[457,4529,3030],{},") — owned by you, declared in ",[457,4532,981],{},", mirrored on the server",[878,4535,4537],{"id":4536},"declare-your-extensions-once","Declare your extensions once",[454,4539,4540,4541,577,4543,4545],{},"Everything you collect beyond the standard envelope is declared inline in the same ",[457,4542,548],{},[457,4544,3955],{}," call:",[475,4547,4549],{"className":706,"code":4548,"filename":552,"language":708,"meta":480,"style":480},"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",[457,4550,4551,4561,4576,4591,4606,4615,4624,4660,4689,4693,4702,4740,4778,4814,4818,4822],{"__ignoreMap":480},[484,4552,4553,4555,4557,4559],{"class":486,"line":487},[484,4554,527],{"class":715},[484,4556,719],{"class":718},[484,4558,723],{"class":722},[484,4560,726],{"class":722},[484,4562,4563,4565,4567,4569,4572,4574],{"class":486,"line":729},[484,4564,733],{"class":732},[484,4566,736],{"class":722},[484,4568,766],{"class":722},[484,4570,4571],{"class":494},"acme-cli",[484,4573,772],{"class":722},[484,4575,742],{"class":722},[484,4577,4578,4580,4582,4584,4587,4589],{"class":486,"line":745},[484,4579,748],{"class":732},[484,4581,736],{"class":722},[484,4583,766],{"class":722},[484,4585,4586],{"class":494},"2.1.0",[484,4588,772],{"class":722},[484,4590,742],{"class":722},[484,4592,4593,4595,4597,4599,4602,4604],{"class":486,"line":758},[484,4594,761],{"class":732},[484,4596,736],{"class":722},[484,4598,766],{"class":722},[484,4600,4601],{"class":494},"https:\u002F\u002Ftelemetry.acme.dev\u002Fapi\u002Fingest",[484,4603,772],{"class":722},[484,4605,742],{"class":722},[484,4607,4608,4611,4613],{"class":486,"line":777},[484,4609,4610],{"class":732},"  collect",[484,4612,736],{"class":722},[484,4614,726],{"class":722},[484,4616,4617,4620,4622],{"class":486,"line":1130},[484,4618,4619],{"class":732},"    flags",[484,4621,736],{"class":722},[484,4623,726],{"class":722},[484,4625,4626,4629,4631,4633,4635,4637,4639,4641,4643,4646,4648,4650,4652,4654,4656,4658],{"class":486,"line":1173},[484,4627,4628],{"class":732},"      format",[484,4630,736],{"class":722},[484,4632,1106],{"class":718},[484,4634,772],{"class":722},[484,4636,1868],{"class":494},[484,4638,772],{"class":722},[484,4640,723],{"class":722},[484,4642,766],{"class":722},[484,4644,4645],{"class":494},"yaml",[484,4647,772],{"class":722},[484,4649,723],{"class":722},[484,4651,766],{"class":722},[484,4653,785],{"class":494},[484,4655,772],{"class":722},[484,4657,1116],{"class":718},[484,4659,742],{"class":722},[484,4661,4662,4665,4667,4669,4671,4674,4676,4678,4680,4683,4685,4687],{"class":486,"line":1179},[484,4663,4664],{"class":732},"      target",[484,4666,736],{"class":722},[484,4668,1106],{"class":718},[484,4670,772],{"class":722},[484,4672,4673],{"class":494},"staging",[484,4675,772],{"class":722},[484,4677,723],{"class":722},[484,4679,766],{"class":722},[484,4681,4682],{"class":494},"production",[484,4684,772],{"class":722},[484,4686,1116],{"class":718},[484,4688,742],{"class":722},[484,4690,4691],{"class":486,"line":1190},[484,4692,2835],{"class":722},[484,4694,4695,4698,4700],{"class":486,"line":1195},[484,4696,4697],{"class":732},"    fields",[484,4699,736],{"class":722},[484,4701,726],{"class":722},[484,4703,4704,4707,4709,4711,4713,4716,4718,4720,4722,4725,4727,4729,4731,4734,4736,4738],{"class":486,"line":1222},[484,4705,4706],{"class":732},"      product",[484,4708,736],{"class":722},[484,4710,1106],{"class":718},[484,4712,772],{"class":722},[484,4714,4715],{"class":494},"cli",[484,4717,772],{"class":722},[484,4719,723],{"class":722},[484,4721,766],{"class":722},[484,4723,4724],{"class":494},"action",[484,4726,772],{"class":722},[484,4728,723],{"class":722},[484,4730,766],{"class":722},[484,4732,4733],{"class":494},"migrator",[484,4735,772],{"class":722},[484,4737,1116],{"class":718},[484,4739,742],{"class":722},[484,4741,4742,4745,4747,4749,4751,4754,4756,4758,4760,4763,4765,4767,4769,4772,4774,4776],{"class":486,"line":1241},[484,4743,4744],{"class":732},"      plan",[484,4746,736],{"class":722},[484,4748,1106],{"class":718},[484,4750,772],{"class":722},[484,4752,4753],{"class":494},"free",[484,4755,772],{"class":722},[484,4757,723],{"class":722},[484,4759,766],{"class":722},[484,4761,4762],{"class":494},"pro",[484,4764,772],{"class":722},[484,4766,723],{"class":722},[484,4768,766],{"class":722},[484,4770,4771],{"class":494},"enterprise",[484,4773,772],{"class":722},[484,4775,1116],{"class":718},[484,4777,742],{"class":722},[484,4779,4780,4783,4785,4787,4789,4791,4793,4795,4797,4799,4801,4803,4805,4808,4810,4812],{"class":486,"line":1501},[484,4781,4782],{"class":732},"      framework",[484,4784,736],{"class":722},[484,4786,1106],{"class":718},[484,4788,772],{"class":722},[484,4790,2953],{"class":494},[484,4792,772],{"class":722},[484,4794,723],{"class":722},[484,4796,766],{"class":722},[484,4798,2962],{"class":494},[484,4800,772],{"class":722},[484,4802,723],{"class":722},[484,4804,766],{"class":722},[484,4806,4807],{"class":494},"remix",[484,4809,772],{"class":722},[484,4811,1116],{"class":718},[484,4813,742],{"class":722},[484,4815,4816],{"class":486,"line":1509},[484,4817,2835],{"class":722},[484,4819,4820],{"class":486,"line":1528},[484,4821,1176],{"class":722},[484,4823,4824,4826],{"class":486,"line":1543},[484,4825,780],{"class":722},[484,4827,783],{"class":718},[454,4829,4830],{},"Inside handlers, add counters and dimensions:",[475,4832,4835],{"className":706,"code":4833,"filename":4834,"language":708,"meta":480,"style":480},"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",[457,4836,4837,4866,4882,4894,4913,4929,4947,4962,4968],{"__ignoreMap":480},[484,4838,4839,4841,4843,4845,4847,4849,4851,4854,4856,4858,4860,4862,4864],{"class":486,"line":487},[484,4840,4044],{"class":1053},[484,4842,4047],{"class":718},[484,4844,869],{"class":722},[484,4846,3009],{"class":715},[484,4848,1206],{"class":718},[484,4850,772],{"class":722},[484,4852,4853],{"class":494},"deploy",[484,4855,772],{"class":722},[484,4857,723],{"class":722},[484,4859,1719],{"class":1087},[484,4861,4067],{"class":722},[484,4863,1399],{"class":1087},[484,4865,726],{"class":722},[484,4867,4868,4870,4873,4875,4877,4880],{"class":486,"line":729},[484,4869,1406],{"class":1087},[484,4871,4872],{"class":718}," result",[484,4874,1412],{"class":722},[484,4876,1415],{"class":1053},[484,4878,4879],{"class":715}," deployServices",[484,4881,1758],{"class":732},[484,4883,4884,4886,4888,4890,4892],{"class":486,"line":745},[484,4885,3356],{"class":718},[484,4887,869],{"class":722},[484,4889,3361],{"class":715},[484,4891,1206],{"class":732},[484,4893,1450],{"class":722},[484,4895,4896,4899,4901,4903,4905,4908,4910],{"class":486,"line":758},[484,4897,4898],{"class":732},"    servicesDeployed",[484,4900,736],{"class":722},[484,4902,4872],{"class":718},[484,4904,869],{"class":722},[484,4906,4907],{"class":718},"count",[484,4909,723],{"class":722},[484,4911,4912],{"class":2516},"   \u002F\u002F number — always allowed\n",[484,4914,4915,4918,4920,4924,4926],{"class":486,"line":777},[484,4916,4917],{"class":732},"    rollbackUsed",[484,4919,736],{"class":722},[484,4921,4923],{"class":4922},"sfNiH"," false",[484,4925,723],{"class":722},[484,4927,4928],{"class":2516},"              \u002F\u002F boolean — always allowed\n",[484,4930,4931,4934,4936,4938,4940,4942,4944],{"class":486,"line":1130},[484,4932,4933],{"class":732},"    framework",[484,4935,736],{"class":722},[484,4937,766],{"class":722},[484,4939,2953],{"class":494},[484,4941,772],{"class":722},[484,4943,723],{"class":722},[484,4945,4946],{"class":2516},"                \u002F\u002F string — allowed (in collect.fields)\n",[484,4948,4949,4952,4954,4957,4959],{"class":486,"line":1173},[484,4950,4951],{"class":732},"    schemaVersion",[484,4953,736],{"class":722},[484,4955,4956],{"class":1464}," 2",[484,4958,723],{"class":722},[484,4960,4961],{"class":2516},"                 \u002F\u002F number — version your custom shape\n",[484,4963,4964,4966],{"class":486,"line":1179},[484,4965,1570],{"class":722},[484,4967,783],{"class":732},[484,4969,4970,4972],{"class":486,"line":1190},[484,4971,780],{"class":722},[484,4973,783],{"class":718},[454,4975,4976,4977,4980,4981,869],{},"Undeclared strings are ",[470,4978,4979],{},"dropped at runtime",", never thrown. That is the privacy guarantee — no accidental paths, tokens, or free-form PII in ",[457,4982,584],{},[4984,4985,4986,4989,4990,4993,4994,4996,4997,4999,5000,5002],"note",{},[470,4987,4988],{},"Typing:"," ",[457,4991,4992],{},"TelemetryHandle.set()"," autocomplete covers declared ",[457,4995,593],{}," keys. Use the ambient ",[457,4998,504],{}," for extra numeric\u002Fboolean counters in the same run — both merge into ",[457,5001,584],{}," before the event is recorded.",[878,5004,5006],{"id":5005},"mirror-on-the-server","Mirror on the server",[454,5008,5009],{},"Your ingest handler is the second gate. Pass the same tool name and custom keys you declared on the CLI:",[475,5011,5014],{"className":706,"code":5012,"filename":5013,"language":708,"meta":480,"style":480},"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",[457,5015,5016,5034,5038,5050,5080,5109,5127,5136,5140,5162,5181,5199,5218,5240,5246,5251],{"__ignoreMap":480},[484,5017,5018,5020,5022,5024,5026,5028,5030,5032],{"class":486,"line":487},[484,5019,1054],{"class":1053},[484,5021,1057],{"class":722},[484,5023,1060],{"class":718},[484,5025,1063],{"class":722},[484,5027,1066],{"class":1053},[484,5029,766],{"class":722},[484,5031,645],{"class":494},[484,5033,1073],{"class":722},[484,5035,5036],{"class":486,"line":729},[484,5037,1079],{"emptyLinePlaceholder":1078},[484,5039,5040,5042,5045,5047],{"class":486,"line":745},[484,5041,1993],{"class":1087},[484,5043,5044],{"class":718}," ALLOWED_CUSTOM ",[484,5046,1094],{"class":722},[484,5048,5049],{"class":718}," [\n",[484,5051,5052,5055,5058,5060,5062,5064,5067,5069,5071,5073,5076,5078],{"class":486,"line":758},[484,5053,5054],{"class":722},"  '",[484,5056,5057],{"class":494},"servicesDeployed",[484,5059,772],{"class":722},[484,5061,723],{"class":722},[484,5063,766],{"class":722},[484,5065,5066],{"class":494},"rollbackUsed",[484,5068,772],{"class":722},[484,5070,723],{"class":722},[484,5072,766],{"class":722},[484,5074,5075],{"class":494},"framework",[484,5077,772],{"class":722},[484,5079,742],{"class":722},[484,5081,5082,5084,5087,5089,5091,5093,5096,5098,5100,5102,5105,5107],{"class":486,"line":777},[484,5083,5054],{"class":722},[484,5085,5086],{"class":494},"product",[484,5088,772],{"class":722},[484,5090,723],{"class":722},[484,5092,766],{"class":722},[484,5094,5095],{"class":494},"plan",[484,5097,772],{"class":722},[484,5099,723],{"class":722},[484,5101,766],{"class":722},[484,5103,5104],{"class":494},"schemaVersion",[484,5106,772],{"class":722},[484,5108,742],{"class":722},[484,5110,5111,5113,5115,5117,5119,5121,5123,5125],{"class":486,"line":1130},[484,5112,5054],{"class":722},[484,5114,4163],{"class":494},[484,5116,772],{"class":722},[484,5118,723],{"class":722},[484,5120,766],{"class":722},[484,5122,4167],{"class":494},[484,5124,772],{"class":722},[484,5126,742],{"class":722},[484,5128,5129,5131,5134],{"class":486,"line":1173},[484,5130,2929],{"class":718},[484,5132,5133],{"class":1053},"as",[484,5135,1187],{"class":1087},[484,5137,5138],{"class":486,"line":1179},[484,5139,1079],{"emptyLinePlaceholder":1078},[484,5141,5142,5144,5146,5148,5150,5152,5154,5156,5158,5160],{"class":486,"line":1190},[484,5143,1084],{"class":1053},[484,5145,1719],{"class":1087},[484,5147,1200],{"class":1087},[484,5149,1724],{"class":715},[484,5151,1206],{"class":722},[484,5153,2060],{"class":1209},[484,5155,736],{"class":722},[484,5157,1734],{"class":490},[484,5159,536],{"class":722},[484,5161,726],{"class":722},[484,5163,5164,5166,5168,5170,5172,5175,5177,5179],{"class":486,"line":1195},[484,5165,1406],{"class":1087},[484,5167,1409],{"class":718},[484,5169,1412],{"class":722},[484,5171,1415],{"class":1053},[484,5173,5174],{"class":718}," req",[484,5176,869],{"class":722},[484,5178,691],{"class":715},[484,5180,1758],{"class":732},[484,5182,5183,5185,5187,5189,5191,5193,5195,5197],{"class":486,"line":1222},[484,5184,1406],{"class":1087},[484,5186,1515],{"class":718},[484,5188,1412],{"class":722},[484,5190,1060],{"class":715},[484,5192,1206],{"class":732},[484,5194,1210],{"class":718},[484,5196,723],{"class":722},[484,5198,726],{"class":722},[484,5200,5201,5204,5206,5208,5210,5212,5214,5216],{"class":486,"line":1241},[484,5202,5203],{"class":732},"    allowedTools",[484,5205,736],{"class":722},[484,5207,1106],{"class":732},[484,5209,772],{"class":722},[484,5211,4571],{"class":494},[484,5213,772],{"class":722},[484,5215,1116],{"class":732},[484,5217,742],{"class":722},[484,5219,5220,5223,5225,5227,5229,5231,5233,5235,5238],{"class":486,"line":1501},[484,5221,5222],{"class":732},"    allowedCustomKeys",[484,5224,736],{"class":722},[484,5226,1057],{"class":722},[484,5228,766],{"class":722},[484,5230,4571],{"class":732},[484,5232,772],{"class":722},[484,5234,736],{"class":722},[484,5236,5237],{"class":718}," ALLOWED_CUSTOM",[484,5239,2353],{"class":722},[484,5241,5242,5244],{"class":486,"line":1509},[484,5243,1570],{"class":722},[484,5245,783],{"class":732},[484,5247,5248],{"class":486,"line":1528},[484,5249,5250],{"class":2516},"  \u002F\u002F dedupe on idempotencyKey, then persist\n",[484,5252,5253],{"class":486,"line":1543},[484,5254,1244],{"class":722},[454,5256,5257,5259,5260,5262],{},[457,5258,641],{}," strips any ",[457,5261,584],{}," key you did not list — even if a client somehow sent it.",[878,5264,5266],{"id":5265},"map-to-your-warehouse-schema","Map to your warehouse schema",[454,5268,5269,5270,5272],{},"After validation, shape the event for ",[470,5271,684],{}," database. The evlog envelope is the wire format; your tables are your choice:",[475,5274,5276],{"className":706,"code":5275,"filename":2222,"language":708,"meta":480,"style":480},"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",[457,5277,5278,5298,5304,5320,5335,5350,5369,5389,5409,5428,5446,5465,5490,5511,5531,5547,5551],{"__ignoreMap":480},[484,5279,5280,5283,5286,5288,5290,5292,5294,5296],{"class":486,"line":487},[484,5281,5282],{"class":1087},"function",[484,5284,5285],{"class":715}," toRow",[484,5287,1206],{"class":722},[484,5289,1394],{"class":1209},[484,5291,736],{"class":722},[484,5293,2236],{"class":490},[484,5295,536],{"class":722},[484,5297,726],{"class":722},[484,5299,5300,5302],{"class":486,"line":729},[484,5301,1225],{"class":1053},[484,5303,726],{"class":722},[484,5305,5306,5309,5311,5314,5316,5318],{"class":486,"line":745},[484,5307,5308],{"class":732},"    command",[484,5310,736],{"class":722},[484,5312,5313],{"class":718}," event",[484,5315,869],{"class":722},[484,5317,2416],{"class":718},[484,5319,742],{"class":722},[484,5321,5322,5325,5327,5329,5331,5333],{"class":486,"line":758},[484,5323,5324],{"class":732},"    duration_ms",[484,5326,736],{"class":722},[484,5328,5313],{"class":718},[484,5330,869],{"class":722},[484,5332,2448],{"class":718},[484,5334,742],{"class":722},[484,5336,5337,5340,5342,5344,5346,5348],{"class":486,"line":777},[484,5338,5339],{"class":732},"    outcome",[484,5341,736],{"class":722},[484,5343,5313],{"class":718},[484,5345,869],{"class":722},[484,5347,2432],{"class":718},[484,5349,742],{"class":722},[484,5351,5352,5355,5357,5359,5361,5363,5365,5367],{"class":486,"line":1130},[484,5353,5354],{"class":732},"    tool_version",[484,5356,736],{"class":722},[484,5358,5313],{"class":718},[484,5360,869],{"class":722},[484,5362,2376],{"class":718},[484,5364,869],{"class":722},[484,5366,2400],{"class":718},[484,5368,742],{"class":722},[484,5370,5371,5374,5376,5378,5380,5382,5384,5387],{"class":486,"line":1173},[484,5372,5373],{"class":732},"    format",[484,5375,736],{"class":722},[484,5377,5313],{"class":718},[484,5379,869],{"class":722},[484,5381,3030],{"class":718},[484,5383,869],{"class":722},[484,5385,5386],{"class":718},"format",[484,5388,742],{"class":722},[484,5390,5391,5394,5396,5398,5400,5402,5404,5407],{"class":486,"line":1179},[484,5392,5393],{"class":732},"    target",[484,5395,736],{"class":722},[484,5397,5313],{"class":718},[484,5399,869],{"class":722},[484,5401,3030],{"class":718},[484,5403,869],{"class":722},[484,5405,5406],{"class":718},"target",[484,5408,742],{"class":722},[484,5410,5411,5414,5416,5418,5420,5422,5424,5426],{"class":486,"line":1190},[484,5412,5413],{"class":732},"    services_deployed",[484,5415,736],{"class":722},[484,5417,5313],{"class":718},[484,5419,869],{"class":722},[484,5421,584],{"class":718},[484,5423,869],{"class":722},[484,5425,5057],{"class":718},[484,5427,742],{"class":722},[484,5429,5430,5432,5434,5436,5438,5440,5442,5444],{"class":486,"line":1195},[484,5431,4933],{"class":732},[484,5433,736],{"class":722},[484,5435,5313],{"class":718},[484,5437,869],{"class":722},[484,5439,584],{"class":718},[484,5441,869],{"class":722},[484,5443,5075],{"class":718},[484,5445,742],{"class":722},[484,5447,5448,5451,5453,5455,5457,5459,5461,5463],{"class":486,"line":1222},[484,5449,5450],{"class":732},"    plan",[484,5452,736],{"class":722},[484,5454,5313],{"class":718},[484,5456,869],{"class":722},[484,5458,584],{"class":718},[484,5460,869],{"class":722},[484,5462,5095],{"class":718},[484,5464,742],{"class":722},[484,5466,5467,5470,5472,5474,5476,5478,5480,5482,5485,5488],{"class":486,"line":1241},[484,5468,5469],{"class":732},"    schema_version",[484,5471,736],{"class":722},[484,5473,5313],{"class":718},[484,5475,869],{"class":722},[484,5477,584],{"class":718},[484,5479,869],{"class":722},[484,5481,5104],{"class":718},[484,5483,5484],{"class":722}," ??",[484,5486,5487],{"class":1464}," 1",[484,5489,742],{"class":722},[484,5491,5492,5495,5497,5499,5501,5504,5506,5509],{"class":486,"line":1501},[484,5493,5494],{"class":732},"    is_ci",[484,5496,736],{"class":722},[484,5498,5313],{"class":718},[484,5500,869],{"class":722},[484,5502,5503],{"class":718},"env",[484,5505,869],{"class":722},[484,5507,5508],{"class":718},"ci",[484,5510,742],{"class":722},[484,5512,5513,5516,5518,5520,5522,5524,5526,5529],{"class":486,"line":1509},[484,5514,5515],{"class":732},"    node",[484,5517,736],{"class":722},[484,5519,5313],{"class":718},[484,5521,869],{"class":722},[484,5523,5503],{"class":718},[484,5525,869],{"class":722},[484,5527,5528],{"class":718},"node",[484,5530,742],{"class":722},[484,5532,5533,5536,5538,5540,5543,5545],{"class":486,"line":1528},[484,5534,5535],{"class":732},"    received_at",[484,5537,736],{"class":722},[484,5539,1799],{"class":722},[484,5541,5542],{"class":715}," Date",[484,5544,3219],{"class":732},[484,5546,742],{"class":722},[484,5548,5549],{"class":486,"line":1543},[484,5550,1494],{"class":722},[484,5552,5553],{"class":486,"line":1559},[484,5554,1244],{"class":722},[454,5556,5557,5558,5560,5561,5563],{},"This is where a company \"modifies the schema\" in practice — not by changing ",[457,5559,4515],{},", but by defining how ",[457,5562,584],{}," maps into internal analytics tables.",[878,5565,5567,5568],{"id":5566},"version-breaking-changes-in-custom","Version breaking changes in ",[457,5569,584],{},[454,5571,5572,5573,549,5575,5577],{},"When your product counters evolve, bump a numeric ",[457,5574,5104],{},[457,5576,584],{}," (no allowlist needed) and branch in the ingest mapper:",[475,5579,5581],{"className":706,"code":5580,"language":708,"meta":480,"style":480},"const version = (event.custom.schemaVersion as number | undefined) ?? 1\nif (version === 1) return mapV1(event)\nreturn mapV2(event)\n",[457,5582,5583,5623,5647],{"__ignoreMap":480},[484,5584,5585,5587,5590,5592,5595,5597,5599,5601,5604,5606,5609,5612,5615,5617,5620],{"class":486,"line":487},[484,5586,1993],{"class":1087},[484,5588,5589],{"class":718}," version ",[484,5591,1094],{"class":722},[484,5593,5594],{"class":718}," (event",[484,5596,869],{"class":722},[484,5598,584],{"class":718},[484,5600,869],{"class":722},[484,5602,5603],{"class":718},"schemaVersion ",[484,5605,5133],{"class":1053},[484,5607,5608],{"class":490}," number",[484,5610,5611],{"class":722}," |",[484,5613,5614],{"class":490}," undefined",[484,5616,1447],{"class":718},[484,5618,5619],{"class":722},"??",[484,5621,5622],{"class":1464}," 1\n",[484,5624,5625,5628,5631,5634,5636,5638,5641,5644],{"class":486,"line":729},[484,5626,5627],{"class":1053},"if",[484,5629,5630],{"class":718}," (version ",[484,5632,5633],{"class":722},"===",[484,5635,5487],{"class":1464},[484,5637,1447],{"class":718},[484,5639,5640],{"class":1053},"return",[484,5642,5643],{"class":715}," mapV1",[484,5645,5646],{"class":718},"(event)\n",[484,5648,5649,5651,5654],{"class":486,"line":745},[484,5650,5640],{"class":1053},[484,5652,5653],{"class":715}," mapV2",[484,5655,5646],{"class":718},[454,5657,5658,5659,5661,5662,5664],{},"Commit an updated ",[457,5660,619],{}," whenever ",[457,5663,981],{}," changes so disclosure stays aligned with releases.",[878,5666,5668],{"id":5667},"multiple-tools-one-endpoint","Multiple tools, one endpoint",[454,5670,5671,5672,736],{},"If several CLIs POST to the same ingest URL, namespace custom keys or rely on ",[457,5673,965],{},[475,5675,5677],{"className":706,"code":5676,"language":708,"meta":480,"style":480},"\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",[457,5678,5679,5684,5722,5726,5731,5739,5769,5807],{"__ignoreMap":480},[484,5680,5681],{"class":486,"line":487},[484,5682,5683],{"class":2516},"\u002F\u002F Option A — prefix keys per product line\n",[484,5685,5686,5689,5691,5693,5695,5697,5700,5702,5704,5706,5708,5710,5713,5715,5718,5720],{"class":486,"line":729},[484,5687,5688],{"class":718},"telemetry",[484,5690,869],{"class":722},[484,5692,3361],{"class":715},[484,5694,1206],{"class":718},[484,5696,1873],{"class":722},[484,5698,5699],{"class":732}," acme_product",[484,5701,736],{"class":722},[484,5703,766],{"class":722},[484,5705,4715],{"class":494},[484,5707,772],{"class":722},[484,5709,723],{"class":722},[484,5711,5712],{"class":732}," deployCount",[484,5714,736],{"class":722},[484,5716,5717],{"class":1464}," 3",[484,5719,1063],{"class":722},[484,5721,783],{"class":718},[484,5723,5724],{"class":486,"line":745},[484,5725,1079],{"emptyLinePlaceholder":1078},[484,5727,5728],{"class":486,"line":758},[484,5729,5730],{"class":2516},"\u002F\u002F Option B — separate allowedCustomKeys per tool.name in parseIngestBody\n",[484,5732,5733,5735,5737],{"class":486,"line":777},[484,5734,653],{"class":490},[484,5736,736],{"class":722},[484,5738,726],{"class":722},[484,5740,5741,5743,5745,5747,5750,5752,5755,5757,5759,5761,5763,5765,5767],{"class":486,"line":1130},[484,5742,5054],{"class":722},[484,5744,4571],{"class":494},[484,5746,772],{"class":722},[484,5748,5749],{"class":732},": [",[484,5751,772],{"class":722},[484,5753,5754],{"class":494},"deployCount",[484,5756,772],{"class":722},[484,5758,723],{"class":722},[484,5760,766],{"class":722},[484,5762,5075],{"class":494},[484,5764,772],{"class":722},[484,5766,1116],{"class":732},[484,5768,742],{"class":722},[484,5770,5771,5773,5776,5778,5780,5782,5785,5787,5789,5791,5793,5795,5797,5799,5801,5803,5805],{"class":486,"line":1173},[484,5772,5054],{"class":722},[484,5774,5775],{"class":494},"acme-action",[484,5777,772],{"class":722},[484,5779,5749],{"class":732},[484,5781,772],{"class":722},[484,5783,5784],{"class":494},"jobDuration",[484,5786,772],{"class":722},[484,5788,723],{"class":722},[484,5790,766],{"class":722},[484,5792,4163],{"class":494},[484,5794,772],{"class":722},[484,5796,723],{"class":722},[484,5798,766],{"class":722},[484,5800,4167],{"class":494},[484,5802,772],{"class":722},[484,5804,1116],{"class":732},[484,5806,742],{"class":722},[484,5808,5809],{"class":486,"line":1179},[484,5810,1244],{"class":722},[878,5812,5814],{"id":5813},"what-v1-does-not-support","What v1 does not support",[785,5816,5817,5830],{},[788,5818,5819],{},[791,5820,5821,5824,5827],{},[794,5822,5823],{},"Need",[794,5825,5826],{},"v1 answer",[794,5828,5829],{},"Workaround",[801,5831,5832,5851,5870,5887,5898],{},[791,5833,5834,5840,5843],{},[806,5835,5836,5837,536],{},"New top-level field (",[457,5838,5839],{},"tenantId",[806,5841,5842],{},"Not on the wire",[806,5844,5845,5846,5848,5849],{},"Flat key in ",[457,5847,584],{}," + allowlist, or map server-side from ",[457,5850,2538],{},[791,5852,5853,5859,5862],{},[806,5854,5855,5856,536],{},"Nested objects (",[457,5857,5858],{},"custom.user.plan",[806,5860,5861],{},"Flat records only",[806,5863,5864,5865,646,5868],{},"Flatten: ",[457,5866,5867],{},"userPlan: 'pro'",[457,5869,593],{},[791,5871,5872,5875,5878],{},[806,5873,5874],{},"Free-form strings (paths, emails)",[806,5876,5877],{},"Blocked by design",[806,5879,5880,5881,5884,5885],{},"Presence-only on flags (",[457,5882,5883],{},"output: true",") or hash before ",[457,5886,504],{},[791,5888,5889,5892,5895],{},[806,5890,5891],{},"Different schema per command",[806,5893,5894],{},"One envelope per run",[806,5896,5897],{},"Convention: only set relevant keys per command",[791,5899,5900,5903,5906],{},[806,5901,5902],{},"Transform before outbox",[806,5904,5905],{},"No hook yet",[806,5907,5908],{},"Map on the server (recommended) or see planned v2 below",[883,5910,5911,5914,5915,5917,5918,650,5920,5922],{},[470,5912,5913],{},"Rule of thumb:"," if it is safe to print in ",[457,5916,619],{}," and fits a closed set or a number, it belongs in ",[457,5919,981],{},[457,5921,584],{},". Everything else stays server-side.",[878,5924,5926],{"id":5925},"planned-v2-extensions","Planned v2 extensions",[454,5928,5929],{},"Not shipped yet — design targets for when the v1 extension zones are not enough:",[454,5931,5932,5938],{},[470,5933,5934,5937],{},[457,5935,5936],{},"enrich"," hook"," — run after sanitization, before the outbox append. Lets you inject computed fields without forking the package:",[475,5940,5942],{"className":706,"code":5941,"language":708,"meta":480,"style":480},"\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",[457,5943,5944,5949,5957,5971,5986,6028,6041,6047,6056,6065,6078,6089,6093,6097,6101],{"__ignoreMap":480},[484,5945,5946],{"class":486,"line":487},[484,5947,5948],{"class":2516},"\u002F\u002F Planned API — not available in v1\n",[484,5950,5951,5953,5955],{"class":486,"line":729},[484,5952,531],{"class":715},[484,5954,1206],{"class":718},[484,5956,1450],{"class":722},[484,5958,5959,5961,5963,5965,5967,5969],{"class":486,"line":745},[484,5960,733],{"class":732},[484,5962,736],{"class":722},[484,5964,766],{"class":722},[484,5966,4571],{"class":494},[484,5968,772],{"class":722},[484,5970,742],{"class":722},[484,5972,5973,5975,5977,5979,5982,5984],{"class":486,"line":758},[484,5974,748],{"class":732},[484,5976,736],{"class":722},[484,5978,766],{"class":722},[484,5980,5981],{"class":494},"3.0.0",[484,5983,772],{"class":722},[484,5985,742],{"class":722},[484,5987,5988,5990,5992,5994,5997,5999,6001,6004,6006,6008,6010,6012,6014,6016,6018,6020,6022,6024,6026],{"class":486,"line":777},[484,5989,4610],{"class":732},[484,5991,736],{"class":722},[484,5993,1057],{"class":722},[484,5995,5996],{"class":732}," fields",[484,5998,736],{"class":722},[484,6000,1057],{"class":722},[484,6002,6003],{"class":732}," product",[484,6005,736],{"class":722},[484,6007,1106],{"class":718},[484,6009,772],{"class":722},[484,6011,4715],{"class":494},[484,6013,772],{"class":722},[484,6015,723],{"class":722},[484,6017,766],{"class":722},[484,6019,4724],{"class":494},[484,6021,772],{"class":722},[484,6023,2929],{"class":718},[484,6025,780],{"class":722},[484,6027,2353],{"class":722},[484,6029,6030,6033,6035,6037,6039],{"class":486,"line":1130},[484,6031,6032],{"class":732},"  enrich",[484,6034,1206],{"class":722},[484,6036,1394],{"class":1209},[484,6038,536],{"class":722},[484,6040,726],{"class":722},[484,6042,6043,6045],{"class":486,"line":1173},[484,6044,1472],{"class":1053},[484,6046,726],{"class":722},[484,6048,6049,6052,6054],{"class":486,"line":1179},[484,6050,6051],{"class":722},"      ...",[484,6053,1394],{"class":718},[484,6055,742],{"class":722},[484,6057,6058,6061,6063],{"class":486,"line":1190},[484,6059,6060],{"class":732},"      custom",[484,6062,736],{"class":722},[484,6064,726],{"class":722},[484,6066,6067,6070,6072,6074,6076],{"class":486,"line":1195},[484,6068,6069],{"class":722},"        ...",[484,6071,1394],{"class":718},[484,6073,869],{"class":722},[484,6075,584],{"class":718},[484,6077,742],{"class":722},[484,6079,6080,6083,6085,6087],{"class":486,"line":1222},[484,6081,6082],{"class":732},"        schemaVersion",[484,6084,736],{"class":722},[484,6086,4956],{"class":1464},[484,6088,742],{"class":722},[484,6090,6091],{"class":486,"line":1241},[484,6092,2486],{"class":722},[484,6094,6095],{"class":486,"line":1501},[484,6096,3623],{"class":722},[484,6098,6099],{"class":486,"line":1509},[484,6100,1176],{"class":722},[484,6102,6103,6105],{"class":486,"line":1528},[484,6104,780],{"class":722},[484,6106,783],{"class":718},[454,6108,6109,6110,6112,6113,6115],{},"The hook cannot bypass sanitization rules — strings still require ",[457,6111,593],{},". Server-side ",[457,6114,653],{}," stays the source of truth.",[454,6117,6118,6121,6122,6125,6126,869],{},[470,6119,6120],{},"Namespaced keys"," — optional ",[457,6123,6124],{},"acme.product"," convention for multi-tool endpoints without prefix collisions. Would be documented in disclosure as ",[457,6127,6128],{},"acme.product: cli | action",[454,6130,6131,6132,6134],{},"If you need one of these before v2 lands, open a discussion on the repo — the v1 path (",[457,6133,584],{}," + server mapping) covers most product analytics needs.",[667,6136,6138],{"id":6137},"privacy","Privacy",[454,6140,6141,6142,6144,6145,6148],{},"Raw ",[457,6143,508],{}," is never read. Sanitization applies to ",[470,6146,6147],{},"citty-parsed"," flags only:",[519,6150,6151,6164,6175],{},[522,6152,6153,6156,6157,6160,6161,536],{},[470,6154,6155],{},"Booleans \u002F numbers"," → value stored (",[457,6158,6159],{},"json: true",", ",[457,6162,6163],{},"limit: 50",[522,6165,6166,6169,6170,6172,6173],{},[470,6167,6168],{},"Strings"," → presence only (",[457,6171,5883],{},") unless allowlisted in ",[457,6174,590],{},[522,6176,6177,6181,6182,6184],{},[470,6178,6179],{},[457,6180,504],{}," → numbers and booleans always; strings only via ",[457,6183,593],{}," (undeclared values are dropped at runtime, never thrown)",[475,6186,6188],{"className":706,"code":6187,"filename":552,"language":708,"meta":480,"style":480},"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",[457,6189,6190,6198,6235,6271],{"__ignoreMap":480},[484,6191,6192,6194,6196],{"class":486,"line":487},[484,6193,981],{"class":490},[484,6195,736],{"class":722},[484,6197,726],{"class":722},[484,6199,6200,6203,6205,6207,6209,6211,6213,6215,6217,6219,6221,6223,6225,6227,6229,6232],{"class":486,"line":729},[484,6201,6202],{"class":490},"  flags",[484,6204,736],{"class":722},[484,6206,1057],{"class":722},[484,6208,2907],{"class":490},[484,6210,736],{"class":722},[484,6212,1106],{"class":732},[484,6214,772],{"class":722},[484,6216,1868],{"class":494},[484,6218,772],{"class":722},[484,6220,723],{"class":722},[484,6222,766],{"class":722},[484,6224,2924],{"class":494},[484,6226,772],{"class":722},[484,6228,2929],{"class":732},[484,6230,6231],{"class":722},"},",[484,6233,6234],{"class":2516},"           \u002F\u002F --format json → \"json\"; --format yaml → true\n",[484,6236,6237,6240,6242,6244,6246,6248,6250,6252,6254,6256,6258,6260,6262,6264,6266,6268],{"class":486,"line":745},[484,6238,6239],{"class":490},"  fields",[484,6241,736],{"class":722},[484,6243,1057],{"class":722},[484,6245,2944],{"class":490},[484,6247,736],{"class":722},[484,6249,1106],{"class":732},[484,6251,772],{"class":722},[484,6253,2953],{"class":494},[484,6255,772],{"class":722},[484,6257,723],{"class":722},[484,6259,766],{"class":722},[484,6261,2962],{"class":494},[484,6263,772],{"class":722},[484,6265,2929],{"class":732},[484,6267,6231],{"class":722},[484,6269,6270],{"class":2516},"      \u002F\u002F telemetry.set({ framework: 'nuxt' }) ok\n",[484,6272,6273],{"class":486,"line":758},[484,6274,1244],{"class":722},[454,6276,6277,6278,577,6280,6282,6283,6285],{},"Declare allowlists in the same ",[457,6279,548],{},[457,6281,3955],{}," call as ",[457,6284,981],{}," — no separate config file.",[667,6287,6289],{"id":6288},"disclosure","Disclosure",[454,6291,6292,6294,6295,6297,6298,6300],{},[457,6293,615],{}," produces markdown + JSON from the standard envelope plus your ",[457,6296,981],{}," extensions. Commit the output (e.g. ",[457,6299,619],{},") so it stays in sync with releases:",[475,6302,6305],{"className":706,"code":6303,"filename":6304,"language":708,"meta":480,"style":480},"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",[457,6306,6307,6327,6346,6350,6377,6409,6415,6419],{"__ignoreMap":480},[484,6308,6309,6311,6313,6316,6318,6320,6322,6325],{"class":486,"line":487},[484,6310,1054],{"class":1053},[484,6312,1057],{"class":722},[484,6314,6315],{"class":718}," writeFile",[484,6317,1063],{"class":722},[484,6319,1066],{"class":1053},[484,6321,766],{"class":722},[484,6323,6324],{"class":494},"node:fs\u002Fpromises",[484,6326,1073],{"class":722},[484,6328,6329,6331,6333,6336,6338,6340,6342,6344],{"class":486,"line":729},[484,6330,1054],{"class":1053},[484,6332,1057],{"class":722},[484,6334,6335],{"class":718}," generateDisclosure",[484,6337,1063],{"class":722},[484,6339,1066],{"class":1053},[484,6341,766],{"class":722},[484,6343,459],{"class":494},[484,6345,1073],{"class":722},[484,6347,6348],{"class":486,"line":745},[484,6349,1079],{"emptyLinePlaceholder":1078},[484,6351,6352,6354,6356,6359,6361,6363,6365,6367,6369,6371,6373,6375],{"class":486,"line":758},[484,6353,1993],{"class":1087},[484,6355,1057],{"class":722},[484,6357,6358],{"class":718}," markdown ",[484,6360,780],{"class":722},[484,6362,1412],{"class":722},[484,6364,6335],{"class":715},[484,6366,1206],{"class":718},[484,6368,772],{"class":722},[484,6370,1111],{"class":494},[484,6372,772],{"class":722},[484,6374,723],{"class":722},[484,6376,726],{"class":722},[484,6378,6379,6381,6383,6385,6387,6389,6391,6393,6395,6397,6399,6401,6403,6405,6407],{"class":486,"line":777},[484,6380,6202],{"class":732},[484,6382,736],{"class":722},[484,6384,1057],{"class":722},[484,6386,2907],{"class":732},[484,6388,736],{"class":722},[484,6390,1106],{"class":718},[484,6392,772],{"class":722},[484,6394,1868],{"class":494},[484,6396,772],{"class":722},[484,6398,723],{"class":722},[484,6400,766],{"class":722},[484,6402,2924],{"class":494},[484,6404,772],{"class":722},[484,6406,2929],{"class":718},[484,6408,2774],{"class":722},[484,6410,6411,6413],{"class":486,"line":1130},[484,6412,780],{"class":722},[484,6414,783],{"class":718},[484,6416,6417],{"class":486,"line":1173},[484,6418,1079],{"emptyLinePlaceholder":1078},[484,6420,6421,6423,6425,6427,6429,6431,6433,6435],{"class":486,"line":1179},[484,6422,4044],{"class":1053},[484,6424,6315],{"class":715},[484,6426,1206],{"class":718},[484,6428,772],{"class":722},[484,6430,619],{"class":494},[484,6432,772],{"class":722},[484,6434,723],{"class":722},[484,6436,6437],{"class":718}," markdown)\n",[454,6439,6440,6441,6443,6444,869],{},"Users can also read it at runtime via ",[457,6442,3111],{}," when you wire ",[457,6445,6446],{},"defineTelemetryCommands()",[667,6448,6450],{"id":6449},"consent-and-reliability","Consent and reliability",[454,6452,6453,4989,6456,6458,6459,6461,6462,577,6465,6468],{},[470,6454,6455],{},"Opt-out priority:",[457,6457,822],{}," → ",[457,6460,819],{}," → persisted preference (",[457,6463,6464],{},"disableTelemetry()",[457,6466,6467],{},"telemetry disable","). Opt-out purges the undelivered outbox.",[454,6470,6471,6474,6475,6477],{},[470,6472,6473],{},"Never harms the host:"," telemetry never throws, never blocks exit; ",[457,6476,853],{}," has a 500ms hard cap.",[454,6479,6480,6483,6484,869],{},[470,6481,6482],{},"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 ",[457,6485,2548],{},[454,6487,6488,4989,6491,6493,6494,6496],{},[470,6489,6490],{},"Endpoint:",[457,6492,630],{}," env → ",[457,6495,626],{}," option baked into the CLI. Omit both during local development; ship the URL when your ingest handler is live.",[667,6498,6500],{"id":6499},"debug","Debug",[475,6502,6504],{"className":477,"code":6503,"language":479,"meta":480,"style":480},"EVLOG_TELEMETRY_DEBUG=1 my-tool doctor\nEVLOG_TELEMETRY=0 my-tool sync\n",[457,6505,6506,6522],{"__ignoreMap":480},[484,6507,6508,6511,6513,6516,6519],{"class":486,"line":487},[484,6509,6510],{"class":718},"EVLOG_TELEMETRY_DEBUG",[484,6512,1094],{"class":722},[484,6514,6515],{"class":494},"1",[484,6517,6518],{"class":490}," my-tool",[484,6520,6521],{"class":494}," doctor\n",[484,6523,6524,6527,6529,6532,6534],{"class":486,"line":729},[484,6525,6526],{"class":718},"EVLOG_TELEMETRY",[484,6528,1094],{"class":722},[484,6530,6531],{"class":494},"0",[484,6533,6518],{"class":490},[484,6535,6536],{"class":494}," sync\n",[454,6538,6539],{},"Debug mode prints would-be payloads to stderr. Nothing is sent unless an endpoint is configured and delivery succeeds.",[667,6541,6543],{"id":6542},"why-install-it","Why install it",[454,6545,6546],{},"You can wire anonymous usage telemetry yourself — outbox file, consent flags, flag sanitization, disclosure markdown, ingest validation, first-run notice. Or you add one dependency and get the evlog playbook baked in.",[878,6548,6550],{"id":6549},"what-you-get-for-28-kb","What you get for ~28 KB",[785,6552,6553,6561],{},[788,6554,6555],{},[791,6556,6557,6559],{},[794,6558],{},[794,6560],{},[801,6562,6563,6579,6594,6613],{},[791,6564,6565,6570],{},[806,6566,6567],{},[470,6568,6569],{},"Published size",[806,6571,6572,6573,6575,6576,6578],{},"~28 KB ESM (",[457,6574,459],{},"), ~8.6 KB gzip — standalone, no dependency on ",[457,6577,467],{}," core",[791,6580,6581,6586],{},[806,6582,6583],{},[470,6584,6585],{},"Server ingest only",[806,6587,6588,6590,6591,6593],{},[457,6589,645],{}," ~5 KB (~1.7 KB gzip) — ",[457,6592,641],{}," without pulling citty wiring into your API",[791,6595,6596,6601],{},[806,6597,6598],{},[470,6599,6600],{},"Runtime deps",[806,6602,6603,650,6605,6608,6609,6612],{},[457,6604,2598],{},[457,6606,6607],{},"std-env"," only — both ",[457,6610,6611],{},"sideEffects: false",", tree-shakeable ESM",[791,6614,6615,6620],{},[806,6616,6617],{},[470,6618,6619],{},"Node",[806,6621,6622,6623,6625],{},"18+ · ESM · ",[457,6624,6611],{}," on the package",[878,6627,6629],{"id":6628},"fits-wherever-your-code-runs","Fits wherever your code runs",[785,6631,6632,6645],{},[788,6633,6634],{},[791,6635,6636,6639,6642],{},[794,6637,6638],{},"Surface",[794,6640,6641],{},"Entry",[794,6643,6644],{},"Lines of integration",[801,6646,6647,6664,6680,6699],{},[791,6648,6649,6654,6659],{},[806,6650,6651],{},[470,6652,6653],{},"citty CLI",[806,6655,6656,6658],{},[457,6657,548],{}," on the root command",[806,6660,6661,6662],{},"One wrapper + optional ",[457,6663,6446],{},[791,6665,6666,6671,6677],{},[806,6667,6668],{},[470,6669,6670],{},"Script \u002F migrator",[806,6672,6673,650,6675],{},[457,6674,3955],{},[457,6676,3959],{},[806,6678,6679],{},"Wrap each logical run",[791,6681,6682,6687,6691],{},[806,6683,6684],{},[470,6685,6686],{},"GitHub Actions",[806,6688,6689],{},[457,6690,572],{},[806,6692,6693,6694,577,6696,6698],{},"Same as script; ",[457,6695,4163],{},[457,6697,4167],{}," auto-injected",[791,6700,6701,6706,6712],{},[806,6702,6703],{},[470,6704,6705],{},"Your API (ingest)",[806,6707,6708,642,6710],{},[457,6709,641],{},[457,6711,645],{},[806,6713,6714],{},"One validator + one POST route",[454,6716,6717,6718,6720],{},"No framework lock-in. No PostHog \u002F Segment \u002F custom analytics SDK. No second schema to maintain — disclosure is generated from the same ",[457,6719,981],{}," config the CLI uses at runtime.",[878,6722,6724],{"id":6723},"what-you-skip-building","What you skip building",[519,6726,6727,6732,6740,6743,6750,6753,6759,6762],{},[522,6728,6729,6730,536],{},"Privacy-safe flag capture (never reads raw ",[457,6731,508],{},[522,6733,6734,577,6737,6739],{},[457,6735,6736],{},"DO_NOT_TRACK",[457,6738,6526],{}," \u002F persisted opt-out with outbox purge",[522,6741,6742],{},"Disk outbox with lockfile, stale-lock recovery, and backlog drain",[522,6744,6745,6746,650,6748,536],{},"Auto-generated disclosure (",[457,6747,619],{},[457,6749,3116],{},[522,6751,6752],{},"First-run notice with opt-out instructions",[522,6754,6755,6756,6758],{},"Typed ",[457,6757,504],{}," with allowlisted string fields",[522,6760,6761],{},"Server-side ingest validation aligned with the CLI envelope",[522,6763,6764,6765],{},"Hard guarantee: ",[470,6766,6767],{},"telemetry never throws, never blocks exit",[878,6769,6771],{"id":6770},"the-payoff","The payoff",[454,6773,6774],{},"Once ingest is live you can answer product questions that CLI authors usually guess at:",[519,6776,6777,6787,6795,6801,6808],{},[522,6778,6779,6780,6782,6783,6782,6785,536],{},"Which commands are actually used (",[457,6781,953],{}," vs ",[457,6784,3076],{},[457,6786,3116],{},[522,6788,6789,6790,6160,6792,6794],{},"Where runs fail (",[457,6791,2432],{},[457,6793,3690],{},", version breakdown)",[522,6796,6797,6798,6800],{},"How long operations take (",[457,6799,2448],{}," per command)",[522,6802,6803,6804,6807],{},"Which versions are still in the wild (",[457,6805,6806],{},"tool.version"," on every event)",[522,6809,6810,6811,6160,6814,6160,6817,536],{},"Whether CI or local dev dominates (",[457,6812,6813],{},"env.ci",[457,6815,6816],{},"env.agent",[457,6818,6819],{},"env.tty",[454,6821,6822],{},"All from one wide event per run — the same mental model as evlog on the server, without bolting a browser analytics stack onto a terminal tool.",[1015,6824,6827,6828,6835,6836,6160,6839,6841,6842,6844],{"color":6825,"icon":6826},"neutral","i-lucide-package","Try it locally: ",[462,6829,6832],{"href":6830,"rel":6831},"https:\u002F\u002Fgithub.com\u002FHugoRCD\u002Fevlog\u002Ftree\u002Fmain\u002Fexamples\u002Ftelemetry-playground",[466],[457,6833,6834],{},"examples\u002Ftelemetry-playground"," — ",[457,6837,6838],{},"pnpm run cli -- doctor",[457,6840,832],{}," to inspect payloads, ",[457,6843,3116],{}," for disclosure.",[667,6846,6848],{"id":6847},"see-also","See also",[519,6850,6851,6857],{},[522,6852,6853,6856],{},[462,6854,6855],{"href":323},"Audit"," — wide events for security-sensitive actions",[522,6858,6859,6861],{},[462,6860,412],{"href":413}," — forward ingested events into Axiom, Datadog, OTLP, or a custom store",[6863,6864,6865],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .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 .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 .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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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}",{"title":480,"searchDepth":729,"depth":729,"links":6867},[6868,6869,6870,6878,6882,6883,6884,6894,6895,6896,6897,6898,6904],{"id":669,"depth":729,"text":670},{"id":699,"depth":729,"text":700},{"id":857,"depth":729,"text":858,"children":6871},[6872,6873,6875,6876,6877],{"id":880,"depth":745,"text":881},{"id":1028,"depth":745,"text":6874},"Step 1 — Validate with parseIngestBody()",{"id":1266,"depth":745,"text":1267},{"id":2211,"depth":745,"text":2212},{"id":2529,"depth":745,"text":2530},{"id":2552,"depth":729,"text":2553,"children":6879},[6880,6881],{"id":3000,"depth":745,"text":3001},{"id":3132,"depth":745,"text":3133},{"id":3948,"depth":729,"text":3949},{"id":4334,"depth":729,"text":4335},{"id":4436,"depth":729,"text":4437,"children":6885},[6886,6887,6888,6889,6891,6892,6893],{"id":4536,"depth":745,"text":4537},{"id":5005,"depth":745,"text":5006},{"id":5265,"depth":745,"text":5266},{"id":5566,"depth":745,"text":6890},"Version breaking changes in custom",{"id":5667,"depth":745,"text":5668},{"id":5813,"depth":745,"text":5814},{"id":5925,"depth":745,"text":5926},{"id":6137,"depth":729,"text":6138},{"id":6288,"depth":729,"text":6289},{"id":6449,"depth":729,"text":6450},{"id":6499,"depth":729,"text":6500},{"id":6542,"depth":729,"text":6543,"children":6899},[6900,6901,6902,6903],{"id":6549,"depth":745,"text":6550},{"id":6628,"depth":745,"text":6629},{"id":6723,"depth":745,"text":6724},{"id":6770,"depth":745,"text":6771},{"id":6847,"depth":729,"text":6848},"Wide-event telemetry for CLIs and automation — evlog's one-event-per-run model for tools on user machines, with privacy-safe flags, consent, outbox, and auto-generated disclosure.","md",[6908],{"label":6855,"icon":318,"to":323,"color":6825,"variant":6909},"subtle",{},{"title":284,"icon":315},{"title":449,"description":6905},"new7hvkKd2HMQZbabQUHJsoUkpB4vxJux60gmOfehGY",[6915,6917],{"title":354,"path":355,"stem":356,"description":6916,"icon":357,"children":-1},"Export one evlog wide event per eve agent turn — token usage, tool executions, business context, drains, enrichers, and tail sampling alongside Agent Runs and OpenTelemetry.",{"title":36,"path":367,"stem":368,"description":6918,"icon":369,"children":-1},"Observe what flows through the pipeline (stream, fs reader, consumer recipes), plug into the pipeline (plugins, enrichers, tail sampling, identity headers), or build your own bricks (custom drains, drain pipeline, custom framework integration).",1784192131158]