{"_id":"echoof-fitness-sdk","_rev":"41-ec9dac233dabcb875353c08ea01c023e","name":"echoof-fitness-sdk","dist-tags":{"latest":"1.3.0"},"versions":{"1.0.0":{"name":"echoof-fitness-sdk","version":"1.0.0","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.0.0","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"2c7112d209cd39aa7d807682528b83a901c7700b","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.0.0.tgz","fileCount":2,"integrity":"sha512-O45xhBibkxbXVhGFbbSX7k+u1Bvt8dgIP2UK1VlessaSEaeDkLTVL7PtN1/2qRXhx6XwOGSe9DaDGSfigjlTGA==","signatures":[{"sig":"MEUCIQDzG+upbmJSHvybWnq9D/DINCsnorwa2Fx8F3wBIHIakwIgZZJE2sxF1gIa+22aME55M1dRPGmoPync5a+hpRNu9Ns=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4805},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"bf579a6bb5c54c25dc94a2c6d5ad65b73786fd59","scripts":{"dev":"vite demo","build":"vite build","preview":"vite preview"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 SDK - 基于 TensorFlow.js MoveNet + 骨架模板匹配","directories":{},"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.0.0_1776653975226_0.9663727464367826","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"echoof-fitness-sdk","version":"1.0.2","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.0.2","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"e3be24f658b3ca9af651443f334f1b5fd4923b60","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.0.2.tgz","fileCount":4,"integrity":"sha512-/8QfW3k/jL6EmHCWcy9Pkng2FdedQaI+ftIMPRvmf2o+XaJraUBGziy5Ifs6RhjVjzjiuBWIx7uF+9RJs72dNQ==","signatures":[{"sig":"MEQCIEgs4VhbjEQcbePhFIW1W/Lf7ZJAXw1cCsyKQSuRZfE4AiAu+G7UCksMAZVPmtUFtcaWGuUPA8xLk4pv9SlNtI70ag==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110048},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"ac467b3a5eaae5f5048547e493dc5f3d36d3dca5","scripts":{"dev":"vite demo","build":"vite build","preview":"vite preview","prepublishOnly":"npm run build"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 SDK - 基于 TensorFlow.js MoveNet + 骨架模板匹配","directories":{},"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.0.2_1776745046427_0.6952753543666728","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"echoof-fitness-sdk","version":"1.0.3","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.0.3","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"eb166da09ba8d3ebaf8aae3433726e6f3139a4e7","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.0.3.tgz","fileCount":4,"integrity":"sha512-BMnefmz2cEp3RXJ38iChDa+hL2Y4HTbUDr+AX5w01q1kTeFqZ7E7V7hYRyLTE701dUQnTPtLS7aHsgtQNFn6vw==","signatures":[{"sig":"MEUCIQCWqbLlaQcye0jXEwctblS6bUG/AuxHV2SWH/KVOBNyQwIgDcrTK8YquKNUL9z5GeWYskubkZ7l4AxpR46WojNp5yM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":148428},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"deba2564cbd6c4329549723d8182d18a3e8be177","scripts":{"dev":"vite demo","build":"vite build","preview":"vite preview","prepublishOnly":"npm run build"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 SDK - 基于 TensorFlow.js MoveNet + 骨架模板匹配","directories":{},"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.0.3_1776764201505_0.45056545780956236","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"echoof-fitness-sdk","version":"1.0.4","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.0.4","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"444b403585cb01066d6e25d2bf1c44510fb9ce10","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.0.4.tgz","fileCount":4,"integrity":"sha512-oyMUkoDpIcOv87ZK0H3NkzllvA7MPIQg+NwaXLt6vTvvC+1ehxwGUetntUfuEUIo/ZyryzV3tUVhhqsAWxX/tw==","signatures":[{"sig":"MEUCIQDTL6nXxBCjsFfZh17Stbw6T94llluHqm94bjqoVd9NoQIgIhuCZSQq9xrToBS+uWFG2PEoqSQUvEKdbA/urNjQeoI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":148939},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"deba2564cbd6c4329549723d8182d18a3e8be177","scripts":{"dev":"vite demo","build":"vite build","preview":"vite preview","prepublishOnly":"npm run build"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 SDK - 基于 TensorFlow.js MoveNet + 骨架模板匹配","directories":{},"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.0.4_1776766135972_0.8466706961826169","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"echoof-fitness-sdk","version":"1.0.6","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.0.6","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"e5420ad2fa4b2663d5cbb082ef1fe99f9edc1fce","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.0.6.tgz","fileCount":5,"integrity":"sha512-p3RovO5pPnAtiUuDstUfT2PpYD6OExFFsZHLpQ4g744RHW1mIov6BIlBG5KEsRwke1x7wVjVR8iLp3J84eWBXQ==","signatures":[{"sig":"MEQCIBzfHleHYY4b4mR2MiwIvTlPwbMg1yTEZBBoK4Y9SzgDAiA6a6eHQf+0uzBSgk9/AyzontuLxoUC7x9CL/ZI6TIXcg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":161297},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"de91d4689dd98a3befa8f735f1d93041c703d438","scripts":{"dev":"vite demo","build":"vite build","preview":"vite preview","prepublishOnly":"npm run build"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 SDK - 基于 TensorFlow.js MoveNet + 骨架模板匹配","directories":{},"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.0.6_1776828202697_0.8989407197052439","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"echoof-fitness-sdk","version":"1.0.7","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.0.7","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"262bfe9703766a918a4c638996481de43c04f797","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.0.7.tgz","fileCount":5,"integrity":"sha512-u3rRfRckBCGG0JtoTujt25gk7jg58Ao1gZV/586JeRC4oCGp8saTsOnGjPSZaAACJVPrZc5WSMj5CVbTYaNYFg==","signatures":[{"sig":"MEUCIAEBi3lL2D7bkECD34pr1EOotLx72aS0A5MY8p927pvzAiEAnbM6VkTNlxZ2t7bgH043IIXFD11f0x6I33lhs9wpYWY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":161388},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"de91d4689dd98a3befa8f735f1d93041c703d438","scripts":{"dev":"vite demo","build":"vite build","preview":"vite preview","prepublishOnly":"npm run build"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 SDK - 基于 TensorFlow.js MoveNet + 骨架模板匹配","directories":{},"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.0.7_1776828674729_0.3693460747241908","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"echoof-fitness-sdk","version":"1.0.8","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.0.8","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"91e53d48172bf890d080e7abfd554e4ce8b3f658","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.0.8.tgz","fileCount":7,"integrity":"sha512-iEb6xPjKTD1zBv/tG2pp2YJv1s7NjSRbYUGHYq9MOOtbQqAq5KJYAt9U54Grz6n6RIPPMto4Fx+5yrF4cL+MYQ==","signatures":[{"sig":"MEUCIQCfsWgwzRS6Q+xPM3SbyxvpfR/piyVAzk2KyzLIMUNa/wIgaH0W+lKO+aai0yBIy/ErKwUkPmS7EoidfQnYWw5ituY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":164225},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"de91d4689dd98a3befa8f735f1d93041c703d438","scripts":{"dev":"vite demo","build":"vite build","preview":"vite preview","prepublishOnly":"npm run build"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 SDK - 基于 TensorFlow.js MoveNet + 骨架模板匹配","directories":{},"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.0.8_1776829562228_0.5024905862054447","host":"s3://npm-registry-packages-npm-production"}},"1.0.9":{"name":"echoof-fitness-sdk","version":"1.0.9","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.0.9","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"3f00beda704ea7f5080ae2315a681923f7605f18","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.0.9.tgz","fileCount":6,"integrity":"sha512-RGi+9pnYb5KTVI25oMrPNag2PB9m1/kaNIzegUhmnxZd2CIYnpqqM+R/Suyr44meryX9rDey3Xmijjr1TQWHvQ==","signatures":[{"sig":"MEYCIQCUEpK5840mzGgTfQ0FFcTZIiaPXBAVfs0nO5nmxTG+dwIhAOvId7TuujBX99YNc4Is6MuFGgsc9HHN8ErZMO1OZe7K","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":164140},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"de91d4689dd98a3befa8f735f1d93041c703d438","scripts":{"dev":"vite --open /demo/index.html","build":"vite build","preview":"vite preview","prepublishOnly":"npm run build"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 SDK - 基于 TensorFlow.js MoveNet + 骨架模板匹配","directories":{},"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.0.9_1776830738033_0.15573312474804557","host":"s3://npm-registry-packages-npm-production"}},"1.0.10":{"name":"echoof-fitness-sdk","version":"1.0.10","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.0.10","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"7ef915d3cfe1a4aaa75a329fbc8fb3ff64466222","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.0.10.tgz","fileCount":7,"integrity":"sha512-3/r4mx6phUFgbtau3l2aHQHvYenydhRvCcxn5gcCDfBkmQkTPZEJrvO7UKXtPhhosxbFU2mI2OYLblCxcPb5lw==","signatures":[{"sig":"MEQCIAxhDkawU3yWl6kd1iIetgrhptUfF92zxviDNRMJuhmzAiAh/l/CuU0gb51ACQ/lI24tgXAl94VggVjqF7oLL/+N8A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":247523},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"de91d4689dd98a3befa8f735f1d93041c703d438","scripts":{"dev":"vite --open /demo/index.html","build":"vite build && BUILD_TARGET=browser vite build","preview":"vite preview","build:lib":"vite build","build:browser":"BUILD_TARGET=browser vite build","prepublishOnly":"npm run build"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 SDK - 基于 TensorFlow.js MoveNet + 骨架模板匹配","directories":{},"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.0.10_1776840681972_0.2555409376997839","host":"s3://npm-registry-packages-npm-production"}},"1.0.12":{"name":"echoof-fitness-sdk","version":"1.0.12","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.0.12","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"01bc26fc377830689e58ef16aa2a7b8e9d1cae8a","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.0.12.tgz","fileCount":9,"integrity":"sha512-TL12zy36ZoTjqUtDj2BRGrw0cSQof0zEXeLcH0XVQTkwC55Imk0DEabliW7F/FKEMJOoETA0OY/jmG3cqqIiyw==","signatures":[{"sig":"MEQCICKB2UhmCpnaJplATLD+09+/4QVjNqAN5kqEEfN0jzEvAiBjOHMG5blBa9bPz4JTL6+cSYXMuAVYbrtGhq+wIJf6Ow==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":248255},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"de91d4689dd98a3befa8f735f1d93041c703d438","scripts":{"dev":"vite --open /demo/index.html","build":"vite build && BUILD_TARGET=browser vite build","preview":"vite preview","build:lib":"vite build","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","prepublishOnly":"npm run clean:demo && npm run build"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 SDK - 基于 TensorFlow.js MoveNet + 骨架模板匹配","directories":{},"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.0.12_1776844595301_0.8599934953715194","host":"s3://npm-registry-packages-npm-production"}},"1.0.13":{"name":"echoof-fitness-sdk","version":"1.0.13","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.0.13","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"f09f3de73d4a7653e637571f6517fd421d2b6814","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.0.13.tgz","fileCount":8,"integrity":"sha512-/HELm5wzf848xV2iCw2X5Z4aUtP0Mp7TBolxNBPDuHbSe+yd6WvDxiJmYuh3HTyuGXdxKZrFw80Tw4+nRmHB4A==","signatures":[{"sig":"MEYCIQCW3xo0g3Un7igParXnuTpA3xj8OF3red+vS9JCuu8MsAIhAOjj2y7ZdQ87onTR9ep5WyssKqvSFFNQaMP+JbHIfmqW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":187823},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"}},"gitHead":"de91d4689dd98a3befa8f735f1d93041c703d438","scripts":{"dev":"vite --open /demo/index.html","build":"vite build && BUILD_TARGET=browser vite build","preview":"vite preview","build:lib":"vite build","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","prepublishOnly":"npm run clean:demo && npm run build"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 SDK - 基于 TensorFlow.js MoveNet + 骨架模板匹配","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.0.13_1776845081602_0.6269257966116826","host":"s3://npm-registry-packages-npm-production"}},"1.0.14":{"name":"echoof-fitness-sdk","version":"1.0.14","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.0.14","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"677fcf52f5afbe4238c94428b35cdef38bd777ab","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.0.14.tgz","fileCount":8,"integrity":"sha512-0ChMk3Wf0xcwamjn6puk2Fl0Y81pGf/FjBF7bAZqTSOt0mhQG9oU6GHZVf8XAQBNJHh7RO3TnWwdYLRuKJ0gJw==","signatures":[{"sig":"MEUCIQCyXwnt936POfHiJ+chAjcaUjOAMJKzzaezym8/8oYE2QIgDZiV7NGP/nu206dX92MVYatFsGlmsbaGX9rtjMpRCxg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":204962},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"}},"gitHead":"de91d4689dd98a3befa8f735f1d93041c703d438","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build","preview":"vite preview","build:lib":"vite build","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","prepublishOnly":"npm run clean:demo && npm run build"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 SDK - 基于 TensorFlow.js MoveNet + 骨架模板匹配","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.0.14_1776848500401_0.2562509977407401","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"echoof-fitness-sdk","version":"1.1.1","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.1.1","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"692108bafff2bafb4f71458f9f26b2000735bc3b","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.1.1.tgz","fileCount":8,"integrity":"sha512-Moayrkhv+dTD1c5iNiGKHE7LlY4t3HP+rlR3rotyrKfKttc0jEk05veoAX2lMgHY844ALO/AmZvKmj2kNagIFA==","signatures":[{"sig":"MEQCIEGDbut/g6b1c+RBLKiAl4DQ2rvRGy7d7uVvHewgbyi+AiBFM9HdeMWBH7q5ZgAG2NNqrwPXsah4WZI+IDq1XiwuyA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":207154},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"}},"gitHead":"1383020f990d0720a091b4ba70df4a137488b3e1","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build","preview":"vite preview","build:lib":"vite build","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","prepublishOnly":"npm run clean:demo && npm run build"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 SDK - 基于 TensorFlow.js MoveNet + 骨架模板匹配","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.1.1_1777001191120_0.7793960936125996","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"echoof-fitness-sdk","version":"1.2.1","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.2.1","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"93b46e4b32e2e6dd1fa2da6357bdeba86b18de5f","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.2.1.tgz","fileCount":8,"integrity":"sha512-i3FErE4jJdTHgCI5bXUIWxlhe4kJH/JcyCu3JAdrdkN9dtu6KvXg8MyfBz0u5tTkxQusmDxgeCA0wuKd4X0ftw==","signatures":[{"sig":"MEQCIC6+FmXy7mhzVlHdHsnmxrUPybwnKUOb3PdegSbhKDTxAiAMa3MS4RLAC/RH5zzwuJ4L8nWDEymDqrPBoxCFqb/C2A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":306534},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"}},"gitHead":"1377dccdb7bcf46b0a50fd9577a4018ce3b1d3e3","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build","preview":"vite preview","build:lib":"vite build","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","prepublishOnly":"npm run clean:demo && npm run build"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.2.1_1777013218513_0.07635101123316468","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"echoof-fitness-sdk","version":"1.2.3","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.2.3","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"d7f9fc1725557fa8b00d676eb19738d1a3a4b8b2","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.2.3.tgz","fileCount":9,"integrity":"sha512-sPlkqwFnOz4ewOpTtcaVeEkeVfrLOKwZGllVVqpQdVemRXle1NV8IfZDaojQwzBtGCShD99i+Bgm06py7riWjQ==","signatures":[{"sig":"MEYCIQC7NFQ/9+CYr6IeCpTs+I7HkBtZjJf9g28wJ3xN4DIL4QIhAM6nvc/pTJnn7h6w9dh94igmMaYkwL6eZLEQfmsOWqyt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":309294},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"}},"gitHead":"a12f11a9fc8e666c937434863e70502efedc9d9b","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build","preview":"vite preview","build:lib":"vite build","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","prepublishOnly":"npm run clean:demo && npm run build"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.2.3_1777024721146_0.9358197060646178","host":"s3://npm-registry-packages-npm-production"}},"1.2.6":{"name":"echoof-fitness-sdk","version":"1.2.6","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.2.6","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"6abfb01caed337f5a7e7f6d94ca98ebf66ff0cbd","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.2.6.tgz","fileCount":8,"integrity":"sha512-IeqcdjmwBd354b2BVBF8OWYn9xOXLVOhfN3JNV3UO7oLVOdYu+V23gfnWrWWGPWUyL4BSe45XoYvNRj0MJpPJw==","signatures":[{"sig":"MEUCIQC+DdOonY/Szk+ZI/St4MlwfzVyL0Py0pS7I2E0AzbsIgIgBMG7g4NU4Rmkz29wye33HP9YPgyuk+sPNzKwagtfBVI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":308396},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./dist/*":"./dist/*","./browser":{"types":"./dist/index.d.ts","import":"./dist/index.browser.mjs","default":"./dist/index.browser.mjs"},"./package.json":"./package.json"},"gitHead":"14e7bb451847da6fee28d9db8656092ed46ef1da","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build","preview":"vite preview","build:lib":"vite build","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","prepublishOnly":"npm run clean:demo && npm run build"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.2.6_1777029420485_0.6347825885637832","host":"s3://npm-registry-packages-npm-production"}},"1.2.7":{"name":"echoof-fitness-sdk","version":"1.2.7","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.2.7","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"133d00b140f9d77c4bb8e25841586602f8d64fb5","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.2.7.tgz","fileCount":8,"integrity":"sha512-Vqc6X2vdYhOWrb1kaxIRJI8BH5s39TIBHRTB1IrSBF/faGyktRTKAIfJ8Z1/L2iwXEbtIRJihPi4y+Sfn356HA==","signatures":[{"sig":"MEUCIAvw6CXqOufU9mNpUYZ4n5pO+JCuDcCM2NO1TwkIq1MEAiEA2NVXcpAUikHlI3GGI4j6ikxpuXK1kMXe+JkL8dOaM10=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":360496},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./dist/*":"./dist/*","./browser":{"types":"./dist/index.d.ts","import":"./dist/index.browser.mjs","default":"./dist/index.browser.mjs"},"./package.json":"./package.json"},"gitHead":"0836ec7a3500acacbc3ab75c934010e2b779790e","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build","preview":"vite preview","build:lib":"vite build","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","prepublishOnly":"npm run clean:demo && npm run build"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.2.7_1778053569485_0.8470110037115319","host":"s3://npm-registry-packages-npm-production"}},"1.2.8":{"name":"echoof-fitness-sdk","version":"1.2.8","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.2.8","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"8a9bbc53b58d69d7bf8b94c852174035e8239f87","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.2.8.tgz","fileCount":9,"integrity":"sha512-oGSG/5NzCfOJHHMOPniLV6RG8R0Ho4BHAz5HdOQmoBtQsXxjrSAKg5SUwE0Y8bio793PHZaBlEuGD+wYEKmVaQ==","signatures":[{"sig":"MEQCIGcuqCHJWQy/PpRSNgrC45se4eLfOr7X2tjWZJ2psE3wAiBQF58sZsIlqjaLMpoadeio4iI5RfhwESDVGS3j98atvg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":519807},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./dist/*":"./dist/*","./browser":{"types":"./dist/index.d.ts","import":"./dist/index.browser.mjs","default":"./dist/index.browser.mjs"},"./package.json":"./package.json"},"gitHead":"0836ec7a3500acacbc3ab75c934010e2b779790e","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build","preview":"vite preview","build:lib":"vite build","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","prepublishOnly":"npm run clean:demo && npm run build && cp dist/index.browser.mjs demo/sdk.mjs"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.2.8_1778054035888_0.41481804119492827","host":"s3://npm-registry-packages-npm-production"}},"1.2.9":{"name":"echoof-fitness-sdk","version":"1.2.9","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.2.9","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"23ad3978d2263a8df924f9a0b8637bdba0cb9d3f","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.2.9.tgz","fileCount":8,"integrity":"sha512-u+M6deFAaVu2kWHeuLRvErpkHdzRPPiL4ywBtxm0DaWjt7i/mXBuE+GHTJbpcg3Mg2H5r/opLXx914/4SfvfiA==","signatures":[{"sig":"MEQCIFSMzSGN2C4kfaicq3DzP5SZ7unPPJWk6qlv8tx994CIAiANJjZDRrZcc5Q7HkIxUv0CsrQbRehj3DQppUwJsgPlMA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":516619},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./dist/*":"./dist/*","./browser":{"types":"./dist/index.d.ts","import":"./dist/index.browser.mjs","default":"./dist/index.browser.mjs"},"./package.json":"./package.json"},"gitHead":"0836ec7a3500acacbc3ab75c934010e2b779790e","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build","preview":"vite preview","build:lib":"vite build","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","prepublishOnly":"npm run clean:demo && npm run build && cp dist/index.browser.mjs demo/sdk.mjs"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.2.9_1778054582972_0.8484778572643332","host":"s3://npm-registry-packages-npm-production"}},"1.2.10":{"name":"echoof-fitness-sdk","version":"1.2.10","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.2.10","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"052430d53e3e1b342f45d8df5f7a4435b2001b41","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.2.10.tgz","fileCount":8,"integrity":"sha512-aq+7gySxttb1XpCbeVVfvJXnRP6J4ToVcRp7nMCKsr0b7vJo1kl/Jzgx2i3e1QCFxVH4smJ2txA+Sw8qM/hwhg==","signatures":[{"sig":"MEYCIQDvA8w8TEHKYqH+O1i/s5tWdqnmE3Vvv3ckKVFBxCQpYQIhANE1JqQ1A93JeE+BrY1KacjD5WDRawOkHtoCa9GydzZS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":516592},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./dist/*":"./dist/*","./browser":{"types":"./dist/index.d.ts","import":"./dist/index.browser.mjs","default":"./dist/index.browser.mjs"},"./package.json":"./package.json"},"gitHead":"0836ec7a3500acacbc3ab75c934010e2b779790e","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build","preview":"vite preview","build:lib":"vite build","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","prepublishOnly":"npm run clean:demo && npm run build && cp dist/index.browser.mjs demo/sdk.mjs"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.2.10_1778055137036_0.9643102584206884","host":"s3://npm-registry-packages-npm-production"}},"1.2.11":{"name":"echoof-fitness-sdk","version":"1.2.11","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.2.11","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"fe3c5cd7d4e9a016261db8a97ce434e7f3b010fc","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.2.11.tgz","fileCount":8,"integrity":"sha512-JEF1E+VV6UGJo4T6289GVQ32eiPkmYX1sAXmqCtUeXzdkIl2B548I4/VmoMI4WGHKIdfXqBfwnFLMrfPVFGU6A==","signatures":[{"sig":"MEUCIQCJAT3SuA9vu4kQgTbB6dYTHV2AsYaS1wtBx2jtzYaR/wIgbMF/w0+yUBaVd6Vi5pQGUtD/P+jDz4BC3DH0cAgXSAY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":518066},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./dist/*":"./dist/*","./browser":{"types":"./dist/index.d.ts","import":"./dist/index.browser.mjs","default":"./dist/index.browser.mjs"},"./package.json":"./package.json"},"gitHead":"0836ec7a3500acacbc3ab75c934010e2b779790e","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build","preview":"vite preview","build:lib":"vite build","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","prepublishOnly":"npm run clean:demo && npm run build && cp dist/index.browser.mjs demo/sdk.mjs"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.2.11_1778055459863_0.039955914382379554","host":"s3://npm-registry-packages-npm-production"}},"1.2.13":{"name":"echoof-fitness-sdk","version":"1.2.13","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.2.13","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"9146a94170abde9b7236b94e7a86ac4aad4af422","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.2.13.tgz","fileCount":8,"integrity":"sha512-pkkcotIl8B8xK6If8XGEc9kE/Awmf1WeVngc/JWfZQxPOr53g+35Ncydnj0IyMkaGaol86Y6quv3CltgyhXQsQ==","signatures":[{"sig":"MEUCIQC9mKhd5GrJ0i6O24RivWE2HAEXXgDmMSXAqGk3dZDydAIgRJpyAKMBqrWPZ0BaWfnBoBfNjuY3tE1h7xu9dNspKsA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3577299},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./dist/*":"./dist/*","./browser":{"types":"./dist/index.d.ts","import":"./dist/index.browser.mjs","default":"./dist/index.browser.mjs"},"./package.json":"./package.json"},"gitHead":"0836ec7a3500acacbc3ab75c934010e2b779790e","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build","preview":"vite preview","build:lib":"vite build","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","prepublishOnly":"npm run clean:demo && npm run build && cp dist/index.browser.mjs demo/sdk.mjs"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.2.13_1778056667369_0.43913074930345997","host":"s3://npm-registry-packages-npm-production"}},"1.2.14":{"name":"echoof-fitness-sdk","version":"1.2.14","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.2.14","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"b1881ea7f2e01e41179f4a7d989412f0746ba19f","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.2.14.tgz","fileCount":14,"integrity":"sha512-RjNqGNwzHD5G3FKqyp/kahNwtceGqsiuCKrncdHwiUB7DckTFj6Gtn/4gjhEEZOfDjjzXjKDdwfRNIpu1nXUEg==","signatures":[{"sig":"MEQCIEyE+0ygQyGoRaoYkOq4dtDa18WNWlSD+MnK0KvrgnczAiAl0PY63RoumKtQaJtzyLqv/LsjS962xyPp6gZVwxT5rg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13224611},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./dist/*":"./dist/*","./browser":{"types":"./dist/index.d.ts","import":"./dist/index.browser.mjs","default":"./dist/index.browser.mjs"},"./package.json":"./package.json"},"gitHead":"89d906db25041f4f33dd66d2505e8d7e886a3ef0","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build","preview":"vite preview","build:lib":"vite build","sync:demo":"mkdir -p demo/models && rm -rf demo/models/movenet-singlepose-lightning && cp -R public/models/movenet-singlepose-lightning demo/models/ && cp dist/index.browser.mjs demo/sdk.mjs","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","prepublishOnly":"npm run clean:demo && npm run build && npm run sync:demo"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.2.14_1778558017338_0.19227239314230382","host":"s3://npm-registry-packages-npm-production"}},"1.2.15":{"name":"echoof-fitness-sdk","version":"1.2.15","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.2.15","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"aaae4ed5c32341491eac85078be4749442e5a3b7","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.2.15.tgz","fileCount":14,"integrity":"sha512-dqbFodhTZkw3D05H3JRPVMAHbIonO+WC5h9/7KcXHiAh3QHqteG8nMtTT8GFGQopE3SvMmLhWG+WUMO5aQjSLw==","signatures":[{"sig":"MEYCIQDlpbHBJ+EAtM4dFW3M1eMVGxFtINkd6mIhQBwjtvYnOAIhAPPIaL6lAFgNoxNaJ5DIFfpX3fz5A9/s12DCQ2zuT0wU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13353781},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./dist/*":"./dist/*","./browser":{"types":"./dist/index.d.ts","import":"./dist/index.browser.mjs","default":"./dist/index.browser.mjs"},"./package.json":"./package.json"},"gitHead":"55d298d435cb90425befaf90b01594b13bf76198","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build","preview":"vite preview","build:lib":"vite build","sync:demo":"mkdir -p demo/models && rm -rf demo/models/movenet-singlepose-lightning && cp -R public/models/movenet-singlepose-lightning demo/models/ && cp dist/index.browser.mjs demo/sdk.mjs","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","prepublishOnly":"npm run clean:demo && npm run build && npm run sync:demo"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.2.15_1778663142110_0.13028528526441052","host":"s3://npm-registry-packages-npm-production"}},"1.2.16":{"name":"echoof-fitness-sdk","version":"1.2.16","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.2.16","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"dacf15f5b033bf485da006eb115edfc76812ff85","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.2.16.tgz","fileCount":14,"integrity":"sha512-00upNn1QQzmA1WNOjpFxiwgsjrwvA7UBwkbSZgHVio6cyvNE6d1tA/zVZg+tE51t7nPw9ipuj0kNJI5p296FAA==","signatures":[{"sig":"MEQCIG1hrbNlqFtJjH03G1ICWVu/rlHqcEV22yecZ5hJyIffAiByVfPwxdCA1Mpj8VJasz3hoEqjVQWNym6AGb8h5ihtxA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13358109},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./dist/*":"./dist/*","./browser":{"types":"./dist/index.d.ts","import":"./dist/index.browser.mjs","default":"./dist/index.browser.mjs"},"./package.json":"./package.json"},"gitHead":"5efb900376a4f077dbca9249a7b599be3fc36db5","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build","preview":"vite preview","build:lib":"vite build","sync:demo":"mkdir -p demo/models && rm -rf demo/models/movenet-singlepose-lightning && cp -R public/models/movenet-singlepose-lightning demo/models/ && cp dist/index.browser.mjs demo/sdk.mjs","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","prepublishOnly":"npm run clean:demo && npm run build && npm run sync:demo"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.2.16_1778744870768_0.3592280181667802","host":"s3://npm-registry-packages-npm-production"}},"1.2.17":{"name":"echoof-fitness-sdk","version":"1.2.17","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.2.17","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"51d0359e540dcf2f94cda12bb05d8efab571611e","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.2.17.tgz","fileCount":19,"integrity":"sha512-TOWXCdFTxLPxVzEEFngGZr978qSX8eJeziBrp8ioejPuPbUUSQ94VZea7QAx9VVrZnlfE9zURSCyrVQyfeCGEA==","signatures":[{"sig":"MEUCIHSXo18JSELzP+NfHQylIyaWjbSzxcu7EL0uc2zXK9xaAiEAh3rCzUmDV/ftquMDof8p1JNjwcaKu3r9rnTdzDK9s/I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17614789},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./dist/*":"./dist/*","./browser":{"types":"./dist/index.d.ts","import":"./dist/index.browser.mjs","default":"./dist/index.browser.mjs"},"./package.json":"./package.json"},"gitHead":"6bb9f002257519e69a6250ad0fff157761dab975","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build && BUILD_TARGET=cdn vite build","preview":"vite preview","build:cdn":"BUILD_TARGET=cdn vite build","build:lib":"vite build","sync:demo":"mkdir -p demo/models && rm -rf demo/models/movenet-singlepose-lightning && cp -R public/models/movenet-singlepose-lightning demo/models/ && cp dist/index.browser.mjs demo/sdk.mjs","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","sync:cdn-demo":"node scripts/create-cdn-demo.mjs","prepublishOnly":"npm run clean:demo && npm run build && npm run sync:demo && npm run sync:cdn-demo"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.2.17_1779090346979_0.22636326757621927","host":"s3://npm-registry-packages-npm-production"}},"1.2.18":{"name":"echoof-fitness-sdk","version":"1.2.18","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.2.18","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"033d8c2d91b6a1c30c25919b162dc396608b413f","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.2.18.tgz","fileCount":21,"integrity":"sha512-r4mxrD3KbySCz0vOgzZZlbBE4D7P7RUQpNWcB1O/hIS/q/W8Z/92Nydse4Zw9AdEe8V/Th5gYcswlIpG4EVHNA==","signatures":[{"sig":"MEUCIQCN2OlBt0GcYkcgnOvPY3NZnJen6i56Y2LrevyYDvQCEAIgNxhHStSjy/ziOqTFk+pUceXFbsnunBmk8llhE+PcYCE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19036127},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./dist/*":"./dist/*","./browser":{"types":"./dist/index.d.ts","import":"./dist/index.browser.mjs","default":"./dist/index.browser.mjs"},"./package.json":"./package.json"},"gitHead":"0b3cdfb8d95d93312944646e4f9739e4e142f610","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build && BUILD_TARGET=cdn vite build","preview":"vite preview","build:cdn":"BUILD_TARGET=cdn vite build","build:lib":"vite build","sync:demo":"mkdir -p demo/models && rm -rf demo/models/movenet-singlepose-lightning && cp -R public/models/movenet-singlepose-lightning demo/models/ && cp dist/index.browser.mjs demo/sdk.mjs","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","sync:cdn-demo":"node scripts/create-cdn-demo.mjs","prepublishOnly":"npm run clean:demo && npm run build && npm run sync:demo && npm run sync:cdn-demo"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.2.18_1779159050917_0.18277120408945668","host":"s3://npm-registry-packages-npm-production"}},"1.2.20":{"name":"echoof-fitness-sdk","version":"1.2.20","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.2.20","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"8f56c85ca23d6fc787882fc2c327de56bb1b809b","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.2.20.tgz","fileCount":25,"integrity":"sha512-gBVvCa8tFMXyb1hMH6cFAFHiTzd8zPdejV1Ld0Ht50+zxT4nuQExG1jzmWEZp4A8sLs39+3wwut5AAFgng5UhQ==","signatures":[{"sig":"MEUCIQDD5r5cbqM3u/K1QcPrirMi3F3x+gTcC3TVxMYBgXUUhgIgBsWY4EzGZII/mSonU1ou1OdBMOaCETeZxsmsgjzfI9M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22168340},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./dist/*":"./dist/*","./browser":{"types":"./dist/index.d.ts","import":"./dist/index.browser.mjs","default":"./dist/index.browser.mjs"},"./package.json":"./package.json"},"gitHead":"343936dfad4fd60229afadf15c5e8215c5718269","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build && BUILD_TARGET=cdn vite build","preview":"vite preview","build:cdn":"BUILD_TARGET=cdn vite build","build:lib":"vite build","sync:demo":"mkdir -p demo/models && rm -rf demo/models/movenet-singlepose-lightning && cp -R public/models/movenet-singlepose-lightning demo/models/ && cp dist/index.browser.mjs demo/sdk.mjs","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","sync:cdn-demo":"node scripts/create-cdn-demo.mjs","prepublishOnly":"npm run clean:demo && npm run build && npm run sync:demo && npm run sync:cdn-demo"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"11.12.1","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.2.20_1780393687147_0.5136099132820717","host":"s3://npm-registry-packages-npm-production"}},"1.2.21":{"name":"echoof-fitness-sdk","version":"1.2.21","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.2.21","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"365abc5612911fbd50903a2d0ac4c6f1c39075b2","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.2.21.tgz","fileCount":27,"integrity":"sha512-uGiQXr/zykXJo3Er0ELQXuzwysIqNZqRNB3fWw8e8PFFXT6oIIhEoDrdFOeRvTo21+TW+pAUWkoVLW9HaYb2gA==","signatures":[{"sig":"MEYCIQCRQADdosGWHoQ6FHxYvWnK8OD0Av1483Smg+ig8YjChAIhAPaxS05tgDqC9c1UhdHqkYsj7hheoRDh5GvUEX1UAHMR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":23626817},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./dist/*":"./dist/*","./browser":{"types":"./dist/index.d.ts","import":"./dist/index.browser.mjs","default":"./dist/index.browser.mjs"},"./package.json":"./package.json"},"gitHead":"da3581269d531fc0b0cb9bd58e6fbfa3486fe31c","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build && BUILD_TARGET=cdn vite build","preview":"vite preview","build:cdn":"BUILD_TARGET=cdn vite build","build:lib":"vite build","sync:demo":"mkdir -p demo/models && rm -rf demo/models/movenet-singlepose-lightning && cp -R public/models/movenet-singlepose-lightning demo/models/ && cp dist/index.browser.mjs demo/sdk.mjs","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","sync:cdn-demo":"node scripts/create-cdn-demo.mjs","prepublishOnly":"npm run clean:demo && npm run build && npm run sync:demo && npm run sync:cdn-demo"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"11.12.1","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.2.21_1780890294600_0.6697563166524321","host":"s3://npm-registry-packages-npm-production"}},"1.2.22":{"name":"echoof-fitness-sdk","version":"1.2.22","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.2.22","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"acce86f49b6c6a2d782511e034d06a7e979c4a73","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.2.22.tgz","fileCount":29,"integrity":"sha512-iiL/m0H42fK7k/wx1owZVwgYPdD/fJKkcFBgtYOwPOsvmQ4TcpZtYGYGRb8IlGVHXICHl7P+KOX0LsUluaoX5Q==","signatures":[{"sig":"MEUCIAJOnlvo+NHOnIPucEwA7TgXpNgqiie0PO+tWOiXzBGlAiEA5g5RzVUk9qlzUvcEb73LCSn1SVz9HrQ0A6J8hl2NHEE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25082745},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./dist/*":"./dist/*","./browser":{"types":"./dist/index.d.ts","import":"./dist/index.browser.mjs","default":"./dist/index.browser.mjs"},"./package.json":"./package.json"},"gitHead":"204b8f45e1313031f6419f239b0bdecb35182011","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build && BUILD_TARGET=cdn vite build","preview":"vite preview","build:cdn":"BUILD_TARGET=cdn vite build","build:lib":"vite build","sync:demo":"mkdir -p demo/models && rm -rf demo/models/movenet-singlepose-lightning && cp -R public/models/movenet-singlepose-lightning demo/models/ && cp dist/index.browser.mjs demo/sdk.mjs","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","sync:cdn-demo":"node scripts/create-cdn-demo.mjs","prepublishOnly":"npm run clean:demo && npm run build && npm run sync:demo && npm run sync:cdn-demo"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"11.12.1","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.2.22_1780974149258_0.5663152016189357","host":"s3://npm-registry-packages-npm-production"}},"1.2.23":{"name":"echoof-fitness-sdk","version":"1.2.23","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.2.23","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"f3b7e1cfee2180e37916b4a3b02c71c2b971eb32","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.2.23.tgz","fileCount":31,"integrity":"sha512-RDOOVElOMroypNzZfqMltrb38Byn4j7N8tzLJJT9aCwr4IVWi5rPTbShWdPl90js1i09ljJ3ggFFa/dGdZJenA==","signatures":[{"sig":"MEUCIQCDYHAYUYR7/KxeMItriTaxZbhchP2qfdhTQ0xp0ldtPgIgKk2e8rJPS3EMlVhtS0/QYlHvNu/kXDaqWum5bT+mKZE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26546068},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./dist/*":"./dist/*","./browser":{"types":"./dist/index.d.ts","import":"./dist/index.browser.mjs","default":"./dist/index.browser.mjs"},"./package.json":"./package.json"},"gitHead":"643273ccf285cfbd52150582a8fda8bf0e52695f","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build && BUILD_TARGET=cdn vite build","preview":"vite preview","build:cdn":"BUILD_TARGET=cdn vite build","build:lib":"vite build","sync:demo":"mkdir -p demo/models && rm -rf demo/models/movenet-singlepose-lightning && cp -R public/models/movenet-singlepose-lightning demo/models/ && cp dist/index.browser.mjs demo/sdk.mjs","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","sync:cdn-demo":"node scripts/create-cdn-demo.mjs","prepublishOnly":"npm run clean:demo && npm run build && npm run sync:demo && npm run sync:cdn-demo"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"11.12.1","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.2.23_1780991470489_0.28156884236626056","host":"s3://npm-registry-packages-npm-production"}},"1.2.24":{"name":"echoof-fitness-sdk","version":"1.2.24","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.2.24","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"f893358225d42d977ffb4f8bcbb3d32f1f29f8a3","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.2.24.tgz","fileCount":33,"integrity":"sha512-dohT93nK00mGjvq9vv/GO+CJcOa62X0aMQcci0rvS10F14k4uCHBb2Jc/Z01BBvZ+dqjOaBgoPLTjeTmPLMqcw==","signatures":[{"sig":"MEYCIQDDW7qlVfQvdRAgFuU/mbakzGMbd6m8jFYye+2mtmOG9wIhAMM6KJElcpL+dpuiKBQ42OTeG8Dhl4EkHuDrKMwuIB0y","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":28006811},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./dist/*":"./dist/*","./browser":{"types":"./dist/index.d.ts","import":"./dist/index.browser.mjs","default":"./dist/index.browser.mjs"},"./package.json":"./package.json"},"gitHead":"643273ccf285cfbd52150582a8fda8bf0e52695f","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build && BUILD_TARGET=cdn vite build","preview":"vite preview","build:cdn":"BUILD_TARGET=cdn vite build","build:lib":"vite build","sync:demo":"mkdir -p demo/models && rm -rf demo/models/movenet-singlepose-lightning && cp -R public/models/movenet-singlepose-lightning demo/models/ && cp dist/index.browser.mjs demo/sdk.mjs","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","sync:cdn-demo":"node scripts/create-cdn-demo.mjs","prepublishOnly":"npm run clean:demo && npm run build && npm run sync:demo && npm run sync:cdn-demo"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"11.12.1","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.2.24_1781004117987_0.8034095926566567","host":"s3://npm-registry-packages-npm-production"}},"1.2.25":{"name":"echoof-fitness-sdk","version":"1.2.25","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.2.25","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"e503263ecd476211ff43f08f43d7ebfe6644eea1","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.2.25.tgz","fileCount":35,"integrity":"sha512-ym4xAl1yItV3NW4u222DuPQTQychMMz5tNV4gMMc/ytDUF/658gKaF5EOZH7xum2Q7ICaZxvO951t9aHtxATzg==","signatures":[{"sig":"MEUCIQCdlBEUAAkWE9vXHncz8GoxssR/EJUJCfYWFbAIVC2dbAIgCgMNrO7sCjbhZiz1NkAVAkBoMPCa3ErfoenOWlk2dZc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29464038},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./dist/*":"./dist/*","./browser":{"types":"./dist/index.d.ts","import":"./dist/index.browser.mjs","default":"./dist/index.browser.mjs"},"./package.json":"./package.json"},"gitHead":"9c490e451c2cd047e3e436ba032ade2558372e93","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build && BUILD_TARGET=cdn vite build","preview":"vite preview","build:cdn":"BUILD_TARGET=cdn vite build","build:lib":"vite build","sync:demo":"mkdir -p demo/models && rm -rf demo/models/movenet-singlepose-lightning && cp -R public/models/movenet-singlepose-lightning demo/models/ && cp dist/index.browser.mjs demo/sdk.mjs","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","sync:cdn-demo":"node scripts/create-cdn-demo.mjs","prepublishOnly":"npm run clean:demo && npm run build && npm run sync:demo && npm run sync:cdn-demo"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.2.25_1784187855825_0.23928314144406637","host":"s3://npm-registry-packages-npm-production"}},"1.2.27":{"name":"echoof-fitness-sdk","version":"1.2.27","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.2.27","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"7ff75ac0c279818939d4d72909d68d148d659bce","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.2.27.tgz","fileCount":39,"integrity":"sha512-ibEFVujTBN0/fF8g+vCbutot0f/nWjNy7R2kT6fyvDGmUNkpRR6T5jLrRTxPSyVxCFzTOFIJxmrNNS1OuS+9eA==","signatures":[{"sig":"MEUCIEuCwHi+LkOnYbcHO/edL4ThR0xrzsVOotwqBHo4vFC0AiEAsn1t2g81YHy5xZq6My9DRs/n10SetYPorCwPqqU/2/I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":32461857},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./dist/*":"./dist/*","./browser":{"types":"./dist/index.d.ts","import":"./dist/index.browser.mjs","default":"./dist/index.browser.mjs"},"./package.json":"./package.json"},"gitHead":"d34735df6a128b2a9ffe9a3b52a1decd7738f666","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build && BUILD_TARGET=cdn vite build","preview":"vite preview","build:cdn":"BUILD_TARGET=cdn vite build","build:lib":"vite build","sync:demo":"mkdir -p demo/models && rm -rf demo/models/movenet-singlepose-lightning && cp -R public/models/movenet-singlepose-lightning demo/models/ && cp dist/index.browser.mjs demo/sdk.mjs","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","sync:cdn-demo":"node scripts/create-cdn-demo.mjs","prepublishOnly":"npm run clean:demo && npm run build && npm run sync:demo && npm run sync:cdn-demo"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.2.27_1785146158397_0.24265789680694638","host":"s3://npm-registry-packages-npm-production"}},"1.2.28":{"name":"echoof-fitness-sdk","version":"1.2.28","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.2.28","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"624b419ffb8363412b8d30374af96650276f75dd","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.2.28.tgz","fileCount":41,"integrity":"sha512-Pk+k1UZ/Vetv6Cb+PQ/nbCJCGF+1crIXolIESys5SBPTksviI0RM4ODGyxTdQVG0R/2tJ076g6Azg7SS66rylg==","signatures":[{"sig":"MEQCIBGYNaD8RKvA0YpjZ+069zpX35cq9gwpkln5g+w9GGQsAiAAroepAQCehoZCDrawkIslwFRU3vZ2VZ2AGQhGS0d9MA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":33943848},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./dist/*":"./dist/*","./browser":{"types":"./dist/index.d.ts","import":"./dist/index.browser.mjs","default":"./dist/index.browser.mjs"},"./package.json":"./package.json"},"gitHead":"d34735df6a128b2a9ffe9a3b52a1decd7738f666","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build && BUILD_TARGET=cdn vite build","preview":"vite preview","build:cdn":"BUILD_TARGET=cdn vite build","build:lib":"vite build","sync:demo":"mkdir -p demo/models && rm -rf demo/models/movenet-singlepose-lightning && cp -R public/models/movenet-singlepose-lightning demo/models/ && cp dist/index.browser.mjs demo/sdk.mjs","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","sync:cdn-demo":"node scripts/create-cdn-demo.mjs","prepublishOnly":"npm run clean:demo && npm run build && npm run sync:demo && npm run sync:cdn-demo"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.2.28_1785152458594_0.5515932340275194","host":"s3://npm-registry-packages-npm-production"}},"1.2.29":{"name":"echoof-fitness-sdk","version":"1.2.29","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.2.29","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"7b37ddb4fd0c31ff93d5e355227d4db748bedad3","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.2.29.tgz","fileCount":43,"integrity":"sha512-3H7CPCvPFdyxjw6TVAcCq7FoNLLe1vSOlFMqocRO0xtYIp9iTjvVJwISFD7On63ptH+ycEVYa64b5C5yL1Wq8w==","signatures":[{"sig":"MEQCIHqwI3/dOdtT2EwzfoR8PzztaoUFSGcTCg2NwFwnSDG6AiBGtDZ52pyhi6Pu0h0Nb5dXob2j6yiyLuaC4NBBhtwlww==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35425712},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./dist/*":"./dist/*","./browser":{"types":"./dist/index.d.ts","import":"./dist/index.browser.mjs","default":"./dist/index.browser.mjs"},"./package.json":"./package.json"},"gitHead":"dbf98916523d1d2d0a6afadc1b70b9cf04732331","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build && BUILD_TARGET=cdn vite build","preview":"vite preview","build:cdn":"BUILD_TARGET=cdn vite build","build:lib":"vite build","sync:demo":"mkdir -p demo/models && rm -rf demo/models/movenet-singlepose-lightning && cp -R public/models/movenet-singlepose-lightning demo/models/ && cp dist/index.browser.mjs demo/sdk.mjs","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","sync:cdn-demo":"node scripts/create-cdn-demo.mjs","prepublishOnly":"npm run clean:demo && npm run build && npm run sync:demo && npm run sync:cdn-demo"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.2.29_1785209319788_0.7271553460537823","host":"s3://npm-registry-packages-npm-production"}},"1.2.30":{"name":"echoof-fitness-sdk","version":"1.2.30","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.2.30","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"747bd8e5f2e4f32df51f40ce63402379b6cc946d","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.2.30.tgz","fileCount":45,"integrity":"sha512-s3uq8iytdpi4vErCjFpDAhM8sc6k7ELQsLJ4Yh7SvT8vr1q6qo7+BZbQyl3mLv7q7+Hiy9lB472so1cZQELbpg==","signatures":[{"sig":"MEUCIQC9LNjBb8NXa8SF1W7Eh/7sJcdrx8iIz2rUjPIA411ebwIgNMBisFo2vLvX2G6rDwBOqNnZlY4h3hM9xY1YNlJpD70=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36906834},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./dist/*":"./dist/*","./browser":{"types":"./dist/index.d.ts","import":"./dist/index.browser.mjs","default":"./dist/index.browser.mjs"},"./package.json":"./package.json"},"gitHead":"0b6ecd2baad3070bc86481843862f6891769b505","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build && BUILD_TARGET=cdn vite build","preview":"vite preview","build:cdn":"BUILD_TARGET=cdn vite build","build:lib":"vite build","sync:demo":"mkdir -p demo/models && rm -rf demo/models/movenet-singlepose-lightning && cp -R public/models/movenet-singlepose-lightning demo/models/ && cp dist/index.browser.mjs demo/sdk.mjs","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","sync:cdn-demo":"node scripts/create-cdn-demo.mjs","prepublishOnly":"npm run clean:demo && npm run build && npm run sync:demo && npm run sync:cdn-demo"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.2.30_1785216590017_0.20078387945123577","host":"s3://npm-registry-packages-npm-production"}},"1.2.31":{"name":"echoof-fitness-sdk","version":"1.2.31","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.2.31","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"089b6c5fcc0b1583292eee8c923ad6a10fc1f244","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.2.31.tgz","fileCount":47,"integrity":"sha512-qRRWrujYQllN9fdMuiFipeERaY8HpbDQ+o5PQjOS+oszQQGFcQptaXYwjdE+hT/fLsPuuWgGEQzDGMHm6HNcfA==","signatures":[{"sig":"MEUCIQCKUFOC/y3GAyPZloGY8I+/WaADw5u8q26/zICOHwq1+QIgS7z5SXtN6MxUrpTFPkmgvsVbvxY0g+ym8D4VGl91FAU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38387933},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./dist/*":"./dist/*","./browser":{"types":"./dist/index.d.ts","import":"./dist/index.browser.mjs","default":"./dist/index.browser.mjs"},"./package.json":"./package.json"},"gitHead":"68182d5c27750da3b5b9ef1ed02d87af910e4d0d","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build && BUILD_TARGET=cdn vite build","preview":"vite preview","build:cdn":"BUILD_TARGET=cdn vite build","build:lib":"vite build","sync:demo":"mkdir -p demo/models && rm -rf demo/models/movenet-singlepose-lightning && cp -R public/models/movenet-singlepose-lightning demo/models/ && cp dist/index.browser.mjs demo/sdk.mjs","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","sync:cdn-demo":"node scripts/create-cdn-demo.mjs","prepublishOnly":"npm run clean:demo && npm run build && npm run sync:demo && npm run sync:cdn-demo"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.2.31_1785226247665_0.27225386482667835","host":"s3://npm-registry-packages-npm-production"}},"1.2.32":{"name":"echoof-fitness-sdk","version":"1.2.32","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.2.32","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"897c5216d2eed588bcdf8ec9312f407f0c47d417","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.2.32.tgz","fileCount":49,"integrity":"sha512-4b9w8XhP/Kp/iVduCdP5OMzKDgwrK6WCVeEEOTdQjE6O10ELlJAe4X6kzNSh8NkscEKT3sxnbH2MJCFWEEpGvw==","signatures":[{"sig":"MEUCIQD7T1uubBhMHKjqpn9tR+swadan6cFizunLBgvKUdAj3AIgN5mEHNqdH90gWyVYK4O4GPQfSI7xC6qBnIF0aYUdkpU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39869049},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./dist/*":"./dist/*","./browser":{"types":"./dist/index.d.ts","import":"./dist/index.browser.mjs","default":"./dist/index.browser.mjs"},"./package.json":"./package.json"},"gitHead":"68182d5c27750da3b5b9ef1ed02d87af910e4d0d","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build && BUILD_TARGET=cdn vite build","preview":"vite preview","build:cdn":"BUILD_TARGET=cdn vite build","build:lib":"vite build","sync:demo":"mkdir -p demo/models && rm -rf demo/models/movenet-singlepose-lightning && cp -R public/models/movenet-singlepose-lightning demo/models/ && cp dist/index.browser.mjs demo/sdk.mjs","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","sync:cdn-demo":"node scripts/create-cdn-demo.mjs","prepublishOnly":"npm run clean:demo && npm run build && npm run sync:demo && npm run sync:cdn-demo"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.2.32_1785227385117_0.07912770362479926","host":"s3://npm-registry-packages-npm-production"}},"1.2.33":{"name":"echoof-fitness-sdk","version":"1.2.33","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","_id":"echoof-fitness-sdk@1.2.33","maintainers":[{"name":"skua","email":"i@55u.me"}],"dist":{"shasum":"b7e03a81817affa95e7d7e0dc976907d1c7b8e32","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.2.33.tgz","fileCount":51,"integrity":"sha512-jaZmFRX8dNmA0rW5V3vTH/0TAFmPeKGrONpQpoOWaEP3PFB7EnIWZwLFEjqsM7OQeb1ci5bNO1ml7ARj9Iv3HA==","signatures":[{"sig":"MEUCIFTyRDqoKQYFE0fhQjbj0zLD4i0gZaSgznOo9Pa4drzDAiEAtYyi7H4Yhc88wqYsU5GdY9a/6QRYVVScrRpgS0cEDFw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41350156},"main":"dist/index.mjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./dist/*":"./dist/*","./browser":{"types":"./dist/index.d.ts","import":"./dist/index.browser.mjs","default":"./dist/index.browser.mjs"},"./package.json":"./package.json"},"gitHead":"68182d5c27750da3b5b9ef1ed02d87af910e4d0d","scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build && BUILD_TARGET=cdn vite build","preview":"vite preview","build:cdn":"BUILD_TARGET=cdn vite build","build:lib":"vite build","sync:demo":"mkdir -p demo/models && rm -rf demo/models/movenet-singlepose-lightning && cp -R public/models/movenet-singlepose-lightning demo/models/ && cp dist/index.browser.mjs demo/sdk.mjs","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","build:browser":"BUILD_TARGET=browser vite build","sync:cdn-demo":"node scripts/create-cdn-demo.mjs","prepublishOnly":"npm run clean:demo && npm run build && npm run sync:demo && npm run sync:cdn-demo"},"_npmUser":{"name":"skua","email":"i@55u.me"},"_npmVersion":"10.8.2","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{"@tensorflow/tfjs-core":"^4.22.0","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow-models/pose-detection":"^2.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.0","typescript":"^5.5.0","vite-plugin-dts":"^3.9.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-converter":"^4.22.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/echoof-fitness-sdk_1.2.33_1785228623140_0.9245314555760933","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"echoof-fitness-sdk","version":"1.3.0","description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","type":"module","main":"dist/index.mjs","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./follow":{"types":"./dist/follow.d.ts","import":"./dist/follow.mjs","default":"./dist/follow.mjs"},"./browser":{"types":"./dist/index.d.ts","import":"./dist/index.browser.mjs","default":"./dist/index.browser.mjs"},"./dist/*":"./dist/*","./package.json":"./package.json"},"sideEffects":false,"scripts":{"dev":"vite --open /local_demo/index.html","build":"vite build && BUILD_TARGET=browser vite build && BUILD_TARGET=cdn vite build","build:lib":"vite build","build:browser":"BUILD_TARGET=browser vite build","build:cdn":"BUILD_TARGET=cdn vite build","preview":"vite preview","clean:demo":"rm -rf demo/node_modules demo/package-lock.json demo/pnpm-lock.yaml demo/yarn.lock demo/dist","optimize:model":"node scripts/optimize-model.mjs","sync:demo":"mkdir -p demo/models && rm -rf demo/models/movenet-singlepose-lightning && cp -R public/models/movenet-singlepose-lightning demo/models/ && cp dist/index.browser.mjs demo/sdk.mjs","sync:cdn-demo":"node scripts/create-cdn-demo.mjs","prepublishOnly":"npm run clean:demo && npm run build && npm run sync:demo && npm run sync:cdn-demo"},"dependencies":{"@tensorflow-models/pose-detection":"^2.1.3","@tensorflow/tfjs-backend-webgl":"^4.22.0","@tensorflow/tfjs-core":"^4.22.0"},"peerDependencies":{"@mediapipe/pose":"^0.5.0","@tensorflow/tfjs-backend-webgpu":"^4.22.0","@tensorflow/tfjs-converter":"^4.22.0"},"peerDependenciesMeta":{"@mediapipe/pose":{"optional":true},"@tensorflow/tfjs-backend-webgpu":{"optional":true},"@tensorflow/tfjs-converter":{"optional":true}},"devDependencies":{"typescript":"^5.5.0","vite":"^5.4.0","vite-plugin-dts":"^3.9.0"},"keywords":["pose-detection","fitness","movenet","skeleton","counter"],"license":"MIT","gitHead":"21751fa017eb9160bf371e5558c95af3d3784423","_id":"echoof-fitness-sdk@1.3.0","_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-cSAI4tJNBU8g4PDHDyL36qyZcBaxtvNk6vB3ne9FoykMCxxsKICWpW7UIOypSx0V1ehDxum3zO8eMWWmVXx/kw==","shasum":"ca63585671d6f6a9225918990527551c0db8c85c","tarball":"https://registry.npmjs.org/echoof-fitness-sdk/-/echoof-fitness-sdk-1.3.0.tgz","fileCount":56,"unpackedSize":42890316,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBqBGgKTEYhJq0Ss2MAZ5nTDFgzsokJ1Z910b+cdLD+yAiEAvjZX2tgG/jl8F9ZK2qAFtHeaJ1Vxo5OZ3klnl5omPbo="}]},"_npmUser":{"name":"skua","email":"i@55u.me"},"directories":{},"maintainers":[{"name":"skua","email":"i@55u.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/echoof-fitness-sdk_1.3.0_1785834598719_0.03976784937429234"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-20T02:59:35.225Z","modified":"2026-08-04T09:09:59.275Z","1.0.0":"2026-04-20T02:59:35.345Z","1.0.2":"2026-04-21T04:17:26.565Z","1.0.3":"2026-04-21T09:36:41.632Z","1.0.4":"2026-04-21T10:08:56.153Z","1.0.6":"2026-04-22T03:23:22.856Z","1.0.7":"2026-04-22T03:31:14.868Z","1.0.8":"2026-04-22T03:46:02.374Z","1.0.9":"2026-04-22T04:05:38.176Z","1.0.10":"2026-04-22T06:51:22.112Z","1.0.12":"2026-04-22T07:56:35.445Z","1.0.13":"2026-04-22T08:04:41.742Z","1.0.14":"2026-04-22T09:01:40.571Z","1.1.1":"2026-04-24T03:26:31.268Z","1.2.1":"2026-04-24T06:46:58.730Z","1.2.3":"2026-04-24T09:58:41.278Z","1.2.6":"2026-04-24T11:17:00.631Z","1.2.7":"2026-05-06T07:46:09.634Z","1.2.8":"2026-05-06T07:53:56.089Z","1.2.9":"2026-05-06T08:03:03.152Z","1.2.10":"2026-05-06T08:12:17.207Z","1.2.11":"2026-05-06T08:17:40.052Z","1.2.13":"2026-05-06T08:37:47.623Z","1.2.14":"2026-05-12T03:53:37.726Z","1.2.15":"2026-05-13T09:05:42.537Z","1.2.16":"2026-05-14T07:47:51.238Z","1.2.17":"2026-05-18T07:45:47.421Z","1.2.18":"2026-05-19T02:50:51.529Z","1.2.20":"2026-06-02T09:48:07.462Z","1.2.21":"2026-06-08T03:44:54.877Z","1.2.22":"2026-06-09T03:02:29.573Z","1.2.23":"2026-06-09T07:51:10.826Z","1.2.24":"2026-06-09T11:21:58.888Z","1.2.25":"2026-07-16T07:44:16.117Z","1.2.27":"2026-07-27T09:55:58.709Z","1.2.28":"2026-07-27T11:40:58.895Z","1.2.29":"2026-07-28T03:28:40.094Z","1.2.30":"2026-07-28T05:29:50.415Z","1.2.31":"2026-07-28T08:10:47.996Z","1.2.32":"2026-07-28T08:29:45.472Z","1.2.33":"2026-07-28T08:50:23.472Z","1.3.0":"2026-08-04T09:09:59.111Z"},"license":"MIT","keywords":["pose-detection","fitness","movenet","skeleton","counter"],"description":"Web 运动识别计数 & 舞蹈跟练打分 SDK — 基于 TensorFlow.js MoveNet","maintainers":[{"name":"skua","email":"i@55u.me"}],"readme":"# echoof-fitness-sdk\n\nWeb 运动识别计数 SDK — 基于 TensorFlow.js MoveNet + 骨架模板匹配。\n\n## 安装\n\n```bash\nnpm install echoof-fitness-sdk\n```\n\n\n## 快速使用\n\n```html\n<video id=\"video\" playsinline muted></video>\n<canvas id=\"canvas\"></canvas>\n```\n\n```js\nimport { FitnessTracker } from 'echoof-fitness-sdk';\n\nconst tracker = new FitnessTracker({\n  videoElement: document.getElementById('video'),\n  canvasElement: document.getElementById('canvas'),\n\n  onCount(result) {\n    console.log('计数:', result.count, '分数:', result.score);\n  },\n  onProgress(info) {\n    console.log('进度:', info.phasePercent + '%');\n  },\n  onGuideStatus(status) {\n    console.log('站位:', status.status, status.reason);\n    if (status.confirmed) {\n      console.log('站位确认，开始计数');\n    }\n  },\n  onFeedback(fb) {\n    console.log('反馈:', fb.reason); // 'too_fast' | 'too_slow' | 'too_close' | 'too_far'\n  },\n  // 可选：配置 MoveNet 模型来源。默认已内置“本地优先 + CDN 兜底”，一般不用传。\n  // poseModelUrls: [\n  //   '/models/movenet-singlepose-lightning/model.json',\n  //   'https://cdn-public.community-platform.qq.com/echoof-youth/npm/public/models/movenet-singlepose-lightning/model.json',\n  // ],\n\n  onKeypoints(info) {\n    // 每次识别到骨骼点都会回调\n    // keypoints: COCO-17 关键点，x/y 已归一化到 0~1\n    console.log('骨骼点:', info.keypoints, 'bbox:', info.bbox);\n  },\n  onFps(fps) {\n    console.log('FPS:', fps);\n  },\n});\n\n// 可选：提前预热 TFJS backend + MoveNet detector，建议在用户进入页面后空闲时调用。\n// 预热不打开摄像头；后续 tracker.init() 会复用已加载模型，减少首帧等待。\n// 推荐非阻塞写法：\n// FitnessTracker.preloadInBackground();\n// 如需等待预热完成：await FitnessTracker.preload();\n\n// 1. 初始化（复用预热模型 + 启动/复用摄像头）\nawait tracker.init();\n\n// 2. 加载骨架模板（URL 支持跨域 CORS）\nawait tracker.loadTemplate('https://cdn.example.com/template.json');\n\n// 3. 开始站位引导 → 自动进入计数\ntracker.startGuide();\n\n// 或直接开始计数（跳过引导）\n// tracker.startCounting();\n\n// ====== 路径 B：无模板，使用规则识别 ======\n// 支持: arm_raise / side_lift / chest_expansion / squat / arm_swing / waist_twist / side_stretch\ntracker.startCountingByMode('squat');\n\n// 运动中动态切换动作（计数归零）\ntracker.setMode('arm_swing');\n\n// 停止并获取汇总\nconst summary = tracker.stop();\n// { totalCount: 10, avgScore: 82, bestScore: 95, worstScore: 68 }\n\n// 销毁资源\ntracker.destroy();\n```\n\n## 初始化预热\n\n首次 `tracker.init()` 慢通常来自两部分：`TFJS backend` 初始化和 `MoveNet detector` 创建。SDK 提供预热 API，可在用户还没点击“开始运动”前调用：\n\n```js\nimport { preloadPoseDetector, preloadPoseDetectorInBackground, FitnessTracker, FollowTracker } from 'echoof-fitness-sdk';\n\n// 推荐：页面进入后后台预热，不打开摄像头；当前交互栈会先释放，避免明显卡住 UI\npreloadPoseDetectorInBackground();\n\n// 或直接使用类方法\nFitnessTracker.preloadInBackground();\nFollowTracker.preloadInBackground();\n\n// 如需等待预热完成，再 await\nawait FitnessTracker.preload();\nawait FollowTracker.preload();\n\n// 如果业务自定义模型地址，预热和 tracker 初始化需使用同一组地址\nawait preloadPoseDetector({\n  poseModelUrls: [\n    '/models/movenet-singlepose-lightning/model.json',\n    'https://your-cdn.example.com/movenet/model.json',\n  ],\n});\n```\n\n说明：\n\n- 预热只加载 `TFJS backend + MoveNet detector`，不会调用 `getUserMedia`。\n- `preloadInBackground` 会用 `requestIdleCallback` / `setTimeout` 延后执行，并在重任务前后主动让出一次主线程，尽量避免阻塞当前 UI 操作。\n- 后续 `FitnessTracker.init()` / `FollowTracker.init()` 会复用同一个 detector 缓存。\n- `tracker.destroy()` 默认不释放 detector 缓存，便于下次热启动。\n- 如需主动释放模型内存，可调用 `WebPoseDetector.clearDetectorCache()`。\n\n### 分级预热（推荐）\n\n首帧耗时由几段组成，现在每段都可以独立预热、独立查询状态：\n\n| API | 覆盖阶段 | 说明 |\n| --- | --- | --- |\n| `FitnessTracker.prefetchAssets()` | ① 资源下载 | 只把 `model.json` + 权重分片灌进 Cache Storage，不碰 WebGL，最轻量 |\n| `FitnessTracker.warmupBackend()` | ③ backend | 只做 `tf.setBackend('webgl') + tf.ready()` |\n| `FitnessTracker.warmupModel()` | ②+④ | 模型下载 + 权重上传 GPU（不打开摄像头） |\n| `FitnessTracker.warmupShaders()` | ⑤ shader 编译 | 用离屏 canvas 跑 N 帧空推理，把 WebGL program 编译提前 |\n| `FitnessTracker.warmup()` | ③→②④→⑤ | 全量预热，一次搞定 |\n| `FitnessTracker.getWarmupState()` | — | 返回 `{ backend, model, shaders }`，值为 `idle/pending/ready/error` |\n\n```js\n// 首页空闲时全量预热（含 shader 编译，这段此前完全没做，是最大的一段隐形耗时）\nFitnessTracker.warmup({ warmupFrames: 2 });\n\n// 或按阶段精细控制\nawait FitnessTracker.warmupBackend();\nawait FitnessTracker.warmupModel();\nawait FitnessTracker.warmupShaders({ warmupFrames: 2 });\n\nFitnessTracker.getWarmupState();\n// { backend: 'ready', model: 'ready', shaders: 'pending' }\n```\n\n- `preloadInBackground()` 现在**默认连shader 一起预热**；如需保持旧行为传 `{ warmupShaders: false }`。\n- shader 预热结束后会调用 `detector.reset()`，清掉预热产生的 cropRegion / 时序滤波状态，不影响真实首帧。\n\n## 模型资产缓存（Cache Storage）\n\nSDK 内置了模型文件缓存，**业务方不需要再劫持 `window.fetch`**：\n\n```js\nconst tracker = new FitnessTracker({\n  videoElement,\n  // 默认即为开启，环境不支持 Cache Storage 时自动降级为普通 fetch\n  assetCache: { enabled: true, cacheName: 'echoof-model-v1' },\n});\n```\n\n实现方式是给 MoveNet 传自定义 `tf.io.IOHandler`（`modelUrl` 支持 `string | tf.io.IOHandler`），因此：\n\n- 命中缓存时**零网络请求、零 304**（`.bin` 回源校验每个文件白等 200~300ms 的问题不再存在）；\n- 所有权重分片**并行下载**，配合 1MB 重分片收益明显；\n- 不污染全局 `fetch`，不会和 Aegis api 插件、其他 SDK 的 fetch 包装互相叠加；\n- 不靠 URL 子串硬匹配，换模型不会失效。\n\n配套API：\n\n```js\nimport {\n  prefetchModelAssets,   // 只预热文件到 Cache Storage\n  getAssetCacheStats,    // 真机排查：{ hits, misses, writes, files }\n  clearModelAssetCache,  // 清空缓存\n} from 'echoof-fitness-sdk';\n\nFitnessTracker.prefetchAssets();// 首页空闲期调用\ngetAssetCacheStats();                  // 进运动页后看 hits 是否命中\nawait clearModelAssetCache('echoof-model-v1');\n```\n\n> 换模型 / 换量化版本时，把 `cacheName` 升一版（如 `echoof-model-v2`）即可让旧缓存整体失效。\n\n## 帧率节流（低端机必看）\n\n默认跟随 `requestAnimationFrame` 全速推理，低端机会占满 GPU、画面掉帧、机身发烫。可设上限：\n\n```js\nconst tracker = new FitnessTracker({ videoElement, targetFps: 15 });\ntracker.setTargetFps(20); // 运行期可动态调整；0 表示不限制\n```\n\n小程序侧 `frameSkip = 5` 约等于 12fps，H5 建议 15~20。\n\n## 模型体积优化（量化 + 重分片）\n\n内置脚本，纯 Node 实现，**不需要 Python / tensorflowjs_converter**：\n\n```bash\nnpm run optimize:model -- \\\n  --in public/models/movenet-singlepose-lightning \\\n  --out models-optimized/movenet-singlepose-lightning-int8 \\\n  --quantize uint8 \\\n  --shard-size 1048576 \\\n  --auto-fallback 0.05 \\\n  --verify\n```\n\n> 产物请输出到 `models-optimized/`（不在 npm `files` 白名单内）。\n> 不要输出到 `public/` —— vite 会把 `publicDir` 复制进 `dist`，导致 npm 包白增 2.5MB。\n\n| 参数 | 说明 |\n| --- | --- |\n| `--quantize` | `uint8` / `uint16` / `float16` / `none` |\n| `--shard-size` | 分片字节数，默认 1MB（便于并行下载） |\n| `--auto-fallback <err>` | 量化误差超过该值的层自动降级为 float16（混合量化，强烈建议开启） |\n| `--skip a,b` | 指定权重名跳过量化 |\n| `--verify` | 反量化后与原权重逐张比对，打印最大绝对误差 + 余弦相似度 |\n\n实测（MoveNet SinglePose Lightning）：\n\n| 方案 | 体积 | 分片 | 最大绝对误差 | 余弦相似度 |\n| --- | --- | --- | --- | --- |\n| 官方发布版（**已是 float16 量化**） | 4.60MB | 1×4MB + 1×0.45MB | — | — |\n| `uint8` | 2.37MB | 3× ≤1MB | 7.4e-1 | 0.9999033 |\n| `uint8--auto-fallback 0.05` **推荐** | 2.50MB | 3 × ≤1MB | 5.0e-2 | 0.9999968 |\n\n> ⚠️ 注意：官方发布的 4.6MB 版本**本身就是 float16 量化**（`weightsManifest` 里 149/180 个权重带\n> `quantization: { dtype: 'float16' }`），参数量为 2.32M。因此各方案的体积下限是\n> float32 9.3MB / float16 4.65MB / uint8 2.32MB —— **1.2MB 在数学上不可达**，\n> 目标应定为≈2.4MB。\n\n配套 CDN 配置（这一步收益和量化同等重要）：\n\n```\nCache-Control: public, max-age=31536000, immutable\n```\n\n- 路径带版本号（如 `/models/movenet-lightning-int8-v1/`），配合 `immutable` 连 304 都不会有；\n- `model.json` 开启 gzip/br：实测 163KB → **7.4KB**；\n- `.bin` 是二进制权重，不必压缩。\n\n## 骨骼点回调与文件导出\n\n如果业务侧需要拿到每帧识别出的骨骼点，可传 `onKeypoints`：\n\n```js\nconst tracker = new FitnessTracker({\n  videoElement,\n  canvasElement,\n  onKeypoints(info) {\n    console.log(info.keypoints); // COCO-17，x/y 已归一化到 0~1\n    console.log(info.bbox);      // 识别到的人体框（归一化坐标）\n    console.log(info.state);     // idle / guiding / counting ...\n  },\n});\n```\n\n`FollowTracker` 也支持同名回调：\n\n```js\nconst follow = new FollowTracker({\n  videoElement,\n  canvasElement,\n  onKeypoints(info) {\n    console.log(info.keypoints);\n  },\n});\n```\n\n回调数据结构：\n\n```ts\n{\n  keypoints: Array<{ x: number; y: number; score: number }>;\n  bbox: { x: number; y: number; width: number; height: number } | null;\n  timestamp: number;\n  videoWidth: number;\n  videoHeight: number;\n  state: string;\n}\n```\n\n### 记录并导出骨骼点 TXT 文件\n\n如果需要像小程序 `run-detail` 一样把骨骼点收集起来并提供给使用者下载，可开启 `recordKeypoints`，或手动调用 `startKeypointRecording()`。\n\n#### 自动记录\n\n```js\nconst tracker = new FitnessTracker({\n  videoElement,\n  canvasElement,\n  recordKeypoints: true,          // 初始化后自动开始记录\n  keypointRecordIntervalMs: 200,  // 可选：默认 200ms，约等于小程序 frameSkip=5\n  keypointRecordMaxFrames: 1500,  // 可选：默认 1500，和小程序 maxCacheSize 对齐\n});\n\nawait tracker.init();\ntracker.startCountingByMode('side_lift');\n\n// 运动结束后，直接下载 TXT 文件\ntracker.downloadKeypoints('side-lift-keypoints.txt');\n```\n\n#### 手动开始/停止记录\n\n```js\nconst tracker = new FitnessTracker({ videoElement, canvasElement });\nawait tracker.init();\n\ntracker.startKeypointRecording(); // 开始记录，默认清空历史\ntracker.startCountingByMode('side_lift');\n\n// ...运动中\n\ntracker.stopKeypointRecording();\n\n// 方式 1：下载 TXT 文件\ntracker.downloadKeypoints('keypoints.txt');\n\n// 方式 2：拿到记录数组，业务方自行上传\nconst records = tracker.exportKeypoints();\n\n// 方式 3：拿到 TXT 文本内容\nconst text = tracker.exportKeypointsText();\n\n// 方式 4：拿到 Blob，业务方自行上传到 COS/OSS\nconst blob = tracker.exportKeypointsBlob();\n\n// 方式 5：拿到 File 对象，适合 FormData 上传；FollowTracker 默认文件名为 follow-keypoints.txt\nconst file = tracker.getKeypointsFile('fitness-keypoints.txt');\nconst formData = new FormData();\nformData.append('file', file);\n```\n\n#### 默认记录 count / quality\n\n开启记录后，SDK 会默认写入类似小程序 `setConsole` 的业务记录：\n\n```txt\n{\n  \"stmp\": 1710000000000,\n  \"data\": { \"count\": 1 }\n}\n\n{\n  \"stmp\": 1710000001000,\n  \"data\": { \"quality\": { \"status\": \"warning\", \"reason\": \"too_fast\" } }\n}\n```\n\n#### 手动插入 recordBehavior\n\nSDK 提供了和小程序一致的行为枚举，业务方可以在需要的位置手动插入：\n\n```js\nimport { BEHAVIOR_TYPES } from 'echoof-fitness-sdk';\n\ntracker.recordBehavior(BEHAVIOR_TYPES.START);\ntracker.recordBehavior(BEHAVIOR_TYPES.PAUSE);\ntracker.recordBehavior(BEHAVIOR_TYPES.RESUME);\ntracker.recordBehavior(BEHAVIOR_TYPES.COMPLETE);\ntracker.recordBehavior(BEHAVIOR_TYPES.EXIT);\ntracker.recordBehavior(BEHAVIOR_TYPES.EXIT_BACKGROUND);\ntracker.recordBehavior(BEHAVIOR_TYPES.PAUSE_AUTO);\ntracker.recordBehavior(BEHAVIOR_TYPES.UNSPECIFIED);\n```\n\n也可以直接调用便捷方法：\n\n```js\ntracker.recordBehaviorStart(); //开始\ntracker.recordBehaviorPause(); // 暂停 \ntracker.recordBehaviorResume(); // 恢复\ntracker.recordBehaviorComplete(); // 完成\ntracker.recordBehaviorExit(); // 退出     \ntracker.recordBehaviorExitBackground();     // 退出后台\ntracker.recordBehaviorPauseAuto();        // 自动暂停     \ntracker.recordBehaviorUnspecified();    // 未指定 \n```\n\n如果有自定义数据，也可以插入任意 `data`：\n\n```js\ntracker.recordConsole({ customEvent: 'xxx', value: 123 });\n```\n\n`FollowTracker` 同样支持：\n\n```js\nconst follow = new FollowTracker({\n  videoElement,\n  canvasElement,\n  recordKeypoints: true,\n});\n\n// 结束后下载\nfollow.downloadKeypoints('follow-keypoints.txt');\n\n// 或获取 follow-keypoints.txt 文件对象\nconst file = follow.getKeypointsFile('follow-keypoints.txt');\n```\n\n导出的 TXT 内容与小程序 `run-detail/test.txt` 对齐：多条 JSON 记录用空行分隔，每条记录只包含 `stmp` 和 `data` 两个字段。\n\n```txt\n{\n  \"stmp\": 1710000000000,\n  \"data\": [\n    { \"x\": 0.512, \"y\": 0.234, \"score\": 0.987 },\n    ...\n  ]\n}\n\n{\n  \"stmp\": 1710000000100,\n  \"data\": [\n    { \"x\": 0.514, \"y\": 0.236, \"score\": 0.982 },\n    ...\n  ]\n}\n```\n\n其中 `x / y / score` 默认保留 3 位小数。\n\n## 模板 / 教学序列的跨域要求（行为变更）\n\n`loadTemplate()` / `loadSequence()` 传URL 时，SDK 只做**直连 + 15s 超时 + 明确报错**。\n\n此前实现会在直连失败后串行尝试两个公网 CORS 代理（`api.allorigins.win`、`corsproxy.io`），已移除：\n\n- **安全**：业务模板 URL 及其内容经由不受控的第三方转发，返回体又直接 `JSON.parse` 进计数逻辑，构成内容泄露与供应链/中间人风险；\n- **性能**：直连失败时要串行等两个境外代理超时，是「偶发卡十几秒」的隐藏来源，而且原来`catch` 为空、完全静默，无法定位。\n\n因此请确保：模板 JSON 与模型**同源部署**，或由业务方 CDN 配好 `Access-Control-Allow-Origin`。\n若业务侧确实需要代理，请在自己可控的服务端做，并把代理后的 URL 传给 SDK。\n\n## MoveNet 模型来源配置\n\nSDK 初始化时需要加载 MoveNet 模型文件（`model.json` + 两个 `bin` 权重分片）。默认策略是：\n\n1. **优先本地**：`/models/movenet-singlepose-lightning/model.json`\n2. **失败后 CDN 兜底**：`https://cdn-public.community-platform.qq.com/echoof-youth/npm/public/models/movenet-singlepose-lightning/model.json`\n\n也就是说，如果用户使用 npm 包内 `demo/`，模型文件已经放在：\n\n```text\ndemo/models/movenet-singlepose-lightning/\n├── model.json\n├── group1-shard1of2.bin\n└── group1-shard2of2.bin\n```\n\n直接 `npm install && npm run dev` 即可，本地模型会先被请求。\n\n### 方式 A：使用默认配置（推荐）\n\n```js\nconst tracker = new FitnessTracker({\n  videoElement,\n  canvasElement,\n});\n```\n\n等价于：\n\n```js\nconst tracker = new FitnessTracker({\n  videoElement,\n  canvasElement,\n  poseModelUrls: [\n    '/models/movenet-singlepose-lightning/model.json',\n    'https://cdn-public.community-platform.qq.com/echoof-youth/npm/public/models/movenet-singlepose-lightning/model.json',\n  ],\n});\n```\n\n### 方式 B：只走 CDN\n\n如果你的项目不想放本地模型文件，**只配置 CDN 地址，不要把 `/models/...` 本地地址放进 `poseModelUrls`**。\n\n#### FitnessTracker\n\n```js\nconst tracker = new FitnessTracker({\n  videoElement,\n  canvasElement,\n\n  // 只走 CDN：不会请求 /models/movenet-singlepose-lightning/model.json\n  poseModelUrl: 'https://cdn-public.community-platform.qq.com/echoof-youth/npm/public/models/movenet-singlepose-lightning/model.json',\n});\n```\n\n也可以写成数组形式（数组里只放 CDN）：\n\n```js\nconst tracker = new FitnessTracker({\n  videoElement,\n  canvasElement,\n\n  poseModelUrls: [\n    'https://cdn-public.community-platform.qq.com/echoof-youth/npm/public/models/movenet-singlepose-lightning/model.json',\n  ],\n});\n```\n\n#### FollowTracker\n\n```js\nconst follow = new FollowTracker({\n  videoElement,\n  canvasElement,\n\n  // 只走 CDN\n  poseModelUrl: 'https://cdn-public.community-platform.qq.com/echoof-youth/npm/public/models/movenet-singlepose-lightning/model.json',\n});\n```\n\n> 优先级：`poseModelUrls` > `poseModelUrl` > SDK 默认值。如果配置了 `poseModelUrls`，SDK 会完全按数组顺序尝试。\n\n### 方式 C：只走本地\n\n把模型目录放到站点根路径下：\n\n```text\npublic/models/movenet-singlepose-lightning/\n├── model.json\n├── group1-shard1of2.bin\n└── group1-shard2of2.bin\n```\n\n然后：\n\n```js\nconst tracker = new FitnessTracker({\n  videoElement,\n  canvasElement,\n  poseModelUrls: [\n    '/models/movenet-singlepose-lightning/model.json',\n  ],\n});\n```\n\n### 方式 D：自定义本地优先 + 自有 CDN 兜底\n\n```js\nconst tracker = new FitnessTracker({\n  videoElement,\n  canvasElement,\n  poseModelUrls: [\n    '/models/movenet-singlepose-lightning/model.json',\n    'https://your-cdn.example.com/models/movenet-singlepose-lightning/model.json',\n  ],\n});\n```\n\n> 注意：`model.json` 和两个 `group1-shard*.bin` 必须在同一目录下。`model.json` 内部使用相对路径引用权重分片。\n\n`FollowTracker` 同样支持 `poseModelUrl` / `poseModelUrls`：\n\n```js\nconst follow = new FollowTracker({\n  videoElement,\n  canvasElement,\n  poseModelUrls: [\n    '/models/movenet-singlepose-lightning/model.json',\n    'https://your-cdn.example.com/models/movenet-singlepose-lightning/model.json',\n  ],\n});\n```\n\n## 舞蹈跟练打分（FollowTracker）\n\n`FitnessTracker` 适合“固定动作循环计数”（开合跳、深蹲等），而 `FollowTracker` 专为**舞蹈/操类跟练**设计：跟着教学视频做，实时相似度打分 + 反馈。\n\n它与 `FitnessTracker` 共享底层（摄像头、MoveNet、骨骼绘制、语音），只是把**计数引擎**换成了 **MotionMatcher**（节奏自适应 DTW + 关键帧加权 + 分数平滑）。\n\n### 快速上手\n\n```ts\nimport { FollowTracker } from 'echoof-fitness-sdk';\n\nconst follow = new FollowTracker({\n  videoElement: document.querySelector('#camera'),       // 摄像头\n  canvasElement: document.querySelector('#canvas'),      // 骨骼叠加\n  teachingVideoElement: document.querySelector('#teacher'), // 教学视频（可选）\n  countdownSeconds: 3,\n  voiceFeedback: true,\n\n  onCountdown: (left) => console.log(`倒计时 ${left}`),\n  onScore:    ({ currentScore, avgScore, progressPercent }) => {\n    // currentScore: 平滑后的实时分（0-100）\n    // avgScore: 累计均分\n    // progressPercent: 进度 0-100\n  },\n  onFeedback: ({ message, level, partScores, highlightParts }) => {\n    // message: 文字提示，如\"左手再高一点\"\n    // level:   'excellent' | 'good' | 'fair' | 'poor'\n    // partScores: { leftElbow: 0.85, ... } —— 可用来给骨骼部位染色\n  },\n  onKeyframe: ({ score, level, center }) => {\n    // 触发关键帧特效：在 center 处弹出分数\n  },\n  onEnd: (summary) => {\n    // summary.averageScore / summary.levelPercents.excellent ...\n  },\n});\n\nawait follow.init();\nawait follow.loadSequence('https://cdn/xxx_skeleton.json'); // 骨架 JSON URL 或对象\nfollow.start();                // 倒计时 → 播教学视频 → 开始打分\nfollow.pause(); follow.resume();\nfollow.stop();                 // 结束并返回 summary\nfollow.destroy();\n```\n\n### 说明\n\n- **教学序列**是一份骨架 JSON（含 `frames` 数组 + `duration`），通常由业务方离线处理教学视频得到。\n- **教学视频**可选：\n  - 传入：视频 `currentTime` 驱动匹配时间，严格对齐。\n  - 不传：SDK 用墙钟时间驱动循环。\n- **matcherOptions**：如需精调，可透传到底层 `MotionMatcher`，详见源码 `src/utils/MotionMatcher.js` 顶部参数表。\n- 支持 `type: 'hand'` 的手部跟练序列（内部自动切换权重）。\n\n### 与 FitnessTracker 的关系\n\n| 场景 | 用哪个 |\n|---|---|\n| 开合跳 / 深蹲 / 甩手等**循环动作计数** | `FitnessTracker` |\n| 跟着一段舞蹈/操**整套动作相似度打分** | `FollowTracker` |\n\n两者可同时 new 使用，但共用同一个摄像头 video 元素时建议只开一个。\n\n### 子入口：只用跟练时按需引入\n\n```js\n// 只做跟练打分的页面：从子入口引入，不会带上计数器家族\nimport { FollowTracker } from 'echoof-fitness-sdk/follow';\n```\n\n`lib` 版已改为多入口构建，`FollowTracker` 会被打成独立 chunk：\n\n| 产物 | 体积 | 说明 |\n| --- | --- | --- |\n| `dist/index.mjs` | 167KB（gzip 47.5KB） | FitnessTracker 主入口，不含跟练逻辑 |\n| `dist/chunks/FollowTracker-*.mjs` | 97.6KB（gzip 30.7KB） | 跟练逻辑，按需加载 |\n| `dist/follow.mjs` | 0.6KB | 子入口 |\n\n主入口仍然`export { FollowTracker }`（向后兼容），但它已经是纯 re-export，\n只用 `FitnessTracker` 时打包器会直接 tree-shake 掉那97.6KB。\n\n### 消费方chunk 拆分建议\n\n不要把 SDK 和 tfjs 打进同一个 chunk —— SDK 升一个小版本会导致整块（约 2MB）缓存全部失效：\n\n```ts\n// vite.config.ts\nmanualChunks: {\n  //tfjs 永不变，单独一块，长期缓存\n  'tfjs-vendor': [\n    '@tensorflow/tfjs-core',\n    '@tensorflow/tfjs-converter',\n    '@tensorflow/tfjs-backend-webgl',\n    '@tensorflow/tfjs-backend-webgpu',\n    '@tensorflow-models/pose-detection',\n  ],\n  // SDK 业务逻辑，版本升级只失效这一小块\n  'fitness-sdk': ['echoof-fitness-sdk'],\n}\n```\n\n## API\n\n### `new FitnessTracker(options)`\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| `videoElement` | `HTMLVideoElement` | **必填** 摄像头视频元素 |\n| `canvasElement` | `HTMLCanvasElement` | 骨骼绘制画布（可选） |\n| `drawSkeleton` | `boolean` | 是否绘制骨骼（默认 true） |\n| `guideMode` | `'fullBody' \\| 'upperBody'` | 引导模式（默认 fullBody） |\n| `guideConfirmFrames` | `number` | 确认帧数（默认 15） |\n| `counterConfig` | `object` | 模板计数器配置覆盖 |\n| `recognitionMode` | `RecognitionMode` | 规则识别模式（无模板时使用），见下方支持的模式 |\n| `voiceFeedback` | `boolean \\| VoiceFeedbackOptions` | 语音反馈（默认关闭）。传 `true` 启用内置语音；传对象可自定义音频/音量/冷却期 |\n| `assetCache` | `boolean \\| AssetCacheOptions` | 模型资产缓存（Cache Storage），默认开启 |\n| `targetFps` | `number` | 检测帧率上限，默认 0（不限制），低端机建议 15~20 |\n| `onCount` | `(result) => void` | 计数回调 |\n| `onProgress` | `(info) => void` | 进度回调 |\n| `onGuideStatus` | `(status) => void` | 站位引导状态回调 |\n| `onFeedback` | `(fb) => void` | 动作反馈回调 |\n| `onFps` | `(fps) => void` | 帧率回调 |\n| `onStateChange` | `(state) => void` | 状态变更回调 |\n| `onError` | `(err) => void` | 错误回调 |\n\n### 方法\n\n| 方法 | 说明 |\n|------|------|\n| `init()` | 初始化模型 + 摄像头（两者**并行**执行） |\n| `loadTemplate(url \\| object)` | 加载骨架模板（URL 需资源侧配好 CORS，SDK 不再走公网代理） |\n| `startGuide()` | 开始站位引导，确认后自动进入计数 |\n| `startCounting()` | 直接开始计数（有模板走模板，无模板走 recognitionMode） |\n| `startCountingByMode(mode)` | 按规则识别模式开始计数（无需模板） |\n| `setMode(mode)` | 动态切换识别模式（计数归零，仅规则计数时有效） |\n| `setTargetFps(fps)` | 动态设置检测帧率上限，0 表示不限制（低端机建议 15~20） |\n| `stop()` | 停止，返回汇总 `{ totalCount, avgScore, bestScore, worstScore }` |\n| `destroy()` | 销毁所有资源 |\n| `resetCount()` | 重置计数 |\n| `setVoiceEnabled(enabled)` | 开启/关闭语音反馈（即使 options 未启用也可以后续开启） |\n| `setVoiceAudio(reason, url)` | 替换或新增单个 reason 的语音音频 URL（传一个 URL 即可） |\n| `getVoiceFeedback()` | 获取语音反馈实例（可调用 `setVolume` / `setEnabled` / `play` 等） |\n\n### 静态方法（预热 / 缓存）\n\n| 方法 | 说明 |\n|------|------|\n| `FitnessTracker.warmup(opts?)` | 全量预热：backend → 模型 → shader |\n| `FitnessTracker.warmupBackend()` | 只初始化 TFJS backend |\n| `FitnessTracker.warmupModel(opts?)` | 模型下载 + 权重上传 GPU |\n| `FitnessTracker.warmupShaders(opts?)` | WebGL shader 预热（`warmupFrames` 默认 2） |\n| `FitnessTracker.prefetchAssets(opts?)` | 只把模型文件灌进 Cache Storage，不碰 WebGL |\n| `FitnessTracker.getWarmupState()` | `{ backend, model, shaders }`，值为 `idle/pending/ready/error` |\n| `FitnessTracker.preload(opts?)` | backend + 模型（等价旧行为） |\n| `FitnessTracker.preloadInBackground(opts?)` | 空闲期预热，**默认已含 shader**；`{ warmupShaders: false }` 可关 |\n\n`FollowTracker` 拥有同名的全部静态方法。\n\n### 属性\n\n| 属性 | 类型 | 说明 |\n|------|------|------|\n| `state` | `string` | 当前状态：idle / initializing / ready / guiding / counting / stopped |\n| `count` | `number` | 当前计数 |\n\n### 高级：直接使用子模块\n\n```js\nimport {\n  WebPoseDetector,\n  TemplateCycleCounter,\n  StandingGuideLogic,\n  VisionMotionAnalyzer,\n  VoiceFeedback,\n  drawSkeleton,\n  computeFullFeatures,\n  BONES, KEYPOINTS,\n  // 模型资产缓存（Cache Storage）\n  createCachedModelIOHandler,\n  prefetchModelAssets,\n  clearModelAssetCache,\n  getAssetCacheStats,\n  // 默认模型地址常量 & JSON 加载器\n  DEFAULT_LOCAL_POSE_MODEL_URL,\n  DEFAULT_CDN_POSE_MODEL_URL,\n  DEFAULT_POSE_MODEL_URLS,\n  fetchJSON,\n} from 'echoof-fitness-sdk';\n```\n\n## 语音反馈（可选）\n\n开启后，SDK 会在检测到对应反馈 `reason` 时自动播放内置中文语音（同一 reason 2 秒内不会重复）。\n\n```js\n// ⚡ 最简：启用默认语音\nconst tracker = new FitnessTracker({ /* ... */, voiceFeedback: true });\n```\n\n### 三种自定义方式（由简到全）\n\n```js\n// 1️⃣ 只换 CDN 前缀：所有内置音频自动走你的 CDN（文件名与默认一致）\nvoiceFeedback: {\n  audioBaseUrl: 'https://my-cdn.com/voice',\n}\n\n// 2️⃣ 只换个别文件名：保留 audioBaseUrl，单独覆盖某些 reason 的文件名\nvoiceFeedback: {\n  audioBaseUrl: 'https://my-cdn.com/voice',\n  fileNameMap: {\n    too_fast: 'my_too_fast_v2.mp3',    // 最终 URL: https://my-cdn.com/voice/my_too_fast_v2.mp3\n  },\n}\n\n// 3️⃣ 传完整 URL：每个 reason 独立一个完整 URL，最高优先级\nvoiceFeedback: {\n  audioMap: {\n    too_fast: 'https://other-cdn/foo.mp3',\n  },\n}\n```\n\n### 运行时替换单个音频（最常用 —— 传一个 URL 即可）\n\n```js\n// 覆盖内置 reason\ntracker.setVoiceAudio('too_fast', 'https://my-cdn.com/too_fast.mp3');\n\n// 新增自定义 reason\ntracker.setVoiceAudio('custom_tip', 'https://my-cdn.com/custom.mp3');\n// 之后当 onFeedback 的 reason === 'custom_tip' 时会自动播放\n```\n\n### 运行时控制\n\n```js\ntracker.setVoiceEnabled(false);           // 关闭\ntracker.setVoiceEnabled(true);            // 重新开启\ntracker.getVoiceFeedback()?.setVolume(0.5);\ntracker.getVoiceFeedback()?.getAudioMap(); // 查看当前所有 URL 映射\n```\n\n### 内置支持的 reason\n\n`too_fast`、`too_slow`、`too_close`、`too_far`、`insufficient_range`、`wrong_direction`、`missing_lower`、`missing_upper`、`missing_head`、`missing_hand`\n\n## 运行 Demo\n\nnpm 包内自带完整 demo 项目（`demo/`）— 一个独立的 Vite 项目，3 步即可运行：\n\n```bash\ncd node_modules/echoof-fitness-sdk/demo\nnpm install\nnpm run dev\n# 自动打开 http://localhost:3304\n```\n\n详细说明见 `demo/README.md`。\n\n> 本仓库开发时 `npm run dev` 会打开 `local_demo/index.html`，顶部 Tab 可在「动作计数」与「舞蹈跟练」之间切换，源码修改实时热更新。\n\n## 骨架模板格式\n\n```json\n{\n  \"frames\": [\n    {\n      \"keypoints\": [{\"x\": 0.5, \"y\": 0.3, \"score\": 0.9}, ...],\n      \"features\": {\"angles\": {...}, \"relativePositions\": {...}},\n      \"timestamp\": 0\n    }\n  ],\n  \"duration\": 3000,\n  \"frameCount\": 15,\n  \"type\": \"body\"\n}\n```\n\n## 技术栈\n\n- TensorFlow.js + MoveNet (SinglePose Lightning)\n- 纯 TypeScript，无框架依赖\n- 骨架模板匹配计数引擎（TemplateCycleCounter）\n- 站位引导状态机（StandingGuideLogic）\n- 动作质量反馈（TemplateCounterFeedback）\n","readmeFilename":"README.md"}