abtars 0.2.1-alpha.9 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (309) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/README.md +93 -34
  3. package/bundle/{_registry.generated-ADOYFJJ4.js → _registry.generated-KYX63MGY.js} +19 -16
  4. package/bundle/{_registry.generated-ADOYFJJ4.js.map → _registry.generated-KYX63MGY.js.map} +1 -1
  5. package/bundle/abtars-browser.js +5 -6
  6. package/bundle/abtars-browser.js.map +2 -2
  7. package/bundle/abtars-cli.js +205 -179
  8. package/bundle/abtars-cli.js.map +4 -4
  9. package/bundle/abtars-restart.js +4 -4
  10. package/bundle/abtars-rss.js +25 -81
  11. package/bundle/abtars-rss.js.map +2 -2
  12. package/bundle/abtars-task.js +4 -5
  13. package/bundle/abtars-task.js.map +2 -2
  14. package/bundle/abtars-todo.js +133 -0
  15. package/bundle/abtars-todo.js.map +7 -0
  16. package/bundle/abtars.js +305 -182
  17. package/bundle/abtars.js.map +3 -3
  18. package/bundle/action-gate-DYV2XQBP.js +191 -0
  19. package/bundle/action-gate-DYV2XQBP.js.map +7 -0
  20. package/bundle/{agent-api-rate-limit-C25WGSFF.js → agent-api-rate-limit-R2OFAQ3N.js} +4 -4
  21. package/bundle/{agent-registry-SYUFNSVB.js → agent-registry-5VL5KI6U.js} +8 -8
  22. package/bundle/agent-registry-PIS5XJHX.js +19 -0
  23. package/bundle/{bridge-lock-transport-HO545SBK.js → bridge-lock-transport-N6OGDOSE.js} +5 -5
  24. package/bundle/{browse-delivery-VTLEAVYA.js → browse-delivery-DXGMDMXA.js} +8 -7
  25. package/bundle/{browser-REIXOJ6S.js → browser-QMYGSP5W.js} +11 -10
  26. package/bundle/{capability-ILW3D5HS.js → capability-733TLH4W.js} +6 -6
  27. package/bundle/chunk-3IPMKYYH.js +672 -0
  28. package/bundle/chunk-3IPMKYYH.js.map +7 -0
  29. package/bundle/{chunk-PZE3J7ER.js → chunk-3OXQWII3.js} +2 -2
  30. package/bundle/{chunk-X5FBUA53.js → chunk-4WKWPU6U.js} +137 -30
  31. package/bundle/chunk-4WKWPU6U.js.map +7 -0
  32. package/bundle/{chunk-4KJ76TTE.js → chunk-4XW7YA3K.js} +3 -3
  33. package/bundle/{chunk-A5OJYQNU.js → chunk-5WFIAUQC.js} +49 -22
  34. package/bundle/chunk-5WFIAUQC.js.map +7 -0
  35. package/bundle/{chunk-ZVDVNSXK.js → chunk-7WFE2JI5.js} +7 -7
  36. package/bundle/{chunk-R36WIOYX.js → chunk-B52YRWR6.js} +34 -6
  37. package/bundle/chunk-B52YRWR6.js.map +7 -0
  38. package/bundle/{chunk-Q62SXS73.js → chunk-BBDKU4EH.js} +9 -9
  39. package/bundle/chunk-BBTQKKDO.js +258 -0
  40. package/bundle/chunk-BBTQKKDO.js.map +7 -0
  41. package/bundle/{chunk-EX2SRTUE.js → chunk-CYSGXNBY.js} +2 -2
  42. package/bundle/{chunk-LYEAHE5V.js → chunk-DCY7DGMT.js} +2 -2
  43. package/bundle/chunk-DGS7J4P6.js +13 -0
  44. package/bundle/chunk-DGS7J4P6.js.map +7 -0
  45. package/bundle/{chunk-LDKSCXGL.js → chunk-DHPFI7OF.js} +8 -6
  46. package/bundle/{chunk-LDKSCXGL.js.map → chunk-DHPFI7OF.js.map} +1 -1
  47. package/bundle/{chunk-G6IXMYIO.js → chunk-DO4INSXE.js} +2 -2
  48. package/bundle/{chunk-VA5WKN3Z.js → chunk-EGA6JQVV.js} +4 -4
  49. package/bundle/chunk-EKHNWFEQ.js +85 -0
  50. package/bundle/chunk-EKHNWFEQ.js.map +7 -0
  51. package/bundle/{chunk-URAQLQ2U.js → chunk-F3HMZFIL.js} +4 -4
  52. package/bundle/{chunk-OOKLEC6V.js → chunk-FY3QUO2L.js} +7 -7
  53. package/bundle/{chunk-2BY6I4P5.js → chunk-GUTRAMK3.js} +2 -2
  54. package/bundle/chunk-GXKJKYU4.js +1089 -0
  55. package/bundle/chunk-GXKJKYU4.js.map +7 -0
  56. package/bundle/{chunk-GPL57SRN.js → chunk-H7RX7UCR.js} +3 -3
  57. package/bundle/{chunk-BYDUMHXT.js → chunk-HAF2AFBW.js} +2 -2
  58. package/bundle/chunk-HAS5NEK7.js +189 -0
  59. package/bundle/chunk-HAS5NEK7.js.map +7 -0
  60. package/bundle/chunk-HB54S5OY.js +4036 -0
  61. package/bundle/chunk-HB54S5OY.js.map +7 -0
  62. package/bundle/{chunk-OZ4IZFV4.js → chunk-HJQZP5CK.js} +9 -9
  63. package/bundle/{chunk-OZ4IZFV4.js.map → chunk-HJQZP5CK.js.map} +2 -2
  64. package/bundle/{chunk-HEHD3GG5.js → chunk-ITB2K6LI.js} +6 -13
  65. package/bundle/{chunk-HEHD3GG5.js.map → chunk-ITB2K6LI.js.map} +3 -3
  66. package/bundle/{chunk-KSEIWT4T.js → chunk-JFKOPNKL.js} +10 -10
  67. package/bundle/chunk-JFKOPNKL.js.map +7 -0
  68. package/bundle/{chunk-KFENC7BM.js → chunk-L33WNMCP.js} +2 -2
  69. package/bundle/{chunk-JRG4EFMP.js → chunk-LBMETTUP.js} +3 -3
  70. package/bundle/{chunk-TYVI3ZWA.js → chunk-LJAG2URA.js} +10 -7
  71. package/bundle/chunk-LJAG2URA.js.map +7 -0
  72. package/bundle/{chunk-KWBGYWDO.js → chunk-N24ROESF.js} +15 -17
  73. package/bundle/chunk-N24ROESF.js.map +7 -0
  74. package/bundle/{chunk-P2BZSLJJ.js → chunk-N7UG4FID.js} +448 -129
  75. package/bundle/chunk-N7UG4FID.js.map +7 -0
  76. package/bundle/chunk-NIYVCGBC.js +330 -0
  77. package/bundle/chunk-NIYVCGBC.js.map +7 -0
  78. package/bundle/{chunk-TOUZC6NR.js → chunk-OKMN6J4Z.js} +3 -3
  79. package/bundle/{chunk-RV54J75Q.js → chunk-PKHYCNTT.js} +13 -12
  80. package/bundle/chunk-PKHYCNTT.js.map +7 -0
  81. package/bundle/{chunk-XZSYMCLF.js → chunk-PUDGA4RR.js} +7 -7
  82. package/bundle/{chunk-CELR236Q.js → chunk-Q7CH5DA3.js} +2 -2
  83. package/bundle/chunk-QSC6QZ44.js +183 -0
  84. package/bundle/chunk-QSC6QZ44.js.map +7 -0
  85. package/bundle/chunk-RITEGAW6.js +138 -0
  86. package/bundle/chunk-RITEGAW6.js.map +7 -0
  87. package/bundle/{chunk-UDZIZB5F.js → chunk-RTL7HO3N.js} +3 -3
  88. package/bundle/{chunk-ITG6XGBS.js → chunk-SA44ITVX.js} +10 -10
  89. package/bundle/{chunk-3MO2MDXJ.js → chunk-SA6YEFNG.js} +3 -3
  90. package/bundle/{chunk-4BUOO6WI.js → chunk-SMZQDMSZ.js} +31 -11
  91. package/bundle/chunk-SMZQDMSZ.js.map +7 -0
  92. package/bundle/{chunk-GBBTK6H2.js → chunk-SRFEIZQT.js} +4 -4
  93. package/bundle/{chunk-ELRAH7VL.js → chunk-VXUVKC66.js} +3 -3
  94. package/bundle/chunk-VY2BUO6L.js +4035 -0
  95. package/bundle/chunk-VY2BUO6L.js.map +7 -0
  96. package/bundle/chunk-W6ELWLAR.js +143 -0
  97. package/bundle/chunk-W6ELWLAR.js.map +7 -0
  98. package/bundle/{chunk-RSWUPUNA.js → chunk-WMWI3SJ7.js} +30 -6
  99. package/bundle/chunk-WMWI3SJ7.js.map +7 -0
  100. package/bundle/{chunk-MJ6PHMOK.js → chunk-WW5F2DCO.js} +11 -2
  101. package/bundle/chunk-WW5F2DCO.js.map +7 -0
  102. package/bundle/chunk-Y2XBDQP3.js +4055 -0
  103. package/bundle/chunk-Y2XBDQP3.js.map +7 -0
  104. package/bundle/chunk-YMGX6HNP.js +131 -0
  105. package/bundle/chunk-YMGX6HNP.js.map +7 -0
  106. package/bundle/chunk-YWZPKBO6.js +22 -0
  107. package/bundle/chunk-YWZPKBO6.js.map +7 -0
  108. package/bundle/chunk-ZAA7B5BN.js +22 -0
  109. package/bundle/chunk-ZAA7B5BN.js.map +7 -0
  110. package/bundle/{commands-WUGPBPHI.js → commands-IGRSOSK6.js} +15 -14
  111. package/bundle/commands-LAWVNQTO.js +34 -0
  112. package/bundle/commands-RBWY7YXB.js +34 -0
  113. package/bundle/commands-XFZNMZN6.js +34 -0
  114. package/bundle/{config-DQIGDX4W.js → config-NDEYF4AQ.js} +7 -7
  115. package/bundle/{daemon-NPKYZ3CJ.js → daemon-WOQXCKNL.js} +4 -4
  116. package/bundle/{delegation-tools-6FICZQ5G.js → delegation-tools-Z5OM3TXS.js} +5 -5
  117. package/bundle/{deploy-lib-import-SBKXDD3F.js → deploy-lib-import-6VJTYXEG.js} +2 -2
  118. package/bundle/{deps-HN6CEXA4.js → deps-65V7XXG4.js} +4 -4
  119. package/bundle/{direct-api-transport-TRV45NO6.js → direct-api-transport-OZICXTWQ.js} +43 -15
  120. package/bundle/direct-api-transport-OZICXTWQ.js.map +7 -0
  121. package/bundle/direct-api-transport-QIWA5ES2.js +889 -0
  122. package/bundle/direct-api-transport-QIWA5ES2.js.map +7 -0
  123. package/bundle/{discord-adapter-WA2MFRK3.js → discord-adapter-JFIIVG34.js} +27 -24
  124. package/bundle/discord-adapter-JFIIVG34.js.map +7 -0
  125. package/bundle/discord-adapter-U3FA5OTY.js +589 -0
  126. package/bundle/discord-adapter-U3FA5OTY.js.map +7 -0
  127. package/bundle/discord-adapter-W6L5KJ6T.js +589 -0
  128. package/bundle/discord-adapter-W6L5KJ6T.js.map +7 -0
  129. package/bundle/discord-adapter-WWM6ROTW.js +589 -0
  130. package/bundle/discord-adapter-WWM6ROTW.js.map +7 -0
  131. package/bundle/{dns-wakeup-RYOCQ6GR.js → dns-wakeup-N46RPU5E.js} +3 -3
  132. package/bundle/{doctor-R54GZPKL.js → doctor-PIPSGI3H.js} +18 -7
  133. package/bundle/{doctor-R54GZPKL.js.map → doctor-PIPSGI3H.js.map} +2 -2
  134. package/bundle/{ensure-invariants-BJIEOSJ2.js → ensure-invariants-3NOBCYWS.js} +4 -4
  135. package/bundle/{env-schema-XCPAJ6IZ.js → env-schema-T43X43BU.js} +4 -4
  136. package/bundle/{hook-system-POI5VRIX.js → hook-system-ZCVOFFRD.js} +4 -4
  137. package/bundle/hotskills-DTROJY6G.js +17 -0
  138. package/bundle/{install-SH4UVUXQ.js → install-I3CXVW52.js} +3 -3
  139. package/bundle/{install-manifest-QRWID3KZ.js → install-manifest-KBYD7SAY.js} +3 -3
  140. package/bundle/{irc-adapter-AIEP6OX6.js → irc-adapter-HXO5D4SW.js} +3 -3
  141. package/bundle/{irc-config-6VY67UPQ.js → irc-config-XN5VW2V4.js} +5 -5
  142. package/bundle/kanban-board-6Q5E5GEB.js +31 -0
  143. package/bundle/kanban-board-I52RHNHQ.js +31 -0
  144. package/bundle/{lazy-require-UFYFFX2R.js → lazy-require-R3JYCV5M.js} +4 -4
  145. package/bundle/{media-utils-MOE36VWY.js → media-utils-W7XW3SVV.js} +4 -4
  146. package/bundle/{message-pipeline-2MBT44FO.js → message-pipeline-4CTBJ6K2.js} +17 -14
  147. package/bundle/message-pipeline-4KL7OWUH.js +38 -0
  148. package/bundle/message-pipeline-GFKSHRFU.js +38 -0
  149. package/bundle/message-pipeline-TGI2WJJM.js +38 -0
  150. package/bundle/meta.json +3181 -2356
  151. package/bundle/{notification-U6F5ZBSG.js → notification-ULESRDHB.js} +7 -6
  152. package/bundle/{openrouter-credits-7XXO6QGQ.js → openrouter-credits-PLIKRY5D.js} +4 -4
  153. package/bundle/{paths-ZJYIDND2.js → paths-QQM74XYT.js} +4 -2
  154. package/bundle/{peer-client-T44VI7NB.js → peer-client-D2F5QWRV.js} +8 -8
  155. package/bundle/{peer-config-D5A4454H.js → peer-config-5SUIBJLG.js} +5 -5
  156. package/bundle/{phase-transport-FEZ4SIJJ.js → phase-transport-INFD6ELA.js} +10 -10
  157. package/bundle/phase-transport-KXFZ5BVF.js +23 -0
  158. package/bundle/{restore-MFSW3EBL.js → restore-Z6MF54HS.js} +4 -4
  159. package/bundle/{restore-MFSW3EBL.js.map → restore-Z6MF54HS.js.map} +2 -2
  160. package/bundle/{update-check-O5MS6B3L.js → rollback-5RXXLUD6.js} +5 -7
  161. package/bundle/{self-healer-utils-7NFH22VJ.js → self-healer-utils-WPKOVXJD.js} +4 -4
  162. package/bundle/{skill-stats-IPVKMWN3.js → skill-stats-NHNH47QW.js} +5 -5
  163. package/bundle/{sleep-BPWX3FCN.js → sleep-ENFZFUJJ.js} +8 -8
  164. package/bundle/sleep-ENFZFUJJ.js.map +7 -0
  165. package/bundle/{soul-bundle-BRIUDEQ2.js → soul-bundle-QTPWDJB2.js} +7 -7
  166. package/bundle/soul-bundle-QTPWDJB2.js.map +7 -0
  167. package/bundle/{soul-loader-GBXJ7EBH.js → soul-loader-LCPTN4PK.js} +8 -8
  168. package/bundle/soul-loader-LCPTN4PK.js.map +7 -0
  169. package/bundle/{sse-parser-anthropic-H42TTLBD.js → sse-parser-anthropic-PYDJM3UC.js} +4 -4
  170. package/bundle/{sse-parser-responses-WG2LY2ML.js → sse-parser-responses-FYT7A5WT.js} +4 -4
  171. package/bundle/{ssrf-guard-E2KBBC5E.js → ssrf-guard-R4P5OCTO.js} +4 -4
  172. package/bundle/{start-CBVKNEAT.js → start-4DNURGIY.js} +1 -1
  173. package/bundle/{stt-CF3CPFDC.js → stt-YN77NND6.js} +5 -5
  174. package/bundle/stt-YN77NND6.js.map +7 -0
  175. package/bundle/{subagent-runtime-4MTYUBIZ.js → subagent-runtime-5AYOXOU2.js} +5 -5
  176. package/bundle/subagent-runtime-5AYOXOU2.js.map +7 -0
  177. package/bundle/subagent-runtime-VKTX6Q2M.js +13 -0
  178. package/bundle/subagent-runtime-VKTX6Q2M.js.map +7 -0
  179. package/bundle/system-event-buffer-OEPPNUGK.js +17 -0
  180. package/bundle/system-event-buffer-OEPPNUGK.js.map +7 -0
  181. package/bundle/{system-message-TALP6GP2.js → system-message-BRU267FW.js} +3 -3
  182. package/bundle/{system-status-GLYXXDE3.js → system-status-7K2QTH3J.js} +58 -51
  183. package/bundle/system-status-7K2QTH3J.js.map +7 -0
  184. package/bundle/{hotskills-6ECHLXTJ.js → task-failure-buffer-DPM5MWZ5.js} +8 -7
  185. package/bundle/task-failure-buffer-DPM5MWZ5.js.map +7 -0
  186. package/bundle/{task-store-LC7ZMS72.js → task-store-VCBHAB43.js} +5 -5
  187. package/bundle/task-store-VCBHAB43.js.map +7 -0
  188. package/bundle/{telegram-adapter-BJJYXN7J.js → telegram-adapter-4KI4CJPG.js} +51 -33
  189. package/bundle/telegram-adapter-4KI4CJPG.js.map +7 -0
  190. package/bundle/telegram-adapter-76B4JRJJ.js +1080 -0
  191. package/bundle/telegram-adapter-76B4JRJJ.js.map +7 -0
  192. package/bundle/telegram-adapter-VZA74EMT.js +1080 -0
  193. package/bundle/telegram-adapter-VZA74EMT.js.map +7 -0
  194. package/bundle/telegram-adapter-ZO2CLU22.js +1080 -0
  195. package/bundle/telegram-adapter-ZO2CLU22.js.map +7 -0
  196. package/bundle/{tool-registry-T7XLTI2Q.js → tool-registry-CG7GIS64.js} +13 -9
  197. package/bundle/tool-registry-CG7GIS64.js.map +7 -0
  198. package/bundle/tool-registry-TGNU5AMG.js +43 -0
  199. package/bundle/tool-registry-TGNU5AMG.js.map +7 -0
  200. package/bundle/{tool-sandbox-OZMXJZLQ.js → tool-sandbox-TLAL55QP.js} +5 -5
  201. package/bundle/tool-sandbox-TLAL55QP.js.map +7 -0
  202. package/bundle/{transport-config-G5NKQXPJ.js → transport-config-JIKHB7GT.js} +8 -8
  203. package/bundle/transport-config-JIKHB7GT.js.map +7 -0
  204. package/bundle/update-check-AJMIBQGQ.js +81 -0
  205. package/bundle/update-check-AJMIBQGQ.js.map +7 -0
  206. package/bundle/{user-registry-NUVNEHJU.js → user-registry-PEFDZ5AV.js} +5 -5
  207. package/bundle/user-registry-PEFDZ5AV.js.map +7 -0
  208. package/core/skills/tools/gmail/SKILL.md +5 -14
  209. package/core/skills/tools/rss/SKILL.md +51 -0
  210. package/install-manifest.json +8 -2
  211. package/package.json +4 -2
  212. package/scripts/abtars-daemon.service +3 -0
  213. package/scripts/abtars@.service +3 -0
  214. package/scripts/build-and-deploy.sh +68 -0
  215. package/scripts/doctor.sh +38 -0
  216. package/scripts/emergency-deploy.sh +95 -0
  217. package/scripts/watchdog.sh +51 -5
  218. package/bundle/chunk-4BUOO6WI.js.map +0 -7
  219. package/bundle/chunk-A5OJYQNU.js.map +0 -7
  220. package/bundle/chunk-JX3ZZU3O.js +0 -82
  221. package/bundle/chunk-JX3ZZU3O.js.map +0 -7
  222. package/bundle/chunk-KJOCXWJ5.js +0 -131
  223. package/bundle/chunk-KJOCXWJ5.js.map +0 -7
  224. package/bundle/chunk-KSEIWT4T.js.map +0 -7
  225. package/bundle/chunk-KWBGYWDO.js.map +0 -7
  226. package/bundle/chunk-MJ6PHMOK.js.map +0 -7
  227. package/bundle/chunk-P2BZSLJJ.js.map +0 -7
  228. package/bundle/chunk-R36WIOYX.js.map +0 -7
  229. package/bundle/chunk-RE3F3CFW.js +0 -300
  230. package/bundle/chunk-RE3F3CFW.js.map +0 -7
  231. package/bundle/chunk-RSWUPUNA.js.map +0 -7
  232. package/bundle/chunk-RV54J75Q.js.map +0 -7
  233. package/bundle/chunk-TYVI3ZWA.js.map +0 -7
  234. package/bundle/chunk-X5FBUA53.js.map +0 -7
  235. package/bundle/direct-api-transport-TRV45NO6.js.map +0 -7
  236. package/bundle/discord-adapter-WA2MFRK3.js.map +0 -7
  237. package/bundle/system-status-GLYXXDE3.js.map +0 -7
  238. package/bundle/telegram-adapter-BJJYXN7J.js.map +0 -7
  239. /package/bundle/{agent-api-rate-limit-C25WGSFF.js.map → agent-api-rate-limit-R2OFAQ3N.js.map} +0 -0
  240. /package/bundle/{agent-registry-SYUFNSVB.js.map → agent-registry-5VL5KI6U.js.map} +0 -0
  241. /package/bundle/{bridge-lock-transport-HO545SBK.js.map → agent-registry-PIS5XJHX.js.map} +0 -0
  242. /package/bundle/{browse-delivery-VTLEAVYA.js.map → bridge-lock-transport-N6OGDOSE.js.map} +0 -0
  243. /package/bundle/{browser-REIXOJ6S.js.map → browse-delivery-DXGMDMXA.js.map} +0 -0
  244. /package/bundle/{capability-ILW3D5HS.js.map → browser-QMYGSP5W.js.map} +0 -0
  245. /package/bundle/{commands-WUGPBPHI.js.map → capability-733TLH4W.js.map} +0 -0
  246. /package/bundle/{chunk-PZE3J7ER.js.map → chunk-3OXQWII3.js.map} +0 -0
  247. /package/bundle/{chunk-4KJ76TTE.js.map → chunk-4XW7YA3K.js.map} +0 -0
  248. /package/bundle/{chunk-ZVDVNSXK.js.map → chunk-7WFE2JI5.js.map} +0 -0
  249. /package/bundle/{chunk-Q62SXS73.js.map → chunk-BBDKU4EH.js.map} +0 -0
  250. /package/bundle/{chunk-EX2SRTUE.js.map → chunk-CYSGXNBY.js.map} +0 -0
  251. /package/bundle/{chunk-LYEAHE5V.js.map → chunk-DCY7DGMT.js.map} +0 -0
  252. /package/bundle/{chunk-G6IXMYIO.js.map → chunk-DO4INSXE.js.map} +0 -0
  253. /package/bundle/{chunk-VA5WKN3Z.js.map → chunk-EGA6JQVV.js.map} +0 -0
  254. /package/bundle/{chunk-URAQLQ2U.js.map → chunk-F3HMZFIL.js.map} +0 -0
  255. /package/bundle/{chunk-OOKLEC6V.js.map → chunk-FY3QUO2L.js.map} +0 -0
  256. /package/bundle/{chunk-2BY6I4P5.js.map → chunk-GUTRAMK3.js.map} +0 -0
  257. /package/bundle/{chunk-GPL57SRN.js.map → chunk-H7RX7UCR.js.map} +0 -0
  258. /package/bundle/{chunk-BYDUMHXT.js.map → chunk-HAF2AFBW.js.map} +0 -0
  259. /package/bundle/{chunk-KFENC7BM.js.map → chunk-L33WNMCP.js.map} +0 -0
  260. /package/bundle/{chunk-JRG4EFMP.js.map → chunk-LBMETTUP.js.map} +0 -0
  261. /package/bundle/{chunk-TOUZC6NR.js.map → chunk-OKMN6J4Z.js.map} +0 -0
  262. /package/bundle/{chunk-XZSYMCLF.js.map → chunk-PUDGA4RR.js.map} +0 -0
  263. /package/bundle/{chunk-CELR236Q.js.map → chunk-Q7CH5DA3.js.map} +0 -0
  264. /package/bundle/{chunk-UDZIZB5F.js.map → chunk-RTL7HO3N.js.map} +0 -0
  265. /package/bundle/{chunk-ITG6XGBS.js.map → chunk-SA44ITVX.js.map} +0 -0
  266. /package/bundle/{chunk-3MO2MDXJ.js.map → chunk-SA6YEFNG.js.map} +0 -0
  267. /package/bundle/{chunk-GBBTK6H2.js.map → chunk-SRFEIZQT.js.map} +0 -0
  268. /package/bundle/{chunk-ELRAH7VL.js.map → chunk-VXUVKC66.js.map} +0 -0
  269. /package/bundle/{config-DQIGDX4W.js.map → commands-IGRSOSK6.js.map} +0 -0
  270. /package/bundle/{delegation-tools-6FICZQ5G.js.map → commands-LAWVNQTO.js.map} +0 -0
  271. /package/bundle/{deploy-lib-import-SBKXDD3F.js.map → commands-RBWY7YXB.js.map} +0 -0
  272. /package/bundle/{env-schema-XCPAJ6IZ.js.map → commands-XFZNMZN6.js.map} +0 -0
  273. /package/bundle/{hook-system-POI5VRIX.js.map → config-NDEYF4AQ.js.map} +0 -0
  274. /package/bundle/{daemon-NPKYZ3CJ.js.map → daemon-WOQXCKNL.js.map} +0 -0
  275. /package/bundle/{hotskills-6ECHLXTJ.js.map → delegation-tools-Z5OM3TXS.js.map} +0 -0
  276. /package/bundle/{install-SH4UVUXQ.js.map → deploy-lib-import-6VJTYXEG.js.map} +0 -0
  277. /package/bundle/{deps-HN6CEXA4.js.map → deps-65V7XXG4.js.map} +0 -0
  278. /package/bundle/{dns-wakeup-RYOCQ6GR.js.map → dns-wakeup-N46RPU5E.js.map} +0 -0
  279. /package/bundle/{ensure-invariants-BJIEOSJ2.js.map → ensure-invariants-3NOBCYWS.js.map} +0 -0
  280. /package/bundle/{lazy-require-UFYFFX2R.js.map → env-schema-T43X43BU.js.map} +0 -0
  281. /package/bundle/{message-pipeline-2MBT44FO.js.map → hook-system-ZCVOFFRD.js.map} +0 -0
  282. /package/bundle/{notification-U6F5ZBSG.js.map → hotskills-DTROJY6G.js.map} +0 -0
  283. /package/bundle/{paths-ZJYIDND2.js.map → install-I3CXVW52.js.map} +0 -0
  284. /package/bundle/{install-manifest-QRWID3KZ.js.map → install-manifest-KBYD7SAY.js.map} +0 -0
  285. /package/bundle/{irc-adapter-AIEP6OX6.js.map → irc-adapter-HXO5D4SW.js.map} +0 -0
  286. /package/bundle/{irc-config-6VY67UPQ.js.map → irc-config-XN5VW2V4.js.map} +0 -0
  287. /package/bundle/{peer-config-D5A4454H.js.map → kanban-board-6Q5E5GEB.js.map} +0 -0
  288. /package/bundle/{phase-transport-FEZ4SIJJ.js.map → kanban-board-I52RHNHQ.js.map} +0 -0
  289. /package/bundle/{skill-stats-IPVKMWN3.js.map → lazy-require-R3JYCV5M.js.map} +0 -0
  290. /package/bundle/{media-utils-MOE36VWY.js.map → media-utils-W7XW3SVV.js.map} +0 -0
  291. /package/bundle/{sleep-BPWX3FCN.js.map → message-pipeline-4CTBJ6K2.js.map} +0 -0
  292. /package/bundle/{soul-bundle-BRIUDEQ2.js.map → message-pipeline-4KL7OWUH.js.map} +0 -0
  293. /package/bundle/{soul-loader-GBXJ7EBH.js.map → message-pipeline-GFKSHRFU.js.map} +0 -0
  294. /package/bundle/{stt-CF3CPFDC.js.map → message-pipeline-TGI2WJJM.js.map} +0 -0
  295. /package/bundle/{subagent-runtime-4MTYUBIZ.js.map → notification-ULESRDHB.js.map} +0 -0
  296. /package/bundle/{openrouter-credits-7XXO6QGQ.js.map → openrouter-credits-PLIKRY5D.js.map} +0 -0
  297. /package/bundle/{task-store-LC7ZMS72.js.map → paths-QQM74XYT.js.map} +0 -0
  298. /package/bundle/{peer-client-T44VI7NB.js.map → peer-client-D2F5QWRV.js.map} +0 -0
  299. /package/bundle/{tool-registry-T7XLTI2Q.js.map → peer-config-5SUIBJLG.js.map} +0 -0
  300. /package/bundle/{tool-sandbox-OZMXJZLQ.js.map → phase-transport-INFD6ELA.js.map} +0 -0
  301. /package/bundle/{transport-config-G5NKQXPJ.js.map → phase-transport-KXFZ5BVF.js.map} +0 -0
  302. /package/bundle/{update-check-O5MS6B3L.js.map → rollback-5RXXLUD6.js.map} +0 -0
  303. /package/bundle/{self-healer-utils-7NFH22VJ.js.map → self-healer-utils-WPKOVXJD.js.map} +0 -0
  304. /package/bundle/{user-registry-NUVNEHJU.js.map → skill-stats-NHNH47QW.js.map} +0 -0
  305. /package/bundle/{sse-parser-anthropic-H42TTLBD.js.map → sse-parser-anthropic-PYDJM3UC.js.map} +0 -0
  306. /package/bundle/{sse-parser-responses-WG2LY2ML.js.map → sse-parser-responses-FYT7A5WT.js.map} +0 -0
  307. /package/bundle/{ssrf-guard-E2KBBC5E.js.map → ssrf-guard-R4P5OCTO.js.map} +0 -0
  308. /package/bundle/{start-CBVKNEAT.js.map → start-4DNURGIY.js.map} +0 -0
  309. /package/bundle/{system-message-TALP6GP2.js.map → system-message-BRU267FW.js.map} +0 -0
