abtars 0.3.4-alpha.8 → 0.3.4

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 (335) hide show
  1. package/bundle/{_registry.generated-YP5GLSG7.js → _registry.generated-AVR7DK2A.js} +15 -15
  2. package/bundle/{abmind-lazy-7Z44NODV.js → abmind-lazy-E3YCFKQ5.js} +15 -5
  3. package/bundle/abtars-browser.js +4 -4
  4. package/bundle/abtars-cli.js +23 -13
  5. package/bundle/abtars-cli.js.map +2 -2
  6. package/bundle/abtars-restart.js +3 -3
  7. package/bundle/abtars-task.js +3 -3
  8. package/bundle/abtars.js +385 -466
  9. package/bundle/abtars.js.map +4 -4
  10. package/bundle/{acp-raw-client-E6FM45NC.js → acp-raw-client-UCNK3OTU.js} +2 -2
  11. package/bundle/{action-gate-G2V47NHW.js → action-gate-V4FCBHFB.js} +2 -2
  12. package/bundle/{agent-api-adapter-WRGEQ6DV.js → agent-api-adapter-7HEPYSIN.js} +3 -3
  13. package/bundle/{agent-api-rate-limit-WCFXJMGY.js → agent-api-rate-limit-RZSAM3SW.js} +4 -4
  14. package/bundle/{agent-registry-GHNG2PH3.js → agent-registry-46A2R5KP.js} +7 -7
  15. package/bundle/{bootstrap-PZIDBPEJ.js → bootstrap-MIHJJSWU.js} +2 -2
  16. package/bundle/{bridge-lock-transport-4ZH7QTJP.js → bridge-lock-transport-7RSN7OLJ.js} +4 -4
  17. package/bundle/{browser-D3LZV7ZK.js → browser-F6BCWJWW.js} +6 -6
  18. package/bundle/{budget-45QOBDWA.js → budget-WUM3SPKW.js} +3 -3
  19. package/bundle/{capability-JFWX3IQF.js → capability-QVRKGRFC.js} +5 -5
  20. package/bundle/{chunk-YSKCQH6E.js → chunk-2IYJ4I66.js} +2 -2
  21. package/bundle/{chunk-W2R2HFOQ.js → chunk-2NLUT5S2.js} +6 -6
  22. package/bundle/chunk-3BG3AIDP.js +191 -0
  23. package/bundle/chunk-3BG3AIDP.js.map +7 -0
  24. package/bundle/{chunk-OKAQICWY.js → chunk-3GQX34S2.js} +3 -3
  25. package/bundle/{chunk-QROWBWLL.js → chunk-3XZ773BS.js} +2 -2
  26. package/bundle/{chunk-DYBW4XXL.js → chunk-467SRLLR.js} +2 -2
  27. package/bundle/{chunk-374NCXFZ.js → chunk-4AILRHUI.js} +10 -8
  28. package/bundle/chunk-4AILRHUI.js.map +7 -0
  29. package/bundle/{chunk-GPZNXY2U.js → chunk-4S3H4OK7.js} +4 -4
  30. package/bundle/{chunk-NDCRWEEJ.js → chunk-4Y5MJQRE.js} +6 -6
  31. package/bundle/{chunk-FRKW6LWB.js → chunk-55UWKI5C.js} +3 -3
  32. package/bundle/{chunk-7JN2MMU7.js → chunk-5PNJFDSW.js} +8 -8
  33. package/bundle/{chunk-LUNA6PM5.js → chunk-5RVOEFGT.js} +4 -2
  34. package/bundle/{chunk-LUNA6PM5.js.map → chunk-5RVOEFGT.js.map} +2 -2
  35. package/bundle/{chunk-OXTSWQCX.js → chunk-5Y3FJ2Y7.js} +2 -2
  36. package/bundle/{chunk-TMUYFERL.js → chunk-6B5ZFUPD.js} +2 -2
  37. package/bundle/{chunk-65VCEC32.js → chunk-6PA5JBUU.js} +2 -2
  38. package/bundle/{chunk-C7K6VZNY.js → chunk-BNXV7SZI.js} +21 -12
  39. package/bundle/chunk-BNXV7SZI.js.map +7 -0
  40. package/bundle/{chunk-AFREM7FX.js → chunk-CK7YTA2F.js} +2 -2
  41. package/bundle/{chunk-NRUSRJXR.js → chunk-DZJ5QZFD.js} +2 -2
  42. package/bundle/{chunk-YRSMGJFP.js → chunk-E67KESEG.js} +2 -2
  43. package/bundle/{chunk-ZV4IWKDJ.js → chunk-E7XD5UGB.js} +3 -3
  44. package/bundle/{chunk-CXXU3HAU.js → chunk-EAX5ZZUL.js} +63 -39
  45. package/bundle/chunk-EAX5ZZUL.js.map +7 -0
  46. package/bundle/{chunk-PEDX56EL.js → chunk-EFGBM555.js} +2 -2
  47. package/bundle/{chunk-EQSG2CRM.js → chunk-FGYDIX54.js} +22 -15
  48. package/bundle/chunk-FGYDIX54.js.map +7 -0
  49. package/bundle/{chunk-YPAQEQSC.js → chunk-GF6NVNA7.js} +15 -5
  50. package/bundle/chunk-GF6NVNA7.js.map +7 -0
  51. package/bundle/{chunk-UNM3OXHB.js → chunk-HGSHCQ5F.js} +110 -72
  52. package/bundle/{chunk-UNM3OXHB.js.map → chunk-HGSHCQ5F.js.map} +2 -2
  53. package/bundle/{chunk-VXCETPZU.js → chunk-IMIGG5EO.js} +39 -39
  54. package/bundle/chunk-IMIGG5EO.js.map +7 -0
  55. package/bundle/{chunk-P2K2K6XL.js → chunk-ITOFPJAV.js} +44 -32
  56. package/bundle/chunk-ITOFPJAV.js.map +7 -0
  57. package/bundle/{chunk-75ATTOW4.js → chunk-IY6UKLPS.js} +3 -3
  58. package/bundle/{chunk-EUZDKV3C.js → chunk-J4RUFAPK.js} +3 -3
  59. package/bundle/{chunk-HZDLFLRP.js → chunk-J7DRPVMU.js} +35 -5
  60. package/bundle/chunk-J7DRPVMU.js.map +7 -0
  61. package/bundle/{chunk-EGL6UMAO.js → chunk-JG4BKXBN.js} +7 -1
  62. package/bundle/chunk-JG4BKXBN.js.map +7 -0
  63. package/bundle/{chunk-N4EB6LA7.js → chunk-JLWYPGWI.js} +5 -5
  64. package/bundle/{chunk-5QUTMUIK.js → chunk-JXYWDAHD.js} +12 -12
  65. package/bundle/{chunk-GRVWZO4C.js → chunk-KOSFXW2S.js} +24 -3
  66. package/bundle/{chunk-GRVWZO4C.js.map → chunk-KOSFXW2S.js.map} +1 -1
  67. package/bundle/{chunk-M3JEX6L4.js → chunk-L72RIPEC.js} +9 -9
  68. package/bundle/{chunk-TEFZ4JA4.js → chunk-NHPLD3C7.js} +2 -2
  69. package/bundle/{chunk-2KC5G3EA.js → chunk-OWUO5RS3.js} +5 -5
  70. package/bundle/{chunk-4MULJ5SS.js → chunk-OY4Q6AMY.js} +71 -49
  71. package/bundle/chunk-OY4Q6AMY.js.map +7 -0
  72. package/bundle/{chunk-WBTJ2E62.js → chunk-P3NODAHF.js} +2 -5
  73. package/bundle/{chunk-WBTJ2E62.js.map → chunk-P3NODAHF.js.map} +2 -2
  74. package/bundle/{chunk-SMPHE3ZM.js → chunk-PB5GF4FG.js} +215 -163
  75. package/bundle/chunk-PB5GF4FG.js.map +7 -0
  76. package/bundle/{chunk-WYHGNI56.js → chunk-PMD5BLFS.js} +6 -6
  77. package/bundle/{chunk-URQPDCK5.js → chunk-Q66LQMMZ.js} +3 -3
  78. package/bundle/{chunk-IHYKTDIP.js → chunk-SC2Y5NR2.js} +36 -119
  79. package/bundle/chunk-SC2Y5NR2.js.map +7 -0
  80. package/bundle/chunk-SFL4EPCZ.js +555 -0
  81. package/bundle/chunk-SFL4EPCZ.js.map +7 -0
  82. package/bundle/{chunk-LDUOOKQY.js → chunk-SJPUNDZ3.js} +5 -5
  83. package/bundle/{chunk-LDUOOKQY.js.map → chunk-SJPUNDZ3.js.map} +1 -1
  84. package/bundle/{chunk-JQDJPUHM.js → chunk-TWB2ZGVH.js} +2 -2
  85. package/bundle/{chunk-IJT4KWXT.js → chunk-U4U47YE7.js} +2 -2
  86. package/bundle/{chunk-2FAZIA37.js → chunk-W546CU3A.js} +3 -3
  87. package/bundle/chunk-WC5O5KOE.js +211 -0
  88. package/bundle/chunk-WC5O5KOE.js.map +7 -0
  89. package/bundle/{chunk-JNIHEDKF.js → chunk-XPWYDNWL.js} +2 -2
  90. package/bundle/{chunk-GWILHZPT.js → chunk-XRTXYN66.js} +10 -7
  91. package/bundle/{chunk-GWILHZPT.js.map → chunk-XRTXYN66.js.map} +2 -2
  92. package/bundle/{chunk-EFJVUJBE.js → chunk-Y5FEFKGM.js} +6 -6
  93. package/bundle/chunk-YJZE4OK3.js +169 -0
  94. package/bundle/chunk-YJZE4OK3.js.map +7 -0
  95. package/bundle/{chunk-GVM5YU5I.js → chunk-Z4FZPB42.js} +2 -2
  96. package/bundle/{chunk-7BSQ5UQO.js → chunk-ZSIDQ66D.js} +3 -3
  97. package/bundle/{chunk-XX6BGTPO.js → chunk-ZZZCJJEO.js} +4 -4
  98. package/bundle/{commands-OIISYHTD.js → commands-2ZW6CMLC.js} +17 -16
  99. package/bundle/{config-M3P5IOAI.js → config-YMY5YHKN.js} +6 -6
  100. package/bundle/{context-2RJHC2LE.js → context-CL2RSLII.js} +7 -5
  101. package/bundle/context-CL2RSLII.js.map +7 -0
  102. package/bundle/{daemon-TB23FFWY.js → daemon-D7SU63OY.js} +3 -3
  103. package/bundle/{delegation-tools-YATZFKYO.js → delegation-tools-WS7Z56KZ.js} +12 -12
  104. package/bundle/{deploy-T6R45OZJ.js → deploy-AMTVKIMU.js} +2 -2
  105. package/bundle/{deps-WVK553KF.js → deps-T63AVJKJ.js} +3 -3
  106. package/bundle/{direct-api-transport-S2RDH2I7.js → direct-api-transport-QNNY2WWP.js} +51 -32
  107. package/bundle/direct-api-transport-QNNY2WWP.js.map +7 -0
  108. package/bundle/{discord-adapter-UTXUWX3A.js → discord-adapter-ABAD56Y2.js} +21 -20
  109. package/bundle/{discord-adapter-UTXUWX3A.js.map → discord-adapter-ABAD56Y2.js.map} +1 -1
  110. package/bundle/{dns-wakeup-IDOJIXBX.js → dns-wakeup-V3LEFXPE.js} +9 -33
  111. package/bundle/dns-wakeup-V3LEFXPE.js.map +7 -0
  112. package/bundle/{doctor-probes-B54JFIW3.js → doctor-probes-O6YI6XSZ.js} +6 -2
  113. package/bundle/{env-schema-4JXQUOH4.js → env-schema-B5RB32DC.js} +3 -3
  114. package/bundle/{gossip-3C3BSNPN.js → gossip-SKRCPOBS.js} +9 -5
  115. package/bundle/{guardrails-DL7ZSWVN.js → guardrails-64GQ5Y5K.js} +4 -4
  116. package/bundle/{heartbeat-system-MVTRS4GP.js → heartbeat-system-X4MUTKJD.js} +6 -6
  117. package/bundle/{heartbeat-tier3-6KH45CL6.js → heartbeat-tier3-2PTPWEQQ.js} +53 -76
  118. package/bundle/heartbeat-tier3-2PTPWEQQ.js.map +7 -0
  119. package/bundle/{hook-system-M3POLUIB.js → hook-system-YB635OC4.js} +3 -3
  120. package/bundle/{hotskills-FWX4QI7V.js → hotskills-Q75D2DK3.js} +5 -5
  121. package/bundle/{install-OS3CU7NF.js → install-RFKKFSGS.js} +17 -30
  122. package/bundle/install-RFKKFSGS.js.map +7 -0
  123. package/bundle/{install-manifest-5PPWMD2W.js → install-manifest-J7ICPCJN.js} +2 -2
  124. package/bundle/{irc-adapter-PTTZD32W.js → irc-adapter-TVEV4R6H.js} +3 -3
  125. package/bundle/{irc-config-CP7ZMUOX.js → irc-config-M676FOFI.js} +4 -4
  126. package/bundle/{kanban-board-M326B2XJ.js → kanban-board-DLEJUCNN.js} +9 -7
  127. package/bundle/{kanban-channel-IJ52OMNA.js → kanban-channel-XOLUHJZJ.js} +6 -6
  128. package/bundle/kanban-delivery-C4QPBNPX.js +45 -0
  129. package/bundle/kanban-delivery-C4QPBNPX.js.map +7 -0
  130. package/bundle/{lazy-require-KCRVT4SI.js → lazy-require-JKQSALXN.js} +3 -3
  131. package/bundle/{logger-OWCSNYCA.js → logger-3EGHBD4R.js} +2 -2
  132. package/bundle/{main-chat-ZNUZCTNS.js → main-chat-3H63REKK.js} +4 -4
  133. package/bundle/{master-user-HSKM4ZFN.js → master-user-MUBUP3KD.js} +5 -5
  134. package/bundle/{media-utils-3ZYOD7SK.js → media-utils-HUUIALAJ.js} +3 -3
  135. package/bundle/{message-pipeline-AUIUNM5R.js → message-pipeline-GRDRWONR.js} +17 -16
  136. package/bundle/meta.json +2773 -2241
  137. package/bundle/{metrics-collector-L3VPEHII.js → metrics-collector-YMUGY3PI.js} +31 -2
  138. package/bundle/metrics-collector-YMUGY3PI.js.map +7 -0
  139. package/bundle/{model-health-registry-MLEIZSTV.js → model-health-registry-QADMFQFQ.js} +2 -2
  140. package/bundle/{nerve-IGSXBKZZ.js → nerve-QPAEBRKX.js} +3 -3
  141. package/bundle/{notification-BFSIEECG.js → notification-3JICGXWU.js} +6 -6
  142. package/bundle/{openrouter-credits-NTVZDRYM.js → openrouter-credits-7NEIPYJN.js} +3 -3
  143. package/bundle/{orc-tools-TOD4WHTM.js → orc-tools-UZVPONKY.js} +5 -3
  144. package/bundle/{peer-auth-QC4EF2PM.js → peer-auth-RI43DKJE.js} +24 -15
  145. package/bundle/{peer-client-RGEU5HOK.js → peer-client-UITTMWJ2.js} +34 -29
  146. package/bundle/peer-client-UITTMWJ2.js.map +7 -0
  147. package/bundle/{peer-config-TN55LFDC.js → peer-config-URM7DCW6.js} +9 -4
  148. package/bundle/{peer-transport-5VKK2I7P.js → peer-transport-SI7I72DB.js} +12 -10
  149. package/bundle/{phase-transport-FS6NL4A5.js → phase-transport-ESWWACZI.js} +17 -17
  150. package/bundle/{reconcile-CTFCLQRN.js → reconcile-GFDQYNBD.js} +3 -3
  151. package/bundle/{reconciler-NZ4O4BCP.js → reconciler-IEUJXJN2.js} +12 -12
  152. package/bundle/{restore-IFHPI7I7.js → restore-FARTGLQQ.js} +3 -3
  153. package/bundle/{rollback-ANRI3T5Z.js → rollback-GEWPZABG.js} +2 -2
  154. package/bundle/{sandbox-runtime-QROWHDCS.js → sandbox-runtime-DV6E25J6.js} +2 -2
  155. package/bundle/{self-healer-utils-IFAYOQO2.js → self-healer-utils-P4SKNNEM.js} +3 -3
  156. package/bundle/{sha-tracker-ZWBP6CIJ.js → sha-tracker-77SHLYNY.js} +3 -3
  157. package/bundle/{skill-session-VJXTKOKL.js → skill-session-5HSMXY54.js} +3 -3
  158. package/bundle/{skill-stats-JORH5DGM.js → skill-stats-MI3RSWWL.js} +4 -4
  159. package/bundle/{skill-watcher-E4MGLKLS.js → skill-watcher-5L7JE6TN.js} +4 -4
  160. package/bundle/{sleep-BEWAUFCL.js → sleep-I4JFASCY.js} +11 -11
  161. package/bundle/{soul-bundle-VWAVHCZ6.js → soul-bundle-522C3IRH.js} +9 -8
  162. package/bundle/{spin-E3ZDEDKT.js → spin-VHNGNWTD.js} +11 -11
  163. package/bundle/{spin-notifications-SE2HVZI7.js → spin-notifications-7NC5XZEM.js} +5 -5
  164. package/bundle/{spin-types-OIE67MJK.js → spin-types-C5KOQOPD.js} +7 -3
  165. package/bundle/{sse-parser-anthropic-A6R4Z2TB.js → sse-parser-anthropic-MMTVWHLI.js} +3 -3
  166. package/bundle/{sse-parser-responses-HSZY3QGJ.js → sse-parser-responses-3AOFN64C.js} +3 -3
  167. package/bundle/{ssrf-guard-O6SHIK6Q.js → ssrf-guard-U2JA72TC.js} +3 -3
  168. package/bundle/{start-7QZIWO3S.js → start-H5IUFAWF.js} +4 -2
  169. package/bundle/{start-7QZIWO3S.js.map → start-H5IUFAWF.js.map} +2 -2
  170. package/bundle/{stt-LGVPXMVR.js → stt-PSOPPBV4.js} +4 -4
  171. package/bundle/{system-status-FAVNIUFJ.js → system-status-4LYGOFNO.js} +38 -24
  172. package/bundle/system-status-4LYGOFNO.js.map +7 -0
  173. package/bundle/{task-store-W5BFIAIH.js → task-store-MNCW42BW.js} +4 -4
  174. package/bundle/{telegram-adapter-4TX7QWKC.js → telegram-adapter-O6KIZDY6.js} +62 -45
  175. package/bundle/telegram-adapter-O6KIZDY6.js.map +7 -0
  176. package/bundle/{tool-registry-7FK3OQGL.js → tool-registry-JJMWCQKZ.js} +26 -24
  177. package/bundle/{tool-sandbox-4UC6GAKA.js → tool-sandbox-CNL6V6IH.js} +4 -4
  178. package/bundle/{transport-config-KBF5W2DP.js → transport-config-6MB2K2XC.js} +7 -7
  179. package/bundle/tribe-GDTFYJTK.js +111 -0
  180. package/bundle/tribe-GDTFYJTK.js.map +7 -0
  181. package/bundle/{update-CKFP6LBE.js → update-HGQAOC5L.js} +3 -3
  182. package/bundle/{usage-tracker-NXD364VX.js → usage-tracker-SR4BI6ZT.js} +2 -2
  183. package/bundle/{user-registry-35BW4XKM.js → user-registry-4PACZJIJ.js} +4 -4
  184. package/bundle/wire-platform-KKPWNNNQ.js +88 -0
  185. package/bundle/wire-platform-KKPWNNNQ.js.map +7 -0
  186. package/bundle/ws-peer-client-U3NNPOK7.js +370 -0
  187. package/bundle/ws-peer-client-U3NNPOK7.js.map +7 -0
  188. package/package.json +1 -1
  189. package/scripts/abtars-watchdog.sh +1 -5
  190. package/scripts/emergency-deploy.sh +2 -2
  191. package/scripts/emergency-update.sh +36 -37
  192. package/bundle/chunk-374NCXFZ.js.map +0 -7
  193. package/bundle/chunk-4MULJ5SS.js.map +0 -7
  194. package/bundle/chunk-4S554KLW.js +0 -105
  195. package/bundle/chunk-4S554KLW.js.map +0 -7
  196. package/bundle/chunk-C7K6VZNY.js.map +0 -7
  197. package/bundle/chunk-CXXU3HAU.js.map +0 -7
  198. package/bundle/chunk-EGL6UMAO.js.map +0 -7
  199. package/bundle/chunk-EQSG2CRM.js.map +0 -7
  200. package/bundle/chunk-HT2BPTZY.js +0 -241
  201. package/bundle/chunk-HT2BPTZY.js.map +0 -7
  202. package/bundle/chunk-HZDLFLRP.js.map +0 -7
  203. package/bundle/chunk-IHYKTDIP.js.map +0 -7
  204. package/bundle/chunk-IKUZPMVA.js +0 -82
  205. package/bundle/chunk-IKUZPMVA.js.map +0 -7
  206. package/bundle/chunk-P2K2K6XL.js.map +0 -7
  207. package/bundle/chunk-PU5HSKWH.js +0 -257
  208. package/bundle/chunk-PU5HSKWH.js.map +0 -7
  209. package/bundle/chunk-RWRRGE4U.js +0 -72
  210. package/bundle/chunk-RWRRGE4U.js.map +0 -7
  211. package/bundle/chunk-SMPHE3ZM.js.map +0 -7
  212. package/bundle/chunk-VUIX5AGB.js +0 -65
  213. package/bundle/chunk-VUIX5AGB.js.map +0 -7
  214. package/bundle/chunk-VXCETPZU.js.map +0 -7
  215. package/bundle/chunk-YPAQEQSC.js.map +0 -7
  216. package/bundle/context-2RJHC2LE.js.map +0 -7
  217. package/bundle/direct-api-transport-S2RDH2I7.js.map +0 -7
  218. package/bundle/dns-wakeup-IDOJIXBX.js.map +0 -7
  219. package/bundle/heartbeat-tier3-6KH45CL6.js.map +0 -7
  220. package/bundle/install-OS3CU7NF.js.map +0 -7
  221. package/bundle/metrics-collector-L3VPEHII.js.map +0 -7
  222. package/bundle/peer-client-RGEU5HOK.js.map +0 -7
  223. package/bundle/peer-jwt-NCCPXJRX.js +0 -18
  224. package/bundle/stream-single-RFJNUTL6.js +0 -34
  225. package/bundle/stream-single-RFJNUTL6.js.map +0 -7
  226. package/bundle/system-status-FAVNIUFJ.js.map +0 -7
  227. package/bundle/telegram-adapter-4TX7QWKC.js.map +0 -7
  228. package/bundle/user-registry-35BW4XKM.js.map +0 -7
  229. package/bundle/ws-peer-client-AIXCXF7V.js +0 -173
  230. package/bundle/ws-peer-client-AIXCXF7V.js.map +0 -7
  231. /package/bundle/{_registry.generated-YP5GLSG7.js.map → _registry.generated-AVR7DK2A.js.map} +0 -0
  232. /package/bundle/{abmind-lazy-7Z44NODV.js.map → abmind-lazy-E3YCFKQ5.js.map} +0 -0
  233. /package/bundle/{acp-raw-client-E6FM45NC.js.map → acp-raw-client-UCNK3OTU.js.map} +0 -0
  234. /package/bundle/{action-gate-G2V47NHW.js.map → action-gate-V4FCBHFB.js.map} +0 -0
  235. /package/bundle/{agent-api-adapter-WRGEQ6DV.js.map → agent-api-adapter-7HEPYSIN.js.map} +0 -0
  236. /package/bundle/{agent-api-rate-limit-WCFXJMGY.js.map → agent-api-rate-limit-RZSAM3SW.js.map} +0 -0
  237. /package/bundle/{agent-registry-GHNG2PH3.js.map → agent-registry-46A2R5KP.js.map} +0 -0
  238. /package/bundle/{bootstrap-PZIDBPEJ.js.map → bootstrap-MIHJJSWU.js.map} +0 -0
  239. /package/bundle/{bridge-lock-transport-4ZH7QTJP.js.map → bridge-lock-transport-7RSN7OLJ.js.map} +0 -0
  240. /package/bundle/{browser-D3LZV7ZK.js.map → browser-F6BCWJWW.js.map} +0 -0
  241. /package/bundle/{budget-45QOBDWA.js.map → budget-WUM3SPKW.js.map} +0 -0
  242. /package/bundle/{capability-JFWX3IQF.js.map → capability-QVRKGRFC.js.map} +0 -0
  243. /package/bundle/{chunk-YSKCQH6E.js.map → chunk-2IYJ4I66.js.map} +0 -0
  244. /package/bundle/{chunk-W2R2HFOQ.js.map → chunk-2NLUT5S2.js.map} +0 -0
  245. /package/bundle/{chunk-OKAQICWY.js.map → chunk-3GQX34S2.js.map} +0 -0
  246. /package/bundle/{chunk-QROWBWLL.js.map → chunk-3XZ773BS.js.map} +0 -0
  247. /package/bundle/{chunk-DYBW4XXL.js.map → chunk-467SRLLR.js.map} +0 -0
  248. /package/bundle/{chunk-GPZNXY2U.js.map → chunk-4S3H4OK7.js.map} +0 -0
  249. /package/bundle/{chunk-NDCRWEEJ.js.map → chunk-4Y5MJQRE.js.map} +0 -0
  250. /package/bundle/{chunk-FRKW6LWB.js.map → chunk-55UWKI5C.js.map} +0 -0
  251. /package/bundle/{chunk-7JN2MMU7.js.map → chunk-5PNJFDSW.js.map} +0 -0
  252. /package/bundle/{chunk-OXTSWQCX.js.map → chunk-5Y3FJ2Y7.js.map} +0 -0
  253. /package/bundle/{chunk-TMUYFERL.js.map → chunk-6B5ZFUPD.js.map} +0 -0
  254. /package/bundle/{chunk-65VCEC32.js.map → chunk-6PA5JBUU.js.map} +0 -0
  255. /package/bundle/{chunk-AFREM7FX.js.map → chunk-CK7YTA2F.js.map} +0 -0
  256. /package/bundle/{chunk-NRUSRJXR.js.map → chunk-DZJ5QZFD.js.map} +0 -0
  257. /package/bundle/{chunk-YRSMGJFP.js.map → chunk-E67KESEG.js.map} +0 -0
  258. /package/bundle/{chunk-ZV4IWKDJ.js.map → chunk-E7XD5UGB.js.map} +0 -0
  259. /package/bundle/{chunk-PEDX56EL.js.map → chunk-EFGBM555.js.map} +0 -0
  260. /package/bundle/{chunk-75ATTOW4.js.map → chunk-IY6UKLPS.js.map} +0 -0
  261. /package/bundle/{chunk-EUZDKV3C.js.map → chunk-J4RUFAPK.js.map} +0 -0
  262. /package/bundle/{chunk-N4EB6LA7.js.map → chunk-JLWYPGWI.js.map} +0 -0
  263. /package/bundle/{chunk-5QUTMUIK.js.map → chunk-JXYWDAHD.js.map} +0 -0
  264. /package/bundle/{chunk-M3JEX6L4.js.map → chunk-L72RIPEC.js.map} +0 -0
  265. /package/bundle/{chunk-TEFZ4JA4.js.map → chunk-NHPLD3C7.js.map} +0 -0
  266. /package/bundle/{chunk-2KC5G3EA.js.map → chunk-OWUO5RS3.js.map} +0 -0
  267. /package/bundle/{chunk-WYHGNI56.js.map → chunk-PMD5BLFS.js.map} +0 -0
  268. /package/bundle/{chunk-URQPDCK5.js.map → chunk-Q66LQMMZ.js.map} +0 -0
  269. /package/bundle/{chunk-JQDJPUHM.js.map → chunk-TWB2ZGVH.js.map} +0 -0
  270. /package/bundle/{chunk-IJT4KWXT.js.map → chunk-U4U47YE7.js.map} +0 -0
  271. /package/bundle/{chunk-2FAZIA37.js.map → chunk-W546CU3A.js.map} +0 -0
  272. /package/bundle/{chunk-JNIHEDKF.js.map → chunk-XPWYDNWL.js.map} +0 -0
  273. /package/bundle/{chunk-EFJVUJBE.js.map → chunk-Y5FEFKGM.js.map} +0 -0
  274. /package/bundle/{chunk-GVM5YU5I.js.map → chunk-Z4FZPB42.js.map} +0 -0
  275. /package/bundle/{chunk-7BSQ5UQO.js.map → chunk-ZSIDQ66D.js.map} +0 -0
  276. /package/bundle/{chunk-XX6BGTPO.js.map → chunk-ZZZCJJEO.js.map} +0 -0
  277. /package/bundle/{commands-OIISYHTD.js.map → commands-2ZW6CMLC.js.map} +0 -0
  278. /package/bundle/{config-M3P5IOAI.js.map → config-YMY5YHKN.js.map} +0 -0
  279. /package/bundle/{daemon-TB23FFWY.js.map → daemon-D7SU63OY.js.map} +0 -0
  280. /package/bundle/{delegation-tools-YATZFKYO.js.map → delegation-tools-WS7Z56KZ.js.map} +0 -0
  281. /package/bundle/{deploy-T6R45OZJ.js.map → deploy-AMTVKIMU.js.map} +0 -0
  282. /package/bundle/{deps-WVK553KF.js.map → deps-T63AVJKJ.js.map} +0 -0
  283. /package/bundle/{doctor-probes-B54JFIW3.js.map → doctor-probes-O6YI6XSZ.js.map} +0 -0
  284. /package/bundle/{env-schema-4JXQUOH4.js.map → env-schema-B5RB32DC.js.map} +0 -0
  285. /package/bundle/{gossip-3C3BSNPN.js.map → gossip-SKRCPOBS.js.map} +0 -0
  286. /package/bundle/{guardrails-DL7ZSWVN.js.map → guardrails-64GQ5Y5K.js.map} +0 -0
  287. /package/bundle/{heartbeat-system-MVTRS4GP.js.map → heartbeat-system-X4MUTKJD.js.map} +0 -0
  288. /package/bundle/{hook-system-M3POLUIB.js.map → hook-system-YB635OC4.js.map} +0 -0
  289. /package/bundle/{hotskills-FWX4QI7V.js.map → hotskills-Q75D2DK3.js.map} +0 -0
  290. /package/bundle/{install-manifest-5PPWMD2W.js.map → install-manifest-J7ICPCJN.js.map} +0 -0
  291. /package/bundle/{irc-adapter-PTTZD32W.js.map → irc-adapter-TVEV4R6H.js.map} +0 -0
  292. /package/bundle/{irc-config-CP7ZMUOX.js.map → irc-config-M676FOFI.js.map} +0 -0
  293. /package/bundle/{kanban-board-M326B2XJ.js.map → kanban-board-DLEJUCNN.js.map} +0 -0
  294. /package/bundle/{kanban-channel-IJ52OMNA.js.map → kanban-channel-XOLUHJZJ.js.map} +0 -0
  295. /package/bundle/{lazy-require-KCRVT4SI.js.map → lazy-require-JKQSALXN.js.map} +0 -0
  296. /package/bundle/{logger-OWCSNYCA.js.map → logger-3EGHBD4R.js.map} +0 -0
  297. /package/bundle/{main-chat-ZNUZCTNS.js.map → main-chat-3H63REKK.js.map} +0 -0
  298. /package/bundle/{master-user-HSKM4ZFN.js.map → master-user-MUBUP3KD.js.map} +0 -0
  299. /package/bundle/{media-utils-3ZYOD7SK.js.map → media-utils-HUUIALAJ.js.map} +0 -0
  300. /package/bundle/{message-pipeline-AUIUNM5R.js.map → message-pipeline-GRDRWONR.js.map} +0 -0
  301. /package/bundle/{model-health-registry-MLEIZSTV.js.map → model-health-registry-QADMFQFQ.js.map} +0 -0
  302. /package/bundle/{nerve-IGSXBKZZ.js.map → nerve-QPAEBRKX.js.map} +0 -0
  303. /package/bundle/{notification-BFSIEECG.js.map → notification-3JICGXWU.js.map} +0 -0
  304. /package/bundle/{openrouter-credits-NTVZDRYM.js.map → openrouter-credits-7NEIPYJN.js.map} +0 -0
  305. /package/bundle/{orc-tools-TOD4WHTM.js.map → orc-tools-UZVPONKY.js.map} +0 -0
  306. /package/bundle/{peer-auth-QC4EF2PM.js.map → peer-auth-RI43DKJE.js.map} +0 -0
  307. /package/bundle/{peer-config-TN55LFDC.js.map → peer-config-URM7DCW6.js.map} +0 -0
  308. /package/bundle/{peer-jwt-NCCPXJRX.js.map → peer-transport-SI7I72DB.js.map} +0 -0
  309. /package/bundle/{peer-transport-5VKK2I7P.js.map → phase-transport-ESWWACZI.js.map} +0 -0
  310. /package/bundle/{phase-transport-FS6NL4A5.js.map → reconcile-GFDQYNBD.js.map} +0 -0
  311. /package/bundle/{reconciler-NZ4O4BCP.js.map → reconciler-IEUJXJN2.js.map} +0 -0
  312. /package/bundle/{restore-IFHPI7I7.js.map → restore-FARTGLQQ.js.map} +0 -0
  313. /package/bundle/{reconcile-CTFCLQRN.js.map → rollback-GEWPZABG.js.map} +0 -0
  314. /package/bundle/{sandbox-runtime-QROWHDCS.js.map → sandbox-runtime-DV6E25J6.js.map} +0 -0
  315. /package/bundle/{self-healer-utils-IFAYOQO2.js.map → self-healer-utils-P4SKNNEM.js.map} +0 -0
  316. /package/bundle/{rollback-ANRI3T5Z.js.map → sha-tracker-77SHLYNY.js.map} +0 -0
  317. /package/bundle/{skill-session-VJXTKOKL.js.map → skill-session-5HSMXY54.js.map} +0 -0
  318. /package/bundle/{sha-tracker-ZWBP6CIJ.js.map → skill-stats-MI3RSWWL.js.map} +0 -0
  319. /package/bundle/{skill-stats-JORH5DGM.js.map → skill-watcher-5L7JE6TN.js.map} +0 -0
  320. /package/bundle/{skill-watcher-E4MGLKLS.js.map → sleep-I4JFASCY.js.map} +0 -0
  321. /package/bundle/{sleep-BEWAUFCL.js.map → soul-bundle-522C3IRH.js.map} +0 -0
  322. /package/bundle/{soul-bundle-VWAVHCZ6.js.map → spin-VHNGNWTD.js.map} +0 -0
  323. /package/bundle/{spin-notifications-SE2HVZI7.js.map → spin-notifications-7NC5XZEM.js.map} +0 -0
  324. /package/bundle/{spin-E3ZDEDKT.js.map → spin-types-C5KOQOPD.js.map} +0 -0
  325. /package/bundle/{sse-parser-anthropic-A6R4Z2TB.js.map → sse-parser-anthropic-MMTVWHLI.js.map} +0 -0
  326. /package/bundle/{sse-parser-responses-HSZY3QGJ.js.map → sse-parser-responses-3AOFN64C.js.map} +0 -0
  327. /package/bundle/{ssrf-guard-O6SHIK6Q.js.map → ssrf-guard-U2JA72TC.js.map} +0 -0
  328. /package/bundle/{spin-types-OIE67MJK.js.map → stt-PSOPPBV4.js.map} +0 -0
  329. /package/bundle/{stt-LGVPXMVR.js.map → task-store-MNCW42BW.js.map} +0 -0
  330. /package/bundle/{task-store-W5BFIAIH.js.map → tool-registry-JJMWCQKZ.js.map} +0 -0
  331. /package/bundle/{tool-registry-7FK3OQGL.js.map → tool-sandbox-CNL6V6IH.js.map} +0 -0
  332. /package/bundle/{tool-sandbox-4UC6GAKA.js.map → transport-config-6MB2K2XC.js.map} +0 -0
  333. /package/bundle/{transport-config-KBF5W2DP.js.map → update-HGQAOC5L.js.map} +0 -0
  334. /package/bundle/{update-CKFP6LBE.js.map → usage-tracker-SR4BI6ZT.js.map} +0 -0
  335. /package/bundle/{usage-tracker-NXD364VX.js.map → user-registry-4PACZJIJ.js.map} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/cli/commands/install.ts"],
