{"_id":"@amazing-socrates/telemetry-kit","_rev":"11-84592a1df0224bbaecd48960c0d8b26a","name":"@amazing-socrates/telemetry-kit","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.0":{"name":"@amazing-socrates/telemetry-kit","version":"0.1.0","_id":"@amazing-socrates/telemetry-kit@0.1.0","maintainers":[{"name":"zlccns.work","email":"zlccns.work@gmail.com"}],"homepage":"https://github.com/amazing-socrates/web-telemetry-kit#readme","bugs":{"url":"https://github.com/amazing-socrates/web-telemetry-kit/issues"},"dist":{"shasum":"2d57dc878b4c0c1df44c59726e1e7d8815ead0fc","tarball":"https://registry.npmjs.org/@amazing-socrates/telemetry-kit/-/telemetry-kit-0.1.0.tgz","fileCount":3,"integrity":"sha512-Fb6kYzhhgnykfR25Ua6o9xfxVEzUI+3BhWRff2SwQ7ckZ1oix2sZ5ilrBnDsGY6YpkmgqZh11ZDafQsqJjdjOQ==","signatures":[{"sig":"MEYCIQCpRAwc0C4KnzMxYoi8zIMfQ+lIMRcsPPUgSYM9YhoNNQIhAJh8ztOy8AUb/ltTxnwPBh/m11B12qMRoiAkKM1lgh0p","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1331},"type":"module","scripts":{"version:major":"npm version major --no-git-tag-version","version:minor":"npm version minor --no-git-tag-version","version:patch":"npm version patch --no-git-tag-version","== patch：修复问题，例如 0.1.0 -> 0.1.1 ==":"","== minor：新增兼容功能，例如 0.1.1 -> 0.2.0 ==":"","== major：包含不兼容变更，例如 0.2.0 -> 1.0.0 ==":"","== 以下版本命令由开发人员在发布前手动选择执行一个 ==":""},"_npmUser":{"name":"zlccns.work","email":"zlccns.work@gmail.com"},"repository":{"url":"git+https://github.com/amazing-socrates/web-telemetry-kit.git","type":"git"},"_npmVersion":"11.12.1","description":"A vendor-neutral web telemetry and diagnostics toolkit.","directories":{},"_nodeVersion":"26.0.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/telemetry-kit_0.1.0_1786067627910_0.3953332814406392","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@amazing-socrates/telemetry-kit","version":"0.1.2","_id":"@amazing-socrates/telemetry-kit@0.1.2","maintainers":[{"name":"zlccns.work","email":"zlccns.work@gmail.com"}],"homepage":"https://github.com/amazing-socrates/web-telemetry-kit#readme","bugs":{"url":"https://github.com/amazing-socrates/web-telemetry-kit/issues"},"dist":{"shasum":"99803c8e2653be82f38f50cbd661883b184cc8c6","tarball":"https://registry.npmjs.org/@amazing-socrates/telemetry-kit/-/telemetry-kit-0.1.2.tgz","fileCount":3,"integrity":"sha512-NeVI0ivglk9Ur+/KOujRGFfTThaCaua7gkWNLpb6aFcNxEiVoy6KvbAKHSMl3Ae8GSmNIb3k0oeQYzMCEt5Lnw==","signatures":[{"sig":"MEQCIBc+Nf8SWKx+wmhMnCedG5aHWTEQL9Pm6sdgME+rHjhiAiByD4ryAJ+59KRBXUq5oPg4OhkQJALtbuPND29GXU7RXA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1977},"type":"module","_from":"file:amazing-socrates-telemetry-kit-0.1.2.tgz","scripts":{"version:major":"npm version major --no-git-tag-version","version:minor":"npm version minor --no-git-tag-version","version:patch":"npm version patch --no-git-tag-version","== patch：修复问题，例如 0.1.0 -> 0.1.1 ==":"","== minor：新增兼容功能，例如 0.1.1 -> 0.2.0 ==":"","== major：包含不兼容变更，例如 0.2.0 -> 1.0.0 ==":"","== 以下版本命令由开发人员在发布前手动选择执行一个 ==":""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4d98ed38-78dd-454d-b9ef-6bb2c0356c3c"}},"_resolved":"/home/runner/work/web-telemetry-kit/web-telemetry-kit/amazing-socrates-telemetry-kit-0.1.2.tgz","_integrity":"sha512-NeVI0ivglk9Ur+/KOujRGFfTThaCaua7gkWNLpb6aFcNxEiVoy6KvbAKHSMl3Ae8GSmNIb3k0oeQYzMCEt5Lnw==","repository":{"url":"git+https://github.com/amazing-socrates/web-telemetry-kit.git","type":"git"},"_npmVersion":"11.16.0","description":"A vendor-neutral web telemetry and diagnostics toolkit.","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/telemetry-kit_0.1.2_1786092511186_0.10146263182162141","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@amazing-socrates/telemetry-kit","version":"0.1.3","_id":"@amazing-socrates/telemetry-kit@0.1.3","maintainers":[{"name":"zlccns.work","email":"zlccns.work@gmail.com"}],"homepage":"https://github.com/amazing-socrates/web-telemetry-kit#readme","bugs":{"url":"https://github.com/amazing-socrates/web-telemetry-kit/issues"},"dist":{"shasum":"39effef4d390494533deaf6d3133f337f3946a43","tarball":"https://registry.npmjs.org/@amazing-socrates/telemetry-kit/-/telemetry-kit-0.1.3.tgz","fileCount":3,"integrity":"sha512-9AtNv6JDTcsvW9rZgUCta1F9JuBN/NuoA6kjaJiSFMjEpmG12ICP0zZ2oPANJgXsL+nse/vciouBi8HldFe5zg==","signatures":[{"sig":"MEUCIDtra2MTTSa5pjdX39ilNjh1MFyyF/92klOsu6IPb3eJAiEA6MhBsiUH/FLz8HLN7INDZsmSkW2Xt0jbIzZgylczoTI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1890},"type":"module","_from":"file:amazing-socrates-telemetry-kit-0.1.3.tgz","scripts":{"version:major":"npm version major --no-git-tag-version","version:minor":"npm version minor --no-git-tag-version","version:patch":"npm version patch --no-git-tag-version","== patch：修复问题，例如 0.1.0 -> 0.1.1 ==":"","== minor：新增兼容功能，例如 0.1.1 -> 0.2.0 ==":"","== major：包含不兼容变更，例如 0.2.0 -> 1.0.0 ==":"","== 以下版本命令由开发人员在发布前手动选择执行一个 ==":""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4d98ed38-78dd-454d-b9ef-6bb2c0356c3c"}},"_resolved":"/home/runner/work/web-telemetry-kit/web-telemetry-kit/amazing-socrates-telemetry-kit-0.1.3.tgz","_integrity":"sha512-9AtNv6JDTcsvW9rZgUCta1F9JuBN/NuoA6kjaJiSFMjEpmG12ICP0zZ2oPANJgXsL+nse/vciouBi8HldFe5zg==","repository":{"url":"git+https://github.com/amazing-socrates/web-telemetry-kit.git","type":"git"},"_npmVersion":"11.16.0","description":"A vendor-neutral web telemetry and diagnostics toolkit.","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/telemetry-kit_0.1.3_1786093537372_0.3616068606624372","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@amazing-socrates/telemetry-kit","version":"0.1.4","_id":"@amazing-socrates/telemetry-kit@0.1.4","maintainers":[{"name":"zlccns.work","email":"zlccns.work@gmail.com"}],"homepage":"https://github.com/amazing-socrates/web-telemetry-kit#readme","bugs":{"url":"https://github.com/amazing-socrates/web-telemetry-kit/issues"},"dist":{"shasum":"e69a2677200b1b9e9c215e4ed2ceaddf2741266d","tarball":"https://registry.npmjs.org/@amazing-socrates/telemetry-kit/-/telemetry-kit-0.1.4.tgz","fileCount":3,"integrity":"sha512-tHA+sFXl0PN3gDKiLk5J4BLXo3JJFoKhv3D8RMWZ7Gf7Fy7b6Au48GvK/wLXSr+M7eV2pS5x/X+8yGQd13CgOg==","signatures":[{"sig":"MEYCIQCLZffnyQKyf1XrC9I12TNSTcjMzwpQsCrYKFYgMZufpAIhALxreAjXXb6tx4tFVIkLOfDb/cDJlMJ7m76O+wTzSQhK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1890},"type":"module","_from":"file:amazing-socrates-telemetry-kit-0.1.4.tgz","scripts":{"version:major":"npm version major --no-git-tag-version","version:minor":"npm version minor --no-git-tag-version","version:patch":"npm version patch --no-git-tag-version","== patch：修复问题，例如 0.1.0 -> 0.1.1 ==":"","== minor：新增兼容功能，例如 0.1.1 -> 0.2.0 ==":"","== major：包含不兼容变更，例如 0.2.0 -> 1.0.0 ==":"","== 以下版本命令由开发人员在发布前手动选择执行一个 ==":""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4d98ed38-78dd-454d-b9ef-6bb2c0356c3c"}},"_resolved":"/home/runner/work/web-telemetry-kit/web-telemetry-kit/amazing-socrates-telemetry-kit-0.1.4.tgz","_integrity":"sha512-tHA+sFXl0PN3gDKiLk5J4BLXo3JJFoKhv3D8RMWZ7Gf7Fy7b6Au48GvK/wLXSr+M7eV2pS5x/X+8yGQd13CgOg==","repository":{"url":"git+https://github.com/amazing-socrates/web-telemetry-kit.git","type":"git"},"_npmVersion":"11.16.0","description":"A vendor-neutral web telemetry and diagnostics toolkit.","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/telemetry-kit_0.1.4_1786094372004_0.8208858189993582","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@amazing-socrates/telemetry-kit","version":"0.1.6","license":"UNLICENSED","_id":"@amazing-socrates/telemetry-kit@0.1.6","maintainers":[{"name":"zlccns.work","email":"zlccns.work@gmail.com"},{"name":"ccjmlp","email":"chenchangjun520@gmail.com"}],"homepage":"https://github.com/amazing-socrates/web-telemetry-kit#readme","bugs":{"url":"https://github.com/amazing-socrates/web-telemetry-kit/issues"},"dist":{"shasum":"cfe776b12abaff958c1ee55bd4c44e9c6c663d97","tarball":"https://registry.npmjs.org/@amazing-socrates/telemetry-kit/-/telemetry-kit-0.1.6.tgz","fileCount":6,"integrity":"sha512-N/RsNc22fOC+ha5nQCP7+HIdfc3spwo9fMbNPIgWIEGzi0SWcx7wMH+ICoxGdYMqnaJ0VqsQsu4stvKAeFIkCQ==","signatures":[{"sig":"MEUCIQDqBkPm721AL1n2hPRIme2s5PSS2fDMZObXFyr9KsYmewIgFaYR6/B/JO4HwhyGG8NKoizOtAg5iB2KnK4eTzs+KiM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":90068},"main":"./dist/index.cjs","type":"module","_from":"file:amazing-socrates-telemetry-kit-0.1.6.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"build":"tsup","typecheck":"tsc --noEmit","version:major":"npm version major --no-git-tag-version","version:minor":"npm version minor --no-git-tag-version","version:patch":"npm version patch --no-git-tag-version","== patch：修复问题，例如 0.1.0 -> 0.1.1 ==":"","== minor：新增兼容功能，例如 0.1.1 -> 0.2.0 ==":"","== major：包含不兼容变更，例如 0.2.0 -> 1.0.0 ==":"","== 以下版本命令由开发人员在发布前手动选择执行一个 ==":""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4d98ed38-78dd-454d-b9ef-6bb2c0356c3c"}},"_resolved":"/home/runner/work/web-telemetry-kit/web-telemetry-kit/amazing-socrates-telemetry-kit-0.1.6.tgz","_integrity":"sha512-N/RsNc22fOC+ha5nQCP7+HIdfc3spwo9fMbNPIgWIEGzi0SWcx7wMH+ICoxGdYMqnaJ0VqsQsu4stvKAeFIkCQ==","repository":{"url":"git+https://github.com/amazing-socrates/web-telemetry-kit.git","type":"git"},"_npmVersion":"11.16.0","description":"A vendor-neutral web telemetry and diagnostics toolkit.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@sentry/react":"~10.69.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","axios":"^1.13.6","react":"^19.0.0","react-dom":"^19.0.0","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"axios":"^1.0.0","react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"peerDependenciesMeta":{"axios":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/telemetry-kit_0.1.6_1786436732212_0.09783148705677913","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@amazing-socrates/telemetry-kit","version":"0.1.7","license":"UNLICENSED","_id":"@amazing-socrates/telemetry-kit@0.1.7","maintainers":[{"name":"zlccns.work","email":"zlccns.work@gmail.com"},{"name":"ccjmlp","email":"chenchangjun520@gmail.com"}],"homepage":"https://github.com/amazing-socrates/web-telemetry-kit#readme","bugs":{"url":"https://github.com/amazing-socrates/web-telemetry-kit/issues"},"dist":{"shasum":"c012ee06003d934ad4ffabbe1087aa58809676e6","tarball":"https://registry.npmjs.org/@amazing-socrates/telemetry-kit/-/telemetry-kit-0.1.7.tgz","fileCount":6,"integrity":"sha512-NhG0c+EpuFRGk3OaN5Yhps6+Z2sFSx4BvIaMq3wAygvMwlZHUxZYcblcjfoFmQAecDnzpq+m9a+3mReIJxEUUQ==","signatures":[{"sig":"MEYCIQDk5qZtJSi2e2tIkIi6rqxM2OtVJazPgVFOhCshYoAvVwIhAJccHOIwPM7fqOUlzTnz9CfbHCUGv7dFZRpiSZdkRxF7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":94411},"main":"./dist/index.cjs","type":"module","_from":"file:amazing-socrates-telemetry-kit-0.1.7.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"build":"tsup","typecheck":"tsc --noEmit","version:major":"npm version major --no-git-tag-version","version:minor":"npm version minor --no-git-tag-version","version:patch":"npm version patch --no-git-tag-version","== patch：修复问题，例如 0.1.0 -> 0.1.1 ==":"","== minor：新增兼容功能，例如 0.1.1 -> 0.2.0 ==":"","== major：包含不兼容变更，例如 0.2.0 -> 1.0.0 ==":"","== 以下版本命令由开发人员在发布前手动选择执行一个 ==":""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4d98ed38-78dd-454d-b9ef-6bb2c0356c3c"}},"_resolved":"/home/runner/work/web-telemetry-kit/web-telemetry-kit/amazing-socrates-telemetry-kit-0.1.7.tgz","_integrity":"sha512-NhG0c+EpuFRGk3OaN5Yhps6+Z2sFSx4BvIaMq3wAygvMwlZHUxZYcblcjfoFmQAecDnzpq+m9a+3mReIJxEUUQ==","repository":{"url":"git+https://github.com/amazing-socrates/web-telemetry-kit.git","type":"git"},"_npmVersion":"11.17.0","description":"A vendor-neutral web telemetry and diagnostics toolkit.","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@sentry/react":"~10.69.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","axios":"^1.13.6","react":"^19.0.0","react-dom":"^19.0.0","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"axios":"^1.0.0","react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"peerDependenciesMeta":{"axios":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/telemetry-kit_0.1.7_1786679087113_0.8455650114191475","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@amazing-socrates/telemetry-kit","version":"0.1.8","license":"UNLICENSED","_id":"@amazing-socrates/telemetry-kit@0.1.8","maintainers":[{"name":"zlccns.work","email":"zlccns.work@gmail.com"},{"name":"ccjmlp","email":"chenchangjun520@gmail.com"}],"homepage":"https://github.com/amazing-socrates/web-telemetry-kit#readme","bugs":{"url":"https://github.com/amazing-socrates/web-telemetry-kit/issues"},"dist":{"shasum":"e0b0ad9a8dd5412e75bc39c5fedd5d6fa22fe7a4","tarball":"https://registry.npmjs.org/@amazing-socrates/telemetry-kit/-/telemetry-kit-0.1.8.tgz","fileCount":6,"integrity":"sha512-AiUMqgiRrT197PWC78sEPK58aOHnXnZU+OCujDc9kTEN5ruuaofuclptWATMpDR0Gqu7FlltRFg5bGUrMBZzIQ==","signatures":[{"sig":"MEUCIGThJ509xisPRYKXjpUbEcM+nCwtsr7RgRJ0k+vQqQAZAiEAvOaGY9tyTO2yoWmHIiJYAfG6txjnPkbHR9kW4xmEBXc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101268},"main":"./dist/index.cjs","type":"module","_from":"file:amazing-socrates-telemetry-kit-0.1.8.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"build":"tsup","typecheck":"tsc --noEmit","version:major":"npm version major --no-git-tag-version","version:minor":"npm version minor --no-git-tag-version","version:patch":"npm version patch --no-git-tag-version","== patch：修复问题，例如 0.1.0 -> 0.1.1 ==":"","== minor：新增兼容功能，例如 0.1.1 -> 0.2.0 ==":"","== major：包含不兼容变更，例如 0.2.0 -> 1.0.0 ==":"","== 以下版本命令由开发人员在发布前手动选择执行一个 ==":""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4d98ed38-78dd-454d-b9ef-6bb2c0356c3c"}},"_resolved":"/home/runner/work/web-telemetry-kit/web-telemetry-kit/amazing-socrates-telemetry-kit-0.1.8.tgz","_integrity":"sha512-AiUMqgiRrT197PWC78sEPK58aOHnXnZU+OCujDc9kTEN5ruuaofuclptWATMpDR0Gqu7FlltRFg5bGUrMBZzIQ==","repository":{"url":"git+https://github.com/amazing-socrates/web-telemetry-kit.git","type":"git"},"_npmVersion":"11.17.0","description":"A vendor-neutral web telemetry and diagnostics toolkit.","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@sentry/react":"~10.69.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","axios":"^1.13.6","react":"^19.0.0","react-dom":"^19.0.0","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"axios":"^1.0.0","react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"peerDependenciesMeta":{"axios":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/telemetry-kit_0.1.8_1786706048640_0.021115000645651527","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"@amazing-socrates/telemetry-kit","version":"0.1.9","license":"UNLICENSED","_id":"@amazing-socrates/telemetry-kit@0.1.9","maintainers":[{"name":"zlccns.work","email":"zlccns.work@gmail.com"},{"name":"ccjmlp","email":"chenchangjun520@gmail.com"}],"homepage":"https://github.com/amazing-socrates/web-telemetry-kit#readme","bugs":{"url":"https://github.com/amazing-socrates/web-telemetry-kit/issues"},"dist":{"shasum":"43f685cc0da66c252a4ab611e415ed15ba9c444d","tarball":"https://registry.npmjs.org/@amazing-socrates/telemetry-kit/-/telemetry-kit-0.1.9.tgz","fileCount":6,"integrity":"sha512-Wo/cFF5aCRdW/M6Zda+1K5pqUYzaUs8pcw50rj6t+9lPF8DzWaa+gQnQQEYiFxWyZ+2o2mV3uLT5k8MrDzj2VA==","signatures":[{"sig":"MEYCIQC2W37fQePv4abYw0bhVKvThDzbPvOQSqqFHQi2bcDPUwIhAO8jaD8TPWESZQqZ4WJZCaIoR71tGkNBA7xsE1AHgfm0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98143},"main":"./dist/index.cjs","type":"module","_from":"file:amazing-socrates-telemetry-kit-0.1.9.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"build":"tsup","typecheck":"tsc --noEmit","version:major":"npm version major --no-git-tag-version","version:minor":"npm version minor --no-git-tag-version","version:patch":"npm version patch --no-git-tag-version","== patch：修复问题，例如 0.1.0 -> 0.1.1 ==":"","== minor：新增兼容功能，例如 0.1.1 -> 0.2.0 ==":"","== major：包含不兼容变更，例如 0.2.0 -> 1.0.0 ==":"","== 以下版本命令由开发人员在发布前手动选择执行一个 ==":""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4d98ed38-78dd-454d-b9ef-6bb2c0356c3c"}},"_resolved":"/home/runner/work/web-telemetry-kit/web-telemetry-kit/amazing-socrates-telemetry-kit-0.1.9.tgz","_integrity":"sha512-Wo/cFF5aCRdW/M6Zda+1K5pqUYzaUs8pcw50rj6t+9lPF8DzWaa+gQnQQEYiFxWyZ+2o2mV3uLT5k8MrDzj2VA==","repository":{"url":"git+https://github.com/amazing-socrates/web-telemetry-kit.git","type":"git"},"_npmVersion":"11.17.0","description":"A vendor-neutral web telemetry and diagnostics toolkit.","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@sentry/react":"~10.69.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","axios":"^1.13.6","react":"^19.0.0","react-dom":"^19.0.0","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"axios":"^1.0.0","react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"peerDependenciesMeta":{"axios":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/telemetry-kit_0.1.9_1786787751955_0.3709692254942638","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@amazing-socrates/telemetry-kit","version":"0.2.0","license":"UNLICENSED","_id":"@amazing-socrates/telemetry-kit@0.2.0","maintainers":[{"name":"zlccns.work","email":"zlccns.work@gmail.com"},{"name":"ccjmlp","email":"chenchangjun520@gmail.com"}],"homepage":"https://github.com/amazing-socrates/web-telemetry-kit#readme","bugs":{"url":"https://github.com/amazing-socrates/web-telemetry-kit/issues"},"dist":{"shasum":"d95153d9cfbcf755718e19bc89b4170341327193","tarball":"https://registry.npmjs.org/@amazing-socrates/telemetry-kit/-/telemetry-kit-0.2.0.tgz","fileCount":6,"integrity":"sha512-3aMFsj/HSgCKY9IZeohLPThzwmq8K/qq5MzVZY4FZlkjlPkuVHQ35xYBgB1piXS5KTxInTx4Jsxb7Qn6hQAxJg==","signatures":[{"sig":"MEYCIQDR+tu7I0TWYikBlj7nHrN0AmZnGH6k9qB9GO294ucbbAIhAO2tTHHWSitsP+o7uao8joAjW+zrLbAeESbImJn8XFBR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":106141},"main":"./dist/index.cjs","type":"module","_from":"file:amazing-socrates-telemetry-kit-0.2.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"build":"tsup","typecheck":"tsc --noEmit","version:major":"npm version major --no-git-tag-version","version:minor":"npm version minor --no-git-tag-version","version:patch":"npm version patch --no-git-tag-version","== patch：修复问题，例如 0.1.0 -> 0.1.1 ==":"","== minor：新增兼容功能，例如 0.1.1 -> 0.2.0 ==":"","== major：包含不兼容变更，例如 0.2.0 -> 1.0.0 ==":"","== 以下版本命令由开发人员在发布前手动选择执行一个 ==":""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4d98ed38-78dd-454d-b9ef-6bb2c0356c3c"}},"_resolved":"/home/runner/work/web-telemetry-kit/web-telemetry-kit/amazing-socrates-telemetry-kit-0.2.0.tgz","_integrity":"sha512-3aMFsj/HSgCKY9IZeohLPThzwmq8K/qq5MzVZY4FZlkjlPkuVHQ35xYBgB1piXS5KTxInTx4Jsxb7Qn6hQAxJg==","repository":{"url":"git+https://github.com/amazing-socrates/web-telemetry-kit.git","type":"git"},"_npmVersion":"11.17.0","description":"A vendor-neutral web telemetry and diagnostics toolkit.","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@sentry/react":"~10.69.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","axios":"^1.13.6","react":"^19.0.0","react-dom":"^19.0.0","typescript":"^5.7.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0"},"peerDependencies":{"axios":"^1.0.0","react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"peerDependenciesMeta":{"axios":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/telemetry-kit_0.2.0_1786955886718_0.8101626569005491","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@amazing-socrates/telemetry-kit","version":"0.3.0","description":"A vendor-neutral web telemetry and diagnostics toolkit.","type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"sideEffects":false,"scripts":{"== 以下版本命令由开发人员在发布前手动选择执行一个 ==":"","== patch：修复问题，例如 0.1.0 -> 0.1.1 ==":"","version:patch":"npm version patch --no-git-tag-version","== minor：新增兼容功能，例如 0.1.1 -> 0.2.0 ==":"","version:minor":"npm version minor --no-git-tag-version","== major：包含不兼容变更，例如 0.2.0 -> 1.0.0 ==":"","version:major":"npm version major --no-git-tag-version","build":"tsup","build:watch":"tsup --watch","playground":"vite --config playground/vite.config.ts","playground:dev":"pnpm build && concurrently -k \"pnpm build:watch\" \"pnpm playground\"","typecheck":"tsc --noEmit"},"dependencies":{"@sentry/react":"~10.69.0"},"peerDependencies":{"axios":"^1.0.0","react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0"},"peerDependenciesMeta":{"axios":{"optional":true}},"devDependencies":{"@tailwindcss/vite":"^4.3.3","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","@vitejs/plugin-react":"^6.1.0","axios":"^1.13.6","concurrently":"^10.0.5","react":"^19.0.0","react-dom":"^19.0.0","tailwindcss":"^4.3.3","tsup":"^8.0.0","typescript":"^5.7.0","vite":"^8.2.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"repository":{"type":"git","url":"git+https://github.com/amazing-socrates/web-telemetry-kit.git"},"license":"UNLICENSED","_id":"@amazing-socrates/telemetry-kit@0.3.0","bugs":{"url":"https://github.com/amazing-socrates/web-telemetry-kit/issues"},"homepage":"https://github.com/amazing-socrates/web-telemetry-kit#readme","_integrity":"sha512-+Fkk4gxjQMjcwSFv+nzrCiE7rO0eJHumSckUxgB130BDJ7Sh1QJGj1baVQnan8Ov4nkHbJH+TcncnDvvCQTxMA==","_resolved":"/home/runner/work/web-telemetry-kit/web-telemetry-kit/amazing-socrates-telemetry-kit-0.3.0.tgz","_from":"file:amazing-socrates-telemetry-kit-0.3.0.tgz","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-+Fkk4gxjQMjcwSFv+nzrCiE7rO0eJHumSckUxgB130BDJ7Sh1QJGj1baVQnan8Ov4nkHbJH+TcncnDvvCQTxMA==","shasum":"65421a3b6c08b16c2888fec24091e8529aa50633","tarball":"https://registry.npmjs.org/@amazing-socrates/telemetry-kit/-/telemetry-kit-0.3.0.tgz","fileCount":7,"unpackedSize":127929,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDNt6/ZQbRyvQxtqwrZvFP9M4/kUfhW7/3Eb+w+9nUMQAIgBOsY++0AHW1aGkVQQ+H6t6rj7RZq48tNWDmUNarsn+Q="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4d98ed38-78dd-454d-b9ef-6bb2c0356c3c"}},"directories":{},"maintainers":[{"name":"zlccns.work","email":"zlccns.work@gmail.com"},{"name":"ccjmlp","email":"chenchangjun520@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/telemetry-kit_0.3.0_1787659914887_0.011114321880912659"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-07T01:53:47.744Z","modified":"2026-08-25T12:11:55.272Z","0.1.0":"2026-08-07T01:53:48.052Z","0.1.2":"2026-08-07T08:48:31.321Z","0.1.3":"2026-08-07T09:05:37.507Z","0.1.4":"2026-08-07T09:19:32.145Z","0.1.6":"2026-08-11T08:25:32.395Z","0.1.7":"2026-08-14T03:44:47.450Z","0.1.8":"2026-08-14T11:14:08.889Z","0.1.9":"2026-08-15T09:55:52.085Z","0.2.0":"2026-08-17T08:38:06.855Z","0.3.0":"2026-08-25T12:11:55.052Z"},"bugs":{"url":"https://github.com/amazing-socrates/web-telemetry-kit/issues"},"license":"UNLICENSED","homepage":"https://github.com/amazing-socrates/web-telemetry-kit#readme","repository":{"type":"git","url":"git+https://github.com/amazing-socrates/web-telemetry-kit.git"},"description":"A vendor-neutral web telemetry and diagnostics toolkit.","maintainers":[{"name":"zlccns.work","email":"zlccns.work@gmail.com"},{"name":"ccjmlp","email":"chenchangjun520@gmail.com"}],"readme":"# Web Telemetry Kit\n\n公司级 Web 遥测 SDK（[`@amazing-socrates/telemetry-kit`](https://www.npmjs.com/package/@amazing-socrates/telemetry-kit)）。业务只依赖本包，**不要** `import '@sentry/*'`。\n\n当前实现基于 Sentry。接入三步：`init` 一次 → axios 交给 `instrumentApi` → 登录 `setUser`。之后 API 失败、慢接口会自动上报；页面 catch / Error Boundary 再调 `reportError`。\n\n**读这份文档：** 先「快速开始」，再按你手头的事往下翻（手动上报 / 自动采集 / 降噪 / 脱敏）。`init` 全量字段在文后「配置参考」。版本记录见 [`CHANGELOG.md`](./CHANGELOG.md)；已接 0.2 要改名的，见 [`docs/从-0.2-升级到-0.3.md`](./docs/从-0.2-升级到-0.3.md)。\n\n- API 路径会归一化后按接口归集 Issue（不同用户、不同雪花 ID 尽量并到同一条）\n- HTTP 失败 和「成功但慢」是两条通道\n- 网络信息只作旁证：能采到才有字段，不参与分组，不能用来定责 CDN\n\n## 安装\n\n```bash\npnpm add @amazing-socrates/telemetry-kit\n# npm i @amazing-socrates/telemetry-kit\n# yarn add @amazing-socrates/telemetry-kit\n```\n\n项目里需要已有 **React**。要用 API 自动采集时，还需要 **axios**（传 `axios.create()` 出来的那个实例，不要传外层封装函数）。\n\n## 快速开始\n\n```ts\nimport {\n  init,\n  instrumentApi,\n  reportError,\n  reportBusiness,\n  setUser,\n  clearUser,\n  getFeedbackId,\n} from '@amazing-socrates/telemetry-kit';\n\ninit({\n  dsn: import.meta.env.VITE_SENTRY_DSN, // 空则静默禁用\n  environment: import.meta.env.MODE,\n  release: import.meta.env.VITE_APP_VERSION,\n  platform: 'web', // 示例：品牌 / 端\n  defaultTags: { product: 'app-a' }, // 示例：内部产品线；不要和 platform 填成同一个词\n\n  // 接 API 采集时建议配置，否则几乎不会报 business 失败\n  getBusinessCode: (data) =>\n    data && typeof data === 'object' && 'code' in data\n      ? (data as { code: number }).code\n      : undefined,\n  isBusinessSuccess: (code) => code === 100000 || code === 200,\n  isAuthFailure: ({ httpStatus, businessCode }) =>\n    httpStatus === 401 ||\n    httpStatus === 403 ||\n    businessCode === 100401 ||\n    businessCode === 100001,\n});\n\ninstrumentApi(appAxios); // 必须是 axios 实例\n\nsetUser(userId);\nsetUser({ id: userId, username: nickname, email });\nclearUser();\n\nreportError(err, { category: 'component' });\nreportBusiness({ code: 'BET_FAILED', category: 'api', context: { betId } });\n\nconst { id, kind } = getFeedbackId(); // kind: 'guest' | 'user'\n```\n\n| 必做 | 不做会怎样 |\n|------|------------|\n| 配 DSN，尽早 `init` 一次 | 无 DSN = 方法可调但不上报 |\n| `instrumentApi(axios实例)` | API 失败 / 慢接口不会自动上报 |\n| 登录 `setUser`，退出 `clearUser` | Sentry User 一直停在游客 |\n| Error Boundary 里 `reportError(err, { category: 'component' })` | 渲染崩溃没有本包 `category` |\n\n`init` 类型上多为可选；实践上请传 **dsn / environment / release / platform**。`setUser` 只接受 `id` / `username` / `email`，其余键丢弃。\n\n---\n\n## 手动上报\n\n三条**平行通道**，按手里有什么数据选。\n\n| 你手里有什么 | 用哪个 | 默认 level | 网络旁证 | 会不会进「Error 才推 Lark」 |\n|--------------|--------|------------|----------|------------------------------|\n| Error / AxiosError / catch 到的异常 | **`reportError`** | `error` | 有 | 会（默认） |\n| 只有稳定业务码、没有 Error 对象 | **`reportBusiness`** | `error` | 有 | 会（默认） |\n| 临时一句话、探针 | **`reportInfo`** | `info` | 无 | 通常不会 |\n\n主事故、Web3 失败、业务 catch 用 `reportError`。`reportBusiness` 适合「下注失败码」这类没有异常对象的结果。`reportInfo` 不要当主告警通道。\n\n全局 `window.error` / `unhandledrejection` 由 Sentry 默认捕获，**没有**本包 `category`，也**没有**本包网络旁证。\n\n业务 `tags` / `extra` / `context` 不要使用 `net.*` 键名，SDK 会在其后写入并覆盖同名键。\n\n### `reportError(error, options)`\n\n有异常对象时用。axios 自动采集的 API 失败也走这里。\n\n| 参数 | 必填 | 默认 | 说明 |\n|------|------|------|------|\n| `error` | ✅ | — | `Error` 或任意 thrown 值（非 Error 会包一层，原值进 `extra.original`） |\n| `options.category` | ✅ | — | `js` \\| `promise` \\| `api` \\| `component` |\n| `options.level` | | `error` | Sentry 级别 |\n| `options.tags` | | — | 低基数、可筛选。不要放订单号 |\n| `options.extra` | | — | 单次详情（可以放订单号） |\n| `options.fingerprint` | | — | 非空数组才覆盖 Sentry 默认 Issue 分组 |\n\n**category 怎么选：** 组件树崩了用 `component`；自己 `try/catch` 的 JS 用 `js`；异步里漏掉的用 `promise`；手动补一条接口失败用 `api`（一般不必，`instrumentApi` 已经会报）。\n\nError Boundary：\n\n```tsx\ncomponentDidCatch(error: Error) {\n  reportError(error, { category: 'component' });\n}\n```\n\n页面逻辑 / 支付 catch（`tags` 用来筛，`extra` 用来看这一单）：\n\n```ts\ntry {\n  await pay(orderId);\n} catch (err) {\n  reportError(err, {\n    category: 'js',\n    tags: { page: 'checkout', action: 'pay' },\n    extra: { orderId },\n  });\n}\n```\n\n钱包 / RPC（`instrumentApi` 管不到）：\n\n```ts\ntry {\n  await sendTx();\n} catch (err) {\n  reportError(err, {\n    category: 'js',\n    tags: { chain: 'solana' },\n    fingerprint: ['web3', 'send_tx', 'solana'],\n  });\n}\n```\n\n`catch` 到的不是 Error 也可以传，例如 `'timeout'` 或 `{ code: 1 }`，会被包成 Error，原值在 extra `original`。\n\n指纹要**粗**：`['checkout', 'pay']` 会把所有结账支付失败归到同一 Issue。不要把 `orderId` 放进 fingerprint，否则每单一条 Issue。\n\n### `reportBusiness(options)`\n\n写入 tag `business.code` 与 extra `businessCode`。**没有 fingerprint 字段**（按 `code` + Sentry 默认分组）。\n\n| 参数 | 必填 | 默认 | 说明 |\n|------|------|------|------|\n| `code` | ✅ | — | 稳定业务码 |\n| `message` | | 使用 `code` | 展示文案 |\n| `category` | | — | 可选 tag |\n| `level` | | `error` | |\n| `tags` | | — | 低基数 |\n| `context` | | — | 写入 extra（不是 tags） |\n\n```ts\n// 下注失败：没有 Error 对象，只有业务码\nreportBusiness({\n  code: 'BET_FAILED',\n  category: 'api',\n  message: '下注失败',\n  context: { betId, roundId },\n});\n\n// 链上确认超时（同样没有异常对象）\nreportBusiness({\n  code: 'TX_CONFIRM_TIMEOUT',\n  level: 'warning',\n  tags: { chain: 'solana' },\n  context: { signature },\n});\n```\n\n`code` 要稳定、可枚举（`BET_FAILED`），不要把每次不同的 `betId` 当成 `code`。\n\n### `reportInfo(message, options?)`\n\n轻量纯文本。默认 **`info`**。\n\n| 参数 | 必填 | 默认 | 说明 |\n|------|------|------|------|\n| `message` | ✅ | — | 文本 |\n| `options.category` / `level` / `fingerprint` / `tags` / `extra` | | level 默认 `info` | 主事故仍建议 `reportError` |\n\n```ts\n// 适合：发版后确认 SDK 通了、临时探针\nreportInfo('telemetry-kit-verify-info', { tags: { verify: 'probe' } });\n\n// 不适合：支付失败、组件崩溃 —— 请用 reportError\n```\n\n---\n\n## API 自动采集\n\n```ts\n// ✅ 传 axios.create() 的实例\nconst appAxios = axios.create({ baseURL: '/api' });\ninstrumentApi(appAxios);\n\n// ✅ 只让这个实例的慢接口阈值变成 2s（其它实例仍用 init 的默认）\ninstrumentApi(uploadAxios, { slowThresholdMs: 2000 });\n\n// ❌ 不要传封装函数：instrumentApi((config) => appAxios(config))\n```\n\n只支持 axios，重复调用幂等。失败会七分类；**成功**但超过阈值会另报一条慢接口。\n\n对照：请求取消、HTTP 200 但 `code !== 100000`、接口 500，分别会落在 `canceled`（不上报）、`business`、`http`。\n\n### 失败怎么分类\n\n顺序写死：`canceled → timeout → network → parse → auth → http → business`（`auth` 一定在 `http` 前面，所以 401 不会当成普通 HTTP 失败）。\n\n| `api.failure` | 什么情况 | 默认 |\n|---------------|----------|------|\n| `canceled` | 取消 / Abort | **不上报** |\n| `timeout` | 超时 | 上报 error |\n| `network` | 没有 HTTP 响应（断网、DNS 等） | 上报 **warning** |\n| `parse` | 解析失败 | 上报 error |\n| `auth` | 鉴权失败（默认 401/403，或你配的业务鉴权码） | **不上报** |\n| `http` | 非 2xx，再过下面的 4xx 白名单 | 上报 error |\n| `business` | HTTP 2xx，但业务码失败（要配 `getBusinessCode`） | 上报 error |\n\n举例（假设已配成功码 `100000`）：\n\n| 实际结果 | 分类 | 会不会报 |\n|----------|------|----------|\n| 用户切页，AbortController 取消 | `canceled` | 否 |\n| 等了 60s 没回来 | `timeout` | 是，error |\n| 飞机模式、DNS 失败 | `network` | 是，warning |\n| HTTP 401 | `auth` | 否 |\n| HTTP 404 / 429 / 500 | `http` | 是 |\n| HTTP 400 | `http` | 默认否 |\n| HTTP 200，body `{ code: 140003 }` | `business` | 是 |\n\n```ts\n// 把断网从 warning 改成 error；业务码失败改成 warning\ninit({\n  apiFailurePolicy: { network: 'error', business: 'warning' },\n});\n```\n\n### HTTP 状态：哪些会上报\n\n只对已经判成 `http`、且状态码在 400–499 的查白名单。5xx 一律上报。\n\n| 状态码 | 默认 |\n|--------|------|\n| 404、429 | 上报 |\n| 其它 4xx（400、422 等） | **不上报** |\n| 401 / 403 | 一般已是 `auth`，不上报 |\n| 5xx | 上报；不同 status 分成不同 Issue |\n\n想让 400 也报：`init({ extraHttpReportStatuses: [400] })`。给这里写 `401` / `500` **无效**（401 走 auth；500 本来就会报）。\n\n依赖 axios 默认 `validateStatus`（只有 2xx 走成功回调）。若宿主放宽了 `validateStatus`，4xx/5xx 可能不会被判成 `http`。\n\n### 慢接口\n\n只在**成功请求**上采集。超过阈值 → warning + tag `perf_type=slow_api`，**没有**错误 `category`。也会带网络旁证。\n\n```ts\ninit({\n  slowApiIgnoreRoutes: [\n    '/api/web3/rpc',              // 精确匹配归一化后的 path\n    '/api/user/:id/detail',       // 真实请求 /api/user/123456/detail 归一化后才能对上\n  ],\n});\n```\n\n不要写完整 URL（`https://api.xx.com/api/web3/rpc` 对不上）。\n\n### 请求追踪 ID（`requestId`）\n\n有 HTTP **响应**时，从响应头按顺序取第一个有值的：`x-request-id`、`x-trace-id`、`request-id`、`trace-id`、`x-amzn-trace-id`。有才写入 extra。飞书卡片「请求」读的就是它。\n\n| 会有 | 不会有 |\n|------|--------|\n| 有响应的失败（404 / 500 / 业务码失败等） | 断网、多数超时（没有响应） |\n| | 手动 `reportError` |\n| | **慢接口**（当前这条通道没带该字段） |\n\n跨域时还要把该头加入 `Access-Control-Expose-Headers`，否则前端读不到，Extra 里也是空的。\n\n### Issue 怎么归集\n\n| 通道 | fingerprint |\n|------|-------------|\n| API 失败 | `['api', failureType, method, route, status]` |\n| 慢接口 | `['slow_api', method, route]` |\n\n`route` 会去掉 query 和尾斜杠；≥6 位数字 / UUID → `:id`；长钱包地址 → `:address`。\n\n| 真实 URL | 归集用的 route |\n|----------|----------------|\n| `/api/user/441818335954157568/detail?x=1` | `/api/user/:id/detail` |\n| `/api/play/abc-uuid-here/watch/` | `/api/play/:id/watch` |\n\n一般不必自己调归一化函数。\n\n---\n\n## 降噪（哪些事件根本不会进 Sentry）\n\n和下面「脱敏」不是一回事：\n\n- **降噪：** 这条还要不要报。不报 = Sentry / Lark 都没有。\n- **脱敏：** 要报，但把密码、token 等涂成 `[Filtered]`。\n\n默认已经丢掉一批噪音，多数项目不用改。\n\n**包内默认不上报**\n\n| 类型 | 例子 |\n|------|------|\n| 用户取消请求 | Abort、CanceledError |\n| 鉴权失败 | 401 / 403，或你配的鉴权业务码 |\n| 大部分客户端 4xx | 400、422 等（**404 / 429 会报**） |\n| 浏览器扩展改页面 | 堆栈里有 `chrome-extension://` 等 |\n| 少量已知废文案 | 旧版 ResizeObserver、Firefox dead object、扩展乱改 DOM |\n\n**你还可以再挡**\n\n```ts\ninit({\n  // 某一类接口失败一律不要（例如轮询 404）\n  shouldReport: (ctx) => {\n    if (ctx.route === '/api/presence/heartbeat' && ctx.httpStatus === 404) {\n      return false;\n    }\n    return true;\n  },\n\n  // 文案匹配到就不报\n  ignoreErrors: [/ResizeObserver loop completed with undelivered notifications/i],\n\n  apiFailurePolicy: {\n    http: 'ignore', // 整类 HTTP 失败都不报（一般不建议）\n  },\n});\n```\n\n| `init` 字段 | 作用 |\n|-------------|------|\n| `shouldReport` | 七分类之后再否决一次，能看到 route / status / failureType |\n| `ignoreErrors` | 按错误文案 / 正则忽略（只增不减） |\n| `slowApiIgnoreRoutes` | 这些路径不报慢接口 |\n| `apiFailurePolicy` | 把某类改成 `ignore` |\n\n**你还可以放宽（会多报）**\n\n| `init` 字段 | 作用 |\n|-------------|------|\n| `extraHttpReportStatuses` | 额外放行的 4xx，例如 `[400]` |\n| `apiFailurePolicy` | 例如 `{ network: 'error' }` 让断网变成 error |\n\n飞书群里看不看得到，还要过 **Sentry 告警规则**（与 SDK 降噪是两层）。规则只勾 error 时，warning 的断网 / 慢接口进不了群。\n\n---\n\n## 脱敏（上报了，但敏感值要涂掉）\n\n目标：事件能进 Sentry，值班能看字段名，但看不到密码、token、邮箱原文。\n\n**怎么判断敏感：** 看**字段名**，不看值里的句子。字段名会先变成小写并去掉 `_` / `-`，再看是否**包含**下表里的词。例如 `access_token`、`refreshToken` 都会命中 `token`，值变成 `'[Filtered]'`，**键名还在**。\n\n**会扫：** 请求头、URL query、extra、面包屑、异常/消息文本里的 `key=value`、以及 `event.user`。不采集完整请求/响应 body。\n\n**不会扫：** `tags`、`contexts`、Performance Trace。这些里不要放密码、token、邮箱。\n\n### 默认会涂掉什么（不用配）\n\n| 类 | 字段名里带这些词就会涂 | 会涂掉 | 不会涂 |\n|----|------------------------|--------|--------|\n| 凭证 | `authorization` `cookie` `token` `password` `secret` `privatekey` `mnemonic` `seedphrase` `signature` `apikey` | `Authorization`、`accessToken`、`password` | `cacheKey`（没有单独的 `key` 关键字）。注意 `tokenCount` 会被误伤（含 `token`） |\n| 个人信息 | `email` `phone` `mobile` | `email`、`userEmail`、`phone` | `nickname`、`username`（除非你追加） |\n| Web3 | `walletaddress` | `walletAddress` | `walletChainId`、`walletType` |\n\n`user.id` **永远不涂**（要用来找人）。`setUser({ email })` 里的 email 恒为 `[Filtered]`；`username` 默认明文（可能是昵称，也可能被业务填成手机号）。\n\n### 业务字段怎么追加\n\n表里没有的名字，用 `extraScrubKeys`（只增不减）。**不要**追加 `id` / `user` / `name` / `key` 这种过短的词，会误伤 `requestId`、`username`、`cacheKey`。\n\n```ts\ninit({\n  extraScrubKeys: ['sessionid', 'invitecode', 'evmaddress'],\n});\n\nreportError(err, {\n  category: 'js',\n  extra: {\n    password: 'x',            // → [Filtered]（默认表里的 token/password）\n    walletAddress: 'CwaH…',   // → [Filtered]（walletaddress）\n    nickname: 'CCJ01',        // 明文\n    inviteCode: 'ADFKNC',     // 配了 invitecode 才 [Filtered]\n    sessionId: 'abc',         // 配了 sessionid 才 [Filtered]\n  },\n});\n```\n\n多数项目只用这一项。`scrubEvent` 是默认涂完之后再改整份 event 的高级钩子，一般不用。\n\n### 做不到的（避免误以为已经挡住）\n\n- 句子里的手机号不会认：`message: \"用户 13800138000 下单失败\"` 键名无辜，**不会**打码\n- 缩写挡不住：`walletAddr` / `evmAddress` / `toAddress`（故意不加裸 `address`，以免误伤）。请自己追加\n- 连带：`mobile` 会打掉 `isMobile`；`email` 会打掉 `emailVerified`；`signature` 会打掉 `signatureVersion`\n- 键名叫 `data` / `payload` / `body` 的对象会**往里递归**扫（里面若叫 `password` 仍会涂）\n\nSession Replay 是另一套：dev/test 默认会遮罩页面文字、屏蔽媒体；production 默认不加载 Replay。\n\n---\n\n## 用户与反馈 ID\n\n- 未登录：`guest_<uuid>`，默认存在 `localStorage` 键 `sentry_guest_id`\n- 登录 / 退出：`setUser` / `clearUser`（退出默认不删游客 ID）\n- `setUser` 只把 `id` / `username` / `email` 带进 Sentry，其它键（`nickname`、`walletAddress` 等）静默丢弃\n- `getFeedbackId()` → `{ id, kind: 'guest' | 'user' }`，适合做「复制反馈码」\n- SSR 不碰 `localStorage`、不 init SDK\n\n```ts\n// 登录\nsetUser(String(userProfile.userId));\nsetUser({\n  id: userProfile.userId,\n  username: userProfile.nickname,\n  email: userProfile.email, // Sentry 上会显示 [Filtered]\n});\n\n// ❌ 不要整包丢进去：walletAddress、inviteCode 会被丢掉，也不会进 extra\nsetUser(userProfile as never);\n\n// 退出\nclearUser();\n\n// 产品里「复制反馈码」\nconst { id, kind } = getFeedbackId();\nawait navigator.clipboard.writeText(id);\n// 未登录 id 类似 guest_afd18484…，kind 为 'guest'\n// 已登录 id 是 setUser 的那个 userId，kind 为 'user'\n```\n\n---\n\n## 网络旁证\n\n上报**那一刻**读 `navigator.onLine` 和（若有）`navigator.connection`。不是测速、不发额外请求。**成功且未超慢阈值的接口不挂。**\n\n| 会自动带 | 不会带 |\n|----------|--------|\n| axios API 失败、慢接口、`reportError`、`reportBusiness` | `reportInfo`、成功快请求、全局未捕获 JS |\n\n无 init 开关。采不到就省略，**不会**填假的 `4g` / `wifi`。\n\n### 字段\n\n| 位置 | Key | 何时出现 |\n|------|-----|----------|\n| Tag | `net.offline` | 浏览器认为离线时为 `true` |\n| Tag | `net.effective_type` | 有 connection：`slow-2g` / `2g` / `3g` / `4g`（**快慢档**，不是运营商制式；Wi‑Fi 很快时也常是 `4g`） |\n| Tag | `net.type` | 有且不是 `unknown`：如 `wifi` / `cellular` |\n| Tag | `net.save_data` | **仅**开了省流时为 `true` |\n| Extra | `net.rtt_ms` | 估算往返延迟（ms），有数值才写 |\n| Extra | `net.downlink_mbps` | 估算下行 Mbps |\n| Extra | `net.connection_supported` | 只要挂了网络就会写：有 Network Information API 为 `true`，否则 `false` |\n\n接口耗时看 extra 的 `durationMs`，不是 `net.rtt_ms`。`connection_supported: false` 只表示这个浏览器没有该 API（Safari / 全部 iOS / Firefox 常见），**不是**断网，也不是 SDK 坏了。\n\n### 各端会采到什么\n\n先记一句：**只有 Chromium 有 `connection`（档位 / RTT / 下行）。** iOS 上所有浏览器（含 iOS Chrome、微信）都是 WebKit，和 Safari 一样没有。\n\n#### 桌面\n\n| 系统 | 浏览器 | 离线 tag | connection | 常见 Extra / Tag |\n|------|--------|----------|------------|------------------|\n| macOS / Windows / Linux | Chrome、Edge、Opera | 有 | **有** | 有档位、RTT、下行；桌面 `type` 经常 unknown，**不写** `net.type` |\n| macOS | Safari | 有 | **无** | 基本只有 `connection_supported: false` |\n| 各系统 | Firefox | 有 | **无** | 同上 |\n\nWindows 没有 Safari。\n\n#### 手机 / 套壳\n\n| 系统 | 浏览器 | connection | 说明 |\n|------|--------|------------|------|\n| **iOS 全部** | Safari、Chrome、Edge、微信等 | **无** | 都是 WebKit |\n| **Android** | Chrome、Edge、三星、多数 WebView / 微信 | **有** | 字段最全，`net.type` 常能区分 wifi / cellular |\n| **Android** | Firefox | **无** | 同桌面 Firefox |\n\n对照：[Can I Use: Network Information API](https://caniuse.com/netinfo)。以运行时读到的为准。\n\n本地用电脑 Chrome 开 DevTools Throttling / Offline / Save-Data 验收字段；用 Safari 或 iOS 微信确认「没档位也能上报」。\n\n---\n\n## 配置参考（`init`）\n\n### 实践必填\n\n| 字段 | 说明 |\n|------|------|\n| `dsn` | 上报开关；空则禁用 |\n| `environment` | 归一为 development / test / production，决定默认采样与阈值 |\n| `release` | 应用版本（要和上传的 source map 一致） |\n| `platform` | 默认 tag，区分品牌端 |\n\n`environment` 别名：`dev` / `local` → development；`testenv` / `qa` → test；`prod` / `main` → production。未知按 **production**。\n\n```ts\ninit({\n  dsn: import.meta.env.VITE_SENTRY_DSN,\n  environment: import.meta.env.MODE, // Vite：development / production\n  release: import.meta.env.VITE_APP_VERSION, // 必须和上传 source map 的版本一致\n  platform: 'web', // 或 'storyfun-h5'，用来区分端\n  defaultTags: { product: 'app-a' }, // 产品线；不要和 platform 填同一个词\n});\n```\n\n### 接 API 时强烈建议\n\n业务码由宿主解释，包内不写死。响应是 `{ code: 100000, data: ... }` 时可以这样：\n\n```ts\ninit({\n  getBusinessCode: (data) =>\n    data && typeof data === 'object' && 'code' in data\n      ? (data as { code: number }).code\n      : undefined,\n  isBusinessSuccess: (code) => code === 100000 || code === 200,\n  isAuthFailure: ({ httpStatus, businessCode }) =>\n    httpStatus === 401 ||\n    httpStatus === 403 ||\n    businessCode === 100401 ||\n    businessCode === 100001,\n});\n```\n\n不配 `getBusinessCode` 时，HTTP 200 但业务失败**几乎不会**被判成 `business`。\n\n| 字段 | 说明 |\n|------|------|\n| `getBusinessCode` | 从响应 body 取业务码（不是 HTTP status） |\n| `isBusinessSuccess` | 该码是否业务成功 |\n| `isAuthFailure` | 是否鉴权失败（默认也会看 401/403） |\n\n### 常用选填\n\n| 字段 | 默认 | 说明 |\n|------|------|------|\n| `defaultTags` | — | 额外全局 tag，如 `{ brand: 'xx' }` |\n| `tracesSampleRate` | 随环境 | 生产默认 5%；想采 10%：`tracesSampleRate: 0.1` |\n| `enableReplay` | 随环境 | 生产默认关；要开：`enableReplay: true` |\n| `replaysSessionSampleRate` | `0` | 平时不录 |\n| `replaysOnErrorSampleRate` | `1` | 出错才录 |\n| `replayMaskAllText` / `replayBlockAllMedia` | `true` | Replay 打码 |\n| `enableOfflineTransport` | `true` | 上报失败进 IndexedDB；关掉：`false` |\n| `slowApiThresholdMs` | 随环境 | 生产默认 5s；改成 3s：`slowApiThresholdMs: 3000` |\n| `debug` | 随环境 | 排查时 `debug: true`，看 Resolved 配置 |\n\n### 高级选填\n\n| 字段 | 说明 |\n|------|------|\n| `extraHttpReportStatuses` | 追加允许上报的 http 4xx（默认已有 404 / 429） |\n| `slowApiIgnoreRoutes` | 慢接口忽略名单 |\n| `apiFailurePolicy` | 覆盖七分类：`ignore` / `warning` / `error` |\n| `shouldReport` | 分类之后再滤一层 |\n| `extraScrubKeys` | 追加脱敏字段名 |\n| `scrubEvent` | 默认脱敏后再改整份 event |\n| `ignoreErrors` | 追加忽略文案/正则 |\n| `printFeedbackIdToConsole` | 控台打印 feedbackId；生产默认关 |\n| `guestIdStorageKey` / `guestIdPrefix` | 游客 ID 存储键与前缀 |\n\n`router` 类型保留，**当前未使用**，不必传。\n\n### 环境默认\n\n均可被 `init` 对应字段覆盖。\n\n| 归一环境 | Trace 采样 | Replay | 会话采样 | 出错采样 | debug | 慢接口阈值 | feedbackId 控台 |\n|----------|------------|--------|---------|----------|-------|------------|-----------------|\n| development | **100%**（`1`） | 开 | 0 | 1 | 开 | 10s | 开 |\n| test | **20%**（`0.2`） | 开 | 0 | 1 | 开 | 8s | 开 |\n| production | **5%**（`0.05`） | **关** | — | — | 关 | 5s | 关 |\n\ndevelopment / test 默认开启 Replay **能力**：平时不录，出错才录。production 默认 **不加载 Replay**。可用 `enableReplay: true / false` 覆盖。\n\n---\n\n## 离线投递\n\n监控事件发不出去时写入 IndexedDB，联网或下次启动再补发（队列上限 30）。**不是** `net.offline`：那个只表示当时浏览器认为自己断网。\n\n关闭：`enableOfflineTransport: false`。\n\n---\n\n## 告警到 Lark\n\n本包**不包含**飞书推送。链路：Sentry 告警命中 → 宿主 Cloudflare Worker 把事件 JSON 转成飞书卡片 JSON（`msg_type: interactive`，头颜色 `red` / `orange`）→ POST 群机器人。\n\n- **推不推**看 Sentry 规则。规则需覆盖 **error 和 warning**，否则断网、慢接口进不了群。\n- Worker **不再降噪**；SDK 没采到的字段（如 `requestId`）卡片上整行没有。\n- 「网络」行要 Worker 读 `net.*`。只升 npm 包、不改 Worker，群里不会多这一行。\n- 卡片被拒时会再发一条纯文本保底。\n\n---\n\n## 本地 playground\n\n本仓 `playground/` **不进 npm 包**。页面用的是仓库 **`dist/`**。DSN 写在 `playground/.env.local`，不要提交。页上按 Error / API 失败 / 慢接口 / 对照分组，**没有** `reportBusiness` / `reportInfo` 按钮。\n\n```bash\ncp playground/.env.example playground/.env.local\n# 填 VITE_SENTRY_DSN（建议独立 Sentry 测试项目）\n\npnpm playground:dev\n```\n\n会先 `pnpm build`，再并行 watch dist + Vite（[http://localhost:5174](http://localhost:5174)，终端还有局域网地址）。改 `src/` 后等编译结束再刷新。DSN 只来自 `.env.local`。\n\n也可以：终端 1 `pnpm build:watch`，终端 2 `pnpm playground`（需已有一次 build）。\n\n### 建议怎么验\n\n1. 页头「已配置 DSN」。Sentry 筛选 `environment:development`、`release` 为 `.env.local` 的版本。\n2. 先 `setUser`，再点场景。手动 Error 每次独立 Issue。页顶会立刻「已点中」。\n3. 对照（成功快请求、400、401、取消）本页有反馈，Sentry 不应多出失败 / 慢接口。\n4. Chrome 用 Network 节流 / Offline / Save-Data 看 `net.*`。Safari / Firefox 常为 `connection_supported: false`。\n5. mock 的 404/429/500 带 `playground-req-*` 当作「请求」；生产没有对应响应头则没有这一行。\n6. 真机用终端 Network IP。iOS 任意浏览器与 Safari 相同，通常没有 connection。\n7. 看飞书：告警打到 Worker，且规则包含 warning。\n\n本页覆盖 SDK **默认策略主路径**，不替代主站真实 axios / 登录验收。\n\n---\n\n## 约束\n\n- 不要直接依赖 `@sentry/*`\n- 包不读 `import.meta.env`；DSN / 环境 / 版本由宿主传入\n- 不内置业务码\n- `init` / `instrumentApi` / 上报失败不得影响主流程\n","readmeFilename":"README.md"}