@@ -6,18 +6,19 @@ var BOT_COMMANDS = [
6
6
  { name: "reset", description: "Fresh session + exit coding" },
7
7
  { name: "session", description: "Session management" },
8
8
  { name: "compact", description: "Compact context window" },
9
- { name: "status", description: "Bridge status" },
9
+ { name: "status", description: "Operational health (PID, platforms, context)" },
10
+ { name: "software", description: "Version, deploy info, rollback" },
11
+ { name: "model", description: "Model configuration & switching" },
10
12
  { name: "doctor", description: "Deep healthcheck (probes all subsystems)" },
11
13
  { name: "mcp", description: "MCP server status" },
12
14
  { name: "hooks", description: "List configured hooks" },
13
15
  { name: "stop", description: "Stop current response" },
14
16
  { name: "wait", description: "Inject message mid-run (non-interrupting)" },
15
- { name: "models", description: "Model, transport & agents" },
16
- { name: "change", description: "Switch model/provider" },
17
+ { name: "update", description: "Pull & deploy latest code" },
17
18
  { name: "emergency", description: "Activate paid hailMary model" },
18
19
  { name: "heartbeat", description: "Heartbeat diagnostics" },
19
20
  { name: "memory", description: "Memory stats" },
20
- { name: "skills", description: "List skills" },
21
+ { name: "skills", description: "List active skills" },
21
22
  { name: "skill", description: "Reload skills catalog" },
22
23
  { name: "tasks", description: "Scheduled tasks" },
23
24
  { name: "facts", description: "Core knowledge" },
@@ -25,6 +26,8 @@ var BOT_COMMANDS = [
25
26
  { name: "restart", description: "Restart bridge" },
26
27
  { name: "wakeup", description: "Wake Mac from sleep" },
27
28
  { name: "sleep", description: "Sleep status / resume / now" },
29
+ { name: "whoami", description: "Your user info & clearance" },
30
+ { name: "reasoning", description: "Reasoning effort & thinking display" },
28
31
  { name: "help", description: "Show all commands" }
29
32
  ];
30
33
 
@@ -219,11 +222,36 @@ var EMOJI_SCORES = {
219
222
  function emojiToScore(emoji) {
220
223
  return EMOJI_SCORES[emoji] ?? 1;
221
224
  }
225
+ var EMOJI_TAGS = {
226
+ "\u2764\uFE0F": "love",
227
+ "\u2764": "love",
228
+ "\u{1F525}": "excitement",
229
+ "\u{1F389}": "joy",
230
+ "\u{1F44F}": "pride",
231
+ "\u{1F44D}": "gratitude",
232
+ "\u{1F602}": "humor",
233
+ "\u{1F929}": "excitement",
234
+ "\u{1F4AF}": "conviction",
235
+ "\u26A1": "determination",
236
+ "\u{1F60A}": "joy",
237
+ "\u{1F64F}": "gratitude",
238
+ "\u{1F914}": "curiosity",
239
+ "\u{1F62E}": "surprise",
240
+ "\u{1F44E}": "frustration",
241
+ "\u{1F622}": "grief",
242
+ "\u{1F621}": "anger",
243
+ "\u{1F92E}": "anger",
244
+ "\u{1F4A9}": "frustration"
245
+ };
246
+ function emojiToTag(emoji) {
247
+ return EMOJI_TAGS[emoji] ?? "gratitude";
248
+ }
222
249
 
223
250
  export {
224
251
  BOT_COMMANDS,
225
252
  SecurityGate,
226
253
  ResponseFormatter,
227
- emojiToScore
254
+ emojiToScore,
255
+ emojiToTag
228
256
  };
229
- //# sourceMappingURL=chunk-R36WIOYX.js.map
257
+ //# sourceMappingURL=chunk-B52YRWR6.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/command-registry.ts", "../src/components/security-gate.ts", "../src/components/response-formatter.ts", "../src/utils/emoji-score.ts"],
4
+ "sourcesContent": ["/**\n * command-registry.ts \u2014 Shared bot command definitions for all platforms.\n * Both Telegram (setMyCommands) and Discord (application commands) import from here.\n */\n\nexport interface BotCommand {\n readonly name: string;\n readonly description: string;\n}\n\n/** All registered bot commands. Discord requires: name \u226432 chars lowercase, description \u2264100 chars. */\nexport const BOT_COMMANDS: readonly BotCommand[] = [\n { name: \"reset\", description: \"Fresh session + exit coding\" },\n { name: \"session\", description: \"Session management\" },\n { name: \"compact\", description: \"Compact context window\" },\n { name: \"status\", description: \"Operational health (PID, platforms, context)\" },\n { name: \"software\", description: \"Version, deploy info, rollback\" },\n { name: \"model\", description: \"Model configuration & switching\" },\n { name: \"doctor\", description: \"Deep healthcheck (probes all subsystems)\" },\n { name: \"mcp\", description: \"MCP server status\" },\n { name: \"hooks\", description: \"List configured hooks\" },\n { name: \"stop\", description: \"Stop current response\" },\n { name: \"wait\", description: \"Inject message mid-run (non-interrupting)\" },\n { name: \"update\", description: \"Pull & deploy latest code\" },\n { name: \"emergency\", description: \"Activate paid hailMary model\" },\n { name: \"heartbeat\", description: \"Heartbeat diagnostics\" },\n { name: \"memory\", description: \"Memory stats\" },\n { name: \"skills\", description: \"List active skills\" },\n { name: \"skill\", description: \"Reload skills catalog\" },\n { name: \"tasks\", description: \"Scheduled tasks\" },\n { name: \"facts\", description: \"Core knowledge\" },\n { name: \"nlm\", description: \"Knowledge base\" },\n { name: \"restart\", description: \"Restart bridge\" },\n { name: \"wakeup\", description: \"Wake Mac from sleep\" },\n { name: \"sleep\", description: \"Sleep status / resume / now\" },\n { name: \"whoami\", description: \"Your user info & clearance\" },\n { name: \"reasoning\", description: \"Reasoning effort & thinking display\" },\n { name: \"help\", description: \"Show all commands\" },\n];\n", "/**\n * Fail-closed security gate that authorizes messages against the user registry.\n * Unauthorized messages are silently dropped \u2014 no response, no side effects.\n * Per-user channel gating via UserEntry.allowedChats.\n */\nimport type { UserEntry, UserRegistry } from \"./user-registry.js\";\n\nexport interface AuthResult {\n authorized: boolean;\n user?: UserEntry;\n}\n\nexport class SecurityGate {\n private readonly registry: UserRegistry;\n\n constructor(registry: UserRegistry) {\n if (registry.users.length === 0) {\n throw new Error(\"SecurityGate requires at least one user in registry\");\n }\n this.registry = registry;\n }\n\n /** Authorize a platform user. Checks allowedChats if set. */\n authorize(platformUserId: string, platform: string, channelId?: string): AuthResult {\n const key = `${platform}:${platformUserId}`;\n const user = this.registry.byPlatformId.get(key);\n if (!user) return { authorized: false };\n if (!this.chatAllowed(user, channelId)) return { authorized: false };\n return { authorized: true, user };\n }\n\n /** Authorize by platform user ID string (tries both platforms). */\n authorizeById(userId: string, channelId?: string): boolean {\n const tg = this.registry.byPlatformId.get(`telegram:${userId}`);\n const dc = this.registry.byPlatformId.get(`discord:${userId}`);\n const user = tg ?? dc;\n if (!user) return false;\n return this.chatAllowed(user, channelId);\n }\n\n private chatAllowed(user: UserEntry, channelId?: string): boolean {\n if (!user.allowedChats || user.allowedChats.length === 0) return true;\n if (!channelId) return true;\n return user.allowedChats.includes(channelId);\n }\n}\n", "import type { Platform } from \"../types/index.js\";\n\nconst TELEGRAM_MAX_LENGTH = 4096;\nconst DISCORD_MAX_LENGTH = 2000;\n\n/** Characters that must be escaped in Telegram MarkdownV2. */\nconst MARKDOWN_V2_ESCAPE = /([_*\\[\\]()~`>#+\\-=|{}.!\\\\])/g;\n\n/**\n * Collects streaming ACP response chunks and formats them\n * for Telegram delivery (chunking, Markdown conversion).\n */\nexport class ResponseFormatter {\n private buffers = new Map<string, string[]>();\n\n /** Accumulate a chunk for a session. */\n collectChunk(sessionId: string, chunk: string): void {\n const existing = this.buffers.get(sessionId);\n if (existing) {\n existing.push(chunk);\n } else {\n this.buffers.set(sessionId, [chunk]);\n }\n }\n\n /** Flush accumulated chunks for a session, returning Telegram-ready messages. */\n flush(sessionId: string): string[] {\n const chunks = this.buffers.get(sessionId);\n this.buffers.delete(sessionId);\n if (!chunks || chunks.length === 0) return [];\n const full = chunks.join(\"\");\n return this.chunkText(full);\n }\n\n /** Split text into chunks that fit Telegram's 4096-char limit. */\n chunkText(text: string): string[] {\n if (text.length <= TELEGRAM_MAX_LENGTH) {\n return [text];\n }\n\n const result: string[] = [];\n let remaining = text;\n\n while (remaining.length > 0) {\n if (remaining.length <= TELEGRAM_MAX_LENGTH) {\n result.push(remaining);\n break;\n }\n\n // Try to split at paragraph boundary\n let splitAt = remaining.lastIndexOf(\"\\n\\n\", TELEGRAM_MAX_LENGTH);\n if (splitAt <= 0) {\n // Try single newline\n splitAt = remaining.lastIndexOf(\"\\n\", TELEGRAM_MAX_LENGTH);\n }\n if (splitAt <= 0) {\n // Try space\n splitAt = remaining.lastIndexOf(\" \", TELEGRAM_MAX_LENGTH);\n }\n if (splitAt <= 0) {\n // Hard split\n splitAt = TELEGRAM_MAX_LENGTH;\n }\n\n result.push(remaining.slice(0, splitAt));\n remaining = remaining.slice(splitAt).trimStart();\n }\n\n return result;\n }\n\n /** Escape text for Telegram MarkdownV2 parse mode. */\n toTelegramMarkdown(markdown: string): string {\n // Preserve code blocks \u2014 don't escape inside them\n const parts = markdown.split(/(```[\\s\\S]*?```|`[^`]+`)/);\n return parts\n .map((part, i) => {\n // Odd indices are code blocks/inline code \u2014 leave as-is\n if (i % 2 === 1) return part;\n return part.replace(MARKDOWN_V2_ESCAPE, \"\\\\$1\");\n })\n .join(\"\");\n }\n\n /** Split text into chunks for Discord's 2000-char limit.\n * Respects paragraph and code block boundaries \u2014 never splits inside a fenced code block. */\n chunkTextForDiscord(text: string): string[] {\n if (text.length <= DISCORD_MAX_LENGTH) {\n return [text];\n }\n\n const result: string[] = [];\n let remaining = text;\n\n while (remaining.length > 0) {\n if (remaining.length <= DISCORD_MAX_LENGTH) {\n result.push(remaining);\n break;\n }\n\n // Check if there's an open code block in the window we're about to cut\n const window = remaining.slice(0, DISCORD_MAX_LENGTH);\n const fenceMatches = window.match(/```/g);\n const hasOpenCodeBlock = fenceMatches != null && fenceMatches.length % 2 !== 0;\n\n if (hasOpenCodeBlock) {\n // Find the start of the open code block (last unmatched ```)\n const lastFenceIdx = window.lastIndexOf(\"```\");\n // Try to split before the code block at a paragraph boundary\n let splitAt = remaining.lastIndexOf(\"\\n\\n\", lastFenceIdx);\n if (splitAt <= 0) {\n splitAt = remaining.lastIndexOf(\"\\n\", lastFenceIdx);\n }\n if (splitAt <= 0) {\n // Can't avoid splitting inside the code block \u2014 close and reopen\n splitAt = remaining.lastIndexOf(\"\\n\", DISCORD_MAX_LENGTH - 4); // leave room for closing ```\n if (splitAt <= 0) {\n splitAt = DISCORD_MAX_LENGTH - 4;\n }\n // Find the code fence language specifier for reopening\n const fenceStart = remaining.lastIndexOf(\"```\", splitAt);\n const fenceLine = remaining.slice(fenceStart, remaining.indexOf(\"\\n\", fenceStart));\n result.push(remaining.slice(0, splitAt) + \"\\n```\");\n remaining = fenceLine + \"\\n\" + remaining.slice(splitAt).trimStart();\n continue;\n }\n result.push(remaining.slice(0, splitAt));\n remaining = remaining.slice(splitAt).trimStart();\n continue;\n }\n\n // No open code block \u2014 split normally at paragraph/line boundaries\n let splitAt = remaining.lastIndexOf(\"\\n\\n\", DISCORD_MAX_LENGTH);\n if (splitAt <= 0) {\n splitAt = remaining.lastIndexOf(\"\\n\", DISCORD_MAX_LENGTH);\n }\n if (splitAt <= 0) {\n splitAt = remaining.lastIndexOf(\" \", DISCORD_MAX_LENGTH);\n }\n if (splitAt <= 0) {\n splitAt = DISCORD_MAX_LENGTH;\n }\n\n result.push(remaining.slice(0, splitAt));\n remaining = remaining.slice(splitAt).trimStart();\n }\n\n return result;\n }\n\n /** Split text for the appropriate platform. */\n chunkForPlatform(text: string, platform: Platform): string[] {\n if (platform === \"discord\") {\n return this.chunkTextForDiscord(text);\n }\n return this.chunkText(text);\n }\n\n /** Convert standard Markdown to Discord-compatible Markdown (mostly passthrough). */\n toDiscordMarkdown(text: string): string {\n return text;\n }\n\n /** Format a tool status update for the user. */\n formatToolStatus(toolName: string, status: \"start\" | \"done\" | \"error\"): string {\n switch (status) {\n case \"start\":\n return `\uD83D\uDD27 ${toolName}...`;\n case \"done\":\n return `\u2705 ${toolName}`;\n case \"error\":\n return `\u274C ${toolName} failed`;\n }\n }\n}\n", "/** Inline emoji-to-score map (avoids hard dep on abmind for adapters). */\nconst EMOJI_SCORES: Record<string, number> = {\n \"\u2764\uFE0F\": 4, \"\uD83D\uDD25\": 4, \"\uD83C\uDF89\": 3, \"\uD83D\uDC4F\": 4, \"\u2764\": 4,\n \"\uD83D\uDC4D\": 3, \"\uD83D\uDE02\": 3, \"\uD83E\uDD29\": 4, \"\uD83D\uDCAF\": 3, \"\u26A1\": 3,\n \"\uD83D\uDE0A\": 2, \"\uD83D\uDE4F\": 2, \"\uD83E\uDD14\": 1, \"\uD83D\uDE2E\": 1,\n \"\uD83D\uDC4E\": -3, \"\uD83D\uDE22\": -3, \"\uD83D\uDE21\": -4, \"\uD83E\uDD2E\": -4, \"\uD83D\uDCA9\": -5,\n};\n\nexport function emojiToScore(emoji: string): number {\n return EMOJI_SCORES[emoji] ?? 1;\n}\n\nconst EMOJI_TAGS: Record<string, string> = {\n \"\u2764\uFE0F\": \"love\", \"\u2764\": \"love\", \"\uD83D\uDD25\": \"excitement\", \"\uD83C\uDF89\": \"joy\",\n \"\uD83D\uDC4F\": \"pride\", \"\uD83D\uDC4D\": \"gratitude\", \"\uD83D\uDE02\": \"humor\", \"\uD83E\uDD29\": \"excitement\",\n \"\uD83D\uDCAF\": \"conviction\", \"\u26A1\": \"determination\", \"\uD83D\uDE0A\": \"joy\", \"\uD83D\uDE4F\": \"gratitude\",\n \"\uD83E\uDD14\": \"curiosity\", \"\uD83D\uDE2E\": \"surprise\",\n \"\uD83D\uDC4E\": \"frustration\", \"\uD83D\uDE22\": \"grief\", \"\uD83D\uDE21\": \"anger\", \"\uD83E\uDD2E\": \"anger\", \"\uD83D\uDCA9\": \"frustration\",\n};\n\nexport function emojiToTag(emoji: string): string {\n return EMOJI_TAGS[emoji] ?? \"gratitude\";\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["splitAt"]
7
+ }
@@ -1,23 +1,23 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
3
- import {
4
- loadUsers
5
- } from "./chunk-GBBTK6H2.js";
6
3
  import {
7
4
  readEnv
8
- } from "./chunk-BYDUMHXT.js";
5
+ } from "./chunk-HAF2AFBW.js";
6
+ import {
7
+ loadUsers
8
+ } from "./chunk-SRFEIZQT.js";
9
9
  import {
10
10
  getEnv,
11
11
  init_env_schema
12
- } from "./chunk-PZE3J7ER.js";
12
+ } from "./chunk-3OXQWII3.js";
13
13
  import {
14
14
  init_logger,
15
15
  logError,
16
16
  logWarn
17
- } from "./chunk-2BY6I4P5.js";
17
+ } from "./chunk-GUTRAMK3.js";
18
18
  import {
19
19
  init_paths
20
- } from "./chunk-MJ6PHMOK.js";
20
+ } from "./chunk-WW5F2DCO.js";
21
21
 
