@openacp/cli 0.6.10 → 2026.326.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (256) hide show
  1. package/dist/{action-detect-P7ZE4NEM.js → action-detect-QPA775HB.js} +2 -2
  2. package/dist/adapter-6ANPBSVU.js +16 -0
  3. package/dist/{discord-OMC52Y54.js → adapter-77ZCVABT.js} +520 -365
  4. package/dist/adapter-77ZCVABT.js.map +1 -0
  5. package/dist/{adapter-ZOANORGM.js → adapter-PQGHVG4K.js} +300 -93
  6. package/dist/adapter-PQGHVG4K.js.map +1 -0
  7. package/dist/{admin-6SYB6XCZ.js → admin-GBPZFFAU.js} +3 -3
  8. package/dist/agent-catalog-YHBFERYO.js +11 -0
  9. package/dist/{agent-dependencies-4OWBMZWZ.js → agent-dependencies-WS7Z2DFW.js} +2 -2
  10. package/dist/agent-registry-5LZT7CUB.js +9 -0
  11. package/dist/agent-store-VSHNY5GT.js +9 -0
  12. package/dist/{agents-QO7DKARJ.js → agents-BWU4MRRD.js} +3 -3
  13. package/dist/{api-client-CFQT5U7D.js → api-client-AQPNKXI2.js} +2 -2
  14. package/dist/api-server-3PYLRBCN.js +8 -0
  15. package/dist/api-server-CHVSUDBX.js +11 -0
  16. package/dist/{autostart-X33OGMX6.js → autostart-6JS565RY.js} +3 -3
  17. package/dist/chunk-2CX4IEEC.js +124 -0
  18. package/dist/chunk-2CX4IEEC.js.map +1 -0
  19. package/dist/{chunk-O7CPGUAI.js → chunk-4KGLKKQK.js} +4 -4
  20. package/dist/chunk-4KGLKKQK.js.map +1 -0
  21. package/dist/{chunk-W3EYKZNQ.js → chunk-4WXALZA3.js} +2 -2
  22. package/dist/chunk-4WXALZA3.js.map +1 -0
  23. package/dist/chunk-5OCGO27U.js +125 -0
  24. package/dist/chunk-5OCGO27U.js.map +1 -0
  25. package/dist/{chunk-OWP7RZ62.js → chunk-5ZOFBTOR.js} +118 -262
  26. package/dist/chunk-5ZOFBTOR.js.map +1 -0
  27. package/dist/chunk-6RXVEXF3.js +23 -0
  28. package/dist/chunk-6RXVEXF3.js.map +1 -0
  29. package/dist/{chunk-34M4OS5P.js → chunk-A6Y4GZM3.js} +3 -3
  30. package/dist/chunk-A6Y4GZM3.js.map +1 -0
  31. package/dist/chunk-AD3X6DGK.js +166 -0
  32. package/dist/chunk-AD3X6DGK.js.map +1 -0
  33. package/dist/{chunk-7QJS2XBD.js → chunk-AFKX424Q.js} +2 -2
  34. package/dist/chunk-AFKX424Q.js.map +1 -0
  35. package/dist/chunk-APS6UEFU.js +259 -0
  36. package/dist/chunk-APS6UEFU.js.map +1 -0
  37. package/dist/chunk-BLQUXO7S.js +113 -0
  38. package/dist/chunk-BLQUXO7S.js.map +1 -0
  39. package/dist/{chunk-WTZDAYZX.js → chunk-BQ6FR32N.js} +3 -3
  40. package/dist/chunk-BQ6FR32N.js.map +1 -0
  41. package/dist/chunk-FNRSWA2K.js +1 -0
  42. package/dist/chunk-FQEBWOZR.js +3557 -0
  43. package/dist/chunk-FQEBWOZR.js.map +1 -0
  44. package/dist/{chunk-4CTX774K.js → chunk-GJOY37U7.js} +4 -4
  45. package/dist/chunk-GJOY37U7.js.map +1 -0
  46. package/dist/{chunk-I7WC6E5S.js → chunk-HVBNCPAY.js} +2 -2
  47. package/dist/chunk-HVBNCPAY.js.map +1 -0
  48. package/dist/{chunk-2HMQOC7N.js → chunk-I3CGU5W7.js} +4 -4
  49. package/dist/chunk-I3CGU5W7.js.map +1 -0
  50. package/dist/{chunk-NVPG6JCL.js → chunk-L7YNNBI5.js} +3 -3
  51. package/dist/chunk-L7YNNBI5.js.map +1 -0
  52. package/dist/chunk-LGFWH3AE.js +26 -0
  53. package/dist/chunk-LGFWH3AE.js.map +1 -0
  54. package/dist/chunk-MLF4W5R6.js +101 -0
  55. package/dist/chunk-MLF4W5R6.js.map +1 -0
  56. package/dist/{chunk-KIRH7TUJ.js → chunk-MTSDOSXS.js} +3 -3
  57. package/dist/chunk-MTSDOSXS.js.map +1 -0
  58. package/dist/{chunk-J4SJTKIK.js → chunk-NAM4ERUW.js} +3 -3
  59. package/dist/chunk-NAM4ERUW.js.map +1 -0
  60. package/dist/{chunk-MKHUZLII.js → chunk-NBFIBGAT.js} +39 -25
  61. package/dist/chunk-NBFIBGAT.js.map +1 -0
  62. package/dist/{chunk-BNLGTZ34.js → chunk-O5RG4YZY.js} +3 -3
  63. package/dist/chunk-O5RG4YZY.js.map +1 -0
  64. package/dist/{chunk-JHYXKVV2.js → chunk-ODUM3D6X.js} +2 -2
  65. package/dist/chunk-ODUM3D6X.js.map +1 -0
  66. package/dist/chunk-OYSAN7UX.js +15 -0
  67. package/dist/chunk-OYSAN7UX.js.map +1 -0
  68. package/dist/chunk-P4SNGQNI.js +158 -0
  69. package/dist/chunk-P4SNGQNI.js.map +1 -0
  70. package/dist/{chunk-2CJ46J3C.js → chunk-PPSMUECX.js} +3 -3
  71. package/dist/chunk-PPSMUECX.js.map +1 -0
  72. package/dist/chunk-Q6ZXJTZB.js +56 -0
  73. package/dist/chunk-Q6ZXJTZB.js.map +1 -0
  74. package/dist/{chunk-XANPHG7W.js → chunk-QSDZDHNS.js} +7 -7
  75. package/dist/chunk-QSDZDHNS.js.map +1 -0
  76. package/dist/{chunk-33RP6K2O.js → chunk-QVMEF6FB.js} +6 -6
  77. package/dist/chunk-QVMEF6FB.js.map +1 -0
  78. package/dist/chunk-QWP76EBW.js +536 -0
  79. package/dist/chunk-QWP76EBW.js.map +1 -0
  80. package/dist/{chunk-V5GZQEIY.js → chunk-RBYBSSGO.js} +4 -4
  81. package/dist/chunk-RBYBSSGO.js.map +1 -0
  82. package/dist/{chunk-CS3KCJ5D.js → chunk-RKB2ZK6S.js} +555 -383
  83. package/dist/chunk-RKB2ZK6S.js.map +1 -0
  84. package/dist/{chunk-UKT3G5IA.js → chunk-SHTGQGAU.js} +7 -7
  85. package/dist/chunk-SHTGQGAU.js.map +1 -0
  86. package/dist/chunk-SNPYTMPR.js +51 -0
  87. package/dist/chunk-SNPYTMPR.js.map +1 -0
  88. package/dist/chunk-UB2QB6DE.js +124 -0
  89. package/dist/chunk-UB2QB6DE.js.map +1 -0
  90. package/dist/chunk-UNJUWWQO.js +1108 -0
  91. package/dist/chunk-UNJUWWQO.js.map +1 -0
  92. package/dist/chunk-V2M243KZ.js +445 -0
  93. package/dist/chunk-V2M243KZ.js.map +1 -0
  94. package/dist/chunk-V5JT5TPD.js +97 -0
  95. package/dist/chunk-V5JT5TPD.js.map +1 -0
  96. package/dist/chunk-W26AUH5B.js +61 -0
  97. package/dist/chunk-W26AUH5B.js.map +1 -0
  98. package/dist/chunk-WAAD23KY.js +222 -0
  99. package/dist/chunk-WAAD23KY.js.map +1 -0
  100. package/dist/chunk-WIIZNPCR.js +150 -0
  101. package/dist/chunk-WIIZNPCR.js.map +1 -0
  102. package/dist/chunk-WQCJTU2C.js +84 -0
  103. package/dist/chunk-WQCJTU2C.js.map +1 -0
  104. package/dist/chunk-WVLDNYOJ.js +150 -0
  105. package/dist/chunk-WVLDNYOJ.js.map +1 -0
  106. package/dist/chunk-WXVT3AOY.js +22 -0
  107. package/dist/chunk-WXVT3AOY.js.map +1 -0
  108. package/dist/{chunk-GAK6PIBW.js → chunk-XMMAGAT4.js} +2 -2
  109. package/dist/chunk-XMMAGAT4.js.map +1 -0
  110. package/dist/chunk-Y64XWMJ4.js +212 -0
  111. package/dist/chunk-Y64XWMJ4.js.map +1 -0
  112. package/dist/chunk-YEULD3SG.js +62 -0
  113. package/dist/chunk-YEULD3SG.js.map +1 -0
  114. package/dist/chunk-ZHGPZBS4.js +49 -0
  115. package/dist/chunk-ZHGPZBS4.js.map +1 -0
  116. package/dist/{chunk-JKBFUAJK.js → chunk-ZSLHHQPQ.js} +2 -2
  117. package/dist/chunk-ZSLHHQPQ.js.map +1 -0
  118. package/dist/cli.js +496 -150
  119. package/dist/cli.js.map +1 -1
  120. package/dist/{config-6S355X75.js → config-I4FMCJGZ.js} +3 -3
  121. package/dist/config-editor-HNEKXRLQ.js +11 -0
  122. package/dist/{config-registry-AHYI4MYL.js → config-registry-CUMNXFGK.js} +2 -2
  123. package/dist/context-XM6E22LM.js +10 -0
  124. package/dist/core-plugins-VEUNFTMB.js +27 -0
  125. package/dist/{daemon-4CS6HMB5.js → daemon-PXO5QPCR.js} +4 -4
  126. package/dist/dev-loader-RDC5E2CW.js +50 -0
  127. package/dist/dev-loader-RDC5E2CW.js.map +1 -0
  128. package/dist/discord-NOJQ5PZO.js +8 -0
  129. package/dist/doctor-H72BZOPA.js +10 -0
  130. package/dist/{doctor-OLYBO3V3.js → doctor-RF6BHMCC.js} +5 -5
  131. package/dist/file-service-EUODJAIT.js +9 -0
  132. package/dist/file-service-EUODJAIT.js.map +1 -0
  133. package/dist/index.d.ts +1293 -188
  134. package/dist/index.js +387 -48
  135. package/dist/index.js.map +1 -1
  136. package/dist/{install-cloudflared-Z7VCGOVG.js → install-cloudflared-AN24L4DP.js} +5 -5
  137. package/dist/install-cloudflared-AN24L4DP.js.map +1 -0
  138. package/dist/install-context-XPWTFT3J.js +78 -0
  139. package/dist/install-context-XPWTFT3J.js.map +1 -0
  140. package/dist/{install-jq-HUYSQWKR.js → install-jq-CRVDJGF3.js} +5 -5
  141. package/dist/install-jq-CRVDJGF3.js.map +1 -0
  142. package/dist/{integrate-PNEHRY2I.js → integrate-5C6KSU6D.js} +2 -2
  143. package/dist/integrate-5C6KSU6D.js.map +1 -0
  144. package/dist/{log-NXABYJTT.js → log-LZ7FTRKG.js} +2 -2
  145. package/dist/log-LZ7FTRKG.js.map +1 -0
  146. package/dist/main-T5WVCCFN.js +715 -0
  147. package/dist/main-T5WVCCFN.js.map +1 -0
  148. package/dist/{menu-YY5MKHEK.js → menu-YDQ2LWAR.js} +2 -2
  149. package/dist/menu-YDQ2LWAR.js.map +1 -0
  150. package/dist/{new-session-FEO4J4VU.js → new-session-AVQCNXRG.js} +5 -5
  151. package/dist/new-session-AVQCNXRG.js.map +1 -0
  152. package/dist/notifications-D5BRDNSU.js +9 -0
  153. package/dist/notifications-D5BRDNSU.js.map +1 -0
  154. package/dist/plugin-create-JVCVUG6V.js +331 -0
  155. package/dist/plugin-create-JVCVUG6V.js.map +1 -0
  156. package/dist/plugin-registry-WB3DR67H.js +8 -0
  157. package/dist/plugin-registry-WB3DR67H.js.map +1 -0
  158. package/dist/{post-upgrade-CJG5I7M2.js → post-upgrade-XLHZ6ZB7.js} +8 -8
  159. package/dist/post-upgrade-XLHZ6ZB7.js.map +1 -0
  160. package/dist/read-text-file-IRZM3QLM.js +8 -0
  161. package/dist/read-text-file-IRZM3QLM.js.map +1 -0
  162. package/dist/security-YNRBW6S7.js +9 -0
  163. package/dist/security-YNRBW6S7.js.map +1 -0
  164. package/dist/{session-IUSI7P5S.js → session-KZFA6Z26.js} +4 -4
  165. package/dist/session-KZFA6Z26.js.map +1 -0
  166. package/dist/{settings-RQPAM4KC.js → settings-MFYM7CZO.js} +4 -4
  167. package/dist/settings-MFYM7CZO.js.map +1 -0
  168. package/dist/settings-manager-MD2U4ZV2.js +8 -0
  169. package/dist/settings-manager-MD2U4ZV2.js.map +1 -0
  170. package/dist/{chunk-LCRLAV4G.js → setup-BAI2F24H.js} +154 -492
  171. package/dist/setup-BAI2F24H.js.map +1 -0
  172. package/dist/slack-KH7E3VBS.js +8 -0
  173. package/dist/slack-KH7E3VBS.js.map +1 -0
  174. package/dist/speech-2GHQNRIO.js +9 -0
  175. package/dist/speech-2GHQNRIO.js.map +1 -0
  176. package/dist/telegram-ZDC3JQF2.js +8 -0
  177. package/dist/telegram-ZDC3JQF2.js.map +1 -0
  178. package/dist/tunnel-M47I7H4B.js +8 -0
  179. package/dist/tunnel-M47I7H4B.js.map +1 -0
  180. package/dist/{tunnel-service-CJLUH6SZ.js → tunnel-service-WADYHREX.js} +17 -17
  181. package/dist/tunnel-service-WADYHREX.js.map +1 -0
  182. package/dist/usage-WYNK6ZC5.js +10 -0
  183. package/dist/usage-WYNK6ZC5.js.map +1 -0
  184. package/dist/validators-6CLEZUBD.js +8 -0
  185. package/dist/validators-6CLEZUBD.js.map +1 -0
  186. package/dist/validators-WSTBNKRW.js +12 -0
  187. package/dist/validators-WSTBNKRW.js.map +1 -0
  188. package/package.json +1 -1
  189. package/dist/adapter-ZOANORGM.js.map +0 -1
  190. package/dist/agent-catalog-FC3HGDEQ.js +0 -11
  191. package/dist/agent-registry-WT4NXPYG.js +0 -9
  192. package/dist/agent-store-VZLFPTZU.js +0 -9
  193. package/dist/chunk-2CJ46J3C.js.map +0 -1
  194. package/dist/chunk-2HMQOC7N.js.map +0 -1
  195. package/dist/chunk-33RP6K2O.js.map +0 -1
  196. package/dist/chunk-34M4OS5P.js.map +0 -1
  197. package/dist/chunk-4CTX774K.js.map +0 -1
  198. package/dist/chunk-7QJS2XBD.js.map +0 -1
  199. package/dist/chunk-BNLGTZ34.js.map +0 -1
  200. package/dist/chunk-CS3KCJ5D.js.map +0 -1
  201. package/dist/chunk-GAK6PIBW.js.map +0 -1
  202. package/dist/chunk-I7WC6E5S.js.map +0 -1
  203. package/dist/chunk-J4SJTKIK.js.map +0 -1
  204. package/dist/chunk-JHYXKVV2.js.map +0 -1
  205. package/dist/chunk-JKBFUAJK.js.map +0 -1
  206. package/dist/chunk-KIRH7TUJ.js.map +0 -1
  207. package/dist/chunk-LBIKITQT.js +0 -22
  208. package/dist/chunk-LBIKITQT.js.map +0 -1
  209. package/dist/chunk-LCRLAV4G.js.map +0 -1
  210. package/dist/chunk-LGP2YGRL.js +0 -4880
  211. package/dist/chunk-LGP2YGRL.js.map +0 -1
  212. package/dist/chunk-MKHUZLII.js.map +0 -1
  213. package/dist/chunk-NAMYZIS5.js +0 -1
  214. package/dist/chunk-NVPG6JCL.js.map +0 -1
  215. package/dist/chunk-O7CPGUAI.js.map +0 -1
  216. package/dist/chunk-OWP7RZ62.js.map +0 -1
  217. package/dist/chunk-UKT3G5IA.js.map +0 -1
  218. package/dist/chunk-V5GZQEIY.js.map +0 -1
  219. package/dist/chunk-VOIJ6OY4.js +0 -63
  220. package/dist/chunk-VOIJ6OY4.js.map +0 -1
  221. package/dist/chunk-W3EYKZNQ.js.map +0 -1
  222. package/dist/chunk-WTZDAYZX.js.map +0 -1
  223. package/dist/chunk-XANPHG7W.js.map +0 -1
  224. package/dist/config-editor-QQTZMWGD.js +0 -13
  225. package/dist/discord-OMC52Y54.js.map +0 -1
  226. package/dist/doctor-HZZ5BSHB.js +0 -10
  227. package/dist/install-cloudflared-Z7VCGOVG.js.map +0 -1
  228. package/dist/install-jq-HUYSQWKR.js.map +0 -1
  229. package/dist/integrate-PNEHRY2I.js.map +0 -1
  230. package/dist/main-XOZCLFUK.js +0 -238
  231. package/dist/main-XOZCLFUK.js.map +0 -1
  232. package/dist/post-upgrade-CJG5I7M2.js.map +0 -1
  233. package/dist/setup-XHS4OMPM.js +0 -37
  234. package/dist/tunnel-service-CJLUH6SZ.js.map +0 -1
  235. /package/dist/{action-detect-P7ZE4NEM.js.map → action-detect-QPA775HB.js.map} +0 -0
  236. /package/dist/{admin-6SYB6XCZ.js.map → adapter-6ANPBSVU.js.map} +0 -0
  237. /package/dist/{agent-catalog-FC3HGDEQ.js.map → admin-GBPZFFAU.js.map} +0 -0
  238. /package/dist/{agent-dependencies-4OWBMZWZ.js.map → agent-catalog-YHBFERYO.js.map} +0 -0
  239. /package/dist/{agent-registry-WT4NXPYG.js.map → agent-dependencies-WS7Z2DFW.js.map} +0 -0
  240. /package/dist/{agent-store-VZLFPTZU.js.map → agent-registry-5LZT7CUB.js.map} +0 -0
  241. /package/dist/{agents-QO7DKARJ.js.map → agent-store-VSHNY5GT.js.map} +0 -0
  242. /package/dist/{api-client-CFQT5U7D.js.map → agents-BWU4MRRD.js.map} +0 -0
  243. /package/dist/{autostart-X33OGMX6.js.map → api-client-AQPNKXI2.js.map} +0 -0
  244. /package/dist/{chunk-NAMYZIS5.js.map → api-server-3PYLRBCN.js.map} +0 -0
  245. /package/dist/{config-6S355X75.js.map → api-server-CHVSUDBX.js.map} +0 -0
  246. /package/dist/{config-editor-QQTZMWGD.js.map → autostart-6JS565RY.js.map} +0 -0
  247. /package/dist/{config-registry-AHYI4MYL.js.map → chunk-FNRSWA2K.js.map} +0 -0
  248. /package/dist/{daemon-4CS6HMB5.js.map → config-I4FMCJGZ.js.map} +0 -0
  249. /package/dist/{doctor-HZZ5BSHB.js.map → config-editor-HNEKXRLQ.js.map} +0 -0
  250. /package/dist/{doctor-OLYBO3V3.js.map → config-registry-CUMNXFGK.js.map} +0 -0
  251. /package/dist/{log-NXABYJTT.js.map → context-XM6E22LM.js.map} +0 -0
  252. /package/dist/{menu-YY5MKHEK.js.map → core-plugins-VEUNFTMB.js.map} +0 -0
  253. /package/dist/{new-session-FEO4J4VU.js.map → daemon-PXO5QPCR.js.map} +0 -0
  254. /package/dist/{session-IUSI7P5S.js.map → discord-NOJQ5PZO.js.map} +0 -0
  255. /package/dist/{settings-RQPAM4KC.js.map → doctor-H72BZOPA.js.map} +0 -0
  256. /package/dist/{setup-XHS4OMPM.js.map → doctor-RF6BHMCC.js.map} +0 -0
