{"_id":"@emeryld/rrroutes-telemetry","_rev":"4-8ed4ba25c3345101cafde8b627433322","name":"@emeryld/rrroutes-telemetry","dist-tags":{"latest":"1.1.1"},"versions":{"1.0.1":{"name":"@emeryld/rrroutes-telemetry","version":"1.0.1","_id":"@emeryld/rrroutes-telemetry@1.0.1","maintainers":[{"name":"emeryld","email":"karambiri.emery@gmail.com"}],"homepage":"https://github.com/EmeryK-1/RRRoutes#readme","bugs":{"url":"https://github.com/EmeryK-1/RRRoutes/issues"},"dist":{"shasum":"69abae3b04a3a52cad4066e6c247821a6c038311","tarball":"https://registry.npmjs.org/@emeryld/rrroutes-telemetry/-/rrroutes-telemetry-1.0.1.tgz","fileCount":22,"integrity":"sha512-oswnB3l37CRGVCDfvcFHFUuC+jbO5OQPpCYguVjAu2GfAlYLfdeGZVZGyh6xVbaIoRokbqu3hrcQewSzyathGA==","signatures":[{"sig":"MEUCIDvTCr7iZv0S2uUrkFvDrrtoikHtX8PpEPsH0xQENPjEAiEA+XcvLYONmq0hd4XdhVHSg8OIRnU+a1xpOAZAak5xhkk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":214067},"main":"dist/index.cjs","type":"module","_from":"file:emeryld-rrroutes-telemetry-1.0.1.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./client":{"types":"./dist/client/index.d.ts","import":"./dist/client.mjs","require":"./dist/client.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server.mjs","require":"./dist/server.cjs"}},"private":false,"scripts":{"test":"NODE_OPTIONS=--experimental-vm-modules jest --config ../../jest.base.config.js --watchman=false --runInBand","build":"pnpm run clean && pnpm run build:js && pnpm run build:types","clean":"rimraf dist","build:js":"tsup --config tsup.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json"},"_npmUser":{"name":"emeryld","email":"karambiri.emery@gmail.com"},"_resolved":"/private/var/folders/5x/zf5c1y3x3fb758ncq40308m80000gn/T/81a7d815fad7c2a6540dddc9355f1e70/emeryld-rrroutes-telemetry-1.0.1.tgz","_integrity":"sha512-oswnB3l37CRGVCDfvcFHFUuC+jbO5OQPpCYguVjAu2GfAlYLfdeGZVZGyh6xVbaIoRokbqu3hrcQewSzyathGA==","repository":{"url":"git+https://github.com/EmeryK-1/RRRoutes.git","type":"git"},"_npmVersion":"10.9.4","description":"Socket-transported log streaming for RRRoutes: server hub, client transport, and shared record contract","directories":{},"_nodeVersion":"22.22.0","dependencies":{"@emeryld/rrroutes-contract":"^2.10.6"},"_hasShrinkwrap":false,"devDependencies":{"zod":"4.3.6","@jest/globals":"^30.4.1","@emeryld/rrroutes-client":"^2.10.6","@emeryld/rrroutes-server":"^2.10.2"},"peerDependencies":{"zod":"^4.0.0","@emeryld/rrroutes-client":"^2.10.6","@emeryld/rrroutes-server":"^2.10.2"},"peerDependenciesMeta":{"@emeryld/rrroutes-client":{"optional":true},"@emeryld/rrroutes-server":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rrroutes-telemetry_1.0.1_1785497825099_0.7789715197804528","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@emeryld/rrroutes-telemetry","version":"1.0.4","_id":"@emeryld/rrroutes-telemetry@1.0.4","maintainers":[{"name":"emeryld","email":"karambiri.emery@gmail.com"}],"homepage":"https://github.com/EmeryK-1/RRRoutes#readme","bugs":{"url":"https://github.com/EmeryK-1/RRRoutes/issues"},"dist":{"shasum":"32a91645badadd4307621fa2e0987729f4f51bdb","tarball":"https://registry.npmjs.org/@emeryld/rrroutes-telemetry/-/rrroutes-telemetry-1.0.4.tgz","fileCount":22,"integrity":"sha512-+1bR0Xsr//fvahRosCjhlM9GEmZbt9aUwZiOxvhkYL0OcEPGnqhPJSfA+qBvnroh5fDqU0ojeGXib3D4hE5L7w==","signatures":[{"sig":"MEYCIQDM7POlT6HPi4+bMsnsFy0pb0vPzGfsW3jcknpE4k84JwIhAI3i8/pl/2lMTeaxeqHHLcuGOdjIDRtvG0GvFzbGZrZa","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":219229},"main":"dist/index.cjs","type":"module","_from":"file:emeryld-rrroutes-telemetry-1.0.4.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./client":{"types":"./dist/client/index.d.ts","import":"./dist/client.mjs","require":"./dist/client.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server.mjs","require":"./dist/server.cjs"}},"private":false,"scripts":{"test":"NODE_OPTIONS=--experimental-vm-modules jest --config ../../jest.base.config.js --watchman=false --runInBand","build":"pnpm run clean && pnpm run build:js && pnpm run build:types","clean":"rimraf dist","build:js":"tsup --config tsup.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json"},"_npmUser":{"name":"emeryld","email":"karambiri.emery@gmail.com"},"_resolved":"/private/var/folders/5x/zf5c1y3x3fb758ncq40308m80000gn/T/fb4429389941f0b84b8e5fac4056bd32/emeryld-rrroutes-telemetry-1.0.4.tgz","_integrity":"sha512-+1bR0Xsr//fvahRosCjhlM9GEmZbt9aUwZiOxvhkYL0OcEPGnqhPJSfA+qBvnroh5fDqU0ojeGXib3D4hE5L7w==","repository":{"url":"git+https://github.com/EmeryK-1/RRRoutes.git","type":"git"},"_npmVersion":"10.9.4","description":"Socket-transported log streaming for RRRoutes: server hub, client transport, and shared record contract","directories":{},"_nodeVersion":"22.22.0","dependencies":{"@emeryld/rrroutes-contract":"^2.10.6"},"_hasShrinkwrap":false,"devDependencies":{"zod":"4.3.6","@jest/globals":"^30.4.1","@emeryld/rrroutes-client":"^2.10.8","@emeryld/rrroutes-server":"^2.10.2"},"peerDependencies":{"zod":"^4.0.0","@emeryld/rrroutes-client":"^2.10.8","@emeryld/rrroutes-server":"^2.10.2"},"peerDependenciesMeta":{"@emeryld/rrroutes-client":{"optional":true},"@emeryld/rrroutes-server":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rrroutes-telemetry_1.0.4_1786314736107_0.6718646221477982","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@emeryld/rrroutes-telemetry","version":"1.1.0","_id":"@emeryld/rrroutes-telemetry@1.1.0","maintainers":[{"name":"emeryld","email":"karambiri.emery@gmail.com"}],"homepage":"https://github.com/EmeryK-1/RRRoutes#readme","bugs":{"url":"https://github.com/EmeryK-1/RRRoutes/issues"},"dist":{"shasum":"a0df16f8fd0f19a09532fd922b4473e04b64e8c0","tarball":"https://registry.npmjs.org/@emeryld/rrroutes-telemetry/-/rrroutes-telemetry-1.1.0.tgz","fileCount":22,"integrity":"sha512-U/7/vBElWkYOiwhV/LWj2XLW6Spmav8pip179ulcwT98M7MYE2FG8fid+kmA+dHzuLwQseguUtNKRP0sAfkjYA==","signatures":[{"sig":"MEYCIQDKjSNJG1PXX/riNdlINavup62M/REJRMjTMQJIzVBSYgIhALbJjwhs7LdRl82kwy8HbjWyFMYq7WO95ue9WE8UG+7v","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":219860},"main":"dist/index.cjs","type":"module","_from":"file:emeryld-rrroutes-telemetry-1.1.0.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./client":{"types":"./dist/client/index.d.ts","import":"./dist/client.mjs","require":"./dist/client.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server.mjs","require":"./dist/server.cjs"}},"private":false,"scripts":{"test":"NODE_OPTIONS=--experimental-vm-modules jest --config ../../jest.base.config.js --watchman=false --runInBand","build":"pnpm run clean && pnpm run build:js && pnpm run build:types","clean":"rimraf dist","build:js":"tsup --config tsup.config.ts","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json"},"_npmUser":{"name":"emeryld","email":"karambiri.emery@gmail.com"},"_resolved":"/private/var/folders/5x/zf5c1y3x3fb758ncq40308m80000gn/T/34bb7a2657d36693558599b2e7511850/emeryld-rrroutes-telemetry-1.1.0.tgz","_integrity":"sha512-U/7/vBElWkYOiwhV/LWj2XLW6Spmav8pip179ulcwT98M7MYE2FG8fid+kmA+dHzuLwQseguUtNKRP0sAfkjYA==","repository":{"url":"git+https://github.com/EmeryK-1/RRRoutes.git","type":"git"},"_npmVersion":"10.9.4","description":"Socket-transported log streaming for RRRoutes: server hub, client transport, and shared record contract","directories":{},"_nodeVersion":"22.22.0","dependencies":{"@emeryld/rrroutes-contract":"^2.11.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"4.3.6","@jest/globals":"^30.4.1","@emeryld/rrroutes-client":"^2.10.9","@emeryld/rrroutes-server":"^2.11.0"},"peerDependencies":{"zod":"^4.0.0","@emeryld/rrroutes-client":"^2.10.9","@emeryld/rrroutes-server":"^2.11.0"},"peerDependenciesMeta":{"@emeryld/rrroutes-client":{"optional":true},"@emeryld/rrroutes-server":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rrroutes-telemetry_1.1.0_1786381081627_0.989343973900731","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@emeryld/rrroutes-telemetry","description":"Socket-transported log streaming for RRRoutes: server hub, client transport, and shared record contract","version":"1.1.1","private":false,"type":"module","main":"dist/index.cjs","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server.mjs","require":"./dist/server.cjs"},"./client":{"types":"./dist/client/index.d.ts","import":"./dist/client.mjs","require":"./dist/client.cjs"}},"dependencies":{"@emeryld/rrroutes-contract":"^2.11.0"},"peerDependencies":{"zod":"^4.0.0","@emeryld/rrroutes-client":"^2.10.9","@emeryld/rrroutes-server":"^2.11.0"},"peerDependenciesMeta":{"@emeryld/rrroutes-client":{"optional":true},"@emeryld/rrroutes-server":{"optional":true}},"devDependencies":{"@jest/globals":"^30.4.1","zod":"4.3.6","@emeryld/rrroutes-client":"^2.10.9","@emeryld/rrroutes-server":"^2.11.0"},"repository":{"type":"git","url":"git+https://github.com/EmeryK-1/RRRoutes.git"},"scripts":{"clean":"rimraf dist","build":"pnpm run clean && pnpm run build:js && pnpm run build:types","build:js":"tsup --config tsup.config.ts","build:types":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit","test":"NODE_OPTIONS=--experimental-vm-modules jest --config ../../jest.base.config.js --watchman=false --runInBand"},"_id":"@emeryld/rrroutes-telemetry@1.1.1","bugs":{"url":"https://github.com/EmeryK-1/RRRoutes/issues"},"homepage":"https://github.com/EmeryK-1/RRRoutes#readme","_integrity":"sha512-4UCyUozKEMgTCRYN3z8PEaRXj3nc/uftqf4GVw2roT5Qm3lU2IaTCofMHo1FnZGGwjLMnvGS54vf8VOrCK9z8Q==","_resolved":"/private/var/folders/5x/zf5c1y3x3fb758ncq40308m80000gn/T/09b003110ba1bf0291eef70a511f828c/emeryld-rrroutes-telemetry-1.1.1.tgz","_from":"file:emeryld-rrroutes-telemetry-1.1.1.tgz","_nodeVersion":"22.22.0","_npmVersion":"10.9.4","dist":{"integrity":"sha512-4UCyUozKEMgTCRYN3z8PEaRXj3nc/uftqf4GVw2roT5Qm3lU2IaTCofMHo1FnZGGwjLMnvGS54vf8VOrCK9z8Q==","shasum":"1a7971c87f873c2dce023dc4a53bc9f643eedd2a","tarball":"https://registry.npmjs.org/@emeryld/rrroutes-telemetry/-/rrroutes-telemetry-1.1.1.tgz","fileCount":23,"unpackedSize":396921,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQChUfNJ5C5UcyrISfUNodNJ6ue7OyXrBZ0rTMxxrLczbgIgYGA+xVP6VooqAzkiJ+DRjz6FA+m7wdJYLNG7IaAGRnI="}]},"_npmUser":{"name":"emeryld","email":"karambiri.emery@gmail.com"},"directories":{},"maintainers":[{"name":"emeryld","email":"karambiri.emery@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/rrroutes-telemetry_1.1.1_1786412683800_0.09679798836614051"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-31T11:37:04.762Z","modified":"2026-08-11T01:44:44.127Z","1.0.1":"2026-07-31T11:37:05.261Z","1.0.4":"2026-08-09T22:32:16.251Z","1.1.0":"2026-08-10T16:58:01.773Z","1.1.1":"2026-08-11T01:44:43.953Z"},"bugs":{"url":"https://github.com/EmeryK-1/RRRoutes/issues"},"homepage":"https://github.com/EmeryK-1/RRRoutes#readme","repository":{"type":"git","url":"git+https://github.com/EmeryK-1/RRRoutes.git"},"description":"Socket-transported log streaming for RRRoutes: server hub, client transport, and shared record contract","maintainers":[{"name":"emeryld","email":"karambiri.emery@gmail.com"}],"readme":"# @emeryld/rrroutes-telemetry\n\nSocket-transported log streaming for RRRoutes. Server request, socket, and\napplication logs — plus logs shipped up from browser and native clients — fan\nout live to the RRRoutes inspector over the Socket.IO connection you already\nhave.\n\n**Nothing is persisted.** There is no HTTP ingest route, no database, and no\nfile. The only retention is a small in-memory ring replayed to an inspector\nthat connects mid-session.\n\n## Installation\n\n<!-- docs:installation:start -->\n\n```sh\npnpm add @emeryld/rrroutes-telemetry\n```\n\n<!-- docs:installation:end -->\n\n## Prerequisites\n\n<!-- docs:prerequisites:start -->\n\n- `zod` ^4.0.0\n<!-- docs:prerequisites:end -->\n\n## Entry points\n\nThree entry points, so a browser bundle never pulls in server code:\n\n<!-- docs:entrypoints:start -->\n\n| Import path                          | Purpose                                                                                                                         | Runtime               | Status | Additional requirements  |\n| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------- | --------------------- | ------ | ------------------------ |\n| `@emeryld/rrroutes-telemetry`        | Transport-free log record types, the socket event contract, redaction, batching, and the replay ring.                           | universal             | stable | —                        |\n| `@emeryld/rrroutes-telemetry/client` | Batching client-to-server log transport - opt-in, level-thresholded, redacted, and bounded when offline.                        | browser, react-native | stable | @emeryld/rrroutes-client |\n| `@emeryld/rrroutes-telemetry/server` | The hub - request/socket/application log adapters, client ingest, and authorized fan-out over an existing Socket.IO connection. | node                  | stable | @emeryld/rrroutes-server |\n\n<!-- docs:entrypoints:end -->\n\n## Compatibility\n\n<!-- docs:compatibility:start -->\n\n**Nothing is persisted.** There is no HTTP ingest route, no database, and no\nfile. The only retention is a small in-memory ring replayed to an inspector that\nconnects mid-session.\n\nThree entry points keep a browser bundle from pulling in server code: the root\nis universal, `./server` is Node-only, `./client` runs in browsers and React\nNative. The tail room carries every request and application log in the process,\nso authorization is required rather than defaulted open.\n\n<!-- docs:compatibility:end -->\n\n## Quick start\n\n### 1. Merge the events into your socket contract\n\n```ts\nimport { defineSocketEvents } from '@emeryld/rrroutes-contract'\nimport { defineTelemetryEvents } from '@emeryld/rrroutes-telemetry'\n\nconst telemetry = defineTelemetryEvents()\n\nexport const { events, config } = defineSocketEvents(socketConfig, {\n  ...applicationEvents,\n  ...telemetry.events,\n})\n```\n\n### 2. Create the hub and attach the adapters\n\n```ts\nimport { createTelemetryHub } from '@emeryld/rrroutes-telemetry/server'\n\nexport const hub = createTelemetryHub({\n  connection, // from createSocketConnections(io, ...)\n  level: 'debug',\n  authorizeIngest: ({ ctx }) => Boolean(ctx.user),\n  rateLimit: { records: 100, windowMs: 10_000 },\n})\n\n// Request lifecycle\ncreateRRRoute(router, {\n  buildCtx,\n  errorMiddleware,\n  debug: {\n    request: true,\n    handler: true,\n    rateLimit: true,\n    logger: hub.toRouteServerDebugLogger(),\n  },\n})\n\n// Socket lifecycle\ncreateSocketConnections(io, events, {\n  sys,\n  config,\n  debug: { logger: hub.toSocketDebugLogger() },\n})\n\n// Application logging\nexport const logger = hub.wrapLogger(pino)\n```\n\n### 3. Point the inspector at it\n\n```ts\ncreateRRRoutesExportRuntime({\n  allRoutes,\n  telemetry: { url: process.env.PUBLIC_URL, namespace: '/app' },\n})\n```\n\nThe inspector's **Logs** tab appears only when this is declared.\n\n### 4. Ship client logs (optional)\n\n```ts\nimport { createClientLogTransport } from '@emeryld/rrroutes-telemetry/client'\n\nexport const clientLogs = createClientLogTransport({\n  socketClient: () => socketClientRef.current,\n  enabled: process.env.NODE_ENV !== 'development',\n  level: 'warn',\n  sampleRate: 0.25,\n  origin: { release: BUILD_SHA, platform: 'ios' },\n})\n\ncreateRouteClient({\n  queryClient,\n  baseUrl,\n  debug: { fetch: true, logger: clientLogs.toRouteClientDebugLogger() },\n})\n```\n\n## Detailed usage\n\n### The record\n\nOne shape travels the whole path — adapters produce it, the socket carries it,\nthe inspector renders it.\n\n```ts\ninterface LogRecord {\n  id: string\n  at: string // ISO-8601\n  level: 'debug' | 'info' | 'warn' | 'error'\n  source: 'app' | 'request' | 'socket' | 'client'\n  message: string\n  routeKey?: string // \"GET /posts/:id\"\n  event?: string // socket event name\n  durationMs?: number\n  meta?: unknown // redacted and size-capped\n  origin?: LogOrigin\n}\n```\n\n### Security model\n\nThis is a privileged stream: it carries every request and application log in\nthe process. Two defaults enforce that.\n\n**The tail room is closed by default.** Records are broadcast to\n`rrroutes:telemetry`; joining it goes through your `sys:room_join` handler, so\nauthorize it exactly like any other privileged room:\n\n```ts\n'sys:room_join': async ({ rooms, join, socket }) => {\n  for (const room of rooms) {\n    if (room === TELEMETRY_ROOM && !socket.data.user?.isAdmin) continue\n    await join(room)\n  }\n}\n```\n\n**Client ingest is denied by default.** Without `authorizeIngest`, every client\nsubmission is dropped — accepting them is an unauthenticated write path into\nyour observability stream.\n\n**Clients never assert their own identity.** A submitted record's `source` is\nforced to `client`, and `socketId`/`userId` are stamped from the authenticated\nsocket. Only `sessionId`, `release`, and `platform` are taken from the client.\n\n### Redaction\n\nRuns on the client before transport **and** on the server before fan-out —\nneither side has to trust the other's configuration.\n\nDefault keys: `token`, `accesstoken`, `refreshtoken`, `password`,\n`authorization`, `cookie`, `secret`, `apikey`, `setcookie`. Matching is\ncase-insensitive and ignores `-`/`_`/spaces, so `API-KEY` and `access_token`\nboth match.\n\nAlso bounded: strings (2000 chars), arrays (100 entries), depth (6 levels).\nCycles become `'[circular]'` rather than throwing — a logger must never crash\nthe thing it observes. `Error` values serialize to `{ name, message, stack }`.\n\nOversized `meta` is replaced wholesale with a marker rather than truncated\nfield-by-field, because a partially-serialized object looks complete and is not.\n\n### Client transport settings\n\nDefaults are deliberately conservative. Shipping the transport is not the same\nas enabling it.\n\n| Setting           | Default               | Purpose                                       |\n| ----------------- | --------------------- | --------------------------------------------- |\n| `enabled`         | `false`               | Explicit opt-in per environment               |\n| `level`           | `'warn'`              | Threshold                                     |\n| `sampleRate`      | `1`                   | Fraction of eligible records kept             |\n| `batchIntervalMs` | `2000`                | Coalesce chatter                              |\n| `maxBatch`        | `50`                  | Records per frame                             |\n| `maxRecordBytes`  | `8192`                | Cap on one record's `meta`                    |\n| `redactKeys`      | standard secret names | Scrubbing before send                         |\n| `offlineBuffer`   | `50`                  | Held while disconnected, oldest dropped first |\n\n**Errors bypass sampling.** A sampled-away crash is the one record you actually\nneeded.\n\nWhile disconnected, records accumulate up to `offlineBuffer` and flush on the\nnext successful send. Overflow is counted in `transport.stats.droppedOffline`\nrather than silently discarded, so a devtools panel can show what was lost.\n\n### Replay buffer\n\n`createLogBuffer({ size })` retains the most recent records in memory so an\ninspector connecting mid-session sees context instead of a blank screen.\nDefault 200; `size: 0` gives strictly-live behavior.\n\n```ts\nhub.replayTo(socket.id) // send the backlog to one subscriber\n```\n\n## Edge cases and notes\n\n- Room membership does not survive a reconnect. The inspector's stream re-joins\n  on every `connect`; a custom subscriber must do the same.\n- The rate limiter is a per-socket window keyed on `socketId`. A reconnecting\n  client gets a fresh window.\n- Adapters map `stage: 'error'` (requests) and `phase: 'handler_error'`\n  (sockets) to `level: 'error'`. Rejected route rate-limit events are `warn`;\n  everything else is `debug`. Filter in the inspector rather than at the hub if\n  you want the detail.\n- `wrapLogger` returns the original method's return value unchanged, so it is a\n  drop-in for loggers whose calls are chained.\n- Adding `telemetry` to the export runtime flips `capabilities.logs`, which is\n  part of the snapshot hash — expect one checkpoint diff on first deploy.\n\n## Scripts\n\n```bash\npnpm --filter @emeryld/rrroutes-telemetry test\npnpm --filter @emeryld/rrroutes-telemetry typecheck\npnpm --filter @emeryld/rrroutes-telemetry build\n```\n","readmeFilename":"README.md"}