{"_id":"@coremarine/thelmabiotel-tblive","_rev":"14-100b87be8158d11ea1ea54ee94ac9feb","name":"@coremarine/thelmabiotel-tblive","dist-tags":{"latest":"3.0.0"},"versions":{"0.0.1":{"name":"@coremarine/thelmabiotel-tblive","version":"0.0.1","keywords":["hydrophone","acoustic sensor","acoustic detection","tb-live","thelma biotel"],"author":{"name":"CoreMarine"},"license":"MIT","_id":"@coremarine/thelmabiotel-tblive@0.0.1","maintainers":[{"name":"valentina-rubane","email":"vru@core-marine.com"},{"name":"crisconru","email":"crisconru@gmail.com"},{"name":"coremarinedev","email":"dev@core-marine.com"}],"homepage":"https://github.com/core-marine-dev/packages/thelmabiotel-tblive#readme","bugs":{"url":"https://github.com/core-marine-dev/devices/issues"},"dist":{"shasum":"b4a4f9636d2350b752f59577f719862caaa03ef6","tarball":"https://registry.npmjs.org/@coremarine/thelmabiotel-tblive/-/thelmabiotel-tblive-0.0.1.tgz","fileCount":3,"integrity":"sha512-+wwwfK+K/64lMShYTkdWbXCQLmUt759fHYrhuJto0BG9VGWrMum/dzqs6LURLtaRHIAy3iXZb59JTICM/9GlxA==","signatures":[{"sig":"MEUCIQDwIBGcqKSNuHyOGQGqCmve9Trypvk9lcHE+ip0BcsG4AIgAWYMFbpUoLPIy5t4zcszcta7kNyOBDCIw4vZktLYVug=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2711},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">= 18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"c5b3dee214ec448693f29824fe4f361018f85adf","scripts":{"lint":"ts-standard","test":"vitest","build":"tsc","format":"ts-standard --fix","test:coverage":"vitest --coverage"},"_npmUser":{"name":"coremarinedev","email":"dev@core-marine.com"},"repository":{"url":"git+https://github.com/core-marine-dev/devices.git","type":"git"},"_npmVersion":"10.5.0","description":"Library to work with TB-Lives devices (hydrophones and acoustic sensors of Thelma Biotel)","directories":{},"sideEffects":false,"ts-standard":{"ignore":["tests","vitest.config.ts","tsup.config.ts","examples/*"]},"_nodeVersion":"20.12.2","dependencies":{"@schemasjs/valibot-numbers":"^1.0.8"},"eslintConfig":{"parserOptions":{"project":"./tsconfig.json"}},"_hasShrinkwrap":false,"peerDependencies":{"valibot":">=0.30.0"},"_npmOperationalInternal":{"tmp":"tmp/thelmabiotel-tblive_0.0.1_1715769208066_0.6681815393590271","host":"s3://npm-registry-packages"}},"0.0.2":{"name":"@coremarine/thelmabiotel-tblive","version":"0.0.2","keywords":["hydrophone","acoustic sensor","acoustic detection","tb-live","thelma biotel"],"author":{"name":"CoreMarine"},"license":"MIT","_id":"@coremarine/thelmabiotel-tblive@0.0.2","maintainers":[{"name":"valentina-rubane","email":"vru@core-marine.com"},{"name":"crisconru","email":"crisconru@gmail.com"},{"name":"coremarinedev","email":"dev@core-marine.com"}],"homepage":"https://github.com/core-marine-dev/packages/thelmabiotel-tblive#readme","bugs":{"url":"https://github.com/core-marine-dev/devices/issues"},"dist":{"shasum":"6fd53fe63830f60040ced26818df71416ba468c8","tarball":"https://registry.npmjs.org/@coremarine/thelmabiotel-tblive/-/thelmabiotel-tblive-0.0.2.tgz","fileCount":3,"integrity":"sha512-saQCujGMnznh9j0virgGsdLPej5yPpGkercUL7eEIz7rBmnabXm7yorsJxlDxDM/S3eQRyGAMElfQQQ77HJJ/Q==","signatures":[{"sig":"MEUCIQCs0naqapNH77FshnG7ZVt7yx3aOI+ZVEJvnB2QkafpQQIgAYvcd7R4+6vuUU6+DHhda61au7HBh39BbfVSVq0GfWQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2716},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">= 18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"1bfce4ae51dc7971c105c716b41d82b7e77aca46","scripts":{"lint":"ts-standard","test":"vitest","build":"tsup","format":"ts-standard --fix","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"coremarinedev","email":"dev@core-marine.com"},"repository":{"url":"git+https://github.com/core-marine-dev/devices.git","type":"git"},"_npmVersion":"10.5.2","description":"Library to work with TB-Lives devices (hydrophones and acoustic sensors of Thelma Biotel)","directories":{},"sideEffects":false,"ts-standard":{"ignore":["tests","vitest.config.ts","tsup.config.ts","examples/*"]},"_nodeVersion":"20.13.1","dependencies":{"@schemasjs/valibot-numbers":"^1.0.8"},"eslintConfig":{"parserOptions":{"project":"./tsconfig.json"}},"_hasShrinkwrap":false,"peerDependencies":{"valibot":">=0.30.0"},"_npmOperationalInternal":{"tmp":"tmp/thelmabiotel-tblive_0.0.2_1716222358798_0.07451000311765243","host":"s3://npm-registry-packages"}},"0.0.3":{"name":"@coremarine/thelmabiotel-tblive","version":"0.0.3","keywords":["hydrophone","acoustic sensor","acoustic detection","tb-live","thelma biotel"],"author":{"name":"CoreMarine"},"license":"MIT","_id":"@coremarine/thelmabiotel-tblive@0.0.3","maintainers":[{"name":"valentina-rubane","email":"vru@core-marine.com"},{"name":"crisconru","email":"crisconru@gmail.com"},{"name":"coremarinedev","email":"dev@core-marine.com"}],"homepage":"https://github.com/core-marine-dev/packages/thelmabiotel-tblive#readme","bugs":{"url":"https://github.com/core-marine-dev/devices/issues"},"dist":{"shasum":"653ba4fd201738c62cf9bec6ce4178e5e3227201","tarball":"https://registry.npmjs.org/@coremarine/thelmabiotel-tblive/-/thelmabiotel-tblive-0.0.3.tgz","fileCount":3,"integrity":"sha512-5Q2tMxxxQLat2rP45N4pUlpgEptf4w8wCh1B7fP6T+OZ9cnZKBWJYnLrgAwUwGmbciTY2PIKstEynLHeq2JfRA==","signatures":[{"sig":"MEYCIQCvj244rE/FaOWYAawvhVJJEkku1I6I6vrVDTJwQNXRGwIhAO0d6bjKEUvzv0TiciTjot9qxb6nLmgcMai2flxW+7+s","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2728},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">= 18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"3a61f80a33c6efd4a1148a1413a269342f2887c2","scripts":{"lint":"ts-standard","test":"vitest","build":"tsup","format":"ts-standard --fix","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"coremarinedev","email":"dev@core-marine.com"},"repository":{"url":"git+https://github.com/core-marine-dev/devices.git","type":"git"},"_npmVersion":"10.5.2","description":"Library to work with TB-Lives devices (hydrophones and acoustic sensors of Thelma Biotel)","directories":{},"sideEffects":false,"ts-standard":{"ignore":["tests","vitest.config.ts","tsup.config.ts","examples/*"]},"_nodeVersion":"20.13.1","dependencies":{"@schemasjs/valibot-numbers":"^1.0.8"},"eslintConfig":{"parserOptions":{"project":"./tsconfig.json"}},"_hasShrinkwrap":false,"peerDependencies":{"valibot":">=0.30.0"},"_npmOperationalInternal":{"tmp":"tmp/thelmabiotel-tblive_0.0.3_1716267075730_0.30634018408259633","host":"s3://npm-registry-packages"}},"0.0.4":{"name":"@coremarine/thelmabiotel-tblive","version":"0.0.4","keywords":["hydrophone","acoustic sensor","acoustic detection","tb-live","thelma biotel"],"author":{"name":"CoreMarine"},"license":"MIT","_id":"@coremarine/thelmabiotel-tblive@0.0.4","maintainers":[{"name":"valentina-rubane","email":"vru@core-marine.com"},{"name":"crisconru","email":"crisconru@gmail.com"},{"name":"coremarinedev","email":"dev@core-marine.com"}],"homepage":"https://github.com/core-marine-dev/packages/thelmabiotel-tblive#readme","bugs":{"url":"https://github.com/core-marine-dev/devices/issues"},"dist":{"shasum":"14ec98aada6e1e847e4e255da717739b3818e3dd","tarball":"https://registry.npmjs.org/@coremarine/thelmabiotel-tblive/-/thelmabiotel-tblive-0.0.4.tgz","fileCount":7,"integrity":"sha512-kLBoFz9Aky1tQjjkM1UgozhRccGgg//CMKCAQQAQUKfW6zS7p7ZzN64hJ4WbbHfHe0iVgAznRCvBwVBTDR/2gQ==","signatures":[{"sig":"MEQCIBoH5AHagW/s3EIoriXUGp7JIbgD0ouMbIO/pi/Jyh/OAiBXXYcntyBdb6VOmqoUeJeKSS99QETPdkkVXEZ/Dqc6Hw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":158659},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">= 18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"25a03faabaff621256dd35275433ac6bdbbee3d8","scripts":{"lint":"ts-standard","test":"vitest","build":"tsup","format":"ts-standard --fix","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"coremarinedev","email":"dev@core-marine.com"},"repository":{"url":"git+https://github.com/core-marine-dev/devices.git","type":"git"},"_npmVersion":"10.5.2","description":"Library to work with TB-Lives devices (hydrophones and acoustic sensors of Thelma Biotel)","directories":{},"sideEffects":false,"ts-standard":{"ignore":["tests","vitest.config.ts","tsup.config.ts","examples/*"]},"_nodeVersion":"20.13.1","dependencies":{"@schemasjs/valibot-numbers":"^1.0.8"},"eslintConfig":{"parserOptions":{"project":"./tsconfig.json"}},"_hasShrinkwrap":false,"peerDependencies":{"valibot":">=0.30.0"},"_npmOperationalInternal":{"tmp":"tmp/thelmabiotel-tblive_0.0.4_1716268485988_0.4563577621283299","host":"s3://npm-registry-packages"}},"0.0.5":{"name":"@coremarine/thelmabiotel-tblive","version":"0.0.5","keywords":["hydrophone","acoustic sensor","acoustic detection","tb-live","thelma biotel"],"author":{"name":"CoreMarine"},"license":"MIT","_id":"@coremarine/thelmabiotel-tblive@0.0.5","maintainers":[{"name":"valentina-rubane","email":"vru@core-marine.com"},{"name":"crisconru","email":"crisconru@gmail.com"},{"name":"coremarinedev","email":"dev@core-marine.com"}],"homepage":"https://github.com/core-marine-dev/tree/main/packages/thelmabiotel-tblive","bugs":{"url":"https://github.com/core-marine-dev/devices/issues"},"dist":{"shasum":"7f8182050c667c321e37eb721ac8bbf60cb686de","tarball":"https://registry.npmjs.org/@coremarine/thelmabiotel-tblive/-/thelmabiotel-tblive-0.0.5.tgz","fileCount":7,"integrity":"sha512-cFKyAD3SeiZ6k43OrMs6g2UG5W8oGRAMEP4TQb0DDvztxFjrIOnsm7ryEUE/YGSDsguh+NYnuRYnv5LvVDm/WQ==","signatures":[{"sig":"MEYCIQCOY57TkYQshT9YeDxiwKbXT5fABhUHMDSk11OP8idPugIhAO6JRz4sOGTDmlkBde+aFMZeOoISxfuRAJkKryLwvF/E","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":158662},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">= 18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"b3208594121eeff3b37ea2c1e117f11b0a4b82cc","scripts":{"lint":"ts-standard","test":"vitest","build":"tsup","format":"ts-standard --fix","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"coremarinedev","email":"dev@core-marine.com"},"repository":{"url":"git+https://github.com/core-marine-dev/devices.git","type":"git"},"_npmVersion":"10.5.2","description":"Library to work with TB-Lives devices (hydrophones and acoustic sensors of Thelma Biotel)","directories":{},"sideEffects":false,"ts-standard":{"ignore":["tests","vitest.config.ts","tsup.config.ts","examples/*"]},"_nodeVersion":"20.13.1","dependencies":{"@schemasjs/valibot-numbers":"^1.0.8"},"eslintConfig":{"parserOptions":{"project":"./tsconfig.json"}},"_hasShrinkwrap":false,"peerDependencies":{"valibot":">=0.30.0"},"_npmOperationalInternal":{"tmp":"tmp/thelmabiotel-tblive_0.0.5_1716274165210_0.8720522281253804","host":"s3://npm-registry-packages"}},"0.0.6":{"name":"@coremarine/thelmabiotel-tblive","version":"0.0.6","keywords":["hydrophone","acoustic sensor","acoustic detection","tb-live","thelma biotel"],"author":{"name":"CoreMarine"},"license":"MIT","_id":"@coremarine/thelmabiotel-tblive@0.0.6","maintainers":[{"name":"valentina-rubane","email":"vru@core-marine.com"},{"name":"crisconru","email":"crisconru@gmail.com"},{"name":"coremarinedev","email":"dev@core-marine.com"}],"homepage":"https://github.com/core-marine-dev/tree/main/packages/thelmabiotel-tblive","bugs":{"url":"https://github.com/core-marine-dev/devices/issues"},"dist":{"shasum":"6e7a4715bc7822b56f5d0ececdb2ad67b02c107d","tarball":"https://registry.npmjs.org/@coremarine/thelmabiotel-tblive/-/thelmabiotel-tblive-0.0.6.tgz","fileCount":7,"integrity":"sha512-VdWGOMcqMkWaQ8hfdt90TPjpe+OefWvy/l1TmuALQjxlsC5ZXtjKwtZmEzhCnRvclq7eFAlOXjzaPXgQwKKKpA==","signatures":[{"sig":"MEUCIQDjlbG22njs1lU36gCAuoSvVdOPjwMRmeUumVGdTOMi2gIgYPOZPw1Y8dsXCGx9kDMGUUdxSf3R9JLj9pNaxMezCA4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":157896},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">= 18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"1357addf56073843afc943c9a757159036d09646","scripts":{"lint":"ts-standard","test":"vitest","build":"tsup","format":"ts-standard --fix","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"coremarinedev","email":"dev@core-marine.com"},"repository":{"url":"git+https://github.com/core-marine-dev/devices.git","type":"git"},"_npmVersion":"10.7.0","description":"Library to work with Thlema Biotel TB-Lives hydrophones","directories":{},"sideEffects":false,"ts-standard":{"ignore":["tests","vitest.config.ts","tsup.config.ts","examples/*"]},"_nodeVersion":"20.15.0","dependencies":{"@schemasjs/validator":"^1.0.0","@schemasjs/valibot-numbers":"^1.0.12"},"eslintConfig":{"parserOptions":{"project":"./tsconfig.json"}},"_hasShrinkwrap":false,"peerDependencies":{"valibot":">=0.33.3"},"_npmOperationalInternal":{"tmp":"tmp/thelmabiotel-tblive_0.0.6_1719995825568_0.006567807778708801","host":"s3://npm-registry-packages"}},"0.0.7":{"name":"@coremarine/thelmabiotel-tblive","version":"0.0.7","keywords":["hydrophone","acoustic sensor","acoustic detection","tb-live","thelma biotel"],"author":{"name":"CoreMarine"},"license":"MIT","_id":"@coremarine/thelmabiotel-tblive@0.0.7","maintainers":[{"name":"valentina-rubane","email":"vru@core-marine.com"},{"name":"coremarinedev","email":"dev@core-marine.com"},{"name":"crisconru","email":"crisconru@gmail.com"}],"homepage":"https://github.com/core-marine-dev/tree/main/packages/thelmabiotel-tblive","bugs":{"url":"https://github.com/core-marine-dev/devices/issues"},"dist":{"shasum":"e4aa3c82ea00c5c30d84f65d728a231064bc85aa","tarball":"https://registry.npmjs.org/@coremarine/thelmabiotel-tblive/-/thelmabiotel-tblive-0.0.7.tgz","fileCount":7,"integrity":"sha512-jhmZ3dQJIDJBTJD+EGcZ9QY3mcqkFpg71IeIv+C6Ur50zxjfzkcF6pJV68VGH7HuBynx9QQqDtMC1LFeXn7u6w==","signatures":[{"sig":"MEQCIDvRyJkU9mxbxSNvrVIvAJjzfKcOwmzxANOAGJIex4dhAiAzl4MwL/ziNXv962cVS+0kZOc2uSO10zsPR6wnt42ahQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":157772},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">= 18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"7fc1cbd2093ae22ef460f8339a7374e7edb2d187","scripts":{"lint":"ts-standard","test":"vitest","build":"tsup","format":"ts-standard --fix","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"coremarinedev","email":"dev@core-marine.com"},"repository":{"url":"git+https://github.com/core-marine-dev/devices.git","type":"git"},"_npmVersion":"10.8.2","description":"Library to work with Thlema Biotel TB-Lives hydrophones","directories":{},"sideEffects":false,"ts-standard":{"ignore":["tests","vitest.config.ts","tsup.config.ts","examples/*"]},"_nodeVersion":"20.19.0","dependencies":{"@schemasjs/validator":"^2.0.1","@schemasjs/valibot-numbers":"^1.0.17"},"eslintConfig":{"parserOptions":{"project":"./tsconfig.json"}},"_hasShrinkwrap":false,"peerDependencies":{"valibot":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/thelmabiotel-tblive_0.0.7_1743676636897_0.3182703427774507","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@coremarine/thelmabiotel-tblive","version":"1.0.0","keywords":["hydrophone","acoustic sensor","acoustic detection","tb-live","thelma biotel"],"author":{"name":"CoreMarine"},"license":"MIT","_id":"@coremarine/thelmabiotel-tblive@1.0.0","maintainers":[{"name":"valentina-rubane","email":"vru@core-marine.com"},{"name":"coremarinedev","email":"dev@core-marine.com"},{"name":"crisconru","email":"crisconru@gmail.com"}],"homepage":"https://github.com/core-marine-dev/tree/main/packages/thelmabiotel-tblive","bugs":{"url":"https://github.com/core-marine-dev/devices/issues"},"dist":{"shasum":"824983da622c9d28ddbb95be2760c12c28a6960e","tarball":"https://registry.npmjs.org/@coremarine/thelmabiotel-tblive/-/thelmabiotel-tblive-1.0.0.tgz","fileCount":7,"integrity":"sha512-UmnoVxhqoHxFtzIZjGjgahXq80wnQtrNO0KYNSvjTDqfdNjc6iBQ9CNeUEbhNwxUjnyapA8oV2A2TxiZ8zKJLg==","signatures":[{"sig":"MEUCIQCt3ie1F0L8qBm1MIkU95HQNlac5KELDQgfRVRl7PgIjgIgMmxO1Qv+rSJJtFAU0RsQmHzWJkV+A7AseEYjceVnVj8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":151358},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">= 18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"ceafe3e985976430ccd4ca30102d4d0d46e5165d","scripts":{"lint":"ts-standard","test":"vitest","build":"tsup","format":"ts-standard --fix","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"coremarinedev","email":"dev@core-marine.com"},"repository":{"url":"git+https://github.com/core-marine-dev/devices.git","type":"git"},"_npmVersion":"10.8.2","description":"Library to work with Thlema Biotel TB-Lives hydrophones","directories":{},"sideEffects":false,"ts-standard":{"ignore":["tests","vitest.config.ts","tsup.config.ts","examples/*"]},"_nodeVersion":"20.19.2","dependencies":{"@schemasjs/validator":"^2.0.1","@schemasjs/valibot-numbers":"^1.0.17"},"eslintConfig":{"parserOptions":{"project":"./tsconfig.json"}},"_hasShrinkwrap":false,"peerDependencies":{"valibot":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/thelmabiotel-tblive_1.0.0_1749551396382_0.895290957704928","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@coremarine/thelmabiotel-tblive","version":"1.0.2","keywords":["hydrophone","acoustic sensor","acoustic detection","tb-live","thelma biotel"],"author":{"name":"CoreMarine"},"license":"MIT","_id":"@coremarine/thelmabiotel-tblive@1.0.2","maintainers":[{"name":"valentina-rubane","email":"vru@core-marine.com"},{"name":"coremarinedev","email":"dev@core-marine.com"},{"name":"crisconru","email":"crisconru@gmail.com"}],"homepage":"https://github.com/core-marine-dev/tree/main/packages/thelmabiotel-tblive","bugs":{"url":"https://github.com/core-marine-dev/devices/issues"},"dist":{"shasum":"c0d048b6ab8a73cba9982c3f88298e0bc4e7bda7","tarball":"https://registry.npmjs.org/@coremarine/thelmabiotel-tblive/-/thelmabiotel-tblive-1.0.2.tgz","fileCount":7,"integrity":"sha512-vQh0G3k8v//VBWcgB3HCP8MbcBUly4TxsyxS3HFmtQm+rsukl8erXpf5ap05SwCHeEDg43CC8/Lq8hPEVsZuhw==","signatures":[{"sig":"MEUCIQCbs1DkAX1slNIIpGaOmmbIA74v7ous4NkkQCDmc9lJSQIgUNU7RdtF/XIgoBMxHDltyy23mEZ8+GC0Bo/X8DZ3zVI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":151424},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">= 18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"6c12890e069133eb13dc8345564417d41489060b","scripts":{"lint":"ts-standard","test":"vitest","build":"tsup","format":"ts-standard --fix","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"coremarinedev","email":"dev@core-marine.com"},"repository":{"url":"git+https://github.com/core-marine-dev/devices.git","type":"git"},"_npmVersion":"10.8.2","description":"Library to work with Thlema Biotel TB-Lives hydrophones","directories":{},"sideEffects":false,"ts-standard":{"ignore":["tests","vitest.config.ts","tsup.config.ts","examples/*"]},"_nodeVersion":"20.19.2","dependencies":{"@schemasjs/validator":"^2.0.1","@schemasjs/valibot-numbers":"^1.0.17"},"eslintConfig":{"parserOptions":{"project":"./tsconfig.json"}},"_hasShrinkwrap":false,"peerDependencies":{"valibot":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/thelmabiotel-tblive_1.0.2_1749817650717_0.10417616668847285","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@coremarine/thelmabiotel-tblive","version":"1.0.3","keywords":["hydrophone","acoustic sensor","acoustic detection","tb-live","thelma biotel"],"author":{"name":"CoreMarine"},"license":"MIT","_id":"@coremarine/thelmabiotel-tblive@1.0.3","maintainers":[{"name":"valentina-rubane","email":"vru@core-marine.com"},{"name":"coremarinedev","email":"dev@core-marine.com"},{"name":"crisconru","email":"crisconru@gmail.com"}],"homepage":"https://github.com/core-marine-dev/tree/main/packages/thelmabiotel-tblive","bugs":{"url":"https://github.com/core-marine-dev/devices/issues"},"dist":{"shasum":"9e212e1a430f6db85f9915c45a010d315a3615a4","tarball":"https://registry.npmjs.org/@coremarine/thelmabiotel-tblive/-/thelmabiotel-tblive-1.0.3.tgz","fileCount":7,"integrity":"sha512-6CIcv2DOqf/R+k6Q7XfydWInMz9nBvg3/YRYgOR+1/Qe6ODnqOGF08wC4PiBwE2MFJcU1ERVC778hmF0ysVhpA==","signatures":[{"sig":"MEUCIFbQ9edAoyy3116b/hx2y+NDmEE4CLJt90k9Tx1O8QlBAiEA41iCbievHGuUSqeA4rk0wHn9heuXXJAGwdfJt/ppZhQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":151424},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">= 18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"9df68d4033f23b88f65c1645c8ee11c214113a73","scripts":{"lint":"ts-standard","test":"vitest","build":"tsup","format":"ts-standard --fix","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"coremarinedev","actor":{"name":"coremarinedev","type":"user","email":"dev@core-marine.com"},"email":"dev@core-marine.com"},"repository":{"url":"git+https://github.com/core-marine-dev/devices.git","type":"git"},"_npmVersion":"10.8.2","description":"Library to work with Thlema Biotel TB-Lives hydrophones","directories":{},"sideEffects":false,"ts-standard":{"ignore":["tests","vitest.config.ts","tsup.config.ts","examples/*"]},"_nodeVersion":"20.19.2","dependencies":{"@schemasjs/validator":"^2.0.1","@schemasjs/valibot-numbers":"^1.0.17"},"eslintConfig":{"parserOptions":{"project":"./tsconfig.json"}},"_hasShrinkwrap":false,"peerDependencies":{"valibot":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/thelmabiotel-tblive_1.0.3_1751361645107_0.6339192653437669","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@coremarine/thelmabiotel-tblive","version":"2.0.0","keywords":["hydrophone","cma","acoustic sensor","acoustic detection","tb-live","thelma biotel"],"author":"CoreMarine","license":"MIT","_id":"@coremarine/thelmabiotel-tblive@2.0.0","maintainers":[{"name":"coremarinedev","email":"dev@core-marine.com"},{"name":"crisconru","email":"crisconru@gmail.com"},{"name":"egr666","email":"egr@core-marine.com"}],"homepage":"https://github.com/core-marine-dev/devices/tree/main/packages/thelmabiotel-tblive","bugs":{"url":"https://github.com/core-marine-dev/devices/issues"},"dist":{"shasum":"13e87ba7ea6201376111862fc52587621db6ee4d","tarball":"https://registry.npmjs.org/@coremarine/thelmabiotel-tblive/-/thelmabiotel-tblive-2.0.0.tgz","fileCount":7,"integrity":"sha512-WhQd5jt2aaNpvwXg7/TUOpi2UuX3mTlrbv7/P1UJnRTxzR7ojNBpOrzvw464Www/chgxS8FrOv3QM7fdm9eiEg==","signatures":[{"sig":"MEQCIF4e0J6sH7GrzssbDa7Yp4kVpiIrTPcPF4gvQ5dbWN/gAiBxe96TnQnTuaWUfPhhRmhCvPY2wZJTcC3uezXtNeQLsw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@coremarine%2fthelmabiotel-tblive@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":124204},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"scripts":{"lint":"eslint","test":"vitest","build":"pnpm run format && tsup","format":"eslint --fix","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:975c1d0f-a07d-4125-b4a5-ee2aafd22f4f"}},"repository":{"url":"git+https://github.com/core-marine-dev/devices.git","type":"git","directory":"packages/thelmabiotel-tblive"},"description":"Library to work with Thlema Biotel TB-Lives hydrophones","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"valibot":"^1.4.2","@schemasjs/validator":"^2.0.5","@schemasjs/valibot-numbers":"^1.1.1"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/thelmabiotel-tblive_2.0.0_1785411932864_0.6259810790382703","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@coremarine/thelmabiotel-tblive","version":"3.0.0","description":"Library to work with Thlema Biotel TB-Lives hydrophones","author":"CoreMarine","license":"MIT","homepage":"https://github.com/core-marine-dev/devices/tree/main/packages/thelmabiotel-tblive","repository":{"type":"git","url":"git+https://github.com/core-marine-dev/devices.git","directory":"packages/thelmabiotel-tblive"},"bugs":{"url":"https://github.com/core-marine-dev/devices/issues"},"keywords":["hydrophone","cma","acoustic sensor","acoustic detection","tb-live","thelma biotel"],"type":"module","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"sideEffects":false,"engines":{"node":">=22"},"dependencies":{"@schemasjs/valibot-numbers":"^1.1.1","@schemasjs/validator":"^2.0.5","valibot":"^1.4.2"},"devDependencies":{},"scripts":{"build":"pnpm run format && tsup","lint":"eslint","format":"eslint --fix","test":"vitest","test:coverage":"vitest run --coverage"},"_nodeVersion":"24.18.0","_id":"@coremarine/thelmabiotel-tblive@3.0.0","dist":{"integrity":"sha512-6LxQhFWd0/p12yMmAiVhwxP9iIMEGJQ9OXlvT2fU3MqzORjCEp76LpgyxEema54lbPFT4+LaNvX+IpnOFolw6A==","shasum":"c2ea8008df73d4c49bcb6df7780926a2ee46e26e","tarball":"https://registry.npmjs.org/@coremarine/thelmabiotel-tblive/-/thelmabiotel-tblive-3.0.0.tgz","fileCount":7,"unpackedSize":129486,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@coremarine%2fthelmabiotel-tblive@3.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFVPndSqubTlVX4wVX38hZ1sILEqg3aziEy+YUKP9B/TAiA6eHfupdpyIisk42QMd88c+ScYxoi+gtSNO7b/KPHDTw=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:975c1d0f-a07d-4125-b4a5-ee2aafd22f4f"}},"directories":{},"maintainers":[{"name":"coremarinedev","email":"dev@core-marine.com"},{"name":"crisconru","email":"crisconru@gmail.com"},{"name":"egr666","email":"egr@core-marine.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/thelmabiotel-tblive_3.0.0_1785601898787_0.9798179781065579"},"_hasShrinkwrap":false}},"time":{"created":"2024-05-15T10:33:27.966Z","modified":"2026-08-01T16:31:39.382Z","0.0.1":"2024-05-15T10:33:28.205Z","0.0.2":"2024-05-20T16:25:58.987Z","0.0.3":"2024-05-21T04:51:15.878Z","0.0.4":"2024-05-21T05:14:46.124Z","0.0.5":"2024-05-21T06:49:25.364Z","0.0.6":"2024-07-03T08:37:05.767Z","0.0.7":"2025-04-03T10:37:17.173Z","1.0.0":"2025-06-10T10:29:56.565Z","1.0.2":"2025-06-13T12:27:30.905Z","1.0.3":"2025-07-01T09:20:45.274Z","2.0.0":"2026-07-30T11:45:33.014Z","3.0.0":"2026-08-01T16:31:38.936Z"},"bugs":{"url":"https://github.com/core-marine-dev/devices/issues"},"author":"CoreMarine","license":"MIT","homepage":"https://github.com/core-marine-dev/devices/tree/main/packages/thelmabiotel-tblive","keywords":["hydrophone","cma","acoustic sensor","acoustic detection","tb-live","thelma biotel"],"repository":{"type":"git","url":"git+https://github.com/core-marine-dev/devices.git","directory":"packages/thelmabiotel-tblive"},"description":"Library to work with Thlema Biotel TB-Lives hydrophones","maintainers":[{"name":"coremarinedev","email":"dev@core-marine.com"},{"name":"crisconru","email":"crisconru@gmail.com"},{"name":"egr666","email":"egr@core-marine.com"}],"readme":"# @coremarine/thelmabiotel-tblive\n\n[![npm version](https://img.shields.io/npm/v/@coremarine/thelmabiotel-tblive.svg)](https://www.npmjs.com/package/@coremarine/thelmabiotel-tblive)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nParser for the **Thelma Biotel TB Live** acoustic receiver (hydrophone). It turns the receiver's\nserial output into **CMA**, the same JSON shape every CoreMarine device parser emits, so consumers\nhandle one format regardless of protocol.\n\nNode >= 22. Runs on node, deno, bun and the browser — no `node:` imports, input is a `string`.\n\n## Install\n\n```bash\nnpm install @coremarine/thelmabiotel-tblive\n```\n\n## Quick start\n\n```typescript\nimport { TBLiveParser } from '@coremarine/thelmabiotel-tblive'\n\nconst parser = new TBLiveParser()\n\n// Feed whatever arrives on the line, in whatever chunks it arrives.\nconst sentences = parser.parseData('$001129,1551087409,421,OPs,15,2,37,69\\r')\n```\n\n```json\n[\n  {\n    \"raw\": \"$001129,1551087409,421,OPs,15,2,37,69\\r\",\n    \"timestamp\": 1785402277806,\n    \"id\": \"emitter\",\n    \"protocol\": { \"name\": \"TBLive\", \"version\": \"1.0.2\" },\n    \"payload\": [\n      { \"raw\": \"001129\", \"name\": \"receiver_serial_number\", \"type\": \"string\", \"value\": \"001129\" },\n      { \"raw\": \"1551087409\", \"name\": \"seconds\", \"type\": \"uint32\", \"value\": 1551087409, \"units\": \"s\" },\n      { \"raw\": \"421\", \"name\": \"milliseconds\", \"type\": \"uint16\", \"value\": 421, \"units\": \"ms\" },\n      { \"raw\": \"OPs\", \"name\": \"transmit_protocol\", \"type\": \"string\", \"value\": \"OPs\" },\n      { \"raw\": \"15\", \"name\": \"emitter\", \"type\": \"string\", \"value\": \"15\" },\n      { \"raw\": \"2\", \"name\": \"data\", \"type\": \"uint16\", \"value\": 2 },\n      { \"raw\": \"37\", \"name\": \"snr\", \"type\": \"uint8\", \"value\": 37,\n        \"metadata\": { \"raw\": 37, \"signal\": \"strong\" } },\n      { \"raw\": \"69\", \"name\": \"frequency\", \"type\": \"uint8\", \"value\": 69, \"units\": \"kHz\" }\n    ],\n    \"metadata\": {\n      \"mode\": \"listening\",\n      \"payload\": {\n        \"receiver\": \"001129\",\n        \"emitter\": \"15\",\n        \"time\": { \"seconds\": 1551087409, \"milliseconds\": 421, \"total_milliseconds\": 1551087409421 },\n        \"snr\": { \"raw\": 37, \"signal\": \"strong\" }\n      },\n      \"timestamp\": { \"received\": 1785402277805, \"parsed\": 1785402277806 }\n    }\n  }\n]\n```\n\n## API\n\n| Member | Type | Notes |\n| --- | --- | --- |\n| `new TBLiveParser(options?)` | `{ memory?, bufferLimit?, firmware? }` | Nothing throws — an invalid option is discarded |\n| `addData(input: string)` | `void` | Appends to the buffer and parses immediately |\n| `parseData(input?: string)` | `CMA[]` | Adds `input` if given, then **drains** the queue |\n| `buffer` | `string` (readonly) | The still-incomplete tail |\n| `memory` | `boolean` | `false` discards the previous buffer on each `addData` |\n| `bufferLimit` | `number` | Default 1024 characters. Enforced — see below |\n| `firmware` | `'1.0.1' \\| '1.0.2' \\| 'unknown'` | Readable and writable; learned automatically |\n| `firmwares` | `readonly string[]` | The firmwares this parser understands |\n| `sentenceIds` | `SentenceId[]` | Every sentence it can fabricate or describe |\n| `getFakeSentence(id, protocol, options?)` | `Result<string, ParserError[]>` | Fabricate a wire sentence — see below |\n| `getSentenceDefinition(id, protocol?)` | `Result<SentenceDefinition[], ParserError[]>` | Ask what it expects — see below |\n\nBoth of the last two return a **`Result`**, never `null`: an unknown id, an unknown protocol and a\nmalformed option are three different mistakes, and the caller is told which.\n\n```typescript\nconst result = parser.getFakeSentence('emitter', '1.0.2', { frequency: 34 })\nif (result.success) {\n  console.log(result.value)\n} else {\n  console.error(result.error.map((e) => e.message))   // ParserError[], not string[]\n}\n```\n\n## Fake sentences\n\nFabricate a wire sentence for tests, demos and Node-RED example flows. `protocol` is a **mandatory\npositional argument**, because the firmware genuinely changes the output; `options` is optional and\nnarrowed by TypeScript to the fields that `id` actually has.\n\n```typescript\nparser.getFakeSentence('emitter', '1.0.2', { receiverID: '100345', emitterID: '33280', frequency: 34 })\n// -> '$100345,1589557202,615,S64K,33280,0,24,34\\r'\n```\n\n**It is deterministic** — a pure function of its arguments, with no randomness — so a fixture cannot\ndrift between runs. And the defaults are the datasheets' **own example sentences**, so a call with no\noptions reproduces a document verbatim:\n\n```typescript\nparser.getFakeSentence('emitter', '1.0.1')   // '$1000042,1589557202,615,S64K,1285,0,24,69,11\\r'\nparser.getFakeSentence('receiver', '1.0.1')  // '$1000042,1589557600,TBR Sensor,297,15,29,69,6\\r'\nparser.getFakeSentence('command', '1.0.1')   // 'LIVECM'\nparser.getFakeSentence('command', '1.0.2')   // 'TBRC'\n```\n\nAnything it produces parses back cleanly — that round trip is asserted for every id on every\nfirmware. Options by id:\n\n| id | options |\n| --- | --- |\n| `emitter` | `receiverID`, `seconds`, `milliseconds`, `transmitProtocol`, `emitterID`, `data`, `snr`, `frequency`, `sent`¹ |\n| `receiver` | `receiverID`, `seconds`, `log`, `temperature`, `noiseAverage`, `noisePeak`, `frequency`, `sent`¹ |\n| `ping`, `serial_number` | `receiverID` |\n| `frequency` | `frequency` |\n| `listening_mode` | `listeningMode` |\n| `log_interval` | `logInterval` |\n| `time` | `seconds` |\n| the rest | none — nothing to vary |\n\n¹ `sent` exists only in 1.0.1 sentences; asking for it on 1.0.2 is reported rather than ignored.\n\nValues may be numbers or numeric strings, and a string keeps its padding (`'001129'` stays\n`'001129'`). `data: null` asks for the empty field an ID-only transmit protocol produces. Options are\nchecked for **shape, not plausibility** — `frequency: 34` is accepted even though the device listens\n63-77 kHz.\n\n## Asking the parser what it expects\n\n`getSentenceDefinition` returns what this parser believes a sentence looks like. It is deliberately\n**CMA-shaped**: the same keys a parsed sentence has, minus the ones only a real parse can fill (no\n`raw`, no `timestamp`, no `errors`), with `payload` holding field *definitions* rather than decoded\nvalues. `mode` sits at the top level because a definition has no `metadata` to nest it in.\n\n```typescript\nparser.getSentenceDefinition('receiver', '1.0.2')\n```\n\n```json\n[\n  {\n    \"id\": \"receiver\",\n    \"protocol\": { \"name\": \"TBLive\", \"version\": \"1.0.2\" },\n    \"payload\": [\n      { \"name\": \"receiver_serial_number\", \"type\": \"string\", \"description\": \"…\" },\n      { \"name\": \"seconds\", \"type\": \"uint32\", \"units\": \"s\", \"description\": \"…\" },\n      { \"name\": \"log\", \"type\": \"string\", \"description\": \"…\" },\n      { \"name\": \"temperature\", \"type\": \"int16\", \"description\": \"Raw temperature; (raw - 50) / 10 gives degrees Celsius\" },\n      { \"name\": \"noise_average\", \"type\": \"uint8\", \"description\": \"Average background noise, 0-255\" },\n      { \"name\": \"noise_peak\", \"type\": \"uint8\", \"description\": \"Peak background noise, 0-255\" },\n      { \"name\": \"frequency\", \"type\": \"uint8\", \"units\": \"kHz\", \"description\": \"…\" }\n    ],\n    \"mode\": \"listening\",\n    \"description\": \"Sensor log from the receiver itself — water temperature and background noise — printed at the interval set by `LI=`. Recognised by `$` and terminated by `<CR>`. Identified by its 7 fields: firmware 1.0.1 sends 8.\"\n  }\n]\n```\n\n**`description` is prose, at both levels**, and it carries what a structured object would: what the\nsentence is, **how it is recognised in a frameless stream**, and whether the firmware changes it. That\nlast part is the difference the shape alone cannot show:\n\n```typescript\nparser.getSentenceDefinition('command', '1.0.1')[0].description\n// '…Recognised as the fixed literal `LIVECM`. Firmware 1.0.1 only; firmware 1.0.2 uses a different form…'\nparser.getSentenceDefinition('frequency', '1.0.1')[0].description\n// '…Recognised by `FC=` followed by exactly 2 digits. Identical on both documented firmwares.'\n```\n\nDescriptions also carry the operational warnings from the datasheets — that `reset` **deletes** all\nstored detections, that `upgrade` can **brick** the device, that `milliseconds` is not always\nzero-padded.\n\n**Omit `protocol` to get every protocol version** of that sentence — which is how you see what the\nfirmware actually changes:\n\n```typescript\nconst result = parser.getSentenceDefinition('emitter')\n// -> two definitions: 1.0.1 with a 9-field payload, 1.0.2 with 8\n```\n\nThe return is **always an array**, even for a single match, so callers need one code path. The\n`payload` array is a copy, so a caller cannot corrupt the parser's tables.\n\nThis exists for **diagnosis**. These parsers get deployed on remote installations with restricted\ninternet access and stay there for years; being able to ask the running binary what it expects settles\na question that would otherwise need the datasheets and a shell.\n\n## Sentences\n\n`id` names **what the sentence is about**; `metadata.mode` names **which of the device's APIs it\nbelongs to**.\n\n| `id` | `mode` | Wire form |\n| --- | --- | --- |\n| `emitter` | `listening` | `$…\\r` acoustic detection (9 fields on 1.0.1, 8 on 1.0.2) |\n| `receiver` | `listening` | `$…\\r` sensor log (8 fields on 1.0.1, 7 on 1.0.2) |\n| `ping` | `listening` | `SN=nnnnnn ><>\\r` |\n| `clock_round` | `listening` | `ack01\\r` |\n| `clock_set` | `listening` | `ack02\\r` |\n| `command` | `listening` | `LIVECM` (1.0.1) / `TBRC` (1.0.2) |\n| `listening` | `command` | `EX!` |\n| `serial_number` | `command` | `SN=nnnnnnn` |\n| `firmware` | `command` | `FV=1.0.2` |\n| `frequency` | `command` | `FC=69` |\n| `listening_mode` | `command` | `LM=01` |\n| `log_interval` | `command` | `LI=03` |\n| `time` | `command` | `UT=1589561768` |\n| `api` | `command` | the `HE?` help dump |\n| `restart` | `command` | `RR!` |\n| `reset` | `command` | `FS!` |\n| `upgrade` | `update` | `UF!` |\n\nTwo of those pairings look self-contradictory and are correct: `id` says what the sentence\n*enables*, `mode` says where it *came from*. `LIVECM` is a listening-mode command that enters command\nmode (`id: 'command'`, `mode: 'listening'`); `EX!` is a command-mode action that resumes listening\n(`id: 'listening'`, `mode: 'command'`).\n\nEvery sentence other than `emitter` and `receiver` carries a **single** payload element: the response.\n\n## Metadata\n\n- **`metadata.mode`** — the API the sentence belongs to.\n- **`metadata.timestamp`** — `{ received, parsed }`, always present, stamped by the parser.\n- **`payload[i].metadata`** — one field decoded further (`snr` bands, `temperature` in °C, the `LM`\n  protocol set, the `LI` label).\n- **`metadata.payload`** — values aggregated from several fields (`noise`), **plus a deliberate mirror**\n  of the facts that identify the device (`receiver`, `emitter`, `snr`, `temperature`, `time`).\n\nThe mirroring is redundant on purpose. The two firmwares differ in field count and order, and a\nreceiver in the field may be running either, so a consumer needs **one fixed read path** for the key\nfacts: swap a 1.0.1 unit for a 1.0.2 and nothing downstream changes.\n\n## Things this parser deliberately does not do\n\n**It does not decode the `data` field.** Those 16 bits carry whatever the *emitter's* firmware\nencodes — CoreMarine's tags put inclination, or tilt and depth, there — which is not part of the\nTB Live protocol. `data` is emitted as an opaque `uint16`, and interpreting it is the consumer's job.\n\n**It does not judge whether a value is plausible.** `FC=99` is emitted as `99` with no error even\nthough the device listens 63-77 kHz, because only the deployment knows what is valid for a given\nreceiver. Documented ranges appear in each field's `description`. What *is* reported: undecodable\ninput, broken framing, interference, and a value that does not fit its declared type.\n\n**It does not claim to know the time.** The device's own clock reads seconds since the Epoch *or*\nseconds since power up; the two datasheets disagree about which when the clock is unset, and nothing\non the wire says which firmware is answering. So the numbers are published as data\n(`metadata.payload.time`) and **never** as `metadata.timestamp.sentence`, and no ISO date is\nproduced. `total_milliseconds` is offered because composing it is easy to get wrong.\n\n## Feedback: nothing is dropped silently\n\nEvery character either decodes, comes out as a *garbage sentence*, or stays on the buffer as the\nstill-incomplete tail. The signal is the optional **`errors: string[]`**.\n\nA **garbage sentence** is a valid CMA whose mandatory values are all `'unknown'`, with `payload: []`\n— but it keeps `raw` (so the discarded bytes can be inspected), the timestamps, and `errors`.\n\n| Input | Result |\n| --- | --- |\n| a decodable sentence | CMA, no `errors` |\n| a field that fails its declared type | full CMA, that field `null`, `errors` at field and sentence level |\n| `data` empty on an ID-only protocol | CMA, `value: null`, **no error** — documented behaviour |\n| `$…\\r` with an unrecognised field count | `id: 'unknown'`, the CSV kept as generic fields, `Unknown field count: N` |\n| another sentence *inside* one | the inner sentence decoded, the wreckage as garbage + `Interrupted by <id>` |\n| input matching no known token | garbage + `Unrecognised input` (adjacent junk coalesced) |\n| an incomplete sentence | held on `buffer` — never an error, it is still streaming |\n| the pending tail exceeds `bufferLimit` | garbage + `Buffer limit exceeded`, buffer reset |\n| whitespace between sentences | ignored |\n\n### Interference\n\nThe receiver is half duplex and badly behaved: a response can be emitted *inside* a detection or a\nlog, and it arrives as corrupted bytes rather than a clean insertion. The wrecked sentence's true\nextent is therefore unknowable, so this parser **keeps the sentence in the middle and does not try to\nrecompose the one it wrecked**:\n\n```typescript\nparser.parseData('$1000042,1589557202,615,S64K,ack01\\r1285,0,24,69,11\\r')\n// -> garbage  '$1000042,1589557202,615,S64K,'  errors: ['Interrupted by clock_round']\n// -> sentence 'ack01\\r'                        id: 'clock_round'\n// -> garbage  '1285,0,24,69,11\\r'              errors: ['Unrecognised input']\n```\n\n## Firmware\n\nThe two documented firmwares differ in field count and order. The parser starts at `'unknown'` and\nlearns:\n\n- an explicit `FV=1.0.1` / `FV=1.0.2` response;\n- `LIVECM` versus `TBRC`, which is definitive — 1.0.1 enters command mode with the first, 1.0.2 with\n  the second;\n- a detection or log states its own firmware through its field count.\n\nA sentence that carries no evidence of its own reports the firmware learned so far. Pin it when the\ndeployment knows better:\n\n```typescript\nconst parser = new TBLiveParser({ firmware: '1.0.1' })\n```\n\n## Upgrading from 2.x\n\nOne breaking change, and it compiles and runs at the call site — which is why the major exists.\n\n**The `Result` error side went from `string[]` to `ParserError[]`**, so every reason a request was\nrefused now carries its own `kind` instead of being flattened into a bare message.\n\n```typescript\n// 2.x — errors were strings\nif (!result.success) console.error(result.error.join('; '))\n\n// 3.0.0 — the 2.x line above now yields \"[object Object]\"\nif (!result.success) console.error(result.error.map((e) => `${e.kind}: ${e.message}`).join('; '))\n```\n\nThis affects `getSentenceDefinition` and `getFakeSentence`. Nothing else changed: the CMA output shape,\nthe sentence table, the tokenizer and the firmware learning are all as they were in `2.0.0`.\n\n## Upgrading from 1.x\n\n`1.x` emitted a `ParsedSentence`; `2.0.0` emits **CMA**. Every change:\n\n- **`protocol` is new and required** — `{ name: 'TBLive', version: <firmware> }`. The top-level\n  **`firmware` key is gone**; it is now `protocol.version`.\n- **The top-level `mode` key is gone** — it is now `metadata.mode`.\n- **`metadata` is always present** and always contains `timestamp: { received, parsed }`.\n- **`metadata.timestamp` changed meaning.** It used to hold the device's own time as\n  `{ value, date }`. It is now the parser's own `{ received, parsed }`; the device's time moved to\n  `metadata.payload.time`, and no ISO date is produced.\n- **Field-name metadata keys are gone.** `metadata.angle` / `metadata.snr` / `metadata.temperature`\n  now live under `metadata.payload`.\n- **The inclination decode was removed.** `metadata.angle` and the `data` field's metadata no longer\n  exist — see \"Things this parser deliberately does not do\". **Consumers relying on it must implement\n  the bit split themselves.**\n- **Field renames:** `TB Live serial number` → `receiver_serial_number`, `protocol` →\n  `transmit_protocol`, `log intervals` → `log_interval`, and the `LM=` sentence id `protocols` →\n  `listening_mode`.\n- **Serial numbers are strings.** They used to be coerced with `Number()`, which destroyed the\n  device's inconsistent zero-padding (`'001129'` became `1129`). Consumers matching on the last\n  digits should use a string comparison.\n- **Values can be `null`.** An empty field is `null` — including `data`, which is empty for ID-only\n  transmit protocols. **`null` means \"no measurement\" and must never be read as zero.** `1.x`\n  reported `0` there.\n- **`NaN` no longer occurs.** A non-numeric value in a numeric field is `null` plus an error.\n- **Sentences that used to vanish now arrive.** Unrecognised input, malformed sentences and\n  interference-wrecked sentences are all emitted. Check `errors` and `id === 'unknown'`.\n- **`bufferLimit` is enforced.** It was previously stored and ignored.\n- **The class was renamed `TBLive` → `TBLiveParser`**, and `tbliveFirmwares()` is now the `firmwares`\n  getter. The old `schemas` exports are gone.\n- **New in 2.0.0:** `getFakeSentence(id, protocol, options?)` and\n  `getSentenceDefinition(id, protocol?)`, both returning a `Result`.\n- **Node >= 22** (was >= 18).\n\n## License\n\nMIT\n","readmeFilename":""}