{"_id":"@continuonai/rcan-ts","_rev":"13-e733b22f38f58b233a00953ffcbd3e06","name":"@continuonai/rcan-ts","dist-tags":{"latest":"1.3.0"},"versions":{"0.1.1":{"name":"@continuonai/rcan-ts","version":"0.1.1","keywords":["robotics","rcan","protocol","ai-safety","embodied-ai","typescript"],"author":{"name":"Craig Merry","email":"cmmerry@ucdavis.edu"},"license":"MIT","_id":"@continuonai/rcan-ts@0.1.1","maintainers":[{"name":"craigm26","email":"craigm26@gmail.com"}],"homepage":"https://github.com/continuonai/rcan-ts#readme","bugs":{"url":"https://github.com/continuonai/rcan-ts/issues"},"bin":{"rcan-validate":"dist/rcan-validate.js"},"dist":{"shasum":"705c9f9224e93267199e5a8e0c54750283fe41fd","tarball":"https://registry.npmjs.org/@continuonai/rcan-ts/-/rcan-ts-0.1.1.tgz","fileCount":12,"integrity":"sha512-Y4M3bccUc6+fy5W1eVduoktBpNgvb6S6F3bnNkFOmIP6YYEOyfq8X0QLWT0YrqFYCgNA8hUjqNl/StuOpQrsbA==","signatures":[{"sig":"MEYCIQDq4X4lvQgEBV6ulG5PKYB0wmfhz8QUy2+HiKYkzF6WLAIhAP710YCXXG+6YRM1BTlQwgoK55Glwe2bG05IU8zFlC5A","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":421563},"jest":{"preset":"ts-jest","testMatch":["**/tests/**/*.test.ts"],"testEnvironment":"node","moduleNameMapper":{"^(\\.{1,2}/.*)\\.js$":"$1"}},"main":"dist/index.cjs","types":"dist/index.d.ts","module":"dist/index.mjs","browser":"dist/browser.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","browser":"./dist/browser.mjs","require":"./dist/index.cjs"}},"gitHead":"50c3fcd7927a407d91ccd6bb875ccb61315d573b","scripts":{"test":"jest","build":"tsup","postbuild":"chmod +x dist/rcan-validate.js","typecheck":"tsc --noEmit"},"_npmUser":{"name":"craigm26","email":"craigm26@gmail.com"},"repository":{"url":"git+https://github.com/continuonai/rcan-ts.git","type":"git"},"_npmVersion":"10.8.2","description":"Official TypeScript SDK for the RCAN v1.2 robot communication protocol","directories":{},"sideEffects":false,"_nodeVersion":"20.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","tsup":"^8.5.1","ts-jest":"^29.1.0","typescript":"^5.3.0","@types/jest":"^29.5.0"},"_npmOperationalInternal":{"tmp":"tmp/rcan-ts_0.1.1_1772818786508_0.9130537909690748","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@continuonai/rcan-ts","version":"0.1.2","keywords":["robotics","rcan","protocol","ai-safety","embodied-ai","typescript"],"author":{"name":"Craig Merry","email":"cmmerry@ucdavis.edu"},"license":"MIT","_id":"@continuonai/rcan-ts@0.1.2","maintainers":[{"name":"craigm26","email":"craigm26@gmail.com"}],"homepage":"https://github.com/continuonai/rcan-ts#readme","bugs":{"url":"https://github.com/continuonai/rcan-ts/issues"},"bin":{"rcan-validate":"dist/rcan-validate.js"},"cdn":"./dist/rcan.iife.js","dist":{"shasum":"072ac79ef66bb1ab90f2e31d0505d717cfa06c4f","tarball":"https://registry.npmjs.org/@continuonai/rcan-ts/-/rcan-ts-0.1.2.tgz","fileCount":13,"integrity":"sha512-SAYQJ0V+ib/6NzrCDpcJ+Vcvr8PtFfuQ5Is/o0GOn+rP05yTjbe2MiG022cf71BMb0jN07uxX8Ot/GR5ImG0lw==","signatures":[{"sig":"MEYCIQDUPqCYBhB9o/9YdtaZDnC4fcAw+/Q7vNnIZhQC9QfYtAIhAOs9rBM8dweANSDqdhxQnco9IErC67SPneSs4TT8yjjg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":437830},"jest":{"preset":"ts-jest","testMatch":["**/tests/**/*.test.ts"],"testEnvironment":"node","moduleNameMapper":{"^(\\.{1,2}/.*)\\.js$":"$1"}},"main":"dist/index.cjs","types":"dist/index.d.ts","unpkg":"./dist/rcan.iife.js","module":"dist/index.mjs","browser":"dist/browser.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","browser":"./dist/browser.mjs","require":"./dist/index.cjs"}},"gitHead":"561f3f644f037193a812826b842d7137ef70a86c","scripts":{"test":"jest","build":"tsup","postbuild":"chmod +x dist/rcan-validate.js","typecheck":"tsc --noEmit"},"_npmUser":{"name":"craigm26","email":"craigm26@gmail.com"},"jsdelivr":"./dist/rcan.iife.js","repository":{"url":"git+https://github.com/continuonai/rcan-ts.git","type":"git"},"_npmVersion":"10.8.2","description":"Official TypeScript SDK for the RCAN v1.2 robot communication protocol","directories":{},"sideEffects":false,"_nodeVersion":"20.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","tsup":"^8.5.1","ts-jest":"^29.1.0","typescript":"^5.3.0","@types/jest":"^29.5.0"},"_npmOperationalInternal":{"tmp":"tmp/rcan-ts_0.1.2_1772820134867_0.21531442916532817","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@continuonai/rcan-ts","version":"0.2.0","keywords":["robotics","rcan","protocol","ai-safety","embodied-ai","typescript"],"author":{"name":"Craig Merry","email":"cmmerry@ucdavis.edu"},"license":"MIT","_id":"@continuonai/rcan-ts@0.2.0","maintainers":[{"name":"craigm26","email":"craigm26@gmail.com"}],"homepage":"https://github.com/continuonai/rcan-ts#readme","bugs":{"url":"https://github.com/continuonai/rcan-ts/issues"},"bin":{"rcan-validate":"dist/rcan-validate.js"},"cdn":"./dist/rcan.iife.js","dist":{"shasum":"e52c25d6041d2b468ca05e2290f4945a43bd3231","tarball":"https://registry.npmjs.org/@continuonai/rcan-ts/-/rcan-ts-0.2.0.tgz","fileCount":13,"integrity":"sha512-aUqPRHpzroxhjs2IoWDoND2w9y/FZcxhZau7HIXnUKpuNnVVLfsQ/5ke+rM93aXHr1xkoSzK91/sHa7w+W14WA==","signatures":[{"sig":"MEYCIQCIN1q0MJCSK+5v8AV+ccHldd0HIzhEq6e1J9fhIf1ihwIhALCJfPKk+QESqTPombxpsrfVzPSNdFVpOsGZNeBY/KqX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":443466},"jest":{"preset":"ts-jest","testMatch":["**/tests/**/*.test.ts"],"testEnvironment":"node","moduleNameMapper":{"^(\\.{1,2}/.*)\\.js$":"$1"}},"main":"dist/index.cjs","types":"dist/index.d.ts","unpkg":"./dist/rcan.iife.js","module":"dist/index.mjs","browser":"dist/browser.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","browser":"./dist/browser.mjs","require":"./dist/index.cjs"}},"gitHead":"1d0b7ca723032acf990bb8e1688b26bb8c770e0a","scripts":{"test":"jest","build":"tsup","postbuild":"chmod +x dist/rcan-validate.js","typecheck":"tsc --noEmit"},"_npmUser":{"name":"craigm26","email":"craigm26@gmail.com"},"jsdelivr":"./dist/rcan.iife.js","repository":{"url":"git+https://github.com/continuonai/rcan-ts.git","type":"git"},"_npmVersion":"10.8.2","description":"Official TypeScript SDK for the RCAN v1.2 robot communication protocol","directories":{},"sideEffects":false,"_nodeVersion":"20.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","tsup":"^8.5.1","ts-jest":"^29.1.0","typescript":"^5.3.0","@types/jest":"^29.5.0"},"_npmOperationalInternal":{"tmp":"tmp/rcan-ts_0.2.0_1772820619876_0.03509327177902244","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@continuonai/rcan-ts","version":"0.3.0","keywords":["robotics","rcan","protocol","ai-safety","embodied-ai","typescript"],"author":{"name":"Craig Merry","email":"cmmerry@ucdavis.edu"},"license":"MIT","_id":"@continuonai/rcan-ts@0.3.0","maintainers":[{"name":"craigm26","email":"craigm26@gmail.com"}],"homepage":"https://github.com/continuonai/rcan-ts#readme","bugs":{"url":"https://github.com/continuonai/rcan-ts/issues"},"bin":{"rcan-validate":"bin/rcan-validate.mjs"},"cdn":"./dist/rcan.iife.js","dist":{"shasum":"d2e3e3346f1fe44101aa39e4cc218113b3bbe62e","tarball":"https://registry.npmjs.org/@continuonai/rcan-ts/-/rcan-ts-0.3.0.tgz","fileCount":14,"integrity":"sha512-ZyDxysSklD4+GD5xlRroJjVDEbZEaCAAqgnP2eGZsI/WlnUFXoZF8puvUsDxNtBXBGiIgcR9Uz/pZWiwHHT3LA==","signatures":[{"sig":"MEYCIQCNObnDo+1oziRpqKnG0N6rOkmGSjZ63cNyhY76DBLHXAIhANZdi8ggLUJ9myLFQgulFIHCqbQS/zMUtj0m3OBWI9R7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":554414},"jest":{"preset":"ts-jest","testMatch":["**/tests/**/*.test.ts"],"testEnvironment":"node","moduleNameMapper":{"^(\\.{1,2}/.*)\\.js$":"$1"}},"main":"dist/index.cjs","types":"dist/index.d.ts","unpkg":"./dist/rcan.iife.js","module":"dist/index.mjs","browser":"dist/browser.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","browser":"./dist/browser.mjs","require":"./dist/index.cjs"}},"gitHead":"1407653f1bcb1fd5b37fe65fe59e85a8e8d67134","scripts":{"test":"jest","build":"tsup","postbuild":"chmod +x bin/rcan-validate.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"craigm26","email":"craigm26@gmail.com"},"jsdelivr":"./dist/rcan.iife.js","repository":{"url":"git+https://github.com/continuonai/rcan-ts.git","type":"git"},"_npmVersion":"10.8.2","description":"Official TypeScript SDK for the RCAN v1.2 robot communication protocol","directories":{},"sideEffects":false,"_nodeVersion":"20.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","tsup":"^8.5.1","ts-jest":"^29.1.0","typescript":"^5.3.0","@types/jest":"^29.5.0"},"_npmOperationalInternal":{"tmp":"tmp/rcan-ts_0.3.0_1772829086978_0.5014646087555334","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@continuonai/rcan-ts","version":"0.5.0","keywords":["robotics","rcan","protocol","ai-safety","embodied-ai","typescript"],"author":{"name":"Craig Merry","email":"cmmerry@ucdavis.edu"},"license":"MIT","_id":"@continuonai/rcan-ts@0.5.0","maintainers":[{"name":"craigm26","email":"craigm26@gmail.com"}],"homepage":"https://github.com/continuonai/rcan-ts#readme","bugs":{"url":"https://github.com/continuonai/rcan-ts/issues"},"bin":{"rcan-validate":"bin/rcan-validate.mjs"},"cdn":"./dist/rcan.iife.js","dist":{"shasum":"20fa7f4d36b4fc1185bd073e41fec17fad3344dd","tarball":"https://registry.npmjs.org/@continuonai/rcan-ts/-/rcan-ts-0.5.0.tgz","fileCount":14,"integrity":"sha512-VsTiEY9H86goWnNw/5O0I8scOk2w9ZKrYBq4BlurUxL9S3uLgmOzs1qokA7EvNEvgA1iSUBwrxA54G36S4V1FA==","signatures":[{"sig":"MEYCIQCgp9ib+4vjsI1KtrIcTYwo+7y6opX7Wvr4AYVPXiBbnQIhAIA5gE0batjB9Y7+7AeZGe0Fw/+ar5Bl7C2ZI7Ajiy4u","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":981362},"jest":{"preset":"ts-jest","testMatch":["**/tests/**/*.test.ts"],"testEnvironment":"node","moduleNameMapper":{"^(\\.{1,2}/.*)\\.js$":"$1"}},"main":"dist/index.cjs","types":"dist/index.d.ts","unpkg":"./dist/rcan.iife.js","module":"dist/index.mjs","browser":"dist/browser.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","browser":"./dist/browser.mjs","require":"./dist/index.cjs"}},"gitHead":"1040a542e1aa88523e7161ec7cfb06e799054913","scripts":{"test":"jest","build":"tsup","postbuild":"chmod +x bin/rcan-validate.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"craigm26","email":"craigm26@gmail.com"},"jsdelivr":"./dist/rcan.iife.js","repository":{"url":"git+https://github.com/continuonai/rcan-ts.git","type":"git"},"_npmVersion":"10.8.2","description":"Official TypeScript SDK for the RCAN v1.5 robot communication protocol","directories":{},"sideEffects":false,"_nodeVersion":"20.20.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","tsup":"^8.5.1","ts-jest":"^29.1.0","typescript":"^5.3.0","@types/jest":"^29.5.0"},"_npmOperationalInternal":{"tmp":"tmp/rcan-ts_0.5.0_1773705210432_0.6970239351975724","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@continuonai/rcan-ts","version":"0.6.0","keywords":["robotics","rcan","protocol","ai-safety","embodied-ai","typescript"],"author":{"name":"Craig Merry","email":"cmmerry@ucdavis.edu"},"license":"MIT","_id":"@continuonai/rcan-ts@0.6.0","maintainers":[{"name":"craigm26","email":"craigm26@gmail.com"}],"homepage":"https://github.com/continuonai/rcan-ts#readme","bugs":{"url":"https://github.com/continuonai/rcan-ts/issues"},"bin":{"rcan-validate":"bin/rcan-validate.mjs"},"cdn":"./dist/rcan.iife.js","dist":{"shasum":"5b407e8111db1cbf1b1d4ec0b554c37f11ff4122","tarball":"https://registry.npmjs.org/@continuonai/rcan-ts/-/rcan-ts-0.6.0.tgz","fileCount":14,"integrity":"sha512-bvXHnqvbKNex5rxMbLzm7Ftn0ep2EVnQ33AS2fuouNXuI3E7yJMmslKl4OrXOdweoo258T+EuXSBg+I9kUnElg==","signatures":[{"sig":"MEQCIBn/qAB/v9G7wfhC8glXi1Q/VNNQNjJsEjtOk7o0vsyzAiBn2ttbR+5QC8m3ebIKwWyglIt6C7/XQYYUdhziJk/bsg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1244974},"jest":{"preset":"ts-jest","testMatch":["**/tests/**/*.test.ts"],"testEnvironment":"node","moduleNameMapper":{"^(\\.{1,2}/.*)\\.js$":"$1"}},"main":"dist/index.cjs","types":"dist/index.d.ts","unpkg":"./dist/rcan.iife.js","module":"dist/index.mjs","browser":"dist/browser.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","browser":"./dist/browser.mjs","require":"./dist/index.cjs"}},"gitHead":"33a3068f8a1b2361db7d1029776835bdbcdfaf7e","scripts":{"test":"jest","build":"tsup","postbuild":"chmod +x bin/rcan-validate.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"craigm26","email":"craigm26@gmail.com"},"jsdelivr":"./dist/rcan.iife.js","repository":{"url":"git+https://github.com/continuonai/rcan-ts.git","type":"git"},"_npmVersion":"10.8.2","description":"Official TypeScript SDK for the RCAN v1.6 robot communication protocol","directories":{},"sideEffects":false,"_nodeVersion":"20.20.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","tsup":"^8.5.1","ts-jest":"^29.1.0","typescript":"^5.3.0","@types/jest":"^29.5.0"},"_npmOperationalInternal":{"tmp":"tmp/rcan-ts_0.6.0_1773712044569_0.8926115871168696","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@continuonai/rcan-ts","version":"0.8.0","keywords":["robotics","rcan","protocol","ai-safety","embodied-ai","typescript"],"author":{"name":"Craig Merry","email":"cmmerry@ucdavis.edu"},"license":"MIT","_id":"@continuonai/rcan-ts@0.8.0","maintainers":[{"name":"craigm26","email":"craigm26@gmail.com"}],"homepage":"https://github.com/continuonai/rcan-ts#readme","bugs":{"url":"https://github.com/continuonai/rcan-ts/issues"},"bin":{"rcan-validate":"bin/rcan-validate.mjs"},"cdn":"./dist/rcan.iife.js","dist":{"shasum":"1d26038dd86ad014e03f2cd437f1ad355f673dfe","tarball":"https://registry.npmjs.org/@continuonai/rcan-ts/-/rcan-ts-0.8.0.tgz","fileCount":14,"integrity":"sha512-VpQXumlEZr2AcPJm9uc+APZOhOYG+xnIJdXqBKEzJ4gDb/UMfLkikzoMDV6rPjgDqa62RJk8KdORwrN53Q9hgg==","signatures":[{"sig":"MEQCIAcQp9/dLdiHfJesJEOMq3ySj+506Gpl0kg52xaZPGAnAiBDTH49cSA0rLz5Ue+rZzitUQTPbkD/TV2+WApBAciNNQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1294325},"jest":{"preset":"ts-jest","testMatch":["**/tests/**/*.test.ts"],"testEnvironment":"node","moduleNameMapper":{"^(\\.{1,2}/.*)\\.js$":"$1"}},"main":"dist/index.cjs","types":"dist/index.d.ts","unpkg":"./dist/rcan.iife.js","module":"dist/index.mjs","browser":"dist/browser.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","browser":"./dist/browser.mjs","require":"./dist/index.cjs"}},"gitHead":"1409e56c3a9a06e2c0398b55fd2786bfe354da11","scripts":{"test":"jest","build":"tsup","postbuild":"chmod +x bin/rcan-validate.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"craigm26","email":"craigm26@gmail.com"},"jsdelivr":"./dist/rcan.iife.js","repository":{"url":"git+https://github.com/continuonai/rcan-ts.git","type":"git"},"_npmVersion":"10.8.2","description":"Official TypeScript SDK for the RCAN v1.6 robot communication protocol","directories":{},"sideEffects":false,"_nodeVersion":"20.20.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","tsup":"^8.5.1","ts-jest":"^29.1.0","typescript":"^5.3.0","@types/jest":"^29.5.0"},"_npmOperationalInternal":{"tmp":"tmp/rcan-ts_0.8.0_1774072755947_0.6139031390873695","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@continuonai/rcan-ts","version":"1.1.0","keywords":["robotics","rcan","protocol","ai-safety","embodied-ai","typescript"],"author":{"name":"Craig Merry","email":"cmmerry@ucdavis.edu"},"license":"MIT","_id":"@continuonai/rcan-ts@1.1.0","maintainers":[{"name":"craigm26","email":"craigm26@gmail.com"}],"homepage":"https://github.com/continuonai/rcan-ts#readme","bugs":{"url":"https://github.com/continuonai/rcan-ts/issues"},"bin":{"rcan-validate":"bin/rcan-validate.mjs"},"cdn":"./dist/rcan.iife.js","dist":{"shasum":"e5bb3aaff9f4a64fd3217b0c27f1594922e9d3bf","tarball":"https://registry.npmjs.org/@continuonai/rcan-ts/-/rcan-ts-1.1.0.tgz","fileCount":14,"integrity":"sha512-aya5y/9KOnA2+GGX/74nYC87SpC3rvzI46zpT6+paWJP4HAoXnUwBozMkOpaqjmEfUBMB/mW3zP9pTd48fz4dw==","signatures":[{"sig":"MEYCIQC5ih8f5zCHca+tpz+ThKMSFqlB2OUGX3/E0BlyLpOmIQIhAL+8l4xJfteOL0KM7SNoIwDf5a9qyJ9BbnYgN1A8jH9a","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1518218},"jest":{"preset":"ts-jest","testMatch":["**/tests/**/*.test.ts"],"testEnvironment":"node","moduleNameMapper":{"^(\\.{1,2}/.*)\\.js$":"$1"}},"main":"dist/index.cjs","types":"dist/index.d.ts","unpkg":"./dist/rcan.iife.js","module":"dist/index.mjs","browser":"dist/browser.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","browser":"./dist/browser.mjs","require":"./dist/index.cjs"}},"gitHead":"f3e95ed111fdced3689a9a792ce07f68c7f39c36","scripts":{"test":"jest","build":"tsup","postbuild":"chmod +x bin/rcan-validate.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"craigm26","email":"craigm26@gmail.com"},"jsdelivr":"./dist/rcan.iife.js","repository":{"url":"git+https://github.com/continuonai/rcan-ts.git","type":"git"},"_npmVersion":"10.8.2","description":"Official TypeScript SDK for the RCAN v1.6 robot communication protocol","directories":{},"sideEffects":false,"_nodeVersion":"20.20.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","tsup":"^8.5.1","ts-jest":"^29.1.0","typescript":"^5.3.0","@types/jest":"^29.5.0"},"_npmOperationalInternal":{"tmp":"tmp/rcan-ts_1.1.0_1774561015014_0.8248330659599985","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@continuonai/rcan-ts","version":"1.2.0","keywords":["robotics","rcan","protocol","ai-safety","embodied-ai","typescript"],"author":{"name":"Craig Merry","email":"cmmerry@ucdavis.edu"},"license":"MIT","_id":"@continuonai/rcan-ts@1.2.0","maintainers":[{"name":"craigm26","email":"craigm26@gmail.com"}],"homepage":"https://github.com/continuonai/rcan-ts#readme","bugs":{"url":"https://github.com/continuonai/rcan-ts/issues"},"bin":{"rcan-validate":"bin/rcan-validate.mjs"},"cdn":"./dist/rcan.iife.js","dist":{"shasum":"7093365c2b0c104364ecd4af0aa1854071379c9a","tarball":"https://registry.npmjs.org/@continuonai/rcan-ts/-/rcan-ts-1.2.0.tgz","fileCount":14,"integrity":"sha512-my+lh4u15Q/0TaNWQuRhQjFYbJqw779xjDAVMPpG/JEvVjjhifC+xoJK0UlJ6lYy9pt+iKZGBPKh1CamsPyrJA==","signatures":[{"sig":"MEYCIQCYPIEWHmMbyr6fTDF1YsI3XUj3HAw5J86BDoZcYuFbXQIhAP+i4+XT2vyz4fQTp+GoIbfaXdPXV7SjXg6VFbfuvD5G","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1610139},"jest":{"preset":"ts-jest/presets/default-esm","globals":{},"testMatch":["**/tests/**/*.test.ts"],"transform":{"^.+\\.tsx?$":["ts-jest",{"useESM":true,"tsconfig":{"module":"ESNext","moduleResolution":"Bundler"}}]},"injectGlobals":true,"testEnvironment":"node","moduleNameMapper":{"^(\\.{1,2}/.*)\\.js$":"$1"},"extensionsToTreatAsEsm":[".ts"],"transformIgnorePatterns":["node_modules/(?!(@noble/post-quantum|@noble/hashes)/)"]},"main":"dist/index.cjs","types":"dist/index.d.ts","unpkg":"./dist/rcan.iife.js","module":"dist/index.mjs","browser":"dist/browser.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","browser":"./dist/browser.mjs","require":"./dist/index.cjs"}},"gitHead":"7a3bda0d5a62bf7bd7ff1d5b61048a1865899c27","scripts":{"test":"node --experimental-vm-modules node_modules/.bin/jest","build":"tsup","postbuild":"chmod +x bin/rcan-validate.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"craigm26","email":"craigm26@gmail.com"},"jsdelivr":"./dist/rcan.iife.js","repository":{"url":"git+https://github.com/continuonai/rcan-ts.git","type":"git"},"_npmVersion":"10.8.2","description":"Official TypeScript SDK for the RCAN v1.6 robot communication protocol","directories":{},"sideEffects":false,"_nodeVersion":"20.20.1","dependencies":{"@noble/post-quantum":"^0.5.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","tsup":"^8.5.1","ts-jest":"^29.1.0","typescript":"^5.3.0","@types/jest":"^29.5.0"},"_npmOperationalInternal":{"tmp":"tmp/rcan-ts_1.2.0_1774569380165_0.7187148359073361","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@continuonai/rcan-ts","version":"1.2.1","keywords":["robotics","rcan","protocol","ai-safety","embodied-ai","typescript"],"author":{"name":"Craig Merry","email":"cmmerry@ucdavis.edu"},"license":"MIT","_id":"@continuonai/rcan-ts@1.2.1","maintainers":[{"name":"craigm26","email":"craigm26@gmail.com"}],"homepage":"https://github.com/continuonai/rcan-ts#readme","bugs":{"url":"https://github.com/continuonai/rcan-ts/issues"},"bin":{"rcan-validate":"bin/rcan-validate.mjs"},"cdn":"./dist/rcan.iife.js","dist":{"shasum":"1e8655c79f74b92f193cf610f589de16c44e9df0","tarball":"https://registry.npmjs.org/@continuonai/rcan-ts/-/rcan-ts-1.2.1.tgz","fileCount":14,"integrity":"sha512-CQDcoTMKmrQXbpSjL4+YUUGhnVEmb3dnl9w6bH0thLx7uS6sG6uxO3ZAuMva5/oISPmx2WTU+MK+gQzsCQj0xA==","signatures":[{"sig":"MEUCIQDSQoXG1Tox4Z7J3QNuWyr8pRGILMuU+xPyjdbd5Jd47QIgbt9/ij0VXYiR27C+JciNWPe+k7GMtGOkmCEroeRBx0o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1598499},"jest":{"preset":"ts-jest/presets/default-esm","globals":{},"testMatch":["**/tests/**/*.test.ts"],"transform":{"^.+\\.tsx?$":["ts-jest",{"useESM":true,"tsconfig":{"module":"ESNext","moduleResolution":"Bundler"}}]},"injectGlobals":true,"testEnvironment":"node","moduleNameMapper":{"^(\\.{1,2}/.*)\\.js$":"$1"},"setupFilesAfterEnv":["<rootDir>/tests/jest.setup.ts"],"extensionsToTreatAsEsm":[".ts"],"transformIgnorePatterns":["node_modules/(?!(@noble/post-quantum|@noble/hashes)/)"]},"main":"dist/index.cjs","types":"dist/index.d.ts","unpkg":"./dist/rcan.iife.js","module":"dist/index.mjs","browser":"dist/browser.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","browser":"./dist/browser.mjs","require":"./dist/index.cjs"}},"gitHead":"1307422047122f6290597041dd7019f56b2ed43e","scripts":{"test":"node --experimental-vm-modules node_modules/.bin/jest","build":"tsup","postbuild":"chmod +x bin/rcan-validate.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"craigm26","email":"craigm26@gmail.com"},"jsdelivr":"./dist/rcan.iife.js","repository":{"url":"git+https://github.com/continuonai/rcan-ts.git","type":"git"},"_npmVersion":"10.8.2","description":"Official TypeScript SDK for the RCAN v1.6 robot communication protocol","directories":{},"sideEffects":false,"_nodeVersion":"20.20.1","dependencies":{"@noble/post-quantum":"^0.5.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","tsup":"^8.5.1","ts-jest":"^29.1.0","typescript":"^5.3.0","@types/jest":"^29.5.0"},"_npmOperationalInternal":{"tmp":"tmp/rcan-ts_1.2.1_1774577845744_0.006818097186544803","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@continuonai/rcan-ts","version":"1.2.2","keywords":["robotics","rcan","protocol","ai-safety","embodied-ai","typescript"],"author":{"name":"Craig Merry","email":"cmmerry@ucdavis.edu"},"license":"MIT","_id":"@continuonai/rcan-ts@1.2.2","maintainers":[{"name":"craigm26","email":"craigm26@gmail.com"}],"homepage":"https://github.com/continuonai/rcan-ts#readme","bugs":{"url":"https://github.com/continuonai/rcan-ts/issues"},"bin":{"rcan-validate":"bin/rcan-validate.mjs"},"cdn":"./dist/rcan.iife.js","dist":{"shasum":"f4997002a949bf226840837c5303bd70364c6abe","tarball":"https://registry.npmjs.org/@continuonai/rcan-ts/-/rcan-ts-1.2.2.tgz","fileCount":14,"integrity":"sha512-tKa0cY03E3tIYUoHU7rsU3tTDP8g4ezazx2EPIn5HI12/oS03yR5Rvo5eyjH8zBZnhW0YLSfYF0g6AoHkkzvjw==","signatures":[{"sig":"MEQCIB+aAhM7klv8+suA6nACGuzaO1Ams76IKmylxL0Ulv8lAiB8WtUUyzZd7G7cLT0S7rVQKugOPB4lxwRGH0J/wmqfRA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1598499},"jest":{"preset":"ts-jest/presets/default-esm","globals":{},"testMatch":["**/tests/**/*.test.ts"],"transform":{"^.+\\.tsx?$":["ts-jest",{"useESM":true,"tsconfig":{"module":"ESNext","moduleResolution":"Bundler"}}]},"injectGlobals":true,"testEnvironment":"node","moduleNameMapper":{"^(\\.{1,2}/.*)\\.js$":"$1"},"setupFilesAfterEnv":["<rootDir>/tests/jest.setup.ts"],"extensionsToTreatAsEsm":[".ts"],"transformIgnorePatterns":["node_modules/(?!(@noble/post-quantum|@noble/hashes)/)"]},"main":"dist/index.cjs","types":"dist/index.d.ts","unpkg":"./dist/rcan.iife.js","module":"dist/index.mjs","browser":"dist/browser.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","browser":"./dist/browser.mjs","require":"./dist/index.cjs"}},"gitHead":"31ab404a061860988a7ae3c1171a86678ab70f1f","scripts":{"test":"node --experimental-vm-modules node_modules/.bin/jest","build":"tsup","postbuild":"chmod +x bin/rcan-validate.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"craigm26","email":"craigm26@gmail.com"},"jsdelivr":"./dist/rcan.iife.js","repository":{"url":"git+https://github.com/continuonai/rcan-ts.git","type":"git"},"_npmVersion":"10.8.2","description":"Official TypeScript SDK for the RCAN v1.6 robot communication protocol","directories":{},"sideEffects":false,"_nodeVersion":"20.20.1","dependencies":{"@noble/post-quantum":"^0.5.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","tsup":"^8.5.1","ts-jest":"^29.1.0","typescript":"^5.3.0","@types/jest":"^29.5.0"},"_npmOperationalInternal":{"tmp":"tmp/rcan-ts_1.2.2_1774756390452_0.28926353364165647","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"@continuonai/rcan-ts","version":"1.2.3","keywords":["robotics","rcan","protocol","ai-safety","embodied-ai","typescript"],"author":{"name":"Craig Merry","email":"cmmerry@ucdavis.edu"},"license":"MIT","_id":"@continuonai/rcan-ts@1.2.3","maintainers":[{"name":"craigm26","email":"craigm26@gmail.com"}],"homepage":"https://github.com/continuonai/rcan-ts#readme","bugs":{"url":"https://github.com/continuonai/rcan-ts/issues"},"bin":{"rcan-validate":"bin/rcan-validate.mjs"},"cdn":"./dist/rcan.iife.js","dist":{"shasum":"227b2a3be048a43bb4aaa442500651b507160d53","tarball":"https://registry.npmjs.org/@continuonai/rcan-ts/-/rcan-ts-1.2.3.tgz","fileCount":14,"integrity":"sha512-b68Vzvdou5EXbkVnWWp6OMvsByiXuFnSBZR23j9W7xJIACZZBH+O9Ff8OH0Mu4iUksGLAb1Pdijwfi7NdEMn0g==","signatures":[{"sig":"MEUCIQDlUYp19mbLbwDoBRYkeQ+bmJIO6GCo6CmN+Dt/QVhceAIgLQHBQIQ0SB+EJVMRfraL+gc2rGitmIFwS6kNDpXgpJk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1630684},"jest":{"preset":"ts-jest/presets/default-esm","globals":{},"testMatch":["**/tests/**/*.test.ts"],"transform":{"^.+\\.tsx?$":["ts-jest",{"useESM":true,"tsconfig":{"module":"ESNext","moduleResolution":"Bundler"}}]},"injectGlobals":true,"testEnvironment":"node","moduleNameMapper":{"^(\\.{1,2}/.*)\\.js$":"$1"},"setupFilesAfterEnv":["<rootDir>/tests/jest.setup.ts"],"extensionsToTreatAsEsm":[".ts"],"transformIgnorePatterns":["node_modules/(?!(@noble/post-quantum|@noble/hashes)/)"]},"main":"dist/index.cjs","types":"dist/index.d.ts","unpkg":"./dist/rcan.iife.js","module":"dist/index.mjs","browser":"dist/browser.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","browser":"./dist/browser.mjs","require":"./dist/index.cjs"}},"gitHead":"a3d0e3bfa9f62cee6de0e523359d92249650b64a","scripts":{"test":"node --experimental-vm-modules node_modules/.bin/jest","build":"tsup","postbuild":"chmod +x bin/rcan-validate.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"craigm26","email":"craigm26@gmail.com"},"jsdelivr":"./dist/rcan.iife.js","repository":{"url":"git+https://github.com/continuonai/rcan-ts.git","type":"git"},"_npmVersion":"10.8.2","description":"Official TypeScript SDK for the RCAN v1.6 robot communication protocol","directories":{},"sideEffects":false,"_nodeVersion":"20.20.1","dependencies":{"@noble/post-quantum":"^0.5.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","tsup":"^8.5.1","ts-jest":"^29.1.0","typescript":"^5.3.0","@types/jest":"^29.5.0"},"_npmOperationalInternal":{"tmp":"tmp/rcan-ts_1.2.3_1774828121541_0.11411415660930735","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@continuonai/rcan-ts","version":"1.3.0","description":"Official TypeScript SDK for the RCAN v1.6 robot communication protocol","main":"dist/index.cjs","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{".":{"browser":"./dist/browser.mjs","import":"./dist/index.mjs","require":"./dist/index.cjs","types":"./dist/index.d.ts"}},"scripts":{"build":"tsup","postbuild":"chmod +x bin/rcan-validate.mjs","test":"node --experimental-vm-modules ./node_modules/.bin/jest","typecheck":"tsc --noEmit"},"keywords":["robotics","rcan","protocol","ai-safety","embodied-ai","typescript"],"author":{"name":"Craig Merry","email":"cmmerry@ucdavis.edu"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/continuonai/rcan-ts.git"},"devDependencies":{"@types/jest":"^29.5.0","jest":"^29.5.0","ts-jest":"^29.1.0","tsup":"^8.5.1","typescript":"^5.3.0"},"jest":{"preset":"ts-jest/presets/default-esm","testEnvironment":"node","testMatch":["**/tests/**/*.test.ts"],"extensionsToTreatAsEsm":[".ts"],"moduleNameMapper":{"^(\\.{1,2}/.*)\\.js$":"$1"},"transform":{"^.+\\.tsx?$":["ts-jest",{"useESM":true,"tsconfig":{"module":"ESNext","moduleResolution":"Bundler"}}]},"globals":{},"injectGlobals":true,"transformIgnorePatterns":[],"setupFilesAfterEnv":["<rootDir>/tests/jest.setup.ts"]},"browser":"dist/browser.mjs","cdn":"./dist/rcan.iife.js","unpkg":"./dist/rcan.iife.js","jsdelivr":"./dist/rcan.iife.js","bin":{"rcan-validate":"bin/rcan-validate.mjs"},"sideEffects":false,"publishConfig":{"access":"public"},"dependencies":{"@noble/post-quantum":"^0.5.4"},"_id":"@continuonai/rcan-ts@1.3.0","gitHead":"e0fe68a93c200ef50ebcfa8ffef84a6f1be9f30f","bugs":{"url":"https://github.com/continuonai/rcan-ts/issues"},"homepage":"https://github.com/continuonai/rcan-ts#readme","_nodeVersion":"20.20.1","_npmVersion":"10.8.2","dist":{"integrity":"sha512-W2Ecj1SWt3eaDcF2T/vtu0BVV3b8wdZIkQfL1FRDw/X3/UtKKEjNUTrkwH3Z3RHW/ybY8H/dpHXSEu5hhXXIaQ==","shasum":"66a3a6ce1494b7aea6a279cc5bea0c87477a55ca","tarball":"https://registry.npmjs.org/@continuonai/rcan-ts/-/rcan-ts-1.3.0.tgz","fileCount":14,"unpackedSize":2417717,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCgX/WegdNrw8L09S60WKhtZiz/avjnaURbMYn/7u1NGgIgEGUiLxwLKIoVRq9GvolVI6t22QlmXxDl85lW80hPIb0="}]},"_npmUser":{"name":"craigm26","email":"craigm26@gmail.com"},"directories":{},"maintainers":[{"name":"craigm26","email":"craigm26@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/rcan-ts_1.3.0_1775015280726_0.542534038588993"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-06T17:39:46.446Z","modified":"2026-04-01T03:48:01.079Z","0.1.1":"2026-03-06T17:39:46.718Z","0.1.2":"2026-03-06T18:02:15.062Z","0.2.0":"2026-03-06T18:10:20.030Z","0.3.0":"2026-03-06T20:31:27.149Z","0.5.0":"2026-03-16T23:53:30.566Z","0.6.0":"2026-03-17T01:47:24.729Z","0.8.0":"2026-03-21T05:59:16.185Z","1.1.0":"2026-03-26T21:36:55.235Z","1.2.0":"2026-03-26T23:56:20.382Z","1.2.1":"2026-03-27T02:17:25.979Z","1.2.2":"2026-03-29T03:53:10.664Z","1.2.3":"2026-03-29T23:48:41.718Z","1.3.0":"2026-04-01T03:48:00.943Z"},"bugs":{"url":"https://github.com/continuonai/rcan-ts/issues"},"author":{"name":"Craig Merry","email":"cmmerry@ucdavis.edu"},"license":"MIT","homepage":"https://github.com/continuonai/rcan-ts#readme","keywords":["robotics","rcan","protocol","ai-safety","embodied-ai","typescript"],"repository":{"type":"git","url":"git+https://github.com/continuonai/rcan-ts.git"},"description":"Official TypeScript SDK for the RCAN v1.6 robot communication protocol","maintainers":[{"name":"craigm26","email":"craigm26@gmail.com"}],"readme":"# rcan-ts\n\nTypeScript SDK for the [RCAN protocol](https://rcan.dev/spec/) — build robots that communicate securely, audit every action, and enforce safety gates in Node.js or the browser.\n\n[![npm version](https://img.shields.io/npm/v/@continuonai/rcan-ts.svg)](https://www.npmjs.com/package/@continuonai/rcan-ts)\n[![RCAN Spec](https://img.shields.io/badge/RCAN-v1.6-blue)](https://rcan.dev/spec/)\n[![CI](https://github.com/continuonai/rcan-ts/actions/workflows/ci.yml/badge.svg)](https://github.com/continuonai/rcan-ts/actions)\n[![License](https://img.shields.io/badge/license-MIT-green)](LICENSE)\n[![Node](https://img.shields.io/badge/node-18%2B-green)](https://nodejs.org)\n\n## Install\n\n```bash\nnpm install @continuonai/rcan-ts@0.6.0\n```\n\nNode 18+ required (uses Web Crypto API for `transport.encodeMinimal`).\n\n### Browser / CDN (no build step)\n\n```html\n<script src=\"https://unpkg.com/@continuonai/rcan-ts/dist/rcan.iife.js\"></script>\n<script>\n  const uri = RCAN.RobotURI.parse('rcan://registry.rcan.dev/acme/arm/v1/unit-001');\n  console.log(uri.manufacturer); // acme\n</script>\n```\n\n## Quick Start\n\n```typescript\nimport { RobotURI, RCANMessage, ConfidenceGate } from \"@continuonai/rcan-ts\";\nimport { ReplayCache } from \"@continuonai/rcan-ts\";\nimport { AuditChain } from \"@continuonai/rcan-ts\";\n\n// 1. Address a robot\nconst uri = RobotURI.build({\n  manufacturer: \"acme\",\n  model: \"arm\",\n  version: \"v2\",\n  deviceId: \"unit-001\",\n});\n// rcan://registry.rcan.dev/acme/arm/v2/unit-001\n\n// 2. Gate on AI confidence before acting\nconst gate = new ConfidenceGate(0.8);\nconst confidence = 0.91;\n\nif (gate.allows(confidence)) {\n  const msg = new RCANMessage({\n    cmd: \"move_forward\",\n    target: uri,\n    params: { distance_m: 1.0 },\n    confidence,\n    modelIdentity: \"gemini-2.5-flash\",\n  });\n\n  // 3. Replay attack prevention\n  const cache = new ReplayCache({ windowSeconds: 300 });\n  if (cache.isReplay(msg.msgId)) throw new Error(\"Replay attack detected\");\n  cache.record(msg.msgId);\n\n  // 4. ESTOP with QoS 2 (EXACTLY_ONCE) — never dropped\n  const estop = new RCANMessage({\n    cmd: \"estop\",\n    target: uri,\n    qos: 2, // QoSLevel.EXACTLY_ONCE\n  });\n}\n\n// 5. Tamper-evident audit chain\nconst chain = new AuditChain(\"your-hmac-secret\");\nchain.append({\n  action: \"move_forward\",\n  robotUri: uri.toString(),\n  confidence: 0.91,\n  safetyApproved: true,\n});\nconst { valid, count } = chain.verifyAll();\nconsole.log(`Chain valid: ${valid}, ${count} records`);\n\n// Export as JSONL for long-term storage\nconst jsonl = chain.toJSONL();\n```\n\n## What's in v0.6.0\n\n| Module | Description |\n|---|---|\n| `message` | Core `RCANMessage` envelope with all v1.6 fields |\n| `address` | `RobotURI` — parse, build, and validate RCAN robot addresses |\n| `audit` | `AuditChain` + `CommitmentRecord` — tamper-evident HMAC-chained logs |\n| `gates` | `ConfidenceGate`, `HiTLGate` — safety gates for AI-driven actions |\n| `replay` | `ReplayCache` — sliding-window replay attack prevention (GAP-03) |\n| `clock` | `ClockSyncStatus` — NTP clock sync verification (GAP-04) |\n| `qos` | `QoSLevel` — FIRE_AND_FORGET / ACKNOWLEDGED / EXACTLY_ONCE (GAP-11) |\n| `consent` | Consent wire protocol — request/grant/deny (GAP-05) |\n| `revocation` | Robot identity revocation with TTL cache (GAP-02) |\n| `trainingConsent` | Training data consent, GDPR/EU AI Act Annex III §5 (GAP-10) |\n| `delegation` | Command delegation chain, max 4 hops, Ed25519-signed (GAP-01) |\n| `offline` | Offline operation mode — ESTOP always allowed (GAP-06) |\n| `faultReport` | `FaultCode` structured fault taxonomy (GAP-20) |\n| `federation` | Federated consent — cross-registry trust, DNS discovery (GAP-16) |\n| `transport` | Constrained transports — compact CBOR, 32-byte ESTOP minimal, BLE (GAP-17) |\n| `multimodal` | Multi-modal payloads — inline/ref media, streaming (GAP-18) |\n| `identity` | Level of Assurance — LoA policies, JWT parsing (GAP-14) |\n| `keys` | Key rotation with JWKS-compatible `KeyStore` (GAP-09) |\n| `configUpdate` | `CONFIG_UPDATE` protocol with safety scope enforcement (GAP-07) |\n| `node` | `NodeClient` — resolve RRNs across federated registry nodes (§17) |\n| `validate` | L1/L2/L3 conformance validation for configs, messages, URIs |\n| `schema` | Canonical JSON schema validation against rcan.dev |\n\n## Protocol 66 Compliance\n\n- **ESTOP always delivered** — send with `qos: 2` (`EXACTLY_ONCE`); never blocked\n- **Local safety wins** — `OfflineMode` enforces limits without cloud connectivity\n- **Confidence gates run locally** — `ConfidenceGate` makes no network calls\n- **Audit chain required** — `AuditChain.verifyAll()` before executing flagged commands\n\n## Registry Resolution\n\n```typescript\nimport { NodeClient } from \"@continuonai/rcan-ts\";\n\nconst client = new NodeClient();\n\n// Resolve an RRN across the federation\nconst result = await client.resolve(\"RRN-000000000001\");\nconsole.log(result.record.name);         // \"Bob\"\nconsole.log(result.record.verification_tier); // \"verified\"\n\n// Discover which node is authoritative\nconst node = await client.discover(\"RRN-BD-000000000001\");\nconsole.log(node.operator);  // \"Boston Dynamics, Inc.\"\n```\n\n## Spec Compliance\n\nImplements [RCAN v1.6](https://rcan.dev/spec/) — 405 tests, 0 skipped.\n\nAPI surface is intentionally identical to rcan-py: `RobotURI`, `RCANMessage`, `ConfidenceGate`, `HiTLGate`, `AuditChain`, and `validateConfig` work the same way in both languages.\n\n## Ecosystem\n\n| Package | Version | Purpose |\n|---|---|---|\n| [rcan-py](https://github.com/continuonai/rcan-py) | v0.6.0 | Python SDK |\n| **rcan-ts** (this) | v0.6.0 | TypeScript SDK |\n| [rcan-spec](https://github.com/continuonai/rcan-spec) | v1.6.0 | Protocol spec |\n| [OpenCastor](https://github.com/craigm26/OpenCastor) | v2026.3.17.1 | Robot runtime (reference impl) |\n| [RRF](https://robotregistryfoundation.org) | v1.6.0 | Robot identity registry |\n| [Fleet UI](https://app.opencastor.com) | live | Web fleet dashboard |\n| [Docs](https://docs.opencastor.com) | live | Runtime reference, RCAN, API |\n\n## Contributing\n\nIssues and PRs welcome at [github.com/continuonai/rcan-ts](https://github.com/continuonai/rcan-ts).\n\nSpec discussions: [github.com/continuonai/rcan-spec/issues](https://github.com/continuonai/rcan-spec/issues)\n\n## License\n\nMIT © Craig Merry\n","readmeFilename":"README.md"}