22
22
  // src/components/config.ts
23
23
  import { access, stat, constants } from "node:fs/promises";
@@ -86,7 +86,7 @@ async function validateCliPath(cliPath) {
86
86
  }
87
87
  }
88
88
  async function loadAndValidateConfig() {
89
- const { loadTransport, validateAtStartup } = await import("./transport-config-G5NKQXPJ.js");
89
+ const { loadTransport, validateAtStartup } = await import("./transport-config-JIKHB7GT.js");
90
90
  const tc = loadTransport();
91
91
  if (tc) {
92
92
  validateAtStartup();
@@ -221,4 +221,4 @@ export {
221
221
  isValidSnowflake,
222
222
  loadAndValidateConfig
223
223
  };
224
- //# sourceMappingURL=chunk-Q62SXS73.js.map
224
+ //# sourceMappingURL=chunk-BBDKU4EH.js.map
@@ -0,0 +1,258 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
3
+
4
+ // src/components/command-registry.ts
5
+ var BOT_COMMANDS = [
6
+ { name: "reset", description: "Fresh session + exit coding" },
7
+ { name: "session", description: "Session management" },
8
+ { name: "compact", description: "Compact context window" },
9
+ { name: "status", description: "Operational health (PID, platforms, context)" },
10
+ { name: "software", description: "Version, deploy info, rollback" },
11
+ { name: "model", description: "Model configuration & switching" },
12
+ { name: "doctor", description: "Deep healthcheck (probes all subsystems)" },
13
+ { name: "mcp", description: "MCP server status" },
14
+ { name: "hooks", description: "List configured hooks" },
15
+ { name: "stop", description: "Stop current response" },
16
+ { name: "wait", description: "Inject message mid-run (non-interrupting)" },
17
+ { name: "update", description: "Pull & deploy latest code" },
18
+ { name: "emergency", description: "Activate paid hailMary model" },
19
+ { name: "heartbeat", description: "Heartbeat diagnostics" },
20
+ { name: "memory", description: "Memory stats" },
21
+ { name: "skills", description: "List active skills" },
22
+ { name: "skill", description: "Reload skills catalog" },
23
+ { name: "tasks", description: "Scheduled tasks" },
24
+ { name: "facts", description: "Core knowledge" },
25
+ { name: "nlm", description: "Knowledge base" },
26
+ { name: "restart", description: "Restart bridge" },
27
+ { name: "wakeup", description: "Wake Mac from sleep" },
28
+ { name: "sleep", description: "Sleep status / resume / now" },
29
+ { name: "whoami", description: "Your user info & clearance" },
30
+ { name: "reasoning", description: "Reasoning effort & thinking display" },
31
+ { name: "kanban", description: "Kanban board" },
32
+ { name: "help", description: "Show all commands" }
33
+ ];
34
+
35
+ // src/components/security-gate.ts
36
+ var SecurityGate = class {
37
+ registry;
38
+ constructor(registry) {
39
+ if (registry.users.length === 0) {
40
+ throw new Error("SecurityGate requires at least one user in registry");
41
+ }
42
+ this.registry = registry;
43
+ }
44
+ /** Authorize a platform user. Checks allowedChats if set. */
45
+ authorize(platformUserId, platform, channelId) {
46
+ const key = `${platform}:${platformUserId}`;
47
+ const user = this.registry.byPlatformId.get(key);
48
+ if (!user) return { authorized: false };
49
+ if (!this.chatAllowed(user, channelId)) return { authorized: false };
50
+ return { authorized: true, user };
51
+ }
52
+ /** Authorize by platform user ID string (tries both platforms). */
53
+ authorizeById(userId, channelId) {
54
+ const tg = this.registry.byPlatformId.get(`telegram:${userId}`);
55
+ const dc = this.registry.byPlatformId.get(`discord:${userId}`);
56
+ const user = tg ?? dc;
57
+ if (!user) return false;
58
+ return this.chatAllowed(user, channelId);
59
+ }
60
+ chatAllowed(user, channelId) {
61
+ if (!user.allowedChats || user.allowedChats.length === 0) return true;
62
+ if (!channelId) return true;
63
+ return user.allowedChats.includes(channelId);
64
+ }
65
+ };
66
+
67
+ // src/components/response-formatter.ts
68
+ var TELEGRAM_MAX_LENGTH = 4096;
69
+ var DISCORD_MAX_LENGTH = 2e3;
70
+ var MARKDOWN_V2_ESCAPE = /([_*\[\]()~`>#+\-=|{}.!\\])/g;
71
+ var ResponseFormatter = class {
72
+ buffers = /* @__PURE__ */ new Map();
73
+ /** Accumulate a chunk for a session. */
74
+ collectChunk(sessionId, chunk) {
75
+ const existing = this.buffers.get(sessionId);
76
+ if (existing) {
77
+ existing.push(chunk);
78
+ } else {
79
+ this.buffers.set(sessionId, [chunk]);
80
+ }
81
+ }
82
+ /** Flush accumulated chunks for a session, returning Telegram-ready messages. */
83
+ flush(sessionId) {
84
+ const chunks = this.buffers.get(sessionId);
85
+ this.buffers.delete(sessionId);
86
+ if (!chunks || chunks.length === 0) return [];
87
+ const full = chunks.join("");
88
+ return this.chunkText(full);
89
+ }
90
+ /** Split text into chunks that fit Telegram's 4096-char limit. */
91
+ chunkText(text) {
92
+ if (text.length <= TELEGRAM_MAX_LENGTH) {
93
+ return [text];
94
+ }
95
+ const result = [];
96
+ let remaining = text;
97
+ while (remaining.length > 0) {
98
+ if (remaining.length <= TELEGRAM_MAX_LENGTH) {
99
+ result.push(remaining);
100
+ break;
101
+ }
102
+ let splitAt = remaining.lastIndexOf("\n\n", TELEGRAM_MAX_LENGTH);
103
+ if (splitAt <= 0) {
104
+ splitAt = remaining.lastIndexOf("\n", TELEGRAM_MAX_LENGTH);
105
+ }
106
+ if (splitAt <= 0) {
107
+ splitAt = remaining.lastIndexOf(" ", TELEGRAM_MAX_LENGTH);
108
+ }
109
+ if (splitAt <= 0) {
110
+ splitAt = TELEGRAM_MAX_LENGTH;
111
+ }
112
+ result.push(remaining.slice(0, splitAt));
113
+ remaining = remaining.slice(splitAt).trimStart();
114
+ }
115
+ return result;
116
+ }
117
+ /** Escape text for Telegram MarkdownV2 parse mode. */
118
+ toTelegramMarkdown(markdown) {
119
+ const parts = markdown.split(/(```[\s\S]*?```|`[^`]+`)/);
120
+ return parts.map((part, i) => {
121
+ if (i % 2 === 1) return part;
122
+ return part.replace(MARKDOWN_V2_ESCAPE, "\\$1");
123
+ }).join("");
124
+ }
125
+ /** Split text into chunks for Discord's 2000-char limit.
126
+ * Respects paragraph and code block boundaries — never splits inside a fenced code block. */
127
+ chunkTextForDiscord(text) {
128
+ if (text.length <= DISCORD_MAX_LENGTH) {
129
+ return [text];
130
+ }
131
+ const result = [];
132
+ let remaining = text;
133
+ while (remaining.length > 0) {
134
+ if (remaining.length <= DISCORD_MAX_LENGTH) {
135
+ result.push(remaining);
136
+ break;
137
+ }
138
+ const window = remaining.slice(0, DISCORD_MAX_LENGTH);
139
+ const fenceMatches = window.match(/```/g);
140
+ const hasOpenCodeBlock = fenceMatches != null && fenceMatches.length % 2 !== 0;
141
+ if (hasOpenCodeBlock) {
142
+ const lastFenceIdx = window.lastIndexOf("```");
143
+ let splitAt2 = remaining.lastIndexOf("\n\n", lastFenceIdx);
144
+ if (splitAt2 <= 0) {
145
+ splitAt2 = remaining.lastIndexOf("\n", lastFenceIdx);
146
+ }
147
+ if (splitAt2 <= 0) {
148
+ splitAt2 = remaining.lastIndexOf("\n", DISCORD_MAX_LENGTH - 4);
149
+ if (splitAt2 <= 0) {
150
+ splitAt2 = DISCORD_MAX_LENGTH - 4;
151
+ }
152
+ const fenceStart = remaining.lastIndexOf("```", splitAt2);
153
+ const fenceLine = remaining.slice(fenceStart, remaining.indexOf("\n", fenceStart));
154
+ result.push(remaining.slice(0, splitAt2) + "\n```");
155
+ remaining = fenceLine + "\n" + remaining.slice(splitAt2).trimStart();
156
+ continue;
157
+ }
158
+ result.push(remaining.slice(0, splitAt2));
159
+ remaining = remaining.slice(splitAt2).trimStart();
160
+ continue;
161
+ }
162
+ let splitAt = remaining.lastIndexOf("\n\n", DISCORD_MAX_LENGTH);
163
+ if (splitAt <= 0) {
164
+ splitAt = remaining.lastIndexOf("\n", DISCORD_MAX_LENGTH);
165
+ }
166
+ if (splitAt <= 0) {
167
+ splitAt = remaining.lastIndexOf(" ", DISCORD_MAX_LENGTH);
168
+ }
169
+ if (splitAt <= 0) {
170
+ splitAt = DISCORD_MAX_LENGTH;
171
+ }
172
+ result.push(remaining.slice(0, splitAt));
173
+ remaining = remaining.slice(splitAt).trimStart();
174
+ }
175
+ return result;
176
+ }
177
+ /** Split text for the appropriate platform. */
178
+ chunkForPlatform(text, platform) {
179
+ if (platform === "discord") {
180
+ return this.chunkTextForDiscord(text);
181
+ }
182
+ return this.chunkText(text);
183
+ }
184
+ /** Convert standard Markdown to Discord-compatible Markdown (mostly passthrough). */
185
+ toDiscordMarkdown(text) {
186
+ return text;
187
+ }
188
+ /** Format a tool status update for the user. */
189
+ formatToolStatus(toolName, status) {
190
+ switch (status) {
191
+ case "start":
192
+ return `\u{1F527} ${toolName}...`;
193
+ case "done":
194
+ return `\u2705 ${toolName}`;
195
+ case "error":
196
+ return `\u274C ${toolName} failed`;
197
+ }
198
+ }
199
+ };
200
+
201
+ // src/utils/emoji-score.ts
202
+ var EMOJI_SCORES = {
203
+ "\u2764\uFE0F": 4,
204
+ "\u{1F525}": 4,
205
+ "\u{1F389}": 3,
206
+ "\u{1F44F}": 4,
207
+ "\u2764": 4,
208
+ "\u{1F44D}": 3,
209
+ "\u{1F602}": 3,
210
+ "\u{1F929}": 4,
211
+ "\u{1F4AF}": 3,
212
+ "\u26A1": 3,
213
+ "\u{1F60A}": 2,
214
+ "\u{1F64F}": 2,
215
+ "\u{1F914}": 1,
216
+ "\u{1F62E}": 1,
217
+ "\u{1F44E}": -3,
218
+ "\u{1F622}": -3,
219
+ "\u{1F621}": -4,
220
+ "\u{1F92E}": -4,
221
+ "\u{1F4A9}": -5
222
+ };
223
+ function emojiToScore(emoji) {
224
+ return EMOJI_SCORES[emoji] ?? 1;
225
+ }
226
+ var EMOJI_TAGS = {
227
+ "\u2764\uFE0F": "love",
228
+ "\u2764": "love",
229
+ "\u{1F525}": "excitement",
230
+ "\u{1F389}": "joy",
231
+ "\u{1F44F}": "pride",
232
+ "\u{1F44D}": "gratitude",
233
+ "\u{1F602}": "humor",
234
+ "\u{1F929}": "excitement",
235
+ "\u{1F4AF}": "conviction",
236
+ "\u26A1": "determination",
237
+ "\u{1F60A}": "joy",
238
+ "\u{1F64F}": "gratitude",
239
+ "\u{1F914}": "curiosity",
240
+ "\u{1F62E}": "surprise",
241
+ "\u{1F44E}": "frustration",
242
+ "\u{1F622}": "grief",
243
+ "\u{1F621}": "anger",
244
+ "\u{1F92E}": "anger",
245
+ "\u{1F4A9}": "frustration"
246
+ };
247
+ function emojiToTag(emoji) {
248
+ return EMOJI_TAGS[emoji] ?? "gratitude";
249
+ }
250
+
251
+ export {
252
+ BOT_COMMANDS,
253
+ SecurityGate,
254
+ ResponseFormatter,
255
+ emojiToScore,
256
+ emojiToTag
257
+ };
258
+ //# sourceMappingURL=chunk-BBTQKKDO.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/command-registry.ts", "../src/components/security-gate.ts", "../src/components/response-formatter.ts", "../src/utils/emoji-score.ts"],
4
+ "sourcesContent": ["/**\n * command-registry.ts \u2014 Shared bot command definitions for all platforms.\n * Both Telegram (setMyCommands) and Discord (application commands) import from here.\n */\n\nexport interface BotCommand {\n readonly name: string;\n readonly description: string;\n}\n\n/** All registered bot commands. Discord requires: name \u226432 chars lowercase, description \u2264100 chars. */\nexport const BOT_COMMANDS: readonly BotCommand[] = [\n { name: \"reset\", description: \"Fresh session + exit coding\" },\n { name: \"session\", description: \"Session management\" },\n { name: \"compact\", description: \"Compact context window\" },\n { name: \"status\", description: \"Operational health (PID, platforms, context)\" },\n { name: \"software\", description: \"Version, deploy info, rollback\" },\n { name: \"model\", description: \"Model configuration & switching\" },\n { name: \"doctor\", description: \"Deep healthcheck (probes all subsystems)\" },\n { name: \"mcp\", description: \"MCP server status\" },\n { name: \"hooks\", description: \"List configured hooks\" },\n { name: \"stop\", description: \"Stop current response\" },\n { name: \"wait\", description: \"Inject message mid-run (non-interrupting)\" },\n { name: \"update\", description: \"Pull & deploy latest code\" },\n { name: \"emergency\", description: \"Activate paid hailMary model\" },\n { name: \"heartbeat\", description: \"Heartbeat diagnostics\" },\n { name: \"memory\", description: \"Memory stats\" },\n { name: \"skills\", description: \"List active skills\" },\n { name: \"skill\", description: \"Reload skills catalog\" },\n { name: \"tasks\", description: \"Scheduled tasks\" },\n { name: \"facts\", description: \"Core knowledge\" },\n { name: \"nlm\", description: \"Knowledge base\" },\n { name: \"restart\", description: \"Restart bridge\" },\n { name: \"wakeup\", description: \"Wake Mac from sleep\" },\n { name: \"sleep\", description: \"Sleep status / resume / now\" },\n { name: \"whoami\", description: \"Your user info & clearance\" },\n { name: \"reasoning\", description: \"Reasoning effort & thinking display\" },\n { name: \"kanban\", description: \"Kanban board\" },\n { name: \"help\", description: \"Show all commands\" },\n];\n", "/**\n * Fail-closed security gate that authorizes messages against the user registry.\n * Unauthorized messages are silently dropped \u2014 no response, no side effects.\n * Per-user channel gating via UserEntry.allowedChats.\n */\nimport type { UserEntry, UserRegistry } from \"./user-registry.js\";\n\nexport interface AuthResult {\n authorized: boolean;\n user?: UserEntry;\n}\n\nexport class SecurityGate {\n private readonly registry: UserRegistry;\n\n constructor(registry: UserRegistry) {\n if (registry.users.length === 0) {\n throw new Error(\"SecurityGate requires at least one user in registry\");\n }\n this.registry = registry;\n }\n\n /** Authorize a platform user. Checks allowedChats if set. */\n authorize(platformUserId: string, platform: string, channelId?: string): AuthResult {\n const key = `${platform}:${platformUserId}`;\n const user = this.registry.byPlatformId.get(key);\n if (!user) return { authorized: false };\n if (!this.chatAllowed(user, channelId)) return { authorized: false };\n return { authorized: true, user };\n }\n\n /** Authorize by platform user ID string (tries both platforms). */\n authorizeById(userId: string, channelId?: string): boolean {\n const tg = this.registry.byPlatformId.get(`telegram:${userId}`);\n const dc = this.registry.byPlatformId.get(`discord:${userId}`);\n const user = tg ?? dc;\n if (!user) return false;\n return this.chatAllowed(user, channelId);\n }\n\n private chatAllowed(user: UserEntry, channelId?: string): boolean {\n if (!user.allowedChats || user.allowedChats.length === 0) return true;\n if (!channelId) return true;\n return user.allowedChats.includes(channelId);\n }\n}\n", "import type { Platform } from \"../types/index.js\";\n\nconst TELEGRAM_MAX_LENGTH = 4096;\nconst DISCORD_MAX_LENGTH = 2000;\n\n/** Characters that must be escaped in Telegram MarkdownV2. */\nconst MARKDOWN_V2_ESCAPE = /([_*\\[\\]()~`>#+\\-=|{}.!\\\\])/g;\n\n/**\n * Collects streaming ACP response chunks and formats them\n * for Telegram delivery (chunking, Markdown conversion).\n */\nexport class ResponseFormatter {\n private buffers = new Map<string, string[]>();\n\n /** Accumulate a chunk for a session. */\n collectChunk(sessionId: string, chunk: string): void {\n const existing = this.buffers.get(sessionId);\n if (existing) {\n existing.push(chunk);\n } else {\n this.buffers.set(sessionId, [chunk]);\n }\n }\n\n /** Flush accumulated chunks for a session, returning Telegram-ready messages. */\n flush(sessionId: string): string[] {\n const chunks = this.buffers.get(sessionId);\n this.buffers.delete(sessionId);\n if (!chunks || chunks.length === 0) return [];\n const full = chunks.join(\"\");\n return this.chunkText(full);\n }\n\n /** Split text into chunks that fit Telegram's 4096-char limit. */\n chunkText(text: string): string[] {\n if (text.length <= TELEGRAM_MAX_LENGTH) {\n return [text];\n }\n\n const result: string[] = [];\n let remaining = text;\n\n while (remaining.length > 0) {\n if (remaining.length <= TELEGRAM_MAX_LENGTH) {\n result.push(remaining);\n break;\n }\n\n // Try to split at paragraph boundary\n let splitAt = remaining.lastIndexOf(\"\\n\\n\", TELEGRAM_MAX_LENGTH);\n if (splitAt <= 0) {\n // Try single newline\n splitAt = remaining.lastIndexOf(\"\\n\", TELEGRAM_MAX_LENGTH);\n }\n if (splitAt <= 0) {\n // Try space\n splitAt = remaining.lastIndexOf(\" \", TELEGRAM_MAX_LENGTH);\n }\n if (splitAt <= 0) {\n // Hard split\n splitAt = TELEGRAM_MAX_LENGTH;\n }\n\n result.push(remaining.slice(0, splitAt));\n remaining = remaining.slice(splitAt).trimStart();\n }\n\n return result;\n }\n\n /** Escape text for Telegram MarkdownV2 parse mode. */\n toTelegramMarkdown(markdown: string): string {\n // Preserve code blocks \u2014 don't escape inside them\n const parts = markdown.split(/(```[\\s\\S]*?```|`[^`]+`)/);\n return parts\n .map((part, i) => {\n // Odd indices are code blocks/inline code \u2014 leave as-is\n if (i % 2 === 1) return part;\n return part.replace(MARKDOWN_V2_ESCAPE, \"\\\\$1\");\n })\n .join(\"\");\n }\n\n /** Split text into chunks for Discord's 2000-char limit.\n * Respects paragraph and code block boundaries \u2014 never splits inside a fenced code block. */\n chunkTextForDiscord(text: string): string[] {\n if (text.length <= DISCORD_MAX_LENGTH) {\n return [text];\n }\n\n const result: string[] = [];\n let remaining = text;\n\n while (remaining.length > 0) {\n if (remaining.length <= DISCORD_MAX_LENGTH) {\n result.push(remaining);\n break;\n }\n\n // Check if there's an open code block in the window we're about to cut\n const window = remaining.slice(0, DISCORD_MAX_LENGTH);\n const fenceMatches = window.match(/```/g);\n const hasOpenCodeBlock = fenceMatches != null && fenceMatches.length % 2 !== 0;\n\n if (hasOpenCodeBlock) {\n // Find the start of the open code block (last unmatched ```)\n const lastFenceIdx = window.lastIndexOf(\"```\");\n // Try to split before the code block at a paragraph boundary\n let splitAt = remaining.lastIndexOf(\"\\n\\n\", lastFenceIdx);\n if (splitAt <= 0) {\n splitAt = remaining.lastIndexOf(\"\\n\", lastFenceIdx);\n }\n if (splitAt <= 0) {\n // Can't avoid splitting inside the code block \u2014 close and reopen\n splitAt = remaining.lastIndexOf(\"\\n\", DISCORD_MAX_LENGTH - 4); // leave room for closing ```\n if (splitAt <= 0) {\n splitAt = DISCORD_MAX_LENGTH - 4;\n }\n // Find the code fence language specifier for reopening\n const fenceStart = remaining.lastIndexOf(\"```\", splitAt);\n const fenceLine = remaining.slice(fenceStart, remaining.indexOf(\"\\n\", fenceStart));\n result.push(remaining.slice(0, splitAt) + \"\\n```\");\n remaining = fenceLine + \"\\n\" + remaining.slice(splitAt).trimStart();\n continue;\n }\n result.push(remaining.slice(0, splitAt));\n remaining = remaining.slice(splitAt).trimStart();\n continue;\n }\n\n // No open code block \u2014 split normally at paragraph/line boundaries\n let splitAt = remaining.lastIndexOf(\"\\n\\n\", DISCORD_MAX_LENGTH);\n if (splitAt <= 0) {\n splitAt = remaining.lastIndexOf(\"\\n\", DISCORD_MAX_LENGTH);\n }\n if (splitAt <= 0) {\n splitAt = remaining.lastIndexOf(\" \", DISCORD_MAX_LENGTH);\n }\n if (splitAt <= 0) {\n splitAt = DISCORD_MAX_LENGTH;\n }\n\n result.push(remaining.slice(0, splitAt));\n remaining = remaining.slice(splitAt).trimStart();\n }\n\n return result;\n }\n\n /** Split text for the appropriate platform. */\n chunkForPlatform(text: string, platform: Platform): string[] {\n if (platform === \"discord\") {\n return this.chunkTextForDiscord(text);\n }\n return this.chunkText(text);\n }\n\n /** Convert standard Markdown to Discord-compatible Markdown (mostly passthrough). */\n toDiscordMarkdown(text: string): string {\n return text;\n }\n\n /** Format a tool status update for the user. */\n formatToolStatus(toolName: string, status: \"start\" | \"done\" | \"error\"): string {\n switch (status) {\n case \"start\":\n return `\uD83D\uDD27 ${toolName}...`;\n case \"done\":\n return `\u2705 ${toolName}`;\n case \"error\":\n return `\u274C ${toolName} failed`;\n }\n }\n}\n", "/** Inline emoji-to-score map (avoids hard dep on abmind for adapters). */\nconst EMOJI_SCORES: Record<string, number> = {\n \"\u2764\uFE0F\": 4, \"\uD83D\uDD25\": 4, \"\uD83C\uDF89\": 3, \"\uD83D\uDC4F\": 4, \"\u2764\": 4,\n \"\uD83D\uDC4D\": 3, \"\uD83D\uDE02\": 3, \"\uD83E\uDD29\": 4, \"\uD83D\uDCAF\": 3, \"\u26A1\": 3,\n \"\uD83D\uDE0A\": 2, \"\uD83D\uDE4F\": 2, \"\uD83E\uDD14\": 1, \"\uD83D\uDE2E\": 1,\n \"\uD83D\uDC4E\": -3, \"\uD83D\uDE22\": -3, \"\uD83D\uDE21\": -4, \"\uD83E\uDD2E\": -4, \"\uD83D\uDCA9\": -5,\n};\n\nexport function emojiToScore(emoji: string): number {\n return EMOJI_SCORES[emoji] ?? 1;\n}\n\nconst EMOJI_TAGS: Record<string, string> = {\n \"\u2764\uFE0F\": \"love\", \"\u2764\": \"love\", \"\uD83D\uDD25\": \"excitement\", \"\uD83C\uDF89\": \"joy\",\n \"\uD83D\uDC4F\": \"pride\", \"\uD83D\uDC4D\": \"gratitude\", \"\uD83D\uDE02\": \"humor\", \"\uD83E\uDD29\": \"excitement\",\n \"\uD83D\uDCAF\": \"conviction\", \"\u26A1\": \"determination\", \"\uD83D\uDE0A\": \"joy\", \"\uD83D\uDE4F\": \"gratitude\",\n \"\uD83E\uDD14\": \"curiosity\", \"\uD83D\uDE2E\": \"surprise\",\n \"\uD83D\uDC4E\": \"frustration\", \"\uD83D\uDE22\": \"grief\", \"\uD83D\uDE21\": \"anger\", \"\uD83E\uDD2E\": \"anger\", \"\uD83D\uDCA9\": \"frustration\",\n};\n\nexport function emojiToTag(emoji: string): string {\n return EMOJI_TAGS[emoji] ?? \"gratitude\";\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["splitAt"]
7
+ }
@@ -5,7 +5,7 @@ import {
5
5
  logError,
6
6
  logTrace,
7
7
  logWarn
8
- } from "./chunk-2BY6I4P5.js";
8
+ } from "./chunk-GUTRAMK3.js";
9
9
  import {
10
10
  __esm
11
11
  } from "./chunk-7K2YZTLD.js";