@@ -1,7 +1,11 @@
1
1
  import {
2
2
  PRODUCT_GUIDE,
3
- dispatchMessage,
4
- evaluateNoise,
3
+ SendQueue,
4
+ ToolCallTracker
5
+ } from "./chunk-5ZOFBTOR.js";
6
+ import {
7
+ BaseRenderer,
8
+ MessagingAdapter,
5
9
  extractContentText,
6
10
  formatTokens,
7
11
  formatToolSummary,
@@ -11,38 +15,35 @@ import {
11
15
  splitMessage,
12
16
  stripCodeFences,
13
17
  truncateContent
14
- } from "./chunk-OWP7RZ62.js";
15
- import {
16
- CheckpointReader,
17
- DEFAULT_MAX_TOKENS
18
- } from "./chunk-LGP2YGRL.js";
19
- import {
20
- ChannelAdapter
21
- } from "./chunk-LBIKITQT.js";
22
- import {
23
- DoctorEngine
24
- } from "./chunk-NVPG6JCL.js";
18
+ } from "./chunk-V2M243KZ.js";
25
19
  import {
26
20
  buildMenuKeyboard,
27
21
  buildSkillMessages,
28
22
  handleClear,
29
23
  handleHelp,
30
24
  handleMenu
31
- } from "./chunk-7QJS2XBD.js";
25
+ } from "./chunk-AFKX424Q.js";
26
+ import {
27
+ DoctorEngine
28
+ } from "./chunk-L7YNNBI5.js";
29
+ import {
30
+ CheckpointReader,
31
+ DEFAULT_MAX_TOKENS
32
+ } from "./chunk-APS6UEFU.js";
32
33
  import {
33
34
  getConfigValue,
34
35
  getSafeFields,
35
36
  isHotReloadable,
36
37
  resolveOptions
37
- } from "./chunk-JHYXKVV2.js";
38
+ } from "./chunk-ODUM3D6X.js";
38
39
  import {
39
40
  createChildLogger
40
- } from "./chunk-GAK6PIBW.js";
41
+ } from "./chunk-XMMAGAT4.js";
41
42
 
