{"_id":"@casola/avatar-client","_rev":"20-14b31f75cc468815f41661c89c0a8bfa","name":"@casola/avatar-client","dist-tags":{"beta":"0.1.1","latest":"0.8.0"},"versions":{"0.1.0":{"name":"@casola/avatar-client","version":"0.1.0","license":"MIT","_id":"@casola/avatar-client@0.1.0","maintainers":[{"name":"helloworld2026","email":"alex@casola.ai"}],"homepage":"https://github.com/casola-ai/avatar-platform#readme","bugs":{"url":"https://github.com/casola-ai/avatar-platform/issues"},"dist":{"shasum":"bd96adb6fe117ea5592faaed97383f4849e54deb","tarball":"https://registry.npmjs.org/@casola/avatar-client/-/avatar-client-0.1.0.tgz","fileCount":14,"integrity":"sha512-WCiZ0+Gjg1Aqx/iQqLSRnLcsBRGKpRHRvZg9bBHCV9D2BPKhps6HY5uTEHspO02D4+NVIsbgNjkjg/b/i3CQpg==","signatures":[{"sig":"MEYCIQCtLK5NBa4ZQ4TtPjGuD7d6v4QXn5G9XkEoi2B4TwChTwIhAM9AYu+Ss7hYjif9aArOaX8K2DIDUWSdenOfIqjHBwPK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":62499},"main":"./src/index.ts","type":"module","types":"./src/index.ts","exports":{".":"./src/index.ts","./worklet":"./src/worklet/mic-worklet.ts"},"scripts":{"build":"node scripts/build.mjs && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","prepublishOnly":"pnpm run build"},"_npmUser":{"name":"helloworld2026","email":"alex@casola.ai"},"deprecated":"broken exports — use 0.1.1","repository":{"url":"git+https://github.com/casola-ai/avatar-platform.git","type":"git"},"_npmVersion":"11.12.1","description":"Browser SDK for Casola live avatar sessions (MSE video + mic streaming).","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","publishConfig":{"main":"./dist/index.js","types":"./dist/index.d.ts","access":"public","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./worklet":"./dist/worklet/mic-worklet.js"}},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"catalog:","typescript":"catalog:"},"_npmOperationalInternal":{"tmp":"tmp/avatar-client_0.1.0_1782235948960_0.9136189400382024","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@casola/avatar-client","version":"0.1.1","license":"MIT","_id":"@casola/avatar-client@0.1.1","maintainers":[{"name":"helloworld2026","email":"alex@casola.ai"}],"homepage":"https://github.com/casola-ai/avatar-platform#readme","bugs":{"url":"https://github.com/casola-ai/avatar-platform/issues"},"dist":{"shasum":"6c40e2b1c5550d616f1261d91693ff7a2085aa7f","tarball":"https://registry.npmjs.org/@casola/avatar-client/-/avatar-client-0.1.1.tgz","fileCount":14,"integrity":"sha512-/svsrXtEdx2oFQX92rRTapFHCH7UDyLDH09caztK54a8b2oPjf0NIugrObcAlaPt7zKbPsO4J1EaiMgvxQK5+w==","signatures":[{"sig":"MEUCIQDA8QlHEw28IAFgfPRugNGX+zELwheoilieFDem1NarrgIgTEi4R/qSUsEOVa4LNDziOTlsoQMUj+1vQljShFuYc/0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":62329},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./worklet":"./dist/worklet/mic-worklet.js"},"scripts":{"build":"node scripts/build.mjs && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","prepublishOnly":"pnpm run build"},"_npmUser":{"name":"helloworld2026","email":"alex@casola.ai"},"repository":{"url":"git+https://github.com/casola-ai/avatar-platform.git","type":"git"},"_npmVersion":"11.12.1","description":"Browser SDK for Casola live avatar sessions (MSE video + mic streaming).","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"catalog:","typescript":"catalog:"},"_npmOperationalInternal":{"tmp":"tmp/avatar-client_0.1.1_1782236828580_0.04684882827939485","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@casola/avatar-client","version":"0.1.2","license":"MIT","_id":"@casola/avatar-client@0.1.2","maintainers":[{"name":"helloworld2026","email":"alex@casola.ai"}],"homepage":"https://github.com/casola-ai/avatar-client#readme","bugs":{"url":"https://github.com/casola-ai/avatar-client/issues"},"dist":{"shasum":"464f12e6fa01a3db2a2fed64e7f2c28f37ddd39b","tarball":"https://registry.npmjs.org/@casola/avatar-client/-/avatar-client-0.1.2.tgz","fileCount":14,"integrity":"sha512-LbZeZgpZmRZZGWx30ai09b6lV7u1IZ5u4hp+jq5EmBeejDz2WmkReTARl3zm4JkUNVztr9pdZcqBTLzviPAgxA==","signatures":[{"sig":"MEYCIQCrOfgyxKrPovUfuNzyHgFLCxosLQgXXLxBznHLgHu53wIhAOzMrjbF8q6mzXVzY1ALP6p+SX13T2jtn5VLlCqAwZ/8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@casola%2favatar-client@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":71613},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./worklet":"./dist/worklet/mic-worklet.js"},"gitHead":"497060665dfda7fd6fb9ee9c308fb2c93093cd3f","scripts":{"test":"vitest run","build":"node scripts/build.mjs && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:32da8949-2dd0-4869-84ae-a35f045267dd"}},"repository":{"url":"git+https://github.com/casola-ai/avatar-client.git","type":"git"},"_npmVersion":"12.0.1","description":"Browser SDK for Casola live avatar sessions (MSE video + mic streaming).","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"~3.2.0","esbuild":"^0.24.0","typescript":"^5.3.3"},"_npmOperationalInternal":{"tmp":"tmp/avatar-client_0.1.2_1784135606436_0.2495251023356635","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@casola/avatar-client","version":"0.1.3","license":"MIT","_id":"@casola/avatar-client@0.1.3","maintainers":[{"name":"helloworld2026","email":"alex@casola.ai"}],"homepage":"https://github.com/casola-ai/avatar-client#readme","bugs":{"url":"https://github.com/casola-ai/avatar-client/issues"},"dist":{"shasum":"6ce950a34c990601d0c6fc9180e0e6bc985a8228","tarball":"https://registry.npmjs.org/@casola/avatar-client/-/avatar-client-0.1.3.tgz","fileCount":18,"integrity":"sha512-3ZNajBzCWtmOM53kDucKiaV3wfdGduqu01vjfju8x7/f4+neKInhBobCpjRJIpwPQ0U0pffVrdrI4bbjSSYrcw==","signatures":[{"sig":"MEUCIQCm3GMMTPTOsbu3zK+AWmVQC1X103KUIgrD92zgd4u86QIgOpBR6Q26C/xMRH98eTZ7BGvc0JRZfgSKtOwSHXF9bps=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@casola%2favatar-client@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":155713},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./worklet":"./dist/worklet/mic-worklet.js"},"gitHead":"840ed9aaac4ed9f72aecd40fcd00f5da6e104638","scripts":{"test":"vitest run","build":"node scripts/build.mjs && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:32da8949-2dd0-4869-84ae-a35f045267dd"}},"repository":{"url":"git+https://github.com/casola-ai/avatar-client.git","type":"git"},"_npmVersion":"12.0.2","description":"Browser SDK for Casola live avatar sessions (MSE video + mic streaming).","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.0","esbuild":"^0.24.0","typescript":"^5.3.3"},"_npmOperationalInternal":{"tmp":"tmp/avatar-client_0.1.3_1786153537409_0.7779884609321972","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@casola/avatar-client","version":"0.1.4","license":"MIT","_id":"@casola/avatar-client@0.1.4","maintainers":[{"name":"helloworld2026","email":"alex@casola.ai"}],"homepage":"https://github.com/casola-ai/avatar-client#readme","bugs":{"url":"https://github.com/casola-ai/avatar-client/issues"},"dist":{"shasum":"881e17084eebc8477e1794a115d04a1dbffa3550","tarball":"https://registry.npmjs.org/@casola/avatar-client/-/avatar-client-0.1.4.tgz","fileCount":19,"integrity":"sha512-N47svgxiM6+EosSRQE9UFw3jkK7vQgybvLXeX2I4QE+Nu5mUhRqNiALwf2MDtPYz2MVwivNsi2Rs075rufhD9Q==","signatures":[{"sig":"MEYCIQDJLt89f5+c0XHgOSwv76B2f4FjURMdC3Tit3BSXgmvCQIhANpsga18Ujuh2h6AtMzxXuSrQO0iNpiZg/iK2yWPjQfY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@casola%2favatar-client@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":168527},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./worklet":"./dist/worklet/mic-worklet.js"},"gitHead":"f7a65916ca23411c49427c595d0c9bd8eccfe3ee","scripts":{"test":"vitest run","build":"node scripts/build.mjs && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:32da8949-2dd0-4869-84ae-a35f045267dd"}},"repository":{"url":"git+https://github.com/casola-ai/avatar-client.git","type":"git"},"_npmVersion":"12.0.2","description":"Browser SDK for Casola live avatar sessions (MSE video + mic streaming).","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.0","esbuild":"^0.24.0","typescript":"^5.3.3"},"_npmOperationalInternal":{"tmp":"tmp/avatar-client_0.1.4_1786400323859_0.952665154032861","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@casola/avatar-client","version":"0.1.5","license":"MIT","_id":"@casola/avatar-client@0.1.5","maintainers":[{"name":"helloworld2026","email":"alex@casola.ai"}],"homepage":"https://github.com/casola-ai/avatar-client#readme","bugs":{"url":"https://github.com/casola-ai/avatar-client/issues"},"dist":{"shasum":"4bbd6fb46e0f54db799d1cb6409d03dbd5ead68b","tarball":"https://registry.npmjs.org/@casola/avatar-client/-/avatar-client-0.1.5.tgz","fileCount":20,"integrity":"sha512-d8lhJzOpa0iK8bm/X+UCqYku07AdC/Ii6QhRIUVuAOIFzp6so89eQO6Z1L/cpJBJvLhGolwusktO28+o4ybLBQ==","signatures":[{"sig":"MEMCIGD+4zUqezhFYymkAX4F5U9xSyELa6m4GRWMWtOnKQSCAh9AqJ6sC4doP8uh78QSzHvzM7CV0smvh6UNk1WL26sF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@casola%2favatar-client@0.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":187483},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./worklet":"./dist/worklet/mic-worklet.js"},"gitHead":"cacbb2ece28d4c6119cb70ed77224268954aefe7","scripts":{"test":"vitest run","build":"node scripts/build.mjs && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:32da8949-2dd0-4869-84ae-a35f045267dd"}},"repository":{"url":"git+https://github.com/casola-ai/avatar-client.git","type":"git"},"_npmVersion":"12.0.2","description":"Browser SDK for Casola live avatar sessions (MSE video + mic streaming).","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.0","esbuild":"^0.24.0","typescript":"^5.3.3"},"_npmOperationalInternal":{"tmp":"tmp/avatar-client_0.1.5_1786405797735_0.08117738334842484","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@casola/avatar-client","version":"0.2.0","license":"MIT","_id":"@casola/avatar-client@0.2.0","maintainers":[{"name":"helloworld2026","email":"alex@casola.ai"}],"homepage":"https://github.com/casola-ai/avatar-client#readme","bugs":{"url":"https://github.com/casola-ai/avatar-client/issues"},"dist":{"shasum":"9280624ef8c06eeea819de7e8ac041fd57f7d3d4","tarball":"https://registry.npmjs.org/@casola/avatar-client/-/avatar-client-0.2.0.tgz","fileCount":34,"integrity":"sha512-AveGGcRxDTS6sUF8VWfHtQ76/Ve+Tx7yNockMIyz3dplJnUT3DWCja6ICSFGXp/XEfmVwtiYieNuiGaQ//aIwg==","signatures":[{"sig":"MEYCIQCxqJrkp0s9p8nHCgFJHmsZIqoFTG6Qj4VK+sieea6Q+QIhAPxEW+NKVZvkJIFdc+UU4aBzSg8xDE3ncL5WXKT7cKUo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@casola%2favatar-client@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":260363},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./worklet":"./dist/worklet/mic-worklet.js"},"gitHead":"b5c1fc61227b5d777e10eeb9cdc160f4a0f47ddf","scripts":{"test":"vitest run","build":"node scripts/build.mjs && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","sync-protocol":"node scripts/sync-protocol.mjs","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:32da8949-2dd0-4869-84ae-a35f045267dd"}},"repository":{"url":"git+https://github.com/casola-ai/avatar-client.git","type":"git"},"_npmVersion":"12.0.2","description":"Browser SDK for Casola live avatar sessions over avatar protocol v2 (one multiplexed WebSocket).","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","vitest":"^4.1.0","esbuild":"^0.24.0","typescript":"^5.3.3"},"_npmOperationalInternal":{"tmp":"tmp/avatar-client_0.2.0_1786512127234_0.988393062654096","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@casola/avatar-client","version":"0.2.1","license":"MIT","_id":"@casola/avatar-client@0.2.1","maintainers":[{"name":"helloworld2026","email":"alex@casola.ai"}],"homepage":"https://github.com/casola-ai/avatar-client#readme","bugs":{"url":"https://github.com/casola-ai/avatar-client/issues"},"dist":{"shasum":"18d71fc545e601dd37c37925432864f619c7f1a3","tarball":"https://registry.npmjs.org/@casola/avatar-client/-/avatar-client-0.2.1.tgz","fileCount":39,"integrity":"sha512-vNzDfbwNl43/bqcJaMVxbYvQco0+KteDydMfW+fgC81acF4K7h2VV1aZvNW5qH5tux+Sx2Y9fT9MCXN+sRznHA==","signatures":[{"sig":"MEUCIQD7IsY4m5xSiy7sg29f5sieb9L7ezXSbvLF6uKDoYqKbwIgK4D0anzr1GKJg8U72ENqcvhIr7kBGDFBrDeUgii3jAA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@casola%2favatar-client@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":389632},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./worklet":"./dist/worklet/mic-worklet.js","./styles.css":"./dist/styles.css"},"gitHead":"d229c25a2fdfc3782530bffa221c30ce5904976f","scripts":{"test":"vitest run","build":"node scripts/build.mjs && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","sync-protocol":"node scripts/sync-protocol.mjs","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:32da8949-2dd0-4869-84ae-a35f045267dd"}},"repository":{"url":"git+https://github.com/casola-ai/avatar-client.git","type":"git"},"_npmVersion":"12.0.2","description":"Browser SDK for Casola live avatar sessions over avatar protocol v2 (one multiplexed WebSocket).","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","vitest":"^4.1.0","esbuild":"^0.24.0","typescript":"^5.3.3"},"_npmOperationalInternal":{"tmp":"tmp/avatar-client_0.2.1_1786550486552_0.5846521033839482","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@casola/avatar-client","version":"0.3.0","license":"MIT","_id":"@casola/avatar-client@0.3.0","maintainers":[{"name":"helloworld2026","email":"alex@casola.ai"}],"homepage":"https://github.com/casola-ai/avatar-client#readme","bugs":{"url":"https://github.com/casola-ai/avatar-client/issues"},"dist":{"shasum":"72cacf18d58f93df7306ef0e8dc1646ed2944519","tarball":"https://registry.npmjs.org/@casola/avatar-client/-/avatar-client-0.3.0.tgz","fileCount":42,"integrity":"sha512-pnMFInep6HvFX1sdD1+BoUZaMgiUEgqwW5eNNO0vwPrcr+PGad1nKoSnHlzgS/7qIuQnf0Dg8PJWHDrvkPrmtw==","signatures":[{"sig":"MEQCIAbIOkTBctvJ1gMX54EeqQflOoLXqiiu2qtvXt9pSDCNAiAHN6pUCHE5AZBoddBwBdU6JbCm7m8K45fS54JvMiBMbw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@casola%2favatar-client@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":470653},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./worklet":"./dist/worklet/mic-worklet.js","./styles.css":"./dist/styles.css"},"gitHead":"62f0f9e677347b882dc9b83b4e46a49a77f09655","scripts":{"test":"vitest run","build":"node scripts/build.mjs && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","sync-protocol":"node scripts/sync-protocol.mjs","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:32da8949-2dd0-4869-84ae-a35f045267dd"}},"repository":{"url":"git+https://github.com/casola-ai/avatar-client.git","type":"git"},"_npmVersion":"12.0.2","description":"Browser SDK for Casola live avatar sessions over avatar protocol v2 (one multiplexed WebSocket).","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","vitest":"^4.1.0","esbuild":"^0.24.0","typescript":"^5.3.3"},"_npmOperationalInternal":{"tmp":"tmp/avatar-client_0.3.0_1786579486937_0.304147000367184","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@casola/avatar-client","version":"0.3.1","license":"MIT","_id":"@casola/avatar-client@0.3.1","maintainers":[{"name":"helloworld2026","email":"alex@casola.ai"}],"homepage":"https://github.com/casola-ai/avatar-client#readme","bugs":{"url":"https://github.com/casola-ai/avatar-client/issues"},"dist":{"shasum":"5be35a8a5d8ef37fe3e01f01746bcb02e36d345f","tarball":"https://registry.npmjs.org/@casola/avatar-client/-/avatar-client-0.3.1.tgz","fileCount":42,"integrity":"sha512-im2oPQOmqaOsBB5V3viSDyleaKj2aK15ROcBhpDhHH39/RRLIqwmG7mYwAWXtE0+nGfqVXj6dS4kALVOcJOvxw==","signatures":[{"sig":"MEQCIH32yB6vdkqlsZQvGjTHBYSA9tXR2Sr5PjFrEZCTKu/xAiBJ2jyF2uKmppWPJcAKx9vFUXAlfjpovsnvLOjioiwAzw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@casola%2favatar-client@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":474163},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./worklet":"./dist/worklet/mic-worklet.js","./styles.css":"./dist/styles.css"},"gitHead":"31b4a8f4058318aea13c871ea0a56c2cfdc823d8","scripts":{"test":"vitest run","build":"node scripts/build.mjs && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","sync-protocol":"node scripts/sync-protocol.mjs","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:32da8949-2dd0-4869-84ae-a35f045267dd"}},"repository":{"url":"git+https://github.com/casola-ai/avatar-client.git","type":"git"},"_npmVersion":"12.0.2","description":"Browser SDK for Casola live avatar sessions over avatar protocol v2 (one multiplexed WebSocket).","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","vitest":"^4.1.0","esbuild":"^0.24.0","typescript":"^5.3.3"},"_npmOperationalInternal":{"tmp":"tmp/avatar-client_0.3.1_1787588121036_0.7627796867178422","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@casola/avatar-client","version":"0.4.0","license":"MIT","_id":"@casola/avatar-client@0.4.0","maintainers":[{"name":"helloworld2026","email":"alex@casola.ai"}],"homepage":"https://github.com/casola-ai/avatar-client#readme","bugs":{"url":"https://github.com/casola-ai/avatar-client/issues"},"dist":{"shasum":"ab2196616f9eccc2c9dc888c10794e52bc72cc67","tarball":"https://registry.npmjs.org/@casola/avatar-client/-/avatar-client-0.4.0.tgz","fileCount":43,"integrity":"sha512-ZZoRx0EFrVCooaOhqNJ/L6bCfc71+0yCLjT/ekZdZUqmqp+dpzRGPtexZAoRkWpVImyzZuRbE3wQCQO+AyIc2A==","signatures":[{"sig":"MEUCIQD7Rp3kdSGZ9h8MzQ2HmIvqigbeU8EkpQnNfQyKDGXEUwIgIkjp4+ABXajZrLyHO1ANwH67IwubWk48JT/eQH0BImk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@casola%2favatar-client@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":496886},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./worklet":"./dist/worklet/mic-worklet.js","./styles.css":"./dist/styles.css"},"gitHead":"6ffd7090d28ef694b18959227261ba238cda6062","scripts":{"test":"vitest run","build":"node scripts/build.mjs && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","sync-protocol":"node scripts/sync-protocol.mjs","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:32da8949-2dd0-4869-84ae-a35f045267dd"}},"repository":{"url":"git+https://github.com/casola-ai/avatar-client.git","type":"git"},"_npmVersion":"12.0.2","description":"Browser SDK for Casola live avatar sessions over avatar protocol v2 (one multiplexed WebSocket).","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","vitest":"^4.1.0","esbuild":"^0.24.0","typescript":"^5.3.3"},"_npmOperationalInternal":{"tmp":"tmp/avatar-client_0.4.0_1788236620543_0.7787074043007223","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@casola/avatar-client","version":"0.4.1","license":"MIT","_id":"@casola/avatar-client@0.4.1","maintainers":[{"name":"helloworld2026","email":"alex@casola.ai"}],"homepage":"https://github.com/casola-ai/avatar-client#readme","bugs":{"url":"https://github.com/casola-ai/avatar-client/issues"},"dist":{"shasum":"51aef3f4701e74599bbc646f90d9d120c7529c60","tarball":"https://registry.npmjs.org/@casola/avatar-client/-/avatar-client-0.4.1.tgz","fileCount":43,"integrity":"sha512-Ut92fOaP8TfvPTEDO/txRmxOIFEV503JISebmDyZE2V18jQvo6zc+q0TqMC7x6k5+cZgRfcRWMHtakLIyR27lA==","signatures":[{"sig":"MEUCIHuDq+fQxawjQjVyhH0dY4FjUI831OhQyZJl2xsYLF6iAiEA4W3CMCJCYuDb5z2WspRxFfIj0BtAKclgrfbNyjyu7Mo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@casola%2favatar-client@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":500934},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./worklet":"./dist/worklet/mic-worklet.js","./styles.css":"./dist/styles.css"},"gitHead":"d8236716ec2f509d5a6013d6de307a648496210b","scripts":{"test":"vitest run","build":"node scripts/build.mjs && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","sync-protocol":"node scripts/sync-protocol.mjs","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:32da8949-2dd0-4869-84ae-a35f045267dd"}},"repository":{"url":"git+https://github.com/casola-ai/avatar-client.git","type":"git"},"_npmVersion":"12.0.2","description":"Browser SDK for Casola live avatar sessions over avatar protocol v2 (one multiplexed WebSocket).","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","vitest":"^4.1.0","esbuild":"^0.24.0","typescript":"^5.3.3"},"_npmOperationalInternal":{"tmp":"tmp/avatar-client_0.4.1_1788239403101_0.7424316704855016","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@casola/avatar-client","version":"0.5.0","license":"MIT","_id":"@casola/avatar-client@0.5.0","maintainers":[{"name":"helloworld2026","email":"alex@casola.ai"}],"homepage":"https://github.com/casola-ai/avatar-client#readme","bugs":{"url":"https://github.com/casola-ai/avatar-client/issues"},"dist":{"shasum":"d45dd0266e77fa97ff7ed92b83fc7906448489e4","tarball":"https://registry.npmjs.org/@casola/avatar-client/-/avatar-client-0.5.0.tgz","fileCount":43,"integrity":"sha512-3jh9iz6i3irkMjn23rjWYR6BLE7Je6z4bNl/6EyJhhuRdaCVWKP8tXQeCVzIgtpb6W9MQT1fpFsaxVxFugjksQ==","signatures":[{"sig":"MEYCIQCHoHpk70PXl95lwCHqmEVLOFhH9sz4VvzSw9yWw1Jl8gIhAL/+UO54thcYolc4OdtqnbrdOH6N0VCjmLnNy/D4iKsC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@casola%2favatar-client@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":502452},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./worklet":"./dist/worklet/mic-worklet.js","./styles.css":"./dist/styles.css"},"gitHead":"8c7da2ce71067667bcfedc9b4a49ff8f14ab37c6","scripts":{"test":"vitest run","build":"node scripts/build.mjs && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","sync-protocol":"node scripts/sync-protocol.mjs","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:32da8949-2dd0-4869-84ae-a35f045267dd"}},"repository":{"url":"git+https://github.com/casola-ai/avatar-client.git","type":"git"},"_npmVersion":"12.0.2","description":"Browser SDK for Casola live avatar sessions over avatar protocol v2 (one multiplexed WebSocket).","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","vitest":"^4.1.0","esbuild":"^0.24.0","typescript":"^5.3.3"},"_npmOperationalInternal":{"tmp":"tmp/avatar-client_0.5.0_1788277430804_0.9308748520255337","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@casola/avatar-client","version":"0.5.1","license":"MIT","_id":"@casola/avatar-client@0.5.1","maintainers":[{"name":"helloworld2026","email":"alex@casola.ai"}],"homepage":"https://github.com/casola-ai/avatar-client#readme","bugs":{"url":"https://github.com/casola-ai/avatar-client/issues"},"dist":{"shasum":"4b34864c4ad3ecdbbd15b880531ba07013dd5004","tarball":"https://registry.npmjs.org/@casola/avatar-client/-/avatar-client-0.5.1.tgz","fileCount":43,"integrity":"sha512-1LXUfOQYqKFocsYs3D9l7VL8oICdojI8pyjst/m5ulwh9XYzpAwJf/FWrZy610Ba7JXSw39bTGO2+643bS4p4w==","signatures":[{"sig":"MEQCIHPhbIgDqVCvJQZKDNgBn9/RPDqWCRMmCaYKi9sef9/hAiAXF/7D1Je84pdTZyokNTcfIW9lq4JZBAMYAeCDJ7IzVg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@casola%2favatar-client@0.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":503143},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./worklet":"./dist/worklet/mic-worklet.js","./styles.css":"./dist/styles.css"},"gitHead":"d4e835c865e53b1f797cde77fe77a97df186bc53","scripts":{"test":"vitest run","build":"node scripts/build.mjs && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","sync-protocol":"node scripts/sync-protocol.mjs","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:32da8949-2dd0-4869-84ae-a35f045267dd"}},"repository":{"url":"git+https://github.com/casola-ai/avatar-client.git","type":"git"},"_npmVersion":"12.0.2","description":"Browser SDK for Casola live avatar sessions over avatar protocol v2 (one multiplexed WebSocket).","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","vitest":"^4.1.0","esbuild":"^0.24.0","typescript":"^5.3.3"},"_npmOperationalInternal":{"tmp":"tmp/avatar-client_0.5.1_1788640016162_0.29237336278871506","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@casola/avatar-client","version":"0.6.0","license":"MIT","_id":"@casola/avatar-client@0.6.0","maintainers":[{"name":"helloworld2026","email":"alex@casola.ai"}],"homepage":"https://github.com/casola-ai/avatar-client#readme","bugs":{"url":"https://github.com/casola-ai/avatar-client/issues"},"dist":{"shasum":"2c14a6f79ad43bbf6bfa6ac69eac42ab66e285be","tarball":"https://registry.npmjs.org/@casola/avatar-client/-/avatar-client-0.6.0.tgz","fileCount":43,"integrity":"sha512-KG4e84royy86qzDghq3l3CNK3SCvt2GLZkKxS9exlRqxkfItW3uIfT7YPZaBnt8l7cLD9z9ozYX4lm+yNch1KQ==","signatures":[{"sig":"MEYCIQDAoRB2ryF6jljcj6i52Fs8bfmndHM4vuEAcyIErhCCZgIhANMIID8iP8I/WTfuHalkeaO9uPVglLvFjiN+Ke9GunZ4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@casola%2favatar-client@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":511773},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./worklet":"./dist/worklet/mic-worklet.js","./styles.css":"./dist/styles.css"},"gitHead":"2f795313d6ba414067090ff364336582db9db76b","scripts":{"test":"vitest run","build":"node scripts/build.mjs && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","sync-protocol":"node scripts/sync-protocol.mjs","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:32da8949-2dd0-4869-84ae-a35f045267dd"}},"repository":{"url":"git+https://github.com/casola-ai/avatar-client.git","type":"git"},"_npmVersion":"12.0.2","description":"Browser SDK for Casola live avatar sessions over avatar protocol v2 (one multiplexed WebSocket).","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","vitest":"^4.1.0","esbuild":"^0.24.0","typescript":"^5.3.3"},"_npmOperationalInternal":{"tmp":"tmp/avatar-client_0.6.0_1788656078212_0.9907673510120076","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@casola/avatar-client","version":"0.7.0","license":"MIT","_id":"@casola/avatar-client@0.7.0","maintainers":[{"name":"helloworld2026","email":"alex@casola.ai"}],"homepage":"https://github.com/casola-ai/avatar-client#readme","bugs":{"url":"https://github.com/casola-ai/avatar-client/issues"},"dist":{"shasum":"49edcb1ab0261fd1aa0b15c507bcbbcbb09b94e0","tarball":"https://registry.npmjs.org/@casola/avatar-client/-/avatar-client-0.7.0.tgz","fileCount":43,"integrity":"sha512-2dx5FaBa3n0O1ls1WMknNmBNCL/s8qedPO/zKe7e9m39ABvYxMtmUj4SceUfmmjfBzXcwKG0LCjwPyGJpGARDg==","signatures":[{"sig":"MEYCIQCfWO8Wc4BMX+u9tn9yvWSA1M8X1sfZoyS2qJPitocP2gIhALK5syEy34JTxJZdnCi8gW4BsR7jeIB1sRcUe9MSK9pe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQD6q0fUOJQmdCYWloRhnmmYxGmeID0l5lr90VYsNB1weAIgZgodX7RoGcmsPJ5luqys+6soBVCa5Nucl7yrCb0mt64=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@casola%2favatar-client@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":528431},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./worklet":"./dist/worklet/mic-worklet.js","./styles.css":"./dist/styles.css"},"gitHead":"4440665263f4717468a194cbef7624c6c18bffbe","scripts":{"test":"vitest run","build":"node scripts/build.mjs && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","sync-protocol":"node scripts/sync-protocol.mjs","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:32da8949-2dd0-4869-84ae-a35f045267dd"}},"repository":{"url":"git+https://github.com/casola-ai/avatar-client.git","type":"git"},"_npmVersion":"12.0.2","description":"Browser SDK for Casola live avatar sessions over avatar protocol v2 (one multiplexed WebSocket).","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","vitest":"^4.1.0","esbuild":"^0.24.0","typescript":"^5.3.3"},"_npmOperationalInternal":{"tmp":"tmp/avatar-client_0.7.0_1789079998802_0.546720205629603","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"_id":"@casola/avatar-client@0.8.0","bugs":{"url":"https://github.com/casola-ai/avatar-client/issues"},"dist":{"shasum":"2db9556a96e9156ea30d743cdeedc272426d0e99","tarball":"https://registry.npmjs.org/@casola/avatar-client/-/avatar-client-0.8.0.tgz","fileCount":45,"integrity":"sha512-V1lF1xjkV5Cj7stZfSnp8/rahqVMpbkpkTyXMDhX1dnn0wWdc8QlsumO5AvGtjmunA7l6rOCvbON1u4nqg70qw==","signatures":[{"sig":"MEQCIAmcfF4i/OikPim/r9IcjvY4h9E+aBoGPuqxIJEAXW8iAiA+Q708fE/rteETVHpDEdLHQ7fSv4mpg05a4cC5QoRYSg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIB17kAVewq82cz1+/7XhkULiTaeBKYtq/ANqHCAiIaaRAiEAu1e0Y27yWK//AulDmi3IcHSkQm8rbSyoiUtckUPIOGs="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@casola%2favatar-client@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":581193},"main":"./dist/index.js","name":"@casola/avatar-client","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./worklet":"./dist/worklet/mic-worklet.js","./styles.css":"./dist/styles.css"},"gitHead":"3a61b5f39addeb37b80941c3448dd90cbd7f9537","license":"MIT","scripts":{"test":"vitest run","build":"node scripts/build.mjs && tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","sync-protocol":"node scripts/sync-protocol.mjs","prepublishOnly":"npm run build"},"version":"0.8.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:32da8949-2dd0-4869-84ae-a35f045267dd"}},"homepage":"https://github.com/casola-ai/avatar-client#readme","repository":{"url":"git+https://github.com/casola-ai/avatar-client.git","type":"git"},"_npmVersion":"12.0.2","description":"Browser SDK for Casola live avatar sessions over avatar protocol v2 (one multiplexed WebSocket).","directories":{},"maintainers":[{"name":"helloworld2026","email":"alex@casola.ai"}],"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^30.0.1","vitest":"^4.1.0","esbuild":"^0.24.0","typescript":"^5.3.3"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/avatar-client_0.8.0_1789691623155_0.7968557373099128"}}},"time":{"created":"2026-06-23T17:32:28.790Z","modified":"2026-09-18T00:33:43.612Z","0.1.0":"2026-06-23T17:32:29.106Z","0.1.1":"2026-06-23T17:47:08.733Z","0.1.2":"2026-07-15T17:13:26.593Z","0.1.3":"2026-08-08T01:45:37.556Z","0.1.4":"2026-08-10T22:18:44.020Z","0.1.5":"2026-08-10T23:49:57.881Z","0.2.0":"2026-08-12T05:22:07.379Z","0.2.1":"2026-08-12T16:01:26.711Z","0.3.0":"2026-08-13T00:04:47.082Z","0.3.1":"2026-08-24T16:15:21.234Z","0.4.0":"2026-09-01T04:23:40.682Z","0.4.1":"2026-09-01T05:10:03.277Z","0.5.0":"2026-09-01T15:43:50.947Z","0.5.1":"2026-09-05T20:26:56.313Z","0.6.0":"2026-09-06T00:54:38.345Z","0.7.0":"2026-09-10T22:39:58.890Z","0.8.0":"2026-09-18T00:33:43.278Z"},"bugs":{"url":"https://github.com/casola-ai/avatar-client/issues"},"license":"MIT","homepage":"https://github.com/casola-ai/avatar-client#readme","repository":{"url":"git+https://github.com/casola-ai/avatar-client.git","type":"git"},"description":"Browser SDK for Casola live avatar sessions over avatar protocol v2 (one multiplexed WebSocket).","maintainers":[{"name":"helloworld2026","email":"alex@casola.ai"}],"readme":"# @casola/avatar-client\n\nBrowser SDK for Casola live-avatar sessions, speaking **avatar protocol v2**: one WebSocket per\nsession carrying JSON control messages and binary media frames (mic uplink, avatar audio, fMP4\nvideo). Sessions render as MSE video when the box streams video, or as a poster image + PCM audio\nwhen it doesn't — the SDK handles both from the same API.\n\n> **v1 boxes:** this SDK speaks protocol v2 only. Against a fleet that still serves the legacy\n> two-socket wire (`/mse` + `/mic_stream`), stay on `@casola/avatar-client@0.1.x`.\n\n## Install\n\n```bash\nnpm i @casola/avatar-client\n```\n\n## Quickstart\n\n```typescript\nimport { AvatarSession, connectViaToken } from '@casola/avatar-client';\n\n// Your backend mints the session (POST /api/v1/sessions with protocol_versions: [2])\n// and hands the browser the box URL + short-lived session token.\nconst { connect_url, session_token } = await fetch('/my-backend/start-session').then(r => r.json());\n\nconst session = new AvatarSession({\n  videoEl: document.querySelector('video#avatar'),\n  connect: connectViaToken({ connectUrl: connect_url, sessionToken: session_token }),\n  workletUrl: '/mic-worklet.js', // serve dist/worklet/mic-worklet.js from your origin\n  callbacks: {\n    onStateChange(next) { updateUI(next); },\n    onPartial(text)     { console.log('partial:', text); },\n    onTurn(t)           { console.log('turn:', t.text); },\n    onFirstFrame()      { hideSpinner(); },\n    onMicReady()        { showReadyToSpeak(); },\n    onAudioBlocked()    { showTapForSound(); }, // iOS refused unmuted playback — media runs muted\n    onClose(reason)     { console.log('ended:', reason); },\n    onError(err)        { console.error(err); },\n  },\n});\n\nawait AvatarSession.ensureMicPermission();\nawait session.start();\n\n// Typed turns ride the same session socket.\nconst turn = await session.sendText('Tell me about your priorities.');\nconsole.log(turn.reply);\n\n// End the session\nsession.leave();\n```\n\nThe worklet file (`dist/worklet/mic-worklet.js`) must be served from the same origin as the page,\nor from a URL explicitly allowed by the browser's AudioWorklet loader.\n\n## API\n\n### `connectViaToken(opts)`\n\nReturns a `ConnectStrategy` that points the session at the box's well-known `/v2/session`\nendpoint using the short-lived JWT minted by your server.\n\n| Option | Type | Default |\n|--------|------|---------|\n| `connectUrl` | `string` | — |\n| `sessionToken` | `string` | — |\n| `sessionCapSeconds` | `number` | — (superseded by the box's `cap_seconds` once connected) |\n\n### `AvatarSession`\n\n```typescript\nnew AvatarSession(opts: AvatarSessionOpts)\n```\n\n| Member | Description |\n|--------|-------------|\n| `.start()` | Begin the session: open the session socket, handshake, start streaming. |\n| `.sendText(text)` | Send a typed turn over the session socket; resolves with `{text, reply}` plus optional speech metadata. |\n| `.leave()` | End the session and fire `onClose('generic')`. |\n| `.destroy()` | Tear down without callbacks (use in component cleanup). |\n| `.setMuted(muted)` | Mute or unmute the mic mid-session (muted frames are sent as silence, keeping timing continuous). |\n| `.setLangs(langs)` | Re-pin the ASR recognition language(s) mid-session; `[]` = auto-detect. |\n| `.setResponseLanguage(lang)` | Preferred reply language (BCP-47; `''` returns the choice to the model). |\n| `.setRuntimeInstruction(text)` | Replace hidden system-level guidance for subsequent turns without generating a reply or transcript entry; an empty string clears it. |\n| `.unmuteAudio()` | Unmute avatar audio after `onAudioBlocked`; call from a tap/click handler. |\n| `.bufferedVoiceMs()` | Avatar voice still queued to play, in ms, or `null` when there is no playout clock to ask (a video session, or one that has not accepted). `null` is \"unknown\", not \"none\". Feeds `attachCaptions`'s `remainingVoiceMs`. |\n| `.state` | Current `WidgetState`. |\n| `.sessionCapSeconds` | The session cap — the box's authoritative `cap_seconds` once connected. |\n| `.personaKey` | The avatar version the box bound, echoed in the handshake (the persona-pinning ack). |\n| `.videoCodec` | The downlink video codec the box negotiated — `'h264'`, `'hevc'` or `'av1'`; `undefined` before the handshake and in poster mode. A box that does not negotiate reports `'h264'`. |\n| `.negotiated` | What the box negotiated for this session — `{ micCodec, videoCodec, hasVideo, posterMode, features }`; `null` before the accept. |\n| `.stats()` | A snapshot of the diagnostic stream: the connect timeline, close code, last keepalive RTT, the negotiated shape and running counters. Safe to call after the session ends. |\n| `AvatarSession.ensureMicPermission()` | Request mic permission before `start()`. |\n| `AvatarSession.primeVideoElement(video)` | Call synchronously in the call-button tap handler, before any `await`: clears WebKit's per-element gesture restrictions so iOS Safari honors the SDK's unmute (otherwise the first call in a fresh browsing context plays muted, and pre-fix rendered as a slideshow). |\n| `AvatarSession.decodableVideoCodecs()` | The downlink codecs this browser can decode, which is what `videoCodec: 'auto'` offers the box. Diagnostics — report it next to `.videoCodec` to explain where a session landed. `[]` without MSE. |\n| `AvatarSession.mediaSupported()` | `false` on browsers without MSE. Poster-mode sessions (poster + audio) work regardless — the SDK simply doesn't offer video in the handshake. |\n\n### `attachDisclosure(target, options)`\n\nPopulates an application-owned element with the canonical persistent `● REC · AI · name` label.\nThe SDK owns the required wording, safe DOM construction, accessibility label, and update lifecycle;\nyour application owns placement and styling through the `casola-disclosure` class. When recording is\ndisabled, the REC segment is omitted. `details` accepts one string or an array of strings and always\nrenders them as plain text after the avatar name.\n\nStyle hooks are `casola-disclosure` on the target and\n`casola-disclosure__recording-group`, `__recording-dot`, `__recording`, `__ai`, `__name`,\n`__detail`, and `__separator` on its generated children.\n\n```typescript\nconst disclosure = attachDisclosure(document.querySelector('#call-label'), {\n  name: 'Mia',\n  recording: true,\n  details: ['Customer support', 'English'],\n});\n\ndisclosure.update({ recording: false, visible: true });\ndisclosure.destroy();\n```\n\n### `attachSessionControls(target, options)`\n\nPopulates an application-owned element with optional native mute and hang-up buttons. The SDK owns\naccessible state, button labels, pending hang-up protection, safe DOM construction, and the update\nlifecycle. The host owns the behavior through `onMutedChange` and `onHangup`, so product-specific\ncleanup, feedback, reporting, and navigation are not bypassed.\n\nStyle hooks are `casola-session-controls` on the target and\n`casola-session-controls__mute`, `__mute-label`, `__hangup`, and `__hangup-label` on generated\nchildren. State hooks are `[data-muted]` and `[data-ending]` on the target.\n\n```typescript\nconst controls = attachSessionControls(document.querySelector('#call-controls'), {\n  mute: true,\n  hangup: true,\n  muted: false,\n  labels: { hangup: 'End reading' },\n  onMutedChange: (muted) => session.setMuted(muted),\n  onHangup: async () => finishProductFlow(),\n});\n\ncontrols.update({ muted: true, muteDisabled: false });\ncontrols.destroy();\n```\n\nBoth helpers are protocol-agnostic DOM utilities — they behave identically to 0.1.4/0.1.5.\n\n### `attachCaptions(target, options)`\n\nPopulates an application-owned element with the streaming caption surface: the live ASR partial,\neach settled user turn, and the avatar's reply revealed in step with the utterance that speaks it.\n\nReply text arrives whole, with no per-word timing, so rendering `turn.reply` directly either\nraces ahead of the voice or waits on an invented delay. This helper uses what the wire actually\nprovides — `speech_start` / `speech_end` and the `speechId` they share with the turn:\n\n- a reply waits for its `speech_start`, the real audio onset, when the box marks utterances\n  (`startTimeoutMs` is the backstop if that marker never lands);\n- it does not wait at all when the box has sent no marker this session;\n- `speech_end` retimes the words still queued to finish inside the voice that is left, so the text\n  cannot keep crawling after the speaker has stopped. That marker means the box stopped\n  *producing* audio, not that the user stopped hearing it, so the budget is the player's own\n  buffered voice via `remainingVoiceMs` — falling back to the fixed `tailMs` guess when no\n  supplier is given or it answers `null`;\n- a reply for an utterance that already ended opens straight into that tail pace.\n\nStyle hooks are `casola-captions` on the target and `casola-captions__line` on each line, with\n`--partial`, `--user`, `--reply` and `--fading` modifiers. The target becomes a polite live region\n(`role=\"log\"`); a line still arriving is `aria-hidden` and announces once, whole, when it settles.\n\n```typescript\nlet session: AvatarSession | null = null;\n\nconst captions = attachCaptions(document.querySelector('#captions'), {\n  maxLines: 6,\n  holdMs: 2000, // 0 keeps lines until they are trimmed\n  fadeMs: 600,\n  // Read late: the ribbon is attached before the session it paces against exists.\n  remainingVoiceMs: () => session?.bufferedVoiceMs() ?? null,\n});\n\nsession = new AvatarSession({\n  callbacks: {\n    onPartial: (text) => captions.partial(text),\n    onTurn: (turn) => captions.turn(turn),\n    onSpeechStart: (id) => captions.speechStart(id),\n    onSpeechEnd: (id) => captions.speechEnd(id),\n  },\n  // …\n});\n\ncaptions.update({ visible: false });\ncaptions.destroy();\n```\n\nWiring `onSpeechStart` / `onSpeechEnd` is what buys the alignment; without them the helper still\nrenders, it just reveals every reply as soon as it arrives.\n\n`captions.line({ text, kind, speaker })` writes a line your application authored — a written\nfallback when a spoken reply fails, an interstitial — into the same ribbon, with no reveal\nschedule.\n\n### `attachSessionUI(container, options)`\n\nMounts the disclosure, controls and captions together, wires them to a session, and decides which\nstates show what. The three helpers stay individually exported; this is composition.\n\n```typescript\nimport { attachSessionUI, AvatarSession } from '@casola/avatar-client';\nimport '@casola/avatar-client/styles.css';\n\nconst ui = attachSessionUI(document.querySelector('#call'), {\n  name: 'Mia',\n  controls: { hangup: false },   // this product has its own end-call button\n  onHangup: () => endCallFlow(),\n});\n\nconst session = new AvatarSession({ videoEl, connect });\nui.bind(session);\nsession.start();\n```\n\nIt owns no layout — it creates one child per part and stops, because a laptop mock, a modal and a\n16:9 shadow root place these very differently. It owns no product copy either.\n\n**\"Live\" is not always `WidgetState.live`.** If your product waits for the first frame *and* the\nmicrophone before it considers the call started, say so with `visibleWhen`, or drive it yourself\nwith `ui.setLive(true)` / `ui.setLive(null)`.\n\n### `session.on(event, handler)`\n\nSubscribe after construction; the returned function unsubscribes. The constructor `callbacks` still\nwork and fire first. Events: `state`, `partial`, `turn`, `firstFrame`, `micReady`, `speechStart`,\n`speechEnd`, `audioFrameSent`, `audioBlocked`, `muteChange`, `diagnostic`, `close`, `error`. A\nthrowing handler is caught, so one bad subscriber cannot break the session.\n\n### `AvatarSession.preflight(options?)`\n\nMicrophone permission, MSE support and the browser gate in one call, before you spend a fleet seat:\n\n```typescript\nconst pre = await AvatarSession.preflight();\nif (!pre.ok) return showError(myCopy[pre.error.kind] ?? myCopy.generic);\nconst session = new AvatarSession({ permittedStream: pre.stream ?? undefined, videoEl, connect });\n```\n\nHold `pre.stream` and pass it as `permittedStream` so the session does not prompt twice.\n`pre.video === false` means poster mode is the only option here — a degradation, not a failure.\n\n### Errors\n\n`callbacks.onError` and the `error` event receive an `AvatarError`: a real `Error` with a `kind`\nand a `terminal` flag. Branch on `kind` instead of sniffing `DOMException` names.\n\n| kind | meaning |\n|---|---|\n| `mic-permission`, `mic-unavailable`, `mic-failed` | the microphone — the only kinds \"check your mic\" is correct for (`isMicError`) |\n| `unsupported-browser` | this browser cannot do what the session needs |\n| `connect`, `handshake` | the socket was refused or closed before accept, or the box never completed the handshake |\n| `timeout` | a connect watchdog fired: the socket never opened (30 s), or the box accepted and never sent a first video frame (20 s). `stage` says which (`'open'`, `'first-media'`; a slow `prewarm` is a non-terminal `'prewarm'`) |\n| `unauthorized`, `protocol-mismatch`, `persona-unavailable`, `capacity`, `policy` | the box refused: close 4001 / 4002 / 4003 / 4004 / 4008 |\n| `server`, `media` | in-band error or a playback hiccup — usually `terminal: false` |\n\nTreat an unrecognized kind as `unknown`; the list grows. Errors a timer produced also carry\n`stage` (`AvatarErrorStage`): where in the connect sequence it fired, for your analytics and the\nsupport line you show the user. An error a socket close produced carries `closeCode` (the raw\nWebSocket code behind the kind), and a `server` error carries `serverCode` (the box's in-band error\n`code`) — the number and the wire code the flattened message used to lose.\n\n### Diagnostics\n\n`callbacks.onDiagnostic` and the `diagnostic` event deliver an `AvatarDiagnostic`: a bounded,\noperational view of the session the SDK previously kept to itself. Branch on `d.type` and\ndefault-ignore an unrecognized one — the union grows. Every diagnostic carries `at` and, when you\npass `sessionId` / `traceId` in the options, those too; none of it goes on the wire.\n\n| `type` | what it reports |\n|---|---|\n| `connect_phase` | a connect milestone (`socket_open`, `accept`, `first_frame`, `first_audio`, `mic_ready`) and its ms from socket creation |\n| `socket_closed` | the close `code`, whether it was `afterAccept`, and the reason's length (never its text) |\n| `protocol_violation` | a malformed or out-of-sequence server message |\n| `server_error` | an in-band box error `code`, and whether it failed a pending `sendText` (`inFlightRequest`) |\n| `go_away` | the box asked the client to leave, with an optional `deadlineS` |\n| `session_end` | the raw end `reason` and the `EndReason` it mapped to |\n| `negotiated` | the codecs in force, `hasVideo`, `posterMode`, accepted `features` |\n| `rtt` | a keepalive round-trip in ms |\n| `text_failed` | a `sendText` that timed out or hit a dead transport |\n| `playback_rejected` | `video.play()` was rejected — the DOMException `name`, `readyState`, `muted` |\n| `media_error` | a `SourceBuffer`, video-element or codec-support error (`source`) |\n| `buffer_evicted` | MSE evicted buffered media under quota pressure |\n| `stall` | the pause watchdog resumed playback (`resume` / `resume_muted`) |\n| `mic_context` | the mic AudioContext was suspended at start, and whether `resume()` recovered it |\n| `mic_track` | the mic track ended, muted/unmuted, or the device set changed |\n| `frame_dropped` | the unit assembler discarded a fragment |\n\n```typescript\nconst session = new AvatarSession({\n  videoEl,\n  connect,\n  sessionId,          // from your mint — joins a diagnostic to the session\n  traceId,            // your support/trace id\n  logger: (level, message, detail) => myLog(level, message, detail),\n  callbacks: {\n    onDiagnostic: (d) => {\n      if (d.type === 'socket_closed') report('socket_closed', { code: d.code });\n    },\n  },\n});\n\n// After the call, one snapshot for your analytics row:\nconst stats = session.stats();   // { connect, closeCode, rttMs, negotiated, counters }\n```\n\n`AvatarSessionOpts.logger` routes the SDK's own internal logs (the driver, players, mic pipeline,\nstate machine) through one `(level, message, detail?)` sink. Absent, the SDK logs to a dev-gated\nconsole exactly as before.\n\n### Muting: user choice vs application suppression\n\n`setMuted()` is the user's choice. `suppressMic(true)` holds the microphone closed *without*\ndiscarding it, and `suppressMic(false)` restores whatever they had set — use it around app-driven\nturns rather than `setMuted(true)` … `setMuted(previous)`, which loses the user's intent whenever\nthe two interleave. Read `userMuted` / `micSuppressed` / `micMuted`, or subscribe to `muteChange`.\n\n### Default styles\n\n```typescript\nimport '@casola/avatar-client/styles.css';        // ordinary pages\nimport { adoptSessionUIStyles } from '@casola/avatar-client';\nadoptSessionUIStyles(myShadowRoot);               // shadow roots, which a stylesheet never reaches\n```\n\nTheme with custom properties on the container rather than overriding rules — `--casola-accent`,\n`--casola-caption-font`, `--casola-caption-bg`, `--casola-caption-blur`, `--casola-caption-max-height`,\n`--casola-speaker-*`, `--casola-control-*`, `--casola-disclosure-*`, `--casola-rec-color`.\n\n### Key types\n\n**`WidgetState`**\n```\n'idle' | 'selecting' | 'verifying' | 'waiting' | 'ready' | 'connecting' | 'live' | 'ended' | 'error'\n```\n\n**`EndReason`**\n```\n'cap' | 'edge_disconnect' | 'kicked' | 'expired' | 'dropped' | 'generic'\n```\n\n**`AvatarSessionOpts`**\n```typescript\n{\n  videoEl: HTMLVideoElement;\n  connect: ConnectStrategy;\n  langs?: string[];           // ASR language pin; [] / omitted = auto-detect\n  responseLanguage?: string;  // preferred reply language (BCP-47)\n  workletUrl?: string;        // default '/mic-worklet.js'\n  mic?: boolean;              // default true; false = receive-only (no getUserMedia, text via sendText)\n  permittedStream?: MediaStream; // from ensureMicPermission(), avoids a second prompt\n  micCodec?: 'auto' | 'pcm16'; // default 'auto': Opus when WebCodecs + the box allow it, else pcm16\n  videoCodec?: 'auto' | 'h264'; // default 'auto': offer every codec this browser decodes (AV1 /\n                              // HEVC / H.264) and let the box pick; 'h264' offers none\n  prewarm?: () => Promise<void> | void;\n  dev?: boolean;              // log unexpected state transitions + protocol violations\n  sessionId?: string;         // stamped on every diagnostic; never on the wire\n  traceId?: string;           // your support/trace id, stamped on every diagnostic\n  logger?: (level: 'debug' | 'warn', message: string, detail?: object) => void;\n  callbacks?: { ... };        // see AvatarSessionOpts for the full set, incl.\n                              // onSpeechStart/onSpeechEnd and onDiagnostic\n}\n```\n\n## Migrating from 0.1.x\n\n0.2.0 replaces the two-socket v1 wire with the single v2 session socket. Breaking changes:\n\n- Your backend must mint with `protocol_versions: [2]` and the fleet must contain protocol-v2\n  boxes; the SDK no longer speaks `/mse` + `/mic_stream`.\n- `connectViaToken` lost `edgePaths` (the path is well-known) — pass `sessionCapSeconds` as before.\n- `AvatarSessionOpts` lost `textTransport` (typed turns are always in-band) and `lang`\n  (use `langs` / `responseLanguage`).\n- The deprecated `onQueueStatus` callback was removed as promised in its deprecation note.\n\n`attachDisclosure` and `attachSessionControls` are unchanged from 0.1.4/0.1.5 — they render DOM and\nnever touch the wire.\n\n## License\n\nMIT © 2026 Casola\n","readmeFilename":"README.md"}