@@ -29,4 +29,4 @@ export {
29
29
  logAndSwallow,
30
30
  init_log_and_swallow
31
31
  };
32
- //# sourceMappingURL=chunk-EX2SRTUE.js.map
32
+ //# sourceMappingURL=chunk-CYSGXNBY.js.map
@@ -3,7 +3,7 @@
3
3
  import {
4
4
  init_logger,
5
5
  logWarn
6
- } from "./chunk-2BY6I4P5.js";
6
+ } from "./chunk-GUTRAMK3.js";
7
7
  import {
8
8
  __esm
9
9
  } from "./chunk-7K2YZTLD.js";
@@ -65,4 +65,4 @@ export {
65
65
  PEERS_SCHEMA,
66
66
  init_config_validator
67
67
  };
68
- //# sourceMappingURL=chunk-LYEAHE5V.js.map
68
+ //# sourceMappingURL=chunk-DCY7DGMT.js.map
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
3
+
4
+ // src/utils/date.ts
5
+ function localDate() {
6
+ const d = /* @__PURE__ */ new Date();
7
+ return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
8
+ }
9
+
10
+ export {
11
+ localDate
12
+ };
13
+ //# sourceMappingURL=chunk-DGS7J4P6.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utils/date.ts"],
4
+ "sourcesContent": ["/** Local date as YYYY-MM-DD (not UTC). */\nexport function localDate(): string {\n const d = new Date();\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, \"0\")}-${String(d.getDate()).padStart(2, \"0\")}`;\n}\n"],
5
+ "mappings": ";;;;AACO,SAAS,YAAoB;AAClC,QAAM,IAAI,oBAAI,KAAK;AACnB,SAAO,GAAG,EAAE,YAAY,CAAC,IAAI,OAAO,EAAE,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AAChH;",
6
+ "names": []
7
+ }
@@ -2,22 +2,24 @@
2
2
  import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