42
- // src/adapters/telegram/adapter.ts
43
+ // src/plugins/telegram/adapter.ts
43
44
  import { Bot, InputFile } from "grammy";
44
45
 
45
- // src/adapters/telegram/topics.ts
46
+ // src/plugins/telegram/topics.ts
46
47
  async function ensureTopics(bot, chatId, config, saveConfig) {
47
48
  let notificationTopicId = config.notificationTopicId;
48
49
  let assistantTopicId = config.assistantTopicId;
@@ -79,10 +80,10 @@ function buildDeepLink(chatId, threadId, messageId) {
79
80
  return `https://t.me/c/${cleanId}/${threadId}`;
80
81
  }
81
82
 
82
- // src/adapters/telegram/commands/new-session.ts
83
+ // src/plugins/telegram/commands/new-session.ts
83
84
  import { InlineKeyboard as InlineKeyboard2 } from "grammy";
84
85
 
85
- // src/adapters/telegram/formatting.ts
86
+ // src/plugins/telegram/formatting.ts
86
87
  function escapeHtml(text) {
87
88
  if (!text) return "";
88
89
  return text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
@@ -169,6 +170,23 @@ function formatViewerLinks(links, filePath) {
169
170
  \u{1F4DD} <a href="${escapeHtml(links.diff)}">View diff${fileName ? ` \u2014 ${escapeHtml(fileName)}` : ""}</a>`;
170
171
  return text;
171
172
  }
173
+ function formatPlan(plan, verbosity = "medium") {
174
+ const { entries } = plan;
175
+ if (verbosity === "medium") {
176
+ const done = entries.filter((e) => e.status === "completed").length;
177
+ return `\u{1F4CB} <b>Plan:</b> ${done}/${entries.length} steps completed`;
178
+ }
179
+ const statusIcon = {
180
+ pending: "\u2B1C",
181
+ in_progress: "\u{1F504}",
182
+ completed: "\u2705"
183
+ };
184
+ const lines = entries.map(
185
+ (e, i) => `${statusIcon[e.status] || "\u2B1C"} ${i + 1}. ${escapeHtml(e.content)}`
186
+ );
187
+ return `<b>Plan:</b>
188
+ ${lines.join("\n")}`;
189
+ }
172
190
  function formatUsage(usage, verbosity = "medium") {
173
191
  const { tokensUsed, contextSize, cost } = usage;
174
192
  if (tokensUsed == null) return "\u{1F4CA} Usage data unavailable";
@@ -228,7 +246,7 @@ function splitMessage2(text, maxLength = 3800) {
228
246
  return splitMessage(text, maxLength);
229
247
  }
230
248
 
231
- // src/adapters/telegram/commands/admin.ts
249
+ // src/plugins/telegram/commands/admin.ts
232
250
  import { InlineKeyboard } from "grammy";
233
251
  var log = createChildLogger({ module: "telegram-cmd-admin" });
234
252
  function setupDangerousModeCallbacks(bot, core) {
@@ -586,7 +604,7 @@ async function handleRestart(ctx, core) {
586
604
  await core.requestRestart();
587
605
  }
588
606
 
589
- // src/adapters/telegram/commands/new-session.ts
607
+ // src/plugins/telegram/commands/new-session.ts
590
608
  var log2 = createChildLogger({ module: "telegram-cmd-new-session" });
591
609
  var pendingNewSessions = /* @__PURE__ */ new Map();
592
610
  var PENDING_TIMEOUT_MS = 5 * 60 * 1e3;
@@ -974,7 +992,7 @@ Or just the folder name like <code>my-project</code> (will use ${core.configMana
974
992
  });
975
993
  }
976
994
 
977
- // src/adapters/telegram/commands/session.ts
995
+ // src/plugins/telegram/commands/session.ts
978
996
  import { InlineKeyboard as InlineKeyboard3 } from "grammy";
979
997
  var log3 = createChildLogger({ module: "telegram-cmd-session" });
980
998
  async function handleCancel(ctx, core, assistant) {
@@ -1399,7 +1417,7 @@ async function handleSummaryCallback(ctx, core, chatId) {
1399
1417
  }
1400
1418
  }
1401
1419
 
1402
- // src/adapters/telegram/commands/agents.ts
1420
+ // src/plugins/telegram/commands/agents.ts
1403
1421
  import { InlineKeyboard as InlineKeyboard4 } from "grammy";
1404
1422
  var AGENTS_PER_PAGE = 6;
1405
1423
  async function handleAgents(ctx, core, page = 0) {
@@ -1598,10 +1616,10 @@ Downloading... ${bar} ${percent}%`, { parse_mode: "HTML" });
1598
1616
  };
1599
1617
  const result = await catalog.install(nameOrId, progress);
1600
1618
  if (result.ok) {
1601
- const { getAgentCapabilities } = await import("./agent-dependencies-4OWBMZWZ.js");
1619
+ const { getAgentCapabilities } = await import("./agent-dependencies-WS7Z2DFW.js");
1602
1620
  const caps = getAgentCapabilities(result.agentKey);
1603
1621
  if (caps.integration) {
1604
- const { installIntegration } = await import("./integrate-PNEHRY2I.js");
1622
+ const { installIntegration } = await import("./integrate-5C6KSU6D.js");
1605
1623
  const intResult = await installIntegration(result.agentKey, caps.integration);
1606
1624
  if (intResult.success) {
1607
1625
  try {
@@ -1668,10 +1686,10 @@ function buildProgressBar(percent) {
1668
1686
  return "\u2588".repeat(filled) + "\u2591".repeat(empty);
1669
1687
  }
1670
1688
 
1671
- // src/adapters/telegram/commands/integrate.ts
1689
+ // src/plugins/telegram/commands/integrate.ts
1672
1690
  import { InlineKeyboard as InlineKeyboard5 } from "grammy";
1673
1691
  async function handleIntegrate(ctx, _core) {
1674
- const { listIntegrations } = await import("./integrate-PNEHRY2I.js");
1692
+ const { listIntegrations } = await import("./integrate-5C6KSU6D.js");
1675
1693
  const agents = listIntegrations();
1676
1694
  const keyboard = new InlineKeyboard5();
1677
1695
  for (const agent of agents) {
@@ -1704,7 +1722,7 @@ function setupIntegrateCallbacks(bot, core) {
1704
1722
  } catch {
1705
1723
  }
1706
1724
  if (data === "i:back") {
1707
- const { listIntegrations } = await import("./integrate-PNEHRY2I.js");
1725
+ const { listIntegrations } = await import("./integrate-5C6KSU6D.js");
1708
1726
  const agents = listIntegrations();
1709
1727
  const keyboard2 = new InlineKeyboard5();
1710
1728
  for (const agent of agents) {
@@ -1724,7 +1742,7 @@ Select an agent to manage its integrations.`,
1724
1742
  const agentMatch = data.match(/^i:agent:(.+)$/);
1725
1743
  if (agentMatch) {
1726
1744
  const agentName2 = agentMatch[1];
1727
- const { getIntegration: getIntegration2 } = await import("./integrate-PNEHRY2I.js");
1745
+ const { getIntegration: getIntegration2 } = await import("./integrate-5C6KSU6D.js");
1728
1746
  const integration2 = getIntegration2(agentName2);
1729
1747
  if (!integration2) {
1730
1748
  await ctx.reply(`\u274C No integration available for '${escapeHtml(agentName2)}'.`, { parse_mode: "HTML" });
@@ -1751,7 +1769,7 @@ ${integration2.items.map((i) => `\u2022 <b>${escapeHtml(i.name)}</b> \u2014 ${es
1751
1769
  const action = actionMatch[1];
1752
1770
  const agentName = actionMatch[2];
1753
1771
  const itemId = actionMatch[3];
1754
- const { getIntegration } = await import("./integrate-PNEHRY2I.js");
1772
+ const { getIntegration } = await import("./integrate-5C6KSU6D.js");
1755
1773
  const integration = getIntegration(agentName);
1756
1774
  if (!integration) return;
1757
1775
  const item = integration.items.find((i) => i.id === itemId);
@@ -1786,7 +1804,7 @@ ${resultText}`,
1786
1804
  });
1787
1805
  }
1788
1806
 
1789
- // src/adapters/telegram/commands/resume.ts
1807
+ // src/plugins/telegram/commands/resume.ts
1790
1808
  import * as fs from "fs";
1791
1809
  import * as path from "path";
1792
1810
  import * as os from "os";
@@ -2063,7 +2081,7 @@ Or just the folder name (will use workspace baseDir)`,
2063
2081
  });
2064
2082
  }
2065
2083
 
2066
- // src/adapters/telegram/commands/settings.ts
2084
+ // src/plugins/telegram/commands/settings.ts
2067
2085
  import { InlineKeyboard as InlineKeyboard7 } from "grammy";
2068
2086
  var log5 = createChildLogger({ module: "telegram-settings" });
2069
2087
  function buildSettingsKeyboard(core) {
@@ -2235,7 +2253,7 @@ Tap to change:`, {
2235
2253
  await ctx.answerCallbackQuery();
2236
2254
  } catch {
2237
2255
  }
2238
- const { buildMenuKeyboard: buildMenuKeyboard3 } = await import("./menu-YY5MKHEK.js");
2256
+ const { buildMenuKeyboard: buildMenuKeyboard3 } = await import("./menu-YDQ2LWAR.js");
2239
2257
  try {
2240
2258
  await ctx.editMessageText(`<b>OpenACP Menu</b>
2241
2259
  Choose an action:`, {
@@ -2272,7 +2290,7 @@ function buildNestedUpdate(dotPath, value) {
2272
2290
  return result;
2273
2291
  }
2274
2292
 
2275
- // src/adapters/telegram/commands/doctor.ts
2293
+ // src/plugins/telegram/commands/doctor.ts
2276
2294
  import { InlineKeyboard as InlineKeyboard8 } from "grammy";
2277
2295
  var log6 = createChildLogger({ module: "telegram-cmd-doctor" });
2278
2296
  var pendingFixesStore = /* @__PURE__ */ new Map();
@@ -2378,7 +2396,7 @@ function setupDoctorCallbacks(bot) {
2378
2396
  });
2379
2397
  }
2380
2398
 
2381
- // src/adapters/telegram/commands/tunnel.ts
2399
+ // src/plugins/telegram/commands/tunnel.ts
2382
2400
  import { InlineKeyboard as InlineKeyboard9 } from "grammy";
2383
2401
  var log7 = createChildLogger({ module: "telegram-cmd-tunnel" });
2384
2402
  async function handleTunnel(ctx, core) {
@@ -2534,7 +2552,7 @@ function setupTunnelCallbacks(bot, core) {
2534
2552
  });
2535
2553
  }
2536
2554
 
2537
- // src/adapters/telegram/commands/index.ts
2555
+ // src/plugins/telegram/commands/index.ts
2538
2556
  function setupCommands(bot, core, chatId, assistant) {
2539
2557
  bot.command("new", (ctx) => handleNew(ctx, core, chatId, assistant));
2540
2558
  bot.command("newchat", (ctx) => handleNewChat(ctx, core, chatId));
@@ -2653,7 +2671,7 @@ var STATIC_COMMANDS = [
2653
2671
  { command: "resume", description: "Resume with conversation history from Entire checkpoints" }
2654
2672
  ];
2655
2673
 
2656
- // src/adapters/telegram/permissions.ts
2674
+ // src/plugins/telegram/permissions.ts
2657
2675
  import { InlineKeyboard as InlineKeyboard10 } from "grammy";
2658
2676
  import { nanoid } from "nanoid";
2659
2677
  var log8 = createChildLogger({ module: "telegram-permissions" });
@@ -2733,7 +2751,7 @@ ${escapeHtml(request.description)}`,
2733
2751
  }
2734
2752
  };
2735
2753
 
2736
- // src/adapters/telegram/assistant.ts
2754
+ // src/plugins/telegram/assistant.ts
2737
2755
  var log9 = createChildLogger({ module: "telegram-assistant" });
2738
2756
  async function spawnAssistant(core, adapter, assistantTopicId) {
2739
2757
  const config = core.configManager.get();
@@ -2934,7 +2952,7 @@ function redirectToAssistant(chatId, assistantTopicId) {
2934
2952
  return `\u{1F4AC} Please use the <a href="${link}">\u{1F916} Assistant</a> topic to chat with OpenACP.`;
2935
2953
  }
2936
2954
 
2937
- // src/adapters/telegram/activity.ts
2955
+ // src/plugins/telegram/activity.ts
2938
2956
  var log10 = createChildLogger({ module: "telegram:activity" });
2939
2957
  var THINKING_REFRESH_MS = 15e3;
2940
2958
  var THINKING_MAX_MS = 3 * 60 * 1e3;
@@ -3232,73 +3250,7 @@ var ActivityTracker = class {
3232
3250
  }
3233
3251
  };
3234
3252
 
3235
- // src/adapters/telegram/send-queue.ts
3236
- var TelegramSendQueue = class {
3237
- items = [];
3238
- processing = false;
3239
- lastExec = 0;
3240
- minInterval;
3241
- constructor(minInterval = 3e3) {
3242
- this.minInterval = minInterval;
3243
- }
3244
- enqueue(fn, opts) {
3245
- const type = opts?.type ?? "other";
3246
- const key = opts?.key;
3247
- return new Promise((resolve, reject) => {
3248
- if (type === "text" && key) {
3249
- const idx = this.items.findIndex(
3250
- (item) => item.type === "text" && item.key === key
3251
- );
3252
- if (idx !== -1) {
3253
- this.items[idx].resolve(void 0);
3254
- this.items[idx] = { fn, type, key, resolve, reject };
3255
- this.scheduleProcess();
3256
- return;
3257
- }
3258
- }
3259
- this.items.push({ fn, type, key, resolve, reject });
3260
- this.scheduleProcess();
3261
- });
3262
- }
3263
- onRateLimited() {
3264
- const remaining = [];
3265
- for (const item of this.items) {
3266
- if (item.type === "text") {
3267
- item.resolve(void 0);
3268
- } else {
3269
- remaining.push(item);
3270
- }
3271
- }
3272
- this.items = remaining;
3273
- }
3274
- scheduleProcess() {
3275
- if (this.processing) return;
3276
- if (this.items.length === 0) return;
3277
- const elapsed = Date.now() - this.lastExec;
3278
- const delay = Math.max(0, this.minInterval - elapsed);
3279
- this.processing = true;
3280
- setTimeout(() => void this.processNext(), delay);
3281
- }
3282
- async processNext() {
3283
- const item = this.items.shift();
3284
- if (!item) {
3285
- this.processing = false;
3286
- return;
3287
- }
3288
- try {
3289
- const result = await item.fn();
3290
- item.resolve(result);
3291
- } catch (err) {
3292
- item.reject(err);
3293
- } finally {
3294
- this.lastExec = Date.now();
3295
- this.processing = false;
3296
- this.scheduleProcess();
3297
- }
3298
- }
3299
- };
3300
-
3301
- // src/adapters/telegram/action-detect.ts
3253
+ // src/plugins/telegram/action-detect.ts
3302
3254
  import { nanoid as nanoid2 } from "nanoid";
3303
3255
  import { InlineKeyboard as InlineKeyboard11 } from "grammy";
3304
3256
  var CMD_NEW_RE = /\/new(?:\s+([^\s\u0080-\uFFFF]+)(?:\s+([^\s\u0080-\uFFFF]+))?)?/;
@@ -3455,32 +3407,25 @@ function setupActionCallbacks(bot, core, chatId, getAssistantSessionId) {
3455
3407
  });
3456
3408
  }
3457
3409
 
3458
- // src/adapters/telegram/tool-call-tracker.ts
3410
+ // src/plugins/telegram/tool-call-tracker.ts
3459
3411
  var log11 = createChildLogger({ module: "tool-call-tracker" });
3460
- var ToolCallTracker = class {
3412
+ var TelegramToolCallTracker = class {
3461
3413
  constructor(bot, chatId, sendQueue) {
3462
3414
  this.bot = bot;
3463
3415
  this.chatId = chatId;
3464
3416
  this.sendQueue = sendQueue;
3465
3417
  }
3466
- sessions = /* @__PURE__ */ new Map();
3418
+ tracker = new ToolCallTracker();
3419
+ /** Platform-specific ready-promise per tool call, keyed by `${sessionId}:${toolId}`. */
3420
+ readyMap = /* @__PURE__ */ new Map();
3467
3421
  async trackNewCall(sessionId, threadId, meta, verbosity = "medium") {
3468
- if (!this.sessions.has(sessionId)) {
3469
- this.sessions.set(sessionId, /* @__PURE__ */ new Map());
3470
- }
3471
3422
  let resolveReady;
3472
3423
  const ready = new Promise((r) => {
3473
3424
  resolveReady = r;
3474
3425
  });
3475
- this.sessions.get(sessionId).set(meta.id, {
3476
- msgId: 0,
3477
- name: meta.name,
3478
- kind: meta.kind,
3479
- rawInput: meta.rawInput,
3480
- viewerLinks: meta.viewerLinks,
3481
- viewerFilePath: meta.viewerFilePath,
3482
- ready
3483
- });
3426
+ const key = `${sessionId}:${meta.id}`;
3427
+ this.readyMap.set(key, { ready });
3428
+ this.tracker.track(sessionId, meta, "0");
3484
3429
  try {
3485
3430
  const msg = await this.sendQueue.enqueue(
3486
3431
  () => this.bot.api.sendMessage(this.chatId, formatToolCall(meta, verbosity), {
@@ -3489,53 +3434,60 @@ var ToolCallTracker = class {
3489
3434
  disable_notification: true
3490
3435
  })
3491
3436
  );
3492
- const toolEntry = this.sessions.get(sessionId).get(meta.id);
3493
- toolEntry.msgId = msg.message_id;
3437
+ const tracked = this.tracker.update(sessionId, meta.id, meta.status ?? "running");
3438
+ if (tracked) {
3439
+ tracked.messageId = String(msg.message_id);
3440
+ }
3494
3441
  } finally {
3495
3442
  resolveReady();
3496
3443
  }
3497
3444
  }
3498
3445
  async updateCall(sessionId, meta, verbosity = "medium") {
3499
- const toolState = this.sessions.get(sessionId)?.get(meta.id);
3500
- if (!toolState) return;
3501
- if (meta.viewerLinks) {
3502
- toolState.viewerLinks = meta.viewerLinks;
3503
- log11.debug(
3504
- { toolId: meta.id, viewerLinks: meta.viewerLinks },
3505
- "Accumulated viewerLinks"
3506
- );
3507
- }
3508
- if (meta.viewerFilePath) toolState.viewerFilePath = meta.viewerFilePath;
3509
- if (meta.name) toolState.name = meta.name;
3510
- if (meta.kind) toolState.kind = meta.kind;
3446
+ const key = `${sessionId}:${meta.id}`;
3447
+ const readyState = this.readyMap.get(key);
3448
+ const tracked = this.tracker.update(sessionId, meta.id, meta.status, {
3449
+ viewerLinks: meta.viewerLinks,
3450
+ viewerFilePath: meta.viewerFilePath,
3451
+ name: meta.name,
3452
+ kind: meta.kind
3453
+ });
3454
+ if (!tracked) return;
3511
3455
  const isTerminal = meta.status === "completed" || meta.status === "failed";
3512
3456
  if (!isTerminal) return;
3513
- await toolState.ready;
3457
+ if (readyState) {
3458
+ await readyState.ready;
3459
+ }
3460
+ const msgId = Number(tracked.messageId);
3514
3461
  log11.debug(
3515
3462
  {
3516
3463
  toolId: meta.id,
3517
3464
  status: meta.status,
3518
- hasViewerLinks: !!toolState.viewerLinks,
3519
- viewerLinks: toolState.viewerLinks,
3520
- name: toolState.name,
3521
- msgId: toolState.msgId
3465
+ hasViewerLinks: !!tracked.viewerLinks,
3466
+ viewerLinks: tracked.viewerLinks,
3467
+ name: tracked.name,
3468
+ msgId
3522
3469
  },
3523
3470
  "Tool completed, preparing edit"
3524
3471
  );
3525
3472
  const merged = {
3526
- ...meta,
3527
- name: toolState.name,
3528
- kind: toolState.kind,
3529
- rawInput: toolState.rawInput,
3530
- viewerLinks: toolState.viewerLinks,
3531
- viewerFilePath: toolState.viewerFilePath
3473
+ id: meta.id,
3474
+ name: tracked.name,
3475
+ kind: tracked.kind,
3476
+ rawInput: tracked.rawInput,
3477
+ viewerLinks: tracked.viewerLinks,
3478
+ viewerFilePath: tracked.viewerFilePath,
3479
+ displaySummary: tracked.displaySummary,
3480
+ displayTitle: tracked.displayTitle,
3481
+ displayKind: tracked.displayKind,
3482
+ status: meta.status,
3483
+ content: meta.content
3532
3484
  };
3533
3485
  const formattedText = formatToolUpdate(merged, verbosity);
3534
3486
  try {
3535
3487
  await this.sendQueue.enqueue(
3536
3488
  () => this.bot.api.editMessageText(
3537
3489
  this.chatId,
3538
- toolState.msgId,
3490
+ msgId,
3539
3491
  formattedText,
3540
3492
  { parse_mode: "HTML" }
3541
3493
  )
@@ -3544,7 +3496,7 @@ var ToolCallTracker = class {
3544
3496
  log11.warn(
3545
3497
  {
3546
3498
  err,
3547
- msgId: toolState.msgId,
3499
+ msgId,
3548
3500
  textLen: formattedText.length,
3549
3501
  hasViewerLinks: !!merged.viewerLinks
3550
3502
  },
@@ -3553,11 +3505,15 @@ var ToolCallTracker = class {
3553
3505
  }
3554
3506
  }
3555
3507
  cleanup(sessionId) {
3556
- this.sessions.delete(sessionId);
3508
+ const active = this.tracker.getActive(sessionId);
3509
+ for (const tool of active) {
3510
+ this.readyMap.delete(`${sessionId}:${tool.id}`);
3511
+ }
3512
+ this.tracker.clear(sessionId);
3557
3513
  }
3558
3514
  };
3559
3515
 
3560
- // src/adapters/telegram/streaming.ts
3516
+ // src/plugins/telegram/streaming.ts
3561
3517
  var FLUSH_INTERVAL = 5e3;
3562
3518
  var MessageDraft = class {
3563
3519
  constructor(bot, chatId, threadId, sendQueue, sessionId) {
@@ -3739,7 +3695,7 @@ var MessageDraft = class {
3739
3695
  }
3740
3696
  };
3741
3697
 
3742
- // src/adapters/telegram/draft-manager.ts
3698
+ // src/plugins/telegram/draft-manager.ts
3743
3699
  var DraftManager = class {
3744
3700
  constructor(bot, chatId, sendQueue) {
3745
3701
  this.bot = bot;
@@ -3811,7 +3767,7 @@ var DraftManager = class {
3811
3767
  }
3812
3768
  };
3813
3769
 
3814
- // src/adapters/telegram/skill-command-manager.ts
3770
+ // src/plugins/telegram/skill-command-manager.ts
3815
3771
  var log12 = createChildLogger({ module: "skill-commands" });
3816
3772
  var SkillCommandManager = class {
3817
3773
  // sessionId → pinned msgId
@@ -3906,7 +3862,57 @@ var SkillCommandManager = class {
3906
3862
  }
3907
3863
  };
3908
3864
 
3909
- // src/adapters/telegram/adapter.ts
3865
+ // src/plugins/telegram/renderer.ts
3866
+ var TelegramRenderer = class extends BaseRenderer {
3867
+ renderToolCall(content, verbosity) {
3868
+ const meta = content.metadata ?? {};
3869
+ return { body: formatToolCall(meta, verbosity), format: "html" };
3870
+ }
3871
+ renderToolUpdate(content, verbosity) {
3872
+ const meta = content.metadata ?? {};
3873
+ return { body: formatToolUpdate(meta, verbosity), format: "html" };
3874
+ }
3875
+ renderPlan(content, verbosity) {
3876
+ const meta = content.metadata;
3877
+ return { body: formatPlan({ entries: meta?.entries ?? [] }, verbosity), format: "html" };
3878
+ }
3879
+ renderUsage(content, verbosity) {
3880
+ const meta = content.metadata;
3881
+ return { body: formatUsage(meta ?? {}, verbosity), format: "html" };
3882
+ }
3883
+ renderError(content) {
3884
+ return { body: `\u274C <b>Error:</b> ${escapeHtml(content.text)}`, format: "html" };
3885
+ }
3886
+ renderNotification(notification) {
3887
+ const emoji = {
3888
+ completed: "\u2705",
3889
+ error: "\u274C",
3890
+ permission: "\u{1F510}",
3891
+ input_required: "\u{1F4AC}",
3892
+ budget_warning: "\u26A0\uFE0F"
3893
+ };
3894
+ let text = `${emoji[notification.type] || "\u2139\uFE0F"} <b>${escapeHtml(notification.sessionName || "Session")}</b>
3895
+ `;
3896
+ text += escapeHtml(notification.summary);
3897
+ return { body: text, format: "html" };
3898
+ }
3899
+ renderSystemMessage(content) {
3900
+ return { body: escapeHtml(content.text), format: "html" };
3901
+ }
3902
+ renderModeChange(content) {
3903
+ const modeId = content.metadata?.modeId ?? "";
3904
+ return { body: `\u{1F504} <b>Mode:</b> ${escapeHtml(String(modeId))}`, format: "html" };
3905
+ }
3906
+ renderConfigUpdate() {
3907
+ return { body: "\u2699\uFE0F <b>Config updated</b>", format: "html" };
3908
+ }
3909
+ renderModelUpdate(content) {
3910
+ const modelId = content.metadata?.modelId ?? "";
3911
+ return { body: `\u{1F916} <b>Model:</b> ${escapeHtml(String(modelId))}`, format: "html" };
3912
+ }
3913
+ };
3914
+
3915
+ // src/plugins/telegram/adapter.ts
3910
3916
  var log13 = createChildLogger({ module: "telegram" });
3911
3917
  function patchedFetch(input, init) {
3912
3918
  if (init?.signal && !(init.signal instanceof AbortSignal)) {
@@ -3921,7 +3927,18 @@ function patchedFetch(input, init) {
3921
3927
  }
3922
3928
  return fetch(input, init);
3923
3929
  }
3924
- var TelegramAdapter = class extends ChannelAdapter {
3930
+ var TelegramAdapter = class extends MessagingAdapter {
3931
+ name = "telegram";
3932
+ renderer = new TelegramRenderer();
3933
+ capabilities = {
3934
+ streaming: true,
3935
+ richFormatting: true,
3936
+ threads: true,
3937
+ reactions: true,
3938
+ fileUpload: true,
3939
+ voice: true
3940
+ };
3941
+ core;
3925
3942
  bot;
3926
3943
  telegramConfig;
3927
3944
  permissionHandler;
@@ -3929,18 +3946,22 @@ var TelegramAdapter = class extends ChannelAdapter {
3929
3946
  assistantInitializing = false;
3930
3947
  notificationTopicId;
3931
3948
  assistantTopicId;
3932
- sendQueue = new TelegramSendQueue(3e3);
3949
+ sendQueue = new SendQueue({ minInterval: 3e3 });
3950
+ _sessionThreadIds = /* @__PURE__ */ new Map();
3933
3951
  // Extracted managers
3934
3952
  toolTracker;
3935
3953
  draftManager;
3936
3954
  skillManager;
3937
3955
  fileService;
3938
3956
  sessionTrackers = /* @__PURE__ */ new Map();
3939
- get verbosity() {
3940
- const live = this.core.configManager.get().channels?.telegram;
3941
- const v = live?.displayVerbosity ?? this.telegramConfig.displayVerbosity;
3942
- if (v === "low" || v === "high") return v;
3943
- return "medium";
3957
+ callbackCache = /* @__PURE__ */ new Map();
3958
+ callbackCounter = 0;
3959
+ getThreadId(sessionId) {
3960
+ const threadId = this._sessionThreadIds.get(sessionId);
3961
+ if (threadId === void 0) {
3962
+ throw new Error(`No threadId stored for session ${sessionId}`);
3963
+ }
3964
+ return threadId;
3944
3965
  }
3945
3966
  getOrCreateTracker(sessionId, threadId) {
3946
3967
  let tracker = this.sessionTrackers.get(sessionId);
@@ -3956,7 +3977,11 @@ var TelegramAdapter = class extends ChannelAdapter {
3956
3977
  return tracker;
3957
3978
  }
3958
3979
  constructor(core, config) {
3959
- super(core, config);
3980
+ super(
3981
+ { configManager: core.configManager },
3982
+ { ...config, maxMessageLength: 4096, enabled: config.enabled ?? true }
3983
+ );
3984
+ this.core = core;
3960
3985
  this.telegramConfig = config;
3961
3986
  }
3962
3987
  async start() {
@@ -3967,7 +3992,7 @@ var TelegramAdapter = class extends ChannelAdapter {
3967
3992
  }
3968
3993
  });
3969
3994
  this.fileService = this.core.fileService;
3970
- this.toolTracker = new ToolCallTracker(
3995
+ this.toolTracker = new TelegramToolCallTracker(
3971
3996
  this.bot,
3972
3997
  this.telegramConfig.chatId,
3973
3998
  this.sendQueue
@@ -4047,6 +4072,67 @@ var TelegramAdapter = class extends ChannelAdapter {
4047
4072
  (sessionId) => this.core.sessionManager.getSession(sessionId),
4048
4073
  (notification) => this.sendNotification(notification)
4049
4074
  );
4075
+ this.bot.on("message:text", async (ctx, next) => {
4076
+ const text = ctx.message?.text;
4077
+ if (!text?.startsWith("/")) return next();
4078
+ const registry = this.core.lifecycleManager?.serviceRegistry?.get("command-registry");
4079
+ if (!registry) return next();
4080
+ const commandName = text.split(" ")[0].slice(1).split("@")[0];
4081
+ const def = registry.get(commandName);
4082
+ if (!def) return next();
4083
+ const chatId = ctx.chat.id;
4084
+ const topicId = ctx.message.message_thread_id;
4085
+ try {
4086
+ const sessionId = topicId != null ? this.core.sessionManager.getSessionByThread("telegram", String(topicId))?.id ?? null : null;
4087
+ const response = await registry.execute(text, {
4088
+ raw: "",
4089
+ sessionId,
4090
+ channelId: "telegram",
4091
+ userId: String(ctx.from?.id),
4092
+ reply: async (content) => {
4093
+ if (typeof content === "string") {
4094
+ await ctx.reply(content);
4095
+ } else if (typeof content === "object" && content !== null && "type" in content) {
4096
+ await this.renderCommandResponse(content, chatId, topicId);
4097
+ }
4098
+ }
4099
+ });
4100
+ if (response.type !== "silent") {
4101
+ await this.renderCommandResponse(response, chatId, topicId);
4102
+ }
4103
+ } catch (err) {
4104
+ await ctx.reply(`\u26A0\uFE0F Command failed: ${String(err)}`);
4105
+ }
4106
+ });
4107
+ this.bot.callbackQuery(/^c\//, async (ctx) => {
4108
+ const data = ctx.callbackQuery.data;
4109
+ const command = this.fromCallbackData(data);
4110
+ const registry = this.core.lifecycleManager?.serviceRegistry?.get("command-registry");
4111
+ if (!registry) return;
4112
+ const chatId = ctx.chat.id;
4113
+ const topicId = ctx.callbackQuery.message?.message_thread_id;
4114
+ try {
4115
+ const sessionId = topicId != null ? this.core.sessionManager.getSessionByThread("telegram", String(topicId))?.id ?? null : null;
4116
+ const response = await registry.execute(command, {
4117
+ raw: "",
4118
+ sessionId,
4119
+ channelId: "telegram",
4120
+ userId: String(ctx.from?.id),
4121
+ reply: async (content) => {
4122
+ if (typeof content === "string") {
4123
+ await ctx.editMessageText(content).catch(() => {
4124
+ });
4125
+ }
4126
+ }
4127
+ });
4128
+ await ctx.answerCallbackQuery();
4129
+ if (response.type !== "silent") {
4130
+ await this.renderCommandResponse(response, chatId, topicId);
4131
+ }
4132
+ } catch {
4133
+ await ctx.answerCallbackQuery({ text: "Command failed" });
4134
+ }
4135
+ });
4050
4136
  setupDangerousModeCallbacks(this.bot, this.core);
4051
4137
  setupTTSCallbacks(this.bot, this.core);
4052
4138
  setupVerbosityCallbacks(this.bot, this.core);
@@ -4124,7 +4210,7 @@ var TelegramAdapter = class extends ChannelAdapter {
4124
4210
  });
4125
4211
  return;
4126
4212
  }
4127
- const { getAgentCapabilities } = await import("./agent-registry-WT4NXPYG.js");
4213
+ const { getAgentCapabilities } = await import("./agent-registry-5LZT7CUB.js");
4128
4214
  const caps = getAgentCapabilities(agentName);
4129
4215
  if (!caps.supportsResume || !caps.resumeCommand) {
4130
4216
  await ctx.reply("This agent does not support session transfer.", {
@@ -4211,6 +4297,87 @@ var TelegramAdapter = class extends ChannelAdapter {
4211
4297
  await this.bot.stop();
4212
4298
  log13.info("Telegram bot stopped");
4213
4299
  }
4300
+ // --- CommandRegistry response rendering ---
4301
+ async renderCommandResponse(response, chatId, topicId) {
4302
+ switch (response.type) {
4303
+ case "text":
4304
+ await this.bot.api.sendMessage(chatId, response.text, {
4305
+ message_thread_id: topicId
4306
+ });
4307
+ break;
4308
+ case "error":
4309
+ await this.bot.api.sendMessage(
4310
+ chatId,
4311
+ `\u26A0\uFE0F ${response.message}`,
4312
+ { message_thread_id: topicId }
4313
+ );
4314
+ break;
4315
+ case "menu": {
4316
+ const keyboard = response.options.map((opt) => [
4317
+ {
4318
+ text: `${opt.label}${opt.hint ? ` \u2014 ${opt.hint}` : ""}`,
4319
+ callback_data: this.toCallbackData(opt.command)
4320
+ }
4321
+ ]);
4322
+ await this.bot.api.sendMessage(chatId, response.title, {
4323
+ message_thread_id: topicId,
4324
+ reply_markup: { inline_keyboard: keyboard }
4325
+ });
4326
+ break;
4327
+ }
4328
+ case "list": {
4329
+ const lines = response.items.map(
4330
+ (i) => `\u2022 ${i.label}${i.detail ? ` \u2014 ${i.detail}` : ""}`
4331
+ );
4332
+ const text = `${response.title}
4333
+ ${lines.join("\n")}`;
4334
+ await this.bot.api.sendMessage(chatId, text, {
4335
+ message_thread_id: topicId
4336
+ });
4337
+ break;
4338
+ }
4339
+ case "confirm": {
4340
+ const buttons = [
4341
+ [
4342
+ {
4343
+ text: "\u2705 Yes",
4344
+ callback_data: this.toCallbackData(response.onYes)
4345
+ }
4346
+ ]
4347
+ ];
4348
+ if (response.onNo) {
4349
+ buttons[0].push({
4350
+ text: "\u274C No",
4351
+ callback_data: this.toCallbackData(response.onNo)
4352
+ });
4353
+ }
4354
+ await this.bot.api.sendMessage(chatId, response.question, {
4355
+ message_thread_id: topicId,
4356
+ reply_markup: { inline_keyboard: buttons }
4357
+ });
4358
+ break;
4359
+ }
4360
+ case "silent":
4361
+ break;
4362
+ }
4363
+ }
4364
+ toCallbackData(command) {
4365
+ const data = `c/${command}`;
4366
+ if (data.length <= 64) return data;
4367
+ const id = String(++this.callbackCounter);
4368
+ this.callbackCache.set(id, command);
4369
+ if (this.callbackCache.size > 1e3) {
4370
+ const first = this.callbackCache.keys().next().value;
4371
+ if (first) this.callbackCache.delete(first);
4372
+ }
4373
+ return `c/#${id}`;
4374
+ }
4375
+ fromCallbackData(data) {
4376
+ if (data.startsWith("c/#")) {
4377
+ return this.callbackCache.get(data.slice(3)) ?? data.slice(2);
4378
+ }
4379
+ return data.slice(2);
4380
+ }
4214
4381
  setupRoutes() {
4215
4382
  this.bot.on("message:text", async (ctx) => {
4216
4383
  const threadId = ctx.message.message_thread_id;
@@ -4347,250 +4514,255 @@ var TelegramAdapter = class extends ChannelAdapter {
4347
4514
  );
4348
4515
  });
4349
4516
  }
4350
- // --- MessageHandlers for dispatchMessage ---
4351
- messageHandlers = {
4352
- onThought: async (ctx, _content) => {
4353
- const tracker = this.getOrCreateTracker(ctx.sessionId, ctx.threadId);
4354
- await tracker.onThought();
4355
- },
4356
- onText: async (ctx, content) => {
4357
- if (!this.draftManager.hasDraft(ctx.sessionId)) {
4358
- const tracker = this.getOrCreateTracker(ctx.sessionId, ctx.threadId);
4359
- tracker.onTextStart().catch(() => {
4360
- });
4361
- }
4362
- const draft = this.draftManager.getOrCreate(ctx.sessionId, ctx.threadId);
4363
- draft.append(content.text);
4364
- this.draftManager.appendText(ctx.sessionId, content.text);
4365
- },
4366
- onToolCall: async (ctx, content) => {
4367
- const meta = content.metadata ?? {};
4368
- const toolName = meta.name ?? content.text ?? "Tool";
4369
- const toolKind = String(meta.kind ?? "other");
4370
- const noiseAction = evaluateNoise(toolName, toolKind, meta.rawInput);
4371
- if (noiseAction === "hide" && this.verbosity !== "high") return;
4372
- if (noiseAction === "collapse" && this.verbosity === "low") return;
4373
- const tracker = this.getOrCreateTracker(ctx.sessionId, ctx.threadId);
4374
- await tracker.onToolCall();
4375
- await this.draftManager.finalize(
4376
- ctx.sessionId,
4377
- this.assistantSession?.id
4378
- );
4379
- await this.toolTracker.trackNewCall(
4380
- ctx.sessionId,
4381
- ctx.threadId,
4382
- {
4383
- id: meta.id ?? "",
4384
- name: meta.name ?? content.text ?? "Tool",
4385
- kind: meta.kind,
4386
- status: meta.status,
4387
- content: meta.content,
4388
- rawInput: meta.rawInput,
4389
- viewerLinks: meta.viewerLinks,
4390
- viewerFilePath: meta.viewerFilePath,
4391
- displaySummary: meta.displaySummary,
4392
- displayTitle: meta.displayTitle,
4393
- displayKind: meta.displayKind
4394
- },
4395
- this.verbosity
4517
+ // --- MessagingAdapter overrides ---
4518
+ async sendMessage(sessionId, content) {
4519
+ if (this.assistantInitializing && sessionId === this.assistantSession?.id)
4520
+ return;
4521
+ const session = this.core.sessionManager.getSession(sessionId);
4522
+ if (!session) return;
4523
+ if (session.archiving) return;
4524
+ const threadId = Number(session.threadId);
4525
+ if (!threadId || isNaN(threadId)) {
4526
+ log13.warn(
4527
+ { sessionId, threadId: session.threadId },
4528
+ "Session has no valid threadId, skipping message"
4396
4529
  );
4397
- },
4398
- onToolUpdate: async (ctx, content) => {
4399
- const meta = content.metadata ?? {};
4400
- await this.toolTracker.updateCall(
4401
- ctx.sessionId,
4530
+ return;
4531
+ }
4532
+ this._sessionThreadIds.set(sessionId, threadId);
4533
+ try {
4534
+ await super.sendMessage(sessionId, content);
4535
+ } finally {
4536
+ this._sessionThreadIds.delete(sessionId);
4537
+ }
4538
+ }
4539
+ async handleThought(sessionId, _content, _verbosity) {
4540
+ const threadId = this.getThreadId(sessionId);
4541
+ const tracker = this.getOrCreateTracker(sessionId, threadId);
4542
+ await tracker.onThought();
4543
+ }
4544
+ async handleText(sessionId, content) {
4545
+ const threadId = this.getThreadId(sessionId);
4546
+ if (!this.draftManager.hasDraft(sessionId)) {
4547
+ const tracker = this.getOrCreateTracker(sessionId, threadId);
4548
+ tracker.onTextStart().catch(() => {
4549
+ });
4550
+ }
4551
+ const draft = this.draftManager.getOrCreate(sessionId, threadId);
4552
+ draft.append(content.text);
4553
+ this.draftManager.appendText(sessionId, content.text);
4554
+ }
4555
+ async handleToolCall(sessionId, content, verbosity) {
4556
+ const threadId = this.getThreadId(sessionId);
4557
+ const meta = content.metadata ?? {};
4558
+ const tracker = this.getOrCreateTracker(sessionId, threadId);
4559
+ await tracker.onToolCall();
4560
+ await this.draftManager.finalize(
4561
+ sessionId,
4562
+ this.assistantSession?.id
4563
+ );
4564
+ await this.toolTracker.trackNewCall(
4565
+ sessionId,
4566
+ threadId,
4567
+ {
4568
+ id: meta.id ?? "",
4569
+ name: meta.name ?? content.text ?? "Tool",
4570
+ kind: meta.kind,
4571
+ status: meta.status,
4572
+ content: meta.content,
4573
+ rawInput: meta.rawInput,
4574
+ viewerLinks: meta.viewerLinks,
4575
+ viewerFilePath: meta.viewerFilePath,
4576
+ displaySummary: meta.displaySummary,
4577
+ displayTitle: meta.displayTitle,
4578
+ displayKind: meta.displayKind
4579
+ },
4580
+ verbosity
4581
+ );
4582
+ }
4583
+ async handleToolUpdate(sessionId, content, verbosity) {
4584
+ const meta = content.metadata ?? {};
4585
+ await this.toolTracker.updateCall(
4586
+ sessionId,
4587
+ {
4588
+ id: meta.id ?? "",
4589
+ name: meta.name ?? content.text ?? "",
4590
+ kind: meta.kind,
4591
+ status: meta.status ?? "completed",
4592
+ content: meta.content,
4593
+ rawInput: meta.rawInput,
4594
+ viewerLinks: meta.viewerLinks,
4595
+ viewerFilePath: meta.viewerFilePath,
4596
+ displaySummary: meta.displaySummary,
4597
+ displayTitle: meta.displayTitle,
4598
+ displayKind: meta.displayKind
4599
+ },
4600
+ verbosity
4601
+ );
4602
+ }
4603
+ async handlePlan(sessionId, content, verbosity) {
4604
+ const threadId = this.getThreadId(sessionId);
4605
+ const meta = content.metadata ?? {};
4606
+ const entries = meta.entries ?? [];
4607
+ const tracker = this.getOrCreateTracker(sessionId, threadId);
4608
+ await tracker.onPlan(
4609
+ entries.map((e) => ({
4610
+ content: e.content,
4611
+ status: e.status,
4612
+ priority: e.priority ?? "medium"
4613
+ })),
4614
+ verbosity
4615
+ );
4616
+ }
4617
+ async handleUsage(sessionId, content, verbosity) {
4618
+ const threadId = this.getThreadId(sessionId);
4619
+ const meta = content.metadata;
4620
+ await this.draftManager.finalize(
4621
+ sessionId,
4622
+ this.assistantSession?.id
4623
+ );
4624
+ const tracker = this.getOrCreateTracker(sessionId, threadId);
4625
+ await tracker.sendUsage(meta ?? {}, verbosity);
4626
+ if (this.notificationTopicId && sessionId !== this.assistantSession?.id) {
4627
+ const sess = this.core.sessionManager.getSession(sessionId);
4628
+ const sessionName = sess?.name || "Session";
4629
+ const chatIdStr = String(this.telegramConfig.chatId);
4630
+ const numericId = chatIdStr.startsWith("-100") ? chatIdStr.slice(4) : chatIdStr.replace("-", "");
4631
+ const usageMsgId = tracker.getUsageMsgId();
4632
+ const deepLink = usageMsgId ? `https://t.me/c/${numericId}/${threadId}/${usageMsgId}` : `https://t.me/c/${numericId}/${threadId}`;
4633
+ const text = `\u2705 <b>${escapeHtml(sessionName)}</b>
4634
+ Task completed.
4635
+
4636
+ <a href="${deepLink}">\u2192 Go to topic</a>`;
4637
+ this.sendQueue.enqueue(
4638
+ () => this.bot.api.sendMessage(this.telegramConfig.chatId, text, {
4639
+ message_thread_id: this.notificationTopicId,
4640
+ parse_mode: "HTML",
4641
+ disable_notification: false
4642
+ })
4643
+ ).catch(() => {
4644
+ });
4645
+ }
4646
+ }
4647
+ async handleAttachment(sessionId, content) {
4648
+ const threadId = this.getThreadId(sessionId);
4649
+ if (!content.attachment) return;
4650
+ const { attachment } = content;
4651
+ if (attachment.size > 50 * 1024 * 1024) {
4652
+ log13.warn(
4402
4653
  {
4403
- id: meta.id ?? "",
4404
- name: meta.name ?? content.text ?? "",
4405
- kind: meta.kind,
4406
- status: meta.status ?? "completed",
4407
- content: meta.content,
4408
- rawInput: meta.rawInput,
4409
- viewerLinks: meta.viewerLinks,
4410
- viewerFilePath: meta.viewerFilePath,
4411
- displaySummary: meta.displaySummary,
4412
- displayTitle: meta.displayTitle,
4413
- displayKind: meta.displayKind
4654
+ sessionId,
4655
+ fileName: attachment.fileName,
4656
+ size: attachment.size
4414
4657
  },
4415
- this.verbosity
4658
+ "File too large for Telegram (>50MB)"
4416
4659
  );
4417
- },
4418
- onPlan: async (ctx, content) => {
4419
- const meta = content.metadata ?? {};
4420
- const entries = meta.entries ?? [];
4421
- const tracker = this.getOrCreateTracker(ctx.sessionId, ctx.threadId);
4422
- await tracker.onPlan(
4423
- entries.map((e) => ({
4424
- content: e.content,
4425
- status: e.status,
4426
- priority: e.priority ?? "medium"
4427
- })),
4428
- this.verbosity
4429
- );
4430
- },
4431
- onUsage: async (ctx, content) => {
4432
- const meta = content.metadata;
4433
- await this.draftManager.finalize(
4434
- ctx.sessionId,
4435
- this.assistantSession?.id
4660
+ await this.sendQueue.enqueue(
4661
+ () => this.bot.api.sendMessage(
4662
+ this.telegramConfig.chatId,
4663
+ `\u26A0\uFE0F File too large to send (${Math.round(attachment.size / 1024 / 1024)}MB): ${escapeHtml(attachment.fileName)}`,
4664
+ { message_thread_id: threadId, parse_mode: "HTML" }
4665
+ )
4436
4666
  );
4437
- const tracker = this.getOrCreateTracker(ctx.sessionId, ctx.threadId);
4438
- await tracker.sendUsage(meta ?? {}, this.verbosity);
4439
- if (this.notificationTopicId && ctx.sessionId !== this.assistantSession?.id) {
4440
- const sess = this.core.sessionManager.getSession(ctx.sessionId);
4441
- const sessionName = sess?.name || "Session";
4442
- const chatIdStr = String(this.telegramConfig.chatId);
4443
- const numericId = chatIdStr.startsWith("-100") ? chatIdStr.slice(4) : chatIdStr.replace("-", "");
4444
- const usageMsgId = tracker.getUsageMsgId();
4445
- const deepLink = usageMsgId ? `https://t.me/c/${numericId}/${ctx.threadId}/${usageMsgId}` : `https://t.me/c/${numericId}/${ctx.threadId}`;
4446
- const text = `\u2705 <b>${escapeHtml(sessionName)}</b>
4447
- Task completed.
4448
-
4449
- <a href="${deepLink}">\u2192 Go to topic</a>`;
4450
- this.sendQueue.enqueue(
4451
- () => this.bot.api.sendMessage(this.telegramConfig.chatId, text, {
4452
- message_thread_id: this.notificationTopicId,
4453
- parse_mode: "HTML",
4454
- disable_notification: false
4667
+ return;
4668
+ }
4669
+ try {
4670
+ const inputFile = new InputFile(attachment.filePath);
4671
+ if (attachment.type === "image") {
4672
+ await this.sendQueue.enqueue(
4673
+ () => this.bot.api.sendPhoto(this.telegramConfig.chatId, inputFile, {
4674
+ message_thread_id: threadId
4455
4675
  })
4456
- ).catch(() => {
4457
- });
4458
- }
4459
- },
4460
- onAttachment: async (ctx, content) => {
4461
- if (!content.attachment) return;
4462
- const { attachment } = content;
4463
- if (attachment.size > 50 * 1024 * 1024) {
4464
- log13.warn(
4465
- {
4466
- sessionId: ctx.sessionId,
4467
- fileName: attachment.fileName,
4468
- size: attachment.size
4469
- },
4470
- "File too large for Telegram (>50MB)"
4471
4676
  );
4677
+ } else if (attachment.type === "audio") {
4472
4678
  await this.sendQueue.enqueue(
4473
- () => this.bot.api.sendMessage(
4474
- this.telegramConfig.chatId,
4475
- `\u26A0\uFE0F File too large to send (${Math.round(attachment.size / 1024 / 1024)}MB): ${escapeHtml(attachment.fileName)}`,
4476
- { message_thread_id: ctx.threadId, parse_mode: "HTML" }
4477
- )
4679
+ () => this.bot.api.sendVoice(this.telegramConfig.chatId, inputFile, {
4680
+ message_thread_id: threadId
4681
+ })
4478
4682
  );
4479
- return;
4480
- }
4481
- try {
4482
- const inputFile = new InputFile(attachment.filePath);
4483
- if (attachment.type === "image") {
4484
- await this.sendQueue.enqueue(
4485
- () => this.bot.api.sendPhoto(this.telegramConfig.chatId, inputFile, {
4486
- message_thread_id: ctx.threadId
4487
- })
4488
- );
4489
- } else if (attachment.type === "audio") {
4490
- await this.sendQueue.enqueue(
4491
- () => this.bot.api.sendVoice(this.telegramConfig.chatId, inputFile, {
4492
- message_thread_id: ctx.threadId
4493
- })
4494
- );
4495
- const draft = this.draftManager.getDraft(ctx.sessionId);
4496
- if (draft) {
4497
- draft.stripPattern(/\[TTS\][\s\S]*?\[\/TTS\]/g).catch(() => {
4498
- });
4499
- }
4500
- } else {
4501
- await this.sendQueue.enqueue(
4502
- () => this.bot.api.sendDocument(this.telegramConfig.chatId, inputFile, {
4503
- message_thread_id: ctx.threadId
4504
- })
4505
- );
4683
+ const draft = this.draftManager.getDraft(sessionId);
4684
+ if (draft) {
4685
+ draft.stripPattern(/\[TTS\][\s\S]*?\[\/TTS\]/g).catch(() => {
4686
+ });
4506
4687
  }
4507
- } catch (err) {
4508
- log13.error(
4509
- { err, sessionId: ctx.sessionId, fileName: attachment.fileName },
4510
- "Failed to send attachment"
4511
- );
4512
- }
4513
- },
4514
- onSessionEnd: async (ctx, _content) => {
4515
- await this.draftManager.finalize(
4516
- ctx.sessionId,
4517
- this.assistantSession?.id
4518
- );
4519
- this.draftManager.cleanup(ctx.sessionId);
4520
- this.toolTracker.cleanup(ctx.sessionId);
4521
- await this.skillManager.cleanup(ctx.sessionId);
4522
- const tracker = this.sessionTrackers.get(ctx.sessionId);
4523
- if (tracker) {
4524
- await tracker.onComplete();
4525
- tracker.destroy();
4526
- this.sessionTrackers.delete(ctx.sessionId);
4527
4688
  } else {
4528
4689
  await this.sendQueue.enqueue(
4529
- () => this.bot.api.sendMessage(
4530
- this.telegramConfig.chatId,
4531
- `\u2705 <b>Done</b>`,
4532
- {
4533
- message_thread_id: ctx.threadId,
4534
- parse_mode: "HTML",
4535
- disable_notification: true
4536
- }
4537
- )
4690
+ () => this.bot.api.sendDocument(this.telegramConfig.chatId, inputFile, {
4691
+ message_thread_id: threadId
4692
+ })
4538
4693
  );
4539
4694
  }
4540
- },
4541
- onError: async (ctx, content) => {
4542
- await this.draftManager.finalize(
4543
- ctx.sessionId,
4544
- this.assistantSession?.id
4545
- );
4546
- const tracker = this.sessionTrackers.get(ctx.sessionId);
4547
- if (tracker) {
4548
- tracker.destroy();
4549
- this.sessionTrackers.delete(ctx.sessionId);
4550
- }
4551
- await this.sendQueue.enqueue(
4552
- () => this.bot.api.sendMessage(
4553
- this.telegramConfig.chatId,
4554
- `\u274C <b>Error:</b> ${escapeHtml(content.text)}`,
4555
- {
4556
- message_thread_id: ctx.threadId,
4557
- parse_mode: "HTML",
4558
- disable_notification: true
4559
- }
4560
- )
4695
+ } catch (err) {
4696
+ log13.error(
4697
+ { err, sessionId, fileName: attachment.fileName },
4698
+ "Failed to send attachment"
4561
4699
  );
4562
- },
4563
- onSystemMessage: async (ctx, content) => {
4700
+ }
4701
+ }
4702
+ async handleSessionEnd(sessionId, _content) {
4703
+ const threadId = this.getThreadId(sessionId);
4704
+ await this.draftManager.finalize(
4705
+ sessionId,
4706
+ this.assistantSession?.id
4707
+ );
4708
+ this.draftManager.cleanup(sessionId);
4709
+ this.toolTracker.cleanup(sessionId);
4710
+ await this.skillManager.cleanup(sessionId);
4711
+ const tracker = this.sessionTrackers.get(sessionId);
4712
+ if (tracker) {
4713
+ await tracker.onComplete();
4714
+ tracker.destroy();
4715
+ this.sessionTrackers.delete(sessionId);
4716
+ } else {
4564
4717
  await this.sendQueue.enqueue(
4565
4718
  () => this.bot.api.sendMessage(
4566
4719
  this.telegramConfig.chatId,
4567
- escapeHtml(content.text),
4720
+ `\u2705 <b>Done</b>`,
4568
4721
  {
4569
- message_thread_id: ctx.threadId,
4722
+ message_thread_id: threadId,
4570
4723
  parse_mode: "HTML",
4571
4724
  disable_notification: true
4572
4725
  }
4573
4726
  )
4574
4727
  );
4575
4728
  }
4576
- };
4577
- // --- ChannelAdapter implementations ---
4578
- async sendMessage(sessionId, content) {
4579
- if (this.assistantInitializing && sessionId === this.assistantSession?.id)
4580
- return;
4581
- const session = this.core.sessionManager.getSession(sessionId);
4582
- if (!session) return;
4583
- if (session.archiving) return;
4584
- const threadId = Number(session.threadId);
4585
- if (!threadId || isNaN(threadId)) {
4586
- log13.warn(
4587
- { sessionId, threadId: session.threadId },
4588
- "Session has no valid threadId, skipping message"
4589
- );
4590
- return;
4729
+ }
4730
+ async handleError(sessionId, content) {
4731
+ const threadId = this.getThreadId(sessionId);
4732
+ await this.draftManager.finalize(
4733
+ sessionId,
4734
+ this.assistantSession?.id
4735
+ );
4736
+ const tracker = this.sessionTrackers.get(sessionId);
4737
+ if (tracker) {
4738
+ tracker.destroy();
4739
+ this.sessionTrackers.delete(sessionId);
4591
4740
  }
4592
- const ctx = { sessionId, threadId };
4593
- await dispatchMessage(this.messageHandlers, ctx, content, this.verbosity);
4741
+ await this.sendQueue.enqueue(
4742
+ () => this.bot.api.sendMessage(
4743
+ this.telegramConfig.chatId,
4744
+ `\u274C <b>Error:</b> ${escapeHtml(content.text)}`,
4745
+ {
4746
+ message_thread_id: threadId,
4747
+ parse_mode: "HTML",
4748
+ disable_notification: true
4749
+ }
4750
+ )
4751
+ );
4752
+ }
4753
+ async handleSystem(sessionId, content) {
4754
+ const threadId = this.getThreadId(sessionId);
4755
+ await this.sendQueue.enqueue(
4756
+ () => this.bot.api.sendMessage(
4757
+ this.telegramConfig.chatId,
4758
+ escapeHtml(content.text),
4759
+ {
4760
+ message_thread_id: threadId,
4761
+ parse_mode: "HTML",
4762
+ disable_notification: true
4763
+ }
4764
+ )
4765
+ );
4594
4766
  }
4595
4767
  async sendPermissionRequest(sessionId, request) {
4596
4768
  log13.info({ sessionId, requestId: request.id }, "Permission request sent");
@@ -4785,4 +4957,4 @@ Task completed.
4785
4957
  export {
4786
4958
  TelegramAdapter
4787
4959
  };
4788
- //# sourceMappingURL=chunk-CS3KCJ5D.js.map
4960
+ //# sourceMappingURL=chunk-RKB2ZK6S.js.map