[{"data":1,"prerenderedAt":4335},["ShallowReactive",2],{"navigation_docs":3,"-build-on-top-recipes":429,"-build-on-top-recipes-surround":4330},[4,35,159,201,289,326,413],{"title":5,"path":6,"stem":7,"children":8,"page":34},"Getting Started","\u002Fgetting-started","1.getting-started",[9,14,19,24,29],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-zap",{"title":25,"path":26,"stem":27,"icon":28},"Agent Skills","\u002Fgetting-started\u002Fagent-skills","1.getting-started\u002F4.agent-skills","i-lucide-sparkles",{"title":30,"path":31,"stem":32,"icon":33},"vs Other Loggers","\u002Fgetting-started\u002Fvs-other-loggers","1.getting-started\u002F5.vs-other-loggers","i-lucide-scale",false,{"title":36,"path":37,"stem":38,"children":39,"page":34},"Logging","\u002Flogging","2.logging",[40,45,50,55,60,65,70,99,127],{"title":41,"path":42,"stem":43,"icon":44},"Overview","\u002Flogging\u002Foverview","2.logging\u002F0.overview","i-lucide-list",{"title":46,"path":47,"stem":48,"icon":49},"Simple Logging","\u002Flogging\u002Fsimple-logging","2.logging\u002F1.simple-logging","i-lucide-terminal",{"title":51,"path":52,"stem":53,"icon":54},"Wide Events","\u002Flogging\u002Fwide-events","2.logging\u002F2.wide-events","i-lucide-layers",{"title":56,"path":57,"stem":58,"icon":59},"Structured Errors","\u002Flogging\u002Fstructured-errors","2.logging\u002F3.structured-errors","i-lucide-shield-alert",{"title":61,"path":62,"stem":63,"icon":64},"Catalogs","\u002Flogging\u002Fcatalogs","2.logging\u002F4.catalogs","i-lucide-book-open",{"title":66,"path":67,"stem":68,"icon":69},"Client Logging","\u002Flogging\u002Fclient-logging","2.logging\u002F5.client-logging","i-lucide-monitor",{"title":71,"icon":72,"path":73,"stem":74,"children":75,"page":34},"AI SDK","i-simple-icons-vercel","\u002Flogging\u002Fai-sdk","2.logging\u002F6.ai-sdk",[76,79,84,89,94],{"title":41,"path":77,"stem":78,"icon":44},"\u002Flogging\u002Fai-sdk\u002Foverview","2.logging\u002F6.ai-sdk\u002F01.overview",{"title":80,"path":81,"stem":82,"icon":83},"Usage","\u002Flogging\u002Fai-sdk\u002Fusage","2.logging\u002F6.ai-sdk\u002F02.usage","i-lucide-code",{"title":85,"path":86,"stem":87,"icon":88},"Options","\u002Flogging\u002Fai-sdk\u002Foptions","2.logging\u002F6.ai-sdk\u002F03.options","i-lucide-sliders",{"title":90,"path":91,"stem":92,"icon":93},"Metadata","\u002Flogging\u002Fai-sdk\u002Fmetadata","2.logging\u002F6.ai-sdk\u002F04.metadata","i-lucide-database",{"title":95,"path":96,"stem":97,"icon":98},"Telemetry","\u002Flogging\u002Fai-sdk\u002Ftelemetry","2.logging\u002F6.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":100,"icon":101,"path":102,"stem":103,"children":104,"page":34},"Better Auth","i-simple-icons-betterauth","\u002Flogging\u002Fbetter-auth","2.logging\u002F7.better-auth",[105,108,113,118,122],{"title":41,"path":106,"stem":107,"icon":44},"\u002Flogging\u002Fbetter-auth\u002Foverview","2.logging\u002F7.better-auth\u002F01.overview",{"title":109,"path":110,"stem":111,"icon":112},"Identify User","\u002Flogging\u002Fbetter-auth\u002Fidentify-user","2.logging\u002F7.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":114,"path":115,"stem":116,"icon":117},"Middleware","\u002Flogging\u002Fbetter-auth\u002Fmiddleware","2.logging\u002F7.better-auth\u002F03.middleware","i-lucide-shield",{"title":119,"path":120,"stem":121,"icon":69},"Client Sync","\u002Flogging\u002Fbetter-auth\u002Fclient-sync","2.logging\u002F7.better-auth\u002F04.client-sync",{"title":123,"path":124,"stem":125,"icon":126},"Performance","\u002Flogging\u002Fbetter-auth\u002Fperformance","2.logging\u002F7.better-auth\u002F05.performance","i-lucide-gauge",{"title":128,"icon":129,"path":130,"stem":131,"children":132,"page":34},"Audit Logs","i-lucide-shield-check","\u002Flogging\u002Faudit","2.logging\u002F8.audit",[133,136,141,146,151,155],{"title":41,"path":134,"stem":135,"icon":44},"\u002Flogging\u002Faudit\u002Foverview","2.logging\u002F8.audit\u002F01.overview",{"title":137,"path":138,"stem":139,"icon":140},"Schema","\u002Flogging\u002Faudit\u002Fschema","2.logging\u002F8.audit\u002F02.schema","i-lucide-file-text",{"title":142,"path":143,"stem":144,"icon":145},"Recording","\u002Flogging\u002Faudit\u002Frecording","2.logging\u002F8.audit\u002F03.recording","i-lucide-pen-line",{"title":147,"path":148,"stem":149,"icon":150},"Drains","\u002Flogging\u002Faudit\u002Fpipeline","2.logging\u002F8.audit\u002F04.pipeline","i-lucide-link",{"title":152,"path":153,"stem":154,"icon":129},"Compliance","\u002Flogging\u002Faudit\u002Fcompliance","2.logging\u002F8.audit\u002F05.compliance",{"title":156,"path":157,"stem":158,"icon":64},"Recipes","\u002Flogging\u002Faudit\u002Frecipes","2.logging\u002F8.audit\u002F06.recipes",{"title":160,"path":161,"stem":162,"children":163,"page":34},"Core Concepts","\u002Fcore-concepts","3.core-concepts",[164,169,174,179,184,188,191,196],{"title":165,"path":166,"stem":167,"icon":168},"Lifecycle","\u002Fcore-concepts\u002Flifecycle","3.core-concepts\u002F0.lifecycle","i-lucide-arrow-right-left",{"title":170,"path":171,"stem":172,"icon":173},"Configuration","\u002Fcore-concepts\u002Fconfiguration","3.core-concepts\u002F1.configuration","i-lucide-settings",{"title":175,"path":176,"stem":177,"icon":178},"Sampling","\u002Fcore-concepts\u002Fsampling","3.core-concepts\u002F2.sampling","i-lucide-filter",{"title":180,"path":181,"stem":182,"icon":183},"Typed Fields","\u002Fcore-concepts\u002Ftyped-fields","3.core-concepts\u002F3.typed-fields","i-simple-icons-typescript",{"title":185,"path":186,"stem":187,"icon":129},"Best Practices","\u002Fcore-concepts\u002Fbest-practices","3.core-concepts\u002F4.best-practices",{"title":123,"path":189,"stem":190,"icon":126},"\u002Fcore-concepts\u002Fperformance","3.core-concepts\u002F5.performance",{"title":192,"path":193,"stem":194,"icon":195},"Vite Plugin","\u002Fcore-concepts\u002Fvite-plugin","3.core-concepts\u002F6.vite-plugin","i-custom-vite",{"title":197,"path":198,"stem":199,"icon":200},"Auto-Redaction","\u002Fcore-concepts\u002Fredaction","3.core-concepts\u002F7.redaction","i-lucide-eye-off",{"title":202,"path":203,"stem":204,"children":205,"page":34},"Frameworks","\u002Fframeworks","4.frameworks",[206,210,215,220,225,230,235,240,245,250,255,260,265,270,274,279,284],{"title":41,"path":207,"stem":208,"icon":209},"\u002Fframeworks\u002Foverview","4.frameworks\u002F00.overview","i-lucide-layout-grid",{"title":211,"path":212,"stem":213,"icon":214},"Nuxt","\u002Fframeworks\u002Fnuxt","4.frameworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":216,"path":217,"stem":218,"icon":219},"Next.js","\u002Fframeworks\u002Fnextjs","4.frameworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":221,"path":222,"stem":223,"icon":224},"SvelteKit","\u002Fframeworks\u002Fsveltekit","4.frameworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":226,"path":227,"stem":228,"icon":229},"Nitro","\u002Fframeworks\u002Fnitro","4.frameworks\u002F04.nitro","i-custom-nitro",{"title":231,"path":232,"stem":233,"icon":234},"TanStack Start","\u002Fframeworks\u002Ftanstack-start","4.frameworks\u002F05.tanstack-start","i-custom-tanstack",{"title":236,"path":237,"stem":238,"icon":239},"NestJS","\u002Fframeworks\u002Fnestjs","4.frameworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":241,"path":242,"stem":243,"icon":244},"Express","\u002Fframeworks\u002Fexpress","4.frameworks\u002F07.express","i-simple-icons-express",{"title":246,"path":247,"stem":248,"icon":249},"Hono","\u002Fframeworks\u002Fhono","4.frameworks\u002F08.hono","i-simple-icons-hono",{"title":251,"path":252,"stem":253,"icon":254},"Fastify","\u002Fframeworks\u002Ffastify","4.frameworks\u002F09.fastify","i-simple-icons-fastify",{"title":256,"path":257,"stem":258,"icon":259},"Elysia","\u002Fframeworks\u002Felysia","4.frameworks\u002F10.elysia","i-custom-elysia",{"title":261,"path":262,"stem":263,"icon":264},"React Router","\u002Fframeworks\u002Freact-router","4.frameworks\u002F11.react-router","i-custom-reactrouter",{"title":266,"path":267,"stem":268,"icon":269},"Cloudflare Workers","\u002Fframeworks\u002Fcloudflare-workers","4.frameworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":271,"path":272,"stem":273,"icon":183},"Standalone","\u002Fframeworks\u002Fstandalone","4.frameworks\u002F13.standalone",{"title":275,"path":276,"stem":277,"icon":278},"Astro","\u002Fframeworks\u002Fastro","4.frameworks\u002F14.astro","i-simple-icons-astro",{"title":280,"path":281,"stem":282,"icon":283},"AWS Lambda","\u002Fframeworks\u002Faws-lambda","4.frameworks\u002F16.aws-lambda","i-custom-lambda",{"title":285,"path":286,"stem":287,"icon":288},"Custom Integration","\u002Fframeworks\u002Fcustom-integration","4.frameworks\u002F17.custom-integration","i-lucide-puzzle",{"title":290,"path":291,"stem":292,"children":293,"page":34},"Build on top","\u002Fbuild-on-top","5.build-on-top",[294,297,302,307,312,317,321],{"title":41,"path":295,"stem":296,"icon":54},"\u002Fbuild-on-top\u002Foverview","5.build-on-top\u002F0.overview",{"title":298,"path":299,"stem":300,"icon":301},"Stream API","\u002Fbuild-on-top\u002Fstream-api","5.build-on-top\u002F1.stream-api","i-lucide-radio-tower",{"title":303,"path":304,"stem":305,"icon":306},"Stream server","\u002Fbuild-on-top\u002Fstream-server","5.build-on-top\u002F2.stream-server","i-lucide-radio",{"title":308,"path":309,"stem":310,"icon":311},"FS reader","\u002Fbuild-on-top\u002Ffs-reader","5.build-on-top\u002F3.fs-reader","i-lucide-folder-search",{"title":313,"path":314,"stem":315,"icon":316},"Identity headers","\u002Fbuild-on-top\u002Fidentity-headers","5.build-on-top\u002F4.identity-headers","i-lucide-fingerprint",{"title":156,"path":318,"stem":319,"icon":320},"\u002Fbuild-on-top\u002Frecipes","5.build-on-top\u002F5.recipes","i-lucide-chef-hat",{"title":322,"path":323,"stem":324,"icon":325},"Catalogs as packages","\u002Fbuild-on-top\u002Fcatalogs-as-packages","5.build-on-top\u002F6.catalogs-as-packages","i-lucide-package",{"title":327,"path":328,"stem":329,"children":330,"page":34},"Adapters","\u002Fadapters","6.adapters",[331,334,374,389],{"title":41,"path":332,"stem":333,"icon":44},"\u002Fadapters\u002Foverview","6.adapters\u002F01.overview",{"title":335,"path":336,"stem":337,"children":338,"page":34},"Cloud destinations","\u002Fadapters\u002Fcloud","6.adapters\u002F02.cloud",[339,344,349,354,359,364,369],{"title":340,"path":341,"stem":342,"icon":343},"Axiom","\u002Fadapters\u002Fcloud\u002Faxiom","6.adapters\u002F02.cloud\u002F01.axiom","i-custom-axiom",{"title":345,"path":346,"stem":347,"icon":348},"OTLP","\u002Fadapters\u002Fcloud\u002Fotlp","6.adapters\u002F02.cloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":350,"path":351,"stem":352,"icon":353},"PostHog","\u002Fadapters\u002Fcloud\u002Fposthog","6.adapters\u002F02.cloud\u002F03.posthog","i-simple-icons-posthog",{"title":355,"path":356,"stem":357,"icon":358},"Sentry","\u002Fadapters\u002Fcloud\u002Fsentry","6.adapters\u002F02.cloud\u002F04.sentry","i-simple-icons-sentry",{"title":360,"path":361,"stem":362,"icon":363},"Better Stack","\u002Fadapters\u002Fcloud\u002Fbetter-stack","6.adapters\u002F02.cloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":365,"path":366,"stem":367,"icon":368},"Datadog","\u002Fadapters\u002Fcloud\u002Fdatadog","6.adapters\u002F02.cloud\u002F06.datadog","i-simple-icons-datadog",{"title":370,"path":371,"stem":372,"icon":373},"HyperDX","\u002Fadapters\u002Fcloud\u002Fhyperdx","6.adapters\u002F02.cloud\u002F07.hyperdx","i-custom-hyperdx",{"title":375,"path":376,"stem":377,"children":378,"page":34},"Self-hosted","\u002Fadapters\u002Fself-hosted","6.adapters\u002F03.self-hosted",[379,384],{"title":380,"path":381,"stem":382,"icon":383},"File System","\u002Fadapters\u002Fself-hosted\u002Ffs","6.adapters\u002F03.self-hosted\u002F01.fs","i-lucide-hard-drive",{"title":385,"path":386,"stem":387,"icon":388},"NuxtHub","\u002Fadapters\u002Fself-hosted\u002Fnuxthub","6.adapters\u002F03.self-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":390,"path":391,"stem":392,"children":393,"page":34},"Building blocks","\u002Fadapters\u002Fbuilding-blocks","6.adapters\u002F04.building-blocks",[394,399,404,408],{"title":395,"path":396,"stem":397,"icon":398},"Pipeline","\u002Fadapters\u002Fbuilding-blocks\u002Fpipeline","6.adapters\u002F04.building-blocks\u002F01.pipeline","i-lucide-workflow",{"title":400,"path":401,"stem":402,"icon":403},"HTTP","\u002Fadapters\u002Fbuilding-blocks\u002Fhttp","6.adapters\u002F04.building-blocks\u002F02.http","i-lucide-globe",{"title":405,"path":406,"stem":407,"icon":83},"Custom Adapters","\u002Fadapters\u002Fbuilding-blocks\u002Fcustom","6.adapters\u002F04.building-blocks\u002F03.custom",{"title":409,"path":410,"stem":411,"icon":412},"Toolkit","\u002Fadapters\u002Fbuilding-blocks\u002Ftoolkit","6.adapters\u002F04.building-blocks\u002F04.toolkit","i-lucide-blocks",{"title":414,"path":415,"stem":416,"children":417,"page":34},"Enrichers","\u002Fenrichers","7.enrichers",[418,421,425],{"title":41,"path":419,"stem":420,"icon":28},"\u002Fenrichers\u002Foverview","7.enrichers\u002F1.overview",{"title":422,"path":423,"stem":424,"icon":288},"Built-in","\u002Fenrichers\u002Fbuilt-in","7.enrichers\u002F2.built-in",{"title":426,"path":427,"stem":428,"icon":83},"Custom","\u002Fenrichers\u002Fcustom","7.enrichers\u002F3.custom",{"id":430,"title":156,"body":431,"description":4323,"extension":4324,"links":4325,"meta":4326,"navigation":4327,"path":318,"seo":4328,"stem":319,"__hash__":4329},"docs\u002F5.build-on-top\u002F5.recipes.md",{"type":432,"value":433,"toc":4309},"minimark",[434,451,456,469,483,488,495,597,604,665,669,1640,1647,1651,2252,2256,2621,2629,2633,2638,2692,2695,2799,2812,2816,2819,3234,3244,3248,3254,3750,3754,3757,4113,4117,4120,4279,4282,4286,4306],[435,436,437,438,442,443,446,447,450],"p",{},"Real-world patterns that combine the ",[439,440,441],"a",{"href":299},"stream API",", the ",[439,444,445],{"href":304},"stream server",", and the ",[439,448,449],{"href":381},"filesystem reader",".",[452,453,455],"h2",{"id":454},"_1-build-a-minimal-devtool","1. Build a minimal devtool",[435,457,458,459,463,464,468],{},"A live event panel is essentially ",[460,461,462],"code",{},"EventSource"," + a list. Every consumer needs ",[465,466,467],"strong",{},"two"," things:",[470,471,472,476],"ol",{},[473,474,475],"li",{},"The mini stream server's URL (it's on a random port, so discovery first)",[473,477,478,479,482],{},"An SSE connection that decodes ",[460,480,481],{},"{ evlog, type, data }"," envelopes",[484,485,487],"h3",{"id":486},"url-discovery","URL discovery",[435,489,490,491,494],{},"Read ",[460,492,493],{},".evlog\u002Fstream.url"," from the project directory:",[496,497,502],"pre",{"className":498,"code":499,"language":500,"meta":501,"style":501},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { readFile } from 'node:fs\u002Fpromises'\n\nconst url = (await readFile('.evlog\u002Fstream.url', 'utf-8')).trim()\n","ts","",[460,503,504,537,544],{"__ignoreMap":501},[505,506,509,513,517,521,524,527,530,534],"span",{"class":507,"line":508},"line",1,[505,510,512],{"class":511},"s7zQu","import",[505,514,516],{"class":515},"sMK4o"," {",[505,518,520],{"class":519},"sTEyZ"," readFile",[505,522,523],{"class":515}," }",[505,525,526],{"class":511}," from",[505,528,529],{"class":515}," '",[505,531,533],{"class":532},"sfazB","node:fs\u002Fpromises",[505,535,536],{"class":515},"'\n",[505,538,540],{"class":507,"line":539},2,[505,541,543],{"emptyLinePlaceholder":542},true,"\n",[505,545,547,551,554,557,560,563,566,569,572,574,576,579,581,584,586,589,591,594],{"class":507,"line":546},3,[505,548,550],{"class":549},"spNyl","const",[505,552,553],{"class":519}," url ",[505,555,556],{"class":515},"=",[505,558,559],{"class":519}," (",[505,561,562],{"class":511},"await",[505,564,520],{"class":565},"s2Zo4",[505,567,568],{"class":519},"(",[505,570,571],{"class":515},"'",[505,573,493],{"class":532},[505,575,571],{"class":515},[505,577,578],{"class":515},",",[505,580,529],{"class":515},[505,582,583],{"class":532},"utf-8",[505,585,571],{"class":515},[505,587,588],{"class":519},"))",[505,590,450],{"class":515},[505,592,593],{"class":565},"trim",[505,595,596],{"class":519},"()\n",[435,598,599,600,603],{},"Or hit the ",[460,601,602],{},"\u002Fapi\u002F_evlog\u002Fstream-info"," endpoint from a same-origin browser tab in a Nuxt app:",[496,605,607],{"className":498,"code":606,"language":500,"meta":501,"style":501},"const { url } = await fetch('\u002Fapi\u002F_evlog\u002Fstream-info').then(r => r.json())\n",[460,608,609],{"__ignoreMap":501},[505,610,611,613,615,617,620,623,626,629,631,633,635,637,640,642,645,647,651,654,657,659,662],{"class":507,"line":508},[505,612,550],{"class":549},[505,614,516],{"class":515},[505,616,553],{"class":519},[505,618,619],{"class":515},"}",[505,621,622],{"class":515}," =",[505,624,625],{"class":511}," await",[505,627,628],{"class":565}," fetch",[505,630,568],{"class":519},[505,632,571],{"class":515},[505,634,602],{"class":532},[505,636,571],{"class":515},[505,638,639],{"class":519},")",[505,641,450],{"class":515},[505,643,644],{"class":565},"then",[505,646,568],{"class":519},[505,648,650],{"class":649},"sHdIc","r",[505,652,653],{"class":549}," =>",[505,655,656],{"class":519}," r",[505,658,450],{"class":515},[505,660,661],{"class":565},"json",[505,663,664],{"class":519},"())\n",[484,666,668],{"id":667},"vanilla-html-js-drop-into-any-page","Vanilla HTML + JS (drop into any page)",[496,670,674],{"className":671,"code":672,"language":673,"meta":501,"style":501},"language-html shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C!doctype html>\n\u003Chtml>\n\u003Chead>\n  \u003Cmeta charset=\"utf-8\">\n  \u003Ctitle>evlog mini devtool\u003C\u002Ftitle>\n  \u003Cstyle>\n    body { font: 13px ui-sans-serif, system-ui; margin: 0; padding: 0; }\n    table { width: 100%; border-collapse: collapse; }\n    td, th { padding: 6px 10px; border-bottom: 1px solid #eee; text-align: left; }\n    .lvl-error { color: #ef4444 }\n    .lvl-warn  { color: #f59e0b }\n    .lvl-info  { color: #3b82f6 }\n  \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody>\n  \u003Ctable id=\"t\">\n    \u003Cthead>\u003Ctr>\u003Cth>time\u003C\u002Fth>\u003Cth>level\u003C\u002Fth>\u003Cth>service\u003C\u002Fth>\u003Cth>action\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\n    \u003Ctbody>\u003C\u002Ftbody>\n  \u003C\u002Ftable>\n\n  \u003Cscript>\n    \u002F\u002F Replace with the URL printed at startup, or fetch it from \u002Fapi\u002F_evlog\u002Fstream-info\n    const STREAM_URL = 'http:\u002F\u002F127.0.0.1:51203'\n    const tbody = document.querySelector('#t tbody')\n    const es = new EventSource(STREAM_URL)\n\n    es.onmessage = (e) => {\n      const env = JSON.parse(e.data)\n      if (env.evlog !== '1') return\n      if (env.type !== 'event' && env.type !== 'replay') return\n\n      const w = env.data\n      const tr = document.createElement('tr')\n      tr.innerHTML = `\n        \u003Ctd>${new Date(w.timestamp).toLocaleTimeString()}\u003C\u002Ftd>\n        \u003Ctd class=\"lvl-${w.level}\">${w.level}\u003C\u002Ftd>\n        \u003Ctd>${w.service ?? ''}\u003C\u002Ftd>\n        \u003Ctd>${w.action ?? w.message ?? w.path ?? ''}\u003C\u002Ftd>\n      `\n      tbody.prepend(tr)\n      while (tbody.children.length > 200) tbody.lastElementChild.remove()\n    }\n  \u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","html",[460,675,676,691,700,709,732,753,763,816,846,902,927,949,970,980,989,999,1021,1100,1114,1123,1128,1138,1145,1163,1193,1212,1217,1242,1272,1304,1349,1354,1371,1398,1414,1450,1482,1504,1542,1548,1565,1607,1613,1622,1631],{"__ignoreMap":501},[505,677,678,681,685,688],{"class":507,"line":508},[505,679,680],{"class":515},"\u003C!",[505,682,684],{"class":683},"swJcz","doctype",[505,686,687],{"class":549}," html",[505,689,690],{"class":515},">\n",[505,692,693,696,698],{"class":507,"line":539},[505,694,695],{"class":515},"\u003C",[505,697,673],{"class":683},[505,699,690],{"class":515},[505,701,702,704,707],{"class":507,"line":546},[505,703,695],{"class":515},[505,705,706],{"class":683},"head",[505,708,690],{"class":515},[505,710,712,715,718,721,723,726,728,730],{"class":507,"line":711},4,[505,713,714],{"class":515},"  \u003C",[505,716,717],{"class":683},"meta",[505,719,720],{"class":549}," charset",[505,722,556],{"class":515},[505,724,725],{"class":515},"\"",[505,727,583],{"class":532},[505,729,725],{"class":515},[505,731,690],{"class":515},[505,733,735,737,740,743,746,749,751],{"class":507,"line":734},5,[505,736,714],{"class":515},[505,738,739],{"class":683},"title",[505,741,742],{"class":515},">",[505,744,745],{"class":519},"evlog mini devtool",[505,747,748],{"class":515},"\u003C\u002F",[505,750,739],{"class":683},[505,752,690],{"class":515},[505,754,756,758,761],{"class":507,"line":755},6,[505,757,714],{"class":515},[505,759,760],{"class":683},"style",[505,762,690],{"class":515},[505,764,766,770,772,776,779,783,786,788,791,794,797,799,802,804,807,809,811,813],{"class":507,"line":765},7,[505,767,769],{"class":768},"sBMFI","    body",[505,771,516],{"class":515},[505,773,775],{"class":774},"sqsOY"," font",[505,777,778],{"class":515},":",[505,780,782],{"class":781},"sbssI"," 13px",[505,784,785],{"class":519}," ui-sans-serif",[505,787,578],{"class":515},[505,789,790],{"class":519}," system-ui",[505,792,793],{"class":515},";",[505,795,796],{"class":774}," margin",[505,798,778],{"class":515},[505,800,801],{"class":781}," 0",[505,803,793],{"class":515},[505,805,806],{"class":774}," padding",[505,808,778],{"class":515},[505,810,801],{"class":781},[505,812,793],{"class":515},[505,814,815],{"class":515}," }\n",[505,817,819,822,824,827,829,832,834,837,839,842,844],{"class":507,"line":818},8,[505,820,821],{"class":768},"    table",[505,823,516],{"class":515},[505,825,826],{"class":774}," width",[505,828,778],{"class":515},[505,830,831],{"class":781}," 100%",[505,833,793],{"class":515},[505,835,836],{"class":774}," border-collapse",[505,838,778],{"class":515},[505,840,841],{"class":519}," collapse",[505,843,793],{"class":515},[505,845,815],{"class":515},[505,847,849,852,854,857,859,861,863,866,869,871,874,876,879,882,885,888,890,893,895,898,900],{"class":507,"line":848},9,[505,850,851],{"class":768},"    td",[505,853,578],{"class":515},[505,855,856],{"class":768}," th",[505,858,516],{"class":515},[505,860,806],{"class":774},[505,862,778],{"class":515},[505,864,865],{"class":781}," 6px",[505,867,868],{"class":781}," 10px",[505,870,793],{"class":515},[505,872,873],{"class":774}," border-bottom",[505,875,778],{"class":515},[505,877,878],{"class":781}," 1px",[505,880,881],{"class":519}," solid ",[505,883,884],{"class":515},"#",[505,886,887],{"class":519},"eee",[505,889,793],{"class":515},[505,891,892],{"class":774}," text-align",[505,894,778],{"class":515},[505,896,897],{"class":519}," left",[505,899,793],{"class":515},[505,901,815],{"class":515},[505,903,905,908,911,913,916,918,921,924],{"class":507,"line":904},10,[505,906,907],{"class":515},"    .",[505,909,910],{"class":768},"lvl-error",[505,912,516],{"class":515},[505,914,915],{"class":774}," color",[505,917,778],{"class":515},[505,919,920],{"class":515}," #",[505,922,923],{"class":519},"ef4444 ",[505,925,926],{"class":515},"}\n",[505,928,930,932,935,938,940,942,944,947],{"class":507,"line":929},11,[505,931,907],{"class":515},[505,933,934],{"class":768},"lvl-warn",[505,936,937],{"class":515},"  {",[505,939,915],{"class":774},[505,941,778],{"class":515},[505,943,920],{"class":515},[505,945,946],{"class":519},"f59e0b ",[505,948,926],{"class":515},[505,950,952,954,957,959,961,963,965,968],{"class":507,"line":951},12,[505,953,907],{"class":515},[505,955,956],{"class":768},"lvl-info",[505,958,937],{"class":515},[505,960,915],{"class":774},[505,962,778],{"class":515},[505,964,920],{"class":515},[505,966,967],{"class":519},"3b82f6 ",[505,969,926],{"class":515},[505,971,973,976,978],{"class":507,"line":972},13,[505,974,975],{"class":515},"  \u003C\u002F",[505,977,760],{"class":683},[505,979,690],{"class":515},[505,981,983,985,987],{"class":507,"line":982},14,[505,984,748],{"class":515},[505,986,706],{"class":683},[505,988,690],{"class":515},[505,990,992,994,997],{"class":507,"line":991},15,[505,993,695],{"class":515},[505,995,996],{"class":683},"body",[505,998,690],{"class":515},[505,1000,1002,1004,1007,1010,1012,1014,1017,1019],{"class":507,"line":1001},16,[505,1003,714],{"class":515},[505,1005,1006],{"class":683},"table",[505,1008,1009],{"class":549}," id",[505,1011,556],{"class":515},[505,1013,725],{"class":515},[505,1015,1016],{"class":532},"t",[505,1018,725],{"class":515},[505,1020,690],{"class":515},[505,1022,1024,1027,1030,1033,1036,1038,1041,1043,1046,1048,1050,1052,1054,1056,1059,1061,1063,1065,1067,1069,1072,1074,1076,1078,1080,1082,1085,1087,1089,1092,1094,1096,1098],{"class":507,"line":1023},17,[505,1025,1026],{"class":515},"    \u003C",[505,1028,1029],{"class":683},"thead",[505,1031,1032],{"class":515},">\u003C",[505,1034,1035],{"class":683},"tr",[505,1037,1032],{"class":515},[505,1039,1040],{"class":683},"th",[505,1042,742],{"class":515},[505,1044,1045],{"class":519},"time",[505,1047,748],{"class":515},[505,1049,1040],{"class":683},[505,1051,1032],{"class":515},[505,1053,1040],{"class":683},[505,1055,742],{"class":515},[505,1057,1058],{"class":519},"level",[505,1060,748],{"class":515},[505,1062,1040],{"class":683},[505,1064,1032],{"class":515},[505,1066,1040],{"class":683},[505,1068,742],{"class":515},[505,1070,1071],{"class":519},"service",[505,1073,748],{"class":515},[505,1075,1040],{"class":683},[505,1077,1032],{"class":515},[505,1079,1040],{"class":683},[505,1081,742],{"class":515},[505,1083,1084],{"class":519},"action",[505,1086,748],{"class":515},[505,1088,1040],{"class":683},[505,1090,1091],{"class":515},">\u003C\u002F",[505,1093,1035],{"class":683},[505,1095,1091],{"class":515},[505,1097,1029],{"class":683},[505,1099,690],{"class":515},[505,1101,1103,1105,1108,1110,1112],{"class":507,"line":1102},18,[505,1104,1026],{"class":515},[505,1106,1107],{"class":683},"tbody",[505,1109,1091],{"class":515},[505,1111,1107],{"class":683},[505,1113,690],{"class":515},[505,1115,1117,1119,1121],{"class":507,"line":1116},19,[505,1118,975],{"class":515},[505,1120,1006],{"class":683},[505,1122,690],{"class":515},[505,1124,1126],{"class":507,"line":1125},20,[505,1127,543],{"emptyLinePlaceholder":542},[505,1129,1131,1133,1136],{"class":507,"line":1130},21,[505,1132,714],{"class":515},[505,1134,1135],{"class":683},"script",[505,1137,690],{"class":515},[505,1139,1141],{"class":507,"line":1140},22,[505,1142,1144],{"class":1143},"sHwdD","    \u002F\u002F Replace with the URL printed at startup, or fetch it from \u002Fapi\u002F_evlog\u002Fstream-info\n",[505,1146,1148,1151,1154,1156,1158,1161],{"class":507,"line":1147},23,[505,1149,1150],{"class":549},"    const",[505,1152,1153],{"class":519}," STREAM_URL ",[505,1155,556],{"class":515},[505,1157,529],{"class":515},[505,1159,1160],{"class":532},"http:\u002F\u002F127.0.0.1:51203",[505,1162,536],{"class":515},[505,1164,1166,1168,1171,1173,1176,1178,1181,1183,1185,1188,1190],{"class":507,"line":1165},24,[505,1167,1150],{"class":549},[505,1169,1170],{"class":519}," tbody ",[505,1172,556],{"class":515},[505,1174,1175],{"class":519}," document",[505,1177,450],{"class":515},[505,1179,1180],{"class":565},"querySelector",[505,1182,568],{"class":519},[505,1184,571],{"class":515},[505,1186,1187],{"class":532},"#t tbody",[505,1189,571],{"class":515},[505,1191,1192],{"class":519},")\n",[505,1194,1196,1198,1201,1203,1206,1209],{"class":507,"line":1195},25,[505,1197,1150],{"class":549},[505,1199,1200],{"class":519}," es ",[505,1202,556],{"class":515},[505,1204,1205],{"class":515}," new",[505,1207,1208],{"class":565}," EventSource",[505,1210,1211],{"class":519},"(STREAM_URL)\n",[505,1213,1215],{"class":507,"line":1214},26,[505,1216,543],{"emptyLinePlaceholder":542},[505,1218,1220,1223,1225,1228,1230,1232,1235,1237,1239],{"class":507,"line":1219},27,[505,1221,1222],{"class":519},"    es",[505,1224,450],{"class":515},[505,1226,1227],{"class":565},"onmessage",[505,1229,622],{"class":515},[505,1231,559],{"class":515},[505,1233,1234],{"class":649},"e",[505,1236,639],{"class":515},[505,1238,653],{"class":549},[505,1240,1241],{"class":515}," {\n",[505,1243,1245,1248,1251,1253,1256,1258,1261,1263,1265,1267,1270],{"class":507,"line":1244},28,[505,1246,1247],{"class":549},"      const",[505,1249,1250],{"class":519}," env",[505,1252,622],{"class":515},[505,1254,1255],{"class":519}," JSON",[505,1257,450],{"class":515},[505,1259,1260],{"class":565},"parse",[505,1262,568],{"class":683},[505,1264,1234],{"class":519},[505,1266,450],{"class":515},[505,1268,1269],{"class":519},"data",[505,1271,1192],{"class":683},[505,1273,1275,1278,1280,1283,1285,1288,1291,1293,1296,1298,1301],{"class":507,"line":1274},29,[505,1276,1277],{"class":511},"      if",[505,1279,559],{"class":683},[505,1281,1282],{"class":519},"env",[505,1284,450],{"class":515},[505,1286,1287],{"class":519},"evlog",[505,1289,1290],{"class":515}," !==",[505,1292,529],{"class":515},[505,1294,1295],{"class":532},"1",[505,1297,571],{"class":515},[505,1299,1300],{"class":683},") ",[505,1302,1303],{"class":511},"return\n",[505,1305,1307,1309,1311,1313,1315,1318,1320,1322,1325,1327,1330,1332,1334,1336,1338,1340,1343,1345,1347],{"class":507,"line":1306},30,[505,1308,1277],{"class":511},[505,1310,559],{"class":683},[505,1312,1282],{"class":519},[505,1314,450],{"class":515},[505,1316,1317],{"class":519},"type",[505,1319,1290],{"class":515},[505,1321,529],{"class":515},[505,1323,1324],{"class":532},"event",[505,1326,571],{"class":515},[505,1328,1329],{"class":515}," &&",[505,1331,1250],{"class":519},[505,1333,450],{"class":515},[505,1335,1317],{"class":519},[505,1337,1290],{"class":515},[505,1339,529],{"class":515},[505,1341,1342],{"class":532},"replay",[505,1344,571],{"class":515},[505,1346,1300],{"class":683},[505,1348,1303],{"class":511},[505,1350,1352],{"class":507,"line":1351},31,[505,1353,543],{"emptyLinePlaceholder":542},[505,1355,1357,1359,1362,1364,1366,1368],{"class":507,"line":1356},32,[505,1358,1247],{"class":549},[505,1360,1361],{"class":519}," w",[505,1363,622],{"class":515},[505,1365,1250],{"class":519},[505,1367,450],{"class":515},[505,1369,1370],{"class":519},"data\n",[505,1372,1374,1376,1379,1381,1383,1385,1388,1390,1392,1394,1396],{"class":507,"line":1373},33,[505,1375,1247],{"class":549},[505,1377,1378],{"class":519}," tr",[505,1380,622],{"class":515},[505,1382,1175],{"class":519},[505,1384,450],{"class":515},[505,1386,1387],{"class":565},"createElement",[505,1389,568],{"class":683},[505,1391,571],{"class":515},[505,1393,1035],{"class":532},[505,1395,571],{"class":515},[505,1397,1192],{"class":683},[505,1399,1401,1404,1406,1409,1411],{"class":507,"line":1400},34,[505,1402,1403],{"class":519},"      tr",[505,1405,450],{"class":515},[505,1407,1408],{"class":519},"innerHTML",[505,1410,622],{"class":515},[505,1412,1413],{"class":515}," `\n",[505,1415,1417,1420,1423,1426,1429,1432,1434,1437,1439,1442,1445,1447],{"class":507,"line":1416},35,[505,1418,1419],{"class":532},"        \u003Ctd>",[505,1421,1422],{"class":515},"${",[505,1424,1425],{"class":515},"new",[505,1427,1428],{"class":565}," Date",[505,1430,1431],{"class":519},"(w",[505,1433,450],{"class":515},[505,1435,1436],{"class":519},"timestamp)",[505,1438,450],{"class":515},[505,1440,1441],{"class":565},"toLocaleTimeString",[505,1443,1444],{"class":519},"()",[505,1446,619],{"class":515},[505,1448,1449],{"class":532},"\u003C\u002Ftd>\n",[505,1451,1453,1456,1458,1461,1463,1465,1467,1470,1472,1474,1476,1478,1480],{"class":507,"line":1452},36,[505,1454,1455],{"class":532},"        \u003Ctd class=\"lvl-",[505,1457,1422],{"class":515},[505,1459,1460],{"class":519},"w",[505,1462,450],{"class":515},[505,1464,1058],{"class":519},[505,1466,619],{"class":515},[505,1468,1469],{"class":532},"\">",[505,1471,1422],{"class":515},[505,1473,1460],{"class":519},[505,1475,450],{"class":515},[505,1477,1058],{"class":519},[505,1479,619],{"class":515},[505,1481,1449],{"class":532},[505,1483,1485,1487,1489,1491,1493,1496,1499,1502],{"class":507,"line":1484},37,[505,1486,1419],{"class":532},[505,1488,1422],{"class":515},[505,1490,1460],{"class":519},[505,1492,450],{"class":515},[505,1494,1495],{"class":519},"service ",[505,1497,1498],{"class":515},"??",[505,1500,1501],{"class":515}," ''}",[505,1503,1449],{"class":532},[505,1505,1507,1509,1511,1513,1515,1518,1520,1522,1524,1527,1529,1531,1533,1536,1538,1540],{"class":507,"line":1506},38,[505,1508,1419],{"class":532},[505,1510,1422],{"class":515},[505,1512,1460],{"class":519},[505,1514,450],{"class":515},[505,1516,1517],{"class":519},"action ",[505,1519,1498],{"class":515},[505,1521,1361],{"class":519},[505,1523,450],{"class":515},[505,1525,1526],{"class":519},"message ",[505,1528,1498],{"class":515},[505,1530,1361],{"class":519},[505,1532,450],{"class":515},[505,1534,1535],{"class":519},"path ",[505,1537,1498],{"class":515},[505,1539,1501],{"class":515},[505,1541,1449],{"class":532},[505,1543,1545],{"class":507,"line":1544},39,[505,1546,1547],{"class":515},"      `\n",[505,1549,1551,1554,1556,1559,1561,1563],{"class":507,"line":1550},40,[505,1552,1553],{"class":519},"      tbody",[505,1555,450],{"class":515},[505,1557,1558],{"class":565},"prepend",[505,1560,568],{"class":683},[505,1562,1035],{"class":519},[505,1564,1192],{"class":683},[505,1566,1568,1571,1573,1575,1577,1580,1582,1585,1588,1591,1593,1595,1597,1600,1602,1605],{"class":507,"line":1567},41,[505,1569,1570],{"class":511},"      while",[505,1572,559],{"class":683},[505,1574,1107],{"class":519},[505,1576,450],{"class":515},[505,1578,1579],{"class":519},"children",[505,1581,450],{"class":515},[505,1583,1584],{"class":519},"length",[505,1586,1587],{"class":515}," >",[505,1589,1590],{"class":781}," 200",[505,1592,1300],{"class":683},[505,1594,1107],{"class":519},[505,1596,450],{"class":515},[505,1598,1599],{"class":519},"lastElementChild",[505,1601,450],{"class":515},[505,1603,1604],{"class":565},"remove",[505,1606,596],{"class":683},[505,1608,1610],{"class":507,"line":1609},42,[505,1611,1612],{"class":515},"    }\n",[505,1614,1616,1618,1620],{"class":507,"line":1615},43,[505,1617,975],{"class":515},[505,1619,1135],{"class":683},[505,1621,690],{"class":515},[505,1623,1625,1627,1629],{"class":507,"line":1624},44,[505,1626,748],{"class":515},[505,1628,996],{"class":683},[505,1630,690],{"class":515},[505,1632,1634,1636,1638],{"class":507,"line":1633},45,[505,1635,748],{"class":515},[505,1637,673],{"class":683},[505,1639,690],{"class":515},[435,1641,1642,1643,1646],{},"Save as ",[460,1644,1645],{},"devtool.html",", open in any browser tab while your evlog-instrumented dev server is running. That's the whole MVP.",[484,1648,1650],{"id":1649},"vue-3-component","Vue 3 component",[496,1652,1656],{"className":1653,"code":1654,"language":1655,"meta":501,"style":501},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript setup lang=\"ts\">\nimport { onBeforeUnmount, onMounted, ref } from 'vue'\nimport type { WideEvent } from 'evlog'\n\nconst events = ref\u003CWideEvent[]>([])\nlet es: EventSource | null = null\n\nonMounted(async () => {\n  \u002F\u002F Discover URL via the same-origin info endpoint (Nuxt)\n  const { url } = await $fetch\u003C{ url: string | null }>('\u002Fapi\u002F_evlog\u002Fstream-info')\n  if (!url) return\n\n  es = new EventSource(url)\n  es.onmessage = (e) => {\n    const env = JSON.parse(e.data)\n    if (env.evlog !== '1') return\n    if (env.type === 'event' || env.type === 'replay') {\n      events.value.unshift(env.data as WideEvent)\n      if (events.value.length > 500) events.value.length = 500\n    }\n  }\n})\n\nonBeforeUnmount(() => es?.close())\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cul>\n    \u003Cli v-for=\"(e, i) in events\" :key=\"`${e.timestamp}-${i}`\">\n      \u003Ccode>{{ e.level }}\u003C\u002Fcode>\n      \u003Cstrong>{{ e.service }}\u003C\u002Fstrong>\n      \u003Cspan>{{ e.action ?? e.message ?? e.path }}\u003C\u002Fspan>\n    \u003C\u002Fli>\n  \u003C\u002Ful>\n\u003C\u002Ftemplate>\n","vue",[460,1657,1658,1680,1709,1731,1735,1759,1782,1786,1803,1808,1854,1871,1875,1892,1912,1936,1961,2004,2034,2073,2077,2082,2088,2092,2113,2121,2125,2134,2143,2175,2193,2210,2227,2236,2244],{"__ignoreMap":501},[505,1659,1660,1662,1664,1667,1670,1672,1674,1676,1678],{"class":507,"line":508},[505,1661,695],{"class":515},[505,1663,1135],{"class":683},[505,1665,1666],{"class":549}," setup",[505,1668,1669],{"class":549}," lang",[505,1671,556],{"class":515},[505,1673,725],{"class":515},[505,1675,500],{"class":532},[505,1677,725],{"class":515},[505,1679,690],{"class":515},[505,1681,1682,1684,1686,1689,1691,1694,1696,1699,1701,1703,1705,1707],{"class":507,"line":539},[505,1683,512],{"class":511},[505,1685,516],{"class":515},[505,1687,1688],{"class":519}," onBeforeUnmount",[505,1690,578],{"class":515},[505,1692,1693],{"class":519}," onMounted",[505,1695,578],{"class":515},[505,1697,1698],{"class":519}," ref",[505,1700,523],{"class":515},[505,1702,526],{"class":511},[505,1704,529],{"class":515},[505,1706,1655],{"class":532},[505,1708,536],{"class":515},[505,1710,1711,1713,1716,1718,1721,1723,1725,1727,1729],{"class":507,"line":546},[505,1712,512],{"class":511},[505,1714,1715],{"class":511}," type",[505,1717,516],{"class":515},[505,1719,1720],{"class":519}," WideEvent",[505,1722,523],{"class":515},[505,1724,526],{"class":511},[505,1726,529],{"class":515},[505,1728,1287],{"class":532},[505,1730,536],{"class":515},[505,1732,1733],{"class":507,"line":711},[505,1734,543],{"emptyLinePlaceholder":542},[505,1736,1737,1739,1742,1744,1746,1748,1751,1754,1756],{"class":507,"line":734},[505,1738,550],{"class":549},[505,1740,1741],{"class":519}," events ",[505,1743,556],{"class":515},[505,1745,1698],{"class":565},[505,1747,695],{"class":515},[505,1749,1750],{"class":768},"WideEvent",[505,1752,1753],{"class":519},"[]",[505,1755,742],{"class":515},[505,1757,1758],{"class":519},"([])\n",[505,1760,1761,1764,1767,1769,1771,1774,1777,1779],{"class":507,"line":755},[505,1762,1763],{"class":549},"let",[505,1765,1766],{"class":519}," es",[505,1768,778],{"class":515},[505,1770,1208],{"class":768},[505,1772,1773],{"class":515}," |",[505,1775,1776],{"class":768}," null",[505,1778,622],{"class":515},[505,1780,1781],{"class":515}," null\n",[505,1783,1784],{"class":507,"line":765},[505,1785,543],{"emptyLinePlaceholder":542},[505,1787,1788,1791,1793,1796,1799,1801],{"class":507,"line":818},[505,1789,1790],{"class":565},"onMounted",[505,1792,568],{"class":519},[505,1794,1795],{"class":549},"async",[505,1797,1798],{"class":515}," ()",[505,1800,653],{"class":549},[505,1802,1241],{"class":515},[505,1804,1805],{"class":507,"line":848},[505,1806,1807],{"class":1143},"  \u002F\u002F Discover URL via the same-origin info endpoint (Nuxt)\n",[505,1809,1810,1813,1815,1818,1820,1822,1824,1827,1830,1832,1834,1837,1839,1841,1844,1846,1848,1850,1852],{"class":507,"line":904},[505,1811,1812],{"class":549},"  const",[505,1814,516],{"class":515},[505,1816,1817],{"class":519}," url",[505,1819,523],{"class":515},[505,1821,622],{"class":515},[505,1823,625],{"class":511},[505,1825,1826],{"class":565}," $fetch",[505,1828,1829],{"class":515},"\u003C{",[505,1831,1817],{"class":683},[505,1833,778],{"class":515},[505,1835,1836],{"class":768}," string",[505,1838,1773],{"class":515},[505,1840,1776],{"class":768},[505,1842,1843],{"class":515}," }>",[505,1845,568],{"class":683},[505,1847,571],{"class":515},[505,1849,602],{"class":532},[505,1851,571],{"class":515},[505,1853,1192],{"class":683},[505,1855,1856,1859,1861,1864,1867,1869],{"class":507,"line":929},[505,1857,1858],{"class":511},"  if",[505,1860,559],{"class":683},[505,1862,1863],{"class":515},"!",[505,1865,1866],{"class":519},"url",[505,1868,1300],{"class":683},[505,1870,1303],{"class":511},[505,1872,1873],{"class":507,"line":951},[505,1874,543],{"emptyLinePlaceholder":542},[505,1876,1877,1880,1882,1884,1886,1888,1890],{"class":507,"line":972},[505,1878,1879],{"class":519},"  es",[505,1881,622],{"class":515},[505,1883,1205],{"class":515},[505,1885,1208],{"class":565},[505,1887,568],{"class":683},[505,1889,1866],{"class":519},[505,1891,1192],{"class":683},[505,1893,1894,1896,1898,1900,1902,1904,1906,1908,1910],{"class":507,"line":982},[505,1895,1879],{"class":519},[505,1897,450],{"class":515},[505,1899,1227],{"class":565},[505,1901,622],{"class":515},[505,1903,559],{"class":515},[505,1905,1234],{"class":649},[505,1907,639],{"class":515},[505,1909,653],{"class":549},[505,1911,1241],{"class":515},[505,1913,1914,1916,1918,1920,1922,1924,1926,1928,1930,1932,1934],{"class":507,"line":991},[505,1915,1150],{"class":549},[505,1917,1250],{"class":519},[505,1919,622],{"class":515},[505,1921,1255],{"class":519},[505,1923,450],{"class":515},[505,1925,1260],{"class":565},[505,1927,568],{"class":683},[505,1929,1234],{"class":519},[505,1931,450],{"class":515},[505,1933,1269],{"class":519},[505,1935,1192],{"class":683},[505,1937,1938,1941,1943,1945,1947,1949,1951,1953,1955,1957,1959],{"class":507,"line":1001},[505,1939,1940],{"class":511},"    if",[505,1942,559],{"class":683},[505,1944,1282],{"class":519},[505,1946,450],{"class":515},[505,1948,1287],{"class":519},[505,1950,1290],{"class":515},[505,1952,529],{"class":515},[505,1954,1295],{"class":532},[505,1956,571],{"class":515},[505,1958,1300],{"class":683},[505,1960,1303],{"class":511},[505,1962,1963,1965,1967,1969,1971,1973,1976,1978,1980,1982,1985,1987,1989,1991,1993,1995,1997,1999,2001],{"class":507,"line":1023},[505,1964,1940],{"class":511},[505,1966,559],{"class":683},[505,1968,1282],{"class":519},[505,1970,450],{"class":515},[505,1972,1317],{"class":519},[505,1974,1975],{"class":515}," ===",[505,1977,529],{"class":515},[505,1979,1324],{"class":532},[505,1981,571],{"class":515},[505,1983,1984],{"class":515}," ||",[505,1986,1250],{"class":519},[505,1988,450],{"class":515},[505,1990,1317],{"class":519},[505,1992,1975],{"class":515},[505,1994,529],{"class":515},[505,1996,1342],{"class":532},[505,1998,571],{"class":515},[505,2000,1300],{"class":683},[505,2002,2003],{"class":515},"{\n",[505,2005,2006,2009,2011,2014,2016,2019,2021,2023,2025,2027,2030,2032],{"class":507,"line":1102},[505,2007,2008],{"class":519},"      events",[505,2010,450],{"class":515},[505,2012,2013],{"class":519},"value",[505,2015,450],{"class":515},[505,2017,2018],{"class":565},"unshift",[505,2020,568],{"class":683},[505,2022,1282],{"class":519},[505,2024,450],{"class":515},[505,2026,1269],{"class":519},[505,2028,2029],{"class":511}," as",[505,2031,1720],{"class":768},[505,2033,1192],{"class":683},[505,2035,2036,2038,2040,2043,2045,2047,2049,2051,2053,2056,2058,2060,2062,2064,2066,2068,2070],{"class":507,"line":1116},[505,2037,1277],{"class":511},[505,2039,559],{"class":683},[505,2041,2042],{"class":519},"events",[505,2044,450],{"class":515},[505,2046,2013],{"class":519},[505,2048,450],{"class":515},[505,2050,1584],{"class":519},[505,2052,1587],{"class":515},[505,2054,2055],{"class":781}," 500",[505,2057,1300],{"class":683},[505,2059,2042],{"class":519},[505,2061,450],{"class":515},[505,2063,2013],{"class":519},[505,2065,450],{"class":515},[505,2067,1584],{"class":519},[505,2069,622],{"class":515},[505,2071,2072],{"class":781}," 500\n",[505,2074,2075],{"class":507,"line":1125},[505,2076,1612],{"class":515},[505,2078,2079],{"class":507,"line":1130},[505,2080,2081],{"class":515},"  }\n",[505,2083,2084,2086],{"class":507,"line":1140},[505,2085,619],{"class":515},[505,2087,1192],{"class":519},[505,2089,2090],{"class":507,"line":1147},[505,2091,543],{"emptyLinePlaceholder":542},[505,2093,2094,2097,2099,2101,2103,2105,2108,2111],{"class":507,"line":1165},[505,2095,2096],{"class":565},"onBeforeUnmount",[505,2098,568],{"class":519},[505,2100,1444],{"class":515},[505,2102,653],{"class":549},[505,2104,1766],{"class":519},[505,2106,2107],{"class":515},"?.",[505,2109,2110],{"class":565},"close",[505,2112,664],{"class":519},[505,2114,2115,2117,2119],{"class":507,"line":1195},[505,2116,748],{"class":515},[505,2118,1135],{"class":683},[505,2120,690],{"class":515},[505,2122,2123],{"class":507,"line":1214},[505,2124,543],{"emptyLinePlaceholder":542},[505,2126,2127,2129,2132],{"class":507,"line":1219},[505,2128,695],{"class":515},[505,2130,2131],{"class":683},"template",[505,2133,690],{"class":515},[505,2135,2136,2138,2141],{"class":507,"line":1244},[505,2137,714],{"class":515},[505,2139,2140],{"class":683},"ul",[505,2142,690],{"class":515},[505,2144,2145,2147,2149,2152,2154,2156,2159,2161,2164,2166,2168,2171,2173],{"class":507,"line":1274},[505,2146,1026],{"class":515},[505,2148,473],{"class":683},[505,2150,2151],{"class":549}," v-for",[505,2153,556],{"class":515},[505,2155,725],{"class":515},[505,2157,2158],{"class":532},"(e, i) in events",[505,2160,725],{"class":515},[505,2162,2163],{"class":549}," :key",[505,2165,556],{"class":515},[505,2167,725],{"class":515},[505,2169,2170],{"class":532},"`${e.timestamp}-${i}`",[505,2172,725],{"class":515},[505,2174,690],{"class":515},[505,2176,2177,2180,2182,2184,2187,2189,2191],{"class":507,"line":1306},[505,2178,2179],{"class":515},"      \u003C",[505,2181,460],{"class":683},[505,2183,742],{"class":515},[505,2185,2186],{"class":519},"{{ e.level }}",[505,2188,748],{"class":515},[505,2190,460],{"class":683},[505,2192,690],{"class":515},[505,2194,2195,2197,2199,2201,2204,2206,2208],{"class":507,"line":1351},[505,2196,2179],{"class":515},[505,2198,465],{"class":683},[505,2200,742],{"class":515},[505,2202,2203],{"class":519},"{{ e.service }}",[505,2205,748],{"class":515},[505,2207,465],{"class":683},[505,2209,690],{"class":515},[505,2211,2212,2214,2216,2218,2221,2223,2225],{"class":507,"line":1356},[505,2213,2179],{"class":515},[505,2215,505],{"class":683},[505,2217,742],{"class":515},[505,2219,2220],{"class":519},"{{ e.action ?? e.message ?? e.path }}",[505,2222,748],{"class":515},[505,2224,505],{"class":683},[505,2226,690],{"class":515},[505,2228,2229,2232,2234],{"class":507,"line":1373},[505,2230,2231],{"class":515},"    \u003C\u002F",[505,2233,473],{"class":683},[505,2235,690],{"class":515},[505,2237,2238,2240,2242],{"class":507,"line":1400},[505,2239,975],{"class":515},[505,2241,2140],{"class":683},[505,2243,690],{"class":515},[505,2245,2246,2248,2250],{"class":507,"line":1416},[505,2247,748],{"class":515},[505,2249,2131],{"class":683},[505,2251,690],{"class":515},[484,2253,2255],{"id":2254},"react-hook","React hook",[496,2257,2259],{"className":498,"code":2258,"language":500,"meta":501,"style":501},"import { useEffect, useState } from 'react'\nimport type { WideEvent } from 'evlog'\n\nexport function useEvlogStream(url: string) {\n  const [events, setEvents] = useState\u003CWideEvent[]>([])\n\n  useEffect(() => {\n    if (!url) return\n    const es = new EventSource(url)\n    es.onmessage = (e) => {\n      const env = JSON.parse(e.data)\n      if (env.evlog !== '1') return\n      if (env.type === 'event' || env.type === 'replay') {\n        setEvents(prev => [env.data, ...prev].slice(0, 500))\n      }\n    }\n    return () => es.close()\n  }, [url])\n\n  return events\n}\n",[460,2260,2261,2286,2306,2310,2333,2364,2368,2381,2395,2413,2433,2457,2481,2521,2567,2572,2576,2593,2605,2609,2617],{"__ignoreMap":501},[505,2262,2263,2265,2267,2270,2272,2275,2277,2279,2281,2284],{"class":507,"line":508},[505,2264,512],{"class":511},[505,2266,516],{"class":515},[505,2268,2269],{"class":519}," useEffect",[505,2271,578],{"class":515},[505,2273,2274],{"class":519}," useState",[505,2276,523],{"class":515},[505,2278,526],{"class":511},[505,2280,529],{"class":515},[505,2282,2283],{"class":532},"react",[505,2285,536],{"class":515},[505,2287,2288,2290,2292,2294,2296,2298,2300,2302,2304],{"class":507,"line":539},[505,2289,512],{"class":511},[505,2291,1715],{"class":511},[505,2293,516],{"class":515},[505,2295,1720],{"class":519},[505,2297,523],{"class":515},[505,2299,526],{"class":511},[505,2301,529],{"class":515},[505,2303,1287],{"class":532},[505,2305,536],{"class":515},[505,2307,2308],{"class":507,"line":546},[505,2309,543],{"emptyLinePlaceholder":542},[505,2311,2312,2315,2318,2321,2323,2325,2327,2329,2331],{"class":507,"line":711},[505,2313,2314],{"class":511},"export",[505,2316,2317],{"class":549}," function",[505,2319,2320],{"class":565}," useEvlogStream",[505,2322,568],{"class":515},[505,2324,1866],{"class":649},[505,2326,778],{"class":515},[505,2328,1836],{"class":768},[505,2330,639],{"class":515},[505,2332,1241],{"class":515},[505,2334,2335,2337,2340,2342,2344,2347,2350,2352,2354,2356,2358,2360,2362],{"class":507,"line":734},[505,2336,1812],{"class":549},[505,2338,2339],{"class":515}," [",[505,2341,2042],{"class":519},[505,2343,578],{"class":515},[505,2345,2346],{"class":519}," setEvents",[505,2348,2349],{"class":515},"]",[505,2351,622],{"class":515},[505,2353,2274],{"class":565},[505,2355,695],{"class":515},[505,2357,1750],{"class":768},[505,2359,1753],{"class":683},[505,2361,742],{"class":515},[505,2363,1758],{"class":683},[505,2365,2366],{"class":507,"line":755},[505,2367,543],{"emptyLinePlaceholder":542},[505,2369,2370,2373,2375,2377,2379],{"class":507,"line":765},[505,2371,2372],{"class":565},"  useEffect",[505,2374,568],{"class":683},[505,2376,1444],{"class":515},[505,2378,653],{"class":549},[505,2380,1241],{"class":515},[505,2382,2383,2385,2387,2389,2391,2393],{"class":507,"line":818},[505,2384,1940],{"class":511},[505,2386,559],{"class":683},[505,2388,1863],{"class":515},[505,2390,1866],{"class":519},[505,2392,1300],{"class":683},[505,2394,1303],{"class":511},[505,2396,2397,2399,2401,2403,2405,2407,2409,2411],{"class":507,"line":848},[505,2398,1150],{"class":549},[505,2400,1766],{"class":519},[505,2402,622],{"class":515},[505,2404,1205],{"class":515},[505,2406,1208],{"class":565},[505,2408,568],{"class":683},[505,2410,1866],{"class":519},[505,2412,1192],{"class":683},[505,2414,2415,2417,2419,2421,2423,2425,2427,2429,2431],{"class":507,"line":904},[505,2416,1222],{"class":519},[505,2418,450],{"class":515},[505,2420,1227],{"class":565},[505,2422,622],{"class":515},[505,2424,559],{"class":515},[505,2426,1234],{"class":649},[505,2428,639],{"class":515},[505,2430,653],{"class":549},[505,2432,1241],{"class":515},[505,2434,2435,2437,2439,2441,2443,2445,2447,2449,2451,2453,2455],{"class":507,"line":929},[505,2436,1247],{"class":549},[505,2438,1250],{"class":519},[505,2440,622],{"class":515},[505,2442,1255],{"class":519},[505,2444,450],{"class":515},[505,2446,1260],{"class":565},[505,2448,568],{"class":683},[505,2450,1234],{"class":519},[505,2452,450],{"class":515},[505,2454,1269],{"class":519},[505,2456,1192],{"class":683},[505,2458,2459,2461,2463,2465,2467,2469,2471,2473,2475,2477,2479],{"class":507,"line":951},[505,2460,1277],{"class":511},[505,2462,559],{"class":683},[505,2464,1282],{"class":519},[505,2466,450],{"class":515},[505,2468,1287],{"class":519},[505,2470,1290],{"class":515},[505,2472,529],{"class":515},[505,2474,1295],{"class":532},[505,2476,571],{"class":515},[505,2478,1300],{"class":683},[505,2480,1303],{"class":511},[505,2482,2483,2485,2487,2489,2491,2493,2495,2497,2499,2501,2503,2505,2507,2509,2511,2513,2515,2517,2519],{"class":507,"line":972},[505,2484,1277],{"class":511},[505,2486,559],{"class":683},[505,2488,1282],{"class":519},[505,2490,450],{"class":515},[505,2492,1317],{"class":519},[505,2494,1975],{"class":515},[505,2496,529],{"class":515},[505,2498,1324],{"class":532},[505,2500,571],{"class":515},[505,2502,1984],{"class":515},[505,2504,1250],{"class":519},[505,2506,450],{"class":515},[505,2508,1317],{"class":519},[505,2510,1975],{"class":515},[505,2512,529],{"class":515},[505,2514,1342],{"class":532},[505,2516,571],{"class":515},[505,2518,1300],{"class":683},[505,2520,2003],{"class":515},[505,2522,2523,2526,2528,2531,2533,2535,2537,2539,2541,2543,2546,2548,2550,2552,2555,2557,2560,2562,2564],{"class":507,"line":982},[505,2524,2525],{"class":565},"        setEvents",[505,2527,568],{"class":683},[505,2529,2530],{"class":649},"prev",[505,2532,653],{"class":549},[505,2534,2339],{"class":683},[505,2536,1282],{"class":519},[505,2538,450],{"class":515},[505,2540,1269],{"class":519},[505,2542,578],{"class":515},[505,2544,2545],{"class":515}," ...",[505,2547,2530],{"class":519},[505,2549,2349],{"class":683},[505,2551,450],{"class":515},[505,2553,2554],{"class":565},"slice",[505,2556,568],{"class":683},[505,2558,2559],{"class":781},"0",[505,2561,578],{"class":515},[505,2563,2055],{"class":781},[505,2565,2566],{"class":683},"))\n",[505,2568,2569],{"class":507,"line":991},[505,2570,2571],{"class":515},"      }\n",[505,2573,2574],{"class":507,"line":1001},[505,2575,1612],{"class":515},[505,2577,2578,2581,2583,2585,2587,2589,2591],{"class":507,"line":1023},[505,2579,2580],{"class":511},"    return",[505,2582,1798],{"class":515},[505,2584,653],{"class":549},[505,2586,1766],{"class":519},[505,2588,450],{"class":515},[505,2590,2110],{"class":565},[505,2592,596],{"class":683},[505,2594,2595,2598,2600,2602],{"class":507,"line":1102},[505,2596,2597],{"class":515},"  },",[505,2599,2339],{"class":683},[505,2601,1866],{"class":519},[505,2603,2604],{"class":683},"])\n",[505,2606,2607],{"class":507,"line":1116},[505,2608,543],{"emptyLinePlaceholder":542},[505,2610,2611,2614],{"class":507,"line":1125},[505,2612,2613],{"class":511},"  return",[505,2615,2616],{"class":519}," events\n",[505,2618,2619],{"class":507,"line":1130},[505,2620,926],{"class":515},[435,2622,2623,2624,2626,2627,450],{},"That's the entire integration surface. No SDK, no special types beyond ",[460,2625,1750],{}," exported from ",[460,2628,1287],{},[452,2630,2632],{"id":2631},"_2-quick-cli-inspection-with-curl-jq","2. Quick CLI inspection with curl + jq",[435,2634,2635,2636,778],{},"The URL is in ",[460,2637,493],{},[496,2639,2643],{"className":2640,"code":2641,"language":2642,"meta":501,"style":501},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","URL=$(cat .evlog\u002Fstream.url)\ncurl -N \"$URL\" | jq -c 'select(.type == \"event\") | .data'\n","bash",[460,2644,2645,2661],{"__ignoreMap":501},[505,2646,2647,2650,2653,2656,2659],{"class":507,"line":508},[505,2648,2649],{"class":519},"URL",[505,2651,2652],{"class":515},"=$(",[505,2654,2655],{"class":768},"cat",[505,2657,2658],{"class":532}," .evlog\u002Fstream.url",[505,2660,1192],{"class":515},[505,2662,2663,2666,2669,2672,2675,2677,2679,2682,2685,2687,2690],{"class":507,"line":539},[505,2664,2665],{"class":768},"curl",[505,2667,2668],{"class":532}," -N",[505,2670,2671],{"class":515}," \"",[505,2673,2674],{"class":519},"$URL",[505,2676,725],{"class":515},[505,2678,1773],{"class":515},[505,2680,2681],{"class":768}," jq",[505,2683,2684],{"class":532}," -c",[505,2686,529],{"class":515},[505,2688,2689],{"class":532},"select(.type == \"event\") | .data",[505,2691,536],{"class":515},[435,2693,2694],{},"Filter on the client side as needed:",[496,2696,2698],{"className":2640,"code":2697,"language":2642,"meta":501,"style":501},"# Only errors\ncurl -sN \"$URL\" | jq -c 'select(.type == \"event\" and .data.level == \"error\") | .data'\n\n# Only one service\ncurl -sN \"$URL\" | jq -c 'select(.type == \"event\" and .data.service == \"checkout\") | .data'\n\n# Slow requests\ncurl -sN \"$URL\" | jq -c 'select(.type == \"event\" and .data.duration > 500) | .data'\n",[460,2699,2700,2705,2731,2735,2740,2765,2769,2774],{"__ignoreMap":501},[505,2701,2702],{"class":507,"line":508},[505,2703,2704],{"class":1143},"# Only errors\n",[505,2706,2707,2709,2712,2714,2716,2718,2720,2722,2724,2726,2729],{"class":507,"line":539},[505,2708,2665],{"class":768},[505,2710,2711],{"class":532}," -sN",[505,2713,2671],{"class":515},[505,2715,2674],{"class":519},[505,2717,725],{"class":515},[505,2719,1773],{"class":515},[505,2721,2681],{"class":768},[505,2723,2684],{"class":532},[505,2725,529],{"class":515},[505,2727,2728],{"class":532},"select(.type == \"event\" and .data.level == \"error\") | .data",[505,2730,536],{"class":515},[505,2732,2733],{"class":507,"line":546},[505,2734,543],{"emptyLinePlaceholder":542},[505,2736,2737],{"class":507,"line":711},[505,2738,2739],{"class":1143},"# Only one service\n",[505,2741,2742,2744,2746,2748,2750,2752,2754,2756,2758,2760,2763],{"class":507,"line":734},[505,2743,2665],{"class":768},[505,2745,2711],{"class":532},[505,2747,2671],{"class":515},[505,2749,2674],{"class":519},[505,2751,725],{"class":515},[505,2753,1773],{"class":515},[505,2755,2681],{"class":768},[505,2757,2684],{"class":532},[505,2759,529],{"class":515},[505,2761,2762],{"class":532},"select(.type == \"event\" and .data.service == \"checkout\") | .data",[505,2764,536],{"class":515},[505,2766,2767],{"class":507,"line":755},[505,2768,543],{"emptyLinePlaceholder":542},[505,2770,2771],{"class":507,"line":765},[505,2772,2773],{"class":1143},"# Slow requests\n",[505,2775,2776,2778,2780,2782,2784,2786,2788,2790,2792,2794,2797],{"class":507,"line":818},[505,2777,2665],{"class":768},[505,2779,2711],{"class":532},[505,2781,2671],{"class":515},[505,2783,2674],{"class":519},[505,2785,725],{"class":515},[505,2787,1773],{"class":515},[505,2789,2681],{"class":768},[505,2791,2684],{"class":532},[505,2793,529],{"class":515},[505,2795,2796],{"class":532},"select(.type == \"event\" and .data.duration > 500) | .data",[505,2798,536],{"class":515},[435,2800,2801,2804,2805,2807,2808,2811],{},[460,2802,2803],{},"-N"," keeps ",[460,2806,2665],{}," in streaming mode (no buffering). ",[460,2809,2810],{},"-s"," is silent.",[452,2813,2815],{"id":2814},"_3-replay-history-then-go-live","3. Replay history then go live",[435,2817,2818],{},"History on disk (filesystem drain) + live updates from the stream server = a full picture from any point in time.",[496,2820,2822],{"className":498,"code":2821,"language":500,"meta":501,"style":501},"import { readFsLogs } from 'evlog\u002Ffs'\nimport { readFile } from 'node:fs\u002Fpromises'\nimport type { WideEvent } from 'evlog'\n\nasync function bootstrap(handle: (e: WideEvent) => void) {\n  \u002F\u002F 1. Replay the last hour from `.evlog\u002Flogs\u002F`\n  const since = new Date(Date.now() - 60 * 60 * 1000)\n  for await (const event of readFsLogs({ since })) {\n    handle(event)\n  }\n\n  \u002F\u002F 2. Switch to the live SSE stream\n  const url = (await readFile('.evlog\u002Fstream.url', 'utf-8')).trim()\n  const es = new EventSource(url)\n  es.onmessage = (e) => {\n    const env = JSON.parse(e.data)\n    if (env.evlog !== '1') return\n    if (env.type === 'event' || env.type === 'replay') {\n      handle(env.data)\n    }\n  }\n  return () => es.close()\n}\n",[460,2823,2824,2844,2862,2882,2886,2921,2926,2970,3003,3014,3018,3022,3027,3065,3083,3103,3127,3151,3191,3206,3210,3214,3230],{"__ignoreMap":501},[505,2825,2826,2828,2830,2833,2835,2837,2839,2842],{"class":507,"line":508},[505,2827,512],{"class":511},[505,2829,516],{"class":515},[505,2831,2832],{"class":519}," readFsLogs",[505,2834,523],{"class":515},[505,2836,526],{"class":511},[505,2838,529],{"class":515},[505,2840,2841],{"class":532},"evlog\u002Ffs",[505,2843,536],{"class":515},[505,2845,2846,2848,2850,2852,2854,2856,2858,2860],{"class":507,"line":539},[505,2847,512],{"class":511},[505,2849,516],{"class":515},[505,2851,520],{"class":519},[505,2853,523],{"class":515},[505,2855,526],{"class":511},[505,2857,529],{"class":515},[505,2859,533],{"class":532},[505,2861,536],{"class":515},[505,2863,2864,2866,2868,2870,2872,2874,2876,2878,2880],{"class":507,"line":546},[505,2865,512],{"class":511},[505,2867,1715],{"class":511},[505,2869,516],{"class":515},[505,2871,1720],{"class":519},[505,2873,523],{"class":515},[505,2875,526],{"class":511},[505,2877,529],{"class":515},[505,2879,1287],{"class":532},[505,2881,536],{"class":515},[505,2883,2884],{"class":507,"line":711},[505,2885,543],{"emptyLinePlaceholder":542},[505,2887,2888,2890,2892,2895,2897,2900,2902,2904,2906,2908,2910,2912,2914,2917,2919],{"class":507,"line":734},[505,2889,1795],{"class":549},[505,2891,2317],{"class":549},[505,2893,2894],{"class":565}," bootstrap",[505,2896,568],{"class":515},[505,2898,2899],{"class":565},"handle",[505,2901,778],{"class":515},[505,2903,559],{"class":515},[505,2905,1234],{"class":649},[505,2907,778],{"class":515},[505,2909,1720],{"class":768},[505,2911,639],{"class":515},[505,2913,653],{"class":549},[505,2915,2916],{"class":768}," void",[505,2918,639],{"class":515},[505,2920,1241],{"class":515},[505,2922,2923],{"class":507,"line":755},[505,2924,2925],{"class":1143},"  \u002F\u002F 1. Replay the last hour from `.evlog\u002Flogs\u002F`\n",[505,2927,2928,2930,2933,2935,2937,2939,2941,2944,2946,2949,2952,2955,2958,2961,2963,2965,2968],{"class":507,"line":765},[505,2929,1812],{"class":549},[505,2931,2932],{"class":519}," since",[505,2934,622],{"class":515},[505,2936,1205],{"class":515},[505,2938,1428],{"class":565},[505,2940,568],{"class":683},[505,2942,2943],{"class":519},"Date",[505,2945,450],{"class":515},[505,2947,2948],{"class":565},"now",[505,2950,2951],{"class":683},"() ",[505,2953,2954],{"class":515},"-",[505,2956,2957],{"class":781}," 60",[505,2959,2960],{"class":515}," *",[505,2962,2957],{"class":781},[505,2964,2960],{"class":515},[505,2966,2967],{"class":781}," 1000",[505,2969,1192],{"class":683},[505,2971,2972,2975,2977,2979,2981,2984,2987,2989,2991,2994,2996,2998,3001],{"class":507,"line":818},[505,2973,2974],{"class":511},"  for",[505,2976,625],{"class":511},[505,2978,559],{"class":683},[505,2980,550],{"class":549},[505,2982,2983],{"class":519}," event",[505,2985,2986],{"class":515}," of",[505,2988,2832],{"class":565},[505,2990,568],{"class":683},[505,2992,2993],{"class":515},"{",[505,2995,2932],{"class":519},[505,2997,523],{"class":515},[505,2999,3000],{"class":683},")) ",[505,3002,2003],{"class":515},[505,3004,3005,3008,3010,3012],{"class":507,"line":848},[505,3006,3007],{"class":565},"    handle",[505,3009,568],{"class":683},[505,3011,1324],{"class":519},[505,3013,1192],{"class":683},[505,3015,3016],{"class":507,"line":904},[505,3017,2081],{"class":515},[505,3019,3020],{"class":507,"line":929},[505,3021,543],{"emptyLinePlaceholder":542},[505,3023,3024],{"class":507,"line":951},[505,3025,3026],{"class":1143},"  \u002F\u002F 2. Switch to the live SSE stream\n",[505,3028,3029,3031,3033,3035,3037,3039,3041,3043,3045,3047,3049,3051,3053,3055,3057,3059,3061,3063],{"class":507,"line":972},[505,3030,1812],{"class":549},[505,3032,1817],{"class":519},[505,3034,622],{"class":515},[505,3036,559],{"class":683},[505,3038,562],{"class":511},[505,3040,520],{"class":565},[505,3042,568],{"class":683},[505,3044,571],{"class":515},[505,3046,493],{"class":532},[505,3048,571],{"class":515},[505,3050,578],{"class":515},[505,3052,529],{"class":515},[505,3054,583],{"class":532},[505,3056,571],{"class":515},[505,3058,588],{"class":683},[505,3060,450],{"class":515},[505,3062,593],{"class":565},[505,3064,596],{"class":683},[505,3066,3067,3069,3071,3073,3075,3077,3079,3081],{"class":507,"line":982},[505,3068,1812],{"class":549},[505,3070,1766],{"class":519},[505,3072,622],{"class":515},[505,3074,1205],{"class":515},[505,3076,1208],{"class":565},[505,3078,568],{"class":683},[505,3080,1866],{"class":519},[505,3082,1192],{"class":683},[505,3084,3085,3087,3089,3091,3093,3095,3097,3099,3101],{"class":507,"line":991},[505,3086,1879],{"class":519},[505,3088,450],{"class":515},[505,3090,1227],{"class":565},[505,3092,622],{"class":515},[505,3094,559],{"class":515},[505,3096,1234],{"class":649},[505,3098,639],{"class":515},[505,3100,653],{"class":549},[505,3102,1241],{"class":515},[505,3104,3105,3107,3109,3111,3113,3115,3117,3119,3121,3123,3125],{"class":507,"line":1001},[505,3106,1150],{"class":549},[505,3108,1250],{"class":519},[505,3110,622],{"class":515},[505,3112,1255],{"class":519},[505,3114,450],{"class":515},[505,3116,1260],{"class":565},[505,3118,568],{"class":683},[505,3120,1234],{"class":519},[505,3122,450],{"class":515},[505,3124,1269],{"class":519},[505,3126,1192],{"class":683},[505,3128,3129,3131,3133,3135,3137,3139,3141,3143,3145,3147,3149],{"class":507,"line":1023},[505,3130,1940],{"class":511},[505,3132,559],{"class":683},[505,3134,1282],{"class":519},[505,3136,450],{"class":515},[505,3138,1287],{"class":519},[505,3140,1290],{"class":515},[505,3142,529],{"class":515},[505,3144,1295],{"class":532},[505,3146,571],{"class":515},[505,3148,1300],{"class":683},[505,3150,1303],{"class":511},[505,3152,3153,3155,3157,3159,3161,3163,3165,3167,3169,3171,3173,3175,3177,3179,3181,3183,3185,3187,3189],{"class":507,"line":1102},[505,3154,1940],{"class":511},[505,3156,559],{"class":683},[505,3158,1282],{"class":519},[505,3160,450],{"class":515},[505,3162,1317],{"class":519},[505,3164,1975],{"class":515},[505,3166,529],{"class":515},[505,3168,1324],{"class":532},[505,3170,571],{"class":515},[505,3172,1984],{"class":515},[505,3174,1250],{"class":519},[505,3176,450],{"class":515},[505,3178,1317],{"class":519},[505,3180,1975],{"class":515},[505,3182,529],{"class":515},[505,3184,1342],{"class":532},[505,3186,571],{"class":515},[505,3188,1300],{"class":683},[505,3190,2003],{"class":515},[505,3192,3193,3196,3198,3200,3202,3204],{"class":507,"line":1116},[505,3194,3195],{"class":565},"      handle",[505,3197,568],{"class":683},[505,3199,1282],{"class":519},[505,3201,450],{"class":515},[505,3203,1269],{"class":519},[505,3205,1192],{"class":683},[505,3207,3208],{"class":507,"line":1125},[505,3209,1612],{"class":515},[505,3211,3212],{"class":507,"line":1130},[505,3213,2081],{"class":515},[505,3215,3216,3218,3220,3222,3224,3226,3228],{"class":507,"line":1140},[505,3217,2613],{"class":511},[505,3219,1798],{"class":515},[505,3221,653],{"class":549},[505,3223,1766],{"class":519},[505,3225,450],{"class":515},[505,3227,2110],{"class":565},[505,3229,596],{"class":683},[505,3231,3232],{"class":507,"line":1147},[505,3233,926],{"class":515},[435,3235,3236,3239,3240,3243],{},[460,3237,3238],{},"readFsLogs"," skips files outside the date range, so the replay step is fast even if you keep weeks of history. For a tail-only mode without on-disk replay, hit the stream server with ",[460,3241,3242],{},"?since=\u003Ciso>"," to reuse the in-process ring buffer instead.",[452,3245,3247],{"id":3246},"_4-node-bun-client-fetch-readablestream","4. Node \u002F Bun client (fetch + ReadableStream)",[435,3249,3250,3251,3253],{},"Same protocol, no ",[460,3252,462],{}," polyfill needed:",[496,3255,3257],{"className":498,"code":3256,"language":500,"meta":501,"style":501},"import { readFile } from 'node:fs\u002Fpromises'\n\nconst url = (await readFile('.evlog\u002Fstream.url', 'utf-8')).trim()\nconst res = await fetch(url)\nconst reader = res.body!.getReader()\nconst decoder = new TextDecoder()\nlet buffer = ''\n\nwhile (true) {\n  const { value, done } = await reader.read()\n  if (done) break\n  buffer += decoder.decode(value, { stream: true })\n\n  let idx\n  while ((idx = buffer.indexOf('\\n\\n')) !== -1) {\n    const frame = buffer.slice(0, idx)\n    buffer = buffer.slice(idx + 2)\n    const dataLine = frame.split('\\n').find(l => l.startsWith('data:'))\n    if (!dataLine) continue\n    const env = JSON.parse(dataLine.slice(5).trim())\n    if (env.type === 'event') console.log(env.data)\n  }\n}\n",[460,3258,3259,3277,3281,3319,3335,3359,3375,3387,3391,3406,3436,3450,3486,3490,3498,3542,3568,3593,3651,3667,3702,3742,3746],{"__ignoreMap":501},[505,3260,3261,3263,3265,3267,3269,3271,3273,3275],{"class":507,"line":508},[505,3262,512],{"class":511},[505,3264,516],{"class":515},[505,3266,520],{"class":519},[505,3268,523],{"class":515},[505,3270,526],{"class":511},[505,3272,529],{"class":515},[505,3274,533],{"class":532},[505,3276,536],{"class":515},[505,3278,3279],{"class":507,"line":539},[505,3280,543],{"emptyLinePlaceholder":542},[505,3282,3283,3285,3287,3289,3291,3293,3295,3297,3299,3301,3303,3305,3307,3309,3311,3313,3315,3317],{"class":507,"line":546},[505,3284,550],{"class":549},[505,3286,553],{"class":519},[505,3288,556],{"class":515},[505,3290,559],{"class":519},[505,3292,562],{"class":511},[505,3294,520],{"class":565},[505,3296,568],{"class":519},[505,3298,571],{"class":515},[505,3300,493],{"class":532},[505,3302,571],{"class":515},[505,3304,578],{"class":515},[505,3306,529],{"class":515},[505,3308,583],{"class":532},[505,3310,571],{"class":515},[505,3312,588],{"class":519},[505,3314,450],{"class":515},[505,3316,593],{"class":565},[505,3318,596],{"class":519},[505,3320,3321,3323,3326,3328,3330,3332],{"class":507,"line":711},[505,3322,550],{"class":549},[505,3324,3325],{"class":519}," res ",[505,3327,556],{"class":515},[505,3329,625],{"class":511},[505,3331,628],{"class":565},[505,3333,3334],{"class":519},"(url)\n",[505,3336,3337,3339,3342,3344,3347,3349,3351,3354,3357],{"class":507,"line":734},[505,3338,550],{"class":549},[505,3340,3341],{"class":519}," reader ",[505,3343,556],{"class":515},[505,3345,3346],{"class":519}," res",[505,3348,450],{"class":515},[505,3350,996],{"class":519},[505,3352,3353],{"class":515},"!.",[505,3355,3356],{"class":565},"getReader",[505,3358,596],{"class":519},[505,3360,3361,3363,3366,3368,3370,3373],{"class":507,"line":755},[505,3362,550],{"class":549},[505,3364,3365],{"class":519}," decoder ",[505,3367,556],{"class":515},[505,3369,1205],{"class":515},[505,3371,3372],{"class":565}," TextDecoder",[505,3374,596],{"class":519},[505,3376,3377,3379,3382,3384],{"class":507,"line":765},[505,3378,1763],{"class":549},[505,3380,3381],{"class":519}," buffer ",[505,3383,556],{"class":515},[505,3385,3386],{"class":515}," ''\n",[505,3388,3389],{"class":507,"line":818},[505,3390,543],{"emptyLinePlaceholder":542},[505,3392,3393,3396,3398,3402,3404],{"class":507,"line":848},[505,3394,3395],{"class":511},"while",[505,3397,559],{"class":519},[505,3399,3401],{"class":3400},"sfNiH","true",[505,3403,1300],{"class":519},[505,3405,2003],{"class":515},[505,3407,3408,3410,3412,3415,3417,3420,3422,3424,3426,3429,3431,3434],{"class":507,"line":904},[505,3409,1812],{"class":549},[505,3411,516],{"class":515},[505,3413,3414],{"class":519}," value",[505,3416,578],{"class":515},[505,3418,3419],{"class":519}," done",[505,3421,523],{"class":515},[505,3423,622],{"class":515},[505,3425,625],{"class":511},[505,3427,3428],{"class":519}," reader",[505,3430,450],{"class":515},[505,3432,3433],{"class":565},"read",[505,3435,596],{"class":683},[505,3437,3438,3440,3442,3445,3447],{"class":507,"line":929},[505,3439,1858],{"class":511},[505,3441,559],{"class":683},[505,3443,3444],{"class":519},"done",[505,3446,1300],{"class":683},[505,3448,3449],{"class":511},"break\n",[505,3451,3452,3455,3458,3461,3463,3466,3468,3470,3472,3474,3477,3479,3482,3484],{"class":507,"line":951},[505,3453,3454],{"class":519},"  buffer",[505,3456,3457],{"class":515}," +=",[505,3459,3460],{"class":519}," decoder",[505,3462,450],{"class":515},[505,3464,3465],{"class":565},"decode",[505,3467,568],{"class":683},[505,3469,2013],{"class":519},[505,3471,578],{"class":515},[505,3473,516],{"class":515},[505,3475,3476],{"class":683}," stream",[505,3478,778],{"class":515},[505,3480,3481],{"class":3400}," true",[505,3483,523],{"class":515},[505,3485,1192],{"class":683},[505,3487,3488],{"class":507,"line":972},[505,3489,543],{"emptyLinePlaceholder":542},[505,3491,3492,3495],{"class":507,"line":982},[505,3493,3494],{"class":549},"  let",[505,3496,3497],{"class":519}," idx\n",[505,3499,3500,3503,3506,3509,3511,3514,3516,3519,3521,3523,3526,3528,3530,3533,3536,3538,3540],{"class":507,"line":991},[505,3501,3502],{"class":511},"  while",[505,3504,3505],{"class":683}," ((",[505,3507,3508],{"class":519},"idx",[505,3510,622],{"class":515},[505,3512,3513],{"class":519}," buffer",[505,3515,450],{"class":515},[505,3517,3518],{"class":565},"indexOf",[505,3520,568],{"class":683},[505,3522,571],{"class":515},[505,3524,3525],{"class":519},"\\n\\n",[505,3527,571],{"class":515},[505,3529,3000],{"class":683},[505,3531,3532],{"class":515},"!==",[505,3534,3535],{"class":515}," -",[505,3537,1295],{"class":781},[505,3539,1300],{"class":683},[505,3541,2003],{"class":515},[505,3543,3544,3546,3549,3551,3553,3555,3557,3559,3561,3563,3566],{"class":507,"line":1001},[505,3545,1150],{"class":549},[505,3547,3548],{"class":519}," frame",[505,3550,622],{"class":515},[505,3552,3513],{"class":519},[505,3554,450],{"class":515},[505,3556,2554],{"class":565},[505,3558,568],{"class":683},[505,3560,2559],{"class":781},[505,3562,578],{"class":515},[505,3564,3565],{"class":519}," idx",[505,3567,1192],{"class":683},[505,3569,3570,3573,3575,3577,3579,3581,3583,3585,3588,3591],{"class":507,"line":1023},[505,3571,3572],{"class":519},"    buffer",[505,3574,622],{"class":515},[505,3576,3513],{"class":519},[505,3578,450],{"class":515},[505,3580,2554],{"class":565},[505,3582,568],{"class":683},[505,3584,3508],{"class":519},[505,3586,3587],{"class":515}," +",[505,3589,3590],{"class":781}," 2",[505,3592,1192],{"class":683},[505,3594,3595,3597,3600,3602,3604,3606,3609,3611,3613,3616,3618,3620,3622,3625,3627,3630,3632,3635,3637,3640,3642,3644,3647,3649],{"class":507,"line":1102},[505,3596,1150],{"class":549},[505,3598,3599],{"class":519}," dataLine",[505,3601,622],{"class":515},[505,3603,3548],{"class":519},[505,3605,450],{"class":515},[505,3607,3608],{"class":565},"split",[505,3610,568],{"class":683},[505,3612,571],{"class":515},[505,3614,3615],{"class":519},"\\n",[505,3617,571],{"class":515},[505,3619,639],{"class":683},[505,3621,450],{"class":515},[505,3623,3624],{"class":565},"find",[505,3626,568],{"class":683},[505,3628,3629],{"class":649},"l",[505,3631,653],{"class":549},[505,3633,3634],{"class":519}," l",[505,3636,450],{"class":515},[505,3638,3639],{"class":565},"startsWith",[505,3641,568],{"class":683},[505,3643,571],{"class":515},[505,3645,3646],{"class":532},"data:",[505,3648,571],{"class":515},[505,3650,2566],{"class":683},[505,3652,3653,3655,3657,3659,3662,3664],{"class":507,"line":1116},[505,3654,1940],{"class":511},[505,3656,559],{"class":683},[505,3658,1863],{"class":515},[505,3660,3661],{"class":519},"dataLine",[505,3663,1300],{"class":683},[505,3665,3666],{"class":511},"continue\n",[505,3668,3669,3671,3673,3675,3677,3679,3681,3683,3685,3687,3689,3691,3694,3696,3698,3700],{"class":507,"line":1125},[505,3670,1150],{"class":549},[505,3672,1250],{"class":519},[505,3674,622],{"class":515},[505,3676,1255],{"class":519},[505,3678,450],{"class":515},[505,3680,1260],{"class":565},[505,3682,568],{"class":683},[505,3684,3661],{"class":519},[505,3686,450],{"class":515},[505,3688,2554],{"class":565},[505,3690,568],{"class":683},[505,3692,3693],{"class":781},"5",[505,3695,639],{"class":683},[505,3697,450],{"class":515},[505,3699,593],{"class":565},[505,3701,664],{"class":683},[505,3703,3704,3706,3708,3710,3712,3714,3716,3718,3720,3722,3724,3727,3729,3732,3734,3736,3738,3740],{"class":507,"line":1130},[505,3705,1940],{"class":511},[505,3707,559],{"class":683},[505,3709,1282],{"class":519},[505,3711,450],{"class":515},[505,3713,1317],{"class":519},[505,3715,1975],{"class":515},[505,3717,529],{"class":515},[505,3719,1324],{"class":532},[505,3721,571],{"class":515},[505,3723,1300],{"class":683},[505,3725,3726],{"class":519},"console",[505,3728,450],{"class":515},[505,3730,3731],{"class":565},"log",[505,3733,568],{"class":683},[505,3735,1282],{"class":519},[505,3737,450],{"class":515},[505,3739,1269],{"class":519},[505,3741,1192],{"class":683},[505,3743,3744],{"class":507,"line":1140},[505,3745,2081],{"class":515},[505,3747,3748],{"class":507,"line":1147},[505,3749,926],{"class":515},[452,3751,3753],{"id":3752},"_5-filter-transform-aggregate-on-the-consumer","5. Filter, transform, aggregate on the consumer",[435,3755,3756],{},"Keep the server dumb — every consumer picks what it cares about:",[496,3758,3760],{"className":498,"code":3759,"language":500,"meta":501,"style":501},"\u002F\u002F Just errors\nconst errors = events.filter(e => e.level === 'error')\n\n\u002F\u002F Slow requests\nconst slowReqs = events.filter(e => typeof e.duration === 'number' && e.duration > 500)\n\n\u002F\u002F Group by service\nconst byService = Object.groupBy(events, e => e.service)\n\n\u002F\u002F Rolling error rate (last 100 events)\nconst last100 = events.slice(0, 100)\nconst errorRate = last100.filter(e => e.level === 'error').length \u002F last100.length\n\n\u002F\u002F Ad-hoc cost analytics — works because evlog\u002Fai writes ai.* fields on every AI call\nconst totalCost = events\n  .filter(e => typeof e.ai?.estimatedCost === 'number')\n  .reduce((sum, e) => sum + (e.ai?.estimatedCost as number), 0)\n",[460,3761,3762,3767,3810,3814,3819,3873,3877,3882,3915,3919,3924,3950,4003,4007,4012,4023,4060],{"__ignoreMap":501},[505,3763,3764],{"class":507,"line":508},[505,3765,3766],{"class":1143},"\u002F\u002F Just errors\n",[505,3768,3769,3771,3774,3776,3779,3781,3784,3786,3788,3790,3793,3795,3798,3801,3803,3806,3808],{"class":507,"line":539},[505,3770,550],{"class":549},[505,3772,3773],{"class":519}," errors ",[505,3775,556],{"class":515},[505,3777,3778],{"class":519}," events",[505,3780,450],{"class":515},[505,3782,3783],{"class":565},"filter",[505,3785,568],{"class":519},[505,3787,1234],{"class":649},[505,3789,653],{"class":549},[505,3791,3792],{"class":519}," e",[505,3794,450],{"class":515},[505,3796,3797],{"class":519},"level ",[505,3799,3800],{"class":515},"===",[505,3802,529],{"class":515},[505,3804,3805],{"class":532},"error",[505,3807,571],{"class":515},[505,3809,1192],{"class":519},[505,3811,3812],{"class":507,"line":546},[505,3813,543],{"emptyLinePlaceholder":542},[505,3815,3816],{"class":507,"line":711},[505,3817,3818],{"class":1143},"\u002F\u002F Slow requests\n",[505,3820,3821,3823,3826,3828,3830,3832,3834,3836,3838,3840,3843,3845,3847,3850,3852,3854,3857,3859,3861,3863,3865,3867,3869,3871],{"class":507,"line":734},[505,3822,550],{"class":549},[505,3824,3825],{"class":519}," slowReqs ",[505,3827,556],{"class":515},[505,3829,3778],{"class":519},[505,3831,450],{"class":515},[505,3833,3783],{"class":565},[505,3835,568],{"class":519},[505,3837,1234],{"class":649},[505,3839,653],{"class":549},[505,3841,3842],{"class":515}," typeof",[505,3844,3792],{"class":519},[505,3846,450],{"class":515},[505,3848,3849],{"class":519},"duration ",[505,3851,3800],{"class":515},[505,3853,529],{"class":515},[505,3855,3856],{"class":532},"number",[505,3858,571],{"class":515},[505,3860,1329],{"class":515},[505,3862,3792],{"class":519},[505,3864,450],{"class":515},[505,3866,3849],{"class":519},[505,3868,742],{"class":515},[505,3870,2055],{"class":781},[505,3872,1192],{"class":519},[505,3874,3875],{"class":507,"line":755},[505,3876,543],{"emptyLinePlaceholder":542},[505,3878,3879],{"class":507,"line":765},[505,3880,3881],{"class":1143},"\u002F\u002F Group by service\n",[505,3883,3884,3886,3889,3891,3894,3896,3899,3902,3904,3906,3908,3910,3912],{"class":507,"line":818},[505,3885,550],{"class":549},[505,3887,3888],{"class":519}," byService ",[505,3890,556],{"class":515},[505,3892,3893],{"class":519}," Object",[505,3895,450],{"class":515},[505,3897,3898],{"class":565},"groupBy",[505,3900,3901],{"class":519},"(events",[505,3903,578],{"class":515},[505,3905,3792],{"class":649},[505,3907,653],{"class":549},[505,3909,3792],{"class":519},[505,3911,450],{"class":515},[505,3913,3914],{"class":519},"service)\n",[505,3916,3917],{"class":507,"line":848},[505,3918,543],{"emptyLinePlaceholder":542},[505,3920,3921],{"class":507,"line":904},[505,3922,3923],{"class":1143},"\u002F\u002F Rolling error rate (last 100 events)\n",[505,3925,3926,3928,3931,3933,3935,3937,3939,3941,3943,3945,3948],{"class":507,"line":929},[505,3927,550],{"class":549},[505,3929,3930],{"class":519}," last100 ",[505,3932,556],{"class":515},[505,3934,3778],{"class":519},[505,3936,450],{"class":515},[505,3938,2554],{"class":565},[505,3940,568],{"class":519},[505,3942,2559],{"class":781},[505,3944,578],{"class":515},[505,3946,3947],{"class":781}," 100",[505,3949,1192],{"class":519},[505,3951,3952,3954,3957,3959,3962,3964,3966,3968,3970,3972,3974,3976,3978,3980,3982,3984,3986,3988,3990,3993,3996,3998,4000],{"class":507,"line":951},[505,3953,550],{"class":549},[505,3955,3956],{"class":519}," errorRate ",[505,3958,556],{"class":515},[505,3960,3961],{"class":519}," last100",[505,3963,450],{"class":515},[505,3965,3783],{"class":565},[505,3967,568],{"class":519},[505,3969,1234],{"class":649},[505,3971,653],{"class":549},[505,3973,3792],{"class":519},[505,3975,450],{"class":515},[505,3977,3797],{"class":519},[505,3979,3800],{"class":515},[505,3981,529],{"class":515},[505,3983,3805],{"class":532},[505,3985,571],{"class":515},[505,3987,639],{"class":519},[505,3989,450],{"class":515},[505,3991,3992],{"class":519},"length ",[505,3994,3995],{"class":515},"\u002F",[505,3997,3961],{"class":519},[505,3999,450],{"class":515},[505,4001,4002],{"class":519},"length\n",[505,4004,4005],{"class":507,"line":972},[505,4006,543],{"emptyLinePlaceholder":542},[505,4008,4009],{"class":507,"line":982},[505,4010,4011],{"class":1143},"\u002F\u002F Ad-hoc cost analytics — works because evlog\u002Fai writes ai.* fields on every AI call\n",[505,4013,4014,4016,4019,4021],{"class":507,"line":991},[505,4015,550],{"class":549},[505,4017,4018],{"class":519}," totalCost ",[505,4020,556],{"class":515},[505,4022,2616],{"class":519},[505,4024,4025,4028,4030,4032,4034,4036,4038,4040,4042,4045,4047,4050,4052,4054,4056,4058],{"class":507,"line":1001},[505,4026,4027],{"class":515},"  .",[505,4029,3783],{"class":565},[505,4031,568],{"class":519},[505,4033,1234],{"class":649},[505,4035,653],{"class":549},[505,4037,3842],{"class":515},[505,4039,3792],{"class":519},[505,4041,450],{"class":515},[505,4043,4044],{"class":519},"ai",[505,4046,2107],{"class":515},[505,4048,4049],{"class":519},"estimatedCost ",[505,4051,3800],{"class":515},[505,4053,529],{"class":515},[505,4055,3856],{"class":532},[505,4057,571],{"class":515},[505,4059,1192],{"class":519},[505,4061,4062,4064,4067,4069,4071,4074,4076,4078,4080,4082,4085,4088,4091,4093,4095,4097,4099,4102,4105,4107,4109,4111],{"class":507,"line":1023},[505,4063,4027],{"class":515},[505,4065,4066],{"class":565},"reduce",[505,4068,568],{"class":519},[505,4070,568],{"class":515},[505,4072,4073],{"class":649},"sum",[505,4075,578],{"class":515},[505,4077,3792],{"class":649},[505,4079,639],{"class":515},[505,4081,653],{"class":549},[505,4083,4084],{"class":519}," sum ",[505,4086,4087],{"class":515},"+",[505,4089,4090],{"class":519}," (e",[505,4092,450],{"class":515},[505,4094,4044],{"class":519},[505,4096,2107],{"class":515},[505,4098,4049],{"class":519},[505,4100,4101],{"class":511},"as",[505,4103,4104],{"class":768}," number",[505,4106,639],{"class":519},[505,4108,578],{"class":515},[505,4110,801],{"class":781},[505,4112,1192],{"class":519},[452,4114,4116],{"id":4115},"_6-self-hosted-tail-f-replacement","6. Self-hosted \"tail -f\" replacement",[435,4118,4119],{},"Skip the network entirely if the consumer runs on the same machine:",[496,4121,4123],{"className":498,"code":4122,"language":500,"meta":501,"style":501},"import { tailFsLogs } from 'evlog\u002Ffs'\n\nconst ac = new AbortController()\nprocess.on('SIGINT', () => ac.abort())\n\nfor await (const event of tailFsLogs({ signal: ac.signal })) {\n  if (event.level === 'error') notifyOps(event)\n}\n",[460,4124,4125,4144,4148,4164,4199,4203,4244,4275],{"__ignoreMap":501},[505,4126,4127,4129,4131,4134,4136,4138,4140,4142],{"class":507,"line":508},[505,4128,512],{"class":511},[505,4130,516],{"class":515},[505,4132,4133],{"class":519}," tailFsLogs",[505,4135,523],{"class":515},[505,4137,526],{"class":511},[505,4139,529],{"class":515},[505,4141,2841],{"class":532},[505,4143,536],{"class":515},[505,4145,4146],{"class":507,"line":539},[505,4147,543],{"emptyLinePlaceholder":542},[505,4149,4150,4152,4155,4157,4159,4162],{"class":507,"line":546},[505,4151,550],{"class":549},[505,4153,4154],{"class":519}," ac ",[505,4156,556],{"class":515},[505,4158,1205],{"class":515},[505,4160,4161],{"class":565}," AbortController",[505,4163,596],{"class":519},[505,4165,4166,4169,4171,4174,4176,4178,4181,4183,4185,4187,4189,4192,4194,4197],{"class":507,"line":711},[505,4167,4168],{"class":519},"process",[505,4170,450],{"class":515},[505,4172,4173],{"class":565},"on",[505,4175,568],{"class":519},[505,4177,571],{"class":515},[505,4179,4180],{"class":532},"SIGINT",[505,4182,571],{"class":515},[505,4184,578],{"class":515},[505,4186,1798],{"class":515},[505,4188,653],{"class":549},[505,4190,4191],{"class":519}," ac",[505,4193,450],{"class":515},[505,4195,4196],{"class":565},"abort",[505,4198,664],{"class":519},[505,4200,4201],{"class":507,"line":734},[505,4202,543],{"emptyLinePlaceholder":542},[505,4204,4205,4208,4210,4212,4214,4217,4220,4222,4224,4226,4229,4231,4233,4235,4238,4240,4242],{"class":507,"line":755},[505,4206,4207],{"class":511},"for",[505,4209,625],{"class":511},[505,4211,559],{"class":519},[505,4213,550],{"class":549},[505,4215,4216],{"class":519}," event ",[505,4218,4219],{"class":515},"of",[505,4221,4133],{"class":565},[505,4223,568],{"class":519},[505,4225,2993],{"class":515},[505,4227,4228],{"class":683}," signal",[505,4230,778],{"class":515},[505,4232,4191],{"class":519},[505,4234,450],{"class":515},[505,4236,4237],{"class":519},"signal ",[505,4239,619],{"class":515},[505,4241,3000],{"class":519},[505,4243,2003],{"class":515},[505,4245,4246,4248,4250,4252,4254,4256,4258,4260,4262,4264,4266,4269,4271,4273],{"class":507,"line":765},[505,4247,1858],{"class":511},[505,4249,559],{"class":683},[505,4251,1324],{"class":519},[505,4253,450],{"class":515},[505,4255,1058],{"class":519},[505,4257,1975],{"class":515},[505,4259,529],{"class":515},[505,4261,3805],{"class":532},[505,4263,571],{"class":515},[505,4265,1300],{"class":683},[505,4267,4268],{"class":565},"notifyOps",[505,4270,568],{"class":683},[505,4272,1324],{"class":519},[505,4274,1192],{"class":683},[505,4276,4277],{"class":507,"line":818},[505,4278,926],{"class":515},[435,4280,4281],{},"Works without instrumenting the running app — useful for sidecar \u002F observer processes that watch a directory.",[452,4283,4285],{"id":4284},"what-not-to-do","What not to do",[2140,4287,4288,4294,4300],{},[473,4289,4290,4293],{},[465,4291,4292],{},"Don't run the stream server on Vercel Functions \u002F Cloudflare Workers \u002F Lambda."," Each invocation is a separate isolate; subscribers in one isolate never see events emitted by other isolates. Use a real broker (Redis Streams, NATS, Pub\u002FSub) for cross-instance fan-out.",[473,4295,4296,4299],{},[465,4297,4298],{},"Don't put auth-sensitive data in wide events"," unless your evlog config redacts them. The server relays exactly what your app emitted — including any unredacted PII.",[473,4301,4302,4305],{},[465,4303,4304],{},"Don't filter at the server"," (\"only error events please\"). The server is purpose-built to be transparent. Filter on the consumer side; that way one filter doesn't starve another consumer.",[760,4307,4308],{},"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sqsOY, html code.shiki .sqsOY{--shiki-light:#8796B0;--shiki-default:#B2CCD6;--shiki-dark:#B2CCD6}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":501,"searchDepth":539,"depth":539,"links":4310},[4311,4317,4318,4319,4320,4321,4322],{"id":454,"depth":539,"text":455,"children":4312},[4313,4314,4315,4316],{"id":486,"depth":546,"text":487},{"id":667,"depth":546,"text":668},{"id":1649,"depth":546,"text":1650},{"id":2254,"depth":546,"text":2255},{"id":2631,"depth":539,"text":2632},{"id":2814,"depth":539,"text":2815},{"id":3246,"depth":539,"text":3247},{"id":3752,"depth":539,"text":3753},{"id":4115,"depth":539,"text":4116},{"id":4284,"depth":539,"text":4285},"Concrete copy-paste recipes — build your own minimal devtool, pipe to curl + jq, replay history then go live, and aggregate on the consumer side.","md",null,{},{"title":156,"icon":320},{"title":156,"description":4323},"POLo1Td9QNFThH0cAnHB1V5ZpxdWwMLWVDVDFmmfzAI",[4331,4333],{"title":313,"path":314,"stem":315,"description":4332,"icon":316,"children":-1},"Every drain request sent by evlog is tagged with a User-Agent and an X-Evlog-Source header so receivers can identify the traffic.",{"title":322,"path":323,"stem":324,"description":4334,"icon":325,"children":-1},"Package an error catalog or audit catalog as a reusable npm module — `@my-org\u002Fevlog-stripe-errors`, `@my-org\u002Fevlog-aws-audit`, etc.",1778336627853]