{"_id":"@agility/vibe-embed","_rev":"11-332677838d8a93bebca541125c05c4c3","name":"@agility/vibe-embed","dist-tags":{"latest":"0.8.0"},"versions":{"0.1.0":{"name":"@agility/vibe-embed","version":"0.1.0","keywords":["agility","agility-cms","embed","widget","react"],"license":"UNLICENSED","_id":"@agility/vibe-embed@0.1.0","maintainers":[{"name":"joelvarty","email":"joel@agilitycms.com"},{"name":"derekagility","email":"derek@agilitycms.com"},{"name":"kevin-agility","email":"kevint@agilitycms.com"},{"name":"jules-agility","email":"jules@agilitycms.com"}],"homepage":"https://github.com/agility/agility-vibe-code-app#readme","bugs":{"url":"https://github.com/agility/agility-vibe-code-app/issues"},"dist":{"shasum":"b6d64a9731b73feb584cab26951a5392e90958b4","tarball":"https://registry.npmjs.org/@agility/vibe-embed/-/vibe-embed-0.1.0.tgz","fileCount":18,"integrity":"sha512-aSa4ggkhJQw3+NXwuDjV4jEVLabEfWVt43AXlSVbdnRZYVrt7eYnowmr0nLi5tq6s0PF2lGuXWWHHrg+C432CQ==","signatures":[{"sig":"MEYCIQCc7UGiHjO+298T2GuoW2IeuX0ru2pEirtBIOOVzJV73wIhAJgLsfCR+NbGZOU8jekKQngsuXYr3ocYfi0QCzlh0Mah","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38089},"main":"./dist/index.js","type":"module","_from":"file:agility-vibe-embed-0.1.0.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joelvarty","email":"joel@agilitycms.com"},"_resolved":"/private/var/folders/x2/ryfvyg710lb0jr0f_56pv75r0000gn/T/34c9e2756306ddf5b425a9749b73ab15/agility-vibe-embed-0.1.0.tgz","_integrity":"sha512-aSa4ggkhJQw3+NXwuDjV4jEVLabEfWVt43AXlSVbdnRZYVrt7eYnowmr0nLi5tq6s0PF2lGuXWWHHrg+C432CQ==","repository":{"url":"git+https://github.com/agility/agility-vibe-code-app.git","type":"git","directory":"packages/embed-sdk"},"_npmVersion":"11.6.2","description":"Embed the Agility vibe-coding chat in a React app — widget lifecycle, a versioned host↔widget protocol, and a provider/hook pair.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19","vitest":"^2","typescript":"^5","@types/react":"^19"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/vibe-embed_0.1.0_1786290668938_0.91076030760376","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@agility/vibe-embed","version":"0.2.0","keywords":["agility","agility-cms","embed","widget","react"],"license":"UNLICENSED","_id":"@agility/vibe-embed@0.2.0","maintainers":[{"name":"joelvarty","email":"joel@agilitycms.com"},{"name":"derekagility","email":"derek@agilitycms.com"},{"name":"kevin-agility","email":"kevint@agilitycms.com"},{"name":"jules-agility","email":"jules@agilitycms.com"}],"homepage":"https://github.com/agility/agility-vibe-code-app#readme","bugs":{"url":"https://github.com/agility/agility-vibe-code-app/issues"},"dist":{"shasum":"60dc35c8e7a00d9317fd7cdb94f21260482ab10f","tarball":"https://registry.npmjs.org/@agility/vibe-embed/-/vibe-embed-0.2.0.tgz","fileCount":18,"integrity":"sha512-VB09z8pP0g5xKThEZ5DuwO2cqylKjZ72mpA4lqn2V/GHZ9bE0DgqLectT0Qb7q5+iK4XbfJ796gMJN1/Dmb4jA==","signatures":[{"sig":"MEUCIGN7QJ7RUixaTRA8IbTs6tVMJCeH7QNWRY5D/HFJLUWiAiEAoiL/+Mf+zubq9IU928d+HRn5ymYukqMa7MnnavlaRcw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":47720},"main":"./dist/index.js","type":"module","_from":"file:agility-vibe-embed-0.2.0.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joelvarty","email":"joel@agilitycms.com"},"_resolved":"/private/var/folders/x2/ryfvyg710lb0jr0f_56pv75r0000gn/T/9eef25a0af96fb3cd27c7a9328f95bc6/agility-vibe-embed-0.2.0.tgz","_integrity":"sha512-VB09z8pP0g5xKThEZ5DuwO2cqylKjZ72mpA4lqn2V/GHZ9bE0DgqLectT0Qb7q5+iK4XbfJ796gMJN1/Dmb4jA==","repository":{"url":"git+https://github.com/agility/agility-vibe-code-app.git","type":"git","directory":"packages/embed-sdk"},"_npmVersion":"11.6.2","description":"Embed the Agility vibe-coding chat in a React app — widget lifecycle, a versioned host↔widget protocol, and a provider/hook pair.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19","vitest":"^2","typescript":"^5","@types/react":"^19"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/vibe-embed_0.2.0_1786501719276_0.15826435876613454","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@agility/vibe-embed","version":"0.3.0","keywords":["agility","agility-cms","embed","widget","react"],"license":"UNLICENSED","_id":"@agility/vibe-embed@0.3.0","maintainers":[{"name":"joelvarty","email":"joel@agilitycms.com"},{"name":"derekagility","email":"derek@agilitycms.com"},{"name":"kevin-agility","email":"kevint@agilitycms.com"},{"name":"jules-agility","email":"jules@agilitycms.com"}],"homepage":"https://github.com/agility/agility-vibe-code-app#readme","bugs":{"url":"https://github.com/agility/agility-vibe-code-app/issues"},"dist":{"shasum":"283b3386735857e36114ac0afc2d7a41e4108a7e","tarball":"https://registry.npmjs.org/@agility/vibe-embed/-/vibe-embed-0.3.0.tgz","fileCount":18,"integrity":"sha512-TR0XKHJDgHZS9iUYCFKJaiHBsMPcD+h/I4n16d3LX/fDuC9PNY7Is6oHVjSeYhN7aFVynNYg+IjP6zvw7QL7yA==","signatures":[{"sig":"MEYCIQDwL6VhKBaHmnc0YmJeh4het6Jd5Fo9aQD0oi1Zb2A9OAIhAOPUEypHQXr7ucvr4wR/WLaDC4BIS7FlAP9FNmpxfVOV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59512},"main":"./dist/index.js","type":"module","_from":"file:agility-vibe-embed-0.3.0.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joelvarty","email":"joel@agilitycms.com"},"_resolved":"/private/var/folders/x2/ryfvyg710lb0jr0f_56pv75r0000gn/T/0065e3382325a333fb40f45d3dd40a85/agility-vibe-embed-0.3.0.tgz","_integrity":"sha512-TR0XKHJDgHZS9iUYCFKJaiHBsMPcD+h/I4n16d3LX/fDuC9PNY7Is6oHVjSeYhN7aFVynNYg+IjP6zvw7QL7yA==","repository":{"url":"git+https://github.com/agility/agility-vibe-code-app.git","type":"git","directory":"packages/embed-sdk"},"_npmVersion":"11.6.2","description":"Embed the Agility vibe-coding chat in a React app — widget lifecycle, a versioned host↔widget protocol, and a provider/hook pair.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19","vitest":"^2","typescript":"^5","@types/react":"^19"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/vibe-embed_0.3.0_1786534703816_0.07597230169852565","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@agility/vibe-embed","version":"0.4.0","keywords":["agility","agility-cms","embed","widget","react"],"license":"UNLICENSED","_id":"@agility/vibe-embed@0.4.0","maintainers":[{"name":"joelvarty","email":"joel@agilitycms.com"},{"name":"derekagility","email":"derek@agilitycms.com"},{"name":"kevin-agility","email":"kevint@agilitycms.com"},{"name":"jules-agility","email":"jules@agilitycms.com"}],"homepage":"https://github.com/agility/agility-vibe-code-app#readme","bugs":{"url":"https://github.com/agility/agility-vibe-code-app/issues"},"dist":{"shasum":"cefaac9ce200a716a4a38e6bfbd23cde76f50b98","tarball":"https://registry.npmjs.org/@agility/vibe-embed/-/vibe-embed-0.4.0.tgz","fileCount":18,"integrity":"sha512-Ojw53/4FQq/fdPL/93iThyld5mX19KTm3o9izf611H/+M0prIXTuEW94vNljq4+YHZoIimHKbPLosxD/JlI9Dg==","signatures":[{"sig":"MEUCIFBd4ND9C7qztkdBHaVkNUsl2LZbrE4maoZGsEJVR2BYAiEAmg9QgXBH3F/rhipXotS9frZlwAHWOeJd30xBG6ZANso=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":71329},"main":"./dist/index.js","type":"module","_from":"file:agility-vibe-embed-0.4.0.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joelvarty","email":"joel@agilitycms.com"},"_resolved":"/private/var/folders/x2/ryfvyg710lb0jr0f_56pv75r0000gn/T/d2a73dabea4c9b2f013af557cca348d0/agility-vibe-embed-0.4.0.tgz","_integrity":"sha512-Ojw53/4FQq/fdPL/93iThyld5mX19KTm3o9izf611H/+M0prIXTuEW94vNljq4+YHZoIimHKbPLosxD/JlI9Dg==","repository":{"url":"git+https://github.com/agility/agility-vibe-code-app.git","type":"git","directory":"packages/embed-sdk"},"_npmVersion":"11.6.2","description":"Embed the Agility vibe-coding chat in a React app — widget lifecycle, a versioned host↔widget protocol, and a provider/hook pair.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19","vitest":"^2","typescript":"^5","@types/react":"^19"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/vibe-embed_0.4.0_1786631909870_0.5871826220935235","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@agility/vibe-embed","version":"0.5.0","keywords":["agility","agility-cms","embed","widget","react"],"license":"UNLICENSED","_id":"@agility/vibe-embed@0.5.0","maintainers":[{"name":"joelvarty","email":"joel@agilitycms.com"},{"name":"derekagility","email":"derek@agilitycms.com"},{"name":"kevin-agility","email":"kevint@agilitycms.com"},{"name":"jules-agility","email":"jules@agilitycms.com"}],"homepage":"https://github.com/agility/agility-vibe-code-app#readme","bugs":{"url":"https://github.com/agility/agility-vibe-code-app/issues"},"dist":{"shasum":"85b135582a7fe6a9988459eb11dd6aa7334ed03b","tarball":"https://registry.npmjs.org/@agility/vibe-embed/-/vibe-embed-0.5.0.tgz","fileCount":18,"integrity":"sha512-1Xo4v82JakcDuLPO9ZC9WU1iH55z2CMvyp6EYu2VtpP9/NNzr8L9O0oNnVRhNODFMJbEVVa1EIG+i4mX2/FKyw==","signatures":[{"sig":"MEUCIQD9OM0Q5qp+V+Ggku074718/KdwWylPSM1PhBXb09wt8QIgeIWqEe2s6PFlGJKuiXuasII4S38aheS0NyJJPZcI9R0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":82251},"main":"./dist/index.js","type":"module","_from":"file:agility-vibe-embed-0.5.0.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joelvarty","email":"joel@agilitycms.com"},"_resolved":"/private/var/folders/x2/ryfvyg710lb0jr0f_56pv75r0000gn/T/ed6d0d1d3b10868b6dedd2c8037ca0ba/agility-vibe-embed-0.5.0.tgz","_integrity":"sha512-1Xo4v82JakcDuLPO9ZC9WU1iH55z2CMvyp6EYu2VtpP9/NNzr8L9O0oNnVRhNODFMJbEVVa1EIG+i4mX2/FKyw==","repository":{"url":"git+https://github.com/agility/agility-vibe-code-app.git","type":"git","directory":"packages/embed-sdk"},"_npmVersion":"11.6.2","description":"Embed the Agility vibe-coding chat in a React app — widget lifecycle, a versioned host↔widget protocol, and a provider/hook pair.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19","vitest":"^2","typescript":"^5","@types/react":"^19"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/vibe-embed_0.5.0_1786633843745_0.317733835081506","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@agility/vibe-embed","version":"0.5.1","keywords":["agility","agility-cms","embed","widget","react"],"license":"UNLICENSED","_id":"@agility/vibe-embed@0.5.1","maintainers":[{"name":"joelvarty","email":"joel@agilitycms.com"},{"name":"derekagility","email":"derek@agilitycms.com"},{"name":"kevin-agility","email":"kevint@agilitycms.com"},{"name":"jules-agility","email":"jules@agilitycms.com"}],"homepage":"https://github.com/agility/agility-vibe-code-app#readme","bugs":{"url":"https://github.com/agility/agility-vibe-code-app/issues"},"dist":{"shasum":"a582caed8f8936660cd48505bc992dc64334e3ac","tarball":"https://registry.npmjs.org/@agility/vibe-embed/-/vibe-embed-0.5.1.tgz","fileCount":18,"integrity":"sha512-2BQIl0oSlkscQWpw2lc/pspgQQZVg1xFYJ/sIacFoFD+kGZF8OUQMf9vOAYjmochjulZ0+QUYi4lD6poDZuKvg==","signatures":[{"sig":"MEUCIDL4qExfLIoICHqXpXIRuyqBmpjG6l6bYusx6cQHSLEqAiEAufnAZWdwSq7VIqbyR710lyGaGV57ZPSt3rY64b6WQ8Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":84024},"main":"./dist/index.js","type":"module","_from":"file:agility-vibe-embed-0.5.1.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joelvarty","email":"joel@agilitycms.com"},"_resolved":"/private/var/folders/x2/ryfvyg710lb0jr0f_56pv75r0000gn/T/91a1085e921f7998d4317ffb4706b834/agility-vibe-embed-0.5.1.tgz","_integrity":"sha512-2BQIl0oSlkscQWpw2lc/pspgQQZVg1xFYJ/sIacFoFD+kGZF8OUQMf9vOAYjmochjulZ0+QUYi4lD6poDZuKvg==","repository":{"url":"git+https://github.com/agility/agility-vibe-code-app.git","type":"git","directory":"packages/embed-sdk"},"_npmVersion":"11.6.2","description":"Embed the Agility vibe-coding chat in a React app — widget lifecycle, a versioned host↔widget protocol, and a provider/hook pair.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19","vitest":"^2","typescript":"^5","@types/react":"^19"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/vibe-embed_0.5.1_1786634670359_0.32459042925650294","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@agility/vibe-embed","version":"0.6.0","keywords":["agility","agility-cms","embed","widget","react"],"license":"UNLICENSED","_id":"@agility/vibe-embed@0.6.0","maintainers":[{"name":"joelvarty","email":"joel@agilitycms.com"},{"name":"derekagility","email":"derek@agilitycms.com"},{"name":"kevin-agility","email":"kevint@agilitycms.com"},{"name":"jules-agility","email":"jules@agilitycms.com"}],"homepage":"https://github.com/agility/agility-vibe-code-app#readme","bugs":{"url":"https://github.com/agility/agility-vibe-code-app/issues"},"dist":{"shasum":"7d96dd52b2748f7b31807693d3da1e966cf4b58b","tarball":"https://registry.npmjs.org/@agility/vibe-embed/-/vibe-embed-0.6.0.tgz","fileCount":18,"integrity":"sha512-KlfO2Ituqqs4zOEREHFPNFvVblvX9achrPkQJXOAPHR6AzvnwARDlrDnDGNjhrNzDfXEfxLDXz7LdoYXhOgTrw==","signatures":[{"sig":"MEQCIHbVKzdKiyUBglbtVrb8+qetyFEkWkVGoyZJ25I94jHyAiBb48TPgJJ7jvNWFZwZIgq389Z5xr3kEQsOsoTmSl78CQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":118905},"main":"./dist/index.js","type":"module","_from":"file:agility-vibe-embed-0.6.0.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joelvarty","email":"joel@agilitycms.com"},"_resolved":"/private/var/folders/x2/ryfvyg710lb0jr0f_56pv75r0000gn/T/e985df9889fe8160278eefa013733649/agility-vibe-embed-0.6.0.tgz","_integrity":"sha512-KlfO2Ituqqs4zOEREHFPNFvVblvX9achrPkQJXOAPHR6AzvnwARDlrDnDGNjhrNzDfXEfxLDXz7LdoYXhOgTrw==","repository":{"url":"git+https://github.com/agility/agility-vibe-code-app.git","type":"git","directory":"packages/embed-sdk"},"_npmVersion":"11.6.2","description":"Embed the Agility vibe-coding chat in a React app — widget lifecycle, a versioned host↔widget protocol, and a provider/hook pair.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19","vitest":"^2","typescript":"^5","@types/react":"^19"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/vibe-embed_0.6.0_1786637213720_0.8599544315777918","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@agility/vibe-embed","version":"0.7.0","keywords":["agility","agility-cms","embed","widget","react"],"license":"UNLICENSED","_id":"@agility/vibe-embed@0.7.0","maintainers":[{"name":"joelvarty","email":"joel@agilitycms.com"},{"name":"derekagility","email":"derek@agilitycms.com"},{"name":"kevin-agility","email":"kevint@agilitycms.com"},{"name":"jules-agility","email":"jules@agilitycms.com"}],"homepage":"https://github.com/agility/agility-vibe-code-app#readme","bugs":{"url":"https://github.com/agility/agility-vibe-code-app/issues"},"dist":{"shasum":"ce3f95cc46fae213ac8722427f2584d58712a351","tarball":"https://registry.npmjs.org/@agility/vibe-embed/-/vibe-embed-0.7.0.tgz","fileCount":18,"integrity":"sha512-25IpKVtxHVMkAywGPlTtjUfAIfO/8IEGkL/ayrmSB/HoyLJ95nwbTuyThj6VP1bdmy4t20h8gHzn1B8xuPpl3Q==","signatures":[{"sig":"MEUCIQCa1x7Icbf6PCt34pjBo1aZrUK8jD8WUnoM3q+FydE84gIgchUk1ZY6dC6DLiy5zTBvXgLGNj6RnV/Dzv+EgPuioC8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":120031},"main":"./dist/index.js","type":"module","_from":"file:agility-vibe-embed-0.7.0.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joelvarty","email":"joel@agilitycms.com"},"_resolved":"/private/var/folders/x2/ryfvyg710lb0jr0f_56pv75r0000gn/T/15bceb730b5c086582a8841d80be7910/agility-vibe-embed-0.7.0.tgz","_integrity":"sha512-25IpKVtxHVMkAywGPlTtjUfAIfO/8IEGkL/ayrmSB/HoyLJ95nwbTuyThj6VP1bdmy4t20h8gHzn1B8xuPpl3Q==","repository":{"url":"git+https://github.com/agility/agility-vibe-code-app.git","type":"git","directory":"packages/embed-sdk"},"_npmVersion":"11.6.2","description":"Embed the Agility vibe-coding chat in a React app — widget lifecycle, a versioned host↔widget protocol, and a provider/hook pair.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19","vitest":"^2","typescript":"^5","@types/react":"^19"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/vibe-embed_0.7.0_1786641017142_0.7684757576380696","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"@agility/vibe-embed","version":"0.7.1","keywords":["agility","agility-cms","embed","widget","react"],"license":"UNLICENSED","_id":"@agility/vibe-embed@0.7.1","maintainers":[{"name":"joelvarty","email":"joel@agilitycms.com"},{"name":"derekagility","email":"derek@agilitycms.com"},{"name":"kevin-agility","email":"kevint@agilitycms.com"},{"name":"jules-agility","email":"jules@agilitycms.com"}],"homepage":"https://github.com/agility/agility-vibe-code-app#readme","bugs":{"url":"https://github.com/agility/agility-vibe-code-app/issues"},"dist":{"shasum":"39a26f5aa4e586c6e31a1be51ad1de6bbe8e26d9","tarball":"https://registry.npmjs.org/@agility/vibe-embed/-/vibe-embed-0.7.1.tgz","fileCount":18,"integrity":"sha512-mEyxdJ1yLLZT94bmRsVS0bJWdTQpoqJgxHLcHLIoIM1UrBQD/ubFkshUl4M7ZnxSXGu9PhfAoRXlZzWbCazO3A==","signatures":[{"sig":"MEQCIDZCWg+V2VGh8wNSc2wio/pL7tLN2hvKToi+Dn00YZpbAiBR56JHW6wC/Veq9H/cOYhUpHrZaT+cV2oy62XJNXsLuA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":125103},"main":"./dist/index.js","type":"module","_from":"file:agility-vibe-embed-0.7.1.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joelvarty","email":"joel@agilitycms.com"},"_resolved":"/private/var/folders/x2/ryfvyg710lb0jr0f_56pv75r0000gn/T/1e241d7503783cd179b36cad843ffc56/agility-vibe-embed-0.7.1.tgz","_integrity":"sha512-mEyxdJ1yLLZT94bmRsVS0bJWdTQpoqJgxHLcHLIoIM1UrBQD/ubFkshUl4M7ZnxSXGu9PhfAoRXlZzWbCazO3A==","repository":{"url":"git+https://github.com/agility/agility-vibe-code-app.git","type":"git","directory":"packages/embed-sdk"},"_npmVersion":"11.6.2","description":"Embed the Agility vibe-coding chat in a React app — widget lifecycle, a versioned host↔widget protocol, and a provider/hook pair.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19","vitest":"^2","typescript":"^5","@types/react":"^19"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/vibe-embed_0.7.1_1786741915689_0.9825298533221838","host":"s3://npm-registry-packages-npm-production"}},"0.7.2":{"name":"@agility/vibe-embed","version":"0.7.2","keywords":["agility","agility-cms","embed","widget","react"],"license":"UNLICENSED","_id":"@agility/vibe-embed@0.7.2","maintainers":[{"name":"joelvarty","email":"joel@agilitycms.com"},{"name":"derekagility","email":"derek@agilitycms.com"},{"name":"kevin-agility","email":"kevint@agilitycms.com"},{"name":"jules-agility","email":"jules@agilitycms.com"}],"homepage":"https://github.com/agility/agility-vibe-code-app#readme","bugs":{"url":"https://github.com/agility/agility-vibe-code-app/issues"},"dist":{"shasum":"2a6d043acb0fe7c15f385e252160c2c2f2bbc07d","tarball":"https://registry.npmjs.org/@agility/vibe-embed/-/vibe-embed-0.7.2.tgz","fileCount":18,"integrity":"sha512-3UVfo4mxT98eY3bBiWcP6GC7xFW9+csMf4/wZTn6rNY1YaZvdqseRBqdrjmSnriri2+kEN+kOZ0adXwpamO8mQ==","signatures":[{"sig":"MEQCIFGiiZFVoSC2dnWJRw7LquwNLYPLO46P53zN0FvAymL3AiALDJt+G+iwYmNynQY9ziPQnIT7TjPO8s+5kezjV6FB7g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":125457},"main":"./dist/index.js","type":"module","_from":"file:agility-vibe-embed-0.7.2.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"joelvarty","email":"joel@agilitycms.com"},"_resolved":"/private/var/folders/x2/ryfvyg710lb0jr0f_56pv75r0000gn/T/7e4d1625717ac595b6592a2face84081/agility-vibe-embed-0.7.2.tgz","_integrity":"sha512-3UVfo4mxT98eY3bBiWcP6GC7xFW9+csMf4/wZTn6rNY1YaZvdqseRBqdrjmSnriri2+kEN+kOZ0adXwpamO8mQ==","repository":{"url":"git+https://github.com/agility/agility-vibe-code-app.git","type":"git","directory":"packages/embed-sdk"},"_npmVersion":"11.6.2","description":"Embed the Agility vibe-coding chat in a React app — widget lifecycle, a versioned host↔widget protocol, and a provider/hook pair.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19","vitest":"^2","typescript":"^5","@types/react":"^19"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/vibe-embed_0.7.2_1786979351049_0.8401733421441182","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@agility/vibe-embed","version":"0.8.0","description":"Embed the Agility vibe-coding chat in a React app — widget lifecycle, a versioned host↔widget protocol, and a provider/hook pair.","license":"UNLICENSED","repository":{"type":"git","url":"git+https://github.com/agility/agility-vibe-code-app.git","directory":"packages/embed-sdk"},"keywords":["agility","agility-cms","embed","widget","react"],"type":"module","sideEffects":false,"main":"./dist/index.js","types":"./dist/index.d.ts","publishConfig":{"access":"public"},"peerDependencies":{"react":">=18"},"devDependencies":{"@types/react":"^19","react":"^19","typescript":"^5","vitest":"^2"},"scripts":{"build":"tsc -p tsconfig.build.json","typecheck":"tsc -p tsconfig.json --noEmit","test":"vitest run"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"_id":"@agility/vibe-embed@0.8.0","bugs":{"url":"https://github.com/agility/agility-vibe-code-app/issues"},"homepage":"https://github.com/agility/agility-vibe-code-app#readme","_integrity":"sha512-5WFtp3bX4zgP5Q49uCx7sEMClAc2W6QZyfZo6nZxkR8BwJlEPSudWGGkew+alG/o38nJ846idTPxklzeCpY9pg==","_resolved":"/private/var/folders/x2/ryfvyg710lb0jr0f_56pv75r0000gn/T/5d7fb07cc68d933fab0dc43e44d5ee99/agility-vibe-embed-0.8.0.tgz","_from":"file:agility-vibe-embed-0.8.0.tgz","_nodeVersion":"24.13.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-5WFtp3bX4zgP5Q49uCx7sEMClAc2W6QZyfZo6nZxkR8BwJlEPSudWGGkew+alG/o38nJ846idTPxklzeCpY9pg==","shasum":"c33dd26b36bc4c5e131a78bfe154200b55d2ffee","tarball":"https://registry.npmjs.org/@agility/vibe-embed/-/vibe-embed-0.8.0.tgz","fileCount":18,"unpackedSize":129993,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIATBZ0aU/hEfrng/xVvN6csFV9K8IRgwSfersSOKPn6gAiEAmU/BFHPbSmXMksB2um/B2jJEFqb3OkTIvGvJR7PUTXo="}]},"_npmUser":{"name":"joelvarty","email":"joel@agilitycms.com"},"directories":{},"maintainers":[{"name":"joelvarty","email":"joel@agilitycms.com"},{"name":"derekagility","email":"derek@agilitycms.com"},{"name":"kevin-agility","email":"kevint@agilitycms.com"},{"name":"jules-agility","email":"jules@agilitycms.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/vibe-embed_0.8.0_1787252438315_0.11201313229570342"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-09T15:51:08.665Z","modified":"2026-08-20T19:00:38.617Z","0.1.0":"2026-08-09T15:51:09.075Z","0.2.0":"2026-08-12T02:28:39.436Z","0.3.0":"2026-08-12T11:38:23.944Z","0.4.0":"2026-08-13T14:38:30.031Z","0.5.0":"2026-08-13T15:10:43.897Z","0.5.1":"2026-08-13T15:24:30.558Z","0.6.0":"2026-08-13T16:06:53.875Z","0.7.0":"2026-08-13T17:10:17.278Z","0.7.1":"2026-08-14T21:11:55.843Z","0.7.2":"2026-08-17T15:09:11.261Z","0.8.0":"2026-08-20T19:00:38.455Z"},"bugs":{"url":"https://github.com/agility/agility-vibe-code-app/issues"},"license":"UNLICENSED","homepage":"https://github.com/agility/agility-vibe-code-app#readme","keywords":["agility","agility-cms","embed","widget","react"],"repository":{"type":"git","url":"git+https://github.com/agility/agility-vibe-code-app.git","directory":"packages/embed-sdk"},"description":"Embed the Agility vibe-coding chat in a React app — widget lifecycle, a versioned host↔widget protocol, and a provider/hook pair.","maintainers":[{"name":"joelvarty","email":"joel@agilitycms.com"},{"name":"derekagility","email":"derek@agilitycms.com"},{"name":"kevin-agility","email":"kevint@agilitycms.com"},{"name":"jules-agility","email":"jules@agilitycms.com"}],"readme":"# @agility/vibe-embed\n\nEmbeds the Agility vibe-coding chat into a React app as an Intercom-style widget: an iframe\nthe host controls, a versioned message protocol between them, and a provider/hook pair so any\ncomponent can open the chat or read what it's doing.\n\nThe first host is Agility's own Content Manager app (React 18, Vite), behind a feature flag.\n\n## Install\n\n```bash\nnpm install @agility/vibe-embed     # yarn add @agility/vibe-embed\n```\n\nRequires React >= 18 as a peer. Public npm, same scope and registry as `@agility/plenum-ui`\nand the rest — **no `.npmrc` entry and no auth token**, in the app or in CI.\n\n> Why not GitHub Packages: it requires the package be scoped to the repo owner (`@agility`),\n> and npm maps a registry **per scope, not per package**. Pointing `@agility` at GitHub\n> Packages would send `plenum-ui`, `content-fetch`, `nextjs`, `management-sdk` and the rest\n> there too, and they'd all 404. Using GitHub Packages for this SDK would mean moving the\n> entire scope.\n\n## Use\n\nMount the provider once at the app shell — **behind the flag, so flag-off never renders it**:\n\n```tsx\nimport { AgilityVibeProvider, useAgilityVibe } from \"@agility/vibe-embed\"\n\n<AgilityVibeProvider\n  widgetUrl=\"https://vibe-coding.agilitycms.com/widget\"\n  instanceGuid={instance.guid}\n  auth={() => getVibeAuth()}          // called lazily, and again on iframe reload\n  context={{ url: location.pathname, section: \"content\", contentID }}\n  onNavigate={(e) => router.push(e.url)}\n>\n  {children}\n</AgilityVibeProvider>\n```\n\nThen anywhere below it:\n\n```tsx\nconst vibe = useAgilityVibe()\nif (!vibe) return null          // null until the provider has mounted — see below\nvibe.toggle()\nvibe.state.busy                 // true while a turn is running\n```\n\n### The things worth knowing before you wire it up\n\n- **`useAgilityVibe()` is `null` on the first render only.** The instance is created in an\n  effect, so there is no handle until after mount — guard it. From the render after mount it is\n  live, which means `on(\"ready\", …)` is reachable from inside the tree. (In 0.1.0 it stayed null\n  until some unrelated state message re-rendered the provider, so `ready` had usually already\n  fired by the time a child could subscribe. Fixed in 0.2.0.)\n- **`auth` returns the logged-in CMS user's credentials**, lazily, and again whenever the iframe\n  reloads — so a short-lived token is fine, and expected. Identity is re-derived server-side from\n  the token presented; nothing trusts a client-claimed user id. Return either the token as a\n  string, or a `VibeAuth`:\n\n  ```ts\n  import type { VibeAuth } from \"@agility/vibe-embed\"\n\n  async function getVibeAuth(): Promise<VibeAuth> {\n    return {\n      token: await mintManagementToken(),\n      // OPTIONAL. The host's AgilityAuthOWIN cookie value, for the few CMS settings that live\n      // only on the classic backend (sitemap deployments) and accept nothing else — a management\n      // token gets a flat 401 there. Omitting it is a supported state: everything else works, and\n      // those screens say so themselves rather than failing.\n      //\n      // Check you can read it before bothering — if the cookie is HttpOnly, no script can:\n      //   document.cookie.split('; ').some(c => c.startsWith('AgilityAuthOWIN='))\n      classicSession: readOwinCookie(),\n\n      // OPTIONAL, and the cheapest correctness win available to a host. Which Agility backends\n      // serve THIS instance. Without it we derive them from the guid's region suffix, which\n      // cannot work for an instance whose guid is a plain UUID (they exist, and they are dev\n      // instances — a suffix parser reads them as production and every call goes to the wrong\n      // environment). In the Manager App both values are already in scope:\n      //\n      //   const { managerUrl } = useWebsiteInfo()   // per-instance classic root\n      //\n      // Roots only, https, and Agility's own domains — we validate server-side and ignore\n      // anything else, because these decide where the credentials above get sent.\n      backends: { classic: managerUrl, management: MGMT_API_ROOT },\n    }\n  }\n  ```\n- **Options are captured at mount, deliberately.** `widgetUrl` or `instanceGuid` changing means\n  a *different widget*, not a reconfigured one — remount with a `key` when the user switches\n  instance.\n- **`renderLauncher={false}`** if the host has its own launcher. Read `state.busy`/`state.open`\n  and drive it yourself; the plan calls for the launcher to show when a chat is processing. To\n  translate ours rather than replace it, pass `labels` — much the cheaper of the two.\n- **`onActivity`** fires when the agent changes something: `{kind:\"done\"}` once per run (revalidate\n  broadly) and `{kind:\"changed\", entityKind, entityId, …}` per entity as it lands (revalidate that\n  one thing). The scoped one is what refreshes an editor the user has open.\n- **`context` is pushed on every change** — a SPA route change is a `setContext`, which is how\n  the agent knows what the user is looking at. It's context, not a request: the agent is told\n  never to act on it by itself. Fields: `url`, `title`, `locale`, `section`, `pageID`,\n  `contentID`; anything else is dropped server-side. `section` is the coarse \"where am I\"\n  (`content`, `pages`, `media`, `models`, …) and is the useful one on the many screens that carry\n  no id at all.\n- **The latest context is replayed on the handshake.** Set it as early as you like — before the\n  iframe exists is fine, the SDK buffers it and flushes on `ready`. (In 0.1.0 that first push went\n  nowhere and nothing re-sent it, so a user who loaded a screen and immediately asked \"help me\n  with this page\" got the locale and nothing else. Fixed in 0.2.0.)\n\n## Protocol\n\nHost↔widget messages are versioned and namespaced (`PROTOCOL_SOURCE`, `PROTOCOL_V`) and every\ninbound message is validated by `parseWidgetMessage` before it reaches state — an iframe on\nanother origin is untrusted input. `reduceState` is pure and exported, so the host can model\nwidget state without a live iframe (that's what the tests do).\n\n## Publishing\n\n```bash\npnpm --filter @agility/vibe-embed publish --access public\n```\n\n`prepack` builds first, `files` ships `dist` alone, and `publishConfig` repoints\n`main`/`types`/`exports` at `dist` — **on publish only**.\n\n**In this monorepo the package stays source-resolved** (`main` → `src/index.ts`), so the\ndashboard keeps importing TypeScript directly with no build step and no `dist` in the dev path\nto go stale. That split is the whole reason `publishConfig` exists here.\n\nNothing secret ships: this is browser code that a host serves to its own users. Being on public\nnpm doesn't open the widget to the world either — origin and auth are enforced server-side, and\npublic embedding in customers' apps remains a separate decision (see\n[docs/plans/chat-widget.md](../../docs/plans/chat-widget.md)).\n\n## What changed in 0.8.0\n\nAdditive; a host that sends nothing behaves exactly as before.\n\n- **`auth` gained `backends`** — `{ classic?, management? }`, the Agility roots that serve this\n  instance. We had been deriving both from the guid's region suffix, and that derivation was wrong\n  three ways at once: the dev classic host in our table had stopped resolving (dev moved to\n  publishwithagility.com), `us2` was spelled where the region calls itself `usa2`, and an instance\n  whose guid is a plain UUID has no suffix to read at all — so it resolved as production and every\n  call went to the wrong environment. Live dev instances have UUID guids.\n\n  The Manager App has both values already: `useWebsiteInfo().managerUrl` is the per-instance\n  classic root (Agility returns it on the `me()` listing, which is where we now read it server-side\n  too), and the Management root is the one your own calls use. **Send roots only** — scheme + host,\n  no path.\n\n  Validated server-side against Agility's own domains over https, and silently ignored otherwise:\n  these values decide where the token and the classic session get sent, so an arbitrary host cannot\n  be honoured. That check is enforcement, not ceremony — do not point them at a proxy.\n\n## What changed in 0.7.0\n\nAdditive; an older host ignores the new field and behaves as before.\n\n- **`context` gained `containerID`** — the ContentViewID of the content list/container the user is\n  looking at. A list screen carries no `contentID` (the container IS the subject), so without this\n  \"create a post in this list\" had nothing to resolve against. The CMS was already computing the\n  id and discarding it, with a comment saying why: the protocol had no field for it.\n\n  What the id means depends on where it sits, and that is the host's own route convention:\n  `list-{id}` is a list · `item-{id}` **under** `/pages/page-{n}/` is a component on that page ·\n  a bare `item-{id}` is a standalone single item. Send the page id as well when both are on the\n  route — the pair is what tells a component apart from a single item.\n- **Send it for `list`, `item` and `newlistitem` screens.** In the CMS's own mapping that is\n  `topStackItem.name`, and the page id has to come off the ROUTE rather than the stack, because\n  the stack only gives you the top of it.\n\n## What changed in 0.6.0\n\n**The panel can dock.** New capability, nothing breaking — an 0.5.x host shows no toggle and\nbehaves exactly as before.\n\n- **`presentation: \"popup\" | \"docked\" | \"modal\"`** joins `state`. Popup is the Intercom-style\n  floating panel; **docked** is a full-height column pinned to the edge, the shape Chrome's own\n  side panel has; **modal** is big and centred over the whole host page on a dimmed backdrop, for\n  a surface that genuinely cannot fit a chat-width column. **Closed is always the launcher, in\n  every mode** — this is a presentation of the OPEN panel, not a second widget.\n- **`modal` is transient, and the only one that isn't a preference.** A surface asks for the room\n  while it is open and hands it straight back; the mode the user actually chose is restored on\n  exit, and `modal` is never persisted (reopening the widget as a giant dialog because of a report\n  someone read yesterday would be absurd). Clicking the backdrop leaves it, and the widget is told\n  — which is how \"click outside to dismiss\" works without the host knowing what is inside its own\n  iframe. The room-making callback reports **width 0** for a modal: it covers the page on purpose,\n  so asking the host to also shove its content aside would be wrong twice.\n- **The toggle lives in the widget's toolbar**, because everything lives in the widget. It posts\n  a *request*; the host applies it and reports back, and the button renders from the answer. So a\n  host that clamps or declines can never leave the toolbar claiming a shape you aren't looking at.\n  Capability-gated the honest way round: the host announces `presentations` on the handshake, and\n  the widget draws no button unless docking is genuinely on offer.\n- **A restyle, never a re-parent.** Moving an iframe in the DOM reloads it, which would drop a\n  streaming run and restart the conversation. `root` and `panel` change their own CSS and the\n  iframe never moves — a run mid-swap doesn't blink. This is the whole reason the feature is cheap.\n- **DOCKED PUSHES YOUR CONTENT ASIDE — it does not cover it.** Side by side is the whole reason to\n  dock rather than float, so `pushContent` defaults **on**: the SDK pads `document.body` by the\n  dock width and restores your own inline value on undock. Docking therefore works with no host\n  code at all. Pass an element if your real scroll container isn't the body:\n\n  ```tsx\n  <AgilityVibeProvider pushContent={document.getElementById(\"app-main\")!} …>\n  ```\n\n  Prefer to move your own layout? `pushContent={false}` and read the width:\n\n  ```tsx\n  const vibe = useAgilityVibe()\n  <main style={{ paddingRight: vibe?.dockedWidth ?? 0,\n                 transition: `padding-right ${PRESENTATION_TRANSITION_MS}ms ease-out` }}>\n  ```\n\n  A number, not a boolean, because the width is clamped host-side — it never takes more than 60%\n  of the window, so \"docked\" alone doesn't tell you how far to move. `PRESENTATION_TRANSITION_MS`\n  is exported so your content eases in step with the panel; two durations reads as a glitch.\n- **The choice sticks**, per instance, in `localStorage` — and beats `defaultPresentation`, which\n  is a first impression rather than a standing instruction. Pass `rememberPresentation={false}`\n  to own the preference yourself. `dockWidth` sets the column width (default 420).\n- **`setPresentation(mode)`** is on the hook too, for a host that wants its own \"open docked\"\n  affordance: `vibe.setPresentation(\"docked\"); vibe.open()`.\n\nThe first user of `modal` is the widget's own operations report: a four-column audit table cannot\nbe read in a 420px frame, so it asks for the middle of the screen while it is open. Nothing is\nrequested when the host can't offer it — the report just renders narrower and its table scrolls.\n\n## What changed in 0.5.1\n\nCosmetic only.\n\n- **The launcher is 64px, up from 48.** Dropping the disc in 0.5.0 also dropped a size cue:\n  the bubble only fills the middle ~70% of its viewBox, so 48px of box read as ~34px of mark\n  and looked undersized on the CMS shell. 64px of box is ~45px of mark — about what a 48px\n  disc launcher reads as.\n- **`--agent-launcher-size` retunes it** without waiting for a release, alongside\n  `--agent-accent` and `--agent-bubble`:\n\n  ```css\n  [data-agility-vibe] { --agent-launcher-size: 56px; }\n  ```\n\n  The badge offset is derived from it, so it stays pinned to the bubble's corner at any size\n  rather than drifting into the empty part of the box.\n\n## What changed in 0.5.0\n\nNothing breaking, but **the launcher looks different and its states mean something new** —\nworth a look before you ship it.\n\n- **The icon IS the launcher.** The white disc is gone — no circle, no border, no busy ring\n  around it. The mark floats on the host's page at 48px with a drop-shadow that follows its\n  own outline, and scales slightly on hover (the only affordance a bare mark can have). The\n  marks say what is happening, so a ring had nothing left to add.\n- **The marks are the real design** (`docs/designs/agility-agent-icons.html` in the app repo,\n  Joel 2026-08-13). 0.4.0 shipped an approximation: its \"working\" dot swung around the icon's\n  centre, where the design has it lapping the **bubble's actual outline** (SMIL\n  `animateMotion` + `mpath` — no CSS primitive follows an arbitrary path the same way in every\n  browser). The bubble is filled (`--agent-bubble`, default `#a9aaa3`), the sparkles twinkle,\n  and **typing is deliberately spare**: bubble plus three centred dots, no triangle and no\n  sparkles, so \"responding\" reads instantly at launcher size.\n- **The states settled:**\n\n  | the agent is | the launcher shows |\n  |---|---|\n  | doing nothing | the static mark |\n  | **waiting on you** | the static mark **plus a yellow `!` badge** |\n  | actually sending a response | the typing mark (bouncing dots) |\n  | thinking, not yet responding | the pulse mark (dot lapping the bubble) |\n\n  So `phase` decides which working mark shows, and the badge — not an animation — is what\n  says \"you're needed\". Motion under a needs-you signal would say the opposite of the truth.\n- **`launcherBadge(state)` is exported** beside `launcherIcon`/`launcherLabel`: `{kind:\n  \"attention\", text: \"!\"}` while waiting, `{kind: \"unread\", text: \"3\"}` for runs that finished\n  unseen, `null` otherwise. A demand and a piece of news are different facts, so they get\n  different badges — a count can't carry \"answer me\".\n- **`launcherIconSvg(kind)` is exported too**, so a host rendering its own launcher can draw\n  the same artwork rather than reproducing it. Pass a unique number per instance if you render\n  more than one (the pulse's motion path is referenced by id).\n- **`prefers-reduced-motion` now actually stops the pulse.** SMIL is not CSS, so\n  `animation: none` never touched it; the animations are omitted at build time instead and the\n  dot is drawn parked on the bubble, which keeps pulse distinguishable from static.\n\n## What changed in 0.4.0\n\nNothing breaking. `phase` is additive on the wire; a 0.3.0 widget that never sends it gets the\nprocessing mark whenever busy, which is truthful.\n\n- **The launcher wears the branded marks** — one Agility chat bubble, three states: **static**\n  (idle, or waiting on you — the badge is the louder signal there), **typing** (the reply's\n  text is streaming), and **pulse** (work happening — tools, builds — including in the\n  background with the panel closed; the queue runs the job either way, so the mark stays\n  truthful). The bubble is white now: the marks are drawn dark-on-light with the Agility\n  yellow. All motion stops under `prefers-reduced-motion`; the states stay distinguishable\n  because the *mark itself* differs, not just its animation.\n- **`state` gained `phase`** (`\"typing\" | \"processing\"`, present only while busy) — how the\n  widget tells the launcher which working mark fits the moment.\n- **`launcherIcon(state)` is exported** for hosts rendering their own launcher — same choice,\n  same precedence (attention → static + badge, then typing, then pulse), so the two can't\n  disagree. Pairs with `launcherLabel`.\n\n## What changed in 0.3.0\n\nNothing breaking. `labels` is additive, and every accessibility change sets an attribute the host\nwas not setting.\n\n- **`labels`** — every string the built-in launcher renders, so a multilingual host can translate\n  it instead of turning the launcher off. Optional per field; anything omitted stays English.\n\n  ```tsx\n  labels={{\n    open: t(\"vibe.open\"), close: t(\"vibe.close\"), panel: t(\"vibe.panel\"), busy: t(\"vibe.busy\"),\n    attention: (n) => t(\"vibe.attention\", { count: n }),   // a function, not a template —\n    unread:    (n) => t(\"vibe.unread\",    { count: n }),   // plurals are the host's grammar\n  }}\n  ```\n- **The launcher is accessible.** Its name states the action (it says *Close* once open),\n  `aria-expanded` / `aria-haspopup=\"dialog\"` / `aria-controls` are set, and the panel is a named\n  `role=\"dialog\"`. The badge is `aria-hidden` and its count is in the button's name **in words** —\n  a digit in a span is invisible to a screen reader, so the one state the badge exists for was the\n  one state it could not convey. Busy is named too, and the pulse stops under\n  `prefers-reduced-motion`.\n- **`launcherLabel(state, labels)` is exported** for hosts rendering their own launcher — same\n  wording and precedence (attention → unread → busy), so the two can't disagree.\n- **The widget now posts `activity`** — `{kind:\"done\"}` once per run, and `{kind:\"changed\", …}` per\n  changed entity, carrying `verb` / `action` / `entityKind` / `entityId` / `entityName` / `link` /\n  `locale`. Before this it posted none, so any host `onActivity` handler was never called. See\n  [docs/integration/embed-handoff-0.3.0.md](../../docs/integration/embed-handoff-0.3.0.md) §3.\n\nStill open, and known: there is no way for the widget to ask the host for a *fresh* token\nmid-session — `auth` is only called on `ready` (G3 `auth_expired`).\n\n## What changed in 0.2.0\n\nNothing breaking — `auth: () => token` and a context without `section` both still work.\n\n- **`auth` may return `{ token, classicSession? }`** as well as a bare token string. `VibeAuth`\n  and `VibeContext` are exported so a host can type its own callbacks.\n- **`context` gained `section`.**\n- **Fixed:** the first `context` push is no longer lost (it is buffered and replayed on `ready`).\n- **Fixed:** `useAgilityVibe()` no longer stays `null` after mount, so `on(\"ready\", …)` is\n  reachable from inside the tree.\n\n(The launcher's hardcoded English `aria-label` and missing `aria-expanded`/`aria-haspopup`, listed\nhere as open in 0.2.0, are fixed in 0.3.0 above.)\n","readmeFilename":"README.md"}