3
3
  import {
4
4
  appendReminder,
5
- localDate,
6
5
  require_main
7
- } from "./chunk-HEHD3GG5.js";
6
+ } from "./chunk-ITB2K6LI.js";
8
7
  import {
9
8
  init_log_and_swallow,
10
9
  logAndSwallow
11
- } from "./chunk-EX2SRTUE.js";
10
+ } from "./chunk-CYSGXNBY.js";
12
11
  import {
13
12
  init_logger,
14
13
  logInfo,
15
14
  logWarn
16
- } from "./chunk-2BY6I4P5.js";
15
+ } from "./chunk-GUTRAMK3.js";
16
+ import {
17
+ localDate
18
+ } from "./chunk-DGS7J4P6.js";
17
19
  import {
18
20
  abtarsHome,
19
21
  init_paths
20
- } from "./chunk-MJ6PHMOK.js";
22
+ } from "./chunk-WW5F2DCO.js";
21
23
  import {
22
24
  __toESM
23
25
  } from "./chunk-7K2YZTLD.js";
@@ -204,4 +206,4 @@ export {
204
206
  deliverBrowseResult,
205
207
  checkBrowseTasks
206
208
  };
207
- //# sourceMappingURL=chunk-LDKSCXGL.js.map
209
+ //# sourceMappingURL=chunk-DHPFI7OF.js.map
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/capabilities/browser/browse-delivery.ts", "../src/capabilities/browser/abtars-browse.ts"],
4
4
  "sourcesContent": ["/**\n * Browse task delivery \u2014 write report + notify user via reminder.\n * Called from runtime.spawn() onComplete/onError callbacks.\n */\n\nimport { writeFileSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { abtarsHome } from \"../../paths.js\";\nimport { logInfo, logWarn } from \"../../components/logger.js\";\nimport { localDate } from \"../../utils/date.js\";\nimport { appendReminder } from \"../../components/tasks/task-checker.js\";\nimport { readPendingBrowse, writePendingBrowse } from \"./abtars-browse.js\";\nimport type { PendingBrowseEntry } from \"./abtars-browse.js\";\n\nconst TAG = \"browse-delivery\";\n\nconst subagentsDir = (): string => join(abtarsHome(), \"subagents\");\n\n/** Deliver result for a browse task. Called by runtime.spawn() callback. */\nexport function deliverBrowseResult(entry: PendingBrowseEntry, result: string): void {\n const dir = subagentsDir();\n mkdirSync(dir, { recursive: true });\n const date = localDate();\n const reportPath = join(dir, `browse_${entry.taskId}_${date}.md`);\n writeFileSync(reportPath, result || \"(no output captured)\", \"utf-8\");\n\n const taskLabel = entry.task.length > 200 ? entry.task.slice(0, 200) + \"\u2026\" : entry.task;\n const msg = `\uD83C\uDF10 Browse task complete: ${taskLabel}\\nReport: ${reportPath}`;\n appendReminder({ chatId: entry.chatId, message: msg, createdAt: Date.now(), threadId: entry.threadId });\n logInfo(TAG, `\uD83C\uDF10 Browse \"${taskLabel}\" finished \u2014 ${reportPath}`);\n}\n\n/** Safety net: check for stale pending entries (runtime handles timeouts, this catches orphans). */\nexport function checkBrowseTasks(): void {\n const entries = readPendingBrowse();\n if (entries.length === 0) return;\n\n const now = Date.now();\n const remaining: PendingBrowseEntry[] = [];\n\n for (const entry of entries) {\n const elapsed = now - entry.startedAt;\n if (elapsed > entry.timeoutMs + 60_000) {\n // Stale entry \u2014 runtime should have cleaned up, remove orphan\n const taskLabel = entry.task.length > 200 ? entry.task.slice(0, 200) + \"\u2026\" : entry.task;\n logWarn(TAG, `Removing stale browse entry: ${taskLabel} (${Math.round(elapsed / 1000)}s old)`);\n } else {\n remaining.push(entry);\n }\n }\n\n if (remaining.length !== entries.length) writePendingBrowse(remaining);\n}\n", "#!/usr/bin/env node\n/**\n * abtars-browse \u2014 spawn a browser subagent for autonomous web tasks.\n *\n * Usage:\n * abtars-browse --task \"check X notifications\" --chat-id 7773842843\n * abtars-browse --task \"post on FB\" --chat-id 123 --timeout 600\n * abtars-browse --task \"research topic\" --chat-id 123 --dry-run\n *\n * Returns immediately. The subagent runs detached and results are delivered\n * via pending_reminders.json \u2192 bridge picks up \u2192 sends to chat.\n */\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { abtarsHome } from \"../../paths.js\";\nimport { logAndSwallow } from \"../../components/log-and-swallow.js\";\n\nconst TAG = \"browse\";\nimport { randomBytes } from \"node:crypto\";\nimport { config as loadDotenv } from \"dotenv\";\nimport { localDate } from \"../../utils/date.js\";\n\n// --- Types ---\n\nexport interface BrowseArgs {\n task?: string;\n chatId?: string;\n threadId?: string;\n timeout?: string;\n engine?: string;\n dryRun: boolean;\n}\n\nexport interface PendingBrowseEntry {\n taskId: string;\n task: string;\n chatId: number;\n threadId?: number;\n pid: number;\n startedAt: number;\n timeoutMs: number;\n logFile: string;\n}\n\n// --- Arg parsing ---\n\nexport function parseArgs(argv: string[]): BrowseArgs {\n const args = argv.slice(2);\n const parsed: BrowseArgs = { dryRun: false };\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--task\": parsed.task = args[++i] ?? \"\"; break;\n case \"--chat-id\": parsed.chatId = args[++i] ?? \"\"; break;\n case \"--thread-id\": parsed.threadId = args[++i] ?? \"\"; break;\n case \"--timeout\": parsed.timeout = args[++i] ?? \"\"; break;\n case \"--engine\": parsed.engine = args[++i] ?? \"\"; break;\n case \"--dry-run\": parsed.dryRun = true; break;\n }\n }\n return parsed;\n}\n\nexport function validateArgs(args: BrowseArgs): { ok: true; task: string; chatId: number; threadId?: number; timeoutMs: number } | { ok: false; error: string } {\n if (!args.task) return { ok: false, error: \"--task is required\" };\n if (!args.chatId) return { ok: false, error: \"--chat-id is required\" };\n const chatId = parseInt(args.chatId, 10);\n if (!Number.isFinite(chatId)) return { ok: false, error: \"invalid --chat-id\" };\n const threadId = args.threadId ? parseInt(args.threadId, 10) : undefined;\n const timeoutMs = args.timeout ? parseInt(args.timeout, 10) * 1000 : 5 * 60 * 1000;\n if (!Number.isFinite(timeoutMs)) return { ok: false, error: \"invalid --timeout\" };\n const task = args.task.length > 2000 ? args.task.slice(0, 2000) + \"\u2026\" : args.task;\n return { ok: true, task, chatId, threadId, timeoutMs };\n}\n\n// --- Prompt loading ---\n\nexport function loadBrowsePrompt(task: string, _chatId: number, taskId?: string): string {\n const path = join(abtarsHome(), \"prompts\", \"browsing_prompt.md\");\n\n if (!existsSync(path)) {\n throw new Error(`browsing_prompt.md not found at ${path}`);\n }\n const template = readFileSync(path, \"utf-8\");\n\n const date = localDate();\n const reportFile = `browse_${taskId ?? \"unknown\"}_${date}.md`;\n\n const vars: Record<string, string> = {\n TASK: task,\n TASK_ID: taskId ?? \"unknown\",\n DATE: date,\n REPORT_FILE: reportFile,\n };\n\n let result = template;\n for (const [key, value] of Object.entries(vars)) {\n result = result.replaceAll(`\\${${key}}`, value);\n }\n return result;\n}\n\n// --- Pending browse file ---\n\nconst pendingPath = (): string => join(abtarsHome(), \"workspace\", \"browse\", \"pending_browse.json\");\n\nexport function readPendingBrowse(): PendingBrowseEntry[] {\n const p = pendingPath();\n if (!existsSync(p)) return [];\n try { return JSON.parse(readFileSync(p, \"utf-8\")) as PendingBrowseEntry[]; }\n catch (err) { logAndSwallow(TAG, \"readPendingBrowse\", err); return []; }\n}\n\nexport function writePendingBrowse(entries: PendingBrowseEntry[]): void {\n const dir = join(abtarsHome(), \"workspace\", \"browse\");\n mkdirSync(dir, { recursive: true });\n writeFileSync(pendingPath(), JSON.stringify(entries, null, 2), \"utf-8\");\n}\n\n// --- Main ---\n\nexport async function main(argv: string[] = process.argv): Promise<void> {\n if (argv.includes(\"--help\")) {\n console.log(`abtars-browse \u2014 delegate a browser task to the Browsie agent.\n\nUsage:\n abtars-browse --task \"check X notifications\" --chat-id ID\n abtars-browse --task \"research topic\" --chat-id ID --timeout 600\n abtars-browse --task \"research topic\" --chat-id ID --dry-run`);\n process.exit(0);\n }\n\n loadDotenv({ path: join(abtarsHome(), \".env\") });\n const raw = parseArgs(argv);\n const validation = validateArgs(raw);\n\n if (!validation.ok) {\n console.log(JSON.stringify({ ok: false, error: validation.error }));\n process.exit(1);\n }\n\n const { task, chatId, threadId, timeoutMs } = validation;\n const taskId = randomBytes(3).toString(\"hex\");\n\n // Dry-run: print prompt and exit\n if (raw.dryRun) {\n const prompt = loadBrowsePrompt(task, chatId, taskId);\n process.stdout.write(prompt + \"\\n\");\n return;\n }\n\n mkdirSync(join(abtarsHome(), \"subagents\"), { recursive: true });\n\n const prompt = loadBrowsePrompt(task, chatId, taskId);\n\n // Send spawn request to bridge via IPC\n const spawnSocket = join(abtarsHome(), \"browser-socket\", \"browse-spawn.sock\");\n const net = await import(\"node:net\");\n const result = await new Promise<{ ok: boolean; taskId?: string; error?: string }>((resolve, reject) => {\n const conn = net.createConnection(spawnSocket);\n conn.on(\"connect\", () => {\n conn.write(JSON.stringify({ taskId, task, prompt, chatId, threadId, timeoutMs }) + \"\\n\");\n });\n let buf = \"\";\n conn.on(\"data\", (chunk) => {\n buf += chunk.toString();\n const nl = buf.indexOf(\"\\n\");\n if (nl === -1) return;\n conn.end();\n try { resolve(JSON.parse(buf.slice(0, nl))); } catch (e) { reject(e); }\n });\n conn.on(\"error\", reject);\n conn.setTimeout(10_000, () => { conn.destroy(); reject(new Error(\"IPC timeout\")); });\n });\n\n console.log(JSON.stringify(result));\n}\n\nconst isDirectRun = process.argv[1]?.endsWith(\"abtars-browse.ts\") ||\n process.argv[1]?.endsWith(\"abtars-browse.js\");\nif (isDirectRun) main();\n"],
5
- "mappings": "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",
5
+ "mappings": "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",
6
6
  "names": ["writeFileSync", "mkdirSync", "join", "loadDotenv", "prompt", "TAG", "join", "mkdirSync", "writeFileSync"]
7
7
  }
@@ -5,7 +5,7 @@ import {
5
5
  logDebug,
6
6
  logInfo,
7
7
  logWarn
8
- } from "./chunk-2BY6I4P5.js";
8
+ } from "./chunk-GUTRAMK3.js";
9
9
 
10
10
  // src/components/hooks/hook-system.ts
11
11
  init_logger();
@@ -143,4 +143,4 @@ export {
143
143
  getHookSummary,
144
144
  fire
145
145
  };
146
- //# sourceMappingURL=chunk-G6IXMYIO.js.map
146
+ //# sourceMappingURL=chunk-DO4INSXE.js.map