{"_id":"@cariva/vislife-health-sdk-rn","_rev":"10-65d5514c770f944081193f77f9c3fe5f","name":"@cariva/vislife-health-sdk-rn","dist-tags":{"latest":"0.1.3"},"versions":{"0.0.22":{"name":"@cariva/vislife-health-sdk-rn","version":"0.0.22","keywords":["react-native","ios","android"],"author":{"url":"https://cariva.com","name":"Cariva","email":"dev@cariva.com"},"license":"MIT","_id":"@cariva/vislife-health-sdk-rn@0.0.22","maintainers":[{"name":"piyawatcariva","email":"piyawak@cariva.co.th"},{"name":"patcharas.cariva","email":"patcharas@cariva.co.th"},{"name":"menner159","email":"kraisornk@cariva.co.th"}],"homepage":"https://github.com/cariva/cariva-exercise-sdk#readme","bugs":{"url":"https://github.com/cariva/cariva-exercise-sdk/issues"},"dist":{"shasum":"813be3effb8d387c8791e28ec363b33ce34d79bc","tarball":"https://registry.npmjs.org/@cariva/vislife-health-sdk-rn/-/vislife-health-sdk-rn-0.0.22.tgz","fileCount":110,"integrity":"sha512-IhTPMdWg3nrZ1lRATsb4IqhKWqcGhvuJMqruDQpMrqBxU6OcleVn1VK7wNxq932pqDpVf4Ef1YDJ0ata3T+CrA==","signatures":[{"sig":"MEUCIQDcGPWcRQog0TND7l9WUO/OFQmgF3XtQwjJoX+TwxHzPQIgOTnlKfg0F8M1/JqP+RoFh4T6lazI1I+by4TvrV0+kzA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":373955},"main":"./lib/module/index.js","_from":"file:cariva-vislife-health-sdk-rn-0.0.22.tgz","types":"./lib/typescript/src/index.d.ts","exports":{".":{"types":"./lib/typescript/src/index.d.ts","source":"./src/index.tsx","default":"./lib/module/index.js"},"./package.json":"./package.json"},"scripts":{"lint":"eslint \"**/*.{js,ts,tsx}\"","test":"jest","clean":"del-cli android/build example/android/build example/android/app/build example/ios/build lib","example":"yarn workspace cariva-exercise-sdk-example","prepare":"bob build","typecheck":"tsc","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"yarn clean && yarn prepare"},"_npmUser":{"name":"piyawatcariva","email":"piyawak@cariva.co.th"},"prettier":{"useTabs":false,"tabWidth":2,"quoteProps":"consistent","singleQuote":true,"trailingComma":"es5"},"_resolved":"/Users/piyawatkunama/mor/exercise-sdk/cariva-vislife-health-sdk-rn-0.0.22.tgz","_integrity":"sha512-IhTPMdWg3nrZ1lRATsb4IqhKWqcGhvuJMqruDQpMrqBxU6OcleVn1VK7wNxq932pqDpVf4Ef1YDJ0ata3T+CrA==","repository":{"url":"git+https://github.com/cariva/cariva-exercise-sdk.git","type":"git"},"workspaces":["example"],"_npmVersion":"11.12.1","description":"Cariva exercise SDK","directories":{},"_nodeVersion":"20.19.6","codegenConfig":{"name":"CarivaExerciseSdkSpec","type":"modules","android":{"javaPackageName":"com.carivaexercisesdk"},"jsSrcsDir":"src"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"yarn@4.11.0","devDependencies":{"jest":"^29.7.0","react":"19.2.0","turbo":"^2.5.6","eslint":"^9.35.0","del-cli":"^6.0.0","prettier":"^2.8.8","@eslint/js":"^9.35.0","babel-jest":"^29.7.0","typescript":"^5.9.2","@babel/core":"^7.25.2","@types/react":"^19.2.0","react-native":"0.83.0","@eslint/compat":"^1.3.2","@eslint/eslintrc":"^3.3.1","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","react-native-builder-bob":"^0.40.18","@react-native/babel-preset":"0.83.0","@react-native/eslint-config":"0.83.0"},"peerDependencies":{"react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/vislife-health-sdk-rn_0.0.22_1782792575445_0.8676858276945165","host":"s3://npm-registry-packages-npm-production"},"react-native-builder-bob":{"output":"lib","source":"src","targets":[["module",{"esm":true}],["typescript",{"project":"tsconfig.build.json"}]]},"create-react-native-library":{"type":"turbo-module","tools":["eslint"],"version":"0.57.2","languages":"kotlin-objc"}},"0.0.23":{"name":"@cariva/vislife-health-sdk-rn","version":"0.0.23","keywords":["react-native","ios","android"],"author":{"url":"https://cariva.com","name":"Cariva","email":"dev@cariva.com"},"license":"MIT","_id":"@cariva/vislife-health-sdk-rn@0.0.23","maintainers":[{"name":"piyawatcariva","email":"piyawak@cariva.co.th"},{"name":"patcharas.cariva","email":"patcharas@cariva.co.th"},{"name":"menner159","email":"kraisornk@cariva.co.th"}],"homepage":"https://github.com/cariva/cariva-exercise-sdk#readme","bugs":{"url":"https://github.com/cariva/cariva-exercise-sdk/issues"},"dist":{"shasum":"67733d83fc2d0f02a9c5e248a599ca1c52eb0f64","tarball":"https://registry.npmjs.org/@cariva/vislife-health-sdk-rn/-/vislife-health-sdk-rn-0.0.23.tgz","fileCount":111,"integrity":"sha512-ecEr6EgFBuCbBY3nQKOA7x+OPQ/0Kzn8U1GDxbkW8cjibScNla0TjgeReJZTwIRLYoXep3LG2LvrdvCvtfsNkA==","signatures":[{"sig":"MEYCIQDCcOGEtRhAb+2VCRyfVhtmpvgRnJNYuIuWncXe8MIinwIhAN6GmRoh6y4jEfb627m4NpollZ8g4eS+xzywD420aoHg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":382500},"main":"./lib/module/index.js","types":"./lib/typescript/src/index.d.ts","exports":{".":{"types":"./lib/typescript/src/index.d.ts","source":"./src/index.tsx","default":"./lib/module/index.js"},"./package.json":"./package.json"},"gitHead":"0dcc060c2c60fe2227bd375118f16d45a51efa22","scripts":{"lint":"eslint \"**/*.{js,ts,tsx}\"","test":"jest","clean":"del-cli android/build example/android/build example/android/app/build example/ios/build lib","example":"yarn workspace cariva-exercise-sdk-example","prepare":"bob build","typecheck":"tsc","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"yarn clean && yarn prepare"},"_npmUser":{"name":"piyawatcariva","email":"piyawak@cariva.co.th"},"prettier":{"useTabs":false,"tabWidth":2,"quoteProps":"consistent","singleQuote":true,"trailingComma":"es5"},"repository":{"url":"git+https://github.com/cariva/cariva-exercise-sdk.git","type":"git"},"workspaces":["example"],"_npmVersion":"11.12.1","description":"Cariva exercise SDK","directories":{},"_nodeVersion":"20.19.6","codegenConfig":{"name":"CarivaExerciseSdkSpec","type":"modules","android":{"javaPackageName":"com.carivaexercisesdk"},"jsSrcsDir":"src"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"yarn@4.11.0","devDependencies":{"jest":"^29.7.0","react":"19.2.0","turbo":"^2.5.6","eslint":"^9.35.0","del-cli":"^6.0.0","prettier":"^2.8.8","@eslint/js":"^9.35.0","babel-jest":"^29.7.0","typescript":"^5.9.2","@babel/core":"^7.25.2","@types/react":"^19.2.0","react-native":"0.83.0","@eslint/compat":"^1.3.2","@eslint/eslintrc":"^3.3.1","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","react-native-builder-bob":"^0.40.18","@react-native/babel-preset":"0.83.0","@react-native/eslint-config":"0.83.0"},"peerDependencies":{"react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/vislife-health-sdk-rn_0.0.23_1783421084644_0.8865007544525383","host":"s3://npm-registry-packages-npm-production"},"react-native-builder-bob":{"output":"lib","source":"src","targets":[["module",{"esm":true}],["typescript",{"project":"tsconfig.build.json"}]]},"create-react-native-library":{"type":"turbo-module","tools":["eslint"],"version":"0.57.2","languages":"kotlin-objc"}},"0.0.24":{"name":"@cariva/vislife-health-sdk-rn","version":"0.0.24","keywords":["react-native","ios","android"],"author":{"url":"https://cariva.com","name":"Cariva","email":"dev@cariva.com"},"license":"MIT","_id":"@cariva/vislife-health-sdk-rn@0.0.24","maintainers":[{"name":"piyawatcariva","email":"piyawak@cariva.co.th"},{"name":"patcharas.cariva","email":"patcharas@cariva.co.th"},{"name":"menner159","email":"kraisornk@cariva.co.th"}],"homepage":"https://github.com/cariva/cariva-exercise-sdk#readme","bugs":{"url":"https://github.com/cariva/cariva-exercise-sdk/issues"},"dist":{"shasum":"791cf79be5dfc5569482ed05d2be1144780537e5","tarball":"https://registry.npmjs.org/@cariva/vislife-health-sdk-rn/-/vislife-health-sdk-rn-0.0.24.tgz","fileCount":111,"integrity":"sha512-Dv19TYalhvzUjwqhZSso6GTeN1xi6FP+ouEp0v4Ab1OswQODj5umjn7ZOQdLbWU4N/vyBBL4w9FeHa9wC/4lVQ==","signatures":[{"sig":"MEYCIQDhvnpG5ehC4+UuPJnmUULp1WCYF0dRHKD7oU26/rKOhAIhANPW/S3aAiezPCGuy+hrMHoQV4x/MmZptSszi7BhJjSq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":384396},"main":"./lib/module/index.js","types":"./lib/typescript/src/index.d.ts","exports":{".":{"types":"./lib/typescript/src/index.d.ts","source":"./src/index.tsx","default":"./lib/module/index.js"},"./package.json":"./package.json"},"gitHead":"bdd452dd83522bfd4d3d0ec42947efe9519a75cc","scripts":{"lint":"eslint \"**/*.{js,ts,tsx}\"","test":"jest","clean":"del-cli android/build example/android/build example/android/app/build example/ios/build lib","example":"yarn workspace cariva-exercise-sdk-example","prepare":"bob build","typecheck":"tsc","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"yarn clean && yarn prepare"},"_npmUser":{"name":"piyawatcariva","email":"piyawak@cariva.co.th"},"prettier":{"useTabs":false,"tabWidth":2,"quoteProps":"consistent","singleQuote":true,"trailingComma":"es5"},"repository":{"url":"git+https://github.com/cariva/cariva-exercise-sdk.git","type":"git"},"workspaces":["example"],"_npmVersion":"11.12.1","description":"Cariva exercise SDK","directories":{},"_nodeVersion":"20.19.6","codegenConfig":{"name":"CarivaExerciseSdkSpec","type":"modules","android":{"javaPackageName":"com.carivaexercisesdk"},"jsSrcsDir":"src"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"yarn@4.11.0","devDependencies":{"jest":"^29.7.0","react":"19.2.0","turbo":"^2.5.6","eslint":"^9.35.0","del-cli":"^6.0.0","prettier":"^2.8.8","@eslint/js":"^9.35.0","babel-jest":"^29.7.0","typescript":"^5.9.2","@babel/core":"^7.25.2","@types/react":"^19.2.0","react-native":"0.83.0","@eslint/compat":"^1.3.2","@eslint/eslintrc":"^3.3.1","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","react-native-builder-bob":"^0.40.18","@react-native/babel-preset":"0.83.0","@react-native/eslint-config":"0.83.0"},"peerDependencies":{"react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/vislife-health-sdk-rn_0.0.24_1783427827986_0.46703316375899506","host":"s3://npm-registry-packages-npm-production"},"react-native-builder-bob":{"output":"lib","source":"src","targets":[["module",{"esm":true}],["typescript",{"project":"tsconfig.build.json"}]]},"create-react-native-library":{"type":"turbo-module","tools":["eslint"],"version":"0.57.2","languages":"kotlin-objc"}},"0.0.25":{"name":"@cariva/vislife-health-sdk-rn","version":"0.0.25","keywords":["react-native","ios","android"],"author":{"url":"https://cariva.com","name":"Cariva","email":"dev@cariva.com"},"license":"MIT","_id":"@cariva/vislife-health-sdk-rn@0.0.25","maintainers":[{"name":"piyawatcariva","email":"piyawak@cariva.co.th"},{"name":"patcharas.cariva","email":"patcharas@cariva.co.th"},{"name":"menner159","email":"kraisornk@cariva.co.th"}],"homepage":"https://github.com/cariva/cariva-exercise-sdk#readme","bugs":{"url":"https://github.com/cariva/cariva-exercise-sdk/issues"},"dist":{"shasum":"b3b7544ad269926aa82e276febe0a1bf0fabff16","tarball":"https://registry.npmjs.org/@cariva/vislife-health-sdk-rn/-/vislife-health-sdk-rn-0.0.25.tgz","fileCount":111,"integrity":"sha512-ygCoJzmKLEO1dsgSBNY7dqBjrupsaiSmtgjC4gUOf1PEMOwLqBj8Zc3j+OKPvJrYhlIq/OsvAPVW3o/iq9BxLw==","signatures":[{"sig":"MEUCIFI4rfv+KTAjk0/UTBYwywwHWvEhBAxmv7qDWW8DkGCjAiEAn89MMsqWHVfXIyeDO47yBoif+1vj7ySoMFJj3CAaxDs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":384402},"main":"./lib/module/index.js","types":"./lib/typescript/src/index.d.ts","exports":{".":{"types":"./lib/typescript/src/index.d.ts","source":"./src/index.tsx","default":"./lib/module/index.js"},"./package.json":"./package.json"},"gitHead":"5ccaa6e363e4d90261328fb945f7d098ed4a8572","scripts":{"lint":"eslint \"**/*.{js,ts,tsx}\"","test":"jest","clean":"del-cli android/build example/android/build example/android/app/build example/ios/build lib","example":"yarn workspace cariva-exercise-sdk-example","prepare":"bob build","typecheck":"tsc","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"yarn clean && yarn prepare"},"_npmUser":{"name":"piyawatcariva","email":"piyawak@cariva.co.th"},"prettier":{"useTabs":false,"tabWidth":2,"quoteProps":"consistent","singleQuote":true,"trailingComma":"es5"},"repository":{"url":"git+https://github.com/cariva/cariva-exercise-sdk.git","type":"git"},"workspaces":["example"],"_npmVersion":"11.12.1","description":"Cariva exercise SDK","directories":{},"_nodeVersion":"20.19.6","codegenConfig":{"name":"CarivaExerciseSdkSpec","type":"modules","android":{"javaPackageName":"com.carivaexercisesdk"},"jsSrcsDir":"src"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"yarn@4.11.0","devDependencies":{"jest":"^29.7.0","react":"19.2.0","turbo":"^2.5.6","eslint":"^9.35.0","del-cli":"^6.0.0","prettier":"^2.8.8","@eslint/js":"^9.35.0","babel-jest":"^29.7.0","typescript":"^5.9.2","@babel/core":"^7.25.2","@types/react":"^19.2.0","react-native":"0.83.0","@eslint/compat":"^1.3.2","@eslint/eslintrc":"^3.3.1","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","react-native-builder-bob":"^0.40.18","@react-native/babel-preset":"0.83.0","@react-native/eslint-config":"0.83.0"},"peerDependencies":{"react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/vislife-health-sdk-rn_0.0.25_1783428802180_0.07078299941179189","host":"s3://npm-registry-packages-npm-production"},"react-native-builder-bob":{"output":"lib","source":"src","targets":[["module",{"esm":true}],["typescript",{"project":"tsconfig.build.json"}]]},"create-react-native-library":{"type":"turbo-module","tools":["eslint"],"version":"0.57.2","languages":"kotlin-objc"}},"0.0.26":{"name":"@cariva/vislife-health-sdk-rn","version":"0.0.26","keywords":["react-native","ios","android"],"author":{"url":"https://cariva.com","name":"Cariva","email":"dev@cariva.com"},"license":"MIT","_id":"@cariva/vislife-health-sdk-rn@0.0.26","maintainers":[{"name":"piyawatcariva","email":"piyawak@cariva.co.th"},{"name":"patcharas.cariva","email":"patcharas@cariva.co.th"},{"name":"menner159","email":"kraisornk@cariva.co.th"}],"homepage":"https://github.com/cariva/cariva-exercise-sdk#readme","bugs":{"url":"https://github.com/cariva/cariva-exercise-sdk/issues"},"dist":{"shasum":"c68e653f4d5cadecf236782ee2fd75b7ad7c0c7a","tarball":"https://registry.npmjs.org/@cariva/vislife-health-sdk-rn/-/vislife-health-sdk-rn-0.0.26.tgz","fileCount":111,"integrity":"sha512-OACBSGbmEvuMH9XqiL94LG7m05twl4acD490Y2vmS66MpXann3aVRGdNP/8IefY/9Bct8N1FZfVbqMErixj+qw==","signatures":[{"sig":"MEQCIBTQ2ikDcSHdlSeG0nfSCGx2rw0bYBFRNJAiLnSYUAIgAiBEGMTxeSQ39n1aUsA74f9cju0Br0HwvBwas7NG6bMAiA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":381901},"main":"./lib/module/index.js","types":"./lib/typescript/src/index.d.ts","exports":{".":{"types":"./lib/typescript/src/index.d.ts","source":"./src/index.tsx","default":"./lib/module/index.js"},"./package.json":"./package.json"},"gitHead":"321bb57f43d2fdf6a87813416fa0b7a953ee1d4a","scripts":{"lint":"eslint \"**/*.{js,ts,tsx}\"","test":"jest","clean":"del-cli android/build example/android/build example/android/app/build example/ios/build lib","example":"yarn workspace cariva-exercise-sdk-example","prepare":"bob build","typecheck":"tsc","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"yarn clean && yarn prepare"},"_npmUser":{"name":"piyawatcariva","email":"piyawak@cariva.co.th"},"prettier":{"useTabs":false,"tabWidth":2,"quoteProps":"consistent","singleQuote":true,"trailingComma":"es5"},"repository":{"url":"git+https://github.com/cariva/cariva-exercise-sdk.git","type":"git"},"workspaces":["example"],"_npmVersion":"11.12.1","description":"Cariva exercise SDK","directories":{},"_nodeVersion":"20.19.6","codegenConfig":{"name":"CarivaExerciseSdkSpec","type":"modules","android":{"javaPackageName":"com.carivaexercisesdk"},"jsSrcsDir":"src"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"yarn@4.11.0","devDependencies":{"jest":"^29.7.0","react":"19.2.0","turbo":"^2.5.6","eslint":"^9.35.0","del-cli":"^6.0.0","prettier":"^2.8.8","@eslint/js":"^9.35.0","babel-jest":"^29.7.0","typescript":"^5.9.2","@babel/core":"^7.25.2","@types/react":"^19.2.0","react-native":"0.83.0","@eslint/compat":"^1.3.2","@eslint/eslintrc":"^3.3.1","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","react-native-builder-bob":"^0.40.18","@react-native/babel-preset":"0.83.0","@react-native/eslint-config":"0.83.0"},"peerDependencies":{"react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/vislife-health-sdk-rn_0.0.26_1783464399316_0.17586984465425615","host":"s3://npm-registry-packages-npm-production"},"react-native-builder-bob":{"output":"lib","source":"src","targets":[["module",{"esm":true}],["typescript",{"project":"tsconfig.build.json"}]]},"create-react-native-library":{"type":"turbo-module","tools":["eslint"],"version":"0.57.2","languages":"kotlin-objc"}},"0.0.27":{"name":"@cariva/vislife-health-sdk-rn","version":"0.0.27","keywords":["react-native","ios","android"],"author":{"url":"https://cariva.com","name":"Cariva","email":"dev@cariva.com"},"license":"MIT","_id":"@cariva/vislife-health-sdk-rn@0.0.27","maintainers":[{"name":"piyawatcariva","email":"piyawak@cariva.co.th"},{"name":"patcharas.cariva","email":"patcharas@cariva.co.th"},{"name":"menner159","email":"kraisornk@cariva.co.th"}],"homepage":"https://github.com/cariva/cariva-exercise-sdk#readme","bugs":{"url":"https://github.com/cariva/cariva-exercise-sdk/issues"},"dist":{"shasum":"5e7ea4a3c587f02e3b0a3e68cba6fa7e37dd834e","tarball":"https://registry.npmjs.org/@cariva/vislife-health-sdk-rn/-/vislife-health-sdk-rn-0.0.27.tgz","fileCount":111,"integrity":"sha512-RtRcD74LtIU99anKggErc4YHAyV9GWNoRsr3+XRnQU93eAGItg+WmdFUb80Mi0vniHsnabebE3H7gaOBG2OfJA==","signatures":[{"sig":"MEYCIQCOUmdfJHgwtn6ME0c05C9hhr5dqaOhzH2A//H0mh1CJwIhAPwPuEpTe2Xvl6yi8cx+n/BzKqOLZ0fLm7YgeX/fP6Cv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":389999},"main":"./lib/module/index.js","types":"./lib/typescript/src/index.d.ts","exports":{".":{"types":"./lib/typescript/src/index.d.ts","source":"./src/index.tsx","default":"./lib/module/index.js"},"./package.json":"./package.json"},"gitHead":"9518b2c09a4bd8cee224ab847e05f8a363b6155c","scripts":{"lint":"eslint \"**/*.{js,ts,tsx}\"","test":"jest","clean":"del-cli android/build example/android/build example/android/app/build example/ios/build lib","example":"yarn workspace cariva-exercise-sdk-example","prepare":"bob build","typecheck":"tsc","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"yarn clean && yarn prepare"},"_npmUser":{"name":"piyawatcariva","email":"piyawak@cariva.co.th"},"prettier":{"useTabs":false,"tabWidth":2,"quoteProps":"consistent","singleQuote":true,"trailingComma":"es5"},"repository":{"url":"git+https://github.com/cariva/cariva-exercise-sdk.git","type":"git"},"workspaces":["example"],"_npmVersion":"11.12.1","description":"Cariva exercise SDK","directories":{},"_nodeVersion":"20.19.6","codegenConfig":{"name":"CarivaExerciseSdkSpec","type":"modules","android":{"javaPackageName":"com.carivaexercisesdk"},"jsSrcsDir":"src"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"yarn@4.11.0","devDependencies":{"jest":"^29.7.0","react":"19.2.0","turbo":"^2.5.6","eslint":"^9.35.0","del-cli":"^6.0.0","prettier":"^2.8.8","@eslint/js":"^9.35.0","babel-jest":"^29.7.0","typescript":"^5.9.2","@babel/core":"^7.25.2","@types/react":"^19.2.0","react-native":"0.83.0","@eslint/compat":"^1.3.2","@eslint/eslintrc":"^3.3.1","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","react-native-builder-bob":"^0.40.18","@react-native/babel-preset":"0.83.0","@react-native/eslint-config":"0.83.0"},"peerDependencies":{"react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/vislife-health-sdk-rn_0.0.27_1783591931795_0.0899669701312853","host":"s3://npm-registry-packages-npm-production"},"react-native-builder-bob":{"output":"lib","source":"src","targets":[["module",{"esm":true}],["typescript",{"project":"tsconfig.build.json"}]]},"create-react-native-library":{"type":"turbo-module","tools":["eslint"],"version":"0.57.2","languages":"kotlin-objc"}},"0.1.0":{"name":"@cariva/vislife-health-sdk-rn","version":"0.1.0","keywords":["react-native","ios","android"],"author":{"url":"https://cariva.com","name":"Cariva","email":"dev@cariva.com"},"license":"MIT","_id":"@cariva/vislife-health-sdk-rn@0.1.0","maintainers":[{"name":"piyawatcariva","email":"piyawak@cariva.co.th"},{"name":"patcharas.cariva","email":"patcharas@cariva.co.th"},{"name":"menner159","email":"kraisornk@cariva.co.th"}],"homepage":"https://github.com/cariva/cariva-exercise-sdk#readme","bugs":{"url":"https://github.com/cariva/cariva-exercise-sdk/issues"},"dist":{"shasum":"27495ed281094c8943cb02acdeb1df65a33f0538","tarball":"https://registry.npmjs.org/@cariva/vislife-health-sdk-rn/-/vislife-health-sdk-rn-0.1.0.tgz","fileCount":111,"integrity":"sha512-guOOUSuF1AMR2e99WkOvtbaooe31+EfVwMWq4PxpT0H5wutFJfi17g3lh1gLaEEy71j09kD0AeAH62Mj1iopNg==","signatures":[{"sig":"MEUCIQDOzMt/1xei30c4v0Woj1UeSsJKlliBiaEhzLhBvNkG1gIgVfX45+cHlZRoRy39aDiz2JDoFsN6SzK0owaa9a/QbAQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":390342},"main":"./lib/module/index.js","types":"./lib/typescript/src/index.d.ts","engines":{"node":"^20.19.0 || ^22.12.0 || >=23.4.0"},"exports":{".":{"types":"./lib/typescript/src/index.d.ts","source":"./src/index.tsx","default":"./lib/module/index.js"},"./package.json":"./package.json"},"gitHead":"8f5a3aa3542001cafb60eb22f5045e0b6bc558a8","scripts":{"lint":"eslint \"**/*.{js,ts,tsx}\"","test":"jest","clean":"del-cli android/build example/android/build example/android/app/build example/ios/build lib","example":"yarn workspace cariva-exercise-sdk-example","prepare":"yarn check:node && bob build","typecheck":"tsc","check:node":"node scripts/check-node-version.mjs","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"yarn check:node && yarn clean && yarn prepare"},"_npmUser":{"name":"piyawatcariva","email":"piyawak@cariva.co.th"},"prettier":{"useTabs":false,"tabWidth":2,"quoteProps":"consistent","singleQuote":true,"trailingComma":"es5"},"repository":{"url":"git+https://github.com/cariva/cariva-exercise-sdk.git","type":"git"},"workspaces":["example"],"_npmVersion":"11.12.1","description":"Cariva exercise SDK","directories":{},"_nodeVersion":"20.19.6","codegenConfig":{"name":"CarivaExerciseSdkSpec","type":"modules","android":{"javaPackageName":"com.carivaexercisesdk"},"jsSrcsDir":"src"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"yarn@4.11.0","devDependencies":{"jest":"^29.7.0","react":"19.2.0","turbo":"^2.5.6","eslint":"^9.35.0","del-cli":"^6.0.0","prettier":"^2.8.8","@eslint/js":"^9.35.0","babel-jest":"^29.7.0","typescript":"^5.9.2","@babel/core":"^7.25.2","@types/react":"^19.2.0","react-native":"0.83.0","@eslint/compat":"^1.3.2","@eslint/eslintrc":"^3.3.1","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","react-native-builder-bob":"^0.40.18","@react-native/babel-preset":"0.83.0","@react-native/eslint-config":"0.83.0"},"peerDependencies":{"react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/vislife-health-sdk-rn_0.1.0_1783647585121_0.38669530921250606","host":"s3://npm-registry-packages-npm-production"},"react-native-builder-bob":{"output":"lib","source":"src","targets":[["module",{"esm":true}],["typescript",{"project":"tsconfig.build.json"}]]},"create-react-native-library":{"type":"turbo-module","tools":["eslint"],"version":"0.57.2","languages":"kotlin-objc"}},"0.1.1":{"name":"@cariva/vislife-health-sdk-rn","version":"0.1.1","keywords":["react-native","ios","android"],"author":{"url":"https://cariva.com","name":"Cariva","email":"dev@cariva.com"},"license":"MIT","_id":"@cariva/vislife-health-sdk-rn@0.1.1","maintainers":[{"name":"piyawatcariva","email":"piyawak@cariva.co.th"},{"name":"patcharas.cariva","email":"patcharas@cariva.co.th"},{"name":"menner159","email":"kraisornk@cariva.co.th"}],"homepage":"https://github.com/cariva/cariva-exercise-sdk#readme","bugs":{"url":"https://github.com/cariva/cariva-exercise-sdk/issues"},"dist":{"shasum":"1d5b0982fa32ce61f613595d91e3028cd31d2a9f","tarball":"https://registry.npmjs.org/@cariva/vislife-health-sdk-rn/-/vislife-health-sdk-rn-0.1.1.tgz","fileCount":111,"integrity":"sha512-WIf7fHNmZ0th94gsURrQqi80KEYXngXmHc97HE7XQ1nf8/rV0ZFzmvKo7EGtD41mruGp6MiYKszaSDtVXc0nRQ==","signatures":[{"sig":"MEUCIQDRVRdZr9AxvSrSd+RGHj2VF/NwRUGAakMMqbN2hzlKhAIgccrOHNGfhuFcLCkA/XH/hgo93MPkJTpfOlrnirOxU7A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":390678},"main":"./lib/module/index.js","types":"./lib/typescript/src/index.d.ts","engines":{"node":"^20.19.0 || ^22.12.0 || >=23.4.0"},"exports":{".":{"types":"./lib/typescript/src/index.d.ts","source":"./src/index.tsx","default":"./lib/module/index.js"},"./package.json":"./package.json"},"gitHead":"8fe2daf5c44e88ce6b4e3482656752e018ffc0e3","scripts":{"lint":"eslint \"**/*.{js,ts,tsx}\"","test":"jest","clean":"del-cli android/build example/android/build example/android/app/build example/ios/build lib","example":"yarn workspace cariva-exercise-sdk-example","prepare":"yarn check:node && bob build","typecheck":"tsc","check:node":"node scripts/check-node-version.mjs","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"yarn check:node && yarn clean && yarn prepare"},"_npmUser":{"name":"piyawatcariva","email":"piyawak@cariva.co.th"},"prettier":{"useTabs":false,"tabWidth":2,"quoteProps":"consistent","singleQuote":true,"trailingComma":"es5"},"repository":{"url":"git+https://github.com/cariva/cariva-exercise-sdk.git","type":"git"},"workspaces":["example"],"_npmVersion":"11.12.1","description":"Cariva exercise SDK","directories":{},"_nodeVersion":"20.19.6","codegenConfig":{"name":"CarivaExerciseSdkSpec","type":"modules","android":{"javaPackageName":"com.carivaexercisesdk"},"jsSrcsDir":"src"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"yarn@4.11.0","devDependencies":{"jest":"^29.7.0","react":"19.2.0","turbo":"^2.5.6","eslint":"^9.35.0","del-cli":"^6.0.0","prettier":"^2.8.8","@eslint/js":"^9.35.0","babel-jest":"^29.7.0","typescript":"^5.9.2","@babel/core":"^7.25.2","@types/react":"^19.2.0","react-native":"0.83.0","@eslint/compat":"^1.3.2","@eslint/eslintrc":"^3.3.1","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","react-native-builder-bob":"^0.40.18","@react-native/babel-preset":"0.83.0","@react-native/eslint-config":"0.83.0"},"peerDependencies":{"react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/vislife-health-sdk-rn_0.1.1_1783649883838_0.7951232655198113","host":"s3://npm-registry-packages-npm-production"},"react-native-builder-bob":{"output":"lib","source":"src","targets":[["module",{"esm":true}],["typescript",{"project":"tsconfig.build.json"}]]},"create-react-native-library":{"type":"turbo-module","tools":["eslint"],"version":"0.57.2","languages":"kotlin-objc"}},"0.1.2":{"name":"@cariva/vislife-health-sdk-rn","version":"0.1.2","keywords":["react-native","ios","android"],"author":{"url":"https://cariva.com","name":"Cariva","email":"dev@cariva.com"},"license":"MIT","_id":"@cariva/vislife-health-sdk-rn@0.1.2","maintainers":[{"name":"piyawatcariva","email":"piyawak@cariva.co.th"},{"name":"patcharas.cariva","email":"patcharas@cariva.co.th"},{"name":"menner159","email":"kraisornk@cariva.co.th"}],"homepage":"https://github.com/cariva/cariva-exercise-sdk#readme","bugs":{"url":"https://github.com/cariva/cariva-exercise-sdk/issues"},"dist":{"shasum":"5413c9cad7c29ff9fa412845aeb5fd80f47cd932","tarball":"https://registry.npmjs.org/@cariva/vislife-health-sdk-rn/-/vislife-health-sdk-rn-0.1.2.tgz","fileCount":111,"integrity":"sha512-Bux02ZcLBDOgL4HxpNK9OofHcMJQ5vtD83zZoHcu8CrHSpp1zDX6hPrRmCnf2KbC/B6Wc0iQDkdPbRNou+b1qw==","signatures":[{"sig":"MEUCIGkV+pBSdN8HStAGbSX4UCEZPoqpvbAQ5Ipjcz3vg7o4AiEAtx90pelzeyRrDetBoceRUPmj/30VFD1KkPs+SXhbjjw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":391420},"main":"./lib/module/index.js","types":"./lib/typescript/src/index.d.ts","engines":{"node":"^20.19.0 || ^22.12.0 || >=23.4.0"},"exports":{".":{"types":"./lib/typescript/src/index.d.ts","source":"./src/index.tsx","default":"./lib/module/index.js"},"./package.json":"./package.json"},"gitHead":"ed46b77074e7004f82b46a8bdaf4d2d7a02cc1b0","scripts":{"lint":"eslint \"**/*.{js,ts,tsx}\"","test":"jest","clean":"del-cli android/build example/android/build example/android/app/build example/ios/build lib","example":"yarn workspace cariva-exercise-sdk-example","prepare":"yarn check:node && bob build","typecheck":"tsc","check:node":"node scripts/check-node-version.mjs","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"yarn check:node && yarn clean && yarn prepare"},"_npmUser":{"name":"piyawatcariva","email":"piyawak@cariva.co.th"},"prettier":{"useTabs":false,"tabWidth":2,"quoteProps":"consistent","singleQuote":true,"trailingComma":"es5"},"repository":{"url":"git+https://github.com/cariva/cariva-exercise-sdk.git","type":"git"},"workspaces":["example"],"_npmVersion":"11.12.1","description":"Cariva exercise SDK","directories":{},"_nodeVersion":"20.19.6","codegenConfig":{"name":"CarivaExerciseSdkSpec","type":"modules","android":{"javaPackageName":"com.carivaexercisesdk"},"jsSrcsDir":"src"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"packageManager":"yarn@4.11.0","devDependencies":{"jest":"^29.7.0","react":"19.2.0","turbo":"^2.5.6","eslint":"^9.35.0","del-cli":"^6.0.0","prettier":"^2.8.8","@eslint/js":"^9.35.0","babel-jest":"^29.7.0","typescript":"^5.9.2","@babel/core":"^7.25.2","@types/react":"^19.2.0","react-native":"0.83.0","@eslint/compat":"^1.3.2","@eslint/eslintrc":"^3.3.1","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","react-native-builder-bob":"^0.40.18","@react-native/babel-preset":"0.83.0","@react-native/eslint-config":"0.83.0"},"peerDependencies":{"react":"*","react-native":"*"},"_npmOperationalInternal":{"tmp":"tmp/vislife-health-sdk-rn_0.1.2_1783664539038_0.9251923830502744","host":"s3://npm-registry-packages-npm-production"},"react-native-builder-bob":{"output":"lib","source":"src","targets":[["module",{"esm":true}],["typescript",{"project":"tsconfig.build.json"}]]},"create-react-native-library":{"type":"turbo-module","tools":["eslint"],"version":"0.57.2","languages":"kotlin-objc"}},"0.1.3":{"name":"@cariva/vislife-health-sdk-rn","version":"0.1.3","description":"Cariva exercise SDK","main":"./lib/module/index.js","types":"./lib/typescript/src/index.d.ts","exports":{".":{"source":"./src/index.tsx","types":"./lib/typescript/src/index.d.ts","default":"./lib/module/index.js"},"./package.json":"./package.json"},"scripts":{"example":"yarn workspace cariva-exercise-sdk-example","check:node":"node scripts/check-node-version.mjs","clean":"del-cli android/build example/android/build example/android/app/build example/ios/build lib","prepare":"yarn check:node && bob build","test":"jest","typecheck":"tsc","lint":"eslint \"**/*.{js,ts,tsx}\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","publish:dry-run":"PATH=\"$HOME/.nvm/versions/node/v20.19.6/bin:$PATH\" npm publish --dry-run","publish:npm":"PATH=\"$HOME/.nvm/versions/node/v20.19.6/bin:$PATH\" npm publish","prepublishOnly":"yarn check:node && yarn clean && yarn prepare"},"keywords":["react-native","ios","android"],"repository":{"type":"git","url":"git+https://github.com/cariva/cariva-exercise-sdk.git"},"author":{"name":"Cariva","email":"dev@cariva.com","url":"https://cariva.com"},"license":"MIT","bugs":{"url":"https://github.com/cariva/cariva-exercise-sdk/issues"},"homepage":"https://github.com/cariva/cariva-exercise-sdk#readme","publishConfig":{"registry":"https://registry.npmjs.org/","access":"public"},"devDependencies":{"@babel/core":"^7.25.2","@eslint/compat":"^1.3.2","@eslint/eslintrc":"^3.3.1","@eslint/js":"^9.35.0","@react-native/babel-preset":"0.83.0","@react-native/eslint-config":"0.83.0","@types/react":"^19.2.0","babel-jest":"^29.7.0","del-cli":"^6.0.0","eslint":"^9.35.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","jest":"^29.7.0","prettier":"^2.8.8","react":"19.2.0","react-native":"0.83.0","react-native-builder-bob":"^0.40.18","turbo":"^2.5.6","typescript":"^5.9.2"},"engines":{"node":"^20.19.0 || ^22.12.0 || >=23.4.0"},"peerDependencies":{"react":"*","react-native":"*"},"workspaces":["example"],"packageManager":"yarn@4.11.0","react-native-builder-bob":{"source":"src","output":"lib","targets":[["module",{"esm":true}],["typescript",{"project":"tsconfig.build.json"}]]},"codegenConfig":{"name":"CarivaExerciseSdkSpec","type":"modules","jsSrcsDir":"src","android":{"javaPackageName":"com.carivaexercisesdk"}},"prettier":{"quoteProps":"consistent","singleQuote":true,"tabWidth":2,"trailingComma":"es5","useTabs":false},"create-react-native-library":{"type":"turbo-module","languages":"kotlin-objc","tools":["eslint"],"version":"0.57.2"},"gitHead":"ed46b77074e7004f82b46a8bdaf4d2d7a02cc1b0","_id":"@cariva/vislife-health-sdk-rn@0.1.3","_nodeVersion":"20.19.6","_npmVersion":"11.12.1","dist":{"integrity":"sha512-NQtU8e1ww0+CDl2hsIkidW7jIJ83Q8yciWTw38PlLfP4+K5QgTSZLSfDl44Y20tuS1yKFV3FZrAaVauByvFQWA==","shasum":"f1dad80b0e9a6638e6238673eab2c45abf7aa144","tarball":"https://registry.npmjs.org/@cariva/vislife-health-sdk-rn/-/vislife-health-sdk-rn-0.1.3.tgz","fileCount":111,"unpackedSize":393668,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQD2PPmDb76QKcRMsckS+JiBx6USnwvLsiryi/ILGBE7mAIhALOXSDJzwBttYqmL5CDRgNZAK9WxEpPj8bLrikOBQ9e2"}]},"_npmUser":{"name":"piyawatcariva","email":"piyawak@cariva.co.th"},"directories":{},"maintainers":[{"name":"piyawatcariva","email":"piyawak@cariva.co.th"},{"name":"patcharas.cariva","email":"patcharas@cariva.co.th"},{"name":"menner159","email":"kraisornk@cariva.co.th"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/vislife-health-sdk-rn_0.1.3_1783675485678_0.3823590024269552"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-30T04:09:35.259Z","modified":"2026-07-10T09:24:46.020Z","0.0.22":"2026-06-30T04:09:35.640Z","0.0.23":"2026-07-07T10:44:44.808Z","0.0.24":"2026-07-07T12:37:08.128Z","0.0.25":"2026-07-07T12:53:22.342Z","0.0.26":"2026-07-07T22:46:39.477Z","0.0.27":"2026-07-09T10:12:11.966Z","0.1.0":"2026-07-10T01:39:45.363Z","0.1.1":"2026-07-10T02:18:03.992Z","0.1.2":"2026-07-10T06:22:19.195Z","0.1.3":"2026-07-10T09:24:45.851Z"},"bugs":{"url":"https://github.com/cariva/cariva-exercise-sdk/issues"},"author":{"name":"Cariva","email":"dev@cariva.com","url":"https://cariva.com"},"license":"MIT","homepage":"https://github.com/cariva/cariva-exercise-sdk#readme","keywords":["react-native","ios","android"],"repository":{"type":"git","url":"git+https://github.com/cariva/cariva-exercise-sdk.git"},"description":"Cariva exercise SDK","maintainers":[{"name":"piyawatcariva","email":"piyawak@cariva.co.th"},{"name":"patcharas.cariva","email":"patcharas@cariva.co.th"},{"name":"menner159","email":"kraisornk@cariva.co.th"}],"readme":"# @cariva/vislife-health-sdk-rn\n\nReact Native SDK for reading exercise and activity data from **Android Health Connect** and **iOS HealthKit**.\n\nPublished package: `@cariva/vislife-health-sdk-rn`\n\nThis release is a package move only. The JavaScript API, native module names, and React Native autolinking behavior stay the same.\n\n## Platform Support\n\n| Platform | Status |\n|----------|--------|\n| Android  | Supported (Health Connect) |\n| iOS      | Supported (HealthKit) |\n\n---\n\n## Requirements\n\n- React Native **0.68+** (New Architecture / Turbo Module compatible)\n- Android app `minSdkVersion 24` or higher\n- iOS app `deploymentTarget` **13.0** or higher\n- A device or emulator with Health Connect (Android) or HealthKit (iOS) support\n- [Health Connect](https://play.google.com/store/apps/details?id=com.google.android.apps.healthdata) installed on Android 13 and lower, or available through Play Services / system components on Android 14+\n\n---\n\n## Architecture\n\nThe SDK now follows a Clean/Hexagonal structure:\n\n- `android/.../domain`: core models and algorithm services\n- `android/.../application`: use-cases and ports\n- `android/.../infrastructure`: Health Connect/Android adapters\n- `android/.../HealthConnectModule.kt`: thin React Native bridge/controller\n- `src/domain`, `src/application`, `src/infrastructure`: mirrored TypeScript boundary layers\n\nSee [docs/architecture/clean-hexagonal-migration.md](docs/architecture/clean-hexagonal-migration.md) for migration details.\n\n---\n\n## Installation\n\n### 1. Install the package\n\n```sh\n# npm\nnpm install @cariva/vislife-health-sdk-rn\n\n# yarn\nyarn add @cariva/vislife-health-sdk-rn\n```\n\n### 2. Android setup\n\n- The library ships its own Health Connect permissions, package visibility queries, and permission rationale activities in the Android library manifest.\n- In a standard React Native app, Gradle manifest merge and autolinking pick these up automatically when you rebuild the app after installation.\n- On Android 13 and lower, install Health Connect before testing. On Android 14+, ensure the device has the required Play Services / system components available.\n- Minimum verification after install:\n  1. Launch the rebuilt app.\n  2. Call `connect({ requestPermission: false, onMissingApp: 'status' })`.\n  3. If `nextAction === 'GRANT_PERMISSIONS'`, call `connect({ requestPermission: true, onMissingApp: 'status' })` to open the permission flow.\n\n### 3. iOS setup\n\n- Install native dependencies after adding the package: `cd ios && bundle exec pod install`\n- Enable the **HealthKit** capability for your app target in Xcode.\n- Add `NSHealthShareUsageDescription` to `Info.plist` with the user-facing reason your app reads health data.\n- Build and run on a physical iPhone or iPad with Health data available.\n- Minimum verification after install:\n  1. Launch the rebuilt app.\n  2. Call `connect({ requestPermission: true, onMissingApp: 'status' })`.\n  3. After the HealthKit prompt, call `getHealthData(...)` to verify effective read access.\n\n---\n\n## Quick Start\n\n```ts\nimport {\n  connect,\n  getHealthData,\n  setAllowDatasource,\n  getAllowDatasource,\n  resetPermissions,\n} from '@cariva/vislife-health-sdk-rn';\n\n// 1. Connect and request permissions\nconst status = await connect({\n  onMissingApp: 'status',\n  requestPermission: true,\n  permissionScope: ['steps', 'calories'],\n});\n\nif (!status.ready) {\n  console.log('Next action required:', status.nextAction);\n  // e.g. 'INSTALL_HEALTH_CONNECT' | 'GRANT_PERMISSIONS' | ...\n  return;\n}\n\n// 2. Fetch exercise data\nconst data = await getHealthData({\n  sinceMillis: Date.now() - 7 * 24 * 60 * 60 * 1000, // last 7 days\n  untilMillis: Date.now(),\n  bucketPeriod: 'daily',\n  timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n  bmr: 1500,\n});\n\nconsole.log('Records:', data.records);\nconsole.log('Active kcal:', data.summary.activeKcal);\nconsole.log('Time zone:', data.meta.timeZone);\n\n// 3. Start the platform reset/manage-permission flow, then re-check\nconst resetResult = await resetPermissions();\nif (resetResult.userActionRequired) {\n  // Show resetResult.message/instructions before asking the user to continue.\n}\nawait connect({ requestPermission: false, onMissingApp: 'status' });\n```\n\n\n---\n\n## API Reference\n\n### `connect(options?)`\n\nChecks Health Connect availability and optionally requests permissions.\n\n```ts\ntype PermissionScope = 'steps' | 'activetimes' | 'calories' | 'distances';\n\ntype ConnectOptions = {\n  onMissingApp?: 'status' | 'open';\n  requestPermission?: boolean;\n  permissionScope?: PermissionScope[];\n};\n\ntype PermissionVerification = 'verified' | 'unverifiable' | 'not_checked';\n\ntype ConnectResult = {\n  ready: boolean;\n  healthConnectInstalled: boolean;\n  healthConnectStatus: 'AVAILABLE' | 'UPDATE_REQUIRED' | 'UNAVAILABLE' | 'UNKNOWN';\n  hasPermissions: boolean | 'unknown';\n  permissionStatus: 'granted' | 'partial' | 'denied' | 'unknown';\n  permissionVerification?: PermissionVerification;\n  nextAction:\n    | 'INSTALL_HEALTH_CONNECT'\n    | 'UPDATE_HEALTH_CONNECT'\n    | 'GRANT_PERMISSIONS'\n    | 'OPEN_SETTINGS'\n    | 'NONE';\n  grantedPermissions?: string[];\n  grantedScopes?: PermissionScope[];\n  missingScopes?: PermissionScope[];\n  errorCode?: 'USER_CANCELLED' | 'TIMEOUT' | 'NATIVE_ERROR' | 'CONNECT_IN_PROGRESS';\n  errorMessage?: string;\n};\n```\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `onMissingApp` | `'status' \\| 'open'` | `'status'` | `'open'` opens Play Store for the missing app |\n| `requestPermission` | `boolean` | `true` | Trigger the Health Connect permission dialog |\n| `permissionScope` | `PermissionScope[]` | all scopes | Limit which permissions are requested |\n\nDefault behavior is split for backward compatibility:\n\n- `connect()` keeps the legacy interactive flow: it may open the Play Store when Health Connect needs installation/update and it requests permissions by default.\n- `connect({ ... })` defaults missing option fields to `onMissingApp: 'status'`, `requestPermission: true`, and all permission scopes.\n\nFor first-screen or app-start status checks, call:\n\n```ts\nconst status = await connect({\n  requestPermission: false,\n  onMissingApp: 'status',\n});\n```\n\nThis never opens the Health Connect permission UI and never opens the Play Store. If permissions are missing on Android, it returns `ready: false`, `hasPermissions: false`, `permissionVerification: 'verified'`, and `nextAction: 'GRANT_PERMISSIONS'`.\n\nOn iOS, HealthKit read permission is not reliably inspectable. iOS `connect()` reports `hasPermissions: 'unknown'`, `permissionStatus: 'unknown'`, and `permissionVerification: 'unverifiable'` for read-permission success/silent paths; consumers must verify effective read access with `getHealthData()` behavior in their UX.\n\n`activetimes` may request both exercise-session and active-calories read permissions so the native fallback reader can still derive active duration when session records are unavailable.\n\nOn iOS, HealthKit does not allow apps to inspect read permission grants non-interactively. Use this flow to handle the permission recheck:\n\n```ts\n// Step 1: Silent status check (no HealthKit prompt)\nconst status = await connect({\n  requestPermission: false,\n  onMissingApp: 'status',\n});\n\nif (status.nextAction === 'GRANT_PERMISSIONS') {\n  // Step 2: Request permission (shows HealthKit UI)\n  const result = await connect({\n    requestPermission: true,\n    onMissingApp: 'status',\n  });\n\n  // Step 3: After no system error, verify via data read\n  // iOS returns ready: true, hasPermissions: 'unknown' even if granted=false\n  // because read grants cannot be verified programmatically.\n  if (result.ready) {\n    try {\n      const data = await getHealthData({\n        sinceMillis: Date.now() - 24 * 60 * 60 * 1000,\n        untilMillis: Date.now(),\n        bucketPeriod: 'daily',\n        timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n        bmr: 1500,\n      });\n      // Data fetch succeeded - permissions are effective\n    } catch (error) {\n      // Handle authorization failure: guide user to resetPermissions()\n      console.log('Authorization error:', error);\n    }\n  } else if (result.errorCode === 'NATIVE_ERROR' && result.nextAction === 'OPEN_SETTINGS') {\n    // Native error requires Settings entry (e.g., authorizationDenied)\n    await resetPermissions();\n  }\n}\n```\n\niOS `connect()` result mapping:\n\n| Input / Outcome | Prompt Behavior | `ready` | `hasPermissions` | `permissionStatus` | `nextAction` | Error Fields |\n|-----------------|-----------------|--------:|-----------------|------------------|--------------|--------------|\n| `requestPermission: false` and HealthKit available | No prompt | `false` | `\"unknown\"` | `\"unknown\"` | `\"GRANT_PERMISSIONS\"` | absent |\n| `requestPermission: true` with no native error | Prompt may appear | `true` | `\"unknown\"` | `\"unknown\"` | `\"NONE\"` | absent |\n| `requestPermission: true` with `authorizationDenied` | Prompt attempted; denied/system error | `false` | `\"unknown\"` | `\"unknown\"` | `\"OPEN_SETTINGS\"` | `errorCode: \"NATIVE_ERROR\"` |\n| `requestPermission: true` with `authorizationNotRequested` | Prompt attempted; no request | `false` | `\"unknown\"` | `\"unknown\"` | `\"GRANT_PERMISSIONS\"` | `errorCode: \"NATIVE_ERROR\"` |\n| `requestPermission: true` with other native error | Prompt/system error | `false` | `\"unknown\"` | `\"unknown\"` | `\"NONE\"` | `errorCode: \"NATIVE_ERROR\"` |\n\n---\n\n### `resetPermissions()`\n\nStarts a platform reset/manage-permission action.\n\n```ts\ntype ResetPermissionsResult = {\n  success: boolean;\n  supported: boolean;\n  platform?: 'android' | 'ios';\n  resetMode?: 'PROGRAMMATIC_REVOKE' | 'OPEN_SETTINGS' | 'OPEN_HEALTH_APP' | 'UNAVAILABLE';\n  didReset?: boolean;\n  openedTarget?: 'HEALTH_CONNECT_SETTINGS' | 'APPLE_HEALTH_APP' | 'APP_SETTINGS' | 'NONE';\n  verificationRequired?: boolean;\n  requiresAppRestart?: boolean;\n  nextAction?: 'RECHECK_PERMISSIONS' | 'OPEN_SETTINGS' | 'CHECK_ACCESS' | 'NONE';\n  message?: string;\n  userActionRequired?: boolean;\n  attemptedTargets?: Array<'APPLE_HEALTH_APP' | 'APP_SETTINGS'>;\n};\n\nconst status = await resetPermissions();\n```\n\n`resetPermissions` starts a platform-specific reset/manage-permission action. Android behavior is unchanged: it calls Health Connect's programmatic revoke path and returns `didReset: true` when the revoke request succeeds.\n\niOS cannot reset, revoke, grant, enable, or disable HealthKit permissions from the SDK. The iOS action is best-effort:\n\n- first attempt: open Apple Health with the unofficial `x-apple-health://` scheme;\n- fallback: open the app's official Settings page with `UIApplicationOpenSettingsURLString`;\n- final fallback: resolve with `resetMode: 'UNAVAILABLE'`, `openedTarget: 'NONE'`, and manual Health app instructions.\n\nConsumer apps must always show the returned iOS `message`/instructions when `userActionRequired` is true, ask the user to navigate to **Health app > profile picture > Apps > [This App]**, then let the user return and tap **Check Access**. `nextAction: 'CHECK_ACCESS'` means call `connect({ requestPermission: false, onMissingApp: 'status' })`; use `getHealthData()` when actual read verification is required because HealthKit read grants are not fully introspectable.\n\n---\n\n### `getHealthData(options)`\n\nReads normalized exercise data for a caller-selected absolute timestamp range.\n\n```ts\ntype GetHealthDataOptions = {\n  sinceMillis: number;\n  untilMillis: number;\n  bucketPeriod: 'hourly' | 'daily';\n  timeZone: string;\n  bmr: number;\n};\n\ntype ValueProvenance =\n  | 'platform_measured'\n  | 'platform_inferred'\n  | 'bmr_estimate'\n  | 'total_minus_basal_estimate'\n  | 'active_calorie_duration_estimate'\n  | 'none';\n\ntype ReadOutcome = 'succeeded' | 'partial' | 'denied' | 'unknown';\n\ntype EmptyReason =\n  | 'no_data'\n  | 'permission_denied'\n  | 'partial_permission'\n  | 'filtered_out'\n  | 'unknown';\n\ntype HealthDataBucket = {\n  steps: number;\n  totalCalories: number;\n  totalCaloriesUnit: string;\n  activeCalories: number;\n  activeCaloriesUnit: string;\n  activeCaloriesSource: 'device' | 'app' | 'manual' | 'unknown';\n  provenance: {\n    activeCalories: ValueProvenance;\n    basalCalories: ValueProvenance;\n    activeTime: ValueProvenance;\n  };\n  basalCalories: number;\n  basalCaloriesUnit: string;\n  distance: number;\n  distanceUnit: string;\n  activeTime: number;\n  activeTimeUnit: string;\n  startDate: string;\n  endDate: string;\n};\n\ntype HealthDataResult = {\n  summary: {\n    steps: number;\n    activeKcal: number;\n    distanceMeters: number;\n    activeTimeMillis: number;\n  };\n  meta: {\n    sinceMillis: number;\n    untilMillis: number;\n    timeZone: string;\n    bucketPeriod: 'hourly' | 'daily';\n    bucketCount: number;\n    units: {\n      calories: 'kcal';\n      distance: 'km';\n      activeTime: 'milliseconds';\n    };\n    readOutcome: ReadOutcome;\n    emptyReason?: EmptyReason;\n  };\n  records: HealthDataBucket[];\n  debug?: {\n    raw?: {\n      sampleCount: number;\n      workoutCount: number;\n      samples: Array<{\n        metric: string;\n        value: number;\n        startDate: string;\n        endDate: string;\n        sourceName: string;\n        sourceBundleId?: string | null;\n        isManual: boolean;\n      }>;\n      workouts: Array<{\n        startDate: string;\n        endDate: string;\n        sourceName: string;\n        sourceBundleId?: string | null;\n        isManual: boolean;\n      }>;\n    };\n  };\n};\n```\n\nTimestamp contract:\n\n- `sinceMillis` and `untilMillis` are Unix epoch milliseconds.\n- The range is `[sinceMillis, untilMillis)`: `sinceMillis` is inclusive and `untilMillis` is exclusive.\n- `untilMillis` must be greater than `sinceMillis`.\n- Epoch seconds, `NaN`, `Infinity`, invalid timestamps, invalid time zones, invalid `bmr`, and default-mode ranges over **30 days** are rejected.\n- An exact 30-day range is accepted.\n- `timeZone` is used only for bucket boundaries and date formatting; absolute timestamps are not reinterpreted as local time.\n\n> Periods longer than **30 days** reject in default mode with error code `E_INVALID_PERIOD`.\n\n> Health Connect also applies runtime read quotas, with stricter limits for background work. The SDK keeps a short-lived exact-query cache for successful `getHealthData()` responses, so repeated identical refreshes within 15 seconds can reuse the last result instead of re-reading Health Connect.\n\n> To further reduce quota pressure, the Android reader now paces internal Health Connect sub-reads, including paginated reads and retry attempts, and performs one fixed 5-second cooldown retry when Health Connect reports a rate-limit error. If the retry still fails, the SDK surfaces the existing `E_GET_EXERCISE_DATA` error path.\n\n> To maximize cache hits and avoid unnecessary quota use, keep `sinceMillis` and `untilMillis` stable within a refresh cycle instead of shifting the window on every poll, and let your scheduler or caller back off repeated background sync attempts. A full changelog-based sync strategy is out of scope for this SDK patch.\n\nPreferred response contract:\n\n- `summary.activeKcal` is the active-calorie total for the full query window.\n- `summary.distanceMeters` and `summary.activeTimeMillis` are full-window totals. Bucket `distance` remains kilometers for backward compatibility; summary distance is meters.\n- `summary` is always calculated from `records[]`: steps, active kcal, distance meters, and active time are sums of the emitted buckets.\n- `meta.sinceMillis`, `meta.untilMillis`, `meta.timeZone`, `meta.bucketPeriod`, `meta.bucketCount`, `meta.units`, `meta.readOutcome`, and optional `meta.emptyReason` describe the response shared by every bucket.\n- `meta.bucketCount === records.length`.\n- `records` is the hourly or daily bucket-by-bucket array returned for the requested `bucketPeriod`. Empty buckets are emitted with zero values.\n- `records[*].provenance` tells consumers whether `activeCalories`, `basalCalories`, and `activeTime` are measured, inferred, estimated, or absent for that bucket.\n- `debug` is an optional output-only field. When native returns it, the supported public shape is `debug.raw` with raw sample/workout counts and capped raw sample/workout previews. There is no `debug` request option.\n\nRecommended field usage:\n\n- Use `summary` for totals across the full query window.\n- Use `records` for charts, timelines, and bucket-by-bucket UI.\n- Use `meta` for shared response metadata such as range echo fields, `timeZone`, `bucketPeriod`, `bucketCount`, units, `readOutcome`, and `emptyReason`.\n- Use bucket `provenance` for product labels around measured, inferred, estimated, or absent values. Summary totals can mix provenance across buckets; bucket provenance is authoritative.\n- Treat `debug?.raw` as optional diagnostics output; do not use it for product empty-result logic or require it for normal app flows.\n\n---\n\n### `setAllowDatasource(config)`\n\nConfigures which data sources to exclude from results.\n\n```ts\ntype DatasourceType = 'manual' | 'device' | 'app' | 'unknown';\n\ntype DatasourceConfig = {\n  blacklist: DatasourceType[];\n};\n\n// Example: exclude manually-entered data\nawait setAllowDatasource({ blacklist: ['manual'] });\n```\n\n---\n\n### `getAllowDatasource()`\n\nReturns the current datasource blacklist configuration.\n\n```ts\nconst config = await getAllowDatasource();\n// => { blacklist: ['manual'] }\n```\n\n---\n\n## Troubleshooting\n\n### Error code 5: `HKErrorCodeAuthorizationDenied` (iOS)\n\nThis error occurs when HealthKit authorization is denied. Common causes and solutions:\n\n| Cause | Solution |\n|-------|----------|\n| Missing `NSHealthShareUsageDescription` in Info.plist | Add the key with a usage description string |\n| HealthKit capability not enabled | Enable HealthKit in Xcode project settings |\n| User previously denied permissions | Settings > Health > Data Access & Devices > [Your App] > enable permissions |\n| App not properly signed | Verify provisioning profile includes HealthKit entitlements |\n\n### `connect()` fails with an error\n\n- **Android**: Ensure Health Connect is installed (Android 13 and below) or available via Play Services (Android 14+)\n- **iOS**: Verify HealthKit is enabled in Xcode and the app is running on a physical device\n\n---\n\n## Bucket Record Schema\n\nUse `data.records` for per-bucket results:\n\n```ts\ntype UnifiedIntervalRecord = {\n  steps: number;\n  activeCalories: number;\n  activeCaloriesUnit: 'kcal';\n  activeCaloriesSource: 'device' | 'app' | 'manual' | 'unknown';\n  provenance: {\n    activeCalories: ValueProvenance;\n    basalCalories: ValueProvenance;\n    activeTime: ValueProvenance;\n  };\n  basalCalories: number;\n  basalCaloriesUnit: 'kcal';\n  distance: number;\n  distanceUnit: 'km';\n  activeTime: number;\n  activeTimeUnit: 'milliseconds';\n  startDate: string; // ISO offset string, e.g. \"2026-02-16T08:00:00+07:00\"\n  endDate: string;\n};\n```\n\n`records` are grouped by the requested `bucketPeriod`. The first and last record may be partial buckets when `sinceMillis` or `untilMillis` land mid-hour or mid-day.\n\nBucket behavior:\n\n- Bucket boundaries are built from `sinceMillis`, `untilMillis`, `bucketPeriod`, and `timeZone`.\n- Platform queries use the absolute `[sinceMillis, untilMillis)` range.\n- Bucket boundaries use local time in the requested `timeZone`, including DST transitions; a local day can therefore have 23, 24, or 25 hourly buckets where the time zone observes DST.\n- A full-day `Asia/Bangkok` hourly range produces 24 buckets.\n- A 30-day hourly range produces about 720 buckets, subject to DST in the selected `timeZone`.\n- Records or platform aggregate intervals that cross request or bucket boundaries are clipped/split locally.\n- Data exactly at `untilMillis` is outside the range.\n\n`activeCaloriesSource` classifies the datasource (`device`, `app`, `manual`, or `unknown`). It is not value provenance. Use `record.provenance` to distinguish measured, inferred, estimated, and absent values:\n\n- `platform_measured`: direct platform sample for the metric.\n- `platform_inferred`: inferred from a platform interval such as an exercise session or HealthKit workout.\n- `bmr_estimate`: calculated from caller-supplied `bmr`.\n- `total_minus_basal_estimate`: active calories estimated from total calories minus basal calories.\n- `active_calorie_duration_estimate`: active time estimated from active-calorie record duration.\n- `none`: no contributing source for that bucket field.\n\nEmpty or incomplete reads are represented on `data.meta`:\n\n- `readOutcome: 'succeeded'`: the read completed for the platform-known scope.\n- `readOutcome: 'partial'`: returned data may be incomplete, for example because permissions are partial or a platform query partially failed.\n- `readOutcome: 'denied'`: Android detected missing Health Connect read permission.\n- `readOutcome: 'unknown'`: the platform cannot safely distinguish the outcome, including ambiguous iOS HealthKit empty reads.\n- `emptyReason` is present only for effectively empty results and can be `no_data`, `permission_denied`, `partial_permission`, `filtered_out`, or `unknown`.\n\n`data.meta.units` still exposes the shared units once per response:\n\n```ts\n{\n  calories: 'kcal',\n  distance: 'km',\n  activeTime: 'milliseconds'\n}\n```\n\nThe current record shape still includes per-record unit fields and `basalCalories` for compatibility with existing consumers.\n\n`basalCalories` reflects the bucketed basal energy for that same interval. In the current Phase 2 contract, callers provide `bmr` in kcal/day and should treat detailed estimation provenance as a later contract phase.\n\nExample record:\n\n```json\n{\n  \"steps\": 1300,\n  \"activeCalories\": 60.2,\n  \"activeCaloriesUnit\": \"kcal\",\n  \"activeCaloriesSource\": \"device\",\n  \"basalCalories\": 42.5,\n  \"basalCaloriesUnit\": \"kcal\",\n  \"distance\": 1.0,\n  \"distanceUnit\": \"km\",\n  \"activeTime\": 1200000,\n  \"activeTimeUnit\": \"milliseconds\",\n  \"startDate\": \"2026-02-16T08:00:00+07:00\",\n  \"endDate\": \"2026-02-16T09:00:00+07:00\"\n}\n```\n\n---\n\n## Overlap Handling\n\nThe SDK automatically de-duplicates overlapping intervals before assigning active time to buckets. Overlapping intervals such as `09:00–10:00` plus `09:30–10:30` count as 90 minutes, not 120 minutes. Back-to-back intervals do not add overlap.\n\nDefault reads are aggregate/statistics-first so a 30-day hourly request does not raw-read every quantity sample or send raw platform records over the React Native bridge.\n\n| Platform | Quantity metrics | Active time | Risk control |\n|----------|------------------|-------------|--------------|\n| Android Health Connect | Aggregate/bucket APIs for steps, distance, and active calories where possible. | Exercise session intervals are clipped, unioned, and split into SDK buckets. | Raw quantity reads are reserved for source-aware filtering. Summary is derived from emitted buckets only. |\n| iOS HealthKit | `HKStatisticsCollectionQuery` cumulative sums for `stepCount`, `distanceWalkingRunning`, and `activeEnergyBurned`. | `HKWorkout` intervals are clipped, unioned, and split into SDK buckets. | HealthKit read permission certainty is not claimed; ambiguous empty iOS reads remain `readOutcome: 'unknown'` and `emptyReason: 'unknown'`. |\n\nDistance is returned on both platforms: bucket `records[].distance` is kilometers and `summary.distanceMeters` is meters. iOS distance comes from HealthKit `distanceWalkingRunning`.\n\nIf datasource/source filtering is configured, the SDK may switch to a slower source-aware path because aggregate/statistics APIs do not always expose enough source metadata. Source-aware raw-sample fallback can have platform-specific dedupe semantics; do not treat it as the performance baseline for normal unfiltered 30-day reads.\n\n---\n\n## Calories Fallback (Total - Basal)\n\nWhen direct active calories are unavailable or lower quality in some windows, the SDK can derive fallback active calories:\n\n`active = max(totalCalories - basalCalories, 0)`\n\n**Platform Behavior:**\n\n**Android (Health Connect):**\n- Basal calories are calculated from BMR supplied via `bmr` parameter: `bmr × (record duration / day)`\n- If no total calories record exists, basal defaults to 0 (proportional to data coverage)\n\n**iOS (HealthKit):**\n- Basal calories prefer actual `HKQuantityTypeIdentifierBasalEnergyBurned` data when available\n- Falls back to BMR calculation when no resting energy data exists: `bmr × (bucket duration / day)`\n- This provides more accurate basal values from Apple Watch measurements on iOS\n- Direct active-calorie measurement is preferred when present; fallback fills only uncovered windows.\n- Merge remains deterministic and avoids double counting across atomic windows.\n\n\n## Optional Debug Output\n\n`getHealthData()` does not accept a `debug` request option. Some native debug builds may include optional `data.debug.raw` output:\n\n```ts\ntype HealthDataDebug = {\n  raw?: {\n    sampleCount: number;\n    workoutCount: number;\n    samples: RawHealthDataSample[];\n    workouts: RawHealthDataWorkout[];\n  };\n};\n```\n\nTreat `debug?.raw` as optional diagnostics output. Do not require it for normal app flows, and do not branch product UX on its presence.\n\n---\n\n## Examples\n\n### Normal mode\n\n```ts\nimport {\n  connect,\n  getHealthData,\n  setAllowDatasource,\n} from '@cariva/vislife-health-sdk-rn';\n\nasync function loadHealthData() {\n  // Exclude manual entries\n  await setAllowDatasource({ blacklist: ['manual'] });\n\n  // Connect with minimal permission scope\n  const status = await connect({\n    onMissingApp: 'status',\n    requestPermission: true,\n    permissionScope: ['steps', 'calories'],\n  });\n\n  if (!status.ready) {\n    console.warn('Health Connect not ready. Next action:', status.nextAction);\n    return null;\n  }\n\n  // Query last 24 hours in hourly buckets\n  const data = await getHealthData({\n    sinceMillis: Date.now() - 24 * 60 * 60 * 1000,\n    untilMillis: Date.now(),\n    bucketPeriod: 'hourly',\n    timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n    bmr: 1500,\n  });\n\n  console.log(data.summary.activeKcal);\n  console.log(data.meta.readOutcome, data.meta.emptyReason);\n  console.log(data.records[0]?.provenance);\n\n  return data;\n}\n```\n\n### Silent status check\n\n```ts\nconst status = await connect({\n  requestPermission: false,\n  onMissingApp: 'status',\n});\n\nif (status.nextAction === 'GRANT_PERMISSIONS') {\n  // Show your own UI affordance, then call connect({ requestPermission: true }).\n}\n```\n\n### Optional debug output\n\n```ts\nconst data = await getHealthData({\n  sinceMillis: Date.now() - 24 * 60 * 60 * 1000,\n  untilMillis: Date.now(),\n  bucketPeriod: 'hourly',\n  timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n  bmr: 1500,\n});\n\nconsole.log(data.debug?.raw?.sampleCount);\nconsole.log(data.debug?.raw?.workoutCount);\n```\n\n---\n\n## Migration (2.0.0)\n\nThis release introduces a clean-break `connect` contract:\n\n- Removed `ConnectResult.googleFitInstalled`\n- Removed `nextAction: 'INSTALL_GOOGLE_FIT'`\n- `connect` readiness flow is now Health Connect-only\n\nIf you previously handled Google Fit branches, delete those checks and rely on:\n\n- `INSTALL_HEALTH_CONNECT`\n- `UPDATE_HEALTH_CONNECT`\n- `GRANT_PERMISSIONS`\n- `NONE`\n\n### Additive migration notes for `getHealthData`\n\n- Prefer `summary` + `meta` + `records` for new integrations.\n- `summary.activeKcal` is the explicit active-calorie total and corresponds to the legacy `totalKcal`.\n- `includeEmptyBuckets: false` now filters the projected `records` view only; totals still come from the unfiltered aggregation result.\n- `records` continue to use the existing `UnifiedIntervalRecord` schema in this release.\n- `notices`, legacy top-level totals, `warnings`, `integrity`, and `diagnostics` now appear only when `debug: true` is enabled.\n\n## Fixed\n\n- **Double-count bug in `generateDayToDayQueryRequests`:** Multi-day requests now split the range into consecutive non-overlapping ≤24h chunks. The previous implementation added all per-day chunks then unconditionally re-added the full original range, causing every day to be bucketed twice for multi-day queries.\n","readmeFilename":"README.md"}