4
- "sourcesContent": ["/**\n * `abtars install [--force]` \u2014 first-time scaffolding + configuration wizard.\n *\n * Exports writeWrapper (used by deploy.ts) and install() for legacy paths.\n * The primary install flow is in onboard.ts (called by CLI dispatcher as `abtars install`).\n */\n\nimport { mkdir, readFile, stat, writeFile } from 'node:fs/promises';\nimport { existsSync, readFileSync, readdirSync, copyFileSync, mkdirSync, realpathSync } from 'node:fs';\nimport { hostname, homedir as _homedir } from 'node:os';\nimport { execSync } from 'node:child_process';\nimport { basename, dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { emptyManifest, packagePaths, readManifest, resolveReleasesDir, writeManifest } from '../deploy-lib-import.js';\n\n/** Resolve real user home even under sudo. */\nfunction homedir(): string {\n const sudoUser = process.env['SUDO_USER'];\n if (sudoUser) {\n try { return execSync(`getent passwd ${sudoUser}`, { encoding: 'utf-8' }).split(':')[5]!.trim(); }\n catch { /* fall through */ }\n }\n return _homedir();\n}\n\nexport interface InstallOptions {\n readonly restore?: string;\n readonly force: boolean;\n readonly dryRun: boolean;\n readonly mode?: \"simple\" | \"daemon\";\n}\n\n// CLI wrappers are read from install-manifest.json at runtime.\n// Each is a thin wrapper that invokes `node current/dist/cli/<name>.js \"$@\"`.\n// Regenerated on every install / flat-to-releases migration.\n\nasync function exists(p: string): Promise<boolean> {\n try {\n await stat(p);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function createSkeleton(home: string, dryRun: boolean): Promise<void> {\n const { loadManifest } = await import('../install-manifest.js');\n const manifest = loadManifest();\n const dirs = manifest.directories.map(d => join(home, d.path));\n if (dryRun) {\n process.stdout.write(`[dry-run] mkdir -p:\\n ${dirs.join('\\n ')}\\n`);\n return;\n }\n for (const d of manifest.directories) {\n await mkdir(join(home, d.path), { recursive: true, mode: d.mode ? parseInt(d.mode, 8) : undefined });\n }\n}\n\nasync function seedConfig(repoRoot: string, _configDir: string, dryRun: boolean, home: string): Promise<readonly string[]> {\n const { loadManifest } = await import('../install-manifest.js');\n const manifest = loadManifest(repoRoot);\n const seeded: string[] = [];\n for (const seed of manifest.configSeeds) {\n const src = join(repoRoot, seed.source);\n const dst = join(home, seed.dest);\n if (!(await exists(src))) continue;\n if (await exists(dst)) continue;\n if (dryRun) {\n seeded.push(`[dry-run] cp ${src} ${dst}`);\n continue;\n }\n const content = await readFile(src, 'utf-8');\n await mkdir(dirname(dst), { recursive: true });\n await writeFile(dst, content, { mode: seed.mode ? parseInt(seed.mode, 8) : 0o644 });\n seeded.push(basename(dst));\n }\n return seeded;\n}\n\nexport async function writeWrapper(binDir: string, name: string, currentLink: string, dryRun: boolean): Promise<void> {\n const bundleFile = name === 'abtars' ? 'abtars-cli.js' : `${name}.js`;\n // #912: ensure node is in PATH on macOS (homebrew) and Linux (.local/bin)\n const pathPreamble = `export PATH=\"/opt/homebrew/bin:$HOME/.local/bin:$PATH\"\\nexport NODE_PATH=\"$HOME/.local/lib/node_modules:\\${NODE_PATH:-}\"\\n`;\n let content: string;\n\n if (name === 'abmind') {\n content = `#!/usr/bin/env bash\n${pathPreamble}# Resolve abmind CLI \u2014 global install is canonical under #1243 (no longer bundled in the release)\nLOCAL_CLI=\"$HOME/.local/lib/node_modules/abmind/dist/cli/abmind.js\"\nGLOBAL_CLI=\"$(npm root -g 2>/dev/null)/abmind/dist/cli/abmind.js\"\nSRC_CLI=\"$HOME/.abtars-releases/src/abmind/dist/cli/abmind.js\"\nif [ -f \"$LOCAL_CLI\" ]; then\n exec node \"$LOCAL_CLI\" \"$@\"\nelif [ -f \"$GLOBAL_CLI\" ]; then\n exec node \"$GLOBAL_CLI\" \"$@\"\nelif [ -f \"$SRC_CLI\" ]; then\n exec node \"$SRC_CLI\" \"$@\"\nelse\n echo \"abmind: not found. Install via: npm install -g abmind\" >&2\n exit 1\nfi\n`;\n } else {\n const target = join(currentLink, 'bundle', bundleFile);\n const distFile = name === 'abtars' ? 'abtars.js' : `${name}.js`;\n const fallback = join(currentLink, 'dist', 'cli', distFile);\n content = `#!/usr/bin/env bash\n${pathPreamble}if [ -f \"${target}\" ]; then\n exec node \"${target}\" \"$@\"\nelif [ -f \"${fallback}\" ]; then\n exec node \"${fallback}\" \"$@\"\nelse\n GLOBAL_BIN=\"$(npm root -g 2>/dev/null)/abtars/bundle/${bundleFile}\"\n if [ -f \"$GLOBAL_BIN\" ]; then\n exec node \"$GLOBAL_BIN\" \"$@\"\n fi\n echo \"abtars: no release staged. Run 'abtars install' first.\" >&2\n exit 1\nfi\n`;\n }\n const path = join(binDir, name);\n if (dryRun) {\n process.stdout.write(`[dry-run] write wrapper ${path}\\n`);\n return;\n }\n try { const { unlinkSync } = await import(\"node:fs\"); unlinkSync(path); } catch { /* doesn't exist */ }\n await writeFile(path, content, { mode: 0o755 });\n}\n\nfunction isPathOnPATH(userBinDir: string): boolean {\n const PATH = process.env['PATH'] ?? '';\n return PATH.split(':').some((p) => p === userBinDir);\n}\n\nexport async function install(opts: InstallOptions): Promise<number> {\n const paths = packagePaths('abtars');\n const home = paths.home;\n const repoRoot = join(dirname(realpathSync(process.argv[1] ?? fileURLToPath(import.meta.url))), \"..\");\n\n // Install log (#718)\n const { initInstallLog, logInstall, logInstallHeader } = await import(\"../install-log.js\");\n initInstallLog(home);\n logInstallHeader(\"install\");\n const _origWrite = process.stdout.write.bind(process.stdout);\n process.stdout.write = ((chunk: any, ...args: any[]) => {\n if (typeof chunk === \"string\" && (chunk.startsWith(\"\u2713\") || chunk.startsWith(\"\u26A0\"))) logInstall(chunk.trimEnd());\n return _origWrite(chunk, ...args);\n }) as typeof process.stdout.write;\n\n const homeExists = await exists(home);\n const manifest = homeExists ? await readManifest(paths.manifest) : null;\n\n // #1101: Detect and remove stale shims from previous installs\n try {\n const { execSync } = await import(\"node:child_process\");\n const shimPath = execSync(\"which abtars 2>/dev/null\", { encoding: \"utf-8\" }).trim();\n const pnpmHome = process.env.PNPM_HOME ?? \"\";\n if (shimPath && pnpmHome && !shimPath.startsWith(pnpmHome) && !shimPath.includes(\".abtars\")) {\n const { unlinkSync } = await import(\"node:fs\");\n try { unlinkSync(shimPath); process.stdout.write(`\u2713 removed stale shim ${shimPath}\\n`); }\n catch { process.stderr.write(`\u26A0\uFE0F Stale shim at ${shimPath} \u2014 remove manually: rm ${shimPath}\\n`); }\n }\n } catch { /* which failed \u2014 no shim */ }\n\n if (homeExists && manifest && !opts.force && !opts.restore) {\n process.stderr.write(\n `~/.abtars already installed at version ${manifest.version || '(unset)'}.\\nUse 'abtars update' to upgrade, or --force to re-seed missing config.\\n`,\n );\n return 2;\n }\n\n // Kill stale daemon/watchdog from previous install (#771)\n try {\n const { execSync } = await import(\"node:child_process\");\n execSync(\"systemctl is-active abtars 2>/dev/null\", { stdio: \"ignore\" });\n execSync(\"sudo -n systemctl stop abtars 2>/dev/null\", { stdio: \"ignore\" });\n execSync(\"sudo -n systemctl disable abtars 2>/dev/null\", { stdio: \"ignore\" });\n } catch { /* not running or no sudo \u2014 fine */ }\n try {\n const { execSync } = await import(\"node:child_process\");\n execSync(\"pkill -f 'abtars-watchdog.sh' 2>/dev/null\", { stdio: \"ignore\" });\n } catch { /* no watchdog \u2014 fine */ }\n\n // Create skeleton (idempotent)\n await createSkeleton(home, opts.dryRun);\n process.stdout.write(`\u2713 skeleton at ${home}\\n`);\n\n // Install native deps (better-sqlite3, sqlite-vec) \u2014 required for kanban\n if (!opts.dryRun) {\n const deps = await import('./deps.js');\n await deps.deps(['install', 'native']);\n }\n\n // Core templates: abmind seeds its own on first boot (#427 ensureInitialized).\n // No longer seeded by abtars install.\n\n // Kiro agent config created on-demand by ACP transport (ensureAgentConfig)\n\n // Generate Ed25519 identity keypair (skip if already exists)\n const identityKey = join(paths.config, 'identity.key');\n const identityPub = join(paths.config, 'identity.pub');\n if (!opts.dryRun && !(await exists(identityKey))) {\n const { generateKeyPairSync } = await import('node:crypto');\n const { privateKey, publicKey } = generateKeyPairSync('ed25519');\n await writeFile(identityKey, privateKey.export({ format: 'der', type: 'pkcs8' }).toString('base64'));\n await writeFile(identityPub, publicKey.export({ format: 'der', type: 'spki' }).toString('base64'));\n const { chmodSync } = await import('node:fs');\n chmodSync(identityKey, 0o600);\n process.stdout.write(`\u2713 identity keypair generated\\n`);\n }\n\n // Generate self-signed Ed25519 TLS certificate (skip if already exists)\n const identityCrt = join(paths.config, 'identity.crt');\n const identityTlsKey = join(paths.config, 'identity.tls.key');\n if (!opts.dryRun && !(await exists(identityCrt))) {\n const { execSync } = await import('node:child_process');\n const { chmodSync } = await import('node:fs');\n const agentName = hostname();\n try {\n execSync(`openssl req -x509 -newkey ed25519 -keyout identity.tls.key -out identity.crt -days 3650 -nodes -subj \"/CN=${agentName}\"`, { cwd: paths.config, stdio: 'ignore' });\n chmodSync(identityTlsKey, 0o600);\n process.stdout.write(`\u2713 TLS certificate generated (Ed25519, 10yr)\\n`);\n } catch (err) {\n process.stderr.write(`\u26A0 TLS cert generation failed (openssl not found?). Agent-api will start without TLS.\\n`);\n }\n }\n\n // Seed config from examples (only missing ones)\n const seeded = await seedConfig(repoRoot, paths.config, opts.dryRun, home);\n if (seeded.length > 0) {\n process.stdout.write(`\u2713 seeded config: ${seeded.join(', ')}\\n`);\n }\n\n // Write wrappers (always overwrite \u2014 they're regenerable thin shims)\n const { loadManifest: loadInstallManifest } = await import('../install-manifest.js');\n const installManifest = loadInstallManifest(repoRoot);\n if (!opts.dryRun) {\n await mkdir(paths.bin, { recursive: true });\n }\n for (const name of installManifest.cliWrappers) {\n await writeWrapper(paths.bin, name, paths.current, opts.dryRun);\n }\n process.stdout.write(`\u2713 wrappers in ${paths.bin}\\n`);\n\n // Warn if ~/.local/bin not on PATH\n if (!isPathOnPATH(paths.bin)) {\n process.stderr.write(\n `\\nWarning: ${paths.bin} is not on $PATH. Add to your shell config:\\n export PATH=\"${paths.bin}:$PATH\"\\n`,\n );\n }\n\n // Initialize manifest if brand-new install AND migration didn't write one.\n // (Migration 003 writes a manifest mid-flow with version + migration record;\n // we must not clobber it here.)\n const manifestAfter = await readManifest(paths.manifest);\n if (manifestAfter === null && !opts.dryRun) {\n await writeManifest(paths.manifest, {\n ...emptyManifest('abtars', hostname()),\n version: '',\n });\n process.stdout.write(`\u2713 manifest initialized at ${paths.manifest}\\n`);\n }\n\n // Write install mode to manifest. Priority:\n // 1. --mode flag (explicit) \u2014 always wins\n // 2. existing manifest installMode \u2014 preserved (don't clobber on --force)\n // 3. default: supervised\n const manifestForMode = await readManifest(paths.manifest);\n const existingMode = manifestForMode?.installMode;\n const mode = opts.mode ?? existingMode ?? \"daemon\";\n if (manifestForMode) {\n await writeManifest(paths.manifest, { ...manifestForMode, installMode: mode });\n }\n process.stdout.write(`\u2713 install mode: ${mode}\\n`);\n\n // Release staging is handled by `abtars update` (auto-detects npm vs git source)\n\n // Restore from backup zip\n if (opts.restore) {\n const { spawnSync } = await import('node:child_process');\n const { existsSync: fileExists } = await import('node:fs');\n const zipPath = opts.restore;\n if (!fileExists(zipPath)) {\n process.stderr.write(`error: backup file not found: ${zipPath}\\n`);\n return 1;\n }\n // Extract to temp dir\n const tmpDir = join(process.env['TMPDIR'] ?? '/tmp', `abtars-restore-${Date.now()}`);\n const is7z = zipPath.endsWith('.7z');\n const extractCmd = is7z\n ? spawnSync('7z', ['x', zipPath, `-o${tmpDir}`, '-y'], { encoding: 'utf-8' })\n : spawnSync('unzip', ['-o', zipPath, '-d', tmpDir], { encoding: 'utf-8' });\n if (extractCmd.status !== 0) {\n process.stderr.write(`error: extract failed: ${extractCmd.stderr}\\n`);\n return 1;\n }\n // Copy abtars files \u2014 overwrite everything EXCEPT binaries (releases/, current, bin/)\n const abSrc = join(tmpDir, 'abtars');\n if (fileExists(abSrc)) {\n const skipSet = new Set(['releases', 'current', 'bin']);\n for (const f of readdirSync(abSrc)) {\n if (skipSet.has(f)) continue;\n spawnSync('cp', ['-r', join(abSrc, f), home], { stdio: 'inherit' });\n }\n process.stdout.write(`\u2713 restored abtars data\\n`);\n }\n // Copy abmind files\n const { resolveAbmindHome } = await import(\"../deploy-lib/paths.js\");\n const abmindHome = resolveAbmindHome();\n const abmindSrc = join(tmpDir, 'abmind');\n if (fileExists(abmindSrc)) {\n spawnSync('cp', ['-r', ...readdirSync(abmindSrc).map(f => join(abmindSrc, f)), abmindHome], { stdio: 'inherit' });\n process.stdout.write(`\u2713 restored abmind data\\n`);\n }\n // Cleanup + resync\n spawnSync('rm', ['-rf', tmpDir]);\n process.stdout.write(`\\n\u2713 Restore complete. Run 'abtars update' to resync.\\n`);\n return 0;\n }\n\n // --- supervised: load user-scope watchdog (LaunchAgent / systemd user) ---\n if (mode === 'daemon') {\n const { execSync } = await import('node:child_process');\n if (process.platform === 'darwin') {\n const plistSrc = join(home, 'scripts', 'com.abtars.watchdog.plist');\n const plistDst = join(homedir(), 'Library', 'LaunchAgents', 'com.abtars.watchdog.plist');\n if (existsSync(plistSrc)) {\n const content = readFileSync(plistSrc, 'utf-8').replaceAll('{{HOME}}', homedir());\n const { writeFileSync } = await import('node:fs');\n writeFileSync(plistDst, content);\n const uid = `gui/${process.getuid!()}`;\n try { execSync(`launchctl bootstrap ${uid} \"${plistDst}\"`, { stdio: 'ignore', timeout: 5000 }); } catch { /* already loaded */ }\n process.stdout.write(`\u2713 watchdog LaunchAgent loaded\\n`);\n }\n } else if (process.platform === 'linux') {\n const releaseSrc = join(resolveReleasesDir(), 'src', 'abtars', 'scripts', 'abtars-watchdog.service');\n const unitSrc = existsSync(releaseSrc) ? releaseSrc : join(home, 'scripts', 'abtars-watchdog.service');\n const unitDir = join(homedir(), '.config', 'systemd', 'user');\n if (existsSync(unitSrc)) {\n mkdirSync(unitDir, { recursive: true });\n copyFileSync(unitSrc, join(unitDir, 'abtars-watchdog.service'));\n try { execSync('systemctl --user daemon-reload && systemctl --user enable --now abtars-watchdog', { stdio: 'ignore' }); } catch { /* may fail in chroot */ }\n process.stdout.write(`\u2713 watchdog systemd user service enabled\\n`);\n }\n }\n }\n\n process.stdout.write(`\\nInstall complete.\\n`);\n if (!manifestAfter || manifestAfter.version === '') {\n process.stdout.write(`Next: 'abtars update' to build and activate the first release.\\n`);\n } else {\n process.stdout.write(`\\n\u2500\u2500 Next steps \u2500\u2500\\n`);\n process.stdout.write(` 1. (Optional) Install Ollama for memory embeddings: curl -fsSL https://ollama.com/install.sh | sh\\n`);\n process.stdout.write(` 2. Start the bridge: 'abtars restart' or use the watchdog\\n\\n`);\n }\n\n const { printHealthSummary } = await import('./health-check.js');\n printHealthSummary(paths.home);\n\n // #334: Post-install healthcheck \u2014 validate operator channel exists (only on --restore)\n if (!opts.dryRun && opts.restore) {\n const { validateMinimumViability, formatValidationError } = await import('./install-validate.js');\n const validation = validateMinimumViability(paths.config);\n if (!validation.ok) {\n const invocation = `abtars install --restore ${opts.restore}`;\n process.stderr.write(\"\\n\" + formatValidationError(validation, invocation) + \"\\n\");\n return 1;\n }\n }\n\n return 0;\n}\n"],
5
- "mappings": "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",
6
- "names": ["execSync"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/metrics-collector.ts"],
4
- "sourcesContent": ["/**\n * metrics-collector.ts \u2014 Lightweight in-process metrics collection (#832).\n * Ring buffers for latencies, daily counters, JSONL persistence.\n */\nimport { appendFileSync, readFileSync, writeFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nconst RING_SIZE = 100;\nconst SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;\n\ninterface LatencyBucket {\n samples: number[];\n idx: number;\n}\n\ninterface DailyCounter {\n date: string;\n calls: number;\n failures: number;\n}\n\nconst latencies = new Map<string, LatencyBucket>();\nconst counters = new Map<string, DailyCounter>();\nlet cronDepthSamples: number[] = [];\nlet metricsPath = \"\";\n\nexport function initMetrics(home: string): void {\n const metricsDir = join(home, \"metrics\");\n if (!existsSync(metricsDir)) mkdirSync(metricsDir, { recursive: true });\n metricsPath = join(metricsDir, \"metrics.jsonl\");\n}\n\nexport function recordLatency(key: string, durationMs: number): void {\n let bucket = latencies.get(key);\n if (!bucket) { bucket = { samples: [], idx: 0 }; latencies.set(key, bucket); }\n if (bucket.samples.length < RING_SIZE) {\n bucket.samples.push(durationMs);\n } else {\n bucket.samples[bucket.idx] = durationMs;\n }\n bucket.idx = (bucket.idx + 1) % RING_SIZE;\n}\n\nexport function recordCall(key: string, success: boolean): void {\n const today = new Date().toISOString().slice(0, 10);\n let c = counters.get(key);\n if (!c || c.date !== today) { c = { date: today, calls: 0, failures: 0 }; counters.set(key, c); }\n c.calls++;\n if (!success) c.failures++;\n}\n\nexport function recordCronDepth(depth: number): void {\n if (cronDepthSamples.length >= RING_SIZE) cronDepthSamples.shift();\n cronDepthSamples.push(depth);\n}\n\nfunction percentile(sorted: number[], pct: number): number {\n if (sorted.length === 0) return 0;\n const idx = Math.min(Math.floor(sorted.length * pct), sorted.length - 1);\n return sorted[idx]!;\n}\n\nexport interface MetricsSummary {\n llm: Record<string, { p50: number; p95: number; max: number; calls: number; failures: number }>;\n recall: { p50: number; p95: number; calls: number } | null;\n cronDepth: { avg: number; max: number };\n sleep: { calls: number; failures: number } | null;\n}\n\nexport function getMetricsSummary(): MetricsSummary {\n const llm: MetricsSummary[\"llm\"] = {};\n\n // Include all keys that have latency OR counter data\n const llmKeys = new Set<string>();\n for (const key of latencies.keys()) { if (key.startsWith(\"llm:\")) llmKeys.add(key.slice(4)); }\n for (const key of counters.keys()) { if (key.startsWith(\"llm:\")) llmKeys.add(key.slice(4)); }\n\n for (const model of llmKeys) {\n const bucket = latencies.get(`llm:${model}`);\n const sorted = bucket ? [...bucket.samples].sort((a, b) => a - b) : [];\n const counter = counters.get(`llm:${model}`);\n llm[model] = {\n p50: Math.round(percentile(sorted, 0.5)),\n p95: Math.round(percentile(sorted, 0.95)),\n max: sorted.length > 0 ? Math.round(sorted[sorted.length - 1]!) : 0,\n calls: counter?.calls ?? 0,\n failures: counter?.failures ?? 0,\n };\n }\n\n let recall: MetricsSummary[\"recall\"] = null;\n const recallBucket = latencies.get(\"recall\");\n if (recallBucket && recallBucket.samples.length > 0) {\n const sorted = [...recallBucket.samples].sort((a, b) => a - b);\n recall = { p50: Math.round(percentile(sorted, 0.5)), p95: Math.round(percentile(sorted, 0.95)), calls: sorted.length };\n }\n\n const cronSorted = [...cronDepthSamples];\n const cronMax = cronSorted.length > 0 ? Math.max(...cronSorted) : 0;\n const cronAvg = cronSorted.length > 0 ? Math.round(cronSorted.reduce((a, b) => a + b, 0) / cronSorted.length) : 0;\n\n const sleepCounter = counters.get(\"sleep\");\n const sleep = sleepCounter ? { calls: sleepCounter.calls, failures: sleepCounter.failures } : null;\n\n return { llm, recall, cronDepth: { avg: cronAvg, max: cronMax }, sleep };\n}\n\nexport function flushToFile(): void {\n if (!metricsPath) return;\n try {\n const summary = getMetricsSummary();\n const line = JSON.stringify({ ts: Date.now(), ...summary }) + \"\\n\";\n appendFileSync(metricsPath, line);\n } catch { /* non-fatal */ }\n}\n\n/** Housekeeping: remove lines older than 7 days. */\nexport function pruneMetricsFile(): void {\n if (!metricsPath || !existsSync(metricsPath)) return;\n try {\n const cutoff = Date.now() - SEVEN_DAYS_MS;\n const lines = readFileSync(metricsPath, \"utf-8\").split(\"\\n\").filter(Boolean);\n const kept = lines.filter(line => {\n try { return JSON.parse(line).ts >= cutoff; } catch { return false; }\n });\n writeFileSync(metricsPath, kept.join(\"\\n\") + (kept.length > 0 ? \"\\n\" : \"\"));\n } catch { /* non-fatal */ }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/peer-client.ts"],
4
- "sourcesContent": ["/**\n * peer-client.ts \u2014 HTTP client for peer_session tool (#392).\n * POST /v1/chat/completions with bearer + X-Peer-Hops.\n */\n\nimport { request as httpsRequest } from \"node:https\";\nimport { loadPeerConfig, type PeerEntry } from \"./peer-config.js\";\nimport { logInfo } from \"./logger.js\";\n\nconst TAG = \"peer-client\";\n\nexport type PeerError = \"timeout\" | \"unreachable\" | \"hop_exceeded\" | \"auth_failed\" | \"peer_error\" | \"unknown_peer\";\n\n/**\n * Module-level hop budget for the current request. Set by agent-api-server\n * before dispatching a prompt that came with X-Peer-Hops. Read by peer_session\n * tool to know what hops value to forward. Safe in single-threaded Node\n * because agent-api-server processes one prompt at a time per session.\n */\nlet _currentHops: number | null = null;\nexport function setCurrentPeerHops(hops: number | null): void { _currentHops = hops; }\nexport function getCurrentPeerHops(): number | null { return _currentHops; }\n\nexport class PeerCallError extends Error {\n constructor(public readonly code: PeerError, message: string) {\n super(message);\n this.name = \"PeerCallError\";\n }\n}\n\n/**\n * Call a peer's /v1/chat/completions endpoint.\n * @param peerName \u2014 key in peers.json\n * @param prompt \u2014 user message to send\n * @param hops \u2014 remaining hop budget (decremented before sending)\n */\nexport async function callPeer(peerName: string, prompt: string, hops: number, opts?: { skipWakeup?: boolean }): Promise<string> {\n const config = loadPeerConfig();\n const peerKey = Object.keys(config.peers).find(k => k.toLowerCase() === peerName.toLowerCase());\n const peer = peerKey ? config.peers[peerKey] : undefined;\n if (!peer) {\n const available = Object.keys(config.peers).join(\", \") || \"(none)\";\n throw new PeerCallError(\"unknown_peer\", `Unknown peer '${peerName}'. Available: ${available}`);\n }\n\n // Sign outgoing message if we have a signing key (#416)\n let signedPrompt = prompt;\n if (config.self.signingKey) {\n const { signMessage } = await import(\"./digital-signature.js\");\n const { tag } = signMessage(config.self.signingKey, config.self.name, peerName, prompt);\n signedPrompt = `${prompt} ${tag}`;\n }\n\n const start = Date.now();\n try {\n const response = await postCompletion(peer, peerName, signedPrompt, hops, config.timeoutMs, config.self.name);\n logInfo(TAG, `PEER_CALL ${peerName} \u2014 ${prompt.length}ch \u2192 ${response.length}ch (${Date.now() - start}ms, hops=${hops})`);\n return response;\n } catch (err) {\n if (err instanceof PeerCallError && (err.code === \"unreachable\" || err.code === \"timeout\") && peer.udpPort && !opts?.skipWakeup) {\n logInfo(TAG, `Direct call failed (${err.code}) \u2014 UDP callback request \u2192 ${peerKey}`);\n const { registerPending, rejectPending } = await import(\"./pending-callback.js\");\n const { sendWakeup } = await import(\"./dns-wakeup.js\");\n const resultPromise = registerPending(peerKey!, signedPrompt);\n sendWakeup(peerKey!, peer.host, peer.udpPort, peer.token);\n // Wait up to 60s for the peer to call back with the answer\n const timeout = setTimeout(() => rejectPending(peerKey!, \"callback timeout (60s)\"), 60000);\n try {\n const answer = await resultPromise;\n clearTimeout(timeout);\n logInfo(TAG, `PEER_CALL ${peerName} (via callback) \u2014 ${prompt.length}ch \u2192 ${answer.length}ch (${Date.now() - start}ms)`);\n return answer;\n } catch (cbErr) {\n clearTimeout(timeout);\n throw new PeerCallError(\"timeout\", `Callback failed: ${cbErr instanceof Error ? cbErr.message : String(cbErr)}`);\n }\n }\n throw err;\n }\n}\n\nfunction postCompletion(peer: PeerEntry, peerName: string, prompt: string, hops: number, timeoutMs: number, selfName: string): Promise<string> {\n const { signJwt } = require(\"./peer-jwt.js\") as typeof import(\"./peer-jwt.js\");\n const now = Math.floor(Date.now() / 1000);\n const jwt = signJwt({ iss: selfName, aud: peerName, iat: now, exp: now + 60 }, peer.token);\n\n const body = JSON.stringify({\n model: \"default\",\n messages: [{ role: \"user\", content: prompt }],\n });\n\n return new Promise((resolve, reject) => {\n const useTls = !!(peer.certFingerprint || peer.certPem);\n const requestFn = useTls ? httpsRequest : require(\"node:http\").request;\n\n const tlsOpts = useTls ? {\n minVersion: \"TLSv1.3\" as const,\n rejectUnauthorized: true,\n ...(peer.certPem ? { ca: [peer.certPem] } : {}),\n checkServerIdentity: (_hostname: string, cert: { fingerprint256?: string }) => {\n if (peer.certFingerprint && cert.fingerprint256 !== peer.certFingerprint) {\n return new Error(`Cert fingerprint mismatch: expected ${peer.certFingerprint}, got ${cert.fingerprint256}`);\n }\n return undefined;\n },\n } : {};\n\n const req = requestFn({\n hostname: peer.host,\n port: peer.port,\n path: \"/v1/chat/completions\",\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Content-Length\": Buffer.byteLength(body),\n \"Authorization\": `Bearer ${jwt}`,\n \"X-Peer-Hops\": String(hops),\n },\n timeout: timeoutMs,\n ...tlsOpts,\n } as any, (res: any) => {\n let data = \"\";\n res.on(\"data\", (c: any) => data += c);\n res.on(\"end\", () => {\n if (res.statusCode === 401 || res.statusCode === 403) {\n reject(new PeerCallError(\"auth_failed\", `Peer rejected auth (${res.statusCode})`));\n return;\n }\n if (res.statusCode === 429 || res.statusCode === 508) {\n reject(new PeerCallError(\"hop_exceeded\", `Peer refused \u2014 hop limit reached`));\n return;\n }\n if (res.statusCode && res.statusCode >= 400) {\n reject(new PeerCallError(\"peer_error\", `Peer returned ${res.statusCode}: ${data.slice(0, 200)}`));\n return;\n }\n try {\n const parsed = JSON.parse(data);\n const content = parsed?.choices?.[0]?.message?.content ?? \"\";\n resolve(content);\n } catch {\n reject(new PeerCallError(\"peer_error\", `Peer returned non-JSON: ${data.slice(0, 100)}`));\n }\n });\n });\n req.on(\"timeout\", () => { req.destroy(); reject(new PeerCallError(\"timeout\", `Peer '${peer.host}:${peer.port}' timed out (${timeoutMs}ms)`)); });\n req.on(\"error\", (err: Error) => reject(new PeerCallError(\"unreachable\", `Peer unreachable: ${err.message}`)));\n req.write(body);\n req.end();\n });\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,18 +0,0 @@
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
- import {
4
- init_peer_jwt,
5
- signJwt,
6
- verifyJwt
7
- } from "./chunk-RWRRGE4U.js";
8
- import "./chunk-YSKCQH6E.js";
9
- import "./chunk-GWILHZPT.js";
10
- import "./chunk-GALQBVKO.js";
11
- import "./chunk-O7KQG6ME.js";
12
- import "./chunk-7K2YZTLD.js";
13
- init_peer_jwt();
14
- export {
15
- signJwt,
16
- verifyJwt
17
- };
18
- //# sourceMappingURL=peer-jwt-NCCPXJRX.js.map
@@ -1,34 +0,0 @@
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
- import "./chunk-7K2YZTLD.js";
4
-
5
- // src/components/transport/stream-single.ts
6
- async function streamSingleCompletion(params) {
7
- const { endpoint, apiKey, model, systemPrompt, userPrompt, maxTokens } = params;
8
- const body = {
9
- model,
10
- messages: [
11
- { role: "system", content: systemPrompt },
12
- { role: "user", content: userPrompt }
13
- ],
14
- max_tokens: maxTokens,
15
- stream: false
16
- };
17
- const headers = { "Content-Type": "application/json" };
18
- if (apiKey) headers["Authorization"] = `Bearer ${apiKey}`;
19
- const response = await fetch(`${endpoint}/chat/completions`, {
20
- method: "POST",
21
- headers,
22
- body: JSON.stringify(body),
23
- signal: AbortSignal.timeout(6e4)
24
- });
25
- if (!response.ok) {
26
- throw new Error(`Summarization LLM call failed: ${response.status} ${response.statusText}`);
27
- }
28
- const json = await response.json();
29
- return json.choices?.[0]?.message?.content?.trim() ?? "";
30
- }
31
- export {
32
- streamSingleCompletion
33
- };
34
- //# sourceMappingURL=stream-single-RFJNUTL6.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/transport/stream-single.ts"],
4
- "sourcesContent": ["/**\n * stream-single.ts \u2014 Single-shot LLM completion for internal use (summarization, etc.).\n * Non-streaming, returns full text response.\n */\n\nexport interface SingleCompletionParams {\n endpoint: string;\n apiKey?: string;\n model: string;\n systemPrompt: string;\n userPrompt: string;\n maxTokens: number;\n}\n\nexport async function streamSingleCompletion(params: SingleCompletionParams): Promise<string> {\n const { endpoint, apiKey, model, systemPrompt, userPrompt, maxTokens } = params;\n\n const body = {\n model,\n messages: [\n { role: \"system\", content: systemPrompt },\n { role: \"user\", content: userPrompt },\n ],\n max_tokens: maxTokens,\n stream: false,\n };\n\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (apiKey) headers[\"Authorization\"] = `Bearer ${apiKey}`;\n\n const response = await fetch(`${endpoint}/chat/completions`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(60_000),\n });\n\n if (!response.ok) {\n throw new Error(`Summarization LLM call failed: ${response.status} ${response.statusText}`);\n }\n\n const json = await response.json() as { choices?: Array<{ message?: { content?: string } }> };\n return json.choices?.[0]?.message?.content?.trim() ?? \"\";\n}\n"],
5
- "mappings": ";;;;;AAcA,eAAsB,uBAAuB,QAAiD;AAC5F,QAAM,EAAE,UAAU,QAAQ,OAAO,cAAc,YAAY,UAAU,IAAI;AAEzE,QAAM,OAAO;AAAA,IACX;AAAA,IACA,UAAU;AAAA,MACR,EAAE,MAAM,UAAU,SAAS,aAAa;AAAA,MACxC,EAAE,MAAM,QAAQ,SAAS,WAAW;AAAA,IACtC;AAAA,IACA,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AAEA,QAAM,UAAkC,EAAE,gBAAgB,mBAAmB;AAC7E,MAAI,OAAQ,SAAQ,eAAe,IAAI,UAAU,MAAM;AAEvD,QAAM,WAAW,MAAM,MAAM,GAAG,QAAQ,qBAAqB;AAAA,IAC3D,QAAQ;AAAA,IACR;AAAA,IACA,MAAM,KAAK,UAAU,IAAI;AAAA,IACzB,QAAQ,YAAY,QAAQ,GAAM;AAAA,EACpC,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,kCAAkC,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,EAC5F;AAEA,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,SAAO,KAAK,UAAU,CAAC,GAAG,SAAS,SAAS,KAAK,KAAK;AACxD;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/system-status.ts"],
4
- "sourcesContent": ["/**\n * system-status.ts \u2014 Single source of truth for bridge status.\n * One collector, many renderers. Used by /status (text), dashboard (HTML), future API (JSON).\n */\n\nimport { logAndSwallow } from \"./log-and-swallow.js\";\nimport { getInstanceName } from \"./soul-bundle.js\";\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { ServiceState } from \"./service-registry.js\";\n\nexport interface SubsystemHealth {\n name: string;\n status: \"ok\" | \"failed\" | \"skipped\" | \"stopped\" | \"retrying\";\n detail?: string;\n}\n\nexport interface SystemStatus {\n version: string;\n commit: string;\n model: string;\n transportType: string;\n transportProvider: string;\n transportReady: boolean;\n uptimeMs: number;\n contextPercent: number;\n sleepStatus: string | null;\n subsystems: SubsystemHealth[];\n tasks: { recurring: number; pending: number; paused: number };\n lastBackup: string | null;\n // New fields for redesigned /status output\n securityMode: string;\n trustMode: boolean;\n activeSessions: number;\n kanban: { active: number; total: number } | null;\n soulBundle: { available: number; total: number } | null;\n peersConfigured: number;\n /** Per-platform running state: key = \"telegram\"/\"discord\"/\"irc\", value = running */\n platformStates: Record<string, boolean>;\n}\n\nexport interface StatusContext {\n phaseHealth: Map<string, { status: \"ok\" | \"failed\" | \"skipped\"; error?: string }>;\n registry: { getStates(): Record<string, ServiceState> };\n transport: { isReady: boolean } | null;\n startedAt: number;\n bridgeLockPath: string;\n heartbeat: { intervalMs: number } | null;\n}\n\nconst SOUL_CORE_FILES = [\"SOUL.md\", \"user_profile.md\", \"agent_notes.md\", \"memory-tools.md\", \"core_facts.md\"] as const;\nconst PLATFORM_NAMES = [\"telegram\", \"discord\", \"irc\"] as const;\n\nexport async function getSystemStatus(ctx: StatusContext): Promise<SystemStatus> {\n // Version + commit from manifest.json (single source of truth)\n const { getDeployedVersion } = await import(\"../paths.js\");\n const deployed = getDeployedVersion();\n const version = deployed.version;\n const commit = deployed.commit || \"?\";\n\n // Model + transport\n let model = \"unknown\";\n let transportType = \"unknown\";\n let transportProvider = \"unknown\";\n try {\n const { loadTransport, resolveAgent } = await import(\"./transport-config.js\");\n const tc = loadTransport();\n const prof = tc ? resolveAgent(\"professor\", tc) : null;\n if (prof) {\n model = prof.model;\n transportType = (prof.provider.transport ?? \"acp\").toUpperCase();\n transportProvider = prof.providerName ?? \"unknown\";\n }\n } catch (err) { logAndSwallow(\"system_status\", \"op\", err); }\n\n // Subsystem health: merge phaseHealth + ServiceRegistry live state\n const serviceStates = ctx.registry.getStates();\n const subsystems: SubsystemHealth[] = [];\n\n for (const [name, health] of ctx.phaseHealth) {\n const entry: SubsystemHealth = { name, status: health.status };\n\n const svcName = phaseToService(name);\n if (svcName && serviceStates[svcName]) {\n const svc = serviceStates[svcName] as ServiceState;\n if (health.status === \"ok\" && !svc.running) {\n entry.status = svc.retrying ? \"retrying\" : \"stopped\";\n }\n if (svc.retrying) entry.detail = `retry #${svc.retrying.attempt}`;\n }\n\n if (name === \"phaseTransport\" && health.status === \"ok\" && ctx.transport) {\n entry.detail = `${transportType} (${transportProvider}), ${ctx.transport.isReady ? \"ready\" : \"not ready\"}`;\n }\n if (name === \"phaseHeartbeat\" && health.status === \"ok\" && ctx.heartbeat) {\n try {\n const lock = JSON.parse(readFileSync(ctx.bridgeLockPath, \"utf-8\"));\n const ago = Math.round((Date.now() - (lock.lastHeartbeat || 0)) / 60000);\n entry.detail = `${Math.round(ctx.heartbeat.intervalMs / 1000)}s, last tick ${ago}m ago`;\n } catch (err) { logAndSwallow(\"system_status\", \"op\", err); }\n }\n if (name === \"phaseDashboard\" && health.status === \"ok\") {\n entry.detail = `:${process.env[\"WEB_PORT\"] || \"3000\"}`;\n }\n\n subsystems.push(entry);\n }\n\n // Platform running states (telegram, discord, irc)\n const platformStates: Record<string, boolean> = {};\n for (const name of PLATFORM_NAMES) {\n const svc = serviceStates[name];\n if (svc) platformStates[name] = svc.running;\n }\n\n // Tasks\n let tasks = { recurring: 0, pending: 0, paused: 0 };\n try {\n const { readEntries } = await import(\"./tasks/task-store.js\");\n const entries = readEntries();\n tasks = {\n recurring: entries.filter((e: any) => e.schedule && !e.paused).length,\n pending: entries.filter((e: any) => !e.fired && !e.schedule).length,\n paused: entries.filter((e: any) => e.paused).length,\n };\n } catch (err) { logAndSwallow(\"system_status\", \"op\", err); }\n\n // Last backup\n let lastBackup: string | null = null;\n try {\n const { readdirSync } = await import(\"node:fs\");\n const bd = join(homedir(), \".backup-abtars\");\n const bk = readdirSync(bd).filter((f: string) => f.startsWith(\"abtars-\") && (f.endsWith(\".zip\") || f.endsWith(\".7z\"))).sort();\n if (bk.length > 0) lastBackup = bk[bk.length - 1] ?? null;\n } catch (err) { logAndSwallow(\"system_status\", \"op\", err); }\n\n // Context percent + sleep status from bridge.lock\n let contextPercent = -1;\n let sleepStatus: string | null = null;\n try {\n const lock = JSON.parse(readFileSync(ctx.bridgeLockPath, \"utf-8\"));\n if (typeof lock.contextPercent === \"number\") contextPercent = lock.contextPercent;\n sleepStatus = lock.sleepStatus ?? null;\n } catch { /* ignore */ }\n\n // Security mode + trust\n let securityMode = \"off\";\n let trustMode = false;\n try {\n const { getSecurityMode } = await import(\"./guardrails.js\");\n const { getEnv } = await import(\"./env-schema.js\");\n securityMode = getSecurityMode();\n trustMode = (getEnv() as any).trustMode === true;\n } catch (err) { logAndSwallow(\"system_status\", \"trust\", err); }\n\n // Active Spin session count\n let activeSessions = 0;\n try {\n const { spin } = await import(\"./spin.js\");\n activeSessions = spin.listAllSessions().length;\n } catch (err) { logAndSwallow(\"system_status\", \"spin\", err); }\n\n // Kanban active/total via kanbanList\n let kanban: SystemStatus[\"kanban\"] = null;\n try {\n const { kanbanList } = await import(\"./tasks/kanban-board.js\");\n const all = kanbanList();\n const active = all.filter((c: any) => [\"queued\", \"running\", \"delivering\"].includes(c.status)).length;\n kanban = { active, total: all.length };\n } catch (err) { logAndSwallow(\"system_status\", \"kanban\", err); }\n\n // Soul bundle availability (only when abmind memory)\n let soulBundle: SystemStatus[\"soulBundle\"] = null;\n try {\n const { getEnv } = await import(\"./env-schema.js\");\n const { abmindHome } = await import(\"../paths.js\");\n const memoryProvider = (getEnv() as any).memory ?? \"abmind\";\n if (memoryProvider === \"abmind\" || memoryProvider === \"auto\") {\n const coreDir = join(abmindHome(), \"memory\", \"core\");\n if (existsSync(coreDir)) {\n const available = SOUL_CORE_FILES.filter(f => existsSync(join(coreDir, f))).length;\n soulBundle = { available, total: SOUL_CORE_FILES.length };\n }\n }\n } catch (err) { logAndSwallow(\"system_status\", \"soul\", err); }\n\n // Peers configured count (exclude \"self\" entry)\n let peersConfigured = 0;\n try {\n const { abtarsHome } = await import(\"../paths.js\");\n const peersPath = join(abtarsHome(), \"config\", \"peers.json\");\n if (existsSync(peersPath)) {\n const peers = JSON.parse(readFileSync(peersPath, \"utf-8\")) as Record<string, unknown>;\n peersConfigured = Object.keys(peers).filter(k => k !== \"self\").length;\n }\n } catch (err) { logAndSwallow(\"system_status\", \"peers\", err); }\n\n return {\n version,\n commit,\n model,\n transportType,\n transportProvider,\n transportReady: ctx.transport?.isReady ?? false,\n uptimeMs: Date.now() - ctx.startedAt,\n contextPercent,\n sleepStatus,\n subsystems,\n tasks,\n lastBackup,\n securityMode,\n trustMode,\n activeSessions,\n kanban,\n soulBundle,\n peersConfigured,\n platformStates,\n };\n}\n\n/** Map phase names to ServiceRegistry service names (for live state merge). */\nfunction phaseToService(phaseName: string): string | null {\n switch (phaseName) {\n case \"phaseAgentApi\": return \"agent-api\";\n default: return null;\n }\n}\n\n/** Render SystemStatus as plain text for Telegram/Discord /status command. */\nexport function renderStatusText(status: SystemStatus): string {\n const uptime = formatUptime(status.uptimeMs);\n const failures = status.subsystems.filter(s => s.status === \"failed\" || s.status === \"stopped\").length;\n const mood = failures === 0 ? \"\uD83D\uDE0A\" : failures <= 2 ? \"\uD83D\uDE10\" : \"\uD83D\uDE1F\";\n const sleepLabel = status.sleepStatus ?? \"awake\";\n\n const lines: string[] = [\n `abTARS\u2122 ${getInstanceName()} \u2014 ${sleepLabel} ${mood}`,\n ` PID ${process.pid} (up ${uptime})`,\n ];\n\n // Watchdog\n const wdPid = process.env[\"ABTARS_WATCHDOG_PID\"];\n if (wdPid && wdPid !== \"0\") {\n try { process.kill(Number(wdPid), 0); lines.push(` Watchdog: PID ${wdPid}`); }\n catch { lines.push(\" Watchdog: not running (stale PID)\"); }\n } else {\n lines.push(\" Watchdog: not detected\");\n }\n\n lines.push(` Security: ${status.securityMode}`);\n if (status.trustMode) lines.push(\" Trust: (trusted)\");\n\n // \u2500\u2500 Body \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n lines.push(\"\", \"Body:\");\n\n // Platforms: per-platform from collected platformStates\n const platformEntries = ([\"telegram\", \"discord\", \"irc\"] as const)\n .filter(name => name in status.platformStates)\n .map(name => `${status.platformStates[name] ? \"\u2713\" : \"\u2717\"} ${name.charAt(0).toUpperCase() + name.slice(1)}`);\n\n if (platformEntries.length > 0) {\n lines.push(` \u2713 platforms: ${platformEntries.join(\" \")}`);\n } else {\n const platformSub = status.subsystems.find(s => s.name === \"phasePlatforms\");\n lines.push(` ${subIcon(platformSub)} platforms${platformSub?.detail ? `: ${platformSub.detail}` : \"\"}`);\n }\n\n const dashSub = status.subsystems.find(s => s.name === \"phaseDashboard\");\n const webPort = (process.env[\"WEB_PORT\"] ?? \"\").replace(/^:/, \"\");\n if (dashSub && dashSub.status !== \"skipped\") {\n lines.push(` ${subIcon(dashSub)} dashboard${webPort ? `: ${webPort}` : \"\"}`);\n } else {\n lines.push(\" \u25CB dashboard: disabled\");\n }\n\n // \u2500\u2500 Heart \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n lines.push(\"\", \"Heart:\");\n\n try {\n const { getHeartbeatInstance } = require(\"./heartbeat-system.js\") as typeof import(\"./heartbeat-system.js\");\n const hb = getHeartbeatInstance();\n if (hb) {\n const intervalSec = Math.round(hb.intervalMs / 1000);\n let lastTickAgo = \"\";\n try {\n const lock = JSON.parse(readFileSync(join(homedir(), \".abtars\", \"bridge.lock\"), \"utf-8\"));\n if (lock.lastHeartbeat) {\n const agoSec = Math.round((Date.now() - lock.lastHeartbeat) / 1000);\n lastTickAgo = ` / ${agoSec < 60 ? `${agoSec}s ago` : `${Math.round(agoSec / 60)}m ago`}`;\n }\n } catch { /* ignore */ }\n lines.push(` ${hb.isRunning ? \"\u2713\" : \"\u2717\"} heartbeat: ${intervalSec}s${lastTickAgo}`);\n lines.push(` \u2713 internal tasks: ${hb.getTaskNames().length}`);\n } else {\n lines.push(\" \u2717 heartbeat: not running\");\n }\n } catch { lines.push(\" \u25CB heartbeat: not loaded\"); }\n\n // \u2500\u2500 Brain \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n lines.push(\"\", \"Brain:\");\n\n const modelShort = status.model.split(\"/\").pop() ?? status.model;\n let lastPromptStr = \"\";\n try {\n const lock = JSON.parse(readFileSync(join(homedir(), \".abtars\", \"bridge.lock\"), \"utf-8\"));\n if (lock.lastPromptAt) {\n const agoSec = Math.round((Date.now() - lock.lastPromptAt) / 1000);\n lastPromptStr = agoSec < 60 ? `${agoSec}s ago` : `${Math.round(agoSec / 60)}m ago`;\n }\n } catch { /* ignore */ }\n lines.push(` \u2713 model: ${modelShort}${lastPromptStr ? ` / ${lastPromptStr}` : \"\"}`);\n\n lines.push(` \u2713 spin: ${status.activeSessions} active session${status.activeSessions !== 1 ? \"s\" : \"\"}`);\n\n if (status.kanban) {\n lines.push(` \u2713 kanban: ${status.kanban.active}/${status.kanban.total}`);\n } else {\n lines.push(\" \u2717 kanban: not initialized\");\n }\n\n // SHA \u2014 check sha-policy.json existence (same as doctor probe)\n try {\n const { abtarsHome } = require(\"../paths.js\") as typeof import(\"../paths.js\");\n const policyExists = existsSync(join(abtarsHome(), \"config\", \"sha-policy.json\"));\n lines.push(` ${policyExists ? \"\u2713\" : \"~\"} SHA: ${policyExists ? \"rules configured\" : \"no policy configured\"}`);\n } catch {\n lines.push(\" ~ SHA: no policy configured\");\n }\n\n try {\n const { getSkillCache } = require(\"../capabilities/hotskills/index.js\") as typeof import(\"../capabilities/hotskills/index.js\");\n const skills = getSkillCache();\n const active = skills.filter((s: any) => !s.skipped).length;\n lines.push(` \u2713 skills: ${active} active`);\n } catch { /* hotskills not loaded */ }\n\n // \u2500\u2500 Soul \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n lines.push(\"\", \"Soul:\");\n\n if (status.soulBundle) {\n const allPresent = status.soulBundle.available === status.soulBundle.total;\n lines.push(` ${allPresent ? \"\u2713\" : \"~\"} memory: abmind working`);\n lines.push(` soul bundle: ${status.soulBundle.available}/${status.soulBundle.total} available`);\n } else {\n lines.push(\" \u2717 memory: none\");\n }\n\n // \u2500\u2500 Tribe \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n lines.push(\"\", \"Tribe:\");\n\n const apiSub = status.subsystems.find(s => s.name === \"phaseAgentApi\");\n const apiPort = (process.env[\"AGENT_API_PORT\"] ?? \"\").replace(/^:/, \"\");\n lines.push(` ${subIcon(apiSub)} agent-api${apiPort ? `: ${apiPort}` : \"\"}`);\n\n if (status.peersConfigured > 0) {\n lines.push(` \u2713 peers: ${status.peersConfigured} configured`);\n } else {\n lines.push(\" \u25CB peers: none configured\");\n }\n\n const a2aSub = status.subsystems.find(s => s.name === \"phaseA2a\" || s.name === \"phaseGossip\");\n lines.push(` ${subIcon(a2aSub)} a2a${a2aSub?.detail ? `: ${a2aSub.detail}` : \"\"}`);\n\n // \u2500\u2500 Footer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n lines.push(\"\");\n lines.push(`Tasks: ${status.tasks.recurring} recurring, ${status.tasks.pending} pending${status.tasks.paused ? `, ${status.tasks.paused} paused` : \"\"}`);\n if (status.lastBackup) lines.push(`Last backup: ${status.lastBackup}`);\n\n return lines.join(\"\\n\");\n}\n\nfunction subIcon(sub: SubsystemHealth | undefined): string {\n if (!sub) return \"\u25CB\";\n switch (sub.status) {\n case \"ok\": return \"\u2713\";\n case \"skipped\": return \"\u25CB\";\n default: return \"\u2717\";\n }\n}\n\nfunction formatUptime(ms: number): string {\n const s = Math.floor(ms / 1000);\n const m = Math.floor(s / 60) % 60;\n const h = Math.floor(s / 3600) % 24;\n const d = Math.floor(s / 86400);\n if (d > 0) return `${d}d ${h}h ${m}m`;\n if (h > 0) return `${h}h ${m}m`;\n return `${m}m`;\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/platforms/telegram/telegram-adapter.ts", "../src/platforms/telegram/telegram-api.ts", "../src/platforms/telegram/telegram-poller.ts", "../src/platforms/telegram/offset-store.ts", "../src/platforms/telegram/telegram-model-picker.ts"],
4
- "sourcesContent": ["import { BOT_COMMANDS } from \"../../components/command-registry.js\";\nimport { abtarsHome } from \"../../paths.js\";\n/**\n * Telegram platform adapter \u2014 wraps TelegramApi, TelegramPoller, SecurityGate.\n * Handles Telegram-specific pre-processing (voice, reactions, groups, mentions)\n * then delegates to the shared message pipeline.\n */\n\nimport { TelegramApi } from \"./telegram-api.js\";\nimport { TelegramPoller } from \"./telegram-poller.js\";\nimport { createFileOffsetStore } from \"./offset-store.js\";\nimport { SecurityGate } from \"../../components/security-gate.js\";\nimport { ResponseFormatter } from \"../../components/response-formatter.js\";\nimport { formatReactionSignal, routeReaction } from \"../../components/reactions.js\";\nimport { cleanResponse } from \"../../components/clean-response.js\";\n\nexport const TELEGRAM_CAPABILITIES: PlatformCapabilities = { voice: true, reactions: true, typing: true, threads: true };\nimport { emojiToScore, emojiToTag } from \"../../utils/emoji-score.js\";\nimport { logInfo, logWarn, logError, logDebug } from \"../../components/logger.js\";\nimport { logAndSwallow } from \"../../components/log-and-swallow.js\";\nimport { handleInboundMessage, resetAndPrepare, type PipelineDeps } from \"../../components/message-pipeline.js\";\nimport type { PlatformAdapter, PlatformCapabilities, InboundMessage, SendOpts } from \"../../types/platform.js\";\nimport type { TelegramUpdate } from \"../../types/index.js\";\nimport type { ConversationBuffer } from \"../../components/conversation-buffer.js\";\nimport type { IKiroTransport } from \"../../components/transport/kiro-transport.js\";\nimport type { IMemorySystem } from \"abmind\";\nimport { loadUsers } from \"../../components/user-registry.js\";\nimport { isModelPickerCallback, handleModelPickerCallback } from \"./telegram-model-picker.js\";\n\nconst TAG = \"telegram\";\n\nexport interface TelegramAdapterConfig {\n botToken: string;\n allowedUserIds: Set<number>;\n pollTimeoutS: number;\n}\n\nexport interface TelegramAdapterDeps {\n pipeline: PipelineDeps;\n conversationBuffer: ConversationBuffer;\n transport: IKiroTransport;\n memory: IMemorySystem | null;\n sessionManager: { getActiveSessionId(userId: string, platform: string): string };\n actionGate?: { handleCallback(data: string): boolean } | null;\n}\n\nexport class TelegramAdapter implements PlatformAdapter {\n readonly name = \"telegram\" as const;\n readonly capabilities: PlatformCapabilities = TELEGRAM_CAPABILITIES;\n\n private readonly api: TelegramApi;\n private readonly securityGate: SecurityGate;\n private readonly formatter = new ResponseFormatter();\n private readonly config: TelegramAdapterConfig;\n private deps: TelegramAdapterDeps;\n private poller: TelegramPoller | null = null;\n private botUsername = \"\";\n _pendingSlot: string | undefined;\n _modelPickerCache: string[] = [];\n\n constructor(config: TelegramAdapterConfig, deps: TelegramAdapterDeps) {\n this.api = new TelegramApi(config.botToken);\n this.securityGate = new SecurityGate(loadUsers());\n this.config = config;\n this.deps = deps;\n }\n\n /** Late-bind: replace pipeline deps after construction (used by graph boot). */\n setMessageHandler(deps: TelegramAdapterDeps): void { this.deps = deps; }\n\n /** Send a system notification to a chat (fire-and-forget). */\n sendNotification(chatId: string, text: string): void {\n this.api.sendMessage(parseInt(chatId, 10), text).catch(err => logAndSwallow(TAG, \"sendNotification\", err));\n }\n\n /** Reset session after model switch \u2014 saves idle state, clears buffer, marks pendingStart. */\n private async resetSessionForModelSwitch(chatId: number, reason = \"model-switch\"): Promise<void> {\n await this.api.sendMessage(chatId, \"Resetting session\u2026\");\n const p = this.deps.pipeline;\n const sessionKey = `telegram:${chatId}`;\n const bufKey = `telegram:${chatId}`;\n await p.idleSave.save(sessionKey, chatId);\n await resetAndPrepare({\n transport: this.deps.transport, sessionKey, reason,\n conversationBuffer: this.deps.conversationBuffer, bufKey,\n });\n if (p.memoryConfig.memoryEnabled) {\n const reg = loadUsers();\n const user = reg.byPlatformId.get(String(chatId));\n if (user) p.updateCtxStart(p.memoryConfig.memoryDir, user.userId);\n }\n }\n\n async start(): Promise<void> {\n const botInfo = await this.api.getMe();\n this.botUsername = botInfo.username?.toLowerCase() ?? \"\";\n logInfo(TAG, `\uD83E\uDD16 Bot: @${botInfo.username}`);\n\n await this.api.setMyCommands(BOT_COMMANDS.map(c => ({ command: c.name, description: c.description })))\n .catch((err) => logWarn(TAG, `setMyCommands failed: ${err instanceof Error ? err.message : String(err)}`));\n\n const home = abtarsHome();\n const offsetStore = createFileOffsetStore(`${home}/state/telegram-offset`);\n this.poller = new TelegramPoller(this.api, this.config.pollTimeoutS, (u) => this.handleUpdate(u), offsetStore);\n await this.poller.start();\n }\n\n stop(): void {\n this.poller?.stop();\n this.poller = null;\n }\n\n authorize(msg: InboundMessage): boolean {\n return this.securityGate.authorizeById(msg.senderId);\n }\n\n async sendMessage(channelId: string, text: string, opts?: SendOpts): Promise<number | undefined> {\n const chatId = parseInt(channelId, 10);\n const sendOpts: Record<string, unknown> = {};\n if (opts?.threadId) sendOpts.message_thread_id = parseInt(opts.threadId, 10);\n if (opts?.parseMode) sendOpts.parse_mode = opts.parseMode;\n if (opts?.reply_markup) sendOpts.reply_markup = opts.reply_markup;\n return this.api.sendMessage(chatId, text, sendOpts);\n }\n\n async editMessage(channelId: string, messageId: number, text: string): Promise<void> {\n const chatId = parseInt(channelId, 10);\n await this.api.editMessageText(chatId, messageId, text);\n }\n\n chunkResponse(text: string): string[] {\n return this.formatter.chunkText(text);\n }\n\n async sendTyping(channelId: string, threadId?: string): Promise<void> {\n await this.api.sendChatAction(parseInt(channelId, 10), \"typing\", threadId ? parseInt(threadId, 10) : undefined);\n }\n\n async setReaction(channelId: string, messageId: number, emoji: string): Promise<void> {\n if (messageId <= 0) return;\n try {\n const reaction = emoji ? [{ type: \"emoji\" as const, emoji }] : [];\n await this.api.setMessageReaction(parseInt(channelId, 10), messageId, reaction);\n } catch (err) {\n logDebug(TAG, `React failed (${emoji || \"remove\"}): ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n async downloadVoice(fileId: string): Promise<Buffer> {\n const fileInfo = await this.api.getFile(fileId);\n if (!fileInfo.file_path) throw new Error(\"No file_path returned\");\n return this.api.downloadFile(fileInfo.file_path);\n }\n\n async sendVoice(channelId: string, audio: Buffer, opts?: SendOpts): Promise<void> {\n const sendOpts: Record<string, unknown> = {};\n if (opts?.threadId) sendOpts.message_thread_id = parseInt(opts.threadId, 10);\n await this.api.sendVoice(parseInt(channelId, 10), audio, sendOpts);\n }\n\n /** Send a file from disk as a Telegram document. */\n async sendDocument(channelId: string, filePath: string, caption?: string, opts?: SendOpts): Promise<number> {\n const sendOpts: { message_thread_id?: number } = {};\n if (opts?.threadId) sendOpts.message_thread_id = parseInt(opts.threadId, 10);\n return this.api.sendDocument(parseInt(channelId, 10), filePath, caption, sendOpts);\n }\n\n injectMessage(msg: InboundMessage): void {\n if (!this.poller) return;\n this.poller.injectUpdate({\n update_id: 0,\n message: {\n message_id: 0,\n from: { id: parseInt(msg.channelId, 10), is_bot: false, first_name: \"queued\" },\n chat: { id: parseInt(msg.channelId, 10), type: \"private\" },\n date: Math.floor(Date.now() / 1000),\n text: msg.text,\n ...(msg.threadId ? { message_thread_id: parseInt(msg.threadId, 10) } : {}),\n },\n });\n }\n\n // --- Internal: Telegram update handler ---\n\n private async handleUpdate(update: TelegramUpdate): Promise<void> {\n logDebug(TAG, `Update: ${JSON.stringify(update).slice(0, 200)}`);\n\n if (update.callback_query) {\n const data = update.callback_query.data ?? \"\";\n const chatId = update.callback_query.message?.chat?.id;\n this.api.answerCallbackQuery(update.callback_query.id).catch(err => logAndSwallow(TAG, \"answerCallbackQuery\", err));\n if (!chatId) return;\n\n try {\n if (isModelPickerCallback(data)) {\n await handleModelPickerCallback(data, chatId, this.api, this, {\n transport: this.deps.transport as any,\n pipeline: this.deps.pipeline as any,\n resetSessionForModelSwitch: (cid, reason) => this.resetSessionForModelSwitch(cid, reason),\n });\n } else if (data.startsWith(\"model:\")) {\n // Legacy callback \u2014 direct model switch\n const newModel = data.slice(6);\n const transport = this.deps.transport;\n if (\"setModel\" in transport && typeof (transport as { setModel: unknown }).setModel === \"function\") {\n try {\n await (transport as { setModel: (m: string) => Promise<void> | void }).setModel(newModel);\n await this.resetSessionForModelSwitch(chatId);\n if (chatId) await this.api.sendMessage(chatId, `\uD83E\uDD16 Model switched \u2192 ${newModel}`);\n } catch (err) {\n if (chatId) await this.api.sendMessage(chatId, `\u274C Model switch failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n } else if (data.startsWith(\"auth:\")) {\n // ActionGate authorization callback\n if (this.deps.actionGate?.handleCallback(data)) {\n await this.api.sendMessage(chatId, \"\u2713 Responded.\");\n }\n }\n } catch (err) {\n logWarn(TAG, `Callback handler error: ${err instanceof Error ? err.message : String(err)}`);\n this.api.sendMessage(chatId, `\u26A0\uFE0F Action failed \u2014 try again.`).catch(err2 => logAndSwallow(TAG, \"sendMessage action failed\", err2));\n }\n return;\n }\n\n if (update.message_reaction) {\n await this.handleReaction(update);\n return;\n }\n\n const message = update.message ?? (update.edited_message?.text?.startsWith(\"/\") ? update.edited_message : undefined);\n if (!message?.from) return;\n\n const hasText = Boolean(message.text);\n const hasVoice = Boolean(message.voice || message.audio);\n const hasPhoto = Boolean(message.photo?.length);\n const hasDocument = Boolean(message.document);\n if (!hasText && !hasVoice && !hasPhoto && !hasDocument) return;\n\n const chatId = message.chat.id;\n const isGroup = message.chat.type === \"group\" || message.chat.type === \"supergroup\";\n const threadId = isGroup ? message.message_thread_id : undefined;\n const messageId = message.message_id;\n const senderName = message.from.first_name || message.from.username || `id:${message.from.id}`;\n const bufKey = threadId != null ? `tg:${chatId}:${threadId}` : `tg:${chatId}`;\n\n let text = message.text ?? \"\";\n let isVoiceNote = false;\n let voiceFileId: string | undefined;\n\n // --- Voice note pre-processing ---\n if (hasVoice && !hasText) {\n if (!this.deps.pipeline.sttConfig) {\n if (isGroup) {\n this.deps.conversationBuffer.push(bufKey, senderName, \"[voice note - STT disabled]\");\n } else if (this.securityGate.authorizeById(String(message.from?.id))) {\n await this.api.sendMessage(chatId, \"\uD83C\uDFA4 Voice notes require STT (set GROQ_API_KEY).\", { message_thread_id: threadId });\n }\n return;\n }\n\n if (!this.securityGate.authorizeById(String(message.from?.id))) {\n if (isGroup) this.deps.conversationBuffer.push(bufKey, senderName, \"[voice note]\");\n return;\n }\n\n // For groups: we need to transcribe first to check for bot mention\n if (isGroup) {\n try {\n await this.setReaction(String(chatId), messageId, \"\uD83D\uDC40\");\n const voiceFile = message.voice || message.audio;\n const audioBuffer = await this.downloadVoice(voiceFile!.file_id);\n const { transcribeAudio } = await import(\"../../components/stt.js\");\n const result = await transcribeAudio(audioBuffer, \"voice.ogg\", this.deps.pipeline.sttConfig!);\n const transcript = result.text;\n\n if (!transcript) {\n await this.setReaction(String(chatId), messageId, \"\");\n this.deps.conversationBuffer.push(bufKey, senderName, \"[voice note - empty]\");\n return;\n }\n\n const mentionRe = new RegExp(`@?${this.botUsername}\\\\b`, \"i\");\n if (!mentionRe.test(transcript) && !transcript.startsWith(\"/\")) {\n await this.setReaction(String(chatId), messageId, \"\");\n this.deps.conversationBuffer.push(bufKey, senderName, `[voice] ${transcript}`);\n logDebug(TAG, `Buffered voice transcript: \"${transcript.slice(0, 60)}\"`);\n return;\n }\n text = transcript.replace(mentionRe, \"\").trim();\n isVoiceNote = true;\n if (!text) { await this.setReaction(String(chatId), messageId, \"\"); return; }\n } catch (err) {\n logError(TAG, \"Voice transcription failed\", err);\n await this.setReaction(String(chatId), messageId, \"\");\n return;\n }\n } else {\n // DM voice: let pipeline handle STT\n isVoiceNote = true;\n voiceFileId = (message.voice || message.audio)!.file_id;\n }\n }\n\n // --- Group text filtering ---\n if (!isVoiceNote && isGroup) {\n const mentionRe = new RegExp(`@${this.botUsername}\\\\b`, \"i\");\n const isMention = mentionRe.test(text);\n const isCommand = text.startsWith(\"/\");\n\n if (!isMention && !isCommand) {\n this.deps.conversationBuffer.push(bufKey, senderName, text);\n logDebug(TAG, `Buffered group msg from ${senderName}: \"${text.slice(0, 60)}\"`);\n return;\n }\n\n if (isMention) {\n text = text.replace(mentionRe, \"\").trim();\n if (!text) return;\n }\n }\n\n // --- Security ---\n if (!isVoiceNote && !this.securityGate.authorizeById(String(message.from?.id))) {\n if (isGroup) this.deps.conversationBuffer.push(bufKey, senderName, text);\n logWarn(TAG, `Unauthorized user ${message.from.id}`);\n return;\n }\n\n // --- Photo/document handling ---\n let mediaPath: string | undefined;\n\n if ((hasPhoto || hasDocument) && this.securityGate.authorizeById(String(message.from?.id))) {\n try {\n const { saveInboundMedia } = await import(\"../../components/media-utils.js\");\n let fileId: string;\n let extHint: string | undefined;\n let claimedMime: string | undefined;\n\n if (hasPhoto) {\n const photo = message.photo![message.photo!.length - 1]!;\n fileId = photo.file_id;\n extHint = \".jpg\";\n } else {\n fileId = message.document!.file_id;\n extHint = message.document!.file_name ? \".\" + (message.document!.file_name.split(\".\").pop() ?? \"\") : undefined;\n claimedMime = message.document!.mime_type;\n }\n\n const buf = await this.downloadVoice(fileId); // reuse file download\n const saved = await saveInboundMedia(buf, chatId, { extHint, claimedMime });\n if (saved) {\n mediaPath = saved.path;\n if (!text) text = message.caption ?? `User sent a ${saved.isImage ? \"photo\" : \"file\"}.`;\n } else {\n if (!text) text = \"\u26A0\uFE0F File too large (max 16MB).\";\n }\n } catch (err) {\n logWarn(TAG, `Media download failed: ${err instanceof Error ? err.message : String(err)}`);\n if (!text) text = \"\u26A0\uFE0F Failed to download media.\";\n }\n }\n\n // --- Reply context ---\n const reply = message.reply_to_message;\n if (reply?.text) {\n const replyFrom = reply.from?.first_name ?? \"someone\";\n text = `[Replying to ${replyFrom}: \"${reply.text.slice(0, 500)}\"]\\n${text}`;\n }\n\n // --- Reply-to-photo: re-download and inject (#668) ---\n if (reply?.photo?.length && !mediaPath && this.securityGate.authorizeById(String(message.from?.id))) {\n try {\n const { saveInboundMedia } = await import(\"../../components/media-utils.js\");\n const photo = reply.photo[reply.photo.length - 1]!;\n const buf = await this.downloadVoice(photo.file_id);\n const saved = await saveInboundMedia(buf, chatId, { extHint: \".jpg\" });\n if (saved) mediaPath = saved.path;\n } catch (err) {\n logWarn(TAG, `Reply-to-photo download failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // --- Dispatch to pipeline ---\n const resolvedUser = loadUsers().byPlatformId.get(\"telegram:\" + message.from.id)?.userId ?? \"unknown\";\n const inbound: InboundMessage = {\n platform: \"telegram\",\n channelId: String(chatId),\n userId: resolvedUser,\n senderId: String(message.from.id),\n senderName,\n text,\n timestamp: message.date * 1000,\n threadId: threadId != null ? String(threadId) : undefined,\n messageId,\n isGroup,\n isVoice: isVoiceNote,\n voiceFileId,\n mediaPath,\n rawPlatformData: message,\n };\n\n // /stop, /ctrlc, /restart now handled in commandMiddleware (platform-agnostic)\n\n // #512: commands bypass the sequential await \u2014 execute immediately even if agent is mid-stream\n if (text.startsWith(\"/\") && !text.startsWith(\"//\")) {\n if (!this.deps.pipeline?.sessionManager) return; // pipeline not wired yet\n handleInboundMessage(inbound, this, this.deps.pipeline).catch((err) => {\n logError(TAG, `Command dispatch error: ${err instanceof Error ? err.message : String(err)}`);\n });\n return;\n }\n\n if (!this.deps.pipeline?.sessionManager) return; // pipeline not wired yet\n await handleInboundMessage(inbound, this, this.deps.pipeline);\n }\n\n private async handleReaction(update: TelegramUpdate): Promise<void> {\n const reaction = update.message_reaction!;\n const user = reaction.user;\n if (!user) { logDebug(TAG, \"Reaction update missing user field\"); return; }\n if (user.is_bot) return;\n\n const oldEmojis = new Set(reaction.old_reaction.map((r) => r.emoji));\n const added = reaction.new_reaction.filter((r) => !oldEmojis.has(r.emoji));\n if (added.length === 0) return;\n\n const senderName = user.first_name || user.username || `id:${user.id}`;\n const emojis = added.map((r) => r.emoji);\n logInfo(TAG, `Reaction ${emojis.join(\"\")} from ${senderName} on msg ${reaction.message_id}`);\n\n const isAuthorized = this.securityGate.authorizeById(String(user.id));\n const signal = formatReactionSignal(senderName, emojis);\n const chatId = reaction.chat.id;\n const route = routeReaction(isAuthorized, reaction.chat.type);\n\n if (isAuthorized && this.deps.memory) {\n const score = emojiToScore(emojis[0]!);\n const tag = emojiToTag(emojis[0]!);\n const updated = this.deps.memory.updateEmotionByPlatformId(loadUsers().byPlatformId.get(`telegram:${chatId}`)?.userId ?? \"master\", reaction.message_id, score, tag);\n if (updated) logDebug(TAG, `Emotion score ${score} set on platform msg ${reaction.message_id}`);\n\n // #824: Emoji reaction as recall quality feedback\n const { getRecalledIdsForMessage } = await import(\"../../components/message-pipeline.js\");\n const recalledIds = getRecalledIdsForMessage(reaction.message_id);\n if (recalledIds && recalledIds.length > 0) {\n if (score < 0) {\n this.deps.memory.bumpRejectedCount(recalledIds);\n logDebug(TAG, `Recall rejection: ${recalledIds.length} memories penalized (emoji ${emojis[0]})`);\n } else if (score > 0) {\n this.deps.memory.bumpCitedCount(recalledIds);\n logDebug(TAG, `Recall confirmed: ${recalledIds.length} memories boosted (emoji ${emojis[0]})`);\n }\n }\n }\n\n if (route === \"discard\") {\n logDebug(TAG, `Unauthorized reaction from user ${user.id}, discarding`);\n return;\n }\n\n if (route === \"buffer\") {\n const bufKey = `tg:${chatId}`;\n this.deps.conversationBuffer.push(bufKey, senderName, signal);\n logDebug(TAG, `Buffered reaction signal for group ${chatId}`);\n } else {\n const reactionUser = loadUsers().byPlatformId.get(\"telegram:\" + user.id)?.userId ?? \"unknown\";\n const activeId = this.deps.sessionManager.getActiveSessionId(reactionUser, \"telegram\");\n const { spin } = await import(\"../../components/spin.js\");\n const entry = spin.getSessionById(activeId);\n if (entry?.busy) {\n entry.queue.push({ msg: { userId: reactionUser, channelId: String(chatId), senderName, senderId: String(user.id), text: signal, messageId: reaction.message_id, platform: \"telegram\", timestamp: Date.now(), isGroup: false, isVoice: false }, adapter: this });\n logDebug(TAG, `Queued reaction signal for busy ${activeId} (${entry.queue.length} pending)`);\n } else {\n try {\n // #1271: reaction signal goes through spin() (model-call chokepoint)\n const { result: response } = await spin.spin({\n type: \"A\", sessionId: activeId, prompt: signal,\n userId: reactionUser, await: true,\n });\n logDebug(TAG, `Sent reaction signal to transport for chat ${chatId}`);\n if (response) {\n const { text, reactionEmoji, noReply } = cleanResponse(response);\n if (noReply) { /* silent */ }\n else if (reactionEmoji) {\n try { await this.api.setMessageReaction(chatId, reaction.message_id, [{ type: \"emoji\", emoji: reactionEmoji }]); }\n catch { await this.sendMessage(String(chatId), reactionEmoji); }\n } else if (text.trim()) {\n await this.sendMessage(String(chatId), text.trim());\n }\n }\n } catch (err) {\n logError(TAG, `Failed to send reaction signal for chat ${chatId}`, err);\n }\n }\n }\n }\n}\n", "import { getEnv } from \"../../components/env-schema.js\";\nimport { logDebug } from \"../../components/logger.js\";\nimport { logAndSwallow } from \"../../components/log-and-swallow.js\";\nimport type {\n TelegramUpdate,\n TelegramInlineKeyboardMarkup,\n} from \"../../types/index.js\";\nimport { readFileSync } from \"node:fs\";\nimport { basename } from \"node:path\";\n\ntype SendMessageOptions = {\n parse_mode?: \"MarkdownV2\" | \"HTML\";\n reply_markup?: TelegramInlineKeyboardMarkup;\n message_thread_id?: number;\n};\n\nconst TAG = \"telegram-api\";\n\n/** Options for fetchWithRetry. */\ninterface FetchRetryOpts {\n method: string;\n timeoutMs?: number;\n outerSignal?: AbortSignal;\n /** Retry on 4xx responses. Default false \u2014 4xx usually permanent (404 expired, 403 auth). */\n retryable4xx?: boolean;\n}\n\n/**\n * Thin wrapper around the Telegram Bot API using native fetch.\n * All methods throw on HTTP errors.\n */\nexport class TelegramApi {\n private readonly baseUrl: string;\n private readonly token: string;\n\n constructor(botToken: string) {\n this.token = botToken;\n this.baseUrl = `https://api.telegram.org/bot${botToken}`;\n }\n\n /** Get bot info. */\n async getMe(): Promise<{ id: number; username?: string }> {\n const res = await this.call(\"getMe\", {});\n return res as { id: number; username?: string };\n }\n\n async getChat(chatId: number): Promise<{ id: number; first_name?: string; username?: string }> {\n const res = await this.call(\"getChat\", { chat_id: chatId });\n return res as { id: number; first_name?: string; username?: string };\n }\n\n /** Get file path for downloading. */\n async getFile(fileId: string): Promise<{ file_id: string; file_path?: string; file_size?: number }> {\n const res = await this.call(\"getFile\", { file_id: fileId });\n return res as { file_id: string; file_path?: string; file_size?: number };\n }\n\n /** Download a file by its file_path (from getFile). Returns the raw buffer. */\n async downloadFile(filePath: string): Promise<Buffer> {\n const url = `https://api.telegram.org/file/bot${this.token}/${filePath}`;\n // 4xx = expired file / bad path / wrong token \u2192 permanent, don't retry\n const response = await this.fetchWithRetry(\n (signal) => fetch(url, { signal }),\n { method: \"downloadFile\", timeoutMs: getEnv().telegramFileTimeoutMs, retryable4xx: false },\n );\n const arrayBuffer = await response.arrayBuffer();\n return Buffer.from(arrayBuffer);\n }\n\n /** Send a text message. Returns the sent message_id. */\n async sendMessage(\n chatId: number,\n text: string,\n options?: SendMessageOptions,\n ): Promise<number> {\n const body: Record<string, unknown> = { chat_id: chatId, text, ...options };\n const res = await this.call(\"sendMessage\", body);\n return (res as { message_id: number }).message_id;\n }\n\n /** Edit an existing message's text. */\n async editMessageText(\n chatId: number,\n messageId: number,\n text: string,\n options?: { parse_mode?: string },\n ): Promise<void> {\n await this.call(\"editMessageText\", { chat_id: chatId, message_id: messageId, text, ...options });\n }\n\n /** Acknowledge a callback query (inline keyboard press). */\n async answerCallbackQuery(callbackQueryId: string): Promise<void> {\n await this.call(\"answerCallbackQuery\", { callback_query_id: callbackQueryId });\n }\n\n /** Send a chat action (typing indicator, etc.). */\n async sendChatAction(chatId: number, action: string = \"typing\", messageThreadId?: number): Promise<void> {\n const body: Record<string, unknown> = { chat_id: chatId, action };\n if (messageThreadId) body.message_thread_id = messageThreadId;\n await this.call(\"sendChatAction\", body);\n }\n\n /** Set an emoji reaction on a message. Pass empty array to remove. */\n async setMessageReaction(\n chatId: number,\n messageId: number,\n reaction: Array<{ type: \"emoji\"; emoji: string }>,\n ): Promise<void> {\n await this.call(\"setMessageReaction\", {\n chat_id: chatId,\n message_id: messageId,\n reaction,\n });\n }\n\n /** Send a voice note (OGG Opus). Returns the sent message_id. */\n async sendVoice(\n chatId: number,\n audioBuffer: Buffer,\n options?: { message_thread_id?: number },\n ): Promise<number> {\n // Factory rebuilds FormData per attempt \u2014 FormData is single-use in some runtimes.\n const makeForm = (): FormData => {\n const form = new FormData();\n form.append(\"chat_id\", String(chatId));\n const blob = new Blob([audioBuffer], { type: \"audio/webm\" });\n form.append(\"voice\", blob, \"voice.webm\");\n if (options?.message_thread_id) form.append(\"message_thread_id\", String(options.message_thread_id));\n return form;\n };\n const response = await this.fetchWithRetry(\n (signal) => fetch(`${this.baseUrl}/sendVoice`, { method: \"POST\", body: makeForm(), signal }),\n { method: \"sendVoice\" },\n );\n const json = (await response.json()) as { ok: boolean; result: { message_id: number } };\n if (!json.ok) throw new Error(\"Telegram API sendVoice returned ok=false\");\n return json.result.message_id;\n }\n\n /** Send a file from disk as a Telegram document. Returns the sent message_id. */\n async sendDocument(\n chatId: number,\n filePath: string,\n caption?: string,\n options?: { message_thread_id?: number },\n ): Promise<number> {\n const buf = readFileSync(filePath);\n const fileName = basename(filePath);\n // Factory rebuilds FormData per attempt \u2014 FormData is single-use in some runtimes.\n const makeForm = (): FormData => {\n const form = new FormData();\n form.append(\"chat_id\", String(chatId));\n const blob = new Blob([buf], { type: \"text/markdown\" });\n form.append(\"document\", blob, fileName);\n if (caption) form.append(\"caption\", caption.slice(0, 1024));\n if (options?.message_thread_id) form.append(\"message_thread_id\", String(options.message_thread_id));\n return form;\n };\n const response = await this.fetchWithRetry(\n (signal) => fetch(`${this.baseUrl}/sendDocument`, { method: \"POST\", body: makeForm(), signal }),\n { method: \"sendDocument\", timeoutMs: getEnv().telegramFileTimeoutMs },\n );\n const json = (await response.json()) as { ok: boolean; result: { message_id: number } };\n if (!json.ok) throw new Error(\"Telegram API sendDocument returned ok=false\");\n return json.result.message_id;\n }\n\n /** Register bot command menu (shown when user types /). */\n async setMyCommands(commands: Array<{ command: string; description: string }>): Promise<void> {\n await this.call(\"setMyCommands\", { commands });\n }\n\n /** Long-poll for updates. */\n async getUpdates(\n offset: number,\n timeout: number,\n signal?: AbortSignal,\n ): Promise<TelegramUpdate[]> {\n const body = {\n offset,\n timeout,\n allowed_updates: [\n \"message\",\n \"edited_message\",\n \"callback_query\",\n \"message_reaction\",\n ],\n };\n return (await this.call(\"getUpdates\", body, signal, (timeout + 10) * 1000)) as TelegramUpdate[];\n }\n\n private static readonly MAX_ATTEMPTS = 3;\n private static readonly BACKOFF = [1000, 3000, 9000];\n\n private static readonly PERMANENT_ERRORS = [\n /chat not found/i, /bot was blocked/i, /user is deactivated/i,\n /chat_id is empty/i, /forbidden/i, /not enough rights/i,\n /CHAT_WRITE_FORBIDDEN/i, /have no rights/i,\n /wrong file_path/i, /file is temporarily unavailable/i,\n ];\n\n private static isPermanent(msg: string): boolean {\n return this.PERMANENT_ERRORS.some(re => re.test(msg));\n }\n\n private static isTransient(msg: string): boolean {\n return /429|5\\d\\d|bad gateway|service unavailable|timeout|timed out|ETIMEDOUT|ECONNRESET|ECONNREFUSED|socket hang up|network/i.test(msg);\n }\n\n /**\n * Retry + timeout wrapper for any Telegram fetch. Returns the Response on 2xx,\n * throws on non-OK or transient-exhaustion. Factory MUST build a fresh request\n * per attempt (required for FormData; single-use in some runtimes).\n */\n private async fetchWithRetry(\n requestFn: (signal: AbortSignal) => Promise<Response>,\n opts: FetchRetryOpts,\n ): Promise<Response> {\n const timeoutMs = opts.timeoutMs ?? getEnv().telegramTimeoutMs;\n for (let attempt = 0; attempt < TelegramApi.MAX_ATTEMPTS; attempt++) {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(new Error(\"telegram timeout\")), timeoutMs);\n const composed = opts.outerSignal\n ? AbortSignal.any([opts.outerSignal, ctrl.signal])\n : ctrl.signal;\n\n try {\n const response = await requestFn(composed);\n if (!response.ok) {\n const text = await response.text().catch(err2 => { logAndSwallow(TAG, \"read TG API error body\", err2); return \"\"; });\n const err = new Error(`Telegram API ${opts.method} failed (${response.status}): ${text}`);\n // 4xx treated as permanent unless caller opts in\n if (response.status >= 400 && response.status < 500 && !opts.retryable4xx) throw err;\n throw err;\n }\n return response;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (TelegramApi.isPermanent(msg) || opts.outerSignal?.aborted) throw err;\n // Non-retryable 4xx (when retryable4xx is false) \u2014 already thrown above with status code\n if (!opts.retryable4xx && /failed \\([4]\\d\\d\\)/.test(msg)) throw err;\n if (attempt < TelegramApi.MAX_ATTEMPTS - 1 && TelegramApi.isTransient(msg)) {\n logDebug(TAG, `${opts.method} attempt ${attempt + 1}/${TelegramApi.MAX_ATTEMPTS} \u2014 ${msg.slice(0, 80)}`);\n await new Promise(r => setTimeout(r, TelegramApi.BACKOFF[attempt]!));\n continue;\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n }\n throw new Error(`Telegram API ${opts.method}: unreachable`);\n }\n\n private async call(\n method: string,\n body: Record<string, unknown>,\n signal?: AbortSignal,\n timeoutMs?: number,\n ): Promise<unknown> {\n const response = await this.fetchWithRetry(\n (composed) => fetch(`${this.baseUrl}/${method}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n signal: composed,\n }),\n { method, timeoutMs, outerSignal: signal },\n );\n const json = (await response.json()) as { ok: boolean; result: unknown };\n if (!json.ok) throw new Error(`Telegram API ${method} returned ok=false`);\n return json.result;\n }\n}\n", "import type { TelegramUpdate } from \"../../types/index.js\";\nimport type { TelegramApi } from \"./telegram-api.js\";\nimport type { OffsetStore } from \"./offset-store.js\";\nimport { logError, logWarn } from \"../../components/logger.js\";\n\n/**\n * Long-polls the Telegram Bot API for updates. Never self-terminates \u2014\n * uses exponential backoff with jitter on transient errors.\n *\n * Offset is advanced per-update AFTER the handler settles (success only).\n * Handlers run fire-and-forget to keep /stop responsive; the disk offset\n * only advances once the contiguous prefix of settled handlers is known.\n */\nexport class TelegramPoller {\n private readonly api: TelegramApi;\n private readonly pollTimeout: number;\n private readonly onUpdate: (update: TelegramUpdate) => void | Promise<void>;\n private readonly offsetStore: OffsetStore;\n private offset = 0;\n private lastProcessedId = 0;\n private running = false;\n private abortController: AbortController | null = null;\n\n /** Timestamp of last successful poll cycle. */\n lastPollAt = Date.now();\n\n constructor(\n api: TelegramApi,\n pollTimeoutS: number,\n onUpdate: (update: TelegramUpdate) => void | Promise<void>,\n offsetStore?: OffsetStore,\n ) {\n this.api = api;\n this.pollTimeout = pollTimeoutS;\n this.onUpdate = onUpdate;\n this.offsetStore = offsetStore ?? { read: async () => 0, write: async () => {} };\n }\n\n /** Start the long-poll loop. Non-blocking \u2014 runs in background. */\n async start(): Promise<void> {\n if (this.running) return;\n this.offset = await this.offsetStore.read();\n this.running = true;\n this.poll().catch((err) => {\n logError(\"poller\", \"Fatal error in poll loop\", err);\n });\n }\n\n /** Stop polling. Cancels any in-flight request. */\n stop(): void {\n this.running = false;\n this.abortController?.abort();\n this.abortController = null;\n }\n\n /** Inject a synthetic update into the handler (used for queued messages after sleep). */\n injectUpdate(update: TelegramUpdate): void {\n void this.onUpdate(update);\n }\n\n private async poll(): Promise<void> {\n let failures = 0;\n\n while (this.running) {\n try {\n this.abortController = new AbortController();\n const updates = await this.api.getUpdates(\n this.offset,\n this.pollTimeout,\n this.abortController.signal,\n );\n\n failures = 0;\n this.lastPollAt = Date.now();\n\n // Process each update: dispatch handler, advance offset only on success.\n // Handlers run in background (fire-and-forget) so /stop stays responsive.\n // We track settlements and advance the disk offset for the contiguous\n // prefix of successfully-handled updates.\n if (updates.length > 0) {\n const sorted = [...updates].sort((a, b) => a.update_id - b.update_id);\n\n for (const update of sorted) {\n if (update.update_id <= this.lastProcessedId) continue;\n try {\n const result = this.onUpdate(update);\n if (result instanceof Promise) {\n result.catch((err: unknown) => logError(\"poller\", \"Error in update handler\", err));\n }\n } catch (err) {\n logError(\"poller\", \"Error in update handler (sync)\", err);\n }\n }\n\n this.lastProcessedId = sorted[sorted.length - 1]!.update_id;\n this.offset = sorted[sorted.length - 1]!.update_id + 1;\n await this.offsetStore.write(this.offset);\n }\n } catch (err) {\n if (!this.running) break;\n\n failures++;\n const baseDelay = Math.min(2 ** failures * 1000, 60_000);\n const jitter = Math.random() * baseDelay;\n const delay = baseDelay + jitter;\n const is409 = String(err).includes(\"409\") || String(err).includes(\"terminated by other getUpdates\");\n const log = is409 ? (failures >= 50 ? logError : logWarn) : (failures < 3 ? logWarn : logError);\n if (is409 && failures < 50) {\n log(\"poller\", `409 conflict (attempt ${failures}) \u2014 another instance running, backing off`);\n } else {\n log(\"poller\", `Error (attempt ${failures}), retrying in ${Math.round(delay)}ms`, err);\n }\n await sleep(delay);\n }\n }\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n", "/**\n * Atomic offset store for Telegram poller.\n * Persists the last-acked update_id to disk so crash recovery resumes\n * from the correct position. Writes atomically (temp + rename).\n */\n\nimport { readFile, writeFile, rename, mkdir } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { logAndSwallow } from \"../../components/log-and-swallow.js\";\n\nconst TAG = \"offset_store\";\n\nexport interface OffsetStore {\n read(): Promise<number>;\n write(offset: number): Promise<void>;\n}\n\n/** File-backed offset store with atomic writes. */\nexport function createFileOffsetStore(filePath: string): OffsetStore {\n let pending: Promise<void> = Promise.resolve();\n\n return {\n async read(): Promise<number> {\n try {\n const raw = await readFile(filePath, \"utf-8\");\n const val = parseInt(raw.trim(), 10);\n return Number.isFinite(val) ? val : 0;\n } catch (err) {\n logAndSwallow(TAG, \"read offset file\", err);\n return 0;\n }\n },\n write(offset: number): Promise<void> {\n // Serialize writes via promise chain (async mutex).\n pending = pending.then(async () => {\n const tmp = filePath + \".tmp\";\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(tmp, String(offset), \"utf-8\");\n await rename(tmp, filePath);\n }).catch(err => logAndSwallow(TAG, \"write offset file\", err));\n return pending;\n },\n };\n}\n\n/** In-memory offset store for tests. */\nexport function createMemoryOffsetStore(initial = 0): OffsetStore & { value: number } {\n const store = {\n value: initial,\n async read(): Promise<number> { return store.value; },\n async write(offset: number): Promise<void> { store.value = offset; },\n };\n return store;\n}\n", "/**\n * telegram-model-picker.ts \u2014 Extracted model picker callback handlers.\n * Handles: mb:, mslot:, mprov:, mpos:, mprov2:, mset:, model: prefixes.\n */\nimport type { TelegramApi } from \"./telegram-api.js\";\nimport { getEnv } from \"../../components/env-schema.js\";\nimport { logAndSwallow } from \"../../components/log-and-swallow.js\";\n\nconst TAG = \"telegram\";\n\nexport interface PickerState {\n _pendingSlot: string | undefined;\n _modelPickerCache: string[];\n}\n\nexport interface PickerDeps {\n transport: { setModel?: (m: string) => Promise<void> | void; switchProvider?: (o: unknown) => void; [k: string]: unknown };\n pipeline: { rebuildTransport?: () => Promise<void>; [k: string]: unknown };\n resetSessionForModelSwitch: (chatId: number, reason?: string) => Promise<void>;\n}\n\nconst MODEL_PREFIXES = [\"mb:\", \"mslot:\", \"mprov:\", \"mpos:\", \"mprov2:\", \"mset:\", \"model:\"];\n\nexport function isModelPickerCallback(data: string): boolean {\n return MODEL_PREFIXES.some(p => data.startsWith(p));\n}\n\nexport async function handleModelPickerCallback(\n data: string, chatId: number, api: TelegramApi, state: PickerState, deps: PickerDeps,\n): Promise<void> {\n\n if (data.startsWith(\"mb:\")) {\n const target = data.slice(3);\n if (!target) { await api.sendMessage(chatId, \"\uD83D\uDC4C Cancelled.\"); return; }\n if (target === \"a\") {\n const AGENT_LABELS = [\n { key: \"professor\", label: \"Professor\" },\n { key: \"dreamy\", label: \"Dreamy (sleep)\" },\n { key: \"browsie\", label: \"Browsie (browse)\" },\n { key: \"coding\", label: \"Cody (coding)\" },\n ];\n const buttons = AGENT_LABELS.map(a => [{ text: a.label, callback_data: `mslot:${a.key}` }]);\n buttons.push([{ text: \"\u2190 Cancel\", callback_data: \"mb:\" }]);\n await api.sendMessage(chatId, \"\uD83E\uDD16 Which agent to change?\", { reply_markup: { inline_keyboard: buttons } });\n return;\n }\n if (target.startsWith(\"p:\")) {\n const agent = target.slice(2);\n const { loadTransport, resolveAgent, getAvailableProviders, getModelsForProvider } = await import(\"../../components/transport-config.js\");\n const tc = loadTransport();\n if (!tc) { await api.sendMessage(chatId, \"\u274C transport.json not loaded\"); return; }\n let providers = getAvailableProviders(tc).filter(p => p.config.transport !== \"tmux\");\n if (providers.length === 0) { await api.sendMessage(chatId, \"\u274C No compatible providers\"); return; }\n const currentProvider = resolveAgent(agent, tc)?.providerName;\n const prefix = agent === \"professor\" ? \"mprov2:professor\" : `mprov:${agent}`;\n const buttons = providers.map(p => {\n const count = getModelsForProvider(p.name).length;\n const label = p.name === currentProvider ? `\u2713 ${p.name} (${count})` : `${p.name} (${count})`;\n return [{ text: label, callback_data: `${prefix}:${p.name}` }];\n });\n buttons.push([{ text: \"\u2190 Back\", callback_data: \"mb:a\" }]);\n await api.sendMessage(chatId, `\uD83D\uDD0C Pick provider:`, { reply_markup: { inline_keyboard: buttons } });\n return;\n }\n if (target.startsWith(\"s:\")) {\n const slot = target.slice(2);\n state._pendingSlot = slot;\n const { loadTransport, resolveAgent, getAvailableProviders, getModelsForProvider } = await import(\"../../components/transport-config.js\");\n const tc = loadTransport();\n if (!tc) { await api.sendMessage(chatId, \"\u274C transport.json not loaded\"); return; }\n let providers = getAvailableProviders(tc).filter(p => p.config.transport !== \"tmux\");\n const currentProvider = resolveAgent(\"professor\", tc)?.providerName;\n const slotLabel = slot === \"professor\" ? \"Main\" : slot.replace(\"professor_fb\", \"Fb\");\n const buttons = providers.map(p => {\n const count = getModelsForProvider(p.name).length;\n const label = p.name === currentProvider ? `\u2713 ${p.name} (${count})` : `${p.name} (${count})`;\n return [{ text: label, callback_data: `mprov2:${slot}:${p.name}` }];\n });\n buttons.push([{ text: \"\u2190 Back\", callback_data: \"mslot:professor\" }]);\n await api.sendMessage(chatId, `\uD83D\uDD0C Provider for ${slotLabel}:`, { reply_markup: { inline_keyboard: buttons } });\n return;\n }\n } else if (data.startsWith(\"mslot:\")) {\n const agent = data.slice(6);\n const { loadTransport, resolveAgent, getAvailableProviders, getModelsForProvider } = await import(\"../../components/transport-config.js\");\n const tc = loadTransport();\n if (!tc) { await api.sendMessage(chatId, \"\u274C transport.json not loaded\"); return; }\n\n if (agent === \"professor\") {\n const profResolved = resolveAgent(\"professor\", tc);\n const fallbacks = tc.agents[\"professor\"]?.fallbacks ?? [];\n const slots: Array<{ label: string; key: string }> = [\n { label: `\u2605 Main: ${profResolved?.model ?? \"?\"}`, key: `mpos:professor::professor` },\n ];\n for (let i = 0; i < fallbacks.length; i++) {\n slots.push({ label: `\u21B3 Fb${i + 1}: ${fallbacks[i]!.model}`, key: `mpos:professor::professor_fb${i + 1}` });\n }\n if (fallbacks.length < 3) {\n slots.push({ label: `\u21B3 Fb${fallbacks.length + 1}: (add)`, key: `mpos:professor::professor_fb${fallbacks.length + 1}` });\n }\n const buttons = slots.map(s => [{ text: s.label, callback_data: s.key }]);\n buttons.push([{ text: \"\u2190 Back\", callback_data: \"mb:a\" }]);\n await api.sendMessage(chatId, `\uD83C\uDFAF Which slot?`, { reply_markup: { inline_keyboard: buttons } });\n return;\n }\n\n let providers = getAvailableProviders(tc).filter(p => p.config.transport !== \"tmux\");\n if (providers.length === 0) { await api.sendMessage(chatId, \"\u274C No compatible providers\"); return; }\n const currentProvider = resolveAgent(agent, tc)?.providerName;\n const buttons = providers.map(p => {\n const count = getModelsForProvider(p.name).length;\n const label = p.name === currentProvider ? `\u2713 ${p.name} (${count})` : `${p.name} (${count})`;\n return [{ text: label, callback_data: `mprov:${agent}:${p.name}` }];\n });\n buttons.push([{ text: \"\u2190 Back\", callback_data: \"mb:a\" }]);\n await api.sendMessage(chatId, `\uD83D\uDD0C Pick provider:`, { reply_markup: { inline_keyboard: buttons } });\n\n } else if (data.startsWith(\"mprov:\")) {\n const [, agent, providerName] = data.split(\":\");\n const { loadTransport, getModelsForProvider, formatRank, formatCost } = await import(\"../../components/transport-config.js\");\n const tc = loadTransport();\n let models = getModelsForProvider(providerName!);\n const providerConfig = tc?.providers[providerName!];\n if (providerConfig?.transport === \"api\") models = models.filter(m => !m.entry.status || m.entry.status === \"alive\");\n if (models.length === 0) { await api.sendMessage(chatId, `\u274C No alive models for ${providerName}`); return; }\n state._pendingSlot = agent;\n state._modelPickerCache = models.map(m => m.id);\n const buttons = models.map((m, i) => [{ text: `${m.id} (${formatRank(m.entry.rank)}, ${formatCost(m.entry.cost)})`, callback_data: `mset:${providerName}:${i}` }]);\n buttons.push([{ text: \"\u2190 Back\", callback_data: `mb:p:${agent}` }]);\n await api.sendMessage(chatId, `\uD83D\uDCCB Models on ${providerName}:`, { reply_markup: { inline_keyboard: buttons } });\n\n } else if (data.startsWith(\"mpos:\")) {\n const [, , , slot] = data.split(\":\");\n const { loadTransport, resolveAgent, getAvailableProviders, getModelsForProvider } = await import(\"../../components/transport-config.js\");\n const tc = loadTransport();\n if (!tc) { await api.sendMessage(chatId, \"\u274C transport.json not loaded\"); return; }\n let providers = getAvailableProviders(tc).filter(p => p.config.transport !== \"tmux\");\n const profResolved = resolveAgent(\"professor\", tc);\n const mainTransport = profResolved?.provider.transport;\n if (slot && slot.startsWith(\"professor_fb\") && mainTransport) {\n if (mainTransport === \"api\") { providers = providers.filter(p => p.config.transport === \"api\"); }\n else { providers = providers.filter(p => p.name === profResolved!.providerName); }\n }\n if (providers.length === 0) { await api.sendMessage(chatId, \"\u274C No compatible providers for this slot\"); return; }\n const currentProvider = profResolved?.providerName;\n const slotLabel = slot === \"professor\" ? \"Main\" : slot!.replace(\"professor_fb\", \"Fb\");\n const buttons = providers.map(p => {\n const count = getModelsForProvider(p.name).length;\n const label = p.name === currentProvider ? `\u2713 ${p.name} (${count})` : `${p.name} (${count})`;\n return [{ text: label, callback_data: `mprov2:${slot}:${p.name}` }];\n });\n buttons.push([{ text: \"\u2190 Back\", callback_data: \"mslot:professor\" }]);\n await api.sendMessage(chatId, `\uD83D\uDD0C Provider for ${slotLabel}:`, { reply_markup: { inline_keyboard: buttons } });\n\n } else if (data.startsWith(\"mprov2:\")) {\n const [, slot, providerName] = data.split(\":\");\n const { getModelsForProvider, formatRank, formatCost, loadTransport } = await import(\"../../components/transport-config.js\");\n const tc = loadTransport();\n const providerConfig = tc?.providers[providerName!];\n let models = getModelsForProvider(providerName!);\n if (providerConfig?.transport === \"api\") models = models.filter(m => !m.entry.status || m.entry.status === \"alive\");\n if (models.length === 0) { await api.sendMessage(chatId, `\u274C No alive models for ${providerName}`); return; }\n state._pendingSlot = slot;\n const slotLabel = slot === \"professor\" ? \"Main\" : slot!.replace(\"professor_fb\", \"Fb\");\n state._modelPickerCache = models.map(m => m.id);\n const buttons = models.map((m, i) => [{ text: `${m.id} (${formatRank(m.entry.rank)}, ${formatCost(m.entry.cost)})`, callback_data: `mset:${providerName}:${i}` }]);\n buttons.push([{ text: \"\u2190 Back\", callback_data: `mb:s:${slot}` }]);\n await api.sendMessage(chatId, `\uD83D\uDCCB Pick model for ${slotLabel}:`, { reply_markup: { inline_keyboard: buttons } });\n\n } else if (data.startsWith(\"mset:\")) {\n const parts = data.split(\":\");\n const providerName = parts[1]!;\n const modelIdx = parseInt(parts[2]!, 10);\n const model = Number.isFinite(modelIdx) && state._modelPickerCache[modelIdx]\n ? state._modelPickerCache[modelIdx]!\n : parts.slice(2).join(\":\");\n const slot = state._pendingSlot ?? \"professor\";\n state._pendingSlot = undefined;\n state._modelPickerCache = [];\n const { loadTransport, writeTransportConfig, resolveAgent, getModelsForProvider, validateProviderReady, formatValidationError } = await import(\"../../components/transport-config.js\");\n const tc = loadTransport();\n if (!tc) { await api.sendMessage(chatId, \"\u274C transport.json not loaded\"); return; }\n\n const validModels = getModelsForProvider(providerName);\n if (!validModels.some(m => m.id === model)) { await api.sendMessage(chatId, `\u274C ${model} is not available on ${providerName}. Pick another.`); return; }\n\n const providerConfig = tc.providers[providerName];\n if (!providerConfig) { await api.sendMessage(chatId, `\u274C Provider ${providerName} not found`); return; }\n const validation = validateProviderReady(providerName, providerConfig, getEnv());\n if (!validation.ok) { await api.sendMessage(chatId, formatValidationError(providerName, validation)); return; }\n\n if (providerConfig?.transport === \"api\") {\n try {\n const endpoint = providerConfig.endpoint ?? \"\";\n const apiKey = getEnv().getApiKey(providerConfig.apiKeyEnv ?? \"API_KEY\");\n const headers: Record<string, string> = {};\n if (apiKey) headers[\"Authorization\"] = `Bearer ${apiKey}`;\n const res = await fetch(`${endpoint}/models`, { headers, signal: AbortSignal.timeout(5000) });\n if (!res.ok) { await api.sendMessage(chatId, `\u26A0\uFE0F ${providerName} unreachable (${res.status}). Try another?`); return; }\n } catch (err) { logAndSwallow(TAG, \"provider reachability check\", err); await api.sendMessage(chatId, `\u26A0\uFE0F ${providerName} unreachable. Try another?`); return; }\n }\n\n const agentKey = slot.startsWith(\"professor_fb\") ? \"professor\" : slot;\n const fbIndex = slot === \"professor_fb1\" ? 0 : slot === \"professor_fb2\" ? 1 : slot === \"professor_fb3\" ? 2 : -1;\n\n if (fbIndex >= 0) {\n if (!tc.agents[\"professor\"]) tc.agents[\"professor\"] = { model: \"\", provider: \"\" };\n if (!tc.agents[\"professor\"]!.fallbacks) tc.agents[\"professor\"]!.fallbacks = [];\n tc.agents[\"professor\"]!.fallbacks[fbIndex] = { model, provider: providerName };\n const { cleanDemotedModels } = await import(\"../../components/transport-config.js\");\n cleanDemotedModels(tc, model);\n writeTransportConfig(tc, `professor fallback ${fbIndex + 1} \u2192 ${model} (${providerName})`);\n await api.sendMessage(chatId, `\u2713 Fallback ${fbIndex + 1} \u2192 ${model} (${providerName})`);\n } else {\n const oldProvider = tc.agents[agentKey]?.provider;\n tc.agents[agentKey] = { ...tc.agents[agentKey]!, model, provider: providerName };\n const { cleanDemotedModels } = await import(\"../../components/transport-config.js\");\n cleanDemotedModels(tc, model);\n writeTransportConfig(tc, `${agentKey} \u2192 ${model} (${providerName})`);\n\n const providerChanged = oldProvider !== providerName;\n const isProfessor = agentKey === \"professor\";\n\n let oldType: string | undefined;\n let newType: string | undefined;\n let newResolved: ReturnType<typeof resolveAgent> | undefined;\n if (isProfessor && providerChanged) {\n const oldResolved = resolveAgent(\"_old\", { ...tc, agents: { ...tc.agents, _old: { model: \"\", provider: oldProvider! } } });\n newResolved = resolveAgent(\"_new\", { ...tc, agents: { ...tc.agents, _new: { model, provider: providerName } } });\n oldType = oldResolved?.provider.transport ?? \"api\";\n newType = newResolved?.provider.transport ?? \"api\";\n if (oldType !== newType) {\n const resetAgents: string[] = [];\n for (const [a, assignment] of Object.entries(tc.agents)) {\n if (a === \"professor\") continue;\n const ap = tc.providers[assignment.provider];\n if (ap && ap.transport !== newType) { tc.agents[a] = { model, provider: providerName }; resetAgents.push(a); }\n }\n if (resetAgents.length > 0) writeTransportConfig(tc, `cascade: ${resetAgents.join(\", \")} \u2192 ${providerName}`);\n }\n }\n\n if (isProfessor && !providerChanged && \"setModel\" in deps.transport) {\n await (deps.transport as unknown as { setModel: (m: string) => Promise<void> }).setModel(model);\n await api.sendMessage(chatId, `\u2713 Switched to ${model}`);\n } else if (isProfessor && providerChanged && oldType === newType && \"switchProvider\" in deps.transport) {\n try {\n const { FallbackPolicy } = await import(\"../../components/transport/fallback-policy.js\");\n const { ModelHealthRegistry } = await import(\"../../components/transport/model-health-registry.js\");\n const apiKey = getEnv().getApiKey(newResolved?.provider.apiKeyEnv ?? \"API_KEY\");\n const candidates = [{ endpoint: newResolved!.provider.endpoint!, apiKey, model, maxContext: newResolved!.contextWindow }];\n for (const fb of (tc.agents[\"professor\"]?.fallbacks ?? [])) {\n const fbRes = resolveAgent(\"_fb\", { ...tc, agents: { ...tc.agents, _fb: { model: fb.model, provider: fb.provider } } });\n if (fbRes) candidates.push({ endpoint: fbRes.provider.endpoint!, apiKey: fbRes.provider.apiKeyEnv ? getEnv().getApiKey(fbRes.provider.apiKeyEnv) : apiKey, model: fb.model, maxContext: fbRes.contextWindow });\n }\n const registry = (deps.transport as unknown as { policy?: { registry: InstanceType<typeof ModelHealthRegistry> } }).policy?.registry ?? new ModelHealthRegistry();\n const policy = new FallbackPolicy(candidates, registry);\n (deps.transport as unknown as { switchProvider: (o: unknown) => void }).switchProvider({ endpoint: newResolved!.provider.endpoint!, apiKey, model, maxContext: newResolved!.contextWindow, policy });\n } catch (err) {\n await api.sendMessage(chatId, `\u26A0\uFE0F Hot swap failed: ${err instanceof Error ? err.message : String(err)}. Use /reset to apply.`);\n return;\n }\n try { await api.sendMessage(chatId, `\u2713 Switched to ${model} (${providerName})`); } catch (err) { logAndSwallow(TAG, \"sendMessage model switch confirm\", err); }\n } else if (isProfessor && providerChanged) {\n const cascadeNote = oldType !== newType ? \" Subagents also reset.\" : \"\";\n try {\n if (deps.pipeline.rebuildTransport) await deps.pipeline.rebuildTransport();\n await deps.resetSessionForModelSwitch(chatId, \"cross-transport-switch\");\n await api.sendMessage(chatId, `\uD83D\uDD04 Switched to ${model} (${providerName}). Transport rebuilt.${cascadeNote}`);\n } catch (err) {\n await api.sendMessage(chatId, `\u26A0\uFE0F Transport rebuild failed: ${err instanceof Error ? err.message : String(err)}. Try /reset manually.`);\n }\n } else {\n await api.sendMessage(chatId, `\u2713 ${agentKey} \u2192 ${model} (${providerName})`);\n }\n }\n } else if (data.startsWith(\"model:\")) {\n const newModel = data.slice(6);\n if (\"setModel\" in deps.transport && typeof deps.transport.setModel === \"function\") {\n try {\n await deps.transport.setModel(newModel);\n await deps.resetSessionForModelSwitch(chatId);\n await api.sendMessage(chatId, `\uD83E\uDD16 Model switched \u2192 ${newModel}`);\n } catch (err) {\n await api.sendMessage(chatId, `\u274C Model switch failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["TAG", "TAG", "buttons", "TAG", "chatId"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }