{"_id":"claude-telegram-bot","_rev":"53-6e96a852227d65d158c00a85696fab84","name":"claude-telegram-bot","dist-tags":{"latest":"0.7.0"},"versions":{"0.1.0":{"name":"claude-telegram-bot","version":"0.1.0","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.1.0","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"6d41913c1f54153fc510757690ae1c32f90dc046","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.1.0.tgz","fileCount":7,"integrity":"sha512-53OV/b//PtMttpDs+ivkc2oyI1jukE3d2rnYzY7v8Rt/LAsfOiJZnJAxNV2ltoISlfl90wcbFor4A9Krfv87tA==","signatures":[{"sig":"MEYCIQDMIU4DvHAV3zHA+32c6NlU2x/cqqTV54KxjFMynQSxBwIhANSyD9iNjyOL5F0Ysiw6nSxrd5ppsZJgL5bfghANLUZ8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":49140},"type":"module","engines":{"node":">=18"},"gitHead":"e4157d6136455f2b2c0f38d5a98e55d88b83d2df","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.1.0_1780991861469_0.4116309839007166","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"claude-telegram-bot","version":"0.2.0","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.2.0","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"09c311636005907d7c887ef8abd9710f5c459675","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.2.0.tgz","fileCount":7,"integrity":"sha512-HN498d9nA5V7uQm42C9qJkUBdxjjncrhFj0ZE+9yo4T2kh7CwTEcjWChO4XZptc6hjwGgvVN6lyb5BkcovWRbQ==","signatures":[{"sig":"MEQCIGbsbRzUBP6iZww0iAHtARKH2CsPEGGv8MCafaXdVPflAiBbwss359KCiq7On9HfbaVX77AuZLyWhPzxjHenv+yCSw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":65675},"type":"module","engines":{"node":">=18"},"gitHead":"05c55e90d36bfebebb5015ff963c789516166c3d","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.2.0_1781045900644_0.824029875410448","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"claude-telegram-bot","version":"0.2.1","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.2.1","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"238781f3f60b9436099416fb8e25106d99782e37","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.2.1.tgz","fileCount":7,"integrity":"sha512-U7PkT+o9OtvqKrfSoqLJVDKu6+7tjdyuWC4DBCQFHc3lMwNza8LiHhHR81JtjNKsh5euC0MCb9eAy0Rr4NpQ1w==","signatures":[{"sig":"MEQCIG/b2mPiiVZ/ID/1QJqQ71ZE9hrICxv+gnlACLyOifPCAiBmxG+CfI09lQD4MrOd2FckNW3ls3BmEqriTduLn/YHAw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":71746},"type":"module","engines":{"node":">=18"},"gitHead":"89a3ebb89cb6260dcd94d5f34fb1ed10cae3575f","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.2.1_1781047210539_0.9959973487305473","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"claude-telegram-bot","version":"0.2.2","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.2.2","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"bc2544fd478ac944f6ea485cb12cbb1d119098f2","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.2.2.tgz","fileCount":7,"integrity":"sha512-dgHeH+RkqqmL3sIMSrGhzosihz3+XShvNEqiUbRGuXbKKN14qqCUTxJIz0yzh4y4AAB4tgYQ7gWmiIP+Ld/YnA==","signatures":[{"sig":"MEUCIBvxbz3QbSIUy0Nk91hN0IxYnkyGZzYE84S3xHCfU989AiEAnD80fQd/xGfOkjjezI61RsMwalKZRdkzS50EKJi9ZKI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72963},"type":"module","engines":{"node":">=18"},"gitHead":"60b4ff391c5ef3e8317d18fba7de12f9d5e51f0a","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.2.2_1781054283198_0.7195851643939224","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"claude-telegram-bot","version":"0.2.3","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.2.3","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"d0f2c67802c0978997c3546741c74c496e011d56","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.2.3.tgz","fileCount":7,"integrity":"sha512-t9GEac6ok1behsD1gNsqgMVwX7Y5td0IFitzRA8SO7UVvRobsy4lviDx9RM/KTKsidQiCODsBMWkFR7yRbp5cw==","signatures":[{"sig":"MEUCIBEx8f+bop++GvKge/QdtCbeDNdePRabxXy8DUHLGdx/AiEAmZBo1RLdWUdpM9jRdEeSbUaXMLuyyj2ZHmFZdnf2n/s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":74535},"type":"module","engines":{"node":">=18"},"gitHead":"b85a7415679fb14f3359094acce95fa7bd39da45","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.2.3_1781086697155_0.48058157190293693","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"claude-telegram-bot","version":"0.2.4","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.2.4","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"40badc47436f43853494c911b82a314ec01fb621","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.2.4.tgz","fileCount":7,"integrity":"sha512-Jh/0+vYMw25ze96ONjJDqd2iXkiWicbItSsI74wO/eKVxoGbHyePqoYzPA8qwFeKXLAhV+tWX02klxxLPM2XCA==","signatures":[{"sig":"MEYCIQCKcYG7ghYNR2v2z3D+cCV9M0WKNAipC1RdE4gXNKkUsgIhAN8gD0YLV+WDOybl3gbmMlw/Rb320j2LRKXuZBqStpkG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":76128},"type":"module","engines":{"node":">=18"},"gitHead":"afca9fec7fe71141ec7635ab9b60d373b54dba26","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.2.4_1781087346924_0.18618701369670076","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"claude-telegram-bot","version":"0.2.5","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.2.5","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"a0a88c793bb2c18330bd45506b13b438bb5e0c28","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.2.5.tgz","fileCount":7,"integrity":"sha512-JKY9IodciIy99G1igvv9NxzU+GR+mRQDt62nCn6j3cXWj/fpKO4KbwMlyrMUbFDmroxl4QDwTFCU2BhHZh2LwA==","signatures":[{"sig":"MEYCIQDBWQIAM8XwPoBCdM7yQrAwAHfRBJrMqbSSOhx/XEM0PgIhAMy5/vBPlvUcjzQW52EBLrLgsuy0+v5SIF4TpVN1RC/s","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":78107},"type":"module","engines":{"node":">=18"},"gitHead":"46b67530952fb8cb0e5f17096d108aac8e99e90a","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.2.5_1781087919640_0.6717279797211058","host":"s3://npm-registry-packages-npm-production"}},"0.2.6":{"name":"claude-telegram-bot","version":"0.2.6","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.2.6","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"055e50bb643742019c1fd049d643ee3979ea1c33","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.2.6.tgz","fileCount":7,"integrity":"sha512-K714pjRV4L3rdGkrUL5n2v/PVAz9x4hkMBXnS3OTW+PRosUOnVe8kdZB2/gOViL+NRe2sgiaTAuEdrL7aeFSDQ==","signatures":[{"sig":"MEQCIBws1U8Ifw86rFM+j2EEJ4SnsnAsFKE8sO2AS6L8R/WHAiAwKY34WATmuPk+7Dn3ra7fHxutD+tEbDy8Kkc5CHr2fw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":78681},"type":"module","engines":{"node":">=18"},"gitHead":"f152ef34af4444709a7d5f389275a9eb5f1786c8","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.2.6_1781129438830_0.11776161281176178","host":"s3://npm-registry-packages-npm-production"}},"0.2.7":{"name":"claude-telegram-bot","version":"0.2.7","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.2.7","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"2ce58efd45e792e43ffb9f186fac76da6deb1084","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.2.7.tgz","fileCount":9,"integrity":"sha512-7rEIYWi9MQFUzKFr4ljHlgv/KO8FlMGOpNkG6wMMn0KkiRSOU2sjRT5O4h/e8aGv47Hld0PQHWq+cLt3JjRqLw==","signatures":[{"sig":"MEUCIQDmrZQDg9EiOGiGuxnRN+fxjRLlS0thKTE67ZaQT3KbXgIgMutK0rRHSAa5XUZY0bpGj6F56P/cBcTKS9EkU/WxBeo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89479},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"bb3a1d5acdb5722fc648f71bdd282a30829bdf90","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.2.7_1781169997938_0.1795509687210508","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"claude-telegram-bot","version":"0.3.0","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.0","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"f3af9e16769cea1676896686f8612b825ce6cf46","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.0.tgz","fileCount":9,"integrity":"sha512-qhb2KucfxFCvbJXrgTueCEhiTv1RTzyAa00PMWyCqt1/tZr+9xvcu9P0Js594MrogDSK+2U1j688SacQRYZ4hA==","signatures":[{"sig":"MEYCIQC6QGitn1jY6i6w5IRzDif8ScdZuf9MSSuh8EL63n1D7wIhAOmkdXtICFpGm3VCz5ka3YATjQsppw5VCAoH/Spc21wV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":94968},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"1d94bf6f56bb15491232721beae9043fbb598238","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.0_1781171106654_0.7413609712150717","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"claude-telegram-bot","version":"0.3.1","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.1","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"3029e4b5ae8c78b1c770e5ce9e8982e2c6d04a94","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.1.tgz","fileCount":9,"integrity":"sha512-NyHRCbi3PtN0tfccvguijBpciuFSNrgovrqoDY+lHvOVo8j9jcxcjDszwGx5dTRPl1i8IrcpKAdYPwlfW/JGCw==","signatures":[{"sig":"MEUCIQCtH0YbwzpoqaQCisIOZ8uBMNoWaNTJ73CeSAm7yMM+3QIgV1b/PhJUbkcpbA6OnLW9u1XeW7enie4j7Mp+Q8WBDbk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":95050},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"77924adf692e7c29a0eaed6adc3682644911d6dd","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.1_1781171411547_0.7085037945349182","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"claude-telegram-bot","version":"0.3.2","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.2","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"898d7a633bdb726b5cf9b6298b5ea2d848d05225","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.2.tgz","fileCount":9,"integrity":"sha512-WXeEfXxyLOU4Y/3Nte7vL1OWvJBNn6ecOZMFxlpLaE36lYJm6yaj4I6Te2RT0HB4FLEH6tLnO1rN+mRdj0p8Jw==","signatures":[{"sig":"MEYCIQCPNtG+VcS+OiIUyVRCvHxcHmDjJsHa3Y0wzCko2mf/MAIhAKuM6A1GdC5zWfIdkgv+pNGwjCuO/AsxrUo/bEPphctm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":97964},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"89c820f72e988d8f2fcf515f76faa89ac7e2a412","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.2_1781176684034_0.1994326207961883","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"claude-telegram-bot","version":"0.3.3","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.3","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"e0941a85efcd215e2f8aabc7b5a23349446c1ff6","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.3.tgz","fileCount":9,"integrity":"sha512-tLr8H8QxBLh6IVwqr4V2iUgTeHesdVwLXox/CIh4AG/iFPvgl4fvUhfRHsi0pn3AvOejm8Chk4bpUzXur+JgtA==","signatures":[{"sig":"MEYCIQDrW3bCCIRP2n2G5g0xJIP8OwweHkA79vvdvG1UW6EYjAIhAPmKCPjDb3yIOrwqWlXSpFz2/rAKmN4oWlLE97bBSA5W","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98411},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"2fff0f2476993573c94fba88ff2b9b2c1e665b7a","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.3_1781242684624_0.22524519588589742","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"claude-telegram-bot","version":"0.3.4","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.4","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"3aaa3039432dfb83167efcb64885bb38809392a6","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.4.tgz","fileCount":9,"integrity":"sha512-DUrYoYMzKDV1UidM3O3hWuMS5dJGPS4YPJmc//klyGP17U+/1jlltfkdIJ2D+kOYdf6e2ScD9P0g7bi4VLgD7w==","signatures":[{"sig":"MEUCIDote5Tn437BP7seOwpfICfxgHMWqrbS1PbiaBsjnIdnAiEAuSv8HqBlH+9H9pFQZd7F+XIrJpxBRemFIaw978oHtEI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98461},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"e7b0a6d688bd74ba9be30172f8c3dc9833e1b990","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.4_1781259172681_0.5805643625367669","host":"s3://npm-registry-packages-npm-production"}},"0.3.5":{"name":"claude-telegram-bot","version":"0.3.5","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.5","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"ba45cb15d51c5f9997e691590fcaf9d6d66ed0c8","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.5.tgz","fileCount":9,"integrity":"sha512-qXRW0RLU5gncYukxEW9OxLpP0iFyBpiyZg1rNnv/HCZkGr+anBQQnvjFSGnQGm5M/eMycZAEJaoeb/yxhR5X4w==","signatures":[{"sig":"MEYCIQDYpQnkB4T0ZBJlyHBHDiWA9zuviYsK6Bsc7Xo01ud/EgIhAMU1VOB3XZx85LePidu3T8f5ed0jtQpFK48FHNppb9R2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":99065},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"58500510b5030af105fd6b536e75be9f4ff623b3","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.5_1781398157895_0.7866142864261068","host":"s3://npm-registry-packages-npm-production"}},"0.3.6":{"name":"claude-telegram-bot","version":"0.3.6","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.6","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"cf984fc04ac2bf8fc7f863bad68a3a2de03908b0","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.6.tgz","fileCount":9,"integrity":"sha512-k3y430KrztCyClV6//6BQFce/7lZYqOW9Ue2XI2uJGE0YjDm801OttKvLZuwlwZzO5ckppHb4MTsDK81H5leUQ==","signatures":[{"sig":"MEUCIAdJk2x+S2mQMLUMOPXJuDJOjmW6kgr8788ivLdos4dNAiEAzL0UGHuKpofeI8kEHoti23Lw3kruHrKfIR+rvvlnQck=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":100153},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"5f0f15c02bba6b365be7fbda427851b5dbf22bda","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.6_1781398549792_0.7578288239087752","host":"s3://npm-registry-packages-npm-production"}},"0.3.7":{"name":"claude-telegram-bot","version":"0.3.7","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.7","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"2538fe4e99477ffbf29f67195761e2580360d159","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.7.tgz","fileCount":9,"integrity":"sha512-s+HHXsjVbUSuY/6WgycW0iQhuF/b//e1FSG7lEO80/RGEiryQlpio8Md+ziRl+t1ydn4xzb3LdbEw6p8ZU2i7w==","signatures":[{"sig":"MEUCIQCEBSsRS2MxkmHRKTYPGTKT/vp5GQMTH5Mi5cNjw4hz4QIgZDVw27yeKZwXMQD2W/k9zF2UCziybivnKdh8AJ3E6ls=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":100204},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"39a476679d72e90a9a2648ef13d53b6c6c3cff05","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.7_1781487922848_0.31746360262710493","host":"s3://npm-registry-packages-npm-production"}},"0.3.8":{"name":"claude-telegram-bot","version":"0.3.8","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.8","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"84a302d29b9d5763ee3e1ba57e5db721677e2599","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.8.tgz","fileCount":9,"integrity":"sha512-og1LaGoYrT554VnwuhLFrUyGFVDt6T0WM2aF/LMtrJTjPu8CkUXrW4UxETbtrgzU00kVf1MJrHKmwjCQPTGsqQ==","signatures":[{"sig":"MEQCIC1ET1NxE8z/Vx6TsA6UBQsCP7lvh2OAI+BxhGOBI7vuAiBC1ZmzgrBn7ZqgvPUI1NC8ddw1aW1o+s+4rxslRoz74w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101625},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"c6192aa9c9b024d4ae6b9e49942a015f0f37945b","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.8_1781513635977_0.6556028939167307","host":"s3://npm-registry-packages-npm-production"}},"0.3.9":{"name":"claude-telegram-bot","version":"0.3.9","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.9","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"00ca15c34589f557d6c97dd12696c33d3a931643","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.9.tgz","fileCount":9,"integrity":"sha512-NlH4NTwODPggJTvBazaJZcfoo9kj4FLfBO1u5ZvWsEgPLYl7UUVsO/JG0VUiRAAGOY+bLocIOZU98E9IixwF4Q==","signatures":[{"sig":"MEYCIQCxIAQfEXOanAfNF6jW5e4cInJtaD4IpZjHPaVnFADM4AIhAIdU85Fgfm5v77hmxoYQfrP0+M+83ffANIbUP9UK+SBj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":102775},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"88255f8da3e947ed2397a8d6bcbd3e77befa1f45","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.9_1781530301609_0.9234173361486753","host":"s3://npm-registry-packages-npm-production"}},"0.3.10":{"name":"claude-telegram-bot","version":"0.3.10","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.10","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"6f3d1e4a5c083e07a9a13bc5a2ac507df55d2486","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.10.tgz","fileCount":9,"integrity":"sha512-3qCpoCmwGa742hW9nODhgr5N68rnkPhofobc+fbAPua91wJEcXZ/3SAs1FgOCsGlMdQ8S9Ii/qWyNKDnhNF3oA==","signatures":[{"sig":"MEYCIQDAxZPDlbQAm9pFS7hgKF2sHXVybbCfkhjv2MH0cdCS1gIhAI4HAPFO54GyjAyHcyCInprU/LcVJgdxQjr58LfP2DAJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":102988},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"63827549faa17d75760c272bd8cc7c0eb1957f16","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.10_1781533362913_0.600598663151364","host":"s3://npm-registry-packages-npm-production"}},"0.3.11":{"name":"claude-telegram-bot","version":"0.3.11","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.11","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"4eada95bfa60626498f515d0af371164366b09b8","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.11.tgz","fileCount":9,"integrity":"sha512-MwCO/jZowudpE37Wwk7oxsznx32fKlh2e5MkdJO8bOH+jmW8fbrex/OaSYdWAXnwFIVpCrWSsaSQmnxUCebFYg==","signatures":[{"sig":"MEQCIATTLWRZU/RSU7HbajgrL2XWxw2HQICBIDKeD4U9fHSvAiBZ7brQWAi+24VxAXLISGhnvfcDTPUDic8LU0iEvGJ2bg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":103286},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"e1497438c8a9d64c34a6605afc6b3897b9a227f4","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.11_1781533731707_0.0935027787970466","host":"s3://npm-registry-packages-npm-production"}},"0.3.13":{"name":"claude-telegram-bot","version":"0.3.13","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.13","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"9b530765670910e268f59b055f61b291c3c377ee","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.13.tgz","fileCount":9,"integrity":"sha512-s4Kk8WceseHf9GEA1VKUkDRBimkZd9q++AwsAcfJZNKZregsQAxk8u6/+hAD0U62HQJqKfpNZo6O5VncSFz0aQ==","signatures":[{"sig":"MEUCIQDLlFeS8+dqeS+TXeP0ve4hODbpMhLySqHPI6c0bA2qQAIgAnOf9U5eD9DTStHI8leGRMB92CGIU/2udg43RIzTU+o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104585},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"9bc9eb0c1c687ca822ec8affd56e96cf039ed0b3","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.13_1781590687263_0.6099638430445686","host":"s3://npm-registry-packages-npm-production"}},"0.3.14":{"name":"claude-telegram-bot","version":"0.3.14","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.14","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"bb0c68dd9450f1713ffc737ed2dbee9d3c37a495","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.14.tgz","fileCount":9,"integrity":"sha512-WmLlMnw0ZoceDL9niVdmG4ARIolxHLloqvuth1TH1mxzlEIdp/f1olKDdFyhhfoIdbzeLtyZk+ISpnuCgEfZpA==","signatures":[{"sig":"MEYCIQDbiLF19c51NO9IOx/e5P447jTX3XszSuqA0zjKwzJB8AIhAK80l7jHx7CmzRTzFImrJgnVu0rHSRBakqnv5bvJPmJM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":106080},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"f892244d1035f598ad907b72f686457072b10742","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.14_1781667786078_0.8517318616294343","host":"s3://npm-registry-packages-npm-production"}},"0.3.15":{"name":"claude-telegram-bot","version":"0.3.15","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.15","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"bf494b1dc807581a931720f7343dafcbe9138fa9","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.15.tgz","fileCount":9,"integrity":"sha512-l6V5cJORUNRiJAU1/rA05pw8pp+KrkKwOz4NayCTSnXZYNu1/xeriUpaDSRYxCQOAKvQXyjK6xCDNDZJ6yafhA==","signatures":[{"sig":"MEUCICKRJ1OMqDZRchx11Uv9Cg4oZOn22vQpGapWzz99VD2iAiEA2j2VQ1I//815TaUlmd6bbIfW39RzOxJWwvZin96HrlU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110788},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"f6962b9091a5767cb8c5bde8d7ed807cdf53c4c7","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.15_1781688785349_0.31931977567771175","host":"s3://npm-registry-packages-npm-production"}},"0.3.17":{"name":"claude-telegram-bot","version":"0.3.17","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.17","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"ab6a4447adde8c5be34e05a36fe1cbba7b14ec54","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.17.tgz","fileCount":9,"integrity":"sha512-waNEaK3jjSYlV5XPDYRq6NWaLqCB65fInrxTMf+ovHTLBHSvNq+L/B9GTgiW/iZ3CUixKRd8Ct5Bf7yNHHMl4g==","signatures":[{"sig":"MEUCIAKm7+epQb0jugCLqGCqQ0nzz4XcE6zlAN7cv7gy8+aUAiEAnDXx71KfcT+OnZU4/BVA2J7tzQr12vWgFeFB6/obYII=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":111160},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"392d72c52cc09f9dce4975c20ddea62ddffaf11a","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.17_1781831293131_0.6102416308526726","host":"s3://npm-registry-packages-npm-production"}},"0.3.18":{"name":"claude-telegram-bot","version":"0.3.18","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.18","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"4ac3982bff4a1908e73b403f7b8ea4dd1255bfd3","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.18.tgz","fileCount":9,"integrity":"sha512-F7+aP0He7kWo0zc8tzsFNTzWKZnjcSlN61JVcflv6Oy85cyxQC/x+JIJ8SfeFRUfW2BS+DYFYuV08CtaJ2xjZw==","signatures":[{"sig":"MEUCICRGZujDWEVu3btmC1Zdg2wiOCDn6HDdcoY22rjGtp/3AiEAyZj1GdDeyuV6JQKnVcWJu23bi/Jd/98oh6SL4zO08RY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":111173},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"0156a003493a8aba58ba92a572ae549ea15dd098","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.18_1781842966835_0.35338348913654793","host":"s3://npm-registry-packages-npm-production"}},"0.3.19":{"name":"claude-telegram-bot","version":"0.3.19","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.19","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"c70e62a0c7e99e690d23ada5f0f0467d2ee3e111","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.19.tgz","fileCount":9,"integrity":"sha512-pfgo/K/jVbHdE3Yi7+1VSefccddVlbkspNxA6FNOJK0Nu2ADdqIJbzz7mjeLTx3v3rRQvys93AAKNhlVKH2zEw==","signatures":[{"sig":"MEQCIAH528p4MBkNxU3HdfEetolPO94Lp1nWfFfvo8IMjOSwAiAEFx70vOE4FEZdR7qEmS3jPbOGofwmu5g9qt9gKRBd7A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112784},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"301d634bf4ab3d1afda0db951ff695279357bd10","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.19_1782172200896_0.11480247662860532","host":"s3://npm-registry-packages-npm-production"}},"0.3.23":{"name":"claude-telegram-bot","version":"0.3.23","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.23","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"dd6bb266874e7a807539da5118b3e6692881abe0","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.23.tgz","fileCount":9,"integrity":"sha512-+mFsw2bKxhpV8OhRSjFk1MpkoRR1vmhbIMsxh+r0uv75D2Tf/SLeiTtBDWWeDZk78f0FVLvAYFiOA87lusV4jA==","signatures":[{"sig":"MEUCIEx6bF7f87ylXhSQ4t3a2C6766CT73x14fKt27Bb9La8AiEAgnkUYBmbvkKAFnuPR6oT5tG2r2KaAVTzpa+sdBmAFD0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":117444},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"172ecf6fa177701b04f3ce9fd993bb1a26c1f1a5","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.23_1782181716690_0.6949780960500183","host":"s3://npm-registry-packages-npm-production"}},"0.3.24":{"name":"claude-telegram-bot","version":"0.3.24","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.24","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"641b57f1cb28d67fbc7b3c3e78e20c5cc2cd41f2","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.24.tgz","fileCount":9,"integrity":"sha512-vqmmxf5JkCgeUiA4XP2jvgDDyyndZb9s8awQMqZ4ROCPRg2DwhQysFsX3cGBlPjBy5heBjlOpBXrnNPtsHKfpg==","signatures":[{"sig":"MEUCIQDeL9pOE1/dJrOLcM/n0tvPEznqmGO0vGmtNVPu4Sf5BAIgLGm9fig2BkNCb9xPBl+6M5iObxBi/jzWS79GDYtqXvY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":117607},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"f6d1a5e4bf7fbeff9bd95d84bcc0f995ecfda5d4","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.24_1782187209745_0.6903210613227735","host":"s3://npm-registry-packages-npm-production"}},"0.3.27":{"name":"claude-telegram-bot","version":"0.3.27","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.27","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"e18838676899a8426a971b0f193d8ecf138a56ee","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.27.tgz","fileCount":9,"integrity":"sha512-c/qx02r4ylvkN+X5ym1qJbkSJOKppo/Z4NFrAY9vu3BLAMinezmlaW0nQgagHuYImeBuz2gdjrTe88dzPjkG9Q==","signatures":[{"sig":"MEUCIQDwcy63QW5sAvtexpaKpG+vUTIGa0nNmNITlIxCUcdsXAIgY0LscVti4I9gXCIOXrURWNCI85t802NVDTomzxLyw1o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":120166},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"9d317f8c143053c181379c1360bbe00f7e847539","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.27_1782342666851_0.09883241474522708","host":"s3://npm-registry-packages-npm-production"}},"0.3.28":{"name":"claude-telegram-bot","version":"0.3.28","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.28","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"22b74920ea9e3acf5a86639375223629c8e04148","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.28.tgz","fileCount":9,"integrity":"sha512-zlw/dJDKre43ehwq2LUWMPzW0WhMWhjDt0TIPzaK/lqJ6cthRj6rtvcXJ9OpcEuYdRedYb1smK59DFt67GhNdw==","signatures":[{"sig":"MEYCIQCXeP9+eg1lH32zWdDvHqtQl/KSja7ACJ+bMeCGaeOyZQIhANi1+TYh1BnOchV01vbCV7Af1B39ELw807hQGAO2Cu4r","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":120167},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"ede30ef6d13c8562f1a87c55e6c0cc8d24d2e6ba","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.28_1782378343411_0.4702592755441237","host":"s3://npm-registry-packages-npm-production"}},"0.3.29":{"name":"claude-telegram-bot","version":"0.3.29","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.29","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"ac58ee526367174597d1de853361d8a5619431d1","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.29.tgz","fileCount":9,"integrity":"sha512-IYQQokZ4BpnxLO24qRR3Z+JPJdUuOG29rui88HAtlqm66t5CcZJOG3RCRMtSN1v0uyoE1KZUSdMeJaqS0FtEIw==","signatures":[{"sig":"MEQCIFRF3vmQkIcImdC9f5U0/tePFfjHVhyYFlk/bZuEumneAiAj4mKm+iNAEnX7jhN0lqEpmbDSBHx9ASVCaK90cWNc+A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121290},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"68edf20266807b60b8abc12f08ba493db9c2a289","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.29_1782484779568_0.3102358570892991","host":"s3://npm-registry-packages-npm-production"}},"0.3.30":{"name":"claude-telegram-bot","version":"0.3.30","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.30","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"b6e51528df5dcbaf95b3f8a1cdea786c20463f17","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.30.tgz","fileCount":9,"integrity":"sha512-bYVhPLd8HLyvRJZOLv9KmY0h6yIQehC4hyqdI/l95Oh5TYphqkPbRLAy/P92KlK/051Uu+b5oPmqshuXf/Rh2Q==","signatures":[{"sig":"MEQCIEZV693bgM9jML0VhPKJfLAVV8+sCMoY/m5hwxu7C1qnAiBQRVbsMdqeF7301cgOUm+YOb1F/l8+/bq9ZysXL5SY0g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":120234},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"35dcc5f4e9af94bda9ae3abb261f0576ee4af9cb","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.30_1782485090544_0.5703272106425992","host":"s3://npm-registry-packages-npm-production"}},"0.3.31":{"name":"claude-telegram-bot","version":"0.3.31","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.31","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"39c52efe4e9640a7084605cb7debc1a2c2d038b3","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.31.tgz","fileCount":9,"integrity":"sha512-AyDcE7/4hHyThxHUNo+wsYnPTs611XzhncgJdeMfJKBY4kYJJngiZhj4QavpP2gpj4dgVZ8h5BK0vl1zPWuG5g==","signatures":[{"sig":"MEYCIQDLSmkx0NkaWdwoHz595d6lHeHHfy0Nz0lwatILBPhNWQIhAKwedO1HD5nn23srXOLYvfvjuOujyE5KN1yk7V6MP1FJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":120289},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"e54bd84b9811f020766e62603e7ec554eb6734bc","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.31_1782485595456_0.9943911956567639","host":"s3://npm-registry-packages-npm-production"}},"0.3.33":{"name":"claude-telegram-bot","version":"0.3.33","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.33","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"f170bc8a511d3267149abac8cf9c0341d62bcf11","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.33.tgz","fileCount":9,"integrity":"sha512-d8mRcyv71XVQTORrhN7lp4pXORhfxw0mDoXO3n+u7aXGkjro4tk9DzEpPPyakJicHt2hEIzgWG9kr+AuDDhP+A==","signatures":[{"sig":"MEUCIGt1l4JIQnqD8hPiVJKBFbAcwauirhCOzWUkHrXE3gduAiEAjAgZhZ1snq5dZYZz2apTncpdWOJG2pbq39vf4CUR6NY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121119},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"aa1c7cc9effad8e96f63bf502f190bf629cf917d","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.33_1782541785877_0.7761264817540674","host":"s3://npm-registry-packages-npm-production"}},"0.3.34":{"name":"claude-telegram-bot","version":"0.3.34","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.34","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"e043d378791f8cb8eb4717504e27fb9713ecbbbc","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.34.tgz","fileCount":9,"integrity":"sha512-ax3h5+0wyS4JECUhbhpwhr7/bR7rRnF1FjnvIxOXnsP8DV5BGZ7eDD9nmg/rypsQcxX5fQ2xmADfHQsLKZ7wmw==","signatures":[{"sig":"MEUCIBnUAkE4KTkHRpZRSK/trv0wbvcWHdqOYfe4iWJubCz7AiEA7q3xbZdH9ArgXjoaxkbVeojwmIRlg3L0RaO2ubRP62Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":123056},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"cf78ef70383b9114a3be5ce541dcca70d63ad056","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.34_1782789797697_0.778926068030888","host":"s3://npm-registry-packages-npm-production"}},"0.3.36":{"name":"claude-telegram-bot","version":"0.3.36","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.36","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"ecb1d01f926cee42bfa0e8fa6402c54e17007c65","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.36.tgz","fileCount":9,"integrity":"sha512-MFO++eRYrvdpHWPzKWksxChe+GoCGAna+iY02Mrp9vgrrKCOegJ1aYqQTJCbk4BQtrRhrZUMEuFNyLpkBc+V6A==","signatures":[{"sig":"MEYCIQCdbUXcCLXnS6TM4jZIi0HUK43H/BtmgdD9hCd3ap0xvAIhAKReU6HvkPW0hyyTTfVYkGOl5EOTGwS4mYAnjs6NzDXe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":134868},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"30bfe00e84319d3b73fe90683270b1fd6070399b","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.36_1783069161504_0.023862432293233038","host":"s3://npm-registry-packages-npm-production"}},"0.3.40":{"name":"claude-telegram-bot","version":"0.3.40","keywords":["claude","claude-code","anthropic","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.3.40","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"af0cb5f6e497ca3b4146aa05699ca126db544b0b","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.3.40.tgz","fileCount":9,"integrity":"sha512-+KK2uLaobR5DCd1oTA8Z0c3H06n3bBfkahHbNJ8Eq+dcF5wlZkY/Qa7DlGhjT1D4yMwAHP1A4knjuQat+Dpe5w==","signatures":[{"sig":"MEUCIQCg67MZg6bkMW0HL/70pN65th+/qhgwx14VoWHcpnr5FAIgZRPVfgrch6sVuEvRB9biQ5WV4XVZaLBYdpeE++Dp73A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":138323},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"c9a87153a4be7b10e461627c12940b2625bed158","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code from Telegram — messages run headless `claude -p` in a project dir and replies come back to the chat. Zero dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.3.40_1783373569013_0.4869452250536639","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"claude-telegram-bot","version":"0.4.0","keywords":["claude","claude-code","anthropic","codex","openai","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.4.0","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"70e498c02c6c879de3872d9763fadbe1896b6f4e","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.4.0.tgz","fileCount":10,"integrity":"sha512-v7EBhL+CnR43emRPLEDxJ8TeBF72xB3dBhUmY6+8d3qdpYVgWawNvq0OCVmVaADK12Pg/KrSSZmL8s4oSrzY3g==","signatures":[{"sig":"MEUCIE8whti+luM7Ei3aMp4jvgu6cDbkUc6oeWaJHCsh2SI1AiEA5YADVi2N/6s93yIzAotyT0UYALRobTlvZjKiO+OCY90=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":187543},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"c9a87153a4be7b10e461627c12940b2625bed158","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code or Codex from Telegram with persistent sessions, provider switching, and zero runtime dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.4.0_1783654088366_0.3623856008532742","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"claude-telegram-bot","version":"0.4.1","keywords":["claude","claude-code","anthropic","codex","openai","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.4.1","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"6215b698f5a9754d0b010d2e21b6411a5a005738","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.4.1.tgz","fileCount":10,"integrity":"sha512-G6BdDP69OQPI77sOuuPaBn4xB5atZGaSxUPV47hw253yRFKPq0elNpEYR5GaiE8JclNJf3UgkjyjtdL0XUQpEg==","signatures":[{"sig":"MEUCIBrdUxMaZMqWuYJk3K7ZnDccG2JUmn5dZhEEERMSbNJ7AiEAj2CyPGaYZGtvO+FB6R/e2o2d5SnRawL3UlNWMG/0MW8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":188768},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"c9a87153a4be7b10e461627c12940b2625bed158","scripts":{"start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code or Codex from Telegram with persistent sessions, provider switching, and zero runtime dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.4.1_1783659591808_0.8314062196235394","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"claude-telegram-bot","version":"0.4.2","keywords":["claude","claude-code","anthropic","codex","openai","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.4.2","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"9b931eccf52a90ac441cc213a84aa2bca940ac65","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.4.2.tgz","fileCount":10,"integrity":"sha512-I/u7H+p4zvCEyWseV9kA92Wb6bMjPqot9J5OFTZdSUPJAGs4Ssi0JTo8TuqVAgJpOABrHtIph4+/CAHZ+ZV4mw==","signatures":[{"sig":"MEUCIQD9gieajTsHZZHBCmqYWVfl7XuAPrQIUtuMB2jiFMBlvgIgfZ2hfzi7uaIyjHX75rCQRKPsOx2yXoAXHqSOXCc9VK8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":196176},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"6b68f36055f1f02a44083f79aa783e7a80a9269d","scripts":{"test":"npm run smoke","smoke":"node --check bot.mjs && node --check ctb.mjs && node bot.mjs --version && node ctb.mjs --version","start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code or Codex from Telegram with persistent sessions, provider switching, and zero runtime dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.4.2_1784014886901_0.028328669486831215","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"claude-telegram-bot","version":"0.4.3","keywords":["claude","claude-code","anthropic","codex","openai","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.4.3","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"66fc887a04773a8eba94b56e4db90aef4cc059b2","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.4.3.tgz","fileCount":10,"integrity":"sha512-l3BPreuMc3MjH5iq62Dfox0aT/UeH1mQVx/Wq0pc2yaJIh06iOUqGBtfXQNw+59p+wxUNdwaA07jURt6g0vctQ==","signatures":[{"sig":"MEQCIEkDCLvpexeYQVpnIDwMTIEEmfKJVAnZQU/t18+GWPuZAiB9ioP3Ix7UfpCWyRW+lb3HLLghByxOlNSwUpgou4Rh9g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":205974},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"032f7546744ab5a2f28d90e2b9762f3ba1d5cb42","scripts":{"test":"npm run smoke","smoke":"node --check bot.mjs && node --check ctb.mjs && node bot.mjs --version && node ctb.mjs --version","start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code or Codex from Telegram with persistent sessions, provider switching, and zero runtime dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.4.3_1784195017261_0.3936256277564254","host":"s3://npm-registry-packages-npm-production"}},"0.4.5":{"name":"claude-telegram-bot","version":"0.4.5","keywords":["claude","claude-code","anthropic","codex","openai","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.4.5","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"c5d2167180851481f9f72a2a74b5ce1d42038701","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.4.5.tgz","fileCount":10,"integrity":"sha512-4Frhx9zvDxhFXdURY0a+Bd4gVtB1Q1jY3dMEWa1H30YkA+IIM2ygaJJnE53OQDx0qVVpHUYNdzgpjOUzrj9p8Q==","signatures":[{"sig":"MEUCIAQlsTwHNBoylvDLSK0cG33KEEw89LcvSMjAuZPD81QGAiEAsw3YGAus1sScTEcpgqHjtys5/+qcvZS8Zd95L4rA63I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":210607},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"51733b47919eb74db0d123bfede84e1f38a7a6a3","scripts":{"test":"npm run smoke","smoke":"node --check bot.mjs && node --check ctb.mjs && node bot.mjs --version && node ctb.mjs --version","start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code or Codex from Telegram with persistent sessions, provider switching, and zero runtime dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.4.5_1784516804906_0.8762137154834482","host":"s3://npm-registry-packages-npm-production"}},"0.4.6":{"name":"claude-telegram-bot","version":"0.4.6","keywords":["claude","claude-code","anthropic","codex","openai","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.4.6","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"ef1df4164ab3f3d7e4d2754e3525281eac288c79","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.4.6.tgz","fileCount":10,"integrity":"sha512-l2QG+pkyJOyyzVYupmrf8pts8u7SUFhEPLooXLG/RyMlXEOD1n5JsUz+uF6YRABs4IrqZ4B2DX2Y2dU/BPeE1w==","signatures":[{"sig":"MEUCIF4xsgOu4fjaM/nxSberM6WRPwocglNImOgX0a5NPAtqAiEAjGmNCe2N6QcONfa0pbDm6BfSO2+uFAcRhjfjtrVzX+4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":219225},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"91e140e07fc6d0248d6103a68d58427e4cdc48b8","scripts":{"test":"npm run smoke","smoke":"node --check bot.mjs && node --check ctb.mjs && node bot.mjs --version && node ctb.mjs --version","start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code or Codex from Telegram with persistent sessions, provider switching, and zero runtime dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.4.6_1785136197058_0.9923352845988977","host":"s3://npm-registry-packages-npm-production"}},"0.4.8":{"name":"claude-telegram-bot","version":"0.4.8","keywords":["claude","claude-code","anthropic","codex","openai","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.4.8","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"5a48385a620fd4e6f3871af25bb979c559e80c1b","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.4.8.tgz","fileCount":10,"integrity":"sha512-V8sXF5YwvC/2EHZH4HPgjvUBF0zJ0Yvy+7MLCyCWsqMjGFNw0nlyCO6MfVFaQvnTlOJroGDn0iBG0k/8gCERGg==","signatures":[{"sig":"MEYCIQCsmWyTVULBF06GPsDSKY99hpPmYrWUCnbGy9rkA357MQIhAIMr+iuq/4KnwcA23CrKYy+1wizCZjmUUJ+Y+gLTd+T8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":230247},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"d642a5f2aebcb9489e20e0dd1abdefc71742c09c","scripts":{"test":"npm run smoke","smoke":"node --check bot.mjs && node --check ctb.mjs && node bot.mjs --version && node ctb.mjs --version","start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code or Codex from Telegram with persistent sessions, provider switching, and zero runtime dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.4.8_1785387879408_0.470572999099125","host":"s3://npm-registry-packages-npm-production"}},"0.4.9":{"name":"claude-telegram-bot","version":"0.4.9","keywords":["claude","claude-code","anthropic","codex","openai","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.4.9","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"4b36532c17d14df8310397cfd7b14d4defb0d700","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.4.9.tgz","fileCount":10,"integrity":"sha512-2Y8coTXQg8RZ3i2SMZFE995jfG54KfIoR4L61IhFFoEKpt+Gn3P+Fqqxdn2JdgpmVuiYOq1jNQat+CERCR9wog==","signatures":[{"sig":"MEUCICXctuLb5l9kE8vuryoAk2478CJ5s9RWBm0AI2jVneqgAiEAtDmtfPHJMeLmeG0YLUGjq8q1n5L5vndnR2rHv/RpN8E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":234621},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"b28b4cf89586a4e36c9a8c091e964d97aa08703c","scripts":{"test":"npm run smoke","smoke":"node --check bot.mjs && node --check ctb.mjs && node bot.mjs --version && node ctb.mjs --version","start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code or Codex from Telegram with persistent sessions, provider switching, and zero runtime dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.4.9_1785396092376_0.027511309897890968","host":"s3://npm-registry-packages-npm-production"}},"0.4.10":{"name":"claude-telegram-bot","version":"0.4.10","keywords":["claude","claude-code","anthropic","codex","openai","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.4.10","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"b27202c09c19ef102ab003d4f536b29f947ea856","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.4.10.tgz","fileCount":10,"integrity":"sha512-hT0R1yKyx8uwFVBF5Py/FaZuI0kFn/i7LGv10sN6dz/he6IPT/kWSHrIfR47PTsfn9gsr2ehsJw44O0q3qvtsA==","signatures":[{"sig":"MEUCIGt3QaK3urLzTIPtk82Nfwbpc1FuwU1HaHZcaeZu7PVxAiEAm4v4eLapJjakjcVr8u68kJAgYoQarr3r42kfiMMFt/Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":252534},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"825f6dd8af7001fe104c9b1d0a236a7168eeb97a","scripts":{"test":"npm run smoke","smoke":"node --check bot.mjs && node --check ctb.mjs && node bot.mjs --version && node ctb.mjs --version","start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code or Codex from Telegram with persistent sessions, provider switching, and zero runtime dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.4.10_1785423661637_0.18822782321604326","host":"s3://npm-registry-packages-npm-production"}},"0.4.11":{"name":"claude-telegram-bot","version":"0.4.11","keywords":["claude","claude-code","anthropic","codex","openai","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.4.11","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"2d03aa621fa0f0eacd15d1c1de5099133b4bdf6c","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.4.11.tgz","fileCount":10,"integrity":"sha512-w1RN9FWhieXA1pn3DsgaEgOzIh7qhD+Ft0RqskWE0x1HmOBcbW75yc0ZHpojuTzP9gImHFjssneqJLtqFxbmlQ==","signatures":[{"sig":"MEUCIQCMayO399YfxNt2MAuuHzcCKI2+T0Y1MOdOOzPesWk2KQIgfM4xk4tC4UgzZPc+P9jMHCRiu+SmEk7KjRywokyUuzA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":320211},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"ee64a20718034bed66450e88f33e4bc35d86b4f2","scripts":{"test":"npm run smoke","smoke":"node --check bot.mjs && node --check ctb.mjs && node bot.mjs --version && node ctb.mjs --version","start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code or Codex from Telegram with persistent sessions, provider switching, and zero runtime dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.4.11_1786702892814_0.3612091168302649","host":"s3://npm-registry-packages-npm-production"}},"0.4.12":{"name":"claude-telegram-bot","version":"0.4.12","keywords":["claude","claude-code","anthropic","codex","openai","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.4.12","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"49955b15ace05d8690deca50e136e8ba41cd78a3","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.4.12.tgz","fileCount":10,"integrity":"sha512-rlv3KpyAkPPRx+/C9xdKjeZMZ5g59L1IBkNxsxWp3P4BYaDtVB/O+BgcrVYZWpBqYSGCZ047NrZRLG30aPObGQ==","signatures":[{"sig":"MEUCIEbJwwCSkvTbZiIGf2IurBSbEY+fWqcewLgphC93WqN7AiEA6NVCZoThECq6UgaVCbCoNlZFPDbbIOXBYRrXGBUyoa8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":340573},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"d6b8f84d2427c95480f82f0dacb829da2dcc1be0","scripts":{"test":"npm run smoke","smoke":"node --check bot.mjs && node --check ctb.mjs && node bot.mjs --version && node ctb.mjs --version","start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"10.9.0","description":"Drive Claude Code or Codex from Telegram with persistent sessions, provider switching, and zero runtime dependencies.","directories":{},"_nodeVersion":"23.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.4.12_1787266932911_0.844220218996091","host":"s3://npm-registry-packages-npm-production"}},"0.4.13":{"name":"claude-telegram-bot","version":"0.4.13","keywords":["claude","claude-code","anthropic","codex","openai","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.4.13","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"d7130d8e0278828546f0487ee4ea720434ab044d","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.4.13.tgz","fileCount":10,"integrity":"sha512-+hq54BNj9aZNfrWI152Et5s7qe3hDD8UC5tRn7QDeNGarYWXpcsJOT0PIVOhB69pk1sbhMnbTl2HDayhXzAAHQ==","signatures":[{"sig":"MEYCIQC0SAhhteEisqmXybeuOUOej638C5j/qtsyajwyR7xaqgIhALf2puWdtrvUWXelxfQCcXcLKONGvI/fKG1D2zzVrS92","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":496982},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"d0647e3048597bd063c113adee03c0d2f98e99fd","scripts":{"test":"npm run smoke","smoke":"node --check bot.mjs && node --check ctb.mjs && node bot.mjs --version && node ctb.mjs --version","start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"11.17.0","description":"Drive Claude Code or Codex from Telegram with persistent sessions, provider switching, and zero runtime dependencies.","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.4.13_1787818111797_0.05189603980913926","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"claude-telegram-bot","version":"0.5.0","keywords":["claude","claude-code","anthropic","codex","openai","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.5.0","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"e5bc76bcb69ad2f099d89279df6dbdb528fa2b44","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.5.0.tgz","fileCount":10,"integrity":"sha512-NseC4ADSJcQ3T0z+Kr0Lgt0yHlC2pAVI/LdnfXNM9okrez3bcxPid6gYUfH1j/3pnFc5TzMrpCtQRHzd4/HpTA==","signatures":[{"sig":"MEUCIACu6wKGRzhvdC5nq4MfpqXFCdImiYsAsOuJamlDl/sUAiEA5ghNkVWvQ8X313wKDSZCYDaKSGxOo1Hr0YiSu5N3pvw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDFWXdjhrnnToIdO4Dvu8v7ERcZpA/OYhyFen9czWfzcQIgWNK5q9UTAt3+X9HjDj2x1yk+cO8i7QARrAQwo4QvIrU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":612974},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"06e913cd6ad55a0fbc8099ced8f0037cdae50991","scripts":{"test":"npm run smoke && node tests/run.mjs","smoke":"node --check bot.mjs && node --check ctb.mjs && node bot.mjs --version && node ctb.mjs --version","start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"11.17.0","description":"Drive Claude Code or Codex from Telegram with persistent sessions, provider switching, and zero runtime dependencies.","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.5.0_1790835863438_0.7627163454011037","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"claude-telegram-bot","version":"0.6.0","keywords":["claude","claude-code","anthropic","codex","openai","telegram","bot","cli","headless"],"author":{"name":"Jongtaek Choi"},"license":"MIT","_id":"claude-telegram-bot@0.6.0","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"dist":{"shasum":"edb280027cf2036bc99c3e320a79a3772efd4d1e","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.6.0.tgz","fileCount":10,"integrity":"sha512-J3/W1YbT1vtU5MBG/2101dnY5Examb4sAkZGHqSl+cb4MTFbzcRDTX+m4ncRrILnQC3KxeaPwDHgAPuEHjTFCQ==","signatures":[{"sig":"MEUCIBpHqYls4iyZDIpn1eME4Q9ei2d7NVAPh+R6EkZqjcwFAiEA5MZPQ+pgY/YySUZ1kxR0y59Ac2Fmw8DCLBXRqh2uYfo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCTL9mqP2+u6HG9StpLCExf8Ftcl6T2lZx0RBHx6GH1tAIhANInZUsR9WU03J0Ub2ILJn557NKqp1uXg5x00PW/5Xjf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":626585},"type":"module","engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"b92248cb1a07669f4f483b6171cac634037e8258","scripts":{"test":"npm run smoke && node tests/run.mjs","smoke":"node --check bot.mjs && node --check ctb.mjs && node bot.mjs --version && node ctb.mjs --version","start":"node bot.mjs"},"_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"11.17.0","description":"Drive Claude Code or Codex from Telegram with persistent sessions, provider switching, and zero runtime dependencies.","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/claude-telegram-bot_0.6.0_1790839400816_0.38977481160855487","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"_id":"claude-telegram-bot@0.7.0","bin":{"ctb":"ctb.mjs","claude-telegram-bot":"bot.mjs"},"bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"dist":{"shasum":"6e2ba5ff2f9653681fcf4130c7e04e5695aec9bc","tarball":"https://registry.npmjs.org/claude-telegram-bot/-/claude-telegram-bot-0.7.0.tgz","fileCount":10,"integrity":"sha512-xo2NEXT2ScnboQ74xtUqBYDCX1aEGmc/i2GWPtSqbPdI0opT2G2DtL1nA8pT/OAWNnfNEFZBKTssHNVi1+dJ+Q==","signatures":[{"sig":"MEQCIGYf11co/teo2SEC+pqjfP0AsfW1T1bVe1nisqSaBUBoAiABcEEf1XNFvQfay51WJYjx0qmlpm0odxB359a3K+4vcg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBjcGw9BPL9eHHo4IV/Bhpz/nLr4Q13b2czIEC+Hz/KTAiB0BMzwioWei37ACrSMTKsihpCg//8oKMEjoQCs6YE+ww=="}],"unpackedSize":672852},"name":"claude-telegram-bot","type":"module","author":{"name":"Jongtaek Choi"},"engines":{"node":">=18"},"exports":{"./session.mjs":"./session.mjs"},"gitHead":"88b19060c5be57a89302bcaeb0ddc8617dd74a19","license":"MIT","scripts":{"test":"npm run smoke && node tests/run.mjs","smoke":"node --check bot.mjs && node --check ctb.mjs && node bot.mjs --version && node ctb.mjs --version","start":"node bot.mjs"},"version":"0.7.0","_npmUser":{"name":"jongtaek","email":"lastchoice86@naver.com"},"homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","keywords":["claude","claude-code","anthropic","codex","openai","telegram","bot","cli","headless"],"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"_npmVersion":"11.17.0","description":"Drive Claude Code or Codex from Telegram with persistent sessions, provider switching, and zero runtime dependencies.","directories":{},"maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/claude-telegram-bot_0.7.0_1790920535853_0.9049677314274851"}}},"time":{"created":"2026-06-09T07:57:41.434Z","modified":"2026-10-02T05:55:36.189Z","0.1.0":"2026-06-09T07:57:41.601Z","0.2.0":"2026-06-09T22:58:20.815Z","0.2.1":"2026-06-09T23:20:10.715Z","0.2.2":"2026-06-10T01:18:03.370Z","0.2.3":"2026-06-10T10:18:17.274Z","0.2.4":"2026-06-10T10:29:07.054Z","0.2.5":"2026-06-10T10:38:39.775Z","0.2.6":"2026-06-10T22:10:39.046Z","0.2.7":"2026-06-11T09:26:38.091Z","0.3.0":"2026-06-11T09:45:06.786Z","0.3.1":"2026-06-11T09:50:11.673Z","0.3.2":"2026-06-11T11:18:04.166Z","0.3.3":"2026-06-12T05:38:04.771Z","0.3.4":"2026-06-12T10:12:52.830Z","0.3.5":"2026-06-14T00:49:18.041Z","0.3.6":"2026-06-14T00:55:49.913Z","0.3.7":"2026-06-15T01:45:23.001Z","0.3.8":"2026-06-15T08:53:56.116Z","0.3.9":"2026-06-15T13:31:41.759Z","0.3.10":"2026-06-15T14:22:43.093Z","0.3.11":"2026-06-15T14:28:51.843Z","0.3.13":"2026-06-16T06:18:07.404Z","0.3.14":"2026-06-17T03:43:06.261Z","0.3.15":"2026-06-17T09:33:05.557Z","0.3.17":"2026-06-19T01:08:13.272Z","0.3.18":"2026-06-19T04:22:46.981Z","0.3.19":"2026-06-22T23:50:01.042Z","0.3.23":"2026-06-23T02:28:36.814Z","0.3.24":"2026-06-23T04:00:09.901Z","0.3.27":"2026-06-24T23:11:07.014Z","0.3.28":"2026-06-25T09:05:43.670Z","0.3.29":"2026-06-26T14:39:39.711Z","0.3.30":"2026-06-26T14:44:50.690Z","0.3.31":"2026-06-26T14:53:15.599Z","0.3.33":"2026-06-27T06:29:46.024Z","0.3.34":"2026-06-30T03:23:17.861Z","0.3.36":"2026-07-03T08:59:21.632Z","0.3.40":"2026-07-06T21:32:49.149Z","0.4.0":"2026-07-10T03:28:08.529Z","0.4.1":"2026-07-10T04:59:51.948Z","0.4.2":"2026-07-14T07:41:27.046Z","0.4.3":"2026-07-16T09:43:37.408Z","0.4.5":"2026-07-20T03:06:45.051Z","0.4.6":"2026-07-27T07:09:57.199Z","0.4.8":"2026-07-30T05:04:39.554Z","0.4.9":"2026-07-30T07:21:32.514Z","0.4.10":"2026-07-30T15:01:01.873Z","0.4.11":"2026-08-14T10:21:32.962Z","0.4.12":"2026-08-20T23:02:13.064Z","0.4.13":"2026-08-27T08:08:31.921Z","0.5.0":"2026-10-01T06:24:23.537Z","0.6.0":"2026-10-01T07:23:20.965Z","0.7.0":"2026-10-02T05:55:36.003Z"},"bugs":{"url":"https://github.com/JongtaekChoi/claude-telegram-bot/issues"},"author":{"name":"Jongtaek Choi"},"license":"MIT","homepage":"https://github.com/JongtaekChoi/claude-telegram-bot#readme","keywords":["claude","claude-code","anthropic","codex","openai","telegram","bot","cli","headless"],"repository":{"url":"git+https://github.com/JongtaekChoi/claude-telegram-bot.git","type":"git"},"description":"Drive Claude Code or Codex from Telegram with persistent sessions, provider switching, and zero runtime dependencies.","maintainers":[{"name":"jongtaek","email":"lastchoice86@naver.com"}],"readme":"# Claude Telegram Bot\n\n[한국어](./README.ko.md) · **English**\n\n[![npm version](https://img.shields.io/npm/v/claude-telegram-bot.svg)](https://www.npmjs.com/package/claude-telegram-bot)\n[![npm downloads](https://img.shields.io/npm/dm/claude-telegram-bot.svg)](https://www.npmjs.com/package/claude-telegram-bot)\n[![license](https://img.shields.io/npm/l/claude-telegram-bot.svg)](./LICENSE)\n\nUse Claude Code or Codex from Telegram — run coding agents anywhere, from any device.\n\n**A zero-dependency, daemonized Telegram bridge for Claude Code and Codex — no Bun, no Python, no open session.**\n\nA small bridge that takes your Telegram messages, runs the selected coding provider in a project\nfolder, and sends the result back to the chat. It uses only Node 18+ built-ins, with no runtime\ndependencies to install.\n\n```text\n  📱 Telegram                        🖥  your machine — background daemon\n  ─────────────────                  ──────────────────────────────────────\n  \"run the tests\"  ───────────────▶  bot.mjs  (long-polling, zero deps)\n                                       ├─ Claude  →  sessions[room].sessionId\n                                       ├─ Codex   →  sessions[room].codexSessionId\n                                       └─ Ollama     (mode / fallback)\n                                              │\n  \"12 passed, 1 failed …\"  ◀──────────────────┘\n\n  hit a rate limit?   Claude ─▶ Codex ─▶ codex-handoff.md ─▶ next Claude call\n```\n\nDrive a coding agent from your phone: run tests, edit files, commit, push — all from a chat.\nIt runs as a **background daemon** (launchd), so there's no interactive session to keep open.\n\n## What it looks like\n\n| Ask it to work | Approve before it acts |\n|-|-|\n| <img src=\"docs/images/01-chat.png\" width=\"360\" alt=\"Asking the bot to run tests and getting a summary back\"> | <img src=\"docs/images/02-plan.png\" width=\"360\" alt=\"/plan showing a plan with Proceed and Cancel buttons\"> |\n| A message becomes a real task in your repo. | `/plan` runs read-only, then waits for ✅ / ❌. |\n\n| Switch provider by tapping | Notes the bot ignores |\n|-|-|\n| <img src=\"docs/images/03-provider.png\" width=\"360\" alt=\"/provider showing claude, codex and default buttons\"> | <img src=\"docs/images/04-notes.png\" width=\"360\" alt=\"A message starting with // marked only with an eyes reaction\"> |\n| No typing — the active one is marked ✅. | `//` leaves a note without queueing it. |\n\n> ### ⚠️ This is a remote code-execution tool by design. Read the [Security](#security) section before running it.\n> A message you send from Telegram is executed as a command on the machine running the bot.\n> With `permissionMode: bypassPermissions`, a one-line message can run **anything** as your user.\n\n**Contents** — [Quick start](#3-minute-quick-start) · [Why](#why-this-exists) · [How it compares](#how-it-compares) · [Security](#security) · [Install & run](#install--run) · [Configuration](#configuration) · [Custom commands](#custom-commands) · [Scheduled tasks](#scheduled-tasks-cron) · [Multiple projects](#running-multiple-projects) · [Personas](#multiple-personas-roles) · [Always-on](#always-on-with-launchd-macos)\n\n## 3-minute quick start\n\nPrerequisites: **Node.js 18+**, the **Claude Code `claude` CLI installed and authenticated**, and a Telegram bot token from `@BotFather`.\n\n```sh\nnpm i -g claude-telegram-bot\nctb init ~/botconfigs/my-project\n```\n\nInstalling gives you two commands, `claude-telegram-bot` and the shorter `ctb`. The rest of this\nguide uses `ctb`.\n\nEdit `~/botconfigs/my-project/mybot.json`:\n\n```json\n{\n  \"token\": \"BOT_TOKEN_FROM_BOTFATHER\",\n  \"allowedChatId\": \"\",\n  \"projectDir\": \"/ABSOLUTE/PATH/TO/PROJECT\",\n  \"claudeBin\": \"/ABSOLUTE/PATH/TO/claude\",\n  \"permissionMode\": \"acceptEdits\"\n}\n```\n\nStart once to discover your chat ID:\n\n```sh\nctb bot ~/botconfigs/my-project/mybot.json\n```\n\n> `ctb bot` starts the bot daemon. Without `bot`, `ctb mybot.json` does something different — it\n> takes over that bot's session **in your terminal**. Useful later, not now.\n> (See [Configuration](#configuration).)\n\nSend any message to the Telegram bot. It replies with your `chatId`. Put that value into `allowedChatId`, restart the bot, then send something useful:\n\n```text\nrun the tests and summarize any failures\n```\n\nFor a no-install trial, use `npx claude-telegram-bot init` and `npx claude-telegram-bot` instead. To\nrun Codex instead of (or alongside) Claude, see [Configuration](#configuration).\n\n> **Running several things at once? Consider a group instead of a DM.** In a group with Topics\n> turned on, each topic is its own room — separate session, separate queue, running in parallel —\n> and `/newchat` opens a fresh one whenever you want to start something on the side. The cost: the\n> bot has to be a group admin, and **everyone in that group can command it**. If it's just you, a\n> DM is safer and needs no setup.\n> Step by step, including the BotFather privacy setting: **[Using the bot in a group](docs/group-setup.md)**.\n> Short version: invite the bot, and it posts the chat ID you need to paste into `allowedChatId`.\n\n## Why this exists\n\nSometimes you are away from your desk but still want to ask a coding agent to inspect a repo, run\ntests, make a small edit, or prepare a commit. Remote desktop and SSH are heavy for that; a Telegram\nchat is enough.\n\nThis project is intentionally small: a CLI/daemon that reuses the `claude` and/or `codex` CLI already\nauthenticated on your machine. It is best for a Mac mini, home server, dev box, or personal VPS that\nyou already trust.\n\n**Highlights**\n\n- **Zero dependencies** — just Node 18+. No npm install, no supply chain.\n- **Multi-project** — one codebase drives many projects via per-project config files.\n- **Multi-persona** — split the *same* project into role-based bots (e.g. Developer + Planner)\n  with per-bot system prompts and **differentiated permission levels**.\n- **Session continuity** — conversations resume across restarts (`--resume`); `/new` to reset.\n- **Provider switching** — use Claude or Codex as the main agent and switch with `/provider`.\n- **Fallback handoff** — Codex can take over when Claude hits a limit and leave handoff notes.\n- **Attachments** — send photos/docs/voice/video (round video messages and GIFs too); they're saved locally and handed to the active provider. Albums come through whole (stickers are skipped). **The agent can only open images, text and PDFs** — video and audio just land as files, so reading them needs `ffmpeg` frames or a transcription step. Telegram's Bot API caps downloads at **20 MB**.\n- **Always-on** — ships with a launchd template for macOS (auto-start, auto-restart).\n\n## How it compares\n\nThis space is crowded, and Anthropic now ships an official solution. Here's an honest map so you\ncan pick the right tool:\n\n| | This bot | [Official Claude Code Channels](https://code.claude.com/docs/en/channels) | [claude-code-telegram](https://github.com/RichardAtCT/claude-code-telegram) |\n|---|---|---|---|\n| Runtime | **Node built-ins only** | Bun + MCP plugin | Python 3.11+ + libs |\n| Execution model | headless Claude or Codex process per message | events pushed into an **open** `claude --channels` session | Claude SDK / CLI |\n| Stays running as | **background daemon** (no session open) | a live interactive session you keep running | service / daemon |\n| Multi-persona, permission-scoped bots on one repo | **yes** (dev=`bypass`, planner=`plan`) | no | no |\n| Per-action permission approval (inline buttons) | no (set `permissionMode`) | **yes** | partial |\n| Feature breadth (webhooks, cron, voice, export) | minimal | medium | **large** |\n| Runtime dependencies | **none (Node built-ins)** | plugin runtime | Python packages |\n\n**Use the official Channels** if you want per-action approvals and don't mind keeping a session\nopen. **Use claude-code-telegram** if you want maximum features. **Use this** if you want a\nminimal, auditable, zero-dependency daemon — and especially if you want **role-split persona bots**\nwith different permission levels on the same project.\n\n---\n\n## Security\n\n**Treat this tool like an SSH key into your machine that lives in a chat app.** It is designed\nto execute commands; that power is the point, and also the risk. Read this before exposing it.\n\n### Threat model — who can run commands on your machine\n\n1. **The allowed chat.** Anyone with access to the Telegram account whose `chatId` you allow can\n   run commands. Lock your phone and Telegram account (2FA). If the allowed chat is a **group**, that\n   means every member of it — the whitelist is per *room*, not per person, so adding someone to the\n   group hands them the bot. **This applies identically to rooms opened with `/allow`** — a chat added\n   from your DM has exactly the same access as one written into `config.json`.\n2. **Whoever holds the bot token.** The token is the bot's password. With it, an attacker can read\n   incoming messages and impersonate the bot. The `allowedChatId` whitelist still blocks command\n   *execution* (Telegram-supplied `chatId`s can't be forged), but **treat a leaked token as an\n   incident**: revoke it via `@BotFather` → `/revoke` and issue a new one.\n3. **Prompt-injected content.** If you forward a webpage, file, or repo issue and ask the bot to act\n   on it, malicious instructions inside that content can steer Claude. Don't pipe untrusted content\n   into a `bypassPermissions` bot.\n\n### Non-negotiables\n\n- **Always set `allowedChatId`.** Until you do, the bot refuses to run anything and just replies\n  with the chat's ID. Once set, only that chat can issue commands — this is your only auth layer,\n  so it must be set.\n- **Guard the token like a credential.** `config.json` and `state.json` are in `.gitignore` so you\n  don't commit it — keep it that way. Never paste the token into issues, logs, or screenshots. The\n  startup log redacts it (`token: <redacted>`); don't add it back.\n- **The bot itself is not a security boundary.** Provider controls reduce risk but do not isolate\n  Telegram, custom commands, or the daemon process. Claude runs with `permissionMode`; Codex uses\n  `codexSandbox`. Both processes still inherit the daemon user's environment and credentials.\n\n### Choose the least permission you can live with\n\nClaude and Codex use different safety controls. Switching provider can therefore change the\neffective permission boundary.\n\nFor Claude, `permissionMode` is the main safety dial:\n\n| Mode | What it allows | Use when |\n|---|---|---|\n| `plan` | Read & plan only, no edits | Q&A, code review, a \"planner\" persona |\n| `acceptEdits` | Auto-approve file edits; other actions (shell, etc.) still gated | **Recommended default** — useful but bounded |\n| `bypassPermissions` | Everything auto-runs, **including arbitrary shell** | You accept that one chat message = arbitrary code execution |\n\nPractical hardening:\n\n- Prefer `acceptEdits` over `bypassPermissions` unless you specifically need autonomous shell/git.\n- Point `projectDir` at a **specific project**, not your home directory — limit the blast radius.\n- For multi-persona setups, give only **one** bot `bypassPermissions`; keep the rest on `plan`.\n- Consider running on a dedicated user account or VM if you'll leave it always-on.\n- For Codex, keep `codexSandbox: \"workspace-write\"` unless you understand the implications of a\n  broader sandbox setting. `/plan`, `/compact`, and automatic compact are currently Claude-only.\n- Custom `/commands` run directly as the daemon user; neither `permissionMode` nor `codexSandbox`\n  restricts them.\n\n### Reporting a vulnerability\n\nFound a security issue? Please open a GitHub issue (or contact the maintainer privately for\nsensitive reports) rather than posting exploit details publicly.\n\n---\n\n## Install & run\n\nThis is a standalone CLI/daemon, **not a library** — you don't `import` it. Install it globally (or\nrun via `npx`), point a config file at any project, and run it. `projectDir` in the config decides\nwhich folder Claude works in, independent of where the bot is installed.\n\nPrerequisites: **Node 18+**, a Telegram bot token, and at least one configured provider. Install and\nauthenticate the **Claude CLI** for Claude, the **Codex CLI** for Codex or Codex fallback, and\n**Ollama plus a local model** only if you enable Ollama mode/fallback.\n\n**Option A — npx (no install)**\n\n```sh\nnpx claude-telegram-bot init             # writes ./mybot.json\nnpx claude-telegram-bot init myapp.json  # or pick your own filename\n# edit the config (token, projectDir, …)\nnpx claude-telegram-bot                  # runs ./mybot.json (falls back to config.json)\n```\n\n**Option B — global install (recommended for an always-on daemon)**\n\n```sh\nnpm i -g claude-telegram-bot\n\nclaude-telegram-bot init ~/botconfigs/myproj             # writes ~/botconfigs/myproj/mybot.json\nclaude-telegram-bot init ~/botconfigs/myproj/myapp.json  # or a custom filename\n# edit the config (token, projectDir, …)\nclaude-telegram-bot ~/botconfigs/myproj/mybot.json\n```\n\nA global install also puts the shorter `ctb` on your PATH. `ctb init …` is the same command; the\ndaemon is `ctb bot …` (plain `ctb` starts a [local session](#configuration), not the daemon).\n\nRun several projects/personas by making one config file each and passing its path — state and\nattachments live in a `.claude-bot/` folder next to that config, so they don't mix.\n\n> **Keep your config out of git.** The config file holds your bot token. If you drop one inside a git\n> repo, add it (plus `.claude-bot/`) to *that* project's `.gitignore`. This repo already ignores\n> `config.json`, `config.*.json`, `*.config.json`, `.claude-bot/`, and the pre-`.claude-bot/` layout\n> (`state*.json`, `attachments/`), so any name like `claudebot.config.json` is covered here — but\n> your own project won't ignore them until you say so.\n\n### First-run steps\n\n**1) Create a bot token** — In Telegram, open `@BotFather` → `/newbot` → pick a name and a\n`username` ending in `_bot` → copy the token (looks like `123456789:AA...`). Put it in `mybot.json`,\nleave `allowedChatId` empty for now.\n\n**2) Find your chatId and lock the bot to it** — Start the bot (`claude-telegram-bot …`), send it any\nmessage in Telegram; it replies with this chat's `chatId`. Put that number into `mybot.json`\n`allowedChatId` and restart. Now only you can use it. (See [Security](#security) — this is your only\nauth layer.)\n\n**3) Use it** — just send messages:\n\n- `run the solver tests and commit + push if they pass`\n- `add an edge case to solve-2nd-floor-edges.ts`\n\nCore commands:\n\n| Command | Purpose |\n|---|---|\n| `/provider [claude\\|codex\\|default]` | View or switch this room's provider override |\n| `/model [name\\|default]` | View or switch this room's active-provider model |\n| `/new` | Reset the conversation session — both Claude and Codex, so a fallback can't resume the old context |\n| `/newchat [name]` *(or `/newtopic`)* | Open a **new forum topic** in this group and start a fresh session there (needs Topics on + the bot's *Manage topics* permission) |\n| `/sessions` | List past sessions in **this room's working folder** for the active provider and pick one to carry on from (🔒 held by another room, 💻 open in a terminal — both are blocked; with `personas`, only this room's role is listed, ❓ = predates roles) |\n| `/name <name>` | Name the current session so it stands out in `/sessions` (`/name -` removes it) |\n| `/jobs` | Background jobs that outlive replies — ▶ running, ✅ finished |\n| `/persona` | The role this room runs as, and the prompt behind it (view only — you change it from the buttons at `/new`) |\n| `/persona set` | In a **group**: which roles that group may use. Every topic in it picks from this set and the first one is the default; a room already running as a role keeps it. Tap to add or drop |\n| `/tell [room] [message]` | Hand a message to another room this bot runs — it executes there, with that room's session. Sent bare, it lists the rooms |\n| `/rooms` | Rooms this bot knows · `rm <n>` drops them · `sweep` clears out deleted topics → [details below](#tidying-the-room-list-rooms) |\n| `/router [on\\|off]` | Only in a forum's **parent topic**: show whether it asks which room a message is for · `off` stops asking there (anyone in the room can flip it; the room is told) |\n| `/plan <request>` | Produce a plan and wait for approval (Claude only) |\n| `/plan on` · `/plan off` | Pin plan mode to this room — every message plans first (Claude only) |\n| `/compact` | Compact the current context (Claude only) |\n| `/stop [--reset]` | Stop the task; optionally restore its previous session ID |\n| `/local [kill]` | Show which room a local `ctb` session is holding, and end it from Telegram |\n| `/ollama` | Toggle local Ollama chat mode |\n| `/testfallback` | Test the configured Codex or Ollama fallback |\n| `/status` | Show version, provider, CLI versions, model, fallback, and session state |\n| `/remember <text>` · `/memory` | Save or inspect persistent memory (`/memory rm <n>` drops lines — `3`, `3 5 7`, or `3-9`) |\n| `/cron` · `/reserve` | Manage scheduled jobs and usage-limit retries |\n| `/allow` | Chats allowed to use this bot, with where each came from · `/allow <chatId>` opens one (in effect immediately, no restart) · `/allow rm <chatId>` closes it. **Owner only** — the gate is your Telegram user id, not the room, and neither the agent nor `ctb send` can reach it. `[config]` entries are read-only here: edit the file and `/restart` |\n| `/autocompact` · `/mergewindow` · `/restart` · `/id` · `/help` | Maintenance and help commands |\n\n> **A removed rule can look like it's still in effect** — that's expected. `/memory rm` drops the\n> line from the `RULES` block injected on every call, but the **conversation already in progress**\n> still contains answers that followed it. An LLM takes its own earlier replies as a style example,\n> so the habit carries on by context inertia even after the instruction is gone. Start a fresh\n> session with `/new` to clear it fully.\n>\n> Adding and removing are asymmetric this way: `/remember` takes effect on the very next reply,\n> while a removal lands more slowly the longer the conversation is. It's most visible for rules\n> that show up in **every** answer (tone, output format); a rule like \"always confirm before\n> deploying\" leaves no trace in the context and so doesn't have this problem.\n\n<details>\n<summary><b>What <code>/plan</code>, <code>/stop</code>, <code>/local</code> and <code>/restart</code> actually do</b> — the four commands worth knowing before you rely on the bot</summary>\n\n> **`/plan <request>`** runs the request in read-only plan mode (no edits, no shell) regardless of\n> the bot's configured `permissionMode`, and replies with the plan plus **✅ Proceed / ❌ Cancel**\n> buttons. Tapping **Proceed** resumes the same session with the bot's normal `permissionMode` and\n> tells Claude to implement the approved plan; **Cancel** leaves the session untouched. This gives\n> you a review step before a `bypassPermissions` bot touches anything. The pending approval expires\n> if you start a new session with `/new` first.\n\n> **`/plan on`** pins that to the room: until you send `/plan off`, every message plans first and\n> comes back with the same approval buttons, so you stop having to remember the prefix. It is a\n> per-room setting stored alongside `provider`/`model`, so it survives a restart and one topic can\n> be pinned while another is not. Approving runs with the bot's normal `permissionMode` — approval\n> ignores the pin, otherwise an approved plan would just be planned again. Two things to know:\n> plan mode is Claude-only, so the pin does nothing while a room is on Codex (`/status` says so),\n> and while pinned the bot will **not** fall back to Codex on a Claude rate limit, since that would\n> quietly turn a planning request into one that edits files.\n\n> **`/stop`** kills the provider process running **in that room** and clears that room's queued\n> messages. Other rooms keep running untouched. Add `--reset` to also restore the session to the\n> state it was in *before* the task started, so the conversation history doesn't include the\n> interrupted work.\n\n> **`/local`** shows whether a local `ctb` terminal session is holding a room (which room, its PID\n> and how long it has been running) with a button to end it. That's for the case where you walked\n> away from the desk with `ctb` still open and that room answers with \"a local session has this room\n> open\" — other rooms keep working, so this only blocks the one you left behind:\n> tapping the button sends `SIGTERM` to the session's process group — the same path as pressing\n> `Ctrl-C` in that terminal, so `ctb` releases the lock and still sends its end-of-session handoff.\n> `/stop` offers the same button when no bot task is running. Use `/local kill` to skip the button.\n>\n> **The notice goes away on its own once the session ends** — however it ends: closed in the terminal,\n> ended with the button, or crashed and left a stale lock. The bot checks the lock every 15 seconds and\n> deletes the \"this room is held\" notice once the room is free. Talking to a held room several times\n> still leaves just one notice. The `/local` status reply and skipped-job notices are kept as a record of\n> what happened — **only their end button is removed.**\n\n> **`/restart`** runs `node --check` on `bot.mjs` first and **aborts the restart if it has a syntax\n> error** (so a bad edit can't crash-loop the bot), then exits — relying on a process supervisor\n> to relaunch it. Works out of the box with the [launchd setup](#always-on-with-launchd-macos)\n> (`KeepAlive`); under a bare `node bot.mjs` with no supervisor it just stops. Your session resumes\n> after the restart (the id lives in `state.json`). Unlike `/stop`, a restart is **not** room-scoped —\n> it takes the whole process down, so any task running in another room dies with it. Rooms that had a\n> task running or messages queued get told; idle rooms aren't bothered.\n\n</details>\n\n**4) Keep it always on (optional)** — see [Always-on with launchd](#always-on-with-launchd-macos).\n\n> **From source** (for hacking on the bot): clone the repo, `cp config.example.json mybot.json`,\n> then `node bot.mjs [mybot.json]`. Same behavior as the CLI.\n\n---\n\n## Compatibility\n\n<details>\n<summary><b>CLI versions this release was tested against</b> — Claude Code 2.1.246 · Codex 0.149.1 · Ollama 0.32.14</summary>\n\nThe bot depends on CLI flags and machine-readable output that may change between releases. These are\nthe development-environment versions recorded as the compatibility baseline on 2026-08-26; they are\nreference versions, not strict pins or a claim that every path passes. Use `/status` to see the\nversions actually installed on the bot host.\n\n| CLI | Recorded version | Checked | Relevant integration |\n|---|---:|:---:|---|\n| Claude Code | `2.1.246` | ✅ | JSON output, session resume, permission mode |\n| Codex CLI | `0.149.1` | ✅ | `exec`, `exec resume`, JSONL events, workspace sandbox |\n| Ollama | `0.32.14` | — | `ollama launch claude`, model selection, session handoff |\n\n\"Checked\" means the path was actually exercised when the version was recorded — a normal Claude\nmessage for Claude Code, `/testfallback` for Codex. Ollama is version-recorded only: the baseline\nenvironment runs `codexFallback`, so the Ollama path was not exercised this round.\n\nWhen upgrading one of these CLIs, run `/testfallback` and a normal Claude message before relying on\nthe bot unattended. Update this table after recording the new environment and checking those paths.\n\n</details>\n\n## Configuration\n\n```sh\ncp config.example.json mybot.json\n```\n\nThe only keys you need to start are `token`, `allowedChatId`, `projectDir`, `claudeBin`, and\n`permissionMode` — everything else is optional.\n\n<details>\n<summary><b>All configuration keys</b> — providers, fallbacks, models, timeouts (30+ options)</summary>\n\n| Key | Description |\n|---|---|\n| `token` | Bot token from BotFather |\n| `allowedChatId` | **Leave empty at first** → the bot tells you (step 2). Required before it runs anything. |\n| `projectDir` | Absolute path to the working folder the selected provider runs in |\n| `provider` | (optional) Main provider for Telegram messages and scheduled jobs: `\"claude\"` (default) or `\"codex\"` |\n| `claudeBin` | Output of `which claude` (absolute path recommended) |\n| `permissionMode` | Claude-only: `plan` / `acceptEdits` / `bypassPermissions` — see [Security](#security) |\n| `model` | Claude model. Empty = CLI default. Override with `/model` while Claude is active. |\n| `lang` | (optional) UI language. Empty = auto-detect per user (English default, Korean for Korean Telegram clients). Force with `\"en\"` / `\"ko\"`. |\n| `name` | (optional) Bot name shown in `/help` — handy for telling multiple bots apart |\n| `persona` | (optional) Role system prompt — defines a persona (developer/planner/…). See below |\n| `personas` | (optional) A **list** of roles, so one bot can run several. Each needs `id` (`[a-z0-9-]`, becomes a filename), `prompt`, and optionally `name`, `model`/`provider`, and `dir` (its own working folder, relative to `projectDir`). Rooms pick one at a session boundary; rooms that never pick run as the first. See below |\n| `appendSystemPrompt` | (optional) Override the default \"be concise for Telegram\" instruction |\n| `env` | (optional) Extra environment variables passed to provider processes |\n| `mergeWindowMs` | (optional) Wait this long for a follow-up message and answer both at once (default: `1000`; `0` runs each message immediately). Override at runtime with `/mergewindow` (persists in state). |\n| `schedule` | (optional) Cron jobs that run a prompt on a timer — see [Scheduled tasks](#scheduled-tasks-cron) |\n| `commands` | (optional) Custom `/commands` that run shell scripts — see [Custom commands](#custom-commands) |\n| `sendImages` | (optional) Let the agent send files back to the chat via `.ctb-outbox/` — photos, video and documents (default: `true`). Set to `false` to turn the whole feature off. (The key keeps its old name.) |\n| `backgroundJobs` | (optional) Watch detached jobs registered in `.ctb-jobs/` and report them via `/jobs` (default: `true`). Set to `false` to turn the whole feature off. |\n| `roomRelay` | (optional) Let `/tell` and the agent hand a message to another room this bot runs (default: `true`). Set to `false` to turn the whole feature off. |\n| `cliDispatch` | (optional) Listen on a local unix socket (`.claude-bot/ctb.sock`, mode 0600) so `ctb send` can hand the running bot a message (default: `true`). Set to `false` to not open it. |\n| `codexFallback` | (optional) `true` to enable Codex as the preferred fallback when Claude is rate-limited or out of credits |\n| `codexBin` | (optional) Path to the `codex` binary. Defaults to `\"codex\"` on `PATH`; use an absolute path for launchd |\n| `codexModel` | (optional) Codex model passed with `--model`; `/model` shows the models available to the installed Codex CLI as buttons. Empty/default lets the CLI choose and is safest. |\n| `codexSandbox` | (optional) Codex sandbox for a new `codex exec` session (default: `\"workspace-write\"`) |\n| `codexTimeout` | (optional) Milliseconds to wait for Codex before falling back to reserve/Ollama (default: `600000`) |\n| `ollamaFallback` | (optional) `true` to enable Ollama as a secondary fallback when Claude is rate-limited or out of credits |\n| `ollamaModel` | (optional) Ollama model to use for fallback (default: `\"qwen3.5:4b\"`). The context a session carries over is capped by this model's runtime context window (`num_ctx`), which Ollama defaults to ~4K regardless of the model's architectural max — too small for a long Claude session. Bake a larger window into a variant with a `Modelfile` (`FROM qwen3.5:4b` + `PARAMETER num_ctx 6144`, `ollama create qwen3.5:4b-ctx6k -f Modelfile`) and point this at it. Size it to your RAM — on an 8 GB machine ~6K is the safe ceiling; 32K swaps the machine to death. |\n| `ollamaBin` | (optional) Path to the `ollama` binary. Auto-detected at `/opt/homebrew/bin/ollama`, `/usr/local/bin/ollama`, `/usr/bin/ollama`, falling back to `\"ollama\"` on `PATH` — set this explicitly if your install lives elsewhere, since a launchd-run bot doesn't inherit your shell's `PATH` |\n| `ollamaTimeout` | (optional) Milliseconds to wait for an Ollama reply before giving up (default: `360000` — local models can be slow to cold-start) |\n| `autoCompactThreshold` | (optional) Offer to compact when the estimated context size exceeds this value (default: `100000`). Set to `0` to disable. Override at runtime with `/autocompact` (persists in state). |\n| `autoCompactConfirm` | (optional) Ask before compacting instead of doing it silently (default: `true`). Set to `false` to compact automatically as soon as the threshold is crossed. |\n| `ctbNotify` | (optional) Post a handoff message to the resumed room — the forum topic itself, if that is what you resumed — when a local `ctb` session ends (default: `true`). Set to `false` to stay silent. |\n| `ctbNotifyTimeout` | (optional) How long to wait for the handoff answer, in ms (default: `180000`). Large sessions take longer to resume; raise this if `ctb` reports the handoff timed out. |\n\nThe same config also drives local interactive sessions. `ctb mybot.json` follows the provider and\nmodel overrides of the room selected by `--chat` (or the first `allowedChatId`), then falls back to\nthe config defaults. An explicit provider flag overrides that room for the invocation:\n\n```sh\nctb mybot.json --provider claude\nctb mybot.json --provider codex\nctb mybot.json --chat -1001234567890   # resume a specific room's session\n```\n\nRoom ids are not memorable, and forum topics add one per `/newchat`, so plain `ctb` asks which room\nto continue — arrow keys or `1`-`9`, enter to start, `q` to cancel:\n\n```\nPick a room  (↑↓ or 1-9, enter to start, q to cancel)\n❯  1  Ada Lovelace       688344084          claude  4ef8162d  *\n   2  Bot dev            -1002233445566     claude  5e6637a7\n   3  Bot dev / release  -1002233445566:11  codex   019f49c4\n   4  (unnamed)          -5360343684        claude  ff09b344  (not in allowedChatId)\n```\n\n`*` marks the default room, and the room id in the middle column is what `--chat` takes. A room\nwhose chat is no longer whitelisted is flagged rather than hidden — that is what an old chat id\nleft behind by a group-to-supergroup upgrade looks like.\n\nThe prompt is skipped whenever the answer is already settled — only one room exists, `--chat` named\none, arguments like `-p \"…\"` were passed, or stdin is not a terminal (background jobs, pipes). So\nscripted use is unchanged.\n\nThe name comes from what the room is called in Telegram; the bot records it the first time it\nanswers there, so rooms last used before this feature show as `(unnamed)` until they see a message.\nTopic names only reach the bot when the topic is created or renamed, so a topic that already existed\nis listed as `Bot dev / #11` (the thread id) — enough to tell it apart from General — and picks up\nits real name if one turns up later.\n\nSessions are stored per room at `state.sessions[chatId]` — Claude under `sessionId`, Codex under\n`codexSessionId` (resumed with `codex resume <session-id>`). `ctb` resumes the first entry of\n`allowedChatId` (usually your DM) unless `--chat <id>` names another room. The sessions remain\nseparate. `ctb` also passes your `persona` and the `/remember` rules to Claude on every run, so a\nterminal session behaves like the bot even right after `/new`, when there is no prior conversation\nto carry the persona. Telegram-only wording (reply brevity, image sending, model-upgrade hints) is\nleft out, and Codex has no `--append-system-prompt`, so this applies to `provider: \"claude\"` only.\n\n**Handing the running bot a job — `ctb send`.** The commands above run Claude *in your terminal*;\nthe bot knows nothing about it. `ctb send --chat <room> \"<message>\"` does the opposite: it hands the\nmessage to the **already-running bot** over a local unix socket, and the bot runs it in that room —\ntyping indicator, that room's session and settings, the answer posted there. From the outside it is\nindistinguishable from a message you typed into Telegram, and the answer also comes back on stdout\nso a script can use it.\n\n```sh\nctb send --chat planning \"draft the release note for 0.5.0\"\n```\n\n**Posting a file from the terminal.** `--file` puts a file in the room as-is, with no agent run and\nno session — a screenshot, a PDF, a recording:\n\n```sh\nctb send --chat planning --file ~/shots/flow.png \"the new onboarding\"\nctb send --file ./shot.png          # no --chat → $CTB_CHAT_ID, the calling session's room\n```\n\nUp to 10 files per call (repeat `--file`); photos ≤10 MB, anything else ≤50 MB; the kind is chosen by\nextension and leftover words become the caption on the first file. Nothing runs, so there is **no\napproval step** (the room is told it came from a terminal), and a failure is reported both in the room\nand on stderr. Without `--chat` it goes to `$CTB_CHAT_ID` — agents running in a bot room and `ctb`\nterminal sessions both get their own room key in that variable.\n\n`ctb rooms` lists the room keys; `ctb send --help` lists every option. `ctb` picks its config from the\n**directory you run it in** — `$BOT_CONFIG`, then `mybot.json` / `config.json` in the current\ndirectory, then the package directory — so from another project, run it in the bot's config folder\nor pass the config path as the first argument. An unknown subcommand (`ctb roomz`) is refused rather\nthan waking a session; to start a session with a one-word prompt, use `ctb -- <word>`.\n\nThe room can be its key or any distinctive part of its name. By default a message waits for the\ntarget room to approve with ✅/❌ (the terminal is told which room to tap in and when it expires) — the caller may well be an agent, and a process cannot tell a human-typed\n`ctb` from one a model invoked, so the safe default applies to both; `--now` skips it for unattended\nscripts and the room is told either way. It refuses to target the room your own `ctb` session is\nholding (the bot defers that room, so the message would sit in the queue until you quit), and a\nmessage pushed this way cannot be relayed onward. If no bot is running it fails outright rather than\nquietly falling back to a local run. A terminal session started with `ctb` is *told* this channel\nexists — the usage and the list of rooms it may reach are appended to its system prompt, but only\nwhile the bot is actually running, so a terminal used without the bot pays nothing for it. Turn the\nsocket off with `\"cliDispatch\": false`. Design notes:\n[CLI dispatch](docs/design/cli-dispatch.md).\n\nWhen the terminal session ends, `ctb` asks it one last question — not \"summarize what you did\" but\n\"the conversation continues on Telegram; is there anything to hand over?\" — and posts the answer to\n**the room whose session it resumed** (the one printed as `Resuming … (chat <id>)` on startup), so a\nDM session's notes no longer land in your groups. The reply is capped at three lines and the session\ncan decline with `SKIP`, which keeps the notification worth reading. Turn it off with\n`\"ctbNotify\": false`.\n\nThe `/plan` approval workflow currently\nrequires `provider: \"claude\"`; normal messages, attachments, and scheduled jobs support both.\n\n`/provider` and `/model` store overrides in that room's state, survive bot restarts, and do not\nrewrite the config. Other DMs, groups, and forum topics keep their own settings. Local `ctb` reads\nthe selected room's overrides; provider precedence is `--provider` flag → room override →\n`config.provider` → `claude`.\n\nState and downloaded attachments live in a hidden **`.claude-bot/`** folder next to the config\nfile, so projects stay isolated. Upgrading from an older version **auto-moves** an existing\n`state.json` / `attachments/` into `.claude-bot/` on first start (no data loss). Logs stay wherever\nyour launchd plist points them.\n\nPersistent memory (`/remember`) lives there too, and since 0.4.13 its filename is derived from the\nconfig name the same way state is — `config.json` → `memory.md`, `planner.json` →\n`planner.memory.md`. Two bots run from one folder no longer read each other's rules. A named config\nthat was already using the shared `memory.md` gets it **copied** once on first start and the\noriginal is left in place, because no code can tell which line belonged to which bot — keep both\nand trim each side with `/memory rm`.\n\n</details>\n\n### Usage details\n\n<details>\n<summary><b>How the bot behaves day to day</b> — sessions, queueing, group chats, attachments, fallbacks, auto-compact</summary>\n\n- **Concise mode**: a `--append-system-prompt` is applied by default so replies stay short for\n  Telegram. Override it via `appendSystemPrompt` (empty string disables it).\n- **Language**: the bot's own messages (`/help`, command menu, status text) are English by default\n  and switch to Korean for users whose Telegram client is Korean. Force one language with `lang`\n  (`\"en\"`/`\"ko\"`). Claude's actual replies follow the language you write in, regardless. The `/`\n  command menu is registered per-language via `setMyCommands`.\n- **Formatting**: the reply's Markdown (bold/code/headings/tables) is converted to Telegram-safe\n  HTML. If conversion ever produces invalid HTML, the message is automatically resent as plain text.\n- **Attachments**: send a photo/document/voice/video and it's downloaded into `.claude-bot/attachments/`; the\n  absolute path is handed to the active provider (caption included as the message).\n- **Sending files (outgoing)**: the agent can send a file *back* to the chat. It saves the file into\n  `.ctb-outbox/` (under `projectDir`) and adds a line at the end of its reply:\n\n  | Marker | Sent as | Accepts |\n  |---|---|---|\n  | `[[ctb-image: chart.png \\| caption]]` | photo | png, jpg, jpeg, gif, webp — ≤10 MB |\n  | `[[ctb-video: demo.mp4 \\| caption]]` | video | mp4, mov, m4v, webm — ≤50 MB |\n  | `[[ctb-file: report.pdf \\| caption]]` | document | anything — ≤50 MB |\n\n  The bot strips the marker from the visible text and sends the files in the order the lines appear.\n  Use `ctb-file` when the bytes matter: a photo is recompressed by Telegram, a document is not. Only\n  bare filenames inside that folder are accepted; path traversal and symlinks escaping the folder are\n  rejected. The provider learns this convention automatically via the system prompt. Disable the whole\n  feature with `\"sendImages\": false`.\n- **Background jobs**: the agent runs as a fresh process per message and exits when its reply is sent —\n  anything it launched in the background dies with it. So work that must outlive the reply (dev servers,\n  long builds, watchers) is detached with `nohup … & disown` and registered in `.ctb-jobs/` as a\n  `<name>.json` record plus a `<name>.log`. The bot **watches but never owns** these jobs: every 30s it\n  checks each PID with `kill(pid, 0)` and messages the chat when one exits, with the tail of its log.\n  Because the bot doesn't own them, `/restart` doesn't kill them, and the watcher picks them back up on\n  boot. `/jobs` lists them; the same records are produced whether the job was started from Telegram or\n  from a local `ctb` session. Disable with `\"backgroundJobs\": false`.\n- **Handing a message to another room**: rooms hold separate sessions, so what one room worked out is\n  invisible to the next. `/tell <room> <message>` pushes one message across — `/tell` on its own lists the\n  rooms this bot knows (any room it has already talked in), and the room can be given as its number in that\n  list or any distinctive part of its name (topic names like `Cube / Marketing` contain spaces, so a\n  fragment is usually what you want). It runs in the target room under *that* room's session, provider,\n  model, and pinned plan mode, queues if the room is busy, and the answer stays there — nothing is echoed\n  back. The agent can hand one over too, by ending its reply with `[[ctb-tell: room | message]]`; that path\n  asks in the target room and waits for ✅ before running, because it is the point where the model starts\n  spending another room's tokens. A message that arrived from another room can never be relayed onward\n  (one hop), which together with that approval means no relay chain runs without a person in it. Muted\n  rooms (`/*`) are never targeted. Disable with `\"roomRelay\": false`.\n  Design: [Room-to-room relay](docs/design/room-relay.md).\n- **Sessions**: Claude and Codex keep separate session IDs, so switching providers preserves both\n  conversations. `/new` resets only the active provider's session.\n- **Per-room sessions and settings**: your DM, each group, and each forum topic hold independent Claude/Codex sessions plus provider and model overrides (`state.sessions[roomKey]`). Switching `/provider` or `/model` in one room does not change another room. `/provider default` and `/model default` clear only that room's override and return it to the config default.\n- **The parent topic asks instead of running**: in a forum group, opening the chat drops you in the parent topic (\"All\" view), and a reply typed there goes to the *parent's* session rather than the topic you were reading — a structural trap, not carelessness. So once a forum group has topics the bot knows about, the parent topic stops running prompts and asks which room they're for, with one button per sibling topic plus **Run here** and **Drop**. Nothing runs until you tap, so a mistake becomes *not sent* rather than *sent to the wrong session*. Attachments, captions, and the sender come along unchanged — the receiving topic sees exactly what you would have typed there. There is nothing to turn **on**: it applies only where all three are true (forum group · parent topic · at least one known sibling topic), so DMs, ordinary groups, and forums without topics are untouched. If you deliberately work *in* the parent topic, `/router off` stops the asking for that room — the buttons are replaced by a line in the agent's system prompt telling it to check the context first and ask before acting when a request looks like another topic's business. That guard is softer than the buttons (a request that fits any room — \"run the tests\" — just runs), which is the trade you make by turning it off; `/router on` brings the buttons back, and `/status` shows when a room has it off. Design: [parent-topic desk](docs/design/room-router.md).\n- **Forum topics are rooms too**: in a supergroup with Topics enabled, each topic gets its own session, queue, and running task (`state.sessions[\"<chatId>:<topicId>\"]`) — replies land back in the topic they came from. The General topic and ordinary groups keep the plain `chatId` key, so nothing changes for them. Turning Topics on upgrades a basic group to a supergroup, and Telegram issues it a **new chat ID** — the bot follows that migration automatically (sessions included) and tells you to update `allowedChatId`, but only for a chat that was already allowed. `/newchat [name]` (or `/newtopic`) creates a topic and starts fresh there; the bot needs the *Manage topics* permission, and since the Bot API can't create groups, a topic is as close to a \"new room\" as a bot can get. Without a name, the topic is stamped with the current date and time.\n- **Group chats**: to use the bot in a group, make it a **group admin**. Telegram's privacy mode limits a non-admin bot to mentions, commands, and replies, but an admin bot receives every message so you can talk to it without @mentioning it each time (alternatively, disable privacy mode via BotFather `/setprivacy`). Everyone in the group shares that group's single session. Commands also work in the `/command@BotName` form Telegram appends in groups; a `/command@SomeOtherBot` addressed to a different bot is ignored. Invite the bot to a room that isn't in `allowedChatId` and it posts that room's chat ID plus where to paste it — **once per room**, so it can't be turned into a spam relay, and it still runs nothing there. Full walkthrough: [Using the bot in a group](docs/group-setup.md).\n- **Per-room concurrency**: rooms run **in parallel** — a long task in your DM doesn't block a group, and vice versa. Each room holds its own session, so there's nothing to serialize across them. Within a single room, messages still run one at a time (queued and merged, below). Scheduled jobs get their own slot: they serialize against each other but run alongside your rooms. A local `ctb` terminal session pauses only the room it holds, so the rest keep answering — `/local` shows which room that is and ends it from Telegram if you left it open.\n- **Consecutive messages are merged**: people split one thought across messages — \"about that bug\" / \"run the tests first\" / \"oh and the logs too\". Rather than firing on the first line and making the rest queue behind a run whose context is half missing, the bot waits **1 second** for a follow-up (`mergeWindowMs`, `0` disables). Each new message reopens the window, capped at 5× so a busy room can't stall forever; typing shows up immediately so the pause doesn't read as a dead bot. A log pasted past Telegram's 4096-character limit is split by the sending client into several messages, and the first part lands more than a second ahead of the rest — the client waits for its acknowledgement before pushing the remainder, so the follow-up fragments arrive back-to-back but the opening one does not. A plain 1-second window therefore runs on that first fragment alone and queues the actual content behind it. So a message that arrives sitting at the length limit is read as \"more is coming\" and held for up to 8 seconds instead; the closing fragment is shorter, which drops the window straight back to normal, so the paste is answered as one prompt without making ordinary messages wait. Commands are never delayed — `/status` and `/stop` still answer at once, and `/stop` cancels a window that hasn't fired yet. A held message is written to `state.json` while the window is open and picked up again on the next boot — unlike a queued message it never got a ⏳ receipt, and the Bot API cannot re-fetch a message once it has been delivered, so dropping it on a restart would lose it for good. Tune it without a restart via `/mergewindow` — sent bare it shows the current value with preset buttons (0.5s / 1s / 2s / 3s / 5s / Off / Default); `/mergewindow 2s`, `/mergewindow 2000`, `off` and `default` also work, and values outside 0.1s–30s are rejected. The override persists in `state.json`.\n- **Message queue**: if you send a message while that room's task is running, it is queued (not dropped). When the task finishes, queued messages **from the same room** are merged into a single prompt so Claude can resolve corrections and follow-ups in one pass (e.g. \"do X\" then \"never mind, do Y\" → handled together). Merging is only ever within a room, so it can't mix sessions. Use `/stop` to cancel that room's running task and discard its queue. To jot something down **without** it being queued, start the message with `//` — the bot ignores it entirely (it only reacts with 👀), so you can leave yourself notes in the chat while a task runs. For a run of several notes or a pasted log, send `/*` once: every message in that room is ignored until one starts with `*/`. The mode is per-room and survives a restart, so a restart can't dump your notes into the session — and since each ignored message still gets a 👀, it stays obvious that the block is still open.\n- **Models**: `/model` follows the room's active provider and stores separate Claude/Codex overrides for that room. On Claude it shows the `fable`, `opus`, `sonnet`, and `haiku` aliases as buttons (current one marked ✅) plus a Default button; on Codex it shows the models the installed CLI offers your account as buttons. Typing `/model <id>` still works, and `/model default` clears only that room's active-provider override.\n- **Setting menus expire on your next message**: the buttons from `/model`, `/provider`, `/autocompact`, `/mergewindow`, `/sessions` and the auto-compact prompt are a snapshot of the state at the moment they were sent. When a new message arrives in that room the bot strips the buttons off the previous menu, so scrolling back and tapping an old one can't silently revert a setting you changed since. It's tracked per room, and the **`/plan` approval and `/local` kill buttons are left alone** — those are requests still waiting on an answer.\n- **Usage-limit queue**: when a Claude Max / API rate-limit error includes a reset time, the bot first tries enabled fallbacks. If no fallback is enabled or every fallback fails, the triggering message is queued and retried at that time — just like messages queued while Claude is busy. Any additional messages you send during the limit window are also added to the queue. Use `/reserve` to check queue status and reset time, `/reserve rm` to cancel and clear the queue.\n- **Codex fallback**: set `\"codexFallback\": true` to run `codex exec` when Claude is rate-limited or out of credits. Codex keeps its own session in that room's `state.sessions[roomKey].codexSessionId` using `codex exec resume <id>`, but Claude and Codex sessions are not interoperable. Each successful Codex fallback appends a summary to `.claude-bot/codex-handoff.md`, and future Claude calls receive the recent handoff notes as context.\n- **Per-room provider switching**: `/provider` shows that room's active provider (marked ✅) with buttons to switch — no typing needed. `/provider claude` / `/provider codex` affect only the current DM, group, or forum topic; `/provider default` returns only that room to the config value. Each provider's session is preserved separately.\n- **Ollama fallback**: set `\"ollamaFallback\": true` and point `\"ollamaModel\"` at a locally-installed [Ollama](https://ollama.ai) model (default: `\"qwen3.5:4b\"`). Ollama is now a secondary automatic fallback when Codex is disabled or fails, and `/ollama` still toggles local chat mode manually. It runs Claude Code through the local model via `ollama launch claude … --resume <session>`, but this remains best-effort because local model context windows are much smaller than Claude's.\n- **Auto-compact**: the bot estimates how large the session context has grown. When it exceeds `autoCompactThreshold` (default 100 000), the bot asks whether to compact, with **🗜️ Compact now / Later / Off** buttons. **Later** snoozes the prompt until the context grows another 25%, so it doesn't nag you every turn. Set `autoCompactConfirm: false` to skip the question and compact immediately. The estimate is taken from the *last* API call of the turn, not the turn's total token usage — the total is summed across every tool call, so a 30k conversation that read five files reports 160k and would trip the threshold on its own. Tune the threshold in config, or at runtime with `/autocompact` — sending it with no argument shows the current value with preset buttons (50k / 100k / 150k / 200k / Off / Default) so you don't have to type digits on a phone. You can still pass a value directly, in shorthand or in full: `/autocompact 120k`, `/autocompact 120000`, `/autocompact 80,000` (`off` to disable, `default` to reset). Values outside 10k–1m are rejected, so a typo like `100m` can't silently switch auto-compact off. The override persists in `state.json` across restarts. You can also run `/compact` manually at any time. Compaction takes a minute or two and holds the same lock as any other prompt — messages you send while it runs are queued and handled once it finishes. **While a plan is waiting for approval the question is held back**: compacting starts a new session, so tapping *Compact now* first would expire the very plan you were about to approve — and with `/plan on` pinned that collision comes up every turn. The prompt returns once the plan is cancelled or has expired; approving it runs the plan and the next answer decides again. A manual `/compact` still goes through, but now tells you the pending plan expired instead of leaving a dead button behind.\n\n</details>\n\n### Custom commands\n\nDefine project-specific `/commands` in config that run shell scripts and return their output to the chat. Commands appear in Telegram's `/` autocomplete menu automatically.\n\n<details>\n<summary><b>Custom command reference</b> — arguments, limits, execution model</summary>\n\n```json\n\"commands\": {\n  \"deploy\": { \"run\": \"npm run deploy\", \"description\": \"Deploy to production\" },\n  \"logs\":   { \"run\": \"tail -n 50 ./app.log\", \"description\": \"Recent logs\" },\n  \"status\": { \"run\": \"git status && git log --oneline -5\", \"description\": \"Git status\" }\n}\n```\n\n- **`run`** — any shell command, executed in `projectDir`\n- **`description`** — shown in the Telegram `/` autocomplete menu\n- **Arguments**: `/deploy staging` appends `staging` to the command (`npm run deploy staging`)\n- Scripts run independently of Claude — they work even when Claude is busy\n- Output capped at 4 000 characters; 60-second timeout\n\n</details>\n\n### Tidying the room list (`/rooms`)\n\nA room registers itself the first time you talk to the bot there. Nothing ever removes it,\nso forum topics you made with `/newchat` and then abandoned stay on the list forever — and\nthat list is what `/tell` targets, what `/cron` sends results to, and what the forum router\noffers as buttons. One dead topic clutters all three.\n\n```\n/rooms                 numbered list · ⏳ running · ← this room\n/rooms rm 3            drop one — also 3 5 7 or 3-9\n/rooms sweep           find topics you deleted in Telegram and drop those\n```\n\n**Dropping a room does not delete anything you said.** The transcript stays in\n`~/.claude/projects/`, and `/sessions` in that room picks it back up. What you lose is the\nlink between the room and its session, plus the role you chose there. The room registers\nitself again the next time someone talks in it — with a fresh session.\n\nTwo rooms are protected. **This room**, because dropping it only cuts its session loose —\nyour next message re-registers it anyway. And **a room that is running something**, because\nits answer needs somewhere to land. If either lands inside a range, the whole command is\nrefused rather than half-applied: a partial delete shifts the remaining numbers, and the\nnext command you type would hit the wrong room.\n\n<details>\n<summary><b>Why <code>sweep</code> has to post a message</b></summary>\n\nTelegram never tells a bot that a topic was deleted. There is no `getForumTopic` method, and\nthe service messages only cover topics being *created*, *edited*, *closed* and *reopened* —\nthere is no \"deleted\" one. `sendChatAction` is no help either: aimed at a topic that does not\nexist it still answers `ok: true`.\n\nThe only response that distinguishes a live topic from a deleted one is a real message:\n\n```\nsendMessage(message_thread_id: <deleted>)\n  → 400  Bad Request: message thread not found\n```\n\nSo `sweep` posts a single dot with notifications off and deletes it immediately. Live topics\nmay flicker for a moment; nothing is left behind.\n\nOnly forum topics are swept — never the group itself or a DM, where that flicker would happen\nin front of everyone. And **an unclear answer is never treated as a deletion**: rate limits,\nnetwork failures and permission errors leave the room alone and are listed in the report.\nMistaking a dropped connection for a dead topic would delete a room you still use.\n</details>\n\n### Scheduled tasks (cron)\n\nAdd a `schedule` array to the config to run prompts on a timer — daily briefings, periodic\nchecks, reminders. Each entry runs the prompt and sends the result to `allowedChatId`.\n\n<details>\n<summary><b>Cron reference</b> — expression syntax, silent jobs, adding jobs from the chat in plain language</summary>\n\n```json\n\"schedule\": [\n  { \"cron\": \"0 9 * * 1-5\", \"label\": \"Morning brief\", \"prompt\": \"Summarize today's open issues and TODOs\" },\n  { \"cron\": \"*/30 * * * *\", \"prompt\": \"Check CI status; only reply if something is red\" },\n  { \"cron\": \"0 9 * * 1,4\", \"chat\": \"-1001234567890\", \"label\": \"Planning report\",\n    \"prompt\": \"Write the twice-weekly planning report\" }\n]\n```\n\n- **`cron`** — standard 5-field expression `minute hour day-of-month month day-of-week`\n  (e.g. `0 9 * * 1-5` = 09:00 on weekdays). Supports `*`, lists (`1,3,5`), ranges (`1-5`),\n  and steps (`*/15`). Day-of-week `0` and `7` both mean Sunday. Times use the **host's local\n  timezone**. No external dependency — the parser lives in `bot.mjs`.\n- **`prompt`** (required) — the message sent to Claude. **`label`** (optional) — a short name\n  shown in the reply footer and in `/cron`.\n- **`chat`** (optional) — a room key, or an array of them. The job then runs **with that room's\n  role** (its `personas` entry and that role's `/remember` rules, its provider and model) and the\n  result goes **only there**. Without it the job runs role-less and the result is broadcast to every\n  `allowedChatId` — fine for a single-role bot, but once you give a bot several roles, an untargeted\n  job runs as the *first* role and posts into every room, so a planning report ends up written by\n  the developer role and pasted into the developer's group. Room keys must be in `allowedChatId`\n  (forum topics like `-100…:11` are checked against their group); a job naming an unknown room is\n  **dropped at startup with an error in the log** rather than posting somewhere unintended. Muted\n  rooms are skipped. **`/cron add` fills `chat` in with the room you typed it in** — it knows which room asked, so there's no reason to play dumb and broadcast. Leave `chat` out in the config file when you deliberately want a job to reach every room. `/cron` lists each job's destination.\n- The job still runs in the cron slot with **no session** even when `chat` is set — it borrows the\n  room's role and address, not its conversation, so it can't be caught by that room's plan lock or\n  queue.\n- **Fresh session**: scheduled jobs run in their **own session** so they never pollute your\n  interactive conversation context (`state.json` stays yours). They run in their own slot, so\n  they don't wait on your rooms (and your rooms don't wait on them) — but they serialize against\n  each other, so a job is **skipped** if another scheduled job is still running when it fires.\n  A local `ctb` session skips them too: scheduled jobs don't run while one holds the lock.\n- **A skipped run says so.** Either way the bot posts one line to the room the job would have\n  reported to — with a button to end the local session when that's the cause. It used to be logged\n  only, so a missed run was invisible unless you read the log. Repeats are capped at one notice per\n  job per hour so a frequent job can't flood the room.\n- **Silent jobs (conditional alerts)**: if Claude's output is **empty or exactly `SKIP`**, that run\n  sends **nothing** to Telegram. To get \"alert only when it matters, stay quiet otherwise,\" tell the\n  prompt to *output just `SKIP` when the condition isn't met*. This lets even frequent jobs (e.g.\n  every 5 minutes) run without spamming the chat.\n\n**Add jobs from the chat — in plain language:**\n\n```\n/cron add summarize open issues every weekday at 9am\n```\n\nThe bot asks Claude to turn that into a cron expression, **echoes back what it understood**\n(so you can catch a misread), and saves it to `state.json` — **no restart needed**. Dynamic\njobs get an id; manage them with:\n\n- `/cron` — list everything (config jobs are tagged `[config]`; dynamic ones show `#id`)\n- `/cron add <plain-language request>` — e.g. `/cron add every 30 min, ping me if CI is red`\n- `/cron rm <id>` — remove a dynamic job (config jobs are edited in the file)\n\nConfig-defined jobs still require a restart to change; only chat-added jobs are live.\n\n</details>\n\n---\n\n## Running multiple projects\n\nThe code is project-agnostic: make **one config file per project** and run several at once.\n\n<details>\n<summary><b>Multi-project setup</b> — one config per project, one BotFather token each</summary>\n\n- Run: `node bot.mjs /absolute/path/to/project.config.json` (no arg → `./mybot.json`, fallback `./config.json`)\n- State, attachments, and `/remember` memory live in **`.claude-bot/` inside the config file's\n  folder**, with state and memory filenames derived from the config name, so projects don't mix.\n- **Note**: Telegram allows only one poller per token → each project needs its **own BotFather\n  token**.\n- For always-on, copy the launchd template per project (see below).\n\nExample — two projects:\n\n```\n~/projects/A/claudebot.config.json   (token A, projectDir=~/projects/A)\n~/projects/B/claudebot.config.json   (token B, projectDir=~/projects/B)\nnode bot.mjs ~/projects/A/claudebot.config.json   # instance A\nnode bot.mjs ~/projects/B/claudebot.config.json   # instance B\n```\n\n</details>\n\n## Multiple personas (roles)\n\nYou can split the **same project** into roles (e.g. **Developer** + **Planner**) — either as\n**one bot whose rooms have different roles**, or as **a separate bot per role**.\n\n**Rooms as roles** (`personas` in the config) is usually the one you want: one process, one Telegram\nidentity, and `/tell` can hand work between roles because they're the same bot — separate bots\n**cannot** talk to each other at all (Telegram bots don't receive other bots' messages).\n\n```jsonc\n\"personas\": [\n  { \"id\": \"dev\",     \"name\": \"Developer\", \"prompt\": \"You are the senior developer on this project. …\" },\n  { \"id\": \"planner\", \"name\": \"Planner\",   \"prompt\": \"You are the product/UX planner. …\" }\n]\n```\n\nA role is **fixed for the life of a session** — everything said so far belongs to it — so you pick\none only at a session boundary. The bot offers buttons at all three: a room's **first message**,\n**`/newchat`**, and **`/new`**. Ignore them and the room simply runs as the first role in the list.\nPicking applies that role's prompt **and its own `/remember` memory** (`memory.dev.md`).\n\n`/status` shows the room's role in one line; `/persona` shows the prompt behind it. Neither changes\nit. With no `personas` key nothing changes at all — `persona` keeps working exactly as before.\n\n**A group can narrow the list.** `/persona set` in a group picks which roles that group may use;\nevery topic inside it then picks from that set, and the set's first role is that group's default.\nThis is what makes \"one group per project\" work on a bot that carries several: the group for one\nproject never offers — or silently falls back to — another project's role, and since a role carries\nits own working directory and memory, the set is a boundary rather than a tidier menu. The set lives\non the group, so the pick is remembered across restarts; a room **already** running as a role keeps\nit even if you drop that role from the set (switching it mid-session would change the live session's\nidentity and its memory file at once), and the boot log says so. Memory is **not** split by group:\nthe `dev` role in two groups shares one `memory.dev.md` — give them different ids if you need them\napart.\n\n`/sessions` respects roles too. Its list comes from session files on disk, scanned per project, so\nwithout this it would offer **every room's** sessions — carrying a planning session into a dev room\nwould quietly bypass the session-boundary rule. Sessions started before you added `personas` have no\nrole recorded; they stay in the list marked **❓**, and picking one files it under the current room's\nrole from then on.\n\n### A role can have its own working folder (`dir`)\n\nAdd `dir` to a role and that room runs in that folder — relative to `projectDir` (absolute paths work\ntoo). Leave it out and the room uses `projectDir` exactly as before.\n\n```jsonc\n\"projectDir\": \"/Users/me/code\",\n\"personas\": [\n  { \"id\": \"dev\",   \"name\": \"Developer\", \"prompt\": \"…\" },\n  { \"id\": \"alpha\", \"name\": \"Alpha\",     \"prompt\": \"…\", \"dir\": \"projects/alpha\" },\n  { \"id\": \"notes\", \"name\": \"Notes\",     \"prompt\": \"…\", \"dir\": \"/Users/me/notes\" }\n]\n```\n\nThis is how **one bot covers several projects**. The biggest win is that the folder's own\n`CLAUDE.md` comes along — a role becomes *its config prompt + that folder's project rules*. Everything\nthat hangs off the working folder follows the room: the child process's `cwd`, `/sessions`\n(sessions are scanned per folder, so different folders separate on their own), `.ctb-outbox` and\n`.ctb-jobs` (one pair per folder — `/jobs` watches all of them and tags which project each job is\nfrom), and `ctb --chat <room>` in the terminal.\n\nSubfolders of `projectDir` are recommended but not required. Note that `.ctb-outbox`/`.ctb-jobs` are\ncreated inside **each** working folder, so scattered folders each need their own `.gitignore` entry.\n\nIf a role's `dir` does not exist, **that room refuses to run** and says so; the folder is not created\nfor you and the room does not fall back to another role's folder — either would quietly edit the\nwrong project. Create the folder (or fix `dir` and `/restart`) and it comes back.\n\nPermissions are still global (`permissionMode`, `codexSandbox`). Per-role permissions are a separate\npiece of work — see [docs/design/room-personas.md](docs/design/room-personas.md).\n\n**A separate bot per role** still makes sense when you need two identities in one group at the same\ntime, when you're migrating gradually, or when `allowedChatId` must differ. That layout is below.\n\n| Bot | permissionMode | Role |\n|---|---|---|\n| Developer | `bypassPermissions` | Implement, edit, test, git |\n| Planner | `plan` (read/plan only) | Feature proposals, specs, UX direction |\n\n<details>\n<summary><b>Persona setup</b> — system prompts, permission split, session isolation</summary>\n\n- **`persona`**: a role ","readmeFilename":"README.md"}