{"_id":"@brain-ai/teams-bot","_rev":"38-67d28968ee6fa1d17b4e58b0b55a2a34","name":"@brain-ai/teams-bot","dist-tags":{"latest":"0.0.42"},"versions":{"0.0.5":{"name":"@brain-ai/teams-bot","version":"0.0.5","_id":"@brain-ai/teams-bot@0.0.5","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"9b6dd0ff183f0eddc8d14e916c9b23a94e6f6d75","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.5.tgz","fileCount":410,"integrity":"sha512-lfmEkPC852X8hnoYt+ULTgv+EfiRbzUsVsMc/0uHHfB0XW6YejBz5fZ8YXCy+Y9EUFVgnRe0BHNnw5mG5acNyQ==","signatures":[{"sig":"MEUCIQDE4wP8RqstrEXDOXwu9+pwRYkgb+nVOUVFLmIZa/K0HgIgUXyA4W9fDkSVIfMh9241bIUmhDRWP+vObhPdBWTcd/w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1120356},"engines":{"node":">=22.13.0"},"gitHead":"1d6f5085afc668bf486c6c921d44b2bb564f12d5","scripts":{"postinstall":"node scripts/postinstall.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","pm2":"^5.4.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.5_1776826625196_0.7035177453508712","host":"s3://npm-registry-packages-npm-production"}},"0.0.6":{"name":"@brain-ai/teams-bot","version":"0.0.6","_id":"@brain-ai/teams-bot@0.0.6","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"ab2bab0aaecac25b6a5246c92d8e636a09573e31","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.6.tgz","fileCount":410,"integrity":"sha512-Zi4LXi+qzJBoouTl497id8+6B1BM77gZz9lJ3ZyzsLLf/fwAxpfYh0lKrWX5Y6XfMahJHRpQvR7ujzDwf/Ielw==","signatures":[{"sig":"MEUCIQCnQmCFydWc0VbVHLMDBi6mJmm/uP6R1bXJqlbeLt9aUgIgZArfyRPR+6pIuw2LLds6T6zY1TxIJhVeVl0DpEU6vX8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1120432},"engines":{"node":">=22.13.0"},"gitHead":"1d6f5085afc668bf486c6c921d44b2bb564f12d5","scripts":{"postinstall":"node scripts/postinstall.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"overrides":{"fsevents":"npm:@favware/skip-dependency@latest"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","pm2":"^5.4.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.6_1776828031102_0.2154803556330367","host":"s3://npm-registry-packages-npm-production"}},"0.0.7":{"name":"@brain-ai/teams-bot","version":"0.0.7","_id":"@brain-ai/teams-bot@0.0.7","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"19ca00c3c7b1d0f220eb9e7320c9ad3f848c3af3","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.7.tgz","fileCount":407,"integrity":"sha512-NIazLK3JWF+kQNVYxHkMIvBVE5Sdqoj9u0PAxFSoW4ydd/pleiMEmKAdA6kAnMAaJ80DmBUeS8wjIiCa54ircw==","signatures":[{"sig":"MEUCIQCyUhAjx79q1VlvETggALFNtGhDgbXZXilW+HEXuZX0NgIgStxGr20aXhmGyf/NIByltWvoUULM3LJrf6NBoQ7d4xc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1113494},"engines":{"node":">=22.13.0"},"gitHead":"1d6f5085afc668bf486c6c921d44b2bb564f12d5","scripts":{"postinstall":"node scripts/postinstall.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","pidusage":"^3.0.2","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.7_1776832019284_0.6727000321832486","host":"s3://npm-registry-packages-npm-production"}},"0.0.8":{"name":"@brain-ai/teams-bot","version":"0.0.8","_id":"@brain-ai/teams-bot@0.0.8","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"91b23f526e34bd10a061137b6e2fb6129feae78a","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.8.tgz","fileCount":407,"integrity":"sha512-+XzHI6ccrcyED1mHrv7MP5D+tSUohqFJtEIXzQlDxOO6vVtQedb0lSRrwbDf2wENi1xytAlNjgNS9XJr/Lrp1A==","signatures":[{"sig":"MEUCIQCi9poiiesrZWKYz3gPun8GTG0rZUa87gNo9ffrlEP2LQIgVpGxxR7VY/ZcGyO5N9CaQQDRt1jB1yyKmrhLck81guk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1112380},"engines":{"node":">=22.13.0"},"gitHead":"1d6f5085afc668bf486c6c921d44b2bb564f12d5","scripts":{"postinstall":"node scripts/postinstall.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.8_1776832247372_0.8153908020569964","host":"s3://npm-registry-packages-npm-production"}},"0.0.9":{"name":"@brain-ai/teams-bot","version":"0.0.9","_id":"@brain-ai/teams-bot@0.0.9","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"dfaffa727309bd6a773e8fad86b1cfe9216951e1","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.9.tgz","fileCount":200,"integrity":"sha512-8PadyWG7efYVxrWTUA8hO9QqlcnKur+A0qGQ8x+/3h+xUcjaezQFyIRJMzA5LKCa/bT5Op/9QVdl62S+aF/h7Q==","signatures":[{"sig":"MEUCIQDgxUVI1dHic6TUUV/8B0916maITXLYComkKqa3KwwAtQIgLiDN+zHjC7RvlRLCNOH3CBgGv4jBGtTU4Wrijb1oYFc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":494129},"engines":{"node":">=22.13.0"},"gitHead":"4a6bd36da82c3b0bba9e2ac1127823902c629b88","scripts":{"dev":"tsc --watch","test":"cd local-server && npm test","build":"npm run clean && cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","clean":"rimraf dist shared/dist bot-app/lib local-server/lib","prepare":"cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","pack:dist":"node scripts/pack.js","pack:deploy":"node scripts/pack-deploy.js","postinstall":"node scripts/postinstall.js","publish:npm":"node scripts/publish-npm.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.3","typescript":"~5.8.3","@types/node":"^20.0.0","@types/archiver":"^6.0.0"},"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.9_1776838289973_0.6011070729232597","host":"s3://npm-registry-packages-npm-production"}},"0.0.10":{"name":"@brain-ai/teams-bot","version":"0.0.10","_id":"@brain-ai/teams-bot@0.0.10","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"a4d92c7b156cca88aac9a63603da91f7876ecf31","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.10.tgz","fileCount":344,"integrity":"sha512-lSOi8QdsjwvfkrN37EGKdfDPfJI01fIsDj+zB133FvJmkpwafLRahGjya0+EyawzgcDxHtZx19xQgVWPB4yaYQ==","signatures":[{"sig":"MEUCIQDHja6CcB5psSLPRBsB3XJ5Hwa4LXplRfNDK6RHPVwUygIgP19Ats9bUhsxLa3HKRHifbNdqFXNKacrT3W/wIJwfRY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":869666},"engines":{"node":">=22.13.0"},"gitHead":"152d6cfefd78baa23de1edc7dff74260dbea7624","scripts":{"dev":"tsc --watch","test":"cd local-server && npm test","build":"npm run clean && cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","clean":"rimraf dist shared/dist bot-app/lib local-server/lib","prepare":"cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","pack:dist":"node scripts/pack.js","pack:deploy":"node scripts/pack-deploy.js","postinstall":"node scripts/postinstall.js","publish:npm":"node scripts/publish-npm.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.3","typescript":"~5.8.3","@types/node":"^20.0.0","@types/archiver":"^6.0.0"},"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.10_1776839493370_0.6872386531848229","host":"s3://npm-registry-packages-npm-production"}},"0.0.11":{"name":"@brain-ai/teams-bot","version":"0.0.11","_id":"@brain-ai/teams-bot@0.0.11","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"5683c3b5d1d319475361156c163ed7e9eeda72b1","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.11.tgz","fileCount":344,"integrity":"sha512-RL07YlmmJWxHAULqihhW59oP+sRoII2XROqiYoWcEGMCr+gFkF63N/dEzA7YcgGjALFYd7E1U9sGBetduc7x1A==","signatures":[{"sig":"MEYCIQDF/ByuNcAeZlNo8q7Dqmg/TKhnY6hR0bXazFscF+H/+AIhAICA1Ex9/4CTbhdQUakBgB2qOS8DsCxK4YdEGNnfTS3S","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":870621},"engines":{"node":">=22.13.0"},"gitHead":"979444e635f5aeb53fe7d5e3cb8e486115d12f6d","scripts":{"dev":"tsc --watch","test":"cd local-server && npm test","build":"npm run clean && cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","clean":"rimraf dist shared/dist bot-app/lib local-server/lib","prepare":"cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","pack:dist":"node scripts/pack.js","pack:deploy":"node scripts/pack-deploy.js","postinstall":"node scripts/postinstall.js","publish:npm":"node scripts/publish-npm.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.3","typescript":"~5.8.3","@types/node":"^20.0.0","@types/archiver":"^6.0.0"},"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.11_1776841316988_0.17095075768564327","host":"s3://npm-registry-packages-npm-production"}},"0.0.12":{"name":"@brain-ai/teams-bot","version":"0.0.12","_id":"@brain-ai/teams-bot@0.0.12","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"d1f879c79a6b5e4dde9da57a19c3085623e60248","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.12.tgz","fileCount":344,"integrity":"sha512-Lqrbyi0L3ca5fsnc8v0zIlBpDqo0ja3LyW2FOg4y+pDIY9pYxSNCbd5+/mL2hmuSCvjEAm1HsPrERSn8/RR6qg==","signatures":[{"sig":"MEUCICNkF0Tbr6GfkzMO3cgPuVPpQLnMum62q/CXefHPlKAiAiEAskBWaUDdsy+ZkqFUITTpmXy9Jy8CIaFqgfi5AkvONV8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":871080},"engines":{"node":">=22.13.0"},"gitHead":"979444e635f5aeb53fe7d5e3cb8e486115d12f6d","scripts":{"dev":"tsc --watch","test":"cd local-server && npm test","build":"npm run clean && cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","clean":"rimraf dist shared/dist bot-app/lib local-server/lib","prepare":"cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","pack:dist":"node scripts/pack.js","pack:deploy":"node scripts/pack-deploy.js","postinstall":"node scripts/postinstall.js","publish:npm":"node scripts/publish-npm.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.3","typescript":"~5.8.3","@types/node":"^20.0.0","@types/archiver":"^6.0.0"},"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.12_1776841929795_0.8683752059009164","host":"s3://npm-registry-packages-npm-production"}},"0.0.13":{"name":"@brain-ai/teams-bot","version":"0.0.13","_id":"@brain-ai/teams-bot@0.0.13","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"9c12a82ad3032ad438e485c6e1b33a1db7e9d3d8","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.13.tgz","fileCount":344,"integrity":"sha512-e8iFJL5iSW+PK27uRY/WeV9KOKZgBjSuyeuZ9iLJPYK4NtBTdRhFgK5BNRX64KflTwFTLhrWgmYTBXYjtLwGvA==","signatures":[{"sig":"MEQCIHW1Wvr80ppxSg+XWncuRGU7N6vP6T4tQCaOo15HvceRAiAbkE5F72otBSM+dG3DID/JvgAdajJLyh/9faHXVOEAxA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":879303},"engines":{"node":">=22.13.0"},"gitHead":"979444e635f5aeb53fe7d5e3cb8e486115d12f6d","scripts":{"dev":"tsc --watch","test":"cd local-server && npm test","build":"npm run clean && cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","clean":"rimraf dist shared/dist bot-app/lib local-server/lib","prepare":"cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","pack:dist":"node scripts/pack.js","pack:deploy":"node scripts/pack-deploy.js","postinstall":"node scripts/postinstall.js","publish:npm":"node scripts/publish-npm.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.3","typescript":"~5.8.3","@types/node":"^20.0.0","@types/archiver":"^6.0.0"},"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.13_1776849040772_0.5645144780734219","host":"s3://npm-registry-packages-npm-production"}},"0.0.14":{"name":"@brain-ai/teams-bot","version":"0.0.14","_id":"@brain-ai/teams-bot@0.0.14","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"2789cec5f6f90944c4db78d2aca7e0a78ba46904","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.14.tgz","fileCount":344,"integrity":"sha512-7gVgklw361rmkFClrP8UA9rQ4TrBE7pFCm6qz676CJ1JKF7zHiuiK/tN5eLtgjEPTWw8rQVCfqlVv2KQqLPCsA==","signatures":[{"sig":"MEQCIEbsA03K7nBQfcvHZ4/pFPfPn3iDpjqayhxWfwuyBIy3AiBuDNkoraqSDQsdU4YPoUBAsX8/E8s1us/NWCZ5mLGEkw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":881883},"engines":{"node":">=22.13.0"},"gitHead":"979444e635f5aeb53fe7d5e3cb8e486115d12f6d","scripts":{"dev":"tsc --watch","test":"cd local-server && npm test","build":"npm run clean && cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","clean":"rimraf dist shared/dist bot-app/lib local-server/lib","prepare":"cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","pack:dist":"node scripts/pack.js","pack:deploy":"node scripts/pack-deploy.js","postinstall":"node scripts/postinstall.js","publish:npm":"node scripts/publish-npm.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.3","typescript":"~5.8.3","@types/node":"^20.0.0","@types/archiver":"^6.0.0"},"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.14_1776850717995_0.8874349231363374","host":"s3://npm-registry-packages-npm-production"}},"0.0.15":{"name":"@brain-ai/teams-bot","version":"0.0.15","_id":"@brain-ai/teams-bot@0.0.15","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"462d59527bb0db03975e0c2e84e12b3a786512dd","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.15.tgz","fileCount":344,"integrity":"sha512-yxKyORhNA963gQsNm1znxup1NMVPvj8vMUytjTVtDlDjCsnXznn0pd+DE+oo0jyudU3KOXI+Hs6pIszlMs/Yvg==","signatures":[{"sig":"MEYCIQCciRNYdNraxSRLtwAefKYUg3hWq+q9mceSzkxPM8il/QIhAJIWb8p/8dLDBSRfvCAF7rzAGiQ5be4Ht6znCZ+05flE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":882675},"engines":{"node":">=22.13.0"},"gitHead":"979444e635f5aeb53fe7d5e3cb8e486115d12f6d","scripts":{"dev":"tsc --watch","test":"cd local-server && npm test","build":"npm run clean && cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","clean":"rimraf dist shared/dist bot-app/lib local-server/lib","prepare":"cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","pack:dist":"node scripts/pack.js","pack:deploy":"node scripts/pack-deploy.js","postinstall":"node scripts/postinstall.js","publish:npm":"node scripts/publish-npm.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.3","typescript":"~5.8.3","@types/node":"^20.0.0","@types/archiver":"^6.0.0"},"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.15_1776851598362_0.8765676139278633","host":"s3://npm-registry-packages-npm-production"}},"0.0.16":{"name":"@brain-ai/teams-bot","version":"0.0.16","_id":"@brain-ai/teams-bot@0.0.16","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"3e5e1fce3d1b0b408f16c8b590546cd93a445ae0","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.16.tgz","fileCount":344,"integrity":"sha512-p3Qawpfs2ZlwAxw5418RY2WVYz74a9MtfkYQevu9ig7BPc/D7cepN5Q+kqM7PzdFMPi3QdSG3ZvL3EEgjaR2jA==","signatures":[{"sig":"MEUCICvtDH5aRIWtwnv4cnTuDSPXF3yrOZfzqD0CiDIucyovAiEA4YcLtO+xt7b0rKQZUpARh+Pf0zW3wHahdlD4+qCEwFE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":885742},"engines":{"node":">=22.13.0"},"gitHead":"9e84f054d5ce343f88d6fa913ce13738ec4956cb","scripts":{"dev":"tsc --watch","test":"cd local-server && npm test","build":"npm run clean && cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","clean":"rimraf dist shared/dist bot-app/lib local-server/lib","prepare":"cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","pack:dist":"node scripts/pack.js","pack:deploy":"node scripts/pack-deploy.js","postinstall":"node scripts/postinstall.js","publish:npm":"node scripts/publish-npm.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.3","typescript":"~5.8.3","@types/node":"^20.0.0","@types/archiver":"^6.0.0"},"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.16_1776854710902_0.3341346849675808","host":"s3://npm-registry-packages-npm-production"}},"0.0.17":{"name":"@brain-ai/teams-bot","version":"0.0.17","_id":"@brain-ai/teams-bot@0.0.17","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"3e259a091118d347e318b00c212819e0f4855d47","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.17.tgz","fileCount":344,"integrity":"sha512-NkW2LXmPjRgXZgIichs4sXYoow4CnO29AmOxIeW9umCWKpiOysOHNIoZYZK5jcWGQJZgQwoRULIX+GL2oJ1cAA==","signatures":[{"sig":"MEUCIEjxaJ+3FU9dkW5/vLynywqG++XPKnSIXDczvcSJz+JVAiEAsUsqvYa33B+ZEWX4sQvvKZ0jvmd0P8FlpUPVOLoM0Z8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":885742},"engines":{"node":">=22.13.0"},"gitHead":"9e84f054d5ce343f88d6fa913ce13738ec4956cb","scripts":{"dev":"tsc --watch","test":"cd local-server && npm test","build":"npm run clean && cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","clean":"rimraf dist shared/dist bot-app/lib local-server/lib","prepare":"cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","pack:dist":"node scripts/pack.js","pack:deploy":"node scripts/pack-deploy.js","postinstall":"node scripts/postinstall.js","publish:npm":"node scripts/publish-npm.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.3","typescript":"~5.8.3","@types/node":"^20.0.0","@types/archiver":"^6.0.0"},"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.17_1776855089494_0.6031646623350109","host":"s3://npm-registry-packages-npm-production"}},"0.0.18":{"name":"@brain-ai/teams-bot","version":"0.0.18","_id":"@brain-ai/teams-bot@0.0.18","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"76f287b56736219fade1aab0fbb590cf8482f3f2","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.18.tgz","fileCount":344,"integrity":"sha512-ZL8KUUYTRZve14p3iouFy39/mCLh90eGpHAWI9yDFotDSTysn4F5tIAYFwVsf6e6xyB200Z7EMP4yWk4Uq6ufg==","signatures":[{"sig":"MEUCIQDSxP+gFx1knMuiwaE3jnIfceqyV5g72GADH/P+0VnzyQIgPZ25zlH3pnWIbVBjjoc9w+ypCVt1+hz2FTl3WXFmO2E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":886060},"engines":{"node":">=22.13.0"},"gitHead":"9e84f054d5ce343f88d6fa913ce13738ec4956cb","scripts":{"dev":"tsc --watch","test":"cd local-server && npm test","build":"npm run clean && cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","clean":"rimraf dist shared/dist bot-app/lib local-server/lib","prepare":"cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","pack:dist":"node scripts/pack.js","pack:deploy":"node scripts/pack-deploy.js","postinstall":"node scripts/postinstall.js","publish:npm":"node scripts/publish-npm.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.3","typescript":"~5.8.3","@types/node":"^20.0.0","@types/archiver":"^6.0.0"},"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.18_1776855454564_0.30096860529735925","host":"s3://npm-registry-packages-npm-production"}},"0.0.19":{"name":"@brain-ai/teams-bot","version":"0.0.19","_id":"@brain-ai/teams-bot@0.0.19","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"bd81dec7ab603869fd7ccbf393a08d5700190c72","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.19.tgz","fileCount":344,"integrity":"sha512-HmfOHIaYZBFcl1z145keOAl0i5sl/0ugwzsqAcuiyRMP02POSxr8aUJEvg0ckbaEz0AStPjcEhMSDdjOSzzk7w==","signatures":[{"sig":"MEYCIQCBA1GkVZ04pX1y322Q7dQVl+lYGgm59xM4bdm3mbL6IwIhAJW/ayCJTdwuRnUrMOVnmj4Z1i5v+Ta5ZCkT6ZLTn8Cu","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":886550},"engines":{"node":">=22.13.0"},"gitHead":"9e84f054d5ce343f88d6fa913ce13738ec4956cb","scripts":{"postinstall":"node scripts/postinstall.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.19_1776859499912_0.6131788734073977","host":"s3://npm-registry-packages-npm-production"}},"0.0.20":{"name":"@brain-ai/teams-bot","version":"0.0.20","_id":"@brain-ai/teams-bot@0.0.20","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"bec96052f208b6e9936b6b0efd9cd6684765ebe3","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.20.tgz","fileCount":344,"integrity":"sha512-+NMF/Tzg5H2MQKjoxgCTt/q/kiLqS5uawIeCQa3s14FiWrtBwYHR24XYzvZEmsR2V6srPtV4n05jz6nodnTL3g==","signatures":[{"sig":"MEQCID+hHYep2eKejSjPCByD2j9U3/E4DBbf+hWzYSFUWATOAiASI/d9QKTUZqi4xsj0kGnDwWKlYp6nPEVni6yZPtzDmQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":886476},"engines":{"node":">=22.13.0"},"gitHead":"7d5b062bc168a0d4a48f4c643ee20e2ae1992495","scripts":{"postinstall":"node scripts/postinstall.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.20_1776861061183_0.9718498190593612","host":"s3://npm-registry-packages-npm-production"}},"0.0.21":{"name":"@brain-ai/teams-bot","version":"0.0.21","_id":"@brain-ai/teams-bot@0.0.21","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"4d82ab0b5afdc2ce00fe320ab38459153194efa1","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.21.tgz","fileCount":347,"integrity":"sha512-TQ+eQbKjERApm9IvjQ0lQZHhdIDrXuuUQMq5Kjfs2Pho70cpM3Uofh3pehQ2MgiL/7zpZHU9B7QcGgUHgMM7kA==","signatures":[{"sig":"MEUCIQCcnb6KvJTL/2Q01oQzu+2bo4f++EZfeKWMTWDySUjCrwIgEPpF+pjxyKE3bX/ecF0TSqT/GeghCpiWUGNvCA7oTL8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":932566},"engines":{"node":">=22.13.0"},"gitHead":"52212cb2d13f8a4ff29fcded52328a1fd96d908c","scripts":{"dev":"tsc --watch","test":"cd local-server && npm test","build":"npm run clean && cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","clean":"rimraf dist shared/dist bot-app/lib local-server/lib","prepare":"cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","pack:dist":"node scripts/pack.js","pack:deploy":"node scripts/pack-deploy.js","postinstall":"node scripts/postinstall.js","publish:npm":"node scripts/publish-npm.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.3","typescript":"~5.8.3","@types/node":"^20.0.0","@types/archiver":"^6.0.0"},"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.21_1776862194545_0.17410667039341443","host":"s3://npm-registry-packages-npm-production"}},"0.0.22":{"name":"@brain-ai/teams-bot","version":"0.0.22","_id":"@brain-ai/teams-bot@0.0.22","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"fdfc6f7069e151750af72811453539851a562ec2","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.22.tgz","fileCount":347,"integrity":"sha512-0tsOt+u5VVSKkhtHiBLv+Vvg6s2UkPcZydvwELiFEasqkpEX+wG/WCMlvjfKRnYqsPMKGJ4vA2WsVBYSNSnoCA==","signatures":[{"sig":"MEYCIQD1NAKXw7NRGNlPgPHzCJP2m5HY/sY6+agNx226+pxJcAIhANVq2siPJo2ylRWQ4LAn3CMzgwRamLUc12OPji/imUUG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":932594},"engines":{"node":">=22.13.0"},"gitHead":"52212cb2d13f8a4ff29fcded52328a1fd96d908c","scripts":{"dev":"tsc --watch","test":"cd local-server && npm test","build":"npm run clean && cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","clean":"rimraf dist shared/dist bot-app/lib local-server/lib","prepare":"cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","pack:dist":"node scripts/pack.js","pack:deploy":"node scripts/pack-deploy.js","postinstall":"node scripts/postinstall.js","publish:npm":"node scripts/publish-npm.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.3","typescript":"~5.8.3","@types/node":"^20.0.0","@types/archiver":"^6.0.0"},"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.22_1776863338317_0.21335699839668454","host":"s3://npm-registry-packages-npm-production"}},"0.0.23":{"name":"@brain-ai/teams-bot","version":"0.0.23","_id":"@brain-ai/teams-bot@0.0.23","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"3928b12c9364ffa3eee34200e3898d55a55e05e3","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.23.tgz","fileCount":347,"integrity":"sha512-Uqgyd4PLJuRkFbbNzWAC+rrGK5r1XALQP5yM8K/4wUgv+sPkaSQe+jhA5Pxb3lE07pFKnf7j6AHm3BMxlFbVLw==","signatures":[{"sig":"MEYCIQDKHmZh76xgQu+xFOatb5gzzeoCn2MX+osHhW0YKiWkugIhALRE+zC4ytoMQ3pIwcAP9FPCz+OwvxLoMZtwCqR8JdNT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":932676},"engines":{"node":">=22.13.0"},"gitHead":"7ca3489396d794e77a1d0c6b697204352e1d2643","scripts":{"dev":"tsc --watch","test":"cd local-server && npm test","build":"npm run clean && cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","clean":"rimraf dist shared/dist bot-app/lib local-server/lib","prepare":"cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","pack:dist":"node scripts/pack.js","pack:deploy":"node scripts/pack-deploy.js","postinstall":"node scripts/postinstall.js","publish:npm":"node scripts/publish-npm.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.3","typescript":"~5.8.3","@types/node":"^20.0.0","@types/archiver":"^6.0.0"},"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.23_1776864251292_0.5392843903469766","host":"s3://npm-registry-packages-npm-production"}},"0.0.24":{"name":"@brain-ai/teams-bot","version":"0.0.24","_id":"@brain-ai/teams-bot@0.0.24","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"78f002926d2799ea227ccecce417b12026863311","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.24.tgz","fileCount":347,"integrity":"sha512-3F7jTE8RUUMxnYvaQhVmwTFhejjPV50sWa4Vxlo+pawS9ty9MdmcNFoNRGhyeAMv8fvPk33ODy2e46dqRH7gMQ==","signatures":[{"sig":"MEYCIQDM8SVjNr/x7DDMZtSkW+9eVmiDJ0YXKWzDMpwhL/6Y1wIhAOJqOuikqqM7AEcAFHfjK/oFX61GZOdp4IFva5tvzDQ4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":932876},"engines":{"node":">=22.13.0"},"gitHead":"a7f50858dab3bc53e474e7185fdc1d07558ad20e","scripts":{"dev":"tsc --watch","test":"cd local-server && npm test","build":"npm run clean && cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","clean":"rimraf dist shared/dist bot-app/lib local-server/lib","prepare":"cd shared && npm run build && cd .. && tsc && cd bot-app && npm run build && cd ../local-server && npm run build","pack:dist":"node scripts/pack.js","pack:deploy":"node scripts/pack-deploy.js","postinstall":"node scripts/postinstall.js","publish:npm":"node scripts/publish-npm.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.3","typescript":"~5.8.3","@types/node":"^20.0.0","@types/archiver":"^6.0.0"},"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.24_1776867534115_0.9551319336039183","host":"s3://npm-registry-packages-npm-production"}},"0.0.25":{"name":"@brain-ai/teams-bot","version":"0.0.25","_id":"@brain-ai/teams-bot@0.0.25","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"47be04b00e595ec987308bcbb8009eb89a0ffa35","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.25.tgz","fileCount":351,"integrity":"sha512-GcqAeOI1QwDIRJmzFwMSmUc8FpsBOmelajn6mSaG13qy16lVBpuPDIG+6W7Pfq8mc+OBWJlmwMDWEjuDVlPjOw==","signatures":[{"sig":"MEYCIQD84kN8T9xskwsfG9jUjCs35M/KlCpVBzpUvw7upQ+J4gIhAMGCZ4nVRSdby2ri++ioZCGi0kYagpwVTDG1HBnGTY+t","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":952529},"engines":{"node":">=22.13.0"},"gitHead":"264b4d2ef44ef8419bf202ea7668f94adea9f2b8","scripts":{"postinstall":"node scripts/postinstall.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.25_1777248797944_0.4240188766108446","host":"s3://npm-registry-packages-npm-production"}},"0.0.26":{"name":"@brain-ai/teams-bot","version":"0.0.26","_id":"@brain-ai/teams-bot@0.0.26","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"ca1d989a8652b6ca1050e51e974b7df39aeb5178","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.26.tgz","fileCount":354,"integrity":"sha512-a0Mst+b2fxljkxlmE0fLR6kxAWpDyepIETxbb/hANJUzk6JjWpfJQE5wmdUHwXM1u7HtPcp9sWqUIySCOqZBhQ==","signatures":[{"sig":"MEYCIQD8i280+j2cdlLTTxLdo56qLJ+3yDzxeraQCCfvVN7rbwIhANDfyIzLGHL+3XeR0onDRfGN5SJlw6/Y78zybc4y2AoZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":954799},"engines":{"node":">=22.13.0"},"gitHead":"41718bd390891ff6aea7b4e92b70b7b3e460d5db","scripts":{"postinstall":"node scripts/postinstall.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.26_1777389442089_0.4121928841472473","host":"s3://npm-registry-packages-npm-production"}},"0.0.27":{"name":"@brain-ai/teams-bot","version":"0.0.27","_id":"@brain-ai/teams-bot@0.0.27","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"b2c13a89a95865001ad9930d471b3ce7173e855e","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.27.tgz","fileCount":354,"integrity":"sha512-feyRNgFXTrJxyFUnr/8nzJc2J4pWAvosrXhFL3rWwTjBOiOo4LLjuls+zI+pLR97pK3xB6moDmjQJqb3Y6baRg==","signatures":[{"sig":"MEYCIQDdm6wqWcRYAhofuIwbKNv2gQ74G1Bk4rBxJrL7ooLMqgIhAOhFyKRQxOC+FKViyvwF5N94yXiH8tn09ltE5I7n7cle","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":961375},"engines":{"node":">=22.13.0"},"gitHead":"b8e0d63bc5492531081596a63d27cd3913480380","scripts":{"postinstall":"node scripts/postinstall.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.27_1777453815641_0.7159125889587965","host":"s3://npm-registry-packages-npm-production"}},"0.0.28":{"name":"@brain-ai/teams-bot","version":"0.0.28","_id":"@brain-ai/teams-bot@0.0.28","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"2364c139a8c3cdc20efaaa3e5fb501eb1a987ba8","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.28.tgz","fileCount":354,"integrity":"sha512-HbREnAWhL3jMr61xWH22sbjVFkr5GfhrWkM2QveCcuy20Qmo7RAUKYnFLkGDk3Pn4+EGx8Gu3Q0X8TF2npDHBg==","signatures":[{"sig":"MEYCIQDOglXiuGn8seVcPhJ4pYvxMh5XPK/FrS0MANGtrewUrQIhAN5tl2aDLZlzv8/oDOAU/YhkbqgASEVXIoGBRiBW3ZFN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":961375},"engines":{"node":">=22.13.0"},"gitHead":"e1333bb9ad54e92e6648df2fee135b3ddb4a608e","scripts":{"postinstall":"node scripts/postinstall.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.28_1778055540825_0.2604362079955258","host":"s3://npm-registry-packages-npm-production"}},"0.0.29":{"name":"@brain-ai/teams-bot","version":"0.0.29","_id":"@brain-ai/teams-bot@0.0.29","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"bd2101cb962f1443379da53de6ad2c8bdba6f20b","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.29.tgz","fileCount":357,"integrity":"sha512-Q42F33GvLwPrtjdLYwM8uYXc7I8FvzS+7TzeHBlXGciE/AElTbAc8PM7311HSeTCorffpUTr/PfGlnOXAk2RHg==","signatures":[{"sig":"MEYCIQDwlYSEmEElataOETw9zfE2PVixjF0C8D3Jj1X8f0UCAgIhAIpePDNutf9aEWz8OrAhe7laTfqN9XvsgeUYR5VXe1v4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":971904},"engines":{"node":">=22.13.0"},"gitHead":"1d2fa3da92cd4e73a690e244ce48d36264bcac12","scripts":{"postinstall":"node scripts/postinstall.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.29_1780024118541_0.9149192590967961","host":"s3://npm-registry-packages-npm-production"}},"0.0.30":{"name":"@brain-ai/teams-bot","version":"0.0.30","_id":"@brain-ai/teams-bot@0.0.30","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"82da416668337fa962910c4027cfa4097672c8a2","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.30.tgz","fileCount":360,"integrity":"sha512-wcvcSxl+BL56IG185yGh3FFHGp+iV9V6RkBK+8gScQ2M4xShe25X3uTe5FJIDc3ysS6A7rG8ilFYu5+WkeTbyA==","signatures":[{"sig":"MEQCIGl+6X0AK7sgHPEsKclGKn3CcL1lFaIh58zmIw0eUWswAiALmARu3uWrFSpZ1HpyOYniNOtLMYnInGZlO6795A0SBw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1000485},"engines":{"node":">=22.13.0"},"gitHead":"e6a445129903cc5063c0bed6409f984591f87805","scripts":{"postinstall":"node scripts/postinstall.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.30_1780111749516_0.6218470048024822","host":"s3://npm-registry-packages-npm-production"}},"0.0.31":{"name":"@brain-ai/teams-bot","version":"0.0.31","_id":"@brain-ai/teams-bot@0.0.31","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"a72d57c1ec63c0831289e61e1aeb5920a233b5e8","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.31.tgz","fileCount":360,"integrity":"sha512-iKEfMPtzefQSVmQVPKWHsza4aGBNhN9RlW2A15A33eKPanfSvoYTDylbibFieAY/DZeCXAS1PvYbRH4Z6unjmg==","signatures":[{"sig":"MEUCIH4/NR87taMsjEeMmpJa9e9TbZqUf9Oa1nFrJ5I6rC0TAiEAz5mv5tZVZJ6g8JOWZPCyFoLFbScilS/rJDlgQx4qxvk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1004076},"engines":{"node":">=22.13.0"},"gitHead":"4efad8dc0bf5e50ad4eca6715b1b2850cb732245","scripts":{"postinstall":"node scripts/postinstall.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.31_1780115161340_0.3349804386129953","host":"s3://npm-registry-packages-npm-production"}},"0.0.32":{"name":"@brain-ai/teams-bot","version":"0.0.32","_id":"@brain-ai/teams-bot@0.0.32","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"546767ff79837f6564009b5b2af6fa99fc14b590","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.32.tgz","fileCount":360,"integrity":"sha512-V9ige1v+tErMvIHl7YjYBVR9/GWLT/xpTPZ1rtbRR5YEII94E/BwROij/5/E1i48d1Y/ChaZkD3tMxG7lgbkCA==","signatures":[{"sig":"MEUCIQCiLUaR8bL37AgQrTkMRlZ/zwRRdWlZGoUA1G01NsZWkgIgVM0WZSB93yZv9LWdM1z/QJ/SmsI2GHCFTB5dboVVp1M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1013275},"engines":{"node":">=22.13.0"},"gitHead":"86c8fd16b12ff598c318cf4a2ad298a923a9c228","scripts":{"postinstall":"node scripts/postinstall.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.32_1780125685291_0.5452461290544961","host":"s3://npm-registry-packages-npm-production"}},"0.0.33":{"name":"@brain-ai/teams-bot","version":"0.0.33","_id":"@brain-ai/teams-bot@0.0.33","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"c307432a0f0e71fd5f6507d3fe68da22d7802377","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.33.tgz","fileCount":360,"integrity":"sha512-R5vvrcfGV7nbKYjK7UgF7md6h69QeI7JMc5IHuVS6AOffivJ1adjVEjAdQOTb6r06M+8iWlMisKoFTjWBg941Q==","signatures":[{"sig":"MEUCIQCOWH/xFzLTDKKMKyh/0BTIo4Gbq5CKpabv39en120ndAIgO2ACy+h6InX/0LAVs8b9mvUVfEI2qWdIgLG1caKCd7c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1023319},"engines":{"node":">=22.13.0"},"gitHead":"92544d432aa9ac8d35f2ee0639fd4ade58419ce6","scripts":{"postinstall":"node scripts/postinstall.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.33_1780323976271_0.47367412611462645","host":"s3://npm-registry-packages-npm-production"}},"0.0.34":{"name":"@brain-ai/teams-bot","version":"0.0.34","_id":"@brain-ai/teams-bot@0.0.34","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"c3949b723b8f62b278a2bcc6bf4ed7c2b9241647","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.34.tgz","fileCount":360,"integrity":"sha512-ib2Mjr6Sja062vFAeC+s8JJgNX4PFSs2nthMC7ABGPph8sxN9ClHTQwOvfLLS/nNVGm+QKgipm+fZIKNPhe/zA==","signatures":[{"sig":"MEUCIQCKYhXlwFgvbEzKC4er6GOzNF2L9UNRW5Ad6b85rJ6jLgIgPkdiTctOTUgxn22fRG/gOVX525iK+XDD1Sg8tOh5fmM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1024155},"engines":{"node":">=22.13.0"},"scripts":{"postinstall":"node scripts/postinstall.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.34_1780930146103_0.6644525275682245","host":"s3://npm-registry-packages-npm-production"}},"0.0.35":{"name":"@brain-ai/teams-bot","version":"0.0.35","_id":"@brain-ai/teams-bot@0.0.35","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"c248bfd6509841042483fb35a62e15bb69d02fed","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.35.tgz","fileCount":360,"integrity":"sha512-OntyuMAqHeqqs84H4T4FciklTBWzpKyGMoIfHp65BK0HRPcGGMi72TbtpZC/9Ro4w9rTbKltvojwIRoQVe16Ig==","signatures":[{"sig":"MEQCIF74lRDUWpIE5yjXBeY7A9alKfdf3TbXCxy/eW4HKFt5AiA37qGsubAa/xIrbfUaAGRbc2fCj6I01gLckL5gajXAvg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1024591},"engines":{"node":">=22.13.0"},"scripts":{"postinstall":"node scripts/postinstall.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.35_1781261003642_0.699006091161847","host":"s3://npm-registry-packages-npm-production"}},"0.0.36":{"name":"@brain-ai/teams-bot","version":"0.0.36","_id":"@brain-ai/teams-bot@0.0.36","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"a7ec70e7cc5363be62c2118df97541c04c452262","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.36.tgz","fileCount":363,"integrity":"sha512-cfeJnFtWWKHTlowQTupFqFL0A4WUd2zHm21IBFTg99X10O+dkiVHfq3IL8D2n338hsPWyiGWkYKIg1SS66MOHQ==","signatures":[{"sig":"MEQCICTSVDyIdd61Ha9BH5gI2b5N73ZlXiHQlPH6q1gl0FWtAiA59VS9yFlxKMPVqtCN4fkmEzWmNy7sV2oh4kbm003QLw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1046132},"engines":{"node":">=22.13.0"},"scripts":{"postinstall":"node scripts/postinstall.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.36_1781515799866_0.19895765592082637","host":"s3://npm-registry-packages-npm-production"}},"0.0.37":{"name":"@brain-ai/teams-bot","version":"0.0.37","_id":"@brain-ai/teams-bot@0.0.37","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"15921fae77cfbac1d7cf42abeb0c34fed3deb718","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.37.tgz","fileCount":381,"integrity":"sha512-lVcAJGG0OijFKKMTO1Llbu6XDW2m4gS/WCt1nCBqvRRICXsw5xJxeOqKdE925A2lhd6U0OHsa8dskhMmC6KqlA==","signatures":[{"sig":"MEUCIEZHzSBWZt4j4Us0EaQeRgwE1T/zZARnpt70wUuMSoTeAiEAuAFNIapuNPxpzhY/uG7GXKLX5p3wkJIznD3QTMcT3kQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1244193},"engines":{"node":">=22.13.0"},"scripts":{"postinstall":"node scripts/postinstall.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.37_1781535601212_0.5981131514329758","host":"s3://npm-registry-packages-npm-production"}},"0.0.38":{"name":"@brain-ai/teams-bot","version":"0.0.38","_id":"@brain-ai/teams-bot@0.0.38","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"e90774cb3fba5aee6022042b60351438b5936782","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.38.tgz","fileCount":387,"integrity":"sha512-xRg305s8Co0UGgrAv0Ii+VG6wrKv8MfwL+TXW8Lonby6Tjh51Di3Ir4PnR7CPFGLp/6h3+nO/KALmhFssvommQ==","signatures":[{"sig":"MEQCIDzS1AZjRoyidXWIgkbVKn3JQnq9hXKQkqMmknww995uAiB6BzybB3sOgqvovwRBOk4rEA7xCZ2ptUJOYJf++TZPeA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1283801},"engines":{"node":">=22.13.0"},"scripts":{"postinstall":"node scripts/postinstall.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.38_1781583492110_0.7737727516290311","host":"s3://npm-registry-packages-npm-production"}},"0.0.39":{"name":"@brain-ai/teams-bot","version":"0.0.39","_id":"@brain-ai/teams-bot@0.0.39","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"fb88d27de32ad18adec9200b6eee9c6dc6fdbf23","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.39.tgz","fileCount":387,"integrity":"sha512-vXWL2KDiVBSzmc8vF50o2WR1tyV0fBQaoKoPZegEf+4LqrDtriJwTrn3dUZKH8AUU3tko4I9DDRIqSKTFhEL9w==","signatures":[{"sig":"MEQCIDBbSDkH2GfduUcYiNHlajNCTefJQkBUiyV/VZ8ZY2K6AiAnx9UYGNhruAjEKgZz8EWyw1lhrF+fn5sFgNZ9fmN+iQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1288668},"engines":{"node":">=22.13.0"},"scripts":{"postinstall":"node scripts/postinstall.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.39_1781591883603_0.5825943182082529","host":"s3://npm-registry-packages-npm-production"}},"0.0.40":{"name":"@brain-ai/teams-bot","version":"0.0.40","_id":"@brain-ai/teams-bot@0.0.40","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"08aa7b63512cb76685013289596f4ee5c775af27","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.40.tgz","fileCount":387,"integrity":"sha512-hxr7jH1Ug5FMPpI65zaG/16JJbTiiCsRPAdBPhr3FE8/vrFhLP+kcOnfiJHZs5gRbqbix/J2ILI31USJqmaSLA==","signatures":[{"sig":"MEQCID7LOd+yKHmzVUQiwDgkDTouga66ZvfDgQcg4R6GHvd+AiBpmYe/4cW5FwXwTHAbGJHQPIxG7J9Xezjl/4QlBlP/0g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1290099},"engines":{"node":">=22.13.0"},"scripts":{"postinstall":"node scripts/postinstall.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.40_1781702577109_0.40276472420160947","host":"s3://npm-registry-packages-npm-production"}},"0.0.41":{"name":"@brain-ai/teams-bot","version":"0.0.41","_id":"@brain-ai/teams-bot@0.0.41","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"bin":{"brainbotbeta":"dist/index.js"},"dist":{"shasum":"f7d9e107acaaa5114696e4931bcc6f3d5095b952","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.41.tgz","fileCount":399,"integrity":"sha512-pJxjcAZEPfv13KS/SS7rcunRQK3496Jb63K7VYck7MIMghmb5DsSIq0zkM9BN+rMf0tCYtUzTsSs8Vla4LJMsQ==","signatures":[{"sig":"MEYCIQCiMni50X6xdIigAZrr5FV0Lit2AgBD+y3Rl5XdYhlBngIhAI0nFafDOv9ASOYbJOKUn1AwvyT66+2bu+xs0sxCzm49","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1391985},"engines":{"node":">=22.13.0"},"scripts":{"verify":"npm run build && npm run test:all","test:all":"cd local-server && npm test && cd ../bot-app && npm test","typecheck":"cd shared && npm run build && cd .. && tsc --noEmit && cd bot-app && tsc --noEmit && cd ../local-server && tsc --noEmit","postinstall":"node scripts/postinstall.js"},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"_npmVersion":"10.9.2","description":"Unified CLI for brain: setup, start, stop, logs, status","directories":{},"_nodeVersion":"22.20.0","dependencies":{"ora":"^8.0.0","archiver":"^7.0.0","commander":"^12.0.0","brain-shared":"file:shared","@azure/msal-node":"^5.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"bundleDependencies":["brain-shared"],"_npmOperationalInternal":{"tmp":"tmp/teams-bot_0.0.41_1783495235221_0.7523861918546229","host":"s3://npm-registry-packages-npm-production"}},"0.0.42":{"name":"@brain-ai/teams-bot","version":"0.0.42","description":"Unified CLI for brain: setup, start, stop, logs, status","bin":{"brainbotbeta":"dist/index.js"},"publishConfig":{"registry":"https://registry.npmjs.org/","access":"public"},"scripts":{"postinstall":"node scripts/postinstall.js","test:all":"cd local-server && npm test && cd ../bot-app && npm test","typecheck":"cd shared && npm run build && cd .. && tsc --noEmit && cd bot-app && tsc --noEmit && cd ../local-server && tsc --noEmit","verify":"npm run build && npm run test:all"},"dependencies":{"@azure/msal-node":"^5.0.6","archiver":"^7.0.0","brain-shared":"file:shared","commander":"^12.0.0","ora":"^8.0.0"},"bundleDependencies":["brain-shared"],"engines":{"node":">=22.13.0"},"_id":"@brain-ai/teams-bot@0.0.42","_nodeVersion":"22.20.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-6eIPt6G6G3PGsfP5aD+i2bITQwHaTjjiuL3OAsL7kPZlArSDqbe/eaUaFQ3bjRdSJrX42kqh14musLv3yP7eFg==","shasum":"22b02ea0ca3fa169acdf4679983f39c4d7bce827","tarball":"https://registry.npmjs.org/@brain-ai/teams-bot/-/teams-bot-0.0.42.tgz","fileCount":399,"unpackedSize":1392151,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIElUo1XiH9/xWNAU9laER+ifAojf/Lh+MELaAmLQT6j4AiBfcBid9ZCB3i0p0yV/EuSGM5mY/AOnIjhaEwrRAFyMZw=="}]},"_npmUser":{"name":"louiswt","email":"louiswt@foxmail.com"},"directories":{},"maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/teams-bot_0.0.42_1783745894006_0.4065387490403811"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-22T02:57:05.095Z","modified":"2026-07-11T04:58:14.344Z","0.0.5":"2026-04-22T02:57:05.397Z","0.0.6":"2026-04-22T03:20:31.390Z","0.0.7":"2026-04-22T04:26:59.499Z","0.0.8":"2026-04-22T04:30:47.680Z","0.0.9":"2026-04-22T06:11:30.110Z","0.0.10":"2026-04-22T06:31:33.537Z","0.0.11":"2026-04-22T07:01:57.188Z","0.0.12":"2026-04-22T07:12:09.965Z","0.0.13":"2026-04-22T09:10:40.933Z","0.0.14":"2026-04-22T09:38:38.174Z","0.0.15":"2026-04-22T09:53:18.536Z","0.0.16":"2026-04-22T10:45:11.060Z","0.0.17":"2026-04-22T10:51:29.664Z","0.0.18":"2026-04-22T10:57:34.727Z","0.0.19":"2026-04-22T12:05:00.143Z","0.0.20":"2026-04-22T12:31:01.439Z","0.0.21":"2026-04-22T12:49:54.711Z","0.0.22":"2026-04-22T13:08:58.471Z","0.0.23":"2026-04-22T13:24:11.447Z","0.0.24":"2026-04-22T14:18:54.299Z","0.0.25":"2026-04-27T00:13:18.109Z","0.0.26":"2026-04-28T15:17:22.308Z","0.0.27":"2026-04-29T09:10:15.857Z","0.0.28":"2026-05-06T08:19:01.025Z","0.0.29":"2026-05-29T03:08:38.843Z","0.0.30":"2026-05-30T03:29:09.651Z","0.0.31":"2026-05-30T04:26:01.485Z","0.0.32":"2026-05-30T07:21:25.431Z","0.0.33":"2026-06-01T14:26:16.465Z","0.0.34":"2026-06-08T14:49:06.271Z","0.0.35":"2026-06-12T10:43:23.835Z","0.0.36":"2026-06-15T09:30:00.023Z","0.0.37":"2026-06-15T15:00:01.388Z","0.0.38":"2026-06-16T04:18:12.289Z","0.0.39":"2026-06-16T06:38:03.751Z","0.0.40":"2026-06-17T13:22:57.299Z","0.0.41":"2026-07-08T07:20:35.392Z","0.0.42":"2026-07-11T04:58:14.169Z"},"description":"Unified CLI for brain: setup, start, stop, logs, status","maintainers":[{"name":"louiswt","email":"louiswt@foxmail.com"}],"readme":"# Brain\r\n\r\nA unified CLI that turns Microsoft Teams into a personal AI assistant interface. Pick the agent backend per conversation: the [Claude Agent SDK](https://docs.anthropic.com/en/docs/claude-agent-sdk) (default — in-process, full MCP / hooks / sub-agents) or the [GitHub Copilot CLI](https://github.com/github/copilot-cli) (per-turn subprocess). One command connects to the shared gateway, another provisions your own — then you chat in Teams with full tool use, persistent sessions, and scheduled tasks.\r\n\r\n## How It Works\r\n\r\nBrain follows a 3-tier WebSocket relay architecture: a shared Cloud Gateway on Azure routes Teams messages over persistent WebSocket connections to each user's local machine, where Claude processes them.\r\n\r\n```mermaid\r\nflowchart TB\r\n    subgraph teams [\"Microsoft Teams\"]\r\n        user([\"User @mentions bot\"])\r\n    end\r\n\r\n    subgraph bfs [\"Azure Bot Service\"]\r\n        bf[\"Bot Framework Service\\n(message routing)\"]\r\n    end\r\n\r\n    subgraph azure [\"Azure App Service (shared)\"]\r\n        gw[\"Cloud Gateway (bot-app)\\nTeams SDK · WSS relay\\nOID routing · device binding\\nofflinebuffer · picker\"]\r\n    end\r\n\r\n    subgraph local [\"User's Machine(s)\"]\r\n        cli[\"brainbotbeta CLI\\nMSAL auth · daemon\\ntoken refresh · LLM proxy\"]\r\n        server[\"local-server\\nClaude SDK / Copilot CLI · device-id\\nSQLite · scheduler · MCP tools\"]\r\n    end\r\n\r\n    user -- \"message\" --> bf\r\n    bf -- \"reply\" --> user\r\n    bf -- \"POST /api/messages\" --> gw\r\n    gw -- \"reply\\n(Managed Identity, no secrets)\" --> bf\r\n\r\n    server -- \"WSS /connect\\n(Entra ID JWT + x-brain-device-id)\" --> gw\r\n    gw -- \"MessageFrame\" --> server\r\n    server -- \"ResponseFrame\\nTypingFrame · PushFrame\" --> gw\r\n\r\n    cli -. \"spawns + manages\" .-> server\r\n    cli -. \"refreshes tokens\\n(relay JWT · Graph token)\" .-> server\r\n```\r\n\r\n**Key insight**: the local-server connects *outbound* to the Gateway — no port forwarding, no tunnels, works behind any NAT/firewall. When the local-server is offline, the Gateway buffers messages (up to 100/user, 1h TTL) and replays them on reconnect.\r\n\r\n**Multi-device routing**: each `local-server` install carries a stable `deviceId` (UUIDv4 at `~/.brainbotbeta/device-id`). The Gateway can route the same OID to *different* devices for different Teams conversations — bound at first message (silent auto-bind if 1 device online, picker card if 2+). See [Multi-Device Routing](#multi-device-routing).\r\n\r\n## Prerequisites\r\n\r\n- **Node.js** >= 22.13.0 (for built-in `node:sqlite`)\r\n- **Azure CLI** (`az`) — logged in with `az login`\r\n- **Claude Code CLI** (`claude`) — installed via `winget install Anthropic.ClaudeCode` or `npm install -g @anthropic-ai/claude-code` (required for the default `claude` backend)\r\n- **GitHub CLI** (`gh`) — logged in with `gh auth login` (needed to download from private repo)\r\n- **GitHub Copilot CLI** (`copilot`) — optional, only required to use the `copilot` agent backend (`winget install GitHub.CopilotCLI` or `npm install -g @github/copilot`)\r\n- A Microsoft 365 account with Teams\r\n- A GitHub account (for Copilot LLM proxy authentication and the optional Copilot agent backend)\r\n\r\n> All prerequisites are auto-installed by the install script if missing (via `winget`).\r\n\r\n## Quick Start (End Users)\r\n\r\nInstall directly from npm:\r\n\r\n```bash\r\nnpm install -g @brain-ai/teams-bot\r\n```\r\n\r\nThen start the daemon:\r\n\r\n```bash\r\nbrainbotbeta start --gateway wss://brain-bot-beta.azurewebsites.net/connect\r\n```\r\n\r\nAlternatively, use the install script which also handles prerequisites and proxy setup. Requires `gh` CLI installed and authenticated:\r\n\r\n```powershell\r\nRemove-Item \"$env:TEMP\\*.ps1\" -ErrorAction SilentlyContinue; gh release download --repo liuwentong_microsoft/teamsclaw --pattern \"*.ps1\" --dir $env:TEMP; powershell -ExecutionPolicy Bypass -File \"$env:TEMP\\install.ps1\"\r\n```\r\n\r\nThe install script will:\r\n1. Check and auto-install missing prerequisites (Node.js, gh, Claude Code, Azure CLI)\r\n2. Download the latest release from GitHub\r\n3. Install `brainbotbeta` globally via npm\r\n4. Test Claude API access — start LLM proxy if needed\r\n5. Start the daemon and connect to the gateway\r\n\r\nFor upgrades, run the same command again — it auto-detects the old version, stops the daemon, and installs the new one.\r\n\r\n## Quick Start (Developers)\r\n\r\n```bash\r\n# Install dependencies and build all four packages (shared + CLI + bot-app + local-server)\r\nnpm install\r\nnpm run build\r\n\r\n# Link the CLI globally so `brainbotbeta` is available in your PATH\r\nnpm link\r\n\r\n# Connect to an existing shared gateway (first run opens browser for MSAL auth):\r\nbrainbotbeta start --gateway wss://brain-bot-beta.azurewebsites.net/connect\r\n\r\n# Or self-deploy your own gateway:\r\nbrainbotbeta deploy\r\n\r\n# Then message the bot in Teams!\r\n```\r\n\r\n> **Starting the daemon later** — if auth is cached, `brainbotbeta start` silently refreshes the token, reconnects, and starts the daemon. To also have it come back after a reboot, run `brainbotbeta start --auto-start` once: that opts in to OS login auto-start and sets up + bakes in the LLM proxy so the bot can still reply after boot.\r\n\r\n## CLI Commands\r\n\r\n| Command | Description |\r\n|---------|-------------|\r\n| `brainbotbeta start --gateway <url>` | First run: discover MSAL config, browser auth, start daemon |\r\n| `brainbotbeta start` | Subsequent runs: silent MSAL refresh, start daemon |\r\n| `brainbotbeta start --auto-start` | Opt in to OS login auto-start; also sets up + starts the LLM proxy and bakes `--proxy` into the boot launcher so the bot still replies after reboot |\r\n| `brainbotbeta start --no-auto-start` | Deprecated no-op (auto-start is opt-in); still accepted so existing boot launchers keep parsing |\r\n| `brainbotbeta start --name <name>` | Persist a display name for this device (1–64 chars). Shown in the device picker when you run multiple local-servers under one account. |\r\n| `brainbotbeta stop` | Stop the daemon and clean up state |\r\n| `brainbotbeta status` | Show gateway URL, PID, uptime, auth status, proxy status |\r\n| `brainbotbeta logs` | Tail real-time daemon log file |\r\n| `brainbotbeta proxy start` | GitHub device-flow auth, spawn LLM proxy, configure Claude |\r\n| `brainbotbeta proxy stop` | Stop proxy, restore Claude settings |\r\n| `brainbotbeta proxy status` | Show proxy PID, port, health |\r\n| `brainbotbeta proxy logs` | View proxy logs (`-f` for follow, `--err` for stderr) |\r\n| `brainbotbeta service install` | Auto-start `brainbotbeta start` on login (systemd/launchd/Windows Startup) and start it now |\r\n| `brainbotbeta service install --proxy` | Same, and also auto-start the LLM proxy on login |\r\n| `brainbotbeta service uninstall` | Remove auto-start (leaves a running daemon untouched) |\r\n| `brainbotbeta service status` | Show whether auto-start is installed |\r\n| `brainbotbeta deploy` | Self-deploy: provision Azure resources + register Teams app + auto-start |\r\n| `brainbotbeta upgrade` | Upgrade to the latest version from npm (restarts daemon if running) |\r\n| `brainbotbeta deploy --code-only` | Redeploy code only (skip provisioning) |\r\n\r\n> **Auto-start on login** — `brainbotbeta start` registers an OS launcher by default so the daemon reconnects to the gateway automatically after a reboot. It uses a **systemd** user unit on Linux, a **launchd** LaunchAgent on macOS, and a hidden **VBScript** launcher in the Startup folder on Windows. Use `brainbotbeta service install` to manage it explicitly (for example `--proxy`), or remove it with `brainbotbeta service uninstall`.\r\n\r\n## Project Structure\r\n\r\n```\r\nbrain/\r\n├── shared/                    # Shared types & utilities (dual CJS/ESM, zero runtime deps)\r\n│   └── src/\r\n│       ├── relay-types.ts     # Wire protocol frame types (canonical source)\r\n│       ├── config-types.ts    # ClaudeConfig, SkillsConfig, DeepPartial<T>\r\n│       ├── config-defaults.ts # DEFAULT_CLAUDE_CONFIG, DEFAULT_SKILLS_CONFIG\r\n│       ├── deep-merge.ts      # deepMerge() — recursive config merge\r\n│       └── expand-tilde.ts    # expandTilde() — ~ → homedir in object trees\r\n├── cli/                       # CLI tool (runs locally, never deployed)\r\n│   ├── commands/              # start, stop, status, logs, proxy, deploy, upgrade\r\n│   ├── runtime/               # Daemon entry point + child processes\r\n│   │   ├── daemon-entry.ts    # Orchestrator: tokens → server → health monitor\r\n│   │   ├── token-refresh.ts   # Periodic relay JWT (50min) + Graph token refresh\r\n│   │   ├── server-env.ts      # Builds env vars and spawns local-server\r\n│   │   └── llm-proxy/         # LLM proxy (Copilot → Anthropic translation)\r\n│   │       ├── server.ts      # HTTP server (localhost:18976)\r\n│   │       ├── converters.ts  # Anthropic ↔ OpenAI format conversion\r\n│   │       ├── stream-converter.ts  # SSE event translation\r\n│   │       └── token-manager.ts     # GitHub → Copilot token exchange\r\n│   ├── lib/                   # Shared utilities (MSAL, config, paths)\r\n│   │   ├── msal.ts            # MSAL PKCE auth (interactive + silent)\r\n│   │   ├── load-config.ts     # BrainConfig read/write\r\n│   │   ├── proxy-lifecycle.ts # LLM proxy start/stop (detached spawn + PID file)\r\n│   │   └── process-utils.ts   # isProcessAlive() for daemon health checks\r\n│   └── index.ts               # CLI entry point (commander)\r\n├── bot-app/                   # Cloud Gateway (deployed to Azure App Service)\r\n│   ├── deploy/                # Self-deploy scripts (Bicep, App Registration, Teams App)\r\n│   └── src/\r\n│       ├── app/app.ts         # Teams message handler, image extraction, relay delivery\r\n│       ├── relay/             # WebSocket relay infrastructure\r\n│       │   ├── connect-endpoint.ts   # /connect WSS upgrade + /connect/config\r\n│       │   ├── connection-handler.ts # Per-connection lifecycle, heartbeat, frame dispatch\r\n│       │   ├── jwt-validator.ts      # Entra ID JWT validation (jose)\r\n│       │   ├── client-registry.ts    # OID → connections map (max 5/user)\r\n│       │   ├── reply-context-store.ts# channel_id → ReplyContext (1h TTL, OID-guarded)\r\n│       │   ├── offline-buffer.ts     # Message buffer for offline users (100/user, 1h TTL)\r\n│       │   ├── outbound-router.ts    # Response/typing/push → Teams delivery\r\n│       │   ├── message-delivery.ts   # Inbound message → best connection or buffer\r\n│       │   ├── teams-conversation-store.ts  # In-memory conversation refs for push\r\n│       │   ├── client-connection.ts  # WebSocket wrapper (serialized sends)\r\n│       │   └── wire-frames.ts        # Server-side frame encode/decode\r\n│       ├── config.ts          # Environment config\r\n│       └── index.ts           # HTTP server entry point\r\n├── local-server/              # Local AI server (runs on your machine)\r\n│   └── src/\r\n│       ├── relay/             # WebSocket client to Gateway\r\n│       │   ├── cloud-channel.ts      # WSS client, reconnection, send queue\r\n│       │   ├── html-to-markdown.ts   # Teams HTML → Markdown conversion\r\n│       │   └── wire-frames.ts        # Client-side frame encode/decode\r\n│       ├── agent/             # Agent backends (Claude SDK + Copilot CLI dispatcher)\r\n│       │   ├── index.ts       # processMessage dispatcher + Claude SDK query path (resolveBackend, session resume, streaming)\r\n│       │   ├── copilot-runner.ts  # GitHub Copilot CLI driver (spawns `copilot --output-format json`, parses JSONL)\r\n│       │   ├── context.ts     # Builds conversation context from DB history\r\n│       │   ├── hooks.ts       # PreCompact hook: archive transcripts before compaction (Claude backend only)\r\n│       │   └── system-prompt.ts  # NECESSARY + OVERRIDABLE layers, composeSystemPrompt()\r\n│       ├── db/                # SQLite persistence (node:sqlite)\r\n│       │   ├── schema.ts      # Tables: messages, sessions, tasks, dirs, images, workspaces\r\n│       │   ├── messages.ts    # Message + image CRUD\r\n│       │   ├── sessions.ts    # Session persistence\r\n│       │   ├── tasks.ts       # Scheduled task CRUD\r\n│       │   ├── state.ts       # KV store for router state\r\n│       │   └── directories.ts # Per-session directory CRUD\r\n│       ├── mcp/               # Custom MCP tools for Claude\r\n│       │   ├── push-message.ts     # Proactive messaging to Teams\r\n│       │   ├── schedule-task.ts    # Schedule recurring/one-shot tasks\r\n│       │   ├── list-tasks.ts       # List scheduled tasks\r\n│       │   ├── manage-tasks.ts     # Pause, resume, cancel, update tasks\r\n│       │   └── manage-dirs.ts      # Add, remove, list per-session directories\r\n│       ├── scheduler/         # Task execution engine\r\n│       │   ├── index.ts       # Polling loop (60s, setTimeout chain)\r\n│       │   ├── runner.ts      # Execute task → push result to Teams\r\n│       │   └── next-run.ts    # Compute next run time (cron/interval/once)\r\n│       ├── index.ts           # Message routing, # commands, concurrency pipeline\r\n│       └── graph.ts           # Graph API: channels, messages, threads\r\n├── scripts/\r\n│   ├── postinstall.js         # Writes package paths to config, installs sub-project deps\r\n│   ├── pack.js                # Build distributable .tgz (excludes bot-app)\r\n│   ├── pack-deploy.js         # Build deploy-kit .zip for self-host\r\n│   └── install.ps1            # Full Windows installer (auto-installs prerequisites)\r\n├── docs/                      # Debug & reference documentation\r\n├── tests/                     # Graph API integration tests\r\n├── package.json               # Root package: CLI dependencies + build scripts\r\n└── tsconfig.json              # Root TypeScript config (CommonJS for CLI)\r\n```\r\n\r\n## Architecture\r\n\r\n### 3-Tier WebSocket Relay\r\n\r\nThe system has three independent tiers connected by a WebSocket relay protocol:\r\n\r\n```\r\nTeams User ──@bot──> Bot Framework Service ──POST──> Cloud Gateway (Azure App Service)\r\n                            ▲                           │ Route by OID\r\n                            │ reply (Managed Identity)  │\r\n                            └───────────────────────────┤\r\n                                                   WSS <┤ /connect (Entra ID JWT)\r\n                                                        └──> WSS\r\n                                        User's local-server       (runs locally)\r\n```\r\n\r\n1. **Cloud Gateway** (`bot-app/`) — Receives Teams messages, routes by user OID over WebSocket to the correct local-server. Deploys once, shared by all users.\r\n2. **Local AI Server** (`local-server/`) — Runs on the user's machine. Processes messages via the configured agent backend (Claude Agent SDK in-process or `copilot` CLI spawned per turn), sends replies back through the relay.\r\n3. **CLI** (`cli/`) — Manages the local lifecycle: `brainbotbeta start` authenticates via MSAL, starts the daemon (token refresh + local-server auto-respawn), optionally runs the LLM proxy.\r\n\r\n### Four Independent Packages\r\n\r\n| Package | Runs On | Module System | Target | Purpose |\r\n|---------|---------|---------------|--------|---------|\r\n| **shared** | Build-time | Dual CJS/ESM | ESNext | Wire protocol types, config types, pure utilities |\r\n| **cli** | Local machine | CommonJS | ES2022 | CLI commands, daemon, MSAL auth, LLM proxy |\r\n| **bot-app** | Azure App Service | ESM (NodeNext) | ESNext | Teams message routing, WSS relay, offline buffer, push delivery |\r\n| **local-server** | Local machine | ESM (NodeNext) | ESNext | Claude Agent SDK / Copilot CLI dispatcher, SQLite, MCP tools, task scheduler |\r\n\r\n**Isolation rules**: bot-app and local-server never import each other — they share types through `shared/` via `file:` dependency. bot-app must NOT depend on `@anthropic-ai/claude-agent-sdk`. local-server must NOT depend on `@microsoft/teams.*` or `@azure/identity`.\r\n\r\n### WebSocket Protocol\r\n\r\nJSON text frames, snake_case fields, discriminated by `type`. Protocol version: `1`.\r\n\r\n**Server → Client** (Gateway → local-server):\r\n\r\n| Frame | Purpose |\r\n|-------|---------|\r\n| `connected` | Handshake confirmation (`protocol_version`, `buffered_count`) |\r\n| `buffered_start` / `buffered_end` | Marks offline buffer replay boundaries |\r\n| `message` | User message from Teams (`channel_id`, `sender_id`, `content`, `attachments`, `session_key`, ...) |\r\n| `ping` | Heartbeat (every 45s; client must reply `pong` within 15s) |\r\n| `error` | Error notification |\r\n\r\n**Client → Server** (local-server → Gateway):\r\n\r\n| Frame | Purpose |\r\n|-------|---------|\r\n| `pong` | Heartbeat reply |\r\n| `response` | Final reply to a message (consumes ReplyContext) |\r\n| `typing` | Typing indicator (keeps ReplyContext alive) |\r\n| `push` | Proactive message (no ReplyContext needed, routed by `session_key` or most recent conversation) |\r\n| `notification` | Intermediate notification |\r\n| `chunk` | Streaming token chunk (reserved) |\r\n\r\n**Connection lifecycle:**\r\n1. Client opens `WSS /connect` with `Authorization: Bearer {jwt}`\r\n2. Gateway validates JWT, extracts OID, sends `connected`\r\n3. If offline buffer has messages: `buffered_start` → N × `message` → `buffered_end`\r\n4. Steady state: message/response/typing/push exchange\r\n5. Heartbeat: `ping` every 45s, `pong` within 15s or disconnect\r\n\r\n### Message Processing Pipeline\r\n\r\n```\r\nTeams @mention → Bot Framework → Gateway (bot-app)\r\n    → OID extraction, image download, MessageFrame creation\r\n    → Route by DeviceBindingStore[sessionKey]:\r\n        ├─ bound + device online    → deliver to bound device\r\n        ├─ bound + device offline   → buffer for that deviceId\r\n        ├─ unbound + 1 device       → auto-bind + deliver\r\n        ├─ unbound + 2+ devices     → post Adaptive Card picker (PendingMessageStore holds msg)\r\n        └─ unbound + 0 devices      → buffer untargeted (drain to first reconnect)\r\n        ↓\r\nlocal-server receives MessageFrame\r\n    → Strip @mentions, HTML → Markdown\r\n    → Persist images to disk, store message in SQLite\r\n    → Process in background:\r\n        ├─ withConcurrencyLimit (max 5 parallel)\r\n        ├─ withLock (per-conversation mutex)\r\n        ├─ withRetry (3 attempts, exponential backoff)\r\n        └─ processMessage → resolveBackend(conversationKey)\r\n            ├─ claude  → @anthropic-ai/claude-agent-sdk query() (in-process, MCP/hooks/sub-agents)\r\n            └─ copilot → spawn `copilot --output-format json ...` (per-turn subprocess, JSONL stdout)\r\n            → Typing indicators every 3s while the backend works\r\n            → Result: sendResponse → Gateway → Teams reply\r\n```\r\n\r\n### Daemon Lifecycle\r\n\r\nWhen you run `brainbotbeta start`, the daemon:\r\n\r\n1. Acquires relay JWT via MSAL (interactive on first run, silent thereafter)\r\n2. Acquires Graph API token via Azure CLI\r\n3. Writes tokens to `~/.brainbotbeta/auth/` (mode `0o600`)\r\n4. Spawns the local-server process with `GATEWAY_URL` + token file paths\r\n5. Starts periodic token refresh (relay JWT + Graph token every 50 min)\r\n6. Monitors local-server health (auto-respawn with exponential backoff, max 5 retries)\r\n7. Writes state to `~/.brainbotbeta/config/state.json`\r\n\r\nOn `brainbotbeta stop`: CLI sends SIGTERM to the daemon PID → daemon stops refresh loops, kills local-server, removes state file.\r\n\r\n### LLM Proxy (Copilot → Anthropic)\r\n\r\nAn optional local HTTP proxy that lets the Claude Agent SDK use GitHub Copilot as its LLM backend:\r\n\r\n```\r\nClaude Agent SDK → POST /v1/messages (Anthropic format)\r\n    → LLM Proxy (localhost:18976)\r\n        → Convert Anthropic → OpenAI Chat Completions format\r\n        → POST api.githubcopilot.com/chat/completions (with Copilot JWT)\r\n        → Convert OpenAI → Anthropic format\r\n    ← Return to Claude Agent SDK\r\n```\r\n\r\nManaged independently via `brainbotbeta proxy start/stop`. Uses GitHub OAuth device flow for auth. Runs as a detached process tracked by PID file.\r\n\r\n## Security\r\n\r\n### Authentication Chain\r\n\r\nEvery hop is independently authenticated. No link relies on \"being internal\" for security.\r\n\r\n| Hop | Mechanism |\r\n|-----|-----------|\r\n| Teams → Bot Framework | Bot Framework JWT (validated by Teams SDK); bot authenticates via User-Assigned Managed Identity (no secrets) |\r\n| Bot Framework → Gateway | Channel validation: rejects non-`msteams` channels to prevent DirectLine OID spoofing |\r\n| Gateway → local-server | Entra ID JWT validated at WebSocket handshake (JWKS, issuer, audience checks via `jose`) |\r\n| local-server → Gateway | Same JWT (presented at connection time); OID extracted and used for all routing |\r\n| Response routing | ReplyContext OID validation: Gateway only routes responses to the OID that sent the original message |\r\n| Push routing | TeamsConversationStore OID validation: proactive messages only reach conversations owned by the sender's OID |\r\n\r\n### Key Security Properties\r\n\r\n- **Zero secrets**: MSAL PKCE flow with Entra ID JWTs — no client secrets stored anywhere\r\n- **Cross-user isolation**: OID-based routing with validation at every hop\r\n- **Ephemeral tokens**: Relay JWT refreshed every 50 min, Graph token refreshed every 50 min\r\n- **File permissions**: All token files written with `0o600`\r\n- **Dev bypass**: Triple-guarded (`NODE_ENV=development` + `RELAY_BYPASS_TOKEN` non-empty + exact match)\r\n\r\n### Azure App Service Hardening\r\n\r\n- **IP restrictions**: Only `AzureBotService` + `AzureCloud` Service Tags allowed; default deny\r\n- **SCM lockdown**: `scmIpSecurityRestrictionsDefaultAction: Deny` — no public Kudu access\r\n- **HTTPS only**: Enforced at App Service level\r\n- **Managed Identity**: User-Assigned — no client secrets to rotate\r\n\r\n## Multi-Device Routing\r\n\r\nYou can run `local-server` on more than one machine under the same Microsoft 365 account (e.g. work laptop + Cloud PC). Each Teams conversation binds to **one** of those devices; subsequent messages in the same conversation always go to the bound device.\r\n\r\n### How a Teams conversation gets bound\r\n\r\nWhen the first message of a new conversation arrives:\r\n\r\n| Devices online | Behavior |\r\n|---|---|\r\n| 0 | Buffered (`💤 queued`). When the first device reconnects, the message drains to it **and the conversation binds to that device's `deviceId`** |\r\n| 1 | Silent auto-bind to the sole device. No picker. Indistinguishable from single-device use. |\r\n| 2+ | Gateway posts an Adaptive Card listing every online device by name. Original message held in `PendingMessageStore`. User clicks → binding recorded → held message delivered. |\r\n\r\nSubsequent messages in the same conversation always go to the bound device. If the bound device is offline, the message is buffered for that specific `deviceId` and drained when it reconnects.\r\n\r\n### Device identity\r\n\r\n- **`deviceId`**: opaque UUIDv4 persisted at `~/.brainbotbeta/device-id` (mode `0o600`) on first start. Stable across restarts; survives `brainbotbeta upgrade`. Regenerated if the file is missing (e.g. fresh install or wiped `~/.brainbotbeta/`).\r\n- **`deviceName`**: human-readable display string sent in the picker. Resolution order:\r\n  1. `--name <name>` passed to `brainbotbeta start` (persisted to config)\r\n  2. `BRAIN_DEVICE_NAME` env var\r\n  3. `os.hostname()`\r\n\r\n  Display only — never used for routing.\r\n\r\n### Switching devices\r\n\r\nThe only way to (re)bind a conversation to a different device is to start a new Teams conversation with `#new` — switching mid-conversation would orphan the Claude session, SQLite history, and any open workspace state on the original device.\r\n\r\n### Legacy clients (older `local-server` versions)\r\n\r\nA `local-server` build that predates the multi-device feature does not send `x-brain-device-id` / `x-brain-device-name` headers on the WSS upgrade. Such connections are accepted (Gateway generates an ephemeral per-connection UUID and marks the connection `isLegacy = true`), but they are **never** included in the picker and **never** bound. Messages are delivered to legacy connections only when no non-legacy device is online — MRU by last pong. Upgrade `local-server` to participate in routing.\r\n\r\n## Local Server Features\r\n\r\n### Agent Backends\r\n\r\nThe local server drives **one of two agent backends per conversation**. Both return the same `AgentResult`, so the rest of the pipeline (typing indicators, `sendResponse`, push notifications, session persistence in SQLite) is unchanged.\r\n\r\n- **`claude` (default)** — `@anthropic-ai/claude-agent-sdk` in-process. Full MCP servers, PreCompact hooks, Agent Teams sub-agent orchestration, additional directories, session resume.\r\n- **`copilot`** — Spawns `copilot --output-format json --allow-all -s ...` per turn (`@github/copilot` npm package, separate binary). Prompt via stdin (avoids Windows arg-length limits); JSONL stdout parsed for `assistant.message_delta` (buffered into the final reply) and `result` (session id persisted for `--resume` next turn). Trades the MCP / hooks / sub-agents extension surface for Copilot's fully managed agent loop and Copilot-side model routing.\r\n\r\n**Resolution order** (per call): per-conversation `router_state['backend:<key>']` → global `router_state['global:defaultBackend']` → `config.claude.backend` → fallback `'claude'`. Switch with `#backend` (per-conversation) or `#default-backend` (global). Switching backends clears the persisted session id because Claude and Copilot session IDs are not interchangeable.\r\n\r\n**Binary resolution** (Copilot only): `COPILOT_CLI_PATH` env var wins; otherwise PATH-based lookup, cached for process lifetime. 15-minute per-turn timeout.\r\n\r\n### Claude Agent SDK Capabilities (`claude` backend)\r\n\r\nWhen `backend = 'claude'`, the agent has access to:\r\n\r\n- **Full tool access**: File I/O (Read, Write, Edit), Bash, Glob, Grep, WebSearch, WebFetch, NotebookEdit, and more\r\n- **Agent Teams**: Sub-agent orchestration for parallel work (Task, TaskOutput, SendMessage, etc.)\r\n- **Session persistence**: Sessions are stored in SQLite and resumed across server restarts\r\n- **Conversation context**: History built from stored messages in the database\r\n- **Transcript archiving**: PreCompact hooks archive transcripts to markdown before context compaction\r\n- **Per-workspace isolation**: Each conversation gets its own working directory\r\n\r\n### Copilot CLI Capabilities (`copilot` backend)\r\n\r\nWhen `backend = 'copilot'`, the agent has access to Copilot's built-in tool set (file edits, shell, web fetch, the bundled `github-mcp-server`, etc.) and Copilot-side model routing. The custom MCP servers, PreCompact hooks, and Agent Teams sub-agents from the Claude backend are **not** available in this mode. Image attachments are forwarded via `--attachment <path>`; session resume uses `--resume <id>` and the `result` event's session id, persisted in the same `sessions` table.\r\n\r\n### Custom MCP Tools\r\n\r\n| Tool | Description |\r\n|------|-------------|\r\n| `push_message` | Send proactive messages to any Teams conversation |\r\n| `schedule_task` | Create scheduled tasks (cron/interval/once, local timezone) |\r\n| `list_tasks` | View all scheduled tasks for the current conversation |\r\n| `pause_task` / `resume_task` / `cancel_task` / `update_task` | Full task lifecycle management |\r\n| `add_dir` / `remove_dir` / `list_dirs` | Manage per-session directories for the Claude agent |\r\n\r\n### Task Scheduler\r\n\r\nThe scheduler runs a polling loop (60-second interval, `setTimeout` chain) that:\r\n\r\n- Finds due tasks from SQLite\r\n- Executes them through the same Claude Agent SDK pipeline (with concurrency limits)\r\n- Pushes results to Teams via the push mechanism\r\n- Logs execution details to `task_run_logs`\r\n- Supports cron expressions, fixed intervals (minutes), and one-shot execution\r\n- Tasks can run in conversation context (shared session) or isolated (fresh session each time)\r\n\r\n### SQLite Database\r\n\r\nAll persistent data lives in `~/.brainbotbeta/data/brain.db`:\r\n\r\n| Table | Purpose |\r\n|-------|---------|\r\n| `messages` | Conversation history (keyed by activity ID) |\r\n| `message_images` | Image attachments linked to messages |\r\n| `sessions` | Agent session IDs for resume (one row per conversation; stores either a Claude SDK session ID or a Copilot CLI session ID depending on the active backend at write time) |\r\n| `scheduled_tasks` | Task definitions with schedule, status, and next run time |\r\n| `task_run_logs` | Execution history for each task run |\r\n| `router_state` | KV store for serviceUrl persistence, agent timestamps, default workspace |\r\n| `session_directories` | Per-session additional directories |\r\n| `workspace_overrides` | Per-conversation cwd override |\r\n\r\n### Special Commands\r\n\r\n| Command | Description |\r\n|---------|-------------|\r\n| `#new [topic]` | Create a dedicated Teams channel for conversation isolation |\r\n| `#add-dir <path>` | Register an additional directory for Claude (takes effect next message) |\r\n| `#remove-dir <path>` | Unregister a directory |\r\n| `#list-dirs` | Show all active directories for this session |\r\n| `#workspace <path>` | Set per-conversation working directory |\r\n| `#default-workspace <path>` | Set global default working directory |\r\n| `#list-sessions [<page>\\|next\\|prev]` | List Claude sessions in this workspace (40/page). If [AgentLink](https://github.com/yilee/agentlink) is running locally, each row also gets an `[open]` link into AgentLink's web UI for that exact session. |\r\n| `#session <n>` | Resume the Nth session from the most recent `#list-sessions` page |\r\n| `#system-prompt [prompt]` | Override the per-conversation system prompt (no arg clears). Overrides only the style/guidelines layer; identity and tool knowledge are preserved. |\r\n| `#default-system-prompt <prompt>` | Replace the global default overridable layer |\r\n| `#reset-system-prompt` | Restore the built-in default overridable layer |\r\n| `#backend [claude\\|copilot\\|reset]` | Show / switch the agent backend for this conversation (`reset` clears the override). Switching clears the persisted session id. |\r\n| `#default-backend [claude\\|copilot]` | Show / set / clear the global default agent backend (no arg clears it; falls back to `config.claude.backend`, default `claude`). |\r\n\r\n### Memory System (3-Layer)\r\n\r\n1. **Per-conversation** (`CLAUDE.md` in workspace dir) — auto-discovered by SDK, seeded on first use\r\n2. **Global** (`~/.brainbotbeta/global/CLAUDE.md`) — shared across all conversations\r\n3. **Auto-memory** — SDK-managed automatic pattern extraction\r\n\r\nPlus `history.md` (auto-generated session summaries) and full transcript archives in `conversations/`.\r\n\r\n### BrainCore Integration (Local HTTP API)\r\n\r\nThe local-server exposes a REST endpoint for external tools (e.g. BrainCore) to proactively push messages to Teams channels.\r\n\r\n**Discovery**: on startup, the local-server writes `~/.brainbotbeta/local-server.json`:\r\n\r\n```json\r\n{\r\n  \"host\": \"127.0.0.1\",\r\n  \"port\": 3978,\r\n  \"pid\": 12345,\r\n  \"tokenPath\": \"C:\\\\Users\\\\you\\\\.brainbotbeta\\\\api-token\"\r\n}\r\n```\r\n\r\n**Usage**:\r\n\r\n1. Read `~/.brainbotbeta/local-server.json` to discover host, port, and token path\r\n2. Read the file at `tokenPath` to get the bearer token\r\n3. Call the API:\r\n\r\n```bash\r\ncurl -X POST http://127.0.0.1:3978/api/push \\\r\n  -H \"Authorization: Bearer $(cat ~/.brainbotbeta/api-token)\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\r\n    \"content\": \"Hello from BrainCore!\",\r\n    \"targetChannelId\": \"19:xxx@thread.tacv2\",\r\n    \"conversationKey\": \"cloud_teams:oid:...\",\r\n    \"threadId\": \"1781062301786\",\r\n    \"sessionId\": \"uuid\",\r\n    \"workspace\": \"D:\\\\my-project\",\r\n    \"format\": \"markdown\"\r\n  }'\r\n```\r\n\r\n**Response**: `202 Accepted` — message is queued in the send buffer, not confirmed delivered.\r\n\r\n**Security** (3 layers):\r\n- **Loopback-only**: rejects non-`127.0.0.1`/`::1` requests (403)\r\n- **Bearer token**: auto-generated at `~/.brainbotbeta/api-token` (mode `0600`), required via `Authorization` header (401)\r\n- **Origin check**: rejects requests with an `Origin` header to block browser CSRF (403)\r\n\r\n## Runtime Data\r\n\r\nAll runtime data lives under `~/.brainbotbeta/`:\r\n\r\n| Path | Purpose |\r\n|------|---------|\r\n| `config/config.json` | Gateway URL, MSAL params, team ID, claude/skills config |\r\n| `config/state.json` | Running daemon state (PID, uptime, auth status, server status) |\r\n| `config/proxy-state.json` | LLM proxy state (PID, port) |\r\n| `auth/relay-token` | Entra ID JWT for gateway auth (0o600) |\r\n| `auth/graph-token` | Graph API access token (0o600) |\r\n| `auth/github-token` | GitHub PAT for LLM proxy (0o600) |\r\n| `auth/token_cache_*.json` | MSAL token cache (0o600) |\r\n| `api-token` | Bearer token for local HTTP API (0o600, auto-generated) |\r\n| `local-server.json` | Discovery file for BrainCore: host, port, pid, tokenPath (0o600) |\r\n| `data/brain.db` | SQLite database |\r\n| `global/CLAUDE.md` | Global memory shared across conversations |\r\n| `global/system-prompt.md` | System prompt (user-editable) |\r\n| `data/workspace/<key>/` | Per-conversation workspaces |\r\n| `logs/` | Daemon + proxy logs (out.log, err.log) |\r\n| `deploy/provision.json` | Self-deploy output (app name, domain, client IDs) |\r\n\r\n## Development\r\n\r\n### Build\r\n\r\n```bash\r\n# Build everything (shared → CLI → bot-app → local-server)\r\nnpm run build\r\n\r\n# Watch mode for CLI development\r\nnpm run dev\r\n\r\n# Build individual packages\r\ncd shared && npm run build\r\ncd bot-app && npm run build\r\ncd local-server && npm run build\r\n```\r\n\r\n### Test\r\n\r\n```bash\r\n# Run local-server tests (vitest)\r\nnpm test\r\n\r\n# Watch mode\r\ncd local-server && npm run test:watch\r\n\r\n# Coverage\r\ncd local-server && npm run test:coverage\r\n```\r\n\r\n### Packaging\r\n\r\n```bash\r\n# Build distributable .tgz (excludes bot-app, for end users)\r\nnpm run pack:dist\r\n\r\n# Build deploy-kit .zip (bot-app + shared, for self-host)\r\nnpm run pack:deploy\r\n```\r\n\r\n### Module Systems\r\n\r\n| Package | Module | Target | Notes |\r\n|---------|--------|--------|-------|\r\n| **shared** | Dual CJS/ESM | ESNext | Conditional exports: import → ESM, require → CJS |\r\n| **Root / CLI** | CommonJS | ES2022 | |\r\n| **bot-app** | NodeNext (ESM) | ESNext | `.js` extensions in imports |\r\n| **local-server** | NodeNext (ESM) | ESNext | `.js` extensions in imports |\r\n\r\n## Design Principles\r\n\r\n1. **3-tier WebSocket relay**: Cloud Gateway is a thin message router — no AI logic, no tunnel dependencies. Local-server connects outbound, works behind any NAT/firewall.\r\n\r\n2. **Strict runtime isolation**: bot-app and local-server share no code, no dependencies, and never import each other. Types flow through `shared/` only.\r\n\r\n3. **Owner-only by design**: This is a personal assistant, not a multi-tenant service. Every message is validated against the owner's Entra OID.\r\n\r\n4. **Defense in depth**: Every hop is independently authenticated — Managed Identity for Bot Framework, JWT for WebSocket relay, OID validation for routing. Zero secrets stored.\r\n\r\n5. **Local-first AI**: All AI processing stays on your machine. The cloud Gateway is a thin message router. Your data, tools, and file system remain under your control.\r\n\r\n6. **No silent failures**: Every error must leave a trace. Empty `catch {}` blocks are not permitted.\r\n\r\n7. **Session continuity**: Both agent backends (Claude SDK and Copilot CLI) persist session IDs to SQLite so conversations survive server restarts. Offline messages are buffered by the Gateway and replayed on reconnect.\r\n\r\n8. **Deterministic naming**: Azure resource names are derived from the user's alias (`brain-beta-{alias}`), making them predictable and idempotent.\r\n\r\n## Uninstall\r\n\r\n```bash\r\n# 1. Stop the daemon\r\nbrainbotbeta stop\r\n\r\n# 2. Stop the LLM proxy (if running)\r\nbrainbotbeta proxy stop\r\n\r\n# 3. Remove the global CLI link\r\nnpm unlink -g brain\r\n\r\n# 4. Delete all runtime data\r\nrm -rf ~/.brainbotbeta\r\n\r\n# 5. (Optional) Delete Azure resources created by deploy\r\naz group delete --name <your-resource-group> --yes\r\n```\r\n","readmeFilename":"README.md"}