{"_id":"@abbacchio/browser-transport","_rev":"6-84c2c6a91cd921352ec75eb7dcdbbbaa","name":"@abbacchio/browser-transport","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.0":{"name":"@abbacchio/browser-transport","version":"0.1.0","keywords":["logging","console","browser","react","pino","abbacchio","log-viewer","debugging"],"author":"","license":"MIT","_id":"@abbacchio/browser-transport@0.1.0","maintainers":[{"name":"argenisleon","email":"argenisleon@gmail.com"}],"homepage":"https://github.com/your-org/abbacchio#readme","bugs":{"url":"https://github.com/your-org/abbacchio/issues"},"dist":{"shasum":"b8fc76e9032b775a6e542153e271358d7b60c7ae","tarball":"https://registry.npmjs.org/@abbacchio/browser-transport/-/browser-transport-0.1.0.tgz","fileCount":34,"integrity":"sha512-tVGKVxXexUhf83zq8iOXjDht1k1Y419xwUOm73EbvnNt/xpj4vCVneai6SYf0HtzsZqbYXEnB/xlAozVs1uiuQ==","signatures":[{"sig":"MEQCIFV+7K3gpXUGSzMaDLV9XlqcqJ2mTyfaPkIgIPNxDXaYAiBjGIMy6dMXHJZ4Henr3cWJF2fbw2rnyr2Or0CQdQerpA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":70687},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./auto":{"types":"./dist/auto.d.ts","import":"./dist/auto.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"}},"gitHead":"a4447aaf9665b7d743ecb293f62628fd1f505898","scripts":{"dev":"tsc --watch","build":"tsc","clean":"rimraf dist","prepublishOnly":"npm run build"},"_npmUser":{"name":"argenisleon","email":"argenisleon@gmail.com"},"repository":{"url":"git+https://github.com/your-org/abbacchio.git","type":"git","directory":"packages/browser-transport"},"_npmVersion":"11.6.2","description":"Browser and React logging client for Abbacchio - intercept console.log and send to your log viewer","directories":{},"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"devDependencies":{"react":"^18.2.0","rimraf":"^5.0.0","typescript":"^5.0.0","@types/react":"^18.2.0"},"peerDependencies":{"react":">=17.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/browser-transport_0.1.0_1768769998410_0.3573747662648019","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@abbacchio/browser-transport","version":"0.1.2","keywords":["logging","console","browser","react","pino","abbacchio","log-viewer","debugging"],"author":"","license":"MIT","_id":"@abbacchio/browser-transport@0.1.2","maintainers":[{"name":"argenisleon","email":"argenisleon@gmail.com"}],"homepage":"https://github.com/your-org/abbacchio#readme","bugs":{"url":"https://github.com/your-org/abbacchio/issues"},"dist":{"shasum":"4b70482e1b04f3bcd203739ffb3f14c487c9424c","tarball":"https://registry.npmjs.org/@abbacchio/browser-transport/-/browser-transport-0.1.2.tgz","fileCount":34,"integrity":"sha512-SLZJqu7neHlNiqtdn2p5f69SCRemSYjRhRUELXTHzG1r9AxrDjgiLbDY3sqMjAJ5Y9Z5e6L+IQmq51Mp5RvEiA==","signatures":[{"sig":"MEQCICdpdW5gQe/PxpuwyzAUZdoIuhLzR7i1SaLaIDHJ3w6gAiBZ8jtlL4t8B3YUiaODlFhLo6G/VpV1Ika6x82+ToY9Ig==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":70363},"main":"./dist/index.js","type":"module","_from":"file:abbacchio-browser-transport-0.1.2.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./auto":{"types":"./dist/auto.d.ts","import":"./dist/auto.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"}},"scripts":{"dev":"tsc --watch","build":"tsc","clean":"rimraf dist"},"_npmUser":{"name":"argenisleon","email":"argenisleon@gmail.com"},"_resolved":"/tmp/7c8094cbb6a9d4e9aa52f571e65efd13/abbacchio-browser-transport-0.1.2.tgz","_integrity":"sha512-SLZJqu7neHlNiqtdn2p5f69SCRemSYjRhRUELXTHzG1r9AxrDjgiLbDY3sqMjAJ5Y9Z5e6L+IQmq51Mp5RvEiA==","repository":{"url":"git+https://github.com/your-org/abbacchio.git","type":"git","directory":"packages/browser-transport"},"_npmVersion":"10.8.2","description":"Browser and React logging client for Abbacchio - intercept console.log and send to your log viewer","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"react":"^18.2.0","rimraf":"^5.0.0","typescript":"^5.0.0","@types/react":"^18.2.0"},"peerDependencies":{"react":">=17.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/browser-transport_0.1.2_1768798343957_0.3393681321843205","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@abbacchio/browser-transport","version":"0.1.3","keywords":["logging","console","browser","react","pino","abbacchio","log-viewer","debugging"],"author":"","license":"MIT","_id":"@abbacchio/browser-transport@0.1.3","maintainers":[{"name":"argenisleon","email":"argenisleon@gmail.com"}],"homepage":"https://github.com/mood-agency/abbacchio#readme","bugs":{"url":"https://github.com/mood-agency/abbacchio/issues"},"dist":{"shasum":"8738d0e1d0a39d94ee52605d7b4c5e2828859b6c","tarball":"https://registry.npmjs.org/@abbacchio/browser-transport/-/browser-transport-0.1.3.tgz","fileCount":34,"integrity":"sha512-+N4kaLOZujbOPCholyV4jtEO5hfW3Pf/7772IwA30KtNEOmAi54UcJI1gR4G+7POq6egZwaTdQ+zNuSrA2rp/g==","signatures":[{"sig":"MEQCIHbxUcmFaMLHYuzMbqaThVegq1fpd5qbLllDSsDlwQCpAiAykxmfmUqktBg77ThxLCyncNp3DyiV9JHfSQjUOqZAuQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abbacchio%2fbrowser-transport@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":70406},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./auto":{"types":"./dist/auto.d.ts","import":"./dist/auto.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"}},"gitHead":"fd05c9d70443dcf6272bf4d27b42410a6e3666fd","scripts":{"dev":"tsc --watch","build":"tsc","clean":"rimraf dist","prepublishOnly":"npm run build"},"_npmUser":{"name":"argenisleon","email":"argenisleon@gmail.com"},"repository":{"url":"git+https://github.com/mood-agency/abbacchio.git","type":"git","directory":"packages/browser-transport"},"_npmVersion":"10.8.2","description":"Browser and React logging client for Abbacchio - intercept console.log and send to your log viewer","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"react":"^18.2.0","rimraf":"^5.0.0","typescript":"^5.0.0","@types/react":"^18.2.0"},"peerDependencies":{"react":">=17.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/browser-transport_0.1.3_1768808092638_0.5111917664169525","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@abbacchio/browser-transport","version":"0.1.4","keywords":["logging","console","browser","react","pino","abbacchio","log-viewer","debugging"],"author":"","license":"MIT","_id":"@abbacchio/browser-transport@0.1.4","maintainers":[{"name":"argenisleon","email":"argenisleon@gmail.com"}],"homepage":"https://github.com/mood-agency/abbacchio#readme","bugs":{"url":"https://github.com/mood-agency/abbacchio/issues"},"dist":{"shasum":"55f22f19143f029c7a255bbc7985675aa22d6097","tarball":"https://registry.npmjs.org/@abbacchio/browser-transport/-/browser-transport-0.1.4.tgz","fileCount":34,"integrity":"sha512-KfuVseYkoq/DWp6fO6J+6IhASbTKfphzKmmID9pJoF62PXaWknvV/GOqHV/cW5xJqOgWCo6Ovmgyp7l7+oi7Og==","signatures":[{"sig":"MEYCIQDDR6BWRp/LPsiqiL4RP1vuh57gY+emY3xe2L5tDjsZ6gIhAJkIvrYhiOvyOhZcZ4MRJPzIim59tAUrgZe5yrrelQzY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abbacchio%2fbrowser-transport@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":74091},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./auto":{"types":"./dist/auto.d.ts","import":"./dist/auto.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"}},"gitHead":"b3e929abbdcd79e49d2370297a95bdae6c7ecc3a","scripts":{"dev":"tsc --watch","build":"tsc","clean":"rimraf dist","prepublishOnly":"npm run build"},"_npmUser":{"name":"argenisleon","email":"argenisleon@gmail.com"},"repository":{"url":"git+https://github.com/mood-agency/abbacchio.git","type":"git","directory":"packages/browser-transport"},"_npmVersion":"10.8.2","description":"Browser and React logging client for Abbacchio - intercept console.log and send to your log viewer","directories":{},"_nodeVersion":"20.20.0","_hasShrinkwrap":false,"devDependencies":{"react":"^18.2.0","rimraf":"^5.0.0","typescript":"^5.0.0","@types/react":"^18.2.0"},"peerDependencies":{"react":">=17.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/browser-transport_0.1.4_1770182463737_0.7014355925524287","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@abbacchio/browser-transport","version":"0.2.0","keywords":["logging","console","browser","react","pino","abbacchio","log-viewer","debugging"],"author":"","license":"MIT","_id":"@abbacchio/browser-transport@0.2.0","maintainers":[{"name":"argenisleon","email":"argenisleon@gmail.com"}],"homepage":"https://github.com/mood-agency/abbacchio#readme","bugs":{"url":"https://github.com/mood-agency/abbacchio/issues"},"dist":{"shasum":"5fcce239257efd721407a54a30945213b3fb1b70","tarball":"https://registry.npmjs.org/@abbacchio/browser-transport/-/browser-transport-0.2.0.tgz","fileCount":38,"integrity":"sha512-dHqf950JepTk/hGreQjmTOdUFZg3yqaRBCtIXW0t+QVrNSy0E9GkxVqcyFY596fe8+z9vULM6REyF/dmIUEw5A==","signatures":[{"sig":"MEYCIQDP/dDhWVh/r+6iutM3zp+QIVF/ChJaMBBQU8BanoWAugIhAMnRFk3KEUuafLmhJiSewcX1y6fIRjHAqsh5bERZiv92","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abbacchio%2fbrowser-transport@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":97346},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./auto":{"types":"./dist/auto.d.ts","import":"./dist/auto.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"}},"gitHead":"da75906f973b212db18d163f544ed47061c1737a","scripts":{"dev":"tsc --watch","build":"tsc","clean":"rimraf dist","prepublishOnly":"npm run build"},"_npmUser":{"name":"argenisleon","email":"argenisleon@gmail.com"},"repository":{"url":"git+https://github.com/mood-agency/abbacchio.git","type":"git","directory":"packages/browser-transport"},"_npmVersion":"10.8.2","description":"OTLP-native browser and React logging client for Abbacchio - intercept console.log and send via OpenTelemetry","directories":{},"_nodeVersion":"20.20.0","_hasShrinkwrap":false,"devDependencies":{"react":"^18.2.0","rimraf":"^5.0.0","typescript":"^5.0.0","@types/react":"^18.2.0"},"peerDependencies":{"react":">=17.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/browser-transport_0.2.0_1772876967508_0.47394832134346787","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@abbacchio/browser-transport","version":"0.3.0","description":"OTLP-native browser and React logging client for Abbacchio - intercept console.log and send via OpenTelemetry","type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./react":{"types":"./dist/react/index.d.ts","import":"./dist/react/index.js"},"./auto":{"types":"./dist/auto.d.ts","import":"./dist/auto.js"}},"scripts":{"test":"vitest run --environment jsdom","build":"tsc","dev":"tsc --watch","clean":"rimraf dist","prepublishOnly":"npm run build"},"keywords":["logging","console","browser","react","pino","abbacchio","log-viewer","debugging"],"author":"","license":"MIT","peerDependencies":{"react":">=17.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"devDependencies":{"@types/react":"^18.3.28","jsdom":"^29.1.1","react":"^18.3.1","rimraf":"^5.0.10","typescript":"^5.9.3","vitest":"^4.1.5"},"repository":{"type":"git","url":"git+https://github.com/mood-agency/abbacchio.git","directory":"packages/browser-transport"},"dependencies":{"web-vitals":"^5.2.0"},"_id":"@abbacchio/browser-transport@0.3.0","gitHead":"12cfa24cb1390948281e28815aaf79a696cefc1c","bugs":{"url":"https://github.com/mood-agency/abbacchio/issues"},"homepage":"https://github.com/mood-agency/abbacchio#readme","_nodeVersion":"22.22.3","_npmVersion":"10.9.8","dist":{"integrity":"sha512-aodXg1I+zFa3oZdcisC2OWMbYDkYBG9Yrg6Dql4oaDb1QVzI+uq0r+Y53hMKrZqA8O0iwH5qCaeN85HUqDmm/Q==","shasum":"c570040a1754c56a7d48097d601408e0b65183f0","tarball":"https://registry.npmjs.org/@abbacchio/browser-transport/-/browser-transport-0.3.0.tgz","fileCount":50,"unpackedSize":187640,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQD/p/PtAfL+hwb/hJYbe5Gat9/yruZRWPqLTFpGO4aNCQIgC88ra6kZOBtyDGzaTkRjGiHFDrtvAj0D1wokfFORbzw="}]},"_npmUser":{"name":"argenisleon","email":"argenisleon@gmail.com"},"directories":{},"maintainers":[{"name":"argenisleon","email":"argenisleon@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/browser-transport_0.3.0_1787536359441_0.04325698904294706"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-18T20:59:58.328Z","modified":"2026-08-24T01:52:39.762Z","0.1.0":"2026-01-18T20:59:58.573Z","0.1.2":"2026-01-19T04:52:24.090Z","0.1.3":"2026-01-19T07:34:52.786Z","0.1.4":"2026-02-04T05:21:03.884Z","0.2.0":"2026-03-07T09:49:27.648Z","0.3.0":"2026-08-24T01:52:39.601Z"},"bugs":{"url":"https://github.com/mood-agency/abbacchio/issues"},"license":"MIT","homepage":"https://github.com/mood-agency/abbacchio#readme","keywords":["logging","console","browser","react","pino","abbacchio","log-viewer","debugging"],"repository":{"type":"git","url":"git+https://github.com/mood-agency/abbacchio.git","directory":"packages/browser-transport"},"description":"OTLP-native browser and React logging client for Abbacchio - intercept console.log and send via OpenTelemetry","maintainers":[{"name":"argenisleon","email":"argenisleon@gmail.com"}],"readme":"# @abbacchio/browser-transport\n\nOTLP-native browser and React logging client for Abbacchio. Intercept `console.log`, capture network requests, Web Vitals, errors, and performance metrics — all sent via OpenTelemetry protocol.\n\n## Installation\n\n```bash\nnpm install @abbacchio/browser-transport\n# or\npnpm add @abbacchio/browser-transport\n# or\nyarn add @abbacchio/browser-transport\n```\n\n## Quick Start\n\n### Option 1: Auto-capture (one line)\n\n```javascript\nimport '@abbacchio/browser-transport/auto'\n\n// All console.log calls now go to Abbacchio!\nconsole.log('This is captured!')\nconsole.error('Errors too!')\n```\n\nConfigure via global variable:\n\n```html\n<script>\n  window.__ABBACCHIO_CONFIG__ = {\n    endpoint: 'http://localhost:4002',\n    serviceName: 'my-app',\n  }\n</script>\n<script type=\"module\">\n  import '@abbacchio/browser-transport/auto'\n</script>\n```\n\n### Option 2: Manual console interception\n\n```javascript\nimport { interceptConsole, stopInterceptConsole } from '@abbacchio/browser-transport'\n\ninterceptConsole({\n  endpoint: 'http://localhost:4002',\n  serviceName: 'my-frontend',\n  appName: 'my-app',\n})\n\nconsole.log('Captured!')\nconsole.warn('Warning captured!')\nconsole.error('Error captured!')\n\nstopInterceptConsole()\n```\n\n### Option 3: Structured Logger\n\n```javascript\nimport { createLogger } from '@abbacchio/browser-transport'\n\nconst log = createLogger({\n  endpoint: 'http://localhost:4002',\n  serviceName: 'my-app',\n  name: 'my-service',\n})\n\nlog.info('User logged in', { userId: 123 })\nlog.warn('Rate limit approaching', { current: 95, max: 100 })\nlog.error('Failed to fetch', { endpoint: '/api/users', status: 500 })\n\n// Create child logger with additional context\nconst requestLog = log.child({ requestId: 'abc-123' })\nrequestLog.info('Processing request')\n```\n\n### Option 4: React Provider\n\n```tsx\nimport { AbbacchioProvider, useLogger } from '@abbacchio/browser-transport/react'\n\nfunction App() {\n  return (\n    <AbbacchioProvider\n      endpoint=\"http://localhost:4002\"\n      serviceName=\"my-react-app\"\n      captureConsole\n      captureWebVitals\n    >\n      <MyApp />\n    </AbbacchioProvider>\n  )\n}\n\nfunction MyComponent() {\n  const log = useLogger()\n  return <button onClick={() => log.info('clicked')}>Click me</button>\n}\n```\n\n## Web Vitals\n\nCapture Core Web Vitals (LCP, INP, CLS, FCP, TTFB) using Google's [web-vitals](https://github.com/GoogleChrome/web-vitals) library. Each vital is reported as both a log entry and an OTLP metric gauge.\n\n### Via Logger\n\n```javascript\nimport { createLogger } from '@abbacchio/browser-transport'\n\nconst log = createLogger({\n  endpoint: 'http://localhost:4002',\n  serviceName: 'my-app',\n  captureWebVitals: true,\n})\n```\n\n### Via React Provider\n\n```tsx\n<AbbacchioProvider\n  endpoint=\"http://localhost:4002\"\n  serviceName=\"my-app\"\n  captureWebVitals\n>\n  <App />\n</AbbacchioProvider>\n```\n\n### Standalone\n\n```javascript\nimport { startWebVitalsCapture, stopWebVitalsCapture } from '@abbacchio/browser-transport'\n\nstartWebVitalsCapture(\n  { captureLCP: true, captureINP: true, captureCLS: true },\n  (logEntry) => console.log(logEntry),\n  (metric) => console.log(metric),\n)\n```\n\n### Options\n\n```typescript\ninterface WebVitalsCaptureOptions {\n  captureLCP?: boolean     // Largest Contentful Paint (default: true)\n  captureINP?: boolean     // Interaction to Next Paint (default: true)\n  captureCLS?: boolean     // Cumulative Layout Shift (default: true)\n  captureFCP?: boolean     // First Contentful Paint (default: true)\n  captureTTFB?: boolean    // Time to First Byte (default: true)\n  reportAsMetrics?: boolean // Send as OTLP metrics too (default: true)\n  goodLevel?: number       // Log level for \"good\" ratings (default: 30/info)\n  needsImprovementLevel?: number // Log level for \"needs improvement\" (default: 40/warn)\n  poorLevel?: number       // Log level for \"poor\" ratings (default: 50/error)\n}\n```\n\n### Output\n\nLog entries include the vital name, value, rating, and metadata:\n\n```\nLCP 3060ms (poor)      → level: error\nFCP 800ms (good)       → level: info\nCLS 0.150 (needs-improvement) → level: warn\nINP 120ms (good)       → level: info\nTTFB 450ms (good)      → level: info\n```\n\nOTLP metrics are sent as gauges: `web_vital.lcp`, `web_vital.inp`, `web_vital.cls`, `web_vital.fcp`, `web_vital.ttfb` — each with a `rating` attribute.\n\n## Network Capture\n\nAutomatically capture HTTP requests and WebSockets.\n\n### Enabling at Creation\n\n```javascript\nconst log = createLogger({\n  endpoint: 'http://localhost:4002',\n  serviceName: 'my-app',\n  captureFetch: true,\n  captureXhr: true,\n  captureWebSockets: true,\n  includeBody: false,\n  ignoreNetworkUrls: ['/analytics', /\\.png$/],\n})\n```\n\n### Enabling at Runtime\n\n```javascript\nlog.enableNetworkCapture({\n  captureFetch: true,\n  captureXhr: true,\n  captureWebSockets: true,\n})\n\nlog.disableNetworkCapture()\n```\n\n## Performance Capture\n\nCapture main-thread jank (long tasks > 50ms) and slow event handlers via PerformanceObserver.\n\n```javascript\nimport { startPerfCapture, stopPerfCapture } from '@abbacchio/browser-transport'\n\nstartPerfCapture(\n  {\n    captureLongTasks: true,\n    captureSlowEvents: true,\n    captureMemory: true,\n    slowEventThresholdMs: 100,\n    memoryCaptureIntervalMs: 10000,\n  },\n  (entry) => console.log(entry),\n)\n```\n\n## Memory Profiler\n\nInstall an opt-in, bounded memory profiler for long-running browser\ninvestigations. Installation exposes a stopped console API; it does not create\na sampling timer until `start()` is called.\n\n```javascript\nimport { installMemoryProfiler } from '@abbacchio/browser-transport'\n\ninstallMemoryProfiler({\n  domSelectors: {\n    virtualRows: '[data-virtual-row-key]',\n    editors: '.monaco-editor',\n  },\n  collectValues: () => ({\n    framesReceived: applicationDiagnostics.framesReceived,\n  }),\n})\n\n__abbacchioMemory.start({\n  intervalMs: 30_000,\n  maxSamples: 1_440,\n  label: 'baseline-idle',\n})\n```\n\nUse `mark(label)` or `sample(label)` for checkpoints, `getSamples()` and\n`status()` for inspection, and `download()` for a JSONL export. Samples contain\nonly copied JSON values and the retained history is capped by `maxSamples`.\n\nThe global and downloaded filename prefix are configurable:\n\n```javascript\ninstallMemoryProfiler({\n  globalName: '__myAppMemory',\n  filenamePrefix: 'my-app-memory',\n  hot: import.meta.hot,\n})\n```\n\nTo keep a run after the tab closes, forward samples to Abbacchio as gauge\nmetrics. Every point is tagged with the run's `sessionId`, so a run can be\nqueried back out of the `metrics` table:\n\n```javascript\nimport { toMemoryProfilerMetrics } from '@abbacchio/browser-transport'\n\ninstallMemoryProfiler({\n  onSample: (sample) => {\n    for (const point of toMemoryProfilerMetrics(sample, { prefix: 'client.memory' })) {\n      client.addMetric({ ...point, type: 'gauge' })\n    }\n  },\n})\n```\n\nSee the [browser memory profiling guide](../../docs/memory-profiling.md) for a\ncomplete investigation workflow, sample format, interpretation guidance,\npersistence and SQL query recipes, and JSONL analysis examples.\n\n## Error Capture\n\nCapture uncaught exceptions and unhandled promise rejections.\n\n```javascript\nimport { startErrorCapture, stopErrorCapture } from '@abbacchio/browser-transport'\n\nstartErrorCapture(\n  {\n    captureErrors: true,\n    captureUnhandledRejections: true,\n  },\n  (entry) => console.log(entry),\n)\n```\n\n## OTLP Metrics & Traces\n\nThe client supports sending custom metrics and traces via the OTLP protocol.\n\n### Metrics\n\n```javascript\nimport { createLogger } from '@abbacchio/browser-transport'\n\nconst log = createLogger({ endpoint: 'http://localhost:4002', serviceName: 'my-app' })\n\nlog.metric({\n  name: 'page_load_time',\n  value: 1200,\n  type: 'gauge',\n  unit: 'ms',\n  attributes: { route: '/dashboard' },\n})\n```\n\n### Traces\n\n```javascript\nconst span = log.startSpan('fetch-users', { route: '/api/users' })\ntry {\n  const users = await fetchUsers()\n  span.end('OK')\n} catch (err) {\n  span.end('ERROR')\n}\n```\n\n## API Reference\n\n### `createLogger(options)`\n\n```typescript\ninterface LoggerOptions {\n  endpoint?: string       // OTLP server URL (default: 'http://localhost:4002')\n  serviceName?: string    // OTLP service.name attribute (default: 'default')\n  name?: string           // Logger name (default: 'app')\n  enabled?: boolean       // Send logs (default: true)\n  level?: number | 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal'\n  batchSize?: number      // Logs per batch (default: 1000)\n  flushInterval?: number  // Ms between flushes (default: 2000)\n  includeUrl?: boolean    // Include page URL (default: false)\n\n  // Web Vitals\n  captureWebVitals?: boolean  // Capture LCP, INP, CLS, FCP, TTFB (default: false)\n  webVitalsOptions?: WebVitalsCaptureOptions\n\n  // Network Capture\n  captureFetch?: boolean\n  captureXhr?: boolean\n  captureWebSockets?: boolean\n  includeBody?: boolean\n  includeHeaders?: boolean\n  ignoreNetworkUrls?: (string | RegExp)[]\n}\n```\n\n### `AbbacchioProvider` (React)\n\n```tsx\n<AbbacchioProvider\n  endpoint=\"http://localhost:4002\"\n  serviceName=\"my-app\"\n  captureConsole={true}\n  captureWebVitals={true}\n  webVitalsOptions={{ captureLCP: true, captureINP: true }}\n>\n  {children}\n</AbbacchioProvider>\n```\n\n### `useLogger()` / `useAbbacchio()` (React Hooks)\n\n```tsx\nconst log = useLogger()\nconst { info, warn, error, metric, startSpan } = useAbbacchio()\n```\n\n## Disabling in Production\n\n```javascript\nconst log = createLogger({\n  serviceName: 'my-app',\n  enabled: process.env.NODE_ENV !== 'production',\n})\n\n// Or toggle at runtime\nconst client = createClient({ enabled: false })\nclient.enable()\nclient.disable()\n```\n\n## Log Levels\n\nCompatible with Pino log levels:\n\n| Level | Number |\n|-------|--------|\n| trace | 10     |\n| debug | 20     |\n| info  | 30     |\n| warn  | 40     |\n| error | 50     |\n| fatal | 60     |\n\n### Filtering captured console output\n\n`interceptConsole` and `AbbacchioProvider` accept a `level` that sets the floor\nfor what is **sent to the server**. `console.debug` maps to 20, `console.log` /\n`console.info` to 30, `console.warn` to 40 and `console.error` to 50, so\n`level: 'info'` keeps milestones and failures while dropping debug noise. Omit it\nto capture every level.\n\nPassthrough to the browser console is never suppressed by `level` — the developer\nstill sees everything locally.\n\nBecause `interceptConsole` merges options while capture is active, the floor can\nbe retuned at runtime without remounting anything:\n\n```javascript\ninterceptConsole({ level: 'debug' }) // temporarily capture debug noise\ninterceptConsole({ level: 'info' })  // back to the shipping floor\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}