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
@@ -3,47 +3,50 @@
3
3
  import {
4
4
  require_ws
5
5
  } from "./chunk-NIRYBWUW.js";
6
+ import {
7
+ loadMinimalSoul,
8
+ loadSoulBundle
9
+ } from "./chunk-L33WNMCP.js";
6
10
  import {
7
11
  transcribeAudio
8
- } from "./chunk-3MO2MDXJ.js";
12
+ } from "./chunk-SA6YEFNG.js";
9
13
  import {
10
14
  ModelNotFoundError
11
- } from "./chunk-RV54J75Q.js";
15
+ } from "./chunk-PKHYCNTT.js";
12
16
  import {
13
- loadMinimalSoul,
14
- loadSoulBundle
15
- } from "./chunk-KFENC7BM.js";
16
- import {
17
- loadUsers
18
- } from "./chunk-GBBTK6H2.js";
17
+ sanitizeOutbound
18
+ } from "./chunk-YWZPKBO6.js";
19
19
  import {
20
20
  abmind
21
21
  } from "./chunk-JAJ3DUQ2.js";
22
22
  import {
23
23
  fire,
24
24
  hasHooks
25
- } from "./chunk-G6IXMYIO.js";
25
+ } from "./chunk-DO4INSXE.js";
26
26
  import {
27
27
  readAndClearRestartReason,
28
28
  readBridgeLockField,
29
29
  updateBridgeLockField,
30
30
  writeForceSleep,
31
31
  writeSleepStatus
32
- } from "./chunk-UDZIZB5F.js";
32
+ } from "./chunk-RTL7HO3N.js";
33
+ import {
34
+ loadUsers
35
+ } from "./chunk-SRFEIZQT.js";
33
36
  import {
34
37
  readEntries
35
- } from "./chunk-GPL57SRN.js";
38
+ } from "./chunk-H7RX7UCR.js";
36
39
  import {
37
40
  localTime
38
41
  } from "./chunk-MZWMYN4O.js";
39
- import {
40
- init_log_and_swallow,
41
- logAndSwallow
42
- } from "./chunk-EX2SRTUE.js";
43
42
  import {
44
43
  getEnv,
45
44
  init_env_schema
46
- } from "./chunk-PZE3J7ER.js";
45
+ } from "./chunk-3OXQWII3.js";
46
+ import {
47
+ init_log_and_swallow,
48
+ logAndSwallow
49
+ } from "./chunk-CYSGXNBY.js";
47
50
  import {
48
51
  init_logger,
49
52
  logDebug,
@@ -51,11 +54,11 @@ import {
51
54
  logInfo,
52
55
  logTrace,
53
56
  logWarn
54
- } from "./chunk-2BY6I4P5.js";
57
+ } from "./chunk-GUTRAMK3.js";
55
58
  import {
56
59
  abtarsHome,
57
60
  init_paths
58
- } from "./chunk-MJ6PHMOK.js";
61
+ } from "./chunk-WW5F2DCO.js";
59
62
  import {
60
63
  __commonJS,
61
64
  __require,
@@ -863,21 +866,6 @@ function cleanForTts(text) {
863
866
  return result.replace(/\n{3,}/g, "\n\n").trim();
864
867
  }
865
868
 
866
- // src/components/sanitize-outbound.ts
867
- var STRIP = [
868
- /\s*\[TOPICS:\s*.+?\]/gi,
869
- /\s*\[NO_REPLY\]\s*/gi,
870
- /\s*\[REACT:.+?\]\s*/gi
871
- ];
872
- function sanitizeOutbound(text) {
873
- let out = text;
874
- for (const re of STRIP) {
875
- re.lastIndex = 0;
876
- out = out.replace(re, "");
877
- }
878
- return out.trim();
879
- }
880
-
881
869
  // src/components/pipeline/middleware.ts
882
870
  async function runPipeline(ctx, middlewares) {
883
871
  let index = 0;
@@ -1206,15 +1194,17 @@ File saved at: ${msg.mediaPath}`;
1206
1194
  const isSessionStart = entry.pendingStart || !entry.seen;
1207
1195
  logTrace(TAG3, `session-state: key=${sessionKey} seen=${entry.seen} pendingStart=${entry.pendingStart} isSessionStart=${isSessionStart}`);
1208
1196
  if (isSessionStart && memory) {
1209
- prompt = buildSessionStartPrompt(prompt, memory, userId, sessionKey, deps.maxContext);
1197
+ prompt = buildSessionStartPrompt(prompt, memory, userId, sessionKey, deps.maxContext, msg.platform);
1210
1198
  }
1211
1199
  entry.seen = true;
1212
1200
  entry.pendingStart = false;
1213
1201
  const userRole = registry.byUserId.get(userId)?.role;
1202
+ logTrace(TAG3, `recordMessage gate: memory=${!!memory} userId=${userId} userRole=${userRole}`);
1214
1203
  if (memory && userRole !== "guest") {
1215
1204
  const numericMsgId = typeof msg.messageId === "number" ? msg.messageId : void 0;
1216
1205
  memory.recordMessage({ role: "user", content: text, timestamp: Date.now(), userId, sessionId: sessionKey, platformMessageId: numericMsgId });
1217
1206
  }
1207
+ let recalledHits;
1218
1208
  if (getEnv().activeMemory && memory) {
1219
1209
  const userEntry = registry.byUserId.get(userId);
1220
1210
  if (userEntry?.role !== "guest" && (contextPercent < 0 || contextPercent < getEnv().ctxCompactPct)) {
@@ -1256,6 +1246,7 @@ ${lines.join("\n")}
1256
1246
 
1257
1247
  `;
1258
1248
  prompt = block + prompt;
1249
+ recalledHits = hits.filter((h) => h.id != null).map((h) => ({ id: h.id, contentEn: h.content }));
1259
1250
  logDebug(TAG3, `Active recall: ${hits.length} hits, ${block.length} chars, ${Math.round(performance.now() - t0)}ms`);
1260
1251
  logTrace(TAG3, `recall content: ${block}`);
1261
1252
  }
@@ -1273,13 +1264,13 @@ ${lines.join("\n")}
1273
1264
  const scan = scanFn(text);
1274
1265
  if (!scan.safe) {
1275
1266
  logInfo(TAG3, `Injection blocked from ${userId}: ${scan.flags.map((f) => f.category).join(", ")}`);
1276
- return { prompt: "__INJECTION_BLOCKED__", isSessionStart, imageContent: void 0 };
1267
+ return { prompt: "__INJECTION_BLOCKED__", isSessionStart, imageContent: void 0, recalledHits: void 0 };
1277
1268
  }
1278
1269
  }
1279
1270
  }
1280
- return { prompt, isSessionStart, imageContent };
1271
+ return { prompt, isSessionStart, imageContent, recalledHits };
1281
1272
  }
