{"_id":"@syncagent/react","_rev":"28-23c392f5a083b6ce7c68274b1e28ce78","name":"@syncagent/react","dist-tags":{"latest":"0.6.0"},"versions":{"0.1.0":{"name":"@syncagent/react","version":"0.1.0","keywords":["syncagent","ai","database","agent","react","chat","widget"],"license":"MIT","_id":"@syncagent/react@0.1.0","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"dist":{"shasum":"5cbeae18530281c08fec39efc5dddb893fa26ba3","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.1.0.tgz","fileCount":6,"integrity":"sha512-1apRPGUp//f9R8JAI3wB7hcwNq97DHG+RHpLovzjrZuUeBo3FMZmBAEOmHFYxowAeP3B7+f9E+tPYWN+E7AY1g==","signatures":[{"sig":"MEUCIQC+lWECF/BdKYiqcyX7GvEX0qkeXeXh4OQaYiDvVLYFXgIgXgwYS59y5IZc4sZEztvDc2jynSYCgirTvu3MJaaeVfg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":27784},"main":"./dist/index.cjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"7ac5c5c8d2576eb773923f56ff04386edd0fc96d","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"_npmVersion":"11.6.2","description":"SyncAgent React SDK — AI database chat widget & hooks","directories":{},"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.1.4","@syncagent/js":"file:../js","@types/react-dom":"^19.1.5"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.1.0_1774950698096_0.5243602331796524","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@syncagent/react","version":"0.1.1","keywords":["syncagent","ai","database","agent","react","chat","widget"],"license":"MIT","_id":"@syncagent/react@0.1.1","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"dist":{"shasum":"9da94e997b5caf5d5e857075980d028a2c242fe3","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.1.1.tgz","fileCount":6,"integrity":"sha512-Cupb5vEKcjK+Lfj72juh4qrUS5HrWFuiQMI1A5EN0AirzMeWQzNDWJmdFlOhzdwH+XK5e4jVbqauF2WhmoS3Gg==","signatures":[{"sig":"MEQCIDcFcVau6XDfeYeReuaGdJYTSXiToNFYziDFURPbwcR1AiBai0pykzGk1iVP6ul22hH59NIKGGns7YB1qzI7Pa0oUw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":32687},"main":"./dist/index.cjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"7ac5c5c8d2576eb773923f56ff04386edd0fc96d","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"_npmVersion":"11.6.2","description":"SyncAgent React SDK — AI database chat widget & hooks","directories":{},"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.1.4","@syncagent/js":"file:../js","@types/react-dom":"^19.1.5"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.1.1_1774951292972_0.3383011668094622","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@syncagent/react","version":"0.1.2","keywords":["syncagent","ai","database","agent","react","chat","widget"],"license":"MIT","_id":"@syncagent/react@0.1.2","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"dist":{"shasum":"8942beb16171494a95c72c99503d163e9ab690b3","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.1.2.tgz","fileCount":6,"integrity":"sha512-oRBBitUeq1otih4IxBf71Je0gDOt1PafW64v0WG4e54J49zcsC+iu2ceAy5xwEc4p8QwBy80PujOi4a6dRnVTw==","signatures":[{"sig":"MEYCIQDAPMOey6mnoPX+J6UiHzzPQFIM1flA7cm6MeNDgCOOFAIhAJjjiYxc1KmcNamM184ipvv9RO0/9lj+xoNKTV4IWYkr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":32687},"main":"./dist/index.cjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"7ac5c5c8d2576eb773923f56ff04386edd0fc96d","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"_npmVersion":"11.6.2","description":"SyncAgent React SDK — AI database chat widget & hooks","directories":{},"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.1.4","@syncagent/js":"file:../js","@types/react-dom":"^19.1.5"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.1.2_1774981584618_0.6449508220874443","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@syncagent/react","version":"0.1.3","keywords":["syncagent","ai","database","agent","react","chat","widget"],"license":"MIT","_id":"@syncagent/react@0.1.3","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"dist":{"shasum":"ba005487e76f290547b40ef3c0f368ddeb984213","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.1.3.tgz","fileCount":6,"integrity":"sha512-1bPsaIhFeghNFiqyKl9F7EsZYMhaXwFPdroDWj3ZDdF15Z9RcEEVikCtXzBt5hRTt8ISrouhiW3mobHOIWPbYg==","signatures":[{"sig":"MEUCIQCXrEc4hheV7ME3O6u1a32rCLv37d2GAcwVgcarBBYlDQIgOrQvNqZ3gURn+018Mju/b66vVOEAI8b40kKXg49GtIs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":32687},"main":"./dist/index.cjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"d31381c6df63982556dea869a4ebcf7e58b147e0","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"_npmVersion":"11.6.2","description":"SyncAgent React SDK — AI database chat widget & hooks","directories":{},"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.1.4","@syncagent/js":"file:../js","@types/react-dom":"^19.1.5"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.1.3_1774982681077_0.19412700674527428","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@syncagent/react","version":"0.1.4","keywords":["syncagent","ai","database","agent","react","chat","widget"],"license":"MIT","_id":"@syncagent/react@0.1.4","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"dist":{"shasum":"aeea944734c03e96ecd27b1494f9ee3225c20443","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.1.4.tgz","fileCount":6,"integrity":"sha512-4Zu85E1z04ydBn+6e/XkE6hmJISqdusb+yOJVzthhOFOMu+bN0sfOaC5oUYYhUB1X/o1eenkXTi/j3Cutlt1Sg==","signatures":[{"sig":"MEYCIQD3u7+Vh/Vx2CsP75s25pSxsK+lc/OY+veEC6Ki4I6lOgIhAL/r6+XlKnheigJnuRTmKGTnROpPasSnqKuCv/R5rpGo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":58424},"main":"./dist/index.cjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"ebccadf8b58bc671bb34bb2160663c8b0a1d9631","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"_npmVersion":"11.6.2","description":"SyncAgent React SDK — AI database chat widget & hooks","directories":{},"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.1.4","@syncagent/js":"file:../js","@types/react-dom":"^19.1.5"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.1.4_1774984578016_0.7607611673471053","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@syncagent/react","version":"0.1.5","keywords":["syncagent","ai","database","agent","react","chat","widget"],"license":"MIT","_id":"@syncagent/react@0.1.5","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"dist":{"shasum":"14ac202b0e48fb5e8a66a108af410869c56a865b","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.1.5.tgz","fileCount":6,"integrity":"sha512-qGjTbtiO9S+UXE4kOriYzUZvTjE/ua0hAdfBqUj5OMcp+LwWFktYbHqT3g1TADAqbLxf+D9udYZlsIenxN/DfA==","signatures":[{"sig":"MEQCIEVOo2RF3GugQRa0GssNVJKgBrXkuyyP/l3dzUbkTTy9AiBYru18HGrU1XmfOw7cxWkqv7sQB0W3MwO4/ozba+ZaIw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":58424},"main":"./dist/index.cjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"541e67c6fb3d6db9cd87306262204c8c0faead77","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"_npmVersion":"11.6.2","description":"SyncAgent React SDK — AI database chat widget & hooks","directories":{},"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.1.4","@syncagent/js":"file:../js","@types/react-dom":"^19.1.5"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.1.5_1774985590606_0.3668007332369754","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@syncagent/react","version":"0.1.6","keywords":["syncagent","ai","database","agent","react","chat","widget"],"license":"MIT","_id":"@syncagent/react@0.1.6","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"dist":{"shasum":"f5507d0853e09dd4571eee59a8ad00d112d1e006","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.1.6.tgz","fileCount":6,"integrity":"sha512-DyghDgLfGOl1t15amPC9BIRvnc0cGyrXyf04qsD48wDE0eOA45WNfpjqYzIli2cihrF/yY7wdjrt+7vvZPssCQ==","signatures":[{"sig":"MEUCICVog3HMYroEGlYxCN7UpvstApbuoxUGlgpn9FdV3VH8AiEAlme1Csoz0zfGNeefDrjBKFIzJPSL10boWOJD23ikJy8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":67444},"main":"./dist/index.cjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"010d51597cb83ce48d1545ea9bc558d8a886af95","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"_npmVersion":"11.6.2","description":"SyncAgent React SDK — AI database chat widget & hooks","directories":{},"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.1.4","@syncagent/js":"file:../js","@types/react-dom":"^19.1.5"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.1.6_1774988746253_0.7245433516835822","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@syncagent/react","version":"0.1.7","keywords":["syncagent","ai","database","agent","react","chat","widget"],"license":"MIT","_id":"@syncagent/react@0.1.7","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"dist":{"shasum":"b00ee7b106ba55ade7170feaf64287c584ba0607","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.1.7.tgz","fileCount":6,"integrity":"sha512-Kgcgbovphddaka8z2J/nTGS/4RB0ML781+98W9rHa807DZe3kibaHKzxOo0MaBjVo3YdMccfYGd4S9yxx3nIzQ==","signatures":[{"sig":"MEUCIQCMiRsLrY2uceY1qOThdhadt7vszlgRb9Fpa6kPFeSZigIgKsRH2HC+GYUhsp3yXw/3BWDQstfOtwQ13hobrxnmuhE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":70248},"main":"./dist/index.cjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"010d51597cb83ce48d1545ea9bc558d8a886af95","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"_npmVersion":"11.6.2","description":"SyncAgent React SDK — AI database chat widget & hooks","directories":{},"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.1.4","@syncagent/js":"file:../js","@types/react-dom":"^19.1.5"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.1.7_1774997606257_0.8451752649075253","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@syncagent/react","version":"0.1.8","keywords":["syncagent","ai","database","agent","react","chat","widget"],"license":"MIT","_id":"@syncagent/react@0.1.8","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"dist":{"shasum":"2721be828bf93c36045ba740a86fb01f82893bcb","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.1.8.tgz","fileCount":6,"integrity":"sha512-VyoZp3jCDG1kU2O/WOxD1HCfEaaN6QtfU1fZr3Vp1/JfTziQg3Zp8q+gieQqSqBz+hMAvSA1tvDOIgK5iKqjDw==","signatures":[{"sig":"MEUCIGTRfHgXzj6Tdnfe8dJpPCsCrHZQFw01uimSbEtIy9HiAiEA2FVDRMvVeXB36CdUqxjxohe1RcefojuY/pk3a/cyKZA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":79739},"main":"./dist/index.cjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"48f927e635cb249717a0d4e3d03540daf44d3056","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"_npmVersion":"11.6.2","description":"SyncAgent React SDK — AI database chat widget & hooks","directories":{},"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.1.4","@syncagent/js":"file:../js","@types/react-dom":"^19.1.5"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.1.8_1774999011973_0.8387867322183107","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"@syncagent/react","version":"0.1.9","keywords":["syncagent","ai","database","agent","react","chat","widget"],"license":"MIT","_id":"@syncagent/react@0.1.9","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"dist":{"shasum":"c760fae9da533eadf3d13f7e612d6f003a583786","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.1.9.tgz","fileCount":6,"integrity":"sha512-/fV3NDOFYcCoQwvcneUbARANvSCGLc+y6DXITQPg8w5aJJzp8ANuE0irS0WssRnb0Lwl7XH1xLb/5szuFPzXSg==","signatures":[{"sig":"MEYCIQDd55u0EXe0mdipaTL+qFwQbKgzTD7cxb/0ojjwXgrvoQIhANfr2+9u9nGrKO27Mx7TLATsSFkHaC/SH8ch0me4sh3u","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89883},"main":"./dist/index.cjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"48f927e635cb249717a0d4e3d03540daf44d3056","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"_npmVersion":"11.6.2","description":"SyncAgent React SDK — AI database chat widget & hooks","directories":{},"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.1.4","@syncagent/js":"file:../js","@types/react-dom":"^19.1.5"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.1.9_1774999811214_0.03883298220084774","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@syncagent/react","version":"0.2.0","keywords":["syncagent","ai","database","agent","react","chat","widget"],"license":"MIT","_id":"@syncagent/react@0.2.0","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"dist":{"shasum":"60e8044f0a621079a4ecab6163b973670a5d4007","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.2.0.tgz","fileCount":6,"integrity":"sha512-uJ4GTaZDNeUWL8y3rDMVcC1I62SJu0F300/0S1z304T/E8ZUVRMu5sgeZFGJU69ovDFyQt70N6/BjzJNrV8H2A==","signatures":[{"sig":"MEUCIFmfMtW27nKxp5hm/lCRyAO6eQN1s0pnv/TmhXUwTPWzAiEAnuKwyGJD7OMhRbb7a+aEbLRpsJaYXtaJiwlfagvr7uM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89883},"main":"./dist/index.cjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"c7db2bc1105c0cde77505718e512c5bf1e8039ed","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"_npmVersion":"11.6.2","description":"SyncAgent React SDK — AI database chat widget & hooks","directories":{},"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.1.4","@syncagent/js":"file:../js","@types/react-dom":"^19.1.5"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.2.0_1775000382131_0.8646702586563535","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@syncagent/react","version":"0.2.1","keywords":["syncagent","ai","database","agent","react","chat","widget"],"license":"MIT","_id":"@syncagent/react@0.2.1","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"dist":{"shasum":"88a95436a5667175caf2cce565618556798d6073","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.2.1.tgz","fileCount":6,"integrity":"sha512-Q0sWodBXUXU+Ikwp4hvU55cDZt+jemfara1B72NOdbJhWW7Ag/MGvT04CKAHlws7sZf9w03wA0L09G2+8GQIHw==","signatures":[{"sig":"MEUCIQCHZfEZ1k2aXwqzjgOmq8IzUHbliSXMZhZ2NY1wjezv+gIgfMptWEquw2yTaA2Ps+uJYB2ARGGXYEQmWm5ySXacOOE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":91043},"main":"./dist/index.cjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"c7db2bc1105c0cde77505718e512c5bf1e8039ed","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"_npmVersion":"11.6.2","description":"SyncAgent React SDK — AI database chat widget & hooks","directories":{},"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.1.4","@syncagent/js":"file:../js","@types/react-dom":"^19.1.5"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.2.1_1775006110538_0.3193285898161271","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@syncagent/react","version":"0.2.2","keywords":["syncagent","ai","database","agent","react","chat","widget"],"license":"MIT","_id":"@syncagent/react@0.2.2","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"dist":{"shasum":"852b5f8f81f2b17103421fcd7151beab463482e1","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.2.2.tgz","fileCount":6,"integrity":"sha512-SGQ4olYjaTEpQudPdZdBnrm3KiKQ6Vr5hoPJeiyU7LlcWNymb6ySJ29qkTL80JHn2Qc9YN7tKbxA8rjAncdXIA==","signatures":[{"sig":"MEUCIQDytNQZoL0K52ukNgkqZUVtkGC/kiW8VshcgSUJXQM5CAIgShj4CQGj9zxl0pxvsbMSdylGMxc4S36QqJnh5p2ZBaE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":91043},"main":"./dist/index.cjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"c1b87cbd6aa5d755c2f1f9155416382b27e5eca9","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"_npmVersion":"11.6.2","description":"SyncAgent React SDK — AI database chat widget & hooks","directories":{},"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.1.4","@syncagent/js":"file:../js","@types/react-dom":"^19.1.5"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.2.2_1775075332749_0.26373881403399846","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@syncagent/react","version":"0.2.3","keywords":["syncagent","ai","database","agent","react","chat","widget"],"license":"MIT","_id":"@syncagent/react@0.2.3","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"dist":{"shasum":"d0a0ec1b5cf97b88a8ab55fb24392492cd03e06b","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.2.3.tgz","fileCount":6,"integrity":"sha512-8e28yZFt8xWIt0J/89eRBbE5QqY223U144d8Id6HMuXgGVlVetxSXd37A/6cjObaSnCheyvkBOfPh6/e/AmoRA==","signatures":[{"sig":"MEUCIGqM4DEsWkDmNw/OfAEtm+StD8JovFPA04gRpYYaZE09AiEAnfMduaWQFOUJfcJrU0v7KBaj3NA6QI26aS/4K3VhIzQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":92273},"main":"./dist/index.cjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"c1b87cbd6aa5d755c2f1f9155416382b27e5eca9","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"_npmVersion":"11.6.2","description":"SyncAgent React SDK — AI database chat widget & hooks","directories":{},"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.1.4","@syncagent/js":"file:../js","@types/react-dom":"^19.1.5"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.2.3_1775075679841_0.8145579763658559","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@syncagent/react","version":"0.2.4","keywords":["syncagent","ai","database","agent","react","chat","widget"],"license":"MIT","_id":"@syncagent/react@0.2.4","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"dist":{"shasum":"1ddb01077676dbc0a8fcfe6d0f56dac702956817","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.2.4.tgz","fileCount":6,"integrity":"sha512-YODKO6VFRL5ZS5pcP30lrOso4hHjjErPDrwMGpRRskCEHApSBp7qVRt5rrvIz1eG2uJqZT6QJA3oPzRLNIdzfg==","signatures":[{"sig":"MEYCIQD2gT+yI3MCFeKRXDbZRER065QhtLuu/w3mg+eAgd/jEgIhAPYp0+yosXX+od2iHSG0QTheos5Pcxx1+O7gk+MauTvy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":92433},"main":"./dist/index.cjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"c1b87cbd6aa5d755c2f1f9155416382b27e5eca9","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"_npmVersion":"11.6.2","description":"SyncAgent React SDK — AI database chat widget & hooks","directories":{},"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.1.4","@syncagent/js":"file:../js","@types/react-dom":"^19.1.5"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.2.4_1775076048994_0.6740341568194856","host":"s3://npm-registry-packages-npm-production"}},"0.2.6":{"name":"@syncagent/react","version":"0.2.6","keywords":["syncagent","ai","database","agent","react","chat","widget"],"license":"MIT","_id":"@syncagent/react@0.2.6","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"dist":{"shasum":"847728a3ff6e69f9bb0bce6065d4ae9869eb6a9b","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.2.6.tgz","fileCount":6,"integrity":"sha512-+0z1UPG2r4iBb4kuHSixd+itBZZtRZUUspxF9wImFlwLl9rLlRekCtU49xJMV0Nkh33iDRHG8svTwVmo8lH0hg==","signatures":[{"sig":"MEYCIQCi0PNoBrTqrYn5Vraqvx7HSpxTsGs/WQK3CVYkiP4Y1gIhAIk/V+b1VHnQGO3EfdByr3WU0V2zrt5a4Pb+UlGJaxg2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":131950},"main":"./dist/index.cjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"c1b87cbd6aa5d755c2f1f9155416382b27e5eca9","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"_npmVersion":"11.6.2","description":"SyncAgent React SDK — AI database chat widget & hooks","directories":{},"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.1.4","@syncagent/js":"file:../js","@types/react-dom":"^19.1.5"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.2.6_1775109611863_0.8679438583192867","host":"s3://npm-registry-packages-npm-production"}},"0.2.7":{"name":"@syncagent/react","version":"0.2.7","keywords":["syncagent","ai","database","agent","react","chat","widget"],"license":"MIT","_id":"@syncagent/react@0.2.7","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"dist":{"shasum":"7e65c28e864c7f479eb5339b195ec307a9d90757","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.2.7.tgz","fileCount":6,"integrity":"sha512-fqeaW/KnIfuGpjkHHG9mqK8QZU0h2Hq8ViSny26/fPXsPaqPDXsMdYrigg8rq5/8IMdgW8iNTwFDq4pwg9vOkQ==","signatures":[{"sig":"MEUCIQDpwXbm7+D8dLDdGwbpD4f6NYYD4Z7rbs8jBBsD0t964AIgAR/eVUs0DU2d9fAdIkbkwVipf6dAgKy15Tf5v6ZnyvI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":131814},"main":"./dist/index.cjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"5de3857e1117c289bd822614b856d3619c0721d2","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"_npmVersion":"11.6.2","description":"SyncAgent React SDK — AI database chat widget & hooks","directories":{},"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.1.4","@syncagent/js":"file:../js","@types/react-dom":"^19.1.5"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.2.7_1775110496412_0.3875134028367855","host":"s3://npm-registry-packages-npm-production"}},"0.2.8":{"name":"@syncagent/react","version":"0.2.8","keywords":["syncagent","ai","database","agent","react","chat","widget"],"license":"MIT","_id":"@syncagent/react@0.2.8","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"dist":{"shasum":"632cdc1867054b80456ab29524fa0d758bdb4617","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.2.8.tgz","fileCount":6,"integrity":"sha512-U7dRto3RczhcOPuBAFIgLCyjzFRdmO7k7Wpf+muXx/IrtV1lIFrAx37hmWNHwGn3TwQC3l1diTX2XD8BqN4SQw==","signatures":[{"sig":"MEUCIAGjs5XEzjKh+wD7WwHBB6mZ65gclncFVHlgIRsbxdOxAiEA9iYSScDMpx9IuqztoM53XUEWRbtyid6yEFywS3zP/KM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":133270},"main":"./dist/index.cjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"4e9cb075358ade71a68c58a5f197fb7ad0948089","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"_npmVersion":"11.6.2","description":"SyncAgent React SDK — AI database chat widget & hooks","directories":{},"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.1.4","@syncagent/js":"file:../js","@types/react-dom":"^19.1.5"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.2.8_1775140849273_0.2941373006528243","host":"s3://npm-registry-packages-npm-production"}},"0.2.9":{"name":"@syncagent/react","version":"0.2.9","keywords":["syncagent","ai","database","agent","react","chat","widget"],"license":"MIT","_id":"@syncagent/react@0.2.9","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"dist":{"shasum":"9b51dd7b96a8b0570ca0d7fc2d5733cc2b74b0a9","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.2.9.tgz","fileCount":6,"integrity":"sha512-67sMdJVwzHzMyUq1NrFrAEc3jNvL5hWKVtLJNtPii+p4xAaupescHbEvQvserM1E/pl6FaeU63d/DRfZ1D78hQ==","signatures":[{"sig":"MEYCIQD2jC70YdJToYI7ZYbQUu+OzfRAmuqm6TSpmr9NTYlkzwIhAJ5uI4ACJj/jm4eNx9TBFPJQhSNxfElGStH+tB2yzo+/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":151711},"main":"./dist/index.cjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"72cd389a7aa1887c7f85d59081424886eeddd4df","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"_npmVersion":"11.6.2","description":"SyncAgent React SDK — AI database chat widget & hooks","directories":{},"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.1.4","@syncagent/js":"file:../js","@types/react-dom":"^19.1.5"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.2.9_1775162520843_0.5066302273493066","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@syncagent/react","version":"0.3.0","keywords":["syncagent","ai","database","agent","react","chat","widget"],"license":"MIT","_id":"@syncagent/react@0.3.0","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"dist":{"shasum":"5177bb3324462d1207d8ab86b214e44a6824d348","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.3.0.tgz","fileCount":6,"integrity":"sha512-ZbwYHgxZwBHsVi0HtGh62sfafLP0mJNNoTExz7QxFELRwp2YDxDGEpr8qGc5qkFAib/i3XSSqI5egkwlV9sm4Q==","signatures":[{"sig":"MEUCIDPBYs/2qbPN3Stxw5nJax9Hv7tMjQpsN6DUz9AGMIeFAiEAnH47xP1lLLMQqmnhNI3F4FdFawOwmTJNkXRJdf46voo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":151918},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"72cd389a7aa1887c7f85d59081424886eeddd4df","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"_npmVersion":"11.6.2","description":"SyncAgent React SDK — AI database chat widget & hooks","directories":{},"_nodeVersion":"24.12.0","typesVersions":{"*":{"*":["./dist/index.d.ts"],".":["./dist/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.1.4","@syncagent/js":"file:../js","@types/react-dom":"^19.1.5"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.3.0_1775162938276_0.6647401659978012","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@syncagent/react","version":"0.3.1","keywords":["syncagent","ai","database","agent","react","chat","widget"],"license":"MIT","_id":"@syncagent/react@0.3.1","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"dist":{"shasum":"d09c031bff50cfe77a2ebb0ac96825ac7a1920f3","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.3.1.tgz","fileCount":6,"integrity":"sha512-DsvKlmiItTQh7zCmTjqrkNXdx4zp9j3K6B0pLjaUwqcXQRh+xZPAVX2AE+SQg32sBvd104G2SSJ4r82JT2q/eA==","signatures":[{"sig":"MEUCIQCEI4G4T1w0nnOFPb9WiNeAGViaEa8POOpClyE+BaFDVQIgTcG0XcvRS7C+lo8vNrE8eaVtlTtI7w1Km6gynOkKV0c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":153011},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"bac04bf05d4eb12ee5b57652b0e34b88c28a79fa","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"_npmVersion":"11.6.2","description":"SyncAgent React SDK — AI database chat widget & hooks","directories":{},"_nodeVersion":"24.12.0","typesVersions":{"*":{"*":["./dist/index.d.ts"],".":["./dist/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.1.4","@syncagent/js":"file:../js","@types/react-dom":"^19.1.5"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.3.1_1775374267691_0.24783140716709773","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@syncagent/react","version":"0.3.2","keywords":["syncagent","ai","database","agent","react","chat","widget"],"license":"MIT","_id":"@syncagent/react@0.3.2","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"dist":{"shasum":"589a9ceb0459d6c333a2408c55077297cfe942ba","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.3.2.tgz","fileCount":6,"integrity":"sha512-tC3gscBDfJwCXpZMVvYFoeK23R3G7CuQBX1zRIyzAQsjKqVtjFxx1vgaMD77Wk0JVg0jsJe6OzKjp5k4uSVutQ==","signatures":[{"sig":"MEYCIQCRKDEENNfaZ8D4Y+zd4j15gC5snoVSFEJTs1WOptZBSwIhAJOyOX5/zxqxI0+UplwNi5iL6gwRFuhuxHGlfNjQX/4C","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":154273},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"fdf7082d66ea5aa9713ea421823d72416180d66a","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"_npmVersion":"11.6.2","description":"SyncAgent React SDK — AI database chat widget & hooks","directories":{},"_nodeVersion":"24.12.0","typesVersions":{"*":{"*":["./dist/index.d.ts"],".":["./dist/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.1.4","@syncagent/js":"file:../js","@types/react-dom":"^19.1.5"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.3.2_1775631013000_0.013411457365803292","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@syncagent/react","version":"0.3.3","keywords":["syncagent","ai","database","agent","react","chat","widget"],"license":"MIT","_id":"@syncagent/react@0.3.3","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"dist":{"shasum":"7ae6431df5285c2fe41cf9303133fecb27da7d16","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.3.3.tgz","fileCount":6,"integrity":"sha512-UGBfTbyTEabJbibxOQqfO4U8S9JK4vpr+AAZxWwzLmAzQPd4MQTj44nv8mHlpGxIdSYZRDG9+csQtaC7fBbevQ==","signatures":[{"sig":"MEUCIECXapfi4QcPMRcuP52gwb4gVM9APehBvRaxl6HR+67TAiEAoBJW2Sq0EThzDEEe+gHDnhR06p7HqT849lXO2d0PbVg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":155357},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"fdf7082d66ea5aa9713ea421823d72416180d66a","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"_npmVersion":"11.6.2","description":"SyncAgent React SDK — AI database chat widget & hooks","directories":{},"_nodeVersion":"24.12.0","typesVersions":{"*":{"*":["./dist/index.d.ts"],".":["./dist/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.1.4","@syncagent/js":"file:../js","@types/react-dom":"^19.1.5"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.3.3_1775632736891_0.8800945580625159","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"@syncagent/react","version":"0.3.4","keywords":["syncagent","ai","database","agent","react","chat","widget"],"license":"MIT","_id":"@syncagent/react@0.3.4","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"homepage":"https://syncagentdev.vercel.app/docs","bugs":{"url":"https://github.com/syncagent/syncagent/issues"},"dist":{"shasum":"edfdbee2fe6caa53b47766d9b08d173f773f4174","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.3.4.tgz","fileCount":6,"integrity":"sha512-xEVitvkpGCc8wWl0ssk9FA+sKIHb681cWz9cthRj09C4wzIBeHiQTRBzyTD9XNj/ZjEQCsCLBBI6okSwYBWf0Q==","signatures":[{"sig":"MEUCIQDPukDyX7Tclgfn8dvAYzwlh3O2FwcXPzYoUzL83qkLiwIgMXxM9+8nSLOOiwL7IVcKU7Lz+vSRLnNcXh0deu27mOA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":153668},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"cd3ec912e345cb47b6fb11c36e95fb785201a4d7","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"repository":{"url":"git+https://github.com/syncagent/syncagent.git","type":"git","directory":"packages/react"},"_npmVersion":"11.6.2","description":"SyncAgent React SDK — AI database chat widget & hooks","directories":{},"_nodeVersion":"24.12.0","typesVersions":{"*":{"*":["./dist/index.d.ts"],".":["./dist/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.1.4","@syncagent/js":"file:../js","@types/react-dom":"^19.1.5"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.3.4_1778799532225_0.9737374131212249","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@syncagent/react","version":"0.4.0","keywords":["syncagent","ai","database","agent","react","chat","widget"],"license":"MIT","_id":"@syncagent/react@0.4.0","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"homepage":"https://syncagentdev.vercel.app/docs","bugs":{"url":"https://github.com/syncagent/syncagent/issues"},"dist":{"shasum":"c12c5a123a483775df60ec45ecdd373aaa8d610f","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.4.0.tgz","fileCount":6,"integrity":"sha512-c5oUZDxf3PRYLf2nV7Q0j6PplEXE1+hvFW+gqLYjLLQCOI/EEkVLHNRsZXR5DSMimzf6SnaXVWz5WrEe9o66VQ==","signatures":[{"sig":"MEYCIQCWUUO0lSM4pOSy0w85HnWKacVuPNHu5qPl9BpJocADwgIhANTwN4TSmRoAxfV1YC8VIhn0QrLUkPkCKR2aK1Xz9U7t","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":194232},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"88e46e65442c24f60a775ac46b709aec0a771c59","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"repository":{"url":"git+https://github.com/syncagent/syncagent.git","type":"git","directory":"packages/react"},"_npmVersion":"11.6.2","description":"SyncAgent React SDK — AI database chat widget & hooks","directories":{},"_nodeVersion":"24.12.0","typesVersions":{"*":{"*":["./dist/index.d.ts"],".":["./dist/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.1.4","@syncagent/js":"file:../js","@types/react-dom":"^19.1.5"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/react_0.4.0_1779352799695_0.18355668799187086","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@syncagent/react","version":"0.5.0","keywords":["syncagent","ai","database","agent","react","chat","widget"],"license":"MIT","_id":"@syncagent/react@0.5.0","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"homepage":"https://syncagentdev.vercel.app/docs","bugs":{"url":"https://github.com/syncagent/syncagent/issues"},"dist":{"shasum":"5d694833a22ebb251d7b31a8f65123ba457f8f3f","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.5.0.tgz","fileCount":6,"integrity":"sha512-/OTwkdvBY1hKzVqiuFakBLMGMJNwk7Xc3yd+3gQtWwerydXBR3lNBkEIhMdWVBIs9VW/EWLQNBFtosmjcJho9A==","signatures":[{"sig":"MEQCIGjKSM5ZBOBNhjMyEMeSYsryU3phVlVHOX/aV/8bYDS4AiA4RHiE6ck3wtBFbCrIHmN+u/8AyyBlrBnDIrrmu5FCtQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":290271},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"cc9223ff25f6dfbea28aaa5aede50020b1ad90b9","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"repository":{"url":"git+https://github.com/syncagent/syncagent.git","type":"git","directory":"packages/react"},"_npmVersion":"11.6.2","description":"SyncAgent React SDK — AI database chat widget & hooks","directories":{},"_nodeVersion":"24.12.0","typesVersions":{"*":{"*":["./dist/index.d.ts"],".":["./dist/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.1.4","@syncagent/js":"file:../js","@types/react-dom":"^19.1.5"},"peerDependencies":{"react":">=18.0.0","pusher-js":">=8.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0"},"peerDependenciesMeta":{"pusher-js":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/react_0.5.0_1779435669222_0.07769054992434499","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@syncagent/react","version":"0.5.1","keywords":["syncagent","ai","database","agent","react","chat","widget"],"license":"MIT","_id":"@syncagent/react@0.5.1","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"homepage":"https://syncagentdev.vercel.app/docs","bugs":{"url":"https://github.com/syncagent/syncagent/issues"},"dist":{"shasum":"f0f37c2b840a9b33ad3371d65ba2524903635946","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.5.1.tgz","fileCount":6,"integrity":"sha512-stWX3SHrbG1WNf3Xm+VTaxYZxwq3wzMkCDZs0zIfstHec9M9vsIUEhvleiEMQfxJzDdixTnK29SsY13BS1xosg==","signatures":[{"sig":"MEQCIBZY46wyRrWpgCzmED9cTnXbgKn4+BQol0imQW72DE7wAiBAkpz5J+YNaQ9wkbQKcYM8xMDePwTdh3Hk0diC/f6KAQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":289901},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"gitHead":"4e3ba48cd122f4a0e7841b19c5b424b5029c7971","scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"repository":{"url":"git+https://github.com/syncagent/syncagent.git","type":"git","directory":"packages/react"},"_npmVersion":"11.6.2","description":"SyncAgent React SDK — AI database chat widget & hooks","directories":{},"_nodeVersion":"24.12.0","typesVersions":{"*":{"*":["./dist/index.d.ts"],".":["./dist/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","react":"^19.1.0","react-dom":"^19.1.0","typescript":"^5.8.3","@types/react":"^19.1.4","@syncagent/js":"file:../js","@types/react-dom":"^19.1.5"},"peerDependencies":{"react":">=18.0.0","pusher-js":">=8.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0"},"peerDependenciesMeta":{"pusher-js":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/react_0.5.1_1779438294979_0.8347426173014638","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@syncagent/react","version":"0.6.0","description":"SyncAgent React SDK — AI database chat widget & hooks","homepage":"https://syncagentdev.vercel.app/docs","repository":{"type":"git","url":"git+https://github.com/syncagent/syncagent.git","directory":"packages/react"},"main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"typesVersions":{"*":{".":["./dist/index.d.ts"],"*":["./dist/index.d.ts"]}},"scripts":{"build":"tsup","dev":"tsup --watch"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0","@syncagent/js":">=0.1.0","pusher-js":">=8.0.0"},"peerDependenciesMeta":{"pusher-js":{"optional":true}},"devDependencies":{"@syncagent/js":"file:../js","@types/react":"^19.1.4","@types/react-dom":"^19.1.5","react":"^19.1.0","react-dom":"^19.1.0","tsup":"^8.4.0","typescript":"^5.8.3"},"license":"MIT","keywords":["syncagent","ai","database","agent","react","chat","widget"],"gitHead":"8155a3cfbf380a75dc880a12a25613cc3f634f67","_id":"@syncagent/react@0.6.0","bugs":{"url":"https://github.com/syncagent/syncagent/issues"},"_nodeVersion":"24.12.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-pgzRdfASnUt9Ex/JpU/dD3KtCSZBirc8RUai8x7zS3Wkl/j0JD+Jw92C3U/Er9EYHyl4arCJcBLFtVW73x7bJQ==","shasum":"f4898b8ac1da9d613ef22aff1537f85f83852895","tarball":"https://registry.npmjs.org/@syncagent/react/-/react-0.6.0.tgz","fileCount":6,"unpackedSize":317058,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHWHa68tkRsU7pEomBO7r+jl+cggn3cIJIwqbuQv6+fJAiEAsPpDKQIpcTjux4UJONYHoOl72CBi7Oe+XvbW0drP7GM="}]},"_npmUser":{"name":"godwinadu","email":"gyamfiadu01@gmail.com"},"directories":{},"maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/react_0.6.0_1780037700235_0.5879564068458487"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-31T09:51:37.985Z","modified":"2026-05-29T06:55:00.497Z","0.1.0":"2026-03-31T09:51:38.236Z","0.1.1":"2026-03-31T10:01:33.118Z","0.1.2":"2026-03-31T18:26:24.765Z","0.1.3":"2026-03-31T18:44:41.227Z","0.1.4":"2026-03-31T19:16:18.163Z","0.1.5":"2026-03-31T19:33:10.746Z","0.1.6":"2026-03-31T20:25:46.417Z","0.1.7":"2026-03-31T22:53:26.406Z","0.1.8":"2026-03-31T23:16:52.145Z","0.1.9":"2026-03-31T23:30:11.371Z","0.2.0":"2026-03-31T23:39:42.280Z","0.2.1":"2026-04-01T01:15:10.691Z","0.2.2":"2026-04-01T20:28:52.921Z","0.2.3":"2026-04-01T20:34:39.996Z","0.2.4":"2026-04-01T20:40:49.153Z","0.2.6":"2026-04-02T06:00:12.022Z","0.2.7":"2026-04-02T06:14:56.536Z","0.2.8":"2026-04-02T14:40:49.431Z","0.2.9":"2026-04-02T20:42:00.991Z","0.3.0":"2026-04-02T20:48:58.399Z","0.3.1":"2026-04-05T07:31:07.860Z","0.3.2":"2026-04-08T06:50:13.184Z","0.3.3":"2026-04-08T07:18:57.029Z","0.3.4":"2026-05-14T22:58:52.354Z","0.4.0":"2026-05-21T08:39:59.826Z","0.5.0":"2026-05-22T07:41:09.366Z","0.5.1":"2026-05-22T08:24:55.112Z","0.6.0":"2026-05-29T06:55:00.358Z"},"bugs":{"url":"https://github.com/syncagent/syncagent/issues"},"license":"MIT","homepage":"https://syncagentdev.vercel.app/docs","keywords":["syncagent","ai","database","agent","react","chat","widget"],"repository":{"type":"git","url":"git+https://github.com/syncagent/syncagent.git","directory":"packages/react"},"description":"SyncAgent React SDK — AI database chat widget & hooks","maintainers":[{"name":"godwinadu","email":"gyamfiadu01@gmail.com"}],"readme":"# @syncagent/react\n\nReact SDK for [SyncAgent](https://syncagentdev.vercel.app) — drop-in AI database chat widget and hooks for React apps.\n\nWorks with **MongoDB**, **PostgreSQL**, **MySQL**, **SQLite**, **SQL Server**, and **Supabase**.\n\n[![npm version](https://img.shields.io/npm/v/@syncagent/react)](https://www.npmjs.com/package/@syncagent/react)\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)\n\n## Get Your API Key\n\n1. [Sign up](https://syncagentdev.vercel.app/auth/register) for a free account\n2. Go to your [Dashboard](https://syncagentdev.vercel.app/dashboard) → **New Project** → choose your database type\n3. Copy your API key (starts with `sa_`)\n\n> Every new project gets a **14-day trial** with 500 free requests — no credit card required. After the trial, you get 100 free requests/month on the Free plan.\n\n## Install\n\n```bash\nnpm install @syncagent/react @syncagent/js\n```\n\n## Quick Start\n\n```tsx\nimport { SyncAgentChat } from \"@syncagent/react\";\n\nexport default function App() {\n  return (\n    <SyncAgentChat\n      config={{\n        apiKey: \"sa_your_api_key\",\n        connectionString: process.env.DATABASE_URL,\n      }}\n    />\n  );\n}\n```\n\nA floating chat button appears in the bottom-right corner. Your users can now query your database in plain English.\n\n## `<SyncAgentChat>` Props\n\n| Prop | Type | Default | Description |\n|------|------|---------|-------------|\n| `config` | `SyncAgentConfig` | Required* | API key, connection string, tools, filter, operations |\n| `mode` | `\"floating\" \\| \"inline\"` | `\"floating\"` | Floating FAB or embedded inline panel |\n| `position` | `\"bottom-right\" \\| \"bottom-left\"` | `\"bottom-right\"` | FAB position (floating mode only) |\n| `defaultOpen` | `boolean` | `false` | Start with the panel open |\n| `title` | `string` | `\"SyncAgent\"` | Header title |\n| `subtitle` | `string` | `\"AI Database Assistant\"` | Header subtitle |\n| `placeholder` | `string` | `\"Ask anything...\"` | Input placeholder |\n| `welcomeMessage` | `string` | `\"Hi! I can query...\"` | Empty state message |\n| `accentColor` | `string` | `\"#10b981\"` | Brand color for header, FAB, send button |\n| `suggestions` | `string[]` | 3 defaults | Quick-start suggestion chips |\n| `persistKey` | `string` | — | localStorage key for conversation persistence |\n| `context` | `Record<string, any>` | — | Extra context injected into every message |\n| `filter` | `Record<string, any>` | — | Mandatory query filter for multi-tenancy |\n| `operations` | `(\"read\"\\|\"create\"\\|\"update\"\\|\"delete\")[]` | — | Restrict operations for this session |\n| `onReaction` | `(idx, reaction, content) => void` | — | Called when user reacts 👍/👎 |\n| `onData` | `(data: ToolData) => void` | — | Called when a DB tool returns structured data |\n\n*`config` is required unless wrapped in `<SyncAgentProvider>`.\n\n## Inline Mode\n\nEmbed the chat inside your layout instead of a floating button:\n\n```tsx\n<div style={{ height: 600 }}>\n  <SyncAgentChat\n    config={{ apiKey: \"...\", connectionString: \"...\" }}\n    mode=\"inline\"\n  />\n</div>\n```\n\n## Custom UI with `useSyncAgent`\n\nBuild your own chat UI with full control:\n\n```tsx\nimport { SyncAgentProvider, useSyncAgent } from \"@syncagent/react\";\n\nexport default function App() {\n  return (\n    <SyncAgentProvider config={{ apiKey: \"...\", connectionString: \"...\" }}>\n      <MyChat />\n    </SyncAgentProvider>\n  );\n}\n\nfunction MyChat() {\n  const { messages, isLoading, error, status, lastData, sendMessage, stop, reset } = useSyncAgent();\n\n  return (\n    <div>\n      {status && <div>⏳ {status.label}</div>}\n      {messages.map((msg, i) => (\n        <div key={i}><strong>{msg.role}:</strong> {msg.content}</div>\n      ))}\n      <button onClick={() => sendMessage(\"Show all users\")}>Ask</button>\n      <button onClick={stop}>Stop</button>\n      <button onClick={reset}>Clear</button>\n    </div>\n  );\n}\n```\n\n### `useSyncAgent` Returns\n\n| Return | Type | Description |\n|--------|------|-------------|\n| `messages` | `Message[]` | Full conversation history |\n| `isLoading` | `boolean` | `true` while streaming |\n| `error` | `Error \\| null` | Last error |\n| `status` | `{ step, label } \\| null` | Live status while agent is working |\n| `lastData` | `ToolData \\| null` | Last structured data from a DB tool |\n| `sendMessage` | `(content: string) => void` | Send a user message |\n| `stop` | `() => void` | Abort the current stream |\n| `reset` | `() => void` | Clear all messages |\n\n## Features\n\n- **Auto page detection** — detects current page, record ID, and query params from the URL\n- **Live status** — shows `● Querying users...` while the agent works\n- **Markdown rendering** — tables, code blocks, bold, italic, lists\n- **Streaming** — blinking cursor while text streams in\n- **Copy button** — on every AI response\n- **Reactions** — 👍/👎 on AI messages\n- **Conversation persistence** — saves history to localStorage\n- **Suggestion chips** — configurable quick-start prompts\n- **Export CSV** — download tables as CSV\n- **Bar charts** — auto-renders aggregation results\n- **Resize handle** — drag to resize the floating panel\n- **Mobile responsive** — full-width on small screens\n- **Dark mode** — respects `prefers-color-scheme`\n\n## Multi-tenant SaaS\n\nPass `filter` to scope every agent operation to the current user's organization. Enforced server-side.\n\n```tsx\n<SyncAgentChat\n  config={{\n    apiKey: \"sa_your_key\",\n    connectionString: process.env.DATABASE_URL,\n    filter: { organizationId: currentUser.orgId },\n    operations: currentUser.isAdmin\n      ? [\"read\", \"create\", \"update\", \"delete\"]\n      : [\"read\"],\n  }}\n/>\n```\n\n## Custom Tools\n\nGive the agent capabilities beyond your database:\n\n```tsx\n<SyncAgentChat\n  config={{\n    apiKey: \"sa_your_key\",\n    connectionString: process.env.DATABASE_URL,\n    tools: {\n      createInvoice: {\n        description: \"Create a Stripe invoice for a customer\",\n        inputSchema: {\n          customerId: { type: \"string\", description: \"Stripe customer ID\" },\n          amount:     { type: \"number\", description: \"Amount in cents\" },\n        },\n        execute: async ({ customerId, amount }) => {\n          const inv = await stripe.invoices.create({ customer: customerId });\n          return { invoiceId: inv.id };\n        },\n      },\n    },\n  }}\n/>\n```\n\n## Tools-only Mode\n\nUse the agent with only your custom tools — no database access:\n\n```tsx\n<SyncAgentChat\n  config={{\n    apiKey: \"sa_your_key\",\n    toolsOnly: true,\n    tools: {\n      searchProducts: {\n        description: \"Search products by name\",\n        inputSchema: { query: { type: \"string\", description: \"Search query\" } },\n        execute: async ({ query }) => {\n          const res = await fetch(`/api/products?q=${query}`);\n          return res.json();\n        },\n      },\n    },\n  }}\n/>\n```\n\n## Customer Agent Mode\n\nUse the `useCustomerChat` hook to build customer-facing support interfaces powered by SyncAgent's customer agent pipeline — including persona, flows, knowledge base, escalation, and AI fallback.\n\n```tsx\nimport { SyncAgentProvider, useCustomerChat } from \"@syncagent/react\";\n\nfunction App() {\n  return (\n    <SyncAgentProvider\n      config={{\n        apiKey: \"sa_your_api_key\",\n        connectionString: process.env.DATABASE_URL,\n        externalUserId: currentUser.id,\n      }}\n    >\n      <CustomerChat />\n    </SyncAgentProvider>\n  );\n}\n\nfunction CustomerChat() {\n  const {\n    messages,\n    conversationId,\n    isLoading,\n    isEscalated,\n    isResolved,\n    error,\n    welcomeMessage,\n    sendMessage,\n    rateConversation,\n    reset,\n  } = useCustomerChat({\n    onEscalated: () => console.log(\"Escalated to human agent\"),\n    onResolved: (id) => console.log(\"Conversation resolved:\", id),\n  });\n\n  return (\n    <div>\n      {welcomeMessage && <p>{welcomeMessage}</p>}\n      {messages.map((msg, i) => (\n        <div key={i}>\n          <strong>{msg.role}:</strong> {msg.content}\n        </div>\n      ))}\n      {isEscalated && <p>You've been connected to a human agent.</p>}\n      {isResolved && (\n        <div>\n          <p>Conversation resolved!</p>\n          <button onClick={() => rateConversation(5)}>⭐ Rate 5/5</button>\n        </div>\n      )}\n      {error && <p>Error: {error.message}</p>}\n      <button onClick={() => sendMessage(\"I need help with my order\")}>\n        Send\n      </button>\n      <button onClick={reset}>New Conversation</button>\n    </div>\n  );\n}\n```\n\n### `useCustomerChat` Return Values\n\n| Return | Type | Description |\n|--------|------|-------------|\n| `messages` | `Message[]` | Full conversation history (user and assistant messages) |\n| `conversationId` | `string \\| null` | Current conversation ID, set after first message |\n| `isLoading` | `boolean` | `true` while waiting for a response |\n| `isEscalated` | `boolean` | `true` when conversation has been escalated to a human agent |\n| `isResolved` | `boolean` | `true` when the conversation has been resolved |\n| `error` | `Error \\| null` | Last error encountered, or `null` |\n| `welcomeMessage` | `string \\| null` | Welcome message returned on first interaction |\n| `sendMessage` | `(content: string, metadata?: Record<string, any>) => Promise<void>` | Send a message to the customer agent |\n| `rateConversation` | `(rating: number) => Promise<void>` | Rate the conversation (1-5). Throws if no active conversation. |\n| `reset` | `() => void` | Clear all state and start a new conversation |\n\n### `UseCustomerChatOptions`\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `client` | `SyncAgentClient?` | Optional client instance. If omitted, uses the client from `SyncAgentProvider` context. |\n| `onEscalated` | `() => void?` | Called when the conversation is escalated to a human agent |\n| `onResolved` | `(conversationId: string) => void?` | Called when the conversation is resolved |\n\n> **Client resolution:** `useCustomerChat` first checks for a `client` passed directly in options. If none is provided, it falls back to the client from the nearest `<SyncAgentProvider>`. If neither is available, it throws an error prompting you to provide one.\n\n## Guest Identification\n\nWhen no `externalUserId` is provided in the config, the customer chat enters **guest mode** — anonymous visitors must identify themselves before sending messages. The `useCustomerChat` hook exposes guest identification state and a method to submit guest data programmatically.\n\n### Hook Fields\n\n| Return | Type | Description |\n|--------|------|-------------|\n| `isIdentified` | `boolean` | `true` if the user has an `externalUserId` or has completed guest identification |\n| `guestIdentity` | `GuestIdentity \\| null` | The stored guest identity object, or `null` if not yet identified |\n| `identifyGuest` | `(data: { name: string; email: string; phone?: string }) => void` | Submit guest form data — validates, generates a guest ID, persists to localStorage, and transitions to identified state |\n\n### Using `GuestIdentificationForm`\n\nThe `GuestIdentificationForm` component provides a ready-made form with built-in validation, accessibility attributes, and customizable text:\n\n```tsx\nimport { useCustomerChat, GuestIdentificationForm } from \"@syncagent/react\";\n\nfunction CustomerChat() {\n  const {\n    messages,\n    isIdentified,\n    identifyGuest,\n    sendMessage,\n  } = useCustomerChat({\n    onGuestIdentified: (identity) => {\n      console.log(\"Guest identified:\", identity.guestId);\n    },\n  });\n\n  if (!isIdentified) {\n    return (\n      <GuestIdentificationForm\n        onSubmit={(identity) => identifyGuest(identity)}\n        config={{\n          title: \"Welcome!\",\n          subtitle: \"Tell us a bit about yourself\",\n          submitButtonText: \"Start Chat\",\n          namePlaceholder: \"Your name\",\n          emailPlaceholder: \"you@example.com\",\n          phonePlaceholder: \"Phone (optional)\",\n        }}\n        className=\"my-guest-form\"\n      />\n    );\n  }\n\n  return (\n    <div>\n      {messages.map((msg, i) => (\n        <div key={i}><strong>{msg.role}:</strong> {msg.content}</div>\n      ))}\n      <button onClick={() => sendMessage(\"Hello!\")}>Send</button>\n    </div>\n  );\n}\n```\n\n#### `GuestIdentificationFormProps`\n\n| Prop | Type | Required | Description |\n|------|------|----------|-------------|\n| `onSubmit` | `(identity: GuestIdentity) => void` | Yes | Called with the complete `GuestIdentity` (including generated `guestId`) on valid submission |\n| `config` | `GuestFormConfig` | No | Customize title, subtitle, button text, and placeholder strings |\n| `className` | `string` | No | Custom CSS class applied to the form container |\n\n### Manual Guest Identification\n\nIf you prefer to build your own form UI, use the `identifyGuest` method directly:\n\n```tsx\nimport { useState } from \"react\";\nimport { useCustomerChat } from \"@syncagent/react\";\n\nfunction CustomGuestForm() {\n  const { isIdentified, identifyGuest, error } = useCustomerChat();\n  const [name, setName] = useState(\"\");\n  const [email, setEmail] = useState(\"\");\n\n  if (isIdentified) return null;\n\n  return (\n    <form\n      onSubmit={(e) => {\n        e.preventDefault();\n        identifyGuest({ name, email });\n      }}\n    >\n      <input value={name} onChange={(e) => setName(e.target.value)} placeholder=\"Name\" />\n      <input value={email} onChange={(e) => setEmail(e.target.value)} placeholder=\"Email\" />\n      <button type=\"submit\">Continue</button>\n      {error && <p>{error.message}</p>}\n    </form>\n  );\n}\n```\n\nThe `identifyGuest` method validates the input using `validateGuestForm` from `@syncagent/js`. If validation fails, it sets the `error` state with a descriptive message. On success, it generates a deterministic guest identifier from the email, persists the identity to localStorage, and sets `isIdentified` to `true`.\n\n### Dual Mode (Database + Customer Agent)\n\n> ⚠️ **Deprecated:** `createDual()` will be removed in a future major version. Use `useDualChat()` instead — pass `externalUserId` directly to enable both modes on a single instance.\n\n**Before (deprecated):**\n\n```tsx\nimport { SyncAgentClient } from \"@syncagent/js\";\nimport { SyncAgentProvider, useCustomerChat, useSyncAgent } from \"@syncagent/react\";\n\nconst { db, support } = SyncAgentClient.createDual({\n  apiKey: \"sa_your_key\",\n  connectionString: process.env.DATABASE_URL,\n  externalUserId: currentUser.id,\n});\n\nfunction AdminChat() {\n  return <SyncAgentProvider config={db}><AdminPanel /></SyncAgentProvider>;\n}\n\nfunction CustomerWidget() {\n  const chat = useCustomerChat({ client: support });\n  return <div>{/* customer chat UI */}</div>;\n}\n```\n\n**After (recommended):**\n\n```tsx\nimport { SyncAgentProvider, useDualChat } from \"@syncagent/react\";\n\nfunction App() {\n  return (\n    <SyncAgentProvider\n      config={{\n        apiKey: \"sa_your_key\",\n        connectionString: process.env.DATABASE_URL,\n        externalUserId: currentUser.id,\n      }}\n    >\n      <DualChatUI />\n    </SyncAgentProvider>\n  );\n}\n\nfunction DualChatUI() {\n  const { db, support } = useDualChat();\n  // Use db.sendMessage(), support.sendMessage(), etc.\n}\n```\n\n**Legacy pattern (deprecated):**\n\n```tsx\nimport { SyncAgentClient } from \"@syncagent/js\";\nimport { SyncAgentProvider, useCustomerChat, useSyncAgent } from \"@syncagent/react\";\n\nconst { db, support } = SyncAgentClient.createDual({\n  apiKey: \"sa_your_key\",\n  connectionString: process.env.DATABASE_URL,\n  externalUserId: currentUser.id,\n});\n\n// Admin panel — database agent\nfunction AdminChat() {\n  return <SyncAgentProvider config={db}><AdminPanel /></SyncAgentProvider>;\n}\n\n// Customer widget — support agent\nfunction CustomerWidget() {\n  const chat = useCustomerChat({ client: support });\n  return <div>{/* customer chat UI */}</div>;\n}\n```\n\n## Customer Chat Component\n\nThe `<SyncAgentCustomerChat>` component is a pre-built, drop-in customer support chat widget. It provides a complete experience including guest identification, real-time messaging with AI and human agents, escalation display, and satisfaction rating — all as a single component.\n\n```tsx\nimport { SyncAgentCustomerChat } from \"@syncagent/react\";\n\nexport default function App() {\n  return (\n    <SyncAgentCustomerChat\n      apiKey=\"sa_your_api_key\"\n      connectionString={process.env.DATABASE_URL!}\n    />\n  );\n}\n```\n\n### `<SyncAgentCustomerChat>` Props\n\n| Prop | Type | Default | Description |\n|------|------|---------|-------------|\n| `config` | `SyncAgentConfig` | — | Server config object. When provided, `apiKey`/`connectionString` are ignored. |\n| `apiKey` | `string` | — | API key for authentication (ignored if `config` provided) |\n| `connectionString` | `string` | — | Database connection string (ignored if `config` provided) |\n| `externalUserId` | `string` | — | Authenticated user ID — skips guest form when provided |\n| `mode` | `\"floating\" \\| \"inline\"` | `\"floating\"` | Floating toggle button or embedded inline panel |\n| `position` | `\"bottom-right\" \\| \"bottom-left\"` | `\"bottom-right\"` | Position of the floating widget (floating mode only) |\n| `defaultOpen` | `boolean` | `false` | Whether the floating panel starts open (floating mode only) |\n| `title` | `string` | `\"Customer Support\"` | Header title text (max 100 chars) |\n| `subtitle` | `string` | `\"How can we help you?\"` | Header subtitle text (max 200 chars) |\n| `placeholder` | `string` | `\"Type your message...\"` | Input placeholder text (max 150 chars) |\n| `welcomeMessage` | `string` | — | Initial welcome message displayed before any interaction |\n| `accentColor` | `string` | `\"#6366f1\"` | Primary accent color (hex, rgb, or hsl) |\n| `darkMode` | `boolean` | `false` | Enable dark mode color scheme |\n| `className` | `string` | — | Additional CSS class on root container |\n| `style` | `CSSProperties` | — | Inline styles merged onto root container |\n| `guestForm` | `GuestFormConfig` | — | Custom guest form configuration (title, subtitle, placeholders, button text) |\n| `pusherKey` | `string` | — | Pusher app key for real-time human agent messages |\n| `pusherCluster` | `string` | `\"us2\"` | Pusher cluster |\n| `metadata` | `Record<string, any>` | — | Custom metadata attached to conversations |\n| `onEscalated` | `() => void` | — | Called when conversation is escalated to a human agent |\n| `onResolved` | `(conversationId: string) => void` | — | Called when conversation is resolved |\n| `onGuestIdentified` | `(identity: GuestIdentity) => void` | — | Called after guest form submission |\n\n### Basic Usage\n\n```tsx\n<SyncAgentCustomerChat\n  apiKey=\"sa_your_api_key\"\n  connectionString={process.env.DATABASE_URL!}\n/>\n```\n\n### Using a Config Object\n\n```tsx\nimport { SyncAgentCustomerChat } from \"@syncagent/react\";\n\n// Config from server (e.g., Next.js createCustomerServerConfig)\n<SyncAgentCustomerChat config={serverConfig} />\n```\n\n### Floating Mode (default)\n\n```tsx\n<SyncAgentCustomerChat\n  apiKey=\"sa_your_api_key\"\n  connectionString={process.env.DATABASE_URL!}\n  mode=\"floating\"\n  position=\"bottom-right\"\n  defaultOpen={false}\n/>\n```\n\n### Inline Mode\n\nEmbed the chat inside your layout — the panel fills its parent container and is always visible:\n\n```tsx\n<div style={{ height: 600, width: 400 }}>\n  <SyncAgentCustomerChat\n    apiKey=\"sa_your_api_key\"\n    connectionString={process.env.DATABASE_URL!}\n    mode=\"inline\"\n  />\n</div>\n```\n\n### Dark Mode with Custom Accent Color\n\n```tsx\n<SyncAgentCustomerChat\n  apiKey=\"sa_your_api_key\"\n  connectionString={process.env.DATABASE_URL!}\n  darkMode\n  accentColor=\"#8b5cf6\"\n/>\n```\n\n### Custom Guest Form\n\n```tsx\n<SyncAgentCustomerChat\n  apiKey=\"sa_your_api_key\"\n  connectionString={process.env.DATABASE_URL!}\n  guestForm={{\n    title: \"Welcome!\",\n    subtitle: \"Tell us about yourself to get started\",\n    submitButtonText: \"Start Chat\",\n    namePlaceholder: \"Your name\",\n    emailPlaceholder: \"you@company.com\",\n    phonePlaceholder: \"+1 (555) 000-0000\",\n  }}\n  onGuestIdentified={(identity) => {\n    console.log(\"Guest identified:\", identity.guestId);\n  }}\n/>\n```\n\n### `useCustomerChat` Hook\n\nFor full control over the UI, use the `useCustomerChat` hook directly to build a custom chat interface:\n\n```tsx\nimport { SyncAgentProvider, useCustomerChat } from \"@syncagent/react\";\n\nfunction App() {\n  return (\n    <SyncAgentProvider config={{ apiKey: \"sa_...\", connectionString: \"...\" }}>\n      <CustomChat />\n    </SyncAgentProvider>\n  );\n}\n\nfunction CustomChat() {\n  const {\n    messages,\n    isLoading,\n    isEscalated,\n    isResolved,\n    isIdentified,\n    identifyGuest,\n    sendMessage,\n    rateConversation,\n    error,\n    welcomeMessage,\n  } = useCustomerChat({\n    onEscalated: () => console.log(\"Escalated\"),\n    onResolved: (id) => console.log(\"Resolved:\", id),\n    onGuestIdentified: (identity) => console.log(\"Guest:\", identity),\n  });\n\n  if (!isIdentified) {\n    return (\n      <form onSubmit={(e) => {\n        e.preventDefault();\n        identifyGuest({ name: \"Jane\", email: \"jane@example.com\" });\n      }}>\n        <button type=\"submit\">Identify</button>\n      </form>\n    );\n  }\n\n  return (\n    <div>\n      {welcomeMessage && <p>{welcomeMessage}</p>}\n      {messages.map((msg, i) => (\n        <div key={i}><strong>{msg.role}:</strong> {msg.content}</div>\n      ))}\n      {isEscalated && <p>Connected to a human agent</p>}\n      {isResolved && <button onClick={() => rateConversation(5)}>⭐ Rate</button>}\n      {error && <p>Error: {error.message}</p>}\n      <button onClick={() => sendMessage(\"Hello!\")} disabled={isLoading}>\n        Send\n      </button>\n    </div>\n  );\n}\n```\n\n#### `UseCustomerChatOptions`\n\n| Option | Type | Description |\n|--------|------|-------------|\n| `client` | `SyncAgentClient` | Optional client instance. If omitted, uses the client from `SyncAgentProvider` context. |\n| `externalUserId` | `string` | When provided, the hook considers the user pre-authenticated (bypasses guest flow). |\n| `onEscalated` | `() => void` | Called when the conversation is escalated to a human agent. |\n| `onResolved` | `(conversationId: string) => void` | Called when the conversation is resolved. |\n| `onGuestIdentified` | `(identity: GuestIdentity) => void` | Called when a guest completes identification. |\n\n#### `useCustomerChat` Return Values\n\n| Return | Type | Description |\n|--------|------|-------------|\n| `messages` | `Message[]` | Full conversation history |\n| `conversationId` | `string \\| null` | Current conversation ID, set after first message |\n| `isLoading` | `boolean` | `true` while waiting for a response |\n| `isEscalated` | `boolean` | `true` when conversation has been escalated to a human agent |\n| `isResolved` | `boolean` | `true` when the conversation has been resolved |\n| `error` | `Error \\| null` | Last error encountered |\n| `welcomeMessage` | `string \\| null` | Welcome message returned on first interaction |\n| `sendMessage` | `(content: string, metadata?: Record<string, any>) => Promise<void>` | Send a message to the customer agent |\n| `rateConversation` | `(rating: number) => Promise<void>` | Rate the conversation (1–5). Throws if no active conversation. |\n| `reset` | `() => void` | Clear all state and start a new conversation |\n| `isIdentified` | `boolean` | `true` if the user has an `externalUserId` or has completed guest identification |\n| `guestIdentity` | `GuestIdentity \\| null` | The stored guest identity object |\n| `identifyGuest` | `(data: { name: string; email: string; phone?: string }) => void` | Submit guest form data — validates, generates a guest ID, persists to localStorage |\n\n### Theming\n\nThe `<SyncAgentCustomerChat>` component uses a built-in theme engine to generate a complete color palette from two inputs:\n\n- **`accentColor`** — any valid CSS color (hex, rgb, hsl). Used for buttons, user message bubbles, focus outlines, and the floating toggle button. Default: `\"#6366f1\"`.\n- **`darkMode`** — when `true`, renders a dark color scheme with light text on dark backgrounds.\n\nThe theme engine (`computeTheme()` from `@syncagent/js`) automatically adjusts all derived colors to meet WCAG AA contrast requirements:\n\n- **Text contrast:** All text-on-background pairs maintain a minimum **4.5:1** contrast ratio\n- **Focus indicators:** Focus outlines maintain a minimum **3:1** contrast ratio against adjacent colors\n- **Accent contrast:** The accent color against the background maintains a minimum **3:1** contrast ratio\n\nAll styles are applied inline — no external CSS is required and no styles leak to or from your application.\n\n```tsx\n// Light mode with custom accent\n<SyncAgentCustomerChat accentColor=\"#059669\" />\n\n// Dark mode with default accent\n<SyncAgentCustomerChat darkMode />\n\n// Dark mode with custom accent\n<SyncAgentCustomerChat darkMode accentColor=\"#f59e0b\" />\n```\n\n### Accessibility\n\nThe `<SyncAgentCustomerChat>` component is built with WCAG AA compliance:\n\n**ARIA Roles and Labels:**\n- The chat container uses `role=\"region\"` with `aria-label=\"Customer chat\"`\n- The message list uses `role=\"log\"` to indicate a chronological message stream\n- All interactive elements have descriptive ARIA labels\n\n**Keyboard Navigation:**\n- `Tab` moves focus through all interactive elements (buttons, inputs, rating stars)\n- `Enter` or `Space` activates buttons and submits forms\n- Arrow keys navigate the satisfaction rating stars\n\n**Focus Management:**\n- When the guest form transitions to the chat panel, focus moves to the message input within 100ms\n- All interactive elements have visible focus indicators with a minimum 2px outline width\n- Focus indicator contrast meets the 3:1 minimum ratio against adjacent colors\n\n**Screen Reader Support:**\n- New messages are announced via an ARIA live region (`aria-live=\"polite\"`)\n- Loading states, errors, and escalation status changes are communicated to assistive technology\n\n**Contrast Requirements:**\n- All text maintains a minimum 4.5:1 contrast ratio against its background\n- Focus indicators maintain a minimum 3:1 contrast ratio\n- These guarantees hold in both light and dark mode, regardless of the accent color chosen\n\n## Unified Dual Mode\n\nThe `useDualChat()` hook provides a single interface for managing both database agent and customer support agent conversations from within a `<SyncAgentProvider>`. When your config includes `externalUserId`, both modes are available through namespaced `db` and `support` objects.\n\n```tsx\nimport { SyncAgentProvider, useDualChat } from \"@syncagent/react\";\n\nfunction App() {\n  return (\n    <SyncAgentProvider\n      config={{\n        apiKey: \"sa_your_api_key\",\n        connectionString: process.env.DATABASE_URL,\n        externalUserId: currentUser.id,\n      }}\n    >\n      <DualChatUI />\n    </SyncAgentProvider>\n  );\n}\n\nfunction DualChatUI() {\n  const { db, support } = useDualChat({\n    context: { tenant: currentUser.orgId },\n    onData: (data) => console.log(\"DB tool result:\", data),\n    onEscalated: () => console.log(\"Escalated to human\"),\n    onResolved: (id) => console.log(\"Resolved:\", id),\n  });\n\n  return (\n    <div>\n      {/* Database agent panel */}\n      <section>\n        <h2>Admin Database Chat</h2>\n        {db.messages.map((msg, i) => (\n          <div key={i}><strong>{msg.role}:</strong> {msg.content}</div>\n        ))}\n        {db.isLoading && <p>Loading...</p>}\n        {db.error && <p>Error: {db.error.message}</p>}\n        <button onClick={() => db.sendMessage(\"Show all orders\")}>\n          Query DB\n        </button>\n        <button onClick={db.stop}>Stop</button>\n        <button onClick={db.reset}>Clear</button>\n      </section>\n\n      {/* Customer support panel */}\n      <section>\n        <h2>Customer Support</h2>\n        {support.welcomeMessage && <p>{support.welcomeMessage}</p>}\n        {support.messages.map((msg, i) => (\n          <div key={i}><strong>{msg.role}:</strong> {msg.content}</div>\n        ))}\n        {support.isLoading && <p>Loading...</p>}\n        {support.isEscalated && <p>Connected to a human agent.</p>}\n        {support.isResolved && (\n          <button onClick={() => support.rateConversation(5)}>⭐ Rate</button>\n        )}\n        {support.error && <p>Error: {support.error.message}</p>}\n        <button onClick={() => support.sendMessage(\"I need help\")}>\n          Send\n        </button>\n        <button onClick={support.reset}>New Conversation</button>\n      </section>\n    </div>\n  );\n}\n```\n\n### Error Handling\n\nIf `useDualChat()` is called outside of a `<SyncAgentProvider>`, it throws:\n\n```\nuseDualChat must be used within a <SyncAgentProvider>\n```\n\nEnsure your component is wrapped in a `<SyncAgentProvider>` with a valid config that includes `externalUserId`.\n\n### `DualChatReturn`\n\nThe `useDualChat()` hook returns an object with two namespaces: `db` for database agent state and `support` for customer agent state.\n\n#### `db` Properties\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `messages` | `Message[]` | Full database agent conversation history |\n| `isLoading` | `boolean` | `true` while the database agent is streaming |\n| `error` | `Error \\| null` | Last error from the database agent, or `null` |\n| `status` | `{ step: string; label: string } \\| null` | Live status while the agent is working (e.g., querying) |\n| `lastData` | `ToolData \\| null` | Last structured data returned by a DB tool |\n| `sendMessage` | `(content: string) => void` | Send a message to the database agent |\n| `stop` | `() => void` | Abort the current database agent stream |\n| `reset` | `() => void` | Clear all database agent messages and state |\n\n#### `support` Properties\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `messages` | `Message[]` | Full customer support conversation history |\n| `conversationId` | `string \\| null` | Current conversation ID, set after first message |\n| `isLoading` | `boolean` | `true` while waiting for a support response |\n| `isEscalated` | `boolean` | `true` when conversation has been escalated to a human agent |\n| `isResolved` | `boolean` | `true` when the conversation has been resolved |\n| `error` | `Error \\| null` | Last error from the support agent, or `null` |\n| `welcomeMessage` | `string \\| null` | Welcome message returned on first interaction |\n| `sendMessage` | `(content: string, metadata?: Record<string, any>) => Promise<void>` | Send a message to the customer support agent |\n| `rateConversation` | `(rating: number) => Promise<void>` | Rate the conversation (1-5). Throws if no active conversation. |\n| `reset` | `() => void` | Clear all support state and start a new conversation |\n\n### `UseDualChatOptions`\n\n| Option | Type | Required | Description |\n|--------|------|----------|-------------|\n| `context` | `Record<string, any>` | No | Extra context injected into every database agent message |\n| `onData` | `(data: ToolData) => void` | No | Called when a DB tool returns structured data |\n| `onEscalated` | `() => void` | No | Called when the customer conversation is escalated to a human agent |\n| `onResolved` | `(conversationId: string) => void` | No | Called when the customer conversation is resolved |\n\n## Customization Options\n\nAll config options from `@syncagent/js` work here too:\n\n```tsx\n<SyncAgentChat\n  config={{\n    apiKey: \"sa_your_key\",\n    connectionString: process.env.DATABASE_URL,\n    systemInstruction: \"You are a friendly sales assistant for Acme Corp.\",\n    language: \"French\",\n    confirmWrites: true,\n    maxResults: 10,\n    sensitiveFields: [\"ssn\", \"salary\", \"creditCard\"],\n    onBeforeToolCall: (name, args) => { console.log(`[Audit] ${name}`, args); return true; },\n    onAfterToolCall: (name, args, result) => { analytics.track(\"tool_call\", { tool: name }); },\n  }}\n/>\n```\n\n## Conversation Persistence\n\n```tsx\n<SyncAgentChat\n  config={{ apiKey: \"...\", connectionString: \"...\" }}\n  persistKey={currentUser.id}\n/>\n```\n\nHistory saves to `localStorage` under `sa_chat_{persistKey}`. The \"New\" button clears it.\n\n## Context & Auto Page Detection\n\nThe SDK automatically detects the current page from `window.location` — zero config needed:\n\n```\nURL: /dashboard/orders/ord_123?tab=details\n\nAuto-detected:\n  currentPage: \"orders\"\n  currentPath: \"/dashboard/orders/ord_123\"\n  currentRecordId: \"ord_123\"\n  param_tab: \"details\"\n```\n\nPass additional context:\n\n```tsx\n<SyncAgentChat\n  config={{ apiKey: \"...\", connectionString: \"...\" }}\n  context={{ userId: currentUser.id, userRole: \"admin\" }}\n/>\n```\n\n## Vanilla JS Widget\n\nNo npm required — drop a script tag into any HTML page:\n\n```html\n<script src=\"https://syncagentdev.vercel.app/api/v1/widget\"></script>\n<script>\n  SyncAgent.init({\n    apiKey: \"sa_your_key\",\n    connectionString: \"your_database_url\",\n    position: \"right\",\n    accentColor: \"#10b981\",\n    title: \"AI Assistant\",\n    persistKey: \"my-app\",\n  });\n</script>\n```\n\n## Security\n\n- Your database connection string is **never stored** on SyncAgent servers\n- Passed at runtime, used once, immediately discarded\n- API keys are hashed with bcrypt\n- Never expose your connection string in client-side code — use server components or API routes\n\n## Plans & Pricing\n\n| Plan | Requests/mo | Collections | Price |\n|------|-------------|-------------|-------|\n| Free (+ 14-day trial) | 100 (500 during trial) | 5 | GH₵0 |\n| Starter | 5,000 | 20 | GH₵150/mo |\n| Pro | 50,000 | Unlimited | GH₵500/mo |\n| Enterprise | Unlimited | Unlimited | Custom |\n\n[View full pricing →](https://syncagentdev.vercel.app/pricing)\n\n## Resources\n\n- [Documentation](https://syncagentdev.vercel.app/docs)\n- [Dashboard](https://syncagentdev.vercel.app/dashboard)\n- [Pricing](https://syncagentdev.vercel.app/pricing)\n- [Changelog](https://syncagentdev.vercel.app/changelog)\n\n## TypeScript Types\n\nThe following types are exported from `@syncagent/react` for use in your TypeScript projects:\n\n| Type | Description | Import |\n|------|-------------|--------|\n| `DualChatReturn` | Return type of the `useDualChat()` hook containing namespaced `db` and `support` objects | `import { DualChatReturn } from \"@syncagent/react\"` |\n| `UseDualChatOptions` | Options interface for configuring the `useDualChat()` hook (context, callbacks) | `import { UseDualChatOptions } from \"@syncagent/react\"` |\n\n```ts\nimport { DualChatReturn, UseDualChatOptions } from \"@syncagent/react\";\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}