{"_id":"@bernierllc/in-app-chat","_rev":"15-bb25bc553734b6b57bf4016f9b4f5106","name":"@bernierllc/in-app-chat","dist-tags":{"latest":"4.0.1"},"versions":{"2.0.0":{"name":"@bernierllc/in-app-chat","version":"2.0.0","keywords":["nextjs","in-app-chat","chat","messaging","real-time","role-based","typescript","tailwindcss"],"author":{"name":"EarnLearn Team"},"license":"MIT","_id":"@bernierllc/in-app-chat@2.0.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"bin":{"in-app-chat":"bin/setup.js"},"dist":{"shasum":"d6a0a7cf5175bc7e38033f36e8b078370ccea061","tarball":"https://registry.npmjs.org/@bernierllc/in-app-chat/-/in-app-chat-2.0.0.tgz","fileCount":150,"integrity":"sha512-UlVDXNCbSeynBK7tr/5P/AQ3xPUFts9Y97N11gzCW/fws9Flus4juY7U0A1GNcrZ+oCpqVp/JZnDS4Jj+viMYQ==","signatures":[{"sig":"MEYCIQDx2UtxEj5NUG+mx10KAlGQ4JnmMaxvSgg1MZXws/VWPgIhAP27JDFs4U3tRqYDijwXRgAfl07GK1ILghM+0kRA3RNT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":257533},"main":"src/index.ts","_from":"file:bernierllc-in-app-chat-2.0.0.tgz","types":"src/index.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"tsc","format":"prettier --write src/**/*.{ts,tsx}","config:init":"node -e \"const fs=require('fs');const path=require('path');if(fs.existsSync('in-app-chat.config.js')){console.log('in-app-chat.config.js already exists');process.exit(1);}fs.copyFileSync(path.join(__dirname,'templates','in-app-chat.config.template.js'),'in-app-chat.config.js');console.log('✅ Created in-app-chat.config.js from template');\""},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_resolved":"/tmp/ec56ff7a95062c6ce166fd2c688b7ae1/bernierllc-in-app-chat-2.0.0.tgz","_integrity":"sha512-UlVDXNCbSeynBK7tr/5P/AQ3xPUFts9Y97N11gzCW/fws9Flus4juY7U0A1GNcrZ+oCpqVp/JZnDS4Jj+viMYQ==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.7.0","description":"A generic, role-based in-app chat system for Next.js applications","directories":{},"_nodeVersion":"20.19.6","dependencies":{"zod":"^3.22.0","clsx":"^2.0.0","cosmiconfig":"^8.0.0","lucide-react":"^0.294.0","tailwind-merge":"^2.0.0","@radix-ui/react-tabs":"^1.0.4","@radix-ui/react-avatar":"^1.0.4","@radix-ui/react-dialog":"^1.0.5","@bernierllc/file-handler":"0.2.1","class-variance-authority":"^0.7.0","@radix-ui/react-scroll-area":"^1.0.5","@bernierllc/neverhub-adapter":"0.1.2","@radix-ui/react-dropdown-menu":"^2.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.4.0","prettier":"^3.0.0","typescript":"^5.0.0","@types/jest":"^29.5.14","@types/node":"^20.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","eslint-plugin-react":"^7.0.0","eslint-config-prettier":"^9.0.0","@typescript-eslint/parser":"^6.0.0","eslint-plugin-react-hooks":"^4.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"next":"^14.0.0","react":"^19.1.0","react-dom":"^19.1.0"},"_npmOperationalInternal":{"tmp":"tmp/in-app-chat_2.0.0_1766087480327_0.03159316952633451","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@bernierllc/in-app-chat","version":"2.0.1","keywords":["nextjs","in-app-chat","chat","messaging","real-time","role-based","typescript","tailwindcss"],"author":{"name":"EarnLearn Team"},"license":"MIT","_id":"@bernierllc/in-app-chat@2.0.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"bin":{"in-app-chat":"bin/setup.js"},"dist":{"shasum":"c9f7c3c0cb58075de4357beb366054ec1ba7c8ee","tarball":"https://registry.npmjs.org/@bernierllc/in-app-chat/-/in-app-chat-2.0.1.tgz","fileCount":150,"integrity":"sha512-TYp2RKiUSzu5rraXJkyGv9lXbWAMK9plLSA/dzRGvJxuZk6naNkr55kStf2cgSPqb8298vokaReZN6kNBJ0uEw==","signatures":[{"sig":"MEUCIQC0dvcuyf74lrbGJ9hHxy0CvgMGMS1Sd9FSBdOmB6ciyQIgbITwxkFVpQGL3rWZ10M7FMifNoXcrb62T2Igg+gS3Z8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":257533},"main":"src/index.ts","_from":"file:bernierllc-in-app-chat-2.0.1.tgz","types":"src/index.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"tsc","format":"prettier --write src/**/*.{ts,tsx}","config:init":"node -e \"const fs=require('fs');const path=require('path');if(fs.existsSync('in-app-chat.config.js')){console.log('in-app-chat.config.js already exists');process.exit(1);}fs.copyFileSync(path.join(__dirname,'templates','in-app-chat.config.template.js'),'in-app-chat.config.js');console.log('✅ Created in-app-chat.config.js from template');\""},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_resolved":"/tmp/51d18459adb77425dbdc625e751aa0a8/bernierllc-in-app-chat-2.0.1.tgz","_integrity":"sha512-TYp2RKiUSzu5rraXJkyGv9lXbWAMK9plLSA/dzRGvJxuZk6naNkr55kStf2cgSPqb8298vokaReZN6kNBJ0uEw==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.7.0","description":"A generic, role-based in-app chat system for Next.js applications","directories":{},"_nodeVersion":"20.19.6","dependencies":{"zod":"^3.22.0","clsx":"^2.0.0","cosmiconfig":"^8.0.0","lucide-react":"^0.294.0","tailwind-merge":"^2.0.0","@radix-ui/react-tabs":"^1.0.4","@radix-ui/react-avatar":"^1.0.4","@radix-ui/react-dialog":"^1.0.5","@bernierllc/file-handler":"0.2.2","class-variance-authority":"^0.7.0","@radix-ui/react-scroll-area":"^1.0.5","@bernierllc/neverhub-adapter":"0.1.2","@radix-ui/react-dropdown-menu":"^2.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.4.0","prettier":"^3.0.0","typescript":"^5.0.0","@types/jest":"^29.5.14","@types/node":"^20.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","eslint-plugin-react":"^7.0.0","eslint-config-prettier":"^9.0.0","@typescript-eslint/parser":"^6.0.0","eslint-plugin-react-hooks":"^4.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"next":"^14.0.0","react":"^19.1.0","react-dom":"^19.1.0"},"_npmOperationalInternal":{"tmp":"tmp/in-app-chat_2.0.1_1766276752340_0.05495454558047874","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"@bernierllc/in-app-chat","version":"2.0.2","keywords":["nextjs","in-app-chat","chat","messaging","real-time","role-based","typescript","tailwindcss"],"author":{"name":"EarnLearn Team"},"license":"MIT","_id":"@bernierllc/in-app-chat@2.0.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"bin":{"in-app-chat":"bin/setup.js"},"dist":{"shasum":"b4e383cd64993b49c592616f6af0d987e286055f","tarball":"https://registry.npmjs.org/@bernierllc/in-app-chat/-/in-app-chat-2.0.2.tgz","fileCount":150,"integrity":"sha512-uX5F/HnM1QUdCm6Di1Y33HJ1mjzBRgdra1v5dfvYO69gkgwd4pZrObztaLa6REFqttwbzrTRc7gKwIO2XRFfWA==","signatures":[{"sig":"MEYCIQDmM2MATyhv3Q516bwS9TH6vq2wi9vwKrGsaG0gPzMF5AIhANOZCwx3uI3vrPIOw1+risSAp9FRpFq2hXqfrgC4AMHG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":257533},"main":"src/index.ts","_from":"file:bernierllc-in-app-chat-2.0.2.tgz","types":"src/index.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"tsc","format":"prettier --write src/**/*.{ts,tsx}","config:init":"node -e \"const fs=require('fs');const path=require('path');if(fs.existsSync('in-app-chat.config.js')){console.log('in-app-chat.config.js already exists');process.exit(1);}fs.copyFileSync(path.join(__dirname,'templates','in-app-chat.config.template.js'),'in-app-chat.config.js');console.log('✅ Created in-app-chat.config.js from template');\""},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_resolved":"/tmp/2654aee626556120907cbfc124ed9939/bernierllc-in-app-chat-2.0.2.tgz","_integrity":"sha512-uX5F/HnM1QUdCm6Di1Y33HJ1mjzBRgdra1v5dfvYO69gkgwd4pZrObztaLa6REFqttwbzrTRc7gKwIO2XRFfWA==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.7.0","description":"A generic, role-based in-app chat system for Next.js applications","directories":{},"_nodeVersion":"20.19.6","dependencies":{"zod":"^3.22.0","clsx":"^2.0.0","cosmiconfig":"^8.0.0","lucide-react":"^0.294.0","tailwind-merge":"^2.0.0","@radix-ui/react-tabs":"^1.0.4","@radix-ui/react-avatar":"^1.0.4","@radix-ui/react-dialog":"^1.0.5","@bernierllc/file-handler":"0.2.3","class-variance-authority":"^0.7.0","@radix-ui/react-scroll-area":"^1.0.5","@bernierllc/neverhub-adapter":"0.1.2","@radix-ui/react-dropdown-menu":"^2.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.4.0","prettier":"^3.0.0","typescript":"^5.0.0","@types/jest":"^29.5.14","@types/node":"^20.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","eslint-plugin-react":"^7.0.0","eslint-config-prettier":"^9.0.0","@typescript-eslint/parser":"^6.0.0","eslint-plugin-react-hooks":"^4.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"next":"^14.0.0","react":"^19.1.0","react-dom":"^19.1.0"},"_npmOperationalInternal":{"tmp":"tmp/in-app-chat_2.0.2_1766283528112_0.6138134719259476","host":"s3://npm-registry-packages-npm-production"}},"2.0.3":{"name":"@bernierllc/in-app-chat","version":"2.0.3","keywords":["nextjs","in-app-chat","chat","messaging","real-time","role-based","typescript","tailwindcss"],"author":{"name":"EarnLearn Team"},"license":"MIT","_id":"@bernierllc/in-app-chat@2.0.3","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"bin":{"in-app-chat":"bin/setup.js"},"dist":{"shasum":"c76c67ae2d8f50702a1ba12b289d1ba1c293b821","tarball":"https://registry.npmjs.org/@bernierllc/in-app-chat/-/in-app-chat-2.0.3.tgz","fileCount":150,"integrity":"sha512-bIwRXPG/m+gwSoVAboCmz4vyyYWyR/Am/vYxnJoR5W5k+b/IOQCTijIg3nwj98DGtS0gCylexsPkuLToIKOicQ==","signatures":[{"sig":"MEYCIQCiVFdvsvUC89NEbq6+CzZOLMW0VbNYgO2rv2am8j0ZHwIhALKp4F7fZj8jU/gFW/ovsqzaMnMQx7j2CjN7iPudvnQO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":257533},"main":"src/index.ts","_from":"file:bernierllc-in-app-chat-2.0.3.tgz","types":"src/index.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"tsc","format":"prettier --write src/**/*.{ts,tsx}","config:init":"node -e \"const fs=require('fs');const path=require('path');if(fs.existsSync('in-app-chat.config.js')){console.log('in-app-chat.config.js already exists');process.exit(1);}fs.copyFileSync(path.join(__dirname,'templates','in-app-chat.config.template.js'),'in-app-chat.config.js');console.log('✅ Created in-app-chat.config.js from template');\""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e9b2291d-47bd-43fc-b81b-2e4a90a9e83f"}},"_resolved":"/tmp/6ce9bdf71277f9819c3389cc14a5b3c1/bernierllc-in-app-chat-2.0.3.tgz","_integrity":"sha512-bIwRXPG/m+gwSoVAboCmz4vyyYWyR/Am/vYxnJoR5W5k+b/IOQCTijIg3nwj98DGtS0gCylexsPkuLToIKOicQ==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.7.0","description":"A generic, role-based in-app chat system for Next.js applications","directories":{},"_nodeVersion":"20.19.6","dependencies":{"zod":"^3.22.0","clsx":"^2.0.0","cosmiconfig":"^8.0.0","lucide-react":"^0.294.0","tailwind-merge":"^2.0.0","@radix-ui/react-tabs":"^1.0.4","@radix-ui/react-avatar":"^1.0.4","@radix-ui/react-dialog":"^1.0.5","@bernierllc/file-handler":"0.2.3","class-variance-authority":"^0.7.0","@radix-ui/react-scroll-area":"^1.0.5","@bernierllc/neverhub-adapter":"0.1.2","@radix-ui/react-dropdown-menu":"^2.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.4.0","prettier":"^3.0.0","typescript":"^5.0.0","@types/jest":"^29.5.14","@types/node":"^20.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","eslint-plugin-react":"^7.0.0","eslint-config-prettier":"^9.0.0","@typescript-eslint/parser":"^6.0.0","eslint-plugin-react-hooks":"^4.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"next":"^14.0.0","react":"^19.1.0","react-dom":"^19.1.0"},"_npmOperationalInternal":{"tmp":"tmp/in-app-chat_2.0.3_1766433615894_0.8175650638304022","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@bernierllc/in-app-chat","version":"2.2.0","keywords":["nextjs","in-app-chat","chat","messaging","real-time","role-based","typescript","tailwindcss"],"author":{"name":"EarnLearn Team"},"license":"MIT","_id":"@bernierllc/in-app-chat@2.2.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"bin":{"in-app-chat":"bin/setup.js"},"dist":{"shasum":"891d097ba9e30c91eb264aa6abfac0569b214195","tarball":"https://registry.npmjs.org/@bernierllc/in-app-chat/-/in-app-chat-2.2.0.tgz","fileCount":150,"integrity":"sha512-rF/jJ1Hx2N1LVA1z3TlKVFv+bqBaxcTJBkSuZPgKIV1cCVwMf4O6amaRJtTS9/AcAmpXJvhx9kSrP4DzArmAxw==","signatures":[{"sig":"MEQCIDVRrieS9tL8wfJAvIhd1fwLKJDNaReFMyHmecUPMpT+AiBhia5nLNqt8hZd2cJulCbqN/V/bRXW5UUb4Jr0XilN0A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":257591},"main":"src/index.ts","types":"src/index.ts","gitHead":"af7e74b3715d56d3a193e1bb6743b337c2b0df6d","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"tsc","format":"prettier --write src/**/*.{ts,tsx}","config:init":"node -e \"const fs=require('fs');const path=require('path');if(fs.existsSync('in-app-chat.config.js')){console.log('in-app-chat.config.js already exists');process.exit(1);}fs.copyFileSync(path.join(__dirname,'templates','in-app-chat.config.template.js'),'in-app-chat.config.js');console.log('✅ Created in-app-chat.config.js from template');\""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e9b2291d-47bd-43fc-b81b-2e4a90a9e83f"}},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"A generic, role-based in-app chat system for Next.js applications","directories":{},"_nodeVersion":"20.19.6","dependencies":{"zod":"^3.22.0","clsx":"^2.0.0","cosmiconfig":"^8.0.0","lucide-react":"^0.294.0","tailwind-merge":"^2.0.0","@radix-ui/react-tabs":"^1.0.4","@radix-ui/react-avatar":"^1.0.4","@radix-ui/react-dialog":"^1.0.5","@bernierllc/file-handler":"0.4.0","class-variance-authority":"^0.7.0","@radix-ui/react-scroll-area":"^1.0.5","@bernierllc/neverhub-adapter":"0.1.4","@radix-ui/react-dropdown-menu":"^2.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.4.0","prettier":"^3.0.0","typescript":"^5.0.0","@types/jest":"^29.5.14","@types/node":"^20.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","eslint-plugin-react":"^7.0.0","eslint-config-prettier":"^9.0.0","@typescript-eslint/parser":"^6.0.0","eslint-plugin-react-hooks":"^4.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"next":"^14.0.0","react":"^19.1.0","react-dom":"^19.1.0"},"_npmOperationalInternal":{"tmp":"tmp/in-app-chat_2.2.0_1767642400359_0.6712321297105124","host":"s3://npm-registry-packages-npm-production"}},"2.2.1":{"name":"@bernierllc/in-app-chat","version":"2.2.1","keywords":["nextjs","in-app-chat","chat","messaging","real-time","role-based","typescript","tailwindcss"],"author":{"name":"EarnLearn Team"},"license":"MIT","_id":"@bernierllc/in-app-chat@2.2.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"bin":{"in-app-chat":"bin/setup.js"},"dist":{"shasum":"1d5f117f21cb44495644d87a4de248630bfa80c3","tarball":"https://registry.npmjs.org/@bernierllc/in-app-chat/-/in-app-chat-2.2.1.tgz","fileCount":150,"integrity":"sha512-AqQvWuYJGZllBJuhmB9c2PmJ5Jd4QP5HnRGAtl9c8VsUiu38vJGh9q8bzR6eiMNYJZfRoliq+o4/oiHXHOUdTQ==","signatures":[{"sig":"MEUCIEhlhCjeivkF7Qf/lVX5hBjixMeRDHzH+X7zllvBQ1dGAiEAwipsNr1bNRrd1UBbTLw38Fhc729kuMoVbCOM25RMUpo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":257533},"main":"src/index.ts","_from":"file:bernierllc-in-app-chat-2.2.1.tgz","types":"src/index.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"tsc","format":"prettier --write src/**/*.{ts,tsx}","config:init":"node -e \"const fs=require('fs');const path=require('path');if(fs.existsSync('in-app-chat.config.js')){console.log('in-app-chat.config.js already exists');process.exit(1);}fs.copyFileSync(path.join(__dirname,'templates','in-app-chat.config.template.js'),'in-app-chat.config.js');console.log('✅ Created in-app-chat.config.js from template');\""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e9b2291d-47bd-43fc-b81b-2e4a90a9e83f"}},"_resolved":"/tmp/dabd955f7dff913f27994d52079a07ee/bernierllc-in-app-chat-2.2.1.tgz","_integrity":"sha512-AqQvWuYJGZllBJuhmB9c2PmJ5Jd4QP5HnRGAtl9c8VsUiu38vJGh9q8bzR6eiMNYJZfRoliq+o4/oiHXHOUdTQ==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.11.0","description":"A generic, role-based in-app chat system for Next.js applications","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^3.22.0","clsx":"^2.0.0","cosmiconfig":"^8.0.0","lucide-react":"^0.294.0","tailwind-merge":"^2.0.0","@radix-ui/react-tabs":"^1.0.4","@radix-ui/react-avatar":"^1.0.4","@radix-ui/react-dialog":"^1.0.5","@bernierllc/file-handler":"0.4.1","class-variance-authority":"^0.7.0","@radix-ui/react-scroll-area":"^1.0.5","@bernierllc/neverhub-adapter":"0.1.5","@radix-ui/react-dropdown-menu":"^2.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.4.0","prettier":"^3.0.0","typescript":"^5.0.0","@types/jest":"^29.5.14","@types/node":"^20.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","eslint-plugin-react":"^7.0.0","eslint-config-prettier":"^9.0.0","@typescript-eslint/parser":"^6.0.0","eslint-plugin-react-hooks":"^4.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"next":"^14.0.0","react":"^19.1.0","react-dom":"^19.1.0"},"_npmOperationalInternal":{"tmp":"tmp/in-app-chat_2.2.1_1773078234605_0.04340118276583049","host":"s3://npm-registry-packages-npm-production"}},"2.2.2":{"name":"@bernierllc/in-app-chat","version":"2.2.2","keywords":["nextjs","in-app-chat","chat","messaging","real-time","role-based","typescript","tailwindcss"],"author":{"name":"EarnLearn Team"},"license":"MIT","_id":"@bernierllc/in-app-chat@2.2.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"bin":{"in-app-chat":"bin/setup.js"},"dist":{"shasum":"d4c41fd9694f23773560a62675431a6a1047cbb3","tarball":"https://registry.npmjs.org/@bernierllc/in-app-chat/-/in-app-chat-2.2.2.tgz","fileCount":150,"integrity":"sha512-D2b23zxbMCbNz6LKDFBgPiWSJMz8Ni3RFwbSpFKzo32jdXPEkY7j015fmeTCxt0rRiXubW8ZXQggktAnHPlERg==","signatures":[{"sig":"MEQCIGxML0mL/Gx8qSM/NUOG/wd5hWZr5DDahz/WsVBAFgMQAiAHWZpfKSOfzfEfjpBpUpM/Q2S7q+OKA7KywyzbpwNzLQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":257533},"main":"src/index.ts","_from":"file:bernierllc-in-app-chat-2.2.2.tgz","types":"src/index.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"tsc","format":"prettier --write src/**/*.{ts,tsx}","config:init":"node -e \"const fs=require('fs');const path=require('path');if(fs.existsSync('in-app-chat.config.js')){console.log('in-app-chat.config.js already exists');process.exit(1);}fs.copyFileSync(path.join(__dirname,'templates','in-app-chat.config.template.js'),'in-app-chat.config.js');console.log('✅ Created in-app-chat.config.js from template');\""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e9b2291d-47bd-43fc-b81b-2e4a90a9e83f"}},"_resolved":"/home/runner/work/tools/tools/packages/service/messaging/bernierllc-in-app-chat-2.2.2.tgz","_integrity":"sha512-D2b23zxbMCbNz6LKDFBgPiWSJMz8Ni3RFwbSpFKzo32jdXPEkY7j015fmeTCxt0rRiXubW8ZXQggktAnHPlERg==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.11.0","description":"A generic, role-based in-app chat system for Next.js applications","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^3.22.0","clsx":"^2.0.0","cosmiconfig":"^8.0.0","lucide-react":"^0.294.0","tailwind-merge":"^2.0.0","@radix-ui/react-tabs":"^1.0.4","@radix-ui/react-avatar":"^1.0.4","@radix-ui/react-dialog":"^1.0.5","@bernierllc/file-handler":"0.4.2","class-variance-authority":"^0.7.0","@radix-ui/react-scroll-area":"^1.0.5","@bernierllc/neverhub-adapter":"0.1.6","@radix-ui/react-dropdown-menu":"^2.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.4.0","prettier":"^3.0.0","typescript":"^5.0.0","@types/jest":"^29.5.14","@types/node":"^20.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","eslint-plugin-react":"^7.0.0","eslint-config-prettier":"^9.0.0","@typescript-eslint/parser":"^6.0.0","eslint-plugin-react-hooks":"^4.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"next":"^14.0.0","react":"^19.1.0","react-dom":"^19.1.0"},"_npmOperationalInternal":{"tmp":"tmp/in-app-chat_2.2.2_1773163609500_0.7729171371973538","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"@bernierllc/in-app-chat","version":"2.3.0","keywords":["nextjs","in-app-chat","chat","messaging","real-time","role-based","typescript","tailwindcss"],"author":{"name":"EarnLearn Team"},"license":"MIT","_id":"@bernierllc/in-app-chat@2.3.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"bin":{"in-app-chat":"bin/setup.js"},"dist":{"shasum":"c09000ac0bd0f338bb3e17102ca0826b72392882","tarball":"https://registry.npmjs.org/@bernierllc/in-app-chat/-/in-app-chat-2.3.0.tgz","fileCount":150,"integrity":"sha512-z2HKFrgoUhscYCwiMmj2Ilqa31sfjVG6JW50h1dFLY34s/AAA4fHptbvIj4PzPdyzf/K52jaqa2FDfT+2ztPvg==","signatures":[{"sig":"MEUCIGKSehZZHaLjI3ieZZMxKaKAUgWYvOpqWxWjDlTfUyoWAiEAmstacQ5vXO1if/hRKdSsX9OhQKjRgC1T8K8HOJUMMLQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":257533},"main":"src/index.ts","_from":"file:bernierllc-in-app-chat-2.3.0.tgz","types":"src/index.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"tsc","format":"prettier --write src/**/*.{ts,tsx}","config:init":"node -e \"const fs=require('fs');const path=require('path');if(fs.existsSync('in-app-chat.config.js')){console.log('in-app-chat.config.js already exists');process.exit(1);}fs.copyFileSync(path.join(__dirname,'templates','in-app-chat.config.template.js'),'in-app-chat.config.js');console.log('✅ Created in-app-chat.config.js from template');\""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e9b2291d-47bd-43fc-b81b-2e4a90a9e83f"}},"_resolved":"/home/runner/work/tools/tools/packages/service/messaging/bernierllc-in-app-chat-2.3.0.tgz","_integrity":"sha512-z2HKFrgoUhscYCwiMmj2Ilqa31sfjVG6JW50h1dFLY34s/AAA4fHptbvIj4PzPdyzf/K52jaqa2FDfT+2ztPvg==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.14.1","description":"A generic, role-based in-app chat system for Next.js applications","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.22.0","clsx":"^2.0.0","cosmiconfig":"^8.0.0","lucide-react":"^0.294.0","tailwind-merge":"^2.0.0","@radix-ui/react-tabs":"^1.0.4","@radix-ui/react-avatar":"^1.0.4","@radix-ui/react-dialog":"^1.0.5","@bernierllc/file-handler":"0.4.2","class-variance-authority":"^0.7.0","@radix-ui/react-scroll-area":"^1.0.5","@bernierllc/neverhub-adapter":"0.2.0","@radix-ui/react-dropdown-menu":"^2.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.4.0","prettier":"^3.0.0","typescript":"^5.0.0","@types/jest":"^29.5.14","@types/node":"^20.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","eslint-plugin-react":"^7.0.0","eslint-config-prettier":"^9.0.0","@typescript-eslint/parser":"^6.0.0","eslint-plugin-react-hooks":"^4.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"next":"^14.0.0","react":"^19.1.0","react-dom":"^19.1.0"},"_npmOperationalInternal":{"tmp":"tmp/in-app-chat_2.3.0_1779221675099_0.0743273854095754","host":"s3://npm-registry-packages-npm-production"}},"2.4.0":{"name":"@bernierllc/in-app-chat","version":"2.4.0","keywords":["nextjs","in-app-chat","chat","messaging","real-time","role-based","typescript","tailwindcss"],"author":{"name":"EarnLearn Team"},"license":"MIT","_id":"@bernierllc/in-app-chat@2.4.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"bin":{"in-app-chat":"bin/setup.js"},"dist":{"shasum":"4078e267c4d8ab0a5f3ab96757cc69182bce178c","tarball":"https://registry.npmjs.org/@bernierllc/in-app-chat/-/in-app-chat-2.4.0.tgz","fileCount":150,"integrity":"sha512-G20SvzHmX2jxdJrFhnreeijGXWQy4JHYA6SppcApsAqk/Fp21fg12BKb4SlpkG5bKJ/iVkJoOsyhHu/KX/8jmQ==","signatures":[{"sig":"MEQCIER82rXWAW/WMNgpZJgHw5F7eO3EdWvQefUAQaH6d2ChAiAnPspArixp6vq24ECzwJuzEg/F650/SlqNVOjI0a8Ctg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":257533},"main":"src/index.ts","_from":"file:bernierllc-in-app-chat-2.4.0.tgz","types":"src/index.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"tsc","format":"prettier --write src/**/*.{ts,tsx}","config:init":"node -e \"const fs=require('fs');const path=require('path');if(fs.existsSync('in-app-chat.config.js')){console.log('in-app-chat.config.js already exists');process.exit(1);}fs.copyFileSync(path.join(__dirname,'templates','in-app-chat.config.template.js'),'in-app-chat.config.js');console.log('✅ Created in-app-chat.config.js from template');\""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e9b2291d-47bd-43fc-b81b-2e4a90a9e83f"}},"_resolved":"/home/runner/work/tools/tools/packages/service/messaging/bernierllc-in-app-chat-2.4.0.tgz","_integrity":"sha512-G20SvzHmX2jxdJrFhnreeijGXWQy4JHYA6SppcApsAqk/Fp21fg12BKb4SlpkG5bKJ/iVkJoOsyhHu/KX/8jmQ==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.14.1","description":"A generic, role-based in-app chat system for Next.js applications","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.22.0","clsx":"^2.0.0","cosmiconfig":"^8.0.0","lucide-react":"^0.294.0","tailwind-merge":"^2.0.0","@radix-ui/react-tabs":"^1.0.4","@radix-ui/react-avatar":"^1.0.4","@radix-ui/react-dialog":"^1.0.5","@bernierllc/file-handler":"0.6.0","class-variance-authority":"^0.7.0","@radix-ui/react-scroll-area":"^1.0.5","@bernierllc/neverhub-adapter":"0.3.0","@radix-ui/react-dropdown-menu":"^2.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.4.0","prettier":"^3.0.0","typescript":"^5.0.0","@types/jest":"^29.5.14","@types/node":"^20.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","eslint-plugin-react":"^7.0.0","eslint-config-prettier":"^9.0.0","@typescript-eslint/parser":"^6.0.0","eslint-plugin-react-hooks":"^4.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"next":"^14.0.0","react":"^19.1.0","react-dom":"^19.1.0"},"_npmOperationalInternal":{"tmp":"tmp/in-app-chat_2.4.0_1779241755920_0.9636341926639485","host":"s3://npm-registry-packages-npm-production"}},"2.6.0":{"name":"@bernierllc/in-app-chat","version":"2.6.0","keywords":["nextjs","in-app-chat","chat","messaging","real-time","role-based","typescript","tailwindcss"],"author":{"name":"EarnLearn Team"},"license":"MIT","_id":"@bernierllc/in-app-chat@2.6.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"bin":{"in-app-chat":"bin/setup.js"},"dist":{"shasum":"12ed7f7561b9ee1a8e67add48a8945adad964371","tarball":"https://registry.npmjs.org/@bernierllc/in-app-chat/-/in-app-chat-2.6.0.tgz","fileCount":151,"integrity":"sha512-fh2uSt+l3QzJdypPk2RKctsgrY75yAys9ybVXfLILTCZnFQSeEiO2+L1me5TQRMv26QK16oyncx0Q7FMvwdvlQ==","signatures":[{"sig":"MEUCIQCQ5TTL4YDt9WI4Rq4tR+7WOAVzQXg4fwkw8JFaK+KdagIgUVaPAi944zmsoRQycllDI1e2LSRHLiMmvshUHNAPDXE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":258708},"main":"src/index.ts","_from":"file:bernierllc-in-app-chat-2.6.0.tgz","types":"src/index.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"tsc","format":"prettier --write src/**/*.{ts,tsx}","config:init":"node -e \"const fs=require('fs');const path=require('path');if(fs.existsSync('in-app-chat.config.js')){console.log('in-app-chat.config.js already exists');process.exit(1);}fs.copyFileSync(path.join(__dirname,'templates','in-app-chat.config.template.js'),'in-app-chat.config.js');console.log('✅ Created in-app-chat.config.js from template');\""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e9b2291d-47bd-43fc-b81b-2e4a90a9e83f"}},"_resolved":"/home/runner/work/tools/tools/packages/service/messaging/bernierllc-in-app-chat-2.6.0.tgz","_integrity":"sha512-fh2uSt+l3QzJdypPk2RKctsgrY75yAys9ybVXfLILTCZnFQSeEiO2+L1me5TQRMv26QK16oyncx0Q7FMvwdvlQ==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.14.1","description":"A generic, role-based in-app chat system for Next.js applications","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.22.0","clsx":"^2.0.0","cosmiconfig":"^8.0.0","lucide-react":"^0.294.0","tailwind-merge":"^2.0.0","@radix-ui/react-tabs":"^1.0.4","@radix-ui/react-avatar":"^1.0.4","@radix-ui/react-dialog":"^1.0.5","@bernierllc/file-handler":"0.6.0","class-variance-authority":"^0.7.0","@radix-ui/react-scroll-area":"^1.0.5","@bernierllc/neverhub-adapter":"0.3.0","@radix-ui/react-dropdown-menu":"^2.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.4.0","prettier":"^3.0.0","typescript":"^5.0.0","@types/jest":"^29.5.14","@types/node":"^20.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","eslint-plugin-react":"^7.0.0","eslint-config-prettier":"^9.0.0","@typescript-eslint/parser":"^6.0.0","eslint-plugin-react-hooks":"^4.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"next":"^14.0.0","react":"^19.1.0","react-dom":"^19.1.0"},"_npmOperationalInternal":{"tmp":"tmp/in-app-chat_2.6.0_1779247266755_0.7772452288678386","host":"s3://npm-registry-packages-npm-production"}},"2.7.0":{"name":"@bernierllc/in-app-chat","version":"2.7.0","keywords":["nextjs","in-app-chat","chat","messaging","real-time","role-based","typescript","tailwindcss"],"author":{"name":"EarnLearn Team"},"license":"MIT","_id":"@bernierllc/in-app-chat@2.7.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"bin":{"in-app-chat":"bin/setup.js"},"dist":{"shasum":"2b992c84240d99189958f3a4ee1738905e2c192f","tarball":"https://registry.npmjs.org/@bernierllc/in-app-chat/-/in-app-chat-2.7.0.tgz","fileCount":151,"integrity":"sha512-5znRKbfMCOi9eqKAQ3n6Zg7RFbTON2Vrfw/eneQ/3pfaX6nGnefGN5jj5/N4h2oKy8zJIMiWZBhzZcYrxTPkcg==","signatures":[{"sig":"MEUCIQCuGdmsLsROq/9NOJcU0QGkN5oC38d4bZdzV+07bkeh1AIgPrnAk2Y6bdqzLFmhK4u4fpOX/QA7aldeN9JbFSTDTMo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":258708},"main":"src/index.ts","_from":"file:bernierllc-in-app-chat-2.7.0.tgz","types":"src/index.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"tsc","format":"prettier --write src/**/*.{ts,tsx}","config:init":"node -e \"const fs=require('fs');const path=require('path');if(fs.existsSync('in-app-chat.config.js')){console.log('in-app-chat.config.js already exists');process.exit(1);}fs.copyFileSync(path.join(__dirname,'templates','in-app-chat.config.template.js'),'in-app-chat.config.js');console.log('✅ Created in-app-chat.config.js from template');\""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e9b2291d-47bd-43fc-b81b-2e4a90a9e83f"}},"_resolved":"/home/runner/work/tools/tools/packages/service/messaging/bernierllc-in-app-chat-2.7.0.tgz","_integrity":"sha512-5znRKbfMCOi9eqKAQ3n6Zg7RFbTON2Vrfw/eneQ/3pfaX6nGnefGN5jj5/N4h2oKy8zJIMiWZBhzZcYrxTPkcg==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.14.1","description":"A generic, role-based in-app chat system for Next.js applications","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.22.0","clsx":"^2.0.0","cosmiconfig":"^8.0.0","lucide-react":"^0.294.0","tailwind-merge":"^2.0.0","@radix-ui/react-tabs":"^1.0.4","@radix-ui/react-avatar":"^1.0.4","@radix-ui/react-dialog":"^1.0.5","@bernierllc/file-handler":"0.7.0","class-variance-authority":"^0.7.0","@radix-ui/react-scroll-area":"^1.0.5","@bernierllc/neverhub-adapter":"0.4.0","@radix-ui/react-dropdown-menu":"^2.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.4.0","prettier":"^3.0.0","typescript":"^5.0.0","@types/jest":"^29.5.14","@types/node":"^20.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","eslint-plugin-react":"^7.0.0","eslint-config-prettier":"^9.0.0","@typescript-eslint/parser":"^6.0.0","eslint-plugin-react-hooks":"^4.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"next":"^14.0.0","react":"^19.1.0","react-dom":"^19.1.0"},"_npmOperationalInternal":{"tmp":"tmp/in-app-chat_2.7.0_1779250503614_0.10716119118801304","host":"s3://npm-registry-packages-npm-production"}},"2.8.0":{"name":"@bernierllc/in-app-chat","version":"2.8.0","keywords":["nextjs","in-app-chat","chat","messaging","real-time","role-based","typescript","tailwindcss"],"author":{"name":"EarnLearn Team"},"license":"MIT","_id":"@bernierllc/in-app-chat@2.8.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"bin":{"in-app-chat":"bin/setup.js"},"dist":{"shasum":"8c9e73f36b05b0bacfa5ffe6de4ac036956aa840","tarball":"https://registry.npmjs.org/@bernierllc/in-app-chat/-/in-app-chat-2.8.0.tgz","fileCount":151,"integrity":"sha512-rb1j6gi3sA4vKVPiF4P/HSdZPa675Uc1sh8xIpQ5cs0kjX56wEtO9/wV6cLNHg3n0oXD4kHGSWkm/qLNtvUg6w==","signatures":[{"sig":"MEYCIQC0k+4JtOd8Hd4YSgJIJUC/6bSOrrMZ7Hm5suKECQMiDwIhAN3ATsJgH6p3e97Pkv9WFphs+NIqX1UhQE/cMJ9B2VQe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":258708},"main":"src/index.ts","_from":"file:bernierllc-in-app-chat-2.8.0.tgz","types":"src/index.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"tsc","format":"prettier --write src/**/*.{ts,tsx}","config:init":"node -e \"const fs=require('fs');const path=require('path');if(fs.existsSync('in-app-chat.config.js')){console.log('in-app-chat.config.js already exists');process.exit(1);}fs.copyFileSync(path.join(__dirname,'templates','in-app-chat.config.template.js'),'in-app-chat.config.js');console.log('✅ Created in-app-chat.config.js from template');\""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e9b2291d-47bd-43fc-b81b-2e4a90a9e83f"}},"_resolved":"/home/runner/work/tools/tools/packages/service/messaging/bernierllc-in-app-chat-2.8.0.tgz","_integrity":"sha512-rb1j6gi3sA4vKVPiF4P/HSdZPa675Uc1sh8xIpQ5cs0kjX56wEtO9/wV6cLNHg3n0oXD4kHGSWkm/qLNtvUg6w==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.15.0","description":"A generic, role-based in-app chat system for Next.js applications","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.22.0","clsx":"^2.0.0","cosmiconfig":"^8.0.0","lucide-react":"^0.294.0","tailwind-merge":"^2.0.0","@radix-ui/react-tabs":"^1.0.4","@radix-ui/react-avatar":"^1.0.4","@radix-ui/react-dialog":"^1.0.5","@bernierllc/file-handler":"0.8.0","class-variance-authority":"^0.7.0","@radix-ui/react-scroll-area":"^1.0.5","@bernierllc/neverhub-adapter":"0.4.0","@radix-ui/react-dropdown-menu":"^2.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.4.0","prettier":"^3.0.0","typescript":"^5.0.0","@types/jest":"^29.5.14","@types/node":"^20.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","eslint-plugin-react":"^7.0.0","eslint-config-prettier":"^9.0.0","@typescript-eslint/parser":"^6.0.0","eslint-plugin-react-hooks":"^4.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"next":"^14.0.0","react":"^19.1.0","react-dom":"^19.1.0"},"_npmOperationalInternal":{"tmp":"tmp/in-app-chat_2.8.0_1779840814783_0.9553023046558027","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@bernierllc/in-app-chat","version":"3.0.0","keywords":["nextjs","in-app-chat","chat","messaging","real-time","role-based","typescript","tailwindcss"],"author":{"name":"EarnLearn Team"},"license":"MIT","_id":"@bernierllc/in-app-chat@3.0.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"bin":{"in-app-chat":"bin/setup.js"},"dist":{"shasum":"18bc952cec5d6a5b03fa679aaa875cbfec1343ea","tarball":"https://registry.npmjs.org/@bernierllc/in-app-chat/-/in-app-chat-3.0.0.tgz","fileCount":43,"integrity":"sha512-3ngXGSTRgasYG+ScSgF0rma0kd60F71DaUF9sTv/Rn+8mctQ88p4uxeelG/mWbMrjcrVjZwb0vZTMDzu8bQd5A==","signatures":[{"sig":"MEYCIQC1ShgXFY7XEAXEhN8BFTQF1ooE5MRVEnTSlQm0XPvDlgIhANSPk4a0ira4Wyoz7Uyg9VAZox+LEJ2bhi8oxrc5vBWG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":218158},"main":"src/index.ts","_from":"file:bernierllc-in-app-chat-3.0.0.tgz","types":"src/index.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"tsc","format":"prettier --write src/**/*.{ts,tsx}","test:run":"jest --ci","test:watch":"jest --watch","config:init":"node -e \"const fs=require('fs');const path=require('path');if(fs.existsSync('in-app-chat.config.js')){console.log('in-app-chat.config.js already exists');process.exit(1);}fs.copyFileSync(path.join(__dirname,'templates','in-app-chat.config.template.js'),'in-app-chat.config.js');console.log('✅ Created in-app-chat.config.js from template');\"","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e9b2291d-47bd-43fc-b81b-2e4a90a9e83f"}},"_resolved":"/home/runner/work/tools/tools/packages/service/in-app-chat/bernierllc-in-app-chat-3.0.0.tgz","_integrity":"sha512-3ngXGSTRgasYG+ScSgF0rma0kd60F71DaUF9sTv/Rn+8mctQ88p4uxeelG/mWbMrjcrVjZwb0vZTMDzu8bQd5A==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"12.0.1","description":"A generic, role-based in-app chat system for Next.js applications","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^3.22.0","clsx":"^2.0.0","cosmiconfig":"^8.0.0","lucide-react":"^0.294.0","tailwind-merge":"^2.0.0","@radix-ui/react-tabs":"^1.0.4","@radix-ui/react-avatar":"^1.0.4","@radix-ui/react-dialog":"^1.0.5","@bernierllc/file-handler":"0.8.0","class-variance-authority":"^0.7.0","@bernierllc/html-sanitizer":"1.5.0","@radix-ui/react-scroll-area":"^1.0.5","@bernierllc/neverhub-adapter":"0.4.1","@radix-ui/react-dropdown-menu":"^2.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.4.0","prettier":"^3.0.0","typescript":"^5.0.0","@types/jest":"^29.5.14","@types/node":"^20.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","eslint-plugin-react":"^7.0.0","@testing-library/dom":"^10.4.0","@testing-library/react":"^16.1.0","eslint-config-prettier":"^9.0.0","jest-environment-jsdom":"^29.7.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^6.0.0","eslint-plugin-react-hooks":"^4.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"next":"^14.0.0","react":"^19.1.0","react-dom":"^19.1.0"},"_npmOperationalInternal":{"tmp":"tmp/in-app-chat_3.0.0_1784015919436_0.8078499986174685","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"@bernierllc/in-app-chat","version":"4.0.0","keywords":["nextjs","in-app-chat","chat","messaging","real-time","role-based","typescript","tailwindcss"],"author":{"name":"EarnLearn Team"},"license":"MIT","_id":"@bernierllc/in-app-chat@4.0.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"bin":{"in-app-chat":"bin/setup.js"},"dist":{"shasum":"16b9aa0b8c3950aa27c633489fc9753222f9f154","tarball":"https://registry.npmjs.org/@bernierllc/in-app-chat/-/in-app-chat-4.0.0.tgz","fileCount":43,"integrity":"sha512-qkjkMH2Vap3M2DiiV1nZTyS4mgWVjw/mBIA6pw/TUNo+SiE/G2imXwjuQmwWSgoJ07O5HRMyxewOfSX976wqWA==","signatures":[{"sig":"MEYCIQCj4aD8lB1ZXHnD2FqoCMcS9nSe2eDOWjyyrGnS/8beZQIhAKgf/+4MyYVYXjlpLFjwc8M/r0jE3NOiISNz5ltywcPX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":213067},"main":"src/index.ts","_from":"file:bernierllc-in-app-chat-4.0.0.tgz","types":"src/index.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"tsc","format":"prettier --write src/**/*.{ts,tsx}","test:run":"jest --ci","test:watch":"jest --watch","config:init":"node -e \"const fs=require('fs');const path=require('path');if(fs.existsSync('in-app-chat.config.js')){console.log('in-app-chat.config.js already exists');process.exit(1);}fs.copyFileSync(path.join(__dirname,'templates','in-app-chat.config.template.js'),'in-app-chat.config.js');console.log('✅ Created in-app-chat.config.js from template');\"","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e9b2291d-47bd-43fc-b81b-2e4a90a9e83f"}},"_resolved":"/home/runner/work/tools/tools/packages/service/in-app-chat/bernierllc-in-app-chat-4.0.0.tgz","_integrity":"sha512-qkjkMH2Vap3M2DiiV1nZTyS4mgWVjw/mBIA6pw/TUNo+SiE/G2imXwjuQmwWSgoJ07O5HRMyxewOfSX976wqWA==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"12.0.1","description":"A generic, role-based in-app chat system for Next.js applications","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^3.22.0","clsx":"^2.0.0","cosmiconfig":"^8.0.0","lucide-react":"^0.294.0","tailwind-merge":"^2.0.0","@radix-ui/react-tabs":"^1.0.4","@radix-ui/react-avatar":"^1.0.4","@radix-ui/react-dialog":"^1.0.5","@bernierllc/file-handler":"0.8.0","class-variance-authority":"^0.7.0","@bernierllc/html-sanitizer":"1.5.0","@radix-ui/react-scroll-area":"^1.0.5","@bernierllc/neverhub-adapter":"0.4.1","@radix-ui/react-dropdown-menu":"^2.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.4.0","prettier":"^3.0.0","typescript":"^5.0.0","@types/jest":"^29.5.14","@types/node":"^20.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","eslint-plugin-react":"^7.0.0","@testing-library/dom":"^10.4.0","@testing-library/react":"^16.1.0","eslint-config-prettier":"^9.0.0","jest-environment-jsdom":"^29.7.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^6.0.0","eslint-plugin-react-hooks":"^4.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"next":"^14.0.0","react":"^19.1.0","react-dom":"^19.1.0"},"_npmOperationalInternal":{"tmp":"tmp/in-app-chat_4.0.0_1784045427025_0.802503599231774","host":"s3://npm-registry-packages-npm-production"}},"4.0.1":{"_id":"@bernierllc/in-app-chat@4.0.1","bin":{"in-app-chat":"bin/setup.js"},"bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"2068e5d3a31c5270a86e41d5de01c2b558afd1f3","tarball":"https://registry.npmjs.org/@bernierllc/in-app-chat/-/in-app-chat-4.0.1.tgz","fileCount":43,"integrity":"sha512-+pGY+RJmSeBy0R1ZvUJpgBuj76JDJKkPBHC8Re225iOvuvY9o9R+q2c+O4Xy9N1zRMRN/xrTfwtVWUXc5PLu9w==","signatures":[{"sig":"MEQCIGpPvnXOrAy3BGR8H/9M1EwYYntW0TzHIAVw8SCTLRcIAiBxVj2wBS3pLqzw+6ETtWhzXWRZkcKY/n1Vjwyi82xW8Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDppLjviSeCs+TXJLIY7KBXwGvOpzM6UnIHPn57TTJ3wAIgGRWg6Mb8meA01V/HBN6qwbN1nvIOaSzxkIig7XYKQOA="}],"unpackedSize":213070},"main":"src/index.ts","name":"@bernierllc/in-app-chat","_from":"file:bernierllc-in-app-chat-4.0.1.tgz","types":"src/index.ts","author":{"name":"EarnLearn Team"},"license":"MIT","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"tsc","format":"prettier --write src/**/*.{ts,tsx}","test:run":"jest --ci","test:watch":"jest --watch","config:init":"node -e \"const fs=require('fs');const path=require('path');if(fs.existsSync('in-app-chat.config.js')){console.log('in-app-chat.config.js already exists');process.exit(1);}fs.copyFileSync(path.join(__dirname,'templates','in-app-chat.config.template.js'),'in-app-chat.config.js');console.log('✅ Created in-app-chat.config.js from template');\"","test:coverage":"jest --coverage"},"version":"4.0.1","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"e9b2291d-47bd-43fc-b81b-2e4a90a9e83f"}},"homepage":"https://github.com/bernier-llc/tools#readme","keywords":["nextjs","in-app-chat","chat","messaging","real-time","role-based","typescript","tailwindcss"],"_resolved":"/home/runner/work/tools/tools/packages/service/in-app-chat/bernierllc-in-app-chat-4.0.1.tgz","_integrity":"sha512-+pGY+RJmSeBy0R1ZvUJpgBuj76JDJKkPBHC8Re225iOvuvY9o9R+q2c+O4Xy9N1zRMRN/xrTfwtVWUXc5PLu9w==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"12.2.0","description":"A generic, role-based in-app chat system for Next.js applications","directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_nodeVersion":"24.21.0","dependencies":{"zod":"^3.22.0","clsx":"^2.0.0","cosmiconfig":"^8.0.0","lucide-react":"^0.294.0","tailwind-merge":"^2.0.0","@radix-ui/react-tabs":"^1.0.4","@radix-ui/react-avatar":"^1.0.4","@radix-ui/react-dialog":"^1.0.5","@bernierllc/file-handler":"^0.8.0","class-variance-authority":"^0.7.0","@bernierllc/html-sanitizer":"^1.5.0","@radix-ui/react-scroll-area":"^1.0.5","@bernierllc/neverhub-adapter":"^0.4.1","@radix-ui/react-dropdown-menu":"^2.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.4.0","prettier":"^3.0.0","typescript":"^5.0.0","@types/jest":"^29.5.14","@types/node":"^20.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","eslint-plugin-react":"^7.0.0","@testing-library/dom":"^10.4.0","@testing-library/react":"^16.1.0","eslint-config-prettier":"^9.0.0","jest-environment-jsdom":"^29.7.0","@testing-library/jest-dom":"^6.6.3","@typescript-eslint/parser":"^6.0.0","eslint-plugin-react-hooks":"^4.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"next":"^14.0.0","react":"^19.1.0","react-dom":"^19.1.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/in-app-chat_4.0.1_1790884517387_0.6680468678038445"}}},"time":{"created":"2025-12-18T19:51:20.189Z","modified":"2026-10-01T19:55:17.676Z","2.0.0":"2025-12-18T19:51:20.475Z","2.0.1":"2025-12-21T00:25:52.471Z","2.0.2":"2025-12-21T02:18:48.254Z","2.0.3":"2025-12-22T20:00:16.035Z","2.2.0":"2026-01-05T19:46:40.517Z","2.2.1":"2026-03-09T17:43:54.791Z","2.2.2":"2026-03-10T17:26:49.680Z","2.3.0":"2026-05-19T20:14:35.277Z","2.4.0":"2026-05-20T01:49:16.075Z","2.6.0":"2026-05-20T03:21:06.956Z","2.7.0":"2026-05-20T04:15:03.801Z","2.8.0":"2026-05-27T00:13:34.953Z","3.0.0":"2026-07-14T07:58:39.572Z","4.0.0":"2026-07-14T16:10:27.297Z","4.0.1":"2026-10-01T19:55:17.481Z"},"bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"author":{"name":"EarnLearn Team"},"license":"MIT","homepage":"https://github.com/bernier-llc/tools#readme","keywords":["nextjs","in-app-chat","chat","messaging","real-time","role-based","typescript","tailwindcss"],"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"description":"A generic, role-based in-app chat system for Next.js applications","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/in-app-chat\n\nA drop-in, role-based in-app messaging suite for Next.js applications. Bring your own data store and permission policy; the package supplies the React provider, hooks, and UI components. External platform bridging (Slack, Discord, Teams) and NeverHub slash-command routing are also included.\n\n> **Note:** Roles are fully configurable. You can use any string for roles (e.g., `'user'`, `'admin'`, `'moderator'`) and configure permissions as needed. No roles are hardcoded.\n\n## Naming migration — canonical `InAppChat*` naming\n\n`2.9.0` renamed the package-identity public API from `Messaging*`/`MESSAGING_*`/`messaging.config.*`\nto canonical `InAppChat*`/`IN_APP_CHAT_*`/`in-app-chat.config.*` to match the package name, keeping\nevery old name as a working `@deprecated` alias. **`3.0.0` removes those aliases** — only the canonical\nnames below remain. If you are upgrading from `2.9.x` or earlier, rename any `Messaging*` symbol using\nthis map. (Legacy `MESSAGING_*` env vars and `messaging.config.*` files are still read for runtime\nconfig, with a one-time deprecation warning.)\n\n| Surface | Removed in 3.0.0 (was) | Canonical (use this) |\n|---|---|---|\n| Provider | `MessagingProvider` | `InAppChatProvider` |\n| Hook | `useMessaging` | `useInAppChat` |\n| Constants | `MESSAGING_CONSTANTS` | `IN_APP_CHAT_CONSTANTS` |\n| Config loader | `loadMessagingConfiguration`, `loadMessagingConfigurationWithSources`, `getMessagingEnvironmentDocumentation`, `MessagingConfigurationLoader` | `loadInAppChatConfiguration`, `loadInAppChatConfigurationWithSources`, `getInAppChatEnvironmentDocumentation`, `InAppChatConfigurationLoader` |\n| Config schema | `messagingConfigSchema`, `validateMessagingConfig` | `inAppChatConfigSchema`, `validateInAppChatConfig` |\n| Config types | `MessagingRuntimeConfig`, `ResolvedMessagingConfig`, `MessagingConfig`, `MessagingProviderProps`, `UseMessagingReturn`, `MessagingStats`, `MessagingError`, `MessagingEvent`, `MessagingTheme`, `MessagingPermissions` | `InAppChatRuntimeConfig`, `ResolvedInAppChatConfig`, `InAppChatConfig`, `InAppChatProviderProps`, `UseInAppChatReturn`, `InAppChatStats`, `InAppChatErrorInfo`, `InAppChatEvent`, `InAppChatTheme`, `InAppChatPermissions` |\n| Env vars | `MESSAGING_*` | `IN_APP_CHAT_*` (legacy `MESSAGING_*` still read, with a one-time deprecation warning) |\n| Config file | `messaging.config.{js,json}` | `in-app-chat.config.{js,cjs,json}` (legacy still discovered, with a one-time deprecation warning) |\n\n> Domain names that describe chat concepts — `Message`, `MessageThread`, `MessagesPage`,\n> `MessageInput`, `useConversations`, `sendMessage`, etc. — are **not** renamed; they remain\n> the canonical API.\n\n## 3.0.0 — Breaking Changes\n\nThe following APIs are **removed** in 3.0.0. Replace them before upgrading.\n\n| Removed | Why / Migration |\n|---|---|\n| Deprecated `Messaging*` / `MESSAGING_CONSTANTS` / `messaging*Config*` aliases | The `2.9.0` `@deprecated` aliases are removed. Rename to the canonical `InAppChat*` / `IN_APP_CHAT_CONSTANTS` / `inAppChat*Config*` symbols using the [naming migration map](#naming-migration--canonical-inappchat-naming) above. |\n| `encryptMessage` / `decryptMessage` | These were `btoa`/`atob` base64 wrappers, never a security guarantee. At-rest and in-transit encryption belong to your `MessageStore` / `RealTimeTransport` implementation. Remove calls — there is no replacement in this package. |\n| `inAppChatApi` / `createInAppChatApi` (and 2.9.0 aliases `messagingApi` / `createMessagingApi`) | The `api/*` entry-point is removed. An HTTP boundary is now a `MessageStore` whose methods `fetch` your own routes. See the [HTTP-backed store example](#http-backed-store) below. |\n| `createDatabaseConnection` / `runMigrations` / `seedDatabase` | The `database/*` entry-point is removed. Replaced by the `MessageStore` port — implement it against your DB of choice. `InMemoryMessageStore` is the reference. |\n| `InAppChatProviderProps.config` | The provider shape changed from `{ config: { roles, permissions, database, ... } }` to `{ store, policy, currentUser, transport?, children }`. Update your provider instantiation. |\n| `validateMessagePermissions(role, permission)` (old positional signature) | Now `validateMessagePermissions(policy: PermissionPolicy, role: string, action: ChatPermission): boolean`. Pass the injected `policy` as the first argument. |\n\n---\n\n## Features\n\n- **Role-based messaging** — Different interfaces and features for different user types\n- **Real-time updates** — Live message delivery via the optional `RealTimeTransport` port\n- **File attachments** — Support for documents and media sharing\n- **Message templates** — Role-specific pre-written messages\n- **Bulk messaging** — Send messages to multiple recipients\n- **Search and filtering** — Advanced conversation management\n- **Responsive design** — Works on desktop and mobile\n- **Accessibility** — WCAG 2.1 AA compliant\n- **Customizable** — Easy to theme and extend\n- **External Integrations** — Slack, Discord, Teams bridging with user mapping\n- **Slash Commands** — Dynamic command routing via NeverHub service discovery\n- **Live Configuration** — Admin UI toggles for features and integrations\n- **Service Discovery** — Auto-register commands when packages come online\n\n---\n\n## Quick Start\n\n### 1. Install\n\n```bash\nnpm install @bernierllc/in-app-chat\n```\n\n### 2. Define a permission policy\n\n```typescript\nimport type { PermissionPolicy } from '@bernierllc/in-app-chat';\n\nconst policy: PermissionPolicy = {\n  roles: {\n    admin: ['send', 'delete', 'createTemplate', 'bulkSend'],\n    user: ['send'],\n    viewer: [],\n  },\n};\n```\n\n### 3. Create a store\n\nFor getting started quickly, use the shipped `InMemoryMessageStore`:\n\n```typescript\nimport { InMemoryMessageStore } from '@bernierllc/in-app-chat';\n\nconst store = new InMemoryMessageStore({\n  conversations: [\n    {\n      conversationId: 'conv-1',\n      participants: [{ id: 'user-1', role: 'admin', name: 'Alice' }],\n      lastMessage: 'Hello!',\n      timestamp: new Date().toISOString(),\n      unread: 0,\n    },\n  ],\n});\n```\n\n### 4. Mount the provider\n\n`store` and `policy` come from steps 2–3 above.\n\n```tsx\n// app/layout.tsx\nimport { InAppChatProvider } from '@bernierllc/in-app-chat';\n\nexport default function RootLayout({ children }: { children: React.ReactNode }) {\n  const currentUser = { id: 'user-1', role: 'admin' }; // from your auth layer\n\n  return (\n    <html lang=\"en\">\n      <body>\n        <InAppChatProvider\n          store={store}\n          policy={policy}\n          currentUser={currentUser}\n        >\n          {children}\n        </InAppChatProvider>\n      </body>\n    </html>\n  );\n}\n```\n\n### 5. Consume via context\n\n```tsx\nimport { useInAppChatContext } from '@bernierllc/in-app-chat';\n\nexport function ChatPanel() {\n  const { conversations, loading, error, sendMessage, selectConversation } = useInAppChatContext();\n\n  if (loading) return <p>Loading…</p>;\n  if (error)   return <p>Error: {error.message}</p>;\n\n  return (\n    <ul>\n      {conversations.map(c => (\n        <li key={c.conversationId} onClick={() => selectConversation(c.conversationId)}>\n          {c.lastMessage}\n        </li>\n      ))}\n    </ul>\n  );\n}\n```\n\n### 6. Add messaging components to your navigation\n\n```tsx\nimport { MessagesIcon, MessagesDropdown } from '@bernierllc/in-app-chat';\n\nexport function Navigation() {\n  return (\n    <nav>\n      <MessagesIcon />\n      <MessagesDropdown />\n    </nav>\n  );\n}\n```\n\n### 7. Full messaging page\n\n```tsx\nimport { MessagesPage } from '@bernierllc/in-app-chat';\n\nexport default function Messages() {\n  return <MessagesPage />;\n}\n```\n\n---\n\n## Provider Props\n\n```typescript\ninterface InAppChatProviderProps {\n  store: MessageStore;                        // required — the ONLY data seam\n  policy: PermissionPolicy;                   // required — role → permissions data\n  currentUser: { id: string; role: string };  // required\n  transport?: RealTimeTransport;              // optional — live updates; absent ⇒ no crash\n  children: React.ReactNode;\n}\n```\n\n---\n\n## Adapter Ports\n\n### `MessageStore` (required)\n\nThe persistence port. Back it with your database, an external API, or `InMemoryMessageStore`.\n\n```typescript\ninterface MessageStore {\n  getConversations(userId: string, filters?: ConversationFilters): Promise<ConversationListItem[]>;\n  getThread(conversationId: string): Promise<MessageThread | null>;\n  sendMessage(input: SendMessageInput): Promise<Message>;\n  markRead(conversationId: string, userId: string): Promise<void>;\n  listTemplates(ownerId: string): Promise<MessageTemplate[]>;\n  createTemplate(input: MessageTemplate): Promise<MessageTemplate>;\n  updateTemplate(id: string, updates: Partial<Omit<MessageTemplate, 'id'>>): Promise<MessageTemplate>;\n  deleteTemplate(id: string): Promise<void>;\n}\n\n// sendMessage input shape\ninterface SendMessageInput {\n  conversationId: string;\n  senderId: string;\n  body: string;\n  attachments?: MessageAttachment[];\n}\n```\n\n### `RealTimeTransport` (optional)\n\nPass this to get live message delivery. Omit it and the provider works in poll/refresh mode with no crash.\n\n```typescript\ninterface RealTimeTransport {\n  subscribe(conversationId: string, onMessage: (msg: Message) => void): () => void;\n  // return value is the unsubscribe function — the provider calls it on cleanup\n}\n```\n\n### `PermissionPolicy` (required)\n\nPlain data — a role-to-permissions map. The package evaluates it internally.\n\n```typescript\ntype ChatPermission = 'send' | 'delete' | 'createTemplate' | 'bulkSend';\n\ninterface PermissionPolicy {\n  roles: Record<string, ChatPermission[]>;\n}\n\n// Example\nconst policy: PermissionPolicy = {\n  roles: {\n    admin:  ['send', 'delete', 'createTemplate', 'bulkSend'],\n    user:   ['send'],\n    viewer: [],\n  },\n};\n```\n\n---\n\n## Bring Your Own Store\n\n### `InMemoryMessageStore` — reference implementation\n\n`InMemoryMessageStore` is a **real, exported implementation** (not a mock). Use it to get running immediately, and read its source as the canonical reference for how to implement a DB-backed store.\n\n```typescript\nimport { InMemoryMessageStore } from '@bernierllc/in-app-chat';\n\nconst store = new InMemoryMessageStore({\n  conversations: [...],  // seed data, optional\n  threads:       [...],  // optional\n  templates:     [...],  // optional\n});\n```\n\n### DB-backed store\n\nFor production, implement `MessageStore` against your database. `@bernierllc/database-adapter-core` is a suggested base.\n\n```typescript\nimport type { MessageStore, SendMessageInput } from '@bernierllc/in-app-chat';\n\nexport class PostgresMessageStore implements MessageStore {\n  constructor(private db: YourDbClient) {}\n\n  async getConversations(userId, filters) { /* SELECT … */ }\n  async getThread(conversationId) { /* SELECT … */ }\n  async sendMessage(input: SendMessageInput) { /* INSERT … */ }\n  async markRead(conversationId, userId) { /* UPDATE … */ }\n  // … listTemplates, createTemplate, updateTemplate, deleteTemplate\n}\n```\n\n### HTTP-backed store\n\nThere is no shipped HTTP client or route factory. An HTTP boundary is simply a `MessageStore` whose methods call your own routes:\n\n```typescript\nexport class ApiMessageStore implements MessageStore {\n  constructor(private baseUrl: string) {}\n\n  async getConversations(userId) {\n    const res = await fetch(`${this.baseUrl}/api/chat/conversations?userId=${userId}`);\n    return res.json();\n  }\n\n  async sendMessage(input: SendMessageInput) {\n    const res = await fetch(`${this.baseUrl}/api/chat/messages`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(input),\n    });\n    return res.json();\n  }\n\n  // … implement the remaining methods against your routes\n}\n```\n\n---\n\n## `useInAppChatContext()` — context value\n\n```typescript\ninterface InAppChatContextValue {\n  store: MessageStore;\n  conversations: ConversationListItem[];\n  loading: boolean;\n  error: Error | null;\n  selectedConversationId: string | null;\n  selectConversation: (id: string) => void;\n  sendMessage: (conversationId: string, body: string) => Promise<Message | undefined>;\n}\n```\n\n---\n\n## External Platform Integrations\n\n### Slack Integration\n\nEnable bidirectional messaging with Slack workspaces:\n\n```typescript\n// in-app-chat.config.js\nmodule.exports = {\n  integrations: {\n    slack: {\n      enabled: true,\n      userMapping: 'external',    // Show Slack users as \"external\" in browser\n      bidirectional: true,        // Messages flow both ways\n      slashCommands: true,        // Enable slash commands in Slack\n      socketMode: true,           // Use Socket Mode for real-time\n      channelWhitelist: ['#general', '#support']\n    }\n  }\n};\n```\n\n**Required Environment Variables:**\n```bash\nSLACK_BOT_TOKEN=xoxb-your-bot-token\nSLACK_SIGNING_SECRET=your-signing-secret\n```\n\n**Install Integration Package:**\n```bash\nnpm install @bernierllc/chat-integration-slack\n```\n\n### Discord Integration\n\n```bash\nnpm install @bernierllc/chat-integration-discord\n```\n\n### Microsoft Teams Integration\n\n```bash\nnpm install @bernierllc/chat-integration-teams\n```\n\n---\n\n## Slash Commands via NeverHub\n\n### Dynamic Command Registration\n\nCommands are automatically discovered and registered when their packages come online:\n\n```typescript\n// in-app-chat.config.js\nmodule.exports = {\n  slashCommands: {\n    '/task': {\n      enabled: true,\n      package: '@bernierllc/slash-commands-tasks',\n      description: 'Create and manage tasks',\n      requiresAuth: true,\n      platforms: ['in-app', 'slack', 'discord'],\n      aliases: ['/tasks', '/todo']\n    },\n    '/schedule': {\n      enabled: true,\n      package: '@bernierllc/slash-commands-calendar',\n      description: 'Schedule meetings and events'\n    }\n  }\n};\n```\n\n### Available Slash Command Packages\n\n```bash\nnpm install @bernierllc/slash-commands-tasks\nnpm install @bernierllc/slash-commands-calendar\nnpm install @bernierllc/slash-commands-auth\n```\n\n### Service Discovery Flow\n\n1. **in-app-chat** registers with NeverHub as command router\n2. Command packages register their capabilities with NeverHub\n3. **in-app-chat** automatically discovers and registers commands\n4. Commands work across all enabled platforms (in-app, Slack, Discord, Teams)\n5. When packages go offline, commands are automatically deregistered\n\n### Admin UI Integration\n\n- **Enable/disable** individual slash commands\n- **Toggle integrations** (Slack, Discord, Teams) on/off\n- **Manage permissions** for role-based command access\n- **View integration status** and health monitoring\n\n---\n\n## Components\n\n### Core Components\n\n- `InAppChatProvider` — Main provider component\n- `MessagesIcon` — Navigation icon with unread count\n- `MessagesDropdown` — Quick access dropdown\n- `MessagesPage` — Full messaging interface\n- `ConversationList` — List of conversations\n- `MessageThread` — Message thread view\n- `MessageInput` — Message input component\n- `MessageBubble` — Individual message display\n\n### Role-Specific Components\n\n- `RoleBasedFilters` — Role-specific filtering\n- `BulkMessageModal` — Bulk messaging interface\n- `TemplateSelector` — Message template selector\n- `FileUpload` — File attachment component\n- `MessageSearch` — Search functionality\n\n---\n\n## Customization\n\n### Styling\n\n```typescript\n// tailwind.config.js\nmodule.exports = {\n  content: [\n    './src/**/*.{js,ts,jsx,tsx}',\n    './node_modules/@bernierllc/in-app-chat/dist/**/*.{js,ts,jsx,tsx}',\n  ],\n  theme: {\n    extend: {\n      colors: {\n        messaging: {\n          primary: '#3b82f6',\n          secondary: '#64748b',\n          success: '#10b981',\n          warning: '#f59e0b',\n          error: '#ef4444',\n        },\n      },\n    },\n  },\n};\n```\n\n### Custom Components\n\n```tsx\nimport { MessageBubble, MessageBubbleProps } from '@bernierllc/in-app-chat';\n\nexport function CustomMessageBubble(props: MessageBubbleProps) {\n  return (\n    <div className=\"custom-message-bubble\">\n      <MessageBubble {...props} />\n    </div>\n  );\n}\n```\n\n---\n\n## Performance\n\n- **Code splitting** — Only loads components when needed\n- **Virtual scrolling** — Handles large message lists efficiently\n- **Optimistic updates** — Immediate UI feedback\n- **Efficient caching** — Reduces store calls\n- **Bundle optimization** — Minimal impact on app size\n\n## Security\n\n- **Access validation** — Role-based permissions evaluated via injected `PermissionPolicy`\n- **Input sanitization** — XSS protection applied by the provider before persistence\n- **Rate limiting** — Prevents abuse\n- **Audit logging** — Track all activities\n\n> **At-rest / in-transit encryption** belongs in your `MessageStore` and `RealTimeTransport`\n> implementations, not in this package. The old `encryptMessage`/`decryptMessage` helpers\n> (base64 only, never a security guarantee) were removed in 3.0.0.\n\n---\n\n## Support\n\n- [Documentation](./docs/)\n- [Installation Guide](./INSTALLATION.md)\n- [Examples](./examples/)\n- [Issue Tracker](https://github.com/your-org/app-messaging/issues)\n\n## License\n\nMIT License - see [LICENSE](./LICENSE) for details.\n\n## Monorepo Workspaces & Dependency Management\n\nThis package is part of a monorepo using npm workspaces. All dependencies are hoisted to the root. Always run `npm install` from the root directory.\n\n## React 19 and Testing Library Compatibility\n\nThis package uses React 19.1.0. If you see peer dependency warnings with Testing Library, use:\n\n```bash\nnpm install --legacy-peer-deps\n```\n\nThis is a temporary workaround until official support is released.\n","readmeFilename":"README.md"}