1282
- function buildSessionStartPrompt(prompt, memory, userId, sessionKey, maxContext) {
1273
+ function buildSessionStartPrompt(prompt, memory, userId, sessionKey, maxContext, platform2) {
1283
1274
  const contextParts = [];
1284
1275
  const reason = readAndClearRestartReason();
1285
1276
  if (reason) {
@@ -1335,15 +1326,23 @@ You are now talking to ${user.userId} (${user.role}, ${CLASS_NAMES[user.maxClass
1335
1326
  } else {
1336
1327
  logInfo(TAG3, `[CURRENT USER] skipped \u2014 no sessionKey`);
1337
1328
  }
1329
+ if (platform2) {
1330
+ const CAPS = { telegram: "voice, reactions, typing, TTS, groups", discord: "reactions, typing, threads", irc: "text only" };
1331
+ contextParts.push(`[SYSTEM] Platform: ${platform2} (${CAPS[platform2] ?? "unknown"})`);
1332
+ }
1338
1333
  const compSummary = null;
1339
1334
  if (compSummary && sessionKey) {
1340
1335
  } else {
1341
- const ctxOpts = isCodeSession ? { skipDailies: true, maxAgeMs: 48 * 60 * 60 * 1e3 } : void 0;
1342
- const ctx = abmind()?.buildSessionStartContext(memory, userId, maxContext, ctxOpts);
1336
+ const ctxOpts = isCodeSession ? { skipDailies: true, maxAgeMs: 48 * 60 * 60 * 1e3 } : maxContext && maxContext >= 64e3 ? { skipMessages: true } : void 0;
1337
+ const ctxResult = abmind()?.buildSessionStartContext(memory, userId, maxContext, ctxOpts);
1338
+ const ctx = ctxResult?.text ?? null;
1343
1339
  if (ctx) {
1344
1340
  contextParts.push(ctx);
1345
- logInfo(TAG3, `Injected session-start context (${ctx.length} chars${isCodeSession ? ", Code mode" : ""})`);
1346
- logTrace(TAG3, `session-start content: ${ctx}`);
1341
+ const s = ctxResult.stats;
1342
+ const ctxPct = maxContext ? Math.round(ctx.length / maxContext * 100) : -1;
1343
+ logInfo(TAG3, `Session start: ${s.messages} messages + ${s.dailies} dailies (${(s.usedBytes / 1024).toFixed(1)}KB / ${(s.budget / 1024).toFixed(0)}KB budget, ${ctxPct}% ctx${isCodeSession ? ", Code" : ""})`);
1344
+ logDebug(TAG3, `Session context: ${s.messages} msgs, ${s.dailies} dailies, ${s.usedBytes}B / ${s.budget}B budget, ${ctxPct}% ctx`);
1345
+ logTrace(TAG3, `session-start content: ${ctx.slice(0, 500)}...`);
1347
1346
  }
1348
1347
  try {
1349
1348
  const userRole = loadUsers().byUserId.get(userId)?.role ?? "master";
@@ -1464,6 +1463,14 @@ async function retrySend(fn, attempts = 3) {
1464
1463
  }
1465
1464
  var TAG4 = "pipeline";
1466
1465
  var PRIMING_MAX = 8;
1466
+ var recalledIdsPerMessage = /* @__PURE__ */ new Map();
1467
+ var RECALL_MAP_TTL = 60 * 6e4;
1468
+ setInterval(() => {
1469
+ if (recalledIdsPerMessage.size > 200) recalledIdsPerMessage.clear();
1470
+ }, RECALL_MAP_TTL);
1471
+ function getRecalledIdsForMessage(platformMsgId) {
1472
+ return recalledIdsPerMessage.get(platformMsgId);
1473
+ }
1467
1474
  var STOPWORDS = /* @__PURE__ */ new Set([
1468
1475
  "the",
1469
1476
  "a",
@@ -1588,7 +1595,7 @@ async function handleInboundMessage(msg, adapter, deps) {
1588
1595
  resetIdleCompactFlag?.();
1589
1596
  const ctxPct = transport.contextPercent;
1590
1597
  logInfo(TAG4, `\u2190 [${msg.platform}] ${isVoice ? "\u{1F3A4} " : ""}"${text.slice(0, 60)}"${ctxPct >= 0 ? ` (ctx: ${ctxPct}%)` : ""}`);
1591
- const { prompt: builtPrompt, imageContent } = await buildPrompt(msg, text, {
1598
+ const { prompt: builtPrompt, imageContent, recalledHits } = await buildPrompt(msg, text, {
1592
1599
  memory,
1593
1600
  memoryConfig,
1594
1601
  sessions,
@@ -1616,13 +1623,28 @@ Result: ${c.result}${cost}`;
1616
1623
 
1617
1624
  ---
1618
1625
 
1626
+ ${prompt}`;
1627
+ }
1628
+ const { drainTaskFailures } = await import("./task-failure-buffer-DPM5MWZ5.js");
1629
+ const failures = drainTaskFailures();
1630
+ if (failures.length > 0) {
1631
+ const lines = failures.map((f) => `[SYSTEM] Task "${f.taskName}" failed (exit ${f.exitCode}${f.error ? `: ${f.error}` : ""}). ${f.consecutiveFailures > 1 ? `${f.consecutiveFailures} consecutive failures.` : ""}`);
1632
+ prompt = `${lines.join("\n")}
1633
+
1634
+ ${prompt}`;
1635
+ }
1636
+ const { drainSystemEvents } = await import("./system-event-buffer-OEPPNUGK.js");
1637
+ const events = drainSystemEvents();
1638
+ if (events.length > 0) {
1639
+ prompt = `${events.map((e) => `[SYSTEM] ${e}`).join("\n")}
1640
+
1619
1641
  ${prompt}`;
1620
1642
  }
1621
1643
  const activeSession = deps.sessionManager.getActiveSession(userId, msg.platform);
1622
1644
  const agentSession = activeSession.agentSession;
1623
1645
  logDebug(TAG4, `Route: session=${activeSessionId} type=${activeSession.type} agentSession=${agentSession ? "yes" : "no"}`);
1624
1646
  if ("sandboxPolicy" in transport) {
1625
- const { buildPolicy } = await import("./tool-sandbox-OZMXJZLQ.js");
1647
+ const { buildPolicy } = await import("./tool-sandbox-TLAL55QP.js");
1626
1648
  transport.sandboxPolicy = buildPolicy("owner");
1627
1649
  }
1628
1650
  if ("isPaused" in transport) {
@@ -1728,6 +1750,10 @@ ${prompt}`;
1728
1750
  const rawResponse = sessions.get(activeSessionId)?.fullMode ? response : cleanAnswer || response;
1729
1751
  const { text: cleanedText, reactionEmoji, noReply, topics } = cleanResponse(rawResponse);
1730
1752
  let userResponse = cleanedText;
1753
+ const reasoningSession = transport.getActiveSession?.();
1754
+ if (!reasoningSession?.showReasoning) {
1755
+ userResponse = userResponse.replace(/<thinking>[\s\S]*?<\/thinking>\s*/g, "");
1756
+ }
1731
1757
  for (const [key, val] of Object.entries(process.env)) {
1732
1758
  if (key.startsWith("SECRET_") && val && userResponse.includes(val)) {
1733
1759
  userResponse = userResponse.replaceAll(val, `[REDACTED:$${key}]`);
@@ -1826,6 +1852,19 @@ ${prompt}`;
1826
1852
  const ctxAfter = transport.contextPercent;
1827
1853
  logInfo(TAG4, `\u2192 [${msg.platform}] Response delivered${ctxAfter >= 0 ? ` (ctx: ${ctxAfter}%)` : ""}`);
1828
1854
  updateBridgeLockField("lastPromptAt", Date.now());
1855
+ if (recalledHits && recalledHits.length > 0 && memory) {
1856
+ try {
1857
+ const { detectCitations } = await import("abmind");
1858
+ const citedIds = detectCitations(userResponse, recalledHits);
1859
+ if (citedIds.length > 0) memory.bumpCitedCount(citedIds);
1860
+ logDebug(TAG4, `Citation: ${citedIds.length}/${recalledHits.length} recalled memories cited`);
1861
+ if (lastSentMsgId != null) {
1862
+ recalledIdsPerMessage.set(Number(lastSentMsgId), recalledHits.map((h) => h.id));
1863
+ }
1864
+ } catch (err) {
1865
+ logDebug(TAG4, `Citation detection failed: ${err instanceof Error ? err.message : String(err)}`);
1866
+ }
1867
+ }
1829
1868
  if (hasHooks("AfterMessage")) {
1830
1869
  fire("AfterMessage", {
1831
1870
  event: "AfterMessage",
@@ -1900,6 +1939,7 @@ async function startSession(transport, memory, userId, sessionKey, greeting, sen
1900
1939
  const response = await transport.sendPrompt(sessionKey, prompt, void 0, userId);
1901
1940
  if (response?.trim() && response.trim() !== "[NO_REPLY]" && response.trim() !== "(no response)") {
1902
1941
  await sendResponse(response);
1942
+ memory.recordMessage({ role: "assistant", content: response, timestamp: Date.now(), userId, sessionId: sessionKey });
1903
1943
  }
1904
1944
  }
1905
1945
 
@@ -1922,7 +1962,7 @@ function registerCommand(name, handler) {
1922
1962
  registerExact(name, handler);
1923
1963
  }
1924
1964
  async function handleCommand(text, ctx) {
1925
- const isMaster = !ctx.userId || ctx.userId === "master" || (await import("./user-registry-NUVNEHJU.js")).loadUsers().byUserId.get(ctx.userId)?.role === "master";
1965
+ const isMaster = !ctx.userId || ctx.userId === "master" || (await import("./user-registry-PEFDZ5AV.js")).loadUsers().byUserId.get(ctx.userId)?.role === "master";
1926
1966
  if (!isMaster) {
1927
1967
  const cmd = text.split(/\s/)[0];
1928
1968
  if (cmd.startsWith("/") && !NON_MASTER_COMMANDS.has(cmd)) {
@@ -1951,7 +1991,7 @@ Type /help for available commands.`);
1951
1991
  return false;
1952
1992
  }
1953
1993
  async function triggerNewSession(ctx, reason = "new-session") {
1954
- const { hasHooks: hasHooks2, fire: fireHook } = await import("./hook-system-POI5VRIX.js");
1994
+ const { hasHooks: hasHooks2, fire: fireHook } = await import("./hook-system-ZCVOFFRD.js");
1955
1995
  if (hasHooks2("SessionEnd")) {
1956
1996
  await fireHook("SessionEnd", { event: "SessionEnd", timestamp: (/* @__PURE__ */ new Date()).toISOString(), sessionKey: ctx.sessionKey, platform: ctx.platform, userId: ctx.userId, reason }).catch((err) => logAndSwallow(TAG5, "fireHook session", err));
1957
1997
  }
@@ -1970,12 +2010,12 @@ async function triggerNewSession(ctx, reason = "new-session") {
1970
2010
  }
1971
2011
  }
1972
2012
  async function triggerResetSession(ctx) {
1973
- const { hasHooks: hasHooks2, fire: fireHook } = await import("./hook-system-POI5VRIX.js");
2013
+ const { hasHooks: hasHooks2, fire: fireHook } = await import("./hook-system-ZCVOFFRD.js");
1974
2014
  if (hasHooks2("SessionEnd")) {
1975
2015
  await fireHook("SessionEnd", { event: "SessionEnd", timestamp: (/* @__PURE__ */ new Date()).toISOString(), sessionKey: ctx.sessionKey, platform: ctx.platform, userId: ctx.userId, reason: "reset-transport" }).catch((err) => logAndSwallow(TAG5, "fireHook session", err));
1976
2016
  }
1977
2017
  await ctx.idleSave.save(ctx.sessionKey, ctx.chatId);
1978
- const { clearTransportCache } = await import("./transport-config-G5NKQXPJ.js");
2018
+ const { clearTransportCache } = await import("./transport-config-JIKHB7GT.js");
1979
2019
  clearTransportCache();
1980
2020
  if (ctx.rebuildTransport) await ctx.rebuildTransport();
1981
2021
  await resetAndPrepare({
@@ -2014,7 +2054,7 @@ var TAG6 = "cmd";
2014
2054
  async function handleNewReset(text, ctx) {
2015
2055
  const isResetDefault = text.trim().toLowerCase() === "/reset default";
2016
2056
  if (isResetDefault) {
2017
- const { resetToDefaults } = await import("./transport-config-G5NKQXPJ.js");
2057
+ const { resetToDefaults } = await import("./transport-config-JIKHB7GT.js");
2018
2058
  resetToDefaults();
2019
2059
  } else {
2020
2060
  try {
@@ -2052,7 +2092,7 @@ async function handleEmergencyAlias(_text, ctx) {
2052
2092
  return handleModels("/model emergency", ctx);
2053
2093
  }
2054
2094
  async function handleModels(text, ctx) {
2055
- const { loadTransport, resolveAgent, getModelsForProvider, writeTransportConfig } = await import("./transport-config-G5NKQXPJ.js");
2095
+ const { loadTransport, resolveAgent, getModelsForProvider, writeTransportConfig } = await import("./transport-config-JIKHB7GT.js");
2056
2096
  const tc = loadTransport();
2057
2097
  const prof = tc ? resolveAgent("professor", tc) : null;
2058
2098
  const currentModel = ("currentModel" in ctx.transport ? ctx.transport.currentModel : void 0) ?? prof?.model ?? "unknown";
@@ -2070,8 +2110,8 @@ async function handleModels(text, ctx) {
2070
2110
  if (tc) {
2071
2111
  const hmProvider = tc.hailMary ? tc.providers[tc.hailMary.provider] : void 0;
2072
2112
  if (hmProvider) {
2073
- const { validateProviderReady, formatValidationError } = await import("./transport-config-G5NKQXPJ.js");
2074
- const { getEnv: getEnv2 } = await import("./env-schema-XCPAJ6IZ.js");
2113
+ const { validateProviderReady, formatValidationError } = await import("./transport-config-JIKHB7GT.js");
2114
+ const { getEnv: getEnv2 } = await import("./env-schema-T43X43BU.js");
2075
2115
  const result = validateProviderReady(tc.hailMary.provider, hmProvider, getEnv2());
2076
2116
  if (!result.ok) {
2077
2117
  await ctx.reply(formatValidationError(tc.hailMary.provider, result));
@@ -2084,7 +2124,7 @@ async function handleModels(text, ctx) {
2084
2124
  return true;
2085
2125
  }
2086
2126
  if (arg === "restore") {
2087
- const { restorePrevious } = await import("./transport-config-G5NKQXPJ.js");
2127
+ const { restorePrevious } = await import("./transport-config-JIKHB7GT.js");
2088
2128
  const result = restorePrevious();
2089
2129
  if (!result.ok) {
2090
2130
  await ctx.reply(`\u274C ${result.error}`);
@@ -2096,7 +2136,7 @@ async function handleModels(text, ctx) {
2096
2136
  return true;
2097
2137
  }
2098
2138
  if (arg === "default") {
2099
- const { resetToDefaults } = await import("./transport-config-G5NKQXPJ.js");
2139
+ const { resetToDefaults } = await import("./transport-config-JIKHB7GT.js");
2100
2140
  if (!resetToDefaults()) {
2101
2141
  await ctx.reply("\u274C Factory config not found \u2014 run abtars install to restore.");
2102
2142
  return true;
@@ -2122,7 +2162,7 @@ async function handleModels(text, ctx) {
2122
2162
  return true;
2123
2163
  }
2124
2164
  const endpoint = prof.provider.endpoint ?? "http://localhost:11434/v1";
2125
- const apiKey = prof.provider.apiKeyEnv ? (await import("./env-schema-XCPAJ6IZ.js")).getEnv().getApiKey(prof.provider.apiKeyEnv) : void 0;
2165
+ const apiKey = prof.provider.apiKeyEnv ? (await import("./env-schema-T43X43BU.js")).getEnv().getApiKey(prof.provider.apiKeyEnv) : void 0;
2126
2166
  const models = /* @__PURE__ */ new Set();
2127
2167
  for (const [, agent] of Object.entries(tc.agents)) {
2128
2168
  if (agent.provider === prof.providerName) models.add(agent.model);
@@ -2133,7 +2173,7 @@ async function handleModels(text, ctx) {
2133
2173
  if (tc.hailMary?.provider === prof.providerName) models.add(tc.hailMary.model);
2134
2174
  await ctx.reply(`\u{1FA7A} Checking ${models.size} models on ${prof.providerName}...`);
2135
2175
  const results = [];
2136
- const { loadModels } = await import("./transport-config-G5NKQXPJ.js");
2176
+ const { loadModels } = await import("./transport-config-JIKHB7GT.js");
2137
2177
  const catalog = loadModels();
2138
2178
  for (const model of models) {
2139
2179
  try {
@@ -2170,9 +2210,9 @@ async function handleModels(text, ctx) {
2170
2210
  if (catalog[model]) catalog[model].lastChecked = (/* @__PURE__ */ new Date()).toISOString();
2171
2211
  }
2172
2212
  const { writeFileSync: writeFileSync2 } = await import("node:fs");
2173
- const { join: join5 } = await import("node:path");
2174
- const { configDir } = await import("./transport-config-G5NKQXPJ.js");
2175
- writeFileSync2(join5(configDir(), "models.json"), JSON.stringify(catalog, null, 2) + "\n");
2213
+ const { join: join4 } = await import("node:path");
2214
+ const { configDir } = await import("./transport-config-JIKHB7GT.js");
2215
+ writeFileSync2(join4(configDir(), "models.json"), JSON.stringify(catalog, null, 2) + "\n");
2176
2216
  await ctx.reply(`\u{1FA7A} Model Health:
2177
2217
  ${results.join("\n")}`);
2178
2218
  return true;
@@ -2194,8 +2234,8 @@ ${results.join("\n")}`);
2194
2234
  return true;
2195
2235
  }
2196
2236
  {
2197
- const { validateProviderReady, formatValidationError } = await import("./transport-config-G5NKQXPJ.js");
2198
- const { getEnv: getEnv2 } = await import("./env-schema-XCPAJ6IZ.js");
2237
+ const { validateProviderReady, formatValidationError } = await import("./transport-config-JIKHB7GT.js");
2238
+ const { getEnv: getEnv2 } = await import("./env-schema-T43X43BU.js");
2199
2239
  const result = validateProviderReady(prof.providerName, prof.provider, getEnv2());
2200
2240
  if (!result.ok) {
2201
2241
  await ctx.reply(formatValidationError(prof.providerName, result));
@@ -2203,7 +2243,7 @@ ${results.join("\n")}`);
2203
2243
  }
2204
2244
  }
2205
2245
  tc.agents["professor"].model = newModel;
2206
- const { cleanDemotedModels } = await import("./transport-config-G5NKQXPJ.js");
2246
+ const { cleanDemotedModels } = await import("./transport-config-JIKHB7GT.js");
2207
2247
  cleanDemotedModels(tc, newModel);
2208
2248
  writeTransportConfig(tc, `professor model \u2192 ${newModel}`);
2209
2249
  if ("setModel" in ctx.transport) {
@@ -2214,7 +2254,7 @@ ${results.join("\n")}`);
2214
2254
  }
2215
2255
  if (arg === "list" || arg.startsWith("list ")) {
2216
2256
  const providerArg = arg.slice(5).trim();
2217
- const { getAvailableProviders, getModelsForProvider: getModels } = await import("./transport-config-G5NKQXPJ.js");
2257
+ const { getAvailableProviders, getModelsForProvider: getModels } = await import("./transport-config-JIKHB7GT.js");
2218
2258
  if (!tc) {
2219
2259
  await ctx.reply("\u274C transport.json not loaded");
2220
2260
  return true;
@@ -2272,8 +2312,8 @@ Use /model quick <name> to switch.`);
2272
2312
  await ctx.reply(`\u274C Provider "${providerName}" not found. Available: ${Object.keys(tc.providers).join(", ")}`);
2273
2313
  return true;
2274
2314
  }
2275
- const { validateProviderReady, formatValidationError, loadProviderDefaults } = await import("./transport-config-G5NKQXPJ.js");
2276
- const { getEnv: getEnv2 } = await import("./env-schema-XCPAJ6IZ.js");
2315
+ const { validateProviderReady, formatValidationError, loadProviderDefaults } = await import("./transport-config-JIKHB7GT.js");
2316
+ const { getEnv: getEnv2 } = await import("./env-schema-T43X43BU.js");
2277
2317
  const validation = validateProviderReady(providerName, provider2, getEnv2());
2278
2318
  if (!validation.ok) {
2279
2319
  await ctx.reply(formatValidationError(providerName, validation));
@@ -2328,6 +2368,27 @@ Use /model quick <name> to switch.`);
2328
2368
  await ctx.reply(lines.join("\n"));
2329
2369
  return true;
2330
2370
  }
2371
+ async function handleReasoning(text, ctx) {
2372
+ const arg = text.replace(/^\/(reasoning)\s*/i, "").trim().toLowerCase();
2373
+ const session = ctx.transport.getActiveSession?.();
2374
+ if (!session) {
2375
+ await ctx.reply("No active session.");
2376
+ return true;
2377
+ }
2378
+ if (arg === "show" || arg === "on") {
2379
+ session.showReasoning = true;
2380
+ await ctx.reply("Reasoning display: on");
2381
+ } else if (arg === "hide" || arg === "off") {
2382
+ session.showReasoning = false;
2383
+ await ctx.reply("Reasoning display: off");
2384
+ } else if (["none", "low", "medium", "high"].includes(arg)) {
2385
+ session.reasoningEffort = arg === "none" ? null : arg;
2386
+ await ctx.reply(`Reasoning effort: ${arg}`);
2387
+ } else {
2388
+ await ctx.reply(`Reasoning: effort=${session.reasoningEffort ?? "default"}, display=${session.showReasoning ? "show" : "hide"}`);
2389
+ }
2390
+ return true;
2391
+ }
2331
2392
 
2332
2393
  // src/components/commands/exec-async.ts
2333
2394
  import { execFile } from "node:child_process";
@@ -2361,9 +2422,10 @@ ${raw || "(no output)"}`);
2361
2422
  }
2362
2423
  return true;
2363
2424
  }
2364
- const { getDoctorReport, renderDoctorText } = await import("./doctor-R54GZPKL.js");
2425
+ const { getDoctorReport, renderDoctorText } = await import("./doctor-PIPSGI3H.js");
2365
2426
  const force = arg === "force";
2366
2427
  const svcStates = ctx.registry?.getStates() ?? {};
2428
+ await ctx.reply("\u{1FA7A} Running diagnostics...");
2367
2429
  const report = await getDoctorReport({
2368
2430
  memory: ctx.memory,
2369
2431
  transport: ctx.transport,
@@ -2376,7 +2438,7 @@ ${raw || "(no output)"}`);
2376
2438
  }
2377
2439
  async function handleStatus(_text, ctx) {
2378
2440
  if (ctx.phaseHealth && ctx.registry) {
2379
- const { getSystemStatus, renderStatusText } = await import("./system-status-GLYXXDE3.js");
2441
+ const { getSystemStatus, renderStatusText } = await import("./system-status-7K2QTH3J.js");
2380
2442
  const status = await getSystemStatus({
2381
2443
  phaseHealth: ctx.phaseHealth,
2382
2444
  registry: ctx.registry,
@@ -2387,7 +2449,7 @@ async function handleStatus(_text, ctx) {
2387
2449
  });
2388
2450
  let text = renderStatusText(status);
2389
2451
  if (_text.trim().toLowerCase() === "full") {
2390
- const { envDump } = await import("./env-schema-XCPAJ6IZ.js");
2452
+ const { envDump } = await import("./env-schema-T43X43BU.js");
2391
2453
  const dump = envDump();
2392
2454
  const envLines = Object.entries(dump).slice(0, 30).map(([k, v]) => ` ${k}: ${v}`);
2393
2455
  text += "\n\n\u{1F4CB} Config (top 30):\n" + envLines.join("\n");
@@ -2508,7 +2570,7 @@ async function buildStatusLines(ctx) {
2508
2570
  if ("currentModel" in ctx.transport) {
2509
2571
  model = ctx.transport.currentModel;
2510
2572
  } else {
2511
- const { loadTransport, resolveAgent } = await import("./transport-config-G5NKQXPJ.js");
2573
+ const { loadTransport, resolveAgent } = await import("./transport-config-JIKHB7GT.js");
2512
2574
  const tc2 = loadTransport();
2513
2575
  const prof2 = tc2 ? resolveAgent("professor", tc2) : null;
2514
2576
  model = prof2?.model ?? "unknown";
@@ -2517,7 +2579,7 @@ async function buildStatusLines(ctx) {
2517
2579
  const uptime = formatUptime(Date.now() - ctx.startedAt);
2518
2580
  const ctxPct = ctx.transport.contextPercent >= 0 ? `${ctx.transport.contextPercent}%` : "n/a";
2519
2581
  const cronInfo = ctx.memory?.getCronInfo();
2520
- const { loadTransport: lt, resolveAgent: ra } = await import("./transport-config-G5NKQXPJ.js");
2582
+ const { loadTransport: lt, resolveAgent: ra } = await import("./transport-config-JIKHB7GT.js");
2521
2583
  const tc = lt();
2522
2584
  const prof = tc ? ra("professor", tc) : null;
2523
2585
  const provider = prof?.providerName ?? "unknown";
@@ -2579,7 +2641,7 @@ function formatUptime(ms) {
2579
2641
  }
2580
2642
  async function handleUsage(_text, ctx) {
2581
2643
  const { readUsage, resetUsage } = await import("./usage-tracker-S4Z2G2K5.js");
2582
- const { loadModels } = await import("./transport-config-G5NKQXPJ.js");
2644
+ const { loadModels } = await import("./transport-config-JIKHB7GT.js");
2583
2645
  const arg = _text.replace("/usage", "").trim();
2584
2646
  if (arg === "reset") {
2585
2647
  resetUsage();
@@ -2630,7 +2692,7 @@ async function handleUsage(_text, ctx) {
2630
2692
  `;
2631
2693
  }
2632
2694
  }
2633
- const { fetchOpenRouterCredits } = await import("./openrouter-credits-7XXO6QGQ.js");
2695
+ const { fetchOpenRouterCredits } = await import("./openrouter-credits-PLIKRY5D.js");
2634
2696
  const credits = await fetchOpenRouterCredits();
2635
2697
  if (credits) {
2636
2698
  msg += `
@@ -2640,7 +2702,7 @@ async function handleUsage(_text, ctx) {
2640
2702
  return true;
2641
2703
  }
2642
2704
  async function handleOpenRouter(_text, ctx) {
2643
- const { fetchOpenRouterCredits } = await import("./openrouter-credits-7XXO6QGQ.js");
2705
+ const { fetchOpenRouterCredits } = await import("./openrouter-credits-PLIKRY5D.js");
2644
2706
  const credits = await fetchOpenRouterCredits();
2645
2707
  if (!credits) {
2646
2708
  await ctx.reply("\u274C OpenRouter API key not set or request failed.");
@@ -2656,18 +2718,253 @@ Remaining: $${credits.remaining.toFixed(2)}`
2656
2718
  return true;
2657
2719
  }
2658
2720
  async function handleWhoami(_text, ctx) {
2659
- const { loadUsers: loadUsers2 } = await import("./user-registry-NUVNEHJU.js");
2721
+ const { loadUsers: loadUsers2 } = await import("./user-registry-PEFDZ5AV.js");
2660
2722
  const reg = loadUsers2();
2661
2723
  const CLASS_NAMES = ["UNCLASSIFIED", "RESTRICTED", "CONFIDENTIAL", "SECRET"];
2662
2724
  const user = ctx.userId ? reg.byUserId.get(ctx.userId) : void 0;
2663
2725
  if (user) {
2664
2726
  const clearance = CLASS_NAMES[user.maxClass] ?? `class ${user.maxClass}`;
2665
- await ctx.reply(`${user.displayName ?? user.userId} (${user.role}, ${clearance} clearance)`);
2727
+ await ctx.reply(`${user.displayName ?? user.userId} (${user.role})
2728
+ Clearance: ${clearance}
2729
+ chatId: ${ctx.chatId}`);
2666
2730
  } else {
2667
- await ctx.reply(`${ctx.userId ?? "unknown"} (unregistered)`);
2731
+ await ctx.reply(`${ctx.userId ?? "unknown"} (unregistered)
2732
+ chatId: ${ctx.chatId}`);
2668
2733
  }
2669
2734
  return true;
2670
2735
  }
2736
+ async function handleSoftware(_text, ctx) {
2737
+ const { existsSync } = await import("node:fs");
2738
+ const { abtarsHome: abtarsHome2 } = await import("./paths-QQM74XYT.js");
2739
+ const home = abtarsHome2();
2740
+ const arg = _text.replace(/^\/(software|update)\s*/i, "").trim();
2741
+ const { loadUsers: loadUsers2 } = await import("./user-registry-PEFDZ5AV.js");
2742
+ const user = loadUsers2().byUserId.get(ctx.userId);
2743
+ const isMaster = user?.role === "master";
2744
+ if (arg.startsWith("rollback")) {
2745
+ if (!isMaster) {
2746
+ await ctx.reply("\u274C Requires master role.");
2747
+ return true;
2748
+ }
2749
+ const targetVersion = arg.replace(/^rollback\s*/, "").trim();
2750
+ if (!targetVersion) {
2751
+ await ctx.reply("Usage: /software rollback <version>\nUse /software to see available versions.");
2752
+ return true;
2753
+ }
2754
+ let targetSlot = null;
2755
+ for (let i = 1; i <= 3; i++) {
2756
+ const pkgPath = join2(home, `app.prev.${i}`, "package.json");
2757
+ try {
2758
+ const ver = JSON.parse(readFileSync(pkgPath, "utf-8")).version;
2759
+ if (ver === targetVersion) {
2760
+ targetSlot = i;
2761
+ break;
2762
+ }
2763
+ } catch {
2764
+ }
2765
+ }
2766
+ if (!targetSlot) {
2767
+ await ctx.reply(`\u274C Version ${targetVersion} not found in rollback slots.`);
2768
+ return true;
2769
+ }
2770
+ await ctx.reply(`\u26A0\uFE0F Rolling back to ${targetVersion}...`);
2771
+ try {
2772
+ const { rollback } = await import("./rollback-5RXXLUD6.js");
2773
+ await rollback({ to: targetSlot });
2774
+ } catch (err) {
2775
+ await ctx.reply(`\u274C Rollback failed: ${err instanceof Error ? err.message : String(err)}`);
2776
+ }
2777
+ return true;
2778
+ }
2779
+ if (arg === "update" || arg === "update deploy" || arg === "deploy" || arg === "update build" || arg === "build" || arg === "update pull" || arg === "pull" || arg === "") {
2780
+ if (arg === "" && _text.match(/^\/software\s*$/i)) {
2781
+ } else if (arg === "update pull" || arg === "pull") {
2782
+ if (!isMaster) {
2783
+ await ctx.reply("Requires master role.");
2784
+ return true;
2785
+ }
2786
+ try {
2787
+ const { spawnSync } = await import("node:child_process");
2788
+ const { mkdirSync: mkdirSync2 } = await import("node:fs");
2789
+ const srcDir = join2(home, "src", "abtars");
2790
+ const abmindDir = join2(home, "src", "abmind");
2791
+ logInfo("update", "Pull requested");
2792
+ if (!existsSync(join2(srcDir, ".git"))) {
2793
+ await ctx.reply("Cloning abtars repo...");
2794
+ mkdirSync2(join2(home, "src"), { recursive: true });
2795
+ const cl = spawnSync("git", ["clone", "git@github.com:aksika/abtars.git", srcDir], { encoding: "utf-8", timeout: 6e4 });
2796
+ if (cl.status !== 0) {
2797
+ logInfo("update", "Clone failed");
2798
+ await ctx.reply(`Clone failed:
2799
+ ${(cl.stderr || "").trim().slice(0, 300)}`);
2800
+ return true;
2801
+ }
2802
+ }
2803
+ spawnSync("git", ["-C", srcDir, "fetch", "origin", "dev"], { encoding: "utf-8", timeout: 3e4 });
2804
+ const r = spawnSync("git", ["-C", srcDir, "reset", "--hard", "origin/dev"], { encoding: "utf-8" });
2805
+ if (r.status !== 0) {
2806
+ await ctx.reply(`Pull failed (abtars):
2807
+ ${(r.stderr || "").trim().slice(0, 300)}`);
2808
+ return true;
2809
+ }
2810
+ let pulled = `Pulled:
2811
+ ${(r.stdout || "").trim().slice(0, 300)}`;
2812
+ if (existsSync(join2(abmindDir, ".git"))) {
2813
+ spawnSync("git", ["-C", abmindDir, "fetch", "origin", "dev"], { encoding: "utf-8", timeout: 3e4 });
2814
+ const ab = spawnSync("git", ["-C", abmindDir, "reset", "--hard", "origin/dev"], { encoding: "utf-8" });
2815
+ if (ab.status !== 0) {
2816
+ await ctx.reply(`Pull failed (abmind):
2817
+ ${(ab.stderr || "").trim().slice(0, 300)}`);
2818
+ return true;
2819
+ }
2820
+ pulled += `
2821
+ abmind: ${(ab.stdout || "").trim().slice(0, 200)}`;
2822
+ }
2823
+ logInfo("update", `Pull complete`);
2824
+ await ctx.reply(`${pulled}
2825
+
2826
+ Ready to deploy: /update deploy`);
2827
+ } catch (err) {
2828
+ await ctx.reply(`Pull failed: ${err instanceof Error ? err.message : String(err)}`);
2829
+ }
2830
+ return true;
2831
+ } else if (arg === "update deploy" || arg === "deploy" || arg === "update build" || arg === "build") {
2832
+ if (!isMaster) {
2833
+ await ctx.reply("Requires master role.");
2834
+ return true;
2835
+ }
2836
+ try {
2837
+ const { spawnSync, spawn: spawn2 } = await import("node:child_process");
2838
+ const srcDir = join2(home, "src", "abtars");
2839
+ const abmindDir = join2(home, "src", "abmind");
2840
+ if (!existsSync(join2(srcDir, ".git"))) {
2841
+ await ctx.reply("No source repo. Run /update pull first.");
2842
+ return true;
2843
+ }
2844
+ const { getDeployedVersion } = await import("./paths-QQM74XYT.js");
2845
+ const head = spawnSync("git", ["-C", srcDir, "rev-parse", "--short", "HEAD"], { encoding: "utf-8" }).stdout.trim();
2846
+ const running = getDeployedVersion();
2847
+ if (head && (running.version.includes(head) || running.commit === head)) {
2848
+ await ctx.reply(`Already running ${head}. Nothing to deploy.`);
2849
+ return true;
2850
+ }
2851
+ logInfo("update", `Deploy starting (non-blocking)`);
2852
+ await ctx.reply("\u2699\uFE0F Deploying (building in background)...");
2853
+ const script = join2(srcDir, "scripts", "build-and-deploy.sh");
2854
+ spawn2("bash", [script, srcDir, abmindDir], {
2855
+ detached: true,
2856
+ stdio: "ignore"
2857
+ }).unref();
2858
+ } catch (err) {
2859
+ await ctx.reply(`Deploy failed: ${err instanceof Error ? err.message : String(err)}`);
2860
+ }
2861
+ return true;
2862
+ } else if (arg === "update" || arg === "npm" || arg === "update npm") {
2863
+ if (!isMaster) {
2864
+ await ctx.reply("Requires master role.");
2865
+ return true;
2866
+ }
2867
+ logInfo("update", "npm update starting");
2868
+ await ctx.reply("Updating from npm...");
2869
+ const { spawn: spawn2 } = await import("node:child_process");
2870
+ spawn2("abtars", ["update", "--source", "npm"], { detached: true, stdio: "ignore" }).unref();
2871
+ return true;
2872
+ }
2873
+ }
2874
+ if (arg === "check") {
2875
+ await ctx.reply("\u{1F50D} Checking npm registry...");
2876
+ try {
2877
+ const { spawnSync } = await import("node:child_process");
2878
+ const abtarsLatest = spawnSync("npm", ["view", "abtars", "dist-tags", "--json"], { encoding: "utf-8", timeout: 1e4 });
2879
+ const abmindLatest = spawnSync("npm", ["view", "abmind", "dist-tags", "--json"], { encoding: "utf-8", timeout: 1e4 });
2880
+ const abt = abtarsLatest.status === 0 ? JSON.parse(abtarsLatest.stdout) : null;
2881
+ const abm = abmindLatest.status === 0 ? JSON.parse(abmindLatest.stdout) : null;
2882
+ const lines2 = ["\u{1F4E6} npm registry (fresh):"];
2883
+ if (abt) lines2.push(` abtars: latest=${abt.latest ?? "?"} alpha=${abt.alpha ?? "?"}`);
2884
+ if (abm) lines2.push(` abmind: latest=${abm.latest ?? "?"} alpha=${abm.alpha ?? "?"}`);
2885
+ if (!abt && !abm) lines2.push(" \u26A0\uFE0F npm unreachable");
2886
+ await ctx.reply(lines2.join("\n"));
2887
+ } catch {
2888
+ await ctx.reply("\u274C npm check failed (timeout or network error)");
2889
+ }
2890
+ return true;
2891
+ }
2892
+ const lines = ["\u{1F527} Software"];
2893
+ try {
2894
+ const { getDeployedVersion } = await import("./paths-QQM74XYT.js");
2895
+ const ver = getDeployedVersion();
2896
+ const manifest = existsSync(join2(home, "manifest.json")) ? JSON.parse(readFileSync(join2(home, "manifest.json"), "utf-8")) : null;
2897
+ const deployed = manifest?.activatedAt ? new Date(manifest.activatedAt).toLocaleString() : "unknown";
2898
+ lines.push(` abtars: ${ver.version}${ver.commit && !ver.version.includes(ver.commit) ? "-" + ver.commit : ""} (deployed ${deployed})`);
2899
+ if (manifest?.source) lines.push(` source: ${manifest.source === "local" ? "local" : "npm"}`);
2900
+ try {
2901
+ const { execFileSync } = await import("node:child_process");
2902
+ const raw = execFileSync("npm", ["view", "abtars", "dist-tags", "--json"], { encoding: "utf-8", timeout: 5e3 });
2903
+ const latest = JSON.parse(raw).alpha ?? JSON.parse(raw).latest;
2904
+ if (latest) lines.push(` npm latest: abtars@${latest} ${latest === ver.version || ver.version.startsWith(latest) ? "\u2713" : "\u26A0\uFE0F"}`);
2905
+ } catch {
2906
+ }
2907
+ } catch {
2908
+ lines.push(" abtars: unknown");
2909
+ }
2910
+ lines.push("");
2911
+ const abmindBundlePkg = join2(home, "app", "bundle", "node_modules", "abmind", "package.json");
2912
+ const abmindAppPkg = join2(home, "app", "node_modules", "abmind", "package.json");
2913
+ const abmindHome = process.env["ABMIND_HOME"] ?? join2(home, "..", ".abmind");
2914
+ const abmindManifest = join2(abmindHome, "manifest.json");
2915
+ const abmindPkgPath = existsSync(abmindBundlePkg) ? abmindBundlePkg : existsSync(abmindAppPkg) ? abmindAppPkg : null;
2916
+ if (abmindPkgPath) {
2917
+ try {
2918
+ const pkg = JSON.parse(readFileSync(abmindPkgPath, "utf-8"));
2919
+ const manifest = existsSync(abmindManifest) ? JSON.parse(readFileSync(abmindManifest, "utf-8")) : null;
2920
+ const deployed = manifest?.activatedAt ? new Date(manifest.activatedAt).toLocaleString() : "unknown";
2921
+ lines.push(` abmind: ${pkg.version ?? "?"} (deployed ${deployed})`);
2922
+ lines.push(` source: local`);
2923
+ try {
2924
+ const { execFileSync } = await import("node:child_process");
2925
+ const raw = execFileSync("npm", ["view", "abmind", "dist-tags", "--json"], { encoding: "utf-8", timeout: 5e3 });
2926
+ const latest = JSON.parse(raw).alpha ?? JSON.parse(raw).latest;
2927
+ if (latest) lines.push(` npm latest: abmind@${latest} ${latest === pkg.version || pkg.version.startsWith(latest) ? "\u2713" : "\u26A0\uFE0F"}`);
2928
+ } catch {
2929
+ }
2930
+ } catch {
2931
+ lines.push(" abmind: installed (version unknown)");
2932
+ }
2933
+ } else if (existsSync(abmindManifest)) {
2934
+ try {
2935
+ const m = JSON.parse(readFileSync(abmindManifest, "utf-8"));
2936
+ const deployed = m.activatedAt ? new Date(m.activatedAt).toLocaleString() : "unknown";
2937
+ lines.push(` abmind: ${m.version ?? "?"} (deployed ${deployed})`);
2938
+ lines.push(` source: npm`);
2939
+ try {
2940
+ const { execFileSync } = await import("node:child_process");
2941
+ const raw = execFileSync("npm", ["view", "abmind", "dist-tags", "--json"], { encoding: "utf-8", timeout: 5e3 });
2942
+ const latest = JSON.parse(raw).alpha ?? JSON.parse(raw).latest;
2943
+ if (latest) lines.push(` npm latest: abmind@${latest} ${latest === m.version || m.version.startsWith(latest) ? "\u2713" : "\u26A0\uFE0F"}`);
2944
+ } catch {
2945
+ }
2946
+ } catch {
2947
+ lines.push(" abmind: installed (version unknown)");
2948
+ }
2949
+ } else {
2950
+ lines.push(" abmind: not installed");
2951
+ }
2952
+ lines.push("");
2953
+ lines.push(" Rollback:");
2954
+ for (let i = 1; i <= 3; i++) {
2955
+ const pkgPath = join2(home, `app.prev.${i}`, "package.json");
2956
+ try {
2957
+ const ver = JSON.parse(readFileSync(pkgPath, "utf-8")).version;
2958
+ lines.push(` ${i}: ${ver}`);
2959
+ } catch {
2960
+ lines.push(` ${i}: (empty)`);
2961
+ }
2962
+ }
2963
+ lines.push("");
2964
+ lines.push(" /update [pull|deploy|npm] | /software rollback <version>");
2965
+ await ctx.reply(lines.join("\n"));
2966
+ return true;
2967
+ }
2671
2968
 
2672
2969
  // src/components/nlm-command-handler.ts
2673
2970
  init_env_schema();
@@ -2982,7 +3279,7 @@ async function handleTasksList(_text, ctx) {
2982
3279
  const now = (/* @__PURE__ */ new Date()).toLocaleString("en-GB", { timeZone: tz, dateStyle: "medium", timeStyle: "medium" });
2983
3280
  let listing;
2984
3281
  try {
2985
- const { readEntries: readEntries2 } = await import("./task-store-LC7ZMS72.js");
3282
+ const { readEntries: readEntries2 } = await import("./task-store-VCBHAB43.js");
2986
3283
  const entries = readEntries2();
2987
3284
  const active = entries.filter((e) => !e.fired);
2988
3285
  active.sort((a, b) => {
@@ -3096,23 +3393,40 @@ async function handleTaskPause(text, ctx) {
3096
3393
  }
3097
3394
  return true;
3098
3395
  }
3396
+ async function handleKanban(_text, ctx) {
3397
+ try {
3398
+ const { kanbanList } = await import("./kanban-board-6Q5E5GEB.js");
3399
+ const cards = kanbanList();
3400
+ if (cards.length === 0) {
3401
+ await ctx.reply("\u{1F4CB} Kanban board is empty.");
3402
+ return true;
3403
+ }
3404
+ const lines = cards.map((c) => {
3405
+ const icon = c.status === "delivered" ? "\u2705" : c.status === "done" ? "\u{1F4EC}" : c.status === "running" ? "\u23F3" : c.status === "failed" ? "\u274C" : "\u{1F4E5}";
3406
+ const due = c.due_at ? ` due:${c.due_at.slice(0, 10)}` : "";
3407
+ return `${icon} #${c.id} ${c.title} (${c.source}/${c.priority})${due}`;
3408
+ });
3409
+ await ctx.reply(`\u{1F4CB} Kanban Board:
3410
+ ${lines.join("\n")}`);
3411
+ } catch (err) {
3412
+ await ctx.reply(`\u274C Failed: ${err instanceof Error ? err.message : String(err)}`);
3413
+ }
3414
+ return true;
3415
+ }
3099
3416
 
3100
3417
  // src/components/commands/handlers-admin.ts
3101
3418
  init_log_and_swallow();
3102
- init_paths();
3103
- import { readdirSync as readdirSync3 } from "node:fs";
3104
- import { join as join4 } from "node:path";
3105
3419
  var TAG11 = "cmd_admin";
3106
3420
  async function handleUsers(text, ctx) {
3107
- const { loadUsers: loadUsers2 } = await import("./user-registry-NUVNEHJU.js");
3421
+ const { loadUsers: loadUsers2 } = await import("./user-registry-PEFDZ5AV.js");
3108
3422
  const parts = text.trim().split(/\s+/);
3109
3423
  const sub = parts[1];
3110
3424
  if (sub === "approve" && parts[2]) {
3111
3425
  const platformId = parts[2];
3112
3426
  const { writeFileSync: writeFileSync2, readFileSync: readFileSync3 } = await import("node:fs");
3113
- const { join: join5 } = await import("node:path");
3114
- const { abtarsHome: abtarsHome2 } = await import("./paths-ZJYIDND2.js");
3115
- const configPath = join5(abtarsHome2(), "config", "users.json");
3427
+ const { join: join4 } = await import("node:path");
3428
+ const { abtarsHome: abtarsHome2 } = await import("./paths-QQM74XYT.js");
3429
+ const configPath = join4(abtarsHome2(), "config", "users.json");
3116
3430
  try {
3117
3431
  const raw = JSON.parse(readFileSync3(configPath, "utf-8"));
3118
3432
  const users = Array.isArray(raw.users) ? raw.users : [];
@@ -3132,9 +3446,9 @@ async function handleUsers(text, ctx) {
3132
3446
  if (sub === "revoke" && parts[2]) {
3133
3447
  const targetUserId = parts[2];
3134
3448
  const { writeFileSync: writeFileSync2, readFileSync: readFileSync3 } = await import("node:fs");
3135
- const { join: join5 } = await import("node:path");
3136
- const { abtarsHome: abtarsHome2 } = await import("./paths-ZJYIDND2.js");
3137
- const configPath = join5(abtarsHome2(), "config", "users.json");
3449
+ const { join: join4 } = await import("node:path");
3450
+ const { abtarsHome: abtarsHome2 } = await import("./paths-QQM74XYT.js");
3451
+ const configPath = join4(abtarsHome2(), "config", "users.json");
3138
3452
  try {
3139
3453
  const raw = JSON.parse(readFileSync3(configPath, "utf-8"));
3140
3454
  const users = (Array.isArray(raw.users) ? raw.users : []).filter((u) => u.userId !== targetUserId);
@@ -3158,30 +3472,34 @@ ${lines.join("\n")}
3158
3472
  return true;
3159
3473
  }
3160
3474
  async function handleSkills(_text, ctx) {
3161
- const base = join4(abtarsHome(), "skills");
3162
- const groups = ["core", "personal", "auto", "downloaded"];
3475
+ const { getSkillCache } = await import("./hotskills-DTROJY6G.js");
3476
+ const skills = getSkillCache();
3477
+ if (skills.length === 0) {
3478
+ await ctx.reply("\u{1F4DA} No skills loaded.");
3479
+ return true;
3480
+ }
3481
+ const active = skills.filter((s) => !s.skipped);
3482
+ const skipped = skills.filter((s) => s.skipped);
3483
+ const groups = /* @__PURE__ */ new Map();
3484
+ for (const s of skills) {
3485
+ const list = groups.get(s.group) ?? [];
3486
+ list.push(s);
3487
+ groups.set(s.group, list);
3488
+ }
3489
+ const header = `\u{1F4DA} Skills: ${active.length} active${skipped.length ? `, ${skipped.length} skipped` : ""}`;
3163
3490
  const sections = [];
3164
- let total = 0;
3165
- for (const group of groups) {
3166
- const dir = join4(base, group);
3167
- try {
3168
- const files = readdirSync3(dir, { recursive: true }).map((f) => String(f)).filter((f) => f.endsWith(".md") && !f.endsWith("TOOLS.md")).sort();
3169
- if (files.length > 0) {
3170
- total += files.length;
3171
- sections.push(`${group} (${files.length}):
3172
- ${files.map((f) => ` \u2022 ${f.replace(/\.md$/, "")}`).join("\n")}`);
3173
- }
3174
- } catch (err) {
3175
- logAndSwallow("command_handlers", "op", err);
3176
- }
3491
+ for (const [group, items] of [...groups.entries()].sort((a, b) => a[0].localeCompare(b[0]))) {
3492
+ const lines = items.map((s) => s.skipped ? ` \u2717 ${s.name} (${s.skipped})` : ` \u2713 ${s.name}`);
3493
+ sections.push(`${group} (${items.length}):
3494
+ ${lines.join("\n")}`);
3177
3495
  }
3178
- await ctx.reply(total > 0 ? `\u{1F4DA} Skills (${total}):
3496
+ await ctx.reply(`${header}
3179
3497
 
3180
- ${sections.join("\n\n")}` : "\u{1F4DA} No skills found.");
3498
+ ${sections.join("\n\n")}`);
3181
3499
  return true;
3182
3500
  }
3183
3501
  async function handleHooks(_text, ctx) {
3184
- const { getHookSummary } = await import("./hook-system-POI5VRIX.js");
3502
+ const { getHookSummary } = await import("./hook-system-ZCVOFFRD.js");
3185
3503
  const summary = getHookSummary();
3186
3504
  const lines = ["\u{1FA9D} Hooks:"];
3187
3505
  for (const { event, hooks } of summary) {
@@ -3197,7 +3515,7 @@ async function handleHooks(_text, ctx) {
3197
3515
  async function handleMcp(_text, ctx) {
3198
3516
  const arg = _text.replace(/^\/mcp\s*/i, "").trim().toLowerCase();
3199
3517
  if (arg === "start") {
3200
- const { loadUsers: loadUsers2 } = await import("./user-registry-NUVNEHJU.js");
3518
+ const { loadUsers: loadUsers2 } = await import("./user-registry-PEFDZ5AV.js");
3201
3519
  const registry = loadUsers2();
3202
3520
  const user = registry.byUserId.get(ctx.userId);
3203
3521
  if (user?.role !== "master") {
@@ -3254,7 +3572,14 @@ async function handleHelp(_text, ctx) {
3254
3572
  "/reset \u2014 Reload transport + fresh session",
3255
3573
  "/reset default \u2014 Restore transport.default.json + fresh session",
3256
3574
  "/compact \u2014 Compact context window (summarize + fresh session)",
3257
- "/status \u2014 Bridge status, transport, heartbeat",
3575
+ "/status \u2014 Operational health (PID, uptime, platforms, context)",
3576
+ "/software \u2014 Version info, deploy date, npm check, rollback",
3577
+ "/software update [pull|deploy] \u2014 Pull & build from git",
3578
+ "/software update npm \u2014 Update from npm registry",
3579
+ "/software rollback <version> \u2014 Roll back to previous version",
3580
+ "/update \u2014 Alias for /software update pull",
3581
+ "/model \u2014 Model configuration (provider, context, fallbacks)",
3582
+ "/model set <name> \u2014 Switch model",
3258
3583
  "/doctor \u2014 Deep probe all subsystems",
3259
3584
  "/doctor fix \u2014 Run safe auto-repairs",
3260
3585
  "/doctor fix-full \u2014 Full repair (+ FTS rebuild, WAL checkpoint)",
@@ -3263,41 +3588,31 @@ async function handleHelp(_text, ctx) {
3263
3588
  "/stop, /ctrlc \u2014 Stop current response",
3264
3589
  "/memory \u2014 Memory storage statistics",
3265
3590
  "/heartbeat \u2014 Heartbeat diagnostics (tasks, last tick)",
3266
- "/models \u2014 Model, transport & agent status",
3591
+ "/models \u2014 Model, transport & agent status (legacy)",
3267
3592
  "/models change \u2014 Switch model/provider (any agent)",
3268
3593
  "/models quick <model> \u2014 Instant switch on same provider",
3269
- "/models list [provider] \u2014 List providers or models on a provider",
3270
- "/models restore \u2014 Undo last model/provider switch",
3271
- "/models default \u2014 Factory reset (transport.default.json)",
3272
- "/models emergency \u2014 \u{1F6A8} Activate paid hailMary model (manual)",
3273
- "/emergency \u2014 Shortcut for /models emergency",
3274
- "/models health reset \u2014 Reset model health buckets",
3594
+ "/emergency \u2014 \u{1F6A8} Activate paid hailMary model",
3275
3595
  "/tasks \u2014 Scheduled tasks",
3276
3596
  "/tasks log <id> \u2014 Last 5 runs for a task",
3277
3597
  "/task run <id> \u2014 Manually fire a task",
3278
- "/task pause <id> \u2014 Pause a task",
3279
- "/task resume <id> \u2014 Resume a paused task",
3598
+ "/task pause <id> \u2014 Pause / /task resume <id> \u2014 Resume",
3280
3599
  "/facts \u2014 Core knowledge (user profile + agent notes)",
3281
- "/skills \u2014 List loaded skills",
3600
+ "/skills \u2014 List active/skipped skills",
3282
3601
  "/session \u2014 List sessions",
3283
3602
  "/session new [browse|code|task] \u2014 New session",
3284
- "/session <#> \u2014 Switch session",
3285
- "/session end [#] \u2014 End session (keep messages)",
3286
- "/session kill <#> \u2014 Kill session (wipe messages)",
3287
- "/default \u2014 Switch back to default agent",
3603
+ "/session <#> \u2014 Switch / /session end [#] \u2014 End / /session kill <#> \u2014 Kill",
3288
3604
  "/nlm \u2014 Knowledge base (list/create/sources/query)",
3289
- "/restart \u2014 Restart CLI session",
3290
- "/wakeup \u2014 Wake Mac from sleep (cancel hw_sleep)",
3291
- "/sleep \u2014 Sleep status",
3292
- "/sleep resume \u2014 Retry failed sleep steps",
3293
- "/sleep now \u2014 Full fresh sleep cycle",
3294
- "/skill reload \u2014 Regenerate skills catalog"
3605
+ "/restart \u2014 Restart bridge",
3606
+ "/wakeup \u2014 Wake Mac from sleep",
3607
+ "/sleep \u2014 Sleep status / /sleep resume / /sleep now",
3608
+ "/whoami \u2014 Your user info & clearance",
3609
+ "/reasoning \u2014 Reasoning effort (low/medium/high/none) + show/hide thinking",
3610
+ "/kanban \u2014 Kanban board"
3295
3611
  ];
3296
3612
  if (ctx.platform === "telegram") {
3297
3613
  cmds.push("/full \u2014 Raw output, TTS disabled", "/short \u2014 Clean responses (default)", "/healing \u2014 Toggle self-healer on/off");
3298
3614
  }
3299
3615
  cmds.push("/help \u2014 Show this help");
3300
- cmds.push("/skills \u2014 List available skills");
3301
3616
  await ctx.reply(`\u{1F4CB} Available commands:
3302
3617
 
3303
3618
  ${cmds.join("\n")}`);
@@ -3658,15 +3973,19 @@ registerExact("/restart", handleRestart);
3658
3973
  registerExact("/full", handleFull);
3659
3974
  registerExact("/short", handleShort);
3660
3975
  registerExact("/healing", handleHealing);
3976
+ registerExact("/software", handleSoftware);
3977
+ registerExact("/update", handleSoftware);
3661
3978
  registerExact("/facts", handleFacts);
3662
3979
  registerExact("/tasks", handleTasksList);
3663
3980
  registerExact("/task", handleTasksList);
3664
3981
  registerExact("/cron", handleTasksList);
3982
+ registerExact("/kanban", handleKanban);
3665
3983
  registerExact("/memory", handleMemory);
3666
3984
  registerExact("/heartbeat", handleHeartbeat);
3667
3985
  registerExact("/models", handleModels);
3668
3986
  registerExact("/model", handleModels);
3669
3987
  registerExact("/change", (_, ctx) => handleModels("/model change", ctx));
3988
+ registerExact("/reasoning", handleReasoning);
3670
3989
  registerExact("/emergency", handleEmergencyAlias);
3671
3990
  registerExact("/help", handleHelp);
3672
3991
  registerExact("/users", handleUsers);
@@ -3699,7 +4018,6 @@ export {
3699
4018
  SessionRegistry,
3700
4019
  SessionManager,
3701
4020
  loadNLMConfig,
3702
- sanitizeOutbound,
3703
4021
  routeReaction,
3704
4022
  formatReactionSignal,
3705
4023
  cleanResponse,
@@ -3708,10 +4026,11 @@ export {
3708
4026
  triggerNewSession,
3709
4027
  triggerResetSession,
3710
4028
  killWakeInhibit,
4029
+ getRecalledIdsForMessage,
3711
4030
  resetIdleCompactFlag,
3712
4031
  setIdleCompactReset,
3713
4032
  resetAndPrepare,
3714
4033
  handleInboundMessage,
3715
4034
  startSession
3716
4035
  };
3717
- //# sourceMappingURL=chunk-P2BZSLJJ.js.map
4036
+ //# sourceMappingURL=chunk-N7UG4FID.js.map